Compare commits

...

335 Commits

Author SHA1 Message Date
Bentlybro
076f526c0c change logging type to debug 2025-04-16 20:17:06 +01:00
Zamil Majdy
44e3770003 fix(backend): Fix execution manager message consuming pattern (#9829)
We have seen instances where the executor gets stuck in a failing
message-consuming loop due to the upstream RabbitMQ being down. The
current message-consuming pattern is not optimal for handling this.

### Changes 🏗️

* Add a retry limit to the execution loop limit.
* Use `basic_consume` instead of `basic_get` for handling message
consumption.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run agents cancel them
2025-04-16 22:54:26 +07:00
Zamil Majdy
c0ee71fb27 fix(frontend/builder): Fix key-value pair input for any non-string types (#9826)
- Resolves #9823 

The key-value pairs input, like those used in CreateDictionaryBlock, are
assumed to be either a numeric or a string type.
When it has `any` type, it was randomly assumed to be a numeric type. 

### Changes 🏗️

Only convert to number when it's explicitly defined to do so on
key-value pair input.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Tried two different key-value pair input: AiTextGenerator &
CreateDictionary
2025-04-16 11:10:50 +00:00
Zamil Majdy
71cdc18674 fix(backend): Fix cancel_execution can only work once (#9825)
### Changes 🏗️

The recent change to the execution cancelation fix turns out to only
work on the first request.
This PR change fixes it by reworking how the thread_cached work on async
functions.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Cancel agent executions multiple times
2025-04-16 10:33:49 +00:00
Zamil Majdy
dc9348ec26 fix(frontend): Fix Input value mixup on Library page (#9821)
### Changes 🏗️

Fix this broken behaviors:
Input data mix-up caused by running two different executions of the same
agent with the same input.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run agent with old user
- [x] Running two different executions of the same agent with the same
input.
2025-04-16 09:31:07 +00:00
Zamil Majdy
3ccbc31705 Revert: fix(frontend): Fix Input value mixup on Library page & broken marketplace on no onboarding data 2025-04-15 21:28:43 +02:00
Zamil Majdy
7cf0c6fe46 fix(frontend): Fix Input value mixup on Library page & broken marketplace on no onboarding data 2025-04-15 21:25:25 +02:00
Zamil Majdy
c69faa2a94 fix(frontend): Fix Input value mixup on Library page & broken marketplace on no onboarding data 2025-04-15 21:24:39 +02:00
Nicholas Tindle
0c9dbbbe24 Merge branch 'master' into dev 2025-04-15 12:00:02 -05:00
Nicholas Tindle
3e0742f9c5 Spike/infra pooling (#9812)
<!-- Clearly explain the need for these changes: -->
Swap to pooling supabase connections rather than depending on x number
of max open connections

### Changes 🏗️
Adds direct connect URL to be used throughout the system
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test thoroughly all of the endpoints in the dev env with switched
infra matching pr
  - [x] Follow the new release plan tests
  - [x] Follow the old release plan tests

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>configuration changes</summary>

- Change how we connect to the database to use direct when configured
and database URL when not
  - update prisma for this
  - have default matching database and default
</details>
2025-04-15 15:40:15 +00:00
Krzysztof Czerwinski
d791cdea76 feat(platform): Onboarding Phase 2 (#9736)
### Changes 🏗️

- Update onboarding to give user rewards for completing steps
- Remove `canvas-confetti` lib and add `party-js` instead; the former
didn't allow to play confetti from a component
- Add onboarding videos in `frontend/public/onboarding/`
- Remove Balance (`CreditsCard.tsx`) and add openable `Wallet.tsx` (and
accompanying `WalletTaskGroup.tsx`) instead that displays grouped
onboarding tasks with descriptions and short instructional videos
- Further relevant updates to `useOnboarding`, `types.ts`
- Implement onboarding rewards
- Add `onboarding_reward` function in `credit.py` that is used to reward
user for finished onboarding tasks safely - transaction key is
deterministic, so the same user won't be rewarded twice for the same
step.
  - Add `reward_user` in `onboarding.py`
- Update `UserOnboarding` model and add a migration

<img width="464" alt="Screenshot 2025-04-05 at 6 06 29 PM"
src="https://github.com/user-attachments/assets/fca8d09e-0139-466b-b679-d24117ad01f0"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Onboarding works
  - [x] Tasks can be completed
  - [x] Rewards are added correctly for all completed tasks
2025-04-12 10:56:59 +00:00
Zamil Majdy
bb92226f5d feat(backend): Remove RPC service from Agent Executor (#9804)
Currently the execution task is not properly distributed between
executors because we need to send the execution request to the execution
server.

The execution manager now accepts the execution request from the message
queue. Thus, we can remove the synchronous RPC system from this service,
let the system focus on executing the agent, and not spare any process
for the HTTP API interface.

This will also reduce the risk of the execution service being too busy
and not able to accept any add execution requests.

### Changes 🏗️

* Remove the RPC system in Agent Executor
* Allow the cancellation of the execution that is still waiting in the
queue (by avoiding it from being executed).
* Make a unified helper for adding an execution request to the system
and move other execution-related helper functions into
`executor/utils.py`.
* Remove non-db connections (redis / rabbitmq) in Database Manager and
let the client manage this by themselves.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Existing CI, some agent runs
2025-04-11 19:03:47 +00:00
Zamil Majdy
f7ca5ac1ba feat(backend/executor): Move execution queue + cancel mechanism to RabbitMQ (#9759)
The graph execution queue is not disk-persisted; when the executor dies,
the executions are lost.

The scope of this issue is migrating the execution queue from an
inter-process queue to a RabbitMQ message queue. A sync client should be
used for this.

- Resolves #9746
- Resolves #9714

### Changes 🏗️

Move the execution manager from multiprocess.Queue into persisted
Rabbit-MQ.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Execute agents.

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-04-11 14:15:39 +00:00
Abhimanyu Yadav
4621a95bf3 fix(marketplace): Fix small UI bugs (#9800)
Resolving the bugs listed below
- #9796 
- #9797 
- #9798 
- #8998 
- #9799 

### Changes I have made 
- Removed border and set border-radius to `24px` in FeaturedCard
- Removed `white` background from breadcrumbs
- Changed distance between featured section arrow from `28px` to `12px`
- Added `1.5rem` spacing and changed color to `gray-200` on the
creator’s page separator
- Removed focus ring from the Search Library input
- And some small UI changes on marketplace

### Screenshots

<img width="658" alt="Screenshot 2025-04-10 at 3 26 56 PM"
src="https://github.com/user-attachments/assets/22bef6f0-19b9-42a6-8227-fedca33141ba"
/>

<img width="505" alt="Screenshot 2025-04-10 at 3 27 07 PM"
src="https://github.com/user-attachments/assets/2a5409a1-94c6-4d15-a35d-e4ed9b075055"
/>

<img width="1373" alt="Screenshot 2025-04-10 at 3 28 39 PM"
src="https://github.com/user-attachments/assets/046ea726-2a98-4000-abc8-9139fffe80dc"
/>

<img width="368" alt="Screenshot 2025-04-10 at 3 29 07 PM"
src="https://github.com/user-attachments/assets/4e0510ad-f535-4760-a703-651766ff522b"
/>
2025-04-11 13:09:35 +00:00
Abhimanyu Yadav
8d8a6e450f fix(marketplace): Render newline in marketplace description text (#9808)
- fix #9177 

Add `whitespace-pre-line` tailwind property to allow newline rendering
in marketplace description text

### Before

![Screenshot 2025-04-11 at 10 32
23 AM](https://github.com/user-attachments/assets/b07f58b6-218e-4b33-a018-93757e59cd8d)

### After

![Screenshot 2025-04-11 at 10 32
59 AM](https://github.com/user-attachments/assets/f1086ee4-aef3-491a-ba81-cf681086f67b)
2025-04-11 10:50:32 +00:00
Reinier van der Leer
8ea3bfabc4 fix(backend/db): Fix unchecked Prisma statements (#9805) 2025-04-10 23:04:42 +02:00
Nicholas Tindle
cda07e81d1 feat(frontend, backend): track sentry environment on frontend + sentry init in app services (#9773)
<!-- Clearly explain the need for these changes: -->
We want to be able to filter errors according to where they occur in
sentry so we need to track and include that data. We also are not
logging everything from app services correctly so fix that up

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds env tracking for frontend
- adds sentry init in app service spawn

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Tested by running and making sure all events + logs are inserted
into sentry correctly
2025-04-10 16:28:07 +01:00
Abhimanyu Yadav
6156fbb731 fix(marketplace): Fixing margins between headers, divider and content (#9757)
- fix #9003 
- fix - #8969 
- fix #8970 

Adding correct margins in between headers, divider and content.

### Changes made

- Remove any vertical padding or margin from the section.
- Add top and bottom margins to the separator, so the spacing between
sections is handled only by the separator.
- Also, add a size prop in AvatarFallback because its size is currently
broken. It’s not able to extract the size properly from the className.
2025-04-10 16:28:01 +01:00
Nicholas Tindle
2ca18d77a4 feat(frontend, backend): track sentry environment on frontend + sentry init in app services (#9773)
<!-- Clearly explain the need for these changes: -->
We want to be able to filter errors according to where they occur in
sentry so we need to track and include that data. We also are not
logging everything from app services correctly so fix that up

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds env tracking for frontend
- adds sentry init in app service spawn

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Tested by running and making sure all events + logs are inserted
into sentry correctly
2025-04-10 14:34:26 +00:00
Abhimanyu Yadav
3e6d9bf963 fix(marketplace): Fixing margins between headers, divider and content (#9757)
- fix #9003 
- fix - #8969 
- fix #8970 

Adding correct margins in between headers, divider and content.

### Changes made

- Remove any vertical padding or margin from the section.
- Add top and bottom margins to the separator, so the spacing between
sections is handled only by the separator.
- Also, add a size prop in AvatarFallback because its size is currently
broken. It’s not able to extract the size properly from the className.
2025-04-10 13:04:16 +00:00
Abhimanyu Yadav
07a09d802c fix(marketplace): Fix store card style (#9769)
- fix #9222 
- fix #9221 
- fix #8966

### Changes made
- Standardized the height of store cards.
- Corrected spacing and responsiveness behavior.
- Removed horizontal margin and max-width from the featured section.
- Fixed the aspect ratio of the agent image in the store card.
- Now, a normal desktop screen displays 3 columns of agents instead of
4.

<img width="1512" alt="Screenshot 2025-04-07 at 7 09 40 AM"
src="https://github.com/user-attachments/assets/50d3b5c9-4e7c-456e-b5f1-7c0093509bd3"
/>
2025-04-10 12:01:42 +01:00
Reinier van der Leer
353396110c refactor(backend): Clean up Library & Store DB schema (#9774)
Distilled from #9541 to reduce the scope of that PR.

- Part of #9307

-  Blocks #9786
  -  Blocks #9541

### Changes 🏗️

- Fix `LibraryAgent` schema (for #9786)
- Fix relationships between `LibraryAgent`, `AgentGraph`, and
`AgentPreset`
  - Impose uniqueness constraint on `LibraryAgent`

- Rename things that are called `agent` that actually refer to a
`graph`/`agentGraph`
- Fix singular/plural forms in DB schema
- Simplify reference names of closely related objects (e.g.
`AgentGraph.AgentGraphExecutions` -> `AgentGraph.Executions`)

- Eliminate use of `# type: ignore` in DB statements
  - Add `typed` and `typed_cast` utilities to `backend.util.type`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] CI static type checking (with all risky `# type: ignore` removed)
  - [x] Check that column references in views are updated
2025-04-10 10:40:25 +00:00
Abhimanyu Yadav
70890dee43 fix(marketplace): Fix store card style (#9769)
- fix #9222 
- fix #9221 
- fix #8966

### Changes made
- Standardized the height of store cards.
- Corrected spacing and responsiveness behavior.
- Removed horizontal margin and max-width from the featured section.
- Fixed the aspect ratio of the agent image in the store card.
- Now, a normal desktop screen displays 3 columns of agents instead of
4.

<img width="1512" alt="Screenshot 2025-04-07 at 7 09 40 AM"
src="https://github.com/user-attachments/assets/50d3b5c9-4e7c-456e-b5f1-7c0093509bd3"
/>
2025-04-10 10:31:14 +00:00
Nicholas Tindle
62361ccc48 feat: deep copy the schema (#9794)
<!-- Clearly explain the need for these changes: -->
We were duplicating placeholder values across all agents 😨 

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
Deep copies the schema instead

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the broken agent in dev
2025-04-09 21:32:50 +00:00
Reinier van der Leer
755a80c87a fix(blocks): Fix block I/O value sharing (#9793)
- Resolves #9792

### Changes 🏗️

- Replace all `default=[]` -> `default_factory=list`
- Replace all `default={}` -> `default_factory=dict`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] CI

---------

Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com>
2025-04-09 19:15:41 +00:00
Bentlybro
2a6676a5b8 Merge branch 'master' into dev 2025-04-09 14:49:09 +01:00
Reinier van der Leer
5a83b233f8 fix(backend): Add required method cleanup to MainApp
The absence of this method caused type checking errors.
2025-04-09 13:09:21 +02:00
Reinier van der Leer
cb1a3703ad fix(ci): Fix linter exit code on failure (#9777)
The linter currently exits with exit code 0 even if linting fails. This
makes the CI linter permissive which isn't good.

Changes:
- Make linter exit with an error code if a linting step fails
- Fix existing formatting issues
2025-04-09 11:30:04 +02:00
Bently
91f62c47f9 feat(backend): Add new llama 4 maverick & scout models (#9788)
This PR is to add the new [Meta: Llama 4
Maverick](https://openrouter.ai/meta-llama/llama-4-maverick) and [Meta:
Llama 4 Scout](https://openrouter.ai/meta-llama/llama-4-scout) models
via [OpenRouter](https://openrouter.ai/)


### Changes 🏗️

Added the model names to ``llm.py``
```
    META_LLAMA_4_SCOUT = "meta-llama/llama-4-scout"
    META_LLAMA_4_MAVERICK = "meta-llama/llama-4-maverick"
```
and the modela metadata
```
    LlmModel.META_LLAMA_4_SCOUT: ModelMetadata("open_router", 131072, 131072),
    LlmModel.META_LLAMA_4_MAVERICK: ModelMetadata("open_router", 1048576, 1000000),
```

and i have added the model price to ``block_cost_config.py``
```
    LlmModel.META_LLAMA_4_SCOUT: 1,
    LlmModel.META_LLAMA_4_MAVERICK: 1,
```

### Checklist 📋

- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Open the build page and place a ai text block, open the model
select and scroll to the bottom and select either of the 2 models
  - [x] test them with a prompt and wait for a reply!
2025-04-08 21:59:53 +00:00
Zamil Majdy
7fedb5e2fd refactor(backend): Un-share resource initializations from AppService + Remove Pyro (#9750)
This is a prerequisite infra change for
https://github.com/Significant-Gravitas/AutoGPT/issues/9714.

We will need a service where we can maintain our own client (db, redis,
rabbitmq, be it async/sync) and configure our own cadence of
initialization and cleanup.

While refactoring the service.py, an option to use Pyro as an RPC
protocol is also removed.

### Changes 🏗️

* Decouple resource initialization and cleanup from the parent
AppService logic.
* Removed Pyro.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] CI
2025-04-08 19:47:22 +00:00
Nicholas Tindle
d316ed23d4 [Snyk] Security upgrade next from 14.2.25 to 14.2.26 (#9767)
![snyk-top-banner](https://res.cloudinary.com/snyk/image/upload/r-d/scm-platform/snyk-pull-requests/pr-banner-default.svg)

### Snyk has created this PR to fix 1 vulnerabilities in the yarn
dependencies of this project.

#### Snyk changed the following file(s):

- `autogpt_platform/frontend/package.json`
- `autogpt_platform/frontend/yarn.lock`


#### Note for
[zero-installs](https://yarnpkg.com/features/zero-installs) users

If you are using the Yarn feature
[zero-installs](https://yarnpkg.com/features/zero-installs) that was
introduced in Yarn V2, note that this PR does not update the
`.yarn/cache/` directory meaning this code cannot be pulled and
immediately developed on as one would expect for a zero-install project
- you will need to run `yarn` to update the contents of the
`./yarn/cache` directory.
If you are not using zero-install you can ignore this as your flow
should likely be unchanged.




#### Vulnerabilities that will be fixed with an upgrade:

|  | Issue | Score | 

:-------------------------:|:-------------------------|:-------------------------
![medium
severity](https://res.cloudinary.com/snyk/image/upload/w_20,h_20/v1561977819/icon/m.png
'medium severity') | Information Exposure
<br/>[SNYK-JS-NEXT-9634163](https://snyk.io/vuln/SNYK-JS-NEXT-9634163) |
&nbsp;&nbsp;**601**&nbsp;&nbsp;




---

> [!IMPORTANT]
>
> - Check the changes in this PR to ensure they won't cause issues with
your project.
> - Max score is 1000. Note that the real score may have changed since
the PR was raised.
> - This PR was automatically created by Snyk using the credentials of a
real user.

---

**Note:** _You are seeing this because you or someone else with access
to this repository has authorized Snyk to open fix PRs._

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI5MzYyNGJiZC1jMTE3LTQ3NDYtOGFlOC1hYjIyMGE4OGI4M2UiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6IjkzNjI0YmJkLWMxMTctNDc0Ni04YWU4LWFiMjIwYTg4YjgzZSJ9fQ=="
width="0" height="0"/>
🧐 [View latest project
report](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr)
📜 [Customise PR
templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates?utm_source=github&utm_content=fix-pr-template)
🛠 [Adjust project
settings](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr/settings)
📚 [Read about Snyk's upgrade
logic](https://docs.snyk.io/scan-with-snyk/snyk-open-source/manage-vulnerabilities/upgrade-package-versions-to-fix-vulnerabilities?utm_source=github&utm_content=fix-pr-template)

---

**Learn how to fix vulnerabilities with free interactive lessons:**

🦉 [Learn about vulnerability in an interactive lesson of Snyk
Learn.](https://learn.snyk.io/?loc&#x3D;fix-pr)

[//]: #
'snyk:metadata:{"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"next","from":"14.2.25","to":"14.2.26"}],"env":"prod","issuesToFix":["SNYK-JS-NEXT-9634163"],"prId":"93624bbd-c117-4746-8ae8-ab220a88b83e","prPublicId":"93624bbd-c117-4746-8ae8-ab220a88b83e","packageManager":"yarn","priorityScoreList":[601],"projectPublicId":"3d924968-0cf3-4767-9609-501fa4962856","projectUrl":"https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source=github&utm_medium=referral&page=fix-pr","prType":"fix","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":["updated-fix-title","priorityScore"],"type":"auto","upgrade":["SNYK-JS-NEXT-9634163"],"vulns":["SNYK-JS-NEXT-9634163"],"patch":[],"isBreakingChange":false,"remediationStrategy":"vuln"}'

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
Co-authored-by: snyk-bot <snyk-bot@snyk.io>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-07 17:15:50 +00:00
Nicholas Tindle
3c14861d8e fix(backend): reduce log level for retrying connection (#9765)
<!-- Clearly explain the need for these changes: -->
Now that we are trying to use Sentry more, cleaning up some errors ->
warnings is a good idea

### Changes 🏗️
- reduces log level of retry to warning
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] check it comes through in sentry
2025-04-07 17:00:18 +00:00
Nicholas Tindle
074a00ce86 fix(backend): ProviderName behavior when loading secrets (#9764)
<!-- Clearly explain the need for these changes: -->
We got this error in
sentry:[AUTOGPT-SERVER-33P](https://significant-gravitas.sentry.io/issues/6462614597/events/bb4871d796b04e759ade55197498cff9/)
```
Level: Error
'Secrets' object has no attribute 'ProviderName.GOOGLE_client_id'
```

### Changes 🏗️
- Follows pattern used when accessing these in
`_get_provider_oauth_handler` in the router
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test to make sure getting works
2025-04-07 16:59:48 +00:00
Krzysztof Czerwinski
0aeaaa7801 fix(frontend): Fill defaults from schema to hardcodedValues in CustomNode.tsx (#9772)
Fix https://github.com/Significant-Gravitas/AutoGPT/pull/9632

### Changes 🏗️

- Set default values from input schema to `hardcodedValues` in
`CustomNode.tsx`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Default values are correctly applied to newly created node
2025-04-07 16:53:57 +00:00
Abhimanyu Yadav
2e5a770f35 fix(marketplace): Fix typography of heading in marketplace (#9737)
- fix #8956

### Changes:
- Updated line height from 28px to 36px for improved readability.
- Ensured that all section headings (“Featured agents”, “Top agents”,
“Featured creators”, and “Become a creator”) now have a uniform style.
- Verified that font-poppins is correctly set in the Tailwind config
file and layout.tsx.
- Color changed from #282828 to #262626

### Scope:
- This PR only includes typography-related adjustments.

![Screenshot 2025-04-02 at 5 29
05 PM](https://github.com/user-attachments/assets/e27b0d52-d8c7-4921-ae18-e3f75264e74d)
2025-04-07 10:28:28 +00:00
Abhimanyu Yadav
8b2265c996 feat(frontend): Add advanced block search with relevance ranking (#9711)
- fix #9425 

- Enhancing the functionality of searching blocks on the build page

Currently, it only performs exact matching on the block name and
description. I added a scoring mechanism for searching.

- The scoring algorithm works as follows:
     - Returns 1 if no query (all blocks match equally)
     - Normalized query for case-insensitive matching
- Returns 3 for exact substring matches in block name (highest priority)
- Returns 2 when all query words appear in the block name (regardless of
order)
- Returns 1.X for blocks with names similar to query using Jaro-Winkler
distance (X is similarity score)
- Returns 0.5 when all query words appear in the block description
(lowest priority)
     - Returns 0 for no match

Higher scores will appear first in search results.

> I have used an external library for Jaro-Winkler distance -
[link](https://www.npmjs.com/package/jaro-winkler)

Before
![Screenshot 2025-03-28 at 12 09
24 PM](https://github.com/user-attachments/assets/e135c007-cd9a-4692-88fc-3ad42b097c22)

After
![Screenshot 2025-03-28 at 12 09
17 PM](https://github.com/user-attachments/assets/28cd01c1-0d8e-44fa-8e04-ba9796118ba3)
2025-04-07 08:54:00 +00:00
Krzysztof Czerwinski
73d43312d1 feat(frontend): Use TypeBasedInput for onboarding agent input (#9762)
### Changes 🏗️

- Use the same code as in Library to display inputs for onboarding agent
- Fixes bug that crashes frontend when showing onboarding inputs
- Remove no longer needed `OnboardingAgentInput` component

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] All input types display correctly
  - [x] Onboarding agent runs

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-04 16:54:58 +00:00
Zamil Majdy
3771a0924c fix(backend): Update deprecated code caused by upgrades (#9758)
This series of upgrades:
https://github.com/significant-gravitas/autogpt/pull/9727
https://github.com/Significant-Gravitas/AutoGPT/pull/9728
https://github.com/Significant-Gravitas/AutoGPT/pull/9560

Caused some code in the repo being deprecated, this PR addresses those.

### Changes 🏗️

Fix pydantic config, usage of field, usage of proper prisma
`CreateInput` type, pytest loop-scope.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] CI, manual test on running some agents.

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-04 16:34:40 +00:00
Nicholas Tindle
4397746a87 feat(backend): baseline sentry logging (#9756)
<!-- Clearly explain the need for these changes: -->
Sentry just released logs so lets enrich our details there too

### Changes 🏗️
- Adds sentry logging
- Adds dependencies tracking all of our sentry integrations
- Adds environment tracking to sentry
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Tested to make sure events show up in sentry with the correct
environment logging
2025-04-04 15:31:52 +00:00
Nicholas Tindle
2e871b0761 fix(frontend): bad handling on error prompts (#9754)
<!-- Clearly explain the need for these changes: -->

I oopsed and had an extra unneeded parameter (as @majdyz pointed out)
and wasn't respected everywhere it was used.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Remove parameter
- update all the places AuthFeedback is called

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] Test all pages with authfeedback on it

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-03 22:16:39 +00:00
Reinier van der Leer
8ceb03ce1a feat(frontend/library): Add "Open in builder" run action (#9755)
- Resolves #9730

### Changes 🏗️

- feat: Add "Open in builder" run action

- refactor: Add `ActionButtonGroup` to replace boilerplate code in
`AgentRunDetailsView`, `AgentRunDraftView`, `AgentScheduleDetailsView`
  - feat: Add link support to `ActionButtonGroup`, `ButtonAction`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]`
    - [x] "Run again" button works
    - [x] "Open in builder" button-link works
2025-04-03 21:34:33 +00:00
Bently
ce98925d58 update(docs): Remove out dated tutorial video from docs & readme (#9753)
This is to remove the out dated tutorial video from docs & readme and
add a direct link to the docs in the readme

### Changes 🏗️

Remove video link from readme.md
Remove video link from
https://github.com/Significant-Gravitas/AutoGPT/blob/dev/docs/content/platform/getting-started.md
Add direct link to docs in readme.me
2025-04-03 19:16:54 +00:00
Reinier van der Leer
1fc984f7fd feat(platform/library): Add real-time "Steps" count to agent run view (#9740)
- Resolves #9731

### Changes 🏗️

- feat: Add "Steps" showing `node_execution_count` to agent run view
  - Add `GraphExecutionMeta.stats.node_exec_count` attribute

- feat(backend/executor): Send graph execution update after *every* node
execution (instead of only I/O node executions)
  - Update graph execution stats after every node execution

- refactor: Move `GraphExecutionMeta` stats into sub-object
(`cost`, `duration`, `total_run_time` -> `stats.cost`, `stats.duration`,
`stats.node_exec_time`)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - View an agent run with 1+ steps on `/library/agents/[id]`
    - [x] "Info" section layout doesn't break
    - [x] Number of steps is shown
  - Initiate a new agent run
    - [x] "Steps" increments in real time during execution
2025-04-03 18:58:21 +00:00
Madura Herath
d0d610720c docs(platform): Add WSL 2 recommendation for Docker on Windows (#9749)
In this pull request, the following changes have been made in response
to Issue #9190:

Documentation Changes:

- Added a note to the AutoGPT documentation regarding Docker
installation on Windows.

- Specifically, the note advises users to opt for WSL2 (Windows
Subsystem for Linux version 2) instead of Hyper-V during Docker setup to
prevent issues with Supabase, such as the "unhealthy" status for
supabase-db.

---------

Co-authored-by: Madura Herath <madurah@verdentra.com>
Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-03 18:35:07 +00:00
Reinier van der Leer
77a44b1213 fix(platform/library): Fix UX for webhook-triggered runs (#9680)
- Resolves #9679

### Changes 🏗️

Frontend:
- Fix crash on `payload` graph input
- Fix crash on object type agent I/O values
- Hide "+ New run" if `graph.webhook_id` is set

Backend:
- Add computed field `webhook_id` to `GraphModel`
  - Add computed property `webhook_input_node` to `GraphModel`
- Refactor:
  - Move `Node.webhook_id` -> `NodeModel.webhook_id`
  - Move `NodeModel.block` -> `Node.block` (computed property)
  - Replace `get_block(node.block_id)` with `node.block` where sensible

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Create and run a simple graph
  - [x] Create a graph with a webhook trigger and ensure it works
- [x] Check out the runs of a webhook-triggered graph and ensure the
page works
2025-04-03 17:31:02 +00:00
Nicholas Tindle
7179f9cea0 feat(backend, libs): Tell uvicorn to use our logger + always log to stdout+stderr (#9742)
<!-- Clearly explain the need for these changes: -->

Uvicorn and our logs were ending up in different places, this pr enures
uvicorn using our logging config, not their own.

### Changes 🏗️
- Clears uvicorn's loggers for rest, ws
- always log to stdout,stderr and additionally log to gcp is appropriate
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test all possible variants of the log cloud vs not and ensure that
uvicorn logs show up in the same place that rest of the system logs do
for all

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-03 16:42:20 +00:00
Reinier van der Leer
698af4e16a refactor(frontend): Clean up graph import & export logic (#9717)
- Resolves #9716
- Builds on the work done in #9627

### Changes 🏗️

- Remove `safeCopyGraph`; export directly from backend instead
- Explicitly name sanitization functions for *importing* graphs; move to
`@/lib/autogpt-server-api/utils`
- Amend `BackendAPI.getGraph(..)` to delete `.user_id` if `for_export ==
true`

Out-of-scope improvements:
- Add missing `user_id` to frontend `Graph` types
- Add `UserID` branded type for `User.id` + all `user_id` properties

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Create and configure an agent with the Publish To Medium block, a
block that uses credentials, and a webhook trigger
  - Go to `/monitoring` and click the agent you just created
    - [x] -> "Export" button should work
      - [x] -> Exported file contains no credentials or secrets
      - [x] -> Exported file contains no user IDs
      - [x] -> Exported file contains no webhook IDs
2025-04-03 16:17:25 +00:00
Abhimanyu Yadav
7085d88b2c fix(marketplace): Add 58px bottom padding to creator page agents section on large screens (#9738)
- fix #9000 

Currently, we have a 32px bottom padding on the Creator’s page on larger
screen. I have added an extra 58px to make it 90px.
2025-04-03 16:03:50 +00:00
Abhimanyu Yadav
4a82edb0c3 fix(marketplace): Fix margin between divider and section on creators page (#9744)
- fix #8998 

Replace padding with margin top and update UI spacing from 32px to 25px
2025-04-03 16:02:03 +00:00
Abhimanyu Yadav
0fc423fd55 fix(marketplace): Fix margin between arrows and carousel (#9745)
- fix #8958 

Currently, the arrow button and carousel have a 16px margin, and the
button is placed 12px below the top of the container. This makes the
spacing appear to be 28px. Therefore, place the button and indicator at
the top of the container.
2025-04-03 16:01:27 +00:00
Abhimanyu Yadav
adb3263211 fix(marketplace): Reduce margin between search bar and chips to 20px (#9748)
- fix #8955 

Reduce the margin between the search bar and chips from 24px to 20px.
2025-04-03 16:00:28 +00:00
Abhimanyu Yadav
3b5feb2c25 fix(marketplace): Fix store card typography (#9739)
- fix #8965 

### Changes Made:
- **Title**: Increased line height from 20px to 32px.
- **Creator Name:**
   - Changed font to Geist Sans.
   - Updated font size to 20px and leading to 28px.
- **Description**: Applied Geist Sans font.
- **Stats Line:** Applied Geist Sans font.
   - Font Configuration Fix:

> Previously, we were using font-gist, which is not defined in the
tailwind config file, hence Updated to use font-sans instead.

I have also fixed the height and width of the profile picture in the
creator card in this PR. The issue is linked below:
- #9314

![Screenshot 2025-04-02 at 6 32
10 PM](https://github.com/user-attachments/assets/1c2d9779-0a5e-4269-b3d2-37526a0949d3)

The margin is perfectly set to 24px; only the height and width of the
image need to be changed.

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-03 15:55:20 +00:00
Nicholas Tindle
6f3da1b7d0 refactor(backend): move the router files for postmark to not the v2 folder (#9597)
<!-- Clearly explain the need for these changes: -->
One of the pull request review notes from when these were first made is
that they don't belong in the v2 folder. This pr fixes where they are.

### Changes 🏗️
- Moves from v2 to routers for the postmark tooling
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Check that linting and tests pass

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-04-03 15:52:22 +00:00
Nicholas Tindle
6b7c8d5234 fix(backend): handle notification service errors more elegently (#9734)
<!-- Clearly explain the need for these changes: -->
We have logged 272k timeout errors in the past week from the event loop.
Don't raise those as errors.

Also along the way for diagnosing this we found that some items were
inserted into batches with incomplete datasets so handle that too.

### Changes 🏗️
- Handle timeout errors explicitly 
- Add better messaging for other error types
- Add filtering for queueing bad mezsaging
- add filtering for reading bad batches
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Pull dev db
  - [x] Test new code to check stability + error reduction

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-03 14:57:06 +00:00
Reinier van der Leer
8e912a016f fix(ci/backend): Use Poetry version from lockfile (#9729)
Currently, our CI always uses the latest version of Poetry. This causes
issues with the lockfile check whenever a new Poetry version is
released, especially if that new version has different lockfile
generation behavior.

This new mechanism determines the Poetry version to use as follows:
- Get Poetry version from backend/poetry.lock in the current branch
- Get Poetry version from backend/poetry.lock on the base branch
- Use the newest version out of the two found versions

This way, we don't automatically update to new Poetry versions, but it
is still possible to update to newer versions through pull requests.
2025-04-03 12:43:10 +00:00
Reinier van der Leer
824da5e58c rename autogpt_platform license file 2025-04-03 14:10:44 +02:00
Zamil Majdy
378f49a2d9 fix(frontend): Fix toggle input label & time picker margin 2025-04-03 15:46:51 +04:00
Zamil Majdy
ad303d69d1 fix(frontend): Add border on opened select input-button 2025-04-03 11:44:08 +04:00
Zamil Majdy
200e5814b3 fix(backend): Cleanup service on service closure (#9735)
The cleanup command was only called on SIGTERM, making it possible for
the service to close without being cleaned. Risking the connection not
being proactively closed when the service is unused.

### Changes 🏗️

Call the cleanup command on the service finally block.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run the service, stop it, see the log is printed (locally)
2025-04-02 04:21:40 +00:00
Nicholas Tindle
d879df062e feat(blocks): add a generic webhook block (#9584)
<!-- Clearly explain the need for these changes: -->
I want to be able to insert data into the graph as a webhook from
various services without making a provider specific webhook for things
like discord, slack, uptime bots, etc.

### Changes 🏗️
- Adds a generic webhook block that others can use
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test the endpoint that is generated with a graph, making sure to
pass data and consts to it
2025-04-02 03:22:59 +00:00
dependabot[bot]
6e595e6e28 chore(frontend/deps): bump @sentry/nextjs from 8.54.0 to 9.6.0 in /autogpt_platform/frontend (#9646)
Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript)
from 8.54.0 to 9.6.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/releases"><code>@​sentry/nextjs</code>'s
releases</a>.</em></p>
<blockquote>
<h2>9.6.0</h2>
<h3>Important Changes</h3>
<ul>
<li>
<p><strong>feat(tanstackstart): Add
<code>@sentry/tanstackstart-react</code> package and make
<code>@sentry/tanstackstart</code> package a utility package (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15629">#15629</a>)</strong></p>
<p>Since TanStack Start is supposed to be a generic framework that
supports libraries like React and Solid, the
<code>@sentry/tanstackstart</code> SDK package was renamed to
<code>@sentry/tanstackstart-react</code> to reflect that the SDK is
specifically intended to be used for React TanStack Start applications.
Note that the TanStack Start SDK is still in alpha status and may be
subject to breaking changes in non-major package updates.</p>
</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>feat(astro): Accept all vite-plugin options (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15638">#15638</a>)</li>
<li>feat(deps): bump <code>@​sentry/webpack-plugin</code> from 3.2.1 to
3.2.2 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15627">#15627</a>)</li>
<li>feat(tanstackstart): Refine initial API (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15574">#15574</a>)</li>
<li>fix(core): Ensure <code>fill</code> only patches functions (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15632">#15632</a>)</li>
<li>fix(nextjs): Consider <code>pageExtensions</code> when looking for
instrumentation file (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15701">#15701</a>)</li>
<li>fix(remix): Null-check <code>options</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15610">#15610</a>)</li>
<li>fix(sveltekit): Correctly parse angle bracket type assertions for
auto instrumentation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15578">#15578</a>)</li>
<li>fix(sveltekit): Guard process variable (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15605">#15605</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/angelikatyborska"><code>@​angelikatyborska</code></a>
and <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contributions!</p>
<h2>Bundle size 📦</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@​sentry/browser</code></td>
<td>23.15 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> - with treeshaking flags</td>
<td>22.94 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing)</td>
<td>36.21 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay)</td>
<td>73.39 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay) - with
treeshaking flags</td>
<td>66.8 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay with
Canvas)</td>
<td>78.01 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay, Feedback)</td>
<td>90.57 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Feedback)</td>
<td>40.3 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. sendFeedback)</td>
<td>27.79 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. FeedbackAsync)</td>
<td>32.58 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code></td>
<td>24.97 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code> (incl. Tracing)</td>
<td>38.1 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code></td>
<td>27.4 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code> (incl. Tracing)</td>
<td>37.9 KB</td>
</tr>
<tr>
<td><code>@​sentry/svelte</code></td>
<td>23.18 KB</td>
</tr>
<tr>
<td>CDN Bundle</td>
<td>24.36 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing)</td>
<td>36.26 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay)</td>
<td>71.27 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback)</td>
<td>76.45 KB</td>
</tr>
<tr>
<td>CDN Bundle - uncompressed</td>
<td>71.19 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing) - uncompressed</td>
<td>107.57 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay) - uncompressed</td>
<td>218.84 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed</td>
<td>231.4 KB</td>
</tr>
<tr>
<td><code>@​sentry/nextjs</code> (client)</td>
<td>39.27 KB</td>
</tr>
<tr>
<td><code>@​sentry/sveltekit</code> (client)</td>
<td>36.63 KB</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/blob/9.6.0/CHANGELOG.md"><code>@​sentry/nextjs</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>9.6.0</h2>
<h3>Important Changes</h3>
<ul>
<li>
<p><strong>feat(tanstackstart): Add
<code>@sentry/tanstackstart-react</code> package and make
<code>@sentry/tanstackstart</code> package a utility package (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15629">#15629</a>)</strong></p>
<p>Since TanStack Start is supposed to be a generic framework that
supports libraries like React and Solid, the
<code>@sentry/tanstackstart</code> SDK package was renamed to
<code>@sentry/tanstackstart-react</code> to reflect that the SDK is
specifically intended to be used for React TanStack Start applications.
Note that the TanStack Start SDK is still in alpha status and may be
subject to breaking changes in non-major package updates.</p>
</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>feat(astro): Accept all vite-plugin options (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15638">#15638</a>)</li>
<li>feat(deps): bump <code>@​sentry/webpack-plugin</code> from 3.2.1 to
3.2.2 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15627">#15627</a>)</li>
<li>feat(tanstackstart): Refine initial API (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15574">#15574</a>)</li>
<li>fix(core): Ensure <code>fill</code> only patches functions (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15632">#15632</a>)</li>
<li>fix(nextjs): Consider <code>pageExtensions</code> when looking for
instrumentation file (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15701">#15701</a>)</li>
<li>fix(remix): Null-check <code>options</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15610">#15610</a>)</li>
<li>fix(sveltekit): Correctly parse angle bracket type assertions for
auto instrumentation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15578">#15578</a>)</li>
<li>fix(sveltekit): Guard process variable (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15605">#15605</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/angelikatyborska"><code>@​angelikatyborska</code></a>
and <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contributions!</p>
<h2>9.5.0</h2>
<h3>Important Changes</h3>
<p>We found some issues with the new feedback screenshot annotation
where screenshots are not being generated properly. Due to this issue,
we are reverting the feature.</p>
<ul>
<li>Revert &quot;feat(feedback) Allowing annotation via highlighting
&amp; masking (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15484">#15484</a>)&quot;
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15609">#15609</a>)</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>Add cloudflare adapter detection and path generation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15603">#15603</a>)</li>
<li>deps(nextjs): Bump rollup to <code>4.34.9</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15589">#15589</a>)</li>
<li>feat(bun): Automatically add performance integrations (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15586">#15586</a>)</li>
<li>feat(replay): Bump rrweb to 2.34.0 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15580">#15580</a>)</li>
<li>fix(browser): Call original function on early return from patched
history API (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15576">#15576</a>)</li>
<li>fix(nestjs): Copy metadata in custom decorators (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15598">#15598</a>)</li>
<li>fix(react-router): Fix config type import (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15583">#15583</a>)</li>
<li>fix(remix): Use correct types export for
<code>@sentry/remix/cloudflare</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15599">#15599</a>)</li>
<li>fix(vue): Attach Pinia state only once per event (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15588">#15588</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/msurdi-a8c"><code>@​msurdi-a8c</code></a>, <a
href="https://github.com/namoscato"><code>@​namoscato</code></a>, and <a
href="https://github.com/rileyg98"><code>@​rileyg98</code></a>. Thank
you for your contributions!</p>
<h2>9.4.0</h2>
<ul>
<li>feat(core): Add types for logs protocol and envelope (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15530">#15530</a>)</li>
<li>feat(deps): Bump <code>@sentry/cli</code> from 2.41.1 to 2.42.2 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15510">#15510</a>)</li>
<li>feat(deps): Bump <code>@sentry/webpack-plugin</code> from 3.1.2 to
3.2.1 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15512">#15512</a>)</li>
<li>feat(feedback) Allowing annotation via highlighting &amp; masking
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15484">#15484</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6ec4602781"><code>6ec4602</code></a>
release: 9.6.0</li>
<li><a
href="5ba80bc5fd"><code>5ba80bc</code></a>
Merge pull request <a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15703">#15703</a>
from getsentry/prepare-release/9.6.0</li>
<li><a
href="8dc6e50597"><code>8dc6e50</code></a>
Remove unnecessary changelog item</li>
<li><a
href="7889768035"><code>7889768</code></a>
meta(changelog): Update changelog for 9.6.0</li>
<li><a
href="2b5526565c"><code>2b55265</code></a>
fix(nextjs): Consider <code>pageExtensions</code> when looking for
instrumentation file ...</li>
<li><a
href="7d88266a6e"><code>7d88266</code></a>
chore(ci): Remove <code>type</code> from canary failure template (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15698">#15698</a>)</li>
<li><a
href="48ed271b6d"><code>48ed271</code></a>
chore(deps): bump esbuild from 0.20.0 to 0.25.0 in
/dev-packages/e2e-tests/te...</li>
<li><a
href="e15988c2ad"><code>e15988c</code></a>
chore: Add external contributor to CHANGELOG.md (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15642">#15642</a>)</li>
<li><a
href="5c4cab7b34"><code>5c4cab7</code></a>
chore(deps): Deduplicate <code>@babel</code> dependencies (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15639">#15639</a>)</li>
<li><a
href="ce1ced8172"><code>ce1ced8</code></a>
chore: Add external contributor to CHANGELOG.md (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15640">#15640</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/getsentry/sentry-javascript/compare/8.54.0...9.6.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@sentry/nextjs&package-manager=npm_and_yarn&previous-version=8.54.0&new-version=9.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-02 02:51:36 +00:00
dependabot[bot]
05af4a24ce chore(libs/deps): bump the production-dependencies group across 1 directory with 4 updates (#9727)
Bumps the production-dependencies group with 4 updates in the
/autogpt_platform/autogpt_libs directory:
[pydantic](https://github.com/pydantic/pydantic),
[pydantic-settings](https://github.com/pydantic/pydantic-settings),
[pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) and
[supabase](https://github.com/supabase/supabase-py).

Updates `pydantic` from 2.10.6 to 2.11.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/releases">pydantic's
releases</a>.</em></p>
<blockquote>
<h2>v2.11.1 2025-03-28</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Fixes</h3>
<ul>
<li>Do not override <code>'definitions-ref'</code> schemas containing
serialization schemas or metadata by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11644">pydantic/pydantic#11644</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic/compare/v2.11.0...v2.11.1">https://github.com/pydantic/pydantic/compare/v2.11.0...v2.11.1</a></p>
<h2>v2.11.0 2025-03-27</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<h3>Packaging</h3>
<ul>
<li>Re-enable memray related tests on Python 3.12+ by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11191">pydantic/pydantic#11191</a></li>
<li>Bump astral-sh/setup-uv from 4 to 5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11205">pydantic/pydantic#11205</a></li>
<li>Add a <code>check_pydantic_core_version()</code> function by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11324">pydantic/pydantic#11324</a></li>
<li>Remove <code>greenlet</code> development dependency by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11351">pydantic/pydantic#11351</a></li>
<li>Bump ruff from 0.9.2 to 0.9.5 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11407">pydantic/pydantic#11407</a></li>
<li>Improve release automation process by <a
href="https://github.com/austinyu"><code>@​austinyu</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11427">pydantic/pydantic#11427</a></li>
<li>Bump dawidd6/action-download-artifact from 8 to 9 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11513">pydantic/pydantic#11513</a></li>
<li>Bump <code>pydantic-core</code> to v2.32.0 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11567">pydantic/pydantic#11567</a></li>
</ul>
<h3>New Features</h3>
<ul>
<li>Support unsubstituted type variables with both a default and a bound
or constraints by <a
href="https://github.com/FyZzyss"><code>@​FyZzyss</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10789">pydantic/pydantic#10789</a></li>
<li>Add a <code>default_factory_takes_validated_data</code> property to
<code>FieldInfo</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11034">pydantic/pydantic#11034</a></li>
<li>Raise a better error when a generic alias is used inside
<code>type[]</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11088">pydantic/pydantic#11088</a></li>
<li>Properly support PEP 695 generics syntax by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11189">pydantic/pydantic#11189</a></li>
<li>Properly support type variable defaults by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11332">pydantic/pydantic#11332</a></li>
<li>Add support for validating v6, v7, v8 UUIDs by <a
href="https://github.com/astei"><code>@​astei</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11436">pydantic/pydantic#11436</a></li>
<li>Improve alias configuration APIs by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11468">pydantic/pydantic#11468</a></li>
<li>Add experimental support for free threading by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11516">pydantic/pydantic#11516</a></li>
<li>Add <code>encoded_string()</code> method to the URL types by <a
href="https://github.com/YassinNouh21"><code>@​YassinNouh21</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11580">pydantic/pydantic#11580</a></li>
<li>Add support for <code>defer_build</code> with
<code>@validate_call</code> decorator by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11584">pydantic/pydantic#11584</a></li>
<li>Allow <code>@with_config</code> decorator to be used with keyword
arguments by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11608">pydantic/pydantic#11608</a></li>
<li>Simplify customization of default value inclusion in JSON Schema
generation by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11634">pydantic/pydantic#11634</a></li>
<li>Add <code>generate_arguments_schema()</code> function by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11572">pydantic/pydantic#11572</a></li>
</ul>
<h3>Changes</h3>
<ul>
<li>Rework <code>create_model</code> field definitions format by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11032">pydantic/pydantic#11032</a></li>
<li>Raise a deprecation warning when a field is annotated as final with
a default value by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11168">pydantic/pydantic#11168</a></li>
<li>Deprecate accessing <code>model_fields</code> and
<code>model_computed_fields</code> on instances by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11169">pydantic/pydantic#11169</a></li>
<li>Move core schema generation logic for path types inside the
<code>GenerateSchema</code> class by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10846">pydantic/pydantic#10846</a></li>
<li>Move <code>Mapping</code> schema gen to <code>GenerateSchema</code>
to complete removal of <code>prepare_annotations_for_known_type</code>
workaround by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11247">pydantic/pydantic#11247</a></li>
<li>Remove Python 3.8 Support by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11258">pydantic/pydantic#11258</a></li>
<li>Optimize calls to <code>get_type_ref</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10863">pydantic/pydantic#10863</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/blob/main/HISTORY.md">pydantic's
changelog</a>.</em></p>
<blockquote>
<h2>v2.11.1 (2025-03-28)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.1">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Fixes</h4>
<ul>
<li>Do not override <code>'definitions-ref'</code> schemas containing
serialization schemas or metadata by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11644">#11644</a></li>
</ul>
<h2>v2.11.0 (2025-03-27)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.0">GitHub
release</a></p>
<h3>What's Changed</h3>
<p>Pydantic v2.11 is a version strongly focused on build time
performance of Pydantic models (and core schema generation in general).
See the <a
href="https://pydantic.dev/articles/pydantic-v2-11-release">blog
post</a> for more details.</p>
<h4>Packaging</h4>
<ul>
<li>Bump <code>pydantic-core</code> to v2.33.0 by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11631">#11631</a></li>
</ul>
<h4>New Features</h4>
<ul>
<li>Add <code>encoded_string()</code> method to the URL types by <a
href="https://github.com/YassinNouh21"><code>@​YassinNouh21</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11580">#11580</a></li>
<li>Add support for <code>defer_build</code> with
<code>@validate_call</code> decorator by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11584">#11584</a></li>
<li>Allow <code>@with_config</code> decorator to be used with keyword
arguments by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11608">#11608</a></li>
<li>Simplify customization of default value inclusion in JSON Schema
generation by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11634">#11634</a></li>
<li>Add <code>generate_arguments_schema()</code> function by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11572">#11572</a></li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Allow generic typed dictionaries to be used for unpacked variadic
keyword parameters by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11571">#11571</a></li>
<li>Fix runtime error when computing model string representation
involving cached properties and self-referenced models by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11579">#11579</a></li>
<li>Preserve other steps when using the ellipsis in the pipeline API by
<a href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11626">#11626</a></li>
<li>Fix deferred discriminator application logic by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11591">#11591</a></li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a href="https://github.com/cmenon12"><code>@​cmenon12</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11562">#11562</a></li>
<li><a href="https://github.com/Jeukoh"><code>@​Jeukoh</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11611">#11611</a></li>
</ul>
<h2>v2.11.0b2 (2025-03-17)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.11.0b2">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Packaging</h4>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6c38dc93f4"><code>6c38dc9</code></a>
Prepare release v2.11.1 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11648">#11648</a>)</li>
<li><a
href="1dcddac2c5"><code>1dcddac</code></a>
Do not override <code>'definitions-ref'</code> schemas containing
serialization schemas ...</li>
<li><a
href="024fdae2b5"><code>024fdae</code></a>
Fix small typos (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11643">#11643</a>)</li>
<li><a
href="58e61fa3c6"><code>58e61fa</code></a>
Prepare release v2.11.0 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11635">#11635</a>)</li>
<li><a
href="e2c2e811e3"><code>e2c2e81</code></a>
Add <code>generate_arguments_schema()</code> experimental function (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11572">#11572</a>)</li>
<li><a
href="72bea3f22f"><code>72bea3f</code></a>
Add <code>mkdocs-llmstxt</code> documentation plugin (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11632">#11632</a>)</li>
<li><a
href="fcba83291a"><code>fcba832</code></a>
Simplify customization of default value inclusion in JSON Schema
generation (...</li>
<li><a
href="6f11161524"><code>6f11161</code></a>
Add support for extra keys validation for models (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11578">#11578</a>)</li>
<li><a
href="7917b11bd2"><code>7917b11</code></a>
Disable third-party workflow issue report (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11629">#11629</a>)</li>
<li><a
href="f5226d2946"><code>f5226d2</code></a>
Bump <code>pydantic-core</code> to v2.33.0 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11631">#11631</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic/compare/v2.10.6...v2.11.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pydantic-settings` from 2.7.1 to 2.8.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic-settings/releases">pydantic-settings's
releases</a>.</em></p>
<blockquote>
<h2>v2.8.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Fix for init source kwarg alias resolution. by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/550">pydantic/pydantic-settings#550</a></li>
<li>Revert usage of positional only argument in
<code>BaseSettings.__init__</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/557">pydantic/pydantic-settings#557</a></li>
<li>Revert use of <code>object</code> instead of <code>Any</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/559">pydantic/pydantic-settings#559</a></li>
<li>Prepare release 2.8.1 by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/558">pydantic/pydantic-settings#558</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.8.0...v2.8.1">https://github.com/pydantic/pydantic-settings/compare/v2.8.0...v2.8.1</a></p>
<h2>v2.8.0</h2>
<h2>What's Changed</h2>
<ul>
<li>CLI support for optional and variadic positional args by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/519">pydantic/pydantic-settings#519</a></li>
<li>Improve env_prefix config doc by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/523">pydantic/pydantic-settings#523</a></li>
<li>Add env_nested_max_split setting by <a
href="https://github.com/gsakkis"><code>@​gsakkis</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/534">pydantic/pydantic-settings#534</a></li>
<li>Avoid using <code>Any</code> in <code>BaseSettings</code> signature
to avoid mypy errors by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/529">pydantic/pydantic-settings#529</a></li>
<li>Asynchronous CLI methods in CliApp by <a
href="https://github.com/KanchiShimono"><code>@​KanchiShimono</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/533">pydantic/pydantic-settings#533</a></li>
<li>Don't explode env vars if env_nested_delimiter is empty by <a
href="https://github.com/gsakkis"><code>@​gsakkis</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/540">pydantic/pydantic-settings#540</a></li>
<li>Prepare release 2.8.0 by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/541">pydantic/pydantic-settings#541</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/gsakkis"><code>@​gsakkis</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/534">pydantic/pydantic-settings#534</a></li>
<li><a
href="https://github.com/KanchiShimono"><code>@​KanchiShimono</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/533">pydantic/pydantic-settings#533</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.7.1...v2.8.0">https://github.com/pydantic/pydantic-settings/compare/v2.7.1...v2.8.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5f33b62056"><code>5f33b62</code></a>
Prepare release 2.8.1 (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/558">#558</a>)</li>
<li><a
href="fa64a4eebb"><code>fa64a4e</code></a>
Revert use of <code>object</code> instead of <code>Any</code> (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/559">#559</a>)</li>
<li><a
href="21e6b23cb7"><code>21e6b23</code></a>
Revert usage of positional only argument in
<code>BaseSettings.__init__</code> (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/557">#557</a>)</li>
<li><a
href="1a4f3f43f9"><code>1a4f3f4</code></a>
Fix for init source kwarg alias resolution. (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/550">#550</a>)</li>
<li><a
href="f76c7fef4e"><code>f76c7fe</code></a>
Prepare release 2.8.0 (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/541">#541</a>)</li>
<li><a
href="4b6fd3d096"><code>4b6fd3d</code></a>
Don't explode env vars if env_nested_delimiter is empty (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/540">#540</a>)</li>
<li><a
href="7835118fbd"><code>7835118</code></a>
Asynchronous CLI methods in CliApp (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/533">#533</a>)</li>
<li><a
href="537f7514aa"><code>537f751</code></a>
Avoid using <code>Any</code> in <code>BaseSettings</code> signature to
avoid mypy errors (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/529">#529</a>)</li>
<li><a
href="ccf99b2d78"><code>ccf99b2</code></a>
Add env_nested_max_split setting (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/534">#534</a>)</li>
<li><a
href="65929cd1f5"><code>65929cd</code></a>
Improve env_prefix config doc (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/523">#523</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.7.1...v2.8.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pytest-asyncio` from 0.25.3 to 0.26.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.26.0</h2>
<ul>
<li>Adds configuration option that sets default event loop scope for all
tests <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/793">#793</a></li>
<li>Improved type annotations for <code>pytest_asyncio.fixture</code> <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/pull/1045">#1045</a></li>
<li>Added <code>typing-extensions</code> as additional dependency for
Python <code>&lt;3.10</code> <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/pull/1045">#1045</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4f8ce457b0"><code>4f8ce45</code></a>
docs: Prepare release of v0.26.0.</li>
<li><a
href="498e8a7786"><code>498e8a7</code></a>
Build(deps): Bump attrs from 25.1.0 to 25.3.0 in
/dependencies/default</li>
<li><a
href="01c22ffb63"><code>01c22ff</code></a>
build: Update project metadata to use SPDX license identifier</li>
<li><a
href="78191c98ed"><code>78191c9</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="9a455516ea"><code>9a45551</code></a>
Build(deps): Bump hypothesis in /dependencies/default</li>
<li><a
href="6680409439"><code>6680409</code></a>
Build(deps): Bump coverage from 7.7.0 to 7.7.1 in
/dependencies/default</li>
<li><a
href="aa82c574fe"><code>aa82c57</code></a>
Build(deps): Bump iniconfig from 2.0.0 to 2.1.0 in
/dependencies/default</li>
<li><a
href="cca587ea4f"><code>cca587e</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="5d90b29621"><code>5d90b29</code></a>
Build(deps): Bump hypothesis in /dependencies/default</li>
<li><a
href="c2622628b6"><code>c262262</code></a>
Build(deps): Bump coverage from 7.6.12 to 7.7.0 in
/dependencies/default</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.3...v0.26.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `supabase` from 2.13.0 to 2.15.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/releases">supabase's
releases</a>.</em></p>
<blockquote>
<h2>v2.15.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.14.0...v2.15.0">2.15.0</a>
(2025-03-26)</h2>
<h3>Features</h3>
<ul>
<li><strong>postgrest:</strong> bump postgrest from 0.19.3 to 1.0.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1074">#1074</a>)
(<a
href="5e59df6bfa">5e59df6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.4 to 2.12.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1087">#1087</a>)
(<a
href="da3ed9cdd7">da3ed9c</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.3 to 0.9.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1088">#1088</a>)
(<a
href="0340c8eeb0">0340c8e</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 1.0.0 to 1.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1083">#1083</a>)
(<a
href="44d2ca56eb">44d2ca5</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.0 to 2.4.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1066">#1066</a>)
(<a
href="1f92945a13">1f92945</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.1 to 2.4.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1089">#1089</a>)
(<a
href="7816d7f40e">7816d7f</a>)</li>
<li>schema method should use postgres method directly (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1082">#1082</a>)
(<a
href="b9923249d9">b992324</a>)</li>
</ul>
<h2>v2.14.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.13.0...v2.14.0">2.14.0</a>
(2025-03-20)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.3.0 to 2.4.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1059">#1059</a>)
(<a
href="9cdf7fa462">9cdf7fa</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.3 to 2.11.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1060">#1060</a>)
(<a
href="a8600fd9e3">a8600fd</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/blob/main/CHANGELOG.md">supabase's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.14.0...v2.15.0">2.15.0</a>
(2025-03-26)</h2>
<h3>Features</h3>
<ul>
<li><strong>postgrest:</strong> bump postgrest from 0.19.3 to 1.0.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1074">#1074</a>)
(<a
href="5e59df6bfa">5e59df6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.4 to 2.12.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1087">#1087</a>)
(<a
href="da3ed9cdd7">da3ed9c</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.3 to 0.9.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1088">#1088</a>)
(<a
href="0340c8eeb0">0340c8e</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 1.0.0 to 1.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1083">#1083</a>)
(<a
href="44d2ca56eb">44d2ca5</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.0 to 2.4.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1066">#1066</a>)
(<a
href="1f92945a13">1f92945</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.4.1 to 2.4.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1089">#1089</a>)
(<a
href="7816d7f40e">7816d7f</a>)</li>
<li>schema method should use postgres method directly (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1082">#1082</a>)
(<a
href="b9923249d9">b992324</a>)</li>
</ul>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.13.0...v2.14.0">2.14.0</a>
(2025-03-20)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.3.0 to 2.4.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1059">#1059</a>)
(<a
href="9cdf7fa462">9cdf7fa</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.3 to 2.11.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1060">#1060</a>)
(<a
href="a8600fd9e3">a8600fd</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2fa8891e78"><code>2fa8891</code></a>
chore(main): release 2.15.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1080">#1080</a>)</li>
<li><a
href="7816d7f40e"><code>7816d7f</code></a>
fix(realtime): bump realtime from 2.4.1 to 2.4.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1089">#1089</a>)</li>
<li><a
href="0340c8eeb0"><code>0340c8e</code></a>
fix(functions): bump supafunc from 0.9.3 to 0.9.4 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1088">#1088</a>)</li>
<li><a
href="da3ed9cdd7"><code>da3ed9c</code></a>
fix(auth): bump gotrue from 2.11.4 to 2.12.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1087">#1087</a>)</li>
<li><a
href="44d2ca56eb"><code>44d2ca5</code></a>
fix(postgrest): bump postgrest from 1.0.0 to 1.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1083">#1083</a>)</li>
<li><a
href="b9923249d9"><code>b992324</code></a>
fix: schema method should use postgres method directly (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1082">#1082</a>)</li>
<li><a
href="5e59df6bfa"><code>5e59df6</code></a>
feat(postgrest): bump postgrest from 0.19.3 to 1.0.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1074">#1074</a>)</li>
<li><a
href="36858ee02d"><code>36858ee</code></a>
chore(deps-dev): bump pytest from 8.3.4 to 8.3.5 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1070">#1070</a>)</li>
<li><a
href="9589770fa3"><code>9589770</code></a>
chore(deps-dev): bump commitizen from 4.2.2 to 4.4.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1069">#1069</a>)</li>
<li><a
href="58246bc5c8"><code>58246bc</code></a>
chore(deps-dev): bump isort from 6.0.0 to 6.0.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1065">#1065</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/supabase/supabase-py/compare/v2.13.0...v2.15.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-02 02:08:49 +00:00
dependabot[bot]
c8836953bf chore(backend/deps-dev): bump the development-dependencies group across 1 directory with 5 updates (#9560)
Bumps the development-dependencies group with 5 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [aiohappyeyeballs](https://github.com/aio-libs/aiohappyeyeballs) |
`2.4.4` | `2.4.6` |
| [httpx](https://github.com/encode/httpx) | `0.27.2` | `0.28.1` |
| [poethepoet](https://github.com/nat-n/poethepoet) | `0.32.1` |
`0.33.0` |
| [pyright](https://github.com/RobertCraigie/pyright-python) |
`1.1.392.post0` | `1.1.396` |
| [ruff](https://github.com/astral-sh/ruff) | `0.9.3` | `0.9.9` |


Updates `aiohappyeyeballs` from 2.4.4 to 2.4.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/aio-libs/aiohappyeyeballs/releases">aiohappyeyeballs's
releases</a>.</em></p>
<blockquote>
<h2>v2.4.6 (2025-02-07)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Ensure all timers are cancelled when after staggered race finishes
(<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/pull/136">#136</a>,
<a
href="f75891d897"><code>f75891d</code></a>)</li>
</ul>
<hr />
<p><strong>Detailed Changes</strong>: <a
href="https://github.com/aio-libs/aiohappyeyeballs/compare/v2.4.5...v2.4.6">v2.4.5...v2.4.6</a></p>
<h2>v2.4.5 (2025-02-07)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Keep classifiers in project to avoid automatic enrichment (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/pull/134">#134</a>,
<a
href="99edb20e9d"><code>99edb20</code></a>)</li>
</ul>
<p>Co-authored-by: J. Nick Koston <a
href="mailto:nick@koston.org">nick@koston.org</a></p>
<ul>
<li>Move classifiers to prevent recalculation by Poetry (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/pull/131">#131</a>,
<a
href="66e1c90ae8"><code>66e1c90</code></a>)</li>
</ul>
<p>Co-authored-by: Martin Styk <a
href="mailto:martin.styk@oracle.com">martin.styk@oracle.com</a></p>
<p>Co-authored-by: J. Nick Koston <a
href="mailto:nick@koston.org">nick@koston.org</a></p>
<hr />
<p><strong>Detailed Changes</strong>: <a
href="https://github.com/aio-libs/aiohappyeyeballs/compare/v2.4.4...v2.4.5">v2.4.4...v2.4.5</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md">aiohappyeyeballs's
changelog</a>.</em></p>
<blockquote>
<h2>v2.4.6 (2025-02-07)</h2>
<h3>Bug fixes</h3>
<ul>
<li>Ensure all timers are cancelled when after staggered race finishes
(<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/136">#136</a>)
(<a
href="f75891d897"><code>f75891d</code></a>)</li>
</ul>
<h2>v2.4.5 (2025-02-07)</h2>
<h3>Bug fixes</h3>
<ul>
<li>Keep classifiers in project to avoid automatic enrichment (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/134">#134</a>)
(<a
href="99edb20e9d"><code>99edb20</code></a>)</li>
<li>Move classifiers to prevent recalculation by poetry (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/131">#131</a>)
(<a
href="66e1c90ae8"><code>66e1c90</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f18ad492a3"><code>f18ad49</code></a>
2.4.6</li>
<li><a
href="f75891d897"><code>f75891d</code></a>
fix: ensure all timers are cancelled when after staggered race finishes
(<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/136">#136</a>)</li>
<li><a
href="cbc674d409"><code>cbc674d</code></a>
2.4.5</li>
<li><a
href="99edb20e9d"><code>99edb20</code></a>
fix: keep classifiers in project to avoid automatic enrichment (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/134">#134</a>)</li>
<li><a
href="9baf0b340e"><code>9baf0b3</code></a>
chore(deps-ci): bump the github-actions group with 9 updates (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/135">#135</a>)</li>
<li><a
href="678eab0dd4"><code>678eab0</code></a>
chore: update dependabot.yml to include GHA (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/133">#133</a>)</li>
<li><a
href="66e1c90ae8"><code>66e1c90</code></a>
fix: move classifiers to prevent recalculation by Poetry (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/131">#131</a>)</li>
<li><a
href="850640e0f7"><code>850640e</code></a>
chore: migrate to poetry 2.0 (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/132">#132</a>)</li>
<li><a
href="75ec0dcabc"><code>75ec0dc</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/129">#129</a>)</li>
<li><a
href="7d7f1180f2"><code>7d7f118</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/128">#128</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/aio-libs/aiohappyeyeballs/compare/v2.4.4...v2.4.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `httpx` from 0.27.2 to 0.28.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/encode/httpx/releases">httpx's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.28.1</h2>
<h2>0.28.1 (6th December, 2024)</h2>
<ul>
<li>Fix SSL case where <code>verify=False</code> together with client
side certificates.</li>
</ul>
<h2>Version 0.28.0</h2>
<h2>0.28.0 (28th November, 2024)</h2>
<p>The 0.28 release includes a limited set of deprecations.</p>
<p><strong>Deprecations</strong>:</p>
<p>We are working towards a simplified SSL configuration API.</p>
<p><em>For users of the standard <code>verify=True</code> or
<code>verify=False</code> cases, or
<code>verify=&lt;ssl_context&gt;</code> case this should require no
changes. The following cases have been deprecated...</em></p>
<ul>
<li>The <code>verify</code> argument as a string argument is now
deprecated and will raise warnings.</li>
<li>The <code>cert</code> argument is now deprecated and will raise
warnings.</li>
</ul>
<p>Our revised <a
href="https://github.com/encode/httpx/blob/HEAD/docs/advanced/ssl.md">SSL
documentation</a> covers how to implement the same behaviour with a more
constrained API.</p>
<p><strong>The following changes are also included</strong>:</p>
<ul>
<li>The deprecated <code>proxies</code> argument has now been
removed.</li>
<li>The deprecated <code>app</code> argument has now been removed.</li>
<li>JSON request bodies use a compact representation. (<a
href="https://redirect.github.com/encode/httpx/issues/3363">#3363</a>)</li>
<li>Review URL percent escape sets, based on WHATWG spec. (<a
href="https://redirect.github.com/encode/httpx/issues/3371">#3371</a>,
<a
href="https://redirect.github.com/encode/httpx/issues/3373">#3373</a>)</li>
<li>Ensure <code>certifi</code> and <code>httpcore</code> are only
imported if required. (<a
href="https://redirect.github.com/encode/httpx/issues/3377">#3377</a>)</li>
<li>Treat <code>socks5h</code> as a valid proxy scheme. (<a
href="https://redirect.github.com/encode/httpx/issues/3178">#3178</a>)</li>
<li>Cleanup <code>Request()</code> method signature in line with
<code>client.request()</code> and <code>httpx.request()</code>. (<a
href="https://redirect.github.com/encode/httpx/issues/3378">#3378</a>)</li>
<li>Bugfix: When passing <code>params={}</code>, always strictly update
rather than merge with an existing querystring. (<a
href="https://redirect.github.com/encode/httpx/issues/3364">#3364</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/encode/httpx/blob/master/CHANGELOG.md">httpx's
changelog</a>.</em></p>
<blockquote>
<h2>0.28.1 (6th December, 2024)</h2>
<ul>
<li>Fix SSL case where <code>verify=False</code> together with client
side certificates.</li>
</ul>
<h2>0.28.0 (28th November, 2024)</h2>
<p>Be aware that the default <em>JSON request bodies now use a more
compact representation</em>. This is generally considered a prefered
style, tho may require updates to test suites.</p>
<p>The 0.28 release includes a limited set of deprecations...</p>
<p><strong>Deprecations</strong>:</p>
<p>We are working towards a simplified SSL configuration API.</p>
<p><em>For users of the standard <code>verify=True</code> or
<code>verify=False</code> cases, or
<code>verify=&lt;ssl_context&gt;</code> case this should require no
changes. The following cases have been deprecated...</em></p>
<ul>
<li>The <code>verify</code> argument as a string argument is now
deprecated and will raise warnings.</li>
<li>The <code>cert</code> argument is now deprecated and will raise
warnings.</li>
</ul>
<p>Our revised <a
href="https://github.com/encode/httpx/blob/master/docs/advanced/ssl.md">SSL
documentation</a> covers how to implement the same behaviour with a more
constrained API.</p>
<p><strong>The following changes are also included</strong>:</p>
<ul>
<li>The deprecated <code>proxies</code> argument has now been
removed.</li>
<li>The deprecated <code>app</code> argument has now been removed.</li>
<li>JSON request bodies use a compact representation. (<a
href="https://redirect.github.com/encode/httpx/issues/3363">#3363</a>)</li>
<li>Review URL percent escape sets, based on WHATWG spec. (<a
href="https://redirect.github.com/encode/httpx/issues/3371">#3371</a>,
<a
href="https://redirect.github.com/encode/httpx/issues/3373">#3373</a>)</li>
<li>Ensure <code>certifi</code> and <code>httpcore</code> are only
imported if required. (<a
href="https://redirect.github.com/encode/httpx/issues/3377">#3377</a>)</li>
<li>Treat <code>socks5h</code> as a valid proxy scheme. (<a
href="https://redirect.github.com/encode/httpx/issues/3178">#3178</a>)</li>
<li>Cleanup <code>Request()</code> method signature in line with
<code>client.request()</code> and <code>httpx.request()</code>. (<a
href="https://redirect.github.com/encode/httpx/issues/3378">#3378</a>)</li>
<li>Bugfix: When passing <code>params={}</code>, always strictly update
rather than merge with an existing querystring. (<a
href="https://redirect.github.com/encode/httpx/issues/3364">#3364</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="26d48e0634"><code>26d48e0</code></a>
Version 0.28.1 (<a
href="https://redirect.github.com/encode/httpx/issues/3445">#3445</a>)</li>
<li><a
href="89599a9541"><code>89599a9</code></a>
Fix <code>verify=False</code>, <code>cert=...</code> case. (<a
href="https://redirect.github.com/encode/httpx/issues/3442">#3442</a>)</li>
<li><a
href="8ecb86f0d7"><code>8ecb86f</code></a>
Add test for request params behavior changes (<a
href="https://redirect.github.com/encode/httpx/issues/3364">#3364</a>)
(<a
href="https://redirect.github.com/encode/httpx/issues/3440">#3440</a>)</li>
<li><a
href="0cb7e5a2e7"><code>0cb7e5a</code></a>
Bump the python-packages group with 11 updates (<a
href="https://redirect.github.com/encode/httpx/issues/3434">#3434</a>)</li>
<li><a
href="15e21e9ea3"><code>15e21e9</code></a>
Updating deprecated docstring Client() class (<a
href="https://redirect.github.com/encode/httpx/issues/3426">#3426</a>)</li>
<li><a
href="80960fa319"><code>80960fa</code></a>
Version 0.28.0. (<a
href="https://redirect.github.com/encode/httpx/issues/3419">#3419</a>)</li>
<li><a
href="a33c87852b"><code>a33c878</code></a>
Fix <code>extensions</code> type annotation. (<a
href="https://redirect.github.com/encode/httpx/issues/3380">#3380</a>)</li>
<li><a
href="ce7e14da27"><code>ce7e14d</code></a>
Error on verify as str. (<a
href="https://redirect.github.com/encode/httpx/issues/3418">#3418</a>)</li>
<li><a
href="47f4a96ffa"><code>47f4a96</code></a>
Handle empty zstd responses (<a
href="https://redirect.github.com/encode/httpx/issues/3412">#3412</a>)</li>
<li><a
href="189fc4bcbe"><code>189fc4b</code></a>
Update CHANGELOG.md, fix typo(s) (<a
href="https://redirect.github.com/encode/httpx/issues/3406">#3406</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/encode/httpx/compare/0.27.2...0.28.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `poethepoet` from 0.32.1 to 0.33.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/nat-n/poethepoet/releases">poethepoet's
releases</a>.</em></p>
<blockquote>
<h2>0.33.0</h2>
<h2>Enhancements</h2>
<ul>
<li>Implemented first version of UvExecutor by <a
href="https://github.com/AKuederle"><code>@​AKuederle</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/271">nat-n/poethepoet#271</a></li>
<li>Support displaying help for a single task by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/280">nat-n/poethepoet#280</a></li>
</ul>
<h2>Fixes</h2>
<ul>
<li>Fix argument parsing issues in poetry 2.0 plugin by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/277">nat-n/poethepoet#277</a></li>
<li>Use <code>python3</code> or <code>sys.executable</code> if
<code>python</code> is not on the path by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/278">nat-n/poethepoet#278</a></li>
<li>Tighten poetry-core dependency for non-wheel based installation
methods</li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/AKuederle"><code>@​AKuederle</code></a>
made their first contribution in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/271">nat-n/poethepoet#271</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/nat-n/poethepoet/compare/v0.32.2...v0.33.0">https://github.com/nat-n/poethepoet/compare/v0.32.2...v0.33.0</a></p>
<h2>0.32.2</h2>
<h2>Fixes</h2>
<ul>
<li>Improve detection of poetry 2.0 projects via the build-system table
by <a href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/274">nat-n/poethepoet#274</a></li>
<li>Fix usage without Poetry doc link in the readme by <a
href="https://github.com/johnthagen"><code>@​johnthagen</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/273">nat-n/poethepoet#273</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/johnthagen"><code>@​johnthagen</code></a> made
their first contribution in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/273">nat-n/poethepoet#273</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/nat-n/poethepoet/compare/v0.32.1...v0.32.2">https://github.com/nat-n/poethepoet/compare/v0.32.1...v0.32.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/nat-n/poethepoet/compare/v0.32.1...v0.33.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `pyright` from 1.1.392.post0 to 1.1.396
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5617c6c57f"><code>5617c6c</code></a>
[pyright updated to 1.1.396] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/338">#338</a>)</li>
<li><a
href="72e863b737"><code>72e863b</code></a>
chore(ci): remove invalid reviewers (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/336">#336</a>)</li>
<li><a
href="74b6b556d9"><code>74b6b55</code></a>
[pyright updated to 1.1.395] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/335">#335</a>)</li>
<li><a
href="70eb305a67"><code>70eb305</code></a>
[pyright updated to 1.1.394] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/333">#333</a>)</li>
<li><a
href="c82fac2803"><code>c82fac2</code></a>
[pyright updated to 1.1.393] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/332">#332</a>)</li>
<li>See full diff in <a
href="https://github.com/RobertCraigie/pyright-python/compare/v1.1.392.post0...v1.1.396">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.9.3 to 0.9.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.9.9</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy ByPass -c &quot;irm
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.9.9</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz">ruff-x86_64-unknown-linux-gnu.tar.gz</a></td>
<td>x64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz">ruff-armv7-unknown-linux-gnueabihf.tar.gz</a></td>
<td>ARMv7 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz">ruff-aarch64-unknown-linux-musl.tar.gz</a></td>
<td>ARM64 MUSL Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>0.9.8</h2>
<h3>Preview features</h3>
<ul>
<li>Start detecting version-related syntax errors in the parser (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16090">#16090</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>pylint</code>] Mark fix unsafe (<code>PLW1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16343">#16343</a>)</li>
<li>[<code>pylint</code>] Catch <code>case np.nan</code>/<code>case
math.nan</code> in <code>match</code> statements (<code>PLW0177</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/16378">#16378</a>)</li>
<li>[<code>ruff</code>] Add more Pydantic models variants to the list of
default copy semantics (<code>RUF012</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16291">#16291</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the project if <code>configurationPreference</code>
is <code>editorOnly</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16381">#16381</a>)</li>
<li>Avoid unnecessary info at non-trace server log level (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16389">#16389</a>)</li>
<li>Expand <code>ruff.configuration</code> to allow inline config (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16296">#16296</a>)</li>
<li>Notify users for invalid client settings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16361">#16361</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Add <code>per-file-target-version</code> option (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16257">#16257</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>refurb</code>] Do not consider docstring(s)
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16391">#16391</a>)</li>
<li>[<code>flake8-self</code>] Ignore attribute accesses on
instance-like variables (<code>SLF001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16149">#16149</a>)</li>
<li>[<code>pylint</code>] Fix false positives, add missing methods, and
support positional-only parameters (<code>PLE0302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16263">#16263</a>)</li>
<li>[<code>flake8-pyi</code>] Mark <code>PYI030</code> fix unsafe when
comments are deleted (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16322">#16322</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix example for <code>S611</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16316">#16316</a>)</li>
<li>Normalize inconsistent markdown headings in docstrings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16364">#16364</a>)</li>
<li>Document MSRV policy (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16384">#16384</a>)</li>
</ul>
<h2>0.9.7</h2>
<h3>Preview features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="091d0af2ab"><code>091d0af</code></a>
Bump version to Ruff 0.9.9 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16434">#16434</a>)</li>
<li><a
href="3d72138740"><code>3d72138</code></a>
Check <code>LinterSettings::preview</code> for version-related syntax
errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16429">#16429</a>)</li>
<li><a
href="4a23756024"><code>4a23756</code></a>
Avoid caching files with unsupported syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16425">#16425</a>)</li>
<li><a
href="af62f7932b"><code>af62f79</code></a>
Prioritize &quot;bug&quot; label for changelog sections (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16433">#16433</a>)</li>
<li><a
href="0ced8d053c"><code>0ced8d0</code></a>
[<code>flake8-copyright</code>] Add links to applicable options
(<code>CPY001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16421">#16421</a>)</li>
<li><a
href="a8e171f82c"><code>a8e171f</code></a>
Fix string-length limit in documentation for PYI054 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16432">#16432</a>)</li>
<li><a
href="cf83584abb"><code>cf83584</code></a>
Show version-related syntax errors in the playground (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16419">#16419</a>)</li>
<li><a
href="764aa0e6a1"><code>764aa0e</code></a>
Allow passing <code>ParseOptions</code> to inline tests (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16357">#16357</a>)</li>
<li><a
href="568cf88c6c"><code>568cf88</code></a>
Bump version to 0.9.8 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16414">#16414</a>)</li>
<li><a
href="040071bbc5"><code>040071b</code></a>
[red-knot] Ignore surrounding whitespace when looking for `&lt;!--
snapshot-diag...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.3...0.9.9">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-02 00:39:57 +00:00
dependabot[bot]
142fa2af16 chore(backend/deps): bump the production-dependencies group across 1 directory with 20 updates (#9728)
Bumps the production-dependencies group with 20 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [aio-pika](https://github.com/mosquito/aio-pika) | `9.5.4` | `9.5.5` |
| [anthropic](https://github.com/anthropics/anthropic-sdk-python) |
`0.45.2` | `0.49.0` |
| [discord-py](https://github.com/Rapptz/discord.py) | `2.4.0` | `2.5.2`
|
| [e2b-code-interpreter](https://github.com/e2b-dev/code-interpreter) |
`1.0.5` | `1.1.1` |
| [fastapi](https://github.com/fastapi/fastapi) | `0.115.8` | `0.115.12`
|
| [flake8](https://github.com/pycqa/flake8) | `7.1.1` | `7.2.0` |
|
[google-api-python-client](https://github.com/googleapis/google-api-python-client)
| `2.160.0` | `2.166.0` |
| [google-cloud-storage](https://github.com/googleapis/python-storage) |
`3.0.0` | `3.1.0` |
| [groq](https://github.com/groq/groq-python) | `0.18.0` | `0.20.0` |
| [jinja2](https://github.com/pallets/jinja) | `3.1.5` | `3.1.6` |
|
[launchdarkly-server-sdk](https://github.com/launchdarkly/python-server-sdk)
| `9.9.0` | `9.10.0` |
| [mem0ai](https://github.com/mem0ai/mem0) | `0.1.48` | `0.1.80` |
| [openai](https://github.com/openai/openai-python) | `1.61.1` |
`1.69.0` |
| [pydantic](https://github.com/pydantic/pydantic) | `2.10.6` | `2.11.1`
|
| [pydantic-settings](https://github.com/pydantic/pydantic-settings) |
`2.7.1` | `2.8.1` |
| [pytest](https://github.com/pytest-dev/pytest) | `8.3.4` | `8.3.5` |
| [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.0.1`
| `1.1.0` |
| [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.20.0` |
`2.24.1` |
| [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) | `2.0.37` |
`2.0.40` |
| [supabase](https://github.com/supabase/supabase-py) | `2.13.0` |
`2.15.0` |


Updates `aio-pika` from 9.5.4 to 9.5.5
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/mosquito/aio-pika/blob/master/CHANGELOG.md">aio-pika's
changelog</a>.</em></p>
<blockquote>
<h2>9.5.5</h2>
<ul>
<li>Replace WeakSet with set for robust channels tracking <a
href="https://redirect.github.com/mosquito/aio-pika/issues/666">#666</a>
by shushpanov</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0d442ba73d"><code>0d442ba</code></a>
Bump to 9.5.5</li>
<li><a
href="7796f83e85"><code>7796f83</code></a>
Merge pull request <a
href="https://redirect.github.com/mosquito/aio-pika/issues/666">#666</a>
from shushpanov/use_set_instead_of_week_set</li>
<li><a
href="3a94dbdaaa"><code>3a94dbd</code></a>
Currently, <code>RobustChannel</code> uses <code>WeakSet</code> to track
exchanges and queues for r...</li>
<li>See full diff in <a
href="https://github.com/mosquito/aio-pika/compare/9.5.4...9.5.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `anthropic` from 0.45.2 to 0.49.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/releases">anthropic's
releases</a>.</em></p>
<blockquote>
<h2>v0.49.0</h2>
<h2>0.49.0 (2025-02-28)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.48.0...v0.49.0">v0.48.0...v0.49.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for disabling tool calls (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/888">#888</a>)
(<a
href="bfde3d2978">bfde3d2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/887">#887</a>)
(<a
href="4d3ec5ec5b">4d3ec5e</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update URLs from stainlessapi.com to stainless.com (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/885">#885</a>)
(<a
href="312364b9b5">312364b</a>)</li>
</ul>
<h2>v0.48.0</h2>
<h2>0.48.0 (2025-02-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.2...v0.48.0">v0.47.2...v0.48.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add URL source blocks for images and PDFs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/884">#884</a>)
(<a
href="e6b3a70ffb">e6b3a70</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>add thinking examples (<a
href="f46324863d">f463248</a>)</li>
</ul>
<h2>v0.47.2</h2>
<h2>0.47.2 (2025-02-25)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.1...v0.47.2">v0.47.1...v0.47.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>beta:</strong> add thinking to beta.messages.stream (<a
href="69e3db1de0">69e3db1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> properly set
<strong>pydantic_private</strong> (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/879">#879</a>)
(<a
href="3537a3bb22">3537a3b</a>)</li>
</ul>
<h2>v0.47.1</h2>
<h2>0.47.1 (2025-02-24)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md">anthropic's
changelog</a>.</em></p>
<blockquote>
<h2>0.49.0 (2025-02-28)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.48.0...v0.49.0">v0.48.0...v0.49.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add support for disabling tool calls (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/888">#888</a>)
(<a
href="bfde3d2978">bfde3d2</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/887">#887</a>)
(<a
href="4d3ec5ec5b">4d3ec5e</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update URLs from stainlessapi.com to stainless.com (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/885">#885</a>)
(<a
href="312364b9b5">312364b</a>)</li>
</ul>
<h2>0.48.0 (2025-02-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.2...v0.48.0">v0.47.2...v0.48.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add URL source blocks for images and PDFs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/884">#884</a>)
(<a
href="e6b3a70ffb">e6b3a70</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>add thinking examples (<a
href="f46324863d">f463248</a>)</li>
</ul>
<h2>0.47.2 (2025-02-25)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.1...v0.47.2">v0.47.1...v0.47.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>beta:</strong> add thinking to beta.messages.stream (<a
href="69e3db1de0">69e3db1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> properly set
<strong>pydantic_private</strong> (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/879">#879</a>)
(<a
href="3537a3bb22">3537a3b</a>)</li>
</ul>
<h2>0.47.1 (2025-02-24)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.47.0...v0.47.1">v0.47.0...v0.47.1</a></p>
<h3>Chores</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="8b244157a7"><code>8b24415</code></a>
release: 0.49.0</li>
<li><a
href="5e605db5db"><code>5e605db</code></a>
feat(api): add support for disabling tool calls (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/888">#888</a>)</li>
<li><a
href="810f434ec1"><code>810f434</code></a>
chore(docs): update client docstring (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/887">#887</a>)</li>
<li><a
href="859993cf66"><code>859993c</code></a>
docs: update URLs from stainlessapi.com to stainless.com (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/885">#885</a>)</li>
<li><a
href="6c08e05ab4"><code>6c08e05</code></a>
release: 0.48.0</li>
<li><a
href="90481732c9"><code>9048173</code></a>
feat(api): add URL source blocks for images and PDFs (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/884">#884</a>)</li>
<li><a
href="b5aaa3caca"><code>b5aaa3c</code></a>
docs: add thinking examples</li>
<li><a
href="599f2b9a95"><code>599f2b9</code></a>
release: 0.47.2</li>
<li><a
href="8fe5f5ce50"><code>8fe5f5c</code></a>
fix(beta): add thinking to beta.messages.stream</li>
<li><a
href="7e49d854c7"><code>7e49d85</code></a>
chore(internal): properly set <strong>pydantic_private</strong> (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/879">#879</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.2...v0.49.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `discord-py` from 2.4.0 to 2.5.2
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d2a6ccf715"><code>d2a6ccf</code></a>
Version bump to v2.5.2</li>
<li><a
href="f4bce1caf0"><code>f4bce1c</code></a>
Add changelog for v2.5.2</li>
<li><a
href="8594dd1b30"><code>8594dd1</code></a>
Fix embed media flags regression</li>
<li><a
href="2f8b2624f1"><code>2f8b262</code></a>
Fix improper class in audit log docs</li>
<li><a
href="973bb5089f"><code>973bb50</code></a>
Version bump for development</li>
<li><a
href="73f261d536"><code>73f261d</code></a>
Version bump to v2.5.1</li>
<li><a
href="6b0a6eea66"><code>6b0a6ee</code></a>
Add v2.5.1 changelog</li>
<li><a
href="cab4732b7e"><code>cab4732</code></a>
Make embed flags required and add them to all media fields</li>
<li><a
href="de5720e659"><code>de5720e</code></a>
Fix attachment is_spoiler() and is_voice_message()</li>
<li><a
href="fbe2b358fc"><code>fbe2b35</code></a>
Add note about NotFound for Messageable.send</li>
<li>Additional commits viewable in <a
href="https://github.com/Rapptz/discord.py/compare/v2.4.0...v2.5.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `e2b-code-interpreter` from 1.0.5 to 1.1.1
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3fe798e18b"><code>3fe798e</code></a>
Fix <code>to_json</code> method for charts (<a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/68">#68</a>)</li>
<li><a
href="1c4ac6ce6c"><code>1c4ac6c</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/67">#67</a>
from e2b-dev/send-notification-to-releases-channel</li>
<li><a
href="6c0bb19dd5"><code>6c0bb19</code></a>
Send releases notification to dedicated channel</li>
<li><a
href="916390e04b"><code>916390e</code></a>
[skip ci] Release new versions</li>
<li><a
href="3bf76d77ae"><code>3bf76d7</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/66">#66</a>
from e2b-dev/fix-sdk-gen-non-esm-import</li>
<li><a
href="30f3b24c9c"><code>30f3b24</code></a>
Merge branch 'main' into fix-sdk-gen-non-esm-import</li>
<li><a
href="455d71794c"><code>455d717</code></a>
update pnpm lockfile</li>
<li><a
href="418c069163"><code>418c069</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/65">#65</a>
from e2b-dev/fix-sdk-gen-non-esm-import</li>
<li><a
href="c30f7e9934"><code>c30f7e9</code></a>
pin typdoc and typedoc-markdown to non-breaking versions in js-sdk</li>
<li><a
href="f651795436"><code>f651795</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/64">#64</a>
from e2b-dev/mlejva-patch-1</li>
<li>Additional commits viewable in <a
href="https://github.com/e2b-dev/code-interpreter/compare/@e2b/code-interpreter-python@1.0.5...@e2b/code-interpreter-python@1.1.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `fastapi` from 0.115.8 to 0.115.12
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/fastapi/fastapi/releases">fastapi's
releases</a>.</em></p>
<blockquote>
<h2>0.115.12</h2>
<h3>Fixes</h3>
<ul>
<li>🐛 Fix <code>convert_underscores=False</code> for header Pydantic
models. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13515">#13515</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Docs</h3>
<ul>
<li>📝 Update <code>docs/en/docs/tutorial/middleware.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13444">#13444</a>
by <a
href="https://github.com/Rishat-F"><code>@​Rishat-F</code></a>.</li>
<li>👥 Update FastAPI People - Experts. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13493">#13493</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Translations</h3>
<ul>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/metadata.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13459">#13459</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/response-status-code.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13462">#13462</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/cookie-param-models.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13460">#13460</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/header-param-models.md</code> page. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13461">#13461</a>
by <a
href="https://github.com/valentinDruzhinin"><code>@​valentinDruzhinin</code></a>.</li>
<li>🌐 Add Japanese translation for
<code>docs/ja/docs/virtual-environments.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13304">#13304</a>
by <a
href="https://github.com/k94-ishi"><code>@​k94-ishi</code></a>.</li>
<li>🌐 Add Korean translation for
<code>docs/ko/docs/tutorial/security/oauth2-jwt.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13333">#13333</a>
by <a href="https://github.com/yes0ng"><code>@​yes0ng</code></a>.</li>
<li>🌐 Add Vietnamese translation for
<code>docs/vi/docs/deployment/cloud.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13407">#13407</a>
by <a href="https://github.com/ptt3199"><code>@​ptt3199</code></a>.</li>
</ul>
<h3>Internal</h3>
<ul>
<li>⬆ Bump pydantic-ai from 0.0.15 to 0.0.30. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13438">#13438</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>⬆ Bump sqlmodel from 0.0.22 to 0.0.23. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13437">#13437</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>⬆ Bump black from 24.10.0 to 25.1.0. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13436">#13436</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>⬆ Bump ruff to 0.9.4. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13299">#13299</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
<li>🔧 Update sponsors: pause TestDriven. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13446">#13446</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h2>0.115.11</h2>
<h3>Fixes</h3>
<ul>
<li>🐛 Add docs examples and tests (support) for <code>Annotated</code>
custom validations, like <code>AfterValidator</code>, revert <a
href="https://redirect.github.com/fastapi/fastapi/pull/13440">#13440</a>.
PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13442">#13442</a>
by <a href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.
<ul>
<li>New docs: <a
href="https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#custom-validation">Query
Parameters and String Validations - Custom Validation</a>.</li>
</ul>
</li>
</ul>
<h3>Translations</h3>
<ul>
<li>🌐 Add Russian translation for
<code>docs/ru/docs/tutorial/middleware.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13412">#13412</a>
by <a href="https://github.com/alv2017"><code>@​alv2017</code></a>.</li>
</ul>
<h3>Internal</h3>
<ul>
<li>👥 Update FastAPI GitHub topic repositories. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13439">#13439</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>👥 Update FastAPI People - Contributors and Translators. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13432">#13432</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>👥 Update FastAPI People - Sponsors. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13433">#13433</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h2>0.115.10</h2>
<h3>Fixes</h3>
<ul>
<li>♻️ Update internal annotation usage for compatibility with Pydantic
2.11. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13314">#13314</a>
by <a href="https://github.com/Viicos"><code>@​Viicos</code></a>.</li>
</ul>
<h3>Upgrades</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="628c34e0ca"><code>628c34e</code></a>
🔖 Release version 0.115.12</li>
<li><a
href="8e76d4e5f4"><code>8e76d4e</code></a>
📝 Update release notes</li>
<li><a
href="2537d9d1c2"><code>2537d9d</code></a>
🐛 Fix <code>convert_underscores=False</code> for header Pydantic models
(<a
href="https://redirect.github.com/fastapi/fastapi/issues/13515">#13515</a>)</li>
<li><a
href="c08a3e8f22"><code>c08a3e8</code></a>
📝 Update release notes</li>
<li><a
href="241de23b68"><code>241de23</code></a>
📝 Update <code>docs/en/docs/tutorial/middleware.md</code> (<a
href="https://redirect.github.com/fastapi/fastapi/issues/13444">#13444</a>)</li>
<li><a
href="4e40e1e85d"><code>4e40e1e</code></a>
📝 Update release notes</li>
<li><a
href="ecf6e7eec2"><code>ecf6e7e</code></a>
🌐 Add Ukrainian translation for
<code>docs/uk/docs/tutorial/metadata.md</code> page (<a
href="https://redirect.github.com/fastapi/fastapi/issues/13">#13</a>...</li>
<li><a
href="3afd733753"><code>3afd733</code></a>
📝 Update release notes</li>
<li><a
href="8557a88d16"><code>8557a88</code></a>
🌐 Add Ukrainian translation for
`docs/uk/docs/tutorial/response-status-code.m...</li>
<li><a
href="e4c1dd799d"><code>e4c1dd7</code></a>
📝 Update release notes</li>
<li>Additional commits viewable in <a
href="https://github.com/fastapi/fastapi/compare/0.115.8...0.115.12">compare
view</a></li>
</ul>
</details>
<br />

Updates `flake8` from 7.1.1 to 7.2.0
<details>
<summary>Commits</summary>
<ul>
<li><a
href="16f5f28a38"><code>16f5f28</code></a>
Release 7.2.0</li>
<li><a
href="ebad305769"><code>ebad305</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1974">#1974</a>
from PyCQA/update-plugins</li>
<li><a
href="d56d569ce4"><code>d56d569</code></a>
update versions of pycodestyle / pyflakes</li>
<li><a
href="a7e8f6250c"><code>a7e8f62</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1973">#1973</a>
from PyCQA/py39-plus</li>
<li><a
href="9d55ccdb72"><code>9d55ccd</code></a>
py39+</li>
<li><a
href="e492aeb385"><code>e492aeb</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1967">#1967</a>
from PyCQA/unnecessary-mocks</li>
<li><a
href="fa2ed7145c"><code>fa2ed71</code></a>
remove a few unnecessary mocks in test_checker_manager</li>
<li><a
href="fffee8ba9d"><code>fffee8b</code></a>
Release 7.1.2</li>
<li><a
href="19001f77f3"><code>19001f7</code></a>
Merge pull request <a
href="https://redirect.github.com/pycqa/flake8/issues/1966">#1966</a>
from PyCQA/limit-procs-to-file-count</li>
<li><a
href="f35737a32d"><code>f35737a</code></a>
avoid starting unnecessary processes when file count is limited</li>
<li>See full diff in <a
href="https://github.com/pycqa/flake8/compare/7.1.1...7.2.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-api-python-client` from 2.160.0 to 2.166.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's
releases</a>.</em></p>
<blockquote>
<h2>v2.166.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.165.0...v2.166.0">2.166.0</a>
(2025-03-25)</h2>
<h3>Features</h3>
<ul>
<li><strong>aiplatform:</strong> Update the api <a
href="9d050cee8d</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>alloydb:</strong> Update the api <a
href="db87ff7dae</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>analyticshub:</strong> Update the api <a
href="0716538951</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>apigee:</strong> Update the api <a
href="2fb0b5170e</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>bigqueryreservation:</strong> Update the api <a
href="98c07716c1</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>bigquery:</strong> Update the api <a
href="0f85078845</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>civicinfo:</strong> Update the api <a
href="f4a8692800</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>compute:</strong> Update the api <a
href="daa99db3ac</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>contactcenterinsights:</strong> Update the api <a
href="0ca2138859</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>container:</strong> Update the api <a
href="969054e90e</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>dataplex:</strong> Update the api <a
href="b1e4a4fa3a</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>dataproc:</strong> Update the api <a
href="ab21a62281</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>datastream:</strong> Update the api <a
href="77b0d5e5a7</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>dialogflow:</strong> Update the api <a
href="cc1fce237a</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>discoveryengine:</strong> Update the api <a
href="32191c2064</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>displayvideo:</strong> Update the api <a
href="76088b5c22</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>documentai:</strong> Update the api <a
href="79b0b5264c</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>gkebackup:</strong> Update the api <a
href="0ad6b20463</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>integrations:</strong> Update the api <a
href="3786649a17</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>managedkafka:</strong> Update the api <a
href="7e80d5a8e7</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>merchantapi:</strong> Update the api <a
href="54e2633d6c</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>monitoring:</strong> Update the api <a
href="cecd16cb74</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>netapp:</strong> Update the api <a
href="c2afd5c9b6</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>networkconnectivity:</strong> Update the api <a
href="cabd98e33c</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>networkservices:</strong> Update the api <a
href="8fb80bc60f</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>notebooks:</strong> Update the api <a
href="5012558735</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>oracledatabase:</strong> Update the api <a
href="c892cd5c07</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>pubsub:</strong> Update the api <a
href="6bf4e2d990</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>securitycenter:</strong> Update the api <a
href="5a7dfccd9b</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>verifiedaccess:</strong> Update the api <a
href="d58429ee48</a>
(<a
href="722da7de01">722da7d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>chat:</strong> Update the api <a
href="eceac9d703</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>storage:</strong> Update the api <a
href="56ff88eecd</a>
(<a
href="722da7de01">722da7d</a>)</li>
<li><strong>sts:</strong> Update the api <a
href="63ec516264</a>
(<a
href="722da7de01">722da7d</a>)</li>
</ul>
<h2>v2.165.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.164.0...v2.165.0">2.165.0</a>
(2025-03-18)</h2>
<h3>Features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7633383ffc"><code>7633383</code></a>
chore(main): release 2.166.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2586">#2586</a>)</li>
<li><a
href="722da7de01"><code>722da7d</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2585">#2585</a>)</li>
<li><a
href="e9fb04c74d"><code>e9fb04c</code></a>
chore(main): release 2.165.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2581">#2581</a>)</li>
<li><a
href="935c167ae7"><code>935c167</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2582">#2582</a>)</li>
<li><a
href="21847efba0"><code>21847ef</code></a>
fix: resolve issue where pre-release versions of dependencies are
installed (...</li>
<li><a
href="0b1875f676"><code>0b1875f</code></a>
chore(main): release 2.164.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2578">#2578</a>)</li>
<li><a
href="390e213906"><code>390e213</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2577">#2577</a>)</li>
<li><a
href="df40ac60f2"><code>df40ac6</code></a>
chore: remove unused files (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2575">#2575</a>)</li>
<li><a
href="6bf97861c4"><code>6bf9786</code></a>
chore(main): release 2.163.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2572">#2572</a>)</li>
<li><a
href="8bc64e5e1a"><code>8bc64e5</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2571">#2571</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/google-api-python-client/compare/v2.160.0...v2.166.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-cloud-storage` from 3.0.0 to 3.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-storage/releases">google-cloud-storage's
releases</a>.</em></p>
<blockquote>
<h2>v3.1.0</h2>
<h2><a
href="https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0">3.1.0</a>
(2025-02-27)</h2>
<h3>Features</h3>
<ul>
<li>Add api_key argument to Client constructor (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1441">#1441</a>)
(<a
href="c869e15ec5">c869e15</a>)</li>
<li>Add Bucket.move_blob() for HNS-enabled buckets (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1431">#1431</a>)
(<a
href="24c000fb7b">24c000f</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-storage/blob/main/CHANGELOG.md">google-cloud-storage's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0">3.1.0</a>
(2025-02-27)</h2>
<h3>Features</h3>
<ul>
<li>Add api_key argument to Client constructor (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1441">#1441</a>)
(<a
href="c869e15ec5">c869e15</a>)</li>
<li>Add Bucket.move_blob() for HNS-enabled buckets (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1431">#1431</a>)
(<a
href="24c000fb7b">24c000f</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="aa7afdff7e"><code>aa7afdf</code></a>
chore(main): release 3.1.0 (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1435">#1435</a>)</li>
<li><a
href="c869e15ec5"><code>c869e15</code></a>
Feat: Add api_key argument to Client constructor (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1441">#1441</a>)</li>
<li><a
href="b58d3190c9"><code>b58d319</code></a>
chore(deps): bump virtualenv from 20.26.3 to 20.26.6 in /.kokoro (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1412">#1412</a>)</li>
<li><a
href="0378b44400"><code>0378b44</code></a>
chore: move create_trace_span context manager within (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1443">#1443</a>)</li>
<li><a
href="511b6f5c2b"><code>511b6f5</code></a>
chore(python): conditionally load credentials in .kokoro/build.sh (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1440">#1440</a>)</li>
<li><a
href="b08aa0b131"><code>b08aa0b</code></a>
chore: set gcs-sdk-team as CODEOWNER (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1442">#1442</a>)</li>
<li><a
href="24c000fb7b"><code>24c000f</code></a>
feat: add Bucket.move_blob() for HNS-enabled buckets (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1431">#1431</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/python-storage/compare/v3.0.0...v3.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `groq` from 0.18.0 to 0.20.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/releases">groq's
releases</a>.</em></p>
<blockquote>
<h2>v0.20.0</h2>
<h2>0.20.0 (2025-03-19)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.19.0...v0.20.0">v0.19.0...v0.20.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> Add speech endpoint (<a
href="https://redirect.github.com/groq/groq-python/issues/219">#219</a>)
(<a
href="f150801968">f150801</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/218">#218</a>)
(<a
href="c124862e24">c124862</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/220">#220</a>)
(<a
href="f4eeb8d8be">f4eeb8d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>ci:</strong> ensure pip is always available (<a
href="https://redirect.github.com/groq/groq-python/issues/216">#216</a>)
(<a
href="085166c129">085166c</a>)</li>
<li><strong>ci:</strong> remove publishing patch (<a
href="https://redirect.github.com/groq/groq-python/issues/217">#217</a>)
(<a
href="fb579e87a3">fb579e8</a>)</li>
<li><strong>types:</strong> handle more discriminated union shapes (<a
href="https://redirect.github.com/groq/groq-python/issues/215">#215</a>)
(<a
href="5c72e94d51">5c72e94</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bump rye to 0.44.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/214">#214</a>)
(<a
href="66feae21c5">66feae2</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/213">#213</a>)
(<a
href="7a1627444b">7a16274</a>)</li>
<li><strong>internal:</strong> remove extra empty newlines (<a
href="https://redirect.github.com/groq/groq-python/issues/211">#211</a>)
(<a
href="4187fa110f">4187fa1</a>)</li>
</ul>
<h2>v0.19.0</h2>
<h2>0.19.0 (2025-03-11)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.18.0...v0.19.0">v0.18.0...v0.19.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> manual updates (<a
href="https://redirect.github.com/groq/groq-python/issues/209">#209</a>)
(<a
href="15e2dca833">15e2dca</a>)</li>
<li><strong>client:</strong> allow passing <code>NotGiven</code> for
body (<a
href="https://redirect.github.com/groq/groq-python/issues/200">#200</a>)
(<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li><strong>client:</strong> send <code>X-Stainless-Read-Timeout</code>
header (<a
href="https://redirect.github.com/groq/groq-python/issues/193">#193</a>)
(<a
href="e8911a43d6">e8911a4</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>add reasoning field to ChoiceDelta class (<a
href="edfee3b6c5">edfee3b</a>)</li>
<li>asyncify on non-asyncio runtimes (<a
href="https://redirect.github.com/groq/groq-python/issues/198">#198</a>)
(<a
href="49387fe83c">49387fe</a>)</li>
<li><strong>client:</strong> mark some request bodies as optional (<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="662763a5ea">662763a</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="5298ec1a8c">5298ec1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>api:</strong> remove chat_completion_chunk to force a
rebuild of it (<a
href="https://redirect.github.com/groq/groq-python/issues/208">#208</a>)
(<a
href="01fb0d14e4">01fb0d1</a>)</li>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/groq/groq-python/issues/204">#204</a>)
(<a
href="a0f45996ff">a0f4599</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/blob/main/CHANGELOG.md">groq's
changelog</a>.</em></p>
<blockquote>
<h2>0.20.0 (2025-03-19)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.19.0...v0.20.0">v0.19.0...v0.20.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> Add speech endpoint (<a
href="https://redirect.github.com/groq/groq-python/issues/219">#219</a>)
(<a
href="f150801968">f150801</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/218">#218</a>)
(<a
href="c124862e24">c124862</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/220">#220</a>)
(<a
href="f4eeb8d8be">f4eeb8d</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>ci:</strong> ensure pip is always available (<a
href="https://redirect.github.com/groq/groq-python/issues/216">#216</a>)
(<a
href="085166c129">085166c</a>)</li>
<li><strong>ci:</strong> remove publishing patch (<a
href="https://redirect.github.com/groq/groq-python/issues/217">#217</a>)
(<a
href="fb579e87a3">fb579e8</a>)</li>
<li><strong>types:</strong> handle more discriminated union shapes (<a
href="https://redirect.github.com/groq/groq-python/issues/215">#215</a>)
(<a
href="5c72e94d51">5c72e94</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bump rye to 0.44.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/214">#214</a>)
(<a
href="66feae21c5">66feae2</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/213">#213</a>)
(<a
href="7a1627444b">7a16274</a>)</li>
<li><strong>internal:</strong> remove extra empty newlines (<a
href="https://redirect.github.com/groq/groq-python/issues/211">#211</a>)
(<a
href="4187fa110f">4187fa1</a>)</li>
</ul>
<h2>0.19.0 (2025-03-11)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.18.0...v0.19.0">v0.18.0...v0.19.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> manual updates (<a
href="https://redirect.github.com/groq/groq-python/issues/209">#209</a>)
(<a
href="15e2dca833">15e2dca</a>)</li>
<li><strong>client:</strong> allow passing <code>NotGiven</code> for
body (<a
href="https://redirect.github.com/groq/groq-python/issues/200">#200</a>)
(<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li><strong>client:</strong> send <code>X-Stainless-Read-Timeout</code>
header (<a
href="https://redirect.github.com/groq/groq-python/issues/193">#193</a>)
(<a
href="e8911a43d6">e8911a4</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>add reasoning field to ChoiceDelta class (<a
href="edfee3b6c5">edfee3b</a>)</li>
<li>asyncify on non-asyncio runtimes (<a
href="https://redirect.github.com/groq/groq-python/issues/198">#198</a>)
(<a
href="49387fe83c">49387fe</a>)</li>
<li><strong>client:</strong> mark some request bodies as optional (<a
href="afa6c0fc01">afa6c0f</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="662763a5ea">662763a</a>)</li>
<li>GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci] (<a
href="5298ec1a8c">5298ec1</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>api:</strong> remove chat_completion_chunk to force a
rebuild of it (<a
href="https://redirect.github.com/groq/groq-python/issues/208">#208</a>)
(<a
href="01fb0d14e4">01fb0d1</a>)</li>
<li><strong>docs:</strong> update client docstring (<a
href="https://redirect.github.com/groq/groq-python/issues/204">#204</a>)
(<a
href="a0f45996ff">a0f4599</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/199">#199</a>)
(<a
href="de2ac71d68">de2ac71</a>)</li>
<li><strong>internal:</strong> fix devcontainers setup (<a
href="https://redirect.github.com/groq/groq-python/issues/201">#201</a>)
(<a
href="af101ee282">af101ee</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9f14aacde8"><code>9f14aac</code></a>
release: 0.20.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/212">#212</a>)</li>
<li><a
href="90be0841aa"><code>90be084</code></a>
release: 0.19.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/194">#194</a>)</li>
<li><a
href="662763a5ea"><code>662763a</code></a>
fix: GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci]</li>
<li><a
href="5298ec1a8c"><code>5298ec1</code></a>
fix: GitHub Terraform: Create/Update .github/workflows/stale.yaml [skip
ci]</li>
<li>See full diff in <a
href="https://github.com/groq/groq-python/compare/v0.18.0...v0.20.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `jinja2` from 3.1.5 to 3.1.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/jinja/releases">jinja2's
releases</a>.</em></p>
<blockquote>
<h2>3.1.6</h2>
<p>This is the Jinja 3.1.6 security release, which fixes security issues
but does not otherwise change behavior and should not result in breaking
changes compared to the latest feature release.</p>
<p>PyPI: <a
href="https://pypi.org/project/Jinja2/3.1.6/">https://pypi.org/project/Jinja2/3.1.6/</a>
Changes: <a
href="https://jinja.palletsprojects.com/en/stable/changes/#version-3-1-6">https://jinja.palletsprojects.com/en/stable/changes/#version-3-1-6</a></p>
<ul>
<li>The <code>|attr</code> filter does not bypass the environment's
attribute lookup, allowing the sandbox to apply its checks. <a
href="https://github.com/pallets/jinja/security/advisories/GHSA-cpwx-vrp4-4pq7">https://github.com/pallets/jinja/security/advisories/GHSA-cpwx-vrp4-4pq7</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/jinja/blob/main/CHANGES.rst">jinja2's
changelog</a>.</em></p>
<blockquote>
<h2>Version 3.1.6</h2>
<p>Released 2025-03-05</p>
<ul>
<li>The <code>|attr</code> filter does not bypass the environment's
attribute lookup,
allowing the sandbox to apply its checks.
:ghsa:<code>cpwx-vrp4-4pq7</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="15206881c0"><code>1520688</code></a>
release version 3.1.6</li>
<li><a
href="90457bbf33"><code>90457bb</code></a>
Merge commit from fork</li>
<li><a
href="065334d1ee"><code>065334d</code></a>
attr filter uses env.getattr</li>
<li><a
href="033c20015c"><code>033c200</code></a>
start version 3.1.6</li>
<li><a
href="bc68d4efa9"><code>bc68d4e</code></a>
use global contributing guide (<a
href="https://redirect.github.com/pallets/jinja/issues/2070">#2070</a>)</li>
<li><a
href="247de5e0c5"><code>247de5e</code></a>
use global contributing guide</li>
<li><a
href="ab8218c7a1"><code>ab8218c</code></a>
use project advisory link instead of global</li>
<li><a
href="b4ffc8ff29"><code>b4ffc8f</code></a>
release version 3.1.5 (<a
href="https://redirect.github.com/pallets/jinja/issues/2066">#2066</a>)</li>
<li>See full diff in <a
href="https://github.com/pallets/jinja/compare/3.1.5...3.1.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `launchdarkly-server-sdk` from 9.9.0 to 9.10.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/launchdarkly/python-server-sdk/releases">launchdarkly-server-sdk's
releases</a>.</em></p>
<blockquote>
<h2>v9.10.0</h2>
<h2><a
href="https://github.com/launchdarkly/python-server-sdk/compare/9.9.0...9.10.0">9.10.0</a>
(2025-03-13)</h2>
<h3>Features</h3>
<ul>
<li>Inline context for custom and migration op events (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/327">#327</a>)
(<a
href="ecfd56cc91">ecfd56c</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/launchdarkly/python-server-sdk/blob/main/CHANGELOG.md">launchdarkly-server-sdk's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/launchdarkly/python-server-sdk/compare/9.9.0...9.10.0">9.10.0</a>
(2025-03-13)</h2>
<h3>Features</h3>
<ul>
<li>Inline context for custom and migration op events (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/327">#327</a>)
(<a
href="ecfd56cc91">ecfd56c</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b7145ea004"><code>b7145ea</code></a>
chore(main): release 9.10.0 (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/328">#328</a>)</li>
<li><a
href="ecfd56cc91"><code>ecfd56c</code></a>
feat: Inline context for custom and migration op events (<a
href="https://redirect.github.com/launchdarkly/python-server-sdk/issues/327">#327</a>)</li>
<li>See full diff in <a
href="https://github.com/launchdarkly/python-server-sdk/compare/9.9.0...9.10.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `mem0ai` from 0.1.48 to 0.1.80
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/mem0ai/mem0/releases">mem0ai's
releases</a>.</em></p>
<blockquote>
<h2>0.1.80</h2>
<h2>What's Changed</h2>
<ul>
<li>[Feature] Add support for hybrid search for pinecone vector database
by <a href="https://github.com/deshraj"><code>@​deshraj</code></a> in <a
href="https://redirect.github.com/embedchain/embedchain/pull/1259">embedchain/embedchain#1259</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/embedchain/embedchain/compare/0.1.79...0.1.80">https://github.com/embedchain/embedchain/compare/0.1.79...0.1.80</a></p>
<h2>v0.1.80</h2>
<h2>What's Changed</h2>
<ul>
<li>Update for faiss doc by <a
href="https://github.com/Dev-Khant"><code>@​Dev-Khant</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2464">mem0ai/mem0#2464</a></li>
<li>Add support for procedural memory by <a
href="https://github.com/deshraj"><code>@​deshraj</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2460">mem0ai/mem0#2460</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/mem0ai/mem0/compare/v0.1.79...v0.1.80">https://github.com/mem0ai/mem0/compare/v0.1.79...v0.1.80</a></p>
<h2>0.1.79</h2>
<h2>What's Changed</h2>
<ul>
<li>[Bug fix] Fix vertex ai integration issue by <a
href="https://github.com/deshraj"><code>@​deshraj</code></a> in <a
href="https://redirect.github.com/embedchain/embedchain/pull/1257">embedchain/embedchain#1257</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/embedchain/embedchain/compare/0.1.78...0.1.79">https://github.com/embedchain/embedchain/compare/0.1.78...0.1.79</a></p>
<h2>v0.1.79</h2>
<h2>What's Changed</h2>
<ul>
<li>update changelog by <a
href="https://github.com/Dev-Khant"><code>@​Dev-Khant</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2462">mem0ai/mem0#2462</a></li>
<li>bump version -&gt; 0.1.79 by <a
href="https://github.com/Dev-Khant"><code>@​Dev-Khant</code></a> in <a
href="https://redirect.github.com/mem0ai/mem0/pull/2463">mem0ai/mem0#2...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-01 22:55:58 +00:00
dependabot[bot]
1b3c465f0d chore(backend/deps): bump psutil from 6.1.1 to 7.0.0 in /autogpt_platform/backend (#9686)
Bumps [psutil](https://github.com/giampaolo/psutil) from 6.1.1 to 7.0.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/giampaolo/psutil/blob/master/HISTORY.rst">psutil's
changelog</a>.</em></p>
<blockquote>
<h1>7.0.0</h1>
<p>2025-02-13</p>
<p><strong>Enhancements</strong></p>
<ul>
<li>669_, [Windows]: <code>net_if_addrs()</code>_ also returns the
<code>broadcast</code> address
instead of <code>None</code>.</li>
<li>2480_: Python 2.7 is no longer supported. Latest version supporting
Python
2.7 is psutil 6.1.X. Install it with: <code>pip2 install
psutil==6.1.*</code>.</li>
<li>2490_: removed long deprecated <code>Process.memory_info_ex()</code>
method. It was
deprecated in psutil 4.0.0, released 8 years ago. Substitute is
<code>Process.memory_full_info()</code>.</li>
</ul>
<p><strong>Bug fixes</strong></p>
<ul>
<li>2496_, [Linux]: Avoid segfault (a cPython bug) on
<code>Process.memory_maps()</code>
for processes that use hundreds of GBs of memory.</li>
<li>2502_, [macOS]: <code>virtual_memory()</code>_ now relies on
<code>host_statistics64</code>
instead of <code>host_statistics</code>. This is the same approach used
by <code>vm_stat</code>
CLI tool, and should grant more accurate results.</li>
</ul>
<p><strong>Compatibility notes</strong></p>
<ul>
<li>2480_: Python 2.7 is no longer supported.</li>
<li>2490_: removed long deprecated <code>Process.memory_info_ex()</code>
method.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ea5b55605f"><code>ea5b556</code></a>
pre-release</li>
<li><a
href="d6e28b7a83"><code>d6e28b7</code></a>
try to fix tests</li>
<li><a
href="104bb3228b"><code>104bb32</code></a>
test cpu_times() for process children</li>
<li><a
href="16c091b380"><code>16c091b</code></a>
test cpu_times() for process children</li>
<li><a
href="eee09da72a"><code>eee09da</code></a>
[OSX] proc.c: Fix goo.gl link in comment for source reference (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2505">#2505</a>)</li>
<li><a
href="17e27801e6"><code>17e2780</code></a>
ci: build aarch64 wheel on GHA aarch64 runner (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2503">#2503</a>)</li>
<li><a
href="1ba8667c89"><code>1ba8667</code></a>
pin black version to 24.X, because new 25.X breaks style</li>
<li><a
href="9c114a5137"><code>9c114a5</code></a>
[OSX] use <code>host_statistics64</code> to get memory metrics (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2502">#2502</a>)</li>
<li><a
href="08d7d43894"><code>08d7d43</code></a>
pin black version to 24.X, because new 25.X breaks style</li>
<li><a
href="a509e5aa18"><code>a509e5a</code></a>
669 windows broadcast addr (<a
href="https://redirect.github.com/giampaolo/psutil/issues/2501">#2501</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/giampaolo/psutil/compare/release-6.1.1...release-7.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=psutil&package-manager=pip&previous-version=6.1.1&new-version=7.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-04-01 21:49:47 +00:00
Nicholas Tindle
f23b7543b3 feat: different signup error message (#9704)
<!-- Clearly explain the need for these changes: -->

We keep showing local users error messages that are just not relevant

### Changes 🏗️
Swaps the error messaging logic to be dependent on the behavior of the
specific platform they are on
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test with auth container down (simulates incorrect setup) and
validate that error message is shown
  - [x] Try normal path
2025-04-01 20:23:23 +00:00
Zamil Majdy
77b18b00c7 feat(frontend): Implement UI for Agent Input subtypes (#9700)
- Follow-up to #9657

<img width="280" alt="image"
src="https://github.com/user-attachments/assets/2f3cd683-db63-485f-8914-5654c34f1a4c"
/>

<img width="520" alt="image"
src="https://github.com/user-attachments/assets/de7e7cb9-61d4-4071-aea8-393ff5200c54"
/>

### Changes 🏗️

* Implement the input UI for Agent Input subtypes.
* Refactor node-input-component, extra out data type decision logic,
share it with runner/library input.
* Add `format` field for short-text, long-text, and mediafile type.
* Unify UI data type enum.

Out of scope:
- Styling for these inputs.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Use all the available agent input subtypes in an agent and run it

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-04-01 20:21:46 +00:00
Abhimanyu Yadav
dbb85baf4c fix(frontend): Fix date picker ux (#9715)
- fix #9315

What have I changed?

- Allowed the user to select the month and year using a dropdown.
- Removed the "Prev" and "Next" buttons for month navigation.
- Fixed the "Today" date design.

<img width="847" alt="Screenshot 2025-03-28 at 6 28 20 PM"
src="https://github.com/user-attachments/assets/740bddfd-e0a2-4799-8325-d52dec31a512"
/>

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-01 08:42:04 +00:00
Abhimanyu Yadav
7440f71527 fix(frontend): Sort agents by last edited date in publish dialog (#9724)
- fix #9189 

Currently, the list of agents on the "Publish Agent" dialog is random. I
have sorted them so that the latest edited ones appear first, similar to
the library page.

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-04-01 03:26:07 +00:00
Abhimanyu Yadav
c6089bb6a6 fix(frontend): Remove animation from search bar on library agent page (#9707)
- fix #9523 

Removing the animation from the input search bar and adding the same
behavior as the Google search bar.

![Screenshot 2025-03-28 at 10 20
57 AM](https://github.com/user-attachments/assets/cee009e9-3a81-41b1-9023-503aa040fee4)

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-03-31 12:57:37 +00:00
Abhimanyu Yadav
c71d06a082 fix(frontend): Add extra padding bottom on library agent page (#9706)
- fix #9705 

Adding extra padding so the banner doesn’t cut below the cards.

![Screenshot 2025-03-28 at 9 30
49 AM](https://github.com/user-attachments/assets/d1990dda-4d16-430b-823c-a6338e57d99c)

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-03-31 12:57:19 +00:00
Reinier van der Leer
babcb41f43 refactor(libs): Remove print statements (#9718)
Remove the debug print statements in the logging module.

Every time an app process is started, it prints:
```
Console logging enabled
```
or similar, depending on the logging config.
2025-03-31 10:46:06 +00:00
Reinier van der Leer
abcacacc06 fix(ci): Update lockfiles 2025-03-31 12:16:37 +02:00
Reinier van der Leer
1f2af18388 feat(platform/library): Real-time execution updates (#9695)
- Resolves #8782

### Changes 🏗️

- feat(frontend/library): Use WS subscription to get real-time execution
updates
- feat(backend/ws_api): Send `GraphExecutionUpdate` on all new agent I/O
- Include agent I/O in `GraphExecutionUpdate` (by subclassing
`GraphExecution`)
    - Add `IO_BLOCK_IDs` to `.blocks.io`
- feat(backend/ws_api): Add `subscribe_graph_executions` method to
WebSocket API

- feat(backend): Withhold `GraphExecution.node_executions` from requests
by non-graph-owners
  - Split `GraphExecutionWithNodes` off of `GraphExecution`
- Use `GraphExecution` as much as possible, as it's a much cheaper query
than `GraphExecutionWithNodes`
  - refactor(frontend): Make `GraphExecution.node_executions` optional

- fix(frontend): Parse dates in responses of `/executions` and
`/graphs/{graph_id}/executions`

- refactor(frontend/library): Move sorting logic for agent runs list
from `AgentRunsPage` to `AgentRunsSelectorList`

- refactor(backend/ws_api): Clean up message handler implementations

- refactor(backend/tests): Use `.data.execution.get_graph_execution(..)`
directly instead of `AgentServer.test_get_graph_run_results(..)`

Out-of-scope changes:
- refactor(backend): Remove unnecessary query include from
`.data.graph.get_graph_metadata(..)`

Demo:


https://github.com/user-attachments/assets/8ea6225d-7334-49cb-a522-83f153d840da

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]` for an agent with inputs and outputs
    - Draft and run a new run
      - [x] -> should appear in the list of runs at the top
      - [x] -> should be selected as soon as the request finishes
      - [x] -> new I/O should appear as it is generated
- [x] -> status should be updated in real-time (both in list and in
adjacent details view)
    - Click "Run again"
      - [x] -> should appear in the list of runs at the top
      - [x] -> should be selected as soon as the request finishes
      - [x] -> new I/O should appear as it is generated
- [x] -> status should be updated in real-time (both in list and in
adjacent details view)
- Click "Open in builder" under "Agent actions"; run the agent from the
builder
      - [x] -> should work the same as before
        - [x] -> node I/O should appear in real-time
        - [x] -> node execution statuses should update in real-time
2025-03-28 12:19:14 +00:00
Swifty
8974a0f9e5 fix(platform): Fixs to allow formatting and tests to work from sub command (#9703)
This pull request includes several changes to improve the backend
functionality and configuration of the `autogpt_platform`. The most
important changes involve adding a RabbitMQ service for testing,
enhancing logging configuration, updating the linter script to handle
errors gracefully, and modifying test configurations.

Backend configuration improvements:

*
[`autogpt_platform/backend/docker-compose.test.yaml`](diffhunk://#diff-f6a211ff1c6d96d19adb5641ee287258a6af8d72a99e33dafb4a334094205a43R29-R43):
Added RabbitMQ service configuration for testing, including health
checks and environment variables.
*
[`autogpt_platform/backend/.env.example`](diffhunk://#diff-62020caf1b9a15e0e3b9b3b1b69d5f6464bf7643f62354cbbaabf755d57b6064R191-R192):
Added a section delimiter for optional API keys for use in finding the
optional keys end when auto generating integrations.

Error handling and logging enhancements:

*
[`autogpt_platform/backend/linter.py`](diffhunk://#diff-0787e3ef718ac9963df64d9ab1d8e7a3b35dc4ab0cb874c65da6c2901e1e4991R3):
Updated the `run` function to handle `subprocess.CalledProcessError`
exceptions and print error output to `stderr` and prevent raising a
stack trace when it should not.
[[1]](diffhunk://#diff-0787e3ef718ac9963df64d9ab1d8e7a3b35dc4ab0cb874c65da6c2901e1e4991R3)
[[2]](diffhunk://#diff-0787e3ef718ac9963df64d9ab1d8e7a3b35dc4ab0cb874c65da6c2901e1e4991L13-R23)

Testing configuration updates:

*
[`autogpt_platform/backend/pyproject.toml`](diffhunk://#diff-26ebebd91da791c6484f07d9d91484a66f52836708f5294b24365603438b880cR111):
Added `asyncio_default_fixture_loop_scope` to pytest configuration for
better control over asyncio fixtures.
*
[`autogpt_platform/backend/run_tests.py`](diffhunk://#diff-f09930577243a4ef5213bf6191a3c500a4b8d3dcfee2d4b452cf7ce66b3c494fL55):
Removed the `postgres-test` service from the test setup script as we
need all of docker services up for the tests to run.
2025-03-28 09:39:43 +01:00
Zamil Majdy
071ae3cb1f feat(backend): Make agent store data to be publicly accessible by non authenticated user (#9710)
This PR publicly exposes all the agents listed in the store to the
internet.

### Changes 🏗️

Remove the auth requirement for an agent to download the agent.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Accessing
`http://localhost:8006/api/store/download/agents/{agentId}` without
authorization key.
2025-03-28 07:11:48 +00:00
Zamil Majdy
c6703dd891 fix(backend): Skip updating status of already terminated graph (#9696)
When we are cancelling a running graph execution, it's possible that the
graph is already terminated.
We need to allow this process to proceed and update the rest of its node
execution to terminate.

### Changes 🏗️

Instead of erroring out the graph execution status update, we proceed on
updating the node execution status.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Stop an already terminated graph
2025-03-26 04:19:37 +00:00
Reinier van der Leer
6e0af09c3d Merge branch 'master' into dev 2025-03-25 17:00:53 +01:00
Reinier van der Leer
9077323b89 fix(backend): Filter Redis messages by user ID (#9697) 2025-03-25 16:56:16 +01:00
Zamil Majdy
33299070d3 feat(frontend/library): Add toast on agent execution request failure (#9689)
Currently, when an agent execution fails to be executed, the front-end
does not display any feedback to the user.
The scope of this change is providing that.

### Changes 🏗️

* Extracted `useToastOnFail` from `credits` page into a unified helper
method.
* Uses `useToastOnFail` on agent execution requests on library pages.

<img width="1000" alt="image"
src="https://github.com/user-attachments/assets/2daa0597-eb93-457d-8887-0f00c4db89ac"
/>
<img width="1000" alt="image"
src="https://github.com/user-attachments/assets/1a541c98-fb95-424f-8ffe-972332b3ce01"
/>


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Run agent with invalid input 

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-25 13:51:17 +00:00
Reinier van der Leer
87f87500cb refactor(backend): Improve error message on unmatched webhook ingress (#9694)
- Resolves #9693

### Changes 🏗️

- Catch the DB error and log a descriptive error message
- Add `NotFoundError` to `backend.util.exceptions`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] ~~I have tested my changes according to the test plan:~~
- Low-stakes change, high effort to test: we'll see if it works from the
production logs
2025-03-25 13:36:37 +00:00
Reinier van der Leer
1162ec1474 refactor(backend): Reorganize & clean up execution update system (#9663)
- Prep work for #8782
- Prep work for #8779

### Changes 🏗️

- refactor(platform): Differentiate graph/node execution events
- fix(platform): Subscribe to execution updates by `graph_exec_id`
instead of `graph_id`+`graph_version`
- refactor(backend): Move all execution related models and functions
from `.data.graph` to `.data.execution`
- refactor(backend): Reorganize & refactor `.data.execution`

- fix(libs): Remove `load_dotenv` in `.auth.config` to fix test config
issues
- dx: Bump version of `black` in pre-commit config to v24.10.0 to match
poetry.lock

- Other minor refactoring in both frontend and backend

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Run an agent in the builder
    - [x] -> works normally, node I/O is updated in real time
  - Run an agent in the library
    - [x] -> works normally

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-25 13:14:04 +01:00
Krzysztof Czerwinski
37f212e950 Stop migrating models 2025-03-25 11:46:00 +00:00
Krzysztof Czerwinski
58bb4f92b7 feat(platform): Onboarding updates (#9636)
This is a follow up to
https://github.com/Significant-Gravitas/AutoGPT/pull/9511 fixing some
issues and updating onboarding.

### Changes 🏗️

- Update `UserOnboarding` data
  - Update schema and add migration
- Change `step` in `UserOnboarding` to `completedSteps` array with
`OnboardingStep` enum
- Remove `isCompleted`: this is now inferred from `completedSteps`
values
- Don't onboard if <2 marketplace agents; that prevents self-host
onboarding
- Add endpoints:
- `is_onboarding_enabled`: to check if users should be onboarded (not if
they finished onboarding); now check if there are at least 2 marketplace
agents
- `get_store_agent`: returns `StoreAgentDetails` for given
`store_listing_version_id`
  - `get_graph_meta_by_store_listing_version_id`: returns `GraphMeta`
- Add agent to Library just before running it and not when chosen and
remove code that was responsible for removing agent that wasn't run
- Move onboarding to `OnboardingProvider` (it'll be needed globally for
Phase 2)
- Multiple fixes, renames for clarity

### Checklist 📋

- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Don't onboard if less than 2 marketplace agents
  - [x] Avoid non-input and credentials agents
  - [x] Onboarding works and can be finished
  - [x] Onboarding resumes
  - [x] Onboarding agent runs correctly

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-25 10:40:40 +00:00
Krzysztof Czerwinski
b7ca8d9c30 feat(backend): Migrate old models in existing agents (#9452)
Some existing nodes use models that no longer exist as values on
`LlmModel` enum.

### Changes 🏗️

- Update models for all blocks with `LlmModel` fields that do not exist
in `LlmModel` enum to `gpt-4o`, directly in `AgentNode->constantInput`
db column, on server startup

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Updates wrong models to `gpt-4o` for all affected `AgentNode`s
  - [x] Doesn't update correct models
  - [x] Doesn't insert model when unnecessary
  - [x] Doesn't break other values in jsonb
2025-03-25 09:38:11 +00:00
Zamil Majdy
66ebe4376e fix(backend): Increase block request security; Prevent DNS rebinding & open redirect attack (#9688)
The current block web requests utility has a logic to avoid the system
firing into blocklisted IPs.
However, the current logic is still prone to a few security issues:

* DNS rebinding attack: due to the lack of guarantee on the used IP not
being changed during the IP checking and firing step.
* Open redirect: due to the request sensitive request headers are still
being propagated throughout the web redirect.

### Changes 🏗️

* Uses IP pinning to request the web.
* Strip `Authorization`, `Proxy-Authorization`, `Cookie` upon web
redirects.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Test the web request block, add more tests with different
validation scenarios.

(cherry picked from commit f0df4c9174)
2025-03-25 13:51:20 +07:00
Zamil Majdy
f0df4c9174 fix(backend): Increase block request security; Prevent DNS rebinding & open redirect attack (#9688)
The current block web requests utility has a logic to avoid the system
firing into blocklisted IPs.
However, the current logic is still prone to a few security issues:

* DNS rebinding attack: due to the lack of guarantee on the used IP not
being changed during the IP checking and firing step.
* Open redirect: due to the request sensitive request headers are still
being propagated throughout the web redirect.

### Changes 🏗️

* Uses IP pinning to request the web.
* Strip `Authorization`, `Proxy-Authorization`, `Cookie` upon web
redirects.


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Test the web request block, add more tests with different
validation scenarios.
2025-03-25 13:09:47 +07:00
Toran Bruce Richards
2e9ca70ce2 Update CONTRIBUTING.md 2025-03-24 18:11:56 +00:00
Reinier van der Leer
4ca1a453c9 refactor(backend): Defer loading of .blocks and .integrations.webhooks on module init (#9664)
Currently, an import statement like `from backend.blocks.basic import
AgentInputBlock` will initialize `backend.blocks` and thereby load all
other blocks. This has quite high potential to cause circular import
issues, and it's bad for performance in cases where we don't want to
load all blocks (yet).
The same goes for `backend.integrations.webhooks`.

### Changes 🏗️

- Change `__init__.py` of `backend.blocks` and
`backend.integrations.webhooks` to cached loader functions rather than
init-time code
- Change type of `BlockWebhookConfig.provider` to `ProviderName`

<!-- test edit to check that this doesn't break anything -->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Set up and use an agent with a webhook-triggered block

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-24 15:44:45 +00:00
Zamil Majdy
6f48515863 fix(blocks): Disable and provide toggle for Agent Input Block subtypes (#9677)
Agent Input Block subtypes do not have a proper input UI yet on the
library & run input page.

### Changes 🏗️

Provide a toggle to enable these blocks and set it to False by default.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-24 12:33:54 +00:00
Nicholas Tindle
7ba566e768 feat(frontend/backend): admin agent review table (#9634)
<!-- Clearly explain the need for these changes: -->
We need an admin agent approval UI for handling the submissions to the
marketplace

### Changes 🏗️
- Adds routes to the admin routes list
- Fixes the db query for submitting new versions of existing agents
- Add models for responses that include version details
- add the admin pages for agent
- Adds the Admin Agent Data Table
- Add all the new endpoints to the client.ts
Models changes
- convert the Submission status to an enum
- remove is_approved from models which was left incorrectly
- Add StoreListingWithVersions
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the admin dashboard for
    - [x] Reject
    - [x] Accept
    - [x] Updating listing
    - [x] More version submissions

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-24 07:52:35 +00:00
Zamil Majdy
26984a7338 feat(backend): Add capability to charge based on block execution count (#9661)
Blocks that are not defined in the block cost are pretty much free. The
lack of cost control makes it hard to control its quota. The scope of
this change is providing a way to charge any executions based on the
number of block being executed in real-time.

### Changes 🏗️

* Add execution charge logic based on the number of blocks executed,
controlled by these two configurations:
* `execution_cost_count_threshold`: We will charge the execution based
on the multiple of this number.
* `execution_cost_per_threshold`: The amount we are charging on its
threshold multiple.
* Make charging logic on the graph execution logic (as opposed to node
level) so it's being done serially and insufficient fund error is
guaranteed to stop the graph execution.
* Moved cost calculation logic into backend/executor/util.py

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Execute graph with configured threshold & cost and test the
balance being deducted on that.
  - [x] Existing cost calculation is still being done without any issue.
  - [x] Low balance stop the whole graph execution.
2025-03-24 07:26:33 +00:00
Zamil Majdy
5b118fc939 fix(blocks): Fix failing block test AgentToggleInputBlock 2025-03-24 12:31:16 +07:00
Zamil Majdy
ed48d1c04f fix(blocks): Change title of placeholder_values on AgentDropdownInputBlock 2025-03-24 12:21:20 +07:00
Zamil Majdy
8d87c08b8c fix(blocks): Set AgentInputBlocks default value to None and make it a non-advance field 2025-03-24 12:15:59 +07:00
Zamil Majdy
e49cb43b49 feat(block): Add agent input block subtypes (#9657)
### Changes 🏗️

Added these types of input blocks:
* TextShort
* TextLong
* Number
* Date
* Time
* FileUpload
* Dropdown
* Toggle

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Test in respective block codes.
2025-03-24 02:57:10 +00:00
Nicholas Tindle
56663c5fe9 feat(backend): add backend support for store listings submissions (#9628)
<!-- Clearly explain the need for these changes: -->
The store listing and submissions were previously just a best guess
without much implementation. This updates the database models and
queries and such to be based on discussion around what the process
should look like. It also adds and update the relevant routers for this
change

### Changes 🏗️
Store Listing
- change isApproved to hasApprovedVersion
- Move slug into store listing
- mark an active version in store listing

Store Version
- Move submissions into version
- make name optional
- have state transition timestamps for submitted and approved/rejected
- added a changes field
- added internal comments and clarified review comments field

SubmissionStatus
- Fixed DAFT to DRAFT

StoreListingSubmission
- Dropped table

Graph
- Used more modern format for the params for prisma -- no other changes

Added migrations for all the model movements

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Use the store codepaths from the release testplan doc as the test
plan (claude I can't publish the testplan but I am a maintainer lol,
trust me here my guy, you're supposed to be lenient)
  - [x] Check the db is used as appropriate following the rules

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-23 23:30:54 +00:00
Nicholas Tindle
a537fd0891 [Snyk] Security upgrade next from 14.2.23 to 14.2.25 (#9672)
![snyk-top-banner](https://redirect.github.com/andygongea/OWASP-Benchmark/assets/818805/c518c423-16fe-447e-b67f-ad5a49b5d123)

### Snyk has created this PR to fix 1 vulnerabilities in the yarn
dependencies of this project.

#### Snyk changed the following file(s):

- `autogpt_platform/frontend/package.json`
- `autogpt_platform/frontend/yarn.lock`


#### Note for
[zero-installs](https://yarnpkg.com/features/zero-installs) users

If you are using the Yarn feature
[zero-installs](https://yarnpkg.com/features/zero-installs) that was
introduced in Yarn V2, note that this PR does not update the
`.yarn/cache/` directory meaning this code cannot be pulled and
immediately developed on as one would expect for a zero-install project
- you will need to run `yarn` to update the contents of the
`./yarn/cache` directory.
If you are not using zero-install you can ignore this as your flow
should likely be unchanged.




#### Vulnerabilities that will be fixed with an upgrade:

|  | Issue | Score | 

:-------------------------:|:-------------------------|:-------------------------
![critical
severity](https://res.cloudinary.com/snyk/image/upload/w_20,h_20/v1561977819/icon/c.png
'critical severity') | Improper Authorization
<br/>[SNYK-JS-NEXT-9508709](https://snyk.io/vuln/SNYK-JS-NEXT-9508709) |
&nbsp;&nbsp;**751**&nbsp;&nbsp;




---

> [!IMPORTANT]
>
> - Check the changes in this PR to ensure they won't cause issues with
your project.
> - Max score is 1000. Note that the real score may have changed since
the PR was raised.
> - This PR was automatically created by Snyk using the credentials of a
real user.

---

**Note:** _You are seeing this because you or someone else with access
to this repository has authorized Snyk to open fix PRs._

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI5NGUwNmYxNy0yY2NkLTQ3NzEtOTk2NC1kN2JmYzhiNTI2NTgiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6Ijk0ZTA2ZjE3LTJjY2QtNDc3MS05OTY0LWQ3YmZjOGI1MjY1OCJ9fQ=="
width="0" height="0"/>
🧐 [View latest project
report](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr)
📜 [Customise PR
templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates?utm_source=github&utm_content=fix-pr-template)
🛠 [Adjust project
settings](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr/settings)
📚 [Read about Snyk's upgrade
logic](https://docs.snyk.io/scan-with-snyk/snyk-open-source/manage-vulnerabilities/upgrade-package-versions-to-fix-vulnerabilities?utm_source=github&utm_content=fix-pr-template)

---

**Learn how to fix vulnerabilities with free interactive lessons:**

🦉 [Improper
Authorization](https://learn.snyk.io/lesson/broken-function-level-authorization/?loc&#x3D;fix-pr)

[//]: #
'snyk:metadata:{"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"next","from":"14.2.23","to":"14.2.25"}],"env":"prod","issuesToFix":["SNYK-JS-NEXT-9508709"],"prId":"94e06f17-2ccd-4771-9964-d7bfc8b52658","prPublicId":"94e06f17-2ccd-4771-9964-d7bfc8b52658","packageManager":"yarn","priorityScoreList":[751],"projectPublicId":"3d924968-0cf3-4767-9609-501fa4962856","projectUrl":"https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source=github&utm_medium=referral&page=fix-pr","prType":"fix","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":["updated-fix-title","priorityScore"],"type":"auto","upgrade":["SNYK-JS-NEXT-9508709"],"vulns":["SNYK-JS-NEXT-9508709"],"patch":[],"isBreakingChange":false,"remediationStrategy":"vuln"}'

Co-authored-by: snyk-bot <snyk-bot@snyk.io>
2025-03-23 23:09:47 +00:00
Krzysztof Czerwinski
d694ccd50f fix(frontend): Fill defaults from schema to hardcodedValues at node creation (#9632)
Defaults need to be handled as special cases every time there's no
`hardcodedValues` in node data. This causes multiple issues such as
`useCredentials` not taking into account default model and requiring
user to manually switch model back and forth.

### Changes 🏗️

- Set default values from `inputSchema` to `hardcodedValues` when new
node is placed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Newly placed node has defaults set as `hardcodedValues`
- [x] AI Blocks: Model is recognised, node shows price and credentials
work correctly without the need to switch

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-23 22:48:28 +00:00
Zamil Majdy
f01b31873f feat(backend): Avoid loading all node executions on large continuos agent (#9667)
A graph that processes tens of thousands of nodes will cripple the
system since the API tries to load all of them and dump them into the
browser. The scope of this change is to avoid such an issue by only
returning the last 1000 node executions.

### Changes 🏗️

* Return only 1000 node executions from `AgentNodeExecutions` reference.
* Unify the include clause for fetching `AgentNodeExecutions` in one
place and its format.
* Fix & optimize `cancel_execution` logic to always set both the graph &
node execution status in batch.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Execute a graph in a loop that executes 10000 nodes, it should
only display the last 1000 nodes when refreshed. Cancelling the graph
should also not cripple the server.
2025-03-21 12:48:35 +00:00
Zamil Majdy
5411e18bd0 feat(backend): Mark starting nodes as QUEUED instead of INCOMPLETE during the initial execution (#9665)
Having the starting nodes of the execution marked as incomplete misled
the users.

### Changes 🏗️

Mark the starting nodes during the executions as QUEUED instead of
INCOMPLETE.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Executed the graph, the incomplete initial starting node is no
more.
2025-03-21 11:59:27 +00:00
Zamil Majdy
b85f6196aa fix(frontend): Fix unreliable websocket connection for node execution update (#9666)
The current execution update is unreliable, once you lose WebSocket
connection, you will receive no updates.

### Changes 🏗️

Fix web socket re-connection logic.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Run the app and execute an agent, then restart the API server, and
re-execute the app without refreshing the page.
2025-03-21 11:50:20 +00:00
Zamil Majdy
a1ac7b18f9 feat(backend): Avoid connecting the same host and falling-back to defined api_host (#9668)
### Changes 🏗️

Avoid connecting the same host and falling-back to defined api_host.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
- [ ] Define a custom DBMANAGER_HOST, RestService should access the
`db_manager` service using localhost.
2025-03-21 11:41:01 +00:00
Zamil Majdy
42232f55e8 feat(platform): Use a single DB manager across the system (#9662)
DB Manager uses DB connections, and multiple instances of it hog the
very limited Database connection quota. We need this service to be a
unified place to control the limited db connection.

### Changes 🏗️

Connect all the database manager usage in a single place, currently
running on the rest service.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-21 09:24:08 +00:00
Reinier van der Leer
9a661b5101 fix(backend/ws): Add user_id to websocket event subscription key (#9660)
- Add `user_id` to WS subscription key
- Add error catching to WS message handler
2025-03-20 17:54:04 +01:00
Zamil Majdy
90b147ff51 Merge branch 'dev' of github.com:Significant-Gravitas/AutoGPT into dev 2025-03-19 23:39:51 +07:00
Reinier van der Leer
6e4fbb0cb5 fix(frontend/library): Truncate agent card title and description (#9658)
- Resolves #9631

### Changes 🏗️

- Truncate library agent card title (2 lines) and description (3 lines)
- Make "See runs" and "Open in builder" stick to bottom of card
regardless of other content
- Reduce number of grid columns (4 -> 3) in `lg` layout on `/library` to
give items more horizontal space

![screenshot of library agent grid with the applied
changes](https://github.com/user-attachments/assets/b27d5c97-33b8-4708-9f8c-fc67aad899c9)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Visually test the changes made on different screen sizes
2025-03-19 23:39:09 +07:00
Reinier van der Leer
df6203343d fix(frontend/library): Improve agent I/O rendering (#9656)
- Related to #8784

### Changes 🏗️

- feat(frontend/library): Improve agent output styling & fix content
overflow issue
- fix(frontend/library): Fix overlap between content and inset button of
expandable input fields (#9650)
- fix(backend): Unbreak loading graph executions with missing inputs

![screenshot of restyled Output
section](https://github.com/user-attachments/assets/97836158-5735-4d01-94dd-16e3fb6999c6)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Run an agent with at least one input *not* filled out; view this run
in the Library
    - [x] -> page should load normally
    - [x] -> agent inputs should load and show normally
- Run an agent that generates long output; view this run in the Library
- [x] -> output should not overflow its container or stretch the page
layout
    - [x] -> visually check that the output section looks slick
2025-03-19 23:39:09 +07:00
Toran Bruce Richards
93238dc78c fix(blocks): SendWebRequestBlock to properly handle HTTP error responses (#9655)
### Issue
The SendWebRequestBlock currently fails to properly route HTTP error
responses (4xx, 5xx) to their designated output pins (`client_error` and
`server_error`). Instead, these errors are being sent to the default
"Error" pin, breaking expected workflows that depend on proper error
handling.

### Root Cause
The underlying issue is that our custom `requests` module from
`backend.util.request` appears to automatically raise exceptions for
error status codes (similar to how `raise_for_status()` works in the
standard requests library). When these exceptions are thrown, the
block's conditional logic for handling different status codes is
bypassed entirely.

### Changes
This PR adds proper exception handling to catch HTTP errors raised by
the requests module and routes them to the appropriate output pins:
- Added a try-except block to capture `requests.exceptions.HTTPError`
- Extract status code and response data from the caught exception
- Yield to the proper pin based on the status code (4xx → client_error,
5xx → server_error)
- Maintain consistent behavior with the original design intent

### Additional Context
This change maintains backward compatibility while ensuring the block
behaves according to its documented functionality. Users can now
properly handle 4xx and 5xx errors in their workflows as originally
intended.

<!-- Clearly explain the need for these changes: -->
### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test the block with new changes and old and ensure expected
behavior

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-19 23:39:09 +07:00
Nicholas Tindle
b6260b5ce9 fix(backend): drastically increase batching time for the agent run (#9654)
<!-- Clearly explain the need for these changes: -->

We accidently send several emails within 10 mins and we're gonna get
blocked for spam if we keep it up

### Changes 🏗️
- moves 1 min to 60 min timer
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test via batching a series of notiications over an hour
2025-03-19 23:39:09 +07:00
Reinier van der Leer
9c31c79898 feat(frontend/library): Make agent input fields expandable (#9650)
- Resolves #9622

### Changes 🏗️

- Add pop-out button + modal to input fields in Agent Run Draft view on
`/library/agents/[id]`
- Fix `icon`-variant button styling

![the expand button on the input
fields](https://github.com/user-attachments/assets/00be33fe-44d1-490a-9cab-9696df8f6e6f)
![the expanded input modal that
appears](https://github.com/user-attachments/assets/787f33b9-d884-467b-b99b-dcbec8a1d059)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to an agent's page -> click "+ New run"
    - [x] -> pop-out button should show on all input fields
- Enter a value in one of the inputs; click the pop-out button on that
input
    - [x] -> input modal with large text field should open
- [x] -> the value you just entered should be present in the modal's
text field
  - Edit the value & click "Save"
    - [x] -> the modal should close
- [x] -> the value in the corresponding input field should be updated
2025-03-19 23:39:09 +07:00
Zamil Majdy
f8a6c9e67f fix(block): Revert custom get_missing_links method on AddToListBlock 2025-03-19 23:39:09 +07:00
Zamil Majdy
ff9a5cc638 fix(block): Avoid infinite loop execution on AddToListBlock self-loop (#9629)
### Changes 🏗️

<img width="757" alt="image"
src="https://github.com/user-attachments/assets/909aab58-24c7-42ec-9580-ac3e9f32057e"
/>

Since a self-loop is now allowed for AddToListBlock, providing an entry
pin using a static output will cause infinite execution.
This PR change avoid such scenario to be allowed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Described above
2025-03-19 23:39:09 +07:00
Zamil Majdy
4e6144803b fix(platform): Fix possible db-config permission denied when running two different Supabase versions (#9652)
The change in https://github.com/Significant-Gravitas/AutoGPT/pull/9620
introduces a breaking change in the database volume content; however,
the database's volume location does not change, making switching between
two versions clash.

### Changes 🏗️

Renamed db-config named volume to supabase-config.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] CI
2025-03-19 23:39:09 +07:00
Reinier van der Leer
2c92122721 feat(platform/library): Add icons to primary agent run action buttons (#9651)
- Resolves #9612

### Changes 🏗️

- Add icon to "Run" button in run draft view
- Add icons "Stop run" and "Run again" buttons in run view

!["Run"
button](https://github.com/user-attachments/assets/da863753-6cb2-4cea-aa00-c313b606d198)
!["Run again"
button](https://github.com/user-attachments/assets/79958187-05dd-494e-a3a1-e9745db0d2d4)
!["Stop run"
button](https://github.com/user-attachments/assets/ad37ec3a-3c0b-493b-b548-e6b902eb8bda)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Purely visual changes, no functional test needed.
    Technical changes are covered by the type checker.
2025-03-19 23:39:09 +07:00
Nicholas Tindle
9b19d1959e feat(frontend): break out the sidebar into a reusable component + use it for admin page (#9618)
<!-- Clearly explain the need for these changes: -->
We need a sidebar for the admin page, might as well reuse the reusable
component to do so!

### Changes 🏗️
- Extracts the agptui sidebar to a more reusable component
- Update the usage of that sidebar in the settings page
- Use that same sidebar for the admin page

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the old sidebar
  - [x] Test the new sidebar for admin
2025-03-19 23:39:09 +07:00
Zamil Majdy
17f3a19bc3 feat(backend): Support sub-agent on export/import agent feature (#9640)
Agents using Agent blocks should be seamlessly downloaded from the
marketplace to a file and imported from a file.

Requirements:
* A recursive export process that exports all the required agents to a
single file, no matter how many layers deep (taking care of potential
loops).
* An import process that expects and extracts several agents from a
single file into your library at once.

Considerations:
We need to ensure the reference IDs in the Agent Blocks match/are
updated to match the imported sub-agent ids to prevent broken
references.

### Changes 🏗️

* Add sub_graphs field on Graph model 
* Improve graph creation query to support inserting graph + subgraphs in
batch
* Deprecate graph template & remove its column
* Update on marketplace download agent (unified the used method, with
more secure cleanup & proper ownership check).
* Fix failing test cases

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Export graph with sub agents.
  - [x] Import the exported graph with sub agents.
2025-03-19 23:39:09 +07:00
Reinier van der Leer
596b29f53a feat(platform/library): Add "Export agent to file" action (#9627)
- Resolves #9609

### Changes 🏗️

- feat(frontend/library): Add "Export agent to file" button
- fix(frontend/library): Put "Open in builder" button behind access
check

- feat(backend): Improve & move graph export stripping logic
  - Add logic to strip `SecretField` values
  - Move node stripping logic to `NodeModel` from `GraphModel`
    - Add `NodeModel.stripped_for_export()` method
  - Add `NodeModel.block` property

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Create and configure an agent with the Publish To Medium block and a
block that uses credentials
  - Go to `/library/agents/[id]` for the agent you just created
    - [x] -> "Open in builder" button should show
    - [x] -> "Open in builder" button should work
    - [x] -> "Export agent to file" button should show
    - [x] -> "Export agent to file" button should work
      - [x] -> Exported file contains no credentials or secrets
      - [ ] -> ~~Exported file contains no user IDs~~
  - Go to `/library/agents/[id]` for an agent from the marketplace
    - [x] -> "Open in builder" button should not show
    - [x] -> "Export agent to file" button should not show
2025-03-19 23:39:09 +07:00
dependabot[bot]
e0300f3d13 chore(libs/deps-dev): bump ruff from 0.9.6 to 0.9.9 in /autogpt_platform/autogpt_libs in the development-dependencies group (#9559)
Bumps the development-dependencies group in
/autogpt_platform/autogpt_libs with 1 update:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.9.6 to 0.9.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.9.9</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy ByPass -c &quot;irm
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.9.9</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz">ruff-x86_64-unknown-linux-gnu.tar.gz</a></td>
<td>x64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz">ruff-armv7-unknown-linux-gnueabihf.tar.gz</a></td>
<td>ARMv7 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz">ruff-aarch64-unknown-linux-musl.tar.gz</a></td>
<td>ARM64 MUSL Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>0.9.8</h2>
<h3>Preview features</h3>
<ul>
<li>Start detecting version-related syntax errors in the parser (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16090">#16090</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>pylint</code>] Mark fix unsafe (<code>PLW1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16343">#16343</a>)</li>
<li>[<code>pylint</code>] Catch <code>case np.nan</code>/<code>case
math.nan</code> in <code>match</code> statements (<code>PLW0177</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/16378">#16378</a>)</li>
<li>[<code>ruff</code>] Add more Pydantic models variants to the list of
default copy semantics (<code>RUF012</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16291">#16291</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the project if <code>configurationPreference</code>
is <code>editorOnly</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16381">#16381</a>)</li>
<li>Avoid unnecessary info at non-trace server log level (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16389">#16389</a>)</li>
<li>Expand <code>ruff.configuration</code> to allow inline config (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16296">#16296</a>)</li>
<li>Notify users for invalid client settings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16361">#16361</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Add <code>per-file-target-version</code> option (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16257">#16257</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>refurb</code>] Do not consider docstring(s)
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16391">#16391</a>)</li>
<li>[<code>flake8-self</code>] Ignore attribute accesses on
instance-like variables (<code>SLF001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16149">#16149</a>)</li>
<li>[<code>pylint</code>] Fix false positives, add missing methods, and
support positional-only parameters (<code>PLE0302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16263">#16263</a>)</li>
<li>[<code>flake8-pyi</code>] Mark <code>PYI030</code> fix unsafe when
comments are deleted (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16322">#16322</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix example for <code>S611</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16316">#16316</a>)</li>
<li>Normalize inconsistent markdown headings in docstrings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16364">#16364</a>)</li>
<li>Document MSRV policy (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16384">#16384</a>)</li>
</ul>
<h2>0.9.7</h2>
<h3>Preview features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="091d0af2ab"><code>091d0af</code></a>
Bump version to Ruff 0.9.9 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16434">#16434</a>)</li>
<li><a
href="3d72138740"><code>3d72138</code></a>
Check <code>LinterSettings::preview</code> for version-related syntax
errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16429">#16429</a>)</li>
<li><a
href="4a23756024"><code>4a23756</code></a>
Avoid caching files with unsupported syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16425">#16425</a>)</li>
<li><a
href="af62f7932b"><code>af62f79</code></a>
Prioritize &quot;bug&quot; label for changelog sections (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16433">#16433</a>)</li>
<li><a
href="0ced8d053c"><code>0ced8d0</code></a>
[<code>flake8-copyright</code>] Add links to applicable options
(<code>CPY001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16421">#16421</a>)</li>
<li><a
href="a8e171f82c"><code>a8e171f</code></a>
Fix string-length limit in documentation for PYI054 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16432">#16432</a>)</li>
<li><a
href="cf83584abb"><code>cf83584</code></a>
Show version-related syntax errors in the playground (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16419">#16419</a>)</li>
<li><a
href="764aa0e6a1"><code>764aa0e</code></a>
Allow passing <code>ParseOptions</code> to inline tests (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16357">#16357</a>)</li>
<li><a
href="568cf88c6c"><code>568cf88</code></a>
Bump version to 0.9.8 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16414">#16414</a>)</li>
<li><a
href="040071bbc5"><code>040071b</code></a>
[red-knot] Ignore surrounding whitespace when looking for `&lt;!--
snapshot-diag...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.6...0.9.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.6&new-version=0.9.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 23:39:09 +07:00
Zamil Majdy
780fddc2a0 feat(platform)!: Lock Supabase docker-compose code (#9620)
We have been submoduling Supabase for provisioning local Supabase
instances using docker-compose. Aside from the huge size of unrelated
code being pulled, there is also the risk of pulling unintentional
breaking change from the upstream to the platform.

The latest Supabase changes hide the 5432 port from the supabase-db
container and shift it to the supavisor, the instance that we are
currently not using. This causes an error in the existing setup.

## BREAKING CHANGES

This change will introduce different volume locations for the database
content, pulling this change will make the data content fresh from the
start. To keep your old data with this change, execute this command:
```
cp -r supabase/docker/volumes/db/data db/docker/volumes/db/data
```


### Changes 🏗️

The scope of this PR is snapshotting the current docker-compose code
obtained from the Supabase repository and embedding it into our
repository. This will eliminate the need for submodule / recursive
cloning and bringing the entire Supabase repository into the platform.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI
2025-03-19 23:39:09 +07:00
Nicholas Tindle
52b4351961 fix: backend admin page logic was broken (#9616)
<!-- Clearly explain the need for these changes: -->

We're building out admin utilities so we need to bring back the `/admin`
route with RBAC. This PR goes through re-enabling that to work with the
latest changes

### Changes 🏗️
- Adds back removed logic
- Refactors the role checks to fix minor bug for admin page and more
importantly clarify
- Updates routes to the latest 
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test with admin and authenticated user roles
  - [x] Test with logged out user role
- [x] For the above check the all the existing routes + new ones in the
`middleware.ts`
2025-03-19 23:39:09 +07:00
Zamil Majdy
8757439192 fix(platform): Fallback front-end-url to platform-url for billing page 2025-03-19 23:39:09 +07:00
dependabot[bot]
e124ee6a9e chore(frontend/deps): bump the production-dependencies group across 1 directory with 13 updates (#9611)
Bumps the production-dependencies group with 13 updates in the
/autogpt_platform/frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@faker-js/faker](https://github.com/faker-js/faker) | `9.4.0` |
`9.6.0` |
|
[@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties)
| `15.1.6` | `15.2.1` |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js) |
`2.48.1` | `2.49.1` |
|
[@tanstack/react-table](https://github.com/TanStack/table/tree/HEAD/packages/react-table)
| `8.20.6` | `8.21.2` |
|
[@xyflow/react](https://github.com/xyflow/xyflow/tree/HEAD/packages/react)
| `12.4.2` | `12.4.4` |
| [framer-motion](https://github.com/motiondivision/motion) | `12.3.1` |
`12.4.11` |
|
[lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react)
| `0.474.0` | `0.479.0` |
| [next-themes](https://github.com/pacocoursey/next-themes) | `0.4.4` |
`0.4.5` |
| [react-day-picker](https://github.com/gpbl/react-day-picker) | `9.5.1`
| `9.6.1` |
| [react-icons](https://github.com/react-icons/react-icons) | `5.4.0` |
`5.5.0` |
| [react-shepherd](https://github.com/shepherd-pro/shepherd) | `6.1.7` |
`6.1.8` |
| [uuid](https://github.com/uuidjs/uuid) | `11.0.5` | `11.1.0` |
| [zod](https://github.com/colinhacks/zod) | `3.24.1` | `3.24.2` |


Updates `@faker-js/faker` from 9.4.0 to 9.6.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/releases"><code>@​faker-js/faker</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v9.6.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): update dependency typescript to v5.8.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3424">faker-js/faker#3424</a></li>
<li>chore(deps): update dependency ts-morph to v25.0.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3418">faker-js/faker#3418</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3419">faker-js/faker#3419</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3420">faker-js/faker#3420</a></li>
<li>chore(deps): update vitest by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3421">faker-js/faker#3421</a></li>
<li>chore(deps): update all non-major dependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3422">faker-js/faker#3422</a></li>
<li>chore(deps): remove obsolete dependency
<code>@​types/eslint</code>__js by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3425">faker-js/faker#3425</a></li>
<li>chore(deps): update dependency prettier to v3.5.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3423">faker-js/faker#3423</a></li>
<li>chore(deps): update pnpm to v10 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3427">faker-js/faker#3427</a></li>
<li>chore(deps): update eslint (major) by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3426">faker-js/faker#3426</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3428">faker-js/faker#3428</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3431">faker-js/faker#3431</a></li>
<li>docs: revert npm download badge by <a
href="https://github.com/LitoMore"><code>@​LitoMore</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li>feat(finance): add ISO 4217 numerical codes to Currency object by <a
href="https://github.com/Nfloc"><code>@​Nfloc</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li>feat(number): bigint multipleOf by <a
href="https://github.com/soc221b"><code>@​soc221b</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
<li>refactor(internet): deprecate color method for removal by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3401">faker-js/faker#3401</a></li>
<li>test: add snapshot test for all locales' character sets by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3276">faker-js/faker#3276</a></li>
<li>chore(release): 9.6.0 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3435">faker-js/faker#3435</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/LitoMore"><code>@​LitoMore</code></a>
made their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li><a href="https://github.com/Nfloc"><code>@​Nfloc</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li><a href="https://github.com/soc221b"><code>@​soc221b</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0</a></p>
<h2>v9.5.1</h2>
<h2>What's Changed</h2>
<ul>
<li>test: retry verify tag 3 times by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3395">faker-js/faker#3395</a></li>
<li>test: disable summary for local by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3394">faker-js/faker#3394</a></li>
<li>chore: add usage trend by <a
href="https://github.com/cwtuan"><code>@​cwtuan</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3403">faker-js/faker#3403</a></li>
<li>fix: test before using Buffers by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3400">faker-js/faker#3400</a></li>
<li>revert(chore): update LICENSE file (<a
href="https://redirect.github.com/faker-js/faker/issues/3350">#3350</a>)
by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3410">faker-js/faker#3410</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3411">faker-js/faker#3411</a></li>
<li>docs: change ejcheng by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3408">faker-js/faker#3408</a></li>
<li>docs: improve missing data error by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3406">faker-js/faker#3406</a></li>
<li>chore(release): 9.5.1 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3415">faker-js/faker#3415</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/cwtuan"><code>@​cwtuan</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1</a></p>
<h2>v9.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3377">faker-js/faker#3377</a></li>
<li>docs: faker.seed examples are not consistent after refresh by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3378">faker-js/faker#3378</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/blob/next/CHANGELOG.md"><code>@​faker-js/faker</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">9.6.0</a>
(2025-03-06)</h2>
<h3>Features</h3>
<ul>
<li><strong>finance:</strong> add ISO 4217 numerical codes to Currency
(<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)
(<a
href="ae9aec67b1">ae9aec6</a>)</li>
<li><strong>number:</strong> bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)
(<a
href="7b4f85a2c0">7b4f85a</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">9.5.1</a>
(2025-02-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>test before using Buffers (<a
href="https://redirect.github.com/faker-js/faker/issues/3400">#3400</a>)
(<a
href="ec7c9a8e60">ec7c9a8</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.5.0">9.5.0</a>
(2025-02-10)</h2>
<h3>Features</h3>
<ul>
<li><strong>image:</strong> add AI-generated avatars (<a
href="https://redirect.github.com/faker-js/faker/issues/3126">#3126</a>)
(<a
href="9e1395380c">9e13953</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="50b3241629"><code>50b3241</code></a>
chore(release): 9.6.0 (<a
href="https://redirect.github.com/faker-js/faker/issues/3435">#3435</a>)</li>
<li><a
href="62486af20c"><code>62486af</code></a>
test: add snapshot test for all locales' character sets (<a
href="https://redirect.github.com/faker-js/faker/issues/3276">#3276</a>)</li>
<li><a
href="1982431fd0"><code>1982431</code></a>
refactor(internet): deprecate color method for removal (<a
href="https://redirect.github.com/faker-js/faker/issues/3401">#3401</a>)</li>
<li><a
href="7b4f85a2c0"><code>7b4f85a</code></a>
feat(number): bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)</li>
<li><a
href="ae9aec67b1"><code>ae9aec6</code></a>
feat(finance): add ISO 4217 numerical codes to Currency (<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)</li>
<li><a
href="57d39d7442"><code>57d39d7</code></a>
docs: revert npm download badge (<a
href="https://redirect.github.com/faker-js/faker/issues/3433">#3433</a>)</li>
<li><a
href="bf3aa8b064"><code>bf3aa8b</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3431">#3431</a>)</li>
<li><a
href="f591459aff"><code>f591459</code></a>
chore(deps): update devdependencies (<a
href="https://redirect.github.com/faker-js/faker/issues/3428">#3428</a>)</li>
<li><a
href="1db428ab97"><code>1db428a</code></a>
chore(deps): update eslint (major) (<a
href="https://redirect.github.com/faker-js/faker/issues/3426">#3426</a>)</li>
<li><a
href="b7e7714b8b"><code>b7e7714</code></a>
chore(deps): update pnpm to v10 (<a
href="https://redirect.github.com/faker-js/faker/issues/3427">#3427</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.6.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~st-ddt">st-ddt</a>, a new releaser for
<code>@​faker-js/faker</code> since your current version.</p>
</details>
<br />

Updates `@next/third-parties` from 15.1.6 to 15.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases"><code>@​next/third-parties</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v15.2.1</h2>
<h3>Core Changes</h3>
<ul>
<li>Unify Link and Form prefetching: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76184">#76184</a></li>
<li>Turbopack: Ensure server actions sourcemaps tests pass: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76157">#76157</a></li>
<li>[dev-overlay] control dark theme in one place: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76528">#76528</a></li>
<li>[dev-overlay] change css var for terminal: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76590">#76590</a></li>
<li>[dev-overlay] Discriminate stack frame settled typed: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76517">#76517</a></li>
<li>Remove obsolete <code>sourcePackage</code> references: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76550">#76550</a></li>
<li>refactor: remove unused variable in externals handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76599">#76599</a></li>
<li>fix: Add popular embedding libraries to serverExternalPackages: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76574">#76574</a></li>
<li>[Segment Cache] Implement hash-only navigations: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76179">#76179</a></li>
<li>Webpack: abstract away getting compilation spans: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76579">#76579</a></li>
<li>report compiler duration for webpack and improve numbers: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76665">#76665</a></li>
<li>[dev-overlay] fix dark theme missing close bracket: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76672">#76672</a></li>
<li>Remove <code>revalidate</code> property from incremental cache
<code>ctx</code> for <code>FETCH</code> kind: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76500">#76500</a></li>
<li>[dev-overlay] fix: env name label style was out of sync with error
type label: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76668">#76668</a></li>
<li>Turbopack: avoid celling source maps before minify: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76626">#76626</a></li>
<li>refactor(CI): Merge all four bundler test manifest scripts into one:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76652">#76652</a></li>
<li>[metadata] fix duplicate metadata for parallel routes: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76669">#76669</a></li>
<li>[Segment Cache] Omit from bundle if flag disabled: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76622">#76622</a></li>
<li>[Segment Cache] Support output: &quot;export&quot; mode: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75671">#75671</a></li>
<li>[Segment Cache] Refresh on same-page navigation: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76223">#76223</a></li>
<li>[metadata] re-enable streaming metadata with PPR: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76119">#76119</a></li>
<li>[Segment Cache] Search param fallback handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75990">#75990</a></li>
<li>[Segment Cache] Fix: canonicalURL omits origin: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76444">#76444</a></li>
<li>fix metadata basePath for manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76681">#76681</a></li>
<li>Propagate expire time to <code>cache-control</code> header and
prerender manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76207">#76207</a></li>
<li>Show revalidate/expire columns in build output: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76343">#76343</a></li>
<li>Gate alternate bundler behind canary only: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76634">#76634</a></li>
<li>[dynamicIO] routes with dynamic segments should be able to be static
in dev: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76691">#76691</a></li>
<li>[repo] upgrade ts <code>5.8.2</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a></li>
<li>[metadata]: ensure metadata boundary is only rendered once on client
nav: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76692">#76692</a></li>
<li>[metadata] clean up redudant options: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76712">#76712</a></li>
<li>Fix uniqueness detection for <code>generateStaticParams</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76713">#76713</a></li>
<li>Upgrade React from <code>22e39ea7-20250225</code> to
<code>d55cc79b-20250228</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76680">#76680</a></li>
<li>[Turbopack] Compute module batches and use them for chunking: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76133">#76133</a></li>
<li>[Dev Tools] Improve keyboard interactions for menu &amp; overlays:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76754">#76754</a></li>
<li>Keep server code out of browser chunks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76660">#76660</a></li>
<li>Turbopack: inline minify into code generation and make it a plain
function instead of a turbo tasks function: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76628">#76628</a></li>
<li>fix edge runtime asset fetch in pages api: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76750">#76750</a></li>
<li>Update use-cache-unknown-cache-kind.test.ts snapshot for alternate
bundler: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76682">#76682</a></li>
</ul>
<h3>Example Changes</h3>
<ul>
<li>docs: fix reading <code>params</code> code blocks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76705">#76705</a></li>
</ul>
<h3>Misc Changes</h3>
<ul>
<li>fix(rustdoc): Fix rustdoc warnings, block on rustdoc failures in CI:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76448">#76448</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="633878112e"><code>6338781</code></a>
v15.2.1</li>
<li><a
href="197b4bb709"><code>197b4bb</code></a>
v15.2.1-canary.6</li>
<li><a
href="0b699b1c8d"><code>0b699b1</code></a>
v15.2.1-canary.5</li>
<li><a
href="4bf1ee117d"><code>4bf1ee1</code></a>
[repo] upgrade ts <code>5.8.2</code> (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a>)</li>
<li><a
href="6f6001a87a"><code>6f6001a</code></a>
v15.2.1-canary.4</li>
<li><a
href="5f1df89fdc"><code>5f1df89</code></a>
v15.2.1-canary.3</li>
<li><a
href="f06a72e11e"><code>f06a72e</code></a>
v15.2.1-canary.2</li>
<li><a
href="2497f81d1b"><code>2497f81</code></a>
v15.2.1-canary.1</li>
<li><a
href="83610c6a84"><code>83610c6</code></a>
v15.2.1-canary.0</li>
<li><a
href="b0416fbb44"><code>b0416fb</code></a>
v15.2.0</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/next.js/commits/v15.2.1/packages/third-parties">compare
view</a></li>
</ul>
</details>
<br />

Updates `@supabase/supabase-js` from 2.48.1 to 2.49.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-js/releases"><code>@​supabase/supabase-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v2.49.1</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.49.0...v2.49.1">2.49.1</a>
(2025-02-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> upgrade postgrest-js 1.19.2 (<a
href="3f01c3fbc4">3f01c3f</a>)</li>
</ul>
<h2>v2.49.0</h2>
<h1><a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.0">2.49.0</a>
(2025-02-24)</h1>
<h3>Features</h3>
<ul>
<li>bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)
(<a
href="a9ece9a4ae">a9ece9a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fceca48c37"><code>fceca48</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1369">#1369</a>
from supabase/avallete/chore-bump-postgrest-js-1-19-2</li>
<li><a
href="a9ece9a4ae"><code>a9ece9a</code></a>
feat: bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)</li>
<li><a
href="3f01c3fbc4"><code>3f01c3f</code></a>
fix(deps): upgrade postgrest-js 1.19.2</li>
<li>See full diff in <a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@tanstack/react-table` from 8.20.6 to 8.21.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/TanStack/table/releases"><code>@​tanstack/react-table</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.21.2</h2>
<p>Version 8.21.2 - 2/11/25, 8:59 PM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>arrIncludes autoremove filterFn (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5623">#5623</a>)
(2efaf57) by lukebui</li>
<li>lit-table: spread table options in lit adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5904">#5904</a>)
(36dede1) by <a
href="https://github.com/kadoshms"><code>@​kadoshms</code></a></li>
</ul>
<h3>Docs</h3>
<ul>
<li>row accessor bug in example code block (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5893">#5893</a>)
(b1506a7) by Valerii Petryniak</li>
<li>virtualizer tbody from onchange (827b098) by Kevin Van Cott</li>
<li>exp virtual - remeasure when table state changes (9e6987d) by Kevin
Van Cott</li>
<li>angular: add expanding and sub components examples (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5898">#5898</a>)
(099e1a4) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>example name (57703a4) by Kevin Van Cott</li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/table-core</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/angular-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/qwik-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/solid-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/svelte-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/vue-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table-devtools</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
</ul>
<h2>v8.21.1</h2>
<p>Version 8.21.1 - 2/3/25, 5:37 AM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>lit-table: dynamic data updates in the Lit Table Adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5884">#5884</a>)
(9763877) by Luke Schierer</li>
</ul>
<h3>Docs</h3>
<ul>
<li>add experimental virtualization example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5895">#5895</a>)
(8d6e19f) by Kevin Van Cott</li>
<li>angular: add missing faker-js deps (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5883">#5883</a>)
(190c669) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>angular: add editable, row-dnd and performant column resizing
example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5881">#5881</a>)
(0baabdd) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.1</li>
</ul>
<h2>v8.21.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="db745afdb8"><code>db745af</code></a>
release: v8.21.2</li>
<li>See full diff in <a
href="https://github.com/TanStack/table/commits/v8.21.2/packages/react-table">compare
view</a></li>
</ul>
</details>
<br />

Updates `@xyflow/react` from 12.4.2 to 12.4.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/releases"><code>@​xyflow/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/blob/main/packages/react/CHANGELOG.md"><code>@​xyflow/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>12.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2>12.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d045503667"><code>d045503</code></a>
chore(packages): bump</li>
<li><a
href="7a00fe3520"><code>7a00fe3</code></a>
chore(getNodeConnections): remove deprecation <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5051">#5051</a></li>
<li><a
href="08b99e8719"><code>08b99e8</code></a>
Merge pull request <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5043">#5043</a>
from xyflow/refactor/dynamic-expand-parent</li>
<li><a
href="8dd2b4f9e2"><code>8dd2b4f</code></a>
chore(updateNodePositions): cleanup</li>
<li><a
href="0b67a6c303"><code>0b67a6c</code></a>
refactor(errors): show error when user drags uninitialized node <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5014">#5014</a></li>
<li><a
href="27df80b6a6"><code>27df80b</code></a>
fix(selection-listener): pass generics</li>
<li><a
href="d094ef0581"><code>d094ef0</code></a>
fix(OnSelectionChangeFunc): pass node and edge type generics <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5023">#5023</a></li>
<li><a
href="3969758af2"><code>3969758</code></a>
refactor(expandParent): use current value on drag <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5039">#5039</a></li>
<li><a
href="43f188d3b1"><code>43f188d</code></a>
fix(click-connections): handle isConnectableStart correctly <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5041">#5041</a></li>
<li><a
href="68591a8bf1"><code>68591a8</code></a>
Merge branch 'main' into no-deprecated</li>
<li>Additional commits viewable in <a
href="https://github.com/xyflow/xyflow/commits/@xyflow/react@12.4.4/packages/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `framer-motion` from 12.3.1 to 12.4.11
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/motiondivision/motion/blob/main/CHANGELOG.md">framer-motion's
changelog</a>.</em></p>
<blockquote>
<h2>[12.4.11] 2025-03-10</h2>
<h3>Fixed</h3>
<ul>
<li>Preventing flattening of scroll animations when <code>type</code> or
<code>ease</code> are explicitly set.</li>
</ul>
<h2>[12.4.10] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Adding UMD bundles for <code>motion-dom</code> and
<code>motion-utils</code>.</li>
</ul>
<h2>[12.4.9] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>Reorder.Item</code> reordering causing
<code>lostpointercapture</code> event to fire.</li>
</ul>
<h2>[12.4.8] 2025-02-26</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed exiting children with <code>layoutDependency</code> not
animating layout changes because of a stale layout dependency.</li>
</ul>
<h2>[12.4.7] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>AnimatePresence</code> not triggering exit animations
when a child with <code>layout</code> or <code>drag</code> is
removed.</li>
</ul>
<h2>[12.4.6] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed drag gesture on child elements.</li>
</ul>
<h2>[12.4.5] 2025-02-19</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>onClick</code> handlers not working inside
<code>press</code> events.</li>
</ul>
<h2>[12.4.4] 2025-02-18</h2>
<h3>Fixed</h3>
<ul>
<li>Changed press, drag and pan gestures to use pointer capturing for
better usage within <code>iframe</code> embeds.</li>
</ul>
<h2>[12.4.3] 2025-02-12</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9316ca8202"><code>9316ca8</code></a>
v12.4.11</li>
<li><a
href="c291a09ff2"><code>c291a09</code></a>
Updating changelog</li>
<li><a
href="9e2923c5e4"><code>9e2923c</code></a>
Fix scroll easing (<a
href="https://redirect.github.com/motiondivision/motion/issues/3106">#3106</a>)</li>
<li><a
href="18b71d1395"><code>18b71d1</code></a>
v12.4.10</li>
<li><a
href="e89a0c20c9"><code>e89a0c2</code></a>
Latest</li>
<li><a
href="d84031e1cd"><code>d84031e</code></a>
Latest</li>
<li><a
href="63e7597969"><code>63e7597</code></a>
Updating rollup</li>
<li><a
href="3fcf837c1f"><code>3fcf837</code></a>
v12.4.9</li>
<li><a
href="c58920f6f2"><code>c58920f</code></a>
Updating changelog</li>
<li><a
href="c889431567"><code>c889431</code></a>
Fixing pointer capture and Reorder item (<a
href="https://redirect.github.com/motiondivision/motion/issues/3097">#3097</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/motiondivision/motion/compare/v12.3.1...v12.4.11">compare
view</a></li>
</ul>
</details>
<br />

Updates `lucide-react` from 0.474.0 to 0.479.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/lucide-icons/lucide/releases">lucide-react's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.479.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(<code>@​lucide/svelte</code>): Lucide svelte 5 package by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2753">lucide-icons/lucide#2753</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0">https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0</a></p>
<h2>Version 0.478.0</h2>
<h2>What's Changed</h2>
<ul>
<li>ci(pr-comment): Fix icon preview comment on PRs by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2854">lucide-icons/lucide#2854</a></li>
<li>fix(ci): run lint pr title on title change by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2872">lucide-icons/lucide#2872</a></li>
<li>fix(metadata): name change reflected in contributions by <a
href="https://github.com/AnnaSasDev"><code>@​AnnaSasDev</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2866">lucide-icons/lucide#2866</a></li>
<li>fix(icons): changed <code>brackets</code> icon by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2863">lucide-icons/lucide#2863</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0">https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0</a></p>
<h2>New icons 0.477.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>square-round-corner</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2323">#2323</a>)
by <a href="https://github.com/liamb13"><code>@​liamb13</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>circle-slash-2</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2837">#2837</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>Fixes and new icons 0.476.0</h2>
<h2>Fixes</h2>
<ul>
<li>fix(lucide-react): Revert exports property package.json, fixing edge
worker environments. by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2814">lucide-icons/lucide#2814</a></li>
<li>fix(lucide): Lucide create element function returning SVG Element by
<a href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in
<a
href="https://redirect.github.com/lucide-icons/lucide/pull/2816">lucide-icons/lucide#2816</a></li>
</ul>
<h2>New icons 🎨</h2>
<ul>
<li><code>shield-user</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2608">#2608</a>)
by <a
href="https://github.com/sebinemeth"><code>@​sebinemeth</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>beef</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2832">#2832</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>New icons 0.475.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>circle-small</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars-stroke</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>non-binary</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>transgender</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1787b82cfe"><code>1787b82</code></a>
build(deps-dev): bump vite from 5.4.13 to 5.4.14 in /packages/lucide (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2804">#2804</a>)</li>
<li><a
href="b46927e510"><code>b46927e</code></a>
fix(lucide-react): Revert exports property package.json, fixing edge
worker e...</li>
<li><a
href="3ab6c373a0"><code>3ab6c37</code></a>
build(deps-dev): bump vite from 5.4.12 to 5.4.13 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2798">#2798</a>)</li>
<li><a
href="ba2c4b526f"><code>ba2c4b5</code></a>
build(deps-dev): bump vite from 5.1.8 to 5.4.12 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2786">#2786</a>)</li>
<li><a
href="50630b3aaf"><code>50630b3</code></a>
ci: Improve build speeds (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2778">#2778</a>)</li>
<li>See full diff in <a
href="https://github.com/lucide-icons/lucide/commits/0.479.0/packages/lucide-react">compare
view</a></li>
</ul>
</details>
<br />

Updates `next-themes` from 0.4.4 to 0.4.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pacocoursey/next-themes/releases">next-themes's
releases</a>.</em></p>
<blockquote>
<h2>v0.4.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: map theme to class using ValueObject in injected script by <a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li>Reduce number of renders by pre-setting resolvedTheme by <a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
<li>Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
directory by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/331">pacocoursey/next-themes#331</a></li>
<li>Bump the npm_and_yarn group across 1 directory with 7 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/341">pacocoursey/next-themes#341</a></li>
<li>chore: Fix corepack errors in CI by <a
href="https://github.com/pacocoursey"><code>@​pacocoursey</code></a> in
<a
href="https://redirect.github.com/pacocoursey/next-themes/pull/342">pacocoursey/next-themes#342</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li><a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d12996b4e8"><code>d12996b</code></a>
chore: Fix corepack errors in CI (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/342">#342</a>)</li>
<li><a
href="b77db23e9f"><code>b77db23</code></a>
Bump the npm_and_yarn group across 1 directory with 7 updates (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/341">#341</a>)</li>
<li><a
href="d3fa4ee9ad"><code>d3fa4ee</code></a>
Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
director...</li>
<li><a
href="ad83567b11"><code>ad83567</code></a>
Reduce number of renders by pre-setting resolvedTheme (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/338">#338</a>)</li>
<li><a
href="1b510445a3"><code>1b51044</code></a>
fix: map theme to class using ValueObject in injected script (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/330">#330</a>)</li>
<li>See full diff in <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-day-picker` from 9.5.1 to 9.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gpbl/react-day-picker/releases">react-day-picker's
releases</a>.</em></p>
<blockquote>
<h2>v9.6.1</h2>
<p>This release addresses an accessibility issue, adds a new
<code>animate</code> prop and fixes other minor bugs.</p>
<h3>Possible Breaking Change in Custom Styles</h3>
<p>To address a <a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2630">focus
lost bug</a> affecting navigation buttons, we <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">updated</a>
the buttons to use <code>aria-disabled</code> instead of the
<code>disabled</code> attribute.</p>
<p>This change may cause custom styles for those disabled buttons to
break. To fix it in your code, update the CSS selector to target
<code>[aria-disabled=&quot;true&quot;]</code>:</p>
<pre lang="diff"><code>- .rdp-button_next:disabled,
+ .rdp-button_next[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
- .rdp-button_previous:disabled,
+ .rdp-button_previous[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
</code></pre>
<h3>Animating Month Transitions</h3>
<p>Thanks to the work by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a>, we have
added animations to DayPicker. The new <a
href="http://daypicker.dev/docs/navigation#animate"><code>animate</code>
prop</a> enables CSS transitions for captions and weeks when navigating
between months:</p>
<!-- raw HTML omitted -->
<pre lang="tsx"><code>&lt;DayPicker animate /&gt;
</code></pre>
<p>Customizing the animation style can be challenging due to the HTML
table structure of the grid. We may address this in the future. Please
leave your feedback in <a
href="https://github.com/gpbl/react-day-picker/discussions">DayPicker
Discussions</a>.</p>
<h2>What's Changed</h2>
<ul>
<li>feat: new <code>animate</code> prop by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2684">gpbl/react-day-picker#2684</a></li>
<li>feat(performance): add <code>sideEffects</code> property to
package.json by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2673">gpbl/react-day-picker#2673</a></li>
<li>fix(accessibility): focus lost when navigation button is disabled by
<a href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">gpbl/react-day-picker#2685</a></li>
<li>fix: render selected days with <code>selected</code> modifier when
disabled by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2700">gpbl/react-day-picker#2700</a></li>
<li>fix(build): remove extra files from package.json by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2692">gpbl/react-day-picker#2692</a></li>
<li>chore(types): fix deprecation of select event handler types by <a
href="https://github.com/timothyis"><code>@​timothyis</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<h3>v9.6.1</h3>
<ul>
<li>fix(build): add missing .css entries in package.json files by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2703">gpbl/react-day-picker#2703</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/timothyis"><code>@​timothyis</code></a>
made their first contribution in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1</a></p>
<h2>v9.6.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c37983b8e5"><code>c37983b</code></a>
build: bump v9.6.1</li>
<li><a
href="3d382fe18d"><code>3d382fe</code></a>
build: add missing .css entries in package.json files (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2703">#2703</a>)</li>
<li><a
href="ca71182076"><code>ca71182</code></a>
build: bump v9.6.0</li>
<li><a
href="37f759a718"><code>37f759a</code></a>
chore: animate prop, remove <a
href="https://github.com/experimental"><code>@​experimental</code></a>
tag</li>
<li><a
href="9aa3d35062"><code>9aa3d35</code></a>
docs: update for new <code>animate</code> prop (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2694">#2694</a>)</li>
<li><a
href="d7d0a8ad13"><code>d7d0a8a</code></a>
fix: render selected days with selected modifier when disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2700">#2700</a>)</li>
<li><a
href="48f00dc20f"><code>48f00dc</code></a>
fix: focus lost when navigation button is disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2685">#2685</a>)</li>
<li><a
href="6617c9bf81"><code>6617c9b</code></a>
chore: update keyframes names (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2695">#2695</a>)</li>
<li><a
href="13e0a4acc9"><code>13e0a4a</code></a>
test: fix test related to first of month (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2693">#2693</a>)</li>
<li><a
href="ebde52dd02"><code>ebde52d</code></a>
docs: fix no-wrap-table style for paragraphs</li>
<li>Additional commits viewable in <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-icons` from 5.4.0 to 5.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/react-icons/react-icons/releases">react-icons's
releases</a>.</em></p>
<blockquote>
<h2>v5.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>[React 19] Update IconType type to return React.ReactNode by <a
href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
<li>Bump vite from 5.2.10 to 5.4.11 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/996">react-icons/react-icons#996</a></li>
<li>Bump nanoid from 3.3.7 to 3.3.8 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1005">react-icons/react-icons#1005</a></li>
<li>Bump vite from 5.4.11 to 5.4.14 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1021">react-icons/react-icons#1021</a></li>
<li>Bump esbuild from 0.20.2 to 0.25.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1027">react-icons/react-icons#1027</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a>
made their first contribution in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0">https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0</a></p>
<table>
<thead>
<tr>
<th>Icon Library</th>
<th>License</th>
<th>Version</th>
<th align="right">Count</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://circumicons.com/">Circum Icons</a></td>
<td><a
href="https://github.com/Klarr-Agency/Circum-Icons/blob/main/LICENSE">MPL-2.0
license</a></td>
<td>1.0.0</td>
<td align="right">288</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 5</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>5.15.4-3-gafecf2a</td>
<td align="right">1612</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 6</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>6.6.0</td>
<td align="right">2050</td...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-19 23:39:09 +07:00
Reinier van der Leer
7854b999f3 fix(frontend/library): Truncate agent card title and description (#9658)
- Resolves #9631

### Changes 🏗️

- Truncate library agent card title (2 lines) and description (3 lines)
- Make "See runs" and "Open in builder" stick to bottom of card
regardless of other content
- Reduce number of grid columns (4 -> 3) in `lg` layout on `/library` to
give items more horizontal space

![screenshot of library agent grid with the applied
changes](https://github.com/user-attachments/assets/b27d5c97-33b8-4708-9f8c-fc67aad899c9)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Visually test the changes made on different screen sizes
2025-03-19 15:56:57 +00:00
Reinier van der Leer
ca5fb1618e fix(frontend/library): Improve agent I/O rendering (#9656)
- Related to #8784

### Changes 🏗️

- feat(frontend/library): Improve agent output styling & fix content
overflow issue
- fix(frontend/library): Fix overlap between content and inset button of
expandable input fields (#9650)
- fix(backend): Unbreak loading graph executions with missing inputs

![screenshot of restyled Output
section](https://github.com/user-attachments/assets/97836158-5735-4d01-94dd-16e3fb6999c6)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Run an agent with at least one input *not* filled out; view this run
in the Library
    - [x] -> page should load normally
    - [x] -> agent inputs should load and show normally
- Run an agent that generates long output; view this run in the Library
- [x] -> output should not overflow its container or stretch the page
layout
    - [x] -> visually check that the output section looks slick
2025-03-19 15:19:52 +00:00
Toran Bruce Richards
6d36be6f86 fix(blocks): SendWebRequestBlock to properly handle HTTP error responses (#9655)
### Issue
The SendWebRequestBlock currently fails to properly route HTTP error
responses (4xx, 5xx) to their designated output pins (`client_error` and
`server_error`). Instead, these errors are being sent to the default
"Error" pin, breaking expected workflows that depend on proper error
handling.

### Root Cause
The underlying issue is that our custom `requests` module from
`backend.util.request` appears to automatically raise exceptions for
error status codes (similar to how `raise_for_status()` works in the
standard requests library). When these exceptions are thrown, the
block's conditional logic for handling different status codes is
bypassed entirely.

### Changes
This PR adds proper exception handling to catch HTTP errors raised by
the requests module and routes them to the appropriate output pins:
- Added a try-except block to capture `requests.exceptions.HTTPError`
- Extract status code and response data from the caught exception
- Yield to the proper pin based on the status code (4xx → client_error,
5xx → server_error)
- Maintain consistent behavior with the original design intent

### Additional Context
This change maintains backward compatibility while ensuring the block
behaves according to its documented functionality. Users can now
properly handle 4xx and 5xx errors in their workflows as originally
intended.

<!-- Clearly explain the need for these changes: -->
### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Test the block with new changes and old and ensure expected
behavior

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-19 13:05:07 +00:00
Nicholas Tindle
dc1d5faa5d fix(backend): drastically increase batching time for the agent run (#9654)
<!-- Clearly explain the need for these changes: -->

We accidently send several emails within 10 mins and we're gonna get
blocked for spam if we keep it up

### Changes 🏗️
- moves 1 min to 60 min timer
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test via batching a series of notiications over an hour
2025-03-18 19:39:16 +00:00
Reinier van der Leer
a187e87741 feat(frontend/library): Make agent input fields expandable (#9650)
- Resolves #9622

### Changes 🏗️

- Add pop-out button + modal to input fields in Agent Run Draft view on
`/library/agents/[id]`
- Fix `icon`-variant button styling

![the expand button on the input
fields](https://github.com/user-attachments/assets/00be33fe-44d1-490a-9cab-9696df8f6e6f)
![the expanded input modal that
appears](https://github.com/user-attachments/assets/787f33b9-d884-467b-b99b-dcbec8a1d059)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to an agent's page -> click "+ New run"
    - [x] -> pop-out button should show on all input fields
- Enter a value in one of the inputs; click the pop-out button on that
input
    - [x] -> input modal with large text field should open
- [x] -> the value you just entered should be present in the modal's
text field
  - Edit the value & click "Save"
    - [x] -> the modal should close
- [x] -> the value in the corresponding input field should be updated
2025-03-18 14:52:30 +00:00
Zamil Majdy
067983eb80 fix(block): Revert custom get_missing_links method on AddToListBlock 2025-03-18 22:12:19 +07:00
Zamil Majdy
e6de8b98f7 fix(block): Avoid infinite loop execution on AddToListBlock self-loop (#9629)
### Changes 🏗️

<img width="757" alt="image"
src="https://github.com/user-attachments/assets/909aab58-24c7-42ec-9580-ac3e9f32057e"
/>

Since a self-loop is now allowed for AddToListBlock, providing an entry
pin using a static output will cause infinite execution.
This PR change avoid such scenario to be allowed.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Described above
2025-03-18 14:44:34 +00:00
Zamil Majdy
607641c574 fix(platform): Fix possible db-config permission denied when running two different Supabase versions (#9652)
The change in https://github.com/Significant-Gravitas/AutoGPT/pull/9620
introduces a breaking change in the database volume content; however,
the database's volume location does not change, making switching between
two versions clash.

### Changes 🏗️

Renamed db-config named volume to supabase-config.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] CI
2025-03-18 13:06:03 +00:00
Reinier van der Leer
18dfbf191c feat(platform/library): Add icons to primary agent run action buttons (#9651)
- Resolves #9612

### Changes 🏗️

- Add icon to "Run" button in run draft view
- Add icons "Stop run" and "Run again" buttons in run view

!["Run"
button](https://github.com/user-attachments/assets/da863753-6cb2-4cea-aa00-c313b606d198)
!["Run again"
button](https://github.com/user-attachments/assets/79958187-05dd-494e-a3a1-e9745db0d2d4)
!["Stop run"
button](https://github.com/user-attachments/assets/ad37ec3a-3c0b-493b-b548-e6b902eb8bda)


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Purely visual changes, no functional test needed.
    Technical changes are covered by the type checker.
2025-03-18 10:31:33 +00:00
Nicholas Tindle
841679216c feat(frontend): break out the sidebar into a reusable component + use it for admin page (#9618)
<!-- Clearly explain the need for these changes: -->
We need a sidebar for the admin page, might as well reuse the reusable
component to do so!

### Changes 🏗️
- Extracts the agptui sidebar to a more reusable component
- Update the usage of that sidebar in the settings page
- Use that same sidebar for the admin page

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test the old sidebar
  - [x] Test the new sidebar for admin
2025-03-17 21:19:19 +00:00
Zamil Majdy
50eac43e1a feat(backend): Support sub-agent on export/import agent feature (#9640)
Agents using Agent blocks should be seamlessly downloaded from the
marketplace to a file and imported from a file.

Requirements:
* A recursive export process that exports all the required agents to a
single file, no matter how many layers deep (taking care of potential
loops).
* An import process that expects and extracts several agents from a
single file into your library at once.

Considerations:
We need to ensure the reference IDs in the Agent Blocks match/are
updated to match the imported sub-agent ids to prevent broken
references.

### Changes 🏗️

* Add sub_graphs field on Graph model 
* Improve graph creation query to support inserting graph + subgraphs in
batch
* Deprecate graph template & remove its column
* Update on marketplace download agent (unified the used method, with
more secure cleanup & proper ownership check).
* Fix failing test cases

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Export graph with sub agents.
  - [x] Import the exported graph with sub agents.
2025-03-17 16:38:27 +00:00
Reinier van der Leer
91445e4760 feat(platform/library): Add "Export agent to file" action (#9627)
- Resolves #9609

### Changes 🏗️

- feat(frontend/library): Add "Export agent to file" button
- fix(frontend/library): Put "Open in builder" button behind access
check

- feat(backend): Improve & move graph export stripping logic
  - Add logic to strip `SecretField` values
  - Move node stripping logic to `NodeModel` from `GraphModel`
    - Add `NodeModel.stripped_for_export()` method
  - Add `NodeModel.block` property

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Create and configure an agent with the Publish To Medium block and a
block that uses credentials
  - Go to `/library/agents/[id]` for the agent you just created
    - [x] -> "Open in builder" button should show
    - [x] -> "Open in builder" button should work
    - [x] -> "Export agent to file" button should show
    - [x] -> "Export agent to file" button should work
      - [x] -> Exported file contains no credentials or secrets
      - [ ] -> ~~Exported file contains no user IDs~~
  - Go to `/library/agents/[id]` for an agent from the marketplace
    - [x] -> "Open in builder" button should not show
    - [x] -> "Export agent to file" button should not show
2025-03-16 14:10:53 +00:00
dependabot[bot]
6127727aeb chore(libs/deps-dev): bump ruff from 0.9.6 to 0.9.9 in /autogpt_platform/autogpt_libs in the development-dependencies group (#9559)
Bumps the development-dependencies group in
/autogpt_platform/autogpt_libs with 1 update:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.9.6 to 0.9.9
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.9.9</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy ByPass -c &quot;irm
https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.9.9</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz">ruff-x86_64-unknown-linux-gnu.tar.gz</a></td>
<td>x64 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz">ruff-armv7-unknown-linux-gnueabihf.tar.gz</a></td>
<td>ARMv7 Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz">ruff-aarch64-unknown-linux-musl.tar.gz</a></td>
<td>ARM64 MUSL Linux</td>
<td><a
href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is
enabled (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>0.9.8</h2>
<h3>Preview features</h3>
<ul>
<li>Start detecting version-related syntax errors in the parser (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16090">#16090</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>pylint</code>] Mark fix unsafe (<code>PLW1507</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16343">#16343</a>)</li>
<li>[<code>pylint</code>] Catch <code>case np.nan</code>/<code>case
math.nan</code> in <code>match</code> statements (<code>PLW0177</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/16378">#16378</a>)</li>
<li>[<code>ruff</code>] Add more Pydantic models variants to the list of
default copy semantics (<code>RUF012</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16291">#16291</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the project if <code>configurationPreference</code>
is <code>editorOnly</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16381">#16381</a>)</li>
<li>Avoid unnecessary info at non-trace server log level (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16389">#16389</a>)</li>
<li>Expand <code>ruff.configuration</code> to allow inline config (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16296">#16296</a>)</li>
<li>Notify users for invalid client settings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16361">#16361</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Add <code>per-file-target-version</code> option (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16257">#16257</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>refurb</code>] Do not consider docstring(s)
(<code>FURB156</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16391">#16391</a>)</li>
<li>[<code>flake8-self</code>] Ignore attribute accesses on
instance-like variables (<code>SLF001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16149">#16149</a>)</li>
<li>[<code>pylint</code>] Fix false positives, add missing methods, and
support positional-only parameters (<code>PLE0302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16263">#16263</a>)</li>
<li>[<code>flake8-pyi</code>] Mark <code>PYI030</code> fix unsafe when
comments are deleted (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16322">#16322</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix example for <code>S611</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16316">#16316</a>)</li>
<li>Normalize inconsistent markdown headings in docstrings (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16364">#16364</a>)</li>
<li>Document MSRV policy (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16384">#16384</a>)</li>
</ul>
<h2>0.9.7</h2>
<h3>Preview features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="091d0af2ab"><code>091d0af</code></a>
Bump version to Ruff 0.9.9 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16434">#16434</a>)</li>
<li><a
href="3d72138740"><code>3d72138</code></a>
Check <code>LinterSettings::preview</code> for version-related syntax
errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16429">#16429</a>)</li>
<li><a
href="4a23756024"><code>4a23756</code></a>
Avoid caching files with unsupported syntax errors (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16425">#16425</a>)</li>
<li><a
href="af62f7932b"><code>af62f79</code></a>
Prioritize &quot;bug&quot; label for changelog sections (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16433">#16433</a>)</li>
<li><a
href="0ced8d053c"><code>0ced8d0</code></a>
[<code>flake8-copyright</code>] Add links to applicable options
(<code>CPY001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16421">#16421</a>)</li>
<li><a
href="a8e171f82c"><code>a8e171f</code></a>
Fix string-length limit in documentation for PYI054 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16432">#16432</a>)</li>
<li><a
href="cf83584abb"><code>cf83584</code></a>
Show version-related syntax errors in the playground (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16419">#16419</a>)</li>
<li><a
href="764aa0e6a1"><code>764aa0e</code></a>
Allow passing <code>ParseOptions</code> to inline tests (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16357">#16357</a>)</li>
<li><a
href="568cf88c6c"><code>568cf88</code></a>
Bump version to 0.9.8 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16414">#16414</a>)</li>
<li><a
href="040071bbc5"><code>040071b</code></a>
[red-knot] Ignore surrounding whitespace when looking for `&lt;!--
snapshot-diag...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.6...0.9.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.6&new-version=0.9.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-14 18:13:31 +00:00
Zamil Majdy
1bc3041615 feat(platform)!: Lock Supabase docker-compose code (#9620)
We have been submoduling Supabase for provisioning local Supabase
instances using docker-compose. Aside from the huge size of unrelated
code being pulled, there is also the risk of pulling unintentional
breaking change from the upstream to the platform.

The latest Supabase changes hide the 5432 port from the supabase-db
container and shift it to the supavisor, the instance that we are
currently not using. This causes an error in the existing setup.

## BREAKING CHANGES

This change will introduce different volume locations for the database
content, pulling this change will make the data content fresh from the
start. To keep your old data with this change, execute this command:
```
cp -r supabase/docker/volumes/db/data db/docker/volumes/db/data
```


### Changes 🏗️

The scope of this PR is snapshotting the current docker-compose code
obtained from the Supabase repository and embedding it into our
repository. This will eliminate the need for submodule / recursive
cloning and bringing the entire Supabase repository into the platform.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Existing CI
2025-03-14 17:16:13 +00:00
Nicholas Tindle
9c84dbddca fix: backend admin page logic was broken (#9616)
<!-- Clearly explain the need for these changes: -->

We're building out admin utilities so we need to bring back the `/admin`
route with RBAC. This PR goes through re-enabling that to work with the
latest changes

### Changes 🏗️
- Adds back removed logic
- Refactors the role checks to fix minor bug for admin page and more
importantly clarify
- Updates routes to the latest 
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test with admin and authenticated user roles
  - [x] Test with logged out user role
- [x] For the above check the all the existing routes + new ones in the
`middleware.ts`
2025-03-14 16:37:15 +00:00
Zamil Majdy
b67c2e166b fix(platform): Fallback front-end-url to platform-url for billing page 2025-03-14 21:09:34 +07:00
Zamil Majdy
aa17872667 feat(backend): Fix failed RPC on Notification Service
(cherry picked from commit 801f3a3a24)
2025-03-14 14:37:04 +07:00
Zamil Majdy
801f3a3a24 feat(backend): Fix failed RPC on Notification Service 2025-03-14 14:36:44 +07:00
Zamil Majdy
b0fed43971 feat(backend): Fix failed RPC on Notification Service (#9630)
Although returning a Prisma object on an RPC is a bad practice, we have
instances where we do so and the type contains a `prisma.Json` field.
This Json field can't be seamlessly serialized and then converted back
into the Prisma object.

### Changes 🏗️

Replacing prisma object as return type on notification service with a
plain pydantic object as DTO.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Calling notification APIs through the RPC client.

(cherry picked from commit b9f31a9c44)
2025-03-14 13:26:34 +07:00
Zamil Majdy
b9f31a9c44 feat(backend): Fix failed RPC on Notification Service (#9630)
Although returning a Prisma object on an RPC is a bad practice, we have
instances where we do so and the type contains a `prisma.Json` field.
This Json field can't be seamlessly serialized and then converted back
into the Prisma object.

### Changes 🏗️

Replacing prisma object as return type on notification service with a
plain pydantic object as DTO.


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Calling notification APIs through the RPC client.
2025-03-14 01:54:18 +00:00
Zamil Majdy
90f9e4e94a fix(backend): Move Notification service to DB manager (#9626)
DatabaseManager is already provisioned in RestApiService, and
NotificationService lives within the same instance as the Rest Server.

### Changes 🏗️

Moving the DB calls of NotificationService to DatabaseManager.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>

  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

(cherry picked from commit f4d4bb83b0)
2025-03-13 13:44:47 +07:00
Zamil Majdy
f4d4bb83b0 fix(backend): Move Notification service to DB manager (#9626)
DatabaseManager is already provisioned in RestApiService, and
NotificationService lives within the same instance as the Rest Server.

### Changes 🏗️

Moving the DB calls of NotificationService to DatabaseManager.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-13 03:14:46 +00:00
dependabot[bot]
02618e1a52 chore(frontend/deps): bump the production-dependencies group across 1 directory with 13 updates (#9611)
Bumps the production-dependencies group with 13 updates in the
/autogpt_platform/frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@faker-js/faker](https://github.com/faker-js/faker) | `9.4.0` |
`9.6.0` |
|
[@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties)
| `15.1.6` | `15.2.1` |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js) |
`2.48.1` | `2.49.1` |
|
[@tanstack/react-table](https://github.com/TanStack/table/tree/HEAD/packages/react-table)
| `8.20.6` | `8.21.2` |
|
[@xyflow/react](https://github.com/xyflow/xyflow/tree/HEAD/packages/react)
| `12.4.2` | `12.4.4` |
| [framer-motion](https://github.com/motiondivision/motion) | `12.3.1` |
`12.4.11` |
|
[lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react)
| `0.474.0` | `0.479.0` |
| [next-themes](https://github.com/pacocoursey/next-themes) | `0.4.4` |
`0.4.5` |
| [react-day-picker](https://github.com/gpbl/react-day-picker) | `9.5.1`
| `9.6.1` |
| [react-icons](https://github.com/react-icons/react-icons) | `5.4.0` |
`5.5.0` |
| [react-shepherd](https://github.com/shepherd-pro/shepherd) | `6.1.7` |
`6.1.8` |
| [uuid](https://github.com/uuidjs/uuid) | `11.0.5` | `11.1.0` |
| [zod](https://github.com/colinhacks/zod) | `3.24.1` | `3.24.2` |


Updates `@faker-js/faker` from 9.4.0 to 9.6.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/releases"><code>@​faker-js/faker</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v9.6.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): update dependency typescript to v5.8.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3424">faker-js/faker#3424</a></li>
<li>chore(deps): update dependency ts-morph to v25.0.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3418">faker-js/faker#3418</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3419">faker-js/faker#3419</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3420">faker-js/faker#3420</a></li>
<li>chore(deps): update vitest by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3421">faker-js/faker#3421</a></li>
<li>chore(deps): update all non-major dependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3422">faker-js/faker#3422</a></li>
<li>chore(deps): remove obsolete dependency
<code>@​types/eslint</code>__js by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3425">faker-js/faker#3425</a></li>
<li>chore(deps): update dependency prettier to v3.5.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3423">faker-js/faker#3423</a></li>
<li>chore(deps): update pnpm to v10 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3427">faker-js/faker#3427</a></li>
<li>chore(deps): update eslint (major) by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3426">faker-js/faker#3426</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3428">faker-js/faker#3428</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3431">faker-js/faker#3431</a></li>
<li>docs: revert npm download badge by <a
href="https://github.com/LitoMore"><code>@​LitoMore</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li>feat(finance): add ISO 4217 numerical codes to Currency object by <a
href="https://github.com/Nfloc"><code>@​Nfloc</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li>feat(number): bigint multipleOf by <a
href="https://github.com/soc221b"><code>@​soc221b</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
<li>refactor(internet): deprecate color method for removal by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3401">faker-js/faker#3401</a></li>
<li>test: add snapshot test for all locales' character sets by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3276">faker-js/faker#3276</a></li>
<li>chore(release): 9.6.0 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3435">faker-js/faker#3435</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/LitoMore"><code>@​LitoMore</code></a>
made their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3433">faker-js/faker#3433</a></li>
<li><a href="https://github.com/Nfloc"><code>@​Nfloc</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3404">faker-js/faker#3404</a></li>
<li><a href="https://github.com/soc221b"><code>@​soc221b</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3402">faker-js/faker#3402</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0</a></p>
<h2>v9.5.1</h2>
<h2>What's Changed</h2>
<ul>
<li>test: retry verify tag 3 times by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3395">faker-js/faker#3395</a></li>
<li>test: disable summary for local by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3394">faker-js/faker#3394</a></li>
<li>chore: add usage trend by <a
href="https://github.com/cwtuan"><code>@​cwtuan</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3403">faker-js/faker#3403</a></li>
<li>fix: test before using Buffers by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3400">faker-js/faker#3400</a></li>
<li>revert(chore): update LICENSE file (<a
href="https://redirect.github.com/faker-js/faker/issues/3350">#3350</a>)
by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3410">faker-js/faker#3410</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3411">faker-js/faker#3411</a></li>
<li>docs: change ejcheng by <a
href="https://github.com/Shinigami92"><code>@​Shinigami92</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3408">faker-js/faker#3408</a></li>
<li>docs: improve missing data error by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3406">faker-js/faker#3406</a></li>
<li>chore(release): 9.5.1 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3415">faker-js/faker#3415</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/cwtuan"><code>@​cwtuan</code></a> made
their first contribution in <a
href="https://redirect.github.com/faker-js/faker/pull/3374">faker-js/faker#3374</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1</a></p>
<h2>v9.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3377">faker-js/faker#3377</a></li>
<li>docs: faker.seed examples are not consistent after refresh by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3378">faker-js/faker#3378</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/blob/next/CHANGELOG.md"><code>@​faker-js/faker</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.1...v9.6.0">9.6.0</a>
(2025-03-06)</h2>
<h3>Features</h3>
<ul>
<li><strong>finance:</strong> add ISO 4217 numerical codes to Currency
(<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)
(<a
href="ae9aec67b1">ae9aec6</a>)</li>
<li><strong>number:</strong> bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)
(<a
href="7b4f85a2c0">7b4f85a</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.5.0...v9.5.1">9.5.1</a>
(2025-02-28)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>test before using Buffers (<a
href="https://redirect.github.com/faker-js/faker/issues/3400">#3400</a>)
(<a
href="ec7c9a8e60">ec7c9a8</a>)</li>
</ul>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.5.0">9.5.0</a>
(2025-02-10)</h2>
<h3>Features</h3>
<ul>
<li><strong>image:</strong> add AI-generated avatars (<a
href="https://redirect.github.com/faker-js/faker/issues/3126">#3126</a>)
(<a
href="9e1395380c">9e13953</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="50b3241629"><code>50b3241</code></a>
chore(release): 9.6.0 (<a
href="https://redirect.github.com/faker-js/faker/issues/3435">#3435</a>)</li>
<li><a
href="62486af20c"><code>62486af</code></a>
test: add snapshot test for all locales' character sets (<a
href="https://redirect.github.com/faker-js/faker/issues/3276">#3276</a>)</li>
<li><a
href="1982431fd0"><code>1982431</code></a>
refactor(internet): deprecate color method for removal (<a
href="https://redirect.github.com/faker-js/faker/issues/3401">#3401</a>)</li>
<li><a
href="7b4f85a2c0"><code>7b4f85a</code></a>
feat(number): bigint multipleOf (<a
href="https://redirect.github.com/faker-js/faker/issues/3402">#3402</a>)</li>
<li><a
href="ae9aec67b1"><code>ae9aec6</code></a>
feat(finance): add ISO 4217 numerical codes to Currency (<a
href="https://redirect.github.com/faker-js/faker/issues/3404">#3404</a>)</li>
<li><a
href="57d39d7442"><code>57d39d7</code></a>
docs: revert npm download badge (<a
href="https://redirect.github.com/faker-js/faker/issues/3433">#3433</a>)</li>
<li><a
href="bf3aa8b064"><code>bf3aa8b</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3431">#3431</a>)</li>
<li><a
href="f591459aff"><code>f591459</code></a>
chore(deps): update devdependencies (<a
href="https://redirect.github.com/faker-js/faker/issues/3428">#3428</a>)</li>
<li><a
href="1db428ab97"><code>1db428a</code></a>
chore(deps): update eslint (major) (<a
href="https://redirect.github.com/faker-js/faker/issues/3426">#3426</a>)</li>
<li><a
href="b7e7714b8b"><code>b7e7714</code></a>
chore(deps): update pnpm to v10 (<a
href="https://redirect.github.com/faker-js/faker/issues/3427">#3427</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/faker-js/faker/compare/v9.4.0...v9.6.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~st-ddt">st-ddt</a>, a new releaser for
<code>@​faker-js/faker</code> since your current version.</p>
</details>
<br />

Updates `@next/third-parties` from 15.1.6 to 15.2.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases"><code>@​next/third-parties</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v15.2.1</h2>
<h3>Core Changes</h3>
<ul>
<li>Unify Link and Form prefetching: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76184">#76184</a></li>
<li>Turbopack: Ensure server actions sourcemaps tests pass: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76157">#76157</a></li>
<li>[dev-overlay] control dark theme in one place: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76528">#76528</a></li>
<li>[dev-overlay] change css var for terminal: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76590">#76590</a></li>
<li>[dev-overlay] Discriminate stack frame settled typed: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76517">#76517</a></li>
<li>Remove obsolete <code>sourcePackage</code> references: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76550">#76550</a></li>
<li>refactor: remove unused variable in externals handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76599">#76599</a></li>
<li>fix: Add popular embedding libraries to serverExternalPackages: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76574">#76574</a></li>
<li>[Segment Cache] Implement hash-only navigations: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76179">#76179</a></li>
<li>Webpack: abstract away getting compilation spans: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76579">#76579</a></li>
<li>report compiler duration for webpack and improve numbers: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76665">#76665</a></li>
<li>[dev-overlay] fix dark theme missing close bracket: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76672">#76672</a></li>
<li>Remove <code>revalidate</code> property from incremental cache
<code>ctx</code> for <code>FETCH</code> kind: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76500">#76500</a></li>
<li>[dev-overlay] fix: env name label style was out of sync with error
type label: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76668">#76668</a></li>
<li>Turbopack: avoid celling source maps before minify: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76626">#76626</a></li>
<li>refactor(CI): Merge all four bundler test manifest scripts into one:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76652">#76652</a></li>
<li>[metadata] fix duplicate metadata for parallel routes: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76669">#76669</a></li>
<li>[Segment Cache] Omit from bundle if flag disabled: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76622">#76622</a></li>
<li>[Segment Cache] Support output: &quot;export&quot; mode: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75671">#75671</a></li>
<li>[Segment Cache] Refresh on same-page navigation: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76223">#76223</a></li>
<li>[metadata] re-enable streaming metadata with PPR: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76119">#76119</a></li>
<li>[Segment Cache] Search param fallback handling: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75990">#75990</a></li>
<li>[Segment Cache] Fix: canonicalURL omits origin: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76444">#76444</a></li>
<li>fix metadata basePath for manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76681">#76681</a></li>
<li>Propagate expire time to <code>cache-control</code> header and
prerender manifest: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76207">#76207</a></li>
<li>Show revalidate/expire columns in build output: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76343">#76343</a></li>
<li>Gate alternate bundler behind canary only: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76634">#76634</a></li>
<li>[dynamicIO] routes with dynamic segments should be able to be static
in dev: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76691">#76691</a></li>
<li>[repo] upgrade ts <code>5.8.2</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a></li>
<li>[metadata]: ensure metadata boundary is only rendered once on client
nav: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76692">#76692</a></li>
<li>[metadata] clean up redudant options: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76712">#76712</a></li>
<li>Fix uniqueness detection for <code>generateStaticParams</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76713">#76713</a></li>
<li>Upgrade React from <code>22e39ea7-20250225</code> to
<code>d55cc79b-20250228</code>: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76680">#76680</a></li>
<li>[Turbopack] Compute module batches and use them for chunking: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76133">#76133</a></li>
<li>[Dev Tools] Improve keyboard interactions for menu &amp; overlays:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76754">#76754</a></li>
<li>Keep server code out of browser chunks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76660">#76660</a></li>
<li>Turbopack: inline minify into code generation and make it a plain
function instead of a turbo tasks function: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76628">#76628</a></li>
<li>fix edge runtime asset fetch in pages api: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76750">#76750</a></li>
<li>Update use-cache-unknown-cache-kind.test.ts snapshot for alternate
bundler: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76682">#76682</a></li>
</ul>
<h3>Example Changes</h3>
<ul>
<li>docs: fix reading <code>params</code> code blocks: <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76705">#76705</a></li>
</ul>
<h3>Misc Changes</h3>
<ul>
<li>fix(rustdoc): Fix rustdoc warnings, block on rustdoc failures in CI:
<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76448">#76448</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="633878112e"><code>6338781</code></a>
v15.2.1</li>
<li><a
href="197b4bb709"><code>197b4bb</code></a>
v15.2.1-canary.6</li>
<li><a
href="0b699b1c8d"><code>0b699b1</code></a>
v15.2.1-canary.5</li>
<li><a
href="4bf1ee117d"><code>4bf1ee1</code></a>
[repo] upgrade ts <code>5.8.2</code> (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/76709">#76709</a>)</li>
<li><a
href="6f6001a87a"><code>6f6001a</code></a>
v15.2.1-canary.4</li>
<li><a
href="5f1df89fdc"><code>5f1df89</code></a>
v15.2.1-canary.3</li>
<li><a
href="f06a72e11e"><code>f06a72e</code></a>
v15.2.1-canary.2</li>
<li><a
href="2497f81d1b"><code>2497f81</code></a>
v15.2.1-canary.1</li>
<li><a
href="83610c6a84"><code>83610c6</code></a>
v15.2.1-canary.0</li>
<li><a
href="b0416fbb44"><code>b0416fb</code></a>
v15.2.0</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/next.js/commits/v15.2.1/packages/third-parties">compare
view</a></li>
</ul>
</details>
<br />

Updates `@supabase/supabase-js` from 2.48.1 to 2.49.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-js/releases"><code>@​supabase/supabase-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v2.49.1</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.49.0...v2.49.1">2.49.1</a>
(2025-02-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>deps:</strong> upgrade postgrest-js 1.19.2 (<a
href="3f01c3fbc4">3f01c3f</a>)</li>
</ul>
<h2>v2.49.0</h2>
<h1><a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.0">2.49.0</a>
(2025-02-24)</h1>
<h3>Features</h3>
<ul>
<li>bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)
(<a
href="a9ece9a4ae">a9ece9a</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="fceca48c37"><code>fceca48</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1369">#1369</a>
from supabase/avallete/chore-bump-postgrest-js-1-19-2</li>
<li><a
href="a9ece9a4ae"><code>a9ece9a</code></a>
feat: bump <code>@supabase/auth-js</code> to 2.68.0 (<a
href="https://redirect.github.com/supabase/supabase-js/issues/1359">#1359</a>)</li>
<li><a
href="3f01c3fbc4"><code>3f01c3f</code></a>
fix(deps): upgrade postgrest-js 1.19.2</li>
<li>See full diff in <a
href="https://github.com/supabase/supabase-js/compare/v2.48.1...v2.49.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@tanstack/react-table` from 8.20.6 to 8.21.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/TanStack/table/releases"><code>@​tanstack/react-table</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.21.2</h2>
<p>Version 8.21.2 - 2/11/25, 8:59 PM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>arrIncludes autoremove filterFn (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5623">#5623</a>)
(2efaf57) by lukebui</li>
<li>lit-table: spread table options in lit adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5904">#5904</a>)
(36dede1) by <a
href="https://github.com/kadoshms"><code>@​kadoshms</code></a></li>
</ul>
<h3>Docs</h3>
<ul>
<li>row accessor bug in example code block (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5893">#5893</a>)
(b1506a7) by Valerii Petryniak</li>
<li>virtualizer tbody from onchange (827b098) by Kevin Van Cott</li>
<li>exp virtual - remeasure when table state changes (9e6987d) by Kevin
Van Cott</li>
<li>angular: add expanding and sub components examples (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5898">#5898</a>)
(099e1a4) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>example name (57703a4) by Kevin Van Cott</li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/table-core</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/angular-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/qwik-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/solid-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/svelte-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/vue-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
<li><code>@​tanstack/react-table-devtools</code><a
href="https://github.com/8"><code>@​8</code></a>.21.2</li>
</ul>
<h2>v8.21.1</h2>
<p>Version 8.21.1 - 2/3/25, 5:37 AM</p>
<h2>Changes</h2>
<h3>Fix</h3>
<ul>
<li>lit-table: dynamic data updates in the Lit Table Adapter (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5884">#5884</a>)
(9763877) by Luke Schierer</li>
</ul>
<h3>Docs</h3>
<ul>
<li>add experimental virtualization example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5895">#5895</a>)
(8d6e19f) by Kevin Van Cott</li>
<li>angular: add missing faker-js deps (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5883">#5883</a>)
(190c669) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
<li>angular: add editable, row-dnd and performant column resizing
example (<a
href="https://github.com/TanStack/table/tree/HEAD/packages/react-table/issues/5881">#5881</a>)
(0baabdd) by <a
href="https://github.com/riccardoperra"><code>@​riccardoperra</code></a></li>
</ul>
<h2>Packages</h2>
<ul>
<li><code>@​tanstack/lit-table</code><a
href="https://github.com/8"><code>@​8</code></a>.21.1</li>
</ul>
<h2>v8.21.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="db745afdb8"><code>db745af</code></a>
release: v8.21.2</li>
<li>See full diff in <a
href="https://github.com/TanStack/table/commits/v8.21.2/packages/react-table">compare
view</a></li>
</ul>
</details>
<br />

Updates `@xyflow/react` from 12.4.2 to 12.4.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/releases"><code>@​xyflow/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/blob/main/packages/react/CHANGELOG.md"><code>@​xyflow/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>12.4.4</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5052">#5052</a> <a
href="99dd7d3549"><code>99dd7d35</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Show an error if user drags uninitialized node</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5042">#5042</a> <a
href="2fe0e850a8"><code>2fe0e850</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Allow click connections when target sets
<code>isConnectableStart</code></p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5047">#5047</a> <a
href="b3bf5693c6"><code>b3bf5693</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass generics to OnSelectionChangeFunc so that users can type it
correctly</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5053">#5053</a> <a
href="25fb45b5e9"><code>25fb45b5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Remove incorrect deprecation warning</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5033">#5033</a> <a
href="7b4a81fb6b"><code>7b4a81fb</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: use <code>React.JSX</code> type instead of the deprecated global
<code>JSX</code> namespace</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5043">#5043</a> <a
href="0292ad2010"><code>0292ad20</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Use current expandParent value on drag to be able to update it while
dragging</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5032">#5032</a> <a
href="5867bba805"><code>5867bba8</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
lint: remove unnecessary type assertions</p>
</li>
<li>
<p>Updated dependencies [<a
href="99dd7d3549"><code>99dd7d35</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.52</li>
</ul>
</li>
</ul>
<h2>12.4.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5010">#5010</a> <a
href="6c121d427f"><code>6c121d42</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add more TSDocs to components, hooks, utils funcs and types</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="ea54d9bcb1"><code>ea54d9bc</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! - Fix
viewport shifting on node focus</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5013">#5013</a> <a
href="cde899c5be"><code>cde899c5</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Pass <code>NodeType</code> type argument from
<code>ReactFlowProps</code> to <code>connectionLineComponent</code>
property.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5008">#5008</a> <a
href="12d859fe29"><code>12d859fe</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add package.json to exports</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5012">#5012</a> <a
href="4d3f19e88b"><code>4d3f19e8</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Add snapGrid option to screenToFlowPosition and set snapToGrid to
false</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/5003">#5003</a> <a
href="e8e0d68495"><code>e8e0d684</code></a>
Thanks <a
href="https://github.com/dimaMachina"><code>@​dimaMachina</code></a>! -
repair lint command</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4991">#4991</a> <a
href="4c62f19b3a"><code>4c62f19b</code></a>
Thanks <a
href="https://github.com/waynetee"><code>@​waynetee</code></a>! -
Prevent viewport shift after using Tab</p>
</li>
<li>
<p>Updated dependencies [<a
href="6c121d427f"><code>6c121d42</code></a>,
<a
href="4947029cd6"><code>4947029c</code></a>,
<a
href="e8e0d68495"><code>e8e0d684</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.51</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d045503667"><code>d045503</code></a>
chore(packages): bump</li>
<li><a
href="7a00fe3520"><code>7a00fe3</code></a>
chore(getNodeConnections): remove deprecation <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5051">#5051</a></li>
<li><a
href="08b99e8719"><code>08b99e8</code></a>
Merge pull request <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5043">#5043</a>
from xyflow/refactor/dynamic-expand-parent</li>
<li><a
href="8dd2b4f9e2"><code>8dd2b4f</code></a>
chore(updateNodePositions): cleanup</li>
<li><a
href="0b67a6c303"><code>0b67a6c</code></a>
refactor(errors): show error when user drags uninitialized node <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5014">#5014</a></li>
<li><a
href="27df80b6a6"><code>27df80b</code></a>
fix(selection-listener): pass generics</li>
<li><a
href="d094ef0581"><code>d094ef0</code></a>
fix(OnSelectionChangeFunc): pass node and edge type generics <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5023">#5023</a></li>
<li><a
href="3969758af2"><code>3969758</code></a>
refactor(expandParent): use current value on drag <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5039">#5039</a></li>
<li><a
href="43f188d3b1"><code>43f188d</code></a>
fix(click-connections): handle isConnectableStart correctly <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/5041">#5041</a></li>
<li><a
href="68591a8bf1"><code>68591a8</code></a>
Merge branch 'main' into no-deprecated</li>
<li>Additional commits viewable in <a
href="https://github.com/xyflow/xyflow/commits/@xyflow/react@12.4.4/packages/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `framer-motion` from 12.3.1 to 12.4.11
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/motiondivision/motion/blob/main/CHANGELOG.md">framer-motion's
changelog</a>.</em></p>
<blockquote>
<h2>[12.4.11] 2025-03-10</h2>
<h3>Fixed</h3>
<ul>
<li>Preventing flattening of scroll animations when <code>type</code> or
<code>ease</code> are explicitly set.</li>
</ul>
<h2>[12.4.10] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Adding UMD bundles for <code>motion-dom</code> and
<code>motion-utils</code>.</li>
</ul>
<h2>[12.4.9] 2025-03-03</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>Reorder.Item</code> reordering causing
<code>lostpointercapture</code> event to fire.</li>
</ul>
<h2>[12.4.8] 2025-02-26</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed exiting children with <code>layoutDependency</code> not
animating layout changes because of a stale layout dependency.</li>
</ul>
<h2>[12.4.7] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>AnimatePresence</code> not triggering exit animations
when a child with <code>layout</code> or <code>drag</code> is
removed.</li>
</ul>
<h2>[12.4.6] 2025-02-20</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed drag gesture on child elements.</li>
</ul>
<h2>[12.4.5] 2025-02-19</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>onClick</code> handlers not working inside
<code>press</code> events.</li>
</ul>
<h2>[12.4.4] 2025-02-18</h2>
<h3>Fixed</h3>
<ul>
<li>Changed press, drag and pan gestures to use pointer capturing for
better usage within <code>iframe</code> embeds.</li>
</ul>
<h2>[12.4.3] 2025-02-12</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9316ca8202"><code>9316ca8</code></a>
v12.4.11</li>
<li><a
href="c291a09ff2"><code>c291a09</code></a>
Updating changelog</li>
<li><a
href="9e2923c5e4"><code>9e2923c</code></a>
Fix scroll easing (<a
href="https://redirect.github.com/motiondivision/motion/issues/3106">#3106</a>)</li>
<li><a
href="18b71d1395"><code>18b71d1</code></a>
v12.4.10</li>
<li><a
href="e89a0c20c9"><code>e89a0c2</code></a>
Latest</li>
<li><a
href="d84031e1cd"><code>d84031e</code></a>
Latest</li>
<li><a
href="63e7597969"><code>63e7597</code></a>
Updating rollup</li>
<li><a
href="3fcf837c1f"><code>3fcf837</code></a>
v12.4.9</li>
<li><a
href="c58920f6f2"><code>c58920f</code></a>
Updating changelog</li>
<li><a
href="c889431567"><code>c889431</code></a>
Fixing pointer capture and Reorder item (<a
href="https://redirect.github.com/motiondivision/motion/issues/3097">#3097</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/motiondivision/motion/compare/v12.3.1...v12.4.11">compare
view</a></li>
</ul>
</details>
<br />

Updates `lucide-react` from 0.474.0 to 0.479.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/lucide-icons/lucide/releases">lucide-react's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.479.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat(<code>@​lucide/svelte</code>): Lucide svelte 5 package by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2753">lucide-icons/lucide#2753</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0">https://github.com/lucide-icons/lucide/compare/0.478.0...0.479.0</a></p>
<h2>Version 0.478.0</h2>
<h2>What's Changed</h2>
<ul>
<li>ci(pr-comment): Fix icon preview comment on PRs by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2854">lucide-icons/lucide#2854</a></li>
<li>fix(ci): run lint pr title on title change by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2872">lucide-icons/lucide#2872</a></li>
<li>fix(metadata): name change reflected in contributions by <a
href="https://github.com/AnnaSasDev"><code>@​AnnaSasDev</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2866">lucide-icons/lucide#2866</a></li>
<li>fix(icons): changed <code>brackets</code> icon by <a
href="https://github.com/jguddas"><code>@​jguddas</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2863">lucide-icons/lucide#2863</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0">https://github.com/lucide-icons/lucide/compare/0.477.0...0.478.0</a></p>
<h2>New icons 0.477.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>square-round-corner</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2323">#2323</a>)
by <a href="https://github.com/liamb13"><code>@​liamb13</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>circle-slash-2</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2837">#2837</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>Fixes and new icons 0.476.0</h2>
<h2>Fixes</h2>
<ul>
<li>fix(lucide-react): Revert exports property package.json, fixing edge
worker environments. by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2814">lucide-icons/lucide#2814</a></li>
<li>fix(lucide): Lucide create element function returning SVG Element by
<a href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in
<a
href="https://redirect.github.com/lucide-icons/lucide/pull/2816">lucide-icons/lucide#2816</a></li>
</ul>
<h2>New icons 🎨</h2>
<ul>
<li><code>shield-user</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2608">#2608</a>)
by <a
href="https://github.com/sebinemeth"><code>@​sebinemeth</code></a></li>
</ul>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>beef</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2832">#2832</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>New icons 0.475.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>circle-small</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars-stroke</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>mars</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>non-binary</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
<li><code>transgender</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2607">#2607</a>)
by <a
href="https://github.com/jamiemlaw"><code>@​jamiemlaw</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1787b82cfe"><code>1787b82</code></a>
build(deps-dev): bump vite from 5.4.13 to 5.4.14 in /packages/lucide (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2804">#2804</a>)</li>
<li><a
href="b46927e510"><code>b46927e</code></a>
fix(lucide-react): Revert exports property package.json, fixing edge
worker e...</li>
<li><a
href="3ab6c373a0"><code>3ab6c37</code></a>
build(deps-dev): bump vite from 5.4.12 to 5.4.13 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2798">#2798</a>)</li>
<li><a
href="ba2c4b526f"><code>ba2c4b5</code></a>
build(deps-dev): bump vite from 5.1.8 to 5.4.12 (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2786">#2786</a>)</li>
<li><a
href="50630b3aaf"><code>50630b3</code></a>
ci: Improve build speeds (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2778">#2778</a>)</li>
<li>See full diff in <a
href="https://github.com/lucide-icons/lucide/commits/0.479.0/packages/lucide-react">compare
view</a></li>
</ul>
</details>
<br />

Updates `next-themes` from 0.4.4 to 0.4.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pacocoursey/next-themes/releases">next-themes's
releases</a>.</em></p>
<blockquote>
<h2>v0.4.5</h2>
<h2>What's Changed</h2>
<ul>
<li>fix: map theme to class using ValueObject in injected script by <a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li>Reduce number of renders by pre-setting resolvedTheme by <a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
<li>Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
directory by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/331">pacocoursey/next-themes#331</a></li>
<li>Bump the npm_and_yarn group across 1 directory with 7 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/341">pacocoursey/next-themes#341</a></li>
<li>chore: Fix corepack errors in CI by <a
href="https://github.com/pacocoursey"><code>@​pacocoursey</code></a> in
<a
href="https://redirect.github.com/pacocoursey/next-themes/pull/342">pacocoursey/next-themes#342</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/danielgavrilov"><code>@​danielgavrilov</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/330">pacocoursey/next-themes#330</a></li>
<li><a
href="https://github.com/wahba-openai"><code>@​wahba-openai</code></a>
made their first contribution in <a
href="https://redirect.github.com/pacocoursey/next-themes/pull/338">pacocoursey/next-themes#338</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d12996b4e8"><code>d12996b</code></a>
chore: Fix corepack errors in CI (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/342">#342</a>)</li>
<li><a
href="b77db23e9f"><code>b77db23</code></a>
Bump the npm_and_yarn group across 1 directory with 7 updates (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/341">#341</a>)</li>
<li><a
href="d3fa4ee9ad"><code>d3fa4ee</code></a>
Bump next from 14.2.10 to 14.2.15 in the npm_and_yarn group across 1
director...</li>
<li><a
href="ad83567b11"><code>ad83567</code></a>
Reduce number of renders by pre-setting resolvedTheme (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/338">#338</a>)</li>
<li><a
href="1b510445a3"><code>1b51044</code></a>
fix: map theme to class using ValueObject in injected script (<a
href="https://redirect.github.com/pacocoursey/next-themes/issues/330">#330</a>)</li>
<li>See full diff in <a
href="https://github.com/pacocoursey/next-themes/compare/v0.4.4...v0.4.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-day-picker` from 9.5.1 to 9.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gpbl/react-day-picker/releases">react-day-picker's
releases</a>.</em></p>
<blockquote>
<h2>v9.6.1</h2>
<p>This release addresses an accessibility issue, adds a new
<code>animate</code> prop and fixes other minor bugs.</p>
<h3>Possible Breaking Change in Custom Styles</h3>
<p>To address a <a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2630">focus
lost bug</a> affecting navigation buttons, we <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">updated</a>
the buttons to use <code>aria-disabled</code> instead of the
<code>disabled</code> attribute.</p>
<p>This change may cause custom styles for those disabled buttons to
break. To fix it in your code, update the CSS selector to target
<code>[aria-disabled=&quot;true&quot;]</code>:</p>
<pre lang="diff"><code>- .rdp-button_next:disabled,
+ .rdp-button_next[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
- .rdp-button_previous:disabled,
+ .rdp-button_previous[aria-disabled=&quot;true&quot;] {
  /* your custom CSS */
}
</code></pre>
<h3>Animating Month Transitions</h3>
<p>Thanks to the work by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a>, we have
added animations to DayPicker. The new <a
href="http://daypicker.dev/docs/navigation#animate"><code>animate</code>
prop</a> enables CSS transitions for captions and weeks when navigating
between months:</p>
<!-- raw HTML omitted -->
<pre lang="tsx"><code>&lt;DayPicker animate /&gt;
</code></pre>
<p>Customizing the animation style can be challenging due to the HTML
table structure of the grid. We may address this in the future. Please
leave your feedback in <a
href="https://github.com/gpbl/react-day-picker/discussions">DayPicker
Discussions</a>.</p>
<h2>What's Changed</h2>
<ul>
<li>feat: new <code>animate</code> prop by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2684">gpbl/react-day-picker#2684</a></li>
<li>feat(performance): add <code>sideEffects</code> property to
package.json by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2673">gpbl/react-day-picker#2673</a></li>
<li>fix(accessibility): focus lost when navigation button is disabled by
<a href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2685">gpbl/react-day-picker#2685</a></li>
<li>fix: render selected days with <code>selected</code> modifier when
disabled by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2700">gpbl/react-day-picker#2700</a></li>
<li>fix(build): remove extra files from package.json by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2692">gpbl/react-day-picker#2692</a></li>
<li>chore(types): fix deprecation of select event handler types by <a
href="https://github.com/timothyis"><code>@​timothyis</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<h3>v9.6.1</h3>
<ul>
<li>fix(build): add missing .css entries in package.json files by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2703">gpbl/react-day-picker#2703</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/timothyis"><code>@​timothyis</code></a>
made their first contribution in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2680">gpbl/react-day-picker#2680</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1</a></p>
<h2>v9.6.0</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c37983b8e5"><code>c37983b</code></a>
build: bump v9.6.1</li>
<li><a
href="3d382fe18d"><code>3d382fe</code></a>
build: add missing .css entries in package.json files (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2703">#2703</a>)</li>
<li><a
href="ca71182076"><code>ca71182</code></a>
build: bump v9.6.0</li>
<li><a
href="37f759a718"><code>37f759a</code></a>
chore: animate prop, remove <a
href="https://github.com/experimental"><code>@​experimental</code></a>
tag</li>
<li><a
href="9aa3d35062"><code>9aa3d35</code></a>
docs: update for new <code>animate</code> prop (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2694">#2694</a>)</li>
<li><a
href="d7d0a8ad13"><code>d7d0a8a</code></a>
fix: render selected days with selected modifier when disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2700">#2700</a>)</li>
<li><a
href="48f00dc20f"><code>48f00dc</code></a>
fix: focus lost when navigation button is disabled (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2685">#2685</a>)</li>
<li><a
href="6617c9bf81"><code>6617c9b</code></a>
chore: update keyframes names (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2695">#2695</a>)</li>
<li><a
href="13e0a4acc9"><code>13e0a4a</code></a>
test: fix test related to first of month (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2693">#2693</a>)</li>
<li><a
href="ebde52dd02"><code>ebde52d</code></a>
docs: fix no-wrap-table style for paragraphs</li>
<li>Additional commits viewable in <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.1...v9.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-icons` from 5.4.0 to 5.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/react-icons/react-icons/releases">react-icons's
releases</a>.</em></p>
<blockquote>
<h2>v5.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>[React 19] Update IconType type to return React.ReactNode by <a
href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
<li>Bump vite from 5.2.10 to 5.4.11 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/996">react-icons/react-icons#996</a></li>
<li>Bump nanoid from 3.3.7 to 3.3.8 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1005">react-icons/react-icons#1005</a></li>
<li>Bump vite from 5.4.11 to 5.4.14 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1021">react-icons/react-icons#1021</a></li>
<li>Bump esbuild from 0.20.2 to 0.25.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a> in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1027">react-icons/react-icons#1027</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/diaz-hfc"><code>@​diaz-hfc</code></a>
made their first contribution in <a
href="https://redirect.github.com/react-icons/react-icons/pull/1004">react-icons/react-icons#1004</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0">https://github.com/react-icons/react-icons/compare/v5.4.0...v5.5.0</a></p>
<table>
<thead>
<tr>
<th>Icon Library</th>
<th>License</th>
<th>Version</th>
<th align="right">Count</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://circumicons.com/">Circum Icons</a></td>
<td><a
href="https://github.com/Klarr-Agency/Circum-Icons/blob/main/LICENSE">MPL-2.0
license</a></td>
<td>1.0.0</td>
<td align="right">288</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 5</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>5.15.4-3-gafecf2a</td>
<td align="right">1612</td>
</tr>
<tr>
<td><a href="https://fontawesome.com/">Font Awesome 6</a></td>
<td><a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0
License</a></td>
<td>6.6.0</td>
<td align="right">2050</td...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-12 14:33:06 +00:00
Bently
c1e329497c fix(otto): prevent breaking when failing to make api call (#9613)
These are some tweaks for Otto to try prevent the frontend from breaking
when/if it fails to make the otto api call.

### Changes 🏗️
Removed unused reference to ``OTTO_API_URL`` in
[backend/server/v2/otto/routes.py](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-6545b2ed01d619cc095b8d0ca6d5baa86d1448dc970cff508669ec3430675d28)
Removed un-needed ``revalidatePath("/build");`` from
[frontend/src/app/build/actions.ts](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-6861f6b90ce91138b3821c0a82abfffbc09f425c26b7335fac60f54894e353e9)
Added a 60 second timeout to the api call in
[backend/server/v2/otto/service.py](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-63c9a1a5337cd5e4ddec7544a258916d4998a6cb5c4181f621d7e24f654bd5c8)
Added a better error handler in
[frontend/src/components/OttoChatWidget.tsx](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-7351568d5c588b77f35d80994ca6800a7faa1b3b0ca229970cfa491eab4b4b33)
Made it so errors return a structured error response for better handling
in
[frontend/src/app/build/actions.ts](https://github.com/Significant-Gravitas/AutoGPT/compare/dev...otto-fixes?expand=1#diff-6861f6b90ce91138b3821c0a82abfffbc09f425c26b7335fac60f54894e353e9)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] do not set the ENV var for ``otto_api_url`` 
- [x] Set the ENV var for ``NEXT_PUBLIC_BEHAVE_AS`` to ``CLOUD`` to have
the chat ui show in the build page
- [x] Send otto a message from the build page frontend, it should fail
and not break the frontend
- [x] Send otto a message that contains graph data to see if the sending
graph data works, this should also fail and not break the frontend
  - [x] now we set the ENV for ``otto_api_url``
  - [x] Send otto a message from the build page frontend, it should work
- [x] Send otto a message that contains graph data to see if the sending
graph data works, it should work
2025-03-12 07:36:55 +00:00
Zamil Majdy
c179a49218 fix(platform): Make LibraryAgent image as initial StoreListing image - Followup (#9617)
### Changes 🏗️

This is a follow-up of
https://github.com/Significant-Gravitas/AutoGPT/pull/9610
* Addressing the PR comments described in the mentioned PR
* Removed debug logging
* Fix image state loading logic on agent upload process

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Create an library agent and try to create a store listing.

<img width="1409" alt="image"
src="https://github.com/user-attachments/assets/dc86dc97-a33f-4336-ab90-19a53c6f7e0f"
/>
2025-03-12 13:12:09 +07:00
Nicholas Tindle
942ac0bae4 feat(backend): baseline summary processing (#9596)
<!-- Clearly explain the need for these changes: -->
We want to be able to process emails on a scheduled basis for summaries.
This adds the baselines for that

### Changes 🏗️
- Adds new tooling to Scheduluer to handle the in-memory schedule for
the weekly processing
- Adds new exposes to notification manager to handle the different data
models for scheduled emails
- adds new models to the notification data models to handle the
different requirements for scheduled emails, closely paralleling the
existing notification ones
- Adds new email template

Note: After testing, email sending was disabled until the template and
data filling are done later down the line. We don't want to email people
random stuff, ya know?

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test sending an email on the scheduled basis 
- [x] Make sure you get the email, ignoring the fact that all the data
isn't real inside it

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-12 05:19:23 +00:00
Zamil Majdy
af65058bb7 fix(platform): Make LibraryAgent image as initial StoreListing image (#9610)
### Changes 🏗️

We've been auto-generating the thumbnail image for the agent in the
library, this PR is propagating that image as an initial image for the
store listing. This PR also removes the fetch all query for getting the
count for paginating library agent.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Create an library agent and try to create a store listing.

<img width="1409" alt="image"
src="https://github.com/user-attachments/assets/dc86dc97-a33f-4336-ab90-19a53c6f7e0f"
/>
2025-03-12 05:17:38 +00:00
Zamil Majdy
f37d4c2659 fix(platform): Set Supabase CLI version (#9619)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-12 04:28:44 +00:00
Zamil Majdy
f9d88d2981 fix(backend): Remove useless agent marketplace indices (#9608)
### Changes 🏗️

Removed some indices in the marketplace table that were useless.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-11 09:59:46 +00:00
Zamil Majdy
3458b94fcc fix(backend): Fix failing websocket service due to not requiring DB connection 2025-03-11 15:34:53 +07:00
Nicholas Tindle
08cd935a47 feat(backend): batching operations for queues + agent run become batched (#9586)
<!-- Clearly explain the need for these changes: -->
We don't want to spam the user with similar notification types so we
want to group them up over a timespan and handle that as a group of
notifications.
### Changes 🏗️
- Adds a batch queue
- Moves the ExecutionScheduleur to a generic Scheduler
- Makes the Agent run a batch operation
- Fixes various bugs in how we originally made the batch db models and
queries
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Run 10 agents back to back
  - [x] Notice how many emails you get
- [x] Wait a bit and you should after an hour (change the cron rule to
speed up testing this) you'll get an email and see all the batches in
your db are empty

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-10 18:10:57 +00:00
Nicholas Tindle
b2e94611e8 feat(backend): be more defensive about how we load list data from db (#9592)
<!-- Clearly explain the need for these changes: -->
When swapping branches back and forth, I often hit stuff in my db that
is incompatible with other branches. This protects against it a bit
more.

### Changes 🏗️
- Adds filtering around converting data out of the db
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test with weird and broken agents in db
  - [x] Go to the library page 
- [x] Notice in the server console that it warns of bad agents and the
page still loads
2025-03-10 17:07:30 +00:00
Zamil Majdy
020bf02e48 feat(backend): Reduce excessive application log, Make DB configurable, Set DB connection limit & timeout (#9605)
It's hard to configure the DB parameter at the moment, this PR gives an
option to provide URL parameter on the Prisma DATABASE_URL.

### Changes 🏗️

Changes:
* Reduce excessive application log
* Make DB configurable
* Set DB connection limit & timeout

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
2025-03-10 05:30:13 +00:00
Zamil Majdy
aa6f91039c feat(block): Allow undefined self-loop link to list input pin on AddToListBlock (#9599)
### Changes 🏗️

Creating a self-loop of the AddToListBlock requires a boilerplate of
adding a dummy block to trigger its execution.


![image](https://github.com/user-attachments/assets/329dd1f4-5b3b-4d34-8743-25bd4337d734)

If the only inbound link on an input pin comes from the same block, we
don't wait for that pin on the first execution (as it's never going to
come).


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-07 22:06:26 +00:00
MK4070
fa97632eae docs(online/offline): #8887 Move to a single source of truth for docs — Remove duplicate info from backend readme[.advanced].md (#9580)
addresses the changes requested here [Move to a single source of truth
for docs — Remove duplicate info from readme
#8887](https://github.com/Significant-Gravitas/AutoGPT/issues/8887)

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
changed readme files
2025-03-07 21:01:32 +00:00
Toran Bruce Richards
fe927c8345 fix(block): Add missing error pin to Exa Contents Block (#9604)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

The Exa Block has a missing error pin which prevents error handling,
this adds that.
2025-03-07 19:41:15 +00:00
Nicholas Tindle
fdd6a5d847 feat(backend): one click unsub for emails (#9564)
<!-- Clearly explain the need for these changes: -->
Per chat with toran, we want one click unsubscribe to work in things
like gmail to reduce spam. This implements the one click unsubscribe
feature, but it is difficult to test due to not being able to control
when it is shown.

### Changes 🏗️
- Adds one click unsub
- Casually fix google reauth by checking the correct variables (approved
to be in pr by Toran)
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Send an email
  - [x] Open headers on email and pull the link out
- [x] `curl -X POST <link>` and ensure unsubscribed from all messages.
Note that we can't control when the box is shown on various providers so
we just verify it works on our side for now by checking the headers


#### Configuration changes
Infra pr coming separately, but we did add the secret default to the
.env.example and the docker compose

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-07 13:57:47 +00:00
Zamil Majdy
f60bd07e15 fix(blocks): Fix Invalid input on SmartDecisionMakerBlock, add enchancement CountdownTimerBlock & 2025-03-07 16:55:00 +07:00
Reinier van der Leer
9210d448ee fix(backend): Unbreak add_store_agent_to_library 2025-03-06 22:40:24 +01:00
Bently
a0ecb96958 Feat(Otto) Add Initial Otto Chat Bot code (#9266)
### Changes 🏗️
This is to add the Otto chat bot to the frontend UI.

The changes i have made for this goes as follows:
- I have made and added a basic chat UI widget to the build page, this
will become the main UI for Otto, this will be getting updates in the
future.
- I have made an API route ``/api/otto/ask`` that will receive the
message from the frontend and pass it to the Otto API that we have setup
on GCP.

I already have plans for how we can improve the UI and make it more
modular, this way we can add more features to Otto down the line!

### Config Changes
When we merge this, we will need to add the ENV var for ``otto_api_url``
that will be the URL from GCP where the API is being hosted!

This is now ready for a review as the backend API is up and running, to
who ever does test this, if you want the API url please DM me 😄


![image](https://github.com/user-attachments/assets/230a7487-d88f-4a6b-9ff9-e1e0aac8c385)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Set the ENV var for ``otto_api_url`` - ask @Bentlybro for this
  - [x] Set the ENV var for  ``NEXT_PUBLIC_BEHAVE_AS`` to ``CLOUD``
  - [x] Send otto a message from the build page frontend 
- [x] Send otto a message that contains graph data to see if the sending
graph data works
2025-03-06 17:51:07 +00:00
Reinier van der Leer
7eb04663ed fix(frontend/library): Use correct graph version to render I/O (#9591)
- Fixes #9579

### Changes 🏗️

- Fetch & use specific graph version to render graph run I/O on
`/library/agents/[id]`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Run an Agent that yields an output
    - [x] -> should render normally without errors
  - Rename the Agent Output name
  - Save the modified Agent
- Open the Agent in the Agent library and attempt to view the output
from step 1
    - [x] -> should render normally without errors

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-06 17:10:52 +00:00
Nicholas Tindle
da2aa34e3e docs(security): Update disclosure timeline (#9581)
<!-- Clearly explain the need for these changes: -->
Update the security.md based on some advice we got :)

### Changes 🏗️
- Adds an update time window and clarifies time spans
<!-- Concisely describe all of the changes made in this pull request:
-->
2025-03-06 15:59:07 +00:00
Toran Bruce Richards
bc71eac0ec Change agent cover Image gen aspect ratio to 16:9 2025-03-06 14:35:25 +00:00
Krzysztof Czerwinski
3cf198eea1 feat(platform): Onboarding flow backend (#9511)
This PR adds backend to make Onboarding UI added in
https://github.com/Significant-Gravitas/AutoGPT/pull/9485 functional and
adds missing confetti screen at the end of Onboarding.

*Make sure to have at least any 2 agents in store when testing locally.*
Otherwise the onboarding will finish without showing agents.
Visit `/onboarding/reset` to reset onboarding state, otherwise it'll
always redirect to `/library` once finished.

### Changes 🏗️

- Onboarding opens automatically on sign up and login (if unfinished)
for all users
- Update db schema to add `UserOnboarding` and add migration
- Add GET and PATCH `/onboarding` endpoints and logic to retrieve and
update data Onboarding for a user
- Update `POST /library/agents` endpoint
(`addMarketplaceAgentToLibrary`), so it includes input and output nodes;
these are needed to know input schema for the Onboarding
- Use new endpoints during onboarding to fetch and update data
- Use agents from the marketplace and their input schema for the
onboarding
- Add algorithm to choose store agents based on user answers and related
endpoint `GET /onboarding/agents`
- Redirect outside onboarding if finished and resume on proper page
- Add `canvas-confetti` and `@types/canvas-confetti` frontend packages
- Add and show congrats confetti screen when user runs and agent and
before opening library
- Minor design updates and onboarding fixes

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Redirect to `/onboarding/*` on sign up and sign in (if onboarding
unfinished)
  - [x] Onboarding works and can be finished
  - [x] Agent runs on finish
- [x] Onboarding state is saved and logging out or refreshing page
restores correct state (user choices)
- [x] When onboarding finished, trying to go into `/onboarding`
redirects to `/library`

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-06 12:19:33 +00:00
Zamil Majdy
e5eadeace4 feat(backend): Improve SmartDecisionMaker Agent-loop capability & add Anthropics support (#9585)
### Changes 🏗️

There are a few agent-loop issues that this PR is addressing:
* There is a lack of support for agent-loop in Anthropic.
* Duplicated system & user prompt as the main objective prompt in the
agent loop.
* A long rendered text of conversation history by
SmartDecisionMakerBlock agent-loop in the UI.
* A lack of execution input being rendered in the execution list making
it harder to debug.



https://github.com/user-attachments/assets/be430000-bde0-40c6-8f2e-c97ce45b5ed1


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Create from scratch and execute an agent with at least 3 blocks
using SmartDecisionMaker Block.
2025-03-06 12:07:41 +00:00
Reinier van der Leer
231775f4d4 fix(backend): Unbreak add_marketplace_agent_to_library (#9578)
- Fixes #9577

### Changes 🏗️

- Add the required include statements to `LibraryAgent` queries
- Make a `library_agent_include(user_id)` utility in
`backend.data.includes`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  - Go to an agent in the Marketplace; click "Add To Library"
    - [ ] -> should work, not return an error
- [ ] -> should redirect to `/library/agents/[id]` -> should load
normally
2025-03-06 10:53:28 +00:00
Nicholas Tindle
498b3ea882 feat(blocks): add list comments and update comment blocks (#9583)
<!-- Clearly explain the need for these changes: -->
As part of the code review agent, I found these blocks would be useful,
but not required. Adds the ability to list comments on an issue and PR
as well as update comments on an issue, pr and discussion


### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds Listing comments block
- Adds updating comment block

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Tested all of the new blocks on #9582 . Review it for context

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Bentlybro <tomnoon9@gmail.com>
2025-03-06 07:51:27 +00:00
Nicholas Tindle
5b8947ed93 fix(backend): serialize the pydantic objects correctly for github checks and statuses (#9582)
<!-- Clearly explain the need for these changes: -->
Trying to run the GitHub Status blocks results in a serialization error

### Changes 🏗️
- Serializes the checks and blocks data objects correctly
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] make a one block agent, test it and make sure it works
2025-03-05 22:04:28 +00:00
Reinier van der Leer
3b53c6953a feat(platform): Agent Run "Stop" + "Delete" functionality (#9547)
- Resolves #9542

### Changes 🏗️

- feat(platform): Add "Delete run" button on `/library/agents/[id]` w/
confirm dialog
  - Add `AgentGraphExecution.isDeleted` column for soft delete
  - Add `DELETE /api/executions/{graph_exec_id}` endpoint
- feat(frontend): Add "Stop run" button on `/library/agents/[id]`

Technical improvements:
- refactor(frontend): Generalize `AgentDeleteConfirmDialog` ->
`DeleteConfirmDialog`
- refactor(frontend): Brand `GraphExecution.execution_id` and
`Schedule.id` to prevent mixing

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Click "Delete run" under "Run actions" in the right sidebar
    - [x] -> Confirmation dialog should show
      - Click "Delete"
        - [x] -> run should disappear from list
        - [x] -> view should switch to "Draft new run" view
        - [x] -> refresh page -> run should not be in list
  - Click "Delete" in the menu on a run in the list
    - [x] -> Confirmation dialog should show
      - Click "Delete"
        - [x] -> run should disappear from list
        - [x] -> refresh page -> run should not be in list

---------

Co-authored-by: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com>
2025-03-05 16:14:59 +00:00
Reinier van der Leer
37331d09e4 Revert "fix(frontend): Consolidate Application Buttons to ShadcN Base Button Component" (#9575)
Reverts Significant-Gravitas/AutoGPT#9570

Some of the styling changes cause issues with existing parts of the
application, and I don't know if partially reverting would cause issues
with the other refactored components/elements.

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-05 15:42:26 +00:00
Reinier van der Leer
595d2020c9 feat(frontend): Loading indicator for button click handlers (#9573)
Show that something is happening when a click handler doesn't return
immediately.

### Changes 🏗️

- Show a loading indicator on buttons while their click handler is
running


https://github.com/user-attachments/assets/5878c5a4-cba2-4125-a101-21220d713232

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to `/library/agents/[id]`; click "Run again" on an existing run
    - [x] -> loading indicator should show
    - [x] -> button state should reset once the API request completes
- [x] Check that existing `Button` elements aren't adversely affected by
the styling changes, especially `overflow-hidden`
2025-03-05 14:56:52 +00:00
Zamil Majdy
c091a7be62 feat(backend): Integrate Ideogram for auto-generating created agent thumbnail (#9568)
### Changes 🏗️

Integrate Ideogram for auto-generating created agent thumbnail

![preview of the UI with a generated
image](https://github.com/user-attachments/assets/87fb4179-59e0-4109-b5aa-d45ebe9decf7)

**Note:** switching back to the "old" Replicate-based image generator is
possible by setting `USE_AGENT_IMAGE_GENERATION_V2=false`.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-03-05 14:41:42 +00:00
Bently
b50ecbf7e9 fix(frontend): Featured agents cards layout+sizing (#9482)
### Changes 🏗️

right now the featured agents cards dont have a set width/height, so
they change depending on the content, and the description is duplicated.
also, the "by {creator username}" was removed. currently it looks like
this:


![chrome_SBwRrkEN28](https://github.com/user-attachments/assets/1bff2206-ec80-46ee-8b84-e510de04b869)

with my changes, i set a fixed width and height so they dont change, the
description now only shows on hover and is truncated to 11 lines, and i
added back the "by {creator username}"


![chrome_qujRVF4LsX](https://github.com/user-attachments/assets/927629db-1bdd-426c-8d6d-d39a67152389)

---------

Co-authored-by: Andy Hooker <58448663+andrewhooker2@users.noreply.github.com>
2025-03-05 14:12:28 +00:00
Zamil Majdy
900a661266 fix(backend): Filter out empty object from conversation_history pin on SmartDecisionMakerBlock 2025-03-05 21:23:31 +07:00
Zamil Majdy
55d6495155 fix(backend): Increase logging level threshold of RPC service to WARNING (#9576)
Increase the logging threshold to WARNING to avoid chatty RPC service
request logs.

Before:
![RPC calls show up in backend
log](https://github.com/user-attachments/assets/70791f87-12ef-4a12-8343-4b8641302faa)
2025-03-05 12:35:43 +00:00
Andy Hooker
b5c100748f fix(library): Anchor message to bottom of page (#9572)
This PR fixes the layout of the Library page. It properly anchors the
'old experience' message to the bottom of the viewport and improves the
overall page structure using semantic HTML and Tailwind best practices.

Resolves: #9524 

### Changes 🏗️
- Restructured the LibraryPage component to use proper semantic HTML
with a `<main>` element
- Added a fixed Alert component at the bottom of the viewport with 8px
margin
- Used ShadcN Alert component for the 'old experience' message for UI
consistency
- Implemented responsive behavior to hide the alert on mobile screens
- Optimized Tailwind classes by using the `container` utility and
removing redundant styles
- Improved accessibility and UX by using appropriate semantic elements

### Screenshot
<img width="926" alt="image"
src="https://github.com/user-attachments/assets/e393007c-639e-4383-922c-41fa67133da8"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

<details>
  <summary>Alert Message at Bottom of Library Page</summary>

- [ ] Visit the Library page and verify the alert appears fixed at the
bottom with 8px margin
- [ ] Resize browser window to various desktop sizes and confirm alert
remains centered
- [ ] Scroll through Library page content and verify the alert stays
fixed at the bottom
- [ ] Open developer tools and toggle to mobile view (width < 640px) to
confirm alert is hidden
- [ ] Test in both light and dark mode to ensure alert styling is
consistent with theme
- [ ] Click the "here" link in the alert and verify it navigates to the
monitoring page
- [ ] Verify that QuestionMarkCircled icon in the alert is properly
styled and visible

</details>

---------

Co-authored-by: Bentlybro <tomnoon9@gmail.com>
2025-03-05 10:11:21 +00:00
Libin Rahman
09494809c1 Enhance process management with error handling and lifecycle improvements (#9565)
Enhance process management with error handling, lifecycle improvements,
and better resource management

- Added robust error handling for process startup failures.
- Implemented proper cleanup of processes during failure scenarios.
- Added detailed error logging for process failures and cleanup
operations.
- Enhanced process lifecycle with health checks.
- Added success logging for process terminations.


These updates enhance the reliability and maintainability of the system.

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-05 07:44:42 +00:00
Andy Hooker
122be761b6 fix(frontend): Consolidate Application Buttons to ShadcN Base Button Component (#9570)
Our application currently uses multiple inconsistent button
implementations across the codebase.
This PR standardizes buttons to use our base Button component that
leverages ShadcN, improving UI consistency, maintainability, and
accessibility.

Resolves: #9567 

### Changes 🏗️

- Replaced custom button implementations in various components with our
base Button component and greatly reduced redundant overlapping styles.
- Paired with our designer to streamline our `globals.css` to match the
desired approach.
- Added button variant documentation in Storybook
- Deprecated the obsolete 'primary' class  and marked it.

### Screenshots 📷

#### Variants  
<img width="466" alt="image"
src="https://github.com/user-attachments/assets/9e4f6360-57ec-4f28-b702-e57252d67def"
/>

<img width="418" alt="image"
src="https://github.com/user-attachments/assets/a9af17dc-e8bc-429d-a9ac-8380e34b9089"
/>

<img width="129" alt="image"
src="https://github.com/user-attachments/assets/2df5d184-bb49-4640-bfb4-879360ca35e6"
/>

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

<details>
  <summary>Button Consolidation Test Plan</summary>
 Visual Verification

- [ ] Verify all button variants (default, destructive, outline,
secondary, ghost, link) render correctly
- [ ] Confirm button styling is consistent across all themes (light,
dark, etc.)
- [ ] Validate that the rounded-full style is applied to appropriate
variants

 Functional Testing

- [ ]  Test click handlers continue to work on all migrated buttons
- [ ] Verify hover, focus, and active states display correctly on all
buttons
- [ ]  Confirm disabled states are working properly
- [ ]  Test loading state animations and behavior

 Responsive Testing

- [ ]  Verify button layouts on mobile devices (< 640px)
- [ ]  Confirm button layouts on tablet devices (640px - 1024px)
- [ ]  Test button layouts on desktop screens (> 1024px)
</details>

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-03-05 07:01:11 +00:00
Zamil Majdy
3adc9724fe fix(backend): Error out execution when no starting node is available (#9566)
### Changes 🏗️

Prevent a graph being executed and do nothing by erroring out when no
starting node is available.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-05 06:58:57 +00:00
Zamil Majdy
e7888ddb9f feat(backend): Enable safe URL redirect on web requests for blocks (#9555)
We've disabled the request for security reasons, and the current request
library breaks on the 301 web response.

### Changes 🏗️

Add manually safe URL redirect on our web request layer.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-05 05:19:29 +00:00
Nicholas Tindle
265a9265f7 feat(backend): low balance notiifcation (#9534)
<!-- Clearly explain the need for these changes: -->
For emailing, we want the user to know when an agent stopped because
their balance was too low. This is the first step of that.

### Changes 🏗️
- Raise InsufficientBalanceError from credit system rather than value
error when user runs out of money
- Handle when an agent output isn't hooked up well
- Fix the contents of the email for low balance to be a bit more aligned
with the PRD
- expose the topup intent from the db manager
- objectify the execution stats so we can pass it around a bit more type
safe
- extract the notification stuff in manager into a function
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Set balance to $0.01
  - [x] Run an agent that costs something more than $0.01
  - [x] Check you get an email
  - [x] Check your top up link works

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-03-05 05:16:57 +00:00
Reinier van der Leer
27a5635607 feat(platform): Library Agent "Delete" functionality (#9546)
- Resolves #9545

### Changes 🏗️

- fix(platform): Make "Delete" button on `/monitoring` soft-delete the
`LibraryAgent` instead of hard-deleting the corresponding `AgentGraph`
- feat(frontend): Add "Delete agent" button on `/library/agents/[id]`

Technical:
- fix(backend): Accept partial input on `update_library_agent` endpoint
- feat(backend): Add `GET /api/library/agents/{library_agent_id}`
endpoint
- refactor(frontend): Replace use of `GraphMeta` by `LibraryAgent` where
possible on `/library/agents/[id]`

Also, out of scope but important:
- fix(frontend): Hide buttons that require direct graph access depending
on `agent.can_access_graph`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Go to the Library and select an agent
    - [x] -> `/library/agents/[id]` should load normally
      - Save this URL for later (especially the ID)!
  - Click "Delete agent" on `/library/agents/[id]`
    - [x] -> should show a confirmation dialog
    - Click "Delete" to confirm
      - [x] -> should redirect back to `/library`
      - [x] -> deleted agent should no longer be listed in the Library
  - Click "Delete agent" on `/monitoring`
    - [x] -> should show a confirmation dialog
    - Click "Delete" to confirm
      - [x] -> agent should disappear from agent list
- [x] -> views should reset / deselect the deleted agent where
applicable
2025-03-03 16:49:44 +00:00
Zamil Majdy
ef00ab51e0 fix(backend): Cleanup on validation logic for AgentExecutorBlock & SmartDecisionMakerBlock 2025-03-02 18:17:01 +07:00
Zamil Majdy
36447a0c58 feat(backend): Add tool execution response on Smart Decision Block (#9552)
**Proposal / Request For Comments** 

The tool calling provided by the LLM provider requires an output
generated by the tool to be looped back as part of the conversation
history. The scope of this PR is trying to address the need to fulfill
the feature expectation.

### Changes 🏗️

* `Last Tool Output` is introduced to loop back the output of the tool
back to Smart Decision Block.
* Smart Decision Block execution will be pending unless the `Last Tool
Output` us provided where a pending tool call is present in the
conversation history.
* **Known hack**: The last tool output will prefill all the pending tool
calls from the conversation history.
* A few tweaks were required to allow a blocking loop to be executed
without awaiting on all the inbound links.

<img width="1395" alt="image"
src="https://github.com/user-attachments/assets/fdad4407-621b-45d0-a457-76b2d4c853b9"
/>


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-02 10:46:41 +00:00
Zamil Majdy
1e31136358 fix(backend): Fix json to_dict method on string value 2025-03-02 09:33:16 +07:00
Zamil Majdy
a024b9a398 fix(backend): Fix conversation history propagation on SmartDecisionBlock & AIBlock 2025-03-02 05:49:40 +07:00
Zamil Majdy
83d879ea65 fix(backend): Use raw content from the LLM as conversation history (#9551)
### Changes 🏗️

Instead of parsing an LlmMessage by ourselves, we use raw content from
the LLM as conversation history and accept any format it introduces.

Example output:
```
[
  {
    "role": "system",
    "content": "Thinking carefully step by step decide which function to call. Always choose a function call from the list of function signatures. The test graph is basically an all knowing answer machine you can use it to get an answer"
  },
  {
    "role": "user",
    "content": "Hey how's the weather today"
  },
  {
    "role": "assistant",
    "audio": null,
    "content": null,
    "refusal": null,
    "tool_calls": [
      {
        "id": "call_Z7CKKIkldylmfWJdE6ZnDxjr",
        "type": "function",
        "function": {
          "name": "storevalueblock",
          "arguments": "{\"input\":\"I don't have context for your location. Could you provide one?\"}"
        }
      }
    ],
    "function_call": null
  }
]
```

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-01 20:41:38 +00:00
Zamil Majdy
d3b83b79f9 fix(backend): Append prompt into the conversations output & Remove unused output pin on SmartDecisionBlock (#9550)
### Changes 🏗️

Append prompt into the conversations output & Remove unused output pin
on SmartDecisionBlock.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-03-01 13:52:20 +00:00
Zamil Majdy
91b1cc90aa fix(backend): Fix failure of get_graph_metadata call on SmartDecisionMaker.py 2025-03-01 19:12:34 +07:00
Zamil Majdy
7747ad8f4c feat(backend): Add conversation history as Smart Decision Block output (#9540)
Now that the MVP for Smar Decision Block is available, we need to add
this info in the block output:

Messages (list) - The messages list sent to the LLM plus its generated
response as the latest assistant entry. This is a single list of
dictionaries in standard LLM API format).

### Changes 🏗️

* Add `conversations` output pin that populates the update
`conversation_history` input pin with the assistant response.
* Refactored `Smart Decision Block` to avoid downloading the whole graph
on each execution, remove code duplication, declutter data fetching.
* Minor UI issue on the smart decision block entry in the search bar. 

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

Co-authored-by: Swifty <craigswift13@gmail.com>
2025-02-28 15:03:34 +00:00
Reinier van der Leer
f6c93eeeff feat(platform): Cost indication for agent runs (#9527)
- Resolves #9181

### Changes 🏗️

- Add agent run cost indication to `/monitoring` and
`/library/agents/[id]`

Backend:
- Add `GraphExecutionMeta.cost` property - value sourced from
`AgentGraphExecution.stats["cost"]`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  - Run an agent
- [ ] Check out the agent run on `/library/agents/[id]` -> should show
cost
  - [ ] Check out the agent run on `/monitoring` -> should show cost
2025-02-28 14:20:46 +00:00
Zamil Majdy
52ee7d150e fix(frontend): Remove unused Stripe on frontend (#9536)
### Changes 🏗️

Remove Stripe on frontend.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-27 11:13:53 +00:00
Zamil Majdy
c1b12d4a12 feat(backend): Add cost on node & graph execution stats (#9520)
<!-- Clearly explain the need for these changes: -->
We want the agent run data to be accurate, which means we need to
collect it in the right place and with the correct data

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Updates email templates
- Updates how we collect the data for the agent run event

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Run agents and read the email we get

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-27 09:39:06 +00:00
Nicholas Tindle
d7cdf751a8 fix(backend): allow more than one arg on the tuple (#9535)
<!-- Clearly explain the need for these changes: -->
We allow tuples to be returned from exceptions, but pydantic restricts
their size to 1 b/c the typehint. This fixes that

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds `, ...` to the tuple type hint

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Extracted from other pr where it was tested as part of an
exception
2025-02-27 09:18:14 +00:00
Zamil Majdy
58f6491496 feat(backend): Propagate error arguments on RPC exceptions (#9533)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

Exception can contain more than message, so we propagate the whole args
as long as it is serializable.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-27 06:58:25 +00:00
Swifty
1011b70d41 fix(platform): Add Block Costs for SDM Block (#9531)
The Smart Decision Maker block needs to have costs associated with it.

### Changes 🏗️

- Added config for SDM Block Costs
2025-02-26 22:07:32 +00:00
Zamil Majdy
538ad06547 fix(backend): Fix exception response on RPC error & Missing Graph Running Status (#9529)
HttpResponse error introduced by RPC is buggy since we are returning the
exception as is instead of the string version of it.
Also `RUNNING` status on the graph execution is missing.

### Changes 🏗️

* Refactored & fixed the exception return handling on RPC failure.
* Add `RUNNING` status update during the graph execution.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-26 20:23:33 +00:00
Reinier van der Leer
5f5d30a17a fix(backend): Use Pyro for RPC by default (#9528)
- Follow-up to #9508 

HTTP-based RPC has not been fully tested and should be disabled by
default.

### Changes 🏗️

- Disable HTTP-based RPC and use Pyro by default
2025-02-26 14:26:09 +00:00
Nicholas Tindle
af8ea93260 feat(backend): handle bounced emails from postmark (#9506)
<!-- Clearly explain the need for these changes: -->
If we bounce too many emails from Postmark, they will be really upset
with us, which is not so good. We need a way to react when we bounce
emails, so we set it up so they notify us via webhooks.

We also need to build authentication into those webhooks to prevent
random people from sending us fake webhooks.

All this together means we need a new route for the inbound webhook.

To do this, we need a way to track if the email address is valid. So,
after chatting with @itsababseh, we are adding a validated email field
that defaults to `True` because all the users are already validated in
prod. In dev, we may suffer.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds special API Key auth handler to the libs so that we can easily
test stuff on the /docs endpoint and re-use it if needed
- Adds New Secret for this API key from postmark
- Adds a validatedEmail boolean to the`User` table
- Adds a postmark endpoint to the routers list for handling the inbound
webhook from Postmark
- "Handle" all the various things this endpoint could send us (most of
them we do nothing about)

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Sign up with john@example.com email (the one postmark uses in
webhooks)
  - [x] Set email validation to true
  - [x] Send the bounce webhook notice
  - [x] Check it gets set to false

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)
2025-02-25 20:59:41 +00:00
Swifty
108b0aaa4c feat(blocks): Enabled block Usage for Smart Decision Maker Block (#9514)
Originally we did not allow Blocks to be used as tools due to the
limitations of communicating the correct tool function signatures.

It has however, been decided to allow them to be used knowing that there
are limitations with them.


### Changes 🏗️

- Added ability to execute blocks as tools

### Checklist 📋

<img width="613" alt="Screenshot 2025-02-25 at 12 49 26"
src="https://github.com/user-attachments/assets/e614f56d-2bdc-46c9-8c2c-e56f80343bde"
/>
 - create an agent with an SDM block and a block as a tool
 - run agent and make sure the block can be called as a tool

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-02-25 17:37:06 +00:00
Swifty
e752f0f342 feat(platform/library): Agent Library v2 (#9407)
- Resolves #8774
  - Resolves #8775
- Includes back-end work for #9168
- Partially implements #8776
- Partially implements #8777

### Changes 🏗️

- Add `/library` page
- Change target of "Library" navigation link from `/monitoring` to
`/library`
- Move `/agents/[id]` page to `/library/agents/[id]`
- Set application background color to `bg-neutral-50`
- Redirect to new library agent's "runs" page (`/library/agents/[id]`)
after adding from marketplace

Further (technical) frontend changes:
- Add types and client methods for all library API endpoints
- Added `primary` variant to `agptui/Button` component

Backend changes:
- Add functionality to library backend
  - Aggregate agent status
  - Image generation for use in library view
    - Add `LibraryAgent.imageUrl` column to DB schema
  - Sorting & pagination
  - Explicit relation between library agents and their graph's creator
- Refactor & update API endpoints for DX
- Other minor refactoring
- Add missing but required `MEDIA_GCS_BUCKET_NAME` to `.env.example`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - `/library`
    - [x] Create agent from scratch -> should show up on `/library`
- [x] Add agent to library from marketplace -> should show up on
`/library`
- [x] Click on agent in `/library` -> should go to
`/library/agents/[id]`
    - [x] Test sorting & pagination functionality
  - `/library/agents/[id]`
    - [x] Fill out inputs and click "Run" -> should run like normally
    - [x] Select completed agent run -> should show all inputs & outputs
- [x] Click "run again" on a completed agent run -> should run
successfully with same input
  - [x] `/monitoring` should still work the same as before

---------

Co-authored-by: abhi1992002 <abhimanyu1992002@gmail.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-25 17:29:15 +00:00
Swifty
b603ed2d2a feature(platform) Smart Decision Maker Block (#9490)
## Task

The SmartDecisionMakerBlock is a specialized block in a graph-based
system that leverages a language model (LLM) to make intelligent
decisions about which tools or functions to invoke based on a
user-provided prompt. It is designed to process input data, interact
with a language model, and dynamically determine the appropriate tools
to call from a set of available options, making it a powerful component
for AI-driven workflows.

## How It Works in Practice

- **Scenario:** Imagine a workflow where a user inputs, "Send an email
to John about the meeting." The SmartDecisionMakerBlock is connected to
tools like send_email, schedule_meeting, and search_contacts.
- **Execution:**
1. The block receives the prompt and system instructions (e.g., "Choose
a function to call").
2.It identifies the available tools from the graph and constructs their
signatures (e.g., send_email(recipient, subject, body)).
3. The LLM analyzes the prompt and decides to call send_email with
arguments like recipient: "John", subject: "Meeting", body: "Let’s
discuss...".
4. The block yields these tool-specific outputs, which can be picked up
by downstream nodes to execute the email-sending action.


## Changes 🏗️
- Add the Smart Decision Maker (SDM) block.
- Break circular imports in integration code.

![Screenshot 2025-02-21 at 10 23
25](https://github.com/user-attachments/assets/6fbfd875-fb1b-4d77-8051-a214c3c86082)


## Work in Progress

⚠️ **Important note this is a temporary UX for the system - UX will be
addressed in a future PR** ⚠️

### Current Status

I’m currently focused on the smart decision logic. The main additions in
the ongoing PR include:
- Defining function signatures for OpenAI function-calling schemas based
on node links and the linked blocks.
- Adding tests for function signature generation.
- Force all tool calls to be made via an agent. (Need to uncomment)
- Restrict each tool call entry to a single node.
- simplify the output emission process, to emit each parameter one at a
time.
- Change test to use agents and hardcode output how I think it should
work to test it does actually work
- Hook up openai, in a simplified way, to test the function calling
(mock for testing)
- Once all the above is working, use credentials system and build of
llm.py



### What’s Next

- Review Process

### Reviewers Phase 1

This PR is now ready for review, during the first phase of reviews I'm
looking for comments on approach and logic.

Out of scope:  code style and organization at this stage

### Reviewers Phase 2

Once we are all happy with the approach and logic. We can open the
review process to general code quality and nits, to be considered.

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-02-25 15:29:22 +01:00
Zamil Majdy
f1fa9009b3 fix(backend): Fix api host for FastAPI RPC Server 2025-02-25 17:04:45 +07:00
Zamil Majdy
d0d3cc07a3 fix(frontend): Minor UI changes; Align badges & buttons on LibraryV1 (#9512)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

While V2 Library is coming, this has been my pet peeve

<img width="1428" alt="image"
src="https://github.com/user-attachments/assets/39c0b84e-4dfe-44e1-b455-cd0330ae7222"
/>

to

<img width="1428" alt="image"
src="https://github.com/user-attachments/assets/ab41973b-8ce8-4772-a4ab-e0dcd8b75464"
/>


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-25 09:37:01 +00:00
Zamil Majdy
1d59fc869d feat(backend): Pyro to FastAPI migration for micro service (#9508)
Due to legacy reasons, we've been using Pyro for our inter-process
communication channel. While it fulfilled our initial needs, there were
a few limitations that have been encountered:
* Each connection will reserve 1 thread, when the thread is running out
there will be no connection being accepted by the service.
* Lack of asynchronous execution mode, we are locked in the sync
execution which ended up wasting the I/O bound workload. Moving away
from this will unlock async execution support for agent blocks.
* Low throughput, while the database is still the main bottleneck, we've
started seeing instances where the service is being denied due to the
high traffic of the Pyro service.

### Changes 🏗️

Replace the usage of Pyro with the FastAPI Rest HTTP server and make the
code work.

Introduced the new config:
`use_http_based_rpc`: Whether to use HTTP-based RPC for communication
between services.

If it's enabled FastAPI will be used, if it's disabled existing Pyro
will be used.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Create from scratch and execute an agent with at least 3 blocks
with cost (AI blocks).
- [x] Import an agent from file upload, and confirm it executes
correctly

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-25 05:04:10 +00:00
dependabot[bot]
a694cf1e9d chore(libs/deps-dev): bump ruff from 0.9.3 to 0.9.6 in /autogpt_platform/autogpt_libs in the development-dependencies group across 1 directory (#9454)
Bumps the development-dependencies group with 1 update in the
/autogpt_platform/autogpt_libs directory:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.9.3 to 0.9.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.6</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Add <code>external_task.{ExternalTaskMarker,
ExternalTaskSensor}</code> for <code>AIR302</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16014">#16014</a>)</li>
<li>[<code>flake8-builtins</code>] Make strict module name comparison
optional (<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15951">#15951</a>)</li>
<li>[<code>flake8-pyi</code>] Extend fix to Python &lt;= 3.9 for
<code>redundant-none-literal</code> (<code>PYI061</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16044">#16044</a>)</li>
<li>[<code>pylint</code>] Also report when the object isn't a literal
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15985">#15985</a>)</li>
<li>[<code>ruff</code>] Implement <code>indented-form-feed</code>
(<code>RUF054</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16049">#16049</a>)</li>
<li>[<code>ruff</code>] Skip type definitions for
<code>missing-f-string-syntax</code> (<code>RUF027</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16054">#16054</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-annotations</code>] Correct syntax for
<code>typing.Union</code> in suggested return type fixes for
<code>ANN20x</code> rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16025">#16025</a>)</li>
<li>[<code>flake8-builtins</code>] Match upstream module name comparison
(<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16006">#16006</a>)</li>
<li>[<code>flake8-comprehensions</code>] Detect overshadowed
<code>list</code>/<code>set</code>/<code>dict</code>, ignore variadics
and named expressions (<code>C417</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15955">#15955</a>)</li>
<li>[<code>flake8-pie</code>] Remove following comma correctly when the
unpacked dictionary is empty (<code>PIE800</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16008">#16008</a>)</li>
<li>[<code>flake8-simplify</code>] Only trigger <code>SIM401</code> on
known dictionaries (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15995">#15995</a>)</li>
<li>[<code>pylint</code>] Do not report calls when object type and
argument type mismatch, remove custom escape handling logic
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15984">#15984</a>)</li>
<li>[<code>pyupgrade</code>] Comments within parenthesized value ranges
should not affect applicability (<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16027">#16027</a>)</li>
<li>[<code>pyupgrade</code>] Don't introduce invalid syntax when
upgrading old-style type aliases with parenthesized multiline values
(<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16026">#16026</a>)</li>
<li>[<code>pyupgrade</code>] Ensure we do not rename two type parameters
to the same name (<code>UP049</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16038">#16038</a>)</li>
<li>[<code>pyupgrade</code>] [<code>ruff</code>] Don't apply renamings
if the new name is shadowed in a scope of one of the references to the
binding (<code>UP049</code>, <code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16032">#16032</a>)</li>
<li>[<code>ruff</code>] Update <code>RUF009</code> to behave similar to
<code>B008</code> and ignore attributes with immutable types (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16048">#16048</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Root exclusions in the server to project root (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16043">#16043</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-datetime</code>] Ignore <code>.replace()</code> calls
while looking for <code>.astimezone</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16050">#16050</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid <code>TC004</code> false
positive where the runtime definition is provided by
<code>__getattr__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16052">#16052</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Improve <code>ruff-lsp</code> migration document (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16072">#16072</a>)</li>
<li>Undeprecate <code>ruff.nativeServer</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16039">#16039</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/AlexWaygood"><code>@​AlexWaygood</code></a></li>
<li><a
href="https://github.com/Daverball"><code>@​Daverball</code></a></li>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a href="https://github.com/Lee-W"><code>@​Lee-W</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/carlosgmartin"><code>@​carlosgmartin</code></a></li>
<li><a
href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/dylwil3"><code>@​dylwil3</code></a></li>
<li><a
href="https://github.com/junhsonjb"><code>@​junhsonjb</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.6</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Add <code>external_task.{ExternalTaskMarker,
ExternalTaskSensor}</code> for <code>AIR302</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16014">#16014</a>)</li>
<li>[<code>flake8-builtins</code>] Make strict module name comparison
optional (<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15951">#15951</a>)</li>
<li>[<code>flake8-pyi</code>] Extend fix to Python &lt;= 3.9 for
<code>redundant-none-literal</code> (<code>PYI061</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16044">#16044</a>)</li>
<li>[<code>pylint</code>] Also report when the object isn't a literal
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15985">#15985</a>)</li>
<li>[<code>ruff</code>] Implement <code>indented-form-feed</code>
(<code>RUF054</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16049">#16049</a>)</li>
<li>[<code>ruff</code>] Skip type definitions for
<code>missing-f-string-syntax</code> (<code>RUF027</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16054">#16054</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-annotations</code>] Correct syntax for
<code>typing.Union</code> in suggested return type fixes for
<code>ANN20x</code> rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16025">#16025</a>)</li>
<li>[<code>flake8-builtins</code>] Match upstream module name comparison
(<code>A005</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16006">#16006</a>)</li>
<li>[<code>flake8-comprehensions</code>] Detect overshadowed
<code>list</code>/<code>set</code>/<code>dict</code>, ignore variadics
and named expressions (<code>C417</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15955">#15955</a>)</li>
<li>[<code>flake8-pie</code>] Remove following comma correctly when the
unpacked dictionary is empty (<code>PIE800</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16008">#16008</a>)</li>
<li>[<code>flake8-simplify</code>] Only trigger <code>SIM401</code> on
known dictionaries (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15995">#15995</a>)</li>
<li>[<code>pylint</code>] Do not report calls when object type and
argument type mismatch, remove custom escape handling logic
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15984">#15984</a>)</li>
<li>[<code>pyupgrade</code>] Comments within parenthesized value ranges
should not affect applicability (<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16027">#16027</a>)</li>
<li>[<code>pyupgrade</code>] Don't introduce invalid syntax when
upgrading old-style type aliases with parenthesized multiline values
(<code>UP040</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16026">#16026</a>)</li>
<li>[<code>pyupgrade</code>] Ensure we do not rename two type parameters
to the same name (<code>UP049</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16038">#16038</a>)</li>
<li>[<code>pyupgrade</code>] [<code>ruff</code>] Don't apply renamings
if the new name is shadowed in a scope of one of the references to the
binding (<code>UP049</code>, <code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16032">#16032</a>)</li>
<li>[<code>ruff</code>] Update <code>RUF009</code> to behave similar to
<code>B008</code> and ignore attributes with immutable types (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16048">#16048</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Root exclusions in the server to project root (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16043">#16043</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-datetime</code>] Ignore <code>.replace()</code> calls
while looking for <code>.astimezone</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16050">#16050</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid <code>TC004</code> false
positive where the runtime definition is provided by
<code>__getattr__</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16052">#16052</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Improve <code>ruff-lsp</code> migration document (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16072">#16072</a>)</li>
<li>Undeprecate <code>ruff.nativeServer</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/16039">#16039</a>)</li>
</ul>
<h2>0.9.5</h2>
<h3>Preview features</h3>
<ul>
<li>Recognize all symbols named <code>TYPE_CHECKING</code> for
<code>in_type_checking_block</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15719">#15719</a>)</li>
<li>[<code>flake8-comprehensions</code>] Handle builtins at top of file
correctly for <code>unnecessary-dict-comprehension-for-iterable</code>
(<code>C420</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15837">#15837</a>)</li>
<li>[<code>flake8-logging</code>] <code>.exception()</code> and
<code>exc_info=</code> outside exception handlers (<code>LOG004</code>,
<code>LOG014</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15799">#15799</a>)</li>
<li>[<code>flake8-pyi</code>] Fix incorrect behaviour of
<code>custom-typevar-return-type</code> preview-mode autofix if
<code>typing</code> was already imported (<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15853">#15853</a>)</li>
<li>[<code>flake8-pyi</code>] Fix more complex cases
(<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15821">#15821</a>)</li>
<li>[<code>flake8-pyi</code>] Make <code>PYI019</code> autofixable for
<code>.py</code> files in preview mode as well as stubs (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15889">#15889</a>)</li>
<li>[<code>flake8-pyi</code>] Remove type parameter correctly when it is
the last (<code>PYI019</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15854">#15854</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="524cf6e515"><code>524cf6e</code></a>
Bump version to 0.9.6 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16074">#16074</a>)</li>
<li><a
href="857cf0deb0"><code>857cf0d</code></a>
Revert tailwindcss v4 update (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16075">#16075</a>)</li>
<li><a
href="0f1eb1e2fc"><code>0f1eb1e</code></a>
Improve migration document (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16072">#16072</a>)</li>
<li><a
href="b69eb9099a"><code>b69eb90</code></a>
Fix reference definition labels for backtick-quoted shortcut links (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16035">#16035</a>)</li>
<li><a
href="d2f661f795"><code>d2f661f</code></a>
RUF009 should behave similar to B008 and ignore attributes with
immutable typ...</li>
<li><a
href="07cf8852a3"><code>07cf885</code></a>
[<code>pylint</code>] Also report when the object isn't a literal
(<code>PLE1310</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15985">#15985</a>)</li>
<li><a
href="c08989692b"><code>c089896</code></a>
Update Rust crate rustc-hash to v2.1.1 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16060">#16060</a>)</li>
<li><a
href="869a9543e4"><code>869a954</code></a>
Root exclusions in the server to project root (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16043">#16043</a>)</li>
<li><a
href="cc0a5dd14a"><code>cc0a5dd</code></a>
Directly include <code>Settings</code> struct for the server (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16042">#16042</a>)</li>
<li><a
href="b54e390cb4"><code>b54e390</code></a>
Update Rust crate clap to v4.5.28 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/16059">#16059</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.3...0.9.6">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.3&new-version=0.9.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bently <tomnoon9@gmail.com>
2025-02-24 09:02:25 +00:00
Zamil Majdy
cca99c850d fix(frontend): Minor UI tweak, fix non-accessible button on phone screen (#9504)
### Changes 🏗️
Fix these buttons:

![image](https://github.com/user-attachments/assets/bd6753a3-49b4-4d9b-8533-6d145dc8f387)
<img width="337" alt="image"
src="https://github.com/user-attachments/assets/702bf3e1-7168-4372-8dcf-71abdea0bc19"
/>
<img width="337" alt="image"
src="https://github.com/user-attachments/assets/362a5e44-3bd4-4849-ba92-8b21cfcfe767"
/>


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Abhimanyu Yadav <122007096+Abhi1992002@users.noreply.github.com>
2025-02-24 09:01:22 +00:00
Tom Hu
bfcc0c93b3 feat: add Codecov test analytics for flaky and failed tests (#9420)
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-21 21:04:19 -06:00
dependabot[bot]
d310943f34 chore(backend/deps): bump websockets from 13.1 to 14.2 in /autogpt_platform/backend (#9398)
Bumps [websockets](https://github.com/python-websockets/websockets) from
13.1 to 14.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/python-websockets/websockets/releases">websockets's
releases</a>.</em></p>
<blockquote>
<h2>14.2</h2>
<p>See <a
href="https://websockets.readthedocs.io/en/stable/project/changelog.html">https://websockets.readthedocs.io/en/stable/project/changelog.html</a>
for details.</p>
<h2>14.1</h2>
<p>See <a
href="https://websockets.readthedocs.io/en/stable/project/changelog.html">https://websockets.readthedocs.io/en/stable/project/changelog.html</a>
for details.</p>
<h2>14.0</h2>
<p>See <a
href="https://websockets.readthedocs.io/en/stable/project/changelog.html">https://websockets.readthedocs.io/en/stable/project/changelog.html</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="624a36cc9c"><code>624a36c</code></a>
Release version 14.2.</li>
<li><a
href="c8242bbb3a"><code>c8242bb</code></a>
Add changelog for <a
href="https://redirect.github.com/python-websockets/websockets/issues/1566">#1566</a>.</li>
<li><a
href="17e309a830"><code>17e309a</code></a>
Mention another symptom in the changelog.</li>
<li><a
href="7de24bd087"><code>7de24bd</code></a>
Improve previous commit.</li>
<li><a
href="7e617b2a57"><code>7e617b2</code></a>
Add regex support in <code>ServerProtocol(origins=...)</code>.</li>
<li><a
href="613f3f0ef8"><code>613f3f0</code></a>
Prevent close() from blocking when reading is paused.</li>
<li><a
href="e7a098e1a0"><code>e7a098e</code></a>
Prevent AssertionError in the recv_events thread.</li>
<li><a
href="031ec31b70"><code>031ec31</code></a>
Prevent close() from blocking when reading is paused.</li>
<li><a
href="6317c00cc5"><code>6317c00</code></a>
Clarify behavior of <code>recv(timeout=0)</code> behavior.</li>
<li><a
href="b1e88fcb77"><code>b1e88fc</code></a>
Bump pypa/cibuildwheel from 2.21.3 to 2.22.0</li>
<li>Additional commits viewable in <a
href="https://github.com/python-websockets/websockets/compare/13.1...14.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=websockets&package-manager=pip&previous-version=13.1&new-version=14.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bentlybro <tomnoon9@gmail.com>
2025-02-22 00:08:08 +00:00
Krzysztof Czerwinski
0b992223df feat(frontend): Onboarding flow UI (#9485)
### Changes 🏗️
This PR adds interactive UI for the onboarding flow, without any
connection to the backend.
Visit `/onboarding` to see it!

- Add Onboarding pages to `app/onboarding/`
- Add Onboarding components to `components/onboarding`

Note:
- Backend isn't connected, so the agents won't run and state isn't
preserved
- Onboarding state is lost on refresh

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...
2025-02-21 16:07:27 +00:00
Krzysztof Czerwinski
70d095ba98 fix(frontend): Fix Run/Stop button on Builder page refresh (#9503)
When opened graph is running and Builder page is refreshed the bottom
says `Run` but should show `Stop` instead.

### Changes 🏗️

- Fix state on refresh, so that the bottom button is `Stop` if graph is
currently running

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Refresh still retrieves past and ongoing execution updates
- [x] Bottom Builder button says `Stop` when page is refreshed and graph
is running
  - [x] `Stop` button works and terminates execution
2025-02-21 13:09:05 +00:00
Zamil Majdy
a692eedb1c feat(backend): Notification Integration for credits system (#9488)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

Add email notifications on refund events.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-20 12:19:58 +00:00
Nicholas Tindle
4ae016606b feat(backend): move failed messages into a dead letter queue (#9501)
<!-- Clearly explain the need for these changes: -->
When we fail to process something, we don't want to keep retrying
forever. We should store those and process them later

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Fix the type of the failed exchange from Direct to Topic to allow
filtering based on name (allows us later to do more advanced handling of
queue types)
- abstract processing the messages in a queue a bit to reduce repeated
code
- abstract how we check if a user wants a notification so that its a bit
easier to process
- Handle errors better
- Abstract model parsing

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

---------

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-02-20 10:09:51 +00:00
Zamil Majdy
63005631f0 fix(frontend): Remove invalid font class names (#9499)
There are many occurrences in the UI code that we are defining the font
through class but it refers to the invalid font-family names. This
causes the component to end up rendering the text using Times New Roman.

### Changes 🏗️

Remove manual font definition through string font-family name.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-20 09:18:46 +00:00
Reinier van der Leer
296eee0b4f feat(platform/library): Library v2 > Agent Runs page (#9051)
- Resolves #8780
- Part of #8774

### Changes 🏗️

- Add new UI components
- Add `/agents/[id]` page, with sub-components:
  - `AgentRunsSelectorList`
    - `AgentRunSummaryCard`
      - `AgentRunStatusChip`
  - `AgentRunDetailsView`
  - `AgentRunDraftView`
  - `AgentScheduleDetailsView`

Backend improvements:
- Improve output of execution-related API endpoints: return
`GraphExecution` instead of `NodeExecutionResult[]`
- Reduce log spam from Prisma in tests

General frontend improvements:
- Hide nav link names on smaller screens to prevent navbar overflow
- Clean up styling and fix sizing of `agptui/Button`

Technical frontend improvements:
- Fix tailwind config size increments
- Rename `font-poppin` -> `font-poppins`
- Clean up component implementations and usages
   - Yeet all occurrences of `variant="default"`
- Remove `default` button variant as duplicate of `outline`; make
`outline` the default
- Fix minor typing issues

DX:
- Add front end type-check step to `pre-commit` config
- Fix logging setup in conftest.py

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - `/agents/[id]` (new)
    - Go to page -> list of runs loads
    - Create new run -> runs; all I/O is visible
    - Click "Run again" -> runs again with same input
  - `/monitoring` (existing)
    - Go to page -> everything loads
    - Selecting agents and agent runs works

---------

Co-authored-by: Nicholas Tindle <nicktindle@outlook.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Swifty <craigswift13@gmail.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-02-19 22:07:03 +00:00
Nicholas Tindle
f722c70c50 feat(blocks): add base for smartlead, apollo, and zerobounce blocks (#9387)
<!-- Clearly explain the need for these changes: -->
We want to support some more advanced search specific actions. These are
the base API layers and sample blocks for some of the services we need.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- support pydantic models as an output format
- add apollo
- add smartlead
- add zerobounce

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Built agents to test

---------

Co-authored-by: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com>
Co-authored-by: Bently <tomnoon9@gmail.com>
2025-02-19 16:30:46 +00:00
Andy Hooker
a0be165835 feat(settings): Rework user settings page with Form, loading skeleton… (#9476)
Implemented a fully functional user settings page allowing changes to
account details and notification preferences. This change uses a server
first approach and adds much needed form validation to this page.
This PR has added loading skeletons for better UX during data fetching.
Refactored related components to support these changes and finally
implemented server actions to streamline data ingestion.

## Note to developers:
At the moment the notification switches set back to default upon save.
We will want to pass in this information after the api is implemented.


## Changes 🏗️
Rebuilt / Refactored `SettingsFormInput` to `SettingsForm`:
- Implemented Form Validation 
- Implemented a form schema with Zod to validate user input
- Added toast messaging to properly inform the user if the form has been
successfully completed or if there is an error in thrown from the server
action.

Added `loading.tsx`
- Using `Skeletons` we can deliver a better loading UI for our users
causing less screen shifting.

Added `actions.ts`
- Added a server action for the settings page. This server action will
handle the updating of user's settings for this page. It handles the
interaction between the application and supabase. After this server
action is ran we revalidate the path for our settings page ensuring
proper data passed to our components.

There is an additional TODO for @ntindle for the api endpoint getting
created. This endpoint will cover the newly added notification switches
and it's toggles.

## Screenshots 📷
### Before Changes:
<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/f5283fd5-705b-47cf-a7fa-4ca4d7f03444"
/>


### After Changes:
<img width="762" alt="image"
src="https://github.com/user-attachments/assets/20f96f01-b138-4eb7-8867-ce62a2d603d4"
/>

<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/0ae363f5-068f-48e5-8b0f-c079a08f9242"
/>

<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/8cb045ef-f322-4992-881e-fb92281c55cb"
/>

#### Form Validation
<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/b78cfef6-94da-49f1-9c93-56cdb9ea4c96"
/>
<img width="1083" alt="image"
src="https://github.com/user-attachments/assets/ade5dce9-8c4b-40eb-aa0f-ff6d31bc3c3c"
/>
<img width="245" alt="image"
src="https://github.com/user-attachments/assets/88866bbf-4e33-43d9-b04a-b53ac848852d"
/>



### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:


<details>
  <summary>Test Plan</summary>
 
  - [ ] Goto the route of `profile/settings`
  - [ ] Add an invalid email and notice the new validation messaging
- [ ] Add invalid passwords that do not match and or is under 8
characters notice the new validation messaging
- [ ] Select the cancel button and notice that the form has been set
back to the default values
- [ ] With the form untouched notice the `Save changes` button is
disabled. Toggle a switch and notice the `Save changes` button is now
enabled.
- [ ] Enter in a valid pair of new passwords in the `New Password` and
`Confirm New Password` input fields and select `Save changes`
- [ ] Enter in the same passwords again and notice that we will now be
shown an Error. This error is bubbling up from supabase in our backend
and is stating `New password should be different from the old password`
</details>

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Nicholas Tindle <nicktindle@outlook.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-02-19 14:51:37 +00:00
Reinier van der Leer
d1832ce10b fix(frontend): Fix return type and usage of api.listLibraryAgents() (#9498)
- Follow-up to #9258

The front end is fetching `/library/agents` -> `LibraryAgent[]` but
using the result as `GraphMeta[]`. This breaks a bunch of things.

### Changes 🏗️

Frontend:
- Add `LibraryAgent` type for `api.listLibraryAgents()`
- Amend all broken usages of `LibraryAgent` objects
- Introduce branded typing for `LibraryAgent.id` and `GraphMeta.id` to
disallow mixing them. This prevents incorrect use in the future, and
reduces the chance of this frontend issue accumulating interest on
existing open PRs.

Backend:
- Add a migration to create `LibraryAgent` objects for all existing
`AgentGraphs`


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Check that all existing agents are listed in the agents list on
`/monitoring` (check against DB or `GET /api/graphs`)
  - [x] Check that all views of `/monitoring` work
  - [x] Try to run an agent and check its status
2025-02-18 17:39:44 +00:00
Nicholas Tindle
dcbbe11c53 fix(backend): correctly check if email service is set up (#9497)
<!-- Clearly explain the need for these changes: -->
I made a mistake in how we check if postmark exists

### Changes 🏗️
- adds a more explicit setting of postmark to none and extra checking to
prevent its use if it isn’t set

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] I have no plan, it’s a simple logic bug so if it passes CI it’s
good
2025-02-18 14:33:26 +00:00
Zamil Majdy
43460b8553 feat(platform): Add Dispute & Refund resolution process (#9466)
### Changes 🏗️

Added the dispute & refund handling on the system.


https://github.com/user-attachments/assets/2d9c7b48-2ee1-401d-be65-5e9787c8130e




### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-18 09:20:46 +00:00
Zamil Majdy
0117006373 fix(backend): Fix failing poetry.lock validation on CI (#9489)
### Changes 🏗️

Poetry.lock is using the old version that the CI is not using.
Set the Poetry version to ^2.1.1.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-18 08:37:28 +00:00
Nicholas Tindle
e550846737 feat(backend): add ability to send emails to notification service (#9469)
<!-- Clearly explain the need for these changes: -->

We need a way to send emails for the email service to function. We will
depend on Postmark to do that.

This PR adds a simple email-sending service with the required settings
to make it work. It also builds on the previous agent run by sending the
emails that are in the immediate queue. Keep in mind that the email
template leaves a bit to be desired.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Add `email.py` with the minimum required to send an email (plus type
handling)
- Add settings configs for the token and the send address to the
`settings.py` and `.env.example`
- Add a db call to get user email by ID since the `metadata` field of
`prisma.models.User` isn't serializable over our message bus tool `Pyro`
that the `DatabaseManager` uses
- Add a horrible `AgentRun` email template using `jinja2`
- Add `postmarker` to `pyproject.toml`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Build and run an agent and make sure it emails me (must be signed
into same domain as receiving address for now)


#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have added a check that disables email if config is not set
correctly
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-02-14 17:55:30 +00:00
Nicholas Tindle
15275e2ce1 feat(backend): spawn the notifications service + basic test (#9464)
We want to send emails on a schedule, in response to events, and be
expandable without being overbearing on the amount of effort to
implement. We also want this to use rabbitmq and be easy for other
services to send messages into.

This PR adds the first use of the service to simply show a log message


### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds a new backend service for notifications
- Adds first notification into the service -> Agent Execution
- Adds spawning the notification service

Also 
- Adds RabbitMQ to CI so we can test stuff
- Adds a minor fix for one of the migrations that I thought was causing
failures, but isn't but the change is still useful


### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Built and ran an agent and ensured the following log line appeared
which shows the event would have sent an email
  ```
2025-02-10 15:52:02,232 INFO Processing notification:
user_id='96b8d2f5-a036-437f-bd8e-ba8856028553'
type=<NotificationType.AGENT_RUN: 'AGENT_RUN'>
data=AgentRunData(agent_name='CalculatorBlock', credits_used=0.0,
execution_time=0.0, graph_id='30e5f332-a092-4795-892a-b063a8c7bdd9',
node_count=1) created_at=datetime.datetime(2025, 2, 10, 15, 52, 2,
162865)
  ```

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

None of the other ports are configurable via .env.example listing so
left as is

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-02-14 03:58:12 +00:00
Reinier van der Leer
ce1d63c517 feat(backend): Library v2 Agents and Presets (#9258)
- Blocked by #9267

This re-introduces changes from the following PRs with fixes:
- #9218
- #9211

### Changes 🏗️

- See #9218
- See #9211

Fixes:
- Fix Prisma query statements in `v2.library.db`
- Fix creation of (library) agents
- Fix test cleanup of (library) agents
- Fix handling and passing of `node_input` parameters

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Create & run a new agent
  - [x] Update & run an existing agent
2025-02-13 17:30:58 +00:00
Zamil Majdy
b5b9a008bf feat(backend): Migrate json encoded string columns into a native json column (#9475)
### Changes 🏗️

Due to the legacy of SQLite usage, some of the JSON columns are actually
a string column string a stringified JSON column.
The scope of this PR is migrating those columns into an actual JSON
column.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-13 12:02:53 +00:00
Nicholas Tindle
7e04fbd25f feat(backend): schema updates, migration, queries for Email Notification Service (#9445)
<!-- Clearly explain the need for these changes: -->

The email service has requirements to
- Email users when some activity has happened on their account on some
scheduled basis -> We need a way to get active users and the executions
that happened while they were active
- Allow users to configure what emails they get -> Need a user
preference
- Get User email by Id so that we can email them -> Pretty
self-explanatory

We need to add a few new backend queries + db models for the
notification to start handling these details. This is the first set of
those changes based on experience building the app service

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds a new DB Model, `UserNotificationPreferences,` with related
migration
- Adds a new DB Model `NotificationEvent` with related migration to
track what notifications we've sent and how many and such (how much we
add here is open to change depending on what limits on data we want)
- Adds a new DB Model `UserNotificationBatch` with related migration to
handle batching of like models
- Adds queries to get users and executions by `datetime` ranges as `ISO`
strings
- Adds new queries to the `DatabaseManager` and exposes them to the
other `AppService`s
- Exposes all new queries plus an existing one `get_user_by_id`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] I extracted these changes from a working implementation of the
service, and tested they don't bring down the service by being uncalled
by running the standard agent tests we do on release

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-02-12 22:54:16 +00:00
Bently
016ec0ff6b fix(frontend) update PublishAgentAwaitingReview router push path (#9471)
Updates the PublishAgentAwaitingReview router.push path, it was going to
``/marketplace/dashboard`` it should be ``/profile/dashboard``

### Changes 🏗️


8181ee8cd1/autogpt_platform/frontend/src/components/agptui/composite/PublishAgentPopout.tsx (L265-L267)

to be

```tsx
		onViewProgress={() => {
		  router.push("/profile/dashboard");
		  handleClose();
		}}
```
2025-02-12 15:32:47 +00:00
Zamil Majdy
3b8cde6d11 feat(block): Add batch matched result and its count on ExtractTextInformationBlock (#9470)
### Changes 🏗️

Introduced `matched_result` & `matched_count` as a batch matched result
list and its count for the block execution of
ExtractTextInformationBlock.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-12 12:22:26 +00:00
Keith Webber
d050a3f77c docs: Provide feedback when cloning submodules (#9448)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️
Added `--progress` to the submodule update, so that cloning progress can
be tracked and does not appear to hang.
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] No code change, just docs.
 

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [x] No configuration change, just docs.
 

<details>
  <summary> Provide feedback when cloning submodules </summary>

  -  now updating submodules shows the cloning repo's progress
 
</details>

Co-authored-by: Your Name <you@example.com>
2025-02-12 03:43:52 +00:00
Reinier van der Leer
1626bf9e16 fix(backend): Support Python 3.10 (#9468)
- Resolves #9467

### Changes 🏗️

- Loosen Python version requirement to include v3.10

Also, fixed a few issues in pyproject.toml:
- Re-sort dependency list
- Update `autogpt-platform-backend` package version to match latest
release
2025-02-12 02:02:00 +00:00
Andy Hooker
40613fe23e fix(frontend): Update user profile from marketplace to appropriate profile route (#9465)
### Background
Resolves: #9313

The application is incorrectly nesting the user's profile settings
within the route of `/marketplace` instead of the appropriate route of
`/profile`

This pr will modify the existing code to handle the relocation of the
(user) directory from the /marketplace to /profile.

### Changes 🏗️

1. Refactored directory of `(user)`:
- Moved the directory of (user) from `/marketplace/(user)` to
`profile/(user)`


2. Update Sidebar and Navbar components:
- Updating the existing code from the routing of market to profile by
modifying the existing routes.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

<details>
  <summary>Test Plan</summary>
  
  - [ ] Navigate to the route of `profile/` and observe the moved page.
- [ ] Navigate to the route of `profile/integrations` and observe the
moved page.
- [ ] Navigate to the route of `profile/api_keys` and observe the moved
page.
- [ ] Navigate to the route of `profile/profile` and observe the moved
page.
- [ ] Navigate to the route of `profile/settings` and observe the moved
page.
- [ ] Navigate to the route of `profile/credits` and observe the moved
page.
</details>
2025-02-11 11:25:15 +00:00
Andy Hooker
6eee9206f7 fix(market): Market featured agent card (#9463)
### Background
Resolves: #9313

The marketplace featured agent's section has a bug where if you hover
over a featured agent's card we are getting an incorrect background
color applied to the description.

### Changes 🏗️

1. Refactored `FeaturedStoreCard` to `FeaturedAgentCard`:
   - Condensed props and leverage StoreAgent type from api
- Removed onClick handler from props as this is not json serializable
and is not inline with NextJS best practices
- Used built in Card Components from ShadCN to minimize custom styling.
- Optimize images with implementation of the Image component from NextJS

2. Enhanced `FeaturedCardSection` components:
- Removing extensive prop passing and leverage the agent itself with the
StoreAgent type.
- Implemented Link from NextJS to better handler routing and remove the
`useRouter` implementation
   - Removed unnecessary handleCardClick method.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:

Test Plan
<details>
  <summary></summary>
 
  - [ ] Goto the landing page of the application or /marketplace 
  - [ ] Scroll to the featured agents section
- [ ] Move mouse over each of the cards and observe the image
disappearing and text being shown
- [ ] Observe the background color of the text that replaced the image
matches that of the card
</details>
2025-02-10 22:01:29 +00:00
Muhammad Safi
64050faef6 feature(block): Add XML Parser Block (#9450)
-Updated pyproject.toml for new dependency gravitasml
-Updated poetry.lock

<!-- Clearly explain the need for these changes: -->
- Issue no #9317 stated that, the addition of an XMLParserBlock is
required.
- It was suggested that the use of gravitasml as external package to be
used for parsing.
- Changes incorporated and tested as per requirements.
### Changes 🏗️
- Added xml_parser.py
- updated pyproject.toml
- updated poetry.lock for dependency changes 
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-10 21:00:09 +00:00
Krzysztof Czerwinski
00c312d02c feat(platform): Schedule specific agent version (#9444)
Scheduling always takes the newest version of an agent.

### Changes 🏗️

This PR allows to schedule any graph version by adding number input to
schedule popup. Number is automatically set to the newest version when
agent is chosen.

<img width="533" alt="Screenshot 2025-02-07 at 5 05 56 PM"
src="https://github.com/user-attachments/assets/357b8810-6f02-4066-b7a3-824d9bfd62af"
/>

- Update API, so it accepts graph version
- Update schedule pop up, so it lets user input version number
- Open and schedule correct agent
- Add `Version` column to the schedules table

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Can schedule version between 1 and max version
  - [x] Reject incorrect version
  - [x] Table shows proper version
  - [x] Removing schedule works
2025-02-10 13:24:25 +00:00
Nicholas Tindle
610be988c4 feat(backend): attach rabbitmq to the AppService (#9438)
### Changes 🏗️
For Emailing, we need to make a new App Service (NotificationManager)
that will require us to have rabbitmq as a dependency. This is the
backing data library to make that happen + registering it with the app
service base class and connecting when we spawn up a service

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds a rabbitmq library following the existing standard for redis
- Adds rabbitmq to the service
- Adds rabbitmq mgmt library (pika) so that we can connect to rabbitmq

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] I tested by adding the following to the executor `@expose
add_execution` and verifying via the UI that the messages show up in the
queue as expected + the agent executes and behaves as normal!

![image](https://github.com/user-attachments/assets/3ebfb850-d482-4b11-901c-d3bf3397a346)

```diff
      diff --git a/autogpt_platform/backend/backend/executor/manager.py b/autogpt_platform/backend/backend/executor/manager.py
index 1d965e012..4cd5b403c 100644
--- a/autogpt_platform/backend/backend/executor/manager.py
+++ b/autogpt_platform/backend/backend/executor/manager.py
@@ -18,7 +18,7 @@ if TYPE_CHECKING:
 from autogpt_libs.utils.cache import thread_cached
 
 from backend.blocks.agent import AgentExecutorBlock
-from backend.data import redis
+from backend.data import rabbitmq, redis
 from backend.data.block import (
     Block,
     BlockData,
@@ -750,6 +750,19 @@ class ExecutionManager(AppService):
     def __init__(self):
         super().__init__()
         self.use_redis = True
+        self.use_rabbitmq = rabbitmq.RabbitMQConfig(
+            exchanges=[
+                rabbitmq.Exchange(name="execution", type=rabbitmq.ExchangeType.FANOUT),
+            ],
+            queues=[
+                rabbitmq.Queue(
+                    name="execution",
+                    exchange=rabbitmq.Exchange(
+                        name="execution", type=rabbitmq.ExchangeType.FANOUT
+                    ),
+                ),
+            ],
+        )
         self.use_supabase = True
         self.pool_size = settings.config.num_graph_workers
         self.queue = ExecutionQueue[GraphExecutionEntry]()
@@ -876,6 +889,12 @@ class ExecutionManager(AppService):
         )
         self.queue.add(graph_exec)
 
+        # test rabbitmq
+        self.rabbit.publish_message(
+            exchange=self.rabbit_config.exchanges[0],
+            routing_key=self.rabbit_config.exchanges[0].name,
+            message=graph_exec_id,
+        )
         return graph_exec
 
     @expose
```
2025-02-08 21:30:30 +00:00
Nicholas Tindle
1a4ba533ca feat(infra): add rabbitmq to docker compose (#9437)
<!-- Clearly explain the need for these changes: -->
We want to use RabbitMQ for email (and executor in the future) to ensure
message delivery -- something we currently lack with Redis. This PR is
adding RabbitMQ to the docker-compose and setup details with defaults so
that when we start bringing services up, they have the backing to do so.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds rabbitmq container (with exposed API and mgmt ports)
- Adds .env.example config for the backend
- Adds dockercompose config for the backend, and passes the variables
around as needed

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Start the container using docker compose deps subset

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [x] `docker-compose.yml` is updated or already compatible with my
changes
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**)
2025-02-07 15:40:17 +00:00
Krzysztof Czerwinski
56a307d048 fix(frontend): Fix beads when output is array (#9439)
Array output, e.g. `Item` in Step Through Items block doesn't output
correct number of beads, this PR fixes this issue.
2025-02-07 14:42:51 +00:00
Krzysztof Czerwinski
a5ad90f09b fix(frontend): Fix issue when pasting blocks (#9443)
When block is pasted the original block's inputs behave as disconnected:
the input is shown despite there being connection. This PR fixes this
issue.
2025-02-07 14:42:08 +00:00
Krzysztof Czerwinski
a315b3fc41 fix(frontend): Prevent exception when Stripe env var is missing (#9441)
Prevent exception when `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY` is missing
and update state management in `useCredits`.
2025-02-07 12:37:06 +00:00
Krzysztof Czerwinski
1a1fe7c0b7 feat(platform): Support opening graphs with version and execution id (#9332)
Currently it's only possible to open latest graph from monitor and see
the node execution results only when manually running. This PR adds
ability to open running and finished graphs in builder.

### Changes 🏗️

Builder now handles graph version and execution ID in addition to graph
ID when opening a graph. When an execution ID is provided, node
execution results are fetched and subscribed to in real time. This makes
it possible to open a graph that is already executing and see both
existing node execution data and real-time updates (if it's still
running).

- Use graph version and execution id on the builder page and in
`useAgentGraph`
- Use graph version on the `execute_graph` endpoint
- Use graph version on the websockets to distinguish between versions
- Move `formatEdgeID` to utils; it's used in `useAgentGraph.ts` and in
`Flow.tsx`

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - [x] Opening finished execution restores node results
- [x] Opening running execution restores results and continues to run
properly
  - [x] Results are separate for each graph across multiple tabs

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-02-07 10:16:30 +00:00
Swifty
c693875951 platform(fix): Improve performance of builder (#9435)
1. Remove isHovered / onMouseEnter / onMouseLeave state updates
2. Wrap Custom Node in React.memo
3. Avoid re-renders for context menus
2025-02-07 10:38:50 +01:00
Krzysztof Czerwinski
797916cf14 feat(frontend): Show toast on low credit balance, rename Credits page to Billing (#9428)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

- If a node fails to execute and error contains `Insufficient balance`
show toast with link to Billing page
- Rename `Credits` page to `Billing`
<img width="398" alt="Screenshot 2025-02-05 at 2 27 36 PM"
src="https://github.com/user-attachments/assets/6a5b4db0-a579-4607-a6bd-d5cf9229092f"
/>

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-02-06 16:12:56 +00:00
dependabot[bot]
5d8fe1e184 chore(backend/deps): bump google-cloud-storage from 2.19.0 to 3.0.0 in /autogpt_platform/backend (#9399)
Bumps
[google-cloud-storage](https://github.com/googleapis/python-storage)
from 2.19.0 to 3.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-storage/releases">google-cloud-storage's
releases</a>.</em></p>
<blockquote>
<h2>v3.0.0</h2>
<h2><a
href="https://github.com/googleapis/python-storage/compare/v2.19.0...v3.0.0">3.0.0</a>
(2025-01-28)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<p>Please consult the README for details on this major version
release.</p>
<ul>
<li>The default checksum strategy for uploads has changed from None to
&quot;auto&quot; (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)</li>
<li>The default checksum strategy for downloads has changed from
&quot;md5&quot; to &quot;auto&quot; (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)</li>
<li>Deprecated positional argument &quot;num_retries&quot; has been
removed (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1377">#1377</a>)</li>
<li>Deprecated argument &quot;text_mode&quot; has been removed (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1379">#1379</a>)</li>
<li>Blob.download_to_filename() now deletes the empty destination file
on a 404 (<a
href="https://redirect.github.com/googleapis/python-storage/pull/1394">#1394</a>)</li>
<li>Media operations now use the same retry backoff, timeout and custom
predicate system as non-media operations, which may slightly impact
default retry behavior (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1385">#1385</a>)</li>
<li>Retries are now enabled by default for uploads, blob deletes and
blob metadata updates (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1400">#1400</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>Add &quot;auto&quot; checksum option and make default (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)
(<a
href="5375fa0738">5375fa0</a>)</li>
<li>Blob.download_to_filename() deletes the empty destination file on a
404 (<a
href="https://redirect.github.com/googleapis/python-storage/pull/1394">#1394</a>)
(<a
href="066be2db78">066be2d</a>)</li>
<li>Enable custom predicates for media operations (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1385">#1385</a>)
(<a
href="f3517bfcb9">f3517bf</a>)</li>
<li>Integrate google-resumable-media (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1283">#1283</a>)
(<a
href="bd917b49d2">bd917b4</a>)</li>
<li>Retry by default for uploads, blob deletes, metadata updates (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1400">#1400</a>)
(<a
href="0426005175">0426005</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Cancel upload when BlobWriter exits with exception (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1243">#1243</a>)
(<a
href="df107d20a7">df107d2</a>)</li>
<li>Changed name of methods <code>Blob.from_string()</code> and
<code>Bucket.from_string()</code> to <code>from_uri()</code> (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1335">#1335</a>)
(<a
href="58c1d03819">58c1d03</a>)</li>
<li>Correctly calculate starting offset for retries of ranged reads (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1376">#1376</a>)
(<a
href="7b6c9a0fb3">7b6c9a0</a>)</li>
<li>Filter download_kwargs in BlobReader (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1411">#1411</a>)
(<a
href="0c21210450">0c21210</a>)</li>
<li>Remove deprecated num_retries argument (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1377">#1377</a>)
(<a
href="58b5040933">58b5040</a>)</li>
<li>Remove deprecated text_mode argument (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1379">#1379</a>)
(<a
href="4d20a8efa8">4d20a8e</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Correct formatting and update README.rst (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1427">#1427</a>)
(<a
href="2945853977">2945853</a>)</li>
<li>Fix issue with exceptions.py documentation (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1328">#1328</a>)
(<a
href="22b8c304af">22b8c30</a>)</li>
</ul>
<h2>v3.0.0rc1</h2>
<h2><a
href="https://github.com/googleapis/python-storage/compare/v2.19.0...v3.0.0rc1">3.0.0rc1</a>
(2024-12-12)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>The default checksum strategy for uploads has changed from None to
&quot;auto&quot; (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)
(5375fa0)</li>
<li>The default checksum strategy for downloads has changed from
&quot;md5&quot; to &quot;auto&quot; (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)
(5375fa0)</li>
<li>Deprecated positional argument &quot;num_retries&quot; has been
removed (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1377">#1377</a>)
(58b5040)</li>
<li>Deprecated argument &quot;text_mode&quot; has been removed (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1379">#1379</a>)
(4d20a8e)</li>
<li>Media operation retries now work identically to other retries, which
may impact default retry settings (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1385">#1385</a>)
(f3517bf)</li>
<li>Blob.download_to_filename() deletes the empty destination file on a
404</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-storage/blob/main/CHANGELOG.md">google-cloud-storage's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/python-storage/compare/v2.19.0...v3.0.0">3.0.0</a>
(2025-01-28)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<p>Please consult the README for details on this major version
release.</p>
<ul>
<li>The default checksum strategy for uploads has changed from None to
&quot;auto&quot; (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)</li>
<li>The default checksum strategy for downloads has changed from
&quot;md5&quot; to &quot;auto&quot; (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)</li>
<li>Deprecated positional argument &quot;num_retries&quot; has been
removed (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1377">#1377</a>)</li>
<li>Deprecated argument &quot;text_mode&quot; has been removed (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1379">#1379</a>)</li>
<li>Blob.download_to_filename() now deletes the empty destination file
on a 404 (<a
href="https://redirect.github.com/googleapis/python-storage/pull/1394">#1394</a>)</li>
<li>Media operations now use the same retry backoff, timeout and custom
predicate system as non-media operations, which may slightly impact
default retry behavior (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1385">#1385</a>)</li>
<li>Retries are now enabled by default for uploads, blob deletes and
blob metadata updates (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1400">#1400</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>Add &quot;auto&quot; checksum option and make default (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1383">#1383</a>)
(<a
href="5375fa0738">5375fa0</a>)</li>
<li>Blob.download_to_filename() deletes the empty destination file on a
404 (<a
href="https://redirect.github.com/googleapis/python-storage/pull/1394">#1394</a>)
(<a
href="066be2db78">066be2d</a>)</li>
<li>Enable custom predicates for media operations (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1385">#1385</a>)
(<a
href="f3517bfcb9">f3517bf</a>)</li>
<li>Integrate google-resumable-media (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1283">#1283</a>)
(<a
href="bd917b49d2">bd917b4</a>)</li>
<li>Retry by default for uploads, blob deletes, metadata updates (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1400">#1400</a>)
(<a
href="0426005175">0426005</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Cancel upload when BlobWriter exits with exception (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1243">#1243</a>)
(<a
href="df107d20a7">df107d2</a>)</li>
<li>Changed name of methods <code>Blob.from_string()</code> and
<code>Bucket.from_string()</code> to <code>from_uri()</code> (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1335">#1335</a>)
(<a
href="58c1d03819">58c1d03</a>)</li>
<li>Correctly calculate starting offset for retries of ranged reads (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1376">#1376</a>)
(<a
href="7b6c9a0fb3">7b6c9a0</a>)</li>
<li>Filter download_kwargs in BlobReader (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1411">#1411</a>)
(<a
href="0c21210450">0c21210</a>)</li>
<li>Remove deprecated num_retries argument (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1377">#1377</a>)
(<a
href="58b5040933">58b5040</a>)</li>
<li>Remove deprecated text_mode argument (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1379">#1379</a>)
(<a
href="4d20a8efa8">4d20a8e</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Correct formatting and update README.rst (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1427">#1427</a>)
(<a
href="2945853977">2945853</a>)</li>
<li>Fix issue with exceptions.py documentation (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1328">#1328</a>)
(<a
href="22b8c304af">22b8c30</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="f2cc9c5a2b"><code>f2cc9c5</code></a>
chore(main): release 3.0.0 (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1393">#1393</a>)</li>
<li><a
href="71455bcc7f"><code>71455bc</code></a>
samples: add OTel Tracing quickstart (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1371">#1371</a>)</li>
<li><a
href="2945853977"><code>2945853</code></a>
Docs: Correct formatting and update README.rst (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1427">#1427</a>)</li>
<li><a
href="0426005175"><code>0426005</code></a>
feat: Retry by default for uploads, blob deletes, metadata updates (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1400">#1400</a>)</li>
<li><a
href="0c21210450"><code>0c21210</code></a>
fix: filter download_kwargs in BlobReader (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1411">#1411</a>)</li>
<li><a
href="c2a2ce58c7"><code>c2a2ce5</code></a>
chore(python): exclude .github/workflows/unittest.yml in renovate config
(<a
href="https://redirect.github.com/googleapis/python-storage/issues/1407">#1407</a>)</li>
<li><a
href="ffa0734708"><code>ffa0734</code></a>
chore(deps): update all dependencies (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1405">#1405</a>)</li>
<li><a
href="2e94ad0eba"><code>2e94ad0</code></a>
chore(python): Update the python version in docs presubmit to use 3.10
(<a
href="https://redirect.github.com/googleapis/python-storage/issues/1403">#1403</a>)</li>
<li><a
href="4e9a382dd9"><code>4e9a382</code></a>
feat!: Release as 3.0.0 (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1396">#1396</a>)</li>
<li><a
href="066be2db78"><code>066be2d</code></a>
feat: download_to_filename deletes the empty file on a 404 (<a
href="https://redirect.github.com/googleapis/python-storage/issues/1394">#1394</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/python-storage/compare/v2.19.0...v3.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google-cloud-storage&package-manager=pip&previous-version=2.19.0&new-version=3.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-06 14:15:36 +00:00
Swifty
8181ee8cd1 platform(fix): Fix missing Profiles (#9424)
### What's This PR About?

This PR makes a few simple improvements to how user profiles are handled
in the app:

- **Always Have a Profile:**  
If a user doesn't already have a profile, the system now automatically
creates one with some default info (including a fun, randomly generated
username). This way, you never end up with a missing profile.

- **Better Profile Updates:**  
  Removes the creation of profiles on failed get requests
2025-02-06 11:20:32 +01:00
Zamil Majdy
6183ed5a63 fix(frontend): Add user note for automatic refill feature 2025-02-06 15:45:49 +07:00
dependabot[bot]
4b76aae1c9 chore(libs/deps): bump the production-dependencies group across 1 directory with 4 updates (#9432)
Bumps the production-dependencies group with 4 updates in the
/autogpt_platform/autogpt_libs directory:
[google-cloud-logging](https://github.com/googleapis/python-logging),
[pydantic](https://github.com/pydantic/pydantic),
[pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) and
[supabase](https://github.com/supabase/supabase-py).

Updates `google-cloud-logging` from 3.11.3 to 3.11.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-logging/releases">google-cloud-logging's
releases</a>.</em></p>
<blockquote>
<h2>v3.11.4</h2>
<h2><a
href="https://github.com/googleapis/python-logging/compare/v3.11.3...v3.11.4">3.11.4</a>
(2025-01-22)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Made <code>write_entries</code> raise <code>ValueError</code> on
<code>ParseError</code>s (<a
href="https://redirect.github.com/googleapis/python-logging/issues/958">#958</a>)
(<a
href="5309478c05">5309478</a>)</li>
<li>Require proto-plus &gt;= 1.25 for Python 3.13 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/955">#955</a>)
(<a
href="7baed8e968">7baed8e</a>)</li>
<li>Require proto-plus &gt;= 1.25 for Python 3.13 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/955">#955</a>)
(<a
href="002b1fcb39">002b1fc</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/python-logging/blob/main/CHANGELOG.md">google-cloud-logging's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/googleapis/python-logging/compare/v3.11.3...v3.11.4">3.11.4</a>
(2025-01-22)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Made <code>write_entries</code> raise <code>ValueError</code> on
<code>ParseError</code>s (<a
href="https://redirect.github.com/googleapis/python-logging/issues/958">#958</a>)
(<a
href="5309478c05">5309478</a>)</li>
<li>Require proto-plus &gt;= 1.25 for Python 3.13 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/955">#955</a>)
(<a
href="7baed8e968">7baed8e</a>)</li>
<li>Require proto-plus &gt;= 1.25 for Python 3.13 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/955">#955</a>)
(<a
href="002b1fcb39">002b1fc</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c47946fee0"><code>c47946f</code></a>
chore(main): release 3.11.4 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/956">#956</a>)</li>
<li><a
href="5309478c05"><code>5309478</code></a>
fix: Made <code>write_entries</code> raise <code>ValueError</code> on
<code>ParseError</code>s (<a
href="https://redirect.github.com/googleapis/python-logging/issues/958">#958</a>)</li>
<li><a
href="dfcce1f5ed"><code>dfcce1f</code></a>
chore(python): exclude .github/workflows/unittest.yml in renovate config
(<a
href="https://redirect.github.com/googleapis/python-logging/issues/959">#959</a>)</li>
<li><a
href="8c2c5a798a"><code>8c2c5a7</code></a>
chore(python): update dependencies in .kokoro/docker/docs (<a
href="https://redirect.github.com/googleapis/python-logging/issues/957">#957</a>)</li>
<li><a
href="7baed8e968"><code>7baed8e</code></a>
fix: require proto-plus &gt;= 1.25 for Python 3.13 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/955">#955</a>)</li>
<li><a
href="002b1fcb39"><code>002b1fc</code></a>
fix: require proto-plus &gt;= 1.25 for Python 3.13 (<a
href="https://redirect.github.com/googleapis/python-logging/issues/955">#955</a>)</li>
<li><a
href="439eaa5b2f"><code>439eaa5</code></a>
chore(python): update dependencies in .kokoro/docker/docs (<a
href="https://redirect.github.com/googleapis/python-logging/issues/954">#954</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/python-logging/compare/v3.11.3...v3.11.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `pydantic` from 2.10.5 to 2.10.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/releases">pydantic's
releases</a>.</em></p>
<blockquote>
<h2>v2.10.6 2025-01-23</h2>
<h2>What's Changed</h2>
<h3>Fixes</h3>
<ul>
<li>Fix JSON Schema reference collection with <code>'examples'</code>
keys by <a href="https://github.com/Viicos"><code>@​Viicos</code></a> in
<a
href="https://redirect.github.com/pydantic/pydantic/pull/11325">#11325</a></li>
<li>Fix url python serialization by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11331">#11331</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic/compare/v2.10.5...v2.10.6">https://github.com/pydantic/pydantic/compare/v2.10.5...v2.10.6</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/blob/main/HISTORY.md">pydantic's
changelog</a>.</em></p>
<blockquote>
<h2>v2.10.6 (2025-01-23)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.10.6">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Fixes</h4>
<ul>
<li>Fix JSON Schema reference collection with <code>'examples'</code>
keys by <a href="https://github.com/Viicos"><code>@​Viicos</code></a> in
<a
href="https://redirect.github.com/pydantic/pydantic/pull/11325">#11325</a></li>
<li>Fix url python serialization by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11331">#11331</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="df05e69a8a"><code>df05e69</code></a>
Bump version to v2.10.6 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11334">#11334</a>)</li>
<li><a
href="416082625a"><code>4160826</code></a>
Fix url python serialization (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11331">#11331</a>)</li>
<li><a
href="f94e842692"><code>f94e842</code></a>
Fix JSON Schema reference collection with
<code>&quot;examples&quot;</code> keys (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11325">#11325</a>)</li>
<li>See full diff in <a
href="https://github.com/pydantic/pydantic/compare/v2.10.5...v2.10.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `pytest-asyncio` from 0.25.2 to 0.25.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.25.3</h2>
<ul>
<li>Avoid errors in cleanup of async generators when event loop is
already closed <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1040">#1040</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7c501923b0"><code>7c50192</code></a>
fix: Avoid errors in cleanup of async generators when event loop is
already c...</li>
<li>See full diff in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.2...v0.25.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `supabase` from 2.11.0 to 2.13.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/releases">supabase's
releases</a>.</em></p>
<blockquote>
<h2>v2.13.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.12.0...v2.13.0">2.13.0</a>
(2025-02-04)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.2.0 to 2.3.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1049">#1049</a>)
(<a
href="2347401770">2347401</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.2 to 2.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1051">#1051</a>)
(<a
href="4a2bb9e73e">4a2bb9e</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.2 to 0.9.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1052">#1052</a>)
(<a
href="29fed38015">29fed38</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.11.1 to 0.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1050">#1050</a>)
(<a
href="8c5d48f51f">8c5d48f</a>)</li>
<li>update SupabaseAuthClient to use super instead of calling base class
(<a
href="https://redirect.github.com/supabase/supabase-py/issues/1045">#1045</a>)
(<a
href="3efb4a678b">3efb4a6</a>)</li>
</ul>
<h2>v2.12.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.11.0...v2.12.0">2.12.0</a>
(2025-01-24)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.1.0 to 2.2.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1037">#1037</a>)
(<a
href="0e5eed6f47">0e5eed6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.1 to 2.11.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1036">#1036</a>)
(<a
href="f7c87b9010">f7c87b9</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.0 to 0.9.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1029">#1029</a>)
(<a
href="f53f7ff58c">f53f7ff</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 0.19.1 to 0.19.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1040">#1040</a>)
(<a
href="c117a57a3f">c117a57</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.11.0 to 0.11.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1035">#1035</a>)
(<a
href="17942a2a6a">17942a2</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/blob/main/CHANGELOG.md">supabase's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.12.0...v2.13.0">2.13.0</a>
(2025-02-04)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.2.0 to 2.3.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1049">#1049</a>)
(<a
href="2347401770">2347401</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.2 to 2.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1051">#1051</a>)
(<a
href="4a2bb9e73e">4a2bb9e</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.2 to 0.9.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1052">#1052</a>)
(<a
href="29fed38015">29fed38</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.11.1 to 0.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1050">#1050</a>)
(<a
href="8c5d48f51f">8c5d48f</a>)</li>
<li>update SupabaseAuthClient to use super instead of calling base class
(<a
href="https://redirect.github.com/supabase/supabase-py/issues/1045">#1045</a>)
(<a
href="3efb4a678b">3efb4a6</a>)</li>
</ul>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.11.0...v2.12.0">2.12.0</a>
(2025-01-24)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.1.0 to 2.2.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1037">#1037</a>)
(<a
href="0e5eed6f47">0e5eed6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.1 to 2.11.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1036">#1036</a>)
(<a
href="f7c87b9010">f7c87b9</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.0 to 0.9.2 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1029">#1029</a>)
(<a
href="f53f7ff58c">f53f7ff</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 0.19.1 to 0.19.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1040">#1040</a>)
(<a
href="c117a57a3f">c117a57</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.11.0 to 0.11.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1035">#1035</a>)
(<a
href="17942a2a6a">17942a2</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c70802e55c"><code>c70802e</code></a>
chore(main): release 2.13.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1046">#1046</a>)</li>
<li><a
href="614cacc6a9"><code>614cacc</code></a>
chore(tests): increase coverage (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1053">#1053</a>)</li>
<li><a
href="29fed38015"><code>29fed38</code></a>
fix(functions): bump supafunc from 0.9.2 to 0.9.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1052">#1052</a>)</li>
<li><a
href="4a2bb9e73e"><code>4a2bb9e</code></a>
fix(auth): bump gotrue from 2.11.2 to 2.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1051">#1051</a>)</li>
<li><a
href="8c5d48f51f"><code>8c5d48f</code></a>
fix(storage): bump storage3 from 0.11.1 to 0.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1050">#1050</a>)</li>
<li><a
href="2347401770"><code>2347401</code></a>
feat(realtime): bump realtime from 2.2.0 to 2.3.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1049">#1049</a>)</li>
<li><a
href="4237977463"><code>4237977</code></a>
chore(deps-dev): bump black from 24.10.0 to 25.1.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1044">#1044</a>)</li>
<li><a
href="489043f03a"><code>489043f</code></a>
chore(deps-dev): bump pytest-asyncio from 0.25.2 to 0.25.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1043">#1043</a>)</li>
<li><a
href="b007da45c6"><code>b007da4</code></a>
chore(deps-dev): bump commitizen from 4.1.0 to 4.1.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1042">#1042</a>)</li>
<li><a
href="9a8713125e"><code>9a87131</code></a>
chore(ci): pipeline using same version of python for all tests (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1047">#1047</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/supabase/supabase-py/compare/v2.11.0...v2.13.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-05 22:39:04 +00:00
dependabot[bot]
f6e395f36e chore(frontend/deps-dev): bump the development-dependencies group in /autogpt_platform/frontend with 13 updates (#9401)
Bumps the development-dependencies group in /autogpt_platform/frontend
with 13 updates:

| Package | From | To |
| --- | --- | --- |
| [@playwright/test](https://github.com/microsoft/playwright) | `1.50.0`
| `1.50.1` |
|
[@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y)
| `8.5.2` | `8.5.3` |
|
[@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials)
| `8.5.2` | `8.5.3` |
|
[@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions)
| `8.5.2` | `8.5.3` |
|
[@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links)
| `8.5.2` | `8.5.3` |
|
[@storybook/addon-onboarding](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/onboarding)
| `8.5.2` | `8.5.3` |
|
[@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks)
| `8.5.2` | `8.5.3` |
|
[@storybook/nextjs](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/nextjs)
| `8.5.2` | `8.5.3` |
|
[@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react)
| `8.5.2` | `8.5.3` |
|
[@storybook/test](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/test)
| `8.5.2` | `8.5.3` |
|
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
| `22.10.10` | `22.13.0` |
| [chromatic](https://github.com/chromaui/chromatic-cli) | `11.25.1` |
`11.25.2` |
|
[storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli)
| `8.5.2` | `8.5.3` |

Updates `@playwright/test` from 1.50.0 to 1.50.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/microsoft/playwright/releases"><code>@​playwright/test</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v1.50.1</h2>
<h3>Highlights</h3>
<p><a
href="https://redirect.github.com/microsoft/playwright/issues/34483">microsoft/playwright#34483</a>
- [Feature]: single aria snapshot for different engines/browsers
<a
href="https://redirect.github.com/microsoft/playwright/issues/34497">microsoft/playwright#34497</a>
- [Bug]: Firefox not handling keepalive: true fetch requests
<a
href="https://redirect.github.com/microsoft/playwright/issues/34504">microsoft/playwright#34504</a>
- [Bug]: update snapshots not creating good diffs
<a
href="https://redirect.github.com/microsoft/playwright/issues/34507">microsoft/playwright#34507</a>
- [Bug]: snapshotPathTemplate doesnt work when multiple projects
<a
href="https://redirect.github.com/microsoft/playwright/issues/34462">microsoft/playwright#34462</a>
- [Bug]: updateSnapshots &quot;changed&quot; throws an error</p>
<h2>Browser Versions</h2>
<ul>
<li>Chromium 133.0.6943.16</li>
<li>Mozilla Firefox 134.0</li>
<li>WebKit 18.2</li>
</ul>
<p>This version was also tested against the following stable
channels:</p>
<ul>
<li>Google Chrome 132</li>
<li>Microsoft Edge 132</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dbc685ca98"><code>dbc685c</code></a>
chore: mark v1.50.1 (<a
href="https://redirect.github.com/microsoft/playwright/issues/34575">#34575</a>)</li>
<li><a
href="13d80f184e"><code>13d80f1</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34560">#34560</a>):
chore(docs): clarify connection method via BrowserType.c...</li>
<li><a
href="159210da82"><code>159210d</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34556">#34556</a>):
fix(toMatchAriaSnapshot): fail test run when updating mi...</li>
<li><a
href="fbad9f7ff7"><code>fbad9f7</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34537">#34537</a>):
feat: per-assertion snapshot path template in config (<a
href="https://redirect.github.com/microsoft/playwright/issues/3">#3</a>...</li>
<li><a
href="67313faaa7"><code>67313fa</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34550">#34550</a>):
roll follow-ups for .NET and Python</li>
<li><a
href="4b7794b37a"><code>4b7794b</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34544">#34544</a>):
fix(aria): disregard text area textContent</li>
<li><a
href="1efbedd3b3"><code>1efbedd</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34535">#34535</a>):
Revert &quot;Reapply &quot;fix(har timing): record connect timing
...</li>
<li><a
href="1e258e0894"><code>1e258e0</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34420">#34420</a>):
chore(deps): bump vite from 5.4.6 to 5.4.14 (<a
href="https://redirect.github.com/microsoft/playwright/issues/34539">#34539</a>)</li>
<li><a
href="7be4ef58de"><code>7be4ef5</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34522">#34522</a>):
test: fetch request through socks proxy over ipv4</li>
<li><a
href="7b3e590289"><code>7b3e590</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34530">#34530</a>):
fix(firefox): disable fetch keep-alive for now before a ...</li>
<li>Additional commits viewable in <a
href="https://github.com/microsoft/playwright/compare/v1.50.0...v1.50.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-a11y` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-a11y</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-a11y</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/a11y">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-essentials` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-essentials</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-essentials</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/essentials">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-interactions` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-interactions</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-interactions</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/interactions">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-links` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-links</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-links</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/links">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-onboarding` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-onboarding</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-onboarding</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/addons/onboarding">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/blocks` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/blocks</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/blocks</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/lib/blocks">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/nextjs` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/nextjs</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/nextjs</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/frameworks/nextjs">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/react` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/renderers/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/test` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/test</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/test</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/lib/test">compare
view</a></li>
</ul>
</details>
<br />

Updates `@types/node` from 22.10.10 to 22.13.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare
view</a></li>
</ul>
</details>
<br />

Updates `chromatic` from 11.25.1 to 11.25.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/chromaui/chromatic-cli/releases">chromatic's
releases</a>.</em></p>
<blockquote>
<h2>v11.25.2</h2>
<h4>🐛 Bug Fix</h4>
<ul>
<li>Add additional rspack builder entrypoint <a
href="https://redirect.github.com/chromaui/chromatic-cli/pull/1147">#1147</a>
(<a href="https://github.com/jmhobbs"><code>@​jmhobbs</code></a>)</li>
<li>Account for accessibility change counts in UI <a
href="https://redirect.github.com/chromaui/chromatic-cli/pull/1145">#1145</a>
(<a href="https://github.com/jmhobbs"><code>@​jmhobbs</code></a>)</li>
</ul>
<h4>Authors: 1</h4>
<ul>
<li>John Hobbs (<a
href="https://github.com/jmhobbs"><code>@​jmhobbs</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/chromaui/chromatic-cli/blob/main/CHANGELOG.md">chromatic's
changelog</a>.</em></p>
<blockquote>
<h1>v11.25.2 (Thu Jan 30 2025)</h1>
<h4>🐛 Bug Fix</h4>
<ul>
<li>Add additional rspack builder entrypoint <a
href="https://redirect.github.com/chromaui/chromatic-cli/pull/1147">#1147</a>
(<a href="https://github.com/jmhobbs"><code>@​jmhobbs</code></a>)</li>
<li>Account for accessibility change counts in UI <a
href="https://redirect.github.com/chromaui/chromatic-cli/pull/1145">#1145</a>
(<a href="https://github.com/jmhobbs"><code>@​jmhobbs</code></a>)</li>
</ul>
<h4>Authors: 1</h4>
<ul>
<li>John Hobbs (<a
href="https://github.com/jmhobbs"><code>@​jmhobbs</code></a>)</li>
</ul>
<hr />
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9f1324772c"><code>9f13247</code></a>
Bump version to: 11.25.2 [skip ci]</li>
<li><a
href="00daacc6ad"><code>00daacc</code></a>
Update CHANGELOG.md [skip ci]</li>
<li><a
href="9047fb72d6"><code>9047fb7</code></a>
Merge pull request <a
href="https://redirect.github.com/chromaui/chromatic-cli/issues/1147">#1147</a>
from chromaui/jmhobbs/cap-2681-chromatic-fails-to-tr...</li>
<li><a
href="2dfe359084"><code>2dfe359</code></a>
Add additional rspack builder entrypoint</li>
<li><a
href="71abbccabe"><code>71abbcc</code></a>
Merge pull request <a
href="https://redirect.github.com/chromaui/chromatic-cli/issues/1145">#1145</a>
from chromaui/jmhobbs/cap-2647-update-cli-messaging-...</li>
<li><a
href="7af2d57b81"><code>7af2d57</code></a>
Pluralize was/were on total changes.</li>
<li><a
href="33140257ec"><code>3314025</code></a>
Move to multiline format for changes.</li>
<li><a
href="28eaae5955"><code>28eaae5</code></a>
Account for accessibility change counts in UI</li>
<li>See full diff in <a
href="https://github.com/chromaui/chromatic-cli/compare/v11.25.1...v11.25.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `storybook` from 8.5.2 to 8.5.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases">storybook's
releases</a>.</em></p>
<blockquote>
<h2>v8.5.3</h2>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md">storybook's
changelog</a>.</em></p>
<blockquote>
<h2>8.5.3</h2>
<ul>
<li>Preview: Add <code>globals</code> to <code>extract()</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30415">#30415</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Vite: Fix add component UI invalidation - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30438">#30438</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="81d183f3ab"><code>81d183f</code></a>
Bump version from &quot;8.5.2&quot; to &quot;8.5.3&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.3/code/lib/cli">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-05 22:08:15 +00:00
dependabot[bot]
9c2d19cdb5 chore(frontend/deps): bump the production-dependencies group in /autogpt_platform/frontend with 4 updates (#9400)
Bumps the production-dependencies group in /autogpt_platform/frontend
with 4 updates:
[@sentry/nextjs](https://github.com/getsentry/sentry-javascript),
[@stripe/stripe-js](https://github.com/stripe/stripe-js),
[launchdarkly-react-client-sdk](https://github.com/launchdarkly/react-client-sdk)
and [recharts](https://github.com/recharts/recharts).

Updates `@sentry/nextjs` from 8.51.0 to 8.54.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/releases"><code>@​sentry/nextjs</code>'s
releases</a>.</em></p>
<blockquote>
<h2>8.54.0</h2>
<ul>
<li>feat(v8/deps): Upgrade all OpenTelemetry dependencies (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15098">#15098</a>)</li>
<li>fix(node/v8): Add compatibility layer for Prisma v5 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15210">#15210</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contribution!</p>
<h2>Bundle size 📦</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@​sentry/browser</code></td>
<td>23.3 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> - with treeshaking flags</td>
<td>23.17 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing)</td>
<td>35.9 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay)</td>
<td>73.27 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay) - with
treeshaking flags</td>
<td>66.71 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay with
Canvas)</td>
<td>77.57 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay, Feedback)</td>
<td>89.5 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Feedback)</td>
<td>39.51 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. sendFeedback)</td>
<td>27.91 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. FeedbackAsync)</td>
<td>32.71 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code></td>
<td>25.98 KB</td>
</tr>
<tr>
<td><code>@​sentry/react</code> (incl. Tracing)</td>
<td>38.71 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code></td>
<td>27.58 KB</td>
</tr>
<tr>
<td><code>@​sentry/vue</code> (incl. Tracing)</td>
<td>37.75 KB</td>
</tr>
<tr>
<td><code>@​sentry/svelte</code></td>
<td>23.46 KB</td>
</tr>
<tr>
<td>CDN Bundle</td>
<td>24.49 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing)</td>
<td>37.6 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay)</td>
<td>72.9 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback)</td>
<td>78.23 KB</td>
</tr>
<tr>
<td>CDN Bundle - uncompressed</td>
<td>71.92 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing) - uncompressed</td>
<td>111.52 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay) - uncompressed</td>
<td>225.78 KB</td>
</tr>
<tr>
<td>CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed</td>
<td>238.88 KB</td>
</tr>
<tr>
<td><code>@​sentry/nextjs</code> (client)</td>
<td>38.96 KB</td>
</tr>
<tr>
<td><code>@​sentry/sveltekit</code> (client)</td>
<td>36.4 KB</td>
</tr>
<tr>
<td><code>@​sentry/node</code></td>
<td>162.85 KB</td>
</tr>
<tr>
<td><code>@​sentry/node</code> - without tracing</td>
<td>99.14 KB</td>
</tr>
<tr>
<td><code>@​sentry/aws-serverless</code></td>
<td>131.23 KB</td>
</tr>
</tbody>
</table>
<h2>8.53.0</h2>
<ul>
<li>feat(v8/nuxt): Add <code>url</code> to
<code>SourcemapsUploadOptions</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15202">#15202</a>)</li>
<li>fix(v8/react): <code>fromLocation</code> can be undefined in
Tanstack Router Instrumentation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15237">#15237</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/tannerlinsley"><code>@​tannerlinsley</code></a>.
Thank you for your contribution!</p>
<h2>Bundle size 📦</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@​sentry/browser</code></td>
<td>23.3 KB</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/blob/8.54.0/CHANGELOG.md"><code>@​sentry/nextjs</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.54.0</h2>
<ul>
<li>feat(v8/deps): Upgrade all OpenTelemetry dependencies (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15098">#15098</a>)</li>
<li>fix(node/v8): Add compatibility layer for Prisma v5 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15210">#15210</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contribution!</p>
<h2>8.53.0</h2>
<ul>
<li>feat(v8/nuxt): Add <code>url</code> to
<code>SourcemapsUploadOptions</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15202">#15202</a>)</li>
<li>fix(v8/react): <code>fromLocation</code> can be undefined in
Tanstack Router Instrumentation (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15237">#15237</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/tannerlinsley"><code>@​tannerlinsley</code></a>.
Thank you for your contribution!</p>
<h2>8.52.1</h2>
<ul>
<li>fix(v8/nextjs): Fix nextjs build warning (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15226">#15226</a>)</li>
<li>ref(v8/browser): Add protocol attributes to resource spans <a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15224">#15224</a></li>
<li>ref(v8/core): Don't set <code>this.name</code> to
<code>new.target.prototype.constructor.name</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15222">#15222</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/Zen-cronic"><code>@​Zen-cronic</code></a>.
Thank you for your contribution!</p>
<h2>8.52.0</h2>
<h3>Important Changes</h3>
<ul>
<li><strong>feat(solidstart): Add <code>withSentry</code> wrapper for
SolidStart config (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15135">#15135</a>)</strong></li>
</ul>
<p>To enable the SolidStart SDK, wrap your SolidStart Config with
<code>withSentry</code>. The <code>sentrySolidStartVite</code> plugin is
now automatically
added by <code>withSentry</code> and you can pass the Sentry build-time
options like this:</p>
<pre lang="js"><code>import { defineConfig } from
'@solidjs/start/config';
import { withSentry } from '@sentry/solidstart';
<p>export default defineConfig(<br />
withSentry(<br />
{<br />
/* Your SolidStart config options... */<br />
},<br />
{<br />
// Options for setting up source maps<br />
org: process.env.SENTRY_ORG,<br />
project: process.env.SENTRY_PROJECT,<br />
authToken: process.env.SENTRY_AUTH_TOKEN,<br />
},<br />
),<br />
);<br />
</code></pre></p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e9a45fe6eb"><code>e9a45fe</code></a>
release: 8.54.0</li>
<li><a
href="ff4fb5ffed"><code>ff4fb5f</code></a>
meta(changelog): Update changelog for 8.54.0 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15261">#15261</a>)</li>
<li><a
href="b6a4a4a036"><code>b6a4a4a</code></a>
fix(node/v8): Add compatibility layer for Prisma v5 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15210">#15210</a>)</li>
<li><a
href="3673689441"><code>3673689</code></a>
feat(v8/deps): Upgrade all OpenTelemetry dependencies (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15098">#15098</a>)</li>
<li><a
href="13aadde725"><code>13aadde</code></a>
Merge branch 'release/8.53.0' into v8</li>
<li><a
href="3d8b132fda"><code>3d8b132</code></a>
release: 8.53.0</li>
<li><a
href="f08e6131da"><code>f08e613</code></a>
meta: Update Changelog for 8.53.0 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15243">#15243</a>)</li>
<li><a
href="ef4f210781"><code>ef4f210</code></a>
fix(v8/react): From location can be undefined in Tanstack Router
Instrumentat...</li>
<li><a
href="4df37594f6"><code>4df3759</code></a>
feat(v8/nuxt): Add <code>url</code> to
<code>SourcemapsUploadOptions</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15202">#15202</a>)</li>
<li><a
href="36bdc47676"><code>36bdc47</code></a>
Merge branch 'release/8.52.1' into v8</li>
<li>Additional commits viewable in <a
href="https://github.com/getsentry/sentry-javascript/compare/8.51.0...8.54.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@stripe/stripe-js` from 5.5.0 to 5.6.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/stripe/stripe-js/releases"><code>@​stripe/stripe-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v5.6.0</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h3>New features</h3>
<h3>Fixes</h3>
<ul>
<li>Fix runServerUpdate type (<a
href="https://redirect.github.com/stripe/stripe-js/issues/712">#712</a>)</li>
<li>Push release commit and tag before creating release (<a
href="https://redirect.github.com/stripe/stripe-js/issues/707">#707</a>)</li>
</ul>
<h3>Changed</h3>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="085deba188"><code>085deba</code></a>
v5.6.0</li>
<li><a
href="d337871030"><code>d337871</code></a>
Fix runServerUpdate type (<a
href="https://redirect.github.com/stripe/stripe-js/issues/712">#712</a>)</li>
<li><a
href="31aef3556c"><code>31aef35</code></a>
Push release commit and tag before creating release (<a
href="https://redirect.github.com/stripe/stripe-js/issues/707">#707</a>)</li>
<li><a
href="f93c985d67"><code>f93c985</code></a>
v5.5.0</li>
<li>See full diff in <a
href="https://github.com/stripe/stripe-js/compare/v5.5.0...v5.6.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `launchdarkly-react-client-sdk` from 3.6.0 to 3.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/launchdarkly/react-client-sdk/releases">launchdarkly-react-client-sdk's
releases</a>.</em></p>
<blockquote>
<h2>launchdarkly-react-client-sdk: v3.6.1</h2>
<h2><a
href="https://github.com/launchdarkly/react-client-sdk/compare/launchdarkly-react-client-sdk-v3.6.0...launchdarkly-react-client-sdk-v3.6.1">3.6.1</a>
(2025-01-30)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>update package.json to support react 19 (<a
href="https://redirect.github.com/launchdarkly/react-client-sdk/issues/341">#341</a>)
(<a
href="2c0fc335eb">2c0fc33</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/launchdarkly/react-client-sdk/blob/main/CHANGELOG.md">launchdarkly-react-client-sdk's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/launchdarkly/react-client-sdk/compare/launchdarkly-react-client-sdk-v3.6.0...launchdarkly-react-client-sdk-v3.6.1">3.6.1</a>
(2025-01-30)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>update package.json to support react 19 (<a
href="https://redirect.github.com/launchdarkly/react-client-sdk/issues/341">#341</a>)
(<a
href="2c0fc335eb">2c0fc33</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="090c8db0a2"><code>090c8db</code></a>
chore(main): release launchdarkly-react-client-sdk 3.6.1 (<a
href="https://redirect.github.com/launchdarkly/react-client-sdk/issues/344">#344</a>)</li>
<li><a
href="2c0fc335eb"><code>2c0fc33</code></a>
fix: update package.json to support react 19 (<a
href="https://redirect.github.com/launchdarkly/react-client-sdk/issues/341">#341</a>)</li>
<li>See full diff in <a
href="https://github.com/launchdarkly/react-client-sdk/compare/launchdarkly-react-client-sdk-v3.6.0...launchdarkly-react-client-sdk-v3.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `recharts` from 2.15.0 to 2.15.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/recharts/recharts/releases">recharts's
releases</a>.</em></p>
<blockquote>
<h2>v2.15.1</h2>
<h2>What's Changed</h2>
<p>Quick patch release, nothing crazy going on here.</p>
<p>In the meantime please help us test recharts 3.0 alpha <a
href="https://redirect.github.com/recharts/recharts/issues/5445">recharts/recharts#5445</a>
🚀</p>
<h4>Fix</h4>
<ul>
<li><code>Legend - Typescript</code>: add <code>dataKey</code> type to
legend formatter props by <a
href="https://github.com/lucasassisrosa"><code>@​lucasassisrosa</code></a>
in <a
href="https://redirect.github.com/recharts/recharts/pull/5511">recharts/recharts#5511</a>.
Fixes <a
href="https://redirect.github.com/recharts/recharts/issues/5508">recharts/recharts#5508</a></li>
</ul>
<h4>Chore</h4>
<ul>
<li>Make sure <code>react-smooth</code> version is up to date in
package.json for R19 support by <a
href="https://github.com/acomanescu"><code>@​acomanescu</code></a> in <a
href="https://redirect.github.com/recharts/recharts/pull/5422">recharts/recharts#5422</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/acomanescu"><code>@​acomanescu</code></a> made
their first contribution in <a
href="https://redirect.github.com/recharts/recharts/pull/5422">recharts/recharts#5422</a></li>
<li><a
href="https://github.com/lucasassisrosa"><code>@​lucasassisrosa</code></a>
made their first contribution in <a
href="https://redirect.github.com/recharts/recharts/pull/5511">recharts/recharts#5511</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/recharts/recharts/compare/v2.15.0...v2.15.1">https://github.com/recharts/recharts/compare/v2.15.0...v2.15.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3ecaab0e88"><code>3ecaab0</code></a>
2.15.1</li>
<li><a
href="786cda6f02"><code>786cda6</code></a>
feat: Add the dataKey type to legend formatter props (<a
href="https://redirect.github.com/recharts/recharts/issues/5511">#5511</a>)</li>
<li><a
href="a3cf0247f9"><code>a3cf024</code></a>
chore: update react-smooth version to support React 19 (<a
href="https://redirect.github.com/recharts/recharts/issues/5422">#5422</a>)</li>
<li>See full diff in <a
href="https://github.com/recharts/recharts/compare/v2.15.0...v2.15.1">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-05 22:07:52 +00:00
Aarushi
277a896a83 feat(platform/external-api): Enhance the output from the external API on agent output (#9430)
This PR does two main things: 

1) Fixes the nodes block to show the name of the pins, not the generic
word "output".
2) Addes an output block that shows the name and result of the agent
output blocks. This improves readability of the API.

### Changes 🏗️

1) Update nodes block to show the name of the input pin
2) Added an output block to show all the AgentOutputBlocks outputs
3) Added a status field on the agent graph


Example results:

```
{
    "execution_id": "ea6b12ac-36f5-4f19-bc94-0df36f028c29",
    "status": "COMPLETED",
    "nodes": [
        {
            "node_id": "83cd909d-ff35-43c2-bdc9-a2f5142bd145",
            "input": "what is the capital of australia?",
            "output": {
                "result": [
                    "what is the capital of australia?"
                ]
            }
        },
        {
            "node_id": "6bdf81fc-2d56-4e32-82d5-24f8c5645cb5",
            "input": {
                "model": "gpt-4o",
                "credentials": {
                    "id": "604d8e22-3e24-4451-93eb-b17a276d3b8c",
                    "title": "openai",
                    "provider": "openai",
                    "type": "api_key"
                },
                "prompt": "what is the capital of australia?"
            },
            "output": {
                "response": [
                    "The capital of Australia is Canberra."
                ],
                "prompt": [
                    "[{\"role\": \"user\", \"content\": \"what is the capital of australia?\"}]"
                ]
            }
        },
        {
            "node_id": "55aa132a-c298-4cb6-9afe-39a56e492ab6",
            "input": "The capital of Australia is Canberra.",
            "output": {
                "output": [
                    "The capital of Australia is Canberra."
                ],
                "name": [
                    "result"
                ]
            }
        }
    ],
    "output": [
        {
            "result": "The capital of Australia is Canberra."
        }
    ]
}
```

### Checklist 📋

#### For code changes:
Testing: 
Create an agent
Run it via the API
Fetch the results
2025-02-05 22:06:48 +00:00
dependabot[bot]
bd9c0d741a chore(backend/deps): bump the production-dependencies group across 1 directory with 5 updates (#9434)
Bumps the production-dependencies group with 5 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [e2b-code-interpreter](https://github.com/e2b-dev/code-interpreter) |
`1.0.4` | `1.0.5` |
| [fastapi](https://github.com/fastapi/fastapi) | `0.115.7` | `0.115.8`
|
| [groq](https://github.com/groq/groq-python) | `0.15.0` | `0.18.0` |
| [openai](https://github.com/openai/openai-python) | `1.60.2` |
`1.61.1` |
| [supabase](https://github.com/supabase/supabase-py) | `2.12.0` |
`2.13.0` |


Updates `e2b-code-interpreter` from 1.0.4 to 1.0.5
<details>
<summary>Commits</summary>
<ul>
<li><a
href="007e2e5ae1"><code>007e2e5</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/54">#54</a>
from e2b-dev/fix-bug-in-e2b-incompability</li>
<li><a
href="54935958aa"><code>5493595</code></a>
Add changeset</li>
<li><a
href="1b76bbe059"><code>1b76bbe</code></a>
Remove init method</li>
<li><a
href="bfa11701e7"><code>bfa1170</code></a>
[skip ci]Bump package manually</li>
<li><a
href="83f08213fb"><code>83f0821</code></a>
Skip on package.json change - it's just version bump</li>
<li><a
href="f14a2a5f6f"><code>f14a2a5</code></a>
Add to_dict() method in python SDK</li>
<li><a
href="daba22b9c7"><code>daba22b</code></a>
[skip ci] Release new versions</li>
<li><a
href="f8493025c2"><code>f849302</code></a>
Merge pull request <a
href="https://redirect.github.com/e2b-dev/code-interpreter/issues/53">#53</a>
from e2b-dev/update-r-to-44-e2b-1449</li>
<li><a
href="31aabd355a"><code>31aabd3</code></a>
Update Dockerfile</li>
<li><a
href="33ff495b17"><code>33ff495</code></a>
Add changeset</li>
<li>Additional commits viewable in <a
href="https://github.com/e2b-dev/code-interpreter/compare/@e2b/code-interpreter@1.0.4...@e2b/code-interpreter-python@1.0.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `fastapi` from 0.115.7 to 0.115.8
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/fastapi/fastapi/releases">fastapi's
releases</a>.</em></p>
<blockquote>
<h2>0.115.8</h2>
<h3>Fixes</h3>
<ul>
<li>🐛 Fix <code>OAuth2PasswordRequestForm</code> and
<code>OAuth2PasswordRequestFormStrict</code> fixed
<code>grant_type</code> &quot;password&quot; RegEx. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/9783">#9783</a>
by <a
href="https://github.com/skarfie123"><code>@​skarfie123</code></a>.</li>
</ul>
<h3>Refactors</h3>
<ul>
<li> Simplify tests for body_multiple_params . PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13237">#13237</a>
by <a
href="https://github.com/alejsdev"><code>@​alejsdev</code></a>.</li>
<li>♻️ Move duplicated code portion to a static method in the
<code>APIKeyBase</code> super class. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/3142">#3142</a>
by <a
href="https://github.com/ShahriyarR"><code>@​ShahriyarR</code></a>.</li>
<li> Simplify tests for request_files. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13182">#13182</a>
by <a
href="https://github.com/alejsdev"><code>@​alejsdev</code></a>.</li>
</ul>
<h3>Docs</h3>
<ul>
<li>📝 Change the word &quot;unwrap&quot; to &quot;unpack&quot; in
<code>docs/en/docs/tutorial/extra-models.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13061">#13061</a>
by <a
href="https://github.com/timothy-jeong"><code>@​timothy-jeong</code></a>.</li>
<li>📝 Update Request Body's <code>tutorial002</code> to deal with
<code>tax=0</code> case. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13230">#13230</a>
by <a href="https://github.com/togogh"><code>@​togogh</code></a>.</li>
<li>👥 Update FastAPI People - Experts. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13269">#13269</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Translations</h3>
<ul>
<li>🌐 Add Japanese translation for
<code>docs/ja/docs/environment-variables.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13226">#13226</a>
by <a
href="https://github.com/k94-ishi"><code>@​k94-ishi</code></a>.</li>
<li>🌐 Add Russian translation for
<code>docs/ru/docs/advanced/async-tests.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13227">#13227</a>
by <a
href="https://github.com/Rishat-F"><code>@​Rishat-F</code></a>.</li>
<li>🌐 Update Russian translation for
<code>docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md</code>.
PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13252">#13252</a>
by <a
href="https://github.com/Rishat-F"><code>@​Rishat-F</code></a>.</li>
<li>🌐 Add Russian translation for
<code>docs/ru/docs/tutorial/bigger-applications.md</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13154">#13154</a>
by <a href="https://github.com/alv2017"><code>@​alv2017</code></a>.</li>
</ul>
<h3>Internal</h3>
<ul>
<li>⬆️ Add support for Python 3.13. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13274">#13274</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>⬆️ Upgrade AnyIO max version for tests, new range:
<code>&gt;=3.2.1,&lt;5.0.0</code>. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13273">#13273</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>🔧 Update Sponsors badges. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13271">#13271</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>♻️ Fix <code>notify_translations.py</code> empty env var handling
for PR label events vs workflow_dispatch. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13272">#13272</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>♻️ Refactor and move <code>scripts/notify_translations.py</code>, no
need for a custom GitHub Action. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13270">#13270</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>🔨 Update FastAPI People Experts script, refactor and optimize data
fetching to handle rate limits. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13267">#13267</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>⬆ Bump pypa/gh-action-pypi-publish from 1.12.3 to 1.12.4. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/13251">#13251</a>
by <a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7128971f1d"><code>7128971</code></a>
🔖 Release version 0.115.8</li>
<li><a
href="55f8a446c7"><code>55f8a44</code></a>
📝 Update release notes</li>
<li><a
href="83ab6ac957"><code>83ab6ac</code></a>
📝 Change the word &quot;unwrap&quot; to &quot;unpack&quot; in
`docs/en/docs/tutorial/extra-models...</li>
<li><a
href="3d02a920ab"><code>3d02a92</code></a>
📝 Update release notes</li>
<li><a
href="1b00f8ae78"><code>1b00f8a</code></a>
 Simplify tests for body_multiple_params (<a
href="https://redirect.github.com/fastapi/fastapi/issues/13237">#13237</a>)</li>
<li><a
href="d97647fd57"><code>d97647f</code></a>
📝 Update release notes</li>
<li><a
href="9667ce87a9"><code>9667ce8</code></a>
📝 Update Request Body's <code>tutorial002</code> to deal with
<code>tax=0</code> case (<a
href="https://redirect.github.com/fastapi/fastapi/issues/13230">#13230</a>)</li>
<li><a
href="0541693bc7"><code>0541693</code></a>
📝 Update release notes</li>
<li><a
href="041b2e1c46"><code>041b2e1</code></a>
📝 Update release notes</li>
<li><a
href="30b270be9a"><code>30b270b</code></a>
♻️ Move duplicated code portion to a static method in the
<code>APIKeyBase</code> super ...</li>
<li>Additional commits viewable in <a
href="https://github.com/fastapi/fastapi/compare/0.115.7...0.115.8">compare
view</a></li>
</ul>
</details>
<br />

Updates `groq` from 0.15.0 to 0.18.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/releases">groq's
releases</a>.</em></p>
<blockquote>
<h2>v0.18.0</h2>
<h2>0.18.0 (2025-02-05)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.17.0...v0.18.0">v0.17.0...v0.18.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> Add batch API (<a
href="https://redirect.github.com/groq/groq-python/issues/191">#191</a>)
(<a
href="367a744f46">367a744</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bummp ruff dependency (<a
href="https://redirect.github.com/groq/groq-python/issues/190">#190</a>)
(<a
href="61678fc5fd">61678fc</a>)</li>
<li><strong>internal:</strong> change default timeout to an int (<a
href="https://redirect.github.com/groq/groq-python/issues/188">#188</a>)
(<a
href="348e152671">348e152</a>)</li>
</ul>
<h2>v0.17.0</h2>
<h2>0.17.0 (2025-02-03)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.16.0...v0.17.0">v0.16.0...v0.17.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/185">#185</a>)
(<a
href="e2373395cf">e237339</a>)</li>
</ul>
<h2>v0.16.0</h2>
<h2>0.16.0 (2025-01-29)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.15.0...v0.16.0">v0.15.0...v0.16.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/183">#183</a>)
(<a
href="a5cdbc5af7">a5cdbc5</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/177">#177</a>)
(<a
href="01e63041c8">01e6304</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/180">#180</a>)
(<a
href="5c8db1a979">5c8db1a</a>)</li>
<li><strong>internal:</strong> minor formatting changes (<a
href="https://redirect.github.com/groq/groq-python/issues/182">#182</a>)
(<a
href="2c4e409fe0">2c4e409</a>)</li>
<li><strong>internal:</strong> minor style changes (<a
href="https://redirect.github.com/groq/groq-python/issues/181">#181</a>)
(<a
href="77c752ab1a">77c752a</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>raw responses:</strong> fix duplicate <code>the</code> (<a
href="https://redirect.github.com/groq/groq-python/issues/179">#179</a>)
(<a
href="a28cbd863d">a28cbd8</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/blob/main/CHANGELOG.md">groq's
changelog</a>.</em></p>
<blockquote>
<h2>0.18.0 (2025-02-05)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.17.0...v0.18.0">v0.17.0...v0.18.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> Add batch API (<a
href="https://redirect.github.com/groq/groq-python/issues/191">#191</a>)
(<a
href="367a744f46">367a744</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bummp ruff dependency (<a
href="https://redirect.github.com/groq/groq-python/issues/190">#190</a>)
(<a
href="61678fc5fd">61678fc</a>)</li>
<li><strong>internal:</strong> change default timeout to an int (<a
href="https://redirect.github.com/groq/groq-python/issues/188">#188</a>)
(<a
href="348e152671">348e152</a>)</li>
</ul>
<h2>0.17.0 (2025-02-03)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.16.0...v0.17.0">v0.16.0...v0.17.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/185">#185</a>)
(<a
href="e2373395cf">e237339</a>)</li>
</ul>
<h2>0.16.0 (2025-01-29)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.15.0...v0.16.0">v0.15.0...v0.16.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/183">#183</a>)
(<a
href="a5cdbc5af7">a5cdbc5</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/177">#177</a>)
(<a
href="01e63041c8">01e6304</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/180">#180</a>)
(<a
href="5c8db1a979">5c8db1a</a>)</li>
<li><strong>internal:</strong> minor formatting changes (<a
href="https://redirect.github.com/groq/groq-python/issues/182">#182</a>)
(<a
href="2c4e409fe0">2c4e409</a>)</li>
<li><strong>internal:</strong> minor style changes (<a
href="https://redirect.github.com/groq/groq-python/issues/181">#181</a>)
(<a
href="77c752ab1a">77c752a</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>raw responses:</strong> fix duplicate <code>the</code> (<a
href="https://redirect.github.com/groq/groq-python/issues/179">#179</a>)
(<a
href="a28cbd863d">a28cbd8</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b74ce9e301"><code>b74ce9e</code></a>
release: 0.18.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/189">#189</a>)</li>
<li><a
href="3cee54eece"><code>3cee54e</code></a>
release: 0.17.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/186">#186</a>)</li>
<li><a
href="10566c3847"><code>10566c3</code></a>
release: 0.16.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/178">#178</a>)</li>
<li>See full diff in <a
href="https://github.com/groq/groq-python/compare/v0.15.0...v0.18.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `openai` from 1.60.2 to 1.61.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/openai/openai-python/releases">openai's
releases</a>.</em></p>
<blockquote>
<h2>v1.61.1</h2>
<h2>1.61.1 (2025-02-05)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.61.0...v1.61.1">v1.61.0...v1.61.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>api/types:</strong> correct audio duration &amp; role types
(<a
href="https://redirect.github.com/openai/openai-python/issues/2091">#2091</a>)
(<a
href="afcea4891f">afcea48</a>)</li>
<li><strong>cli/chat:</strong> only send params when set (<a
href="https://redirect.github.com/openai/openai-python/issues/2077">#2077</a>)
(<a
href="688b223d9a">688b223</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bummp ruff dependency (<a
href="https://redirect.github.com/openai/openai-python/issues/2080">#2080</a>)
(<a
href="b7a80b1994">b7a80b1</a>)</li>
<li><strong>internal:</strong> change default timeout to an int (<a
href="https://redirect.github.com/openai/openai-python/issues/2079">#2079</a>)
(<a
href="d3df1c6ca0">d3df1c6</a>)</li>
</ul>
<h2>v1.61.0</h2>
<h2>1.61.0 (2025-01-31)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.60.2...v1.61.0">v1.60.2...v1.61.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add o3-mini (<a
href="https://redirect.github.com/openai/openai-python/issues/2067">#2067</a>)
(<a
href="12b87a4a1e">12b87a4</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>types:</strong> correct metadata type + other fixes (<a
href="12b87a4a1e">12b87a4</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>helpers:</strong> section links (<a
href="ef8d3cce40">ef8d3cc</a>)</li>
<li><strong>types:</strong> fix Metadata types (<a
href="82d3156e74">82d3156</a>)</li>
<li>update api.md (<a
href="https://redirect.github.com/openai/openai-python/issues/2063">#2063</a>)
(<a
href="21964f00fb">21964f0</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>readme:</strong> current section links (<a
href="https://redirect.github.com/openai/openai-python/issues/2055">#2055</a>)
(<a
href="ef8d3cce40">ef8d3cc</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/openai/openai-python/blob/main/CHANGELOG.md">openai's
changelog</a>.</em></p>
<blockquote>
<h2>1.61.1 (2025-02-05)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.61.0...v1.61.1">v1.61.0...v1.61.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>api/types:</strong> correct audio duration &amp; role types
(<a
href="https://redirect.github.com/openai/openai-python/issues/2091">#2091</a>)
(<a
href="afcea4891f">afcea48</a>)</li>
<li><strong>cli/chat:</strong> only send params when set (<a
href="https://redirect.github.com/openai/openai-python/issues/2077">#2077</a>)
(<a
href="688b223d9a">688b223</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> bummp ruff dependency (<a
href="https://redirect.github.com/openai/openai-python/issues/2080">#2080</a>)
(<a
href="b7a80b1994">b7a80b1</a>)</li>
<li><strong>internal:</strong> change default timeout to an int (<a
href="https://redirect.github.com/openai/openai-python/issues/2079">#2079</a>)
(<a
href="d3df1c6ca0">d3df1c6</a>)</li>
</ul>
<h2>1.61.0 (2025-01-31)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.60.2...v1.61.0">v1.60.2...v1.61.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add o3-mini (<a
href="https://redirect.github.com/openai/openai-python/issues/2067">#2067</a>)
(<a
href="12b87a4a1e">12b87a4</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>types:</strong> correct metadata type + other fixes (<a
href="12b87a4a1e">12b87a4</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>helpers:</strong> section links (<a
href="ef8d3cce40">ef8d3cc</a>)</li>
<li><strong>types:</strong> fix Metadata types (<a
href="82d3156e74">82d3156</a>)</li>
<li>update api.md (<a
href="https://redirect.github.com/openai/openai-python/issues/2063">#2063</a>)
(<a
href="21964f00fb">21964f0</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>readme:</strong> current section links (<a
href="https://redirect.github.com/openai/openai-python/issues/2055">#2055</a>)
(<a
href="ef8d3cce40">ef8d3cc</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7193688e36"><code>7193688</code></a>
release: 1.61.1</li>
<li><a
href="f344db250a"><code>f344db2</code></a>
fix(api/types): correct audio duration &amp; role types (<a
href="https://redirect.github.com/openai/openai-python/issues/2091">#2091</a>)</li>
<li><a
href="6afde0dc85"><code>6afde0d</code></a>
chore(internal): bummp ruff dependency (<a
href="https://redirect.github.com/openai/openai-python/issues/2080">#2080</a>)</li>
<li><a
href="5a1a412b77"><code>5a1a412</code></a>
chore(internal): change default timeout to an int (<a
href="https://redirect.github.com/openai/openai-python/issues/2079">#2079</a>)</li>
<li><a
href="c27e8cc997"><code>c27e8cc</code></a>
fix(cli/chat): only send params when set (<a
href="https://redirect.github.com/openai/openai-python/issues/2077">#2077</a>)</li>
<li><a
href="7a6517d81e"><code>7a6517d</code></a>
release: 1.61.0</li>
<li><a
href="b56b357e60"><code>b56b357</code></a>
chore(types): fix Metadata types</li>
<li><a
href="fdd52476b5"><code>fdd5247</code></a>
feat(api): add o3-mini (<a
href="https://redirect.github.com/openai/openai-python/issues/2067">#2067</a>)</li>
<li><a
href="a99096823a"><code>a990968</code></a>
Revert &quot;fix(parsing): don't validate input tools in the
asynchronous `.parse(...</li>
<li><a
href="d779e40bc9"><code>d779e40</code></a>
chore: update api.md (<a
href="https://redirect.github.com/openai/openai-python/issues/2063">#2063</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/openai/openai-python/compare/v1.60.2...v1.61.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `supabase` from 2.12.0 to 2.13.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/releases">supabase's
releases</a>.</em></p>
<blockquote>
<h2>v2.13.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.12.0...v2.13.0">2.13.0</a>
(2025-02-04)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.2.0 to 2.3.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1049">#1049</a>)
(<a
href="2347401770">2347401</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.2 to 2.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1051">#1051</a>)
(<a
href="4a2bb9e73e">4a2bb9e</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.2 to 0.9.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1052">#1052</a>)
(<a
href="29fed38015">29fed38</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.11.1 to 0.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1050">#1050</a>)
(<a
href="8c5d48f51f">8c5d48f</a>)</li>
<li>update SupabaseAuthClient to use super instead of calling base class
(<a
href="https://redirect.github.com/supabase/supabase-py/issues/1045">#1045</a>)
(<a
href="3efb4a678b">3efb4a6</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/blob/main/CHANGELOG.md">supabase's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.12.0...v2.13.0">2.13.0</a>
(2025-02-04)</h2>
<h3>Features</h3>
<ul>
<li><strong>realtime:</strong> bump realtime from 2.2.0 to 2.3.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1049">#1049</a>)
(<a
href="2347401770">2347401</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.2 to 2.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1051">#1051</a>)
(<a
href="4a2bb9e73e">4a2bb9e</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.9.2 to 0.9.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1052">#1052</a>)
(<a
href="29fed38015">29fed38</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.11.1 to 0.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1050">#1050</a>)
(<a
href="8c5d48f51f">8c5d48f</a>)</li>
<li>update SupabaseAuthClient to use super instead of calling base class
(<a
href="https://redirect.github.com/supabase/supabase-py/issues/1045">#1045</a>)
(<a
href="3efb4a678b">3efb4a6</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c70802e55c"><code>c70802e</code></a>
chore(main): release 2.13.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1046">#1046</a>)</li>
<li><a
href="614cacc6a9"><code>614cacc</code></a>
chore(tests): increase coverage (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1053">#1053</a>)</li>
<li><a
href="29fed38015"><code>29fed38</code></a>
fix(functions): bump supafunc from 0.9.2 to 0.9.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1052">#1052</a>)</li>
<li><a
href="4a2bb9e73e"><code>4a2bb9e</code></a>
fix(auth): bump gotrue from 2.11.2 to 2.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1051">#1051</a>)</li>
<li><a
href="8c5d48f51f"><code>8c5d48f</code></a>
fix(storage): bump storage3 from 0.11.1 to 0.11.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1050">#1050</a>)</li>
<li><a
href="2347401770"><code>2347401</code></a>
feat(realtime): bump realtime from 2.2.0 to 2.3.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1049">#1049</a>)</li>
<li><a
href="4237977463"><code>4237977</code></a>
chore(deps-dev): bump black from 24.10.0 to 25.1.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1044">#1044</a>)</li>
<li><a
href="489043f03a"><code>489043f</code></a>
chore(deps-dev): bump pytest-asyncio from 0.25.2 to 0.25.3 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1043">#1043</a>)</li>
<li><a
href="b007da45c6"><code>b007da4</code></a>
chore(deps-dev): bump commitizen from 4.1.0 to 4.1.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1042">#1042</a>)</li>
<li><a
href="9a8713125e"><code>9a87131</code></a>
chore(ci): pipeline using same version of python for all tests (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1047">#1047</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/supabase/supabase-py/compare/v2.12.0...v2.13.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-02-05 21:52:03 +00:00
dependabot[bot]
c098a8d659 chore(frontend/deps): bump framer-motion from 11.16.0 to 12.0.11 in /autogpt_platform/frontend (#9403)
Bumps [framer-motion](https://github.com/motiondivision/motion) from
11.16.0 to 12.0.11.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/motiondivision/motion/blob/main/CHANGELOG.md">framer-motion's
changelog</a>.</em></p>
<blockquote>
<h2>[12.0.11] 2025-02-03</h2>
<h3>Fixed</h3>
<ul>
<li>Moving <code>updateSVGDimensions</code> to its own file to help with
tree-shaking.</li>
</ul>
<h2>[12.0.10] 2025-02-03</h2>
<h3>Fixed</h3>
<ul>
<li>Providing <code>MotionValue</code> to <code>motion</code> component
from <code>motion/react-client</code> entrypoint.</li>
</ul>
<h2>[12.0.9] 2025-02-03</h2>
<h3>Fixed</h3>
<ul>
<li>Removing React from bundle.</li>
</ul>
<h2>[12.0.8] 2025-02-03</h2>
<h3>Fixed</h3>
<ul>
<li>Infer type of <code>children</code> prop for
<code>motion.create</code>.</li>
</ul>
<h2>[12.0.7] 2025-01-28</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed SVG transform animations via <code>animate</code>.</li>
</ul>
<h2>[12.0.6] 2025-01-27</h2>
<h3>Fixed</h3>
<ul>
<li>Discard layout projection snapshots if 0x0.</li>
</ul>
<h2>[12.0.5] 2025-01-24</h2>
<h3>Fixed</h3>
<ul>
<li>Fix scale correction for CSS variables.</li>
</ul>
<h2>[12.0.4] 2025-01-24</h2>
<h3>Fixed</h3>
<ul>
<li>Add scale correction for CSS variables.</li>
</ul>
<h2>[12.0.3] 2025-01-23</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="ac626f5287"><code>ac626f5</code></a>
v12.0.11</li>
<li><a
href="f0172c942b"><code>f0172c9</code></a>
Latest</li>
<li><a
href="4855269501"><code>4855269</code></a>
Fixing type imports</li>
<li><a
href="553429c4c9"><code>553429c</code></a>
Latest</li>
<li><a
href="1b2e573055"><code>1b2e573</code></a>
v12.0.10</li>
<li><a
href="cfcfe30984"><code>cfcfe30</code></a>
Latest</li>
<li><a
href="97f7cb26fc"><code>97f7cb2</code></a>
Latest</li>
<li><a
href="cbeafb2aed"><code>cbeafb2</code></a>
v12.0.9</li>
<li><a
href="e70c1ba012"><code>e70c1ba</code></a>
Latest</li>
<li><a
href="90f083ed7b"><code>90f083e</code></a>
Latest (<a
href="https://redirect.github.com/motiondivision/motion/issues/3043">#3043</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/motiondivision/motion/compare/v11.16.0...v12.0.11">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=framer-motion&package-manager=npm_and_yarn&previous-version=11.16.0&new-version=12.0.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-05 21:47:28 +00:00
Zamil Majdy
1d30e401fe fix(backend): Charge user credits before its block execution (#9427)
### Changes 🏗️

Instead of letting the user to execution the block then break it
post-execution.
We can charge the user first and execute it afterward.
The trade-offs:
* We can't charge a block that is charged based on the execution time.
* We will also charge failed block executions.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-05 15:39:41 +00:00
Zamil Majdy
22536de71f feat(backend): Avoid multiple auto-top-ups within the same execution (#9426)
### Changes 🏗️

This PR makes auto-top-up more reliable:
* Auto top-up will not be executed more than once within a single
execution.
* Auto top-up will always be executed even if it was previously failing.
* Auto top-up will never be called twice or triggered when the balance
is more than the threshold, even in the concurrent block executions
set-up.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-05 15:39:23 +00:00
Zamil Majdy
0915879049 feat(backend): Allow promo coupon for credits top-up 2025-02-05 18:28:01 +07:00
Zamil Majdy
243122311c feat(frontend): Use USD value instead of cents credit value (#9423)
The use of credit points (equivalent to cents) can cause confussion, the
scope of this PR is removing the use of it in the UI and using USD value
instead.

### Changes 🏗️

Show US values on:
* credit page
* block cost
* balance button in the navbar

<img width="1440" alt="image"
src="https://github.com/user-attachments/assets/2b6a18b0-f89d-48bf-84bd-0ea6aa9182f7"
/>

<img width="1440" alt="image"
src="https://github.com/user-attachments/assets/7545b496-0e7c-49ea-afc1-a3d1fd3289fb"
/>



### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-05 10:40:57 +00:00
Krzysztof Czerwinski
533d120e98 feat(backend): Update llm models (#9390)
There are some models missing and their metadata is incorrect.

### Changes 🏗️

- Add models, update metadata and pricing.
- Add `max_output_tokens` to metadata, `None` indicates that max tokes
are unspecified in provider docs
- Added models:
  - OpenAI `o3-mini` and `o1`
  - Anthropic `claude-3-5-haiku-latest`
  - Groq `llama-3.3-70b-versatile`, `deepseek-r1-distill-llama-70b`
  - Ollama `llama3.3`
- Use the max output tokens from the provider that handles the least (so
it works for all) for OpenRouter models
- Use `max_output_tokens` and 4096 if `None` as a fallback
- Removed models (no longer working):
  - `gemma-7b-it`
  - `llama-3.1-70b-versatile`
  - `llama-3.1-405b-reasoning`
-  Rename llm enum name from `GEMINI_FLASH_1_5_8B` to `GEMINI_FLASH_1_5`

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

---------

Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-02-05 09:53:34 +00:00
Zamil Majdy
58cadeb3b9 feat(frontend): Fix wordings for auto top-up feature (#9419)
### Changes

Make the auto top-up wordings clearer: 

<img width="547" alt="Screenshot 2025-02-05 at 1 38 16 AM"
src="https://github.com/user-attachments/assets/9a902442-1815-4a38-af39-d7d4b0e120f0"
/>

<img width="555" alt="Screenshot 2025-02-05 at 1 40 29 AM"
src="https://github.com/user-attachments/assets/4c9c9cdc-2d73-45f2-8a8d-f7ae7f97541b"
/>
es 🏗️

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-05 10:27:10 +07:00
Zamil Majdy
9151211d2a fix(backend): Set the minimum auto top-up amount to 500 credits (#9418)
### Changes 🏗️

* Set the minimum auto top-up amount to 500.
* Add description on minimum and dollar value in the input box.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-04 17:01:33 +00:00
Zamil Majdy
8e68e20fef fix(backend): Fix return URL of billing portal when platform_base_url != frontend_base_url (#9417)
### Changes 🏗️

Fix return URL of billing portal when platform_base_url !=
frontend_base_url.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-04 16:15:29 +00:00
Nicholas Tindle
a7d545cd5d Merge branch 'master' into dev 2025-02-04 08:45:34 -06:00
Nicholas Tindle
0fbabe690a Merge branch 'master' into dev 2025-02-04 08:43:52 -06:00
Zamil Majdy
cdd2d5696c fix(backend): Fix doubly reported produced output (#9412)
https://github.com/Significant-Gravitas/AutoGPT/pull/9340/files#diff-1b278ebf10a9da0fb5030010222b3a6df2b05a5463cad428cd6c38a1541b0f73R210-R219
introduced a bug where the spend_credit and update_execution is called
inside the loop instead of by the end of the execution.

### Changes 🏗️

Untabbed the `spend_credit` and `update_execution` code outside the
loop.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-04 14:42:19 +00:00
Zamil Majdy
f44453be6e fix(backend): Fix transaction history listing on older transaction with no metadata 2025-02-03 16:33:18 +01:00
Nicholas Tindle
4302c5d60a feat: add screenshotone block (#9308)
I want to be able to screenshot things

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
Adds ScreenshotOne blocks with the ability to screenshot stuff

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Built agent with it

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-02-03 14:46:26 +00:00
Nicholas Tindle
53aea8908a fix(backend): fix missing agent object requirement (#9380) 2025-02-03 07:42:54 -06:00
Zamil Majdy
7b50e9bd77 fix(backend): Fix return url post top-up (#9392)
### Changes 🏗️

Fix return URL post-top-up, when FRONT_END_BASE_URL is used.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-03 12:31:33 +00:00
Zamil Majdy
3de982792e fix(backend): Fix broken top-up flow (#9391)
https://github.com/Significant-Gravitas/AutoGPT/pull/9296 caused these
errors:

<img width="440" alt="image"
src="https://github.com/user-attachments/assets/f100619b-1a4c-44fb-b961-e74210894a91"
/>

<img width="411" alt="image"
src="https://github.com/user-attachments/assets/0c1a8aff-b14f-4ea8-8ae9-b8928c8511cf"
/>



### Changes 🏗️

Removed customer email & return_url.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-03 10:58:48 +00:00
Krzysztof Czerwinski
74b8b45e0a fix(frontend): Fix typing for dict/dict[Any, Any] SchemaField (#9383)
Type system complains about this entry as impossible but this code path
is possible and without it some blocks are broken (e.g. `Step Through
Items`)

### Changes 🏗️

- Restore `case "object"` in `NodeGenericInputField` 
- Update `BlockIOKVSubSchema` type, so ts type checking doesn't complain

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-01 20:32:34 +00:00
Krzysztof Czerwinski
5bdd8c252e fix(frontend): Show feedback if user exists on sign up (#9389)
Currently if user tries to sign in with an email that is already
associated with a user they are redirected to login without any
feedback.

### Changes 🏗️

- Show feedback: "User with this email already exists" on signup when
user already registered
- Beta user waitlist message is shown otherwise as previously

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-02-01 15:15:17 +00:00
Muhammad Safi
8e33af6d99 Marketplace UI changes. (#9381)
<!-- Clearly explain the need for these changes: -->
- Consolidated PR #8967 and #8968.
- Fixed issues #9370 and #9371
- Fixed padding for StoreCard.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Muhammad Safi <muhammadsafi@Muhammads-MacBook-Pro.local>
Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-01-31 09:45:36 +00:00
Muhammad Safi
f481de173d Fixed font for Heading Issue #8971 (#9358)
<!-- Clearly explain the need for these changes: -->
- Changed the Font weight to semibold.
- Adjusted size to 48px.
- Fixed line-height to 54px.
### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Muhammad Safi <muhammadsafi@Muhammads-MacBook-Pro.local>
Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-01-30 20:53:30 +00:00
Ethan Lee
24306a16bd Update README.md (#9379)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

update backend readme to be more clear on where to run docker

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ x] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-30 18:04:58 +00:00
Abhimanyu Yadav
f5bf36cd97 feat(blocks) : Authentication for todoist block (#9319)
- resolves - #9303 

Implement OAuth authentication for Todoist with a basic authentication
mechanism for testing purposes. The basic authentication will be removed
in the next block pr.

> I’ve been using the official Python SDK for Todoist, called
todoist-api-python.
2025-01-30 16:09:00 +00:00
Zamil Majdy
1f83a8c61a feat(platform): Implement User Credit Transaction History (#9291)
<img width="1129" alt="image"
src="https://github.com/user-attachments/assets/94aab319-7755-413b-91e1-4ad1ba383b83"
/>


### Changes 🏗️

Add a transaction history table on the user credits page.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com>
2025-01-30 21:15:04 +07:00
Abhimanyu Yadav
a44c9333d3 feat(block) : Todoist rest api blocks (#9369)
- Resolves - #9303 and #9304
- Depends on - https://github.com/Significant-Gravitas/AutoGPT/pull/9319

### Blocks list

Block Name | What It Does | Manually Tested
-- | -- | --
Todoist Create Label | Creates a new label in Todoist | 
Todoist List Labels | Retrieves all personal labels from Todoist | 
Todoist Get Label | Retrieves a specific label by ID | 
Todoist Create Task | Creates a new task in Todoist | 
Todoist Get Tasks | Retrieves active tasks from Todoist | 
Todoist Update Task | Updates an existing task | 
Todoist Close Task | Completes/closes a task | 
Todoist Reopen Task | Reopens a completed task | 
Todoist Delete Task | Permanently deletes a task | 
Todoist List Projects | Retrieves all projects from Todoist | 
Todoist Create Project | Creates a new project in Todoist | 
Todoist Get Project | Retrieves details for a specific project | 
Todoist Update Project | Updates an existing project | 
Todoist Delete Project | Deletes a project and its contents | 
Todoist List Collaborators | Retrieves collaborators on a project | 
Todoist List Sections | Retrieves sections from Todoist | 
Todoist Get Section | Retrieves details for a specific section | 
Todoist Delete Section | Deletes a section and its tasks | 
Todoist Create Comment | Creates a new comment on a task or project | 
Todoist Get Comments | Retrieves all comments for a task or project | 
Todoist Get Comment | Retrieves a specific comment by ID | 
Todoist Update Comment | Updates an existing comment | 
Todoist Delete Comment | Deletes a comment | 

> I’ve only created action blocks in Todoist because webhooks can only
be manually created [we can't do it programatically right now]. I’ve
already emailed Todoist for help, but they haven’t replied yet. Once I
receive a reply, I’ll create a pull request for webhook triggers in
Todoist.
2025-01-30 13:33:29 +00:00
Krzysztof Czerwinski
bd27ce5f26 fix(frontend): Center reset password page (#9377)
### Changes 🏗️

- Add `div` to recenter page elements

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-30 12:30:59 +00:00
Pratim Sadhu
e82df96e56 Fix: Allow further zooming out in the builder (#9325) (#9368)
<!-- Clearly explain the need for these changes: -->
The current minimum zoom level restricts zooming out fully. I reduced
the minZoom level to allow more flexible zooming out for users.

### Changes 🏗️
Reduced minZoom from 0.2 to 0.1 in the ReactFlow component to allow
further zooming out.

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ x ] I have clearly listed my changes in the PR description
- [ x ] I have made a test plan
- [ x ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [ x ] Tested with different elements and zoom ranges to confirm its a
smooth transition
- [ x ] Checked that canvas and all nodes remain unchanged and
interactive

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-01-30 09:51:56 +00:00
Nicholas Tindle
b03e3e47a2 feat(blocks): add text replace block (#9366)
<!-- Clearly explain the need for these changes: -->
User in discord requested the replace text block

### Changes 🏗️
- Adds replace text block
<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Passed unit tests

Co-authored-by: Bently <tomnoon9@gmail.com>
2025-01-30 09:33:59 +00:00
dependabot[bot]
a4b962462c chore(backend/deps): bump the production-dependencies group across 1 directory with 9 updates (#9364)
Bumps the production-dependencies group with 9 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [anthropic](https://github.com/anthropics/anthropic-sdk-python) |
`0.40.0` | `0.45.2` |
|
[google-api-python-client](https://github.com/googleapis/google-api-python-client)
| `2.159.0` | `2.160.0` |
| [groq](https://github.com/groq/groq-python) | `0.13.1` | `0.15.0` |
| [openai](https://github.com/openai/openai-python) | `1.60.0` |
`1.60.2` |
| [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) |
`0.25.2` | `0.25.3` |
| [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.19.2` |
`2.20.0` |
| [stripe](https://github.com/stripe/stripe-python) | `11.4.1` |
`11.5.0` |
| [supabase](https://github.com/supabase/supabase-py) | `2.11.0` |
`2.12.0` |
| [mem0ai](https://github.com/mem0ai/mem0) | `0.1.44` | `0.1.48` |


Updates `anthropic` from 0.40.0 to 0.45.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/releases">anthropic's
releases</a>.</em></p>
<blockquote>
<h2>v0.45.2</h2>
<h2>0.45.2 (2025-01-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.1...v0.45.2">v0.45.1...v0.45.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>streaming:</strong> avoid invalid deser type error (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/845">#845</a>)
(<a
href="72a2585680">72a2585</a>)</li>
</ul>
<h2>v0.45.1</h2>
<h2>0.45.1 (2025-01-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.0...v0.45.1">v0.45.0...v0.45.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>streaming:</strong> accumulate citations (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/844">#844</a>)
(<a
href="e665f2fefd">e665f2f</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>docs:</strong> updates (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/841">#841</a>)
(<a
href="fb10a7d658">fb10a7d</a>)</li>
</ul>
<h2>v0.45.0</h2>
<h2>0.45.0 (2025-01-23)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.44.0...v0.45.0">v0.44.0...v0.45.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add citations (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/839">#839</a>)
(<a
href="2ec74b6ff1">2ec74b6</a>)</li>
<li><strong>client:</strong> support results endpoint (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/835">#835</a>)
(<a
href="5dd88bf2d2">5dd88bf</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> minor formatting changes (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/838">#838</a>)
(<a
href="31eb826deb">31eb826</a>)</li>
</ul>
<h2>v0.44.0</h2>
<h2>0.44.0 (2025-01-21)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.43.1...v0.44.0">v0.43.1...v0.44.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>streaming:</strong> add request_id getter (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/831">#831</a>)
(<a
href="fb397e0851">fb397e0</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/anthropics/anthropic-sdk-python/blob/main/CHANGELOG.md">anthropic's
changelog</a>.</em></p>
<blockquote>
<h2>0.45.2 (2025-01-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.1...v0.45.2">v0.45.1...v0.45.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>streaming:</strong> avoid invalid deser type error (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/845">#845</a>)
(<a
href="72a2585680">72a2585</a>)</li>
</ul>
<h2>0.45.1 (2025-01-27)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.45.0...v0.45.1">v0.45.0...v0.45.1</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>streaming:</strong> accumulate citations (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/844">#844</a>)
(<a
href="e665f2fefd">e665f2f</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>docs:</strong> updates (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/841">#841</a>)
(<a
href="fb10a7d658">fb10a7d</a>)</li>
</ul>
<h2>0.45.0 (2025-01-23)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.44.0...v0.45.0">v0.44.0...v0.45.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> add citations (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/839">#839</a>)
(<a
href="2ec74b6ff1">2ec74b6</a>)</li>
<li><strong>client:</strong> support results endpoint (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/835">#835</a>)
(<a
href="5dd88bf2d2">5dd88bf</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> minor formatting changes (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/838">#838</a>)
(<a
href="31eb826deb">31eb826</a>)</li>
</ul>
<h2>0.44.0 (2025-01-21)</h2>
<p>Full Changelog: <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.43.1...v0.44.0">v0.43.1...v0.44.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>streaming:</strong> add request_id getter (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/831">#831</a>)
(<a
href="fb397e0851">fb397e0</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>tests:</strong> make test_get_platform less flaky (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/830">#830</a>)
(<a
href="f2c10cae0c">f2c10ca</a>)</li>
</ul>
<h3>Chores</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0f9ccca8e2"><code>0f9ccca</code></a>
release: 0.45.2</li>
<li><a
href="37acfbcda5"><code>37acfbc</code></a>
fix(streaming): avoid invalid deser type error (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/845">#845</a>)</li>
<li><a
href="d0f98a4e6b"><code>d0f98a4</code></a>
release: 0.45.1</li>
<li><a
href="872c614851"><code>872c614</code></a>
fix(streaming): accumulate citations (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/844">#844</a>)</li>
<li><a
href="14bf8fe88f"><code>14bf8fe</code></a>
chore(docs): updates (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/841">#841</a>)</li>
<li><a
href="c5102baffb"><code>c5102ba</code></a>
release: 0.45.0</li>
<li><a
href="67aa83e5d5"><code>67aa83e</code></a>
feat(api): add citations (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/839">#839</a>)</li>
<li><a
href="bb1f52bfba"><code>bb1f52b</code></a>
chore(internal): minor formatting changes (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/838">#838</a>)</li>
<li><a
href="4b9140284b"><code>4b91402</code></a>
feat(client): support results endpoint (<a
href="https://redirect.github.com/anthropics/anthropic-sdk-python/issues/835">#835</a>)</li>
<li><a
href="d212ec9f6d"><code>d212ec9</code></a>
release: 0.44.0</li>
<li>Additional commits viewable in <a
href="https://github.com/anthropics/anthropic-sdk-python/compare/v0.40.0...v0.45.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-api-python-client` from 2.159.0 to 2.160.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's
releases</a>.</em></p>
<blockquote>
<h2>v2.160.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.159.0...v2.160.0">2.160.0</a>
(2025-01-21)</h2>
<h3>Features</h3>
<ul>
<li><strong>accesscontextmanager:</strong> Update the api <a
href="8b40ee6938</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>adsenseplatform:</strong> Update the api <a
href="04355c7c7c</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>aiplatform:</strong> Update the api <a
href="24228d4886</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>analyticsadmin:</strong> Update the api <a
href="dff2a84a82</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>analyticshub:</strong> Update the api <a
href="0208b0b028</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>androidenterprise:</strong> Update the api <a
href="b7865bd3ff</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>classroom:</strong> Update the api <a
href="ef72b5f7f9</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>cloudbuild:</strong> Update the api <a
href="41e76d1b7e</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>compute:</strong> Update the api <a
href="48c508dffa</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>dialogflow:</strong> Update the api <a
href="6c3ff85115</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>discoveryengine:</strong> Update the api <a
href="9afd49fbbf</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>displayvideo:</strong> Update the api <a
href="63b01f3147</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>file:</strong> Update the api <a
href="e7bf3e1cc7</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>gkehub:</strong> Update the api <a
href="aa81a39a6f</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>integrations:</strong> Update the api <a
href="da21dd8beb</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>merchantapi:</strong> Update the api <a
href="c66e25ffad</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>migrationcenter:</strong> Update the api <a
href="06c1759266</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>monitoring:</strong> Update the api <a
href="6d1dc83375</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>netapp:</strong> Update the api <a
href="628b723392</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>networkmanagement:</strong> Update the api <a
href="45d70c19e9</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>redis:</strong> Update the api <a
href="a866933256</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>spanner:</strong> Update the api <a
href="9540ac50fc</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
<li><strong>websecurityscanner:</strong> Update the api <a
href="5eae43739b</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>secretmanager:</strong> Update the api <a
href="477de50ccc</a>
(<a
href="165d3b5ad0">165d3b5</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6ba5c06d12"><code>6ba5c06</code></a>
chore(main): release 2.160.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2552">#2552</a>)</li>
<li><a
href="165d3b5ad0"><code>165d3b5</code></a>
chore: Update discovery artifacts (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2551">#2551</a>)</li>
<li><a
href="f4b3014212"><code>f4b3014</code></a>
chore(python): exclude .github/workflows/unittest.yml in renovate config
(<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2546">#2546</a>)</li>
<li>See full diff in <a
href="https://github.com/googleapis/google-api-python-client/compare/v2.159.0...v2.160.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `groq` from 0.13.1 to 0.15.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/releases">groq's
releases</a>.</em></p>
<blockquote>
<h2>v0.15.0</h2>
<h2>0.15.0 (2025-01-11)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.14.0...v0.15.0">v0.14.0...v0.15.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/175">#175</a>)
(<a
href="61cffbc78a">61cffbc</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>correctly handle deserialising <code>cls</code> fields (<a
href="https://redirect.github.com/groq/groq-python/issues/174">#174</a>)
(<a
href="0b2e997ce4">0b2e997</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/172">#172</a>)
(<a
href="d6ecadaa24">d6ecada</a>)</li>
</ul>
<h2>v0.14.0</h2>
<h2>0.14.0 (2025-01-09)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.13.1...v0.14.0">v0.13.1...v0.14.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/163">#163</a>)
(<a
href="43a7a5b048">43a7a5b</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/167">#167</a>)
(<a
href="5016206e46">5016206</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/170">#170</a>)
(<a
href="2b35e952e1">2b35e95</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>client:</strong> only call .close() when needed (<a
href="https://redirect.github.com/groq/groq-python/issues/169">#169</a>)
(<a
href="6a0ec576de">6a0ec57</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li>add missing isclass check (<a
href="https://redirect.github.com/groq/groq-python/issues/166">#166</a>)
(<a
href="9cb1e72737">9cb1e72</a>)</li>
<li><strong>internal:</strong> bump httpx dependency (<a
href="https://redirect.github.com/groq/groq-python/issues/168">#168</a>)
(<a
href="c260ae969c">c260ae9</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/158">#158</a>)
(<a
href="85b5765b2b">85b5765</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/160">#160</a>)
(<a
href="8b87c4d657">8b87c4d</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/164">#164</a>)
(<a
href="d7b6be5f4b">d7b6be5</a>)</li>
<li><strong>internal:</strong> fix some typos (<a
href="https://redirect.github.com/groq/groq-python/issues/162">#162</a>)
(<a
href="32482ae691">32482ae</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>readme:</strong> example snippet for client context manager
(<a
href="https://redirect.github.com/groq/groq-python/issues/161">#161</a>)
(<a
href="b7bfd15768">b7bfd15</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/groq/groq-python/blob/main/CHANGELOG.md">groq's
changelog</a>.</em></p>
<blockquote>
<h2>0.15.0 (2025-01-11)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.14.0...v0.15.0">v0.14.0...v0.15.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/175">#175</a>)
(<a
href="61cffbc78a">61cffbc</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>correctly handle deserialising <code>cls</code> fields (<a
href="https://redirect.github.com/groq/groq-python/issues/174">#174</a>)
(<a
href="0b2e997ce4">0b2e997</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/172">#172</a>)
(<a
href="d6ecadaa24">d6ecada</a>)</li>
</ul>
<h2>0.14.0 (2025-01-09)</h2>
<p>Full Changelog: <a
href="https://github.com/groq/groq-python/compare/v0.13.1...v0.14.0">v0.13.1...v0.14.0</a></p>
<h3>Features</h3>
<ul>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/163">#163</a>)
(<a
href="43a7a5b048">43a7a5b</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/167">#167</a>)
(<a
href="5016206e46">5016206</a>)</li>
<li><strong>api:</strong> api update (<a
href="https://redirect.github.com/groq/groq-python/issues/170">#170</a>)
(<a
href="2b35e952e1">2b35e95</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>client:</strong> only call .close() when needed (<a
href="https://redirect.github.com/groq/groq-python/issues/169">#169</a>)
(<a
href="6a0ec576de">6a0ec57</a>)</li>
</ul>
<h3>Chores</h3>
<ul>
<li>add missing isclass check (<a
href="https://redirect.github.com/groq/groq-python/issues/166">#166</a>)
(<a
href="9cb1e72737">9cb1e72</a>)</li>
<li><strong>internal:</strong> bump httpx dependency (<a
href="https://redirect.github.com/groq/groq-python/issues/168">#168</a>)
(<a
href="c260ae969c">c260ae9</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/158">#158</a>)
(<a
href="85b5765b2b">85b5765</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/160">#160</a>)
(<a
href="8b87c4d657">8b87c4d</a>)</li>
<li><strong>internal:</strong> codegen related update (<a
href="https://redirect.github.com/groq/groq-python/issues/164">#164</a>)
(<a
href="d7b6be5f4b">d7b6be5</a>)</li>
<li><strong>internal:</strong> fix some typos (<a
href="https://redirect.github.com/groq/groq-python/issues/162">#162</a>)
(<a
href="32482ae691">32482ae</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>readme:</strong> example snippet for client context manager
(<a
href="https://redirect.github.com/groq/groq-python/issues/161">#161</a>)
(<a
href="b7bfd15768">b7bfd15</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2b91340106"><code>2b91340</code></a>
release: 0.15.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/173">#173</a>)</li>
<li><a
href="f6e2c46aa4"><code>f6e2c46</code></a>
release: 0.14.0 (<a
href="https://redirect.github.com/groq/groq-python/issues/159">#159</a>)</li>
<li>See full diff in <a
href="https://github.com/groq/groq-python/compare/v0.13.1...v0.15.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `openai` from 1.60.0 to 1.60.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/openai/openai-python/releases">openai's
releases</a>.</em></p>
<blockquote>
<h2>v1.60.2</h2>
<h2>1.60.2 (2025-01-27)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.60.1...v1.60.2">v1.60.1...v1.60.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>parsing:</strong> don't validate input tools in the
asynchronous <code>.parse()</code> method (<a
href="6fcfe73cd3">6fcfe73</a>)</li>
</ul>
<h2>v1.60.1</h2>
<h2>1.60.1 (2025-01-24)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.60.0...v1.60.1">v1.60.0...v1.60.1</a></p>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> minor formatting changes (<a
href="https://redirect.github.com/openai/openai-python/issues/2050">#2050</a>)
(<a
href="9c44192be5">9c44192</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>examples/azure:</strong> add async snippet (<a
href="https://redirect.github.com/openai/openai-python/issues/1787">#1787</a>)
(<a
href="f60eda1c1e">f60eda1</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/openai/openai-python/blob/main/CHANGELOG.md">openai's
changelog</a>.</em></p>
<blockquote>
<h2>1.60.2 (2025-01-27)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.60.1...v1.60.2">v1.60.1...v1.60.2</a></p>
<h3>Bug Fixes</h3>
<ul>
<li><strong>parsing:</strong> don't validate input tools in the
asynchronous <code>.parse()</code> method (<a
href="6fcfe73cd3">6fcfe73</a>)</li>
</ul>
<h2>1.60.1 (2025-01-24)</h2>
<p>Full Changelog: <a
href="https://github.com/openai/openai-python/compare/v1.60.0...v1.60.1">v1.60.0...v1.60.1</a></p>
<h3>Chores</h3>
<ul>
<li><strong>internal:</strong> minor formatting changes (<a
href="https://redirect.github.com/openai/openai-python/issues/2050">#2050</a>)
(<a
href="9c44192be5">9c44192</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li><strong>examples/azure:</strong> add async snippet (<a
href="https://redirect.github.com/openai/openai-python/issues/1787">#1787</a>)
(<a
href="f60eda1c1e">f60eda1</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d16e6edde5"><code>d16e6ed</code></a>
release: 1.60.2</li>
<li><a
href="257d79e8a0"><code>257d79e</code></a>
fix(parsing): don't validate input tools in the asynchronous
<code>.parse()</code> method</li>
<li><a
href="b95be16e7c"><code>b95be16</code></a>
release: 1.60.1</li>
<li><a
href="27d0e67b1d"><code>27d0e67</code></a>
chore(internal): minor formatting changes (<a
href="https://redirect.github.com/openai/openai-python/issues/2050">#2050</a>)</li>
<li><a
href="abc5459c75"><code>abc5459</code></a>
docs(examples/azure): add async snippet (<a
href="https://redirect.github.com/openai/openai-python/issues/1787">#1787</a>)</li>
<li>See full diff in <a
href="https://github.com/openai/openai-python/compare/v1.60.0...v1.60.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `pytest-asyncio` from 0.25.2 to 0.25.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.25.3</h2>
<ul>
<li>Avoid errors in cleanup of async generators when event loop is
already closed <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1040">#1040</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7c501923b0"><code>7c50192</code></a>
fix: Avoid errors in cleanup of async generators when event loop is
already c...</li>
<li>See full diff in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.2...v0.25.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `sentry-sdk` from 2.19.2 to 2.20.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-python/releases">sentry-sdk's
releases</a>.</em></p>
<blockquote>
<h2>2.20.0</h2>
<ul>
<li>
<p><strong>New integration:</strong> Add <a
href="https://typer.tiangolo.com/">Typer</a> integration (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3869">#3869</a>)
by <a
href="https://github.com/patrick91"><code>@​patrick91</code></a></p>
<p>For more information, see the documentation for the <a
href="https://docs.sentry.io/platforms/python/integrations/typer/">TyperIntegration</a>.</p>
</li>
<li>
<p><strong>New integration:</strong> Add <a
href="https://www.getunleash.io/">Unleash</a> feature flagging
integration (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3888">#3888</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
<p>For more information, see the documentation for the <a
href="https://docs.sentry.io/platforms/python/integrations/unleash/">UnleashIntegration</a>.</p>
</li>
<li>
<p>Add custom tracking of feature flag evaluations (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3860">#3860</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
</li>
<li>
<p>Feature Flags: Register LD hook in setup instead of init, and don't
check for initialization (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3890">#3890</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
</li>
<li>
<p>Feature Flags: Moved adding of <code>flags</code> context into Scope
(<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3917">#3917</a>)
by <a
href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p>
</li>
<li>
<p>Create a separate group for feature flag test suites (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3911">#3911</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Fix flaky LaunchDarkly tests (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3896">#3896</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
</li>
<li>
<p>Fix LRU cache copying (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3883">#3883</a>)
by <a href="https://github.com/ffelixg"><code>@​ffelixg</code></a></p>
</li>
<li>
<p>Fix cache pollution from mutable reference (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3887">#3887</a>)
by <a
href="https://github.com/cmanallen"><code>@​cmanallen</code></a></p>
</li>
<li>
<p>Centralize minimum version checking (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3910">#3910</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Support SparkIntegration activation after SparkContext created (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3411">#3411</a>)
by <a
href="https://github.com/seyoon-lim"><code>@​seyoon-lim</code></a></p>
</li>
<li>
<p>Preserve ARQ enqueue_job <strong>kwdefaults</strong> after patching
(<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3903">#3903</a>)
by <a href="https://github.com/danmr"><code>@​danmr</code></a></p>
</li>
<li>
<p>Add Github workflow to comment on issues when a fix was released (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3866">#3866</a>)
by <a
href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p>
</li>
<li>
<p>Update test matrix for Sanic (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3904">#3904</a>)
by <a
href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p>
</li>
<li>
<p>Rename scripts (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3885">#3885</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Fix CI (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3878">#3878</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Treat <code>potel-base</code> as release branch in CI (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3912">#3912</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>build(deps): bump actions/create-github-app-token from 1.11.0 to
1.11.1 (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3893">#3893</a>)
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></p>
</li>
<li>
<p>build(deps): bump codecov/codecov-action from 5.0.7 to 5.1.1 (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3867">#3867</a>)
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></p>
</li>
<li>
<p>build(deps): bump codecov/codecov-action from 5.1.1 to 5.1.2 (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3892">#3892</a>)
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md">sentry-sdk's
changelog</a>.</em></p>
<blockquote>
<h2>2.20.0</h2>
<ul>
<li>
<p><strong>New integration:</strong> Add <a
href="https://typer.tiangolo.com/">Typer</a> integration (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3869">#3869</a>)
by <a
href="https://github.com/patrick91"><code>@​patrick91</code></a></p>
<p>For more information, see the documentation for the <a
href="https://docs.sentry.io/platforms/python/integrations/typer/">TyperIntegration</a>.</p>
</li>
<li>
<p><strong>New integration:</strong> Add <a
href="https://www.getunleash.io/">Unleash</a> feature flagging
integration (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3888">#3888</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
<p>For more information, see the documentation for the <a
href="https://docs.sentry.io/platforms/python/integrations/unleash/">UnleashIntegration</a>.</p>
</li>
<li>
<p>Add custom tracking of feature flag evaluations (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3860">#3860</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
</li>
<li>
<p>Feature Flags: Register LD hook in setup instead of init, and don't
check for initialization (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3890">#3890</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
</li>
<li>
<p>Feature Flags: Moved adding of <code>flags</code> context into Scope
(<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3917">#3917</a>)
by <a
href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p>
</li>
<li>
<p>Create a separate group for feature flag test suites (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3911">#3911</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Fix flaky LaunchDarkly tests (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3896">#3896</a>)
by <a href="https://github.com/aliu39"><code>@​aliu39</code></a></p>
</li>
<li>
<p>Fix LRU cache copying (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3883">#3883</a>)
by <a href="https://github.com/ffelixg"><code>@​ffelixg</code></a></p>
</li>
<li>
<p>Fix cache pollution from mutable reference (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3887">#3887</a>)
by <a
href="https://github.com/cmanallen"><code>@​cmanallen</code></a></p>
</li>
<li>
<p>Centralize minimum version checking (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3910">#3910</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Support SparkIntegration activation after SparkContext created (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3411">#3411</a>)
by <a
href="https://github.com/seyoon-lim"><code>@​seyoon-lim</code></a></p>
</li>
<li>
<p>Preserve ARQ enqueue_job <strong>kwdefaults</strong> after patching
(<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3903">#3903</a>)
by <a href="https://github.com/danmr"><code>@​danmr</code></a></p>
</li>
<li>
<p>Add Github workflow to comment on issues when a fix was released (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3866">#3866</a>)
by <a
href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p>
</li>
<li>
<p>Update test matrix for Sanic (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3904">#3904</a>)
by <a
href="https://github.com/antonpirker"><code>@​antonpirker</code></a></p>
</li>
<li>
<p>Rename scripts (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3885">#3885</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Fix CI (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3878">#3878</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>Treat <code>potel-base</code> as release branch in CI (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3912">#3912</a>)
by <a
href="https://github.com/sentrivana"><code>@​sentrivana</code></a></p>
</li>
<li>
<p>build(deps): bump actions/create-github-app-token from 1.11.0 to
1.11.1 (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3893">#3893</a>)
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></p>
</li>
<li>
<p>build(deps): bump codecov/codecov-action from 5.0.7 to 5.1.1 (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3867">#3867</a>)
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></p>
</li>
<li>
<p>build(deps): bump codecov/codecov-action from 5.1.1 to 5.1.2 (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3892">#3892</a>)
by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a></p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="4e0505ea5c"><code>4e0505e</code></a>
Updated changelog</li>
<li><a
href="ca68a7f3fb"><code>ca68a7f</code></a>
release: 2.20.0</li>
<li><a
href="2ee194c0d4"><code>2ee194c</code></a>
feat(flags): remove Unleash get_variant patching code (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3914">#3914</a>)</li>
<li><a
href="288f69a962"><code>288f69a</code></a>
Moved adding of <code>flags</code> context into Scope (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3917">#3917</a>)</li>
<li><a
href="9f9ff345c6"><code>9f9ff34</code></a>
tests: Create a separate group for feature flag suites (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3911">#3911</a>)</li>
<li><a
href="fa241c3425"><code>fa241c3</code></a>
Treat potel-base as release branch in CI (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3912">#3912</a>)</li>
<li><a
href="be5327356f"><code>be53273</code></a>
Centralize minimum version checking (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3910">#3910</a>)</li>
<li><a
href="4432e26a45"><code>4432e26</code></a>
Small contribution docs update (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3909">#3909</a>)</li>
<li><a
href="c6a89d64db"><code>c6a89d6</code></a>
feat(flags): add Unleash feature flagging integration (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3888">#3888</a>)</li>
<li><a
href="bf65ede421"><code>bf65ede</code></a>
ref(flags): Beter naming for featureflags module and identifier (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/3902">#3902</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/getsentry/sentry-python/compare/2.19.2...2.20.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `stripe` from 11.4.1 to 11.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/stripe/stripe-python/releases">stripe's
releases</a>.</em></p>
<blockquote>
<h2>v11.5.0</h2>
<h2>11.5.0 - 2025-01-27</h2>
<ul>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1443">#1443</a>
Update generated code
<ul>
<li>Add support for <code>pay_by_bank_payments</code> on resource class
<code>stripe.Account.Capabilities</code> and parameter class
<code>stripe.Account.CreateParamsCapabilities</code></li>
<li>Add support for <code>directorship_declaration</code> on resource
class <code>stripe.Account.Company</code> and parameter classes
<code>stripe.Account.CreateParamsCompany</code> and
<code>stripe.Token.CreateParamsAccountCompany</code></li>
<li>Add support for <code>ownership_exemption_reason</code> on resource
class <code>stripe.Account.Company</code> and parameter classes
<code>stripe.Account.CreateParamsCompany</code> and
<code>stripe.Token.CreateParamsAccountCompany</code></li>
<li>Add support for <code>proof_of_ultimate_beneficial_ownership</code>
on parameter class
<code>stripe.Account.CreateParamsDocuments</code></li>
<li>Add support for <code>financial_account</code> on resource classes
<code>stripe.AccountSession.Components</code> and
<code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails</code>
and parameter class
<code>stripe.AccountSession.CreateParamsComponents</code></li>
<li>Add support for <code>issuing_card</code> on resource class
<code>stripe.AccountSession.Components</code> and parameter class
<code>stripe.AccountSession.CreateParamsComponents</code></li>
<li>Add support for <code>advice_code</code> on resource classes
<code>stripe.Charge.Outcome</code>,
<code>stripe.Invoice.LastFinalizationError</code>,
<code>stripe.PaymentIntent.LastPaymentError</code>,
<code>stripe.SetupAttempt.SetupError</code>, and
<code>stripe.SetupIntent.LastSetupError</code></li>
<li>Add support for <code>country</code> on resource classes
<code>stripe.Charge.PaymentMethodDetails.Paypal</code>,
<code>stripe.ConfirmationToken.PaymentMethodPreview.Paypal</code>, and
<code>stripe.PaymentMethod.Paypal</code></li>
<li>Add support for <code>pay_by_bank</code> on resource classes
<code>stripe.Charge.PaymentMethodDetails</code>,
<code>stripe.ConfirmationToken.PaymentMethodPreview</code>, and
<code>stripe.PaymentIntent.PaymentMethodOptions</code>, parameter
classes
<code>stripe.ConfirmationToken.CreateParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.ConfirmParamsPaymentMethodOptions</code>,
<code>stripe.PaymentIntent.CreateParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.CreateParamsPaymentMethodOptions</code>,
<code>stripe.PaymentIntent.ModifyParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.ModifyParamsPaymentMethodOptions</code>,
<code>stripe.PaymentMethod.CreateParams</code>,
<code>stripe.PaymentMethod.ModifyParams</code>,
<code>stripe.PaymentMethodConfiguration.CreateParams</code>,
<code>stripe.PaymentMethodConfiguration.ModifyParams</code>,
<code>stripe.SetupIntent.ConfirmParamsPaymentMethodData</code>,
<code>stripe.SetupIntent.CreateParamsPaymentMethodData</code>,
<code>stripe.SetupIntent.ModifyParamsPaymentMethodData</code>, and
<code>stripe.checkout.Session.CreateParamsPaymentMethodOptions</code>,
and resources <code>stripe.PaymentMethod</code> and
<code>stripe.PaymentMethodConfiguration</code></li>
<li>Add support for <code>phone_number_collection</code> on parameter
class <code>stripe.PaymentLink.ModifyParams</code></li>
<li>Add support for <code>discounts</code> on resource
<code>stripe.checkout.Session</code></li>
<li>Add support for <code>jpy</code> on parameter classes
<code>stripe.terminal.Configuration.CreateParamsTipping</code> and
<code>stripe.terminal.Configuration.ModifyParamsTipping</code> and
resource class <code>stripe.terminal.Configuration.Tipping</code></li>
<li>Add support for <code>nickname</code> on parameter classes
<code>stripe.treasury.FinancialAccount.CreateParams</code> and
<code>stripe.treasury.FinancialAccount.ModifyParams</code> and resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>forwarding_settings</code> on parameter class
<code>stripe.treasury.FinancialAccount.ModifyParams</code></li>
<li>Add support for <code>_cls_close</code> on resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>close</code> on resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>is_default</code> on resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>destination_payment_method_data</code> on
parameter class
<code>stripe.treasury.OutboundTransfer.CreateParams</code></li>
<li>Add support for <code>outbound_transfer</code> on resource class
<code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails</code></li>
<li>Add support for <code>SD</code> on enums
<code>stripe.checkout.Session.ShippingAddressCollection.allowed_countries</code>,
<code>stripe.checkout.Session.CreateParamsShippingAddressCollection.allowed_countries</code>,
<code>stripe.PaymentLink.ShippingAddressCollection.allowed_countries</code>,
<code>stripe.PaymentLink.CreateParamsShippingAddressCollection.allowed_countries</code>,
and
<code>stripe.PaymentLink.ModifyParamsShippingAddressCollection.allowed_countries</code></li>
<li>Add support for <code>pay_by_bank</code> on enums
<code>stripe.checkout.Session.CreateParams.payment_method_types</code>,
<code>stripe.ConfirmationToken.PaymentMethodPreview.type</code>,
<code>stripe.ConfirmationToken.CreateParamsPaymentMethodData.type</code>,
<code>stripe.Customer.ListPaymentMethodsParams.type</code>,
<code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData.type</code>,
<code>stripe.PaymentIntent.CreateParamsPaymentMethodData.type</code>,
<code>stripe.PaymentIntent.ModifyParamsPaymentMethodData.type</code>,
<code>stripe.PaymentLink.payment_method_types</code>,
<code>stripe.PaymentLink.CreateParams.payment_method_types</code>,
<code>stripe.PaymentLink.ModifyParams.payment_method_types</code>,
<code>stripe.PaymentMethod.type</code>,
<code>stripe.PaymentMethod.CreateParams.type</code>,
<code>stripe.PaymentMethod.ListParams.type</code>,
<code>stripe.SetupIntent.ConfirmParamsPaymentMethodData.type</code>,
<code>stripe.SetupIntent.CreateParamsPaymentMethodData.type</code>, and
<code>stripe.SetupIntent.ModifyParamsPaymentMethodData.type</code></li>
<li>Add support for <code>financial_account</code> on enum
<code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails.type</code></li>
<li>Add support for <code>outbound_transfer</code> on enums
<code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails.type</code>
and
<code>stripe.treasury.ReceivedCredit.ListParamsLinkedFlows.source_flow_type</code></li>
<li>Add support for <code>2025-01-27.acacia</code> on enum
<code>stripe.WebhookEndpoint.CreateParams.api_version</code></li>
<li>Change type of <code>pretax_credit_amounts</code> on
<code>stripe.CreditNote</code> and
<code>stripe.CreditNoteLineItem</code> from
<code>Optional[List[PretaxCreditAmount]]</code> to
<code>List[PretaxCreditAmount]</code></li>
</ul>
</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1451">#1451</a>
Upgrade to download-artifact@v4</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1448">#1448</a>
Updated upload artifact ci action</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1446">#1446</a>
add just to publish CI</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1444">#1444</a>
Added CONTRIBUTING.md file</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1445">#1445</a>
minor justfile fixes &amp; pin CI version</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1440">#1440</a>
add justfile, update readme, remove coveralls</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1442">#1442</a>
Fix V2 ListObject.data type hint
<ul>
<li>Change <code>stripe.v2.ListObject.data</code> type hint from
<code>List[StripeObject]</code> to <code>List[T]</code> where T is the
specific stripe object contained within the list</li>
</ul>
</li>
</ul>
<p>See <a
href="https://github.com/stripe/stripe-python/blob/v11.5.0b3/CHANGELOG.md">the
changelog for more details</a>.</p>
<h2>v11.5.0b3</h2>
<ul>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1447">#1447</a>
Update generated code for beta
<ul>
<li>Remove support for <code>stripe_account</code> on resource classes
<code>stripe.terminal.Reader.Action.CollectPaymentMethod</code>,
<code>stripe.terminal.Reader.Action.ConfirmPaymentIntent</code>,
<code>stripe.terminal.Reader.Action.ProcessPaymentIntent</code>, and
<code>stripe.terminal.Reader.Action.RefundPayment</code></li>
</ul>
</li>
</ul>
<p>See <a
href="https://github.com/stripe/stripe-python/blob/v11.5.0b3/CHANGELOG.md">the
changelog for more details</a>.</p>
<h2>v11.5.0b2</h2>
<ul>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1439">#1439</a>
Update generated code for beta
<ul>
<li>Add support for <code>pay_by_bank_payments</code> on resource class
<code>stripe.Account.Capabilities</code> and parameter class
<code>stripe.Account.CreateParamsCapabilities</code></li>
<li>Add support for <code>directorship_declaration</code> on parameter
classes <code>stripe.Account.CreateParamsCompany</code> and
<code>stripe.Token.CreateParamsAccountCompany</code></li>
<li>Add support for <code>proof_of_ultimate_beneficial_ownership</code>
on parameter class
<code>stripe.Account.CreateParamsDocuments</code></li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/stripe/stripe-python/blob/master/CHANGELOG.md">stripe's
changelog</a>.</em></p>
<blockquote>
<h2>11.5.0 - 2025-01-27</h2>
<ul>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1443">#1443</a>
Update generated code
<ul>
<li>Add support for <code>pay_by_bank_payments</code> on resource class
<code>stripe.Account.Capabilities</code> and parameter class
<code>stripe.Account.CreateParamsCapabilities</code></li>
<li>Add support for <code>directorship_declaration</code> on resource
class <code>stripe.Account.Company</code> and parameter classes
<code>stripe.Account.CreateParamsCompany</code> and
<code>stripe.Token.CreateParamsAccountCompany</code></li>
<li>Add support for <code>ownership_exemption_reason</code> on resource
class <code>stripe.Account.Company</code> and parameter classes
<code>stripe.Account.CreateParamsCompany</code> and
<code>stripe.Token.CreateParamsAccountCompany</code></li>
<li>Add support for <code>proof_of_ultimate_beneficial_ownership</code>
on parameter class
<code>stripe.Account.CreateParamsDocuments</code></li>
<li>Add support for <code>financial_account</code> on resource classes
<code>stripe.AccountSession.Components</code> and
<code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails</code>
and parameter class
<code>stripe.AccountSession.CreateParamsComponents</code></li>
<li>Add support for <code>issuing_card</code> on resource class
<code>stripe.AccountSession.Components</code> and parameter class
<code>stripe.AccountSession.CreateParamsComponents</code></li>
<li>Add support for <code>advice_code</code> on resource classes
<code>stripe.Charge.Outcome</code>,
<code>stripe.Invoice.LastFinalizationError</code>,
<code>stripe.PaymentIntent.LastPaymentError</code>,
<code>stripe.SetupAttempt.SetupError</code>, and
<code>stripe.SetupIntent.LastSetupError</code></li>
<li>Add support for <code>country</code> on resource classes
<code>stripe.Charge.PaymentMethodDetails.Paypal</code>,
<code>stripe.ConfirmationToken.PaymentMethodPreview.Paypal</code>, and
<code>stripe.PaymentMethod.Paypal</code></li>
<li>Add support for <code>pay_by_bank</code> on resource classes
<code>stripe.Charge.PaymentMethodDetails</code>,
<code>stripe.ConfirmationToken.PaymentMethodPreview</code>, and
<code>stripe.PaymentIntent.PaymentMethodOptions</code>, parameter
classes
<code>stripe.ConfirmationToken.CreateParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.ConfirmParamsPaymentMethodOptions</code>,
<code>stripe.PaymentIntent.CreateParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.CreateParamsPaymentMethodOptions</code>,
<code>stripe.PaymentIntent.ModifyParamsPaymentMethodData</code>,
<code>stripe.PaymentIntent.ModifyParamsPaymentMethodOptions</code>,
<code>stripe.PaymentMethod.CreateParams</code>,
<code>stripe.PaymentMethod.ModifyParams</code>,
<code>stripe.PaymentMethodConfiguration.CreateParams</code>,
<code>stripe.PaymentMethodConfiguration.ModifyParams</code>,
<code>stripe.SetupIntent.ConfirmParamsPaymentMethodData</code>,
<code>stripe.SetupIntent.CreateParamsPaymentMethodData</code>,
<code>stripe.SetupIntent.ModifyParamsPaymentMethodData</code>, and
<code>stripe.checkout.Session.CreateParamsPaymentMethodOptions</code>,
and resources <code>stripe.PaymentMethod</code> and
<code>stripe.PaymentMethodConfiguration</code></li>
<li>Add support for <code>phone_number_collection</code> on parameter
class <code>stripe.PaymentLink.ModifyParams</code></li>
<li>Add support for <code>discounts</code> on resource
<code>stripe.checkout.Session</code></li>
<li>Add support for <code>jpy</code> on parameter classes
<code>stripe.terminal.Configuration.CreateParamsTipping</code> and
<code>stripe.terminal.Configuration.ModifyParamsTipping</code> and
resource class <code>stripe.terminal.Configuration.Tipping</code></li>
<li>Add support for <code>nickname</code> on parameter classes
<code>stripe.treasury.FinancialAccount.CreateParams</code> and
<code>stripe.treasury.FinancialAccount.ModifyParams</code> and resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>forwarding_settings</code> on parameter class
<code>stripe.treasury.FinancialAccount.ModifyParams</code></li>
<li>Add support for <code>_cls_close</code> on resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>close</code> on resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>is_default</code> on resource
<code>stripe.treasury.FinancialAccount</code></li>
<li>Add support for <code>destination_payment_method_data</code> on
parameter class
<code>stripe.treasury.OutboundTransfer.CreateParams</code></li>
<li>Add support for <code>outbound_transfer</code> on resource class
<code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails</code></li>
<li>Add support for <code>SD</code> on enums
<code>stripe.checkout.Session.ShippingAddressCollection.allowed_countries</code>,
<code>stripe.checkout.Session.CreateParamsShippingAddressCollection.allowed_countries</code>,
<code>stripe.PaymentLink.ShippingAddressCollection.allowed_countries</code>,
<code>stripe.PaymentLink.CreateParamsShippingAddressCollection.allowed_countries</code>,
and
<code>stripe.PaymentLink.ModifyParamsShippingAddressCollection.allowed_countries</code></li>
<li>Add support for <code>pay_by_bank</code> on enums
<code>stripe.checkout.Session.CreateParams.payment_method_types</code>,
<code>stripe.ConfirmationToken.PaymentMethodPreview.type</code>,
<code>stripe.ConfirmationToken.CreateParamsPaymentMethodData.type</code>,
<code>stripe.Customer.ListPaymentMethodsParams.type</code>,
<code>stripe.PaymentIntent.ConfirmParamsPaymentMethodData.type</code>,
<code>stripe.PaymentIntent.CreateParamsPaymentMethodData.type</code>,
<code>stripe.PaymentIntent.ModifyParamsPaymentMethodData.type</code>,
<code>stripe.PaymentLink.payment_method_types</code>,
<code>stripe.PaymentLink.CreateParams.payment_method_types</code>,
<code>stripe.PaymentLink.ModifyParams.payment_method_types</code>,
<code>stripe.PaymentMethod.type</code>,
<code>stripe.PaymentMethod.CreateParams.type</code>,
<code>stripe.PaymentMethod.ListParams.type</code>,
<code>stripe.SetupIntent.ConfirmParamsPaymentMethodData.type</code>,
<code>stripe.SetupIntent.CreateParamsPaymentMethodData.type</code>, and
<code>stripe.SetupIntent.ModifyParamsPaymentMethodData.type</code></li>
<li>Add support for <code>financial_account</code> on enum
<code>stripe.treasury.OutboundTransfer.DestinationPaymentMethodDetails.type</code></li>
<li>Add support for <code>outbound_transfer</code> on enums
<code>stripe.treasury.ReceivedCredit.LinkedFlows.SourceFlowDetails.type</code>
and
<code>stripe.treasury.ReceivedCredit.ListParamsLinkedFlows.source_flow_type</code></li>
<li>Add support for <code>2025-01-27.acacia</code> on enum
<code>stripe.WebhookEndpoint.CreateParams.api_version</code></li>
<li>Change type of <code>pretax_credit_amounts</code> on
<code>stripe.CreditNote</code> and
<code>stripe.CreditNoteLineItem</code> from
<code>Optional[List[PretaxCreditAmount]]</code> to
<code>List[PretaxCreditAmount]</code></li>
</ul>
</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1451">#1451</a>
Upgrade to download-artifact@v4</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1448">#1448</a>
Updated upload artifact ci action</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1446">#1446</a>
add just to publish CI</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1444">#1444</a>
Added CONTRIBUTING.md file</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1445">#1445</a>
minor justfile fixes &amp; pin CI version</li>
<li><a
href="https://redirect.github.com/stripe/stripe-python/pull/1440">#1440</a>
add justfile, update readme, remove coveralls</li>
<li><a href="https://redirect...

_Description has been truncated_

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-29 17:08:02 +00:00
Krzysztof Czerwinski
1b69bcbce2 fix(platform): PAYG system fixes (#9296)
1. Stripe is complaining about lack of return url in checkout.
2. Only frontend prevents users from topping-up amounts less than 5$.

### Changes 🏗️

- Set `return_url` and `customer_email` when creating checkout session.
- Change `amount` to `credit_amount` and use credits instead of USD for
clarity when requesting top up.
- Accept only top-ups of 500+ credits (5$) and multiples of 100 credits
*on the backend*.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-01-29 16:56:05 +00:00
dependabot[bot]
ef118eff34 chore(libs/deps-dev): bump ruff from 0.9.2 to 0.9.3 in /autogpt_platform/autogpt_libs in the development-dependencies group (#9343)
Bumps the development-dependencies group in
/autogpt_platform/autogpt_libs with 1 update:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.9.2 to 0.9.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.3</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Argument <code>fail_stop</code> in DAG has
been renamed as <code>fail_fast</code> (<code>AIR302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15633">#15633</a>)</li>
<li>[<code>airflow</code>] Extend <code>AIR303</code> with more symbols
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15611">#15611</a>)</li>
<li>[<code>flake8-bandit</code>] Report all references to suspicious
functions (<code>S3</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15541">#15541</a>)</li>
<li>[<code>flake8-pytest-style</code>] Do not emit diagnostics for empty
<code>for</code> loops (<code>PT012</code>, <code>PT031</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15542">#15542</a>)</li>
<li>[<code>flake8-simplify</code>] Avoid double negations
(<code>SIM103</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15562">#15562</a>)</li>
<li>[<code>pyflakes</code>] Fix infinite loop with unused local import
in <code>__init__.py</code> (<code>F401</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15517">#15517</a>)</li>
<li>[<code>pylint</code>] Do not report methods with only one
<code>EM101</code>-compatible <code>raise</code> (<code>PLR6301</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15507">#15507</a>)</li>
<li>[<code>pylint</code>] Implement
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/9640">#9640</a>)</li>
<li>[<code>pyupgrade</code>] Add rules to use PEP 695 generics in
classes and functions (<code>UP046</code>, <code>UP047</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15565">#15565</a>,
<a
href="https://redirect.github.com/astral-sh/ruff/pull/15659">#15659</a>)</li>
<li>[<code>refurb</code>] Implement <code>for-loop-writes</code>
(<code>FURB122</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/10630">#10630</a>)</li>
<li>[<code>ruff</code>] Implement <code>needless-else</code> clause
(<code>RUF047</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15051">#15051</a>)</li>
<li>[<code>ruff</code>] Implement <code>starmap-zip</code>
(<code>RUF058</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15483">#15483</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Do not raise error if keyword argument
is present and target-python version is less or equals than 3.9
(<code>B903</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15549">#15549</a>)</li>
<li>[<code>flake8-comprehensions</code>] strip parentheses around
generators in <code>unnecessary-generator-set</code> (<code>C401</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15553">#15553</a>)</li>
<li>[<code>flake8-pytest-style</code>] Rewrite references to
<code>.exception</code> (<code>PT027</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15680">#15680</a>)</li>
<li>[<code>flake8-simplify</code>] Mark fixes as unsafe
(<code>SIM201</code>, <code>SIM202</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15626">#15626</a>)</li>
<li>[<code>flake8-type-checking</code>] Fix some safe fixes being
labeled unsafe (<code>TC006</code>,<code>TC008</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15638">#15638</a>)</li>
<li>[<code>isort</code>] Omit trailing whitespace in
<code>unsorted-imports</code> (<code>I001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15518">#15518</a>)</li>
<li>[<code>pydoclint</code>] Allow ignoring one line docstrings for
<code>DOC</code> rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/13302">#13302</a>)</li>
<li>[<code>pyflakes</code>] Apply redefinition fixes by source code
order (<code>F811</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15575">#15575</a>)</li>
<li>[<code>pyflakes</code>] Avoid removing too many imports in
<code>redefined-while-unused</code> (<code>F811</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15585">#15585</a>)</li>
<li>[<code>pyflakes</code>] Group redefinition fixes by source statement
(<code>F811</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15574">#15574</a>)</li>
<li>[<code>pylint</code>] Include name of base class in message for
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15559">#15559</a>)</li>
<li>[<code>ruff</code>] Update fix for <code>RUF055</code> to use
<code>var == value</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15605">#15605</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix bracket spacing for single-element tuples in f-string
expressions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15537">#15537</a>)</li>
<li>Fix unstable f-string formatting for expressions containing a
trailing comma (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15545">#15545</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Avoid quadratic membership check in import fixes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15576">#15576</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Allow <code>unsafe-fixes</code> settings for code actions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15666">#15666</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-bandit</code>] Add missing single-line/dotall regex
flag (<code>S608</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15654">#15654</a>)</li>
<li>[<code>flake8-import-conventions</code>] Fix infinite loop between
<code>ICN001</code> and <code>I002</code> (<code>ICN001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15480">#15480</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.3</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Argument <code>fail_stop</code> in DAG has
been renamed as <code>fail_fast</code> (<code>AIR302</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15633">#15633</a>)</li>
<li>[<code>airflow</code>] Extend <code>AIR303</code> with more symbols
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15611">#15611</a>)</li>
<li>[<code>flake8-bandit</code>] Report all references to suspicious
functions (<code>S3</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15541">#15541</a>)</li>
<li>[<code>flake8-pytest-style</code>] Do not emit diagnostics for empty
<code>for</code> loops (<code>PT012</code>, <code>PT031</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15542">#15542</a>)</li>
<li>[<code>flake8-simplify</code>] Avoid double negations
(<code>SIM103</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15562">#15562</a>)</li>
<li>[<code>pyflakes</code>] Fix infinite loop with unused local import
in <code>__init__.py</code> (<code>F401</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15517">#15517</a>)</li>
<li>[<code>pylint</code>] Do not report methods with only one
<code>EM101</code>-compatible <code>raise</code> (<code>PLR6301</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15507">#15507</a>)</li>
<li>[<code>pylint</code>] Implement
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/9640">#9640</a>)</li>
<li>[<code>pyupgrade</code>] Add rules to use PEP 695 generics in
classes and functions (<code>UP046</code>, <code>UP047</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15565">#15565</a>,
<a
href="https://redirect.github.com/astral-sh/ruff/pull/15659">#15659</a>)</li>
<li>[<code>refurb</code>] Implement <code>for-loop-writes</code>
(<code>FURB122</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/10630">#10630</a>)</li>
<li>[<code>ruff</code>] Implement <code>needless-else</code> clause
(<code>RUF047</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15051">#15051</a>)</li>
<li>[<code>ruff</code>] Implement <code>starmap-zip</code>
(<code>RUF058</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15483">#15483</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Do not raise error if keyword argument
is present and target-python version is less or equals than 3.9
(<code>B903</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15549">#15549</a>)</li>
<li>[<code>flake8-comprehensions</code>] strip parentheses around
generators in <code>unnecessary-generator-set</code> (<code>C401</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15553">#15553</a>)</li>
<li>[<code>flake8-pytest-style</code>] Rewrite references to
<code>.exception</code> (<code>PT027</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15680">#15680</a>)</li>
<li>[<code>flake8-simplify</code>] Mark fixes as unsafe
(<code>SIM201</code>, <code>SIM202</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15626">#15626</a>)</li>
<li>[<code>flake8-type-checking</code>] Fix some safe fixes being
labeled unsafe (<code>TC006</code>,<code>TC008</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15638">#15638</a>)</li>
<li>[<code>isort</code>] Omit trailing whitespace in
<code>unsorted-imports</code> (<code>I001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15518">#15518</a>)</li>
<li>[<code>pydoclint</code>] Allow ignoring one line docstrings for
<code>DOC</code> rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/13302">#13302</a>)</li>
<li>[<code>pyflakes</code>] Apply redefinition fixes by source code
order (<code>F811</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15575">#15575</a>)</li>
<li>[<code>pyflakes</code>] Avoid removing too many imports in
<code>redefined-while-unused</code> (<code>F811</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15585">#15585</a>)</li>
<li>[<code>pyflakes</code>] Group redefinition fixes by source statement
(<code>F811</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15574">#15574</a>)</li>
<li>[<code>pylint</code>] Include name of base class in message for
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15559">#15559</a>)</li>
<li>[<code>ruff</code>] Update fix for <code>RUF055</code> to use
<code>var == value</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15605">#15605</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix bracket spacing for single-element tuples in f-string
expressions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15537">#15537</a>)</li>
<li>Fix unstable f-string formatting for expressions containing a
trailing comma (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15545">#15545</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Avoid quadratic membership check in import fixes (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15576">#15576</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Allow <code>unsafe-fixes</code> settings for code actions (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15666">#15666</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-bandit</code>] Add missing single-line/dotall regex
flag (<code>S608</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15654">#15654</a>)</li>
<li>[<code>flake8-import-conventions</code>] Fix infinite loop between
<code>ICN001</code> and <code>I002</code> (<code>ICN001</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15480">#15480</a>)</li>
<li>[<code>flake8-simplify</code>] Do not emit diagnostics for
expressions inside string type annotations (<code>SIM222</code>,
<code>SIM223</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15405">#15405</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="90589372da"><code>9058937</code></a>
Fix grep for version number in docker build (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15699">#15699</a>)</li>
<li><a
href="b5ffb404de"><code>b5ffb40</code></a>
Bump version to 0.9.3 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15698">#15698</a>)</li>
<li><a
href="cffd1866ce"><code>cffd186</code></a>
Preserve raw string prefix and escapes (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15694">#15694</a>)</li>
<li><a
href="569060f46c"><code>569060f</code></a>
[<code>flake8-pytest-style</code>] Rewrite references to
<code>.exception</code> (<code>PT027</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15680">#15680</a>)</li>
<li><a
href="15394a8028"><code>15394a8</code></a>
[red-knot] MDTests: Do not depend on precise public-symbol type
inference (<a
href="https://redirect.github.com/astral-sh/ruff/issues/1">#1</a>...</li>
<li><a
href="fc2ebea736"><code>fc2ebea</code></a>
[red-knot] Make <code>infer.rs</code> unit tests independent of public
symbol inference ...</li>
<li><a
href="43160b4c3e"><code>43160b4</code></a>
Tidy knot CLI tests (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15685">#15685</a>)</li>
<li><a
href="0173738eef"><code>0173738</code></a>
[red-knot] Port comprehension tests to Markdown (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15688">#15688</a>)</li>
<li><a
href="05ea77b1d4"><code>05ea77b</code></a>
Create Unknown rule diagnostics with a source range (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15648">#15648</a>)</li>
<li><a
href="1e790d3885"><code>1e790d3</code></a>
[red-knot] Port 'deferred annotations' unit tests to Markdown (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15686">#15686</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.2...0.9.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.2&new-version=0.9.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-29 16:47:47 +00:00
Nicholas Tindle
f1bc9d1581 Update .deepsource.toml 2025-01-29 10:31:57 -06:00
Zamil Majdy
f67060fd8f fix(backend): Fix get balance error on user with null running balance (#9365)
### Changes 🏗️

The current state can cause this error:
```
    if (snapshot_time.year, snapshot_time.month) == (cur_time.year, cur_time.month):
        ^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'year'
```

Which is caused by the timestamp return value possibly a string.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-29 14:25:50 +00:00
Zamil Majdy
c31a2ec565 fix(backend): Remove hardcoded auto-top-up config definition on set_auto_top_up (#9361)
### Changes 🏗️

Make set_auto_top_up accepts AutoTopUpConfig & eliminate hardcoding of
json value.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-29 13:59:06 +00:00
Nicholas Tindle
97a26dba7e fix(frontend): add typechecks and fix existing type errors in frontend (#9336)
<!-- Clearly explain the need for these changes: -->
We want to be able to use typechecking and see errors before they occur.
This is a PR to help enable us to do so by fixing the existing errors
and hopefully not causing new ones.

### Changes 🏗️
- adds check to ci
- disables some code points
- fixes lots of type errors
- fixes a bunch of the stories

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] added types
  - [x] Ran some of the stories
  - [x] Asked all the relevant parties for manual checks

---------

Co-authored-by: SwiftyOS <craigswift13@gmail.com>
2025-01-29 12:32:35 +00:00
Zamil Majdy
5e2043b774 fix(backend): Fix failing test_block_credit_reset when it's executed at the end of 31-days month (#9360)
Currently, the test is failing on Jan 29 because 29th Feb does not
exist.

### Changes 🏗️

Force use the first day of the month for getting the current time.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-29 12:17:40 +00:00
Nicholas Tindle
f37957d71f Merge branch 'master' into dev 2025-01-29 06:11:09 -06:00
Nicholas Tindle
e199e54791 ci(repo): deepsource config 2025-01-29 05:47:01 -06:00
Ritik Dutta
33c718a9d7 Fix broken connections when copying and pasting an agent (#9138)
### Summary
This pull request fixes the issue of broken connections when copying and
pasting an agent. The connections are now preserved during the
copy-paste operation.

### Changes
- Modified the `useCopyPaste.ts` file to ensure that connections are
preserved during the copy-paste operation.

### Steps to Reproduce
1. Copy a small section from an Agent that features links to outside the
area you're selecting (use shift + click & drag).
2. Go to a fresh builder canvas in a new tab.
3. Paste the copied section.
4. Try to save the Agent; previously, it would fail due to the outgoing
link being broken.

### Testing
- Verified that connections remain intact when copying and pasting
agents.
- Tested by saving the agent to ensure no broken links.

### Related Issue
Fixes
[#9137](https://github.com/Significant-Gravitas/AutoGPT/issues/9137)

### Notes
Please review the changes and let me know if any further adjustments are
needed.

---------

Co-authored-by: Swifty <craigswift13@gmail.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Bently <tomnoon9@gmail.com>
2025-01-28 15:49:06 +00:00
Nicholas Tindle
c5747c59d7 feat: mem0 ai memory block (#9285)
We want to have some more intelligent and less user managed memory
methods, so we add mem0


### Changes 🏗️

- Adds user_id to kwargs for blocks
- Add mem0 blocks

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

- [x] document adding user_id to kwargs for blocks
- [x] Add run and agent Id as optional checkboxes that will be passed
down to mem0

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [ ] Build and submit an agent to @Torantulino and the marketplace for
a personal AI tutor based on recommendations from the mem0 team

---------

Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-01-28 15:15:29 +00:00
dependabot[bot]
e3190b6234 chore(frontend/deps): bump the production-dependencies group across 1 directory with 19 updates (#9349)
Bumps the production-dependencies group with 18 updates in the
/autogpt_platform/frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@faker-js/faker](https://github.com/faker-js/faker) | `9.3.0` |
`9.4.0` |
|
[@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties)
| `15.1.3` | `15.1.6` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives)
| `1.1.4` | `1.1.5` |
| [@radix-ui/react-context-menu](https://github.com/radix-ui/primitives)
| `2.2.4` | `2.2.5` |
|
[@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives)
| `2.1.4` | `2.1.5` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives) |
`1.1.4` | `1.1.5` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives) |
`2.1.4` | `2.1.5` |
| [@radix-ui/react-toast](https://github.com/radix-ui/primitives) |
`1.2.4` | `1.2.5` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives) |
`1.1.6` | `1.1.7` |
| [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) |
`8.48.0` | `8.51.0` |
| [@stripe/stripe-js](https://github.com/stripe/stripe-js) | `5.4.0` |
`5.5.0` |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js) |
`2.47.10` | `2.48.1` |
|
[@xyflow/react](https://github.com/xyflow/xyflow/tree/HEAD/packages/react)
| `12.3.6` | `12.4.2` |
| [embla-carousel-react](https://github.com/davidjerleke/embla-carousel)
| `8.5.1` | `8.5.2` |
|
[lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react)
| `0.469.0` | `0.474.0` |
| [react-day-picker](https://github.com/gpbl/react-day-picker) | `9.5.0`
| `9.5.1` |
| [react-shepherd](https://github.com/shepherd-pro/shepherd) | `6.1.6` |
`6.1.7` |
| [uuid](https://github.com/uuidjs/uuid) | `11.0.4` | `11.0.5` |


Updates `@faker-js/faker` from 9.3.0 to 9.4.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/releases"><code>@​faker-js/faker</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v9.4.0</h2>
<h2>What's Changed</h2>
<ul>
<li>refactor: replace MersenneTwister implementation with a pure-rand
based one by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3288">faker-js/faker#3288</a></li>
<li>chore: improve variable naming of system module by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3315">faker-js/faker#3315</a></li>
<li>refactor(locale): re-moo-ved some incorrect <code>cow</code> data by
<a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3326">faker-js/faker#3326</a></li>
<li>refactor(locale): fix truncated song names with commas by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3327">faker-js/faker#3327</a></li>
<li>refactor(locale): fix bad uz street_name_part data by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3328">faker-js/faker#3328</a></li>
<li>docs(helpers): add missing example results to uniqueArray by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3321">faker-js/faker#3321</a></li>
<li>chore: align coding style of deprecated.ts by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3312">faker-js/faker#3312</a></li>
<li>refactor(locale): fix various locale data with trailing spaces by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3329">faker-js/faker#3329</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3331">faker-js/faker#3331</a></li>
<li>chore: align coding style of word module by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3319">faker-js/faker#3319</a></li>
<li>chore: align coding style of lorem module by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3313">faker-js/faker#3313</a></li>
<li>chore: improve parameter naming of internet module by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3317">faker-js/faker#3317</a></li>
<li>feat(finance): use fake patterns for transactionDescription by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3202">faker-js/faker#3202</a></li>
<li>feat(locale): add german animal types by <a
href="https://github.com/motz0815"><code>@​motz0815</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3334">faker-js/faker#3334</a></li>
<li>feat(internet): update to simplified modern user-agent list by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3324">faker-js/faker#3324</a></li>
<li>feat(location): add list of spoken languages by <a
href="https://github.com/UmairJibran"><code>@​UmairJibran</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3333">faker-js/faker#3333</a></li>
<li>chore: improve variable naming of helpers module by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3316">faker-js/faker#3316</a></li>
<li>docs: fix link to randomizer guide by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3332">faker-js/faker#3332</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3337">faker-js/faker#3337</a></li>
<li>fix(finance): correct Discover card number format by <a
href="https://github.com/julsql"><code>@​julsql</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3336">faker-js/faker#3336</a></li>
<li>docs: improve examples for objectKey,objectValue,objectEntry by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3339">faker-js/faker#3339</a></li>
<li>infra(unicorn): prevent-abbreviations by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3320">faker-js/faker#3320</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3340">faker-js/faker#3340</a></li>
<li>fix: basic wildcard range handling + add more tests by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3322">faker-js/faker#3322</a></li>
<li>docs(api): add refresh button to examples by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3301">faker-js/faker#3301</a></li>
<li>fix(system): semver parts should not be limited to 0-9 by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3349">faker-js/faker#3349</a></li>
<li>fix(image): dataUri should return random type by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3347">faker-js/faker#3347</a></li>
<li>refactor(image): deprecate urlPlaceholder by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3341">faker-js/faker#3341</a></li>
<li>docs: fix examples which return string/number by <a
href="https://github.com/matthewmayer"><code>@​matthewmayer</code></a>
in <a
href="https://redirect.github.com/faker-js/faker/pull/3348">faker-js/faker#3348</a></li>
<li>docs(image): improve urlPlaceholder alternatives by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3351">faker-js/faker#3351</a></li>
<li>chore: update LICENSE file by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3350">faker-js/faker#3350</a></li>
<li>chore(deps): update
mcr.microsoft.com/devcontainers/typescript-node:22 docker digest to
9791f4a by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3354">faker-js/faker#3354</a></li>
<li>chore(deps): update dependency prettier to v3.4.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3355">faker-js/faker#3355</a></li>
<li>chore(deps): update all non-major dependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3359">faker-js/faker#3359</a></li>
<li>chore(deps): update dependency ts-morph to v25 by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3360">faker-js/faker#3360</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3357">faker-js/faker#3357</a></li>
<li>chore(deps): update devdependencies by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3356">faker-js/faker#3356</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3353">faker-js/faker#3353</a></li>
<li>chore(deps): update vitest by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3358">faker-js/faker#3358</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3366">faker-js/faker#3366</a></li>
<li>docs(finance): add seeAlsos by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3344">faker-js/faker#3344</a></li>
<li>chore(deps): update eslint by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3369">faker-js/faker#3369</a></li>
<li>docs: use embedded build for preview examples by <a
href="https://github.com/ST-DDT"><code>@​ST-DDT</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3343">faker-js/faker#3343</a></li>
<li>chore(deps): lock file maintenance by <a
href="https://github.com/renovate"><code>@​renovate</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3370">faker-js/faker#3370</a></li>
<li>refactor(locales): fix chemical element names in zh_CN by <a
href="https://github.com/tuanzisama"><code>@​tuanzisama</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3371">faker-js/faker#3371</a></li>
<li>refactor(locale): improve product_name data in en and tr by <a
href="https://github.com/k-salih"><code>@​k-salih</code></a> in <a
href="https://redirect.github.com/faker-js/faker/pull/3372">faker-js/faker#3372</a></li>
<li>chore(release): 9.4.0 by <a
href="https://github.com/fakerjs-bot"><code>@​fakerjs-bot</code></a> in
<a
href="https://redirect.github.com/faker-js/faker/pull/3362">faker-js/faker#3362</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/faker-js/faker/blob/next/CHANGELOG.md"><code>@​faker-js/faker</code>'s
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/faker-js/faker/compare/v9.3.0...v9.4.0">9.4.0</a>
(2025-01-15)</h2>
<h3>Features</h3>
<ul>
<li><strong>finance:</strong> use fake patterns for
transactionDescription (<a
href="https://redirect.github.com/faker-js/faker/issues/3202">#3202</a>)
(<a
href="5ec4a6c9dd">5ec4a6c</a>)</li>
<li><strong>internet:</strong> update to simplified modern user-agent
list (<a
href="https://redirect.github.com/faker-js/faker/issues/3324">#3324</a>)
(<a
href="3c7abb55e6">3c7abb5</a>)</li>
<li><strong>location:</strong> add list of spoken languages (<a
href="https://redirect.github.com/faker-js/faker/issues/3333">#3333</a>)
(<a
href="ff6dda94dd">ff6dda9</a>)</li>
</ul>
<h3>Changed Locales</h3>
<ul>
<li><strong>locale:</strong> fix various locale data with trailing
spaces (<a
href="https://redirect.github.com/faker-js/faker/issues/3329">#3329</a>)
(<a
href="e5eec0ed84">e5eec0e</a>)</li>
<li><strong>locale:</strong> improve product_name data in en and tr (<a
href="https://redirect.github.com/faker-js/faker/issues/3372">#3372</a>)
(<a
href="773fc1f654">773fc1f</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>animal:</strong> re-moo-ved some incorrect cow data (<a
href="https://redirect.github.com/faker-js/faker/issues/3326">#3326</a>)
(<a
href="47f835bd0d">47f835b</a>)</li>
<li>basic wildcard range handling + add more tests (<a
href="https://redirect.github.com/faker-js/faker/issues/3322">#3322</a>)
(<a
href="817f8a01d9">817f8a0</a>)</li>
<li><strong>finance:</strong> update Discover card number format to
ensure accuracy (<a
href="https://redirect.github.com/faker-js/faker/issues/3336">#3336</a>)
(<a
href="69c006344b">69c0063</a>)</li>
<li><strong>image:</strong> dataUri should return random type (<a
href="https://redirect.github.com/faker-js/faker/issues/3347">#3347</a>)
(<a
href="eceb17d257">eceb17d</a>)</li>
<li><strong>locales:</strong> update chemical element names in zh_CN (<a
href="https://redirect.github.com/faker-js/faker/issues/3371">#3371</a>)
(<a
href="6ec6f84922">6ec6f84</a>)</li>
<li><strong>location:</strong> fix bad uz street_name_part data (<a
href="https://redirect.github.com/faker-js/faker/issues/3328">#3328</a>)
(<a
href="b6132cbee6">b6132cb</a>)</li>
<li><strong>music:</strong> fix truncated song names with commas (<a
href="https://redirect.github.com/faker-js/faker/issues/3327">#3327</a>)
(<a
href="f36fc71ac4">f36fc71</a>),
closes <a
href="https://redirect.github.com/faker-js/faker/issues/996">#996</a></li>
<li><strong>system:</strong> semver parts should not be limited to 0-9
(<a
href="https://redirect.github.com/faker-js/faker/issues/3349">#3349</a>)
(<a
href="c0d92b8fa8">c0d92b8</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="192b540d70"><code>192b540</code></a>
chore(release): 9.4.0 (<a
href="https://redirect.github.com/faker-js/faker/issues/3362">#3362</a>)</li>
<li><a
href="773fc1f654"><code>773fc1f</code></a>
refactor(locale): improve product_name data in en and tr (<a
href="https://redirect.github.com/faker-js/faker/issues/3372">#3372</a>)</li>
<li><a
href="6ec6f84922"><code>6ec6f84</code></a>
fix(locales): update chemical element names in zh_CN (<a
href="https://redirect.github.com/faker-js/faker/issues/3371">#3371</a>)</li>
<li><a
href="bddce72b49"><code>bddce72</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3370">#3370</a>)</li>
<li><a
href="3bb64a230a"><code>3bb64a2</code></a>
docs: use embedded build for preview examples (<a
href="https://redirect.github.com/faker-js/faker/issues/3343">#3343</a>)</li>
<li><a
href="d2c67636c0"><code>d2c6763</code></a>
chore(deps): update eslint (<a
href="https://redirect.github.com/faker-js/faker/issues/3369">#3369</a>)</li>
<li><a
href="5d4754c51e"><code>5d4754c</code></a>
docs(finance): add seeAlsos (<a
href="https://redirect.github.com/faker-js/faker/issues/3344">#3344</a>)</li>
<li><a
href="42dade59d3"><code>42dade5</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3366">#3366</a>)</li>
<li><a
href="ece4f16dd2"><code>ece4f16</code></a>
chore(deps): update vitest (<a
href="https://redirect.github.com/faker-js/faker/issues/3358">#3358</a>)</li>
<li><a
href="5b8356bbcb"><code>5b8356b</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/faker-js/faker/issues/3353">#3353</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/faker-js/faker/compare/v9.3.0...v9.4.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@next/third-parties` from 15.1.3 to 15.1.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases"><code>@​next/third-parties</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v15.1.6</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>fix: don't memory-leak promises passed to waitUntil (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75041">#75041</a>)</li>
<li>backport: fix prerender issue with intercepting routes +
generateStaticParams (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75170">#75170</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/lubieowoce"><code>@​lubieowoce</code></a> and
<a href="https://github.com/ztanner"><code>@​ztanner</code></a> for
helping!</p>
<h2>v15.1.5</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>Fix missing revalidate with notFound() (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75009">#75009</a>)</li>
<li>fix: when metadatabase is set we should not warn (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74840">#74840</a>)</li>
<li>Fix <code>@​vercel/og</code> license SPDX expression (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74745">#74745</a>)</li>
<li>fix: ts language server rule metadata should allow null (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74704">#74704</a>)</li>
<li>fix: eslint rule of using img in metadata routes (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74864">#74864</a>)</li>
<li>Fix presentation when onerror receives an event without error (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74643">#74643</a>)</li>
<li>fix fetch lock not being consistently released <a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74623">#74623</a>
(<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/75028">#75028</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/ijjk"><code>@​ijjk</code></a>, <a
href="https://github.com/huozhi"><code>@​huozhi</code></a>, <a
href="https://github.com/matmannion"><code>@​matmannion</code></a> and
<a href="https://github.com/ztanner"><code>@​ztanner</code></a> for
helping!</p>
<h2>v15.1.4</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>backport: force module format for virtual client-proxy (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74608">#74608</a>)</li>
<li>Fix prerender tags when notFound is called (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74607">#74607</a>)</li>
<li>Use provided waitUntil for pending revalidates (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74604">#74604</a>)</li>
<li>Feature: next/image: add support for images.qualities in next.config
(<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74588">#74588</a>)</li>
<li>Chore: docs: add missing search: '' on remotePatterns (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74587">#74587</a>)</li>
<li>Chore: docs: update version history of next/image (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/73923">#73923</a>)
(<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74570">#74570</a>)</li>
<li>Chore: next/image: improve imgopt api bypass detection for
unsupported images (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/third-parties/issues/74569">#74569</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to @ and @ for helping!</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="38a6d0177e"><code>38a6d01</code></a>
v15.1.6</li>
<li><a
href="47102cae01"><code>47102ca</code></a>
v15.1.5</li>
<li><a
href="48f2588b0f"><code>48f2588</code></a>
v15.1.4</li>
<li>See full diff in <a
href="https://github.com/vercel/next.js/commits/v15.1.6/packages/third-parties">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-alert-dialog` from 1.1.4 to 1.1.5
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-context-menu` from 2.2.4 to 2.2.5
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-dialog` from 1.1.4 to 1.1.5
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-dropdown-menu` from 2.1.4 to 2.1.5
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-popover` from 1.1.4 to 1.1.5
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-select` from 2.1.4 to 2.1.5
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-toast` from 1.2.4 to 1.2.5
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@radix-ui/react-tooltip` from 1.1.6 to 1.1.7
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/radix-ui/primitives/commits">compare
view</a></li>
</ul>
</details>
<br />

Updates `@sentry/nextjs` from 8.48.0 to 8.51.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/releases"><code>@​sentry/nextjs</code>'s
releases</a>.</em></p>
<blockquote>
<h2>8.51.0</h2>
<h3>Important Changes</h3>
<ul>
<li>
<p><strong>feat(v8/node): Add <code>prismaInstrumentation</code> option
to Prisma integration as escape hatch for all Prisma versions (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15128">#15128</a>)</strong></p>
<p>This release adds a compatibility API to add support for Prisma
version 6.
To capture performance data for Prisma version 6:</p>
<ol>
<li>
<p>Install the <code>@prisma/instrumentation</code> package on version
6.</p>
</li>
<li>
<p>Pass a <code>new PrismaInstrumentation()</code> instance as exported
from <code>@prisma/instrumentation</code> to the
<code>prismaInstrumentation</code> option:</p>
<pre lang="js"><code>import { PrismaInstrumentation } from
'@prisma/instrumentation';
<p>Sentry.init({
integrations: [
prismaIntegration({
// Override the default instrumentation that Sentry uses
prismaInstrumentation: new PrismaInstrumentation(),
}),
],
});
</code></pre></p>
<p>The passed instrumentation instance will override the default
instrumentation instance the integration would use, while the
<code>prismaIntegration</code> will still ensure data compatibility for
the various Prisma versions.</p>
</li>
<li>
<p>Remove the <code>previewFeatures = [&quot;tracing&quot;]</code>
option from the client generator block of your Prisma schema.</p>
</li>
</ol>
</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>feat(v8/browser): Add <code>multiplexedtransport.js</code> CDN
bundle (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15046">#15046</a>)</li>
<li>feat(v8/browser): Add Unleash integration (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/14948">#14948</a>)</li>
<li>feat(v8/deno): Deprecate Deno SDK as published on deno.land (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15121">#15121</a>)</li>
<li>feat(v8/sveltekit): Deprecate <code>fetchProxyScriptNonce</code>
option (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15011">#15011</a>)</li>
<li>fix(v8/aws-lambda): Avoid overwriting root span name (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15054">#15054</a>)</li>
<li>fix(v8/core): <code>fatal</code> events should set session as
crashed (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15073">#15073</a>)</li>
<li>fix(v8/node/nestjs): Use method on current fastify request (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15104">#15104</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/tjhiggins"><code>@​tjhiggins</code></a>, and <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contributions!</p>
<h2>Bundle size 📦</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@​sentry/browser</code></td>
<td>23.29 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> - with treeshaking flags</td>
<td>23.17 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing)</td>
<td>35.85 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay)</td>
<td>73.2 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay) - with
treeshaking flags</td>
<td>66.66 KB</td>
</tr>
<tr>
<td><code>@​sentry/browser</code> (incl. Tracing, Replay with
Canvas)</td>
<td>77.51 KB</td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-javascript/blob/8.51.0/CHANGELOG.md"><code>@​sentry/nextjs</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.51.0</h2>
<h3>Important Changes</h3>
<ul>
<li>
<p><strong>feat(v8/node): Add <code>prismaInstrumentation</code> option
to Prisma integration as escape hatch for all Prisma versions (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15128">#15128</a>)</strong></p>
<p>This release adds a compatibility API to add support for Prisma
version 6.
To capture performance data for Prisma version 6:</p>
<ol>
<li>
<p>Install the <code>@prisma/instrumentation</code> package on version
6.</p>
</li>
<li>
<p>Pass a <code>new PrismaInstrumentation()</code> instance as exported
from <code>@prisma/instrumentation</code> to the
<code>prismaInstrumentation</code> option:</p>
<pre lang="js"><code>import { PrismaInstrumentation } from
'@prisma/instrumentation';
<p>Sentry.init({
integrations: [
prismaIntegration({
// Override the default instrumentation that Sentry uses
prismaInstrumentation: new PrismaInstrumentation(),
}),
],
});
</code></pre></p>
<p>The passed instrumentation instance will override the default
instrumentation instance the integration would use, while the
<code>prismaIntegration</code> will still ensure data compatibility for
the various Prisma versions.</p>
</li>
<li>
<p>Remove the <code>previewFeatures = [&quot;tracing&quot;]</code>
option from the client generator block of your Prisma schema.</p>
</li>
</ol>
</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li>feat(v8/browser): Add <code>multiplexedtransport.js</code> CDN
bundle (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15046">#15046</a>)</li>
<li>feat(v8/browser): Add Unleash integration (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/14948">#14948</a>)</li>
<li>feat(v8/deno): Deprecate Deno SDK as published on deno.land (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15121">#15121</a>)</li>
<li>feat(v8/sveltekit): Deprecate <code>fetchProxyScriptNonce</code>
option (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15011">#15011</a>)</li>
<li>fix(v8/aws-lambda): Avoid overwriting root span name (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15054">#15054</a>)</li>
<li>fix(v8/core): <code>fatal</code> events should set session as
crashed (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15073">#15073</a>)</li>
<li>fix(v8/node/nestjs): Use method on current fastify request (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/15104">#15104</a>)</li>
</ul>
<p>Work in this release was contributed by <a
href="https://github.com/tjhiggins"><code>@​tjhiggins</code></a>, and <a
href="https://github.com/nwalters512"><code>@​nwalters512</code></a>.
Thank you for your contributions!</p>
<h2>8.50.0</h2>
<ul>
<li>feat(v8/react): Add support for React Router
<code>createMemoryRouter</code> (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/14985">#14985</a>)</li>
</ul>
<h2>8.49.0</h2>
<ul>
<li>feat(v8/browser): Flush offline queue on flush and browser online
event (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/14969">#14969</a>)</li>
<li>feat(v8/react): Add a <code>handled</code> prop to ErrorBoundary (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/14978">#14978</a>)</li>
<li>fix(profiling/v8): Don't put <code>require</code>,
<code>__filename</code> and <code>__dirname</code> on global object (<a
href="https://redirect.github.com/getsentry/sentry-javascript/pull/14952">#14952</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3a0e160267"><code>3a0e160</code></a>
release: 8.51.0</li>
<li><a
href="e9a5f000d2"><code>e9a5f00</code></a>
meta: Update Changelog for 8.51.0 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15113">#15113</a>)</li>
<li><a
href="d9138ffabf"><code>d9138ff</code></a>
feat(node/v8): Add <code>prismaInstrumentation</code> option to Prisma
integration as es...</li>
<li><a
href="d7aa93f38b"><code>d7aa93f</code></a>
feat(v8/sveltekit): Deprecate <code>fetchProxyScriptNonce</code> option
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15011">#15011</a>)</li>
<li><a
href="79c2c2a9ee"><code>79c2c2a</code></a>
feat(deno): Deprecate Deno SDK as published on deno.land (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15121">#15121</a>)</li>
<li><a
href="b0dc860004"><code>b0dc860</code></a>
feat(flags/v8): Add Unleash integration (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/14948">#14948</a>)</li>
<li><a
href="5f47fbbb2d"><code>5f47fbb</code></a>
chore(v8/deps): Deduplicate yarn.lock (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15094">#15094</a>)</li>
<li><a
href="8b870ba5b4"><code>8b870ba</code></a>
fix(v8/node/nestjs): Use method on current fastify request (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15104">#15104</a>)</li>
<li><a
href="d296ce0db3"><code>d296ce0</code></a>
fix(v8/core): <code>fatal</code> events should set session as crashed
(<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15073">#15073</a>)</li>
<li><a
href="dd2201e01e"><code>dd2201e</code></a>
chore(v8/deps): Upgrade to Vitest 2.1.8 and Vite 5.4.11 (<a
href="https://redirect.github.com/getsentry/sentry-javascript/issues/15038">#15038</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/getsentry/sentry-javascript/compare/8.48.0...8.51.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@stripe/stripe-js` from 5.4.0 to 5.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/stripe/stripe-js/releases"><code>@​stripe/stripe-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v5.5.0</h2>
<h3>New features</h3>
<ul>
<li>Add type definition for elements group update-end event (<a
href="https://redirect.github.com/stripe/stripe-js/issues/704">#704</a>)</li>
<li>Add paypal buttonType types (<a
href="https://redirect.github.com/stripe/stripe-js/issues/703">#703</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d251532cb4"><code>d251532</code></a>
Add type definition for elements group update-end event (<a
href="https://redirect.github.com/stripe/stripe-js/issues/704">#704</a>)</li>
<li><a
href="cf55c17944"><code>cf55c17</code></a>
Add paypal buttonType types (<a
href="https://redirect.github.com/stripe/stripe-js/issues/703">#703</a>)</li>
<li><a
href="e9989c66d7"><code>e9989c6</code></a>
v5.4.0</li>
<li>See full diff in <a
href="https://github.com/stripe/stripe-js/compare/v5.4.0...v5.5.0">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~bdaily-stripe">bdaily-stripe</a>, a new
releaser for <code>@​stripe/stripe-js</code> since your current
version.</p>
</details>
<br />

Updates `@supabase/supabase-js` from 2.47.10 to 2.48.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-js/releases"><code>@​supabase/supabase-js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v2.48.1</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.48.0...v2.48.1">2.48.1</a>
(2025-01-24)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>types:</strong> bump postgrest-js 1.18.1 (<a
href="da9e26d748">da9e26d</a>),
closes <a
href="https://redirect.github.com/supabase/supabase-js/issues/1354">#1354</a></li>
</ul>
<h2>v2.48.0</h2>
<h1><a
href="https://github.com/supabase/supabase-js/compare/v2.47.16...v2.48.0">2.48.0</a>
(2025-01-20)</h1>
<h3>Features</h3>
<ul>
<li><strong>deps:</strong> bump postgrest-js to 1.18.0 (<a
href="4397e57a7c">4397e57</a>)</li>
</ul>
<h2>v2.47.16</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.47.15...v2.47.16">2.47.16</a>
(2025-01-17)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>🐛 Fix nullish coalescing operator issue in
hasCustomAuthorizationHeader (<a
href="e8cffdad0d">e8cffda</a>),
closes <a
href="https://redirect.github.com/supabase/supabase-js/issues/1338">#1338</a></li>
</ul>
<h2>v2.47.15</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.47.14...v2.47.15">2.47.15</a>
(2025-01-16)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>Make the return value of accessToken nullable (<a
href="f8e48ffe87">f8e48ff</a>)</li>
</ul>
<h2>v2.47.14</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.47.13...v2.47.14">2.47.14</a>
(2025-01-15)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>bump postgrest-js to 1.17.11 (<a
href="6822cdc14c">6822cdc</a>)</li>
</ul>
<h2>v2.47.13</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.47.12...v2.47.13">2.47.13</a>
(2025-01-14)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>export PostgrestError as a class (<a
href="7ba8408183">7ba8408</a>)</li>
</ul>
<h2>v2.47.12</h2>
<h2><a
href="https://github.com/supabase/supabase-js/compare/v2.47.11...v2.47.12">2.47.12</a>
(2025-01-08)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3316f2426d"><code>3316f24</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1361">#1361</a>
from supabase/fix/chore-bump-postgrest-js-1-18-1</li>
<li><a
href="da9e26d748"><code>da9e26d</code></a>
fix(types): bump postgrest-js 1.18.1</li>
<li><a
href="07cf12d03e"><code>07cf12d</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1358">#1358</a>
from supabase/chore/bump-postgrest-js-1-18-0</li>
<li><a
href="4397e57a7c"><code>4397e57</code></a>
feat(deps): bump postgrest-js to 1.18.0</li>
<li><a
href="76217a46f6"><code>76217a4</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1344">#1344</a>
from raghavyuva/fix/nullish-coalescing-operator</li>
<li><a
href="a50725dd97"><code>a50725d</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1332">#1332</a>
from supabase/fix/nullable-accessToken</li>
<li><a
href="1661420e1b"><code>1661420</code></a>
Merge pull request <a
href="https://redirect.github.com/supabase/supabase-js/issues/1355">#1355</a>
from supabase/chore/bump-postgrest-js-1-17-11</li>
<li><a
href="6822cdc14c"><code>6822cdc</code></a>
fix: bump postgrest-js to 1.17.11</li>
<li><a
href="7ba8408183"><code>7ba8408</code></a>
fix: export PostgrestError as a class</li>
<li><a
href="80d3c76fa6"><code>80d3c76</code></a>
fix: Bump postgrest-js to 1.17.10</li>
<li>Additional commits viewable in <a
href="https://github.com/supabase/supabase-js/compare/v2.47.10...v2.48.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@xyflow/react` from 12.3.6 to 12.4.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/releases"><code>@​xyflow/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.2</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4957">#4957</a> <a
href="fe843982bf"><code>fe843982</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! -
Narrow properties selected, selectable, deletable, draggable of
NodeProps type to be required.</p>
</li>
<li>
<p>Updated dependencies [<a
href="fe843982bf"><code>fe843982</code></a>,
<a
href="e73ef09fbc"><code>e73ef09f</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.50</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.1</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4949">#4949</a> <a
href="592c7eaf95"><code>592c7eaf</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Fix
useNodeConnection hook not returning all connected edges.</p>
</li>
<li>
<p>Updated dependencies [<a
href="592c7eaf95"><code>592c7eaf</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.49</li>
</ul>
</li>
</ul>
<h2><code>@​xyflow/react</code><a
href="https://github.com/12"><code>@​12</code></a>.4.0</h2>
<h3>Minor Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/xyflow/xyflow/pull/4725">#4725</a> <a
href="e10f53cf89"><code>e10f53cf</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Add
useNodeConnections hook to track all connections to a node. Can be
filtered by handleType and handleId.</li>
</ul>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4947">#4947</a> <a
href="868aa3f3db"><code>868aa3f3</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Export ResizeControlVariant correctly as a value.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4880">#4880</a> <a
href="e2d849dca6"><code>e2d849dc</code></a>
Thanks <a href="https://github.com/crimx"><code>@​crimx</code></a>! -
Add type check for all event targets</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4929">#4929</a> <a
href="4947f683b7"><code>4947f683</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! -
Optimize selections and take into account if edges connected to selected
nodes are actually selectable.</p>
</li>
<li>
<p>Updated dependencies [<a
href="e2d849dca6"><code>e2d849dc</code></a>,
<a
href="e10f53cf89"><code>e10f53cf</code></a>,
<a
href="4947f683b7"><code>4947f683</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.48</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/xyflow/xyflow/blob/main/packages/react/CHANGELOG.md"><code>@​xyflow/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>12.4.2</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4957">#4957</a> <a
href="fe843982bf"><code>fe843982</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! -
Narrow properties selected, selectable, deletable, draggable of
NodeProps type to be required.</p>
</li>
<li>
<p>Updated dependencies [<a
href="fe843982bf"><code>fe843982</code></a>,
<a
href="e73ef09fbc"><code>e73ef09f</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.50</li>
</ul>
</li>
</ul>
<h2>12.4.1</h2>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4949">#4949</a> <a
href="592c7eaf95"><code>592c7eaf</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Fix
useNodeConnection hook not returning all connected edges.</p>
</li>
<li>
<p>Updated dependencies [<a
href="592c7eaf95"><code>592c7eaf</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.49</li>
</ul>
</li>
</ul>
<h2>12.4.0</h2>
<h3>Minor Changes</h3>
<ul>
<li><a
href="https://redirect.github.com/xyflow/xyflow/pull/4725">#4725</a> <a
href="e10f53cf89"><code>e10f53cf</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! - Add
useNodeConnections hook to track all connections to a node. Can be
filtered by handleType and handleId.</li>
</ul>
<h3>Patch Changes</h3>
<ul>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4947">#4947</a> <a
href="868aa3f3db"><code>868aa3f3</code></a>
Thanks <a href="https://github.com/moklick"><code>@​moklick</code></a>!
- Export ResizeControlVariant correctly as a value.</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4880">#4880</a> <a
href="e2d849dca6"><code>e2d849dc</code></a>
Thanks <a href="https://github.com/crimx"><code>@​crimx</code></a>! -
Add type check for all event targets</p>
</li>
<li>
<p><a
href="https://redirect.github.com/xyflow/xyflow/pull/4929">#4929</a> <a
href="4947f683b7"><code>4947f683</code></a>
Thanks <a
href="https://github.com/peterkogo"><code>@​peterkogo</code></a>! -
Optimize selections and take into account if edges connected to selected
nodes are actually selectable.</p>
</li>
<li>
<p>Updated dependencies [<a
href="e2d849dca6"><code>e2d849dc</code></a>,
<a
href="e10f53cf89"><code>e10f53cf</code></a>,
<a
href="4947f683b7"><code>4947f683</code></a>]:</p>
<ul>
<li><code>@​xyflow/system</code><a
href="https://github.com/0"><code>@​0</code></a>.0.48</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9ecb0bb6c7"><code>9ecb0bb</code></a>
chore(packages): bump</li>
<li><a
href="98b212f0d5"><code>98b212f</code></a>
Narrow NodeProps type properties selected, selectable, draggable and
deletabl...</li>
<li><a
href="562c9586d3"><code>562c958</code></a>
chore(packages): bump</li>
<li><a
href="dcf61e6042"><code>dcf61e6</code></a>
chore(packages): bump</li>
<li><a
href="bf7ef89bdb"><code>bf7ef89</code></a>
fix(types): export ResizeControlVariant correctly closes <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/4946">#4946</a></li>
<li><a
href="cdca1c55d1"><code>cdca1c5</code></a>
Merge pull request <a
href="https://github.com/xyflow/xyflow/tree/HEAD/packages/react/issues/4880">#4880</a>
from crimx/patch-2</li>
<li><a
href="78f9d4e645"><code>78f9d4e</code></a>
refactor(useNodeConnections): change param names</li>
<li><a
href="748c140146"><code>748c140</code></a>
fixes</li>
<li><a
href="228ea770a3"><code>228ea77</code></a>
let let be const</li>
<li><a
href="4947f683b7"><code>4947f68</code></a>
Move areSetsEqual to system</li>
<li>Additional commits viewable in <a
href="https://github.com/xyflow/xyflow/commits/@xyflow/react@12.4.2/packages/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `embla-carousel-react` from 8.5.1 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/davidjerleke/embla-carousel/releases">embla-carousel-react's
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>Support</h2>
<p>Embla Carousel is an open source MIT licensed project. If you are
interested in <strong>supporting this project</strong> you can sponsor
it here:</p>
<ul>
<li><a href="https://github.com/sponsors/davidjerleke"><strong><code>💖
Sponsor</code></strong></a></li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>[Bug]: Offset by 1 issue for canScrollNext when tab size has
fractional width by <a
href="https://github.com/yasuhiro-yamamoto"><code>@​yasuhiro-yamamoto</code></a>
in <a
href="https://redirect.github.com/davidjerleke/embla-carousel/pull/1096">davidjerleke/embla-carousel#1096</a></li>
<li>[Bug]: Autoplay never starts if page with carousel is loaded in
inactive browser tab by <a
href="https://github.com/davidjerleke"><code>@​davidjerleke</code></a>
in <a
href="https://redirect.github.com/davidjerleke/embla-carousel/pull/1101">davidjerleke/embla-carousel#1101</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/yasuhiro-yamamoto"><code>@​yasuhiro-yamamoto</code></a>
made their first contribution in <a
href="https://redirect.github.com/davidjerleke/embla-carousel/pull/1096">davidjerleke/embla-carousel#1096</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/davidjerleke/embla-carousel/compare/v8.5.1...v8.5.2">https://github.com/davidjerleke/embla-carousel/compare/v8.5.1...v8.5.2</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5ee3c4ed02"><code>5ee3c4e</code></a>
8.5.2</li>
<li><a
href="acad2f5460"><code>acad2f5</code></a>
Merge pull request <a
href="https://redirect.github.com/davidjerleke/embla-carousel/issues/1101">#1101</a>
from davidjerleke/bug/<a
href="https://redirect.github.com/davidjerleke/embla-carousel/issues/1082">#1082</a></li>
<li><a
href="6727eed531"><code>6727eed</code></a>
Bug fix for <a
href="https://redirect.github.com/davidjerleke/embla-carousel/issues/1082">#1082</a>.</li>
<li><a
href="1b019396e2"><code>1b01939</code></a>
Merge pull request <a
href="https://redirect.github.com/davidjerleke/embla-carousel/issues/1096">#1096</a>
from yasuhiro-yamamoto/fix/issue-899</li>
<li><a
href="266ef1bac1"><code>266ef1b</code></a>
Bug fix for <a
href="https://redirect.github.com/davidjerleke/embla-carousel/issues/899">#899</a>.</li>
<li><a
href="ba2c14cd12"><code>ba2c14c</code></a>
Instantly start animation progress.</li>
<li><a
href="e32119ab93"><code>e32119a</code></a>
Build docs with v8.5.1.</li>
<li>See full diff in <a
href="https://github.com/davidjerleke/embla-carousel/compare/v8.5.1...v8.5.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `lucide-react` from 0.469.0 to 0.474.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/lucide-icons/lucide/releases">lucide-react's
releases</a>.</em></p>
<blockquote>
<h2>New icons 0.474.0</h2>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>expand</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2677">#2677</a>)
by <a href="https://github.com/jguddas"><code>@​jguddas</code></a></li>
</ul>
<h2>New icons 0.473.0</h2>
<h2>Modified Icons 🔨</h2>
<ul>
<li><code>package</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2706">#2706</a>)
by <a href="https://github.com/sezze"><code>@​sezze</code></a></li>
</ul>
<h2>New icons 0.472.0</h2>
<h2>New icons 🎨</h2>
<ul>
<li><code>battery-plus</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2693">#2693</a>)
by <a
href="https://github.com/Footagesus"><code>@​Footagesus</code></a></li>
<li><code>map-plus</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2697">#2697</a>)
by <a
href="https://github.com/Seanw265"><code>@​Seanw265</code></a></li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>lucide-svelte: Make sure license ends up in SvelteKit bundles by <a
href="https://github.com/Lettnald"><code>@​Lettnald</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2728">lucide-icons/lucide#2728</a></li>
<li>lucide-react: Fixes aliases imports.</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/lucide-icons/lucide/compare/0.471.1...0.472.0">https://github.com/lucide-icons/lucide/compare/0.471.1...0.472.0</a></p>
<h2>Hotfix Lucide React exports</h2>
<h2>What's Changed</h2>
<ul>
<li>fix(lucide-react) Adds type module in package.json by <a
href="https://github.com/ericfennis"><code>@​ericfennis</code></a> in <a
href="https://redirect.github.com/lucide-icons/lucide/pull/2731">lucide-icons/lucide#2731</a></li>
</ul>
<h2>Dynamic Icon component Lucide React and new icons 0.471.0</h2>
<h2>New Dynamic Icon Component (lucide-react)</h2>
<p>This is an easier approach than the previous
<code>dynamicIconImports</code> we exported in the library. This one
supports all environments.
We removed the examples in the docs of how you can make a dynamic icon
yourself with a dedicated DynamicIcon component.
This one fetches the icon data itself and renders it instead of fetching
the Icon component from the library.
This makes it more flexible with all the frontend frameworks and
libraries that exist for React.</p>
<blockquote>
<p>🚨
Not recommended for regular applications that work fine with the regular
static icon components.
Using the dynamic icon component increases build time, separate bundles,
and separate network requests for each icon.</p>
</blockquote>
<h3>How to use</h3>
<p><code>DynamicIcon</code> is useful for applications that want to show
icons dynamically by icon name, for example when using a content
management system where icon names are stored in a database.</p>
<pre lang="jsx"><code>const App = () =&gt; (
&lt;DynamicIcon name=&quot;camera&quot; color=&quot;red&quot; size={48}
/&gt;
);
&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="961404d5cc"><code>961404d</code></a>
replace <code>keyof ReactSVG</code> with <code>SVGElementType</code> (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2668">#2668</a>)</li>
<li><a
href="31c3fefc17"><code>31c3fef</code></a>
fix(lucide-react) Adds type module in package.json (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2731">#2731</a>)</li>
<li><a
href="58c2e108c3"><code>58c2e10</code></a>
feat(lucide-react): Add DynamicIcon component (<a
href="https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react/issues/2686">#2686</a>)</li>
<li>See full diff in <a
href="https://github.com/lucide-icons/lucide/commits/0.474.0/packages/lucide-react">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-day-picker` from 9.5.0 to 9.5.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/gpbl/react-day-picker/releases">react-day-picker's
releases</a>.</em></p>
<blockquote>
<h2>v9.5.1</h2>
<p>This release fixes the calendar breaking its layout when passing a
<code>month</code> not included between <code>startMonth</code> and
<code>endMonth</code> props.</p>
<h2>What's Changed</h2>
<ul>
<li>fix: display calendar in a valid month when <code>month</code> prop
is invalid by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2672">gpbl/react-day-picker#2672</a></li>
<li>fix(test): using <code>new Date()</code> instead of
<code>today()</code> fails test by <a
href="https://github.com/gpbl"><code>@​gpbl</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2656">gpbl/react-day-picker#2656</a></li>
<li>chore(types): update <code>DateLib</code> to not import types from
date-fns by <a href="https://github.com/gpbl"><code>@​gpbl</code></a> in
<a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2655">gpbl/react-day-picker#2655</a></li>
<li>docs: fix broken <code>style.css</code> link by <a
href="https://github.com/jakedee"><code>@​jakedee</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2666">gpbl/react-day-picker#2666</a></li>
<li>docs: custom components guide to display better examples by <a
href="https://github.com/rodgobbi"><code>@​rodgobbi</code></a> in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2668">gpbl/react-day-picker#2668</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/jakedee"><code>@​jakedee</code></a> made
their first contribution in <a
href="https://redirect.github.com/gpbl/react-day-picker/pull/2666">gpbl/react-day-picker#2666</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.0...v9.5.1">https://github.com/gpbl/react-day-picker/compare/v9.5.0...v9.5.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c1e49e606f"><code>c1e49e6</code></a>
build: bump v9.5.1</li>
<li><a
href="9fa2d26421"><code>9fa2d26</code></a>
fix: display calendar in a valid month when month prop is invalid (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2672">#2672</a>)</li>
<li><a
href="553f702cc6"><code>553f702</code></a>
build: update dev dependencies (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2670">#2670</a>)</li>
<li><a
href="0441d3e0e0"><code>0441d3e</code></a>
Merge branch 'main' of <a
href="https://github.com/gpbl/react-day-picker">https://github.com/gpbl/react-day-picker</a></li>
<li><a
href="fa66a33fa4"><code>fa66a33</code></a>
docs: update for shadcn/ui users</li>
<li><a
href="bf909c25f3"><code>bf909c2</code></a>
docs: fix custom components docs (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2668">#2668</a>)</li>
<li><a
href="6b0abf9710"><code>6b0abf9</code></a>
docs: fix broken style.css link (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2666">#2666</a>)</li>
<li><a
href="9ad9de48fb"><code>9ad9de4</code></a>
chore: upgrade copyright statements to 2025</li>
<li><a
href="1f070c3c7c"><code>1f070c3</code></a>
chore(types): update DateLib to not import types from date-fns (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2655">#2655</a>)</li>
<li><a
href="c958dd089f"><code>c958dd0</code></a>
fix(test): using <code>new Date()</code> instead of <code>today()</code>
fails test (<a
href="https://redirect.github.com/gpbl/react-day-picker/issues/2656">#2656</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/gpbl/react-day-picker/compare/v9.5.0...v9.5.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-shepherd` from 6.1.6 to 6.1.7
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/shepherd-pro/shepherd/releases">react-shepherd's
releases</a>.</em></p>
<blockquote>
<h2>v6.1.7-react-shepherd</h2>
<h2>Release (2025-01-13)</h2>
<p>react-shepherd 6.1.7 (patch)
shepherd.js 14.4.0 (minor)</p>
<h4>🚀 Enhancement</h4>
<ul>
<li><code>shepherd.js</code>
<ul>
<li><a
href="https://redirect.github.com/shipshapecode/shepherd/pull/3068">#3068</a>
💄 Add reset for dialog element (<a
href="https://github.com/chuckcarpenter"><code>@​chuckcarpenter</code></a>)</li>
</ul>
</li>
</ul>
<h4>🐛 Bug Fix</h4>
<ul>
<li><code>shepherd.js</code>, <code>cypress-tests</code>
<ul>
<li><a
href="https://redirect.github.com/shipshapecode/shepherd/pull/3083">#3083</a>
 Remove tabindex to reduce tabs for modal trap (<a
href="https://github.com/chuckcarpenter"><code>@​...

_Description has been truncated_

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-28 13:25:54 +00:00
dependabot[bot]
9845a8a22a chore(frontend/deps-dev): bump the development-dependencies group in /autogpt_platform/frontend with 15 updates (#9347)
Bumps the development-dependencies group in /autogpt_platform/frontend
with 15 updates:

| Package | From | To |
| --- | --- | --- |
| [@playwright/test](https://github.com/microsoft/playwright) | `1.49.1`
| `1.50.0` |
|
[@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y)
| `8.5.0` | `8.5.2` |
|
[@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials)
| `8.5.0` | `8.5.2` |
|
[@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions)
| `8.5.0` | `8.5.2` |
|
[@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links)
| `8.5.0` | `8.5.2` |
|
[@storybook/addon-onboarding](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/onboarding)
| `8.5.0` | `8.5.2` |
|
[@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks)
| `8.5.0` | `8.5.2` |
|
[@storybook/nextjs](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/nextjs)
| `8.5.0` | `8.5.2` |
|
[@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react)
| `8.5.0` | `8.5.2` |
|
[@storybook/test](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/test)
| `8.5.0` | `8.5.2` |
|
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
| `22.10.7` | `22.10.10` |
| [chromatic](https://github.com/chromaui/chromatic-cli) | `11.25.0` |
`11.25.1` |
|
[eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next)
| `15.1.5` | `15.1.6` |
|
[prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss)
| `0.6.10` | `0.6.11` |
|
[storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli)
| `8.5.0` | `8.5.2` |

Updates `@playwright/test` from 1.49.1 to 1.50.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/microsoft/playwright/releases"><code>@​playwright/test</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v1.50.0</h2>
<h2>Test runner</h2>
<ul>
<li>
<p>New option <a
href="https://playwright.dev/docs/api/class-test#test-step-option-timeout"><code>timeout</code></a>
allows specifying a maximum run time for an individual test step. A
timed-out step will fail the execution of the test.</p>
<pre lang="js"><code>test('some test', async ({ page }) =&gt; {
  await test.step('a step', async () =&gt; {
    // This step can time out separately from the test
  }, { timeout: 1000 });
});
</code></pre>
</li>
<li>
<p>New method <a
href="https://playwright.dev/docs/api/class-test#test-step-skip">test.step.skip()</a>
to disable execution of a test step.</p>
<pre lang="js"><code>test('some test', async ({ page }) =&gt; {
  await test.step('before running step', async () =&gt; {
    // Normal step
  });
<p>await test.step.skip('not yet ready', async () =&gt; {<br />
// This step is skipped<br />
});</p>
<p>await test.step('after running step', async () =&gt; {<br />
// This step still runs even though the previous one was skipped<br />
});<br />
});<br />
</code></pre></p>
</li>
<li>
<p>Expanded <a
href="https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-match-aria-snapshot-2">expect(locator).toMatchAriaSnapshot()</a>
to allow storing of aria snapshots in separate YAML files.</p>
</li>
<li>
<p>Added method <a
href="https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-have-accessible-error-message">expect(locator).toHaveAccessibleErrorMessage()</a>
to assert the Locator points to an element with a given <a
href="https://w3c.github.io/aria/#aria-errormessage">aria
errormessage</a>.</p>
</li>
<li>
<p>Option <a
href="https://playwright.dev/docs/api/class-testconfig#test-config-update-snapshots">testConfig.updateSnapshots</a>
added the configuration enum <code>changed</code>. <code>changed</code>
updates only the snapshots that have changed, whereas <code>all</code>
now updates all snapshots, regardless of whether there are any
differences.</p>
</li>
<li>
<p>New option <a
href="https://playwright.dev/docs/api/class-testconfig#test-config-update-source-method">testConfig.updateSourceMethod</a>
defines the way source code is updated when <a
href="https://playwright.dev/docs/api/class-testconfig#test-config-update-snapshots">testConfig.updateSnapshots</a>
is configured. Added <code>overwrite</code> and <code>3-way</code> modes
that write the changes into source code, on top of existing
<code>patch</code> mode that creates a patch file.</p>
<pre lang="bash"><code>npx playwright test --update-snapshots=changed
--update-source-method=3way
</code></pre>
</li>
<li>
<p>Option <a
href="https://playwright.dev/docs/api/class-testconfig#test-config-web-server">testConfig.webServer</a>
added a <code>gracefulShutdown</code> field for specifying a process
kill signal other than the default <code>SIGKILL</code>.</p>
</li>
<li>
<p>Exposed <a
href="https://playwright.dev/docs/api/class-teststep#test-step-attachments">testStep.attachments</a>
from the reporter API to allow retrieval of all attachments created by
that step.</p>
</li>
</ul>
<h2>UI updates</h2>
<ul>
<li>Updated default HTML reporter to improve display of
attachments.</li>
<li>New button for picking elements to produce aria snapshots.</li>
<li>Additional details (such as keys pressed) are now displayed
alongside action API calls in traces.</li>
<li>Display of <code>canvas</code> content in traces is error-prone.
Display is now disabled by default, and can be enabled via the
<code>Display canvas content</code> UI setting.</li>
<li><code>Call</code> and <code>Network</code> panels now display
additional time information.</li>
</ul>
<h2>Breaking</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9d22178533"><code>9d22178</code></a>
chore: mark v1.50.0 (<a
href="https://redirect.github.com/microsoft/playwright/issues/34447">#34447</a>)</li>
<li><a
href="5d6ac9622d"><code>5d6ac96</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34442">#34442</a>):
fix(test runner): respect updateSourceMethod from the co...</li>
<li><a
href="97b76b46af"><code>97b76b4</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34440">#34440</a>):
chore(driver): roll driver to recent Node.js LTS version</li>
<li><a
href="7bbcc3c624"><code>7bbcc3c</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34353">#34353</a>):
chore: move attachment link back to tree item, make it f...</li>
<li><a
href="2811a1d4f5"><code>2811a1d</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34430">#34430</a>):
docs: switch gracefulShutdown to primarily mention SIGTE...</li>
<li><a
href="2b8d1ce260"><code>2b8d1ce</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34380">#34380</a>):
docs: release notes for v1.50 js (<a
href="https://redirect.github.com/microsoft/playwright/issues/34425">#34425</a>)</li>
<li><a
href="715eb250e7"><code>715eb25</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34409">#34409</a>):
fix(aria snapshot): make rebase work when options are sp...</li>
<li><a
href="6106ef020f"><code>6106ef0</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34410">#34410</a>):
fix(list reporter): do not break after output without tr...</li>
<li><a
href="09cd74f7b0"><code>09cd74f</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34407">#34407</a>):
fix(step.skip): show a skipped indicator in UI mode (<a
href="https://redirect.github.com/microsoft/playwright/issues/34">#34</a>...</li>
<li><a
href="cc6eb090ec"><code>cc6eb09</code></a>
cherry-pick(<a
href="https://redirect.github.com/microsoft/playwright/issues/34386">#34386</a>):
chore: step timeout improvements (<a
href="https://redirect.github.com/microsoft/playwright/issues/34387">#34387</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/microsoft/playwright/compare/v1.49.1...v1.50.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-a11y` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-a11y</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-a11y</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/a11y">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-essentials` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-essentials</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-essentials</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/essentials">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-interactions` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-interactions</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-interactions</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/interactions">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-links` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-links</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-links</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/links">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-onboarding` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-onboarding</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-onboarding</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/onboarding">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/blocks` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/blocks</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/blocks</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/blocks">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/nextjs` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/nextjs</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/nextjs</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li><a
href="032a7658ed"><code>032a765</code></a>
Merge pull request <a
href="https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/nextjs/issues/30333">#30333</a>
from storybookjs/interactions-to-component-2</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/frameworks/nextjs">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/react` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/react</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/react</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li><a
href="032a7658ed"><code>032a765</code></a>
Merge pull request <a
href="https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react/issues/30333">#30333</a>
from storybookjs/interactions-to-component-2</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/renderers/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/test` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/test</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/test</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/test">compare
view</a></li>
</ul>
</details>
<br />

Updates `@types/node` from 22.10.7 to 22.10.10
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare
view</a></li>
</ul>
</details>
<br />

Updates `chromatic` from 11.25.0 to 11.25.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/chromaui/chromatic-cli/releases">chromatic's
releases</a>.</em></p>
<blockquote>
<h2>v11.25.1</h2>
<h4>🐛 Bug Fix</h4>
<ul>
<li>Don't normalize package.json fields <a
href="https://redirect.github.com/chromaui/chromatic-cli/pull/1143">#1143</a>
(<a href="https://github.com/codykaup"><code>@​codykaup</code></a>)</li>
</ul>
<h4>Authors: 1</h4>
<ul>
<li>Cody Kaup (<a
href="https://github.com/codykaup"><code>@​codykaup</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/chromaui/chromatic-cli/blob/main/CHANGELOG.md">chromatic's
changelog</a>.</em></p>
<blockquote>
<h1>v11.25.1 (Wed Jan 22 2025)</h1>
<h4>🐛 Bug Fix</h4>
<ul>
<li>Don't normalize package.json fields <a
href="https://redirect.github.com/chromaui/chromatic-cli/pull/1143">#1143</a>
(<a href="https://github.com/codykaup"><code>@​codykaup</code></a>)</li>
</ul>
<h4>Authors: 1</h4>
<ul>
<li>Cody Kaup (<a
href="https://github.com/codykaup"><code>@​codykaup</code></a>)</li>
</ul>
<hr />
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="035a1bf6ef"><code>035a1bf</code></a>
Bump version to: 11.25.1 [skip ci]</li>
<li><a
href="f9af9e6ca4"><code>f9af9e6</code></a>
Update CHANGELOG.md [skip ci]</li>
<li><a
href="e69d42b2f6"><code>e69d42b</code></a>
Merge pull request <a
href="https://redirect.github.com/chromaui/chromatic-cli/issues/1143">#1143</a>
from chromaui/cody/cap-2409-cli-exits-silently-when-...</li>
<li><a
href="e9d7fa8a68"><code>e9d7fa8</code></a>
Don't normalize package.json fields</li>
<li>See full diff in <a
href="https://github.com/chromaui/chromatic-cli/compare/v11.25.0...v11.25.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `eslint-config-next` from 15.1.5 to 15.1.6
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases">eslint-config-next's
releases</a>.</em></p>
<blockquote>
<h2>v15.1.6</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>fix: don't memory-leak promises passed to waitUntil (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next/issues/75041">#75041</a>)</li>
<li>backport: fix prerender issue with intercepting routes +
generateStaticParams (<a
href="https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next/issues/75170">#75170</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/lubieowoce"><code>@​lubieowoce</code></a> and
<a href="https://github.com/ztanner"><code>@​ztanner</code></a> for
helping!</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="38a6d0177e"><code>38a6d01</code></a>
v15.1.6</li>
<li>See full diff in <a
href="https://github.com/vercel/next.js/commits/v15.1.6/packages/eslint-config-next">compare
view</a></li>
</ul>
</details>
<br />

Updates `prettier-plugin-tailwindcss` from 0.6.10 to 0.6.11
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases">prettier-plugin-tailwindcss's
releases</a>.</em></p>
<blockquote>
<h2>v0.6.11</h2>
<ul>
<li>Support TypeScript configs and plugins when using v4 (<a
href="https://redirect.github.com/tailwindlabs/prettier-plugin-tailwindcss/pull/342">#342</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md">prettier-plugin-tailwindcss's
changelog</a>.</em></p>
<blockquote>
<h2>[0.6.11] - 2025-01-23</h2>
<ul>
<li>Support TypeScript configs and plugins when using v4 (<a
href="https://redirect.github.com/tailwindlabs/prettier-plugin-tailwindcss/pull/342">#342</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="b5fb12c15b"><code>b5fb12c</code></a>
0.6.11</li>
<li><a
href="be269bd5e4"><code>be269bd</code></a>
Fix import</li>
<li><a
href="253033556b"><code>2530335</code></a>
Support loading TypeScript configs in v4 (<a
href="https://redirect.github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/342">#342</a>)</li>
<li><a
href="6d3fa0786f"><code>6d3fa07</code></a>
Update changelog</li>
<li><a
href="95fce37f64"><code>95fce37</code></a>
Update changelog</li>
<li><a
href="f8a2244735"><code>f8a2244</code></a>
Update changelog</li>
<li>See full diff in <a
href="https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.6.10...v0.6.11">compare
view</a></li>
</ul>
</details>
<br />

Updates `storybook` from 8.5.0 to 8.5.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases">storybook's
releases</a>.</em></p>
<blockquote>
<h2>v8.5.2</h2>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>v8.5.1</h2>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md">storybook's
changelog</a>.</em></p>
<blockquote>
<h2>8.5.2</h2>
<ul>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>CLI: Corrected Next.js createScript for pnpm. - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30304">#30304</a>,
thanks <a
href="https://github.com/zhyd1997"><code>@​zhyd1997</code></a>!</li>
</ul>
<h2>8.5.1</h2>
<ul>
<li>Addon Test: Replace <code>interaction test</code> -&gt;
<code>component test</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30333">#30333</a>,
thanks <a
href="https://github.com/kylegach"><code>@​kylegach</code></a>!</li>
<li>Addon Test: Support Vitest 3 browser.test.instances field - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30309">#30309</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Manager: Fix escaping of single quotes in dynamic import paths - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30278">#30278</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>RNW-Vite: Support requires for images/fonts - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30305">#30305</a>,
thanks <a
href="https://github.com/dannyhw"><code>@​dannyhw</code></a>!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7dac855e80"><code>7dac855</code></a>
Bump version from &quot;8.5.1&quot; to &quot;8.5.2&quot; [skip ci]</li>
<li><a
href="600af05703"><code>600af05</code></a>
Bump version from &quot;8.5.0&quot; to &quot;8.5.1&quot; [skip ci]</li>
<li>See full diff in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/cli">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-28 13:21:24 +00:00
Abhimanyu Yadav
56dc5610e4 fix(frontend) : add default support in oneOf field (#9352)
- Adding support of default value in oneOf field in
`node-input-components.tsx` file
- Also I have manually tested it and it's working.
2025-01-28 12:48:53 +00:00
Mario Sacaj
8685df587b CodeExecutionBlock split into InstantiationBlock & StepExecutionBlock (#9158)
Especially in case of heavy sandbox customization we don't want to spawn
a new VM every time we need to execute code, especially in circumstances
when time of inactivity is negligible.

### Changes 🏗️

Added two now blocks inside
`autogpt_platform/backend/backend/blocks/code_executor.py` which split
the logic of the CodeExecutionBlock in two parts: InstantiationBlock and
StepExecutionBlock.

The overall setup shall be the done in the InstantiationBlock which then
passes as output the `sandbox_id` which identifies the sandbox instance.

At a later stage any line of code can be executed through
StepExecutionBlock inside the same instance using the e2b library
function `sandbox = Sandbox.connect(sandbox_id=sandbox_id,
api_key=api_key)`. Variables and memory form earlier executions or
instantiation are persisted.

Beware, this approach does not make use of the beta apis to pause and
resume an instance. By using the approach above the VM will likely be
killed after the timeout inactivity set at instantiation time.


### New Features:

* **InstantiationBlock Class**:
- Added a new class to instantiate an isolated sandbox environment with
internet access for code execution. This class includes input and output
schemas, methods for running and executing code, and handles sandbox
setup commands and code execution.

* **StepExecutionBlock Class**:
- Introduced a new class to execute code in a previously instantiated
sandbox environment. This class also includes input and output schemas,
methods for running and executing step code, and handles connecting to
an existing sandbox for code execution.

### Minor Changes:

* **ProgrammingLanguage Enum**:
- Added a blank line for better readability within the
`ProgrammingLanguage` enum definition.

---------

Co-authored-by: Toran Bruce Richards <toran.richards@gmail.com>
Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-01-28 12:45:18 +00:00
Nicholas Tindle
7609969169 feat(blocks): Add blocks for GitHub checks & statuses (#9271)
<!-- Clearly explain the need for these changes: -->
We really want to be able to automate with our agents some behaviors
that involve blocking PRs or unblocking them based on automations.

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Adds Status Blocks for github
- Modifies the pull requests block to not have include pr changes as
advanced because that's a wild place to hide it
- Adds some disabled checks blocks that require github app
- Added IfMatches Block to make using stuff easier

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Built agent using

---------

Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-01-28 12:34:09 +00:00
Zamil Majdy
e0d153b284 fix(backend): Make spend credit failure as part of block execution failure (#9340)
<img width="1427" alt="image"
src="https://github.com/user-attachments/assets/de48ceb7-2a90-44e6-a687-d6759a1aa434"
/>

### Changes 🏗️

Block execution that cost credit can fail, the scope of this fix is
making this error as part of the node execution instead of a system
error.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-28 12:21:31 +00:00
Reinier van der Leer
0811e8a990 feat(backend): Enable executing store agents without agent ownership (#9267)
This re-introduces PR #9179 with some fixes.

This PR enables the execution of store agents even if they are not owned
by the user. Key changes include handling store-listed agents in the
`get_graph` logic, improving execution flow, and ensuring
version-specific handling. These updates support more flexible agent
execution.

### Changes 🏗️
(copied from #9179)

- **Graph Retrieval:** Updated `get_graph` to check store listings for
agents not owned by the user.
- **Version Handling:** Added `graph_version` to execution methods for
consistent version-specific execution.
- **Execution Flow:** Refactored `scheduler.py`, `rest_api.py`, and
other modules for clearer logic and better maintainability.
- **Testing:** Updated `test_manager.py` and other test cases to
validate execution of store-listed agents added test for accessing graph

Out-of-scope changes:
- Add logic to pretty-print Pydantic validation error responses to
backend API client in frontend

---------

Co-authored-by: Nicholas Tindle <nicktindle@outlook.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
Co-authored-by: Swifty <craigswift13@gmail.com>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-01-28 11:00:32 +00:00
Zamil Majdy
a7a59a26b9 feat(platform): Implement Auto-Top-Up credits capability (#9278)
<img width="1157" alt="image"
src="https://github.com/user-attachments/assets/5b70aa1e-876f-4163-b69e-c22bd21ea8d3"
/>

### Changes 🏗️

Added auto-top-up credits capability:
* Added autoTopUpConfig column on user
* Added autoTopUp form UI
* Added payment charge logic for top_up_credits 
* Added auto-top-up logic on spend_credits

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com>
2025-01-28 10:18:29 +00:00
Bently
40897ce874 fix(blocks): add ollama_host to AIConversationBlock (#9351)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

In the AI Conversation block it uses
``AIStructuredResponseGeneratorBlock.input`` for the input but it is
missing ollama_host, this means that if i try to use ollama with this
block, ollama_host is not passed, this PR fixes that by simply adding
``ollama_host=input_data.ollama_host`` to the ``class
AIConversationBlock(AIBlockBase):``

```diff
AIStructuredResponseGeneratorBlock.Input(
    prompt="",
    credentials=input_data.credentials,
    model=input_data.model,
    conversation_history=input_data.messages,
    max_tokens=input_data.max_tokens,
    expected_format={},
++  ollama_host=input_data.ollama_host,
),
```

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- [x] Run the AI Conversation block with a normal provider like GPT-4 to
see if it works like normal
- [x] Run the AI Conversation block with Ollama to make sure the changes
made work
2025-01-28 08:23:05 +00:00
Nicholas Tindle
ac8a466cda feat(platform): Add username+password credentials type; fix email and reddit blocks (#9113)
<!-- Clearly explain the need for these changes: -->
Update and adds a basic credential field for use in integrations like
reddit


### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- Reddit
	- Drops the Username and Password for reddit from the .env
	- Updates Reddit block with modern provider and credential system
- moves clientid and secret to reading from `Settings().secrets` rather
than input on the block
	- moves user agent to `Settings().config`

- SMTP
  - update the block to support user password and modern credentials

- Add `UserPasswordCredentials`
	- Default API key expiry to None explicitly to help type cohesion
- add `UserPasswordCredentials` with a weird form of `bearer` which we
ideally remove because `basic` is a more appropriate name. This is
dependent on `Webhook _base` allowing a subset of `Credentials`
	- Update `Credentials` and `CredentialsType`
- Fix various `OAuth2Credentials | APIKeyCredentials` -> `Credentials`
mismatches between base and derived classes
- Replace `router/@post(create_api_key_credentials)` with
`create_credentials` which now takes a credential and is discriminated
by `type` provided by the credential

- UI/Frontend
- Updated various pages to have saved credential types, icons, and text
for User Pass Credentials
- Update credential input to have an input/modals/selects for user/pass
combos
- Update the types to support having user/pass credentials too (we
should make this more centralized)
	- Update Credential Providres to support user_password
- Update `client.ts` to support the new streamlined credential creation
method and endpoint

- DX
	- Sort the provider names **again**


TODO:
- [x] Reactivate Conditionally Disabling Reddit
~~- [ ] Look into moving Webhooks base to allow subset of `Credentials`
rather than requiring all webhooks to support the input of all valid
`Credentials` types~~ Out of scope
- [x] Figure out the `singleCredential` calculator in
`credentials-input.tsx` so that it also respects User Pass credentials
and isn't a logic mess

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] Test with agents

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-01-28 08:07:50 +00:00
Nicholas Tindle
97ecaf5639 fix(test): timeout is causing intermittent failures (#9341)
<!-- Clearly explain the need for these changes: -->
Tests keep failing
### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- changes a 20 to 30
2025-01-27 21:09:59 +00:00
Nicholas Tindle
536bf8cdaf ci(repo): Update repo-close-stale-issues.yml (#9339)
<!-- Clearly explain the need for these changes: -->
We are making issues stale that aren’t. With the additions of more
careful project management this has become a hindrance rather than help.
### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->
- increases days until stale from 50 to 100
2025-01-27 08:55:35 +00:00
Zamil Majdy
bb3be444de feat(platform): Add multimedia file support & add basic Video blocks (#9320)
Currently, there is no support for passing files in the platform, each
generated file should be hosted somewhere.
This PR adds support of passing files temporarily during the execution
to open up more block that does multimedia operations.

<img width="583" alt="image"
src="https://github.com/user-attachments/assets/c285de5a-c2a9-41a0-9be1-305a316879d6"
/>

<img width="1291" alt="image"
src="https://github.com/user-attachments/assets/d7bcaf38-80fa-4b51-91da-b4eed80a02c1"
/>


### Changes 🏗️

* Add media support for passing files (local files, base64, URL) and
`FileStoreBlock` (file version of `StoreValueBlock`)
* Add initial multimedia blocks: `LoopVideoBlock` &
`AddAudioToVideoBlock`.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-26 16:08:05 +00:00
Nicholas Tindle
996efaf4fc fix: check if linear is enabled before showing blocks (#9338)
<!-- Clearly explain the need for these changes: -->
Linear blocks show up even if oauth isn't configured

### Changes 🏗️
disables the linear blocks if oauth isn't configured

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [x] checked block list with and without oauth configured
2025-01-26 15:06:03 +00:00
Zamil Majdy
479a8470fe fix(block): Remove TwitterUnblockUserBlock & TwitterBlockUserBlock (#9337)
Twitter API v2 Client update:
```
    .. versionadded:: 4.0

    .. versionchanged:: 4.15
        Removed ``block`` and ``unblock`` methods, as the endpoints they use
        have been removed
```

### Changes 🏗️

Remove TwitterUnblockUserBlock & TwitterBlockUserBlock.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-26 14:06:39 +00:00
Azraf Nahian
12eb495b2c Added autocomplete (#9333)
**Clearly explain the need for these changes:**
The changes were made to enhance the usability and accessibility of the
login and signup forms. By adding appropriate `autocomplete` attributes,
the forms are now more compatible with browsers and password managers,
improving the user experience by supporting autofill, password
generation, and accessibility.

Additionally, the `yarn.lock` file was updated to reflect dependency
changes made during this work, ensuring consistent dependency resolution
across all environments.

This PR also resolves **issue #9312**, which addresses missing
`autocomplete` attributes on login and signup forms.

---

### **Changes 🏗️**
- Added `autocomplete="username"` to the email input field in both login
and signup forms.
- Added `autocomplete="current-password"` to the password input field in
the login form.
- Added `autocomplete="new-password"` to the password and confirm
password input fields in the signup form.
- Updated `yarn.lock` to reflect dependency updates.
- Improved browser compatibility and user accessibility.
- Enhanced support for autofill and password generation for better form
usability.

---

### **Checklist 📋**

#### For code changes:
- [x] I have clearly listed my changes in the PR description.
- [x] I have made a test plan.
- [x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
- [x] Verified the `autocomplete` attributes are present in the rendered
HTML using browser DevTools.
- [x] Tested the login form for autofill compatibility with email and
password.
- [x] Tested the signup form with password generation using a password
manager.
  - [x] Ensured no functionality or styling was affected by the changes.

<details>
  <summary>Example test plan</summary>
  
- [x] Open the login form and verify that email
(`autocomplete="username"`) and password
(`autocomplete="current-password"`) inputs work with browser autofill.
- [x] Open the signup form and confirm that the password manager
suggests generating a strong password for `autocomplete="new-password"`.
  - [x] Verify that form submissions work as expected with no errors.
</details>

---

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes.
- [x] `docker-compose.yml` is updated or already compatible with my
changes.
- [x] I have included a list of my configuration changes in the PR
description (under **Changes**).

<details>
  <summary>Examples of configuration changes</summary>

No configuration changes were required for this PR.

</details> 

---

### **Issue Resolved:**
This pull request resolves **issue #9312** by adding the necessary
`autocomplete` attributes to the login and signup forms to improve
accessibility and compatibility with password managers.

---------

Co-authored-by: Nicholas Tindle <nicktindle@outlook.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-26 04:19:41 +00:00
Zamil Majdy
d74e4ef1a8 feat(block): Add LLM prompt as the output pin (#9330)
### Changes 🏗️

To ease the debugging, we can expose the prompt sent to the LLM
provider.

<img width="418" alt="image"
src="https://github.com/user-attachments/assets/0c8d7502-4f87-4002-a498-331f341859bd"
/>


### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-25 12:33:41 +00:00
Ayush Mittal
5b7a491a36 Resolve for issue #9082: Marketplace - "Select All" doesn't work in Agent Dashboard (#9247)
### Changes 🏗️

I have done changes in AgentTable and AgentTableRow components present
in autogpt_platform/frontend directory. The selectedAgents state is
passed on to AgentTableRow component, so that when Select All is
checked, individual check boxes also get checked.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description


#### For configuration changes:
- [ ] `.env.example` was already compatible with my changes
- [ ] `docker-compose.yml` was already compatible with my changes

---------

Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-24 17:16:51 +00:00
dependabot[bot]
016b4a6313 chore(frontend/deps-dev): bump the development-dependencies group across 1 directory with 17 updates (#9298)
Bumps the development-dependencies group with 15 updates in the
/autogpt_platform/frontend directory:

| Package | From | To |
| --- | --- | --- |
|
[@chromatic-com/storybook](https://github.com/chromaui/addon-visual-tests)
| `3.2.3` | `3.2.4` |
|
[@storybook/addon-a11y](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/a11y)
| `8.4.7` | `8.5.0` |
|
[@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials)
| `8.4.7` | `8.5.0` |
|
[@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions)
| `8.4.7` | `8.5.0` |
|
[@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links)
| `8.4.7` | `8.5.0` |
|
[@storybook/addon-onboarding](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/onboarding)
| `8.4.7` | `8.5.0` |
|
[@storybook/blocks](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/blocks)
| `8.4.7` | `8.5.0` |
|
[@storybook/nextjs](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/nextjs)
| `8.4.7` | `8.5.0` |
|
[@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)
| `22.10.5` | `22.10.7` |
| [chromatic](https://github.com/chromaui/chromatic-cli) | `11.22.0` |
`11.25.0` |
|
[eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next)
| `15.1.3` | `15.1.5` |
| [postcss](https://github.com/postcss/postcss) | `8.4.49` | `8.5.1` |
|
[prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss)
| `0.6.9` | `0.6.10` |
|
[storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/cli)
| `8.4.7` | `8.5.0` |
| [typescript](https://github.com/microsoft/TypeScript) | `5.7.2` |
`5.7.3` |


Updates `@chromatic-com/storybook` from 3.2.3 to 3.2.4
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/chromaui/addon-visual-tests/blob/v3.2.4/CHANGELOG.md"><code>@​chromatic-com/storybook</code>'s
changelog</a>.</em></p>
<blockquote>
<h1>v3.2.4 (Fri Jan 17 2025)</h1>
<h4>🐛 Bug Fix</h4>
<ul>
<li>Remove the connection timeout notification <a
href="https://redirect.github.com/chromaui/addon-visual-tests/pull/351">#351</a>
(<a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>)</li>
<li>Set up Codecov <a
href="https://redirect.github.com/chromaui/addon-visual-tests/pull/350">#350</a>
(<a
href="https://github.com/paulelliott"><code>@​paulelliott</code></a>)</li>
</ul>
<h4>Authors: 2</h4>
<ul>
<li>Paul Elliott (<a
href="https://github.com/paulelliott"><code>@​paulelliott</code></a>)</li>
<li>Valentin Palkovic (<a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>)</li>
</ul>
<hr />
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a490548df4"><code>a490548</code></a>
Bump version to: 3.2.4 [skip ci]</li>
<li><a
href="d86ecff42c"><code>d86ecff</code></a>
Update CHANGELOG.md [skip ci]</li>
<li><a
href="dcee16503c"><code>dcee165</code></a>
Merge pull request <a
href="https://redirect.github.com/chromaui/addon-visual-tests/issues/351">#351</a>
from chromaui/valentin/remove-connection-timeout-noti...</li>
<li><a
href="127a468c9e"><code>127a468</code></a>
Remove the connection timeout notification</li>
<li><a
href="a7a43dae6d"><code>a7a43da</code></a>
Merge pull request <a
href="https://redirect.github.com/chromaui/addon-visual-tests/issues/350">#350</a>
from chromaui/set-up-codecov</li>
<li><a
href="8499c6a425"><code>8499c6a</code></a>
Upload coverage reports to Codecov</li>
<li><a
href="476a673686"><code>476a673</code></a>
Set up vitest coverage reporting</li>
<li><a
href="74d3d8d575"><code>74d3d8d</code></a>
Update vitest to 2.1.8</li>
<li>See full diff in <a
href="https://github.com/chromaui/addon-visual-tests/compare/v3.2.3...v3.2.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-a11y` from 8.4.7 to 8.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-a11y</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.0</h2>
<h2>8.5.0</h2>
<p>Storybook 8.5 is packed with powerful features to enhance your
development workflow. This release makes it easier than ever to build
accessible, well-tested UIs. Here’s what’s new:</p>
<ul>
<li>🦾 Realtime accessibility tests to help build UIs for everybody</li>
<li>🛡️ Project code coverage to measure the completeness of your
tests</li>
<li>🎯 Focused tests for faster test feedback</li>
<li>⚛️ React Native Web Vite framework (experimental) for testing mobile
UI</li>
<li>⚛️ React 19 support</li>
<li>🎁 Storybook test early access program to level up your testing
game</li>
<li>💯 Hundreds more improvements</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>Addon A11y: Add conditional rendering for a11y violation number in
Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30073">#30073</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Add typesVersions support for TypeScript definitions in
a11y package - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30005">#30005</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Adjust default behaviour when using with
experimental-addon-test - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30162">#30162</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Change default element selector - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30253">#30253</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Create a11y test provider and revamp a11y addon - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29643">#29643</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Don't set a11y tag as comment in automigrations - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30257">#30257</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Fix skipped status handling in Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30077">#30077</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Refactor environment variable handling for Vitest
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30022">#30022</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Remove warnings API - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30049">#30049</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Run the a11y automigration on postInstall - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30004">#30004</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Show errors of axe properly - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30050">#30050</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Update accessibility status handling in
TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30027">#30027</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Dynamically import rehype - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29544">#29544</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Make new code panel opt in - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30248">#30248</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
<li>Addon Onboarding: Prebundle react-confetti - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29996">#29996</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add <code>@vitest/coverage-v8</code> during postinstall
if no coverage reporter is installed - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29993">#29993</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Add prerequisite check for MSW - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30193">#30193</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add support for previewHead - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29808">#29808</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Add Vitest 3 support - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30181">#30181</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Always run Vitest in watch mode internally - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29749">#29749</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Always use installed version of vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30134">#30134</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon Test: Clarify message when <code>vitest</code> detects missing
deps - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29763">#29763</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Clear coverage data when starting or watching - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30072">#30072</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu UI - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29727">#29727</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu updates - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30107">#30107</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Correctly stop Storybook when Vitest closes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30012">#30012</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Filter out falsy test results in TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30001">#30001</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix documentation links - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30128">#30128</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix duplicate <code>test.include</code> patterns - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30029">#30029</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix environment variable for Vitest Storybook
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30054">#30054</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix error reporting for <code>vitest</code> crashes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29751">#29751</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Fix generated path to <code>vitest.setup.js</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30233">#30233</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix indexing behavior - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29836">#29836</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix printing null% for coverage - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30061">#30061</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-a11y</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.0</h2>
<p>Storybook 8.5 is packed with powerful features to enhance your
development workflow. This release makes it easier than ever to build
accessible, well-tested UIs. Here’s what’s new:</p>
<ul>
<li>🦾 Realtime accessibility tests to help build UIs for everybody</li>
<li>🛡️ Project code coverage to measure the completeness of your
tests</li>
<li>🎯 Focused tests for faster test feedback</li>
<li>⚛️ React Native Web Vite framework (experimental) for testing mobile
UI⚛️</li>
<li>🎁 Storybook test early access program to level up your testing
game</li>
<li>💯 Hundreds more improvements</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>Addon A11y: Add conditional rendering for a11y violation number in
Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30073">#30073</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Add typesVersions support for TypeScript definitions in
a11y package - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30005">#30005</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Adjust default behaviour when using with
experimental-addon-test - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30162">#30162</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Change default element selector - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30253">#30253</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Create a11y test provider and revamp a11y addon - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29643">#29643</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Don't set a11y tag as comment in automigrations - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30257">#30257</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Fix skipped status handling in Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30077">#30077</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Refactor environment variable handling for Vitest
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30022">#30022</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Remove warnings API - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30049">#30049</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Run the a11y automigration on postInstall - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30004">#30004</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Show errors of axe properly - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30050">#30050</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Update accessibility status handling in
TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30027">#30027</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Dynamically import rehype - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29544">#29544</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Make new code panel opt in - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30248">#30248</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
<li>Addon Onboarding: Prebundle react-confetti - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29996">#29996</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add <code>@vitest/coverage-v8</code> during postinstall
if no coverage reporter is installed - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29993">#29993</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Add prerequisite check for MSW - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30193">#30193</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add support for previewHead - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29808">#29808</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Add Vitest 3 support - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30181">#30181</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Always run Vitest in watch mode internally - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29749">#29749</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Always use installed version of vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30134">#30134</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon Test: Clarify message when <code>vitest</code> detects missing
deps - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29763">#29763</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Clear coverage data when starting or watching - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30072">#30072</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu UI - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29727">#29727</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu updates - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30107">#30107</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Correctly stop Storybook when Vitest closes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30012">#30012</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Filter out falsy test results in TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30001">#30001</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix documentation links - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30128">#30128</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix duplicate <code>test.include</code> patterns - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30029">#30029</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix environment variable for Vitest Storybook
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30054">#30054</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix error reporting for <code>vitest</code> crashes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29751">#29751</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Fix generated path to <code>vitest.setup.js</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30233">#30233</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix indexing behavior - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29836">#29836</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix printing null% for coverage - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30061">#30061</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Fix run request while booting or restarting Vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29829">#29829</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Handle undefined storyId - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29998">#29998</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="92770672e5"><code>9277067</code></a>
Bump version from &quot;8.5.0-beta.11&quot; to &quot;8.5.0&quot; [skip
ci]</li>
<li><a
href="d8fe93ac1b"><code>d8fe93a</code></a>
Bump version from &quot;8.5.0-beta.10&quot; to &quot;8.5.0-beta.11&quot;
[skip ci]</li>
<li><a
href="426586d37a"><code>426586d</code></a>
Bump version from &quot;8.5.0-beta.9&quot; to &quot;8.5.0-beta.10&quot;
[skip ci]</li>
<li><a
href="6b337506e7"><code>6b33750</code></a>
Addon A11y: Change default element selector</li>
<li><a
href="a6a633a61e"><code>a6a633a</code></a>
Merge branch 'next-release' into next</li>
<li><a
href="b607dbe575"><code>b607dbe</code></a>
Bump version from &quot;8.5.0-beta.8&quot; to &quot;8.5.0-beta.9&quot;
[skip ci]</li>
<li><a
href="7e75f73809"><code>7e75f73</code></a>
Merge remote-tracking branch 'origin/next' into
valentin/a11y-refactorings</li>
<li><a
href="3b979ee412"><code>3b979ee</code></a>
Bump version from &quot;8.5.0-beta.7&quot; to &quot;8.5.0-beta.8&quot;
[skip ci]</li>
<li><a
href="21b452ac9e"><code>21b452a</code></a>
Rename a11ytest tag to a11y-test</li>
<li><a
href="8de05db935"><code>8de05db</code></a>
Enhance post-install script to inherit stdio for better logging during
addon ...</li>
<li>Additional commits viewable in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/a11y">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-essentials` from 8.4.7 to 8.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-essentials</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.0</h2>
<h2>8.5.0</h2>
<p>Storybook 8.5 is packed with powerful features to enhance your
development workflow. This release makes it easier than ever to build
accessible, well-tested UIs. Here’s what’s new:</p>
<ul>
<li>🦾 Realtime accessibility tests to help build UIs for everybody</li>
<li>🛡️ Project code coverage to measure the completeness of your
tests</li>
<li>🎯 Focused tests for faster test feedback</li>
<li>⚛️ React Native Web Vite framework (experimental) for testing mobile
UI</li>
<li>⚛️ React 19 support</li>
<li>🎁 Storybook test early access program to level up your testing
game</li>
<li>💯 Hundreds more improvements</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>Addon A11y: Add conditional rendering for a11y violation number in
Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30073">#30073</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Add typesVersions support for TypeScript definitions in
a11y package - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30005">#30005</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Adjust default behaviour when using with
experimental-addon-test - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30162">#30162</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Change default element selector - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30253">#30253</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Create a11y test provider and revamp a11y addon - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29643">#29643</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Don't set a11y tag as comment in automigrations - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30257">#30257</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Fix skipped status handling in Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30077">#30077</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Refactor environment variable handling for Vitest
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30022">#30022</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Remove warnings API - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30049">#30049</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Run the a11y automigration on postInstall - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30004">#30004</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Show errors of axe properly - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30050">#30050</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Update accessibility status handling in
TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30027">#30027</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Dynamically import rehype - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29544">#29544</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Make new code panel opt in - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30248">#30248</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
<li>Addon Onboarding: Prebundle react-confetti - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29996">#29996</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add <code>@vitest/coverage-v8</code> during postinstall
if no coverage reporter is installed - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29993">#29993</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Add prerequisite check for MSW - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30193">#30193</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add support for previewHead - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29808">#29808</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Add Vitest 3 support - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30181">#30181</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Always run Vitest in watch mode internally - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29749">#29749</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Always use installed version of vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30134">#30134</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon Test: Clarify message when <code>vitest</code> detects missing
deps - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29763">#29763</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Clear coverage data when starting or watching - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30072">#30072</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu UI - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29727">#29727</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu updates - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30107">#30107</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Correctly stop Storybook when Vitest closes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30012">#30012</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Filter out falsy test results in TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30001">#30001</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix documentation links - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30128">#30128</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix duplicate <code>test.include</code> patterns - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30029">#30029</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix environment variable for Vitest Storybook
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30054">#30054</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix error reporting for <code>vitest</code> crashes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29751">#29751</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Fix generated path to <code>vitest.setup.js</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30233">#30233</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix indexing behavior - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29836">#29836</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix printing null% for coverage - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30061">#30061</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-essentials</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.0</h2>
<p>Storybook 8.5 is packed with powerful features to enhance your
development workflow. This release makes it easier than ever to build
accessible, well-tested UIs. Here’s what’s new:</p>
<ul>
<li>🦾 Realtime accessibility tests to help build UIs for everybody</li>
<li>🛡️ Project code coverage to measure the completeness of your
tests</li>
<li>🎯 Focused tests for faster test feedback</li>
<li>⚛️ React Native Web Vite framework (experimental) for testing mobile
UI⚛️</li>
<li>🎁 Storybook test early access program to level up your testing
game</li>
<li>💯 Hundreds more improvements</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>Addon A11y: Add conditional rendering for a11y violation number in
Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30073">#30073</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Add typesVersions support for TypeScript definitions in
a11y package - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30005">#30005</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Adjust default behaviour when using with
experimental-addon-test - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30162">#30162</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Change default element selector - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30253">#30253</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Create a11y test provider and revamp a11y addon - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29643">#29643</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Don't set a11y tag as comment in automigrations - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30257">#30257</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Fix skipped status handling in Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30077">#30077</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Refactor environment variable handling for Vitest
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30022">#30022</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Remove warnings API - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30049">#30049</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Run the a11y automigration on postInstall - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30004">#30004</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Show errors of axe properly - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30050">#30050</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Update accessibility status handling in
TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30027">#30027</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Dynamically import rehype - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29544">#29544</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Make new code panel opt in - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30248">#30248</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
<li>Addon Onboarding: Prebundle react-confetti - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29996">#29996</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add <code>@vitest/coverage-v8</code> during postinstall
if no coverage reporter is installed - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29993">#29993</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Add prerequisite check for MSW - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30193">#30193</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add support for previewHead - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29808">#29808</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Add Vitest 3 support - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30181">#30181</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Always run Vitest in watch mode internally - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29749">#29749</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Always use installed version of vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30134">#30134</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon Test: Clarify message when <code>vitest</code> detects missing
deps - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29763">#29763</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Clear coverage data when starting or watching - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30072">#30072</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu UI - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29727">#29727</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu updates - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30107">#30107</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Correctly stop Storybook when Vitest closes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30012">#30012</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Filter out falsy test results in TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30001">#30001</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix documentation links - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30128">#30128</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix duplicate <code>test.include</code> patterns - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30029">#30029</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix environment variable for Vitest Storybook
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30054">#30054</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix error reporting for <code>vitest</code> crashes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29751">#29751</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Fix generated path to <code>vitest.setup.js</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30233">#30233</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix indexing behavior - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29836">#29836</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix printing null% for coverage - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30061">#30061</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Fix run request while booting or restarting Vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29829">#29829</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Handle undefined storyId - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29998">#29998</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="92770672e5"><code>9277067</code></a>
Bump version from &quot;8.5.0-beta.11&quot; to &quot;8.5.0&quot; [skip
ci]</li>
<li><a
href="d8fe93ac1b"><code>d8fe93a</code></a>
Bump version from &quot;8.5.0-beta.10&quot; to &quot;8.5.0-beta.11&quot;
[skip ci]</li>
<li><a
href="426586d37a"><code>426586d</code></a>
Bump version from &quot;8.5.0-beta.9&quot; to &quot;8.5.0-beta.10&quot;
[skip ci]</li>
<li><a
href="b607dbe575"><code>b607dbe</code></a>
Bump version from &quot;8.5.0-beta.8&quot; to &quot;8.5.0-beta.9&quot;
[skip ci]</li>
<li><a
href="3b979ee412"><code>3b979ee</code></a>
Bump version from &quot;8.5.0-beta.7&quot; to &quot;8.5.0-beta.8&quot;
[skip ci]</li>
<li><a
href="2b9f1cfc16"><code>2b9f1cf</code></a>
Bump version from &quot;8.5.0-beta.6&quot; to &quot;8.5.0-beta.7&quot;
[skip ci]</li>
<li><a
href="91f53fdf55"><code>91f53fd</code></a>
Bump version from &quot;8.5.0-beta.5&quot; to &quot;8.5.0-beta.6&quot;
[skip ci]</li>
<li><a
href="ef9ee273d6"><code>ef9ee27</code></a>
Bump version from &quot;8.5.0-beta.4&quot; to &quot;8.5.0-beta.5&quot;
[skip ci]</li>
<li><a
href="cf555266f5"><code>cf55526</code></a>
Bump version from &quot;8.5.0-beta.3&quot; to &quot;8.5.0-beta.4&quot;
[skip ci]</li>
<li><a
href="df37d0880e"><code>df37d08</code></a>
Bump version from &quot;8.5.0-beta.2&quot; to &quot;8.5.0-beta.3&quot;
[skip ci]</li>
<li>Additional commits viewable in <a
href="https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/essentials">compare
view</a></li>
</ul>
</details>
<br />

Updates `@storybook/addon-interactions` from 8.4.7 to 8.5.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/releases"><code>@​storybook/addon-interactions</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v8.5.0</h2>
<h2>8.5.0</h2>
<p>Storybook 8.5 is packed with powerful features to enhance your
development workflow. This release makes it easier than ever to build
accessible, well-tested UIs. Here’s what’s new:</p>
<ul>
<li>🦾 Realtime accessibility tests to help build UIs for everybody</li>
<li>🛡️ Project code coverage to measure the completeness of your
tests</li>
<li>🎯 Focused tests for faster test feedback</li>
<li>⚛️ React Native Web Vite framework (experimental) for testing mobile
UI</li>
<li>⚛️ React 19 support</li>
<li>🎁 Storybook test early access program to level up your testing
game</li>
<li>💯 Hundreds more improvements</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>Addon A11y: Add conditional rendering for a11y violation number in
Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30073">#30073</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Add typesVersions support for TypeScript definitions in
a11y package - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30005">#30005</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Adjust default behaviour when using with
experimental-addon-test - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30162">#30162</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Change default element selector - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30253">#30253</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Create a11y test provider and revamp a11y addon - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29643">#29643</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Don't set a11y tag as comment in automigrations - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30257">#30257</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Fix skipped status handling in Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30077">#30077</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Refactor environment variable handling for Vitest
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30022">#30022</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Remove warnings API - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30049">#30049</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Run the a11y automigration on postInstall - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30004">#30004</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Show errors of axe properly - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30050">#30050</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Update accessibility status handling in
TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30027">#30027</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Dynamically import rehype - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29544">#29544</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Make new code panel opt in - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30248">#30248</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
<li>Addon Onboarding: Prebundle react-confetti - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29996">#29996</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add <code>@vitest/coverage-v8</code> during postinstall
if no coverage reporter is installed - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29993">#29993</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Add prerequisite check for MSW - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30193">#30193</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add support for previewHead - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29808">#29808</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Add Vitest 3 support - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30181">#30181</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Always run Vitest in watch mode internally - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29749">#29749</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Always use installed version of vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30134">#30134</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon Test: Clarify message when <code>vitest</code> detects missing
deps - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29763">#29763</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Clear coverage data when starting or watching - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30072">#30072</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu UI - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29727">#29727</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu updates - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30107">#30107</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Correctly stop Storybook when Vitest closes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30012">#30012</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Filter out falsy test results in TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30001">#30001</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix documentation links - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30128">#30128</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix duplicate <code>test.include</code> patterns - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30029">#30029</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix environment variable for Vitest Storybook
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30054">#30054</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix error reporting for <code>vitest</code> crashes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29751">#29751</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Fix generated path to <code>vitest.setup.js</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30233">#30233</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix indexing behavior - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29836">#29836</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix printing null% for coverage - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30061">#30061</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md"><code>@​storybook/addon-interactions</code>'s
changelog</a>.</em></p>
<blockquote>
<h2>8.5.0</h2>
<p>Storybook 8.5 is packed with powerful features to enhance your
development workflow. This release makes it easier than ever to build
accessible, well-tested UIs. Here’s what’s new:</p>
<ul>
<li>🦾 Realtime accessibility tests to help build UIs for everybody</li>
<li>🛡️ Project code coverage to measure the completeness of your
tests</li>
<li>🎯 Focused tests for faster test feedback</li>
<li>⚛️ React Native Web Vite framework (experimental) for testing mobile
UI⚛️</li>
<li>🎁 Storybook test early access program to level up your testing
game</li>
<li>💯 Hundreds more improvements</li>
</ul>
<!-- raw HTML omitted -->
<ul>
<li>Addon A11y: Add conditional rendering for a11y violation number in
Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30073">#30073</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Add typesVersions support for TypeScript definitions in
a11y package - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30005">#30005</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Adjust default behaviour when using with
experimental-addon-test - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30162">#30162</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Change default element selector - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30253">#30253</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Create a11y test provider and revamp a11y addon - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29643">#29643</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Don't set a11y tag as comment in automigrations - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30257">#30257</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Fix skipped status handling in Testing Module - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30077">#30077</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Refactor environment variable handling for Vitest
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30022">#30022</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon A11y: Remove warnings API - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30049">#30049</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Run the a11y automigration on postInstall - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30004">#30004</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Show errors of axe properly - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30050">#30050</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon A11y: Update accessibility status handling in
TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30027">#30027</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Dynamically import rehype - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29544">#29544</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Docs: Make new code panel opt in - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30248">#30248</a>,
thanks <a
href="https://github.com/shilman"><code>@​shilman</code></a>!</li>
<li>Addon Onboarding: Prebundle react-confetti - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29996">#29996</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add <code>@vitest/coverage-v8</code> during postinstall
if no coverage reporter is installed - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29993">#29993</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Add prerequisite check for MSW - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30193">#30193</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Add support for previewHead - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29808">#29808</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Add Vitest 3 support - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30181">#30181</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Always run Vitest in watch mode internally - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29749">#29749</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Always use installed version of vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30134">#30134</a>,
thanks <a
href="https://github.com/kasperpeulen"><code>@​kasperpeulen</code></a>!</li>
<li>Addon Test: Clarify message when <code>vitest</code> detects missing
deps - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29763">#29763</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Clear coverage data when starting or watching - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30072">#30072</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu UI - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29727">#29727</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Context menu updates - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30107">#30107</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Correctly stop Storybook when Vitest closes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30012">#30012</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Filter out falsy test results in TestProviderRender - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30001">#30001</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix documentation links - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30128">#30128</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix duplicate <code>test.include</code> patterns - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30029">#30029</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix environment variable for Vitest Storybook
integration - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30054">#30054</a>,
thanks <a
href="https://github.com/valentinpalkovic"><code>@​valentinpalkovic</code></a>!</li>
<li>Addon Test: Fix error reporting for <code>vitest</code> crashes - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29751">#29751</a>,
thanks <a
href="https://github.com/ndelangen"><code>@​ndelangen</code></a>!</li>
<li>Addon Test: Fix generated path to <code>vitest.setup.js</code> - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30233">#30233</a>,
thanks <a
href="https://github.com/JReinhold"><code>@​JReinhold</code></a>!</li>
<li>Addon Test: Fix indexing behavior - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29836">#29836</a>,
thanks <a
href="https://github.com/yannbf"><code>@​yannbf</code></a>!</li>
<li>Addon Test: Fix printing null% for coverage - <a
href="https://redirect.github.com/storybookjs/storybook/pull/30061">#30061</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Fix run request while booting or restarting Vitest - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29829">#29829</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
<li>Addon Test: Handle undefined storyId - <a
href="https://redirect.github.com/storybookjs/storybook/pull/29998">#29998</a>,
thanks <a
href="https://github.com/ghengeveld"><code>@​ghengeveld</code></a>!</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="92770672e5"><code>9277067</code></a>
Bump version from &quot;8.5.0-beta.11&quot; to &quot;8.5.0&quot; [skip
ci]</li>
<li><a
href="e447db6537"><code>e447db6</code></a>
Merge branch 'next' into jeppe/fix-interactions-removal</li>
<li><a
href="1a0d0eaa34"><code>1a0d0ea</code></a>
move addon order check from preset.js to dist/preset.js</li>
<li><a
href="d8fe93ac1b"><code>d8fe93a</code></a>
Bump version from &quot;8.5.0-beta.10&quot; to &quot;8.5.0-beta.11&quot;
[skip ci]</li>
<li><a
href="426586d37a"><code>426586d</code></a>
Bump version from &quot;8.5.0-beta.9&quot; to &quot;8.5.0-beta.10&quot;
[skip ci]</li>
<li><a
href="b607dbe575"><code>b607dbe</code></a>
Bump version from &quot;8.5.0-beta.8&quot; to &quot;8.5.0-beta.9&quot;
[skip ci]</li>
<li><a
href="3b979ee412"><code>3b979ee</code></a>
Bump version from &quot;8.5.0-beta.7&quot; to &quot;8.5.0-beta.8&quot;
[skip ci]</li>
<li><a
href="2b9f1cfc16"><code>2b9f1cf</code></a>
Bump version from &quot;8.5.0-beta.6&quot; to &quot;8.5.0-beta.7&quot;
[skip ci]</li>
<li><a
href="91f53fdf55"><code>91f53fd</code></a>
Bump version from &quot;8.5.0-beta.5&quot; to &quot;8.5.0-beta.6&quot;
[skip ci]</li>
<li><a
href="ef9ee273d6"><code>ef9ee27</code></a>
Bump version from &quot;8.5.0-beta.4&quot; to &quot;8.5.0-beta.5&quot;
[skip ci]</li>
<li>Additional ...

_Description has been truncated_

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-24 16:21:09 +00:00
dependabot[bot]
21337e6bc4 chore(libs/deps): bump the production-dependencies group across 1 directory with 4 updates (#9237)
Bumps the production-dependencies group with 4 updates in the
/autogpt_platform/autogpt_libs directory:
[pydantic](https://github.com/pydantic/pydantic),
[pydantic-settings](https://github.com/pydantic/pydantic-settings),
[pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) and
[supabase](https://github.com/supabase/supabase-py).

Updates `pydantic` from 2.10.3 to 2.10.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/releases">pydantic's
releases</a>.</em></p>
<blockquote>
<h2>v2.10.4 2024-12-18</h2>
<h2>What's Changed</h2>
<h3>Packaging</h3>
<ul>
<li>Bump <code>pydantic-core</code> to v2.27.2 by <a
href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a> in
<a
href="https://redirect.github.com/pydantic/pydantic/pull/11138">#11138</a></li>
</ul>
<h3>Fixes</h3>
<ul>
<li>Fix for comparison of <code>AnyUrl</code> objects by <a
href="https://github.com/alexprabhat99"><code>@​alexprabhat99</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11082">#11082</a></li>
<li>Properly fetch PEP 695 type params for functions, do not fetch
annotations from signature by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11093">#11093</a></li>
<li>Include JSON Schema input core schema in function schemas by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11085">#11085</a></li>
<li>Add <code>len</code> to <code>_BaseUrl</code> to avoid TypeError by
<a href="https://github.com/Kharianne"><code>@​Kharianne</code></a> in
<a
href="https://redirect.github.com/pydantic/pydantic/pull/11111">#11111</a></li>
<li>Make sure the type reference is removed from the seen references by
<a href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11143">#11143</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/alexprabhat99"><code>@​alexprabhat99</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11082">#11082</a></li>
<li><a href="https://github.com/Kharianne"><code>@​Kharianne</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11111">#11111</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic/compare/v2.10.3...v2.10.4">https://github.com/pydantic/pydantic/compare/v2.10.3...v2.10.4</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic/blob/main/HISTORY.md">pydantic's
changelog</a>.</em></p>
<blockquote>
<h2>v2.10.5 (2025-01-08)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.10.5">GitHub
release</a></p>
<h3>What's Changed</h3>
<ul>
<li>Remove custom MRO implementation of Pydantic models by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11184">#11184</a></li>
<li>Fix URL serialization for unions by <a
href="https://github.com/sydney-runkle"><code>@​sydney-runkle</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11233">#11233</a></li>
</ul>
<h2>v2.10.4 (2024-12-18)</h2>
<p><a
href="https://github.com/pydantic/pydantic/releases/tag/v2.10.4">GitHub
release</a></p>
<h3>What's Changed</h3>
<h4>Packaging</h4>
<ul>
<li>Bump <code>pydantic-core</code> to v2.27.2 by <a
href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a> in
<a
href="https://redirect.github.com/pydantic/pydantic/pull/11138">#11138</a></li>
</ul>
<h4>Fixes</h4>
<ul>
<li>Fix for comparison of <code>AnyUrl</code> objects by <a
href="https://github.com/alexprabhat99"><code>@​alexprabhat99</code></a>
in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11082">#11082</a></li>
<li>Properly fetch PEP 695 type params for functions, do not fetch
annotations from signature by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11093">#11093</a></li>
<li>Include JSON Schema input core schema in function schemas by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11085">#11085</a></li>
<li>Add <code>len</code> to <code>_BaseUrl</code> to avoid TypeError by
<a href="https://github.com/Kharianne"><code>@​Kharianne</code></a> in
<a
href="https://redirect.github.com/pydantic/pydantic/pull/11111">#11111</a></li>
<li>Make sure the type reference is removed from the seen references by
<a href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11143">#11143</a></li>
</ul>
<h3>New Contributors</h3>
<ul>
<li><a href="https://github.com/FyZzyss"><code>@​FyZzyss</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10789">#10789</a></li>
<li><a href="https://github.com/tamird"><code>@​tamird</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/10948">#10948</a></li>
<li><a href="https://github.com/felixxm"><code>@​felixxm</code></a> made
their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11077">#11077</a></li>
<li><a
href="https://github.com/alexprabhat99"><code>@​alexprabhat99</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11082">#11082</a></li>
<li><a href="https://github.com/Kharianne"><code>@​Kharianne</code></a>
made their first contribution in <a
href="https://redirect.github.com/pydantic/pydantic/pull/11111">#11111</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="5d34efda82"><code>5d34efd</code></a>
Prepare release v2.10.5 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11237">#11237</a>)</li>
<li><a
href="6e585f925e"><code>6e585f9</code></a>
Fix url serialization for unions (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11233">#11233</a>)</li>
<li><a
href="5a22e02608"><code>5a22e02</code></a>
Remove custom MRO implementation of Pydantic models (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11195">#11195</a>)</li>
<li><a
href="5bd3a6507b"><code>5bd3a65</code></a>
fix history.md</li>
<li><a
href="46f094569a"><code>46f0945</code></a>
Prepare for v2.10.4 (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11144">#11144</a>)</li>
<li><a
href="ea69e695f2"><code>ea69e69</code></a>
Make sure the type reference is removed from the seen references (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11145">#11145</a>)</li>
<li><a
href="a07c31e4a4"><code>a07c31e</code></a>
Include JSON Schema input core schema in function schemas (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11142">#11142</a>)</li>
<li><a
href="9166d55163"><code>9166d55</code></a>
Update <code>WithJsonSchema</code> documentation, add usage
documentation for `json_sche...</li>
<li><a
href="572f57de01"><code>572f57d</code></a>
Rewrite validators documentation (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11060">#11060</a>)</li>
<li><a
href="9faa8d9cbd"><code>9faa8d9</code></a>
Fix for comaparison of AnyUrl objects (<a
href="https://redirect.github.com/pydantic/pydantic/issues/11082">#11082</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/pydantic/pydantic/compare/v2.10.3...v2.10.5">compare
view</a></li>
</ul>
</details>
<br />

Updates `pydantic-settings` from 2.7.0 to 2.7.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pydantic/pydantic-settings/releases">pydantic-settings's
releases</a>.</em></p>
<blockquote>
<h2>v2.7.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Move preferred alias resolution to private method by <a
href="https://github.com/kschwab"><code>@​kschwab</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/507">pydantic/pydantic-settings#507</a></li>
<li>Prepare release 2.7.1 by <a
href="https://github.com/hramezani"><code>@​hramezani</code></a> in <a
href="https://redirect.github.com/pydantic/pydantic-settings/pull/511">pydantic/pydantic-settings#511</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.7.0...v2.7.1">https://github.com/pydantic/pydantic-settings/compare/v2.7.0...v2.7.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="c989335d26"><code>c989335</code></a>
Prepare release 2.7.1 (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/511">#511</a>)</li>
<li><a
href="66ecc3adec"><code>66ecc3a</code></a>
Move preferred alias resolution to private method (<a
href="https://redirect.github.com/pydantic/pydantic-settings/issues/507">#507</a>)</li>
<li>See full diff in <a
href="https://github.com/pydantic/pydantic-settings/compare/v2.7.0...v2.7.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pytest-asyncio` from 0.25.0 to 0.25.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pytest-dev/pytest-asyncio/releases">pytest-asyncio's
releases</a>.</em></p>
<blockquote>
<h2>pytest-asyncio 0.25.2</h2>
<ul>
<li>Call <code>loop.shutdown_asyncgens()</code> before closing the event
loop to ensure async generators are closed in the same manner as
<code>asyncio.run</code> does <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/pull/1034">#1034</a></li>
</ul>
<h2>pytest-asyncio 0.25.1</h2>
<ul>
<li>Fixes an issue that caused a broken event loop when a
function-scoped test was executed in between two tests with wider loop
scope <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/950">#950</a></li>
<li>Improves test collection speed in auto mode <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/pull/1020">#1020</a></li>
<li>Corrects the warning that is emitted upon redefining the event_loop
fixture</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2188cdbbf7"><code>2188cdb</code></a>
build: Prepare release of v0.25.2.</li>
<li><a
href="c3ad6340b8"><code>c3ad634</code></a>
fix: Shutdown generators before closing event loops.</li>
<li><a
href="e8ffb10528"><code>e8ffb10</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="aae43d4f76"><code>aae43d4</code></a>
Build(deps): Bump hypothesis in /dependencies/default</li>
<li><a
href="941e8b5104"><code>941e8b5</code></a>
Build(deps): Bump pygments from 2.18.0 to 2.19.1 in
/dependencies/docs</li>
<li><a
href="623ab74b80"><code>623ab74</code></a>
docs: Prepare release of v0.25.1.</li>
<li><a
href="c236550e73"><code>c236550</code></a>
docs: Fix broken link to the pytest.mark.asyncio reference.</li>
<li><a
href="41c645b3b7"><code>41c645b</code></a>
fix: Correct warning message when redefining the event_loop
fixture.</li>
<li><a
href="2fd10f8243"><code>2fd10f8</code></a>
docs: Clarify deprecation of event_loop fixture.</li>
<li><a
href="a4e82ab25b"><code>a4e82ab</code></a>
docs: Added changelog entry for <a
href="https://redirect.github.com/pytest-dev/pytest-asyncio/issues/1020">#1020</a>.</li>
<li>Additional commits viewable in <a
href="https://github.com/pytest-dev/pytest-asyncio/compare/v0.25.0...v0.25.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `supabase` from 2.10.0 to 2.11.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/releases">supabase's
releases</a>.</em></p>
<blockquote>
<h2>v2.11.0</h2>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.10.0...v2.11.0">2.11.0</a>
(2024-12-30)</h2>
<h3>Features</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.11.0 to 2.11.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1021">#1021</a>)
(<a
href="17e8a662de">17e8a66</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.8.0 to 0.9.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1008">#1008</a>)
(<a
href="19ab5df525">19ab5df</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 0.19.0 to 0.19.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1022">#1022</a>)
(<a
href="9a8b72fe3d">9a8b72f</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.0.6 to 2.1.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1019">#1019</a>)
(<a
href="f251d520af">f251d52</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.10.0 to 0.11.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1020">#1020</a>)
(<a
href="fb7a7e1257">fb7a7e1</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>remove project reference (<a
href="https://redirect.github.com/supabase/supabase-py/issues/999">#999</a>)
(<a
href="e126d04d26">e126d04</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/supabase/supabase-py/blob/main/CHANGELOG.md">supabase's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/supabase/supabase-py/compare/v2.10.0...v2.11.0">2.11.0</a>
(2024-12-30)</h2>
<h3>Features</h3>
<ul>
<li><strong>auth:</strong> bump gotrue from 2.10.0 to 2.11.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1005">#1005</a>)
(<a
href="721de30e5b">721de30</a>)</li>
<li><strong>auth:</strong> bump gotrue from 2.11.0 to 2.11.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1021">#1021</a>)
(<a
href="17e8a662de">17e8a66</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.7.0 to 0.8.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1006">#1006</a>)
(<a
href="bfc4a5c1e3">bfc4a5c</a>)</li>
<li><strong>functions:</strong> bump supafunc from 0.8.0 to 0.9.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1008">#1008</a>)
(<a
href="19ab5df525">19ab5df</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 0.18.0 to 0.19.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1004">#1004</a>)
(<a
href="d7861b0c4d">d7861b0</a>)</li>
<li><strong>postgrest:</strong> bump postgrest from 0.19.0 to 0.19.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1022">#1022</a>)
(<a
href="9a8b72fe3d">9a8b72f</a>)</li>
<li><strong>realtime:</strong> bump realtime from 2.0.6 to 2.1.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1019">#1019</a>)
(<a
href="f251d520af">f251d52</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.10.0 to 0.11.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1020">#1020</a>)
(<a
href="fb7a7e1257">fb7a7e1</a>)</li>
<li><strong>storage:</strong> bump storage3 from 0.9.0 to 0.10.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1003">#1003</a>)
(<a
href="718edc3892">718edc3</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>remove project reference (<a
href="https://redirect.github.com/supabase/supabase-py/issues/999">#999</a>)
(<a
href="e126d04d26">e126d04</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6fed6d64a1"><code>6fed6d6</code></a>
chore(main): release 2.11.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1000">#1000</a>)</li>
<li><a
href="9a8b72fe3d"><code>9a8b72f</code></a>
feat(postgrest): bump postgrest from 0.19.0 to 0.19.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1022">#1022</a>)</li>
<li><a
href="17e8a662de"><code>17e8a66</code></a>
feat(auth): bump gotrue from 2.11.0 to 2.11.1 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1021">#1021</a>)</li>
<li><a
href="fb7a7e1257"><code>fb7a7e1</code></a>
feat(storage): bump storage3 from 0.10.0 to 0.11.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1020">#1020</a>)</li>
<li><a
href="f251d520af"><code>f251d52</code></a>
feat(realtime): bump realtime from 2.0.6 to 2.1.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1019">#1019</a>)</li>
<li><a
href="616bc21629"><code>616bc21</code></a>
chore(deps-dev): bump jinja2 from 3.1.4 to 3.1.5 in the pip group across
1 di...</li>
<li><a
href="4f68eee25b"><code>4f68eee</code></a>
chore: Add Coveralls to CI (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1018">#1018</a>)</li>
<li><a
href="7ecf6b62c7"><code>7ecf6b6</code></a>
chore(deps-dev): bump pytest-asyncio from 0.24.0 to 0.25.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1014">#1014</a>)</li>
<li><a
href="3fa4814937"><code>3fa4814</code></a>
chore: update httpx (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1013">#1013</a>)</li>
<li><a
href="c81ffbaac5"><code>c81ffba</code></a>
chore(deps-dev): bump commitizen from 4.0.0 to 4.1.0 (<a
href="https://redirect.github.com/supabase/supabase-py/issues/1012">#1012</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/supabase/supabase-py/compare/v2.10.0...v2.11.0">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-24 15:54:29 +00:00
Zamil Majdy
88f711e486 fix(backend): Make monthly top-up adjust the target balance instead of top-up the target amount (#9295)
To maintain the transaction running-balance integrity, the monthly
top-up balance has to adjust the top-up amount to maintain the balance
of the user to be at least X amount, instead of top-up the user balance
with a fixed X amount.

### Changes 🏗️

* Add an additional query to sum the remaining un-snapshotted balance
(if any).
* Monthly top-up transaction set the amount target_amount -
current_balance instead of fixed target_amount.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-24 14:43:43 +00:00
dependabot[bot]
56330b1dd3 chore(backend/deps-dev): bump the development-dependencies group across 1 directory with 5 updates (#9300)
Bumps the development-dependencies group with 5 updates in the
/autogpt_platform/backend directory:

| Package | From | To |
| --- | --- | --- |
| [poethepoet](https://github.com/nat-n/poethepoet) | `0.31.0` |
`0.32.1` |
| [ruff](https://github.com/astral-sh/ruff) | `0.8.3` | `0.9.2` |
| [pyright](https://github.com/RobertCraigie/pyright-python) | `1.1.389`
| `1.1.392.post0` |
| [aiohappyeyeballs](https://github.com/aio-libs/aiohappyeyeballs) |
`2.4.3` | `2.4.4` |
| [faker](https://github.com/joke2k/faker) | `33.1.0` | `33.3.1` |


Updates `poethepoet` from 0.31.0 to 0.32.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/nat-n/poethepoet/releases">poethepoet's
releases</a>.</em></p>
<blockquote>
<h2>v0.32.1</h2>
<h2>Enhancements</h2>
<ul>
<li>feat: Upgrade poetry dependency to make the poetry plugin work with
poetry 2.0 by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/269">nat-n/poethepoet#269</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/nat-n/poethepoet/compare/v0.32.0...v0.32.1">https://github.com/nat-n/poethepoet/compare/v0.32.0...v0.32.1</a></p>
<h2>0.32.0</h2>
<h2>Enhancements</h2>
<ul>
<li>
<p>Make command parsing support <em>default value</em> and <em>alternate
value</em> operations on param expansions by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/266">nat-n/poethepoet#266</a></p>
<ul>
<li>See feature <a
href="https://poethepoet.natn.io/tasks/task_types/cmd.html#parameter-expansion-operators">📖
documentation</a> for more details</li>
</ul>
</li>
<li>
<p>Explicitly disallow <code>capture_stdout</code> option on sequence
tasks by <a href="https://github.com/nat-n"><code>@​nat-n</code></a> in
<a
href="https://redirect.github.com/nat-n/poethepoet/pull/265">nat-n/poethepoet#265</a></p>
</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/nat-n/poethepoet/compare/v0.31.1...v0.32.0">https://github.com/nat-n/poethepoet/compare/v0.31.1...v0.32.0</a></p>
<h2>0.31.1</h2>
<h2>Fixes</h2>
<ul>
<li>fix: Explicitly disallow capture_stdout option on sequence tasks by
<a href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/261">nat-n/poethepoet#261</a></li>
<li>fix: Allow env var defaults in included task files by <a
href="https://github.com/nat-n"><code>@​nat-n</code></a> in <a
href="https://redirect.github.com/nat-n/poethepoet/pull/263">nat-n/poethepoet#263</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/nat-n/poethepoet/compare/v0.31.0...v0.31.1">https://github.com/nat-n/poethepoet/compare/v0.31.0...v0.31.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="9997e878d4"><code>9997e87</code></a>
Bump version to 0.32.1</li>
<li><a
href="d2fa221f57"><code>d2fa221</code></a>
feat: Upgrade poetry dependency to work with 2.0 (<a
href="https://redirect.github.com/nat-n/poethepoet/issues/269">#269</a>)</li>
<li><a
href="0133c42752"><code>0133c42</code></a>
Fix docs publishing workflow</li>
<li><a
href="f199b1135d"><code>f199b11</code></a>
Bump version to 0.32.0</li>
<li><a
href="a72a19378f"><code>a72a193</code></a>
Remove dev dependency on bpython</li>
<li><a
href="68e9e9ba1a"><code>68e9e9b</code></a>
Make command parsing support operations on param expansions (<a
href="https://redirect.github.com/nat-n/poethepoet/issues/266">#266</a>)</li>
<li><a
href="eecbb96e09"><code>eecbb96</code></a>
feat: Explicitly disallow capture_stdout option on sequence tasks (<a
href="https://redirect.github.com/nat-n/poethepoet/issues/265">#265</a>)</li>
<li><a
href="3884fcd240"><code>3884fcd</code></a>
fix: Run CI on pushing a version tag</li>
<li><a
href="525a1ebcac"><code>525a1eb</code></a>
docs: Document compatibility with uv projects</li>
<li><a
href="03546b7af7"><code>03546b7</code></a>
Bump version to 0.31.1</li>
<li>Additional commits viewable in <a
href="https://github.com/nat-n/poethepoet/compare/v0.31.0...v0.32.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.8.3 to 0.9.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.2</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Fix typo &quot;security_managr&quot; to
&quot;security_manager&quot; (<code>AIR303</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15463">#15463</a>)</li>
<li>[<code>airflow</code>] extend and fix AIR302 rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15525">#15525</a>)</li>
<li>[<code>fastapi</code>] Handle parameters with <code>Depends</code>
correctly (<code>FAST003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15364">#15364</a>)</li>
<li>[<code>flake8-pytest-style</code>] Implement pytest.warns
diagnostics (<code>PT029</code>, <code>PT030</code>, <code>PT031</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15444">#15444</a>)</li>
<li>[<code>flake8-pytest-style</code>] Test function parameters with
default arguments (<code>PT028</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15449">#15449</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid false positives for
<code>|</code> in <code>TC008</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15201">#15201</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-todos</code>] Allow VSCode GitHub PR extension style
links in <code>missing-todo-link</code> (<code>TD003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15519">#15519</a>)</li>
<li>[<code>pyflakes</code>] Show syntax error message for
<code>F722</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15523">#15523</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix curly bracket spacing around f-string expressions containing
curly braces (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15471">#15471</a>)</li>
<li>Fix joining of f-strings with different quotes when using quote
style <code>Preserve</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15524">#15524</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the same workspace multiple times (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15495">#15495</a>)</li>
<li>Display context for <code>ruff.configuration</code> errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15452">#15452</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Remove <code>flatten</code> to improve deserialization error
messages (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15414">#15414</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Parse triple-quoted string annotations as if parenthesized (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15387">#15387</a>)</li>
<li>[<code>fastapi</code>] Update <code>Annotated</code> fixes
(<code>FAST002</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15462">#15462</a>)</li>
<li>[<code>flake8-bandit</code>] Check for <code>builtins</code> instead
of <code>builtin</code> (<code>S102</code>, <code>PTH123</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15443">#15443</a>)</li>
<li>[<code>flake8-pathlib</code>] Fix <code>--select</code> for
<code>os-path-dirname</code> (<code>PTH120</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15446">#15446</a>)</li>
<li>[<code>ruff</code>] Fix false positive on global keyword
(<code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15235">#15235</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/AlexWaygood"><code>@​AlexWaygood</code></a></li>
<li><a
href="https://github.com/BurntSushi"><code>@​BurntSushi</code></a></li>
<li><a
href="https://github.com/Daverball"><code>@​Daverball</code></a></li>
<li><a
href="https://github.com/Garrett-R"><code>@​Garrett-R</code></a></li>
<li><a
href="https://github.com/Glyphack"><code>@​Glyphack</code></a></li>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a href="https://github.com/Lee-W"><code>@​Lee-W</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/cake-monotone"><code>@​cake-monotone</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.2</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Fix typo &quot;security_managr&quot; to
&quot;security_manager&quot; (<code>AIR303</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15463">#15463</a>)</li>
<li>[<code>airflow</code>] extend and fix AIR302 rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15525">#15525</a>)</li>
<li>[<code>fastapi</code>] Handle parameters with <code>Depends</code>
correctly (<code>FAST003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15364">#15364</a>)</li>
<li>[<code>flake8-pytest-style</code>] Implement pytest.warns
diagnostics (<code>PT029</code>, <code>PT030</code>, <code>PT031</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15444">#15444</a>)</li>
<li>[<code>flake8-pytest-style</code>] Test function parameters with
default arguments (<code>PT028</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15449">#15449</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid false positives for
<code>|</code> in <code>TC008</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15201">#15201</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-todos</code>] Allow VSCode GitHub PR extension style
links in <code>missing-todo-link</code> (<code>TD003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15519">#15519</a>)</li>
<li>[<code>pyflakes</code>] Show syntax error message for
<code>F722</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15523">#15523</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix curly bracket spacing around f-string expressions containing
curly braces (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15471">#15471</a>)</li>
<li>Fix joining of f-strings with different quotes when using quote
style <code>Preserve</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15524">#15524</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the same workspace multiple times (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15495">#15495</a>)</li>
<li>Display context for <code>ruff.configuration</code> errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15452">#15452</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Remove <code>flatten</code> to improve deserialization error
messages (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15414">#15414</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Parse triple-quoted string annotations as if parenthesized (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15387">#15387</a>)</li>
<li>[<code>fastapi</code>] Update <code>Annotated</code> fixes
(<code>FAST002</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15462">#15462</a>)</li>
<li>[<code>flake8-bandit</code>] Check for <code>builtins</code> instead
of <code>builtin</code> (<code>S102</code>, <code>PTH123</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15443">#15443</a>)</li>
<li>[<code>flake8-pathlib</code>] Fix <code>--select</code> for
<code>os-path-dirname</code> (<code>PTH120</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15446">#15446</a>)</li>
<li>[<code>ruff</code>] Fix false positive on global keyword
(<code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15235">#15235</a>)</li>
</ul>
<h2>0.9.1</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>pycodestyle</code>] Run
<code>too-many-newlines-at-end-of-file</code> on each cell in notebooks
(<code>W391</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15308">#15308</a>)</li>
<li>[<code>ruff</code>] Omit diagnostic for shadowed private function
parameters in <code>used-dummy-variable</code> (<code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15376">#15376</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Improve
<code>assert-raises-exception</code> message (<code>B017</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15389">#15389</a>)</li>
</ul>
<h3>Formatter</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0a39348381"><code>0a39348</code></a>
Include build binaries</li>
<li><a
href="027f8009e5"><code>027f800</code></a>
Comment out non-npm-publish jobs</li>
<li><a
href="425870df76"><code>425870d</code></a>
Upload npm publish logs when failed</li>
<li><a
href="c20255abe4"><code>c20255a</code></a>
Bump version to 0.9.2 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15529">#15529</a>)</li>
<li><a
href="420365811f"><code>4203658</code></a>
Fix joining of f-strings with different quotes when using quote style
`Preser...</li>
<li><a
href="fc9dd63d64"><code>fc9dd63</code></a>
[airflow] extend and fix AIR302 rules (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15525">#15525</a>)</li>
<li><a
href="79e52c7fdf"><code>79e52c7</code></a>
[<code>pyflakes</code>] Show syntax error message for <code>F722</code>
(<a
href="https://redirect.github.com/astral-sh/ruff/issues/15523">#15523</a>)</li>
<li><a
href="cf4ab7cba1"><code>cf4ab7c</code></a>
Parse triple quoted string annotations as if parenthesized (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15387">#15387</a>)</li>
<li><a
href="d2656e88a3"><code>d2656e8</code></a>
[<code>flake8-todos</code>] Allow VSCode GitHub PR extension style links
in `missing-tod...</li>
<li><a
href="c53ee608a1"><code>c53ee60</code></a>
Typeshed-sync workflow: add appropriate labels, link directly to failing
run ...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.8.3...0.9.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `pyright` from 1.1.389 to 1.1.392.post0
<details>
<summary>Commits</summary>
<ul>
<li><a
href="33dece9ee3"><code>33dece9</code></a>
chore: release v1.1.392.post0 (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/331">#331</a>)</li>
<li><a
href="f15e56f25d"><code>f15e56f</code></a>
feat: bundle pyright inside wheel (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/300">#300</a>)</li>
<li><a
href="f5c77313ff"><code>f5c7731</code></a>
[pyright updated to 1.1.392] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/329">#329</a>)</li>
<li><a
href="08b251cffc"><code>08b251c</code></a>
CI: lower ubunutu version + bump macos + node 18 (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/330">#330</a>)</li>
<li><a
href="3356df1d40"><code>3356df1</code></a>
[pyright updated to 1.1.391] Update Version (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/327">#327</a>)</li>
<li><a
href="ee025bc694"><code>ee025bc</code></a>
Pyright NPM Package update to 1.1.390 (<a
href="https://redirect.github.com/RobertCraigie/pyright-python/issues/325">#325</a>)</li>
<li>See full diff in <a
href="https://github.com/RobertCraigie/pyright-python/compare/v1.1.389...v1.1.392.post0">compare
view</a></li>
</ul>
</details>
<br />

Updates `aiohappyeyeballs` from 2.4.3 to 2.4.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/aio-libs/aiohappyeyeballs/releases">aiohappyeyeballs's
releases</a>.</em></p>
<blockquote>
<h1>v2.4.4 (2024-11-30)</h1>
<h2>Fix</h2>
<ul>
<li>fix: handle OSError on failure to close socket instead of raising
IndexError (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/114">#114</a>)</li>
</ul>
<p>Co-authored-by: pre-commit-ci[bot] &lt;66853113+pre-commit-ci[bot]<a
href="https://github.com/users"><code>@​users</code></a>.noreply.github.com&gt;
Co-authored-by: J. Nick Koston &lt;<a
href="mailto:nick@koston.org">nick@koston.org</a>&gt; (<a
href="c542f684d3"><code>c542f68</code></a>)</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/aio-libs/aiohappyeyeballs/blob/main/CHANGELOG.md">aiohappyeyeballs's
changelog</a>.</em></p>
<blockquote>
<h2>v2.4.4 (2024-11-30)</h2>
<h3>Fix</h3>
<ul>
<li>Handle oserror on failure to close socket instead of raising
indexerror (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/114">#114</a>)
(<a
href="c542f684d3"><code>c542f68</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3c4f2a6892"><code>3c4f2a6</code></a>
2.4.4</li>
<li><a
href="c542f684d3"><code>c542f68</code></a>
fix: handle OSError on failure to close socket instead of raising
IndexError ...</li>
<li><a
href="fd90f564d5"><code>fd90f56</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/116">#116</a>)</li>
<li><a
href="0653807446"><code>0653807</code></a>
chore: bump codecov-action to 5.0.3 (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/115">#115</a>)</li>
<li><a
href="90e01edddd"><code>90e01ed</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/113">#113</a>)</li>
<li><a
href="31825f2a3c"><code>31825f2</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/111">#111</a>)</li>
<li><a
href="4c23bcad40"><code>4c23bca</code></a>
chore: add missing FUNDING.yml (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/110">#110</a>)</li>
<li><a
href="b5dfff592e"><code>b5dfff5</code></a>
chore(pre-commit.ci): pre-commit autoupdate (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/108">#108</a>)</li>
<li><a
href="5a3b4cb871"><code>5a3b4cb</code></a>
chore: fix docs (<a
href="https://redirect.github.com/aio-libs/aiohappyeyeballs/issues/106">#106</a>)</li>
<li>See full diff in <a
href="https://github.com/aio-libs/aiohappyeyeballs/compare/v2.4.3...v2.4.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `faker` from 33.1.0 to 33.3.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/joke2k/faker/releases">faker's
releases</a>.</em></p>
<blockquote>
<h2>Release v33.3.1</h2>
<p>See <a
href="https://github.com/joke2k/faker/blob/refs/tags/v33.3.1/CHANGELOG.md">CHANGELOG.md</a>.</p>
<h2>Release v33.3.0</h2>
<p>See <a
href="https://github.com/joke2k/faker/blob/refs/tags/v33.3.0/CHANGELOG.md">CHANGELOG.md</a>.</p>
<h2>Release v33.2.0</h2>
<p>See <a
href="https://github.com/joke2k/faker/blob/refs/tags/v33.2.0/CHANGELOG.md">CHANGELOG.md</a>.</p>
<h2>Release v33.1.3</h2>
<p>See <a
href="https://github.com/joke2k/faker/blob/refs/tags/v33.1.3/CHANGELOG.md">CHANGELOG.md</a>.</p>
<h2>Release v33.1.2</h2>
<p>See <a
href="https://github.com/joke2k/faker/blob/refs/tags/v33.1.2/CHANGELOG.md">CHANGELOG.md</a>.</p>
<h2>Release v33.1.1</h2>
<p>See <a
href="https://github.com/joke2k/faker/blob/refs/tags/v33.1.1/CHANGELOG.md">CHANGELOG.md</a>.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/joke2k/faker/blob/master/CHANGELOG.md">faker's
changelog</a>.</em></p>
<blockquote>
<h3><a
href="https://github.com/joke2k/faker/compare/v33.3.0...v33.3.1">v33.3.1
- 2025-01-10</a></h3>
<ul>
<li>Fix <code>nl_BE</code> Bank Provider (BBAN, IBAN, SWIFT). Thanks <a
href="https://github.com/AliYmn"><code>@​AliYmn</code></a>.</li>
</ul>
<h3><a
href="https://github.com/joke2k/faker/compare/v33.2.3...v33.3.0">v33.3.0
- 2025-01-03</a></h3>
<ul>
<li>Add support for Zulu (<code>zu_ZA</code>) address provider and
corresponding tests. Thanks <a
href="https://github.com/AliYmn"><code>@​AliYmn</code></a>.</li>
</ul>
<h3><a
href="https://github.com/joke2k/faker/compare/v33.1.3...v33.2.0">v33.2.0
- 2025-01-03</a></h3>
<ul>
<li>Add currency provider for <code>uk_UA</code>. Thanks <a
href="https://github.com/SaulTigh"><code>@​SaulTigh</code></a>.</li>
</ul>
<h3><a
href="https://github.com/joke2k/faker/compare/v33.1.2...v33.1.3">v33.1.3
- 2025-01-03</a></h3>
<ul>
<li>Fix type annotation on Python 3.8.</li>
</ul>
<h3><a
href="https://github.com/joke2k/faker/compare/v33.1.1...v33.1.2">v33.1.2
- 2025-01-03</a></h3>
<ul>
<li>Fix <code>ru_RU</code> passport provider. Thanks <a
href="https://github.com/denisSurkov"><code>@​denisSurkov</code></a>.</li>
</ul>
<h3><a
href="https://github.com/joke2k/faker/compare/v33.1.0...v33.1.1">v33.1.1
- 2025-01-03</a></h3>
<ul>
<li>Fix address number output issue in <code>ko_KR</code> address
provider. Thanks <a
href="https://github.com/semi-yu"><code>@​semi-yu</code></a>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="bbcab85add"><code>bbcab85</code></a>
Bump version: 33.3.0 → 33.3.1</li>
<li><a
href="9130687455"><code>9130687</code></a>
📝 Update CHANGELOG.md</li>
<li><a
href="f4ad7754ea"><code>f4ad775</code></a>
Fix <code>nl_BE</code> Bank Provider (BBAN, IBAN, SWIFT) (<a
href="https://redirect.github.com/joke2k/faker/issues/2142">#2142</a>)</li>
<li><a
href="a21084461e"><code>a210844</code></a>
Bump version: 33.2.0 → 33.3.0</li>
<li><a
href="8ec1609428"><code>8ec1609</code></a>
📝 Update CHANGELOG.md</li>
<li><a
href="4e2839e93b"><code>4e2839e</code></a>
fix administrative units un <code>zu_ZA</code> address provider</li>
<li><a
href="d9d70c4602"><code>d9d70c4</code></a>
Add support for Zulu (<code>zu_ZA</code>) address provider and
corresponding tests (<a
href="https://redirect.github.com/joke2k/faker/issues/2143">#2143</a>)</li>
<li><a
href="858e31f94e"><code>858e31f</code></a>
Bump version: 33.1.3 → 33.2.0</li>
<li><a
href="27a7005ef4"><code>27a7005</code></a>
📝 Update CHANGELOG.md</li>
<li><a
href="d72db5473c"><code>d72db54</code></a>
feat: add currency provider for <code>uk_UA</code> (<a
href="https://redirect.github.com/joke2k/faker/issues/2141">#2141</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/joke2k/faker/compare/v33.1.0...v33.3.1">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicholas Tindle <nicholas.tindle@agpt.co>
2025-01-24 14:28:43 +00:00
Zamil Majdy
a584f1fdd2 feat(backend): Minimize the non caught error logic between graph exec creation and queueing (#9306)
There should be no possibly failing code between graph exec creation and
the actual queueing.
It could risk the graph execution being stuck on the QUEUED status.

### Changes 🏗️

Moved the node exec creation and status update to be inside the graph
execution logic.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-24 13:52:42 +00:00
Reinier van der Leer
da7aead361 fix(frontend): Fix page layouts (sizing + padding) (#9311)
- Resolves #9310

### Changes 🏗️

- Make base layout full width and fix its sizing behavior
  - Fix navbar overflowing on the right
- Set padding on `/monitoring`
- Make `/login` and `/signup` layouts self-center

### Checklist 📋

- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
  - Check layouts of all pages
    - `/signup`
    - `/login`
    - `/build`
    - `/monitoring`
    - `/store`
    - `/store/profile`
    - `/store/dashboard`
    - `/store/settings`

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-01-24 13:17:46 +00:00
dependabot[bot]
5383e8ba27 chore(libs/deps-dev): bump ruff from 0.8.6 to 0.9.2 in /autogpt_platform/autogpt_libs in the development-dependencies group across 1 directory (#9299)
Bumps the development-dependencies group with 1 update in the
/autogpt_platform/autogpt_libs directory:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.8.6 to 0.9.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.2</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Fix typo &quot;security_managr&quot; to
&quot;security_manager&quot; (<code>AIR303</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15463">#15463</a>)</li>
<li>[<code>airflow</code>] extend and fix AIR302 rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15525">#15525</a>)</li>
<li>[<code>fastapi</code>] Handle parameters with <code>Depends</code>
correctly (<code>FAST003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15364">#15364</a>)</li>
<li>[<code>flake8-pytest-style</code>] Implement pytest.warns
diagnostics (<code>PT029</code>, <code>PT030</code>, <code>PT031</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15444">#15444</a>)</li>
<li>[<code>flake8-pytest-style</code>] Test function parameters with
default arguments (<code>PT028</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15449">#15449</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid false positives for
<code>|</code> in <code>TC008</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15201">#15201</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-todos</code>] Allow VSCode GitHub PR extension style
links in <code>missing-todo-link</code> (<code>TD003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15519">#15519</a>)</li>
<li>[<code>pyflakes</code>] Show syntax error message for
<code>F722</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15523">#15523</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix curly bracket spacing around f-string expressions containing
curly braces (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15471">#15471</a>)</li>
<li>Fix joining of f-strings with different quotes when using quote
style <code>Preserve</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15524">#15524</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the same workspace multiple times (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15495">#15495</a>)</li>
<li>Display context for <code>ruff.configuration</code> errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15452">#15452</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Remove <code>flatten</code> to improve deserialization error
messages (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15414">#15414</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Parse triple-quoted string annotations as if parenthesized (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15387">#15387</a>)</li>
<li>[<code>fastapi</code>] Update <code>Annotated</code> fixes
(<code>FAST002</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15462">#15462</a>)</li>
<li>[<code>flake8-bandit</code>] Check for <code>builtins</code> instead
of <code>builtin</code> (<code>S102</code>, <code>PTH123</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15443">#15443</a>)</li>
<li>[<code>flake8-pathlib</code>] Fix <code>--select</code> for
<code>os-path-dirname</code> (<code>PTH120</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15446">#15446</a>)</li>
<li>[<code>ruff</code>] Fix false positive on global keyword
(<code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15235">#15235</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a
href="https://github.com/AlexWaygood"><code>@​AlexWaygood</code></a></li>
<li><a
href="https://github.com/BurntSushi"><code>@​BurntSushi</code></a></li>
<li><a
href="https://github.com/Daverball"><code>@​Daverball</code></a></li>
<li><a
href="https://github.com/Garrett-R"><code>@​Garrett-R</code></a></li>
<li><a
href="https://github.com/Glyphack"><code>@​Glyphack</code></a></li>
<li><a
href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a href="https://github.com/Lee-W"><code>@​Lee-W</code></a></li>
<li><a
href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a
href="https://github.com/cake-monotone"><code>@​cake-monotone</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.2</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Fix typo &quot;security_managr&quot; to
&quot;security_manager&quot; (<code>AIR303</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15463">#15463</a>)</li>
<li>[<code>airflow</code>] extend and fix AIR302 rules (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15525">#15525</a>)</li>
<li>[<code>fastapi</code>] Handle parameters with <code>Depends</code>
correctly (<code>FAST003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15364">#15364</a>)</li>
<li>[<code>flake8-pytest-style</code>] Implement pytest.warns
diagnostics (<code>PT029</code>, <code>PT030</code>, <code>PT031</code>)
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/15444">#15444</a>)</li>
<li>[<code>flake8-pytest-style</code>] Test function parameters with
default arguments (<code>PT028</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15449">#15449</a>)</li>
<li>[<code>flake8-type-checking</code>] Avoid false positives for
<code>|</code> in <code>TC008</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15201">#15201</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-todos</code>] Allow VSCode GitHub PR extension style
links in <code>missing-todo-link</code> (<code>TD003</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15519">#15519</a>)</li>
<li>[<code>pyflakes</code>] Show syntax error message for
<code>F722</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15523">#15523</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix curly bracket spacing around f-string expressions containing
curly braces (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15471">#15471</a>)</li>
<li>Fix joining of f-strings with different quotes when using quote
style <code>Preserve</code> (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15524">#15524</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the same workspace multiple times (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15495">#15495</a>)</li>
<li>Display context for <code>ruff.configuration</code> errors (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15452">#15452</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Remove <code>flatten</code> to improve deserialization error
messages (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15414">#15414</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Parse triple-quoted string annotations as if parenthesized (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15387">#15387</a>)</li>
<li>[<code>fastapi</code>] Update <code>Annotated</code> fixes
(<code>FAST002</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15462">#15462</a>)</li>
<li>[<code>flake8-bandit</code>] Check for <code>builtins</code> instead
of <code>builtin</code> (<code>S102</code>, <code>PTH123</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15443">#15443</a>)</li>
<li>[<code>flake8-pathlib</code>] Fix <code>--select</code> for
<code>os-path-dirname</code> (<code>PTH120</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15446">#15446</a>)</li>
<li>[<code>ruff</code>] Fix false positive on global keyword
(<code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15235">#15235</a>)</li>
</ul>
<h2>0.9.1</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>pycodestyle</code>] Run
<code>too-many-newlines-at-end-of-file</code> on each cell in notebooks
(<code>W391</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15308">#15308</a>)</li>
<li>[<code>ruff</code>] Omit diagnostic for shadowed private function
parameters in <code>used-dummy-variable</code> (<code>RUF052</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15376">#15376</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Improve
<code>assert-raises-exception</code> message (<code>B017</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/15389">#15389</a>)</li>
</ul>
<h3>Formatter</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0a39348381"><code>0a39348</code></a>
Include build binaries</li>
<li><a
href="027f8009e5"><code>027f800</code></a>
Comment out non-npm-publish jobs</li>
<li><a
href="425870df76"><code>425870d</code></a>
Upload npm publish logs when failed</li>
<li><a
href="c20255abe4"><code>c20255a</code></a>
Bump version to 0.9.2 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15529">#15529</a>)</li>
<li><a
href="420365811f"><code>4203658</code></a>
Fix joining of f-strings with different quotes when using quote style
`Preser...</li>
<li><a
href="fc9dd63d64"><code>fc9dd63</code></a>
[airflow] extend and fix AIR302 rules (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15525">#15525</a>)</li>
<li><a
href="79e52c7fdf"><code>79e52c7</code></a>
[<code>pyflakes</code>] Show syntax error message for <code>F722</code>
(<a
href="https://redirect.github.com/astral-sh/ruff/issues/15523">#15523</a>)</li>
<li><a
href="cf4ab7cba1"><code>cf4ab7c</code></a>
Parse triple quoted string annotations as if parenthesized (<a
href="https://redirect.github.com/astral-sh/ruff/issues/15387">#15387</a>)</li>
<li><a
href="d2656e88a3"><code>d2656e8</code></a>
[<code>flake8-todos</code>] Allow VSCode GitHub PR extension style links
in `missing-tod...</li>
<li><a
href="c53ee608a1"><code>c53ee60</code></a>
Typeshed-sync workflow: add appropriate labels, link directly to failing
run ...</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.8.6...0.9.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.8.6&new-version=0.9.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-22 09:17:48 +00:00
Krzysztof Czerwinski
800625c952 fix(frontend): Change /store* url to /marketplace* (#9119)
We have branded it as "Marketplace", so the URL shouldn't be "store".

### Changes 🏗️

- Change frontend URLs from `/store*` to `/marketplace*`
- No API route changes to minimize bugs (follow up:
https://github.com/Significant-Gravitas/AutoGPT/issues/9118)
2025-01-18 17:49:41 +01:00
Nicholas Tindle
56612f16cf feat(platform): Linear integration (#9269)
<!-- Clearly explain the need for these changes: -->

I want to be able to do stuff with linear automatically

### Changes 🏗️
- Adds all the backing details to add linear auth and API access with
oauth (and prep for API key)

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com>
2025-01-17 13:35:58 +00:00
Reinier van der Leer
0d2bb46786 fix(frontend): Unbreak save button after save error (#9290)
- Resolves #9253

### Changes 🏗️

- Update state when an error occurs on save, to re-enable the save
button

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [x] I have made a test plan
- [x] I have tested my changes according to the test plan:
- Try to save an agent with missing required fields -> should give an
error
  - Fill out the required fields and try saving again -> should work
2025-01-17 13:29:43 +00:00
Aarushi
c61317e448 feat(platform): Create external API (#9272)
We want to allow external api calls against our platform
We also want to keep it sep from internal platform calls for dev ex,
security and scale seperation of concerns

### Changes 🏗️

This PR adds the required external routes
It mounts the new routes on the same app 

Infra PR will seprate routing and domains

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-17 11:44:04 +00:00
Bently
3c30783b14 docs(Ollama): Remove steps about adding ollama credentials (#9288)
Since ["feat: no longer require ollama key
#9287"](https://github.com/Significant-Gravitas/AutoGPT/pull/9287) we no
longer need the steps for adding ollama credentials so this removes them
from the docs
2025-01-16 22:35:05 +00:00
Zamil Majdy
56b33327ab feat(platform): Add billing portal entry point (#9264)
<img width="1445" alt="image"
src="https://github.com/user-attachments/assets/5aeb7ee2-4d06-4a64-889b-599ad68c6dae"
/>


### Changes 🏗️

Added an entry point to open the Stripe billing portal.

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com>
2025-01-16 21:00:15 +00:00
Zamil Majdy
c36c239dd5 feat(backend): Add graph/node id & execution id on CreditTransaction table (#9217)
We need to be able to determine the cost of graph/node execution.

### Changes 🏗️

* Add these columns into CreditTransaction `metadata` column:
    - graph_id
    - node_id
    - graph_exec_id
    - node_exec_id
    - block_id
* Drop the `blockId` column and backfill the dropped value into
metadata->>block_id.
* Frequent queries on these values will require an index created on
demand through a migration, depending on the use case.

---------

Co-authored-by: Krzysztof Czerwinski <kpczerwinski@gmail.com>
Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-01-16 20:59:49 +00:00
Nicholas Tindle
e53f1eaf80 feat: no longer require ollama key (#9287)
<!-- Clearly explain the need for these changes: -->

### Changes 🏗️

<!-- Concisely describe all of the changes made in this pull request:
-->

### Checklist 📋

#### For code changes:
- [ ] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [ ] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>
2025-01-16 12:25:08 +00:00
Krzysztof Czerwinski
04915f2db0 feat(platform): Implement top-up flow for PAYG System (#9050)
This PR adds Stripe integration and payment processing for topping-up
user accounts with credits.

### Changes 🏗️

Includes:
- https://github.com/Significant-Gravitas/AutoGPT/pull/9176

#### Top-up flow

1. To top-up a user visits their settings and clicks `Credits` button
(it's unavailable if `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY` isn't present)
2. User inputs top-up amount (min 5$ in 1$ increments) and click the
button to confirm.
3. Backend receives top-up request, creates database entry and requests
stripe to provide url for this specific checkout.
4. User gets redirected to externally hosted Stripe checkout page, after
payment (or cancelling) they get redirected back to Credits page.
5. In the meantime Stripe processes payment and sends webhook
confirmation to the backend, backend updates database to activate bought
credits.
6. Credits page shows success (or failure) information (by using url
param `topup=success|cancel`). Credit counter won't update without
refreshing the page unless payment was confirmed before user was back on
Credits page which is the case when testing checkout locally.

<img width="804" alt="Screenshot 2025-01-01 at 2 55 35 PM"
src="https://github.com/user-attachments/assets/22fb518d-b30b-4154-bb4b-edea1d57b6c2"
/>

#### Backend
- Add `stripe` package
- Add environment variables:
  - `STRIPE_API_KEY`
  - `STRIPE_WEBHOOK_SECRET`
- Add routes:
  - `POST /credits`: top-up request, returns Stripe checkout url.
- `POST /credits/stripe_webhook`: Stripe webhook endpoint to notify of
successful payment.
- `PATCH /credits`: prompts beckend to check payment status. It's an
additional failsafe in case webhook fails.
- Update `credit.py` and related files to handle top-up request and
payment confirmation

#### Frontend
- Add `stripe-js` package
- Add `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY` environment variable
- Modify user settings sidebar to show `Credits` if
`NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY` is available
- Add `store/credits` page where user can top-up their account, it shows
confirmation (or failure) after completing checkout.
- Add `useCredits` hook that returns user credits and allows to request
top-up.

### Checklist 📋

#### For code changes:
- [x] I have clearly listed my changes in the PR description
- [ ] I have made a test plan
- [ ] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - [ ] ...

<details>
  <summary>Example test plan</summary>
  
  - [ ] Create from scratch and execute an agent with at least 3 blocks
- [ ] Import an agent from file upload, and confirm it executes
correctly
  - [ ] Upload agent to marketplace
- [ ] Import an agent from marketplace and confirm it executes correctly
  - [ ] Edit an agent from monitor, and confirm it executes correctly
</details>

#### For configuration changes:
- [x] `.env.example` is updated or already compatible with my changes
- [ ] `docker-compose.yml` is updated or already compatible with my
changes
- [ ] I have included a list of my configuration changes in the PR
description (under **Changes**)

<details>
  <summary>Examples of configuration changes</summary>

  - Changing ports
  - Adding new services that need to communicate with each other
  - Secrets or environment variable changes
  - New or infrastructure changes such as databases
</details>

---------

Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-01-15 23:46:52 +00:00
Nicholas Tindle
9d79bfadea [Snyk] Security upgrade next from 14.2.20 to 14.2.21 (#9243)
![snyk-top-banner](https://redirect.github.com/andygongea/OWASP-Benchmark/assets/818805/c518c423-16fe-447e-b67f-ad5a49b5d123)

### Snyk has created this PR to fix 1 vulnerabilities in the yarn
dependencies of this project.

#### Snyk changed the following file(s):

- `autogpt_platform/frontend/package.json`
- `autogpt_platform/frontend/yarn.lock`


#### Note for
[zero-installs](https://yarnpkg.com/features/zero-installs) users

If you are using the Yarn feature
[zero-installs](https://yarnpkg.com/features/zero-installs) that was
introduced in Yarn V2, note that this PR does not update the
`.yarn/cache/` directory meaning this code cannot be pulled and
immediately developed on as one would expect for a zero-install project
- you will need to run `yarn` to update the contents of the
`./yarn/cache` directory.
If you are not using zero-install you can ignore this as your flow
should likely be unchanged.




#### Vulnerabilities that will be fixed with an upgrade:

|  | Issue |  
:-------------------------:|:-------------------------
![medium
severity](https://res.cloudinary.com/snyk/image/upload/w_20,h_20/v1561977819/icon/m.png
'medium severity') | Allocation of Resources Without Limits or
Throttling
<br/>[SNYK-JS-NEXT-8602067](https://snyk.io/vuln/SNYK-JS-NEXT-8602067)




---

> [!IMPORTANT]
>
> - Check the changes in this PR to ensure they won't cause issues with
your project.
> - Max score is 1000. Note that the real score may have changed since
the PR was raised.
> - This PR was automatically created by Snyk using the credentials of a
real user.

---

**Note:** _You are seeing this because you or someone else with access
to this repository has authorized Snyk to open fix PRs._

For more information: <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiI4NWY3NDgyYy03NGFiLTQxNmYtYjQ4OC0wMTUwMDlmYzY5NzkiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6Ijg1Zjc0ODJjLTc0YWItNDE2Zi1iNDg4LTAxNTAwOWZjNjk3OSJ9fQ=="
width="0" height="0"/>
🧐 [View latest project
report](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr)
📜 [Customise PR
templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates?utm_source=github&utm_content=fix-pr-template)
🛠 [Adjust project
settings](https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;fix-pr/settings)
📚 [Read about Snyk's upgrade
logic](https://docs.snyk.io/scan-with-snyk/snyk-open-source/manage-vulnerabilities/upgrade-package-versions-to-fix-vulnerabilities?utm_source=github&utm_content=fix-pr-template)

---

**Learn how to fix vulnerabilities with free interactive lessons:**

🦉 [Allocation of Resources Without Limits or
Throttling](https://learn.snyk.io/lesson/no-rate-limiting/?loc&#x3D;fix-pr)

[//]: #
'snyk:metadata:{"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"next","from":"14.2.20","to":"14.2.21"}],"env":"prod","issuesToFix":["SNYK-JS-NEXT-8602067"],"prId":"85f7482c-74ab-416f-b488-015009fc6979","prPublicId":"85f7482c-74ab-416f-b488-015009fc6979","packageManager":"yarn","priorityScoreList":[null],"projectPublicId":"3d924968-0cf3-4767-9609-501fa4962856","projectUrl":"https://app.snyk.io/org/significant-gravitas/project/3d924968-0cf3-4767-9609-501fa4962856?utm_source=github&utm_medium=referral&page=fix-pr","prType":"fix","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":["updated-fix-title"],"type":"auto","upgrade":["SNYK-JS-NEXT-8602067"],"vulns":["SNYK-JS-NEXT-8602067"],"patch":[],"isBreakingChange":false,"remediationStrategy":"vuln"}'

Co-authored-by: snyk-bot <snyk-bot@snyk.io>
2025-01-15 18:11:13 +00:00
Nicholas Tindle
5f50c4863d test(frontend): Re-enable the tests in monitor.spec.ts and then ensure they pass (#9248)
Enable the tests in `monitor.spec.ts`.

* Remove `test.describe.skip` to enable the tests.
* Ensure the tests are now running and passing successfully.

---

For more details, open the [Copilot Workspace
session](https://copilot-workspace.githubnext.com/Significant-Gravitas/AutoGPT/pull/9248?shareId=edbd64cc-ea19-477b-be06-5eea84c28665).
2025-01-15 09:41:41 +00:00
Aarushi
fe84cbe566 Revert "feature(backend): Add ability to execute store agents without agent ownership" (#9263)
Reverts Significant-Gravitas/AutoGPT#9179

This PR is preventing the running of agents in dev.
2025-01-13 18:34:17 +00:00
Aarushi
5618072375 fix(blocks/Exa): Fix exa contents block advanced toggle (#9255)
Toggling the advanced option on Exa Contents Block isn't working. It
throws a frontend error.

### Changes 🏗️

Remove Optional from ContentRetrievalSettings in exa/contents.py

### Checklist 📋

#### For code changes:
- [x ] I have clearly listed my changes in the PR description
- [ x] I have made a test plan
- [ x] I have tested my changes according to the test plan:
  <!-- Put your test plan here: -->
  - Add an ExaContentsBlock
  - Hit advanced


#### For configuration changes:
N/A
2025-01-13 16:35:14 +00:00
Reinier van der Leer
95b79abcfe Revert broken Library v2 DB stuff of #9218, #9211 (#9256)
- **Revert "feature(platform): Implement library add, update, remove,
archive functionality (#9218)"**
- **Revert "feat(backend): Add Support for Managing Agent Presets with
Pagination and Soft Delete (#9211)"**

These PRs contain untested changes to DB functions and cause issues in
production.
2025-01-13 16:08:58 +01:00
Swifty
fd6f28fa57 feature(platform): Implement library add, update, remove, archive functionality (#9218)
### Changes 🏗️

1. **Core Features**:
   - Add agents to the user's library.
   - Update library agents (auto-update, favorite, archive, delete).
   - Paginate library agents and presets.
   - Execute graphs using presets.

2. **Refactoring**:
   - Replaced `UserAgent` with `LibraryAgent`.
   - Separated routes for agents and presets.

3. **Schema Changes**:
- Added `LibraryAgent` table with fields like `isArchived`, `isDeleted`,
etc.
   - Soft delete functionality for `AgentPreset`.

4. **Testing**:
   - Updated tests for `LibraryAgent` operations.
   - Added edge case tests for deletion, archiving, and pagination.

5. **Database Migrations**:
   - Migration to drop `UserAgent` and add `LibraryAgent`.
   - Added fields for soft deletion and auto-update.


Note this includes the changes from the following PR's to avoid merge
conflicts with them:

#9179 
#9211

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-01-10 13:02:53 +01:00
Swifty
4b17cc9963 feat(backend): Add Support for Managing Agent Presets with Pagination and Soft Delete (#9211)
#### Summary
- **New Models**: Added `LibraryAgentPreset`,
`LibraryAgentPresetResponse`, `Pagination`, and
`CreateLibraryAgentPresetRequest`.
- **Database Changes**:
  - Added `isDeleted` column in `AgentPreset` for soft delete.
  - CRUD operations for `AgentPreset`:
    - `get_presets` with pagination.
    - `get_preset` by ID.
    - `create_or_update_preset` for upsert.
    - `delete_preset` to soft delete.
- **API Routes**:
  - `GET /presets`: Fetch paginated presets.
  - `GET /presets/{preset_id}`: Fetch a single preset.
  - `POST /presets`: Create a preset.
  - `PUT /presets/{preset_id}`: Update a preset.
  - `DELETE /presets/{preset_id}`: Soft delete a preset.
- **Tests**:
  - Coverage for models, CRUD operations, and pagination.
- **Migration**:
  - Added `isDeleted` field to support soft delete.

#### Review Notes
- Validate migration scripts and test coverage.
- Ensure API aligns with project standards.

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
2025-01-10 12:57:35 +01:00
Swifty
00bb7c67b3 feature(backend): Add ability to execute store agents without agent ownership (#9179)
### Description

This PR enables the execution of store agents even if they are not owned
by the user. Key changes include handling store-listed agents in the
`get_graph` logic, improving execution flow, and ensuring
version-specific handling. These updates support more flexible agent
execution.

### Changes 🏗️

- **Graph Retrieval:** Updated `get_graph` to check store listings for
agents not owned by the user.
- **Version Handling:** Added `graph_version` to execution methods for
consistent version-specific execution.
- **Execution Flow:** Refactored `scheduler.py`, `rest_api.py`, and
other modules for clearer logic and better maintainability.
- **Testing:** Updated `test_manager.py` and other test cases to
validate execution of store-listed agents added test for accessing graph

---------

Co-authored-by: Reinier van der Leer <pwuts@agpt.co>
Co-authored-by: Zamil Majdy <zamil.majdy@agpt.co>
2025-01-10 12:39:06 +01:00
532 changed files with 47225 additions and 13242 deletions

18
.deepsource.toml Normal file
View File

@@ -0,0 +1,18 @@
version = 1
test_patterns = ["**/*.spec.ts","**/*_test.py","**/*_tests.py","**/test_*.py"]
exclude_patterns = ["classic/**"]
[[analyzers]]
name = "javascript"
[analyzers.meta]
plugins = ["react"]
environment = ["nodejs"]
[[analyzers]]
name = "python"
[analyzers.meta]
runtime_version = "3.x.x"

View File

@@ -129,30 +129,6 @@ updates:
- "minor"
- "patch"
# Submodules
- package-ecosystem: "gitsubmodule"
directory: "autogpt_platform/supabase"
schedule:
interval: "weekly"
open-pull-requests-limit: 1
target-branch: "dev"
commit-message:
prefix: "chore(platform/deps)"
prefix-development: "chore(platform/deps-dev)"
groups:
production-dependencies:
dependency-type: "production"
update-types:
- "minor"
- "patch"
development-dependencies:
dependency-type: "development"
update-types:
- "minor"
- "patch"
# Docs
- package-ecosystem: 'pip'
directory: "docs/"

View File

@@ -115,6 +115,7 @@ jobs:
poetry run pytest -vv \
--cov=autogpt --cov-branch --cov-report term-missing --cov-report xml \
--numprocesses=logical --durations=10 \
--junitxml=junit.xml -o junit_family=legacy \
tests/unit tests/integration
env:
CI: true
@@ -124,8 +125,14 @@ jobs:
AWS_ACCESS_KEY_ID: minioadmin
AWS_SECRET_ACCESS_KEY: minioadmin
- name: Upload test results to Codecov
if: ${{ !cancelled() }} # Run even if tests fail
uses: codecov/test-results-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: autogpt-agent,${{ runner.os }}

View File

@@ -87,13 +87,20 @@ jobs:
poetry run pytest -vv \
--cov=agbenchmark --cov-branch --cov-report term-missing --cov-report xml \
--durations=10 \
--junitxml=junit.xml -o junit_family=legacy \
tests
env:
CI: true
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- name: Upload test results to Codecov
if: ${{ !cancelled() }} # Run even if tests fail
uses: codecov/test-results-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: agbenchmark,${{ runner.os }}

View File

@@ -139,6 +139,7 @@ jobs:
poetry run pytest -vv \
--cov=forge --cov-branch --cov-report term-missing --cov-report xml \
--durations=10 \
--junitxml=junit.xml -o junit_family=legacy \
forge
env:
CI: true
@@ -148,8 +149,14 @@ jobs:
AWS_ACCESS_KEY_ID: minioadmin
AWS_SECRET_ACCESS_KEY: minioadmin
- name: Upload test results to Codecov
if: ${{ !cancelled() }} # Run even if tests fail
uses: codecov/test-results-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
flags: forge,${{ runner.os }}

View File

@@ -34,6 +34,7 @@ jobs:
python -m prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.BACKEND_DATABASE_URL }}
DIRECT_URL: ${{ secrets.BACKEND_DATABASE_URL }}
trigger:

View File

@@ -36,6 +36,7 @@ jobs:
python -m prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.BACKEND_DATABASE_URL }}
DIRECT_URL: ${{ secrets.BACKEND_DATABASE_URL }}
trigger:
needs: migrate

View File

@@ -42,6 +42,14 @@ jobs:
REDIS_PASSWORD: testpassword
ports:
- 6379:6379
rabbitmq:
image: rabbitmq:3.12-management
ports:
- 5672:5672
- 15672:15672
env:
RABBITMQ_DEFAULT_USER: ${{ env.RABBITMQ_DEFAULT_USER }}
RABBITMQ_DEFAULT_PASS: ${{ env.RABBITMQ_DEFAULT_PASS }}
steps:
- name: Checkout repository
@@ -58,7 +66,7 @@ jobs:
- name: Setup Supabase
uses: supabase/setup-cli@v1
with:
version: latest
version: 1.178.1
- id: get_date
name: Get date
@@ -72,18 +80,35 @@ jobs:
- name: Install Poetry (Unix)
run: |
curl -sSL https://install.python-poetry.org | python3 -
# Extract Poetry version from backend/poetry.lock
HEAD_POETRY_VERSION=$(head -n 1 poetry.lock | grep -oP '(?<=Poetry )[0-9]+\.[0-9]+\.[0-9]+')
echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock"
if [ -n "$BASE_REF" ]; then
BASE_BRANCH=${BASE_REF/refs\/heads\//}
BASE_POETRY_VERSION=$((git show "origin/$BASE_BRANCH":./poetry.lock; true) | head -n 1 | grep -oP '(?<=Poetry )[0-9]+\.[0-9]+\.[0-9]+')
echo "Found Poetry version ${BASE_POETRY_VERSION} in backend/poetry.lock on ${BASE_REF}"
POETRY_VERSION=$(printf '%s\n' "$HEAD_POETRY_VERSION" "$BASE_POETRY_VERSION" | sort -V | tail -n1)
else
POETRY_VERSION=$HEAD_POETRY_VERSION
fi
echo "Using Poetry version ${POETRY_VERSION}"
# Install Poetry
curl -sSL https://install.python-poetry.org | POETRY_VERSION=$POETRY_VERSION python3 -
if [ "${{ runner.os }}" = "macOS" ]; then
PATH="$HOME/.local/bin:$PATH"
echo "$HOME/.local/bin" >> $GITHUB_PATH
fi
env:
BASE_REF: ${{ github.base_ref || github.event.merge_group.base_ref }}
- name: Check poetry.lock
run: |
poetry lock
if ! git diff --quiet poetry.lock; then
if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then
echo "Error: poetry.lock not up to date."
echo
git diff poetry.lock
@@ -110,6 +135,7 @@ jobs:
run: poetry run prisma migrate dev --name updates
env:
DATABASE_URL: ${{ steps.supabase.outputs.DB_URL }}
DIRECT_URL: ${{ steps.supabase.outputs.DB_URL }}
- id: lint
name: Run Linter
@@ -126,12 +152,13 @@ jobs:
env:
LOG_LEVEL: ${{ runner.debug && 'DEBUG' || 'INFO' }}
DATABASE_URL: ${{ steps.supabase.outputs.DB_URL }}
DIRECT_URL: ${{ steps.supabase.outputs.DB_URL }}
SUPABASE_URL: ${{ steps.supabase.outputs.API_URL }}
SUPABASE_SERVICE_ROLE_KEY: ${{ steps.supabase.outputs.SERVICE_ROLE_KEY }}
SUPABASE_JWT_SECRET: ${{ steps.supabase.outputs.JWT_SECRET }}
REDIS_HOST: 'localhost'
REDIS_PORT: '6379'
REDIS_PASSWORD: 'testpassword'
REDIS_HOST: "localhost"
REDIS_PORT: "6379"
REDIS_PASSWORD: "testpassword"
env:
CI: true
@@ -139,6 +166,13 @@ jobs:
RUN_ENV: local
PORT: 8080
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# We know these are here, don't report this as a security vulnerability
# This is used as the default credential for the entire system's RabbitMQ instance
# If you want to replace this, you can do so by making our entire system generate
# new credentials for each local user and update the environment variables in
# the backend service, docker composes, and examples
RABBITMQ_DEFAULT_USER: "rabbitmq_user_default"
RABBITMQ_DEFAULT_PASS: "k0VMxyIJF9S35f3x2uaw5IWAl6Y536O7"
# - name: Upload coverage reports to Codecov
# uses: codecov/codecov-action@v4

View File

@@ -37,6 +37,25 @@ jobs:
run: |
yarn lint
type-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "21"
- name: Install dependencies
run: |
yarn install --frozen-lockfile
- name: Run tsc check
run: |
yarn type-check
test:
runs-on: ubuntu-latest
strategy:
@@ -58,12 +77,12 @@ jobs:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
large-packages: false # slow
docker-images: false # limited benefit
large-packages: false # slow
docker-images: false # limited benefit
- name: Copy default supabase .env
run: |
cp ../supabase/docker/.env.example ../.env
cp ../.env.example ../.env
- name: Copy backend .env
run: |
@@ -85,11 +104,12 @@ jobs:
run: yarn playwright install --with-deps ${{ matrix.browser }}
- name: Run tests
timeout-minutes: 20
run: |
yarn test --project=${{ matrix.browser }}
- name: Print Docker Compose logs in debug mode
if: runner.debug
- name: Print Final Docker Compose logs
if: always()
run: |
docker compose -f ../docker-compose.yml logs

View File

@@ -25,7 +25,7 @@ jobs:
close-issue-message: >
This issue was closed automatically because it has been stale for 10 days
with no activity.
days-before-stale: 50
days-before-stale: 100
days-before-close: 10
# Do not touch meta issues:
exempt-issue-labels: meta,fridge,project management

3
.gitmodules vendored
View File

@@ -1,6 +1,3 @@
[submodule "classic/forge/tests/vcr_cassettes"]
path = classic/forge/tests/vcr_cassettes
url = https://github.com/Significant-Gravitas/Auto-GPT-test-cassettes
[submodule "autogpt_platform/supabase"]
path = autogpt_platform/supabase
url = https://github.com/supabase/supabase.git

View File

@@ -140,7 +140,7 @@ repos:
language: system
- repo: https://github.com/psf/black
rev: 23.12.1
rev: 24.10.0
# Black has sensible defaults, doesn't need package context, and ignores
# everything in .gitignore, so it works fine without any config or arguments.
hooks:
@@ -170,6 +170,16 @@ repos:
files: ^classic/benchmark/(agbenchmark|tests)/((?!reports).)*[/.]
args: [--config=classic/benchmark/.flake8]
- repo: local
hooks:
- id: prettier
name: Format (Prettier) - AutoGPT Platform - Frontend
alias: format-platform-frontend
entry: bash -c 'cd autogpt_platform/frontend && npx prettier --write $(echo "$@" | sed "s|autogpt_platform/frontend/||g")' --
files: ^autogpt_platform/frontend/
types: [file]
language: system
- repo: local
# To have watertight type checking, we check *all* the files in an affected
# project. To trigger on poetry.lock we also reset the file `types` filter.
@@ -221,6 +231,16 @@ repos:
language: system
pass_filenames: false
- repo: local
hooks:
- id: tsc
name: Typecheck - AutoGPT Platform - Frontend
entry: bash -c 'cd autogpt_platform/frontend && npm run type-check'
files: ^autogpt_platform/frontend/
types: [file]
language: system
pass_filenames: false
- repo: local
hooks:
- id: pytest

View File

@@ -2,9 +2,6 @@
If you are reading this, you are probably looking for the full **[contribution guide]**,
which is part of our [wiki].
Also check out our [🚀 Roadmap][roadmap] for information about our priorities and associated tasks.
<!-- You can find our immediate priorities and their progress on our public [kanban board]. -->
[contribution guide]: https://github.com/Significant-Gravitas/AutoGPT/wiki/Contributing
[wiki]: https://github.com/Significant-Gravitas/AutoGPT/wiki
[roadmap]: https://github.com/Significant-Gravitas/AutoGPT/discussions/6971

View File

@@ -15,7 +15,11 @@
> Setting up and hosting the AutoGPT Platform yourself is a technical process.
> If you'd rather something that just works, we recommend [joining the waitlist](https://bit.ly/3ZDijAI) for the cloud-hosted beta.
https://github.com/user-attachments/assets/d04273a5-b36a-4a37-818e-f631ce72d603
### Updated Setup Instructions:
Weve moved to a fully maintained and regularly updated documentation site.
👉 [Follow the official self-hosting guide here](https://docs.agpt.co/platform/getting-started/)
This tutorial assumes you have Docker, VSCode, git and npm installed.

View File

@@ -20,6 +20,7 @@ Instead, please report them via:
- Please provide detailed reports with reproducible steps
- Include the version/commit hash where you discovered the vulnerability
- Allow us a 90-day security fix window before any public disclosure
- After patch is released, allow 30 days for users to update before public disclosure (for a total of 120 days max between update time and fix time)
- Share any potential mitigations or workarounds if known
## Supported Versions

View File

@@ -0,0 +1,123 @@
############
# Secrets
# YOU MUST CHANGE THESE BEFORE GOING INTO PRODUCTION
############
POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password
JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long
ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
DASHBOARD_USERNAME=supabase
DASHBOARD_PASSWORD=this_password_is_insecure_and_should_be_updated
SECRET_KEY_BASE=UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq
VAULT_ENC_KEY=your-encryption-key-32-chars-min
############
# Database - You can change these to any PostgreSQL database that has logical replication enabled.
############
POSTGRES_HOST=db
POSTGRES_DB=postgres
POSTGRES_PORT=5432
# default user is postgres
############
# Supavisor -- Database pooler
############
POOLER_PROXY_PORT_TRANSACTION=6543
POOLER_DEFAULT_POOL_SIZE=20
POOLER_MAX_CLIENT_CONN=100
POOLER_TENANT_ID=your-tenant-id
############
# API Proxy - Configuration for the Kong Reverse proxy.
############
KONG_HTTP_PORT=8000
KONG_HTTPS_PORT=8443
############
# API - Configuration for PostgREST.
############
PGRST_DB_SCHEMAS=public,storage,graphql_public
############
# Auth - Configuration for the GoTrue authentication server.
############
## General
SITE_URL=http://localhost:3000
ADDITIONAL_REDIRECT_URLS=
JWT_EXPIRY=3600
DISABLE_SIGNUP=false
API_EXTERNAL_URL=http://localhost:8000
## Mailer Config
MAILER_URLPATHS_CONFIRMATION="/auth/v1/verify"
MAILER_URLPATHS_INVITE="/auth/v1/verify"
MAILER_URLPATHS_RECOVERY="/auth/v1/verify"
MAILER_URLPATHS_EMAIL_CHANGE="/auth/v1/verify"
## Email auth
ENABLE_EMAIL_SIGNUP=true
ENABLE_EMAIL_AUTOCONFIRM=false
SMTP_ADMIN_EMAIL=admin@example.com
SMTP_HOST=supabase-mail
SMTP_PORT=2500
SMTP_USER=fake_mail_user
SMTP_PASS=fake_mail_password
SMTP_SENDER_NAME=fake_sender
ENABLE_ANONYMOUS_USERS=false
## Phone auth
ENABLE_PHONE_SIGNUP=true
ENABLE_PHONE_AUTOCONFIRM=true
############
# Studio - Configuration for the Dashboard
############
STUDIO_DEFAULT_ORGANIZATION=Default Organization
STUDIO_DEFAULT_PROJECT=Default Project
STUDIO_PORT=3000
# replace if you intend to use Studio outside of localhost
SUPABASE_PUBLIC_URL=http://localhost:8000
# Enable webp support
IMGPROXY_ENABLE_WEBP_DETECTION=true
# Add your OpenAI API key to enable SQL Editor Assistant
OPENAI_API_KEY=
############
# Functions - Configuration for Functions
############
# NOTE: VERIFY_JWT applies to all functions. Per-function VERIFY_JWT is not supported yet.
FUNCTIONS_VERIFY_JWT=false
############
# Logs - Configuration for Logflare
# Please refer to https://supabase.com/docs/reference/self-hosting-analytics/introduction
############
LOGFLARE_LOGGER_BACKEND_API_KEY=your-super-secret-and-long-logflare-key
# Change vector.toml sinks to reflect this change
LOGFLARE_API_KEY=your-super-secret-and-long-logflare-key
# Docker socket location - this value will differ depending on your OS
DOCKER_SOCKET_LOCATION=/var/run/docker.sock
# Google Cloud Project details
GOOGLE_PROJECT_ID=GOOGLE_PROJECT_ID
GOOGLE_PROJECT_NUMBER=GOOGLE_PROJECT_NUMBER

View File

@@ -22,35 +22,29 @@ To run the AutoGPT Platform, follow these steps:
2. Run the following command:
```
git submodule update --init --recursive
cp .env.example .env
```
This command will initialize and update the submodules in the repository. The `supabase` folder will be cloned to the root directory.
This command will copy the `.env.example` file to `.env`. You can modify the `.env` file to add your own environment variables.
3. Run the following command:
```
cp supabase/docker/.env.example .env
```
This command will copy the `.env.example` file to `.env` in the `supabase/docker` directory. You can modify the `.env` file to add your own environment variables.
4. Run the following command:
```
docker compose up -d
```
This command will start all the necessary backend services defined in the `docker-compose.yml` file in detached mode.
5. Navigate to `frontend` within the `autogpt_platform` directory:
4. Navigate to `frontend` within the `autogpt_platform` directory:
```
cd frontend
```
You will need to run your frontend application separately on your local machine.
6. Run the following command:
5. Run the following command:
```
cp .env.example .env.local
```
This command will copy the `.env.example` file to `.env.local` in the `frontend` directory. You can modify the `.env.local` within this folder to add your own environment variables for the frontend application.
7. Run the following command:
6. Run the following command:
```
npm install
npm run dev
@@ -61,7 +55,7 @@ To run the AutoGPT Platform, follow these steps:
yarn install && yarn dev
```
8. Open your browser and navigate to `http://localhost:3000` to access the AutoGPT Platform frontend.
7. Open your browser and navigate to `http://localhost:3000` to access the AutoGPT Platform frontend.
### Docker Compose Commands

View File

@@ -1,14 +1,13 @@
from .config import Settings
from .depends import requires_admin_user, requires_user
from .jwt_utils import parse_jwt_token
from .middleware import auth_middleware
from .middleware import APIKeyValidator, auth_middleware
from .models import User
__all__ = [
"Settings",
"parse_jwt_token",
"requires_user",
"requires_admin_user",
"APIKeyValidator",
"auth_middleware",
"User",
]

View File

@@ -1,14 +1,11 @@
import os
from dotenv import load_dotenv
load_dotenv()
class Settings:
JWT_SECRET_KEY: str = os.getenv("SUPABASE_JWT_SECRET", "")
ENABLE_AUTH: bool = os.getenv("ENABLE_AUTH", "false").lower() == "true"
JWT_ALGORITHM: str = "HS256"
def __init__(self):
self.JWT_SECRET_KEY: str = os.getenv("SUPABASE_JWT_SECRET", "")
self.ENABLE_AUTH: bool = os.getenv("ENABLE_AUTH", "false").lower() == "true"
self.JWT_ALGORITHM: str = "HS256"
@property
def is_configured(self) -> bool:

View File

@@ -1,6 +1,6 @@
import fastapi
from .config import Settings
from .config import settings
from .middleware import auth_middleware
from .models import DEFAULT_USER_ID, User
@@ -17,7 +17,7 @@ def requires_admin_user(
def verify_user(payload: dict | None, admin_only: bool) -> User:
if not payload:
if Settings.ENABLE_AUTH:
if settings.ENABLE_AUTH:
raise fastapi.HTTPException(
status_code=401, detail="Authorization header is missing"
)

View File

@@ -1,7 +1,10 @@
import inspect
import logging
from typing import Any, Callable, Optional
from fastapi import HTTPException, Request
from fastapi.security import HTTPBearer
from fastapi import HTTPException, Request, Security
from fastapi.security import APIKeyHeader, HTTPBearer
from starlette.status import HTTP_401_UNAUTHORIZED
from .config import settings
from .jwt_utils import parse_jwt_token
@@ -29,3 +32,104 @@ async def auth_middleware(request: Request):
except ValueError as e:
raise HTTPException(status_code=401, detail=str(e))
return payload
class APIKeyValidator:
"""
Configurable API key validator that supports custom validation functions
for FastAPI applications.
This class provides a flexible way to implement API key authentication with optional
custom validation logic. It can be used for simple token matching
or more complex validation scenarios like database lookups.
Examples:
Simple token validation:
```python
validator = APIKeyValidator(
header_name="X-API-Key",
expected_token="your-secret-token"
)
@app.get("/protected", dependencies=[Depends(validator.get_dependency())])
def protected_endpoint():
return {"message": "Access granted"}
```
Custom validation with database lookup:
```python
async def validate_with_db(api_key: str):
api_key_obj = await db.get_api_key(api_key)
return api_key_obj if api_key_obj and api_key_obj.is_active else None
validator = APIKeyValidator(
header_name="X-API-Key",
validate_fn=validate_with_db
)
```
Args:
header_name (str): The name of the header containing the API key
expected_token (Optional[str]): The expected API key value for simple token matching
validate_fn (Optional[Callable]): Custom validation function that takes an API key
string and returns a boolean or object. Can be async.
error_status (int): HTTP status code to use for validation errors
error_message (str): Error message to return when validation fails
"""
def __init__(
self,
header_name: str,
expected_token: Optional[str] = None,
validate_fn: Optional[Callable[[str], bool]] = None,
error_status: int = HTTP_401_UNAUTHORIZED,
error_message: str = "Invalid API key",
):
# Create the APIKeyHeader as a class property
self.security_scheme = APIKeyHeader(name=header_name)
self.expected_token = expected_token
self.custom_validate_fn = validate_fn
self.error_status = error_status
self.error_message = error_message
async def default_validator(self, api_key: str) -> bool:
return api_key == self.expected_token
async def __call__(
self, request: Request, api_key: str = Security(APIKeyHeader)
) -> Any:
if api_key is None:
raise HTTPException(status_code=self.error_status, detail="Missing API key")
# Use custom validation if provided, otherwise use default equality check
validator = self.custom_validate_fn or self.default_validator
result = (
await validator(api_key)
if inspect.iscoroutinefunction(validator)
else validator(api_key)
)
if not result:
raise HTTPException(
status_code=self.error_status, detail=self.error_message
)
# Store validation result in request state if it's not just a boolean
if result is not True:
request.state.api_key = result
return result
def get_dependency(self):
"""
Returns a callable dependency that FastAPI will recognize as a security scheme
"""
async def validate_api_key(
request: Request, api_key: str = Security(self.security_scheme)
) -> Any:
return await self(request, api_key)
# This helps FastAPI recognize it as a security dependency
validate_api_key.__name__ = f"validate_{self.security_scheme.model.name}"
return validate_api_key

View File

@@ -13,7 +13,6 @@ from typing_extensions import ParamSpec
from .config import SETTINGS
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)
P = ParamSpec("P")
T = TypeVar("T")

View File

@@ -8,7 +8,7 @@ from pydantic import Field, field_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
from .filters import BelowLevelFilter
from .formatters import AGPTFormatter, StructuredLoggingFormatter
from .formatters import AGPTFormatter
LOG_DIR = Path(__file__).parent.parent.parent.parent / "logs"
LOG_FILE = "activity.log"
@@ -18,7 +18,7 @@ ERROR_LOG_FILE = "error.log"
SIMPLE_LOG_FORMAT = "%(asctime)s %(levelname)s %(title)s%(message)s"
DEBUG_LOG_FORMAT = (
"%(asctime)s %(levelname)s %(filename)s:%(lineno)d" " %(title)s%(message)s"
"%(asctime)s %(levelname)s %(filename)s:%(lineno)d %(title)s%(message)s"
)
@@ -81,9 +81,26 @@ def configure_logging(force_cloud_logging: bool = False) -> None:
"""
config = LoggingConfig()
log_handlers: list[logging.Handler] = []
# Console output handlers
stdout = logging.StreamHandler(stream=sys.stdout)
stdout.setLevel(config.level)
stdout.addFilter(BelowLevelFilter(logging.WARNING))
if config.level == logging.DEBUG:
stdout.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stdout.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
stderr = logging.StreamHandler()
stderr.setLevel(logging.WARNING)
if config.level == logging.DEBUG:
stderr.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stderr.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
log_handlers += [stdout, stderr]
# Cloud logging setup
if config.enable_cloud_logging or force_cloud_logging:
import google.cloud.logging
@@ -97,28 +114,7 @@ def configure_logging(force_cloud_logging: bool = False) -> None:
transport=SyncTransport,
)
cloud_handler.setLevel(config.level)
cloud_handler.setFormatter(StructuredLoggingFormatter())
log_handlers.append(cloud_handler)
print("Cloud logging enabled")
else:
# Console output handlers
stdout = logging.StreamHandler(stream=sys.stdout)
stdout.setLevel(config.level)
stdout.addFilter(BelowLevelFilter(logging.WARNING))
if config.level == logging.DEBUG:
stdout.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stdout.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
stderr = logging.StreamHandler()
stderr.setLevel(logging.WARNING)
if config.level == logging.DEBUG:
stderr.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT))
else:
stderr.setFormatter(AGPTFormatter(SIMPLE_LOG_FORMAT))
log_handlers += [stdout, stderr]
print("Console logging enabled")
# File logging setup
if config.enable_file_logging:
@@ -156,7 +152,6 @@ def configure_logging(force_cloud_logging: bool = False) -> None:
error_log_handler.setLevel(logging.ERROR)
error_log_handler.setFormatter(AGPTFormatter(DEBUG_LOG_FORMAT, no_color=True))
log_handlers.append(error_log_handler)
print("File logging enabled")
# Configure the root logger
logging.basicConfig(

View File

@@ -1,7 +1,6 @@
import logging
from colorama import Fore, Style
from google.cloud.logging_v2.handlers import CloudLoggingFilter, StructuredLogHandler
from .utils import remove_color_codes
@@ -80,16 +79,3 @@ class AGPTFormatter(FancyConsoleFormatter):
return remove_color_codes(super().format(record))
else:
return super().format(record)
class StructuredLoggingFormatter(StructuredLogHandler, logging.Formatter):
def __init__(self):
# Set up CloudLoggingFilter to add diagnostic info to the log records
self.cloud_logging_filter = CloudLoggingFilter()
# Init StructuredLogHandler
super().__init__()
def format(self, record: logging.LogRecord) -> str:
self.cloud_logging_filter.filter(record)
return super().format(record)

View File

@@ -2,6 +2,7 @@ import logging
import re
from typing import Any
import uvicorn.config
from colorama import Fore
@@ -25,3 +26,14 @@ def print_attribute(
"color": value_color,
},
)
def generate_uvicorn_config():
"""
Generates a uvicorn logging config that silences uvicorn's default logging and tells it to use the native logging module.
"""
log_config = dict(uvicorn.config.LOGGING_CONFIG)
log_config["loggers"]["uvicorn"] = {"handlers": []}
log_config["loggers"]["uvicorn.error"] = {"handlers": []}
log_config["loggers"]["uvicorn.access"] = {"handlers": []}
return log_config

View File

@@ -1,20 +1,59 @@
import inspect
import threading
from typing import Callable, ParamSpec, TypeVar
from typing import Any, Awaitable, Callable, ParamSpec, TypeVar, cast, overload
P = ParamSpec("P")
R = TypeVar("R")
def thread_cached(func: Callable[P, R]) -> Callable[P, R]:
@overload
def thread_cached(func: Callable[P, Awaitable[R]]) -> Callable[P, Awaitable[R]]: ...
@overload
def thread_cached(func: Callable[P, R]) -> Callable[P, R]: ...
def thread_cached(
func: Callable[P, R] | Callable[P, Awaitable[R]],
) -> Callable[P, R] | Callable[P, Awaitable[R]]:
thread_local = threading.local()
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
cache = getattr(thread_local, "cache", None)
if cache is None:
cache = thread_local.cache = {}
key = (args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
if inspect.iscoroutinefunction(func):
return wrapper
async def async_wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
cache = getattr(thread_local, "cache", None)
if cache is None:
cache = thread_local.cache = {}
key = (func, args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = await cast(Callable[P, Awaitable[R]], func)(
*args, **kwargs
)
return cache[key]
return async_wrapper
else:
def sync_wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
cache = getattr(thread_local, "cache", None)
if cache is None:
cache = thread_local.cache = {}
# Include function in the key to prevent collisions between different functions
key = (func, args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return sync_wrapper
def clear_thread_cache(func: Callable[..., Any]) -> None:
"""Clear the cache for a thread-cached function."""
thread_local = threading.local()
cache = getattr(thread_local, "cache", None)
if cache is not None:
# Clear all entries that match the function
for key in list(cache.keys()):
if key and len(key) > 0 and key[0] == func:
del cache[key]

File diff suppressed because it is too large Load Diff

View File

@@ -9,19 +9,18 @@ packages = [{ include = "autogpt_libs" }]
[tool.poetry.dependencies]
colorama = "^0.4.6"
expiringdict = "^1.2.2"
google-cloud-logging = "^3.11.3"
pydantic = "^2.10.3"
pydantic-settings = "^2.7.0"
google-cloud-logging = "^3.11.4"
pydantic = "^2.11.1"
pydantic-settings = "^2.8.1"
pyjwt = "^2.10.1"
pytest-asyncio = "^0.25.0"
pytest-asyncio = "^0.26.0"
pytest-mock = "^3.14.0"
python = ">=3.10,<4.0"
python-dotenv = "^1.0.1"
supabase = "^2.10.0"
supabase = "^2.15.0"
[tool.poetry.group.dev.dependencies]
redis = "^5.2.1"
ruff = "^0.8.6"
ruff = "^0.11.0"
[build-system]
requires = ["poetry-core"]

View File

@@ -2,19 +2,33 @@ DB_USER=postgres
DB_PASS=your-super-secret-and-long-postgres-password
DB_NAME=postgres
DB_PORT=5432
DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:${DB_PORT}/${DB_NAME}?connect_timeout=60&schema=platform"
DB_HOST=localhost
DB_CONNECTION_LIMIT=12
DB_CONNECT_TIMEOUT=60
DB_POOL_TIMEOUT=300
DB_SCHEMA=platform
DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=${DB_SCHEMA}&connect_timeout=${DB_CONNECT_TIMEOUT}"
DIRECT_URL="postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=${DB_SCHEMA}&connect_timeout=${DB_CONNECT_TIMEOUT}"
PRISMA_SCHEMA="postgres/schema.prisma"
# EXECUTOR
NUM_GRAPH_WORKERS=10
NUM_NODE_WORKERS=3
BACKEND_CORS_ALLOW_ORIGINS=["http://localhost:3000"]
# generate using `from cryptography.fernet import Fernet;Fernet.generate_key().decode()`
ENCRYPTION_KEY='dvziYgz0KSK8FENhju0ZYi8-fRTfAdlz6YLhdB_jhNw='
UNSUBSCRIBE_SECRET_KEY = 'HlP8ivStJjmbf6NKi78m_3FnOogut0t5ckzjsIqeaio='
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=password
ENABLE_CREDIT=false
STRIPE_API_KEY=
STRIPE_WEBHOOK_SECRET=
# What environment things should be logged under: local dev or prod
APP_ENV=local
# What environment to behave as: "local" or "cloud"
@@ -22,12 +36,26 @@ BEHAVE_AS=local
PYRO_HOST=localhost
SENTRY_DSN=
# Email For Postmark so we can send emails
POSTMARK_SERVER_API_TOKEN=
POSTMARK_SENDER_EMAIL=invalid@invalid.com
POSTMARK_WEBHOOK_TOKEN=
## User auth with Supabase is required for any of the 3rd party integrations with auth to work.
ENABLE_AUTH=true
SUPABASE_URL=http://localhost:8000
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q
SUPABASE_JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long
# RabbitMQ credentials -- Used for communication between services
RABBITMQ_HOST=localhost
RABBITMQ_PORT=5672
RABBITMQ_DEFAULT_USER=rabbitmq_user_default
RABBITMQ_DEFAULT_PASS=k0VMxyIJF9S35f3x2uaw5IWAl6Y536O7
## GCS bucket is required for marketplace and library functionality
MEDIA_GCS_BUCKET_NAME=
## For local development, you may need to set FRONTEND_BASE_URL for the OAuth flow
## for integrations to work. Defaults to the value of PLATFORM_BASE_URL if not set.
# FRONTEND_BASE_URL=http://localhost:3000
@@ -36,7 +64,7 @@ SUPABASE_JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long
## to use the platform's webhook-related functionality.
## If you are developing locally, you can use something like ngrok to get a publc URL
## and tunnel it to your locally running backend.
PLATFORM_BASE_URL=https://your-public-url-here
PLATFORM_BASE_URL=http://localhost:3000
## == INTEGRATION CREDENTIALS == ##
# Each set of server side credentials is required for the corresponding 3rd party
@@ -72,6 +100,20 @@ GOOGLE_CLIENT_SECRET=
TWITTER_CLIENT_ID=
TWITTER_CLIENT_SECRET=
# Linear App
# Make a new workspace for your OAuth APP -- trust me
# https://linear.app/settings/api/applications/new
# Callback URL: http://localhost:3000/auth/integrations/oauth_callback
LINEAR_CLIENT_ID=
LINEAR_CLIENT_SECRET=
# To obtain Todoist API credentials:
# 1. Create a Todoist account at todoist.com
# 2. Visit the Developer Console: https://developer.todoist.com/appconsole.html
# 3. Click "Create new app"
# 4. Once created, copy your Client ID and Client Secret below
TODOIST_CLIENT_ID=
TODOIST_CLIENT_SECRET=
## ===== OPTIONAL API KEYS ===== ##
@@ -82,10 +124,12 @@ GROQ_API_KEY=
OPEN_ROUTER_API_KEY=
# Reddit
# Go to https://www.reddit.com/prefs/apps and create a new app
# Choose "script" for the type
# Fill in the redirect uri as <your_frontend_url>/auth/integrations/oauth_callback, e.g. http://localhost:3000/auth/integrations/oauth_callback
REDDIT_CLIENT_ID=
REDDIT_CLIENT_SECRET=
REDDIT_USERNAME=
REDDIT_PASSWORD=
REDDIT_USER_AGENT="AutoGPT:1.0 (by /u/autogpt)"
# Discord
DISCORD_BOT_TOKEN=
@@ -130,9 +174,23 @@ EXA_API_KEY=
# E2B
E2B_API_KEY=
# Mem0
MEM0_API_KEY=
# Nvidia
NVIDIA_API_KEY=
# Apollo
APOLLO_API_KEY=
# SmartLead
SMARTLEAD_API_KEY=
# ZeroBounce
ZEROBOUNCE_API_KEY=
## ===== OPTIONAL API KEYS END ===== ##
# Logging Configuration
LOG_LEVEL=INFO
ENABLE_CLOUD_LOGGING=false

View File

@@ -73,7 +73,6 @@ FROM server_dependencies AS server
COPY autogpt_platform/backend /app/autogpt_platform/backend
RUN poetry install --no-ansi --only-root
ENV DATABASE_URL=""
ENV PORT=8000
CMD ["poetry", "run", "rest"]

View File

@@ -1,75 +1 @@
# AutoGPT Agent Server Advanced set up
This guide walks you through a dockerized set up, with an external DB (postgres)
## Setup
We use the Poetry to manage the dependencies. To set up the project, follow these steps inside this directory:
0. Install Poetry
```sh
pip install poetry
```
1. Configure Poetry to use .venv in your project directory
```sh
poetry config virtualenvs.in-project true
```
2. Enter the poetry shell
```sh
poetry shell
```
3. Install dependencies
```sh
poetry install
```
4. Copy .env.example to .env
```sh
cp .env.example .env
```
5. Generate the Prisma client
```sh
poetry run prisma generate
```
> In case Prisma generates the client for the global Python installation instead of the virtual environment, the current mitigation is to just uninstall the global Prisma package:
>
> ```sh
> pip uninstall prisma
> ```
>
> Then run the generation again. The path *should* look something like this:
> `<some path>/pypoetry/virtualenvs/backend-TQIRSwR6-py3.12/bin/prisma`
6. Run the postgres database from the /rnd folder
```sh
cd autogpt_platform/
docker compose up -d
```
7. Run the migrations (from the backend folder)
```sh
cd ../backend
prisma migrate deploy
```
## Running The Server
### Starting the server directly
Run the following command:
```sh
poetry run app
```
[Advanced Setup (Dev Branch)](https://dev-docs.agpt.co/platform/advanced_setup/#autogpt_agent_server_advanced_set_up)

View File

@@ -1,203 +1 @@
# AutoGPT Agent Server
This is an initial project for creating the next generation of agent execution, which is an AutoGPT agent server.
The agent server will enable the creation of composite multi-agent systems that utilize AutoGPT agents and other non-agent components as its primitives.
## Docs
You can access the docs for the [AutoGPT Agent Server here](https://docs.agpt.co/server/setup).
## Setup
We use the Poetry to manage the dependencies. To set up the project, follow these steps inside this directory:
0. Install Poetry
```sh
pip install poetry
```
1. Configure Poetry to use .venv in your project directory
```sh
poetry config virtualenvs.in-project true
```
2. Enter the poetry shell
```sh
poetry shell
```
3. Install dependencies
```sh
poetry install
```
4. Copy .env.example to .env
```sh
cp .env.example .env
```
5. Generate the Prisma client
```sh
poetry run prisma generate
```
> In case Prisma generates the client for the global Python installation instead of the virtual environment, the current mitigation is to just uninstall the global Prisma package:
>
> ```sh
> pip uninstall prisma
> ```
>
> Then run the generation again. The path *should* look something like this:
> `<some path>/pypoetry/virtualenvs/backend-TQIRSwR6-py3.12/bin/prisma`
6. Migrate the database. Be careful because this deletes current data in the database.
```sh
docker compose up db -d
poetry run prisma migrate deploy
```
## Running The Server
### Starting the server without Docker
Run the following command to run database in docker but the application locally:
```sh
docker compose --profile local up deps --build --detach
poetry run app
```
### Starting the server with Docker
Run the following command to build the dockerfiles:
```sh
docker compose build
```
Run the following command to run the app:
```sh
docker compose up
```
Run the following to automatically rebuild when code changes, in another terminal:
```sh
docker compose watch
```
Run the following command to shut down:
```sh
docker compose down
```
If you run into issues with dangling orphans, try:
```sh
docker compose down --volumes --remove-orphans && docker-compose up --force-recreate --renew-anon-volumes --remove-orphans
```
## Testing
To run the tests:
```sh
poetry run test
```
## Development
### Formatting & Linting
Auto formatter and linter are set up in the project. To run them:
Install:
```sh
poetry install --with dev
```
Format the code:
```sh
poetry run format
```
Lint the code:
```sh
poetry run lint
```
## Project Outline
The current project has the following main modules:
### **blocks**
This module stores all the Agent Blocks, which are reusable components to build a graph that represents the agent's behavior.
### **data**
This module stores the logical model that is persisted in the database.
It abstracts the database operations into functions that can be called by the service layer.
Any code that interacts with Prisma objects or the database should reside in this module.
The main models are:
* `block`: anything related to the block used in the graph
* `execution`: anything related to the execution graph execution
* `graph`: anything related to the graph, node, and its relations
### **execution**
This module stores the business logic of executing the graph.
It currently has the following main modules:
* `manager`: A service that consumes the queue of the graph execution and executes the graph. It contains both pieces of logic.
* `scheduler`: A service that triggers scheduled graph execution based on a cron expression. It pushes an execution request to the manager.
### **server**
This module stores the logic for the server API.
It contains all the logic used for the API that allows the client to create, execute, and monitor the graph and its execution.
This API service interacts with other services like those defined in `manager` and `scheduler`.
### **utils**
This module stores utility functions that are used across the project.
Currently, it has two main modules:
* `process`: A module that contains the logic to spawn a new process.
* `service`: A module that serves as a parent class for all the services in the project.
## Service Communication
Currently, there are only 3 active services:
- AgentServer (the API, defined in `server.py`)
- ExecutionManager (the executor, defined in `manager.py`)
- ExecutionScheduler (the scheduler, defined in `scheduler.py`)
The services run in independent Python processes and communicate through an IPC.
A communication layer (`service.py`) is created to decouple the communication library from the implementation.
Currently, the IPC is done using Pyro5 and abstracted in a way that allows a function decorated with `@expose` to be called from a different process.
By default the daemons run on the following ports:
Execution Manager Daemon: 8002
Execution Scheduler Daemon: 8003
Rest Server Daemon: 8004
## Adding a New Agent Block
To add a new agent block, you need to create a new class that inherits from `Block` and provides the following information:
* All the block code should live in the `blocks` (`backend.blocks`) module.
* `input_schema`: the schema of the input data, represented by a Pydantic object.
* `output_schema`: the schema of the output data, represented by a Pydantic object.
* `run` method: the main logic of the block.
* `test_input` & `test_output`: the sample input and output data for the block, which will be used to auto-test the block.
* You can mock the functions declared in the block using the `test_mock` field for your unit tests.
* Once you finish creating the block, you can test it by running `poetry run pytest -s test/block/test_block.py`.
[Getting Started (Released)](https://docs.agpt.co/platform/getting-started/#autogpt_agent_server)

View File

@@ -1,22 +1,30 @@
import logging
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from backend.util.process import AppProcess
logger = logging.getLogger(__name__)
def run_processes(*processes: "AppProcess", **kwargs):
"""
Execute all processes in the app. The last process is run in the foreground.
Includes enhanced error handling and process lifecycle management.
"""
try:
# Run all processes except the last one in the background.
for process in processes[:-1]:
process.start(background=True, **kwargs)
# Run the last process in the foreground
# Run the last process in the foreground.
processes[-1].start(background=False, **kwargs)
finally:
for process in processes:
process.stop()
try:
process.stop()
except Exception as e:
logger.exception(f"[{process.service_name}] unable to stop: {e}")
def main(**kwargs):
@@ -24,14 +32,16 @@ def main(**kwargs):
Run all the processes required for the AutoGPT-server (REST and WebSocket APIs).
"""
from backend.executor import DatabaseManager, ExecutionManager, ExecutionScheduler
from backend.executor import DatabaseManager, ExecutionManager, Scheduler
from backend.notifications import NotificationManager
from backend.server.rest_api import AgentServer
from backend.server.ws_api import WebsocketServer
run_processes(
DatabaseManager(),
ExecutionManager(),
ExecutionScheduler(),
Scheduler(),
NotificationManager(),
WebsocketServer(),
AgentServer(),
**kwargs,

View File

@@ -2,88 +2,103 @@ import importlib
import os
import re
from pathlib import Path
from typing import Type, TypeVar
from backend.data.block import Block
# Dynamically load all modules under backend.blocks
AVAILABLE_MODULES = []
current_dir = Path(__file__).parent
modules = [
str(f.relative_to(current_dir))[:-3].replace(os.path.sep, ".")
for f in current_dir.rglob("*.py")
if f.is_file() and f.name != "__init__.py"
]
for module in modules:
if not re.match("^[a-z0-9_.]+$", module):
raise ValueError(
f"Block module {module} error: module name must be lowercase, "
"and contain only alphanumeric characters and underscores."
)
importlib.import_module(f".{module}", package=__name__)
AVAILABLE_MODULES.append(module)
# Load all Block instances from the available modules
AVAILABLE_BLOCKS: dict[str, Type[Block]] = {}
from typing import TYPE_CHECKING, TypeVar
if TYPE_CHECKING:
from backend.data.block import Block
T = TypeVar("T")
def all_subclasses(cls: Type[T]) -> list[Type[T]]:
_AVAILABLE_BLOCKS: dict[str, type["Block"]] = {}
def load_all_blocks() -> dict[str, type["Block"]]:
from backend.data.block import Block
if _AVAILABLE_BLOCKS:
return _AVAILABLE_BLOCKS
# Dynamically load all modules under backend.blocks
AVAILABLE_MODULES = []
current_dir = Path(__file__).parent
modules = [
str(f.relative_to(current_dir))[:-3].replace(os.path.sep, ".")
for f in current_dir.rglob("*.py")
if f.is_file() and f.name != "__init__.py"
]
for module in modules:
if not re.match("^[a-z0-9_.]+$", module):
raise ValueError(
f"Block module {module} error: module name must be lowercase, "
"and contain only alphanumeric characters and underscores."
)
importlib.import_module(f".{module}", package=__name__)
AVAILABLE_MODULES.append(module)
# Load all Block instances from the available modules
for block_cls in all_subclasses(Block):
class_name = block_cls.__name__
if class_name.endswith("Base"):
continue
if not class_name.endswith("Block"):
raise ValueError(
f"Block class {class_name} does not end with 'Block'. "
"If you are creating an abstract class, "
"please name the class with 'Base' at the end"
)
block = block_cls.create()
if not isinstance(block.id, str) or len(block.id) != 36:
raise ValueError(
f"Block ID {block.name} error: {block.id} is not a valid UUID"
)
if block.id in _AVAILABLE_BLOCKS:
raise ValueError(
f"Block ID {block.name} error: {block.id} is already in use"
)
input_schema = block.input_schema.model_fields
output_schema = block.output_schema.model_fields
# Make sure `error` field is a string in the output schema
if "error" in output_schema and output_schema["error"].annotation is not str:
raise ValueError(
f"{block.name} `error` field in output_schema must be a string"
)
# Ensure all fields in input_schema and output_schema are annotated SchemaFields
for field_name, field in [*input_schema.items(), *output_schema.items()]:
if field.annotation is None:
raise ValueError(
f"{block.name} has a field {field_name} that is not annotated"
)
if field.json_schema_extra is None:
raise ValueError(
f"{block.name} has a field {field_name} not defined as SchemaField"
)
for field in block.input_schema.model_fields.values():
if field.annotation is bool and field.default not in (True, False):
raise ValueError(
f"{block.name} has a boolean field with no default value"
)
_AVAILABLE_BLOCKS[block.id] = block_cls
return _AVAILABLE_BLOCKS
__all__ = ["load_all_blocks"]
def all_subclasses(cls: type[T]) -> list[type[T]]:
subclasses = cls.__subclasses__()
for subclass in subclasses:
subclasses += all_subclasses(subclass)
return subclasses
for block_cls in all_subclasses(Block):
name = block_cls.__name__
if block_cls.__name__.endswith("Base"):
continue
if not block_cls.__name__.endswith("Block"):
raise ValueError(
f"Block class {block_cls.__name__} does not end with 'Block', If you are creating an abstract class, please name the class with 'Base' at the end"
)
block = block_cls.create()
if not isinstance(block.id, str) or len(block.id) != 36:
raise ValueError(f"Block ID {block.name} error: {block.id} is not a valid UUID")
if block.id in AVAILABLE_BLOCKS:
raise ValueError(f"Block ID {block.name} error: {block.id} is already in use")
input_schema = block.input_schema.model_fields
output_schema = block.output_schema.model_fields
# Make sure `error` field is a string in the output schema
if "error" in output_schema and output_schema["error"].annotation is not str:
raise ValueError(
f"{block.name} `error` field in output_schema must be a string"
)
# Make sure all fields in input_schema and output_schema are annotated and has a value
for field_name, field in [*input_schema.items(), *output_schema.items()]:
if field.annotation is None:
raise ValueError(
f"{block.name} has a field {field_name} that is not annotated"
)
if field.json_schema_extra is None:
raise ValueError(
f"{block.name} has a field {field_name} not defined as SchemaField"
)
for field in block.input_schema.model_fields.values():
if field.annotation is bool and field.default not in (True, False):
raise ValueError(f"{block.name} has a boolean field with no default value")
if block.disabled:
continue
AVAILABLE_BLOCKS[block.id] = block_cls
__all__ = ["AVAILABLE_MODULES", "AVAILABLE_BLOCKS"]

View File

@@ -1,6 +1,5 @@
import logging
from autogpt_libs.utils.cache import thread_cached
from typing import Any
from backend.data.block import (
Block,
@@ -13,25 +12,11 @@ from backend.data.block import (
)
from backend.data.execution import ExecutionStatus
from backend.data.model import SchemaField
from backend.util import json
logger = logging.getLogger(__name__)
@thread_cached
def get_executor_manager_client():
from backend.executor import ExecutionManager
from backend.util.service import get_service_client
return get_service_client(ExecutionManager)
@thread_cached
def get_event_bus():
from backend.data.execution import RedisExecutionEventBus
return RedisExecutionEventBus()
class AgentExecutorBlock(Block):
class Input(BlockSchema):
user_id: str = SchemaField(description="User ID")
@@ -42,6 +27,23 @@ class AgentExecutorBlock(Block):
input_schema: dict = SchemaField(description="Input schema for the graph")
output_schema: dict = SchemaField(description="Output schema for the graph")
@classmethod
def get_input_schema(cls, data: BlockInput) -> dict[str, Any]:
return data.get("input_schema", {})
@classmethod
def get_input_defaults(cls, data: BlockInput) -> BlockInput:
return data.get("data", {})
@classmethod
def get_missing_input(cls, data: BlockInput) -> set[str]:
required_fields = cls.get_input_schema(data).get("required", [])
return set(required_fields) - set(data)
@classmethod
def get_mismatch_error(cls, data: BlockInput) -> str | None:
return json.validate_with_jsonschema(cls.get_input_schema(data), data)
class Output(BlockSchema):
pass
@@ -56,10 +58,12 @@ class AgentExecutorBlock(Block):
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
executor_manager = get_executor_manager_client()
event_bus = get_event_bus()
from backend.data.execution import ExecutionEventType
from backend.executor import utils as execution_utils
graph_exec = executor_manager.add_execution(
event_bus = execution_utils.get_execution_event_bus()
graph_exec = execution_utils.add_graph_execution(
graph_id=input_data.graph_id,
graph_version=input_data.graph_version,
user_id=input_data.user_id,
@@ -69,13 +73,11 @@ class AgentExecutorBlock(Block):
logger.info(f"Starting execution of {log_id}")
for event in event_bus.listen(
graph_id=graph_exec.graph_id, graph_exec_id=graph_exec.graph_exec_id
user_id=graph_exec.user_id,
graph_id=graph_exec.graph_id,
graph_exec_id=graph_exec.graph_exec_id,
):
logger.info(
f"Execution {log_id} produced input {event.input_data} output {event.output_data}"
)
if not event.node_id:
if event.event_type == ExecutionEventType.GRAPH_EXEC_UPDATE:
if event.status in [
ExecutionStatus.COMPLETED,
ExecutionStatus.TERMINATED,
@@ -86,6 +88,10 @@ class AgentExecutorBlock(Block):
else:
continue
logger.info(
f"Execution {log_id} produced input {event.input_data} output {event.output_data}"
)
if not event.block_id:
logger.warning(f"{log_id} received event without block_id {event}")
continue

View File

@@ -0,0 +1,108 @@
import logging
from typing import List
from backend.blocks.apollo._auth import ApolloCredentials
from backend.blocks.apollo.models import (
Contact,
Organization,
SearchOrganizationsRequest,
SearchOrganizationsResponse,
SearchPeopleRequest,
SearchPeopleResponse,
)
from backend.util.request import Requests
logger = logging.getLogger(name=__name__)
class ApolloClient:
"""Client for the Apollo API"""
API_URL = "https://api.apollo.io/api/v1"
def __init__(self, credentials: ApolloCredentials):
self.credentials = credentials
self.requests = Requests()
def _get_headers(self) -> dict[str, str]:
return {"x-api-key": self.credentials.api_key.get_secret_value()}
def search_people(self, query: SearchPeopleRequest) -> List[Contact]:
"""Search for people in Apollo"""
response = self.requests.get(
f"{self.API_URL}/mixed_people/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchPeopleResponse(**response.json())
if parsed_response.pagination.total_entries == 0:
return []
people = parsed_response.people
# handle pagination
if (
query.max_results is not None
and query.max_results < parsed_response.pagination.total_entries
and len(people) < query.max_results
):
while (
len(people) < query.max_results
and query.page < parsed_response.pagination.total_pages
and len(parsed_response.people) > 0
):
query.page += 1
response = self.requests.get(
f"{self.API_URL}/mixed_people/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchPeopleResponse(**response.json())
people.extend(parsed_response.people[: query.max_results - len(people)])
logger.info(f"Found {len(people)} people")
return people[: query.max_results] if query.max_results else people
def search_organizations(
self, query: SearchOrganizationsRequest
) -> List[Organization]:
"""Search for organizations in Apollo"""
response = self.requests.get(
f"{self.API_URL}/mixed_companies/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchOrganizationsResponse(**response.json())
if parsed_response.pagination.total_entries == 0:
return []
organizations = parsed_response.organizations
# handle pagination
if (
query.max_results is not None
and query.max_results < parsed_response.pagination.total_entries
and len(organizations) < query.max_results
):
while (
len(organizations) < query.max_results
and query.page < parsed_response.pagination.total_pages
and len(parsed_response.organizations) > 0
):
query.page += 1
response = self.requests.get(
f"{self.API_URL}/mixed_companies/search",
headers=self._get_headers(),
params=query.model_dump(exclude={"credentials", "max_results"}),
)
parsed_response = SearchOrganizationsResponse(**response.json())
organizations.extend(
parsed_response.organizations[
: query.max_results - len(organizations)
]
)
logger.info(f"Found {len(organizations)} organizations")
return (
organizations[: query.max_results] if query.max_results else organizations
)

View File

@@ -0,0 +1,35 @@
from typing import Literal
from pydantic import SecretStr
from backend.data.model import APIKeyCredentials, CredentialsField, CredentialsMetaInput
from backend.integrations.providers import ProviderName
ApolloCredentials = APIKeyCredentials
ApolloCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.APOLLO],
Literal["api_key"],
]
TEST_CREDENTIALS = APIKeyCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="apollo",
api_key=SecretStr("mock-apollo-api-key"),
title="Mock Apollo API key",
expires_at=None,
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}
def ApolloCredentialsField() -> ApolloCredentialsInput:
"""
Creates a Apollo credentials input on a block.
"""
return CredentialsField(
description="The Apollo integration can be used with an API Key.",
)

View File

@@ -0,0 +1,548 @@
from enum import Enum
from typing import Any, Optional
from pydantic import BaseModel, ConfigDict
from backend.data.model import SchemaField
class PrimaryPhone(BaseModel):
"""A primary phone in Apollo"""
number: str
source: str
sanitized_number: str
class SenorityLevels(str, Enum):
"""Seniority levels in Apollo"""
OWNER = "owner"
FOUNDER = "founder"
C_SUITE = "c_suite"
PARTNER = "partner"
VP = "vp"
HEAD = "head"
DIRECTOR = "director"
MANAGER = "manager"
SENIOR = "senior"
ENTRY = "entry"
INTERN = "intern"
class ContactEmailStatuses(str, Enum):
"""Contact email statuses in Apollo"""
VERIFIED = "verified"
UNVERIFIED = "unverified"
LIKELY_TO_ENGAGE = "likely_to_engage"
UNAVAILABLE = "unavailable"
class RuleConfigStatus(BaseModel):
"""A rule config status in Apollo"""
_id: str
created_at: str
rule_action_config_id: str
rule_config_id: str
status_cd: str
updated_at: str
id: str
key: str
class ContactCampaignStatus(BaseModel):
"""A contact campaign status in Apollo"""
id: str
emailer_campaign_id: str
send_email_from_user_id: str
inactive_reason: str
status: str
added_at: str
added_by_user_id: str
finished_at: str
paused_at: str
auto_unpause_at: str
send_email_from_email_address: str
send_email_from_email_account_id: str
manually_set_unpause: str
failure_reason: str
current_step_id: str
in_response_to_emailer_message_id: str
cc_emails: str
bcc_emails: str
to_emails: str
class Account(BaseModel):
"""An account in Apollo"""
id: str
name: str
website_url: str
blog_url: str
angellist_url: str
linkedin_url: str
twitter_url: str
facebook_url: str
primary_phone: PrimaryPhone
languages: list[str]
alexa_ranking: int
phone: str
linkedin_uid: str
founded_year: int
publicly_traded_symbol: str
publicly_traded_exchange: str
logo_url: str
chrunchbase_url: str
primary_domain: str
domain: str
team_id: str
organization_id: str
account_stage_id: str
source: str
original_source: str
creator_id: str
owner_id: str
created_at: str
phone_status: str
hubspot_id: str
salesforce_id: str
crm_owner_id: str
parent_account_id: str
sanitized_phone: str
# no listed type on the API docs
account_playbook_statues: list[Any]
account_rule_config_statuses: list[RuleConfigStatus]
existence_level: str
label_ids: list[str]
typed_custom_fields: Any
custom_field_errors: Any
modality: str
source_display_name: str
salesforce_record_id: str
crm_record_url: str
class ContactEmail(BaseModel):
"""A contact email in Apollo"""
email: str = ""
email_md5: str = ""
email_sha256: str = ""
email_status: str = ""
email_source: str = ""
extrapolated_email_confidence: str = ""
position: int = 0
email_from_customer: str = ""
free_domain: bool = True
class EmploymentHistory(BaseModel):
"""An employment history in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
_id: Optional[str] = None
created_at: Optional[str] = None
current: Optional[bool] = None
degree: Optional[str] = None
description: Optional[str] = None
emails: Optional[str] = None
end_date: Optional[str] = None
grade_level: Optional[str] = None
kind: Optional[str] = None
major: Optional[str] = None
organization_id: Optional[str] = None
organization_name: Optional[str] = None
raw_address: Optional[str] = None
start_date: Optional[str] = None
title: Optional[str] = None
updated_at: Optional[str] = None
id: Optional[str] = None
key: Optional[str] = None
class Breadcrumb(BaseModel):
"""A breadcrumb in Apollo"""
label: Optional[str] = "N/A"
signal_field_name: Optional[str] = "N/A"
value: str | list | None = "N/A"
display_name: Optional[str] = "N/A"
class TypedCustomField(BaseModel):
"""A typed custom field in Apollo"""
id: Optional[str] = "N/A"
value: Optional[str] = "N/A"
class Pagination(BaseModel):
"""Pagination in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
page: int = 0
per_page: int = 0
total_entries: int = 0
total_pages: int = 0
class DialerFlags(BaseModel):
"""A dialer flags in Apollo"""
country_name: str
country_enabled: bool
high_risk_calling_enabled: bool
potential_high_risk_number: bool
class PhoneNumber(BaseModel):
"""A phone number in Apollo"""
raw_number: str = ""
sanitized_number: str = ""
type: str = ""
position: int = 0
status: str = ""
dnc_status: str = ""
dnc_other_info: str = ""
dailer_flags: DialerFlags = DialerFlags(
country_name="",
country_enabled=True,
high_risk_calling_enabled=True,
potential_high_risk_number=True,
)
class Organization(BaseModel):
"""An organization in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
id: Optional[str] = "N/A"
name: Optional[str] = "N/A"
website_url: Optional[str] = "N/A"
blog_url: Optional[str] = "N/A"
angellist_url: Optional[str] = "N/A"
linkedin_url: Optional[str] = "N/A"
twitter_url: Optional[str] = "N/A"
facebook_url: Optional[str] = "N/A"
primary_phone: Optional[PrimaryPhone] = PrimaryPhone(
number="N/A", source="N/A", sanitized_number="N/A"
)
languages: list[str] = []
alexa_ranking: Optional[int] = 0
phone: Optional[str] = "N/A"
linkedin_uid: Optional[str] = "N/A"
founded_year: Optional[int] = 0
publicly_traded_symbol: Optional[str] = "N/A"
publicly_traded_exchange: Optional[str] = "N/A"
logo_url: Optional[str] = "N/A"
chrunchbase_url: Optional[str] = "N/A"
primary_domain: Optional[str] = "N/A"
sanitized_phone: Optional[str] = "N/A"
owned_by_organization_id: Optional[str] = "N/A"
intent_strength: Optional[str] = "N/A"
show_intent: bool = True
has_intent_signal_account: Optional[bool] = True
intent_signal_account: Optional[str] = "N/A"
class Contact(BaseModel):
"""A contact in Apollo"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
contact_roles: list[Any] = []
id: Optional[str] = None
first_name: Optional[str] = None
last_name: Optional[str] = None
name: Optional[str] = None
linkedin_url: Optional[str] = None
title: Optional[str] = None
contact_stage_id: Optional[str] = None
owner_id: Optional[str] = None
creator_id: Optional[str] = None
person_id: Optional[str] = None
email_needs_tickling: bool = True
organization_name: Optional[str] = None
source: Optional[str] = None
original_source: Optional[str] = None
organization_id: Optional[str] = None
headline: Optional[str] = None
photo_url: Optional[str] = None
present_raw_address: Optional[str] = None
linkededin_uid: Optional[str] = None
extrapolated_email_confidence: Optional[float] = None
salesforce_id: Optional[str] = None
salesforce_lead_id: Optional[str] = None
salesforce_contact_id: Optional[str] = None
saleforce_account_id: Optional[str] = None
crm_owner_id: Optional[str] = None
created_at: Optional[str] = None
emailer_campaign_ids: list[str] = []
direct_dial_status: Optional[str] = None
direct_dial_enrichment_failed_at: Optional[str] = None
email_status: Optional[str] = None
email_source: Optional[str] = None
account_id: Optional[str] = None
last_activity_date: Optional[str] = None
hubspot_vid: Optional[str] = None
hubspot_company_id: Optional[str] = None
crm_id: Optional[str] = None
sanitized_phone: Optional[str] = None
merged_crm_ids: Optional[str] = None
updated_at: Optional[str] = None
queued_for_crm_push: bool = True
suggested_from_rule_engine_config_id: Optional[str] = None
email_unsubscribed: Optional[str] = None
label_ids: list[Any] = []
has_pending_email_arcgate_request: bool = True
has_email_arcgate_request: bool = True
existence_level: Optional[str] = None
email: Optional[str] = None
email_from_customer: Optional[str] = None
typed_custom_fields: list[TypedCustomField] = []
custom_field_errors: Any = None
salesforce_record_id: Optional[str] = None
crm_record_url: Optional[str] = None
email_status_unavailable_reason: Optional[str] = None
email_true_status: Optional[str] = None
updated_email_true_status: bool = True
contact_rule_config_statuses: list[RuleConfigStatus] = []
source_display_name: Optional[str] = None
twitter_url: Optional[str] = None
contact_campaign_statuses: list[ContactCampaignStatus] = []
state: Optional[str] = None
city: Optional[str] = None
country: Optional[str] = None
account: Optional[Account] = None
contact_emails: list[ContactEmail] = []
organization: Optional[Organization] = None
employment_history: list[EmploymentHistory] = []
time_zone: Optional[str] = None
intent_strength: Optional[str] = None
show_intent: bool = True
phone_numbers: list[PhoneNumber] = []
account_phone_note: Optional[str] = None
free_domain: bool = True
is_likely_to_engage: bool = True
email_domain_catchall: bool = True
contact_job_change_event: Optional[str] = None
class SearchOrganizationsRequest(BaseModel):
"""Request for Apollo's search organizations API"""
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default=[0, 1000000],
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, any Boston-based companies will not appearch in your search results, even if they match other parameters.
To exclude companies based on location, use the organization_not_locations parameter.
""",
default_factory=list,
)
organizations_not_locations: list[str] = SchemaField(
description="""Exclude companies from search results based on the location of the company headquarters. You can use cities, US states, and countries as locations to exclude.
This parameter is useful for ensuring you do not prospect in an undesirable territory. For example, if you use ireland as a value, no Ireland-based companies will appear in your search results.
""",
default_factory=list,
)
q_organization_keyword_tags: list[str] = SchemaField(
description="""Filter search results based on keywords associated with companies. For example, you can enter mining as a value to return only companies that have an association with the mining industry."""
)
q_organization_name: str = SchemaField(
description="""Filter search results to include a specific company name.
If the value you enter for this parameter does not match with a company's name, the company will not appear in search results, even if it matches other parameters. Partial matches are accepted. For example, if you filter by the value marketing, a company called NY Marketing Unlimited would still be eligible as a search result, but NY Market Analysis would not be eligible."""
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, identify the values for organization_id when you call this endpoint.""",
default_factory=list,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
page: int = SchemaField(
description="""The page number of the Apollo data that you want to retrieve.
Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint.""",
default=1,
)
per_page: int = SchemaField(
description="""The number of search results that should be returned for each page. Limited the number of results per page improves the endpoint's performance.
Use the page parameter to search the different pages of data.""",
default=100,
)
class SearchOrganizationsResponse(BaseModel):
"""Response from Apollo's search organizations API"""
breadcrumbs: list[Breadcrumb] = []
partial_results_only: bool = True
has_join: bool = True
disable_eu_prospecting: bool = True
partial_results_limit: int = 0
pagination: Pagination = Pagination(
page=0, per_page=0, total_entries=0, total_pages=0
)
# no listed type on the API docs
accounts: list[Any] = []
organizations: list[Organization] = []
models_ids: list[str] = []
num_fetch_result: Optional[str] = "N/A"
derived_params: Optional[str] = "N/A"
class SearchPeopleRequest(BaseModel):
"""Request for Apollo's search people API"""
person_titles: list[str] = SchemaField(
description="""Job titles held by the people you want to find. For a person to be included in search results, they only need to match 1 of the job titles you add. Adding more job titles expands your search results.
Results also include job titles with the same terms, even if they are not exact matches. For example, searching for marketing manager might return people with the job title content marketing manager.
Use this parameter in combination with the person_seniorities[] parameter to find people based on specific job functions and seniority levels.
""",
default_factory=list,
placeholder="marketing manager",
)
person_locations: list[str] = SchemaField(
description="""The location where people live. You can search across cities, US states, and countries.
To find people based on the headquarters locations of their current employer, use the organization_locations parameter.""",
default_factory=list,
)
person_seniorities: list[SenorityLevels] = SchemaField(
description="""The job seniority that people hold within their current employer. This enables you to find people that currently hold positions at certain reporting levels, such as Director level or senior IC level.
For a person to be included in search results, they only need to match 1 of the seniorities you add. Adding more seniorities expands your search results.
Searches only return results based on their current job title, so searching for Director-level employees only returns people that currently hold a Director-level title. If someone was previously a Director, but is currently a VP, they would not be included in your search results.
Use this parameter in combination with the person_titles[] parameter to find people based on specific job functions and seniority levels.""",
default_factory=list,
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters for a person's current employer. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, people that work for the Boston-based company will not appear in your results, even if they match other parameters.
To find people based on their personal location, use the person_locations parameter.""",
default_factory=list,
)
q_organization_domains: list[str] = SchemaField(
description="""The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar.
You can add multiple domains to search across companies.
Examples: apollo.io and microsoft.com""",
default_factory=list,
)
contact_email_statuses: list[ContactEmailStatuses] = SchemaField(
description="""The email statuses for the people you want to find. You can add multiple statuses to expand your search.""",
default_factory=list,
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies (employers) you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, call the Organization Search endpoint and identify the values for organization_id.""",
default_factory=list,
)
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default_factory=list,
)
q_keywords: str = SchemaField(
description="""A string of words over which we want to filter the results""",
default="",
)
page: int = SchemaField(
description="""The page number of the Apollo data that you want to retrieve.
Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint.""",
default=1,
)
per_page: int = SchemaField(
description="""The number of search results that should be returned for each page. Limited the number of results per page improves the endpoint's performance.
Use the page parameter to search the different pages of data.""",
default=100,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
class SearchPeopleResponse(BaseModel):
"""Response from Apollo's search people API"""
model_config = ConfigDict(
extra="allow",
arbitrary_types_allowed=True,
from_attributes=True,
populate_by_name=True,
)
breadcrumbs: list[Breadcrumb] = []
partial_results_only: bool = True
has_join: bool = True
disable_eu_prospecting: bool = True
partial_results_limit: int = 0
pagination: Pagination = Pagination(
page=0, per_page=0, total_entries=0, total_pages=0
)
contacts: list[Contact] = []
people: list[Contact] = []
model_ids: list[str] = []
num_fetch_result: Optional[str] = "N/A"
derived_params: Optional[str] = "N/A"

View File

@@ -0,0 +1,219 @@
from backend.blocks.apollo._api import ApolloClient
from backend.blocks.apollo._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
ApolloCredentials,
ApolloCredentialsInput,
)
from backend.blocks.apollo.models import (
Organization,
PrimaryPhone,
SearchOrganizationsRequest,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class SearchOrganizationsBlock(Block):
"""Search for organizations in Apollo"""
class Input(BlockSchema):
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default=[0, 1000000],
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, any Boston-based companies will not appearch in your search results, even if they match other parameters.
To exclude companies based on location, use the organization_not_locations parameter.
""",
default_factory=list,
)
organizations_not_locations: list[str] = SchemaField(
description="""Exclude companies from search results based on the location of the company headquarters. You can use cities, US states, and countries as locations to exclude.
This parameter is useful for ensuring you do not prospect in an undesirable territory. For example, if you use ireland as a value, no Ireland-based companies will appear in your search results.
""",
default_factory=list,
)
q_organization_keyword_tags: list[str] = SchemaField(
description="""Filter search results based on keywords associated with companies. For example, you can enter mining as a value to return only companies that have an association with the mining industry.""",
default_factory=list,
)
q_organization_name: str = SchemaField(
description="""Filter search results to include a specific company name.
If the value you enter for this parameter does not match with a company's name, the company will not appear in search results, even if it matches other parameters. Partial matches are accepted. For example, if you filter by the value marketing, a company called NY Marketing Unlimited would still be eligible as a search result, but NY Market Analysis would not be eligible.""",
default="",
advanced=False,
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, identify the values for organization_id when you call this endpoint.""",
default_factory=list,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
credentials: ApolloCredentialsInput = SchemaField(
description="Apollo credentials",
)
class Output(BlockSchema):
organizations: list[Organization] = SchemaField(
description="List of organizations found",
default_factory=list,
)
organization: Organization = SchemaField(
description="Each found organization, one at a time",
)
error: str = SchemaField(
description="Error message if the search failed",
default="",
)
def __init__(self):
super().__init__(
id="3d71270d-599e-4148-9b95-71b35d2f44f0",
description="Search for organizations in Apollo",
categories={BlockCategory.SEARCH},
input_schema=SearchOrganizationsBlock.Input,
output_schema=SearchOrganizationsBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={"query": "Google", "credentials": TEST_CREDENTIALS_INPUT},
test_output=[
(
"organization",
Organization(
id="1",
name="Google",
website_url="https://google.com",
blog_url="https://google.com/blog",
angellist_url="https://angel.co/google",
linkedin_url="https://linkedin.com/company/google",
twitter_url="https://twitter.com/google",
facebook_url="https://facebook.com/google",
primary_phone=PrimaryPhone(
source="google",
number="1234567890",
sanitized_number="1234567890",
),
languages=["en"],
alexa_ranking=1000,
phone="1234567890",
linkedin_uid="1234567890",
founded_year=2000,
publicly_traded_symbol="GOOGL",
publicly_traded_exchange="NASDAQ",
logo_url="https://google.com/logo.png",
chrunchbase_url="https://chrunchbase.com/google",
primary_domain="google.com",
sanitized_phone="1234567890",
owned_by_organization_id="1",
intent_strength="strong",
show_intent=True,
has_intent_signal_account=True,
intent_signal_account="1",
),
),
(
"organizations",
[
Organization(
id="1",
name="Google",
website_url="https://google.com",
blog_url="https://google.com/blog",
angellist_url="https://angel.co/google",
linkedin_url="https://linkedin.com/company/google",
twitter_url="https://twitter.com/google",
facebook_url="https://facebook.com/google",
primary_phone=PrimaryPhone(
source="google",
number="1234567890",
sanitized_number="1234567890",
),
languages=["en"],
alexa_ranking=1000,
phone="1234567890",
linkedin_uid="1234567890",
founded_year=2000,
publicly_traded_symbol="GOOGL",
publicly_traded_exchange="NASDAQ",
logo_url="https://google.com/logo.png",
chrunchbase_url="https://chrunchbase.com/google",
primary_domain="google.com",
sanitized_phone="1234567890",
owned_by_organization_id="1",
intent_strength="strong",
show_intent=True,
has_intent_signal_account=True,
intent_signal_account="1",
),
],
),
],
test_mock={
"search_organizations": lambda *args, **kwargs: [
Organization(
id="1",
name="Google",
website_url="https://google.com",
blog_url="https://google.com/blog",
angellist_url="https://angel.co/google",
linkedin_url="https://linkedin.com/company/google",
twitter_url="https://twitter.com/google",
facebook_url="https://facebook.com/google",
primary_phone=PrimaryPhone(
source="google",
number="1234567890",
sanitized_number="1234567890",
),
languages=["en"],
alexa_ranking=1000,
phone="1234567890",
linkedin_uid="1234567890",
founded_year=2000,
publicly_traded_symbol="GOOGL",
publicly_traded_exchange="NASDAQ",
logo_url="https://google.com/logo.png",
chrunchbase_url="https://chrunchbase.com/google",
primary_domain="google.com",
sanitized_phone="1234567890",
owned_by_organization_id="1",
intent_strength="strong",
show_intent=True,
has_intent_signal_account=True,
intent_signal_account="1",
)
]
},
)
@staticmethod
def search_organizations(
query: SearchOrganizationsRequest, credentials: ApolloCredentials
) -> list[Organization]:
client = ApolloClient(credentials)
return client.search_organizations(query)
def run(
self, input_data: Input, *, credentials: ApolloCredentials, **kwargs
) -> BlockOutput:
query = SearchOrganizationsRequest(
**input_data.model_dump(exclude={"credentials"})
)
organizations = self.search_organizations(query, credentials)
for organization in organizations:
yield "organization", organization
yield "organizations", organizations

View File

@@ -0,0 +1,394 @@
from backend.blocks.apollo._api import ApolloClient
from backend.blocks.apollo._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
ApolloCredentials,
ApolloCredentialsInput,
)
from backend.blocks.apollo.models import (
Contact,
ContactEmailStatuses,
SearchPeopleRequest,
SenorityLevels,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class SearchPeopleBlock(Block):
"""Search for people in Apollo"""
class Input(BlockSchema):
person_titles: list[str] = SchemaField(
description="""Job titles held by the people you want to find. For a person to be included in search results, they only need to match 1 of the job titles you add. Adding more job titles expands your search results.
Results also include job titles with the same terms, even if they are not exact matches. For example, searching for marketing manager might return people with the job title content marketing manager.
Use this parameter in combination with the person_seniorities[] parameter to find people based on specific job functions and seniority levels.
""",
default_factory=list,
advanced=False,
)
person_locations: list[str] = SchemaField(
description="""The location where people live. You can search across cities, US states, and countries.
To find people based on the headquarters locations of their current employer, use the organization_locations parameter.""",
default_factory=list,
advanced=False,
)
person_seniorities: list[SenorityLevels] = SchemaField(
description="""The job seniority that people hold within their current employer. This enables you to find people that currently hold positions at certain reporting levels, such as Director level or senior IC level.
For a person to be included in search results, they only need to match 1 of the seniorities you add. Adding more seniorities expands your search results.
Searches only return results based on their current job title, so searching for Director-level employees only returns people that currently hold a Director-level title. If someone was previously a Director, but is currently a VP, they would not be included in your search results.
Use this parameter in combination with the person_titles[] parameter to find people based on specific job functions and seniority levels.""",
default_factory=list,
advanced=False,
)
organization_locations: list[str] = SchemaField(
description="""The location of the company headquarters for a person's current employer. You can search across cities, US states, and countries.
If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, people that work for the Boston-based company will not appear in your results, even if they match other parameters.
To find people based on their personal location, use the person_locations parameter.""",
default_factory=list,
advanced=False,
)
q_organization_domains: list[str] = SchemaField(
description="""The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar.
You can add multiple domains to search across companies.
Examples: apollo.io and microsoft.com""",
default_factory=list,
advanced=False,
)
contact_email_statuses: list[ContactEmailStatuses] = SchemaField(
description="""The email statuses for the people you want to find. You can add multiple statuses to expand your search.""",
default_factory=list,
advanced=False,
)
organization_ids: list[str] = SchemaField(
description="""The Apollo IDs for the companies (employers) you want to include in your search results. Each company in the Apollo database is assigned a unique ID.
To find IDs, call the Organization Search endpoint and identify the values for organization_id.""",
default_factory=list,
advanced=False,
)
organization_num_empoloyees_range: list[int] = SchemaField(
description="""The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results.
Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma.""",
default_factory=list,
advanced=False,
)
q_keywords: str = SchemaField(
description="""A string of words over which we want to filter the results""",
default="",
advanced=False,
)
max_results: int = SchemaField(
description="""The maximum number of results to return. If you don't specify this parameter, the default is 100.""",
default=100,
ge=1,
le=50000,
advanced=True,
)
credentials: ApolloCredentialsInput = SchemaField(
description="Apollo credentials",
)
class Output(BlockSchema):
people: list[Contact] = SchemaField(
description="List of people found",
default_factory=list,
)
person: Contact = SchemaField(
description="Each found person, one at a time",
)
error: str = SchemaField(
description="Error message if the search failed",
default="",
)
def __init__(self):
super().__init__(
id="c2adb3aa-5aae-488d-8a6e-4eb8c23e2ed6",
description="Search for people in Apollo",
categories={BlockCategory.SEARCH},
input_schema=SearchPeopleBlock.Input,
output_schema=SearchPeopleBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={"credentials": TEST_CREDENTIALS_INPUT},
test_output=[
(
"person",
Contact(
contact_roles=[],
id="1",
name="John Doe",
first_name="John",
last_name="Doe",
linkedin_url="https://www.linkedin.com/in/johndoe",
title="Software Engineer",
organization_name="Google",
organization_id="123456",
contact_stage_id="1",
owner_id="1",
creator_id="1",
person_id="1",
email_needs_tickling=True,
source="apollo",
original_source="apollo",
headline="Software Engineer",
photo_url="https://www.linkedin.com/in/johndoe",
present_raw_address="123 Main St, Anytown, USA",
linkededin_uid="123456",
extrapolated_email_confidence=0.8,
salesforce_id="123456",
salesforce_lead_id="123456",
salesforce_contact_id="123456",
saleforce_account_id="123456",
crm_owner_id="123456",
created_at="2021-01-01",
emailer_campaign_ids=[],
direct_dial_status="active",
direct_dial_enrichment_failed_at="2021-01-01",
email_status="active",
email_source="apollo",
account_id="123456",
last_activity_date="2021-01-01",
hubspot_vid="123456",
hubspot_company_id="123456",
crm_id="123456",
sanitized_phone="123456",
merged_crm_ids="123456",
updated_at="2021-01-01",
queued_for_crm_push=True,
suggested_from_rule_engine_config_id="123456",
email_unsubscribed=None,
label_ids=[],
has_pending_email_arcgate_request=True,
has_email_arcgate_request=True,
existence_level=None,
email=None,
email_from_customer=None,
typed_custom_fields=[],
custom_field_errors=None,
salesforce_record_id=None,
crm_record_url=None,
email_status_unavailable_reason=None,
email_true_status=None,
updated_email_true_status=True,
contact_rule_config_statuses=[],
source_display_name=None,
twitter_url=None,
contact_campaign_statuses=[],
state=None,
city=None,
country=None,
account=None,
contact_emails=[],
organization=None,
employment_history=[],
time_zone=None,
intent_strength=None,
show_intent=True,
phone_numbers=[],
account_phone_note=None,
free_domain=True,
is_likely_to_engage=True,
email_domain_catchall=True,
contact_job_change_event=None,
),
),
(
"people",
[
Contact(
contact_roles=[],
id="1",
name="John Doe",
first_name="John",
last_name="Doe",
linkedin_url="https://www.linkedin.com/in/johndoe",
title="Software Engineer",
organization_name="Google",
organization_id="123456",
contact_stage_id="1",
owner_id="1",
creator_id="1",
person_id="1",
email_needs_tickling=True,
source="apollo",
original_source="apollo",
headline="Software Engineer",
photo_url="https://www.linkedin.com/in/johndoe",
present_raw_address="123 Main St, Anytown, USA",
linkededin_uid="123456",
extrapolated_email_confidence=0.8,
salesforce_id="123456",
salesforce_lead_id="123456",
salesforce_contact_id="123456",
saleforce_account_id="123456",
crm_owner_id="123456",
created_at="2021-01-01",
emailer_campaign_ids=[],
direct_dial_status="active",
direct_dial_enrichment_failed_at="2021-01-01",
email_status="active",
email_source="apollo",
account_id="123456",
last_activity_date="2021-01-01",
hubspot_vid="123456",
hubspot_company_id="123456",
crm_id="123456",
sanitized_phone="123456",
merged_crm_ids="123456",
updated_at="2021-01-01",
queued_for_crm_push=True,
suggested_from_rule_engine_config_id="123456",
email_unsubscribed=None,
label_ids=[],
has_pending_email_arcgate_request=True,
has_email_arcgate_request=True,
existence_level=None,
email=None,
email_from_customer=None,
typed_custom_fields=[],
custom_field_errors=None,
salesforce_record_id=None,
crm_record_url=None,
email_status_unavailable_reason=None,
email_true_status=None,
updated_email_true_status=True,
contact_rule_config_statuses=[],
source_display_name=None,
twitter_url=None,
contact_campaign_statuses=[],
state=None,
city=None,
country=None,
account=None,
contact_emails=[],
organization=None,
employment_history=[],
time_zone=None,
intent_strength=None,
show_intent=True,
phone_numbers=[],
account_phone_note=None,
free_domain=True,
is_likely_to_engage=True,
email_domain_catchall=True,
contact_job_change_event=None,
),
],
),
],
test_mock={
"search_people": lambda query, credentials: [
Contact(
id="1",
name="John Doe",
first_name="John",
last_name="Doe",
linkedin_url="https://www.linkedin.com/in/johndoe",
title="Software Engineer",
organization_name="Google",
organization_id="123456",
contact_stage_id="1",
owner_id="1",
creator_id="1",
person_id="1",
email_needs_tickling=True,
source="apollo",
original_source="apollo",
headline="Software Engineer",
photo_url="https://www.linkedin.com/in/johndoe",
present_raw_address="123 Main St, Anytown, USA",
linkededin_uid="123456",
extrapolated_email_confidence=0.8,
salesforce_id="123456",
salesforce_lead_id="123456",
salesforce_contact_id="123456",
saleforce_account_id="123456",
crm_owner_id="123456",
created_at="2021-01-01",
emailer_campaign_ids=[],
direct_dial_status="active",
direct_dial_enrichment_failed_at="2021-01-01",
email_status="active",
email_source="apollo",
account_id="123456",
last_activity_date="2021-01-01",
hubspot_vid="123456",
hubspot_company_id="123456",
crm_id="123456",
sanitized_phone="123456",
merged_crm_ids="123456",
updated_at="2021-01-01",
queued_for_crm_push=True,
suggested_from_rule_engine_config_id="123456",
email_unsubscribed=None,
label_ids=[],
has_pending_email_arcgate_request=True,
has_email_arcgate_request=True,
existence_level=None,
email=None,
email_from_customer=None,
typed_custom_fields=[],
custom_field_errors=None,
salesforce_record_id=None,
crm_record_url=None,
email_status_unavailable_reason=None,
email_true_status=None,
updated_email_true_status=True,
contact_rule_config_statuses=[],
source_display_name=None,
twitter_url=None,
contact_campaign_statuses=[],
state=None,
city=None,
country=None,
account=None,
contact_emails=[],
organization=None,
employment_history=[],
time_zone=None,
intent_strength=None,
show_intent=True,
phone_numbers=[],
account_phone_note=None,
free_domain=True,
is_likely_to_engage=True,
email_domain_catchall=True,
contact_job_change_event=None,
),
]
},
)
@staticmethod
def search_people(
query: SearchPeopleRequest, credentials: ApolloCredentials
) -> list[Contact]:
client = ApolloClient(credentials)
return client.search_people(query)
def run(
self,
input_data: Input,
*,
credentials: ApolloCredentials,
**kwargs,
) -> BlockOutput:
query = SearchPeopleRequest(**input_data.model_dump(exclude={"credentials"}))
people = self.search_people(query, credentials)
for person in people:
yield "person", person
yield "people", people

View File

@@ -1,11 +1,48 @@
import enum
from typing import Any, List
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema, BlockType
from backend.data.model import SchemaField
from backend.util import json
from backend.util.file import store_media_file
from backend.util.mock import MockObject
from backend.util.text import TextFormatter
from backend.util.type import MediaFileType, convert
formatter = TextFormatter()
class FileStoreBlock(Block):
class Input(BlockSchema):
file_in: MediaFileType = SchemaField(
description="The file to store in the temporary directory, it can be a URL, data URI, or local path."
)
class Output(BlockSchema):
file_out: MediaFileType = SchemaField(
description="The relative path to the stored file in the temporary directory."
)
def __init__(self):
super().__init__(
id="cbb50872-625b-42f0-8203-a2ae78242d8a",
description="Stores the input file in the temporary directory.",
categories={BlockCategory.BASIC, BlockCategory.MULTIMEDIA},
input_schema=FileStoreBlock.Input,
output_schema=FileStoreBlock.Output,
static_output=True,
)
def run(
self,
input_data: Input,
*,
graph_exec_id: str,
**kwargs,
) -> BlockOutput:
file_path = store_media_file(
graph_exec_id=graph_exec_id,
file=input_data.file_in,
return_content=False,
)
yield "file_out", file_path
class StoreValueBlock(Block):
@@ -51,29 +88,6 @@ class StoreValueBlock(Block):
yield "output", input_data.data or input_data.input
class PrintToConsoleBlock(Block):
class Input(BlockSchema):
text: str = SchemaField(description="The text to print to the console.")
class Output(BlockSchema):
status: str = SchemaField(description="The status of the print operation.")
def __init__(self):
super().__init__(
id="f3b1c1b2-4c4f-4f0d-8d2f-4c4f0d8d2f4c",
description="Print the given text to the console, this is used for a debugging purpose.",
categories={BlockCategory.BASIC},
input_schema=PrintToConsoleBlock.Input,
output_schema=PrintToConsoleBlock.Output,
test_input={"text": "Hello, World!"},
test_output=("status", "printed"),
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
print(">>>>> Print: ", input_data.text)
yield "status", "printed"
class FindInDictionaryBlock(Block):
class Input(BlockSchema):
input: Any = SchemaField(description="Dictionary to lookup from")
@@ -114,6 +128,9 @@ class FindInDictionaryBlock(Block):
obj = input_data.input
key = input_data.key
if isinstance(obj, str):
obj = json.loads(obj)
if isinstance(obj, dict) and key in obj:
yield "output", obj[key]
elif isinstance(obj, list) and isinstance(key, int) and 0 <= key < len(obj):
@@ -131,190 +148,10 @@ class FindInDictionaryBlock(Block):
yield "missing", input_data.input
class AgentInputBlock(Block):
"""
This block is used to provide input to the graph.
It takes in a value, name, description, default values list and bool to limit selection to default values.
It Outputs the value passed as input.
"""
class Input(BlockSchema):
name: str = SchemaField(description="The name of the input.")
value: Any = SchemaField(
description="The value to be passed as input.",
default=None,
)
title: str | None = SchemaField(
description="The title of the input.", default=None, advanced=True
)
description: str | None = SchemaField(
description="The description of the input.",
default=None,
advanced=True,
)
placeholder_values: List[Any] = SchemaField(
description="The placeholder values to be passed as input.",
default=[],
advanced=True,
)
limit_to_placeholder_values: bool = SchemaField(
description="Whether to limit the selection to placeholder values.",
default=False,
advanced=True,
)
advanced: bool = SchemaField(
description="Whether to show the input in the advanced section, if the field is not required.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the input should be treated as a secret.",
default=False,
advanced=True,
)
class Output(BlockSchema):
result: Any = SchemaField(description="The value passed as input.")
def __init__(self):
super().__init__(
id="c0a8e994-ebf1-4a9c-a4d8-89d09c86741b",
description="This block is used to provide input to the graph.",
input_schema=AgentInputBlock.Input,
output_schema=AgentInputBlock.Output,
test_input=[
{
"value": "Hello, World!",
"name": "input_1",
"description": "This is a test input.",
"placeholder_values": [],
"limit_to_placeholder_values": False,
},
{
"value": "Hello, World!",
"name": "input_2",
"description": "This is a test input.",
"placeholder_values": ["Hello, World!"],
"limit_to_placeholder_values": True,
},
],
test_output=[
("result", "Hello, World!"),
("result", "Hello, World!"),
],
categories={BlockCategory.INPUT, BlockCategory.BASIC},
block_type=BlockType.INPUT,
static_output=True,
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
yield "result", input_data.value
class AgentOutputBlock(Block):
"""
Records the output of the graph for users to see.
Behavior:
If `format` is provided and the `value` is of a type that can be formatted,
the block attempts to format the recorded_value using the `format`.
If formatting fails or no `format` is provided, the raw `value` is output.
"""
class Input(BlockSchema):
value: Any = SchemaField(
description="The value to be recorded as output.",
default=None,
advanced=False,
)
name: str = SchemaField(description="The name of the output.")
title: str | None = SchemaField(
description="The title of the output.",
default=None,
advanced=True,
)
description: str | None = SchemaField(
description="The description of the output.",
default=None,
advanced=True,
)
format: str = SchemaField(
description="The format string to be used to format the recorded_value. Use Jinja2 syntax.",
default="",
advanced=True,
)
advanced: bool = SchemaField(
description="Whether to treat the output as advanced.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the output should be treated as a secret.",
default=False,
advanced=True,
)
class Output(BlockSchema):
output: Any = SchemaField(description="The value recorded as output.")
def __init__(self):
super().__init__(
id="363ae599-353e-4804-937e-b2ee3cef3da4",
description="Stores the output of the graph for users to see.",
input_schema=AgentOutputBlock.Input,
output_schema=AgentOutputBlock.Output,
test_input=[
{
"value": "Hello, World!",
"name": "output_1",
"description": "This is a test output.",
"format": "{{ output_1 }}!!",
},
{
"value": "42",
"name": "output_2",
"description": "This is another test output.",
"format": "{{ output_2 }}",
},
{
"value": MockObject(value="!!", key="key"),
"name": "output_3",
"description": "This is a test output with a mock object.",
"format": "{{ output_3 }}",
},
],
test_output=[
("output", "Hello, World!!!"),
("output", "42"),
("output", MockObject(value="!!", key="key")),
],
categories={BlockCategory.OUTPUT, BlockCategory.BASIC},
block_type=BlockType.OUTPUT,
static_output=True,
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
"""
Attempts to format the recorded_value using the fmt_string if provided.
If formatting fails or no fmt_string is given, returns the original recorded_value.
"""
if input_data.format:
try:
yield "output", formatter.format_string(
input_data.format, {input_data.name: input_data.value}
)
except Exception as e:
yield "output", f"Error: {e}, {input_data.value}"
else:
yield "output", input_data.value
class AddToDictionaryBlock(Block):
class Input(BlockSchema):
dictionary: dict[Any, Any] = SchemaField(
default={},
default_factory=dict,
description="The dictionary to add the entry to. If not provided, a new dictionary will be created.",
)
key: str = SchemaField(
@@ -330,7 +167,7 @@ class AddToDictionaryBlock(Block):
advanced=False,
)
entries: dict[Any, Any] = SchemaField(
default={},
default_factory=dict,
description="The entries to add to the dictionary. This is the batch version of the `key` and `value` fields.",
advanced=True,
)
@@ -392,7 +229,7 @@ class AddToDictionaryBlock(Block):
class AddToListBlock(Block):
class Input(BlockSchema):
list: List[Any] = SchemaField(
default=[],
default_factory=list,
advanced=False,
description="The list to add the entry to. If not provided, a new list will be created.",
)
@@ -402,7 +239,7 @@ class AddToListBlock(Block):
default=None,
)
entries: List[Any] = SchemaField(
default=[],
default_factory=lambda: list(),
description="The entries to add to the list. This is the batch version of the `entry` field.",
advanced=True,
)
@@ -469,6 +306,48 @@ class AddToListBlock(Block):
yield "updated_list", updated_list
class FindInListBlock(Block):
class Input(BlockSchema):
list: List[Any] = SchemaField(description="The list to search in.")
value: Any = SchemaField(description="The value to search for.")
class Output(BlockSchema):
index: int = SchemaField(description="The index of the value in the list.")
found: bool = SchemaField(
description="Whether the value was found in the list."
)
not_found_value: Any = SchemaField(
description="The value that was not found in the list."
)
def __init__(self):
super().__init__(
id="5e2c6d0a-1e37-489f-b1d0-8e1812b23333",
description="Finds the index of the value in the list.",
categories={BlockCategory.BASIC},
input_schema=FindInListBlock.Input,
output_schema=FindInListBlock.Output,
test_input=[
{"list": [1, 2, 3, 4, 5], "value": 3},
{"list": [1, 2, 3, 4, 5], "value": 6},
],
test_output=[
("index", 2),
("found", True),
("found", False),
("not_found_value", 6),
],
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
try:
yield "index", input_data.list.index(input_data.value)
yield "found", True
except ValueError:
yield "found", False
yield "not_found_value", input_data.value
class NoteBlock(Block):
class Input(BlockSchema):
text: str = SchemaField(description="The text to display in the sticky note.")
@@ -590,3 +469,47 @@ class CreateListBlock(Block):
yield "list", input_data.values
except Exception as e:
yield "error", f"Failed to create list: {str(e)}"
class TypeOptions(enum.Enum):
STRING = "string"
NUMBER = "number"
BOOLEAN = "boolean"
LIST = "list"
DICTIONARY = "dictionary"
class UniversalTypeConverterBlock(Block):
class Input(BlockSchema):
value: Any = SchemaField(
description="The value to convert to a universal type."
)
type: TypeOptions = SchemaField(description="The type to convert the value to.")
class Output(BlockSchema):
value: Any = SchemaField(description="The converted value.")
def __init__(self):
super().__init__(
id="95d1b990-ce13-4d88-9737-ba5c2070c97b",
description="This block is used to convert a value to a universal type.",
categories={BlockCategory.BASIC},
input_schema=UniversalTypeConverterBlock.Input,
output_schema=UniversalTypeConverterBlock.Output,
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
try:
converted_value = convert(
input_data.value,
{
TypeOptions.STRING: str,
TypeOptions.NUMBER: float,
TypeOptions.BOOLEAN: bool,
TypeOptions.LIST: list,
TypeOptions.DICTIONARY: dict,
}[input_data.type],
)
yield "value", converted_value
except Exception as e:
yield "error", f"Failed to convert value: {str(e)}"

View File

@@ -107,3 +107,83 @@ class ConditionBlock(Block):
yield "yes_output", yes_value
else:
yield "no_output", no_value
class IfInputMatchesBlock(Block):
class Input(BlockSchema):
input: Any = SchemaField(
description="The input to match against",
placeholder="For example: 10 or 'hello' or True",
)
value: Any = SchemaField(
description="The value to output if the input matches",
placeholder="For example: 'Greater' or 20 or False",
)
yes_value: Any = SchemaField(
description="The value to output if the input matches",
placeholder="For example: 'Greater' or 20 or False",
default=None,
)
no_value: Any = SchemaField(
description="The value to output if the input does not match",
placeholder="For example: 'Greater' or 20 or False",
default=None,
)
class Output(BlockSchema):
result: bool = SchemaField(
description="The result of the condition evaluation (True or False)"
)
yes_output: Any = SchemaField(
description="The output value if the condition is true"
)
no_output: Any = SchemaField(
description="The output value if the condition is false"
)
def __init__(self):
super().__init__(
id="6dbbc4b3-ca6c-42b6-b508-da52d23e13f2",
input_schema=IfInputMatchesBlock.Input,
output_schema=IfInputMatchesBlock.Output,
description="Handles conditional logic based on comparison operators",
categories={BlockCategory.LOGIC},
test_input=[
{
"input": 10,
"value": 10,
"yes_value": "Greater",
"no_value": "Not greater",
},
{
"input": 10,
"value": 20,
"yes_value": "Greater",
"no_value": "Not greater",
},
{
"input": 10,
"value": None,
"yes_value": "Yes",
"no_value": "No",
},
],
test_output=[
("result", True),
("yes_output", "Greater"),
("result", False),
("no_output", "Not greater"),
("result", False),
("no_output", "No"),
# ("result", True),
# ("yes_output", "Yes"),
],
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
if input_data.input == input_data.value or input_data.input is input_data.value:
yield "result", True
yield "yes_output", input_data.yes_value
else:
yield "result", False
yield "no_output", input_data.no_value

View File

@@ -55,7 +55,7 @@ class CodeExecutionBlock(Block):
"These commands are executed with `sh`, in the foreground."
),
placeholder="pip install cowsay",
default=[],
default_factory=list,
advanced=False,
)
@@ -188,3 +188,270 @@ class CodeExecutionBlock(Block):
yield "stderr_logs", stderr_logs
except Exception as e:
yield "error", str(e)
class InstantiationBlock(Block):
class Input(BlockSchema):
credentials: CredentialsMetaInput[
Literal[ProviderName.E2B], Literal["api_key"]
] = CredentialsField(
description="Enter your api key for the E2B Sandbox. You can get it in here - https://e2b.dev/docs",
)
# Todo : Option to run commond in background
setup_commands: list[str] = SchemaField(
description=(
"Shell commands to set up the sandbox before running the code. "
"You can use `curl` or `git` to install your desired Debian based "
"package manager. `pip` and `npm` are pre-installed.\n\n"
"These commands are executed with `sh`, in the foreground."
),
placeholder="pip install cowsay",
default_factory=list,
advanced=False,
)
setup_code: str = SchemaField(
description="Code to execute in the sandbox",
placeholder="print('Hello, World!')",
default="",
advanced=False,
)
language: ProgrammingLanguage = SchemaField(
description="Programming language to execute",
default=ProgrammingLanguage.PYTHON,
advanced=False,
)
timeout: int = SchemaField(
description="Execution timeout in seconds", default=300
)
template_id: str = SchemaField(
description=(
"You can use an E2B sandbox template by entering its ID here. "
"Check out the E2B docs for more details: "
"[E2B - Sandbox template](https://e2b.dev/docs/sandbox-template)"
),
default="",
advanced=True,
)
class Output(BlockSchema):
sandbox_id: str = SchemaField(description="ID of the sandbox instance")
response: str = SchemaField(description="Response from code execution")
stdout_logs: str = SchemaField(
description="Standard output logs from execution"
)
stderr_logs: str = SchemaField(description="Standard error logs from execution")
error: str = SchemaField(description="Error message if execution failed")
def __init__(self):
super().__init__(
id="ff0861c9-1726-4aec-9e5b-bf53f3622112",
description="Instantiate an isolated sandbox environment with internet access where to execute code in.",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=InstantiationBlock.Input,
output_schema=InstantiationBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"setup_code": "print('Hello World')",
"language": ProgrammingLanguage.PYTHON.value,
"setup_commands": [],
"timeout": 300,
"template_id": "",
},
test_output=[
("sandbox_id", str),
("response", "Hello World"),
("stdout_logs", "Hello World\n"),
],
test_mock={
"execute_code": lambda setup_code, language, setup_commands, timeout, api_key, template_id: (
"sandbox_id",
"Hello World",
"Hello World\n",
"",
),
},
)
def run(
self, input_data: Input, *, credentials: APIKeyCredentials, **kwargs
) -> BlockOutput:
try:
sandbox_id, response, stdout_logs, stderr_logs = self.execute_code(
input_data.setup_code,
input_data.language,
input_data.setup_commands,
input_data.timeout,
credentials.api_key.get_secret_value(),
input_data.template_id,
)
if sandbox_id:
yield "sandbox_id", sandbox_id
else:
yield "error", "Sandbox ID not found"
if response:
yield "response", response
if stdout_logs:
yield "stdout_logs", stdout_logs
if stderr_logs:
yield "stderr_logs", stderr_logs
except Exception as e:
yield "error", str(e)
def execute_code(
self,
code: str,
language: ProgrammingLanguage,
setup_commands: list[str],
timeout: int,
api_key: str,
template_id: str,
):
try:
sandbox = None
if template_id:
sandbox = Sandbox(
template=template_id, api_key=api_key, timeout=timeout
)
else:
sandbox = Sandbox(api_key=api_key, timeout=timeout)
if not sandbox:
raise Exception("Sandbox not created")
# Running setup commands
for cmd in setup_commands:
sandbox.commands.run(cmd)
# Executing the code
execution = sandbox.run_code(
code,
language=language.value,
on_error=lambda e: sandbox.kill(), # Kill the sandbox if there is an error
)
if execution.error:
raise Exception(execution.error)
response = execution.text
stdout_logs = "".join(execution.logs.stdout)
stderr_logs = "".join(execution.logs.stderr)
return sandbox.sandbox_id, response, stdout_logs, stderr_logs
except Exception as e:
raise e
class StepExecutionBlock(Block):
class Input(BlockSchema):
credentials: CredentialsMetaInput[
Literal[ProviderName.E2B], Literal["api_key"]
] = CredentialsField(
description="Enter your api key for the E2B Sandbox. You can get it in here - https://e2b.dev/docs",
)
sandbox_id: str = SchemaField(
description="ID of the sandbox instance to execute the code in",
advanced=False,
)
step_code: str = SchemaField(
description="Code to execute in the sandbox",
placeholder="print('Hello, World!')",
default="",
advanced=False,
)
language: ProgrammingLanguage = SchemaField(
description="Programming language to execute",
default=ProgrammingLanguage.PYTHON,
advanced=False,
)
class Output(BlockSchema):
response: str = SchemaField(description="Response from code execution")
stdout_logs: str = SchemaField(
description="Standard output logs from execution"
)
stderr_logs: str = SchemaField(description="Standard error logs from execution")
error: str = SchemaField(description="Error message if execution failed")
def __init__(self):
super().__init__(
id="82b59b8e-ea10-4d57-9161-8b169b0adba6",
description="Execute code in a previously instantiated sandbox environment.",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=StepExecutionBlock.Input,
output_schema=StepExecutionBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"sandbox_id": "sandbox_id",
"step_code": "print('Hello World')",
"language": ProgrammingLanguage.PYTHON.value,
},
test_output=[
("response", "Hello World"),
("stdout_logs", "Hello World\n"),
],
test_mock={
"execute_step_code": lambda sandbox_id, step_code, language, api_key: (
"Hello World",
"Hello World\n",
"",
),
},
)
def execute_step_code(
self,
sandbox_id: str,
code: str,
language: ProgrammingLanguage,
api_key: str,
):
try:
sandbox = Sandbox.connect(sandbox_id=sandbox_id, api_key=api_key)
if not sandbox:
raise Exception("Sandbox not found")
# Executing the code
execution = sandbox.run_code(code, language=language.value)
if execution.error:
raise Exception(execution.error)
response = execution.text
stdout_logs = "".join(execution.logs.stdout)
stderr_logs = "".join(execution.logs.stderr)
return response, stdout_logs, stderr_logs
except Exception as e:
raise e
def run(
self, input_data: Input, *, credentials: APIKeyCredentials, **kwargs
) -> BlockOutput:
try:
response, stdout_logs, stderr_logs = self.execute_step_code(
input_data.sandbox_id,
input_data.step_code,
input_data.language,
credentials.api_key.get_secret_value(),
)
if response:
yield "response", response
if stdout_logs:
yield "stdout_logs", stdout_logs
if stderr_logs:
yield "stderr_logs", stderr_logs
except Exception as e:
yield "error", str(e)

View File

@@ -8,6 +8,7 @@ from backend.data.block import (
BlockSchema,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from backend.integrations.webhooks.compass import CompassWebhookType
@@ -42,7 +43,7 @@ class CompassAITriggerBlock(Block):
input_schema=CompassAITriggerBlock.Input,
output_schema=CompassAITriggerBlock.Output,
webhook_config=BlockManualWebhookConfig(
provider="compass",
provider=ProviderName.COMPASS,
webhook_type=CompassWebhookType.TRANSCRIPTION,
),
test_input=[

View File

@@ -34,7 +34,7 @@ class ReadCsvBlock(Block):
)
skip_columns: list[str] = SchemaField(
description="The columns to skip from the start of the row",
default=[],
default_factory=list,
)
class Output(BlockSchema):

View File

@@ -1,22 +1,53 @@
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from typing import Literal
from pydantic import BaseModel, ConfigDict
from pydantic import BaseModel, ConfigDict, SecretStr
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import BlockSecret, SchemaField, SecretField
from backend.data.model import (
CredentialsField,
CredentialsMetaInput,
SchemaField,
UserPasswordCredentials,
)
from backend.integrations.providers import ProviderName
TEST_CREDENTIALS = UserPasswordCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="smtp",
username=SecretStr("mock-smtp-username"),
password=SecretStr("mock-smtp-password"),
title="Mock SMTP credentials",
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}
SMTPCredentials = UserPasswordCredentials
SMTPCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.SMTP],
Literal["user_password"],
]
class EmailCredentials(BaseModel):
def SMTPCredentialsField() -> SMTPCredentialsInput:
return CredentialsField(
description="The SMTP integration requires a username and password.",
)
class SMTPConfig(BaseModel):
smtp_server: str = SchemaField(
default="smtp.gmail.com", description="SMTP server address"
default="smtp.example.com", description="SMTP server address"
)
smtp_port: int = SchemaField(default=25, description="SMTP port number")
smtp_username: BlockSecret = SecretField(key="smtp_username")
smtp_password: BlockSecret = SecretField(key="smtp_password")
model_config = ConfigDict(title="Email Credentials")
model_config = ConfigDict(title="SMTP Config")
class SendEmailBlock(Block):
@@ -30,10 +61,11 @@ class SendEmailBlock(Block):
body: str = SchemaField(
description="Body of the email", placeholder="Enter the email body"
)
creds: EmailCredentials = SchemaField(
description="SMTP credentials",
default=EmailCredentials(),
config: SMTPConfig = SchemaField(
description="SMTP Config",
default=SMTPConfig(),
)
credentials: SMTPCredentialsInput = SMTPCredentialsField()
class Output(BlockSchema):
status: str = SchemaField(description="Status of the email sending operation")
@@ -43,7 +75,6 @@ class SendEmailBlock(Block):
def __init__(self):
super().__init__(
disabled=True,
id="4335878a-394e-4e67-adf2-919877ff49ae",
description="This block sends an email using the provided SMTP credentials.",
categories={BlockCategory.OUTPUT},
@@ -53,25 +84,29 @@ class SendEmailBlock(Block):
"to_email": "recipient@example.com",
"subject": "Test Email",
"body": "This is a test email.",
"creds": {
"config": {
"smtp_server": "smtp.gmail.com",
"smtp_port": 25,
"smtp_username": "your-email@gmail.com",
"smtp_password": "your-gmail-password",
},
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[("status", "Email sent successfully")],
test_mock={"send_email": lambda *args, **kwargs: "Email sent successfully"},
)
@staticmethod
def send_email(
creds: EmailCredentials, to_email: str, subject: str, body: str
config: SMTPConfig,
to_email: str,
subject: str,
body: str,
credentials: SMTPCredentials,
) -> str:
smtp_server = creds.smtp_server
smtp_port = creds.smtp_port
smtp_username = creds.smtp_username.get_secret_value()
smtp_password = creds.smtp_password.get_secret_value()
smtp_server = config.smtp_server
smtp_port = config.smtp_port
smtp_username = credentials.username.get_secret_value()
smtp_password = credentials.password.get_secret_value()
msg = MIMEMultipart()
msg["From"] = smtp_username
@@ -86,10 +121,13 @@ class SendEmailBlock(Block):
return "Email sent successfully"
def run(self, input_data: Input, **kwargs) -> BlockOutput:
def run(
self, input_data: Input, *, credentials: SMTPCredentials, **kwargs
) -> BlockOutput:
yield "status", self.send_email(
input_data.creds,
input_data.to_email,
input_data.subject,
input_data.body,
config=input_data.config,
to_email=input_data.to_email,
subject=input_data.subject,
body=input_data.body,
credentials=credentials,
)

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List
from pydantic import BaseModel
@@ -13,12 +13,12 @@ from backend.util.request import requests
class ContentRetrievalSettings(BaseModel):
text: Optional[dict] = SchemaField(
text: dict = SchemaField(
description="Text content settings",
default={"maxCharacters": 1000, "includeHtmlTags": False},
advanced=True,
)
highlights: Optional[dict] = SchemaField(
highlights: dict = SchemaField(
description="Highlight settings",
default={
"numSentences": 3,
@@ -27,7 +27,7 @@ class ContentRetrievalSettings(BaseModel):
},
advanced=True,
)
summary: Optional[dict] = SchemaField(
summary: dict = SchemaField(
description="Summary settings",
default={"query": ""},
advanced=True,
@@ -49,8 +49,9 @@ class ExaContentsBlock(Block):
class Output(BlockSchema):
results: list = SchemaField(
description="List of document contents",
default=[],
default_factory=list,
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(

View File

@@ -38,11 +38,11 @@ class ExaSearchBlock(Block):
)
include_domains: List[str] = SchemaField(
description="Domains to include in search",
default=[],
default_factory=list,
)
exclude_domains: List[str] = SchemaField(
description="Domains to exclude from search",
default=[],
default_factory=list,
advanced=True,
)
start_crawl_date: datetime = SchemaField(
@@ -59,12 +59,12 @@ class ExaSearchBlock(Block):
)
include_text: List[str] = SchemaField(
description="Text patterns to include",
default=[],
default_factory=list,
advanced=True,
)
exclude_text: List[str] = SchemaField(
description="Text patterns to exclude",
default=[],
default_factory=list,
advanced=True,
)
contents: ContentSettings = SchemaField(
@@ -76,7 +76,7 @@ class ExaSearchBlock(Block):
class Output(BlockSchema):
results: list = SchemaField(
description="List of search results",
default=[],
default_factory=list,
)
def __init__(self):

View File

@@ -26,12 +26,12 @@ class ExaFindSimilarBlock(Block):
)
include_domains: List[str] = SchemaField(
description="Domains to include in search",
default=[],
default_factory=list,
advanced=True,
)
exclude_domains: List[str] = SchemaField(
description="Domains to exclude from search",
default=[],
default_factory=list,
advanced=True,
)
start_crawl_date: datetime = SchemaField(
@@ -48,12 +48,12 @@ class ExaFindSimilarBlock(Block):
)
include_text: List[str] = SchemaField(
description="Text patterns to include (max 1 string, up to 5 words)",
default=[],
default_factory=list,
advanced=True,
)
exclude_text: List[str] = SchemaField(
description="Text patterns to exclude (max 1 string, up to 5 words)",
default=[],
default_factory=list,
advanced=True,
)
contents: ContentSettings = SchemaField(
@@ -65,7 +65,7 @@ class ExaFindSimilarBlock(Block):
class Output(BlockSchema):
results: List[Any] = SchemaField(
description="List of similar documents with title, URL, published date, author, and score",
default=[],
default_factory=list,
)
def __init__(self):

View File

@@ -42,7 +42,7 @@ class AIVideoGeneratorBlock(Block):
description="Error message if video generation failed."
)
logs: list[str] = SchemaField(
description="Generation progress logs.", optional=True
description="Generation progress logs.",
)
def __init__(self):

View File

@@ -0,0 +1,51 @@
from backend.data.block import (
Block,
BlockCategory,
BlockManualWebhookConfig,
BlockOutput,
BlockSchema,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from backend.integrations.webhooks.generic import GenericWebhookType
class GenericWebhookTriggerBlock(Block):
class Input(BlockSchema):
payload: dict = SchemaField(hidden=True, default_factory=dict)
constants: dict = SchemaField(
description="The constants to be set when the block is put on the graph",
default_factory=dict,
)
class Output(BlockSchema):
payload: dict = SchemaField(
description="The complete webhook payload that was received from the generic webhook."
)
constants: dict = SchemaField(
description="The constants to be set when the block is put on the graph"
)
example_payload = {"message": "Hello, World!"}
def __init__(self):
super().__init__(
id="8fa8c167-2002-47ce-aba8-97572fc5d387",
description="This block will output the contents of the generic input for the webhook.",
categories={BlockCategory.INPUT},
input_schema=GenericWebhookTriggerBlock.Input,
output_schema=GenericWebhookTriggerBlock.Output,
webhook_config=BlockManualWebhookConfig(
provider=ProviderName.GENERIC_WEBHOOK,
webhook_type=GenericWebhookType.PLAIN,
),
test_input={"constants": {"key": "value"}, "payload": self.example_payload},
test_output=[
("constants", {"key": "value"}),
("payload", self.example_payload),
],
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
yield "constants", input_data.constants
yield "payload", input_data.payload

View File

@@ -1,6 +1,9 @@
from urllib.parse import urlparse
from backend.blocks.github._auth import GithubCredentials
from backend.blocks.github._auth import (
GithubCredentials,
GithubFineGrainedAPICredentials,
)
from backend.util.request import Requests
@@ -30,12 +33,68 @@ def _convert_to_api_url(url: str) -> str:
def _get_headers(credentials: GithubCredentials) -> dict[str, str]:
return {
"Authorization": credentials.bearer(),
"Authorization": credentials.auth_header(),
"Accept": "application/vnd.github.v3+json",
}
def get_api(credentials: GithubCredentials, convert_urls: bool = True) -> Requests:
def convert_comment_url_to_api_endpoint(comment_url: str) -> str:
"""
Converts a GitHub comment URL (web interface) to the appropriate API endpoint URL.
Handles:
1. Issue/PR comments: #issuecomment-{id}
2. PR review comments: #discussion_r{id}
Returns the appropriate API endpoint path for the comment.
"""
# First, check if this is already an API URL
parsed_url = urlparse(comment_url)
if parsed_url.hostname == "api.github.com":
return comment_url
# Replace pull with issues for comment endpoints
if "/pull/" in comment_url:
comment_url = comment_url.replace("/pull/", "/issues/")
# Handle issue/PR comments (#issuecomment-xxx)
if "#issuecomment-" in comment_url:
base_url, comment_part = comment_url.split("#issuecomment-")
comment_id = comment_part
# Extract repo information from base URL
parsed_url = urlparse(base_url)
path_parts = parsed_url.path.strip("/").split("/")
owner, repo = path_parts[0], path_parts[1]
# Construct API URL for issue comments
return (
f"https://api.github.com/repos/{owner}/{repo}/issues/comments/{comment_id}"
)
# Handle PR review comments (#discussion_r)
elif "#discussion_r" in comment_url:
base_url, comment_part = comment_url.split("#discussion_r")
comment_id = comment_part
# Extract repo information from base URL
parsed_url = urlparse(base_url)
path_parts = parsed_url.path.strip("/").split("/")
owner, repo = path_parts[0], path_parts[1]
# Construct API URL for PR review comments
return (
f"https://api.github.com/repos/{owner}/{repo}/pulls/comments/{comment_id}"
)
# If no specific comment identifiers are found, use the general URL conversion
return _convert_to_api_url(comment_url)
def get_api(
credentials: GithubCredentials | GithubFineGrainedAPICredentials,
convert_urls: bool = True,
) -> Requests:
return Requests(
trusted_origins=["https://api.github.com", "https://github.com"],
extra_url_validator=_convert_to_api_url if convert_urls else None,

View File

@@ -22,6 +22,11 @@ GithubCredentialsInput = CredentialsMetaInput[
Literal["api_key", "oauth2"] if GITHUB_OAUTH_IS_CONFIGURED else Literal["api_key"],
]
GithubFineGrainedAPICredentials = APIKeyCredentials
GithubFineGrainedAPICredentialsInput = CredentialsMetaInput[
Literal[ProviderName.GITHUB], Literal["api_key"]
]
def GithubCredentialsField(scope: str) -> GithubCredentialsInput:
"""
@@ -37,6 +42,16 @@ def GithubCredentialsField(scope: str) -> GithubCredentialsInput:
)
def GithubFineGrainedAPICredentialsField(
scope: str,
) -> GithubFineGrainedAPICredentialsInput:
return CredentialsField(
required_scopes={scope},
description="The GitHub integration can be used with OAuth, "
"or any API key with sufficient permissions for the blocks it is used on.",
)
TEST_CREDENTIALS = APIKeyCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="github",
@@ -50,3 +65,18 @@ TEST_CREDENTIALS_INPUT = {
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.type,
}
TEST_FINE_GRAINED_CREDENTIALS = APIKeyCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="github",
api_key=SecretStr("mock-github-api-key"),
title="Mock GitHub API key",
expires_at=None,
)
TEST_FINE_GRAINED_CREDENTIALS_INPUT = {
"provider": TEST_FINE_GRAINED_CREDENTIALS.provider,
"id": TEST_FINE_GRAINED_CREDENTIALS.id,
"type": TEST_FINE_GRAINED_CREDENTIALS.type,
"title": TEST_FINE_GRAINED_CREDENTIALS.type,
}

View File

@@ -0,0 +1,360 @@
from enum import Enum
from typing import Optional
from pydantic import BaseModel
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from ._api import get_api
from ._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
GithubCredentials,
GithubCredentialsField,
GithubCredentialsInput,
)
# queued, in_progress, completed, waiting, requested, pending
class ChecksStatus(Enum):
QUEUED = "queued"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
WAITING = "waiting"
REQUESTED = "requested"
PENDING = "pending"
class ChecksConclusion(Enum):
SUCCESS = "success"
FAILURE = "failure"
NEUTRAL = "neutral"
CANCELLED = "cancelled"
TIMED_OUT = "timed_out"
ACTION_REQUIRED = "action_required"
SKIPPED = "skipped"
class GithubCreateCheckRunBlock(Block):
"""Block for creating a new check run on a GitHub repository."""
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo:status")
repo_url: str = SchemaField(
description="URL of the GitHub repository",
placeholder="https://github.com/owner/repo",
)
name: str = SchemaField(
description="The name of the check run (e.g., 'code-coverage')",
)
head_sha: str = SchemaField(
description="The SHA of the commit to check",
)
status: ChecksStatus = SchemaField(
description="Current status of the check run",
default=ChecksStatus.QUEUED,
)
conclusion: Optional[ChecksConclusion] = SchemaField(
description="The final conclusion of the check (required if status is completed)",
default=None,
)
details_url: str = SchemaField(
description="The URL for the full details of the check",
default="",
)
output_title: str = SchemaField(
description="Title of the check run output",
default="",
)
output_summary: str = SchemaField(
description="Summary of the check run output",
default="",
)
output_text: str = SchemaField(
description="Detailed text of the check run output",
default="",
)
class Output(BlockSchema):
class CheckRunResult(BaseModel):
id: int
html_url: str
status: str
check_run: CheckRunResult = SchemaField(
description="Details of the created check run"
)
error: str = SchemaField(
description="Error message if check run creation failed"
)
def __init__(self):
super().__init__(
id="2f45e89a-3b7d-4f22-b89e-6c4f5c7e1234",
description="Creates a new check run for a specific commit in a GitHub repository",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=GithubCreateCheckRunBlock.Input,
output_schema=GithubCreateCheckRunBlock.Output,
test_input={
"repo_url": "https://github.com/owner/repo",
"name": "test-check",
"head_sha": "ce587453ced02b1526dfb4cb910479d431683101",
"status": ChecksStatus.COMPLETED.value,
"conclusion": ChecksConclusion.SUCCESS.value,
"output_title": "Test Results",
"output_summary": "All tests passed",
"credentials": TEST_CREDENTIALS_INPUT,
},
# requires a github app not available to oauth in our current system
disabled=True,
test_credentials=TEST_CREDENTIALS,
test_output=[
(
"check_run",
{
"id": 4,
"html_url": "https://github.com/owner/repo/runs/4",
"status": "completed",
},
),
],
test_mock={
"create_check_run": lambda *args, **kwargs: {
"id": 4,
"html_url": "https://github.com/owner/repo/runs/4",
"status": "completed",
}
},
)
@staticmethod
def create_check_run(
credentials: GithubCredentials,
repo_url: str,
name: str,
head_sha: str,
status: ChecksStatus,
conclusion: Optional[ChecksConclusion] = None,
details_url: Optional[str] = None,
output_title: Optional[str] = None,
output_summary: Optional[str] = None,
output_text: Optional[str] = None,
) -> dict:
api = get_api(credentials)
class CheckRunData(BaseModel):
name: str
head_sha: str
status: str
conclusion: Optional[str] = None
details_url: Optional[str] = None
output: Optional[dict[str, str]] = None
data = CheckRunData(
name=name,
head_sha=head_sha,
status=status.value,
)
if conclusion:
data.conclusion = conclusion.value
if details_url:
data.details_url = details_url
if output_title or output_summary or output_text:
output_data = {
"title": output_title or "",
"summary": output_summary or "",
"text": output_text or "",
}
data.output = output_data
check_runs_url = f"{repo_url}/check-runs"
response = api.post(
check_runs_url, data=data.model_dump_json(exclude_none=True)
)
result = response.json()
return {
"id": result["id"],
"html_url": result["html_url"],
"status": result["status"],
}
def run(
self,
input_data: Input,
*,
credentials: GithubCredentials,
**kwargs,
) -> BlockOutput:
try:
result = self.create_check_run(
credentials=credentials,
repo_url=input_data.repo_url,
name=input_data.name,
head_sha=input_data.head_sha,
status=input_data.status,
conclusion=input_data.conclusion,
details_url=input_data.details_url,
output_title=input_data.output_title,
output_summary=input_data.output_summary,
output_text=input_data.output_text,
)
yield "check_run", result
except Exception as e:
yield "error", str(e)
class GithubUpdateCheckRunBlock(Block):
"""Block for updating an existing check run on a GitHub repository."""
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo:status")
repo_url: str = SchemaField(
description="URL of the GitHub repository",
placeholder="https://github.com/owner/repo",
)
check_run_id: int = SchemaField(
description="The ID of the check run to update",
)
status: ChecksStatus = SchemaField(
description="New status of the check run",
)
conclusion: ChecksConclusion = SchemaField(
description="The final conclusion of the check (required if status is completed)",
)
output_title: Optional[str] = SchemaField(
description="New title of the check run output",
default=None,
)
output_summary: Optional[str] = SchemaField(
description="New summary of the check run output",
default=None,
)
output_text: Optional[str] = SchemaField(
description="New detailed text of the check run output",
default=None,
)
class Output(BlockSchema):
class CheckRunResult(BaseModel):
id: int
html_url: str
status: str
conclusion: Optional[str]
check_run: CheckRunResult = SchemaField(
description="Details of the updated check run"
)
error: str = SchemaField(description="Error message if check run update failed")
def __init__(self):
super().__init__(
id="8a23c567-9d01-4e56-b789-0c12d3e45678", # Generated UUID
description="Updates an existing check run in a GitHub repository",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=GithubUpdateCheckRunBlock.Input,
output_schema=GithubUpdateCheckRunBlock.Output,
# requires a github app not available to oauth in our current system
disabled=True,
test_input={
"repo_url": "https://github.com/owner/repo",
"check_run_id": 4,
"status": ChecksStatus.COMPLETED.value,
"conclusion": ChecksConclusion.SUCCESS.value,
"output_title": "Updated Results",
"output_summary": "All tests passed after retry",
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
(
"check_run",
{
"id": 4,
"html_url": "https://github.com/owner/repo/runs/4",
"status": "completed",
"conclusion": "success",
},
),
],
test_mock={
"update_check_run": lambda *args, **kwargs: {
"id": 4,
"html_url": "https://github.com/owner/repo/runs/4",
"status": "completed",
"conclusion": "success",
}
},
)
@staticmethod
def update_check_run(
credentials: GithubCredentials,
repo_url: str,
check_run_id: int,
status: ChecksStatus,
conclusion: Optional[ChecksConclusion] = None,
output_title: Optional[str] = None,
output_summary: Optional[str] = None,
output_text: Optional[str] = None,
) -> dict:
api = get_api(credentials)
class UpdateCheckRunData(BaseModel):
status: str
conclusion: Optional[str] = None
output: Optional[dict[str, str]] = None
data = UpdateCheckRunData(
status=status.value,
)
if conclusion:
data.conclusion = conclusion.value
if output_title or output_summary or output_text:
output_data = {
"title": output_title or "",
"summary": output_summary or "",
"text": output_text or "",
}
data.output = output_data
check_run_url = f"{repo_url}/check-runs/{check_run_id}"
response = api.patch(
check_run_url, data=data.model_dump_json(exclude_none=True)
)
result = response.json()
return {
"id": result["id"],
"html_url": result["html_url"],
"status": result["status"],
"conclusion": result.get("conclusion"),
}
def run(
self,
input_data: Input,
*,
credentials: GithubCredentials,
**kwargs,
) -> BlockOutput:
try:
result = self.update_check_run(
credentials=credentials,
repo_url=input_data.repo_url,
check_run_id=input_data.check_run_id,
status=input_data.status,
conclusion=input_data.conclusion,
output_title=input_data.output_title,
output_summary=input_data.output_summary,
output_text=input_data.output_text,
)
yield "check_run", result
except Exception as e:
yield "error", str(e)

View File

@@ -1,3 +1,4 @@
import logging
from urllib.parse import urlparse
from typing_extensions import TypedDict
@@ -5,7 +6,7 @@ from typing_extensions import TypedDict
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from ._api import get_api
from ._api import convert_comment_url_to_api_endpoint, get_api
from ._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
@@ -14,6 +15,8 @@ from ._auth import (
GithubCredentialsInput,
)
logger = logging.getLogger(__name__)
def is_github_url(url: str) -> bool:
return urlparse(url).netloc == "github.com"
@@ -108,6 +111,228 @@ class GithubCommentBlock(Block):
# --8<-- [end:GithubCommentBlockExample]
class GithubUpdateCommentBlock(Block):
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo")
comment_url: str = SchemaField(
description="URL of the GitHub comment",
placeholder="https://github.com/owner/repo/issues/1#issuecomment-123456789",
default="",
advanced=False,
)
issue_url: str = SchemaField(
description="URL of the GitHub issue or pull request",
placeholder="https://github.com/owner/repo/issues/1",
default="",
)
comment_id: str = SchemaField(
description="ID of the GitHub comment",
placeholder="123456789",
default="",
)
comment: str = SchemaField(
description="Comment to update",
placeholder="Enter your comment",
)
class Output(BlockSchema):
id: int = SchemaField(description="ID of the updated comment")
url: str = SchemaField(description="URL to the comment on GitHub")
error: str = SchemaField(
description="Error message if the comment update failed"
)
def __init__(self):
super().__init__(
id="b3f4d747-10e3-4e69-8c51-f2be1d99c9a7",
description="This block updates a comment on a specified GitHub issue or pull request.",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=GithubUpdateCommentBlock.Input,
output_schema=GithubUpdateCommentBlock.Output,
test_input={
"comment_url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
"comment": "This is an updated comment.",
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("id", 123456789),
(
"url",
"https://github.com/owner/repo/issues/1#issuecomment-123456789",
),
],
test_mock={
"update_comment": lambda *args, **kwargs: (
123456789,
"https://github.com/owner/repo/issues/1#issuecomment-123456789",
)
},
)
@staticmethod
def update_comment(
credentials: GithubCredentials, comment_url: str, body_text: str
) -> tuple[int, str]:
api = get_api(credentials, convert_urls=False)
data = {"body": body_text}
url = convert_comment_url_to_api_endpoint(comment_url)
logger.info(url)
response = api.patch(url, json=data)
comment = response.json()
return comment["id"], comment["html_url"]
def run(
self,
input_data: Input,
*,
credentials: GithubCredentials,
**kwargs,
) -> BlockOutput:
if (
not input_data.comment_url
and input_data.comment_id
and input_data.issue_url
):
parsed_url = urlparse(input_data.issue_url)
path_parts = parsed_url.path.strip("/").split("/")
owner, repo = path_parts[0], path_parts[1]
input_data.comment_url = f"https://api.github.com/repos/{owner}/{repo}/issues/comments/{input_data.comment_id}"
elif (
not input_data.comment_url
and not input_data.comment_id
and input_data.issue_url
):
raise ValueError(
"Must provide either comment_url or comment_id and issue_url"
)
id, url = self.update_comment(
credentials,
input_data.comment_url,
input_data.comment,
)
yield "id", id
yield "url", url
class GithubListCommentsBlock(Block):
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo")
issue_url: str = SchemaField(
description="URL of the GitHub issue or pull request",
placeholder="https://github.com/owner/repo/issues/1",
)
class Output(BlockSchema):
class CommentItem(TypedDict):
id: int
body: str
user: str
url: str
comment: CommentItem = SchemaField(
title="Comment", description="Comments with their ID, body, user, and URL"
)
comments: list[CommentItem] = SchemaField(
description="List of comments with their ID, body, user, and URL"
)
error: str = SchemaField(description="Error message if listing comments failed")
def __init__(self):
super().__init__(
id="c4b5fb63-0005-4a11-b35a-0c2467bd6b59",
description="This block lists all comments for a specified GitHub issue or pull request.",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=GithubListCommentsBlock.Input,
output_schema=GithubListCommentsBlock.Output,
test_input={
"issue_url": "https://github.com/owner/repo/issues/1",
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
(
"comment",
{
"id": 123456789,
"body": "This is a test comment.",
"user": "test_user",
"url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
},
),
(
"comments",
[
{
"id": 123456789,
"body": "This is a test comment.",
"user": "test_user",
"url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
}
],
),
],
test_mock={
"list_comments": lambda *args, **kwargs: [
{
"id": 123456789,
"body": "This is a test comment.",
"user": "test_user",
"url": "https://github.com/owner/repo/issues/1#issuecomment-123456789",
}
]
},
)
@staticmethod
def list_comments(
credentials: GithubCredentials, issue_url: str
) -> list[Output.CommentItem]:
parsed_url = urlparse(issue_url)
path_parts = parsed_url.path.strip("/").split("/")
owner = path_parts[0]
repo = path_parts[1]
# GitHub API uses 'issues' for both issues and pull requests when it comes to comments
issue_number = path_parts[3] # Whether 'issues/123' or 'pull/123'
# Construct the proper API URL directly
api_url = f"https://api.github.com/repos/{owner}/{repo}/issues/{issue_number}/comments"
# Set convert_urls=False since we're already providing an API URL
api = get_api(credentials, convert_urls=False)
response = api.get(api_url)
comments = response.json()
parsed_comments: list[GithubListCommentsBlock.Output.CommentItem] = [
{
"id": comment["id"],
"body": comment["body"],
"user": comment["user"]["login"],
"url": comment["html_url"],
}
for comment in comments
]
return parsed_comments
def run(
self,
input_data: Input,
*,
credentials: GithubCredentials,
**kwargs,
) -> BlockOutput:
comments = self.list_comments(
credentials,
input_data.issue_url,
)
yield from (("comment", comment) for comment in comments)
yield "comments", comments
class GithubMakeIssueBlock(Block):
class Input(BlockSchema):
credentials: GithubCredentialsInput = GithubCredentialsField("repo")

View File

@@ -200,6 +200,7 @@ class GithubReadPullRequestBlock(Block):
include_pr_changes: bool = SchemaField(
description="Whether to include the changes made in the pull request",
default=False,
advanced=False,
)
class Output(BlockSchema):

View File

@@ -0,0 +1,180 @@
from enum import Enum
from typing import Optional
from pydantic import BaseModel
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from ._api import get_api
from ._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
GithubFineGrainedAPICredentials,
GithubFineGrainedAPICredentialsField,
GithubFineGrainedAPICredentialsInput,
)
class StatusState(Enum):
ERROR = "error"
FAILURE = "failure"
PENDING = "pending"
SUCCESS = "success"
class GithubCreateStatusBlock(Block):
"""Block for creating a commit status on a GitHub repository."""
class Input(BlockSchema):
credentials: GithubFineGrainedAPICredentialsInput = (
GithubFineGrainedAPICredentialsField("repo:status")
)
repo_url: str = SchemaField(
description="URL of the GitHub repository",
placeholder="https://github.com/owner/repo",
)
sha: str = SchemaField(
description="The SHA of the commit to set status for",
)
state: StatusState = SchemaField(
description="The state of the status (error, failure, pending, success)",
)
target_url: Optional[str] = SchemaField(
description="URL with additional details about this status",
default=None,
)
description: Optional[str] = SchemaField(
description="Short description of the status",
default=None,
)
check_name: Optional[str] = SchemaField(
description="Label to differentiate this status from others",
default="AutoGPT Platform Checks",
advanced=False,
)
class Output(BlockSchema):
class StatusResult(BaseModel):
id: int
url: str
state: str
context: str
description: Optional[str]
target_url: Optional[str]
created_at: str
updated_at: str
status: StatusResult = SchemaField(description="Details of the created status")
error: str = SchemaField(description="Error message if status creation failed")
def __init__(self):
super().__init__(
id="3d67f123-a4b5-4c89-9d01-2e34f5c67890", # Generated UUID
description="Creates a new commit status in a GitHub repository",
categories={BlockCategory.DEVELOPER_TOOLS},
input_schema=GithubCreateStatusBlock.Input,
output_schema=GithubCreateStatusBlock.Output,
test_input={
"repo_url": "https://github.com/owner/repo",
"sha": "ce587453ced02b1526dfb4cb910479d431683101",
"state": StatusState.SUCCESS.value,
"target_url": "https://example.com/build/status",
"description": "The build succeeded!",
"check_name": "continuous-integration/jenkins",
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
(
"status",
{
"id": 1234567890,
"url": "https://api.github.com/repos/owner/repo/statuses/ce587453ced02b1526dfb4cb910479d431683101",
"state": "success",
"context": "continuous-integration/jenkins",
"description": "The build succeeded!",
"target_url": "https://example.com/build/status",
"created_at": "2024-01-21T10:00:00Z",
"updated_at": "2024-01-21T10:00:00Z",
},
),
],
test_mock={
"create_status": lambda *args, **kwargs: {
"id": 1234567890,
"url": "https://api.github.com/repos/owner/repo/statuses/ce587453ced02b1526dfb4cb910479d431683101",
"state": "success",
"context": "continuous-integration/jenkins",
"description": "The build succeeded!",
"target_url": "https://example.com/build/status",
"created_at": "2024-01-21T10:00:00Z",
"updated_at": "2024-01-21T10:00:00Z",
}
},
)
@staticmethod
def create_status(
credentials: GithubFineGrainedAPICredentials,
repo_url: str,
sha: str,
state: StatusState,
target_url: Optional[str] = None,
description: Optional[str] = None,
context: str = "default",
) -> dict:
api = get_api(credentials)
class StatusData(BaseModel):
state: str
target_url: Optional[str] = None
description: Optional[str] = None
context: str
data = StatusData(
state=state.value,
context=context,
)
if target_url:
data.target_url = target_url
if description:
data.description = description
status_url = f"{repo_url}/statuses/{sha}"
response = api.post(status_url, data=data.model_dump_json(exclude_none=True))
result = response.json()
return {
"id": result["id"],
"url": result["url"],
"state": result["state"],
"context": result["context"],
"description": result.get("description"),
"target_url": result.get("target_url"),
"created_at": result["created_at"],
"updated_at": result["updated_at"],
}
def run(
self,
input_data: Input,
*,
credentials: GithubFineGrainedAPICredentials,
**kwargs,
) -> BlockOutput:
try:
result = self.create_status(
credentials=credentials,
repo_url=input_data.repo_url,
sha=input_data.sha,
state=input_data.state,
target_url=input_data.target_url,
description=input_data.description,
context=input_data.check_name or "AutoGPT Platform Checks",
)
yield "status", result
except Exception as e:
yield "error", str(e)

View File

@@ -12,6 +12,7 @@ from backend.data.block import (
BlockWebhookConfig,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from ._auth import (
TEST_CREDENTIALS,
@@ -36,7 +37,7 @@ class GitHubTriggerBase:
placeholder="{owner}/{repo}",
)
# --8<-- [start:example-payload-field]
payload: dict = SchemaField(hidden=True, default={})
payload: dict = SchemaField(hidden=True, default_factory=dict)
# --8<-- [end:example-payload-field]
class Output(BlockSchema):
@@ -123,7 +124,7 @@ class GithubPullRequestTriggerBlock(GitHubTriggerBase, Block):
output_schema=GithubPullRequestTriggerBlock.Output,
# --8<-- [start:example-webhook_config]
webhook_config=BlockWebhookConfig(
provider="github",
provider=ProviderName.GITHUB,
webhook_type=GithubWebhookType.REPO,
resource_format="{repo}",
event_filter_input="events",

View File

@@ -8,6 +8,7 @@ from pydantic import BaseModel
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.settings import Settings
from ._auth import (
GOOGLE_OAUTH_IS_CONFIGURED,
@@ -150,8 +151,8 @@ class GmailReadBlock(Block):
else None
),
token_uri="https://oauth2.googleapis.com/token",
client_id=kwargs.get("client_id"),
client_secret=kwargs.get("client_secret"),
client_id=Settings().secrets.google_client_id,
client_secret=Settings().secrets.google_client_secret,
scopes=credentials.scopes,
)
return build("gmail", "v1", credentials=creds)

View File

@@ -3,6 +3,7 @@ from googleapiclient.discovery import build
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.settings import Settings
from ._auth import (
GOOGLE_OAUTH_IS_CONFIGURED,
@@ -86,8 +87,8 @@ class GoogleSheetsReadBlock(Block):
else None
),
token_uri="https://oauth2.googleapis.com/token",
client_id=kwargs.get("client_id"),
client_secret=kwargs.get("client_secret"),
client_id=Settings().secrets.google_client_id,
client_secret=Settings().secrets.google_client_secret,
scopes=credentials.scopes,
)
return build("sheets", "v4", credentials=creds)

View File

@@ -1,11 +1,16 @@
import json
import logging
from enum import Enum
from typing import Any
from requests.exceptions import HTTPError, RequestException
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.request import requests
logger = logging.getLogger(name=__name__)
class HttpMethod(Enum):
GET = "GET"
@@ -29,7 +34,7 @@ class SendWebRequestBlock(Block):
)
headers: dict[str, str] = SchemaField(
description="The headers to include in the request",
default={},
default_factory=dict,
)
json_format: bool = SchemaField(
title="JSON format",
@@ -43,8 +48,9 @@ class SendWebRequestBlock(Block):
class Output(BlockSchema):
response: object = SchemaField(description="The response from the server")
client_error: object = SchemaField(description="The error on 4xx status codes")
server_error: object = SchemaField(description="The error on 5xx status codes")
client_error: object = SchemaField(description="Errors on 4xx status codes")
server_error: object = SchemaField(description="Errors on 5xx status codes")
error: str = SchemaField(description="Errors for all other exceptions")
def __init__(self):
super().__init__(
@@ -68,20 +74,40 @@ class SendWebRequestBlock(Block):
# we should send it as plain text instead
input_data.json_format = False
response = requests.request(
input_data.method.value,
input_data.url,
headers=input_data.headers,
json=body if input_data.json_format else None,
data=body if not input_data.json_format else None,
)
result = response.json() if input_data.json_format else response.text
if response.status_code // 100 == 2:
try:
response = requests.request(
input_data.method.value,
input_data.url,
headers=input_data.headers,
json=body if input_data.json_format else None,
data=body if not input_data.json_format else None,
)
result = response.json() if input_data.json_format else response.text
yield "response", result
elif response.status_code // 100 == 4:
yield "client_error", result
elif response.status_code // 100 == 5:
yield "server_error", result
else:
raise ValueError(f"Unexpected status code: {response.status_code}")
except HTTPError as e:
# Handle error responses
try:
result = e.response.json() if input_data.json_format else str(e)
except json.JSONDecodeError:
result = str(e)
if 400 <= e.response.status_code < 500:
yield "client_error", result
elif 500 <= e.response.status_code < 600:
yield "server_error", result
else:
error_msg = (
"Unexpected status code "
f"{e.response.status_code} '{e.response.reason}'"
)
logger.warning(error_msg)
yield "error", error_msg
except RequestException as e:
# Handle other request-related exceptions
yield "error", str(e)
except Exception as e:
# Catch any other unexpected exceptions
yield "error", str(e)

View File

@@ -15,7 +15,8 @@ class HubSpotCompanyBlock(Block):
description="Operation to perform (create, update, get)", default="get"
)
company_data: dict = SchemaField(
description="Company data for create/update operations", default={}
description="Company data for create/update operations",
default_factory=dict,
)
domain: str = SchemaField(
description="Company domain for get/update operations", default=""

View File

@@ -15,7 +15,8 @@ class HubSpotContactBlock(Block):
description="Operation to perform (create, update, get)", default="get"
)
contact_data: dict = SchemaField(
description="Contact data for create/update operations", default={}
description="Contact data for create/update operations",
default_factory=dict,
)
email: str = SchemaField(
description="Email address for get/update operations", default=""

View File

@@ -19,7 +19,7 @@ class HubSpotEngagementBlock(Block):
)
email_data: dict = SchemaField(
description="Email data including recipient, subject, content",
default={},
default_factory=dict,
)
contact_id: str = SchemaField(
description="Contact ID for engagement tracking", default=""
@@ -27,7 +27,6 @@ class HubSpotEngagementBlock(Block):
timeframe_days: int = SchemaField(
description="Number of days to look back for engagement",
default=30,
optional=True,
)
class Output(BlockSchema):

View File

@@ -142,6 +142,16 @@ class IdeogramModelBlock(Block):
title="Color Palette Preset",
advanced=True,
)
custom_color_palette: Optional[list[str]] = SchemaField(
description=(
"Only available for model version V_2 or V_2_TURBO. Provide one or more color hex codes "
"(e.g., ['#000030', '#1C0C47', '#9900FF', '#4285F4', '#FFFFFF']) to define a custom color "
"palette. Only used if 'color_palette_name' is 'NONE'."
),
default=None,
title="Custom Color Palette",
advanced=True,
)
class Output(BlockSchema):
result: str = SchemaField(description="Generated image URL")
@@ -151,7 +161,7 @@ class IdeogramModelBlock(Block):
super().__init__(
id="6ab085e2-20b3-4055-bc3e-08036e01eca6",
description="This block runs Ideogram models with both simple and advanced settings.",
categories={BlockCategory.AI},
categories={BlockCategory.AI, BlockCategory.MULTIMEDIA},
input_schema=IdeogramModelBlock.Input,
output_schema=IdeogramModelBlock.Output,
test_input={
@@ -164,6 +174,13 @@ class IdeogramModelBlock(Block):
"style_type": StyleType.AUTO,
"negative_prompt": None,
"color_palette_name": ColorPalettePreset.NONE,
"custom_color_palette": [
"#000030",
"#1C0C47",
"#9900FF",
"#4285F4",
"#FFFFFF",
],
"credentials": TEST_CREDENTIALS_INPUT,
},
test_output=[
@@ -173,7 +190,7 @@ class IdeogramModelBlock(Block):
),
],
test_mock={
"run_model": lambda api_key, model_name, prompt, seed, aspect_ratio, magic_prompt_option, style_type, negative_prompt, color_palette_name: "https://ideogram.ai/api/images/test-generated-image-url.png",
"run_model": lambda api_key, model_name, prompt, seed, aspect_ratio, magic_prompt_option, style_type, negative_prompt, color_palette_name, custom_colors: "https://ideogram.ai/api/images/test-generated-image-url.png",
"upscale_image": lambda api_key, image_url: "https://ideogram.ai/api/images/test-upscaled-image-url.png",
},
test_credentials=TEST_CREDENTIALS,
@@ -195,6 +212,7 @@ class IdeogramModelBlock(Block):
style_type=input_data.style_type.value,
negative_prompt=input_data.negative_prompt,
color_palette_name=input_data.color_palette_name.value,
custom_colors=input_data.custom_color_palette,
)
# Step 2: Upscale the image if requested
@@ -217,6 +235,7 @@ class IdeogramModelBlock(Block):
style_type: str,
negative_prompt: Optional[str],
color_palette_name: str,
custom_colors: Optional[list[str]],
):
url = "https://api.ideogram.ai/generate"
headers = {
@@ -241,7 +260,11 @@ class IdeogramModelBlock(Block):
data["image_request"]["negative_prompt"] = negative_prompt
if color_palette_name != "NONE":
data["image_request"]["color_palette"] = {"name": color_palette_name}
data["color_palette"] = {"name": color_palette_name}
elif custom_colors:
data["color_palette"] = {
"members": [{"color_hex": color} for color in custom_colors]
}
try:
response = requests.post(url, json=data, headers=headers)
@@ -267,9 +290,7 @@ class IdeogramModelBlock(Block):
response = requests.post(
url,
headers=headers,
data={
"image_request": "{}", # Empty JSON object
},
data={"image_request": "{}"},
files=files,
)

View File

@@ -0,0 +1,556 @@
import copy
from datetime import date, time
from typing import Any, Optional
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema, BlockType
from backend.data.model import SchemaField
from backend.util.file import store_media_file
from backend.util.mock import MockObject
from backend.util.settings import Config
from backend.util.text import TextFormatter
from backend.util.type import LongTextType, MediaFileType, ShortTextType
formatter = TextFormatter()
config = Config()
class AgentInputBlock(Block):
"""
This block is used to provide input to the graph.
It takes in a value, name, description, default values list and bool to limit selection to default values.
It Outputs the value passed as input.
"""
class Input(BlockSchema):
name: str = SchemaField(description="The name of the input.")
value: Any = SchemaField(
description="The value to be passed as input.",
default=None,
)
title: str | None = SchemaField(
description="The title of the input.", default=None, advanced=True
)
description: str | None = SchemaField(
description="The description of the input.",
default=None,
advanced=True,
)
placeholder_values: list = SchemaField(
description="The placeholder values to be passed as input.",
default_factory=list,
advanced=True,
hidden=True,
)
advanced: bool = SchemaField(
description="Whether to show the input in the advanced section, if the field is not required.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the input should be treated as a secret.",
default=False,
advanced=True,
)
def generate_schema(self):
schema = copy.deepcopy(self.get_field_schema("value"))
if possible_values := self.placeholder_values:
schema["enum"] = possible_values
return schema
class Output(BlockSchema):
result: Any = SchemaField(description="The value passed as input.")
def __init__(self, **kwargs):
super().__init__(
**{
"id": "c0a8e994-ebf1-4a9c-a4d8-89d09c86741b",
"description": "Base block for user inputs.",
"input_schema": AgentInputBlock.Input,
"output_schema": AgentInputBlock.Output,
"test_input": [
{
"value": "Hello, World!",
"name": "input_1",
"description": "Example test input.",
"placeholder_values": [],
},
{
"value": "Hello, World!",
"name": "input_2",
"description": "Example test input with placeholders.",
"placeholder_values": ["Hello, World!"],
},
],
"test_output": [
("result", "Hello, World!"),
("result", "Hello, World!"),
],
"categories": {BlockCategory.INPUT, BlockCategory.BASIC},
"block_type": BlockType.INPUT,
"static_output": True,
**kwargs,
}
)
def run(self, input_data: Input, *args, **kwargs) -> BlockOutput:
if input_data.value is not None:
yield "result", input_data.value
class AgentOutputBlock(Block):
"""
Records the output of the graph for users to see.
Behavior:
If `format` is provided and the `value` is of a type that can be formatted,
the block attempts to format the recorded_value using the `format`.
If formatting fails or no `format` is provided, the raw `value` is output.
"""
class Input(BlockSchema):
value: Any = SchemaField(
description="The value to be recorded as output.",
default=None,
advanced=False,
)
name: str = SchemaField(description="The name of the output.")
title: str | None = SchemaField(
description="The title of the output.",
default=None,
advanced=True,
)
description: str | None = SchemaField(
description="The description of the output.",
default=None,
advanced=True,
)
format: str = SchemaField(
description="The format string to be used to format the recorded_value. Use Jinja2 syntax.",
default="",
advanced=True,
)
advanced: bool = SchemaField(
description="Whether to treat the output as advanced.",
default=False,
advanced=True,
)
secret: bool = SchemaField(
description="Whether the output should be treated as a secret.",
default=False,
advanced=True,
)
def generate_schema(self):
return self.get_field_schema("value")
class Output(BlockSchema):
output: Any = SchemaField(description="The value recorded as output.")
name: Any = SchemaField(description="The name of the value recorded as output.")
def __init__(self):
super().__init__(
id="363ae599-353e-4804-937e-b2ee3cef3da4",
description="Stores the output of the graph for users to see.",
input_schema=AgentOutputBlock.Input,
output_schema=AgentOutputBlock.Output,
test_input=[
{
"value": "Hello, World!",
"name": "output_1",
"description": "This is a test output.",
"format": "{{ output_1 }}!!",
},
{
"value": "42",
"name": "output_2",
"description": "This is another test output.",
"format": "{{ output_2 }}",
},
{
"value": MockObject(value="!!", key="key"),
"name": "output_3",
"description": "This is a test output with a mock object.",
"format": "{{ output_3 }}",
},
],
test_output=[
("output", "Hello, World!!!"),
("output", "42"),
("output", MockObject(value="!!", key="key")),
],
categories={BlockCategory.OUTPUT, BlockCategory.BASIC},
block_type=BlockType.OUTPUT,
static_output=True,
)
def run(self, input_data: Input, *args, **kwargs) -> BlockOutput:
"""
Attempts to format the recorded_value using the fmt_string if provided.
If formatting fails or no fmt_string is given, returns the original recorded_value.
"""
if input_data.format:
try:
yield "output", formatter.format_string(
input_data.format, {input_data.name: input_data.value}
)
except Exception as e:
yield "output", f"Error: {e}, {input_data.value}"
else:
yield "output", input_data.value
yield "name", input_data.name
class AgentShortTextInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[ShortTextType] = SchemaField(
description="Short text input.",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="Short text result.")
def __init__(self):
super().__init__(
id="7fcd3bcb-8e1b-4e69-903d-32d3d4a92158",
description="Block for short text input (single-line).",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentShortTextInputBlock.Input,
output_schema=AgentShortTextInputBlock.Output,
test_input=[
{
"value": "Hello",
"name": "short_text_1",
"description": "Short text example 1",
"placeholder_values": [],
},
{
"value": "Quick test",
"name": "short_text_2",
"description": "Short text example 2",
"placeholder_values": ["Quick test", "Another option"],
},
],
test_output=[
("result", "Hello"),
("result", "Quick test"),
],
)
class AgentLongTextInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[LongTextType] = SchemaField(
description="Long text input (potentially multi-line).",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="Long text result.")
def __init__(self):
super().__init__(
id="90a56ffb-7024-4b2b-ab50-e26c5e5ab8ba",
description="Block for long text input (multi-line).",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentLongTextInputBlock.Input,
output_schema=AgentLongTextInputBlock.Output,
test_input=[
{
"value": "Lorem ipsum dolor sit amet...",
"name": "long_text_1",
"description": "Long text example 1",
"placeholder_values": [],
},
{
"value": "Another multiline text input.",
"name": "long_text_2",
"description": "Long text example 2",
"placeholder_values": ["Another multiline text input."],
},
],
test_output=[
("result", "Lorem ipsum dolor sit amet..."),
("result", "Another multiline text input."),
],
)
class AgentNumberInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[int] = SchemaField(
description="Number input.",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: int = SchemaField(description="Number result.")
def __init__(self):
super().__init__(
id="96dae2bb-97a2-41c2-bd2f-13a3b5a8ea98",
description="Block for number input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentNumberInputBlock.Input,
output_schema=AgentNumberInputBlock.Output,
test_input=[
{
"value": 42,
"name": "number_input_1",
"description": "Number example 1",
"placeholder_values": [],
},
{
"value": 314,
"name": "number_input_2",
"description": "Number example 2",
"placeholder_values": [314, 2718],
},
],
test_output=[
("result", 42),
("result", 314),
],
)
class AgentDateInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[date] = SchemaField(
description="Date input (YYYY-MM-DD).",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: date = SchemaField(description="Date result.")
def __init__(self):
super().__init__(
id="7e198b09-4994-47db-8b4d-952d98241817",
description="Block for date input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentDateInputBlock.Input,
output_schema=AgentDateInputBlock.Output,
test_input=[
{
# If your system can parse JSON date strings to date objects
"value": str(date(2025, 3, 19)),
"name": "date_input_1",
"description": "Example date input 1",
},
{
"value": str(date(2023, 12, 31)),
"name": "date_input_2",
"description": "Example date input 2",
},
],
test_output=[
("result", date(2025, 3, 19)),
("result", date(2023, 12, 31)),
],
)
class AgentTimeInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: Optional[time] = SchemaField(
description="Time input (HH:MM:SS).",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: time = SchemaField(description="Time result.")
def __init__(self):
super().__init__(
id="2a1c757e-86cf-4c7e-aacf-060dc382e434",
description="Block for time input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentTimeInputBlock.Input,
output_schema=AgentTimeInputBlock.Output,
test_input=[
{
"value": str(time(9, 30, 0)),
"name": "time_input_1",
"description": "Time example 1",
},
{
"value": str(time(23, 59, 59)),
"name": "time_input_2",
"description": "Time example 2",
},
],
test_output=[
("result", time(9, 30, 0)),
("result", time(23, 59, 59)),
],
)
class AgentFileInputBlock(AgentInputBlock):
"""
A simplified file-upload block. In real usage, you might have a custom
file type or handle binary data. Here, we'll store a string path as the example.
"""
class Input(AgentInputBlock.Input):
value: Optional[MediaFileType] = SchemaField(
description="Path or reference to an uploaded file.",
default=None,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="File reference/path result.")
def __init__(self):
super().__init__(
id="95ead23f-8283-4654-aef3-10c053b74a31",
description="Block for file upload input (string path for example).",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentFileInputBlock.Input,
output_schema=AgentFileInputBlock.Output,
test_input=[
{
"value": "data:image/png;base64,MQ==",
"name": "file_upload_1",
"description": "Example file upload 1",
},
],
test_output=[
("result", str),
],
)
def run(
self,
input_data: Input,
*,
graph_exec_id: str,
**kwargs,
) -> BlockOutput:
if not input_data.value:
return
file_path = store_media_file(
graph_exec_id=graph_exec_id,
file=input_data.value,
return_content=False,
)
yield "result", file_path
class AgentDropdownInputBlock(AgentInputBlock):
"""
A specialized text input block that relies on placeholder_values to present a dropdown.
"""
class Input(AgentInputBlock.Input):
value: Optional[str] = SchemaField(
description="Text selected from a dropdown.",
default=None,
advanced=False,
title="Default Value",
)
placeholder_values: list = SchemaField(
description="Possible values for the dropdown.",
default_factory=list,
advanced=False,
title="Dropdown Options",
)
class Output(AgentInputBlock.Output):
result: str = SchemaField(description="Selected dropdown value.")
def __init__(self):
super().__init__(
id="655d6fdf-a334-421c-b733-520549c07cd1",
description="Block for dropdown text selection.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentDropdownInputBlock.Input,
output_schema=AgentDropdownInputBlock.Output,
test_input=[
{
"value": "Option A",
"name": "dropdown_1",
"placeholder_values": ["Option A", "Option B", "Option C"],
"description": "Dropdown example 1",
},
{
"value": "Option C",
"name": "dropdown_2",
"placeholder_values": ["Option A", "Option B", "Option C"],
"description": "Dropdown example 2",
},
],
test_output=[
("result", "Option A"),
("result", "Option C"),
],
)
class AgentToggleInputBlock(AgentInputBlock):
class Input(AgentInputBlock.Input):
value: bool = SchemaField(
description="Boolean toggle input.",
default=False,
advanced=False,
title="Default Value",
)
class Output(AgentInputBlock.Output):
result: bool = SchemaField(description="Boolean toggle result.")
def __init__(self):
super().__init__(
id="cbf36ab5-df4a-43b6-8a7f-f7ed8652116e",
description="Block for boolean toggle input.",
disabled=not config.enable_agent_input_subtype_blocks,
input_schema=AgentToggleInputBlock.Input,
output_schema=AgentToggleInputBlock.Output,
test_input=[
{
"value": True,
"name": "toggle_1",
"description": "Toggle example 1",
},
{
"value": False,
"name": "toggle_2",
"description": "Toggle example 2",
},
],
test_output=[
("result", True),
("result", False),
],
)
IO_BLOCK_IDs = [
AgentInputBlock().id,
AgentOutputBlock().id,
AgentShortTextInputBlock().id,
AgentLongTextInputBlock().id,
AgentNumberInputBlock().id,
AgentDateInputBlock().id,
AgentTimeInputBlock().id,
AgentFileInputBlock().id,
AgentDropdownInputBlock().id,
AgentToggleInputBlock().id,
]

View File

@@ -11,13 +11,13 @@ class StepThroughItemsBlock(Block):
advanced=False,
description="The list or dictionary of items to iterate over",
placeholder="[1, 2, 3, 4, 5] or {'key1': 'value1', 'key2': 'value2'}",
default=[],
default_factory=list,
)
items_object: dict = SchemaField(
advanced=False,
description="The list or dictionary of items to iterate over",
placeholder="[1, 2, 3, 4, 5] or {'key1': 'value1', 'key2': 'value2'}",
default={},
default_factory=dict,
)
items_str: str = SchemaField(
advanced=False,

View File

@@ -23,7 +23,7 @@ class JinaChunkingBlock(Block):
class Output(BlockSchema):
chunks: list = SchemaField(description="List of chunked texts")
tokens: list = SchemaField(
description="List of token information for each chunk", optional=True
description="List of token information for each chunk",
)
def __init__(self):

View File

@@ -1,4 +1,4 @@
from groq._utils._utils import quote
from urllib.parse import quote
from backend.blocks.jina._auth import (
TEST_CREDENTIALS,

View File

@@ -0,0 +1,272 @@
from __future__ import annotations
import json
from typing import Any, Dict, Optional
from backend.blocks.linear._auth import LinearCredentials
from backend.blocks.linear.models import (
CreateCommentResponse,
CreateIssueResponse,
Issue,
Project,
)
from backend.util.request import Requests
class LinearAPIException(Exception):
def __init__(self, message: str, status_code: int):
super().__init__(message)
self.status_code = status_code
class LinearClient:
"""Client for the Linear API
If you're looking for the schema: https://studio.apollographql.com/public/Linear-API/variant/current/schema
"""
API_URL = "https://api.linear.app/graphql"
def __init__(
self,
credentials: LinearCredentials | None = None,
custom_requests: Optional[Requests] = None,
):
if custom_requests:
self._requests = custom_requests
else:
headers: Dict[str, str] = {
"Content-Type": "application/json",
}
if credentials:
headers["Authorization"] = credentials.auth_header()
self._requests = Requests(
extra_headers=headers,
trusted_origins=["https://api.linear.app"],
raise_for_status=False,
)
def _execute_graphql_request(
self, query: str, variables: dict | None = None
) -> Any:
"""
Executes a GraphQL request against the Linear API and returns the response data.
Args:
query: The GraphQL query string.
variables (optional): Any GraphQL query variables
Returns:
The parsed JSON response data, or raises a LinearAPIException on error.
"""
payload: Dict[str, Any] = {"query": query}
if variables:
payload["variables"] = variables
response = self._requests.post(self.API_URL, json=payload)
if not response.ok:
try:
error_data = response.json()
error_message = error_data.get("errors", [{}])[0].get("message", "")
except json.JSONDecodeError:
error_message = response.text
raise LinearAPIException(
f"Linear API request failed ({response.status_code}): {error_message}",
response.status_code,
)
response_data = response.json()
if "errors" in response_data:
error_messages = [
error.get("message", "") for error in response_data["errors"]
]
raise LinearAPIException(
f"Linear API returned errors: {', '.join(error_messages)}",
response.status_code,
)
return response_data["data"]
def query(self, query: str, variables: Optional[dict] = None) -> dict:
"""Executes a GraphQL query.
Args:
query: The GraphQL query string.
variables: Query variables, if any.
Returns:
The response data.
"""
return self._execute_graphql_request(query, variables)
def mutate(self, mutation: str, variables: Optional[dict] = None) -> dict:
"""Executes a GraphQL mutation.
Args:
mutation: The GraphQL mutation string.
variables: Query variables, if any.
Returns:
The response data.
"""
return self._execute_graphql_request(mutation, variables)
def try_create_comment(self, issue_id: str, comment: str) -> CreateCommentResponse:
try:
mutation = """
mutation CommentCreate($input: CommentCreateInput!) {
commentCreate(input: $input) {
success
comment {
id
body
}
}
}
"""
variables = {
"input": {
"body": comment,
"issueId": issue_id,
}
}
added_comment = self.mutate(mutation, variables)
# Select the commentCreate field from the mutation response
return CreateCommentResponse(**added_comment["commentCreate"])
except LinearAPIException as e:
raise e
def try_get_team_by_name(self, team_name: str) -> str:
try:
query = """
query GetTeamId($searchTerm: String!) {
teams(filter: {
or: [
{ name: { eqIgnoreCase: $searchTerm } },
{ key: { eqIgnoreCase: $searchTerm } }
]
}) {
nodes {
id
name
key
}
}
}
"""
variables: dict[str, Any] = {
"searchTerm": team_name,
}
team_id = self.query(query, variables)
return team_id["teams"]["nodes"][0]["id"]
except LinearAPIException as e:
raise e
def try_create_issue(
self,
team_id: str,
title: str,
description: str | None = None,
priority: int | None = None,
project_id: str | None = None,
) -> CreateIssueResponse:
try:
mutation = """
mutation IssueCreate($input: IssueCreateInput!) {
issueCreate(input: $input) {
issue {
title
description
id
identifier
priority
}
}
}
"""
variables: dict[str, Any] = {
"input": {
"teamId": team_id,
"title": title,
}
}
if project_id:
variables["input"]["projectId"] = project_id
if description:
variables["input"]["description"] = description
if priority:
variables["input"]["priority"] = priority
added_issue = self.mutate(mutation, variables)
return CreateIssueResponse(**added_issue["issueCreate"])
except LinearAPIException as e:
raise e
def try_search_projects(self, term: str) -> list[Project]:
try:
query = """
query SearchProjects($term: String!, $includeComments: Boolean!) {
searchProjects(term: $term, includeComments: $includeComments) {
nodes {
id
name
description
priority
progress
content
}
}
}
"""
variables: dict[str, Any] = {
"term": term,
"includeComments": True,
}
projects = self.query(query, variables)
return [
Project(**project) for project in projects["searchProjects"]["nodes"]
]
except LinearAPIException as e:
raise e
def try_search_issues(self, term: str) -> list[Issue]:
try:
query = """
query SearchIssues($term: String!, $includeComments: Boolean!) {
searchIssues(term: $term, includeComments: $includeComments) {
nodes {
id
identifier
title
description
priority
}
}
}
"""
variables: dict[str, Any] = {
"term": term,
"includeComments": True,
}
issues = self.query(query, variables)
return [Issue(**issue) for issue in issues["searchIssues"]["nodes"]]
except LinearAPIException as e:
raise e

View File

@@ -0,0 +1,101 @@
from enum import Enum
from typing import Literal
from pydantic import SecretStr
from backend.data.model import (
APIKeyCredentials,
CredentialsField,
CredentialsMetaInput,
OAuth2Credentials,
)
from backend.integrations.providers import ProviderName
from backend.util.settings import Secrets
secrets = Secrets()
LINEAR_OAUTH_IS_CONFIGURED = bool(
secrets.linear_client_id and secrets.linear_client_secret
)
LinearCredentials = OAuth2Credentials | APIKeyCredentials
# LinearCredentialsInput = CredentialsMetaInput[
# Literal[ProviderName.LINEAR],
# Literal["oauth2", "api_key"] if LINEAR_OAUTH_IS_CONFIGURED else Literal["oauth2"],
# ]
LinearCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.LINEAR], Literal["oauth2"]
]
# (required) Comma separated list of scopes:
# read - (Default) Read access for the user's account. This scope will always be present.
# write - Write access for the user's account. If your application only needs to create comments, use a more targeted scope
# issues:create - Allows creating new issues and their attachments
# comments:create - Allows creating new issue comments
# timeSchedule:write - Allows creating and modifying time schedules
# admin - Full access to admin level endpoints. You should never ask for this permission unless it's absolutely needed
class LinearScope(str, Enum):
READ = "read"
WRITE = "write"
ISSUES_CREATE = "issues:create"
COMMENTS_CREATE = "comments:create"
TIME_SCHEDULE_WRITE = "timeSchedule:write"
ADMIN = "admin"
def LinearCredentialsField(scopes: list[LinearScope]) -> LinearCredentialsInput:
"""
Creates a Linear credentials input on a block.
Params:
scope: The authorization scope needed for the block to work. ([list of available scopes](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps#available-scopes))
""" # noqa
return CredentialsField(
required_scopes=set([LinearScope.READ.value]).union(
set([scope.value for scope in scopes])
),
description="The Linear integration can be used with OAuth, "
"or any API key with sufficient permissions for the blocks it is used on.",
)
TEST_CREDENTIALS_OAUTH = OAuth2Credentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="linear",
title="Mock Linear API key",
username="mock-linear-username",
access_token=SecretStr("mock-linear-access-token"),
access_token_expires_at=None,
refresh_token=SecretStr("mock-linear-refresh-token"),
refresh_token_expires_at=None,
scopes=["mock-linear-scopes"],
)
TEST_CREDENTIALS_API_KEY = APIKeyCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="linear",
title="Mock Linear API key",
api_key=SecretStr("mock-linear-api-key"),
expires_at=None,
)
TEST_CREDENTIALS_INPUT_OAUTH = {
"provider": TEST_CREDENTIALS_OAUTH.provider,
"id": TEST_CREDENTIALS_OAUTH.id,
"type": TEST_CREDENTIALS_OAUTH.type,
"title": TEST_CREDENTIALS_OAUTH.type,
}
TEST_CREDENTIALS_INPUT_API_KEY = {
"provider": TEST_CREDENTIALS_API_KEY.provider,
"id": TEST_CREDENTIALS_API_KEY.id,
"type": TEST_CREDENTIALS_API_KEY.type,
"title": TEST_CREDENTIALS_API_KEY.type,
}

View File

@@ -0,0 +1,83 @@
from backend.blocks.linear._api import LinearAPIException, LinearClient
from backend.blocks.linear._auth import (
LINEAR_OAUTH_IS_CONFIGURED,
TEST_CREDENTIALS_INPUT_OAUTH,
TEST_CREDENTIALS_OAUTH,
LinearCredentials,
LinearCredentialsField,
LinearCredentialsInput,
LinearScope,
)
from backend.blocks.linear.models import CreateCommentResponse
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class LinearCreateCommentBlock(Block):
"""Block for creating comments on Linear issues"""
class Input(BlockSchema):
credentials: LinearCredentialsInput = LinearCredentialsField(
scopes=[LinearScope.COMMENTS_CREATE],
)
issue_id: str = SchemaField(description="ID of the issue to comment on")
comment: str = SchemaField(description="Comment text to add to the issue")
class Output(BlockSchema):
comment_id: str = SchemaField(description="ID of the created comment")
comment_body: str = SchemaField(
description="Text content of the created comment"
)
error: str = SchemaField(description="Error message if comment creation failed")
def __init__(self):
super().__init__(
id="8f7d3a2e-9b5c-4c6a-8f1d-7c8b3e4a5d6c",
description="Creates a new comment on a Linear issue",
input_schema=self.Input,
output_schema=self.Output,
categories={BlockCategory.PRODUCTIVITY, BlockCategory.ISSUE_TRACKING},
test_input={
"issue_id": "TEST-123",
"comment": "Test comment",
"credentials": TEST_CREDENTIALS_INPUT_OAUTH,
},
disabled=not LINEAR_OAUTH_IS_CONFIGURED,
test_credentials=TEST_CREDENTIALS_OAUTH,
test_output=[("comment_id", "abc123"), ("comment_body", "Test comment")],
test_mock={
"create_comment": lambda *args, **kwargs: (
"abc123",
"Test comment",
)
},
)
@staticmethod
def create_comment(
credentials: LinearCredentials, issue_id: str, comment: str
) -> tuple[str, str]:
client = LinearClient(credentials=credentials)
response: CreateCommentResponse = client.try_create_comment(
issue_id=issue_id, comment=comment
)
return response.comment.id, response.comment.body
def run(
self, input_data: Input, *, credentials: LinearCredentials, **kwargs
) -> BlockOutput:
"""Execute the comment creation"""
try:
comment_id, comment_body = self.create_comment(
credentials=credentials,
issue_id=input_data.issue_id,
comment=input_data.comment,
)
yield "comment_id", comment_id
yield "comment_body", comment_body
except LinearAPIException as e:
yield "error", str(e)
except Exception as e:
yield "error", f"Unexpected error: {str(e)}"

View File

@@ -0,0 +1,189 @@
from backend.blocks.linear._api import LinearAPIException, LinearClient
from backend.blocks.linear._auth import (
LINEAR_OAUTH_IS_CONFIGURED,
TEST_CREDENTIALS_INPUT_OAUTH,
TEST_CREDENTIALS_OAUTH,
LinearCredentials,
LinearCredentialsField,
LinearCredentialsInput,
LinearScope,
)
from backend.blocks.linear.models import CreateIssueResponse, Issue
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class LinearCreateIssueBlock(Block):
"""Block for creating issues on Linear"""
class Input(BlockSchema):
credentials: LinearCredentialsInput = LinearCredentialsField(
scopes=[LinearScope.ISSUES_CREATE],
)
title: str = SchemaField(description="Title of the issue")
description: str | None = SchemaField(description="Description of the issue")
team_name: str = SchemaField(
description="Name of the team to create the issue on"
)
priority: int | None = SchemaField(
description="Priority of the issue",
default=None,
ge=0,
le=4,
)
project_name: str | None = SchemaField(
description="Name of the project to create the issue on",
default=None,
)
class Output(BlockSchema):
issue_id: str = SchemaField(description="ID of the created issue")
issue_title: str = SchemaField(description="Title of the created issue")
error: str = SchemaField(description="Error message if issue creation failed")
def __init__(self):
super().__init__(
id="f9c68f55-dcca-40a8-8771-abf9601680aa",
description="Creates a new issue on Linear",
disabled=not LINEAR_OAUTH_IS_CONFIGURED,
input_schema=self.Input,
output_schema=self.Output,
categories={BlockCategory.PRODUCTIVITY, BlockCategory.ISSUE_TRACKING},
test_input={
"title": "Test issue",
"description": "Test description",
"team_name": "Test team",
"project_name": "Test project",
"credentials": TEST_CREDENTIALS_INPUT_OAUTH,
},
test_credentials=TEST_CREDENTIALS_OAUTH,
test_output=[("issue_id", "abc123"), ("issue_title", "Test issue")],
test_mock={
"create_issue": lambda *args, **kwargs: (
"abc123",
"Test issue",
)
},
)
@staticmethod
def create_issue(
credentials: LinearCredentials,
team_name: str,
title: str,
description: str | None = None,
priority: int | None = None,
project_name: str | None = None,
) -> tuple[str, str]:
client = LinearClient(credentials=credentials)
team_id = client.try_get_team_by_name(team_name=team_name)
project_id: str | None = None
if project_name:
projects = client.try_search_projects(term=project_name)
if projects:
project_id = projects[0].id
else:
raise LinearAPIException("Project not found", status_code=404)
response: CreateIssueResponse = client.try_create_issue(
team_id=team_id,
title=title,
description=description,
priority=priority,
project_id=project_id,
)
return response.issue.identifier, response.issue.title
def run(
self, input_data: Input, *, credentials: LinearCredentials, **kwargs
) -> BlockOutput:
"""Execute the issue creation"""
try:
issue_id, issue_title = self.create_issue(
credentials=credentials,
team_name=input_data.team_name,
title=input_data.title,
description=input_data.description,
priority=input_data.priority,
project_name=input_data.project_name,
)
yield "issue_id", issue_id
yield "issue_title", issue_title
except LinearAPIException as e:
yield "error", str(e)
except Exception as e:
yield "error", f"Unexpected error: {str(e)}"
class LinearSearchIssuesBlock(Block):
"""Block for searching issues on Linear"""
class Input(BlockSchema):
term: str = SchemaField(description="Term to search for issues")
credentials: LinearCredentialsInput = LinearCredentialsField(
scopes=[LinearScope.READ],
)
class Output(BlockSchema):
issues: list[Issue] = SchemaField(description="List of issues")
def __init__(self):
super().__init__(
id="b5a2a0e6-26b4-4c5b-8a42-bc79e9cb65c2",
description="Searches for issues on Linear",
input_schema=self.Input,
output_schema=self.Output,
disabled=not LINEAR_OAUTH_IS_CONFIGURED,
test_input={
"term": "Test issue",
"credentials": TEST_CREDENTIALS_INPUT_OAUTH,
},
test_credentials=TEST_CREDENTIALS_OAUTH,
test_output=[
(
"issues",
[
Issue(
id="abc123",
identifier="abc123",
title="Test issue",
description="Test description",
priority=1,
)
],
)
],
test_mock={
"search_issues": lambda *args, **kwargs: [
Issue(
id="abc123",
identifier="abc123",
title="Test issue",
description="Test description",
priority=1,
)
]
},
)
@staticmethod
def search_issues(
credentials: LinearCredentials,
term: str,
) -> list[Issue]:
client = LinearClient(credentials=credentials)
response: list[Issue] = client.try_search_issues(term=term)
return response
def run(
self, input_data: Input, *, credentials: LinearCredentials, **kwargs
) -> BlockOutput:
"""Execute the issue search"""
try:
issues = self.search_issues(credentials=credentials, term=input_data.term)
yield "issues", issues
except LinearAPIException as e:
yield "error", str(e)
except Exception as e:
yield "error", f"Unexpected error: {str(e)}"

View File

@@ -0,0 +1,41 @@
from pydantic import BaseModel
class Comment(BaseModel):
id: str
body: str
class CreateCommentInput(BaseModel):
body: str
issueId: str
class CreateCommentResponse(BaseModel):
success: bool
comment: Comment
class CreateCommentResponseWrapper(BaseModel):
commentCreate: CreateCommentResponse
class Issue(BaseModel):
id: str
identifier: str
title: str
description: str | None
priority: int
class CreateIssueResponse(BaseModel):
issue: Issue
class Project(BaseModel):
id: str
name: str
description: str
priority: int
progress: int
content: str

View File

@@ -0,0 +1,95 @@
from backend.blocks.linear._api import LinearAPIException, LinearClient
from backend.blocks.linear._auth import (
LINEAR_OAUTH_IS_CONFIGURED,
TEST_CREDENTIALS_INPUT_OAUTH,
TEST_CREDENTIALS_OAUTH,
LinearCredentials,
LinearCredentialsField,
LinearCredentialsInput,
LinearScope,
)
from backend.blocks.linear.models import Project
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class LinearSearchProjectsBlock(Block):
"""Block for searching projects on Linear"""
class Input(BlockSchema):
credentials: LinearCredentialsInput = LinearCredentialsField(
scopes=[LinearScope.READ],
)
term: str = SchemaField(description="Term to search for projects")
class Output(BlockSchema):
projects: list[Project] = SchemaField(description="List of projects")
error: str = SchemaField(description="Error message if issue creation failed")
def __init__(self):
super().__init__(
id="446a1d35-9d8f-4ac5-83ea-7684ec50e6af",
description="Searches for projects on Linear",
input_schema=self.Input,
output_schema=self.Output,
categories={BlockCategory.PRODUCTIVITY, BlockCategory.ISSUE_TRACKING},
test_input={
"term": "Test project",
"credentials": TEST_CREDENTIALS_INPUT_OAUTH,
},
disabled=not LINEAR_OAUTH_IS_CONFIGURED,
test_credentials=TEST_CREDENTIALS_OAUTH,
test_output=[
(
"projects",
[
Project(
id="abc123",
name="Test project",
description="Test description",
priority=1,
progress=1,
content="Test content",
)
],
)
],
test_mock={
"search_projects": lambda *args, **kwargs: [
Project(
id="abc123",
name="Test project",
description="Test description",
priority=1,
progress=1,
content="Test content",
)
]
},
)
@staticmethod
def search_projects(
credentials: LinearCredentials,
term: str,
) -> list[Project]:
client = LinearClient(credentials=credentials)
response: list[Project] = client.try_search_projects(term=term)
return response
def run(
self, input_data: Input, *, credentials: LinearCredentials, **kwargs
) -> BlockOutput:
"""Execute the project search"""
try:
projects = self.search_projects(
credentials=credentials,
term=input_data.term,
)
yield "projects", projects
except LinearAPIException as e:
yield "error", str(e)
except Exception as e:
yield "error", f"Unexpected error: {str(e)}"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,245 @@
import os
import tempfile
from typing import Literal, Optional
from moviepy.audio.io.AudioFileClip import AudioFileClip
from moviepy.video.fx.Loop import Loop
from moviepy.video.io.VideoFileClip import VideoFileClip
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.file import MediaFileType, get_exec_file_path, store_media_file
class MediaDurationBlock(Block):
class Input(BlockSchema):
media_in: MediaFileType = SchemaField(
description="Media input (URL, data URI, or local path)."
)
is_video: bool = SchemaField(
description="Whether the media is a video (True) or audio (False).",
default=True,
)
class Output(BlockSchema):
duration: float = SchemaField(
description="Duration of the media file (in seconds)."
)
error: str = SchemaField(
description="Error message if something fails.", default=""
)
def __init__(self):
super().__init__(
id="d8b91fd4-da26-42d4-8ecb-8b196c6d84b6",
description="Block to get the duration of a media file.",
categories={BlockCategory.MULTIMEDIA},
input_schema=MediaDurationBlock.Input,
output_schema=MediaDurationBlock.Output,
)
def run(
self,
input_data: Input,
*,
graph_exec_id: str,
**kwargs,
) -> BlockOutput:
# 1) Store the input media locally
local_media_path = store_media_file(
graph_exec_id=graph_exec_id,
file=input_data.media_in,
return_content=False,
)
media_abspath = get_exec_file_path(graph_exec_id, local_media_path)
# 2) Load the clip
if input_data.is_video:
clip = VideoFileClip(media_abspath)
else:
clip = AudioFileClip(media_abspath)
yield "duration", clip.duration
class LoopVideoBlock(Block):
"""
Block for looping (repeating) a video clip until a given duration or number of loops.
"""
class Input(BlockSchema):
video_in: MediaFileType = SchemaField(
description="The input video (can be a URL, data URI, or local path)."
)
# Provide EITHER a `duration` or `n_loops` or both. We'll demonstrate `duration`.
duration: Optional[float] = SchemaField(
description="Target duration (in seconds) to loop the video to. If omitted, defaults to no looping.",
default=None,
ge=0.0,
)
n_loops: Optional[int] = SchemaField(
description="Number of times to repeat the video. If omitted, defaults to 1 (no repeat).",
default=None,
ge=1,
)
output_return_type: Literal["file_path", "data_uri"] = SchemaField(
description="How to return the output video. Either a relative path or base64 data URI.",
default="file_path",
)
class Output(BlockSchema):
video_out: str = SchemaField(
description="Looped video returned either as a relative path or a data URI."
)
error: str = SchemaField(
description="Error message if something fails.", default=""
)
def __init__(self):
super().__init__(
id="8bf9eef6-5451-4213-b265-25306446e94b",
description="Block to loop a video to a given duration or number of repeats.",
categories={BlockCategory.MULTIMEDIA},
input_schema=LoopVideoBlock.Input,
output_schema=LoopVideoBlock.Output,
)
def run(
self,
input_data: Input,
*,
node_exec_id: str,
graph_exec_id: str,
**kwargs,
) -> BlockOutput:
# 1) Store the input video locally
local_video_path = store_media_file(
graph_exec_id=graph_exec_id,
file=input_data.video_in,
return_content=False,
)
input_abspath = get_exec_file_path(graph_exec_id, local_video_path)
# 2) Load the clip
clip = VideoFileClip(input_abspath)
# 3) Apply the loop effect
looped_clip = clip
if input_data.duration:
# Loop until we reach the specified duration
looped_clip = looped_clip.with_effects([Loop(duration=input_data.duration)])
elif input_data.n_loops:
looped_clip = looped_clip.with_effects([Loop(n=input_data.n_loops)])
else:
raise ValueError("Either 'duration' or 'n_loops' must be provided.")
assert isinstance(looped_clip, VideoFileClip)
# 4) Save the looped output
output_filename = MediaFileType(
f"{node_exec_id}_looped_{os.path.basename(local_video_path)}"
)
output_abspath = get_exec_file_path(graph_exec_id, output_filename)
looped_clip = looped_clip.with_audio(clip.audio)
looped_clip.write_videofile(output_abspath, codec="libx264", audio_codec="aac")
# Return as data URI
video_out = store_media_file(
graph_exec_id=graph_exec_id,
file=output_filename,
return_content=input_data.output_return_type == "data_uri",
)
yield "video_out", video_out
class AddAudioToVideoBlock(Block):
"""
Block that adds (attaches) an audio track to an existing video.
Optionally scale the volume of the new track.
"""
class Input(BlockSchema):
video_in: MediaFileType = SchemaField(
description="Video input (URL, data URI, or local path)."
)
audio_in: MediaFileType = SchemaField(
description="Audio input (URL, data URI, or local path)."
)
volume: float = SchemaField(
description="Volume scale for the newly attached audio track (1.0 = original).",
default=1.0,
)
output_return_type: Literal["file_path", "data_uri"] = SchemaField(
description="Return the final output as a relative path or base64 data URI.",
default="file_path",
)
class Output(BlockSchema):
video_out: MediaFileType = SchemaField(
description="Final video (with attached audio), as a path or data URI."
)
error: str = SchemaField(
description="Error message if something fails.", default=""
)
def __init__(self):
super().__init__(
id="3503748d-62b6-4425-91d6-725b064af509",
description="Block to attach an audio file to a video file using moviepy.",
categories={BlockCategory.MULTIMEDIA},
input_schema=AddAudioToVideoBlock.Input,
output_schema=AddAudioToVideoBlock.Output,
)
def run(
self,
input_data: Input,
*,
node_exec_id: str,
graph_exec_id: str,
**kwargs,
) -> BlockOutput:
# 1) Store the inputs locally
local_video_path = store_media_file(
graph_exec_id=graph_exec_id,
file=input_data.video_in,
return_content=False,
)
local_audio_path = store_media_file(
graph_exec_id=graph_exec_id,
file=input_data.audio_in,
return_content=False,
)
abs_temp_dir = os.path.join(tempfile.gettempdir(), "exec_file", graph_exec_id)
video_abspath = os.path.join(abs_temp_dir, local_video_path)
audio_abspath = os.path.join(abs_temp_dir, local_audio_path)
# 2) Load video + audio with moviepy
video_clip = VideoFileClip(video_abspath)
audio_clip = AudioFileClip(audio_abspath)
# Optionally scale volume
if input_data.volume != 1.0:
audio_clip = audio_clip.with_volume_scaled(input_data.volume)
# 3) Attach the new audio track
final_clip = video_clip.with_audio(audio_clip)
# 4) Write to output file
output_filename = MediaFileType(
f"{node_exec_id}_audio_attached_{os.path.basename(local_video_path)}"
)
output_abspath = os.path.join(abs_temp_dir, output_filename)
final_clip.write_videofile(output_abspath, codec="libx264", audio_codec="aac")
# 5) Return either path or data URI
video_out = store_media_file(
graph_exec_id=graph_exec_id,
file=output_filename,
return_content=input_data.output_return_type == "data_uri",
)
yield "video_out", video_out

View File

@@ -0,0 +1,338 @@
from typing import Any, Literal, Optional, Union
from mem0 import MemoryClient
from pydantic import BaseModel, SecretStr
from backend.data.block import Block, BlockOutput, BlockSchema
from backend.data.model import (
APIKeyCredentials,
CredentialsField,
CredentialsMetaInput,
SchemaField,
)
from backend.integrations.providers import ProviderName
TEST_CREDENTIALS = APIKeyCredentials(
id="ed55ac19-356e-4243-a6cb-bc599e9b716f",
provider="mem0",
api_key=SecretStr("mock-mem0-api-key"),
title="Mock Mem0 API key",
expires_at=None,
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}
class Mem0Base:
"""Base class with shared utilities for Mem0 blocks"""
@staticmethod
def _get_client(credentials: APIKeyCredentials) -> MemoryClient:
"""Get initialized Mem0 client"""
return MemoryClient(api_key=credentials.api_key.get_secret_value())
Filter = dict[str, list[dict[str, str | dict[str, list[str]]]]]
class Conversation(BaseModel):
discriminator: Literal["conversation"]
messages: list[dict[str, str]]
class Content(BaseModel):
discriminator: Literal["content"]
content: str
class AddMemoryBlock(Block, Mem0Base):
"""Block for adding memories to Mem0
Always limited by user_id and optional graph_id and graph_exec_id"""
class Input(BlockSchema):
credentials: CredentialsMetaInput[
Literal[ProviderName.MEM0], Literal["api_key"]
] = CredentialsField(description="Mem0 API key credentials")
content: Union[Content, Conversation] = SchemaField(
discriminator="discriminator",
description="Content to add - either a string or list of message objects as output from an AI block",
default=Content(discriminator="content", content="I'm a vegetarian"),
)
metadata: dict[str, Any] = SchemaField(
description="Optional metadata for the memory", default_factory=dict
)
limit_memory_to_run: bool = SchemaField(
description="Limit the memory to the run", default=False
)
limit_memory_to_agent: bool = SchemaField(
description="Limit the memory to the agent", default=False
)
class Output(BlockSchema):
action: str = SchemaField(description="Action of the operation")
memory: str = SchemaField(description="Memory created")
error: str = SchemaField(description="Error message if operation fails")
def __init__(self):
super().__init__(
id="dce97578-86be-45a4-ae50-f6de33fc935a",
description="Add new memories to Mem0 with user segmentation",
input_schema=AddMemoryBlock.Input,
output_schema=AddMemoryBlock.Output,
test_input=[
{
"content": {
"discriminator": "conversation",
"messages": [{"role": "user", "content": "I'm a vegetarian"}],
},
"metadata": {"food": "vegetarian"},
"credentials": TEST_CREDENTIALS_INPUT,
},
{
"content": {
"discriminator": "content",
"content": "I am a vegetarian",
},
"metadata": {"food": "vegetarian"},
"credentials": TEST_CREDENTIALS_INPUT,
},
],
test_output=[("action", "NO_CHANGE"), ("action", "NO_CHANGE")],
test_credentials=TEST_CREDENTIALS,
test_mock={"_get_client": lambda credentials: MockMemoryClient()},
)
def run(
self,
input_data: Input,
*,
credentials: APIKeyCredentials,
user_id: str,
graph_id: str,
graph_exec_id: str,
**kwargs
) -> BlockOutput:
try:
client = self._get_client(credentials)
if isinstance(input_data.content, Conversation):
messages = input_data.content.messages
else:
messages = [{"role": "user", "content": input_data.content}]
params = {
"user_id": user_id,
"output_format": "v1.1",
"metadata": input_data.metadata,
}
if input_data.limit_memory_to_run:
params["run_id"] = graph_exec_id
if input_data.limit_memory_to_agent:
params["agent_id"] = graph_id
# Use the client to add memory
result = client.add(
messages,
**params,
)
if len(result.get("results", [])) > 0:
for result in result.get("results", []):
yield "action", result["event"]
yield "memory", result["memory"]
else:
yield "action", "NO_CHANGE"
except Exception as e:
yield "error", str(object=e)
class SearchMemoryBlock(Block, Mem0Base):
"""Block for searching memories in Mem0"""
class Input(BlockSchema):
credentials: CredentialsMetaInput[
Literal[ProviderName.MEM0], Literal["api_key"]
] = CredentialsField(description="Mem0 API key credentials")
query: str = SchemaField(
description="Search query",
advanced=False,
)
trigger: bool = SchemaField(
description="An unused field that is used to (re-)trigger the block when you have no other inputs",
default=False,
advanced=False,
)
categories_filter: list[str] = SchemaField(
description="Categories to filter by",
default_factory=list,
advanced=True,
)
limit_memory_to_run: bool = SchemaField(
description="Limit the memory to the run", default=False
)
limit_memory_to_agent: bool = SchemaField(
description="Limit the memory to the agent", default=True
)
class Output(BlockSchema):
memories: Any = SchemaField(description="List of matching memories")
error: str = SchemaField(description="Error message if operation fails")
def __init__(self):
super().__init__(
id="bd7c84e3-e073-4b75-810c-600886ec8a5b",
description="Search memories in Mem0 by user",
input_schema=SearchMemoryBlock.Input,
output_schema=SearchMemoryBlock.Output,
test_input={
"query": "vegetarian preferences",
"credentials": TEST_CREDENTIALS_INPUT,
"top_k": 10,
"rerank": True,
},
test_output=[
("memories", [{"id": "test-memory", "content": "test content"}])
],
test_credentials=TEST_CREDENTIALS,
test_mock={"_get_client": lambda credentials: MockMemoryClient()},
)
def run(
self,
input_data: Input,
*,
credentials: APIKeyCredentials,
user_id: str,
graph_id: str,
graph_exec_id: str,
**kwargs
) -> BlockOutput:
try:
client = self._get_client(credentials)
filters: Filter = {
# This works with only one filter, so we can allow others to add on later
"AND": [
{"user_id": user_id},
]
}
if input_data.categories_filter:
filters["AND"].append(
{"categories": {"contains": input_data.categories_filter}}
)
if input_data.limit_memory_to_run:
filters["AND"].append({"run_id": graph_exec_id})
if input_data.limit_memory_to_agent:
filters["AND"].append({"agent_id": graph_id})
result: list[dict[str, Any]] = client.search(
input_data.query, version="v2", filters=filters
)
yield "memories", result
except Exception as e:
yield "error", str(e)
class GetAllMemoriesBlock(Block, Mem0Base):
"""Block for retrieving all memories from Mem0"""
class Input(BlockSchema):
credentials: CredentialsMetaInput[
Literal[ProviderName.MEM0], Literal["api_key"]
] = CredentialsField(description="Mem0 API key credentials")
trigger: bool = SchemaField(
description="An unused field that is used to trigger the block when you have no other inputs",
default=False,
advanced=False,
)
categories: Optional[list[str]] = SchemaField(
description="Filter by categories", default=None
)
limit_memory_to_run: bool = SchemaField(
description="Limit the memory to the run", default=False
)
limit_memory_to_agent: bool = SchemaField(
description="Limit the memory to the agent", default=False
)
class Output(BlockSchema):
memories: Any = SchemaField(description="List of memories")
error: str = SchemaField(description="Error message if operation fails")
def __init__(self):
super().__init__(
id="45aee5bf-4767-45d1-a28b-e01c5aae9fc1",
description="Retrieve all memories from Mem0 with pagination",
input_schema=GetAllMemoriesBlock.Input,
output_schema=GetAllMemoriesBlock.Output,
test_input={
"user_id": "test_user",
"credentials": TEST_CREDENTIALS_INPUT,
},
test_output=[
("memories", [{"id": "test-memory", "content": "test content"}]),
],
test_credentials=TEST_CREDENTIALS,
test_mock={"_get_client": lambda credentials: MockMemoryClient()},
)
def run(
self,
input_data: Input,
*,
credentials: APIKeyCredentials,
user_id: str,
graph_id: str,
graph_exec_id: str,
**kwargs
) -> BlockOutput:
try:
client = self._get_client(credentials)
filters: Filter = {
"AND": [
{"user_id": user_id},
]
}
if input_data.limit_memory_to_run:
filters["AND"].append({"run_id": graph_exec_id})
if input_data.limit_memory_to_agent:
filters["AND"].append({"agent_id": graph_id})
if input_data.categories:
filters["AND"].append(
{"categories": {"contains": input_data.categories}}
)
memories: list[dict[str, Any]] = client.get_all(
filters=filters,
version="v2",
)
yield "memories", memories
except Exception as e:
yield "error", str(e)
# Mock client for testing
class MockMemoryClient:
"""Mock Mem0 client for testing"""
def add(self, *args, **kwargs):
return {"memory_id": "test-memory-id", "status": "success"}
def search(self, *args, **kwargs) -> list[dict[str, str]]:
return [{"id": "test-memory", "content": "test content"}]
def get_all(self, *args, **kwargs) -> list[dict[str, str]]:
return [{"id": "test-memory", "content": "test content"}]

View File

@@ -6,13 +6,14 @@ from backend.blocks.nvidia._auth import (
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
from backend.util.request import requests
from backend.util.type import MediaFileType
class NvidiaDeepfakeDetectBlock(Block):
class Input(BlockSchema):
credentials: NvidiaCredentialsInput = NvidiaCredentialsField()
image_base64: str = SchemaField(
description="Image to analyze for deepfakes", image_upload=True
image_base64: MediaFileType = SchemaField(
description="Image to analyze for deepfakes",
)
return_image: bool = SchemaField(
description="Whether to return the processed image with markings",
@@ -22,16 +23,12 @@ class NvidiaDeepfakeDetectBlock(Block):
class Output(BlockSchema):
status: str = SchemaField(
description="Detection status (SUCCESS, ERROR, CONTENT_FILTERED)",
default="",
)
image: str = SchemaField(
image: MediaFileType = SchemaField(
description="Processed image with detection markings (if return_image=True)",
default="",
image_output=True,
)
is_deepfake: float = SchemaField(
description="Probability that the image is a deepfake (0-1)",
default=0.0,
)
def __init__(self):

View File

@@ -177,7 +177,8 @@ class PineconeInsertBlock(Block):
description="Namespace to use in Pinecone", default=""
)
metadata: dict = SchemaField(
description="Additional metadata to store with each vector", default={}
description="Additional metadata to store with each vector",
default_factory=dict,
)
class Output(BlockSchema):

View File

@@ -1,22 +1,48 @@
from datetime import datetime, timezone
from typing import Iterator
from typing import Iterator, Literal
import praw
from pydantic import BaseModel, ConfigDict
from pydantic import BaseModel, SecretStr
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import BlockSecret, SchemaField, SecretField
from backend.data.model import (
CredentialsField,
CredentialsMetaInput,
SchemaField,
UserPasswordCredentials,
)
from backend.integrations.providers import ProviderName
from backend.util.mock import MockObject
from backend.util.settings import Settings
RedditCredentials = UserPasswordCredentials
RedditCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.REDDIT],
Literal["user_password"],
]
class RedditCredentials(BaseModel):
client_id: BlockSecret = SecretField(key="reddit_client_id")
client_secret: BlockSecret = SecretField(key="reddit_client_secret")
username: BlockSecret = SecretField(key="reddit_username")
password: BlockSecret = SecretField(key="reddit_password")
user_agent: str = "AutoGPT:1.0 (by /u/autogpt)"
def RedditCredentialsField() -> RedditCredentialsInput:
"""Creates a Reddit credentials input on a block."""
return CredentialsField(
description="The Reddit integration requires a username and password.",
)
model_config = ConfigDict(title="Reddit Credentials")
TEST_CREDENTIALS = UserPasswordCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="reddit",
username=SecretStr("mock-reddit-username"),
password=SecretStr("mock-reddit-password"),
title="Mock Reddit credentials",
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}
class RedditPost(BaseModel):
@@ -31,13 +57,16 @@ class RedditComment(BaseModel):
comment: str
settings = Settings()
def get_praw(creds: RedditCredentials) -> praw.Reddit:
client = praw.Reddit(
client_id=creds.client_id.get_secret_value(),
client_secret=creds.client_secret.get_secret_value(),
client_id=settings.secrets.reddit_client_id,
client_secret=settings.secrets.reddit_client_secret,
username=creds.username.get_secret_value(),
password=creds.password.get_secret_value(),
user_agent=creds.user_agent,
user_agent=settings.config.reddit_user_agent,
)
me = client.user.me()
if not me:
@@ -48,11 +77,11 @@ def get_praw(creds: RedditCredentials) -> praw.Reddit:
class GetRedditPostsBlock(Block):
class Input(BlockSchema):
subreddit: str = SchemaField(description="Subreddit name")
creds: RedditCredentials = SchemaField(
description="Reddit credentials",
default=RedditCredentials(),
subreddit: str = SchemaField(
description="Subreddit name, excluding the /r/ prefix",
default="writingprompts",
)
credentials: RedditCredentialsInput = RedditCredentialsField()
last_minutes: int | None = SchemaField(
description="Post time to stop minutes ago while fetching posts",
default=None,
@@ -70,20 +99,18 @@ class GetRedditPostsBlock(Block):
def __init__(self):
super().__init__(
disabled=True,
id="c6731acb-4285-4ee1-bc9b-03d0766c370f",
description="This block fetches Reddit posts from a defined subreddit name.",
categories={BlockCategory.SOCIAL},
disabled=(
not settings.secrets.reddit_client_id
or not settings.secrets.reddit_client_secret
),
input_schema=GetRedditPostsBlock.Input,
output_schema=GetRedditPostsBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={
"creds": {
"client_id": "client_id",
"client_secret": "client_secret",
"username": "username",
"password": "password",
"user_agent": "user_agent",
},
"credentials": TEST_CREDENTIALS_INPUT,
"subreddit": "subreddit",
"last_post": "id3",
"post_limit": 2,
@@ -103,7 +130,7 @@ class GetRedditPostsBlock(Block):
),
],
test_mock={
"get_posts": lambda _: [
"get_posts": lambda input_data, credentials: [
MockObject(id="id1", title="title1", selftext="body1"),
MockObject(id="id2", title="title2", selftext="body2"),
MockObject(id="id3", title="title2", selftext="body2"),
@@ -112,14 +139,18 @@ class GetRedditPostsBlock(Block):
)
@staticmethod
def get_posts(input_data: Input) -> Iterator[praw.reddit.Submission]:
client = get_praw(input_data.creds)
def get_posts(
input_data: Input, *, credentials: RedditCredentials
) -> Iterator[praw.reddit.Submission]:
client = get_praw(credentials)
subreddit = client.subreddit(input_data.subreddit)
return subreddit.new(limit=input_data.post_limit or 10)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
def run(
self, input_data: Input, *, credentials: RedditCredentials, **kwargs
) -> BlockOutput:
current_time = datetime.now(tz=timezone.utc)
for post in self.get_posts(input_data):
for post in self.get_posts(input_data=input_data, credentials=credentials):
if input_data.last_minutes:
post_datetime = datetime.fromtimestamp(
post.created_utc, tz=timezone.utc
@@ -141,9 +172,7 @@ class GetRedditPostsBlock(Block):
class PostRedditCommentBlock(Block):
class Input(BlockSchema):
creds: RedditCredentials = SchemaField(
description="Reddit credentials", default=RedditCredentials()
)
credentials: RedditCredentialsInput = RedditCredentialsField()
data: RedditComment = SchemaField(description="Reddit comment")
class Output(BlockSchema):
@@ -156,7 +185,15 @@ class PostRedditCommentBlock(Block):
categories={BlockCategory.SOCIAL},
input_schema=PostRedditCommentBlock.Input,
output_schema=PostRedditCommentBlock.Output,
test_input={"data": {"post_id": "id", "comment": "comment"}},
disabled=(
not settings.secrets.reddit_client_id
or not settings.secrets.reddit_client_secret
),
test_credentials=TEST_CREDENTIALS,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"data": {"post_id": "id", "comment": "comment"},
},
test_output=[("comment_id", "dummy_comment_id")],
test_mock={"reply_post": lambda creds, comment: "dummy_comment_id"},
)
@@ -170,5 +207,7 @@ class PostRedditCommentBlock(Block):
raise ValueError("Failed to post comment.")
return new_comment.id
def run(self, input_data: Input, **kwargs) -> BlockOutput:
yield "comment_id", self.reply_post(input_data.creds, input_data.data)
def run(
self, input_data: Input, *, credentials: RedditCredentials, **kwargs
) -> BlockOutput:
yield "comment_id", self.reply_post(credentials, input_data.data)

View File

@@ -131,7 +131,7 @@ class ReplicateFluxAdvancedModelBlock(Block):
super().__init__(
id="90f8c45e-e983-4644-aa0b-b4ebe2f531bc",
description="This block runs Flux models on Replicate with advanced settings.",
categories={BlockCategory.AI},
categories={BlockCategory.AI, BlockCategory.MULTIMEDIA},
input_schema=ReplicateFluxAdvancedModelBlock.Input,
output_schema=ReplicateFluxAdvancedModelBlock.Output,
test_input={

View File

@@ -0,0 +1,176 @@
from base64 import b64encode
from enum import Enum
from typing import Literal
from pydantic import SecretStr
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import (
APIKeyCredentials,
CredentialsField,
CredentialsMetaInput,
SchemaField,
)
from backend.integrations.providers import ProviderName
from backend.util.file import MediaFileType, store_media_file
from backend.util.request import Requests
class Format(str, Enum):
PNG = "png"
JPEG = "jpeg"
WEBP = "webp"
class ScreenshotWebPageBlock(Block):
"""Block for taking screenshots using ScreenshotOne API"""
class Input(BlockSchema):
credentials: CredentialsMetaInput[
Literal[ProviderName.SCREENSHOTONE], Literal["api_key"]
] = CredentialsField(description="The ScreenshotOne API key")
url: str = SchemaField(
description="URL of the website to screenshot",
placeholder="https://example.com",
)
viewport_width: int = SchemaField(
description="Width of the viewport in pixels", default=1920
)
viewport_height: int = SchemaField(
description="Height of the viewport in pixels", default=1080
)
full_page: bool = SchemaField(
description="Whether to capture the full page length", default=False
)
format: Format = SchemaField(
description="Output format (png, jpeg, webp)", default=Format.PNG
)
block_ads: bool = SchemaField(description="Whether to block ads", default=True)
block_cookie_banners: bool = SchemaField(
description="Whether to block cookie banners", default=True
)
block_chats: bool = SchemaField(
description="Whether to block chat widgets", default=True
)
cache: bool = SchemaField(
description="Whether to enable caching", default=False
)
class Output(BlockSchema):
image: MediaFileType = SchemaField(description="The screenshot image data")
error: str = SchemaField(description="Error message if the screenshot failed")
def __init__(self):
super().__init__(
id="3a7c4b8d-6e2f-4a5d-b9c1-f8d23c5a9b0e", # Generated UUID
description="Takes a screenshot of a specified website using ScreenshotOne API",
categories={BlockCategory.DATA},
input_schema=ScreenshotWebPageBlock.Input,
output_schema=ScreenshotWebPageBlock.Output,
test_input={
"url": "https://example.com",
"viewport_width": 1920,
"viewport_height": 1080,
"full_page": False,
"format": "png",
"block_ads": True,
"block_cookie_banners": True,
"block_chats": True,
"cache": False,
"credentials": {
"provider": "screenshotone",
"type": "api_key",
"id": "test-id",
"title": "Test API Key",
},
},
test_credentials=APIKeyCredentials(
id="test-id",
provider="screenshotone",
api_key=SecretStr("test-key"),
title="Test API Key",
expires_at=None,
),
test_output=[
(
"image",
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAB5JREFUOE9jZPjP8J+BAsA4agDDaBgwjIYBw7AIAwCV5B/xAsMbygAAAABJRU5ErkJggg==",
),
],
test_mock={
"take_screenshot": lambda *args, **kwargs: {
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAB5JREFUOE9jZPjP8J+BAsA4agDDaBgwjIYBw7AIAwCV5B/xAsMbygAAAABJRU5ErkJggg==",
}
},
)
@staticmethod
def take_screenshot(
credentials: APIKeyCredentials,
graph_exec_id: str,
url: str,
viewport_width: int,
viewport_height: int,
full_page: bool,
format: Format,
block_ads: bool,
block_cookie_banners: bool,
block_chats: bool,
cache: bool,
) -> dict:
"""
Takes a screenshot using the ScreenshotOne API
"""
api = Requests(trusted_origins=["https://api.screenshotone.com"])
# Build API URL with parameters
params = {
"access_key": credentials.api_key.get_secret_value(),
"url": url,
"viewport_width": viewport_width,
"viewport_height": viewport_height,
"full_page": str(full_page).lower(),
"format": format.value,
"block_ads": str(block_ads).lower(),
"block_cookie_banners": str(block_cookie_banners).lower(),
"block_chats": str(block_chats).lower(),
"cache": str(cache).lower(),
}
response = api.get("https://api.screenshotone.com/take", params=params)
return {
"image": store_media_file(
graph_exec_id=graph_exec_id,
file=MediaFileType(
f"data:image/{format.value};base64,{b64encode(response.content).decode('utf-8')}"
),
return_content=True,
)
}
def run(
self,
input_data: Input,
*,
credentials: APIKeyCredentials,
graph_exec_id: str,
**kwargs,
) -> BlockOutput:
try:
screenshot_data = self.take_screenshot(
credentials=credentials,
graph_exec_id=graph_exec_id,
url=input_data.url,
viewport_width=input_data.viewport_width,
viewport_height=input_data.viewport_height,
full_page=input_data.full_page,
format=input_data.format,
block_ads=input_data.block_ads,
block_cookie_banners=input_data.block_cookie_banners,
block_chats=input_data.block_chats,
cache=input_data.cache,
)
yield "image", screenshot_data["image"]
except Exception as e:
yield "error", str(e)

View File

@@ -8,6 +8,7 @@ from backend.data.block import (
BlockWebhookConfig,
)
from backend.data.model import SchemaField
from backend.integrations.providers import ProviderName
from backend.util import settings
from backend.util.settings import AppEnvironment, BehaveAs
@@ -25,7 +26,7 @@ class Slant3DTriggerBase:
class Input(BlockSchema):
credentials: Slant3DCredentialsInput = Slant3DCredentialsField()
# Webhook URL is handled by the webhook system
payload: dict = SchemaField(hidden=True, default={})
payload: dict = SchemaField(hidden=True, default_factory=dict)
class Output(BlockSchema):
payload: dict = SchemaField(
@@ -82,7 +83,7 @@ class Slant3DOrderWebhookBlock(Slant3DTriggerBase, Block):
input_schema=self.Input,
output_schema=self.Output,
webhook_config=BlockWebhookConfig(
provider="slant3d",
provider=ProviderName.SLANT3D,
webhook_type="orders", # Only one type for now
resource_format="", # No resource format needed
event_filter_input="events",

View File

@@ -0,0 +1,508 @@
import logging
import re
from collections import Counter
from typing import TYPE_CHECKING, Any
from autogpt_libs.utils.cache import thread_cached
import backend.blocks.llm as llm
from backend.blocks.agent import AgentExecutorBlock
from backend.data.block import (
Block,
BlockCategory,
BlockInput,
BlockOutput,
BlockSchema,
BlockType,
)
from backend.data.model import SchemaField
from backend.util import json
if TYPE_CHECKING:
from backend.data.graph import Link, Node
logger = logging.getLogger(__name__)
@thread_cached
def get_database_manager_client():
from backend.executor import DatabaseManager
from backend.util.service import get_service_client
return get_service_client(DatabaseManager)
def _get_tool_requests(entry: dict[str, Any]) -> list[str]:
"""
Return a list of tool_call_ids if the entry is a tool request.
Supports both OpenAI and Anthropics formats.
"""
tool_call_ids = []
if entry.get("role") != "assistant":
return tool_call_ids
# OpenAI: check for tool_calls in the entry.
calls = entry.get("tool_calls")
if isinstance(calls, list):
for call in calls:
if tool_id := call.get("id"):
tool_call_ids.append(tool_id)
# Anthropics: check content items for tool_use type.
content = entry.get("content")
if isinstance(content, list):
for item in content:
if item.get("type") != "tool_use":
continue
if tool_id := item.get("id"):
tool_call_ids.append(tool_id)
return tool_call_ids
def _get_tool_responses(entry: dict[str, Any]) -> list[str]:
"""
Return a list of tool_call_ids if the entry is a tool response.
Supports both OpenAI and Anthropics formats.
"""
tool_call_ids: list[str] = []
# OpenAI: a tool response message with role "tool" and key "tool_call_id".
if entry.get("role") == "tool":
if tool_call_id := entry.get("tool_call_id"):
tool_call_ids.append(str(tool_call_id))
# Anthropics: check content items for tool_result type.
if entry.get("role") == "user":
content = entry.get("content")
if isinstance(content, list):
for item in content:
if item.get("type") != "tool_result":
continue
if tool_call_id := item.get("tool_use_id"):
tool_call_ids.append(tool_call_id)
return tool_call_ids
def _create_tool_response(call_id: str, output: dict[str, Any]) -> dict[str, Any]:
"""
Create a tool response message for either OpenAI or Anthropics,
based on the tool_id format.
"""
content = output if isinstance(output, str) else json.dumps(output)
# Anthropics format: tool IDs typically start with "toolu_"
if call_id.startswith("toolu_"):
return {
"role": "user",
"type": "message",
"content": [
{"tool_use_id": call_id, "type": "tool_result", "content": content}
],
}
# OpenAI format: tool IDs typically start with "call_".
# Or default fallback (if the tool_id doesn't match any known prefix)
return {"role": "tool", "tool_call_id": call_id, "content": content}
def get_pending_tool_calls(conversation_history: list[Any]) -> dict[str, int]:
"""
All the tool calls entry in the conversation history requires a response.
This function returns the pending tool calls that has not generated an output yet.
Return: dict[str, int] - A dictionary of pending tool call IDs with their count.
"""
pending_calls = Counter()
for history in conversation_history:
for call_id in _get_tool_requests(history):
pending_calls[call_id] += 1
for call_id in _get_tool_responses(history):
pending_calls[call_id] -= 1
return {call_id: count for call_id, count in pending_calls.items() if count > 0}
class SmartDecisionMakerBlock(Block):
"""
A block that uses a language model to make smart decisions based on a given prompt.
"""
class Input(BlockSchema):
prompt: str = SchemaField(
description="The prompt to send to the language model.",
placeholder="Enter your prompt here...",
)
model: llm.LlmModel = SchemaField(
title="LLM Model",
default=llm.LlmModel.GPT4O,
description="The language model to use for answering the prompt.",
advanced=False,
)
credentials: llm.AICredentials = llm.AICredentialsField()
sys_prompt: str = SchemaField(
title="System Prompt",
default="Thinking carefully step by step decide which function to call. "
"Always choose a function call from the list of function signatures, "
"and always provide the complete argument provided with the type "
"matching the required jsonschema signature, no missing argument is allowed. "
"If you have already completed the task objective, you can end the task "
"by providing the end result of your work as a finish message. "
"Only provide EXACTLY one function call, multiple tool calls is strictly prohibited.",
description="The system prompt to provide additional context to the model.",
)
conversation_history: list[dict] = SchemaField(
default_factory=list,
description="The conversation history to provide context for the prompt.",
)
last_tool_output: Any = SchemaField(
default=None,
description="The output of the last tool that was called.",
)
retry: int = SchemaField(
title="Retry Count",
default=3,
description="Number of times to retry the LLM call if the response does not match the expected format.",
)
prompt_values: dict[str, str] = SchemaField(
advanced=False,
default_factory=dict,
description="Values used to fill in the prompt. The values can be used in the prompt by putting them in a double curly braces, e.g. {{variable_name}}.",
)
max_tokens: int | None = SchemaField(
advanced=True,
default=None,
description="The maximum number of tokens to generate in the chat completion.",
)
ollama_host: str = SchemaField(
advanced=True,
default="localhost:11434",
description="Ollama host for local models",
)
@classmethod
def get_missing_links(cls, data: BlockInput, links: list["Link"]) -> set[str]:
# conversation_history & last_tool_output validation is handled differently
missing_links = super().get_missing_links(
data,
[
link
for link in links
if link.sink_name
not in ["conversation_history", "last_tool_output"]
],
)
# Avoid executing the block if the last_tool_output is connected to a static
# link, like StoreValueBlock or AgentInputBlock.
if any(link.sink_name == "conversation_history" for link in links) and any(
link.sink_name == "last_tool_output" and link.is_static
for link in links
):
raise ValueError(
"Last Tool Output can't be connected to a static (dashed line) "
"link like the output of `StoreValue` or `AgentInput` block"
)
return missing_links
@classmethod
def get_missing_input(cls, data: BlockInput) -> set[str]:
if missing_input := super().get_missing_input(data):
return missing_input
conversation_history = data.get("conversation_history", [])
pending_tool_calls = get_pending_tool_calls(conversation_history)
last_tool_output = data.get("last_tool_output")
if not last_tool_output and pending_tool_calls:
return {"last_tool_output"}
return set()
class Output(BlockSchema):
error: str = SchemaField(description="Error message if the API call failed.")
tools: Any = SchemaField(description="The tools that are available to use.")
finished: str = SchemaField(
description="The finished message to display to the user."
)
conversations: list[Any] = SchemaField(
description="The conversation history to provide context for the prompt."
)
def __init__(self):
super().__init__(
id="3b191d9f-356f-482d-8238-ba04b6d18381",
description="Uses AI to intelligently decide what tool to use.",
categories={BlockCategory.AI},
block_type=BlockType.AI,
input_schema=SmartDecisionMakerBlock.Input,
output_schema=SmartDecisionMakerBlock.Output,
test_input={
"prompt": "Hello, World!",
"credentials": llm.TEST_CREDENTIALS_INPUT,
},
test_output=[],
test_credentials=llm.TEST_CREDENTIALS,
)
@staticmethod
def _create_block_function_signature(
sink_node: "Node", links: list["Link"]
) -> dict[str, Any]:
"""
Creates a function signature for a block node.
Args:
sink_node: The node for which to create a function signature.
links: The list of links connected to the sink node.
Returns:
A dictionary representing the function signature in the format expected by LLM tools.
Raises:
ValueError: If the block specified by sink_node.block_id is not found.
"""
block = sink_node.block
tool_function: dict[str, Any] = {
"name": re.sub(r"[^a-zA-Z0-9_-]", "_", block.name).lower(),
"description": block.description,
}
properties = {}
required = []
for link in links:
sink_block_input_schema = block.input_schema
description = (
sink_block_input_schema.model_fields[link.sink_name].description
if link.sink_name in sink_block_input_schema.model_fields
and sink_block_input_schema.model_fields[link.sink_name].description
else f"The {link.sink_name} of the tool"
)
properties[link.sink_name.lower()] = {
"type": "string",
"description": description,
}
tool_function["parameters"] = {
"type": "object",
"properties": properties,
"required": required,
"additionalProperties": False,
"strict": True,
}
return {"type": "function", "function": tool_function}
@staticmethod
def _create_agent_function_signature(
sink_node: "Node", links: list["Link"]
) -> dict[str, Any]:
"""
Creates a function signature for an agent node.
Args:
sink_node: The agent node for which to create a function signature.
links: The list of links connected to the sink node.
Returns:
A dictionary representing the function signature in the format expected by LLM tools.
Raises:
ValueError: If the graph metadata for the specified graph_id and graph_version is not found.
"""
graph_id = sink_node.input_default.get("graph_id")
graph_version = sink_node.input_default.get("graph_version")
if not graph_id or not graph_version:
raise ValueError("Graph ID or Graph Version not found in sink node.")
db_client = get_database_manager_client()
sink_graph_meta = db_client.get_graph_metadata(graph_id, graph_version)
if not sink_graph_meta:
raise ValueError(
f"Sink graph metadata not found: {graph_id} {graph_version}"
)
tool_function: dict[str, Any] = {
"name": re.sub(r"[^a-zA-Z0-9_-]", "_", sink_graph_meta.name).lower(),
"description": sink_graph_meta.description,
}
properties = {}
required = []
for link in links:
sink_block_input_schema = sink_node.input_default["input_schema"]
description = (
sink_block_input_schema["properties"][link.sink_name]["description"]
if "description"
in sink_block_input_schema["properties"][link.sink_name]
else f"The {link.sink_name} of the tool"
)
properties[link.sink_name.lower()] = {
"type": "string",
"description": description,
}
tool_function["parameters"] = {
"type": "object",
"properties": properties,
"required": required,
"additionalProperties": False,
"strict": True,
}
return {"type": "function", "function": tool_function}
@staticmethod
def _create_function_signature(node_id: str) -> list[dict[str, Any]]:
"""
Creates function signatures for tools linked to a specified node within a graph.
This method filters the graph links to identify those that are tools and are
connected to the given node_id. It then constructs function signatures for each
tool based on the metadata and input schema of the linked nodes.
Args:
node_id: The node_id for which to create function signatures.
Returns:
list[dict[str, Any]]: A list of dictionaries, each representing a function signature
for a tool, including its name, description, and parameters.
Raises:
ValueError: If no tool links are found for the specified node_id, or if a sink node
or its metadata cannot be found.
"""
db_client = get_database_manager_client()
tools = [
(link, node)
for link, node in db_client.get_connected_output_nodes(node_id)
if link.source_name.startswith("tools_^_") and link.source_id == node_id
]
if not tools:
raise ValueError("There is no next node to execute.")
return_tool_functions = []
grouped_tool_links: dict[str, tuple["Node", list["Link"]]] = {}
for link, node in tools:
if link.sink_id not in grouped_tool_links:
grouped_tool_links[link.sink_id] = (node, [link])
else:
grouped_tool_links[link.sink_id][1].append(link)
for sink_node, links in grouped_tool_links.values():
if not sink_node:
raise ValueError(f"Sink node not found: {links[0].sink_id}")
if sink_node.block_id == AgentExecutorBlock().id:
return_tool_functions.append(
SmartDecisionMakerBlock._create_agent_function_signature(
sink_node, links
)
)
else:
return_tool_functions.append(
SmartDecisionMakerBlock._create_block_function_signature(
sink_node, links
)
)
return return_tool_functions
def run(
self,
input_data: Input,
*,
credentials: llm.APIKeyCredentials,
graph_id: str,
node_id: str,
graph_exec_id: str,
node_exec_id: str,
user_id: str,
**kwargs,
) -> BlockOutput:
tool_functions = self._create_function_signature(node_id)
input_data.conversation_history = input_data.conversation_history or []
prompt = [json.to_dict(p) for p in input_data.conversation_history if p]
pending_tool_calls = get_pending_tool_calls(input_data.conversation_history)
if pending_tool_calls and not input_data.last_tool_output:
raise ValueError(f"Tool call requires an output for {pending_tool_calls}")
# Prefill all missing tool calls with the last tool output/
# TODO: we need a better way to handle this.
tool_output = [
_create_tool_response(pending_call_id, input_data.last_tool_output)
for pending_call_id, count in pending_tool_calls.items()
for _ in range(count)
]
# If the SDM block only calls 1 tool at a time, this should not happen.
if len(tool_output) > 1:
logger.warning(
f"[SmartDecisionMakerBlock-node_exec_id={node_exec_id}] "
f"Multiple pending tool calls are prefilled using a single output. "
f"Execution may not be accurate."
)
# Fallback on adding tool output in the conversation history as user prompt.
if len(tool_output) == 0 and input_data.last_tool_output:
logger.warning(
f"[SmartDecisionMakerBlock-node_exec_id={node_exec_id}] "
f"No pending tool calls found. This may indicate an issue with the "
f"conversation history, or an LLM calling two tools at the same time."
)
tool_output.append(
{
"role": "user",
"content": f"Last tool output: {json.dumps(input_data.last_tool_output)}",
}
)
prompt.extend(tool_output)
values = input_data.prompt_values
if values:
input_data.prompt = llm.fmt.format_string(input_data.prompt, values)
input_data.sys_prompt = llm.fmt.format_string(input_data.sys_prompt, values)
prefix = "[Main Objective Prompt]: "
if input_data.sys_prompt and not any(
p["role"] == "system" and p["content"].startswith(prefix) for p in prompt
):
prompt.append({"role": "system", "content": prefix + input_data.sys_prompt})
if input_data.prompt and not any(
p["role"] == "user" and p["content"].startswith(prefix) for p in prompt
):
prompt.append({"role": "user", "content": prefix + input_data.prompt})
response = llm.llm_call(
credentials=credentials,
llm_model=input_data.model,
prompt=prompt,
json_format=False,
max_tokens=input_data.max_tokens,
tools=tool_functions,
ollama_host=input_data.ollama_host,
)
if not response.tool_calls:
yield "finished", response.response
return
for tool_call in response.tool_calls:
tool_name = tool_call.function.name
tool_args = json.loads(tool_call.function.arguments)
for arg_name, arg_value in tool_args.items():
yield f"tools_^_{tool_name}_{arg_name}".lower(), arg_value
response.prompt.append(response.raw_response)
yield "conversations", response.prompt

View File

@@ -0,0 +1,97 @@
from backend.blocks.smartlead.models import (
AddLeadsRequest,
AddLeadsToCampaignResponse,
CreateCampaignRequest,
CreateCampaignResponse,
SaveSequencesRequest,
SaveSequencesResponse,
)
from backend.util.request import Requests
class SmartLeadClient:
"""Client for the SmartLead API"""
# This api is stupid and requires your api key in the url. DO NOT RAISE ERRORS FOR BAD REQUESTS.
# FILTER OUT THE API KEY FROM THE ERROR MESSAGE.
API_URL = "https://server.smartlead.ai/api/v1"
def __init__(self, api_key: str):
self.api_key = api_key
self.requests = Requests()
def _add_auth_to_url(self, url: str) -> str:
return f"{url}?api_key={self.api_key}"
def _handle_error(self, e: Exception) -> str:
return e.__str__().replace(self.api_key, "API KEY")
def create_campaign(self, request: CreateCampaignRequest) -> CreateCampaignResponse:
try:
response = self.requests.post(
self._add_auth_to_url(f"{self.API_URL}/campaigns/create"),
json=request.model_dump(),
)
response_data = response.json()
return CreateCampaignResponse(**response_data)
except ValueError as e:
raise ValueError(f"Invalid response format: {str(e)}")
except Exception as e:
raise ValueError(f"Failed to create campaign: {self._handle_error(e)}")
def add_leads_to_campaign(
self, request: AddLeadsRequest
) -> AddLeadsToCampaignResponse:
try:
response = self.requests.post(
self._add_auth_to_url(
f"{self.API_URL}/campaigns/{request.campaign_id}/leads"
),
json=request.model_dump(exclude={"campaign_id"}),
)
response_data = response.json()
response_parsed = AddLeadsToCampaignResponse(**response_data)
if not response_parsed.ok:
raise ValueError(
f"Failed to add leads to campaign: {response_parsed.error}"
)
return response_parsed
except ValueError as e:
raise ValueError(f"Invalid response format: {str(e)}")
except Exception as e:
raise ValueError(
f"Failed to add leads to campaign: {self._handle_error(e)}"
)
def save_campaign_sequences(
self, campaign_id: int, request: SaveSequencesRequest
) -> SaveSequencesResponse:
"""
Save sequences within a campaign.
Args:
campaign_id: ID of the campaign to save sequences for
request: SaveSequencesRequest containing the sequences configuration
Returns:
SaveSequencesResponse with the result of the operation
Note:
For variant_distribution_type:
- MANUAL_EQUAL: Equally distributes variants across leads
- AI_EQUAL: Requires winning_metric_property and lead_distribution_percentage
- MANUAL_PERCENTAGE: Requires variant_distribution_percentage in seq_variants
"""
try:
response = self.requests.post(
self._add_auth_to_url(
f"{self.API_URL}/campaigns/{campaign_id}/sequences"
),
json=request.model_dump(exclude_none=True),
)
return SaveSequencesResponse(**response.json())
except Exception as e:
raise ValueError(
f"Failed to save campaign sequences: {e.__str__().replace(self.api_key, 'API KEY')}"
)

View File

@@ -0,0 +1,35 @@
from typing import Literal
from pydantic import SecretStr
from backend.data.model import APIKeyCredentials, CredentialsField, CredentialsMetaInput
from backend.integrations.providers import ProviderName
SmartLeadCredentials = APIKeyCredentials
SmartLeadCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.SMARTLEAD],
Literal["api_key"],
]
TEST_CREDENTIALS = APIKeyCredentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="smartlead",
api_key=SecretStr("mock-smartlead-api-key"),
title="Mock SmartLead API key",
expires_at=None,
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}
def SmartLeadCredentialsField() -> SmartLeadCredentialsInput:
"""
Creates a SmartLead credentials input on a block.
"""
return CredentialsField(
description="The SmartLead integration can be used with an API Key.",
)

View File

@@ -0,0 +1,326 @@
from backend.blocks.smartlead._api import SmartLeadClient
from backend.blocks.smartlead._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
SmartLeadCredentials,
SmartLeadCredentialsInput,
)
from backend.blocks.smartlead.models import (
AddLeadsRequest,
AddLeadsToCampaignResponse,
CreateCampaignRequest,
CreateCampaignResponse,
LeadInput,
LeadUploadSettings,
SaveSequencesRequest,
SaveSequencesResponse,
Sequence,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class CreateCampaignBlock(Block):
"""Create a campaign in SmartLead"""
class Input(BlockSchema):
name: str = SchemaField(
description="The name of the campaign",
)
credentials: SmartLeadCredentialsInput = SchemaField(
description="SmartLead credentials",
)
class Output(BlockSchema):
id: int = SchemaField(
description="The ID of the created campaign",
)
name: str = SchemaField(
description="The name of the created campaign",
)
created_at: str = SchemaField(
description="The date and time the campaign was created",
)
error: str = SchemaField(
description="Error message if the search failed",
default="",
)
def __init__(self):
super().__init__(
id="8865699f-9188-43c4-89b0-79c84cfaa03e",
description="Create a campaign in SmartLead",
categories={BlockCategory.CRM},
input_schema=CreateCampaignBlock.Input,
output_schema=CreateCampaignBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={"name": "Test Campaign", "credentials": TEST_CREDENTIALS_INPUT},
test_output=[
(
"id",
1,
),
(
"name",
"Test Campaign",
),
(
"created_at",
"2024-01-01T00:00:00Z",
),
],
test_mock={
"create_campaign": lambda name, credentials: CreateCampaignResponse(
ok=True,
id=1,
name=name,
created_at="2024-01-01T00:00:00Z",
)
},
)
@staticmethod
def create_campaign(
name: str, credentials: SmartLeadCredentials
) -> CreateCampaignResponse:
client = SmartLeadClient(credentials.api_key.get_secret_value())
return client.create_campaign(CreateCampaignRequest(name=name))
def run(
self,
input_data: Input,
*,
credentials: SmartLeadCredentials,
**kwargs,
) -> BlockOutput:
response = self.create_campaign(input_data.name, credentials)
yield "id", response.id
yield "name", response.name
yield "created_at", response.created_at
if not response.ok:
yield "error", "Failed to create campaign"
class AddLeadToCampaignBlock(Block):
"""Add a lead to a campaign in SmartLead"""
class Input(BlockSchema):
campaign_id: int = SchemaField(
description="The ID of the campaign to add the lead to",
)
lead_list: list[LeadInput] = SchemaField(
description="An array of JSON objects, each representing a lead's details. Can hold max 100 leads.",
max_length=100,
default_factory=list,
advanced=False,
)
settings: LeadUploadSettings = SchemaField(
description="Settings for lead upload",
default=LeadUploadSettings(),
)
credentials: SmartLeadCredentialsInput = SchemaField(
description="SmartLead credentials",
)
class Output(BlockSchema):
campaign_id: int = SchemaField(
description="The ID of the campaign the lead was added to (passed through)",
)
upload_count: int = SchemaField(
description="The number of leads added to the campaign",
)
already_added_to_campaign: int = SchemaField(
description="The number of leads that were already added to the campaign",
)
duplicate_count: int = SchemaField(
description="The number of emails that were duplicates",
)
invalid_email_count: int = SchemaField(
description="The number of emails that were invalidly formatted",
)
is_lead_limit_exhausted: bool = SchemaField(
description="Whether the lead limit was exhausted",
)
lead_import_stopped_count: int = SchemaField(
description="The number of leads that were not added to the campaign because the lead import was stopped",
)
error: str = SchemaField(
description="Error message if the lead was not added to the campaign",
default="",
)
def __init__(self):
super().__init__(
id="fb8106a4-1a8f-42f9-a502-f6d07e6fe0ec",
description="Add a lead to a campaign in SmartLead",
categories={BlockCategory.CRM},
input_schema=AddLeadToCampaignBlock.Input,
output_schema=AddLeadToCampaignBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={
"campaign_id": 1,
"lead_list": [],
"credentials": TEST_CREDENTIALS_INPUT,
},
test_output=[
(
"campaign_id",
1,
),
(
"upload_count",
1,
),
],
test_mock={
"add_leads_to_campaign": lambda campaign_id, lead_list, credentials: AddLeadsToCampaignResponse(
ok=True,
upload_count=1,
already_added_to_campaign=0,
duplicate_count=0,
invalid_email_count=0,
is_lead_limit_exhausted=False,
lead_import_stopped_count=0,
error="",
total_leads=1,
block_count=0,
invalid_emails=[],
unsubscribed_leads=[],
bounce_count=0,
)
},
)
@staticmethod
def add_leads_to_campaign(
campaign_id: int, lead_list: list[LeadInput], credentials: SmartLeadCredentials
) -> AddLeadsToCampaignResponse:
client = SmartLeadClient(credentials.api_key.get_secret_value())
return client.add_leads_to_campaign(
AddLeadsRequest(
campaign_id=campaign_id,
lead_list=lead_list,
settings=LeadUploadSettings(
ignore_global_block_list=False,
ignore_unsubscribe_list=False,
ignore_community_bounce_list=False,
ignore_duplicate_leads_in_other_campaign=False,
),
),
)
def run(
self,
input_data: Input,
*,
credentials: SmartLeadCredentials,
**kwargs,
) -> BlockOutput:
response = self.add_leads_to_campaign(
input_data.campaign_id, input_data.lead_list, credentials
)
yield "campaign_id", input_data.campaign_id
yield "upload_count", response.upload_count
if response.already_added_to_campaign:
yield "already_added_to_campaign", response.already_added_to_campaign
if response.duplicate_count:
yield "duplicate_count", response.duplicate_count
if response.invalid_email_count:
yield "invalid_email_count", response.invalid_email_count
if response.is_lead_limit_exhausted:
yield "is_lead_limit_exhausted", response.is_lead_limit_exhausted
if response.lead_import_stopped_count:
yield "lead_import_stopped_count", response.lead_import_stopped_count
if response.error:
yield "error", response.error
if not response.ok:
yield "error", "Failed to add leads to campaign"
class SaveCampaignSequencesBlock(Block):
"""Save sequences within a campaign"""
class Input(BlockSchema):
campaign_id: int = SchemaField(
description="The ID of the campaign to save sequences for",
)
sequences: list[Sequence] = SchemaField(
description="The sequences to save",
default_factory=list,
advanced=False,
)
credentials: SmartLeadCredentialsInput = SchemaField(
description="SmartLead credentials",
)
class Output(BlockSchema):
data: dict | str | None = SchemaField(
description="Data from the API",
default=None,
)
message: str = SchemaField(
description="Message from the API",
default="",
)
error: str = SchemaField(
description="Error message if the sequences were not saved",
default="",
)
def __init__(self):
super().__init__(
id="e7d9f41c-dc10-4f39-98ba-a432abd128c0",
description="Save sequences within a campaign",
categories={BlockCategory.CRM},
input_schema=SaveCampaignSequencesBlock.Input,
output_schema=SaveCampaignSequencesBlock.Output,
test_credentials=TEST_CREDENTIALS,
test_input={
"campaign_id": 1,
"sequences": [],
"credentials": TEST_CREDENTIALS_INPUT,
},
test_output=[
(
"message",
"Sequences saved successfully",
),
],
test_mock={
"save_campaign_sequences": lambda campaign_id, sequences, credentials: SaveSequencesResponse(
ok=True,
message="Sequences saved successfully",
)
},
)
@staticmethod
def save_campaign_sequences(
campaign_id: int, sequences: list[Sequence], credentials: SmartLeadCredentials
) -> SaveSequencesResponse:
client = SmartLeadClient(credentials.api_key.get_secret_value())
return client.save_campaign_sequences(
campaign_id=campaign_id, request=SaveSequencesRequest(sequences=sequences)
)
def run(
self,
input_data: Input,
*,
credentials: SmartLeadCredentials,
**kwargs,
) -> BlockOutput:
response = self.save_campaign_sequences(
input_data.campaign_id, input_data.sequences, credentials
)
if response.data:
yield "data", response.data
if response.message:
yield "message", response.message
if response.error:
yield "error", response.error
if not response.ok:
yield "error", "Failed to save sequences"

View File

@@ -0,0 +1,147 @@
from enum import Enum
from pydantic import BaseModel
from backend.data.model import SchemaField
class CreateCampaignResponse(BaseModel):
ok: bool
id: int
name: str
created_at: str
class CreateCampaignRequest(BaseModel):
name: str
client_id: str | None = None
class AddLeadsToCampaignResponse(BaseModel):
ok: bool
upload_count: int
total_leads: int
block_count: int
duplicate_count: int
invalid_email_count: int
invalid_emails: list[str]
already_added_to_campaign: int
unsubscribed_leads: list[str]
is_lead_limit_exhausted: bool
lead_import_stopped_count: int
bounce_count: int
error: str | None = None
class LeadCustomFields(BaseModel):
"""Custom fields for a lead (max 20 fields)"""
fields: dict[str, str] = SchemaField(
description="Custom fields for a lead (max 20 fields)",
max_length=20,
default_factory=dict,
)
class LeadInput(BaseModel):
"""Single lead input data"""
first_name: str
last_name: str
email: str
phone_number: str | None = None # Changed from int to str for phone numbers
company_name: str | None = None
website: str | None = None
location: str | None = None
custom_fields: LeadCustomFields | None = None
linkedin_profile: str | None = None
company_url: str | None = None
class LeadUploadSettings(BaseModel):
"""Settings for lead upload"""
ignore_global_block_list: bool = SchemaField(
description="Ignore the global block list",
default=False,
)
ignore_unsubscribe_list: bool = SchemaField(
description="Ignore the unsubscribe list",
default=False,
)
ignore_community_bounce_list: bool = SchemaField(
description="Ignore the community bounce list",
default=False,
)
ignore_duplicate_leads_in_other_campaign: bool = SchemaField(
description="Ignore duplicate leads in other campaigns",
default=False,
)
class AddLeadsRequest(BaseModel):
"""Request body for adding leads to a campaign"""
lead_list: list[LeadInput] = SchemaField(
description="List of leads to add to the campaign",
max_length=100,
default_factory=list,
)
settings: LeadUploadSettings
campaign_id: int
class VariantDistributionType(str, Enum):
MANUAL_EQUAL = "MANUAL_EQUAL"
MANUAL_PERCENTAGE = "MANUAL_PERCENTAGE"
AI_EQUAL = "AI_EQUAL"
class WinningMetricProperty(str, Enum):
OPEN_RATE = "OPEN_RATE"
CLICK_RATE = "CLICK_RATE"
REPLY_RATE = "REPLY_RATE"
POSITIVE_REPLY_RATE = "POSITIVE_REPLY_RATE"
class SequenceDelayDetails(BaseModel):
delay_in_days: int
class SequenceVariant(BaseModel):
subject: str
email_body: str
variant_label: str
id: int | None = None # Optional for creation, required for updates
variant_distribution_percentage: int | None = None
class Sequence(BaseModel):
seq_number: int = SchemaField(
description="The sequence number",
default=1,
)
seq_delay_details: SequenceDelayDetails
id: int | None = None
variant_distribution_type: VariantDistributionType | None = None
lead_distribution_percentage: int | None = SchemaField(
None, ge=20, le=100
) # >= 20% for fair calculation
winning_metric_property: WinningMetricProperty | None = None
seq_variants: list[SequenceVariant] | None = None
subject: str = "" # blank makes the follow up in the same thread
email_body: str | None = None
class SaveSequencesRequest(BaseModel):
sequences: list[Sequence]
class SaveSequencesResponse(BaseModel):
ok: bool
message: str = SchemaField(
description="Message from the API",
default="",
)
data: dict | str | None = None
error: str | None = None

View File

@@ -78,7 +78,7 @@ class CreateTalkingAvatarVideoBlock(Block):
super().__init__(
id="98c6f503-8c47-4b1c-a96d-351fc7c87dab",
description="This block integrates with D-ID to create video clips and retrieve their URLs.",
categories={BlockCategory.AI},
categories={BlockCategory.AI, BlockCategory.MULTIMEDIA},
input_schema=CreateTalkingAvatarVideoBlock.Input,
output_schema=CreateTalkingAvatarVideoBlock.Output,
test_input={

View File

@@ -76,6 +76,8 @@ class ExtractTextInformationBlock(Block):
class Output(BlockSchema):
positive: str = SchemaField(description="Extracted text")
negative: str = SchemaField(description="Original text")
matched_results: list[str] = SchemaField(description="List of matched results")
matched_count: int = SchemaField(description="Number of matched results")
def __init__(self):
super().__init__(
@@ -103,13 +105,31 @@ class ExtractTextInformationBlock(Block):
},
],
test_output=[
# Test case 1
("positive", "World!"),
("matched_results", ["World!"]),
("matched_count", 1),
# Test case 2
("positive", "Hello, World!"),
("matched_results", ["Hello, World!"]),
("matched_count", 1),
# Test case 3
("negative", "Hello, World!"),
("matched_results", []),
("matched_count", 0),
# Test case 4
("positive", "Hello,"),
("matched_results", ["Hello,"]),
("matched_count", 1),
# Test case 5
("positive", "World!!"),
("matched_results", ["World!!"]),
("matched_count", 1),
# Test case 6
("positive", "World!!"),
("positive", "Earth!!"),
("matched_results", ["World!!", "Earth!!"]),
("matched_count", 2),
],
)
@@ -130,13 +150,16 @@ class ExtractTextInformationBlock(Block):
for match in re.finditer(input_data.pattern, txt, flags)
if input_data.group <= len(match.groups())
]
if not input_data.find_all:
matches = matches[:1]
for match in matches:
yield "positive", match
if not input_data.find_all:
return
if not matches:
yield "negative", input_data.text
yield "matched_results", matches
yield "matched_count", len(matches)
class FillTextTemplateBlock(Block):
class Input(BlockSchema):
@@ -212,3 +235,71 @@ class CombineTextsBlock(Block):
def run(self, input_data: Input, **kwargs) -> BlockOutput:
combined_text = input_data.delimiter.join(input_data.input)
yield "output", combined_text
class TextSplitBlock(Block):
class Input(BlockSchema):
text: str = SchemaField(description="The text to split.")
delimiter: str = SchemaField(description="The delimiter to split the text by.")
strip: bool = SchemaField(
description="Whether to strip the text.", default=True
)
class Output(BlockSchema):
texts: list[str] = SchemaField(
description="The text split into a list of strings."
)
def __init__(self):
super().__init__(
id="d5ea33c8-a575-477a-b42f-2fe3be5055ec",
description="This block is used to split a text into a list of strings.",
categories={BlockCategory.TEXT},
input_schema=TextSplitBlock.Input,
output_schema=TextSplitBlock.Output,
test_input=[
{"text": "Hello, World!", "delimiter": ","},
{"text": "Hello, World!", "delimiter": ",", "strip": False},
],
test_output=[
("texts", ["Hello", "World!"]),
("texts", ["Hello", " World!"]),
],
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
if len(input_data.text) == 0:
yield "texts", []
else:
texts = input_data.text.split(input_data.delimiter)
if input_data.strip:
texts = [text.strip() for text in texts]
yield "texts", texts
class TextReplaceBlock(Block):
class Input(BlockSchema):
text: str = SchemaField(description="The text to replace.")
old: str = SchemaField(description="The old text to replace.")
new: str = SchemaField(description="The new text to replace with.")
class Output(BlockSchema):
output: str = SchemaField(description="The text with the replaced text.")
def __init__(self):
super().__init__(
id="7e7c87ab-3469-4bcc-9abe-67705091b713",
description="This block is used to replace a text with a new text.",
categories={BlockCategory.TEXT},
input_schema=TextReplaceBlock.Input,
output_schema=TextReplaceBlock.Output,
test_input=[
{"text": "Hello, World!", "old": "Hello", "new": "Hi"},
],
test_output=[
("output", "Hi, World!"),
],
)
def run(self, input_data: Input, **kwargs) -> BlockOutput:
yield "output", input_data.text.replace(input_data.old, input_data.new)

View File

@@ -53,7 +53,7 @@ class UnrealTextToSpeechBlock(Block):
super().__init__(
id="4ff1ff6d-cc40-4caa-ae69-011daa20c378",
description="Converts text to speech using the Unreal Speech API",
categories={BlockCategory.AI, BlockCategory.TEXT},
categories={BlockCategory.AI, BlockCategory.TEXT, BlockCategory.MULTIMEDIA},
input_schema=UnrealTextToSpeechBlock.Input,
output_schema=UnrealTextToSpeechBlock.Output,
test_input={

View File

@@ -156,6 +156,10 @@ class CountdownTimerBlock(Block):
days: Union[int, str] = SchemaField(
advanced=False, description="Duration in days", default=0
)
repeat: int = SchemaField(
description="Number of times to repeat the timer",
default=1,
)
class Output(BlockSchema):
output_message: Any = SchemaField(
@@ -187,5 +191,6 @@ class CountdownTimerBlock(Block):
total_seconds = seconds + minutes * 60 + hours * 3600 + days * 86400
time.sleep(total_seconds)
yield "output_message", input_data.input_message
for _ in range(input_data.repeat):
time.sleep(total_seconds)
yield "output_message", input_data.input_message

View File

@@ -0,0 +1,61 @@
from typing import Literal
from pydantic import SecretStr
from backend.data.model import (
CredentialsField,
CredentialsMetaInput,
OAuth2Credentials,
ProviderName,
)
from backend.integrations.oauth.todoist import TodoistOAuthHandler
from backend.util.settings import Secrets
secrets = Secrets()
TODOIST_OAUTH_IS_CONFIGURED = bool(
secrets.todoist_client_id and secrets.todoist_client_secret
)
TodoistCredentials = OAuth2Credentials
TodoistCredentialsInput = CredentialsMetaInput[
Literal[ProviderName.TODOIST], Literal["oauth2"]
]
def TodoistCredentialsField(scopes: list[str]) -> TodoistCredentialsInput:
"""
Creates a Todoist credentials input on a block.
Params:
scopes: The authorization scopes needed for the block to work.
"""
return CredentialsField(
required_scopes=set(TodoistOAuthHandler.DEFAULT_SCOPES + scopes),
description="The Todoist integration requires OAuth2 authentication.",
)
TEST_CREDENTIALS = OAuth2Credentials(
id="01234567-89ab-cdef-0123-456789abcdef",
provider="todoist",
access_token=SecretStr("mock-todoist-access-token"),
refresh_token=None,
access_token_expires_at=None,
scopes=[
"task:add",
"data:read",
"data:read_write",
"data:delete",
"project:delete",
],
title="Mock Todoist OAuth2 Credentials",
username="mock-todoist-username",
refresh_token_expires_at=None,
)
TEST_CREDENTIALS_INPUT = {
"provider": TEST_CREDENTIALS.provider,
"id": TEST_CREDENTIALS.id,
"type": TEST_CREDENTIALS.type,
"title": TEST_CREDENTIALS.title,
}

View File

@@ -0,0 +1,24 @@
from enum import Enum
class Colors(Enum):
berry_red = "berry_red"
red = "red"
orange = "orange"
yellow = "yellow"
olive_green = "olive_green"
lime_green = "lime_green"
green = "green"
mint_green = "mint_green"
teal = "teal"
sky_blue = "sky_blue"
light_blue = "light_blue"
blue = "blue"
grape = "grape"
violet = "violet"
lavender = "lavender"
magenta = "magenta"
salmon = "salmon"
charcoal = "charcoal"
grey = "grey"
taupe = "taupe"

View File

@@ -0,0 +1,439 @@
from typing import Literal, Union
from pydantic import BaseModel
from todoist_api_python.api import TodoistAPI
from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class TaskId(BaseModel):
discriminator: Literal["task"]
task_id: str
class ProjectId(BaseModel):
discriminator: Literal["project"]
project_id: str
class TodoistCreateCommentBlock(Block):
"""Creates a new comment on a Todoist task or project"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
content: str = SchemaField(description="Comment content")
id_type: Union[TaskId, ProjectId] = SchemaField(
discriminator="discriminator",
description="Specify either task_id or project_id to comment on",
default=TaskId(discriminator="task", task_id=""),
advanced=False,
)
attachment: Optional[dict] = SchemaField(
description="Optional file attachment", default=None
)
class Output(BlockSchema):
id: str = SchemaField(description="ID of created comment")
content: str = SchemaField(description="Comment content")
posted_at: str = SchemaField(description="Comment timestamp")
task_id: Optional[str] = SchemaField(
description="Associated task ID", default=None
)
project_id: Optional[str] = SchemaField(
description="Associated project ID", default=None
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="1bba7e54-2310-4a31-8e6f-54d5f9ab7459",
description="Creates a new comment on a Todoist task or project",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCreateCommentBlock.Input,
output_schema=TodoistCreateCommentBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"content": "Test comment",
"id_type": {"discriminator": "task", "task_id": "2995104339"},
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("id", "2992679862"),
("content", "Test comment"),
("posted_at", "2016-09-22T07:00:00.000000Z"),
("task_id", "2995104339"),
("project_id", None),
],
test_mock={
"create_comment": lambda content, credentials, task_id=None, project_id=None, attachment=None: {
"id": "2992679862",
"content": "Test comment",
"posted_at": "2016-09-22T07:00:00.000000Z",
"task_id": "2995104339",
"project_id": None,
}
},
)
@staticmethod
def create_comment(
credentials: TodoistCredentials,
content: str,
task_id: Optional[str] = None,
project_id: Optional[str] = None,
attachment: Optional[dict] = None,
):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
comment = api.add_comment(
content=content,
task_id=task_id,
project_id=project_id,
attachment=attachment,
)
return comment.__dict__
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
task_id = None
project_id = None
if isinstance(input_data.id_type, TaskId):
task_id = input_data.id_type.task_id
else:
project_id = input_data.id_type.project_id
comment_data = self.create_comment(
credentials,
input_data.content,
task_id=task_id,
project_id=project_id,
attachment=input_data.attachment,
)
if comment_data:
yield "id", comment_data["id"]
yield "content", comment_data["content"]
yield "posted_at", comment_data["posted_at"]
yield "task_id", comment_data["task_id"]
yield "project_id", comment_data["project_id"]
except Exception as e:
yield "error", str(e)
class TodoistGetCommentsBlock(Block):
"""Get all comments for a Todoist task or project"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
id_type: Union[TaskId, ProjectId] = SchemaField(
discriminator="discriminator",
description="Specify either task_id or project_id to get comments for",
default=TaskId(discriminator="task", task_id=""),
advanced=False,
)
class Output(BlockSchema):
comments: list = SchemaField(description="List of comments")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="9972d8ae-ddf2-11ef-a9b8-32d3674e8b7e",
description="Get all comments for a Todoist task or project",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetCommentsBlock.Input,
output_schema=TodoistGetCommentsBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"id_type": {"discriminator": "task", "task_id": "2995104339"},
},
test_credentials=TEST_CREDENTIALS,
test_output=[
(
"comments",
[
{
"id": "2992679862",
"content": "Test comment",
"posted_at": "2016-09-22T07:00:00.000000Z",
"task_id": "2995104339",
"project_id": None,
"attachment": None,
}
],
)
],
test_mock={
"get_comments": lambda credentials, task_id=None, project_id=None: [
{
"id": "2992679862",
"content": "Test comment",
"posted_at": "2016-09-22T07:00:00.000000Z",
"task_id": "2995104339",
"project_id": None,
"attachment": None,
}
]
},
)
@staticmethod
def get_comments(
credentials: TodoistCredentials,
task_id: Optional[str] = None,
project_id: Optional[str] = None,
):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
comments = api.get_comments(task_id=task_id, project_id=project_id)
return [comment.__dict__ for comment in comments]
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
task_id = None
project_id = None
if isinstance(input_data.id_type, TaskId):
task_id = input_data.id_type.task_id
else:
project_id = input_data.id_type.project_id
comments = self.get_comments(
credentials, task_id=task_id, project_id=project_id
)
yield "comments", comments
except Exception as e:
yield "error", str(e)
class TodoistGetCommentBlock(Block):
"""Get a single comment from Todoist using comment ID"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
comment_id: str = SchemaField(description="Comment ID to retrieve")
class Output(BlockSchema):
content: str = SchemaField(description="Comment content")
id: str = SchemaField(description="Comment ID")
posted_at: str = SchemaField(description="Comment timestamp")
project_id: Optional[str] = SchemaField(
description="Associated project ID", default=None
)
task_id: Optional[str] = SchemaField(
description="Associated task ID", default=None
)
attachment: Optional[dict] = SchemaField(
description="Optional file attachment", default=None
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="a809d264-ddf2-11ef-9764-32d3674e8b7e",
description="Get a single comment from Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetCommentBlock.Input,
output_schema=TodoistGetCommentBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"comment_id": "2992679862",
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("content", "Test comment"),
("id", "2992679862"),
("posted_at", "2016-09-22T07:00:00.000000Z"),
("project_id", None),
("task_id", "2995104339"),
("attachment", None),
],
test_mock={
"get_comment": lambda credentials, comment_id: {
"content": "Test comment",
"id": "2992679862",
"posted_at": "2016-09-22T07:00:00.000000Z",
"project_id": None,
"task_id": "2995104339",
"attachment": None,
}
},
)
@staticmethod
def get_comment(credentials: TodoistCredentials, comment_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
comment = api.get_comment(comment_id=comment_id)
return comment.__dict__
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
comment_data = self.get_comment(
credentials, comment_id=input_data.comment_id
)
if comment_data:
yield "content", comment_data["content"]
yield "id", comment_data["id"]
yield "posted_at", comment_data["posted_at"]
yield "project_id", comment_data["project_id"]
yield "task_id", comment_data["task_id"]
yield "attachment", comment_data["attachment"]
except Exception as e:
yield "error", str(e)
class TodoistUpdateCommentBlock(Block):
"""Updates a Todoist comment"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
comment_id: str = SchemaField(description="Comment ID to update")
content: str = SchemaField(description="New content for the comment")
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the update was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="b773c520-ddf2-11ef-9f34-32d3674e8b7e",
description="Updates a Todoist comment",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistUpdateCommentBlock.Input,
output_schema=TodoistUpdateCommentBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"comment_id": "2992679862",
"content": "Need one bottle of milk",
},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"update_comment": lambda credentials, comment_id, content: True},
)
@staticmethod
def update_comment(credentials: TodoistCredentials, comment_id: str, content: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
api.update_comment(comment_id=comment_id, content=content)
return True
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.update_comment(
credentials,
comment_id=input_data.comment_id,
content=input_data.content,
)
yield "success", success
except Exception as e:
yield "error", str(e)
class TodoistDeleteCommentBlock(Block):
"""Deletes a Todoist comment"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
comment_id: str = SchemaField(description="Comment ID to delete")
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the deletion was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="bda4c020-ddf2-11ef-b114-32d3674e8b7e",
description="Deletes a Todoist comment",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteCommentBlock.Input,
output_schema=TodoistDeleteCommentBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"comment_id": "2992679862",
},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"delete_comment": lambda credentials, comment_id: True},
)
@staticmethod
def delete_comment(credentials: TodoistCredentials, comment_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
success = api.delete_comment(comment_id=comment_id)
return success
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.delete_comment(credentials, comment_id=input_data.comment_id)
yield "success", success
except Exception as e:
yield "error", str(e)

View File

@@ -0,0 +1,557 @@
from todoist_api_python.api import TodoistAPI
from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
)
from backend.blocks.todoist._types import Colors
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class TodoistCreateLabelBlock(Block):
"""Creates a new label in Todoist"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
name: str = SchemaField(description="Name of the label")
order: Optional[int] = SchemaField(description="Label order", default=None)
color: Optional[Colors] = SchemaField(
description="The color of the label icon", default=Colors.charcoal
)
is_favorite: bool = SchemaField(
description="Whether the label is a favorite", default=False
)
class Output(BlockSchema):
id: str = SchemaField(description="ID of the created label")
name: str = SchemaField(description="Name of the label")
color: str = SchemaField(description="Color of the label")
order: int = SchemaField(description="Label order")
is_favorite: bool = SchemaField(description="Favorite status")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="7288a968-de14-11ef-8997-32d3674e8b7e",
description="Creates a new label in Todoist, It will not work if same name already exists",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCreateLabelBlock.Input,
output_schema=TodoistCreateLabelBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"name": "Test Label",
"color": Colors.charcoal.value,
"order": 1,
"is_favorite": False,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("id", "2156154810"),
("name", "Test Label"),
("color", "charcoal"),
("order", 1),
("is_favorite", False),
],
test_mock={
"create_label": lambda *args, **kwargs: {
"id": "2156154810",
"name": "Test Label",
"color": "charcoal",
"order": 1,
"is_favorite": False,
}
},
)
@staticmethod
def create_label(credentials: TodoistCredentials, name: str, **kwargs):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
label = api.add_label(name=name, **kwargs)
return label.__dict__
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
label_args = {
"order": input_data.order,
"color": (
input_data.color.value if input_data.color is not None else None
),
"is_favorite": input_data.is_favorite,
}
label_data = self.create_label(
credentials,
input_data.name,
**{k: v for k, v in label_args.items() if v is not None},
)
if label_data:
yield "id", label_data["id"]
yield "name", label_data["name"]
yield "color", label_data["color"]
yield "order", label_data["order"]
yield "is_favorite", label_data["is_favorite"]
except Exception as e:
yield "error", str(e)
class TodoistListLabelsBlock(Block):
"""Gets all personal labels from Todoist"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
class Output(BlockSchema):
labels: list = SchemaField(description="List of complete label data")
label_ids: list = SchemaField(description="List of label IDs")
label_names: list = SchemaField(description="List of label names")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="776dd750-de14-11ef-b927-32d3674e8b7e",
description="Gets all personal labels from Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListLabelsBlock.Input,
output_schema=TodoistListLabelsBlock.Output,
test_input={"credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[
(
"labels",
[
{
"id": "2156154810",
"name": "Test Label",
"color": "charcoal",
"order": 1,
"is_favorite": False,
}
],
),
("label_ids", ["2156154810"]),
("label_names", ["Test Label"]),
],
test_mock={
"get_labels": lambda *args, **kwargs: [
{
"id": "2156154810",
"name": "Test Label",
"color": "charcoal",
"order": 1,
"is_favorite": False,
}
]
},
)
@staticmethod
def get_labels(credentials: TodoistCredentials):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
labels = api.get_labels()
return [label.__dict__ for label in labels]
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
labels = self.get_labels(credentials)
yield "labels", labels
yield "label_ids", [label["id"] for label in labels]
yield "label_names", [label["name"] for label in labels]
except Exception as e:
yield "error", str(e)
class TodoistGetLabelBlock(Block):
"""Gets a personal label from Todoist by ID"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
label_id: str = SchemaField(description="ID of the label to retrieve")
class Output(BlockSchema):
id: str = SchemaField(description="ID of the label")
name: str = SchemaField(description="Name of the label")
color: str = SchemaField(description="Color of the label")
order: int = SchemaField(description="Label order")
is_favorite: bool = SchemaField(description="Favorite status")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="7f236514-de14-11ef-bd7a-32d3674e8b7e",
description="Gets a personal label from Todoist by ID",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetLabelBlock.Input,
output_schema=TodoistGetLabelBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"label_id": "2156154810",
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("id", "2156154810"),
("name", "Test Label"),
("color", "charcoal"),
("order", 1),
("is_favorite", False),
],
test_mock={
"get_label": lambda *args, **kwargs: {
"id": "2156154810",
"name": "Test Label",
"color": "charcoal",
"order": 1,
"is_favorite": False,
}
},
)
@staticmethod
def get_label(credentials: TodoistCredentials, label_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
label = api.get_label(label_id=label_id)
return label.__dict__
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
label_data = self.get_label(credentials, input_data.label_id)
if label_data:
yield "id", label_data["id"]
yield "name", label_data["name"]
yield "color", label_data["color"]
yield "order", label_data["order"]
yield "is_favorite", label_data["is_favorite"]
except Exception as e:
yield "error", str(e)
class TodoistUpdateLabelBlock(Block):
"""Updates a personal label in Todoist using ID"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
label_id: str = SchemaField(description="ID of the label to update")
name: Optional[str] = SchemaField(
description="New name of the label", default=None
)
order: Optional[int] = SchemaField(description="Label order", default=None)
color: Optional[Colors] = SchemaField(
description="The color of the label icon", default=None
)
is_favorite: bool = SchemaField(
description="Whether the label is a favorite (true/false)", default=False
)
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the update was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="8755614c-de14-11ef-9b56-32d3674e8b7e",
description="Updates a personal label in Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistUpdateLabelBlock.Input,
output_schema=TodoistUpdateLabelBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"label_id": "2156154810",
"name": "Updated Label",
"color": Colors.charcoal.value,
"order": 2,
"is_favorite": True,
},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"update_label": lambda *args, **kwargs: True},
)
@staticmethod
def update_label(credentials: TodoistCredentials, label_id: str, **kwargs):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
api.update_label(label_id=label_id, **kwargs)
return True
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
label_args = {}
if input_data.name is not None:
label_args["name"] = input_data.name
if input_data.order is not None:
label_args["order"] = input_data.order
if input_data.color is not None:
label_args["color"] = input_data.color.value
if input_data.is_favorite is not None:
label_args["is_favorite"] = input_data.is_favorite
success = self.update_label(
credentials,
input_data.label_id,
**{k: v for k, v in label_args.items() if v is not None},
)
yield "success", success
except Exception as e:
yield "error", str(e)
class TodoistDeleteLabelBlock(Block):
"""Deletes a personal label in Todoist"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
label_id: str = SchemaField(description="ID of the label to delete")
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the deletion was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="901b8f86-de14-11ef-98b8-32d3674e8b7e",
description="Deletes a personal label in Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteLabelBlock.Input,
output_schema=TodoistDeleteLabelBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"label_id": "2156154810",
},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"delete_label": lambda *args, **kwargs: True},
)
@staticmethod
def delete_label(credentials: TodoistCredentials, label_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
success = api.delete_label(label_id=label_id)
return success
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.delete_label(credentials, input_data.label_id)
yield "success", success
except Exception as e:
yield "error", str(e)
class TodoistGetSharedLabelsBlock(Block):
"""Gets all shared labels from Todoist"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
class Output(BlockSchema):
labels: list = SchemaField(description="List of shared label names")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="55fba510-de15-11ef-aed2-32d3674e8b7e",
description="Gets all shared labels from Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetSharedLabelsBlock.Input,
output_schema=TodoistGetSharedLabelsBlock.Output,
test_input={"credentials": TEST_CREDENTIALS_INPUT},
test_credentials=TEST_CREDENTIALS,
test_output=[("labels", ["Label1", "Label2", "Label3"])],
test_mock={
"get_shared_labels": lambda *args, **kwargs: [
"Label1",
"Label2",
"Label3",
]
},
)
@staticmethod
def get_shared_labels(credentials: TodoistCredentials):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
labels = api.get_shared_labels()
return labels
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
labels = self.get_shared_labels(credentials)
yield "labels", labels
except Exception as e:
yield "error", str(e)
class TodoistRenameSharedLabelsBlock(Block):
"""Renames all instances of a shared label"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
name: str = SchemaField(description="The name of the existing label to rename")
new_name: str = SchemaField(description="The new name for the label")
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the rename was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="9d63ad9a-de14-11ef-ab3f-32d3674e8b7e",
description="Renames all instances of a shared label",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistRenameSharedLabelsBlock.Input,
output_schema=TodoistRenameSharedLabelsBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"name": "OldLabel",
"new_name": "NewLabel",
},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"rename_shared_labels": lambda *args, **kwargs: True},
)
@staticmethod
def rename_shared_labels(credentials: TodoistCredentials, name: str, new_name: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
success = api.rename_shared_label(name=name, new_name=new_name)
return success
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.rename_shared_labels(
credentials, input_data.name, input_data.new_name
)
yield "success", success
except Exception as e:
yield "error", str(e)
class TodoistRemoveSharedLabelsBlock(Block):
"""Removes all instances of a shared label"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
name: str = SchemaField(description="The name of the label to remove")
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the removal was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="a6c5cbde-de14-11ef-8863-32d3674e8b7e",
description="Removes all instances of a shared label",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistRemoveSharedLabelsBlock.Input,
output_schema=TodoistRemoveSharedLabelsBlock.Output,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "name": "LabelToRemove"},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"remove_shared_label": lambda *args, **kwargs: True},
)
@staticmethod
def remove_shared_label(credentials: TodoistCredentials, name: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
success = api.remove_shared_label(name=name)
return success
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.remove_shared_label(credentials, input_data.name)
yield "success", success
except Exception as e:
yield "error", str(e)

View File

@@ -0,0 +1,566 @@
from todoist_api_python.api import TodoistAPI
from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
)
from backend.blocks.todoist._types import Colors
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class TodoistListProjectsBlock(Block):
"""Gets all projects for a Todoist user"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
class Output(BlockSchema):
names_list: list[str] = SchemaField(description="List of project names")
ids_list: list[str] = SchemaField(description="List of project IDs")
url_list: list[str] = SchemaField(description="List of project URLs")
complete_data: list[dict] = SchemaField(
description="Complete project data including all fields"
)
error: str = SchemaField(description="Error message if request failed")
def __init__(self):
super().__init__(
id="5f3e1d5b-6bc5-40e3-97ee-1318b3f38813",
description="Gets all projects and their details from Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListProjectsBlock.Input,
output_schema=TodoistListProjectsBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("names_list", ["Inbox"]),
("ids_list", ["220474322"]),
("url_list", ["https://todoist.com/showProject?id=220474322"]),
(
"complete_data",
[
{
"id": "220474322",
"name": "Inbox",
"url": "https://todoist.com/showProject?id=220474322",
}
],
),
],
test_mock={
"get_project_lists": lambda *args, **kwargs: (
["Inbox"],
["220474322"],
["https://todoist.com/showProject?id=220474322"],
[
{
"id": "220474322",
"name": "Inbox",
"url": "https://todoist.com/showProject?id=220474322",
}
],
None,
)
},
)
@staticmethod
def get_project_lists(credentials: TodoistCredentials):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
projects = api.get_projects()
names = []
ids = []
urls = []
complete_data = []
for project in projects:
names.append(project.name)
ids.append(project.id)
urls.append(project.url)
complete_data.append(project.__dict__)
return names, ids, urls, complete_data, None
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
names, ids, urls, data, error = self.get_project_lists(credentials)
if names:
yield "names_list", names
if ids:
yield "ids_list", ids
if urls:
yield "url_list", urls
if data:
yield "complete_data", data
except Exception as e:
yield "error", str(e)
class TodoistCreateProjectBlock(Block):
"""Creates a new project in Todoist"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
name: str = SchemaField(description="Name of the project", advanced=False)
parent_id: Optional[str] = SchemaField(
description="Parent project ID", default=None, advanced=True
)
color: Optional[Colors] = SchemaField(
description="Color of the project icon",
default=Colors.charcoal,
advanced=True,
)
is_favorite: bool = SchemaField(
description="Whether the project is a favorite",
default=False,
advanced=True,
)
view_style: Optional[str] = SchemaField(
description="Display style (list or board)", default=None, advanced=True
)
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the creation was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="ade60136-de14-11ef-b5e5-32d3674e8b7e",
description="Creates a new project in Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistCreateProjectBlock.Input,
output_schema=TodoistCreateProjectBlock.Output,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "name": "Test Project"},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"create_project": lambda *args, **kwargs: (True)},
)
@staticmethod
def create_project(
credentials: TodoistCredentials,
name: str,
parent_id: Optional[str],
color: Optional[Colors],
is_favorite: bool,
view_style: Optional[str],
):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
params = {"name": name, "is_favorite": is_favorite}
if parent_id is not None:
params["parent_id"] = parent_id
if color is not None:
params["color"] = color.value
if view_style is not None:
params["view_style"] = view_style
api.add_project(**params)
return True
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.create_project(
credentials=credentials,
name=input_data.name,
parent_id=input_data.parent_id,
color=input_data.color,
is_favorite=input_data.is_favorite,
view_style=input_data.view_style,
)
yield "success", success
except Exception as e:
yield "error", str(e)
class TodoistGetProjectBlock(Block):
"""Gets details for a specific Todoist project"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
project_id: str = SchemaField(
description="ID of the project to get details for", advanced=False
)
class Output(BlockSchema):
project_id: str = SchemaField(description="ID of project")
project_name: str = SchemaField(description="Name of project")
project_url: str = SchemaField(description="URL of project")
complete_data: dict = SchemaField(
description="Complete project data including all fields"
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="b435b5ea-de14-11ef-8b51-32d3674e8b7e",
description="Gets details for a specific Todoist project",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetProjectBlock.Input,
output_schema=TodoistGetProjectBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("project_id", "2203306141"),
("project_name", "Shopping List"),
("project_url", "https://todoist.com/showProject?id=2203306141"),
(
"complete_data",
{
"id": "2203306141",
"name": "Shopping List",
"url": "https://todoist.com/showProject?id=2203306141",
},
),
],
test_mock={
"get_project": lambda *args, **kwargs: (
"2203306141",
"Shopping List",
"https://todoist.com/showProject?id=2203306141",
{
"id": "2203306141",
"name": "Shopping List",
"url": "https://todoist.com/showProject?id=2203306141",
},
)
},
)
@staticmethod
def get_project(credentials: TodoistCredentials, project_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
project = api.get_project(project_id=project_id)
return project.id, project.name, project.url, project.__dict__
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
project_id, project_name, project_url, data = self.get_project(
credentials=credentials, project_id=input_data.project_id
)
if project_id:
yield "project_id", project_id
if project_name:
yield "project_name", project_name
if project_url:
yield "project_url", project_url
if data:
yield "complete_data", data
except Exception as e:
yield "error", str(e)
class TodoistUpdateProjectBlock(Block):
"""Updates an existing project in Todoist"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
project_id: str = SchemaField(
description="ID of project to update", advanced=False
)
name: Optional[str] = SchemaField(
description="New name for the project", default=None, advanced=False
)
color: Optional[Colors] = SchemaField(
description="New color for the project icon", default=None, advanced=True
)
is_favorite: Optional[bool] = SchemaField(
description="Whether the project should be a favorite",
default=None,
advanced=True,
)
view_style: Optional[str] = SchemaField(
description="Display style (list or board)", default=None, advanced=True
)
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the update was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="ba41a20a-de14-11ef-91d7-32d3674e8b7e",
description="Updates an existing project in Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistUpdateProjectBlock.Input,
output_schema=TodoistUpdateProjectBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
"name": "Things To Buy",
},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"update_project": lambda *args, **kwargs: (True)},
)
@staticmethod
def update_project(
credentials: TodoistCredentials,
project_id: str,
name: Optional[str],
color: Optional[Colors],
is_favorite: Optional[bool],
view_style: Optional[str],
):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
params = {}
if name is not None:
params["name"] = name
if color is not None:
params["color"] = color.value
if is_favorite is not None:
params["is_favorite"] = is_favorite
if view_style is not None:
params["view_style"] = view_style
api.update_project(project_id=project_id, **params)
return True
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.update_project(
credentials=credentials,
project_id=input_data.project_id,
name=input_data.name,
color=input_data.color,
is_favorite=input_data.is_favorite,
view_style=input_data.view_style,
)
yield "success", success
except Exception as e:
yield "error", str(e)
class TodoistDeleteProjectBlock(Block):
"""Deletes a project and all of its sections and tasks"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
project_id: str = SchemaField(
description="ID of project to delete", advanced=False
)
class Output(BlockSchema):
success: bool = SchemaField(description="Whether the deletion was successful")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="c2893acc-de14-11ef-a113-32d3674e8b7e",
description="Deletes a Todoist project and all its contents",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteProjectBlock.Input,
output_schema=TodoistDeleteProjectBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"delete_project": lambda *args, **kwargs: (True)},
)
@staticmethod
def delete_project(credentials: TodoistCredentials, project_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
success = api.delete_project(project_id=project_id)
return success
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.delete_project(
credentials=credentials, project_id=input_data.project_id
)
yield "success", success
except Exception as e:
yield "error", str(e)
class TodoistListCollaboratorsBlock(Block):
"""Gets all collaborators for a Todoist project"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
project_id: str = SchemaField(
description="ID of the project to get collaborators for", advanced=False
)
class Output(BlockSchema):
collaborator_ids: list[str] = SchemaField(
description="List of collaborator IDs"
)
collaborator_names: list[str] = SchemaField(
description="List of collaborator names"
)
collaborator_emails: list[str] = SchemaField(
description="List of collaborator email addresses"
)
complete_data: list[dict] = SchemaField(
description="Complete collaborator data including all fields"
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="c99c804e-de14-11ef-9f47-32d3674e8b7e",
description="Gets all collaborators for a specific Todoist project",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListCollaboratorsBlock.Input,
output_schema=TodoistListCollaboratorsBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("collaborator_ids", ["2671362", "2671366"]),
("collaborator_names", ["Alice", "Bob"]),
("collaborator_emails", ["alice@example.com", "bob@example.com"]),
(
"complete_data",
[
{
"id": "2671362",
"name": "Alice",
"email": "alice@example.com",
},
{"id": "2671366", "name": "Bob", "email": "bob@example.com"},
],
),
],
test_mock={
"get_collaborators": lambda *args, **kwargs: (
["2671362", "2671366"],
["Alice", "Bob"],
["alice@example.com", "bob@example.com"],
[
{
"id": "2671362",
"name": "Alice",
"email": "alice@example.com",
},
{"id": "2671366", "name": "Bob", "email": "bob@example.com"},
],
)
},
)
@staticmethod
def get_collaborators(credentials: TodoistCredentials, project_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
collaborators = api.get_collaborators(project_id=project_id)
ids = []
names = []
emails = []
complete_data = []
for collaborator in collaborators:
ids.append(collaborator.id)
names.append(collaborator.name)
emails.append(collaborator.email)
complete_data.append(collaborator.__dict__)
return ids, names, emails, complete_data
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
ids, names, emails, data = self.get_collaborators(
credentials=credentials, project_id=input_data.project_id
)
if ids:
yield "collaborator_ids", ids
if names:
yield "collaborator_names", names
if emails:
yield "collaborator_emails", emails
if data:
yield "complete_data", data
except Exception as e:
yield "error", str(e)

View File

@@ -0,0 +1,306 @@
from todoist_api_python.api import TodoistAPI
from typing_extensions import Optional
from backend.blocks.todoist._auth import (
TEST_CREDENTIALS,
TEST_CREDENTIALS_INPUT,
TodoistCredentials,
TodoistCredentialsField,
TodoistCredentialsInput,
)
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class TodoistListSectionsBlock(Block):
"""Gets all sections for a Todoist project"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
project_id: Optional[str] = SchemaField(
description="Optional project ID to filter sections"
)
class Output(BlockSchema):
names_list: list[str] = SchemaField(description="List of section names")
ids_list: list[str] = SchemaField(description="List of section IDs")
complete_data: list[dict] = SchemaField(
description="Complete section data including all fields"
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="d6a116d8-de14-11ef-a94c-32d3674e8b7e",
description="Gets all sections and their details from Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistListSectionsBlock.Input,
output_schema=TodoistListSectionsBlock.Output,
test_input={
"credentials": TEST_CREDENTIALS_INPUT,
"project_id": "2203306141",
},
test_credentials=TEST_CREDENTIALS,
test_output=[
("names_list", ["Groceries"]),
("ids_list", ["7025"]),
(
"complete_data",
[
{
"id": "7025",
"project_id": "2203306141",
"order": 1,
"name": "Groceries",
}
],
),
],
test_mock={
"get_section_lists": lambda *args, **kwargs: (
["Groceries"],
["7025"],
[
{
"id": "7025",
"project_id": "2203306141",
"order": 1,
"name": "Groceries",
}
],
)
},
)
@staticmethod
def get_section_lists(
credentials: TodoistCredentials, project_id: Optional[str] = None
):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
sections = api.get_sections(project_id=project_id)
names = []
ids = []
complete_data = []
for section in sections:
names.append(section.name)
ids.append(section.id)
complete_data.append(section.__dict__)
return names, ids, complete_data
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
names, ids, data = self.get_section_lists(
credentials, input_data.project_id
)
if names:
yield "names_list", names
if ids:
yield "ids_list", ids
if data:
yield "complete_data", data
except Exception as e:
yield "error", str(e)
# Error in official todoist SDK. Will add this block using sync_api
# class TodoistCreateSectionBlock(Block):
# """Creates a new section in a Todoist project"""
# class Input(BlockSchema):
# credentials: TodoistCredentialsInput = TodoistCredentialsField([])
# name: str = SchemaField(description="Section name")
# project_id: str = SchemaField(description="Project ID this section should belong to")
# order: Optional[int] = SchemaField(description="Optional order among other sections", default=None)
# class Output(BlockSchema):
# success: bool = SchemaField(description="Whether section was successfully created")
# error: str = SchemaField(description="Error message if the request failed")
# def __init__(self):
# super().__init__(
# id="e3025cfc-de14-11ef-b9f2-32d3674e8b7e",
# description="Creates a new section in a Todoist project",
# categories={BlockCategory.PRODUCTIVITY},
# input_schema=TodoistCreateSectionBlock.Input,
# output_schema=TodoistCreateSectionBlock.Output,
# test_input={
# "credentials": TEST_CREDENTIALS_INPUT,
# "name": "Groceries",
# "project_id": "2203306141"
# },
# test_credentials=TEST_CREDENTIALS,
# test_output=[
# ("success", True)
# ],
# test_mock={
# "create_section": lambda *args, **kwargs: (
# {"id": "7025", "project_id": "2203306141", "order": 1, "name": "Groceries"},
# )
# },
# )
# @staticmethod
# def create_section(credentials: TodoistCredentials, name: str, project_id: str, order: Optional[int] = None):
# try:
# api = TodoistAPI(credentials.access_token.get_secret_value())
# section = api.add_section(name=name, project_id=project_id, order=order)
# return section.__dict__
# except Exception as e:
# raise e
# def run(
# self,
# input_data: Input,
# *,
# credentials: TodoistCredentials,
# **kwargs,
# ) -> BlockOutput:
# try:
# section_data = self.create_section(
# credentials,
# input_data.name,
# input_data.project_id,
# input_data.order
# )
# if section_data:
# yield "success", True
# except Exception as e:
# yield "error", str(e)
class TodoistGetSectionBlock(Block):
"""Gets a single section from Todoist by ID"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
section_id: str = SchemaField(description="ID of section to fetch")
class Output(BlockSchema):
id: str = SchemaField(description="ID of section")
project_id: str = SchemaField(description="Project ID the section belongs to")
order: int = SchemaField(description="Order of the section")
name: str = SchemaField(description="Name of the section")
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="ea5580e2-de14-11ef-a5d3-32d3674e8b7e",
description="Gets a single section by ID from Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistGetSectionBlock.Input,
output_schema=TodoistGetSectionBlock.Output,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "section_id": "7025"},
test_credentials=TEST_CREDENTIALS,
test_output=[
("id", "7025"),
("project_id", "2203306141"),
("order", 1),
("name", "Groceries"),
],
test_mock={
"get_section": lambda *args, **kwargs: {
"id": "7025",
"project_id": "2203306141",
"order": 1,
"name": "Groceries",
}
},
)
@staticmethod
def get_section(credentials: TodoistCredentials, section_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
section = api.get_section(section_id=section_id)
return section.__dict__
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
section_data = self.get_section(credentials, input_data.section_id)
if section_data:
yield "id", section_data["id"]
yield "project_id", section_data["project_id"]
yield "order", section_data["order"]
yield "name", section_data["name"]
except Exception as e:
yield "error", str(e)
class TodoistDeleteSectionBlock(Block):
"""Deletes a section and all its tasks from Todoist"""
class Input(BlockSchema):
credentials: TodoistCredentialsInput = TodoistCredentialsField([])
section_id: str = SchemaField(description="ID of section to delete")
class Output(BlockSchema):
success: bool = SchemaField(
description="Whether section was successfully deleted"
)
error: str = SchemaField(description="Error message if the request failed")
def __init__(self):
super().__init__(
id="f0e52eee-de14-11ef-9b12-32d3674e8b7e",
description="Deletes a section and all its tasks from Todoist",
categories={BlockCategory.PRODUCTIVITY},
input_schema=TodoistDeleteSectionBlock.Input,
output_schema=TodoistDeleteSectionBlock.Output,
test_input={"credentials": TEST_CREDENTIALS_INPUT, "section_id": "7025"},
test_credentials=TEST_CREDENTIALS,
test_output=[("success", True)],
test_mock={"delete_section": lambda *args, **kwargs: (True)},
)
@staticmethod
def delete_section(credentials: TodoistCredentials, section_id: str):
try:
api = TodoistAPI(credentials.access_token.get_secret_value())
success = api.delete_section(section_id=section_id)
return success
except Exception as e:
raise e
def run(
self,
input_data: Input,
*,
credentials: TodoistCredentials,
**kwargs,
) -> BlockOutput:
try:
success = self.delete_section(credentials, input_data.section_id)
yield "success", success
except Exception as e:
yield "error", str(e)

Some files were not shown because too many files have changed in this diff Show More