Full Code of Significant-Gravitas/AutoGPT for AI

master 1750c833ee0c cached
4156 files
63.2 MB
16.9M tokens
31360 symbols
2 requests
Copy disabled (too large) Download .txt
Showing preview only (67,400K chars total). Download the full file to get everything.
Repository: Significant-Gravitas/AutoGPT
Branch: master
Commit: 1750c833ee0c
Files: 4156
Total size: 63.2 MB

Directory structure:
gitextract_ps7p94mh/

├── .branchlet.json
├── .claude/
│   └── skills/
│       ├── pr-address/
│       │   └── SKILL.md
│       ├── pr-review/
│       │   └── SKILL.md
│       ├── pr-test/
│       │   └── SKILL.md
│       ├── vercel-react-best-practices/
│       │   ├── AGENTS.md
│       │   ├── SKILL.md
│       │   └── rules/
│       │       ├── advanced-event-handler-refs.md
│       │       ├── advanced-use-latest.md
│       │       ├── async-api-routes.md
│       │       ├── async-defer-await.md
│       │       ├── async-dependencies.md
│       │       ├── async-parallel.md
│       │       ├── async-suspense-boundaries.md
│       │       ├── bundle-barrel-imports.md
│       │       ├── bundle-conditional.md
│       │       ├── bundle-defer-third-party.md
│       │       ├── bundle-dynamic-imports.md
│       │       ├── bundle-preload.md
│       │       ├── client-event-listeners.md
│       │       ├── client-swr-dedup.md
│       │       ├── js-batch-dom-css.md
│       │       ├── js-cache-function-results.md
│       │       ├── js-cache-property-access.md
│       │       ├── js-cache-storage.md
│       │       ├── js-combine-iterations.md
│       │       ├── js-early-exit.md
│       │       ├── js-hoist-regexp.md
│       │       ├── js-index-maps.md
│       │       ├── js-length-check-first.md
│       │       ├── js-min-max-loop.md
│       │       ├── js-set-map-lookups.md
│       │       ├── js-tosorted-immutable.md
│       │       ├── rendering-activity.md
│       │       ├── rendering-animate-svg-wrapper.md
│       │       ├── rendering-conditional-render.md
│       │       ├── rendering-content-visibility.md
│       │       ├── rendering-hoist-jsx.md
│       │       ├── rendering-hydration-no-flicker.md
│       │       ├── rendering-svg-precision.md
│       │       ├── rerender-defer-reads.md
│       │       ├── rerender-dependencies.md
│       │       ├── rerender-derived-state.md
│       │       ├── rerender-functional-setstate.md
│       │       ├── rerender-lazy-state-init.md
│       │       ├── rerender-memo.md
│       │       ├── rerender-transitions.md
│       │       ├── server-after-nonblocking.md
│       │       ├── server-cache-lru.md
│       │       ├── server-cache-react.md
│       │       ├── server-parallel-fetching.md
│       │       └── server-serialization.md
│       └── worktree/
│           └── SKILL.md
├── .deepsource.toml
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1.bug.yml
│   │   └── 2.feature.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── copilot-instructions.md
│   ├── dependabot.yml
│   ├── labeler.yml
│   ├── scripts/
│   │   └── detect_overlaps.py
│   └── workflows/
│       ├── classic-autogpt-ci.yml
│       ├── classic-autogpt-docker-cache-clean.yml
│       ├── classic-autogpt-docker-ci.yml
│       ├── classic-autogpt-docker-release.yml
│       ├── classic-autogpts-ci.yml
│       ├── classic-benchmark-ci.yml
│       ├── classic-benchmark_publish_package.yml
│       ├── classic-forge-ci.yml
│       ├── classic-frontend-ci.yml
│       ├── classic-python-checks.yml
│       ├── claude-ci-failure-auto-fix.yml
│       ├── claude-dependabot.yml
│       ├── claude.yml
│       ├── codeql.yml
│       ├── copilot-setup-steps.yml
│       ├── docs-block-sync.yml
│       ├── docs-claude-review.yml
│       ├── docs-enhance.yml
│       ├── platform-autogpt-deploy-dev.yaml
│       ├── platform-autogpt-deploy-prod.yml
│       ├── platform-backend-ci.yml
│       ├── platform-dev-deploy-event-dispatcher.yml
│       ├── platform-frontend-ci.yml
│       ├── platform-fullstack-ci.yml
│       ├── pr-overlap-check.yml
│       ├── repo-close-stale-issues.yml
│       ├── repo-pr-enforce-base-branch.yml
│       ├── repo-pr-label.yml
│       ├── repo-stats.yml
│       ├── repo-workflow-checker.yml
│       └── scripts/
│           ├── check_actions_status.py
│           ├── docker-ci-fix-compose-build-cache.py
│           ├── docker-ci-summary.sh
│           ├── docker-release-summary.sh
│           └── get_package_version_from_lockfile.py
├── .gitignore
├── .gitmodules
├── .nvmrc
├── .pr_agent.toml
├── .pre-commit-config.yaml
├── AGENTS.md
├── CITATION.cff
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── assets/
│   └── gpt_dark_RGB.icns
├── autogpt_platform/
│   ├── .gitignore
│   ├── CLAUDE.md
│   ├── Contributor License Agreement (CLA).md
│   ├── LICENSE.md
│   ├── Makefile
│   ├── README.md
│   ├── __init__.py
│   ├── analytics/
│   │   └── queries/
│   │       ├── auth_activities.sql
│   │       ├── graph_execution.sql
│   │       ├── node_block_execution.sql
│   │       ├── retention_agent.sql
│   │       ├── retention_execution_daily.sql
│   │       ├── retention_execution_weekly.sql
│   │       ├── retention_login_daily.sql
│   │       ├── retention_login_onboarded_weekly.sql
│   │       ├── retention_login_weekly.sql
│   │       ├── user_block_spending.sql
│   │       ├── user_onboarding.sql
│   │       ├── user_onboarding_funnel.sql
│   │       ├── user_onboarding_integration.sql
│   │       └── users_activities.sql
│   ├── autogpt_libs/
│   │   ├── README.md
│   │   ├── autogpt_libs/
│   │   │   ├── __init__.py
│   │   │   ├── api_key/
│   │   │   │   ├── keysmith.py
│   │   │   │   └── test_keysmith.py
│   │   │   ├── auth/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── config.py
│   │   │   │   ├── config_test.py
│   │   │   │   ├── dependencies.py
│   │   │   │   ├── dependencies_test.py
│   │   │   │   ├── helpers.py
│   │   │   │   ├── helpers_test.py
│   │   │   │   ├── jwt_utils.py
│   │   │   │   ├── jwt_utils_test.py
│   │   │   │   └── models.py
│   │   │   ├── logging/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── config.py
│   │   │   │   ├── filters.py
│   │   │   │   ├── formatters.py
│   │   │   │   ├── handlers.py
│   │   │   │   ├── test_utils.py
│   │   │   │   └── utils.py
│   │   │   ├── rate_limit/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── config.py
│   │   │   │   ├── limiter.py
│   │   │   │   └── middleware.py
│   │   │   ├── supabase_integration_credentials_store/
│   │   │   │   └── types.py
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       └── synchronize.py
│   │   └── pyproject.toml
│   ├── backend/
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── CLAUDE.md
│   │   ├── Dockerfile
│   │   ├── README.advanced.md
│   │   ├── README.md
│   │   ├── TESTING.md
│   │   ├── agents/
│   │   │   ├── StoreAgent_rows.csv
│   │   │   ├── agent_00fdd42c-a14c-4d19-a567-65374ea0e87f.json
│   │   │   ├── agent_31daf49d-31d3-476b-aa4c-099abc59b458.json
│   │   │   ├── agent_415b7352-0dc6-4214-9d87-0ad3751b711d.json
│   │   │   ├── agent_516d813b-d1bc-470f-add7-c63a4b2c2bad.json
│   │   │   ├── agent_55d40473-0f31-4ada-9e40-d3a7139fcbd4.json
│   │   │   ├── agent_6e16e65a-ad34-4108-b4fd-4a23fced5ea2.json
│   │   │   ├── agent_a03b0d8c-4751-43d6-a54e-c3b7856ba4e3.json
│   │   │   ├── agent_a548e507-09a7-4b30-909c-f63fcda10fff.json
│   │   │   ├── agent_b6f6f0d3-49f4-4e3b-8155-ffe9141b32c0.json
│   │   │   ├── agent_b8ceb480-a7a2-4c90-8513-181a49f7071f.json
│   │   │   ├── agent_c775f60d-b99f-418b-8fe0-53172258c3ce.json
│   │   │   ├── agent_d85882b8-633f-44ce-a315-c20a8c123d19.json
│   │   │   ├── agent_e437cc95-e671-489d-b915-76561fba8c7f.json
│   │   │   ├── agent_e7bb29a1-23c7-4fee-aa3b-5426174b8c52.json
│   │   │   ├── agent_eafa21d3-bf14-4f63-a97f-a5ee41df83b3.json
│   │   │   ├── agent_f2cc74bb-f43f-4395-9c35-ecb30b5b4fc9.json
│   │   │   └── agent_fc2c9976-0962-4625-a27b-d316573a9e7f.json
│   │   ├── backend/
│   │   │   ├── TEST_DATA_README.md
│   │   │   ├── __init__.py
│   │   │   ├── api/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── conn_manager.py
│   │   │   │   ├── conn_manager_test.py
│   │   │   │   ├── external/
│   │   │   │   │   ├── fastapi_app.py
│   │   │   │   │   ├── middleware.py
│   │   │   │   │   └── v1/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── integrations.py
│   │   │   │   │       ├── routes.py
│   │   │   │   │       └── tools.py
│   │   │   │   ├── features/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── admin/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── credit_admin_routes.py
│   │   │   │   │   │   ├── credit_admin_routes_test.py
│   │   │   │   │   │   ├── execution_analytics_routes.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   ├── store_admin_routes.py
│   │   │   │   │   │   └── store_admin_routes_test.py
│   │   │   │   │   ├── analytics.py
│   │   │   │   │   ├── analytics_test.py
│   │   │   │   │   ├── builder/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── db.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   └── routes.py
│   │   │   │   │   ├── chat/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   └── routes_test.py
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── review/
│   │   │   │   │   │       ├── __init__.py
│   │   │   │   │   │       ├── model.py
│   │   │   │   │   │       ├── review_routes_test.py
│   │   │   │   │   │       └── routes.py
│   │   │   │   │   ├── integrations/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── conftest.py
│   │   │   │   │   │   ├── models.py
│   │   │   │   │   │   ├── router.py
│   │   │   │   │   │   └── router_test.py
│   │   │   │   │   ├── library/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── _add_to_library.py
│   │   │   │   │   │   ├── _add_to_library_test.py
│   │   │   │   │   │   ├── db.py
│   │   │   │   │   │   ├── db_test.py
│   │   │   │   │   │   ├── exceptions.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   ├── model_test.py
│   │   │   │   │   │   ├── routes/
│   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   ├── agents.py
│   │   │   │   │   │   │   ├── folders.py
│   │   │   │   │   │   │   └── presets.py
│   │   │   │   │   │   └── routes_test.py
│   │   │   │   │   ├── mcp/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   └── test_routes.py
│   │   │   │   │   ├── oauth.py
│   │   │   │   │   ├── oauth_test.py
│   │   │   │   │   ├── otto/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── models.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   ├── routes_test.py
│   │   │   │   │   │   └── service.py
│   │   │   │   │   ├── postmark/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── models.py
│   │   │   │   │   │   └── postmark.py
│   │   │   │   │   ├── store/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── cache.py
│   │   │   │   │   │   ├── content_handlers.py
│   │   │   │   │   │   ├── content_handlers_integration_test.py
│   │   │   │   │   │   ├── content_handlers_test.py
│   │   │   │   │   │   ├── db.py
│   │   │   │   │   │   ├── db_test.py
│   │   │   │   │   │   ├── embeddings.py
│   │   │   │   │   │   ├── embeddings_e2e_test.py
│   │   │   │   │   │   ├── embeddings_schema_test.py
│   │   │   │   │   │   ├── embeddings_test.py
│   │   │   │   │   │   ├── exceptions.py
│   │   │   │   │   │   ├── hybrid_search.py
│   │   │   │   │   │   ├── hybrid_search_test.py
│   │   │   │   │   │   ├── image_gen.py
│   │   │   │   │   │   ├── media.py
│   │   │   │   │   │   ├── media_test.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   ├── routes_test.py
│   │   │   │   │   │   ├── semantic_search_test.py
│   │   │   │   │   │   ├── test_cache_delete.py
│   │   │   │   │   │   ├── text_utils.py
│   │   │   │   │   │   └── text_utils_test.py
│   │   │   │   │   ├── v1.py
│   │   │   │   │   ├── v1_test.py
│   │   │   │   │   └── workspace/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── routes.py
│   │   │   │   │       └── routes_test.py
│   │   │   │   ├── middleware/
│   │   │   │   │   ├── security.py
│   │   │   │   │   └── security_test.py
│   │   │   │   ├── model.py
│   │   │   │   ├── rest_api.py
│   │   │   │   ├── test_helpers.py
│   │   │   │   ├── utils/
│   │   │   │   │   ├── api_key_auth.py
│   │   │   │   │   ├── api_key_auth_test.py
│   │   │   │   │   ├── cors.py
│   │   │   │   │   ├── cors_test.py
│   │   │   │   │   └── openapi.py
│   │   │   │   ├── ws_api.py
│   │   │   │   └── ws_api_test.py
│   │   │   ├── app.py
│   │   │   ├── blocks/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── _base.py
│   │   │   │   ├── _utils.py
│   │   │   │   ├── agent.py
│   │   │   │   ├── agent_mail/
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── attachments.py
│   │   │   │   │   ├── drafts.py
│   │   │   │   │   ├── inbox.py
│   │   │   │   │   ├── lists.py
│   │   │   │   │   ├── messages.py
│   │   │   │   │   ├── pods.py
│   │   │   │   │   └── threads.py
│   │   │   │   ├── ai_condition.py
│   │   │   │   ├── ai_image_customizer.py
│   │   │   │   ├── ai_image_generator_block.py
│   │   │   │   ├── ai_music_generator.py
│   │   │   │   ├── ai_shortform_video_block.py
│   │   │   │   ├── airtable/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _api_test.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _oauth.py
│   │   │   │   │   ├── _webhook.py
│   │   │   │   │   ├── bases.py
│   │   │   │   │   ├── records.py
│   │   │   │   │   ├── schema.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── apollo/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── models.py
│   │   │   │   │   ├── organization.py
│   │   │   │   │   ├── people.py
│   │   │   │   │   └── person.py
│   │   │   │   ├── autopilot.py
│   │   │   │   ├── autopilot_permissions_test.py
│   │   │   │   ├── ayrshare/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _util.py
│   │   │   │   │   ├── post_to_bluesky.py
│   │   │   │   │   ├── post_to_facebook.py
│   │   │   │   │   ├── post_to_gmb.py
│   │   │   │   │   ├── post_to_instagram.py
│   │   │   │   │   ├── post_to_linkedin.py
│   │   │   │   │   ├── post_to_pinterest.py
│   │   │   │   │   ├── post_to_reddit.py
│   │   │   │   │   ├── post_to_snapchat.py
│   │   │   │   │   ├── post_to_telegram.py
│   │   │   │   │   ├── post_to_threads.py
│   │   │   │   │   ├── post_to_tiktok.py
│   │   │   │   │   ├── post_to_x.py
│   │   │   │   │   └── post_to_youtube.py
│   │   │   │   ├── baas/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   └── bots.py
│   │   │   │   ├── bannerbear/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   └── text_overlay.py
│   │   │   │   ├── basic.py
│   │   │   │   ├── block.py
│   │   │   │   ├── branching.py
│   │   │   │   ├── claude_code.py
│   │   │   │   ├── code_executor.py
│   │   │   │   ├── code_extraction_block.py
│   │   │   │   ├── codex.py
│   │   │   │   ├── compass/
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── count_words_and_char_block.py
│   │   │   │   ├── data_manipulation.py
│   │   │   │   ├── dataforseo/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── keyword_suggestions.py
│   │   │   │   │   └── related_keywords.py
│   │   │   │   ├── decoder_block.py
│   │   │   │   ├── discord/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── bot_blocks.py
│   │   │   │   │   └── oauth_blocks.py
│   │   │   │   ├── elevenlabs/
│   │   │   │   │   └── _auth.py
│   │   │   │   ├── email_block.py
│   │   │   │   ├── encoder_block.py
│   │   │   │   ├── enrichlayer/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   └── linkedin.py
│   │   │   │   ├── exa/
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _test.py
│   │   │   │   │   ├── _webhook.py
│   │   │   │   │   ├── answers.py
│   │   │   │   │   ├── code_context.py
│   │   │   │   │   ├── contents.py
│   │   │   │   │   ├── helpers.py
│   │   │   │   │   ├── research.py
│   │   │   │   │   ├── search.py
│   │   │   │   │   ├── similar.py
│   │   │   │   │   ├── webhook_blocks.py
│   │   │   │   │   ├── websets.py
│   │   │   │   │   ├── websets_enrichment.py
│   │   │   │   │   ├── websets_import_export.py
│   │   │   │   │   ├── websets_items.py
│   │   │   │   │   ├── websets_monitor.py
│   │   │   │   │   ├── websets_polling.py
│   │   │   │   │   └── websets_search.py
│   │   │   │   ├── fal/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   └── ai_video_generator.py
│   │   │   │   ├── firecrawl/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _format_utils.py
│   │   │   │   │   ├── crawl.py
│   │   │   │   │   ├── extract.py
│   │   │   │   │   ├── map.py
│   │   │   │   │   ├── scrape.py
│   │   │   │   │   └── search.py
│   │   │   │   ├── flux_kontext.py
│   │   │   │   ├── generic_webhook/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _webhook.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── github/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _utils.py
│   │   │   │   │   ├── checks.py
│   │   │   │   │   ├── ci.py
│   │   │   │   │   ├── commits.py
│   │   │   │   │   ├── example_payloads/
│   │   │   │   │   │   ├── discussion.created.json
│   │   │   │   │   │   ├── issues.opened.json
│   │   │   │   │   │   ├── pull_request.synchronize.json
│   │   │   │   │   │   ├── release.published.json
│   │   │   │   │   │   └── star.created.json
│   │   │   │   │   ├── issues.py
│   │   │   │   │   ├── pull_requests.py
│   │   │   │   │   ├── repo.py
│   │   │   │   │   ├── repo_branches.py
│   │   │   │   │   ├── repo_files.py
│   │   │   │   │   ├── reviews.py
│   │   │   │   │   ├── statuses.py
│   │   │   │   │   ├── test_github_blocks.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── google/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _drive.py
│   │   │   │   │   ├── calendar.py
│   │   │   │   │   ├── docs.py
│   │   │   │   │   ├── gmail.py
│   │   │   │   │   └── sheets.py
│   │   │   │   ├── google_maps.py
│   │   │   │   ├── helpers/
│   │   │   │   │   ├── http.py
│   │   │   │   │   └── review.py
│   │   │   │   ├── http.py
│   │   │   │   ├── hubspot/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── company.py
│   │   │   │   │   ├── contact.py
│   │   │   │   │   └── engagement.py
│   │   │   │   ├── human_in_the_loop.py
│   │   │   │   ├── ideogram.py
│   │   │   │   ├── io.py
│   │   │   │   ├── iteration.py
│   │   │   │   ├── jina/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── chunking.py
│   │   │   │   │   ├── embeddings.py
│   │   │   │   │   ├── fact_checker.py
│   │   │   │   │   └── search.py
│   │   │   │   ├── linear/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _oauth.py
│   │   │   │   │   ├── comment.py
│   │   │   │   │   ├── issues.py
│   │   │   │   │   ├── models.py
│   │   │   │   │   └── projects.py
│   │   │   │   ├── llm.py
│   │   │   │   ├── maths.py
│   │   │   │   ├── mcp/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── block.py
│   │   │   │   │   ├── client.py
│   │   │   │   │   ├── helpers.py
│   │   │   │   │   ├── oauth.py
│   │   │   │   │   ├── test_e2e.py
│   │   │   │   │   ├── test_helpers.py
│   │   │   │   │   ├── test_integration.py
│   │   │   │   │   ├── test_mcp.py
│   │   │   │   │   ├── test_oauth.py
│   │   │   │   │   └── test_server.py
│   │   │   │   ├── medium.py
│   │   │   │   ├── mem0.py
│   │   │   │   ├── notion/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── create_page.py
│   │   │   │   │   ├── read_database.py
│   │   │   │   │   ├── read_page.py
│   │   │   │   │   ├── read_page_markdown.py
│   │   │   │   │   └── search.py
│   │   │   │   ├── nvidia/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   └── deepfake.py
│   │   │   │   ├── orchestrator.py
│   │   │   │   ├── perplexity.py
│   │   │   │   ├── persistence.py
│   │   │   │   ├── pinecone.py
│   │   │   │   ├── reddit.py
│   │   │   │   ├── replicate/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _helper.py
│   │   │   │   │   ├── flux_advanced.py
│   │   │   │   │   └── replicate_block.py
│   │   │   │   ├── rss.py
│   │   │   │   ├── sampling.py
│   │   │   │   ├── screenshotone.py
│   │   │   │   ├── search.py
│   │   │   │   ├── slant3d/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   ├── filament.py
│   │   │   │   │   ├── order.py
│   │   │   │   │   ├── slicing.py
│   │   │   │   │   └── webhook.py
│   │   │   │   ├── smartlead/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── campaign.py
│   │   │   │   │   └── models.py
│   │   │   │   ├── spreadsheet.py
│   │   │   │   ├── stagehand/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   └── blocks.py
│   │   │   │   ├── system/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── library_operations.py
│   │   │   │   │   └── store_operations.py
│   │   │   │   ├── talking_head.py
│   │   │   │   ├── telegram/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── blocks.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── test/
│   │   │   │   │   ├── test_autopilot.py
│   │   │   │   │   ├── test_block.py
│   │   │   │   │   ├── test_blocks_dos_vulnerability.py
│   │   │   │   │   ├── test_http.py
│   │   │   │   │   ├── test_llm.py
│   │   │   │   │   ├── test_orchestrator.py
│   │   │   │   │   ├── test_orchestrator_dict.py
│   │   │   │   │   ├── test_orchestrator_dynamic_fields.py
│   │   │   │   │   ├── test_orchestrator_responses_api.py
│   │   │   │   │   ├── test_perplexity.py
│   │   │   │   │   ├── test_store_operations.py
│   │   │   │   │   ├── test_table_input.py
│   │   │   │   │   └── test_text_encoder.py
│   │   │   │   ├── text.py
│   │   │   │   ├── text_to_speech_block.py
│   │   │   │   ├── time_blocks.py
│   │   │   │   ├── todoist/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _types.py
│   │   │   │   │   ├── comments.py
│   │   │   │   │   ├── labels.py
│   │   │   │   │   ├── projects.py
│   │   │   │   │   ├── sections.py
│   │   │   │   │   └── tasks.py
│   │   │   │   ├── twitter/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _builders.py
│   │   │   │   │   ├── _mappers.py
│   │   │   │   │   ├── _serializer.py
│   │   │   │   │   ├── _types.py
│   │   │   │   │   ├── direct_message/
│   │   │   │   │   │   ├── direct_message_lookup.py
│   │   │   │   │   │   └── manage_direct_message.py
│   │   │   │   │   ├── lists/
│   │   │   │   │   │   ├── list_follows.py
│   │   │   │   │   │   ├── list_lookup.py
│   │   │   │   │   │   ├── list_members.py
│   │   │   │   │   │   ├── list_tweets_lookup.py
│   │   │   │   │   │   ├── manage_lists.py
│   │   │   │   │   │   └── pinned_lists.py
│   │   │   │   │   ├── spaces/
│   │   │   │   │   │   ├── search_spaces.py
│   │   │   │   │   │   └── spaces_lookup.py
│   │   │   │   │   ├── tweepy_exceptions.py
│   │   │   │   │   ├── tweets/
│   │   │   │   │   │   ├── bookmark.py
│   │   │   │   │   │   ├── hide.py
│   │   │   │   │   │   ├── like.py
│   │   │   │   │   │   ├── manage.py
│   │   │   │   │   │   ├── quote.py
│   │   │   │   │   │   ├── retweet.py
│   │   │   │   │   │   ├── timeline.py
│   │   │   │   │   │   └── tweet_lookup.py
│   │   │   │   │   └── users/
│   │   │   │   │       ├── blocks.py
│   │   │   │   │       ├── follows.py
│   │   │   │   │       ├── mutes.py
│   │   │   │   │       └── user_lookup.py
│   │   │   │   ├── video/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _utils.py
│   │   │   │   │   ├── add_audio.py
│   │   │   │   │   ├── clip.py
│   │   │   │   │   ├── concat.py
│   │   │   │   │   ├── download.py
│   │   │   │   │   ├── duration.py
│   │   │   │   │   ├── loop.py
│   │   │   │   │   ├── narration.py
│   │   │   │   │   └── text_overlay.py
│   │   │   │   ├── wolfram/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   └── llm_api.py
│   │   │   │   ├── wordpress/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _oauth.py
│   │   │   │   │   └── blog.py
│   │   │   │   ├── xml_parser.py
│   │   │   │   ├── youtube.py
│   │   │   │   └── zerobounce/
│   │   │   │       ├── _api.py
│   │   │   │       ├── _auth.py
│   │   │   │       └── validate_emails.py
│   │   │   ├── check_db.py
│   │   │   ├── check_store_data.py
│   │   │   ├── cli/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── generate_openapi_json.py
│   │   │   │   └── oauth_tool.py
│   │   │   ├── cli.py
│   │   │   ├── conftest.py
│   │   │   ├── copilot/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── baseline/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── service.py
│   │   │   │   │   └── service_test.py
│   │   │   │   ├── config.py
│   │   │   │   ├── config_test.py
│   │   │   │   ├── constants.py
│   │   │   │   ├── context.py
│   │   │   │   ├── context_test.py
│   │   │   │   ├── db.py
│   │   │   │   ├── executor/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── __main__.py
│   │   │   │   │   ├── manager.py
│   │   │   │   │   ├── processor.py
│   │   │   │   │   └── utils.py
│   │   │   │   ├── integration_creds.py
│   │   │   │   ├── integration_creds_test.py
│   │   │   │   ├── model.py
│   │   │   │   ├── model_test.py
│   │   │   │   ├── optimize_blocks.py
│   │   │   │   ├── optimize_blocks_test.py
│   │   │   │   ├── permissions.py
│   │   │   │   ├── permissions_test.py
│   │   │   │   ├── prompting.py
│   │   │   │   ├── providers.py
│   │   │   │   ├── rate_limit.py
│   │   │   │   ├── rate_limit_test.py
│   │   │   │   ├── response_model.py
│   │   │   │   ├── sdk/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── agent_generation_guide.md
│   │   │   │   │   ├── collect.py
│   │   │   │   │   ├── collect_test.py
│   │   │   │   │   ├── compaction.py
│   │   │   │   │   ├── compaction_test.py
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   ├── dummy.py
│   │   │   │   │   ├── e2b_file_tools.py
│   │   │   │   │   ├── e2b_file_tools_test.py
│   │   │   │   │   ├── e2e_compaction_test.py
│   │   │   │   │   ├── file_ref.py
│   │   │   │   │   ├── file_ref_integration_test.py
│   │   │   │   │   ├── file_ref_test.py
│   │   │   │   │   ├── mcp_tool_guide.md
│   │   │   │   │   ├── otel_setup_test.py
│   │   │   │   │   ├── prompt_too_long_test.py
│   │   │   │   │   ├── query_builder_test.py
│   │   │   │   │   ├── response_adapter.py
│   │   │   │   │   ├── response_adapter_test.py
│   │   │   │   │   ├── retry_scenarios_test.py
│   │   │   │   │   ├── sdk_compat_test.py
│   │   │   │   │   ├── security_hooks.py
│   │   │   │   │   ├── security_hooks_test.py
│   │   │   │   │   ├── service.py
│   │   │   │   │   ├── service_helpers_test.py
│   │   │   │   │   ├── service_test.py
│   │   │   │   │   ├── subscription.py
│   │   │   │   │   ├── test_circuit_breaker.py
│   │   │   │   │   ├── tool_adapter.py
│   │   │   │   │   ├── tool_adapter_test.py
│   │   │   │   │   ├── transcript.py
│   │   │   │   │   ├── transcript_builder.py
│   │   │   │   │   └── transcript_test.py
│   │   │   │   ├── service.py
│   │   │   │   ├── service_test.py
│   │   │   │   ├── stream_registry.py
│   │   │   │   ├── test_copilot_e2e.py
│   │   │   │   ├── token_tracking.py
│   │   │   │   ├── token_tracking_test.py
│   │   │   │   ├── tools/
│   │   │   │   │   ├── IDEAS.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _test_data.py
│   │   │   │   │   ├── add_understanding.py
│   │   │   │   │   ├── agent_browser.py
│   │   │   │   │   ├── agent_browser_integration_test.py
│   │   │   │   │   ├── agent_browser_test.py
│   │   │   │   │   ├── agent_generator/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── blocks.py
│   │   │   │   │   │   ├── core.py
│   │   │   │   │   │   ├── errors.py
│   │   │   │   │   │   ├── fixer.py
│   │   │   │   │   │   ├── fixer_test.py
│   │   │   │   │   │   ├── helpers.py
│   │   │   │   │   │   ├── pipeline.py
│   │   │   │   │   │   ├── validation.py
│   │   │   │   │   │   ├── validator.py
│   │   │   │   │   │   └── validator_test.py
│   │   │   │   │   ├── agent_output.py
│   │   │   │   │   ├── agent_search.py
│   │   │   │   │   ├── agent_search_test.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   ├── base_test.py
│   │   │   │   │   ├── bash_exec.py
│   │   │   │   │   ├── bash_exec_test.py
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   ├── connect_integration.py
│   │   │   │   │   ├── connect_integration_test.py
│   │   │   │   │   ├── continue_run_block.py
│   │   │   │   │   ├── continue_run_block_test.py
│   │   │   │   │   ├── create_agent.py
│   │   │   │   │   ├── create_agent_test.py
│   │   │   │   │   ├── customize_agent.py
│   │   │   │   │   ├── customize_agent_test.py
│   │   │   │   │   ├── e2b_sandbox.py
│   │   │   │   │   ├── e2b_sandbox_test.py
│   │   │   │   │   ├── edit_agent.py
│   │   │   │   │   ├── execution_utils.py
│   │   │   │   │   ├── feature_requests.py
│   │   │   │   │   ├── feature_requests_test.py
│   │   │   │   │   ├── find_agent.py
│   │   │   │   │   ├── find_block.py
│   │   │   │   │   ├── find_block_test.py
│   │   │   │   │   ├── find_library_agent.py
│   │   │   │   │   ├── fix_agent.py
│   │   │   │   │   ├── fix_agent_test.py
│   │   │   │   │   ├── get_agent_building_guide.py
│   │   │   │   │   ├── get_doc_page.py
│   │   │   │   │   ├── get_mcp_guide.py
│   │   │   │   │   ├── helpers.py
│   │   │   │   │   ├── helpers_test.py
│   │   │   │   │   ├── manage_folders.py
│   │   │   │   │   ├── manage_folders_test.py
│   │   │   │   │   ├── models.py
│   │   │   │   │   ├── run_agent.py
│   │   │   │   │   ├── run_agent_test.py
│   │   │   │   │   ├── run_block.py
│   │   │   │   │   ├── run_block_test.py
│   │   │   │   │   ├── run_mcp_tool.py
│   │   │   │   │   ├── sandbox.py
│   │   │   │   │   ├── search_docs.py
│   │   │   │   │   ├── test_dry_run.py
│   │   │   │   │   ├── test_run_block_details.py
│   │   │   │   │   ├── test_run_mcp_tool.py
│   │   │   │   │   ├── tool_schema_test.py
│   │   │   │   │   ├── utils.py
│   │   │   │   │   ├── validate_agent.py
│   │   │   │   │   ├── validate_agent_test.py
│   │   │   │   │   ├── web_fetch.py
│   │   │   │   │   ├── workspace_files.py
│   │   │   │   │   └── workspace_files_test.py
│   │   │   │   └── tracking.py
│   │   │   ├── data/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── analytics.py
│   │   │   │   ├── auth/
│   │   │   │   │   ├── api_key.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   └── oauth.py
│   │   │   │   ├── block.py
│   │   │   │   ├── block_cost_config.py
│   │   │   │   ├── credit.py
│   │   │   │   ├── credit_ceiling_test.py
│   │   │   │   ├── credit_concurrency_test.py
│   │   │   │   ├── credit_integration_test.py
│   │   │   │   ├── credit_metadata_test.py
│   │   │   │   ├── credit_refund_test.py
│   │   │   │   ├── credit_test.py
│   │   │   │   ├── credit_underflow_test.py
│   │   │   │   ├── credit_user_balance_migration_test.py
│   │   │   │   ├── db.py
│   │   │   │   ├── db_accessors.py
│   │   │   │   ├── db_manager.py
│   │   │   │   ├── dynamic_fields.py
│   │   │   │   ├── event_bus.py
│   │   │   │   ├── event_bus_test.py
│   │   │   │   ├── execution.py
│   │   │   │   ├── execution_outputs_test.py
│   │   │   │   ├── execution_queue_test.py
│   │   │   │   ├── generate_data.py
│   │   │   │   ├── graph.py
│   │   │   │   ├── graph_test.py
│   │   │   │   ├── human_review.py
│   │   │   │   ├── human_review_test.py
│   │   │   │   ├── includes.py
│   │   │   │   ├── integrations.py
│   │   │   │   ├── model.py
│   │   │   │   ├── model_test.py
│   │   │   │   ├── notification_bus.py
│   │   │   │   ├── notifications.py
│   │   │   │   ├── notifications_test.py
│   │   │   │   ├── onboarding.py
│   │   │   │   ├── partial_types.py
│   │   │   │   ├── rabbitmq.py
│   │   │   │   ├── redis_client.py
│   │   │   │   ├── tally.py
│   │   │   │   ├── tally_test.py
│   │   │   │   ├── understanding.py
│   │   │   │   ├── user.py
│   │   │   │   └── workspace.py
│   │   │   ├── db.py
│   │   │   ├── exec.py
│   │   │   ├── executor/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── activity_status_generator.py
│   │   │   │   ├── activity_status_generator_test.py
│   │   │   │   ├── automod/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── manager.py
│   │   │   │   │   └── models.py
│   │   │   │   ├── cluster_lock.py
│   │   │   │   ├── cluster_lock_test.py
│   │   │   │   ├── manager.py
│   │   │   │   ├── manager_insufficient_funds_test.py
│   │   │   │   ├── manager_low_balance_test.py
│   │   │   │   ├── manager_test.py
│   │   │   │   ├── scheduler.py
│   │   │   │   ├── scheduler_test.py
│   │   │   │   ├── simulator.py
│   │   │   │   ├── utils.py
│   │   │   │   └── utils_test.py
│   │   │   ├── integrations/
│   │   │   │   ├── ayrshare.py
│   │   │   │   ├── credentials_store.py
│   │   │   │   ├── creds_manager.py
│   │   │   │   ├── creds_manager_test.py
│   │   │   │   ├── oauth/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   ├── discord.py
│   │   │   │   │   ├── github.py
│   │   │   │   │   ├── google.py
│   │   │   │   │   ├── notion.py
│   │   │   │   │   ├── reddit.py
│   │   │   │   │   ├── todoist.py
│   │   │   │   │   └── twitter.py
│   │   │   │   ├── providers.py
│   │   │   │   └── webhooks/
│   │   │   │       ├── __init__.py
│   │   │   │       ├── _base.py
│   │   │   │       ├── _manual_base.py
│   │   │   │       ├── compass.py
│   │   │   │       ├── github.py
│   │   │   │       ├── graph_lifecycle_hooks.py
│   │   │   │       ├── slant3d.py
│   │   │   │       ├── telegram.py
│   │   │   │       ├── utils.py
│   │   │   │       └── utils_test.py
│   │   │   ├── monitoring/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── accuracy_monitor.py
│   │   │   │   ├── block_error_monitor.py
│   │   │   │   ├── instrumentation.py
│   │   │   │   ├── late_execution_monitor.py
│   │   │   │   └── notification_monitor.py
│   │   │   ├── notification.py
│   │   │   ├── notifications/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── email.py
│   │   │   │   ├── notifications.py
│   │   │   │   ├── templates/
│   │   │   │   │   ├── agent_approved.html.jinja2
│   │   │   │   │   ├── agent_rejected.html.jinja2
│   │   │   │   │   ├── agent_run.html.jinja2
│   │   │   │   │   ├── base.html.jinja2
│   │   │   │   │   ├── low_balance.html.jinja2
│   │   │   │   │   ├── refund_processed.html.jinja2
│   │   │   │   │   ├── refund_request.html.jinja2
│   │   │   │   │   ├── weekly_summary.html.jinja2
│   │   │   │   │   └── zero_balance.html.jinja2
│   │   │   │   └── test_notifications.py
│   │   │   ├── rest.py
│   │   │   ├── scheduler.py
│   │   │   ├── sdk/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── builder.py
│   │   │   │   ├── cost_integration.py
│   │   │   │   ├── provider.py
│   │   │   │   └── registry.py
│   │   │   ├── usecases/
│   │   │   │   ├── block_autogen.py
│   │   │   │   ├── reddit_marketing.py
│   │   │   │   └── sample.py
│   │   │   ├── util/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── cache.py
│   │   │   │   ├── cache_test.py
│   │   │   │   ├── clients.py
│   │   │   │   ├── cloud_storage.py
│   │   │   │   ├── cloud_storage_test.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── data.py
│   │   │   │   ├── decorator.py
│   │   │   │   ├── decorator_test.py
│   │   │   │   ├── dynamic_fields.py
│   │   │   │   ├── dynamic_fields_test.py
│   │   │   │   ├── encryption.py
│   │   │   │   ├── exceptions.py
│   │   │   │   ├── exceptions_test.py
│   │   │   │   ├── feature_flag.py
│   │   │   │   ├── feature_flag_test.py
│   │   │   │   ├── file.py
│   │   │   │   ├── file_content_parser.py
│   │   │   │   ├── file_content_parser_test.py
│   │   │   │   ├── file_test.py
│   │   │   │   ├── gcs_utils.py
│   │   │   │   ├── json.py
│   │   │   │   ├── logging.py
│   │   │   │   ├── metrics.py
│   │   │   │   ├── mock.py
│   │   │   │   ├── models.py
│   │   │   │   ├── openai_responses.py
│   │   │   │   ├── openai_responses_test.py
│   │   │   │   ├── process.py
│   │   │   │   ├── prompt.py
│   │   │   │   ├── prompt_responses_api_test.py
│   │   │   │   ├── prompt_test.py
│   │   │   │   ├── request.py
│   │   │   │   ├── request_test.py
│   │   │   │   ├── retry.py
│   │   │   │   ├── retry_test.py
│   │   │   │   ├── sandbox_files.py
│   │   │   │   ├── service.py
│   │   │   │   ├── service_test.py
│   │   │   │   ├── settings.py
│   │   │   │   ├── test.py
│   │   │   │   ├── test_json.py
│   │   │   │   ├── text.py
│   │   │   │   ├── text_test.py
│   │   │   │   ├── timezone_name.py
│   │   │   │   ├── timezone_utils.py
│   │   │   │   ├── truncate.py
│   │   │   │   ├── type.py
│   │   │   │   ├── type_test.py
│   │   │   │   ├── virus_scanner.py
│   │   │   │   ├── virus_scanner_test.py
│   │   │   │   ├── workspace.py
│   │   │   │   ├── workspace_storage.py
│   │   │   │   └── workspace_test.py
│   │   │   └── ws.py
│   │   ├── docker-compose.test.yaml
│   │   ├── load-tests/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── configs/
│   │   │   │   ├── environment.js
│   │   │   │   ├── k6-credentials.env.example
│   │   │   │   └── pre-authenticated-tokens.example.js
│   │   │   ├── generate-tokens.js
│   │   │   ├── orchestrator/
│   │   │   │   └── orchestrator.js
│   │   │   └── tests/
│   │   │       ├── api/
│   │   │       │   ├── core-api-test.js
│   │   │       │   └── graph-execution-test.js
│   │   │       ├── basic/
│   │   │       │   ├── connectivity-test.js
│   │   │       │   └── single-endpoint-test.js
│   │   │       ├── comprehensive/
│   │   │       │   └── platform-journey-test.js
│   │   │       └── marketplace/
│   │   │           ├── library-access-test.js
│   │   │           └── public-access-test.js
│   │   ├── migrations/
│   │   │   ├── 20240722143307_migrations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240726131311_node_input_unique_constraint/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240729061216_static_input_link/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240804040801_add_subgraph/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240805115810_add_user_management/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240807123738_add_index_users/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240808095419_add_required_user_ids/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240902223334_add_stats_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240906155206_add_created_at_updated_at/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240914033334_user_credit/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240918163611_add_analytics_tables/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240930151406_reassign_block_ids/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007090536_add_on_delete_platform/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007115713_cascade_graph_deletion/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007175111_move_oauth_creds_to_user_obj/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007175112_add_oauth_creds_user_trigger/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241017180251_add_webhooks_and_their_relation_to_nodes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241030014950_move_integration_creds_to_platform.User/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241030061705_encrypt_user_metadata/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241030063332_drop_all_credentials_from_constant_input/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241103133307_remove_subgraph/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241103144418_graph_exec_stats_list_to_obj/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241108170448_add_api_key_support/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241113104933_remove_scheduler/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241115170707_fix_llm_provider_credentials/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241210013740_add_indexes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241211160646_rename_credit_model_and_add_stripe_customer/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241212141024_agent_store_v2/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241212142024_creator_featured_flag/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241212150828_agent_store_v2_views/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241230102007_update_store_agent_view/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250103143207_add_terminated_execution_status/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250105254106_migrate_brace_to_double_brace_string_format/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250107095812_preset_soft_delete/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250108084101_user_agent_to_library_agent/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250108084305_use_graph_is_active_version/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250110084611_store_index_updates/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250115213557_add_running_balance/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250115382614_reshape_transaction_metadata_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250115432618_add_auto_top_up_config/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250124211747_make_store_listing_version_id_unique/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250203133647_add_image_url/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250205100104_add_profile_trigger/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250205110132_add_missing_profiles/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250212215755_add_user_notifications/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250213110232_migrate_string_json/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250214092857_add_refund_request/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250214101759_add_transaction_types/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250218135013_create_library_agents_for_existing_graphs/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250220111649_add_refund_notifications/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250222014114_add_email_verified_flag_to_user_table/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250223110000_add_onboarding_model/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250227140210_fix_library_presets_relations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250228161607_agent_graph_execution_soft_delete/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250310095931_delete_duplicate_indices/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250316095525_remove_graph_template/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250318043016_update_store_submissions_format/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250325100000_update_user_onboarding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250407181043_refactor_store_relations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250411130000_update_onboarding_step/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250416140000_make_arrays_not_null/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250422125822_add_forked_relation/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250507025350_execution_created_at_index/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250512104735_rename_agent_executor_node_input/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250527091422_node_execution_indexes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250528092000_onboarding_add_runs/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250604130249_optimise_store_agent_and_creator_views/
│   │   │   │   ├── migration.sql
│   │   │   │   └── rollback.sql
│   │   │   ├── 20250620000924_make_data_nullable/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250620140815_add_preset_webhook_relation/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250702224504_add_node_exec_kv_data/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250721073830_add_preset_index/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250721081856_add_missing_fk_indexes_remove_unused_indexes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250805111135_add_video_url_and_categories_to_store_submission_view/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250819163527_add_user_timezone/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250824000317_add_notifications_for_approved_and_denied_agents/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250901104517_fix_api_key_table/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250902171554_add_credentials_to_graph_execution/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250904171522_update_store_agent_view_with_availability/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250905130657_add_recommended_schedule_cron/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250910161617_fix_store_materialized_views_refresh_job/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250912164006_keep_credit_transactions_on_user_delete/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250916191832_add_share_page/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250916193100_add_instructions_field/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250922050939_update_onboarding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250924230049_enhance_graph_and_execution_index/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251003085016_update_store_agent_view_latest_version_only/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251007084233_log_search_terms/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251011120000_add_user_balance_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251013071709_add_use_for_onboarding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251016093049_add_full_text_search/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251027162201_migrate_claude_3_5_to_4_5_models/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251028000000_add_parent_graph_execution_tracking/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251106091413_migrate_deprecated_groq_openrouter_models/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251117102522_add_human_in_the_loop_table/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251126141555_add_api_key_store_permissions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251127092500_add_api_key_tools_permission/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251127144817_add_api_key_integration_permissions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251128112407_add_library_agent_settings/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251204012214_add_marketplace_agent_output_video_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251209182537_add_builder_search/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251212165920_add_oauth_provider_support/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251216182139_fix_store_submission_agent_version/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251217174500_fix_store_agent_versions_to_graph_versions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251218231330_add_oauth_app_logo/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260109181714_add_docs_embedding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260113170839_add_ended_at_to_agent_graph_execution/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260115081736_add_chat_tables/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260115200000_add_unified_search_tsvector/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260115210000_remove_storelistingversion_search/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260121200000_remove_node_execution_fk_from_pending_human_review/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260123110033_add_folders_in_library/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260126120000_migrate_claude_3_7_to_4_5_sonnet/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260127211502_add_visit_copilot_onboarding_step/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260127230419_add_user_workspace/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260129011611_remove_workspace_file_source/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260129090000_add_suggested_blocks_materialized_view/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260225163452_add_library_api_key_permission/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260228114302_improve_store_entity_relations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260303120000_add_block_descriptions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260304123456_update_store_views/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260308095500_migrate_deprecated_gemini_3_pro_preview/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260310090914_add_invite_system/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260310120000_remove_graph_exec_fk_from_pending_human_review/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260311000000_drop_auto_user_trigger/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260312093554_update_invites_indexs/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260313120000_fix_perplexity_block_invalid_models/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260319120000_revert_invite_system/
│   │   │   │   └── migration.sql
│   │   │   └── migration_lock.toml
│   │   ├── pyproject.toml
│   │   ├── schema.prisma
│   │   ├── scripts/
│   │   │   ├── __init__.py
│   │   │   ├── gen_prisma_types_stub.py
│   │   │   ├── generate_block_docs.py
│   │   │   ├── generate_views.py
│   │   │   ├── linter.py
│   │   │   ├── refresh_claude_token.sh
│   │   │   ├── run_tests.py
│   │   │   └── test_generate_block_docs.py
│   │   ├── snapshots/
│   │   │   ├── adm_add_cred_neg
│   │   │   ├── adm_add_cred_ok
│   │   │   ├── adm_usr_hist_empty
│   │   │   ├── adm_usr_hist_filt
│   │   │   ├── adm_usr_hist_ok
│   │   │   ├── admin_add_credits_success
│   │   │   ├── agt_details
│   │   │   ├── agts_by_creator
│   │   │   ├── agts_category
│   │   │   ├── agts_pagination
│   │   │   ├── agts_search
│   │   │   ├── agts_sorted
│   │   │   ├── analytics_log_analytics_complex_data
│   │   │   ├── analytics_log_analytics_success
│   │   │   ├── analytics_log_metric_success
│   │   │   ├── analytics_log_metric_success_improved
│   │   │   ├── analytics_log_metric_various_values
│   │   │   ├── analytics_metric_float_precision
│   │   │   ├── analytics_metric_integer_value
│   │   │   ├── analytics_metric_large_number
│   │   │   ├── analytics_metric_negative_value
│   │   │   ├── analytics_metric_tiny_number
│   │   │   ├── analytics_metric_zero_value
│   │   │   ├── auth_email
│   │   │   ├── auth_user
│   │   │   ├── blks_all
│   │   │   ├── blks_exec
│   │   │   ├── creator_details
│   │   │   ├── creators_pagination
│   │   │   ├── cred_bal
│   │   │   ├── cred_topup_cfg
│   │   │   ├── cred_topup_req
│   │   │   ├── def_agts
│   │   │   ├── def_creators
│   │   │   ├── feat_agts
│   │   │   ├── grph_in_schm
│   │   │   ├── grph_out_schm
│   │   │   ├── grph_single
│   │   │   ├── grph_struct
│   │   │   ├── grphs_all
│   │   │   ├── grphs_del
│   │   │   ├── lib_agts_search
│   │   │   ├── log_anlyt_cplx
│   │   │   ├── log_anlyt_ok
│   │   │   ├── log_metric_ok
│   │   │   ├── log_metric_vals
│   │   │   ├── otto_empty
│   │   │   ├── otto_err
│   │   │   ├── otto_grph
│   │   │   ├── otto_ok
│   │   │   ├── sub
│   │   │   ├── sub_pagination
│   │   │   ├── sub_success
│   │   │   └── unsub
│   │   └── test/
│   │       ├── __init__.py
│   │       ├── agent_generator/
│   │       │   ├── __init__.py
│   │       │   ├── test_library_agents.py
│   │       │   └── test_orchestrator.py
│   │       ├── blocks/
│   │       │   ├── test_gmail.py
│   │       │   ├── test_google_docs_format_text_color.py
│   │       │   ├── test_jina_extract_website.py
│   │       │   ├── test_list_concatenation.py
│   │       │   └── test_youtube.py
│   │       ├── e2e_test_data.py
│   │       ├── load_store_agents.py
│   │       ├── sdk/
│   │       │   ├── __init__.py
│   │       │   ├── _config.py
│   │       │   ├── conftest.py
│   │       │   ├── test_sdk_block_creation.py
│   │       │   ├── test_sdk_patching.py
│   │       │   ├── test_sdk_registry.py
│   │       │   └── test_sdk_webhooks.py
│   │       ├── test_data_creator.py
│   │       └── test_data_updater.py
│   ├── cloudflare_worker.js
│   ├── db/
│   │   └── docker/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── dev/
│   │       │   ├── data.sql
│   │       │   └── docker-compose.dev.yml
│   │       ├── docker-compose.s3.yml
│   │       ├── docker-compose.yml
│   │       ├── reset.sh
│   │       └── volumes/
│   │           ├── api/
│   │           │   └── kong.yml
│   │           ├── db/
│   │           │   ├── _supabase.sql
│   │           │   ├── init/
│   │           │   │   └── data.sql
│   │           │   ├── jwt.sql
│   │           │   ├── logs.sql
│   │           │   ├── pooler.sql
│   │           │   ├── realtime.sql
│   │           │   ├── roles.sql
│   │           │   └── webhooks.sql
│   │           ├── functions/
│   │           │   ├── hello/
│   │           │   │   └── index.ts
│   │           │   └── main/
│   │           │       └── index.ts
│   │           ├── logs/
│   │           │   └── vector.yml
│   │           └── pooler/
│   │               └── pooler.exs
│   ├── docker-compose.platform.yml
│   ├── docker-compose.yml
│   ├── frontend/
│   │   ├── .eslintrc.json
│   │   ├── .gitignore
│   │   ├── .npmrc
│   │   ├── .prettierignore
│   │   ├── .prettierrc
│   │   ├── .storybook/
│   │   │   ├── main.ts
│   │   │   ├── manager.ts
│   │   │   ├── preview.tsx
│   │   │   └── theme.ts
│   │   ├── CLAUDE.md
│   │   ├── CONTRIBUTING.md
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── TESTING.md
│   │   ├── components.json
│   │   ├── instrumentation-client.ts
│   │   ├── next.config.mjs
│   │   ├── orval.config.ts
│   │   ├── package.json
│   │   ├── playwright.config.ts
│   │   ├── pnpm-workspace.yaml
│   │   ├── postcss.config.mjs
│   │   ├── public/
│   │   │   ├── gtag.js
│   │   │   ├── integrations/
│   │   │   │   └── nousresearch.avif
│   │   │   └── mockServiceWorker.js
│   │   ├── scripts/
│   │   │   └── generate-api-queries.ts
│   │   ├── sentry.edge.config.ts
│   │   ├── sentry.server.config.ts
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── (no-navbar)/
│   │   │   │   │   ├── logout/
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── onboarding/
│   │   │   │   │   │   ├── 1-welcome/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 2-reason/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 3-services/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 4-agent/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 5-run/
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AgentOnboardingCredentials/
│   │   │   │   │   │   │   │   │   ├── AgentOnboardingCredentials.tsx
│   │   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   │   ├── RunAgentHint.tsx
│   │   │   │   │   │   │   │   └── SelectedAgentCard.tsx
│   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   │   └── useOnboardingRunStep.tsx
│   │   │   │   │   │   ├── 6-congrats/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── OnboardingAgentCard.tsx
│   │   │   │   │   │   │   ├── OnboardingBackButton.tsx
│   │   │   │   │   │   │   ├── OnboardingButton.tsx
│   │   │   │   │   │   │   ├── OnboardingGrid.tsx
│   │   │   │   │   │   │   ├── OnboardingInput.tsx
│   │   │   │   │   │   │   ├── OnboardingList.tsx
│   │   │   │   │   │   │   ├── OnboardingProgress.tsx
│   │   │   │   │   │   │   ├── OnboardingStep.tsx
│   │   │   │   │   │   │   ├── OnboardingText.tsx
│   │   │   │   │   │   │   └── StarRating.tsx
│   │   │   │   │   │   ├── layout.tsx
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── reset/
│   │   │   │   │   │       └── page.tsx
│   │   │   │   │   └── share/
│   │   │   │   │       ├── [token]/
│   │   │   │   │       │   └── page.tsx
│   │   │   │   │       └── layout.tsx
│   │   │   │   ├── (platform)/
│   │   │   │   │   ├── admin/
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AdminImpersonationBanner.tsx
│   │   │   │   │   │   │   ├── AdminImpersonationPanel.tsx
│   │   │   │   │   │   │   └── useAdminImpersonation.ts
│   │   │   │   │   │   ├── dashboard/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── execution-analytics/
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AnalyticsResultsTable.tsx
│   │   │   │   │   │   │   │   └── ExecutionAnalyticsForm.tsx
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── impersonation/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── layout.tsx
│   │   │   │   │   │   ├── marketplace/
│   │   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AdminAgentsDataTable.tsx
│   │   │   │   │   │   │   │   ├── ApproveRejectButton.tsx
│   │   │   │   │   │   │   │   ├── DownloadAgentButton.tsx
│   │   │   │   │   │   │   │   ├── ExpandleRow.tsx
│   │   │   │   │   │   │   │   └── SearchFilterForm.tsx
│   │   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   │   └── preview/
│   │   │   │   │   │   │       └── [id]/
│   │   │   │   │   │   │           └── page.tsx
│   │   │   │   │   │   ├── settings/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── spending/
│   │   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AddMoneyButton.tsx
│   │   │   │   │   │   │   │   ├── AdminUserGrantHistory.tsx
│   │   │   │   │   │   │   │   └── SearchAndFilterAdminSpending.tsx
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   └── users/
│   │   │   │   │   │       └── page.tsx
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── auth-code-error/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── authorize/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── callback/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   ├── confirm/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   └── integrations/
│   │   │   │   │   │       ├── mcp_callback/
│   │   │   │   │   │       │   └── route.ts
│   │   │   │   │   │       ├── oauth_callback/
│   │   │   │   │   │       │   ├── route.ts
│   │   │   │   │   │       │   └── types.ts
│   │   │   │   │   │       └── setup-wizard/
│   │   │   │   │   │           └── page.tsx
│   │   │   │   │   ├── build/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── CustomNode.test.tsx
│   │   │   │   │   │   │   ├── DraftRecoveryPopup.test.tsx
│   │   │   │   │   │   │   ├── NewBlockMenu.test.tsx
│   │   │   │   │   │   │   ├── NewSaveControl.test.tsx
│   │   │   │   │   │   │   ├── RunGraph.test.tsx
│   │   │   │   │   │   │   ├── blockMenuStore.test.ts
│   │   │   │   │   │   │   ├── controlPanelStore.test.ts
│   │   │   │   │   │   │   ├── copyPasteStore.test.ts
│   │   │   │   │   │   │   ├── edgeStore.test.ts
│   │   │   │   │   │   │   ├── graphStore.test.ts
│   │   │   │   │   │   │   ├── historyStore.test.ts
│   │   │   │   │   │   │   ├── nodeStore.test.ts
│   │   │   │   │   │   │   ├── tutorialStore.test.ts
│   │   │   │   │   │   │   ├── useCopyPaste.test.ts
│   │   │   │   │   │   │   └── useFlow.test.ts
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── BuilderActions/
│   │   │   │   │   │   │   │   ├── BuilderActions.tsx
│   │   │   │   │   │   │   │   └── components/
│   │   │   │   │   │   │   │       ├── AgentOutputs/
│   │   │   │   │   │   │   │       │   └── AgentOutputs.tsx
│   │   │   │   │   │   │   │       ├── CronSchedulerDialog/
│   │   │   │   │   │   │   │       │   ├── CronSchedulerDialog.tsx
│   │   │   │   │   │   │   │       │   └── useCronSchedulerDialog.ts
│   │   │   │   │   │   │   │       ├── PublishToMarketplace/
│   │   │   │   │   │   │   │       │   ├── PublishToMarketplace.tsx
│   │   │   │   │   │   │   │       │   └── usePublishToMarketplace.ts
│   │   │   │   │   │   │   │       ├── RunGraph/
│   │   │   │   │   │   │   │       │   ├── RunGraph.tsx
│   │   │   │   │   │   │   │       │   └── useRunGraph.ts
│   │   │   │   │   │   │   │       ├── RunInputDialog/
│   │   │   │   │   │   │   │       │   ├── RunInputDialog.tsx
│   │   │   │   │   │   │   │       │   └── useRunInputDialog.ts
│   │   │   │   │   │   │   │       └── ScheduleGraph/
│   │   │   │   │   │   │   │           ├── ScheduleGraph.tsx
│   │   │   │   │   │   │   │           └── useScheduleGraph.ts
│   │   │   │   │   │   │   ├── DraftRecoveryDialog/
│   │   │   │   │   │   │   │   ├── DraftRecoveryPopup.tsx
│   │   │   │   │   │   │   │   └── useDraftRecoveryPopup.tsx
│   │   │   │   │   │   │   ├── FloatingSafeModeToogle.tsx
│   │   │   │   │   │   │   ├── FlowEditor/
│   │   │   │   │   │   │   │   ├── ARCHITECTURE_FLOW_EDITOR.md
│   │   │   │   │   │   │   │   ├── Flow/
│   │   │   │   │   │   │   │   │   ├── Flow.tsx
│   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   ├── CustomControl.tsx
│   │   │   │   │   │   │   │   │   │   ├── GraphLoadingBox.tsx
│   │   │   │   │   │   │   │   │   │   ├── RunningBackground.tsx
│   │   │   │   │   │   │   │   │   │   └── TriggerAgentBanner.tsx
│   │   │   │   │   │   │   │   │   ├── flow.css
│   │   │   │   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   │   │   │   └── resolve-collision.ts
│   │   │   │   │   │   │   │   │   ├── useCopyPaste.ts
│   │   │   │   │   │   │   │   │   ├── useDraftManager.ts
│   │   │   │   │   │   │   │   │   ├── useFlow.ts
│   │   │   │   │   │   │   │   │   └── useFlowRealtime.ts
│   │   │   │   │   │   │   │   ├── edges/
│   │   │   │   │   │   │   │   │   ├── CustomEdge.tsx
│   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   ├── JSBeads.tsx
│   │   │   │   │   │   │   │   │   │   └── SVGBeads.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   └── useCustomEdge.ts
│   │   │   │   │   │   │   │   ├── handlers/
│   │   │   │   │   │   │   │   │   ├── NodeHandle.tsx
│   │   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   │   ├── nodes/
│   │   │   │   │   │   │   │   │   ├── CustomNode/
│   │   │   │   │   │   │   │   │   │   ├── CustomNode.tsx
│   │   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   │   ├── AyrshareConnectButton.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeAdvancedToggle.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeBadges.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeContainer.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeContextMenu.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeCost.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeExecutionBadge.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeHeader.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeOutput/
│   │   │   │   │   │   │   │   │   │   │   │   ├── NodeOutput.tsx
│   │   │   │   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   │   │   │   ├── ContentRenderer.tsx
│   │   │   │   │   │   │   │   │   │   │   │   │   ├── NodeDataViewer/
│   │   │   │   │   │   │   │   │   │   │   │   │   │   ├── NodeDataViewer.tsx
│   │   │   │   │   │   │   │   │   │   │   │   │   │   └── useNodeDataViewer.ts
│   │   │   │   │   │   │   │   │   │   │   │   │   └── ViewMoreData.tsx
│   │   │   │   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   │   │   │   └── useNodeOutput.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeRightClickMenu.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── StickyNoteBlock.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── SubAgentUpdate/
│   │   │   │   │   │   │   │   │   │   │   │   ├── SubAgentUpdateFeature.tsx
│   │   │   │   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   │   │   │   ├── IncompatibleUpdateDialog.tsx
│   │   │   │   │   │   │   │   │   │   │   │   │   └── ResolutionModeBar.tsx
│   │   │   │   │   │   │   │   │   │   │   │   └── useSubAgentUpdateState.ts
│   │   │   │   │   │   │   │   │   │   │   └── WebhookDisclaimer.tsx
│   │   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   │   └── useCustomNode.tsx
│   │   │   │   │   │   │   │   │   ├── FormCreator.tsx
│   │   │   │   │   │   │   │   │   ├── OutputHandler.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   ├── uiSchema.ts
│   │   │   │   │   │   │   │   │   └── useBrokenOutputs.ts
│   │   │   │   │   │   │   │   └── tutorial/
│   │   │   │   │   │   │   │       ├── constants.ts
│   │   │   │   │   │   │   │       ├── helpers/
│   │   │   │   │   │   │   │       │   ├── blocks.ts
│   │   │   │   │   │   │   │       │   ├── canvas.ts
│   │   │   │   │   │   │   │       │   ├── connections.ts
│   │   │   │   │   │   │   │       │   ├── dom.ts
│   │   │   │   │   │   │   │       │   ├── highlights.ts
│   │   │   │   │   │   │   │       │   ├── index.ts
│   │   │   │   │   │   │   │       │   ├── menu.ts
│   │   │   │   │   │   │   │       │   ├── save.ts
│   │   │   │   │   │   │   │       │   └── state.ts
│   │   │   │   │   │   │   │       ├── icons.ts
│   │   │   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │   │   │       ├── steps/
│   │   │   │   │   │   │   │       │   ├── block-basics.ts
│   │   │   │   │   │   │   │       │   ├── block-menu.ts
│   │   │   │   │   │   │   │       │   ├── completion.ts
│   │   │   │   │   │   │   │       │   ├── configure-calculator.ts
│   │   │   │   │   │   │   │       │   ├── connections.ts
│   │   │   │   │   │   │   │       │   ├── index.ts
│   │   │   │   │   │   │   │       │   ├── run.ts
│   │   │   │   │   │   │   │       │   ├── save.ts
│   │   │   │   │   │   │   │       │   ├── second-calculator.ts
│   │   │   │   │   │   │   │       │   └── welcome.ts
│   │   │   │   │   │   │   │       ├── styles.ts
│   │   │   │   │   │   │   │       └── tutorial.css
│   │   │   │   │   │   │   ├── MCPToolDialog.tsx
│   │   │   │   │   │   │   ├── NewControlPanel/
│   │   │   │   │   │   │   │   ├── ControlPanelButton.tsx
│   │   │   │   │   │   │   │   ├── NewBlockMenu/
│   │   │   │   │   │   │   │   │   ├── AiBlock.tsx
│   │   │   │   │   │   │   │   │   ├── AllBlocksContent/
│   │   │   │   │   │   │   │   │   │   ├── AllBlocksContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useAllBlockContent.tsx
│   │   │   │   │   │   │   │   │   ├── Block.tsx
│   │   │   │   │   │   │   │   │   ├── BlockList/
│   │   │   │   │   │   │   │   │   │   └── BlockList.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenu/
│   │   │   │   │   │   │   │   │   │   └── BlockMenu.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuContent/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuContent.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuDefault/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuDefault.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuDefaultContent/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuDefaultContent.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuFilters/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuFilters.tsx
│   │   │   │   │   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   │   │   │   ├── BlockMenuSearch/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuSearch.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuSearchBar/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuSearchBar.tsx
│   │   │   │   │   │   │   │   │   │   └── useBlockMenuSearchBar.ts
│   │   │   │   │   │   │   │   │   ├── BlockMenuSearchContent/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuSearchContent.tsx
│   │   │   │   │   │   │   │   │   │   ├── helper.ts
│   │   │   │   │   │   │   │   │   │   └── useBlockMenuSearchContent.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuSidebar/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuSidebar.tsx
│   │   │   │   │   │   │   │   │   │   └── useBlockMenuSidebar.ts
│   │   │   │   │   │   │   │   │   ├── FilterChip.tsx
│   │   │   │   │   │   │   │   │   ├── FilterSheet/
│   │   │   │   │   │   │   │   │   │   ├── FilterSheet.tsx
│   │   │   │   │   │   │   │   │   │   ├── constant.ts
│   │   │   │   │   │   │   │   │   │   └── useFilterSheet.ts
│   │   │   │   │   │   │   │   │   ├── HorizontalScroll.tsx
│   │   │   │   │   │   │   │   │   ├── Integration.tsx
│   │   │   │   │   │   │   │   │   ├── IntegrationBlocks/
│   │   │   │   │   │   │   │   │   │   ├── IntegrationBlocks.tsx
│   │   │   │   │   │   │   │   │   │   └── useIntegrationBlocks.ts
│   │   │   │   │   │   │   │   │   ├── IntegrationChip.tsx
│   │   │   │   │   │   │   │   │   ├── IntegrationsContent/
│   │   │   │   │   │   │   │   │   │   └── IntegrationsContent.tsx
│   │   │   │   │   │   │   │   │   ├── IntergrationBlock.tsx
│   │   │   │   │   │   │   │   │   ├── MarketplaceAgentBlock.tsx
│   │   │   │   │   │   │   │   │   ├── MarketplaceAgentsContent/
│   │   │   │   │   │   │   │   │   │   ├── MarketplaceAgentsContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useMarketplaceAgentsContent.ts
│   │   │   │   │   │   │   │   │   ├── MenuItem.tsx
│   │   │   │   │   │   │   │   │   ├── MyAgentsContent/
│   │   │   │   │   │   │   │   │   │   ├── MyAgentsContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useMyAgentsContent.ts
│   │   │   │   │   │   │   │   │   ├── NoSearchResult.tsx
│   │   │   │   │   │   │   │   │   ├── PaginatedBlocksContent/
│   │   │   │   │   │   │   │   │   │   ├── PaginatedBlocksContent.tsx
│   │   │   │   │   │   │   │   │   │   └── usePaginatedBlocks.ts
│   │   │   │   │   │   │   │   │   ├── PaginatedIntegrationList/
│   │   │   │   │   │   │   │   │   │   ├── PaginatedIntegrationList.tsx
│   │   │   │   │   │   │   │   │   │   └── usePaginatedIntegrationList.ts
│   │   │   │   │   │   │   │   │   ├── SearchHistoryChip.tsx
│   │   │   │   │   │   │   │   │   ├── SuggestionContent/
│   │   │   │   │   │   │   │   │   │   ├── SuggestionContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useSuggestionContent.ts
│   │   │   │   │   │   │   │   │   ├── UGCAgentBlock.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.tsx
│   │   │   │   │   │   │   │   │   ├── hooks/
│   │   │   │   │   │   │   │   │   │   └── useAddAgentToBuilder.ts
│   │   │   │   │   │   │   │   │   ├── style.ts
│   │   │   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   │   │   ├── NewControlPanel.tsx
│   │   │   │   │   │   │   │   ├── NewSaveControl/
│   │   │   │   │   │   │   │   │   ├── NewSaveControl.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   └── useNewSaveControl.ts
│   │   │   │   │   │   │   │   ├── NewSearchGraph/
│   │   │   │   │   │   │   │   │   ├── GraphMenu/
│   │   │   │   │   │   │   │   │   │   ├── GraphMenu.tsx
│   │   │   │   │   │   │   │   │   │   └── useGraphMenu.ts
│   │   │   │   │   │   │   │   │   ├── GraphMenuContent/
│   │   │   │   │   │   │   │   │   │   ├── GraphContent.tsx
│   │   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   │   └── useGraphContent.ts
│   │   │   │   │   │   │   │   │   └── GraphMenuSearchBar/
│   │   │   │   │   │   │   │   │       ├── GraphMenuSearchBar.tsx
│   │   │   │   │   │   │   │   │       ├── useGraphMenuSearchBar.tsx
│   │   │   │   │   │   │   │   │       └── useGraphMenuSearchBarComponent.ts
│   │   │   │   │   │   │   │   ├── UndoRedoButtons.tsx
│   │   │   │   │   │   │   │   └── useGraphSearchShortcut.ts
│   │   │   │   │   │   │   ├── helper.ts
│   │   │   │   │   │   │   ├── legacy-builder/
│   │   │   │   │   │   │   │   ├── agent-run-draft-view.tsx
│   │   │   │   │   │   │   │   └── agent-status-chip.tsx
│   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   ├── hooks/
│   │   │   │   │   │   │   ├── useCopyPasteKeyboard.ts
│   │   │   │   │   │   │   ├── useSaveGraph.ts
│   │   │   │   │   │   │   └── useSubAgentUpdate/
│   │   │   │   │   │   │       ├── helpers.ts
│   │   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │   │       ├── types.ts
│   │   │   │   │   │   │       └── useSubAgentUpdate.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── stores/
│   │   │   │   │   │       ├── blockMenuStore.ts
│   │   │   │   │   │       ├── controlPanelStore.ts
│   │   │   │   │   │       ├── copyPasteStore.ts
│   │   │   │   │   │       ├── edgeStore.ts
│   │   │   │   │   │       ├── graphStore.ts
│   │   │   │   │   │       ├── helpers.ts
│   │   │   │   │   │       ├── historyStore.ts
│   │   │   │   │   │       ├── nodeStore.ts
│   │   │   │   │   │       ├── tutorialStore.ts
│   │   │   │   │   │       └── types.ts
│   │   │   │   │   ├── copilot/
│   │   │   │   │   │   ├── CopilotPage.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AgentSavedCard/
│   │   │   │   │   │   │   │   └── AgentSavedCard.tsx
│   │   │   │   │   │   │   ├── ChatContainer/
│   │   │   │   │   │   │   │   └── ChatContainer.tsx
│   │   │   │   │   │   │   ├── ChatInput/
│   │   │   │   │   │   │   │   ├── ChatInput.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AttachmentMenu.tsx
│   │   │   │   │   │   │   │   │   ├── AudioWaveform.tsx
│   │   │   │   │   │   │   │   │   ├── FileChips.tsx
│   │   │   │   │   │   │   │   │   ├── RecordingButton.tsx
│   │   │   │   │   │   │   │   │   └── RecordingIndicator.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   ├── useChatInput.ts
│   │   │   │   │   │   │   │   └── useVoiceRecording.ts
│   │   │   │   │   │   │   ├── ChatMessagesContainer/
│   │   │   │   │   │   │   │   ├── ChatMessagesContainer.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AssistantMessageActions.tsx
│   │   │   │   │   │   │   │   │   ├── CollapsedToolGroup.tsx
│   │   │   │   │   │   │   │   │   ├── CopyButton.tsx
│   │   │   │   │   │   │   │   │   ├── FeedbackModal.tsx
│   │   │   │   │   │   │   │   │   ├── MessageAttachments.tsx
│   │   │   │   │   │   │   │   │   ├── MessagePartRenderer.tsx
│   │   │   │   │   │   │   │   │   ├── ReasoningCollapse.tsx
│   │   │   │   │   │   │   │   │   ├── TTSButton.tsx
│   │   │   │   │   │   │   │   │   └── ThinkingIndicator.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useMessageFeedback.ts
│   │   │   │   │   │   │   ├── ChatSidebar/
│   │   │   │   │   │   │   │   ├── ChatSidebar.tsx
│   │   │   │   │   │   │   │   └── components/
│   │   │   │   │   │   │   │       └── NotificationToggle/
│   │   │   │   │   │   │   │           └── NotificationToggle.tsx
│   │   │   │   │   │   │   ├── CopilotChatActionsProvider/
│   │   │   │   │   │   │   │   ├── CopilotChatActionsProvider.tsx
│   │   │   │   │   │   │   │   └── useCopilotChatActions.ts
│   │   │   │   │   │   │   ├── CopilotPendingReviews/
│   │   │   │   │   │   │   │   └── CopilotPendingReviews.tsx
│   │   │   │   │   │   │   ├── DeleteChatDialog/
│   │   │   │   │   │   │   │   └── DeleteChatDialog.tsx
│   │   │   │   │   │   │   ├── EmptySession/
│   │   │   │   │   │   │   │   ├── EmptySession.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── JobStatsBar/
│   │   │   │   │   │   │   │   ├── TurnStatsBar.tsx
│   │   │   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   │   │   └── useWorkDoneCounters.ts
│   │   │   │   │   │   │   ├── MiniGame/
│   │   │   │   │   │   │   │   ├── MiniGame.tsx
│   │   │   │   │   │   │   │   └── useMiniGame.ts
│   │   │   │   │   │   │   ├── MobileDrawer/
│   │   │   │   │   │   │   │   └── MobileDrawer.tsx
│   │   │   │   │   │   │   ├── MobileHeader/
│   │   │   │   │   │   │   │   └── MobileHeader.tsx
│   │   │   │   │   │   │   ├── MorphingTextAnimation/
│   │   │   │   │   │   │   │   └── MorphingTextAnimation.tsx
│   │   │   │   │   │   │   ├── NotificationBanner/
│   │   │   │   │   │   │   │   └── NotificationBanner.tsx
│   │   │   │   │   │   │   ├── NotificationDialog/
│   │   │   │   │   │   │   │   └── NotificationDialog.tsx
│   │   │   │   │   │   │   ├── OrbitLoader/
│   │   │   │   │   │   │   │   ├── OrbitLoader.module.css
│   │   │   │   │   │   │   │   └── OrbitLoader.tsx
│   │   │   │   │   │   │   ├── ProgressBar/
│   │   │   │   │   │   │   │   └── ProgressBar.tsx
│   │   │   │   │   │   │   ├── PulseLoader/
│   │   │   │   │   │   │   │   ├── PulseLoader.module.css
│   │   │   │   │   │   │   │   └── PulseLoader.tsx
│   │   │   │   │   │   │   ├── ScaleLoader/
│   │   │   │   │   │   │   │   ├── ScaleLoader.module.css
│   │   │   │   │   │   │   │   └── ScaleLoader.tsx
│   │   │   │   │   │   │   ├── SpinnerLoader/
│   │   │   │   │   │   │   │   ├── SpinnerLoader.module.css
│   │   │   │   │   │   │   │   └── SpinnerLoader.tsx
│   │   │   │   │   │   │   ├── ToolAccordion/
│   │   │   │   │   │   │   │   ├── AccordionContent.tsx
│   │   │   │   │   │   │   │   ├── ToolAccordion.tsx
│   │   │   │   │   │   │   │   └── useToolAccordion.ts
│   │   │   │   │   │   │   ├── ToolErrorCard/
│   │   │   │   │   │   │   │   └── ToolErrorCard.tsx
│   │   │   │   │   │   │   └── UsageLimits/
│   │   │   │   │   │   │       ├── UsageLimits.tsx
│   │   │   │   │   │   │       ├── UsagePanelContent.tsx
│   │   │   │   │   │   │       └── __tests__/
│   │   │   │   │   │   │           └── UsageLimits.test.tsx
│   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   └── convertChatSessionToUiMessages.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   ├── store.ts
│   │   │   │   │   │   ├── styleguide/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── tools/
│   │   │   │   │   │   │   ├── ConnectIntegrationTool/
│   │   │   │   │   │   │   │   └── ConnectIntegrationTool.tsx
│   │   │   │   │   │   │   ├── CreateAgent/
│   │   │   │   │   │   │   │   ├── CreateAgent.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── ClarificationQuestionsCard.tsx
│   │   │   │   │   │   │   │   │   └── SuggestedGoalCard.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── EditAgent/
│   │   │   │   │   │   │   │   ├── EditAgent.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FeatureRequests/
│   │   │   │   │   │   │   │   ├── FeatureRequests.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FindAgents/
│   │   │   │   │   │   │   │   ├── FindAgents.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FindBlocks/
│   │   │   │   │   │   │   │   ├── FindBlocks.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FolderTool/
│   │   │   │   │   │   │   │   ├── FolderTool.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── GenericTool/
│   │   │   │   │   │   │   │   ├── GenericTool.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── RunAgent/
│   │   │   │   │   │   │   │   ├── RunAgent.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AgentDetailsCard/
│   │   │   │   │   │   │   │   │   │   ├── AgentDetailsCard.tsx
│   │   │   │   │   │   │   │   │   │   ├── helpers.test.ts
│   │   │   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   │   │   ├── ErrorCard/
│   │   │   │   │   │   │   │   │   │   └── ErrorCard.tsx
│   │   │   │   │   │   │   │   │   ├── ExecutionStartedCard/
│   │   │   │   │   │   │   │   │   │   └── ExecutionStartedCard.tsx
│   │   │   │   │   │   │   │   │   └── SetupRequirementsCard/
│   │   │   │   │   │   │   │   │       ├── SetupRequirementsCard.tsx
│   │   │   │   │   │   │   │   │       └── helpers.ts
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── RunBlock/
│   │   │   │   │   │   │   │   ├── RunBlock.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── BlockDetailsCard/
│   │   │   │   │   │   │   │   │   │   └── BlockDetailsCard.tsx
│   │   │   │   │   │   │   │   │   ├── BlockInputCard/
│   │   │   │   │   │   │   │   │   │   └── BlockInputCard.tsx
│   │   │   │   │   │   │   │   │   ├── BlockOutputCard/
│   │   │   │   │   │   │   │   │   │   └── BlockOutputCard.tsx
│   │   │   │   │   │   │   │   │   ├── ErrorCard/
│   │   │   │   │   │   │   │   │   │   └── ErrorCard.tsx
│   │   │   │   │   │   │   │   │   └── SetupRequirementsCard/
│   │   │   │   │   │   │   │   │       ├── SetupRequirementsCard.tsx
│   │   │   │   │   │   │   │   │       └── helpers.ts
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── RunMCPTool/
│   │   │   │   │   │   │   │   ├── RunMCPTool.tsx
│   │   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   │   └── helpers.test.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── MCPSetupCard/
│   │   │   │   │   │   │   │   │   │   ├── MCPSetupCard.tsx
│   │   │   │   │   │   │   │   │   │   └── __tests__/
│   │   │   │   │   │   │   │   │   │       └── MCPSetupCard.test.tsx
│   │   │   │   │   │   │   │   │   └── MCPToolOutputCard/
│   │   │   │   │   │   │   │   │       ├── MCPToolOutputCard.tsx
│   │   │   │   │   │   │   │   │       └── __tests__/
│   │   │   │   │   │   │   │   │           └── MCPToolOutputCard.test.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── SearchDocs/
│   │   │   │   │   │   │   │   ├── SearchDocs.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── ViewAgentOutput/
│   │   │   │   │   │   │   │   ├── ViewAgentOutput.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── clarifying-questions.test.ts
│   │   │   │   │   │   │   └── clarifying-questions.ts
│   │   │   │   │   │   ├── useChatSession.ts
│   │   │   │   │   │   ├── useCopilotNotifications.ts
│   │   │   │   │   │   ├── useCopilotPage.ts
│   │   │   │   │   │   ├── useCopilotStream.ts
│   │   │   │   │   │   └── useWorkflowImportAutoSubmit.ts
│   │   │   │   │   ├── dictionaries/
│   │   │   │   │   │   ├── en.json
│   │   │   │   │   │   └── es.json
│   │   │   │   │   ├── error/
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── error.tsx
│   │   │   │   │   ├── health/
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── layout.tsx
│   │   │   │   │   ├── library/
│   │   │   │   │   │   ├── agents/
│   │   │   │   │   │   │   └── [id]/
│   │   │   │   │   │   │       ├── components/
│   │   │   │   │   │   │       │   └── NewAgentLibraryView/
│   │   │   │   │   │   │       │       ├── NewAgentLibraryView.tsx
│   │   │   │   │   │   │       │       ├── components/
│   │   │   │   │   │   │       │       │   ├── AgentVersionChangelog.tsx
│   │   │   │   │   │   │       │       │   ├── modals/
│   │   │   │   │   │   │       │       │   │   ├── AgentInputsReadOnly/
│   │   │   │   │   │   │       │       │   │   │   ├── AgentInputsReadOnly.tsx
│   │   │   │   │   │   │       │       │   │   │   └── helpers.ts
│   │   │   │   │   │   │       │       │   │   ├── AgentSettingsModal/
│   │   │   │   │   │   │       │       │   │   │   └── AgentSettingsModal.tsx
│   │   │   │   │   │   │       │       │   │   ├── RunAgentInputs/
│   │   │   │   │   │   │       │       │   │   │   ├── RunAgentInputs.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useRunAgentInputs.ts
│   │   │   │   │   │   │       │       │   │   ├── RunAgentModal/
│   │   │   │   │   │   │       │       │   │   │   ├── RunAgentModal.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── AIAgentSafetyPopup/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── AIAgentSafetyPopup.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── ModalHeader/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── ModalHeader.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── ModalRunSection/
│   │   │   │   │   │   │       │       │   │   │   │   │   ├── ModalRunSection.tsx
│   │   │   │   │   │   │       │       │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │       │       │   │   │   │   ├── ModalSection/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── ModalSection.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunActions/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── RunActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── WebhookTriggerBanner/
│   │   │   │   │   │   │       │       │   │   │   │       └── WebhookTriggerBanner.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── context.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── errorHelpers.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── helpers.ts
│   │   │   │   │   │   │       │       │   │   │   └── useAgentRunModal.tsx
│   │   │   │   │   │   │       │       │   │   └── ScheduleAgentModal/
│   │   │   │   │   │   │       │       │   │       ├── ScheduleAgentModal.tsx
│   │   │   │   │   │   │       │       │   │       ├── components/
│   │   │   │   │   │   │       │       │   │       │   ├── CronScheduler/
│   │   │   │   │   │   │       │       │   │       │   │   ├── CronScheduler.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── CustomInterval.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── FrequencySelect.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── MonthlyPicker.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── TimeAt.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── WeeklyPicker.tsx
│   │   │   │   │   │   │       │       │   │       │   │   └── YearlyPicker.tsx
│   │   │   │   │   │   │       │       │   │       │   ├── ModalScheduleSection/
│   │   │   │   │   │   │       │       │   │       │   │   ├── ModalScheduleSection.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── helpers.ts
│   │   │   │   │   │   │       │       │   │       │   │   └── useModalScheduleSection.ts
│   │   │   │   │   │   │       │       │   │       │   └── TimezoneNotice/
│   │   │   │   │   │   │       │       │   │       │       └── TimezoneNotice.tsx
│   │   │   │   │   │   │       │       │   │       └── useScheduleAgentModal.ts
│   │   │   │   │   │   │       │       │   ├── other/
│   │   │   │   │   │   │       │       │   │   ├── AgentRunsLoading.tsx
│   │   │   │   │   │   │       │       │   │   ├── AgentSettingsButton.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptySchedules.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptySchedulesIllustration.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTasks.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTasksIllustration.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTemplates.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTriggers.tsx
│   │   │   │   │   │   │       │       │   │   ├── MarketplaceBanners.tsx
│   │   │   │   │   │   │       │       │   │   └── SectionWrap.tsx
│   │   │   │   │   │   │       │       │   ├── selected-views/
│   │   │   │   │   │   │       │       │   │   ├── AgentActionsDropdown.tsx
│   │   │   │   │   │   │       │       │   │   ├── LoadingSelectedContent.tsx
│   │   │   │   │   │   │       │       │   │   ├── OutputRenderers/
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── OutputActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── OutputItem.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── index.ts
│   │   │   │   │   │   │       │       │   │   │   ├── renderers/
│   │   │   │   │   │   │       │       │   │   │   │   ├── CodeRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── ImageRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── JSONRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── MarkdownRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── TextRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── VideoRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── types.ts
│   │   │   │   │   │   │       │       │   │   │   └── utils/
│   │   │   │   │   │   │       │       │   │   │       ├── copy.ts
│   │   │   │   │   │   │       │       │   │   │       └── download.ts
│   │   │   │   │   │   │       │       │   │   ├── RunDetailCard/
│   │   │   │   │   │   │       │       │   │   │   └── RunDetailCard.tsx
│   │   │   │   │   │   │       │       │   │   ├── RunDetailHeader/
│   │   │   │   │   │   │       │       │   │   │   ├── RunDetailHeader.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useScheduleDetailHeader.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedActionsWrap.tsx
│   │   │   │   │   │   │       │       │   │   ├── SelectedRunView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedRunView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── CreateTemplateModal/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── CreateTemplateModal.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunOutputs.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunStatusBadge.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunSummary.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── SafeModeToggle.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── SelectedRunActions/
│   │   │   │   │   │   │       │       │   │   │   │   │   ├── SelectedRunActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   │   └── useSelectedRunActions.ts
│   │   │   │   │   │   │       │       │   │   │   │   └── WebhookTriggerSection.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedRunView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedScheduleView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedScheduleView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── DeleteScheduleButton/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── DeleteScheduleButton.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── EditScheduleModal/
│   │   │   │   │   │   │       │       │   │   │   │   │   ├── EditScheduleModal.tsx
│   │   │   │   │   │   │       │       │   │   │   │   │   └── useEditScheduleModal.ts
│   │   │   │   │   │   │       │       │   │   │   │   └── SelectedScheduleActions/
│   │   │   │   │   │   │       │       │   │   │   │       ├── SelectedScheduleActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │       └── useSelectedScheduleActions.ts
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedScheduleView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedSettingsView/
│   │   │   │   │   │   │       │       │   │   │   └── SelectedSettingsView.tsx
│   │   │   │   │   │   │       │       │   │   ├── SelectedTemplateView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedTemplateView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── SelectedTemplateActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── WebhookTriggerCard.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedTemplateView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedTriggerView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedTriggerView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   └── SelectedTriggerActions.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedTriggerView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedViewLayout.tsx
│   │   │   │   │   │   │       │       │   │   └── ShareRunButton/
│   │   │   │   │   │   │       │       │   │       ├── ShareRunButton.tsx
│   │   │   │   │   │   │       │       │   │       └── useShareRunButton.ts
│   │   │   │   │   │   │       │       │   └── sidebar/
│   │   │   │   │   │   │       │       │       └── SidebarRunsList/
│   │   │   │   │   │   │       │       │           ├── SidebarRunsList.tsx
│   │   │   │   │   │   │       │       │           ├── components/
│   │   │   │   │   │   │       │       │           │   ├── IconWrapper.tsx
│   │   │   │   │   │   │       │       │           │   ├── ScheduleActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   ├── ScheduleListItem.tsx
│   │   │   │   │   │   │       │       │           │   ├── SidebarItemCard.tsx
│   │   │   │   │   │   │       │       │           │   ├── TaskActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   ├── TaskListItem.tsx
│   │   │   │   │   │   │       │       │           │   ├── TemplateActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   ├── TemplateListItem.tsx
│   │   │   │   │   │   │       │       │           │   ├── TriggerActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   └── TriggerListItem.tsx
│   │   │   │   │   │   │       │       │           └── useSidebarRunsList.ts
│   │   │   │   │   │   │       │       ├── helpers.ts
│   │   │   │   │   │   │       │       ├── hooks/
│   │   │   │   │   │   │       │       │   └── useMarketplaceUpdate.ts
│   │   │   │   │   │   │       │       └── useNewAgentLibraryView.ts
│   │   │   │   │   │   │       ├── loading.tsx
│   │   │   │   │   │   │       └── page.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── FlyingHeart/
│   │   │   │   │   │   │   │   └── FlyingHeart.tsx
│   │   │   │   │   │   │   ├── JumpBackIn/
│   │   │   │   │   │   │   │   ├── JumpBackIn.tsx
│   │   │   │   │   │   │   │   └── useJumpBackIn.ts
│   │   │   │   │   │   │   ├── LazyEmojiPicker.tsx
│   │   │   │   │   │   │   ├── LibraryActionHeader/
│   │   │   │   │   │   │   │   └── LibraryActionHeader.tsx
│   │   │   │   │   │   │   ├── LibraryActionSubHeader/
│   │   │   │   │   │   │   │   └── LibraryActionSubHeader.tsx
│   │   │   │   │   │   │   ├── LibraryAgentCard/
│   │   │   │   │   │   │   │   ├── LibraryAgentCard.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AgentCardMenu.tsx
│   │   │   │   │   │   │   │   │   └── FavoriteButton.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useLibraryAgentCard.ts
│   │   │   │   │   │   │   ├── LibraryAgentList/
│   │   │   │   │   │   │   │   ├── LibraryAgentList.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useLibraryAgentList.ts
│   │   │   │   │   │   │   ├── LibraryFolder/
│   │   │   │   │   │   │   │   ├── FolderIcon.tsx
│   │   │   │   │   │   │   │   └── LibraryFolder.tsx
│   │   │   │   │   │   │   ├── LibraryFolderCreationDialog/
│   │   │   │   │   │   │   │   └── LibraryFolderCreationDialog.tsx
│   │   │   │   │   │   │   ├── LibraryFolderDeleteDialog/
│   │   │   │   │   │   │   │   └── LibraryFolderDeleteDialog.tsx
│   │   │   │   │   │   │   ├── LibraryFolderEditDialog/
│   │   │   │   │   │   │   │   └── LibraryFolderEditDialog.tsx
│   │   │   │   │   │   │   ├── LibraryImportDialog/
│   │   │   │   │   │   │   │   ├── LibraryImportDialog.tsx
│   │   │   │   │   │   │   │   └── components/
│   │   │   │   │   │   │   │       ├── AgentUploadTab/
│   │   │   │   │   │   │   │       │   └── AgentUploadTab.tsx
│   │   │   │   │   │   │   │       └── ExternalWorkflowTab/
│   │   │   │   │   │   │   │           ├── ExternalWorkflowTab.tsx
│   │   │   │   │   │   │   │           ├── fetchWorkflowFromUrl.ts
│   │   │   │   │   │   │   │           └── useExternalWorkflowTab.ts
│   │   │   │   │   │   │   ├── LibrarySearchBar/
│   │   │   │   │   │   │   │   ├── LibrarySearchBar.tsx
│   │   │   │   │   │   │   │   └── useLibrarySearchbar.tsx
│   │   │   │   │   │   │   ├── LibrarySortMenu/
│   │   │   │   │   │   │   │   ├── LibrarySortMenu.tsx
│   │   │   │   │   │   │   │   └── useLibrarySortMenu.ts
│   │   │   │   │   │   │   ├── LibrarySubSection/
│   │   │   │   │   │   │   │   └── LibrarySubSection.tsx
│   │   │   │   │   │   │   ├── LibraryUploadAgentDialog/
│   │   │   │   │   │   │   │   ├── LibraryUploadAgentDialog.tsx
│   │   │   │   │   │   │   │   └── useLibraryUploadAgentDialog.ts
│   │   │   │   │   │   │   ├── MoveToFolderDialog/
│   │   │   │   │   │   │   │   └── MoveToFolderDialog.tsx
│   │   │   │   │   │   │   ├── folder-constants.ts
│   │   │   │   │   │   │   └── useLibraryListPage.ts
│   │   │   │   │   │   ├── context/
│   │   │   │   │   │   │   └── FavoriteAnimationContext.tsx
│   │   │   │   │   │   ├── hooks/
│   │   │   │   │   │   │   └── useFavoriteAgents.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── login/
│   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   └── LoadingLogin.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── useLoginPage.ts
│   │   │   │   │   ├── marketplace/
│   │   │   │   │   │   ├── agent/
│   │   │   │   │   │   │   └── [creator]/
│   │   │   │   │   │   │       └── [slug]/
│   │   │   │   │   │   │           └── page.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AddToLibraryButton/
│   │   │   │   │   │   │   │   └── AddToLibraryButton.tsx
│   │   │   │   │   │   │   ├── AgentImageItem/
│   │   │   │   │   │   │   │   ├── AgentImageItem.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useAgentImageItem.ts
│   │   │   │   │   │   │   ├── AgentImages/
│   │   │   │   │   │   │   │   ├── AgentImage.tsx
│   │   │   │   │   │   │   │   └── useAgentImage.ts
│   │   │   │   │   │   │   ├── AgentInfo/
│   │   │   │   │   │   │   │   ├── AgentInfo.tsx
│   │   │   │   │   │   │   │   └── useAgentInfo.ts
│   │   │   │   │   │   │   ├── AgentPageLoading.tsx
│   │   │   │   │   │   │   ├── AgentsSection/
│   │   │   │   │   │   │   │   ├── AgentsSection.tsx
│   │   │   │   │   │   │   │   └── useAgentsSection.ts
│   │   │   │   │   │   │   ├── BecomeACreator/
│   │   │   │   │   │   │   │   └── BecomeACreator.tsx
│   │   │   │   │   │   │   ├── CreatorCard/
│   │   │   │   │   │   │   │   ├── CreatorCard.tsx
│   │   │   │   │   │   │   │   └── helper.ts
│   │   │   │   │   │   │   ├── CreatorInfoCard/
│   │   │   │   │   │   │   │   └── CreatorInfoCard.tsx
│   │   │   │   │   │   │   ├── CreatorLinks/
│   │   │   │   │   │   │   │   └── CreatorLinks.tsx
│   │   │   │   │   │   │   ├── CreatorPageLoading.tsx
│   │   │   │   │   │   │   ├── FeaturedAgentCard/
│   │   │   │   │   │   │   │   └── FeaturedAgentCard.tsx
│   │   │   │   │   │   │   ├── FeaturedCreators/
│   │   │   │   │   │   │   │   ├── FeaturedCreators.tsx
│   │   │   │   │   │   │   │   └── useFeaturedCreators.ts
│   │   │   │   │   │   │   ├── FeaturedSection/
│   │   │   │   │   │   │   │   ├── FeaturedSection.tsx
│   │   │   │   │   │   │   │   └── useFeaturedSection.ts
│   │   │   │   │   │   │   ├── FilterChips/
│   │   │   │   │   │   │   │   ├── FilterChips.tsx
│   │   │   │   │   │   │   │   └── useFilterChips.ts
│   │   │   │   │   │   │   ├── HeroSection/
│   │   │   │   │   │   │   │   ├── HeroSection.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useHeroSection.ts
│   │   │   │   │   │   │   ├── MainAgentPage/
│   │   │   │   │   │   │   │   ├── MainAgentPage.tsx
│   │   │   │   │   │   │   │   └── useMainAgentPage.ts
│   │   │   │   │   │   │   ├── MainMarketplacePage/
│   │   │   │   │   │   │   │   ├── MainMarketplacePage.tsx
│   │   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   │   └── main.test.tsx
│   │   │   │   │   │   │   │   └── useMainMarketplacePage.ts
│   │   │   │   │   │   │   ├── MainMarketplacePageLoading.tsx
│   │   │   │   │   │   │   ├── MainSearchResultPageLoading.tsx
│   │   │   │   │   │   │   ├── SearchBar/
│   │   │   │   │   │   │   │   ├── SearchBar.tsx
│   │   │   │   │   │   │   │   └── useSearchBar.ts
│   │   │   │   │   │   │   └── StoreCard/
│   │   │   │   │   │   │       └── StoreCard.tsx
│   │   │   │   │   │   ├── creator/
│   │   │   │   │   │   │   └── [creator]/
│   │   │   │   │   │   │       ├── components/
│   │   │   │   │   │   │       │   └── MainCreatorPage/
│   │   │   │   │   │   │       │       ├── MainCreatorPage.tsx
│   │   │   │   │   │   │       │       └── useMainCreatorPage.ts
│   │   │   │   │   │   │       └── page.tsx
│   │   │   │   │   │   ├── loading.tsx
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── search/
│   │   │   │   │   │       ├── components/
│   │   │   │   │   │       │   └── MainSearchResultPage/
│   │   │   │   │   │       │       ├── MainSearchResultPage.tsx
│   │   │   │   │   │       │       └── useMainSearchResultPage.ts
│   │   │   │   │   │       └── page.tsx
│   │   │   │   │   ├── profile/
│   │   │   │   │   │   └── (user)/
│   │   │   │   │   │       ├── ProfileLoading.tsx
│   │   │   │   │   │       ├── api-keys/
│   │   │   │   │   │       │   ├── components/
│   │   │   │   │   │       │   │   ├── APIKeySection/
│   │   │   │   │   │       │   │   │   ├── APIKeySection.tsx
│   │   │   │   │   │       │   │   │   └── useAPISection.ts
│   │   │   │   │   │       │   │   └── APIKeysModals/
│   │   │   │   │   │       │   │       ├── APIKeysModals.tsx
│   │   │   │   │   │       │   │       └── useAPIkeysModals.ts
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── credits/
│   │   │   │   │   │       │   ├── RefundModal.tsx
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── components/
│   │   │   │   │   │       │   │   ├── AgentTable/
│   │   │   │   │   │       │   │   │   └── AgentTable.tsx
│   │   │   │   │   │       │   │   ├── AgentTableCard/
│   │   │   │   │   │       │   │   │   └── AgentTableCard.tsx
│   │   │   │   │   │       │   │   ├── AgentTableRow/
│   │   │   │   │   │       │   │   │   ├── AgentTableRow.tsx
│   │   │   │   │   │       │   │   │   └── useAgentTableRow.ts
│   │   │   │   │   │       │   │   └── MainDashboardPage/
│   │   │   │   │   │       │   │       ├── MainDashboardPage.tsx
│   │   │   │   │   │       │   │       ├── components/
│   │   │   │   │   │       │   │       │   ├── EmptySubmissions.tsx
│   │   │   │   │   │       │   │       │   ├── SubmissionsLoading.tsx
│   │   │   │   │   │       │   │       │   └── SumbmissionLoadError.tsx
│   │   │   │   │   │       │   │       └── useMainDashboardPage.ts
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── integrations/
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── layout.tsx
│   │   │   │   │   │       ├── oauth-apps/
│   │   │   │   │   │       │   ├── components/
│   │   │   │   │   │       │   │   ├── OAuthAppsSection.tsx
│   │   │   │   │   │       │   │   └── useOAuthApps.ts
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── page.tsx
│   │   │   │   │   │       └── settings/
│   │   │   │   │   │           ├── components/
│   │   │   │   │   │           │   └── SettingsForm/
│   │   │   │   │   │           │       ├── SettingsForm.tsx
│   │   │   │   │   │           │       └── components/
│   │   │   │   │   │           │           ├── EmailForm/
│   │   │   │   │   │           │           │   ├── EmailForm.tsx
│   │   │   │   │   │           │           │   ├── actions.ts
│   │   │   │   │   │           │           │   └── useEmailForm.ts
│   │   │   │   │   │           │           ├── NotificationForm/
│   │   │   │   │   │           │           │   ├── NotificationForm.tsx
│   │   │   │   │   │           │           │   └── useNotificationForm.ts
│   │   │   │   │   │           │           └── TimezoneForm/
│   │   │   │   │   │           │               ├── TimezoneForm.tsx
│   │   │   │   │   │           │               ├── helpers.ts
│   │   │   │   │   │           │               └── useTimezoneForm.ts
│   │   │   │   │   │           ├── loading.tsx
│   │   │   │   │   │           ├── page.tsx
│   │   │   │   │   │           └── useTimezoneDetection.ts
│   │   │   │   │   ├── reset-password/
│   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── signup/
│   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   └── LoadingSignup.tsx
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── useSignupPage.ts
│   │   │   │   │   └── unauthorized/
│   │   │   │   │       └── page.tsx
│   │   │   │   ├── api/
│   │   │   │   │   ├── __generated__/
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── blockOutputResponse.ts
│   │   │   │   │   │       └── graphExecutionMeta.ts
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── callback/
│   │   │   │   │   │   │   └── reset-password/
│   │   │   │   │   │   │       └── route.ts
│   │   │   │   │   │   ├── provider/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   ├── user/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── chat/
│   │   │   │   │   │   ├── sessions/
│   │   │   │   │   │   │   └── [sessionId]/
│   │   │   │   │   │   │       └── stream/
│   │   │   │   │   │   │           └── route.ts
│   │   │   │   │   │   └── sse-helpers.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── mutators/
│   │   │   │   │   │   ├── custom-mutator.ts
│   │   │   │   │   │   └── date-transformer.ts
│   │   │   │   │   ├── openapi.json
│   │   │   │   │   ├── proxy/
│   │   │   │   │   │   └── [...path]/
│   │   │   │   │   │       └── route.ts
│   │   │   │   │   ├── transcribe/
│   │   │   │   │   │   └── route.ts
│   │   │   │   │   ├── transformers/
│   │   │   │   │   │   └── fix-tags.mjs
│   │   │   │   │   └── workspace/
│   │   │   │   │       └── files/
│   │   │   │   │           └── upload/
│   │   │   │   │               └── route.ts
│   │   │   │   ├── error.tsx
│   │   │   │   ├── global-error.tsx
│   │   │   │   ├── globals.css
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── providers.tsx
│   │   │   ├── components/
│   │   │   │   ├── __legacy__/
│   │   │   │   │   ├── AgentImageItem.tsx
│   │   │   │   │   ├── AgentImages.tsx
│   │   │   │   │   ├── BecomeACreator.tsx
│   │   │   │   │   ├── Button.tsx
│   │   │   │   │   ├── CreatorCard.tsx
│   │   │   │   │   ├── CreatorInfoCard.tsx
│   │   │   │   │   ├── CreatorLinks.tsx
│   │   │   │   │   ├── FeaturedAgentCard.tsx
│   │   │   │   │   ├── FilterChips.tsx
│   │   │   │   │   ├── ProfileInfoForm.tsx
│   │   │   │   │   ├── RatingCard.tsx
│   │   │   │   │   ├── SearchBar.tsx
│   │   │   │   │   ├── SearchFilterChips.tsx
│   │   │   │   │   ├── Sidebar.tsx
│   │   │   │   │   ├── SmartImage.tsx
│   │   │   │   │   ├── SortDropdown.tsx
│   │   │   │   │   ├── Status.tsx
│   │   │   │   │   ├── StoreCard.tsx
│   │   │   │   │   ├── ThemeToggle.tsx
│   │   │   │   │   ├── action-button-group.tsx
│   │   │   │   │   ├── composite/
│   │   │   │   │   │   ├── AgentsSection.tsx
│   │   │   │   │   │   ├── FeaturedCreators.tsx
│   │   │   │   │   │   ├── FeaturedSection.tsx
│   │   │   │   │   │   └── HeroSection.tsx
│   │   │   │   │   ├── delete-confirm-dialog.tsx
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── ui/
│   │   │   │   │       ├── badge.tsx
│   │   │   │   │       ├── button.tsx
│   │   │   │   │       ├── calendar.tsx
│   │   │   │   │       ├── card.tsx
│   │   │   │   │       ├── carousel.tsx
│   │   │   │   │       ├── checkbox.tsx
│   │   │   │   │       ├── collapsible.tsx
│   │   │   │   │       ├── command.tsx
│   │   │   │   │       ├── data-table.tsx
│   │   │   │   │       ├── dialog.tsx
│   │   │   │   │       ├── dropdown-menu.tsx
│   │   │   │   │       ├── form.tsx
│   │   │   │   │       ├── icons.tsx
│   │   │   │   │       ├── input.tsx
│   │   │   │   │       ├── label.tsx
│   │   │   │   │       ├── loading.tsx
│   │   │   │   │       ├── multiselect.tsx
│   │   │   │   │       ├── pagination-controls.tsx
│   │   │   │   │       ├── popover.tsx
│   │   │   │   │       ├── radio-group.tsx
│   │   │   │   │       ├── render.tsx
│   │   │   │   │       ├── scroll-area.tsx
│   │   │   │   │       ├── select.tsx
│   │   │   │   │       ├── separator.tsx
│   │   │   │   │       ├── sheet.tsx
│   │   │   │   │       ├── skeleton.tsx
│   │   │   │   │       ├── table.tsx
│   │   │   │   │       ├── tabs.tsx
│   │   │   │   │       └── textarea.tsx
│   │   │   │   ├── ai-elements/
│   │   │   │   │   ├── conversation.tsx
│   │   │   │   │   ├── message.stories.tsx
│   │   │   │   │   ├── message.tsx
│   │   │   │   │   └── prompt-input.tsx
│   │   │   │   ├── atoms/
│   │   │   │   │   ├── Avatar/
│   │   │   │   │   │   ├── Avatar.stories.tsx
│   │   │   │   │   │   └── Avatar.tsx
│   │   │   │   │   ├── Badge/
│   │   │   │   │   │   ├── Badge.stories.tsx
│   │   │   │   │   │   └── Badge.tsx
│   │   │   │   │   ├── Button/
│   │   │   │   │   │   ├── Button.stories.tsx
│   │   │   │   │   │   ├── Button.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Card/
│   │   │   │   │   │   └── Card.tsx
│   │   │   │   │   ├── DateInput/
│   │   │   │   │   │   └── DateInput.tsx
│   │   │   │   │   ├── DateTimeInput/
│   │   │   │   │   │   └── DateTimeInput.tsx
│   │   │   │   │   ├── FileInput/
│   │   │   │   │   │   ├── FileInput.stories.tsx
│   │   │   │   │   │   ├── FileInput.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Input/
│   │   │   │   │   │   ├── Input.stories.tsx
│   │   │   │   │   │   ├── Input.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useInput.ts
│   │   │   │   │   ├── LLMItem/
│   │   │   │   │   │   ├── LLMItem.stories.tsx
│   │   │   │   │   │   └── LLMItem.tsx
│   │   │   │   │   ├── Link/
│   │   │   │   │   │   ├── Link.stories.tsx
│   │   │   │   │   │   └── Link.tsx
│   │   │   │   │   ├── LoadingSpinner/
│   │   │   │   │   │   ├── LoadingSpinner.stories.tsx
│   │   │   │   │   │   └── LoadingSpinner.tsx
│   │   │   │   │   ├── OverflowText/
│   │   │   │   │   │   ├── OverflowText.stories.tsx
│   │   │   │   │   │   └── OverflowText.tsx
│   │   │   │   │   ├── Progress/
│   │   │   │   │   │   ├── Progress.stories.tsx
│   │   │   │   │   │   └── Progress.tsx
│   │   │   │   │   ├── Select/
│   │   │   │   │   │   ├── Select.stories.tsx
│   │   │   │   │   │   └── Select.tsx
│   │   │   │   │   ├── Skeleton/
│   │   │   │   │   │   ├── Skeleton.tsx
│   │   │   │   │   │   └── skeleton.stories.tsx
│   │   │   │   │   ├── Switch/
│   │   │   │   │   │   ├── Switch.stories.tsx
│   │   │   │   │   │   └── Switch.tsx
│   │   │   │   │   ├── Text/
│   │   │   │   │   │   ├── Text.stories.tsx
│   │   │   │   │   │   ├── Text.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── TimeInput/
│   │   │   │   │   │   └── TimeInput.tsx
│   │   │   │   │   └── Tooltip/
│   │   │   │   │       ├── BaseTooltip.tsx
│   │   │   │   │       └── Tooltip.stories.tsx
│   │   │   │   ├── auth/
│   │   │   │   │   ├── AuthCard.tsx
│   │   │   │   │   ├── AuthFeedback.tsx
│   │   │   │   │   ├── EmailNotAllowedModal.tsx
│   │   │   │   │   ├── ExpiredLinkMessage.tsx
│   │   │   │   │   ├── GoogleOAuthButton.tsx
│   │   │   │   │   ├── MobileWarningBanner.tsx
│   │   │   │   │   ├── PasswordInput.tsx
│   │   │   │   │   ├── WaitlistErrorContent.tsx
│   │   │   │   │   └── help-item.tsx
│   │   │   │   ├── contextual/
│   │   │   │   │   ├── Chat/
│   │   │   │   │   │   └── components/
│   │   │   │   │   │       └── ChatMessage/
│   │   │   │   │   │           └── useTextToSpeech.ts
│   │   │   │   │   ├── CredentialsInput/
│   │   │   │   │   │   ├── CredentialsInput.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── APIKeyCredentialsModal/
│   │   │   │   │   │   │   │   ├── APIKeyCredentialsModal.tsx
│   │   │   │   │   │   │   │   └── useAPIKeyCredentialsModal.ts
│   │   │   │   │   │   │   ├── CredentialRow/
│   │   │   │   │   │   │   │   └── CredentialRow.tsx
│   │   │   │   │   │   │   ├── CredentialTypeSelector/
│   │   │   │   │   │   │   │   └── CredentialTypeSelector.tsx
│   │   │   │   │   │   │   ├── CredentialsAccordionView/
│   │   │   │   │   │   │   │   └── CredentialsAccordionView.tsx
│   │   │   │   │   │   │   ├── CredentialsFlatView/
│   │   │   │   │   │   │   │   └── CredentialsFlatView.tsx
│   │   │   │   │   │   │   ├── CredentialsGroupedView/
│   │   │   │   │   │   │   │   ├── CredentialsGroupedView.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── CredentialsSelect/
│   │   │   │   │   │   │   │   └── CredentialsSelect.tsx
│   │   │   │   │   │   │   ├── DeleteConfirmationModal/
│   │   │   │   │   │   │   │   └── DeleteConfirmationModal.tsx
│   │   │   │   │   │   │   ├── HotScopedCredentialsModal/
│   │   │   │   │   │   │   │   └── HotScopedCredentialsModal.tsx
│   │   │   │   │   │   │   ├── OAuthWaitingModal/
│   │   │   │   │   │   │   │   └── OAuthWaitingModal.tsx
│   │   │   │   │   │   │   └── PasswordCredentialsModal/
│   │   │   │   │   │   │       └── PasswordCredentialsModal.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useCredentialsInput.ts
│   │   │   │   │   ├── CronScheduler/
│   │   │   │   │   │   ├── cron-scheduler-dialog.tsx
│   │   │   │   │   │   └── cron-scheduler.tsx
│   │   │   │   │   ├── EditAgentModal/
│   │   │   │   │   │   ├── EditAgentModal.tsx
│   │   │   │   │   │   └── components/
│   │   │   │   │   │       ├── EditAgentForm.tsx
│   │   │   │   │   │       └── useEditAgentForm.ts
│   │   │   │   │   ├── GoogleDrivePicker/
│   │   │   │   │   │   ├── GoogleDrivePicker.tsx
│   │   │   │   │   │   ├── GoogleDrivePickerInput.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── useGoogleDrivePicker.ts
│   │   │   │   │   ├── InfiniteScroll/
│   │   │   │   │   │   ├── InfiniteScroll.tsx
│   │   │   │   │   │   └── useInfiniteScroll.ts
│   │   │   │   │   ├── OutputRenderers/
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── OutputActions.tsx
│   │   │   │   │   │   │   └── OutputItem.tsx
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── renderers/
│   │   │   │   │   │   │   ├── AudioRenderer.test.ts
│   │   │   │   │   │   │   ├── AudioRenderer.tsx
│   │   │   │   │   │   │   ├── CodeRenderer.tsx
│   │   │   │   │   │   │   ├── ImageRenderer.tsx
│   │   │   │   │   │   │   ├── JSONRenderer.tsx
│   │   │   │   │   │   │   ├── LinkRenderer.test.ts
│   │   │   │   │   │   │   ├── LinkRenderer.tsx
│   │   │   │   │   │   │   ├── MarkdownRenderer.tsx
│   │   │   │   │   │   │   ├── TextRenderer.tsx
│   │   │   │   │   │   │   ├── VideoRenderer.test.ts
│   │   │   │   │   │   │   ├── VideoRenderer.tsx
│   │   │   │   │   │   │   ├── WorkspaceFileRenderer.test.ts
│   │   │   │   │   │   │   └── WorkspaceFileRenderer.tsx
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── copy.ts
│   │   │   │   │   │       └── download.ts
│   │   │   │   │   ├── PublishAgentModal/
│   │   │   │   │   │   ├── PublishAgentModal.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AgentInfoStep/
│   │   │   │   │   │   │   │   ├── AgentInfoStep.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── ThumbnailImages.tsx
│   │   │   │   │   │   │   │   │   └── useThumbnailImages.ts
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useAgentInfoStep.ts
│   │   │   │   │   │   │   ├── AgentReviewStep.tsx
│   │   │   │   │   │   │   ├── AgentSelectStep/
│   │   │   │   │   │   │   │   ├── AgentSelectStep.tsx
│   │   │   │   │   │   │   │   └── useAgentSelectStep.ts
│   │   │   │   │   │   │   ├── PublishAuthPrompt.tsx
│   │   │   │   │   │   │   └── StepHeader.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── usePublishAgentModal.ts
│   │   │   │   │   ├── RunAgentInputs/
│   │   │   │   │   │   ├── RunAgentInputs.tsx
│   │   │   │   │   │   └── useRunAgentInputs.ts
│   │   │   │   │   └── marketplaceHelpers.ts
│   │   │   │   ├── layout/
│   │   │   │   │   └── Navbar/
│   │   │   │   │       ├── Navbar.tsx
│   │   │   │   │       ├── components/
│   │   │   │   │       │   ├── AccountMenu/
│   │   │   │   │       │   │   ├── AccountMenu.tsx
│   │   │   │   │       │   │   └── components/
│   │   │   │   │       │   │       └── AccountLogoutOption.tsx
│   │   │   │   │       │   ├── AgentActivityDropdown/
│   │   │   │   │       │   │   ├── AgentActivityDropdown.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   ├── ActivityDropdown/
│   │   │   │   │       │   │   │   │   ├── ActivityDropdown.tsx
│   │   │   │   │       │   │   │   │   ├── helpers.ts
│   │   │   │   │       │   │   │   │   ├── styles.module.css
│   │   │   │   │       │   │   │   │   └── useActivityDropdown.ts
│   │   │   │   │       │   │   │   └── ActivityItem.tsx
│   │   │   │   │       │   │   ├── helpers.tsx
│   │   │   │   │       │   │   └── useAgentActivityDropdown.ts
│   │   │   │   │       │   ├── FeedbackButton.tsx
│   │   │   │   │       │   ├── LoginButton.tsx
│   │   │   │   │       │   ├── MenuIcon/
│   │   │   │   │       │   │   └── MenuIcon.tsx
│   │   │   │   │       │   ├── MobileNavbar/
│   │   │   │   │       │   │   ├── MobileNavBar.tsx
│   │   │   │   │       │   │   └── components/
│   │   │   │   │       │   │       ├── MobileNavbarLogoutItem.tsx
│   │   │   │   │       │   │       └── MobileNavbarMenuItem.tsx
│   │   │   │   │       │   ├── NavbarLink.tsx
│   │   │   │   │       │   ├── NavbarLoading.tsx
│   │   │   │   │       │   ├── PreviewBanner/
│   │   │   │   │       │   │   └── PreviewBanner.tsx
│   │   │   │   │       │   └── Wallet/
│   │   │   │   │       │       ├── Wallet.tsx
│   │   │   │   │       │       └── components/
│   │   │   │   │       │           ├── WalletRefill.tsx
│   │   │   │   │       │           └── WalletTaskGroups.tsx
│   │   │   │   │       ├── helpers.tsx
│   │   │   │   │       └── useNavbar.ts
│   │   │   │   ├── molecules/
│   │   │   │   │   ├── Accordion/
│   │   │   │   │   │   ├── Accordion.stories.tsx
│   │   │   │   │   │   └── Accordion.tsx
│   │   │   │   │   ├── Alert/
│   │   │   │   │   │   ├── Alert.stories.tsx
│   │   │   │   │   │   └── Alert.tsx
│   │   │   │   │   ├── Breadcrumbs/
│   │   │   │   │   │   ├── Breadcrumbs.stories.tsx
│   │   │   │   │   │   └── Breadcrumbs.tsx
│   │   │   │   │   ├── Collapsible/
│   │   │   │   │   │   ├── Collapsible.stories.tsx
│   │   │   │   │   │   └── Collapsible.tsx
│   │   │   │   │   ├── Confetti/
│   │   │   │   │   │   ├── Confetti.stories.tsx
│   │   │   │   │   │   └── Confetti.tsx
│   │   │   │   │   ├── CookieConsentBanner/
│   │   │   │   │   │   ├── CookieConsentBanner.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   └── CookieSettingsModal/
│   │   │   │   │   │   │       ├── CookieSettingsModal.tsx
│   │   │   │   │   │   │       └── useCookieSettingsModal.ts
│   │   │   │   │   │   ├── useCookieConsent.ts
│   │   │   │   │   │   └── useCookieConsentBanner.ts
│   │   │   │   │   ├── Dialog/
│   │   │   │   │   │   ├── Dialog.stories.tsx
│   │   │   │   │   │   ├── Dialog.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── BaseContent.tsx
│   │   │   │   │   │   │   ├── BaseFooter.tsx
│   │   │   │   │   │   │   ├── BaseTrigger.tsx
│   │   │   │   │   │   │   ├── DialogWrap.tsx
│   │   │   │   │   │   │   ├── DrawerWrap.tsx
│   │   │   │   │   │   │   └── styles.ts
│   │   │   │   │   │   ├── useDialogCtx.ts
│   │   │   │   │   │   └── useDialogInternal.ts
│   │   │   │   │   ├── DropdownMenu/
│   │   │   │   │   │   ├── DropdownMenu.stories.tsx
│   │   │   │   │   │   └── DropdownMenu.tsx
│   │   │   │   │   ├── ErrorBoundary/
│   │   │   │   │   │   └── ErrorBoundary.tsx
│   │   │   │   │   ├── ErrorCard/
│   │   │   │   │   │   ├── ErrorCard.stories.tsx
│   │   │   │   │   │   ├── ErrorCard.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── ActionButtons.tsx
│   │   │   │   │   │   │   ├── CardWrapper.tsx
│   │   │   │   │   │   │   ├── ErrorHeader.tsx
│   │   │   │   │   │   │   ├── ErrorMessage.tsx
│   │   │   │   │   │   │   └── LoadingState.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Form/
│   │   │   │   │   │   └── Form.tsx
│   │   │   │   │   ├── InfiniteList/
│   │   │   │   │   │   ├── InfiniteList.stories.tsx
│   │   │   │   │   │   └── InfiniteList.tsx
│   │   │   │   │   ├── InformationTooltip/
│   │   │   │   │   │   ├── InformationTooltip.stories.tsx
│   │   │   │   │   │   └── InformationTooltip.tsx
│   │   │   │   │   ├── MultiToggle/
│   │   │   │   │   │   ├── MultiToggle.stories.tsx
│   │   │   │   │   │   └── MultiToggle.tsx
│   │   │   │   │   ├── Popover/
│   │   │   │   │   │   └── Popover.tsx
│   │   │   │   │   ├── ScrollableTabs/
│   │   │   │   │   │   ├── ScrollableTabs.stories.tsx
│   │   │   │   │   │   ├── ScrollableTabs.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── ScrollableTabsContent.tsx
│   │   │   │   │   │   │   ├── ScrollableTabsList.tsx
│   │   │   │   │   │   │   └── ScrollableTabsTrigger.tsx
│   │   │   │   │   │   ├── context.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useScrollableTabs.ts
│   │   │   │   │   ├── SecondaryMenu/
│   │   │   │   │   │   ├── SecondaryMenu.stories.tsx
│   │   │   │   │   │   └── SecondaryMenu.tsx
│   │   │   │   │   ├── ShowMore/
│   │   │   │   │   │   ├── ShowMore.stories.tsx
│   │   │   │   │   │   ├── ShowMore.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── ShowMoreText/
│   │   │   │   │   │   ├── ShowMoreText.stories.tsx
│   │   │   │   │   │   ├── ShowMoreText.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Table/
│   │   │   │   │   │   ├── Table.stories.tsx
│   │   │   │   │   │   ├── Table.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useTable.ts
│   │   │   │   │   ├── TabsLine/
│   │   │   │   │   │   ├── TabsLine.stories.tsx
│   │   │   │   │   │   └── TabsLine.tsx
│   │   │   │   │   ├── TallyPoup/
│   │   │   │   │   │   ├── TallyPopup.tsx
│   │   │   │   │   │   └── useTallyPopup.ts
│   │   │   │   │   ├── TimePicker/
│   │   │   │   │   │   ├── TimePicker.stories.tsx
│   │   │   │   │   │   └── TimePicker.tsx
│   │   │   │   │   ├── Toast/
│   │   │   │   │   │   ├── styles.module.css
│   │   │   │   │   │   ├── toast.stories.tsx
│   │   │   │   │   │   ├── toaster.tsx
│   │   │   │   │   │   └── use-toast.tsx
│   │   │   │   │   ├── file-tree.stories.tsx
│   │   │   │   │   └── file-tree.tsx
│   │   │   │   ├── monitor/
│   │   │   │   │   └── SentryUserTracker.tsx
│   │   │   │   ├── organisms/
│   │   │   │   │   ├── FloatingReviewsPanel/
│   │   │   │   │   │   └── FloatingReviewsPanel.tsx
│   │   │   │   │   ├── PendingReviewCard/
│   │   │   │   │   │   └── PendingReviewCard.tsx
│   │   │   │   │   └── PendingReviewsList/
│   │   │   │   │       └── PendingReviewsList.tsx
│   │   │   │   ├── overview.stories.tsx
│   │   │   │   ├── renderers/
│   │   │   │   │   └── InputRenderer/
│   │   │   │   │       ├── FormRenderer.tsx
│   │   │   │   │       ├── base/
│   │   │   │   │       │   ├── anyof/
│   │   │   │   │       │   │   ├── AnyOfField.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   └── AnyOfFieldTitle.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── useAnyOfField.ts
│   │   │   │   │       │   ├── array/
│   │   │   │   │       │   │   ├── ArrayFieldItemTemplate.tsx
│   │   │   │   │       │   │   ├── ArrayFieldTemplate.tsx
│   │   │   │   │       │   │   ├── ArraySchemaField.tsx
│   │   │   │   │       │   │   ├── context/
│   │   │   │   │       │   │   │   └── array-item-context.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── index.ts
│   │   │   │   │       │   ├── base-registry.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── object/
│   │   │   │   │       │   │   ├── ObjectFieldTemplate.tsx
│   │   │   │   │       │   │   ├── OptionalDataControlsTemplate.tsx
│   │   │   │   │       │   │   ├── WrapIfAdditionalTemplate.tsx
│   │   │   │   │       │   │   └── index.ts
│   │   │   │   │       │   ├── oneof/
│   │   │   │   │       │   │   └── OneOfField.tsx
│   │   │   │   │       │   └── standard/
│   │   │   │   │       │       ├── DescriptionField.tsx
│   │   │   │   │       │       ├── FieldError.tsx
│   │   │   │   │       │       ├── FieldTemplate.tsx
│   │   │   │   │       │       ├── TitleField.tsx
│   │   │   │   │       │       ├── buttons/
│   │   │   │   │       │       │   ├── AddButton.tsx
│   │   │   │   │       │       │   ├── IconButton.tsx
│   │   │   │   │       │       │   └── index.ts
│   │   │   │   │       │       ├── errors/
│   │   │   │   │       │       │   ├── ErrorList.tsx
│   │   │   │   │       │       │   └── index.ts
│   │   │   │   │       │       ├── helpers.ts
│   │   │   │   │       │       ├── index.ts
│   │   │   │   │       │       └── widgets/
│   │   │   │   │       │           ├── CheckboxInput/
│   │   │   │   │       │           │   ├── CheckBoxWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── DateInput/
│   │   │   │   │       │           │   ├── DateWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── DateTimeInput/
│   │   │   │   │       │           │   ├── DateTimeWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── FileInput/
│   │   │   │   │       │           │   ├── FileWidget.tsx
│   │   │   │   │       │           │   ├── index.ts
│   │   │   │   │       │           │   └── useWorkspaceUpload.ts
│   │   │   │   │       │           ├── GoogleDrivePicker/
│   │   │   │   │       │           │   ├── GoogleDrivePicketWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── SelectInput/
│   │   │   │   │       │           │   ├── SelectWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── TextInput/
│   │   │   │   │       │           │   ├── TextInputExpanderModal.tsx
│   │   │   │   │       │           │   ├── TextWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── TimeInput/
│   │   │   │   │       │           │   ├── TimeWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           └── index.ts
│   │   │   │   │       ├── constants.ts
│   │   │   │   │       ├── custom/
│   │   │   │   │       │   ├── CredentialField/
│   │   │   │   │       │   │   ├── CredentialField.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   └── CredentialFieldTitle.tsx
│   │   │   │   │       │   │   └── helpers.ts
│   │   │   │   │       │   ├── GoogleDrivePickerField/
│   │   │   │   │       │   │   └── GoogleDrivePickerField.tsx
│   │   │   │   │       │   ├── JsonTextField/
│   │   │   │   │       │   │   ├── JsonTextField.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── useJsonTextField.ts
│   │   │   │   │       │   ├── LlmModelField/
│   │   │   │   │       │   │   ├── LlmModelField.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   ├── LlmIcon.tsx
│   │   │   │   │       │   │   │   ├── LlmMenuHeader.tsx
│   │   │   │   │       │   │   │   ├── LlmMenuItem.tsx
│   │   │   │   │       │   │   │   ├── LlmModelPicker.tsx
│   │   │   │   │       │   │   │   └── LlmPriceTier.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── types.ts
│   │   │   │   │       │   ├── MultiSelectField/
│   │   │   │   │       │   │   ├── MultiSelectField.tsx
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── useMultiSelectField.ts
│   │   │   │   │       │   ├── TableField/
│   │   │   │   │       │   │   └── TableField.tsx
│   │   │   │   │       │   └── custom-registry.ts
│   │   │   │   │       ├── docs/
│   │   │   │   │       │   └── HEIRARCHY.md
│   │   │   │   │       ├── helpers.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── registry/
│   │   │   │   │       │   ├── Form.tsx
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── types.ts
│   │   │   │   │       ├── types.ts
│   │   │   │   │       └── utils/
│   │   │   │   │           ├── custom-validator.ts
│   │   │   │   │           ├── generate-ui-schema.ts
│   │   │   │   │           ├── helpers.ts
│   │   │   │   │           ├── input-schema-pre-processor.ts
│   │   │   │   │           ├── rjsf-utils.ts
│   │   │   │   │           └── schema-utils.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── colors.ts
│   │   │   │   │   ├── fonts.css
│   │   │   │   │   ├── fonts.ts
│   │   │   │   │   └── scrollbars.ts
│   │   │   │   ├── tokens/
│   │   │   │   │   ├── border-radius.stories.tsx
│   │   │   │   │   ├── colors.stories.tsx
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   └── StoryCode.tsx
│   │   │   │   │   ├── icons.stories.tsx
│   │   │   │   │   ├── spacing.stories.tsx
│   │   │   │   │   └── typography.stories.tsx
│   │   │   │   └── ui/
│   │   │   │       ├── accordion.tsx
│   │   │   │       ├── button-group.tsx
│   │   │   │       ├── button.tsx
│   │   │   │       ├── input-group.tsx
│   │   │   │       ├── input.tsx
│   │   │   │       ├── scroll-area.tsx
│   │   │   │       ├── separator.tsx
│   │   │   │       ├── sheet.tsx
│   │   │   │       ├── sidebar.tsx
│   │   │   │       ├── skeleton.tsx
│   │   │   │       ├── spinner.tsx
│   │   │   │       ├── textarea.tsx
│   │   │   │       └── tooltip.tsx
│   │   │   ├── hooks/
│   │   │   │   ├── use-mobile.tsx
│   │   │   │   ├── useAgentSafeMode.ts
│   │   │   │   ├── useCredentials.ts
│   │   │   │   ├── useCredits.ts
│   │   │   │   ├── useExecutionEvents.ts
│   │   │   │   ├── useLibraryAgents/
│   │   │   │   │   ├── store.ts
│   │   │   │   │   └── useLibraryAgents.ts
│   │   │   │   ├── useOnboardingTimezoneDetection.ts
│   │   │   │   └── usePendingReviews.ts
│   │   │   ├── instrumentation.ts
│   │   │   ├── lib/
│   │   │   │   ├── autogpt-server-api/
│   │   │   │   │   ├── client.ts
│   │   │   │   │   ├── context.tsx
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── cron-expression-utils.ts
│   │   │   │   ├── dexie/
│   │   │   │   │   ├── db.ts
│   │   │   │   │   └── draft-utils.ts
│   │   │   │   ├── direct-upload.ts
│   │   │   │   ├── hooks/
│   │   │   │   │   ├── useBreakpoint.ts
│   │   │   │   │   └── useUserTimezone.ts
│   │   │   │   ├── impersonation.ts
│   │   │   │   ├── oauth-popup.ts
│   │   │   │   ├── platform.ts
│   │   │   │   ├── react-query/
│   │   │   │   │   └── queryClient.ts
│   │   │   │   ├── shiki-highlighter.ts
│   │   │   │   ├── streamdown-code-plugin.ts
│   │   │   │   ├── supabase/
│   │   │   │   │   ├── SESSION_VALIDATION.md
│   │   │   │   │   ├── actions.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── useSupabase.ts
│   │   │   │   │   │   └── useSupabaseStore.ts
│   │   │   │   │   ├── middleware.ts
│   │   │   │   │   └── server/
│   │   │   │   │       ├── getServerSupabase.ts
│   │   │   │   │       └── getServerUser.ts
│   │   │   │   ├── timezone-utils.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── time.ts
│   │   │   │   │   └── url.ts
│   │   │   │   ├── utils.ts
│   │   │   │   ├── withRoleAccess.ts
│   │   │   │   └── workspace-uri.ts
│   │   │   ├── middleware.ts
│   │   │   ├── mocks/
│   │   │   │   ├── index.ts
│   │   │   │   ├── mock-browser.ts
│   │   │   │   ├── mock-handlers.ts
│   │   │   │   └── mock-server.ts
│   │   │   ├── providers/
│   │   │   │   ├── agent-credentials/
│   │   │   │   │   ├── credentials-provider.tsx
│   │   │   │   │   └── helper.ts
│   │   │   │   ├── onboarding/
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   └── onboarding-provider.tsx
│   │   │   │   └── posthog/
│   │   │   │       └── posthog-provider.tsx
│   │   │   ├── services/
│   │   │   │   ├── analytics/
│   │   │   │   │   ├── VercelAnalyticsWrapper.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── builder-draft/
│   │   │   │   │   └── draft-service.ts
│   │   │   │   ├── consent/
│   │   │   │   │   └── cookies.ts
│   │   │   │   ├── environment/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── feature-flags/
│   │   │   │   │   ├── FeatureFlagPage.tsx
│   │   │   │   │   ├── FeatureFlagRedirect.tsx
│   │   │   │   │   ├── feature-flag-provider.tsx
│   │   │   │   │   ├── use-get-flag.ts
│   │   │   │   │   └── with-feature-flag.tsx
│   │   │   │   ├── network-status/
│   │   │   │   │   ├── NetworkStatusMonitor.tsx
│   │   │   │   │   └── useNetworkStatus.ts
│   │   │   │   ├── scripts/
│   │   │   │   │   └── scripts.tsx
│   │   │   │   └── storage/
│   │   │   │       ├── local-storage.ts
│   │   │   │       └── session-storage.ts
│   │   │   ├── tests/
│   │   │   │   ├── CLAUDE.md
│   │   │   │   ├── agent-activity.spec.ts
│   │   │   │   ├── agent-dashboard.spec.ts
│   │   │   │   ├── api-keys.spec.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── testing_agent.json
│   │   │   │   ├── build.spec.ts
│   │   │   │   ├── credentials/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── global-setup.ts
│   │   │   │   ├── integrations/
│   │   │   │   │   ├── mock-supabase-request.tsx
│   │   │   │   │   ├── setup-nextjs-mocks.tsx
│   │   │   │   │   ├── test-utils.tsx
│   │   │   │   │   └── vitest.setup.tsx
│   │   │   │   ├── library.spec.ts
│   │   │   │   ├── marketplace-agent.spec.ts
│   │   │   │   ├── marketplace-creator.spec.ts
│   │   │   │   ├── marketplace.spec.ts
│   │   │   │   ├── pages/
│   │   │   │   │   ├── base.page.ts
│   │   │   │   │   ├── build.page.ts
│   │   │   │   │   ├── header.page.ts
│   │   │   │   │   ├── library.page.ts
│   │   │   │   │   ├── login.page.ts
│   │   │   │   │   ├── marketplace.page.ts
│   │   │   │   │   ├── navbar.page.ts
│   │   │   │   │   ├── profile-form.page.ts
│   │   │   │   │   └── profile.page.ts
│   │   │   │   ├── profile-form.spec.ts
│   │   │   │   ├── profile.spec.ts
│   │   │   │   ├── publish-agent.spec.ts
│   │   │   │   ├── settings.spec.ts
│   │   │   │   ├── signin.spec.ts
│   │   │   │   ├── signup.spec.ts
│   │   │   │   ├── title.spec.ts
│   │   │   │   ├── util.spec.ts
│   │   │   │   └── utils/
│   │   │   │       ├── assertion.ts
│   │   │   │       ├── auth.ts
│   │   │   │       ├── get-browser.ts
│   │   │   │       ├── selectors.ts
│   │   │   │       ├── signin.ts
│   │   │   │       └── signup.ts
│   │   │   └── types/
│   │   │       ├── auth.ts
│   │   │       ├── chat.ts
│   │   │       ├── google.ts
│   │   │       ├── images.d.ts
│   │   │       ├── svg.d.ts
│   │   │       └── types.ts
│   │   ├── tailwind.config.ts
│   │   ├── test-runner-jest.config.js
│   │   ├── tsconfig.json
│   │   └── vitest.config.mts
│   ├── graph_templates/
│   │   ├── Discord Bot Chat To LLM_v5.json
│   │   ├── Discord Chatbot with History_v145.json
│   │   ├── Discord Search Bot_v17.json
│   │   └── Medium Blogger_v28.json
│   └── installer/
│       ├── setup-autogpt.bat
│       └── setup-autogpt.sh
├── classic/
│   ├── .flake8
│   ├── CLI-USAGE.md
│   ├── Dockerfile.autogpt
│   ├── FORGE-QUICKSTART.md
│   ├── README.md
│   ├── SECURITY.md
│   ├── TROUBLESHOOTING.md
│   ├── benchmark/
│   │   ├── .flake8
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── agbenchmark/
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── __main__.py
│   │   │   ├── agent_api_interface.py
│   │   │   ├── agent_interface.py
│   │   │   ├── app.py
│   │   │   ├── challenges/
│   │   │   │   ├── CHALLENGE.md
│   │   │   │   ├── README.md
│   │   │   │   ├── __init__.py
│   │   │   │   ├── abilities/
│   │   │   │   │   ├── read_file/
│   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   └── file_to_read.txt
│   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   ├── file_to_check.txt
│   │   │   │   │   │   │   └── output.txt
│   │   │   │   │   │   └── data.json
│   │   │   │   │   └── write_file/
│   │   │   │   │       ├── artifacts_out/
│   │   │   │   │       │   └── random_file.txt
│   │   │   │   │       └── data.json
│   │   │   │   ├── alignment/
│   │   │   │   │   ├── 1_distraction/
│   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   └── instructions.txt
│   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   └── goal.txt
│   │   │   │   │   │   └── data_draft.json
│   │   │   │   │   └── 2_injection/
│   │   │   │   │       ├── artifacts_in/
│   │   │   │   │       │   ├── instructions.txt
│   │   │   │   │       │   └── instructions_2.txt
│   │   │   │   │       ├── artifacts_out/
│   │   │   │   │       │   └── goal.txt
│   │   │   │   │       └── data_draft.json
│   │   │   │   ├── base.py
│   │   │   │   ├── builtin.py
│   │   │   │   ├── library/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── ethereum/
│   │   │   │   │       └── check_price/
│   │   │   │   │           ├── artifacts_in/
│   │   │   │   │           │   ├── __init__.py
│   │   │   │   │           │   ├── sample_code.py
│   │   │   │   │           │   └── test.py
│   │   │   │   │           ├── artifacts_out/
│   │   │   │   │           │   ├── __init__.py
│   │   │   │   │           │   ├── sample_code.py
│   │   │   │   │           │   └── test.py
│   │   │   │   │           └── data.json
│   │   │   │   ├── optional_categories.json
│   │   │   │   ├── verticals/
│   │   │   │   │   ├── code/
│   │   │   │   │   │   ├── 1_three_sum/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── sample_code.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 2_password_generator/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── password_generator.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 3_file_organizer/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── organize_files.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 4_url_shortener/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   ├── test.py
│   │   │   │   │   │   │   │   └── url_shortener.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 5_tic_tac_toe/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── tic_tac_toe.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   └── 6_battleship/
│   │   │   │   │   │       ├── artifacts_in/
│   │   │   │   │   │       │   ├── __init__.py
│   │   │   │   │   │       │   ├── abstract_class.py
│   │   │   │   │   │       │   ├── conftest.py
│   │   │   │   │   │       │   ├── product_requirements.txt
│   │   │   │   │   │       │   ├── test_negative.py
│   │   │   │   │   │       │   ├── test_positive.py
│   │   │   │   │   │       │   └── user_stories.txt
│   │   │   │   │   │       ├── artifacts_out/
│   │   │   │   │   │       │   ├── __init__.py
│   │   │   │   │   │       │   ├── abstract_class.py
│   │   │   │   │   │       │   ├── battleship.py
│   │   │   │   │   │       │   ├── conftest.py
│   │   │   │   │   │       │   ├── test_negative.py
│   │   │   │   │   │       │   └── test_positive.py
│   │   │   │   │   │       └── data.json
│   │   │   │   │   ├── data/
│   │   │   │   │   │   ├── 1_sort_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── input.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.csv
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 2_label_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── input.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.csv
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 3_combine_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   ├── file1.csv
│   │   │   │   │   │   │   │   └── file2.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.csv
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 4_answer_question_small_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── file1.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 5_answer_question_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── file1.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   └── 6_answer_question_combine_csv/
│   │   │   │   │   │       ├── artifacts_in/
│   │   │   │   │   │       │   ├── file1.csv
│   │   │   │   │   │       │   └── file2.csv
│   │   │   │   │   │       ├── artifacts_out/
│   │   │   │   │   │       │   └── output.txt
│   │   │   │   │   │       └── data.json
│   │   │   │   │   ├── scrape/
│   │   │   │   │   │   ├── 1_search/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 2_book_price/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 3_revenue_retrieval/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 4_revenue_retrieval_2/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   └── 5_get_information/
│   │   │   │   │   │       ├── artifacts_out/
│   │   │   │   │   │       │   └── output.txt
│   │   │   │   │   │       └── data.json
│   │   │   │   │   └── synthesize/
│   │   │   │   │       └── 1_basic_content_gen/
│   │   │   │   │           ├── artifacts_in/
│   │   │   │   │           │   ├── challenges.txt
│   │   │   │   │           │   └── companies.txt
│   │   │   │   │           ├── artifacts_out/
│   │   │   │   │           │   └── output.txt
│   │   │   │   │           └── data.json
│   │   │   │   ├── webarena.py
│   │   │   │   └── webarena_selection.json
│   │   │   ├── config.py
│   │   │   ├── conftest.py
│   │   │   ├── generate_test.py
│   │   │   ├── main.py
│   │   │   ├── schema.py
│   │   │   └── utils/
│   │   │       ├── data_types.py
│   │   │       ├── dependencies/
│   │   │       │   ├── __init__.py
│   │   │       │   ├── constants.py
│   │   │       │   ├── graphs.py
│   │   │       │   ├── main.py
│   │   │       │   └── util.py
│   │   │       ├── get_data_from_helicone.py
│   │   │       ├── logging.py
│   │   │       ├── prompts.py
│   │   │       └── utils.py
│   │   ├── agbenchmark_config/
│   │   │   └── config.json
│   │   ├── agents_to_benchmark.json
│   │   ├── backend/
│   │   │   └── __init__.py
│   │   ├── frontend/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── _eslintrc.cjs
│   │   │   ├── next.config.mjs
│   │   │   ├── package.json
│   │   │   ├── postcss.config.cjs
│   │   │   ├── prettier.config.cjs
│   │   │   ├── public/
│   │   │   │   └── graph.json
│   │   │   ├── src/
│   │   │   │   ├── components/
│   │   │   │   │   ├── data/
│   │   │   │   │   │   ├── Dashboard.tsx
│   │   │   │   │   │   ├── Reports.tsx
│   │   │   │   │   │   └── dashboard/
│   │   │   │   │   │       ├── CategorySuccess.tsx
│   │   │   │   │   │       ├── CurrentEnv.tsx
│   │   │   │   │   │       └── RadarChart.tsx
│   │   │   │   │   └── index/
│   │   │   │   │       ├── Graph.tsx
│   │   │   │   │       ├── MockCheckbox.tsx
│   │   │   │   │       ├── RunButton.tsx
│   │   │   │   │       ├── RunData.tsx
│   │   │   │   │       ├── SelectedTask.tsx
│   │   │   │   │       └── TaskInfo.tsx
│   │   │   │   ├── env.mjs
│   │   │   │   ├── pages/
│   │   │   │   │   ├── _app.tsx
│   │   │   │   │   ├── data.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── server/
│   │   │   │   │   └── db.ts
│   │   │   │   └── styles/
│   │   │   │       └── globals.css
│   │   │   ├── tailwind.config.ts
│   │   │   └── tsconfig.json
│   │   ├── pyproject.toml
│   │   ├── reports/
│   │   │   ├── Auto-GPT/
│   │   │   │   ├── 20230817T000126_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081335_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081400_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081239_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081235_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081455_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081337_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081341_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032421_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081422_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081408_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081228_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081337_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081454_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081453_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081508_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081434_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153538_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081405_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081212_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081320_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081516_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081454_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011709_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080530_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080422_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080442_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file11_07-20-23-18.json
│   │   │   │   ├── file12_07-20-23-45.json
│   │   │   │   ├── file13_07-21-00-20.json
│   │   │   │   ├── file14_07-21-08-18.json
│   │   │   │   ├── file15_07-21-18-18.json
│   │   │   │   ├── file16_07-22-08-16.json
│   │   │   │   ├── file17_07-22-15-10.json
│   │   │   │   ├── file18_07-23-08-17.json
│   │   │   │   ├── file19_07-23-16-22.json
│   │   │   │   ├── file1_07-18-00-18.json
│   │   │   │   ├── file20_07-23-19-08.json
│   │   │   │   ├── file21_07-23-19-27.json
│   │   │   │   ├── file22_07-23-19-35.json
│   │   │   │   ├── file23_07-23-19-53.json
│   │   │   │   ├── file24_07-23-21-03.json
│   │   │   │   ├── file24_07-23-21-06.json
│   │   │   │   ├── file26_07-23-22-25.json
│   │   │   │   ├── file26_07-23-22-26.json
│   │   │   │   ├── file28_07-24-08-19.json
│   │   │   │   ├── file29_07-24-22-11.json
│   │   │   │   ├── file2_07-18-02-45.json
│   │   │   │   ├── file30_07-24-23-51.json
│   │   │   │   ├── file31_07-25-01-05.json
│   │   │   │   ├── file32_07-25-01-35.json
│   │   │   │   ├── file33_07-25-03-14.json
│   │   │   │   ├── file34_07-25-03-35.json
│   │   │   │   ├── file35_07-25-03-59.json
│   │   │   │   ├── file36_07-25-04-20.json
│   │   │   │   ├── file37_07-25-08-18.json
│   │   │   │   ├── file38_07-25-18-10.json
│   │   │   │   ├── file38_07-25-18-12.json
│   │   │   │   ├── file38_07-25-18-14.json
│   │   │   │   ├── file3_07-18-08-19.json
│   │   │   │   ├── file41_07-26-00-53.json
│   │   │   │   ├── file42_07-26-03-15.json
│   │   │   │   ├── file43_07-26-08-18.json
│   │   │   │   ├── file46_07-27-18-44.json
│   │   │   │   ├── file47_07-27-13-31.json
│   │   │   │   ├── file47_07-27-19-24.json
│   │   │   │   ├── file48_07-27-13-38.json
│   │   │   │   ├── file48_07-27-19-56.json
│   │   │   │   ├── file49_07-28-03-53.json
│   │   │   │   ├── file4_07-18-16-20.json
│   │   │   │   ├── file50_07-28-04-10.json
│   │   │   │   ├── file51_07-29-08-12.json
│   │   │   │   ├── file52_07-29-09-24.json
│   │   │   │   ├── file53_07-29-09-29.json
│   │   │   │   ├── file54_07-29-10-18.json
│   │   │   │   ├── file55_07-29-10-45.json
│   │   │   │   ├── file56_07-29-16-09.json
│   │   │   │   ├── file57_07-29-17-21.json
│   │   │   │   ├── file59_07-30-03-06.json
│   │   │   │   ├── file59_07-30-08-12.json
│   │   │   │   ├── file5_07-19-08-18.json
│   │   │   │   ├── file6_07-19-20-40.json
│   │   │   │   ├── file7_07-19-21-56.json
│   │   │   │   ├── file8_07-20-20-12.json
│   │   │   │   ├── file9_07-20-22-44.json
│   │   │   │   ├── file9_07-20-22-49.json
│   │   │   │   ├── folder10_08-01-02-43/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder10_08-01-12-47/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-03-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-13-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-16-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-16-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-19-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-02-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-03-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-03-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-31-02-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-15-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-17-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-17-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-02-00-08/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-03-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-02-01-35/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-23-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-04-03-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-05-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-06-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-03-06/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-08-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-09-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-10-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-11-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-12-02-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-12-02-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-12-03-04/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-12-03-45/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-12-17-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-12-44/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-13-01-53/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-13-02-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-13-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-14-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-14-21-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-15-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-16-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-13-05/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_07-31-16-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-19-06/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-39/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── Auto-GPT-Turbo/
│   │   │   │   ├── 20230824T032419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081333_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081326_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081254_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081413_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081447_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081439_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T130202_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T231152_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081441_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T145222_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153506_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081341_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T170512_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081222_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081239_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081450_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081456_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011647_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080459_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080438_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── PolyGPT/
│   │   │   │   ├── 20230817T000100_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081344_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081347_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081303_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081253_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081430_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081318_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081326_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032533_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081402_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081411_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081258_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081204_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081533_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081440_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081320_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081331_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081234_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081236_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081401_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081409_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011618_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080446_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080421_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080352_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080444_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder10_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-13-01-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-13-02-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-13-02-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-13-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-14-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-14-08-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder17_08-14-09-48/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-14-18-00/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-14-18-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_08-09-19-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-14-21-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-15-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-16-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_08-10-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_08-11-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_08-11-20-28/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_08-12-02-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_08-12-02-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_08-12-03-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder8_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder9_08-12-17-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── babyagi/
│   │   │   │   ├── 20230817T000257_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081542_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081621_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081418_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081523_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081708_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081534_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081622_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032717_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081600_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081559_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081425_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081454_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081736_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081638_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081613_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081539_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153608_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081621_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081425_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081538_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081752_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081727_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T003423_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011924_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080803_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080618_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080648_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080641_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file10_07-23-21-06.json
│   │   │   │   ├── file10_07-23-21-07.json
│   │   │   │   ├── file12_07-23-22-28.json
│   │   │   │   ├── file13_07-24-08-21.json
│   │   │   │   ├── file14_07-24-22-15.json
│   │   │   │   ├── file15_07-24-23-53.json
│   │   │   │   ├── file16_07-25-01-07.json
│   │   │   │   ├── file17_07-25-01-38.json
│   │   │   │   ├── file18_07-25-03-16.json
│   │   │   │   ├── file19_07-25-03-38.json
│   │   │   │   ├── file1_07-21-18-20.json
│   │   │   │   ├── file20_07-25-04-01.json
│   │   │   │   ├── file21_07-25-04-22.json
│   │   │   │   ├── file22_07-25-08-22.json
│   │   │   │   ├── file23_07-25-18-13.json
│   │   │   │   ├── file23_07-25-18-14.json
│   │   │   │   ├── file23_07-25-18-16.json
│   │   │   │   ├── file26_07-26-00-56.json
│   │   │   │   ├── file27_07-26-03-17.json
│   │   │   │   ├── file28_07-26-08-21.json
│   │   │   │   ├── file29_07-27-13-33.json
│   │   │   │   ├── file2_07-22-08-18.json
│   │   │   │   ├── file30_07-27-13-40.json
│   │   │   │   ├── file31_07-27-18-46.json
│   │   │   │   ├── file32_07-27-19-27.json
│   │   │   │   ├── file33_07-27-19-59.json
│   │   │   │   ├── file34_07-28-03-56.json
│   │   │   │   ├── file35_07-28-04-13.json
│   │   │   │   ├── file36_07-28-08-14.json
│   │   │   │   ├── file37_07-29-08-14.json
│   │   │   │   ├── file38_07-29-09-30.json
│   │   │   │   ├── file39_07-29-10-20.json
│   │   │   │   ├── file3_07-22-15-12.json
│   │   │   │   ├── file40_07-29-10-47.json
│   │   │   │   ├── file41_07-29-16-11.json
│   │   │   │   ├── file42_07-29-17-23.json
│   │   │   │   ├── file43_07-29-18-09.json
│   │   │   │   ├── file44_07-30-00-53.json
│   │   │   │   ├── file45_07-30-01-41.json
│   │   │   │   ├── file46_07-30-03-08.json
│   │   │   │   ├── file47_07-30-04-26.json
│   │   │   │   ├── file48_07-30-08-14.json
│   │   │   │   ├── file4_07-23-08-20.json
│   │   │   │   ├── file5_07-23-16-24.json
│   │   │   │   ├── file6_07-23-19-11.json
│   │   │   │   ├── file7_07-23-19-28.json
│   │   │   │   ├── file8_07-23-19-37.json
│   │   │   │   ├── file9_07-23-19-55.json
│   │   │   │   ├── folder11_08-01-02-46/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-12-50/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-03-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-13-39/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-16-20/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-17-00/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-01-17-35/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder16_08-01-19-54/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-01-36/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-02-39/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-03-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-30-22-55/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-04-02/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-15-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-17-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-02-17-41/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-08-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-03-23-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-03-27/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-04-04-34/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-04-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-02-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder30_08-05-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-06-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-07-08-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-08-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-09-03-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-09-08-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-10-08-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-11-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-12-02-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-12-02-54/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-03-08/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-12-03-06/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-12-08-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-12-17-26/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-13-01-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-13-01-54/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-13-02-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-13-02-40/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-13-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder48_08-14-21-40/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder49_08-15-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-12-47/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder50_08-16-08-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_07-31-13-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-16-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder8_07-31-19-41/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── beebot/
│   │   │   │   ├── 20230817T000111_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081401_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081430_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081151_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081303_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081428_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081327_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081409_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032431_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081331_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081219_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081219_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081452_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081405_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081406_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153356_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081447_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081302_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081311_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081412_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081437_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011630_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080421_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080428_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080431_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080433_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T151304_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file10_07-23-08-17.json
│   │   │   │   ├── file11_07-23-16-21.json
│   │   │   │   ├── file12_07-23-19-07.json
│   │   │   │   ├── file13_07-23-19-27.json
│   │   │   │   ├── file13_07-23-19-34.json
│   │   │   │   ├── file15_07-23-19-54.json
│   │   │   │   ├── file16_07-23-21-03.json
│   │   │   │   ├── file16_07-23-21-06.json
│   │   │   │   ├── file18_07-23-22-26.json
│   │   │   │   ├── file19_07-24-08-19.json
│   │   │   │   ├── file1_07-20-22-48.json
│   │   │   │   ├── file20_07-24-23-51.json
│   │   │   │   ├── file21_07-25-01-05.json
│   │   │   │   ├── file22_07-25-01-35.json
│   │   │   │   ├── file23_07-25-03-13.json
│   │   │   │   ├── file24_07-25-03-35.json
│   │   │   │   ├── file24_07-25-03-59.json
│   │   │   │   ├── file25_07-25-04-19.json
│   │   │   │   ├── file27_07-25-08-18.json
│   │   │   │   ├── file28_07-25-18-09.json
│   │   │   │   ├── file28_07-25-18-11.json
│   │   │   │   ├── file28_07-25-18-13.json
│   │   │   │   ├── file31_07-26-00-53.json
│   │   │   │   ├── file32_07-26-03-16.json
│   │   │   │   ├── file33_07-26-08-18.json
│   │   │   │   ├── file34_07-27-19-24.json
│   │   │   │   ├── file35_07-27-19-55.json
│   │   │   │   ├── file36_07-28-03-53.json
│   │   │   │   ├── file36_07-28-04-34.json
│   │   │   │   ├── file38_07-28-08-12.json
│   │   │   │   ├── file39_07-29-08-12.json
│   │   │   │   ├── file3_07-20-23-18.json
│   │   │   │   ├── file40_07-29-09-29.json
│   │   │   │   ├── file41_07-29-10-17.json
│   │   │   │   ├── file42_07-29-10-46.json
│   │   │   │   ├── file43_07-29-16-09.json
│   │   │   │   ├── file44_07-29-17-20.json
│   │   │   │   ├── file45_07-30-00-51.json
│   │   │   │   ├── file46_07-30-01-38.json
│   │   │   │   ├── file47_07-30-03-05.json
│   │   │   │   ├── file48_07-30-04-24.json
│   │   │   │   ├── file49_07-30-08-11.json
│   │   │   │   ├── file4_07-20-22-44.json
│   │   │   │   ├── file4_07-20-23-43.json
│   │   │   │   ├── file5_07-21-00-20.json
│   │   │   │   ├── file6_07-21-08-18.json
│   │   │   │   ├── file7_07-21-18-18.json
│   │   │   │   ├── file8_07-22-08-16.json
│   │   │   │   ├── file9_07-22-15-10.json
│   │   │   │   ├── folder10_07-31-23-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-03-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-12-48/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-13-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-16-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-01-16-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder16_08-01-17-31/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder17_08-01-19-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-01-34/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-30-22-53/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-02-36/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-03-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-03-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-15-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-03-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-23-50/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-04-03-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-05-08-11/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-06-01-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-02-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder30_08-06-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-06-17-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-07-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-07-22-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-08-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-09-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-10-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-11-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-11-18-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-11-19-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-03-06/
│   │   │   │   │   ├── folder11_08-01-02-42/
│   │   │   │   │   │   └── report.json
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-11-21-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-12-02-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-12-02-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-12-03-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-12-17-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-13-02-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder48_08-13-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder49_08-14-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-12-44/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder50_08-14-21-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder51_08-15-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder52_08-16-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-16-09/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-05/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder8_07-31-19-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder9_07-31-21-02/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── combined_charts/
│   │   │   │   ├── run1/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run10/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run11/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run12/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run13/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run14/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run15/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run16/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run17/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run18/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run19/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run2/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run20/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run21/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run22/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run23/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run24/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run25/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run26/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run27/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run28/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run29/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run3/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run30/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run31/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run32/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run33/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run35/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run35.1_best_performances/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run36/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run37/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run38/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run39/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run4/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run40/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run41/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run42/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run43/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run44/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run45/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run46/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run47/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run48/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run49/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run5/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run50/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run51/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run6/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run7/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run8/
│   │   │   │   │   └── run_info.json
│   │   │   │   └── run9/
│   │   │   │       └── run_info.json
│   │   │   ├── format.py
│   │   │   ├── gpt-engineer/
│   │   │   │   ├── 1.json
│   │   │   │   ├── 20230817T000115_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081320_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081304_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081215_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081223_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081448_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081342_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081255_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081353_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081258_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081238_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081207_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081524_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081337_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081418_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081324_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153354_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081353_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081227_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081151_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081358_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081409_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011611_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080511_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080345_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080349_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080405_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file11_07-20-23-17.json
│   │   │   │   ├── file12_07-20-23-43.json
│   │   │   │   ├── file13_07-21-00-20.json
│   │   │   │   ├── file14_07-21-08-18.json
│   │   │   │   ├── file15_07-21-18-17.json
│   │   │   │   ├── file16_07-22-08-16.json
│   │   │   │   ├── file17_07-22-15-10.json
│   │   │   │   ├── file18_07-23-08-16.json
│   │   │   │   ├── file19_07-23-16-21.json
│   │   │   │   ├── file1_07-18-00-17.json
│   │   │   │   ├── file20_07-23-19-07.json
│   │   │   │   ├── file21_07-23-19-26.json
│   │   │   │   ├── file22_07-23-19-35.json
│   │   │   │   ├── file23_07-23-19-53.json
│   │   │   │   ├── file24_07-23-21-03.json
│   │   │   │   ├── file24_07-23-21-05.json
│   │   │   │   ├── file26_07-23-22-25.json
│   │   │   │   ├── file27_07-24-08-19.json
│   │   │   │   ├── file28_07-24-22-11.json
│   │   │   │   ├── file29_07-24-23-50.json
│   │   │   │   ├── file2_07-18-02-44.json
│   │   │   │   ├── file30_07-25-01-05.json
│   │   │   │   ├── file31_07-25-01-35.json
│   │   │   │   ├── file32_07-25-03-14.json
│   │   │   │   ├── file33_07-25-03-35.json
│   │   │   │   ├── file34_07-25-03-58.json
│   │   │   │   ├── file35_07-25-04-19.json
│   │   │   │   ├── file36_07-25-08-18.json
│   │   │   │   ├── file37_07-25-18-09.json
│   │   │   │   ├── file37_07-25-18-11.json
│   │   │   │   ├── file37_07-25-18-13.json
│   │   │   │   ├── file3_07-18-08-19.json
│   │   │   │   ├── file40_07-26-00-53.json
│   │   │   │   ├── file41_07-26-03-15.json
│   │   │   │   ├── file42_07-26-08-17.json
│   │   │   │   ├── file43_07-27-13-30.json
│   │   │   │   ├── file44_07-27-13-37.json
│   │   │   │   ├── file45_07-27-18-44.json
│   │   │   │   ├── file46_07-27-19-23.json
│   │   │   │   ├── file47_07-27-19-56.json
│   │   │   │   ├── file48_07-28-04-10.json
│   │   │   │   ├── file49_07-28-08-12.json
│   │   │   │   ├── file4_07-18-16-19.json
│   │   │   │   ├── file50_07-29-08-11.json
│   │   │   │   ├── file51_07-29-09-29.json
│   │   │   │   ├── file52_07-29-10-17.json
│   │   │   │   ├── file53_07-29-10-45.json
│   │   │   │   ├── file54_07-29-16-10.json
│   │   │   │   ├── file55_07-29-17-21.json
│   │   │   │   ├── file56_07-29-18-06.json
│   │   │   │   ├── file57_07-30-00-51.json
│   │   │   │   ├── file58_07-30-01-38.json
│   │   │   │   ├── file59_07-30-03-05.json
│   │   │   │   ├── file5_07-19-08-18.json
│   │   │   │   ├── file60_07-30-04-24.json
│   │   │   │   ├── file61_07-30-08-12.json
│   │   │   │   ├── file6_07-19-21-55.json
│   │   │   │   ├── file7_07-20-08-18.json
│   │   │   │   ├── file8_07-20-20-10.json
│   │   │   │   ├── file9_07-20-22-44.json
│   │   │   │   ├── file9_07-20-22-48.json
│   │   │   │   ├── folder10_08-01-02-42/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder10_08-01-12-47/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-03-20/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-13-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-16-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-16-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-17-31/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-01-19-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder17_08-02-01-34/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-02-36/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-03-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-03-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-30-22-53/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-15-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-17-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-17-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-03-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-23-50/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-04-03-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-04-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-04-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-04-18-32/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-02-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder30_08-04-18-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-04-19-56/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-04-22-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-05-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-06-08-11/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-07-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-08-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-09-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-10-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-11-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-12-44/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-12-02-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-12-02-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-12-03-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-12-17-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-13-01-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-13-02-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder48_08-13-02-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder49_08-13-08-11/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-13-05/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder50_08-14-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder51_08-14-21-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder52_08-15-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder53_08-16-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_07-31-16-08/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-19-04/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── json_to_base_64.py
│   │   │   ├── match_records.py
│   │   │   ├── mini-agi/
│   │   │   │   ├── 1.1_TestWriteFile.json
│   │   │   │   ├── 10.1_TestRememberMultipleWithNoise.json
│   │   │   │   ├── 10_TestRememberMultipleWithNoise.json
│   │   │   │   ├── 11.1_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.2_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.3_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.4_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.5_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 12.1_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12.2_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12.3_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12.4_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 13.1_TestRevenueRetrieval.json
│   │   │   │   ├── 13_TestRevenueRetrieval.json.json
│   │   │   │   ├── 14_TestReturnCode.json
│   │   │   │   ├── 15_TestRevenueRetrieval.json
│   │   │   │   ├── 1_07-18-02-44.json
│   │   │   │   ├── 1_TestWriteFIle.json
│   │   │   │   ├── 2.1_TestReadFile.json
│   │   │   │   ├── 20230817T000109_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081430_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081402_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081219_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081326_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081348_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081356_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081402_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032434_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081327_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081334_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081258_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081225_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081335_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T051127_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081335_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153352_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081339_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081308_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081306_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081505_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081354_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T001050_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011712_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080426_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080415_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080446_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080548_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 2_07-18-16-20.json
│   │   │   │   ├── 2_TestReadFile.json
│   │   │   │   ├── 3.1_TestSearch.json
│   │   │   │   ├── 3_07-20-22-44.json
│   │   │   │   ├── 3_TestSearch.json
│   │   │   │   ├── 4.1_TestBasicRetrieval.json
│   │   │   │   ├── 4_07-20-23-18.json
│   │   │   │   ├── 4_TestBasicRetrieval.json
│   │   │   │   ├── 5.1_TestRevenueRetrieval_1.0.json
│   │   │   │   ├── 5.2_TestRevenueRetrieval_1.0.json
│   │   │   │   ├── 5_07-20-23-43.json
│   │   │   │   ├── 5_TestRevenueRetrieval_1.0.json
│   │   │   │   ├── 6.1_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6.2_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6.3_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6.4_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6_07-21-00-20.json
│   │   │   │   ├── 6_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 7.1_TestRevenueRetrieval_1.2.json
│   │   │   │   ├── 7_07-21-08-18.json
│   │   │   │   ├── 7_TestRevenueRetrieval_1.2.json
│   │   │   │   ├── 8.1_TestBasicMemory.json
│   │   │   │   ├── 8_07-21-18-18.json
│   │   │   │   ├── 8_TestBasicMemory.json
│   │   │   │   ├── 9.1_TestRememberMultipleIds.json
│   │   │   │   ├── 9_07-22-08-16.json
│   │   │   │   ├── 9_TestRememberMultipleIds.json
│   │   │   │   ├── file10_07-23-16-21.json
│   │   │   │   ├── file11_07-23-19-07.json
│   │   │   │   ├── file12_07-23-19-53.json
│   │   │   │   ├── file13_07-23-21-03.json
│   │   │   │   ├── file13_07-23-21-07.json
│   │   │   │   ├── file15_07-23-22-26.json
│   │   │   │   ├── file16_07-24-08-21.json
│   │   │   │   ├── file56_07-24-22-12.json
│   │   │   │   ├── file57_07-24-23-51.json
│   │   │   │   ├── file58_07-25-01-04.json
│   │   │   │   ├── file59_07-25-01-35.json
│   │   │   │   ├── file60_07-25-03-14.json
│   │   │   │   ├── file61_07-25-03-35.json
│   │   │   │   ├── file62_07-25-03-59.json
│   │   │   │   ├── file63_07-25-08-19.json
│   │   │   │   ├── file64_07-25-18-09.json
│   │   │   │   ├── file64_07-25-18-11.json
│   │   │   │   ├── file64_07-25-18-13.json
│   │   │   │   ├── file67_07-26-00-54.json
│   │   │   │   ├── file68_07-26-08-18.json
│   │   │   │   ├── file69_07-27-13-30.json
│   │   │   │   ├── file70_07-27-13-38.json
│   │   │   │   ├── file71_07-27-18-45.json
│   │   │   │   ├── file72_07-27-19-23.json
│   │   │   │   ├── file73_07-27-19-55.json
│   │   │   │   ├── file74_07-28-03-53.json
│   │   │   │   ├── file75_07-28-04-10.json
│   │   │   │   ├── file76_07-29-08-11.json
│   │   │   │   ├── file77_07-29-09-29.json
│   │   │   │   ├── file78_07-29-17-20.json
│   │   │   │   ├── file79_07-29-18-06.json
│   │   │   │   ├── file80_07-3

================================================
FILE CONTENTS
================================================

================================================
FILE: .branchlet.json
================================================
{
  "worktreeCopyPatterns": [
    ".env*",
    ".vscode/**",
    ".auth/**",
    ".claude/**",
    "autogpt_platform/.env*",
    "autogpt_platform/backend/.env*",
    "autogpt_platform/frontend/.env*",
    "autogpt_platform/frontend/.auth/**",
    "autogpt_platform/db/docker/.env*"
  ],
  "worktreeCopyIgnores": [
    "**/node_modules/**",
    "**/dist/**",
    "**/.git/**",
    "**/Thumbs.db",
    "**/.DS_Store",
    "**/.next/**",
    "**/__pycache__/**",
    "**/.ruff_cache/**",
    "**/.pytest_cache/**",
    "**/*.pyc",
    "**/playwright-report/**",
    "**/logs/**",
    "**/site/**"
  ],
  "worktreePathTemplate": "$BASE_PATH.worktree",
  "postCreateCmd": [
    "cd autogpt_platform/autogpt_libs && poetry install",
    "cd autogpt_platform/backend && poetry install && poetry run prisma generate",
    "cd autogpt_platform/frontend && pnpm install"
  ],
  "terminalCommand": "code .",
  "deleteBranchWithWorktree": false
}


================================================
FILE: .claude/skills/pr-address/SKILL.md
================================================
---
name: pr-address
description: Address PR review comments and loop until CI green and all comments resolved. TRIGGER when user asks to address comments, fix PR feedback, respond to reviewers, or babysit/monitor a PR.
user-invocable: true
argument-hint: "[PR number or URL] — if omitted, finds PR for current branch."
metadata:
  author: autogpt-team
  version: "1.0.0"
---

# PR Address

## Find the PR

```bash
gh pr list --head $(git branch --show-current) --repo Significant-Gravitas/AutoGPT
gh pr view {N}
```

## Read the PR description

Understand the **Why / What / How** before addressing comments — you need context to make good fixes:

```bash
gh pr view {N} --json body --jq '.body'
```

## Fetch comments (all sources)

### 1. Inline review threads — GraphQL (primary source of actionable items)

Use GraphQL to fetch inline threads. It natively exposes `isResolved`, returns threads already grouped with all replies, and paginates via cursor — no manual thread reconstruction needed.

```bash
gh api graphql -f query='
{
  repository(owner: "Significant-Gravitas", name: "AutoGPT") {
    pullRequest(number: {N}) {
      reviewThreads(first: 100) {
        pageInfo { hasNextPage endCursor }
        nodes {
          id
          isResolved
          path
          comments(last: 1) {
            nodes { databaseId body author { login } createdAt }
          }
        }
      }
    }
  }
}'
```

If `pageInfo.hasNextPage` is true, fetch subsequent pages by adding `after: "<endCursor>"` to `reviewThreads(first: 100, after: "...")` and repeat until `hasNextPage` is false.

**Filter to unresolved threads only** — skip any thread where `isResolved: true`. `comments(last: 1)` returns the most recent comment in the thread — act on that; it reflects the reviewer's final ask. Use the thread `id` (Relay global ID) to track threads across polls.

### 2. Top-level reviews — REST (MUST paginate)

```bash
gh api repos/Significant-Gravitas/AutoGPT/pulls/{N}/reviews --paginate
```

**CRITICAL — always `--paginate`.** Reviews default to 30 per page. PRs can have 80–170+ reviews (mostly empty resolution events). Without pagination you miss reviews past position 30 — including `autogpt-reviewer`'s structured review which is typically posted after several CI runs and sits well beyond the first page.

Two things to extract:
- **Overall state**: look for `CHANGES_REQUESTED` or `APPROVED` reviews.
- **Actionable feedback**: non-empty bodies only. Empty-body reviews are thread-resolution events — they indicate progress but have no feedback to act on.

**Where each reviewer posts:**
- `autogpt-reviewer` — posts detailed structured reviews ("Blockers", "Should Fix", "Nice to Have") as **top-level reviews**. Not present on every PR. Address ALL items.
- `sentry[bot]` — posts bug predictions as **inline threads**. Fix real bugs, explain false positives.
- `coderabbitai[bot]` — posts summaries as **top-level reviews** AND actionable items as **inline threads**. Address actionable items.
- Human reviewers — can post in any source. Address ALL non-empty feedback.

### 3. PR conversation comments — REST

```bash
gh api repos/Significant-Gravitas/AutoGPT/issues/{N}/comments --paginate
```

Mostly contains: bot summaries (`coderabbitai[bot]`), CI/conflict detection (`github-actions[bot]`), and author status updates. Scan for non-empty messages from non-bot human reviewers that aren't the PR author — those are the ones that need a response.

## For each unaddressed comment

Address comments **one at a time**: fix → commit → push → inline reply → next.

1. Read the referenced code, make the fix (or reply explaining why it's not needed)
2. Commit and push the fix
3. Reply **inline** (not as a new top-level comment) referencing the fixing commit — this is what resolves the conversation for bot reviewers (coderabbitai, sentry):

| Comment type | How to reply |
|---|---|
| Inline review (`pulls/{N}/comments`) | `gh api repos/Significant-Gravitas/AutoGPT/pulls/{N}/comments/{ID}/replies -f body="🤖 Fixed in <commit-sha>: <description>"` |
| Conversation (`issues/{N}/comments`) | `gh api repos/Significant-Gravitas/AutoGPT/issues/{N}/comments -f body="🤖 Fixed in <commit-sha>: <description>"` |

## Format and commit

After fixing, format the changed code:

- **Backend** (from `autogpt_platform/backend/`): `poetry run format`
- **Frontend** (from `autogpt_platform/frontend/`): `pnpm format && pnpm lint && pnpm types`

If API routes changed, regenerate the frontend client:
```bash
cd autogpt_platform/backend && poetry run rest &
REST_PID=$!
trap "kill $REST_PID 2>/dev/null" EXIT
WAIT=0; until curl -sf http://localhost:8006/health > /dev/null 2>&1; do sleep 1; WAIT=$((WAIT+1)); [ $WAIT -ge 60 ] && echo "Timed out" && exit 1; done
cd ../frontend && pnpm generate:api:force
kill $REST_PID 2>/dev/null; trap - EXIT
```
Never manually edit files in `src/app/api/__generated__/`.

Then commit and **push immediately** — never batch commits without pushing. Each fix should be visible on GitHub right away so CI can start and reviewers can see progress.

**Never push empty commits** (`git commit --allow-empty`) to re-trigger CI or bot checks. When a check fails, investigate the root cause (unchecked PR checklist, unaddressed review comments, code issues) and fix those directly. Empty commits add noise to git history.

For backend commits in worktrees: `poetry run git commit` (pre-commit hooks).

## The loop

```text
address comments → format → commit → push
→ wait for CI (while addressing new comments) → fix failures → push
→ re-check comments after CI settles
→ repeat until: all comments addressed AND CI green AND no new comments arriving
```

### Polling for CI + new comments

After pushing, poll for **both** CI status and new comments in a single loop. Do not use `gh pr checks --watch` — it blocks the tool and prevents reacting to new comments while CI is running.

> **Note:** `gh pr checks --watch --fail-fast` is tempting but it blocks the entire Bash tool call, meaning the agent cannot check for or address new comments until CI fully completes. Always poll manually instead.

**Polling loop — repeat every 30 seconds:**

1. Check CI status:
```bash
gh pr checks {N} --repo Significant-Gravitas/AutoGPT --json bucket,name,link
```
   Parse the results: if every check has `bucket` of `"pass"` or `"skipping"`, CI is green. If any has `"fail"`, CI has failed. Otherwise CI is still pending.

2. Check for merge conflicts:
```bash
gh pr view {N} --repo Significant-Gravitas/AutoGPT --json mergeable --jq '.mergeable'
```
   If the result is `"CONFLICTING"`, the PR has a merge conflict — see "Resolving merge conflicts" below. If `"UNKNOWN"`, GitHub is still computing mergeability — wait and re-check next poll.

3. Check for new/changed comments (all three sources):

   **Inline threads** — re-run the GraphQL query from "Fetch comments". For each unresolved thread, record `{thread_id, last_comment_databaseId}` as your baseline. On each poll, action is needed if:
   - A new thread `id` appears that wasn't in the baseline (new thread), OR
   - An existing thread's `last_comment_databaseId` has changed (new reply on existing thread)

   **Conversation comments:**
   ```bash
   gh api repos/Significant-Gravitas/AutoGPT/issues/{N}/comments --paginate
   ```
   Compare total count and newest `id` against baseline. Filter to non-empty, non-bot, non-author-update messages.

   **Top-level reviews:**
   ```bash
   gh api repos/Significant-Gravitas/AutoGPT/pulls/{N}/reviews --paginate
   ```
   Watch for new non-empty reviews (`CHANGES_REQUESTED` or `COMMENTED` with body). Compare total count and newest `id` against baseline.

4. **React in this precedence order (first match wins):**

| What happened | Action |
|---|---|
| Merge conflict detected | See "Resolving merge conflicts" below. |
| Mergeability is `UNKNOWN` | GitHub is still computing mergeability. Sleep 30 seconds, then restart polling from the top. |
| New comments detected | Address them (fix → commit → push → reply). After pushing, re-fetch all comments to update your baseline, then restart this polling loop from the top (new commits invalidate CI status). |
| CI failed (bucket == "fail") | Get failed check links: `gh pr checks {N} --repo Significant-Gravitas/AutoGPT --json bucket,link --jq '.[] \| select(.bucket == "fail") \| .link'`. Extract run ID from link (format: `.../actions/runs/<run-id>/job/...`), read logs with `gh run view <run-id> --repo Significant-Gravitas/AutoGPT --log-failed`. Fix → commit → push → restart polling. |
| CI green + no new comments | **Do not exit immediately.** Bots (coderabbitai, sentry) often post reviews shortly after CI settles. Continue polling for **2 more cycles (60s)** after CI goes green. Only exit after 2 consecutive green+quiet polls. |
| CI pending + no new comments | Sleep 30 seconds, then poll again. |

**The loop ends when:** CI fully green + all comments addressed + **2 consecutive polls with no new comments after CI settled.**

### Resolving merge conflicts

1. Identify the PR's target branch and remote:
```bash
gh pr view {N} --repo Significant-Gravitas/AutoGPT --json baseRefName --jq '.baseRefName'
git remote -v   # find the remote pointing to Significant-Gravitas/AutoGPT (typically 'upstream' in forks, 'origin' for direct contributors)
```

2. Pull the latest base branch with a 3-way merge:
```bash
git pull {base-remote} {base-branch} --no-rebase
```

3. Resolve conflicting files, then verify no conflict markers remain:
```bash
if grep -R -n -E '^(<<<<<<<|=======|>>>>>>>)' <conflicted-files>; then
  echo "Unresolved conflict markers found — resolve before proceeding."
  exit 1
fi
```

4. Stage and push:
```bash
git add <conflicted-files>
git commit -m "Resolve merge conflicts with {base-branch}"
git push
```

5. Restart the polling loop from the top — new commits reset CI status.


================================================
FILE: .claude/skills/pr-review/SKILL.md
================================================
---
name: pr-review
description: Review a PR for correctness, security, code quality, and testing issues. TRIGGER when user asks to review a PR, check PR quality, or give feedback on a PR.
user-invocable: true
args: "[PR number or URL] — if omitted, finds PR for current branch."
metadata:
  author: autogpt-team
  version: "1.0.0"
---

# PR Review

## Find the PR

```bash
gh pr list --head $(git branch --show-current) --repo Significant-Gravitas/AutoGPT
gh pr view {N}
```

## Read the PR description

Before reading code, understand the **why**, **what**, and **how** from the PR description:

```bash
gh pr view {N} --json body --jq '.body'
```

Every PR should have a Why / What / How structure. If any of these are missing, note it as feedback.

## Read the diff

```bash
gh pr diff {N}
```

## Fetch existing review comments

Before posting anything, fetch existing inline comments to avoid duplicates:

```bash
gh api repos/Significant-Gravitas/AutoGPT/pulls/{N}/comments --paginate
gh api repos/Significant-Gravitas/AutoGPT/pulls/{N}/reviews
```

## What to check

**Description quality:** Does the PR description cover Why (motivation/problem), What (summary of changes), and How (approach/implementation details)? If any are missing, request them — you can't judge the approach without understanding the problem and intent.

**Correctness:** logic errors, off-by-one, missing edge cases, race conditions (TOCTOU in file access, credit charging), error handling gaps, async correctness (missing `await`, unclosed resources).

**Security:** input validation at boundaries, no injection (command, XSS, SQL), secrets not logged, file paths sanitized (`os.path.basename()` in error messages).

**Code quality:** apply rules from backend/frontend CLAUDE.md files.

**Architecture:** DRY, single responsibility, modular functions. `Security()` vs `Depends()` for FastAPI auth. `data:` for SSE events, `: comment` for heartbeats. `transaction=True` for Redis pipelines.

**Testing:** edge cases covered, colocated `*_test.py` (backend) / `__tests__/` (frontend), mocks target where symbol is **used** not defined, `AsyncMock` for async.

## Output format

Every comment **must** be prefixed with `🤖` and a criticality badge:

| Tier | Badge | Meaning |
|---|---|---|
| Blocker | `🔴 **Blocker**` | Must fix before merge |
| Should Fix | `🟠 **Should Fix**` | Important improvement |
| Nice to Have | `🟡 **Nice to Have**` | Minor suggestion |
| Nit | `🔵 **Nit**` | Style / wording |

Example: `🤖 🔴 **Blocker**: Missing error handling for X — suggest wrapping in try/except.`

## Post inline comments

For each finding, post an inline comment on the PR (do not just write a local report):

```bash
# Get the latest commit SHA for the PR
COMMIT_SHA=$(gh api repos/Significant-Gravitas/AutoGPT/pulls/{N} --jq '.head.sha')

# Post an inline comment on a specific file/line
gh api repos/Significant-Gravitas/AutoGPT/pulls/{N}/comments \
  -f body="🤖 🔴 **Blocker**: <description>" \
  -f commit_id="$COMMIT_SHA" \
  -f path="<file path>" \
  -F line=<line number>
```


================================================
FILE: .claude/skills/pr-test/SKILL.md
================================================
---
name: pr-test
description: "E2E manual testing of PRs/branches using docker compose, agent-browser, and API calls. TRIGGER when user asks to manually test a PR, test a feature end-to-end, or run integration tests against a running system."
user-invocable: true
argument-hint: "[worktree path or PR number] — tests the PR in the given worktree. Optional flags: --fix (auto-fix issues found)"
metadata:
  author: autogpt-team
  version: "2.0.0"
---

# Manual E2E Test

Test a PR/branch end-to-end by building the full platform, interacting via browser and API, capturing screenshots, and reporting results.

## Critical Requirements

These are NON-NEGOTIABLE. Every test run MUST satisfy ALL the following:

### 1. Screenshots at Every Step
- Take a screenshot at EVERY significant test step — not just at the end
- Every test scenario MUST have at least one BEFORE and one AFTER screenshot
- Name screenshots sequentially: `{NN}-{action}-{state}.png` (e.g., `01-credits-before.png`, `02-credits-after.png`)
- If a screenshot is missing for a scenario, the test is INCOMPLETE — go back and take it

### 2. Screenshots MUST Be Posted to PR
- Push ALL screenshots to a temp branch `test-screenshots/pr-{N}`
- Post a PR comment with ALL screenshots embedded inline using GitHub raw URLs
- This is NOT optional — every test run MUST end with a PR comment containing screenshots
- If screenshot upload fails, retry. If it still fails, list failed files and require manual drag-and-drop/paste attachment in the PR comment

### 3. State Verification with Before/After Evidence
- For EVERY state-changing operation (API call, user action), capture the state BEFORE and AFTER
- Log the actual API response values (e.g., `credits_before=100, credits_after=95`)
- Screenshot MUST show the relevant UI state change
- Compare expected vs actual values explicitly — do not just eyeball it

### 4. Negative Test Cases Are Mandatory
- Test at least ONE negative case per feature (e.g., insufficient credits, invalid input, unauthorized access)
- Verify error messages are user-friendly and accurate
- Verify the system state did NOT change after a rejected operation

### 5. Test Report Must Include Full Evidence
Each test scenario in the report MUST have:
- **Steps**: What was done (exact commands or UI actions)
- **Expected**: What should happen
- **Actual**: What actually happened
- **API Evidence**: Before/after API response values for state-changing operations
- **Screenshot Evidence**: Before/after screenshots with explanations

## State Manipulation for Realistic Testing

When testing features that depend on specific states (rate limits, credits, quotas):

1. **Use Redis CLI to set counters directly:**
   ```bash
   # Find the Redis container
   REDIS_CONTAINER=$(docker ps --format '{{.Names}}' | grep redis | head -1)
   # Set a key with expiry
   docker exec $REDIS_CONTAINER redis-cli SET key value EX ttl
   # Example: Set rate limit counter to near-limit
   docker exec $REDIS_CONTAINER redis-cli SET "rate_limit:user:test@test.com" 99 EX 3600
   # Example: Check current value
   docker exec $REDIS_CONTAINER redis-cli GET "rate_limit:user:test@test.com"
   ```

2. **Use API calls to check before/after state:**
   ```bash
   # BEFORE: Record current state
   BEFORE=$(curl -s -H "Authorization: Bearer $TOKEN" http://localhost:8006/api/credits | jq '.credits')
   echo "Credits BEFORE: $BEFORE"

   # Perform the action...

   # AFTER: Record new state and compare
   AFTER=$(curl -s -H "Authorization: Bearer $TOKEN" http://localhost:8006/api/credits | jq '.credits')
   echo "Credits AFTER: $AFTER"
   echo "Delta: $(( BEFORE - AFTER ))"
   ```

3. **Take screenshots BEFORE and AFTER state changes** — the UI must reflect the backend state change

4. **Never rely on mocked/injected browser state** — always use real backend state. Do NOT use `agent-browser eval` to fake UI state. The backend must be the source of truth.

5. **Use direct DB queries when needed:**
   ```bash
   # Query via Supabase's PostgREST or docker exec into the DB
   docker exec supabase-db psql -U supabase_admin -d postgres -c "SELECT credits FROM user_credits WHERE user_id = '...';"
   ```

6. **After every API test, verify the state change actually persisted:**
   ```bash
   # Example: After a credits purchase, verify DB matches API
   API_CREDITS=$(curl -s -H "Authorization: Bearer $TOKEN" http://localhost:8006/api/credits | jq '.credits')
   DB_CREDITS=$(docker exec supabase-db psql -U supabase_admin -d postgres -t -c "SELECT credits FROM user_credits WHERE user_id = '...';" | tr -d ' ')
   [ "$API_CREDITS" = "$DB_CREDITS" ] && echo "CONSISTENT" || echo "MISMATCH: API=$API_CREDITS DB=$DB_CREDITS"
   ```

## Arguments

- `$ARGUMENTS` — worktree path (e.g. `$REPO_ROOT`) or PR number
- If `--fix` flag is present, auto-fix bugs found and push fixes (like pr-address loop)

## Step 0: Resolve the target

```bash
# If argument is a PR number, find its worktree
gh pr view {N} --json headRefName --jq '.headRefName'
# If argument is a path, use it directly
```

Determine:
- `REPO_ROOT` — the root repo directory: `git -C "$WORKTREE_PATH" worktree list | head -1 | awk '{print $1}'` (or `git rev-parse --show-toplevel` if not a worktree)
- `WORKTREE_PATH` — the worktree directory
- `PLATFORM_DIR` — `$WORKTREE_PATH/autogpt_platform`
- `BACKEND_DIR` — `$PLATFORM_DIR/backend`
- `FRONTEND_DIR` — `$PLATFORM_DIR/frontend`
- `PR_NUMBER` — the PR number (from `gh pr list --head $(git branch --show-current)`)
- `PR_TITLE` — the PR title, slugified (e.g. "Add copilot permissions" → "add-copilot-permissions")
- `RESULTS_DIR` — `$REPO_ROOT/test-results/PR-{PR_NUMBER}-{slugified-title}`

Create the results directory:
```bash
PR_NUMBER=$(cd $WORKTREE_PATH && gh pr list --head $(git branch --show-current) --repo Significant-Gravitas/AutoGPT --json number --jq '.[0].number')
PR_TITLE=$(cd $WORKTREE_PATH && gh pr list --head $(git branch --show-current) --repo Significant-Gravitas/AutoGPT --json title --jq '.[0].title' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//' | head -c 50)
RESULTS_DIR="$REPO_ROOT/test-results/PR-${PR_NUMBER}-${PR_TITLE}"
mkdir -p $RESULTS_DIR
```

**Test user credentials** (for logging into the UI or verifying results manually):
- Email: `test@test.com`
- Password: `testtest123`

## Step 1: Understand the PR

Before testing, understand what changed:

```bash
cd $WORKTREE_PATH

# Read PR description to understand the WHY
gh pr view {N} --json body --jq '.body'

git log --oneline dev..HEAD | head -20
git diff dev --stat
```

Read the PR description (Why / What / How) and changed files to understand:
0. **Why** does this PR exist? What problem does it solve?
1. **What** feature/fix does this PR implement?
2. **How** does it work? What's the approach?
3. What components are affected? (backend, frontend, copilot, executor, etc.)
4. What are the key user-facing behaviors to test?

## Step 2: Write test scenarios

Based on the PR analysis, write a test plan to `$RESULTS_DIR/test-plan.md`:

```markdown
# Test Plan: PR #{N} — {title}

## Scenarios
1. [Scenario name] — [what to verify]
2. ...

## API Tests (if applicable)
1. [Endpoint] — [expected behavior]
   - Before state: [what to check before]
   - After state: [what to verify changed]

## UI Tests (if applicable)
1. [Page/component] — [interaction to test]
   - Screenshot before: [what to capture]
   - Screenshot after: [what to capture]

## Negative Tests (REQUIRED — at least one per feature)
1. [What should NOT happen] — [how to trigger it]
   - Expected error: [what error message/code]
   - State unchanged: [what to verify did NOT change]
```

**Be critical** — include edge cases, error paths, and security checks. Every scenario MUST specify what screenshots to take and what state to verify.

## Step 3: Environment setup

### 3a. Copy .env files from the root worktree

The root worktree (`$REPO_ROOT`) has the canonical `.env` files with all API keys. Copy them to the target worktree:

```bash
# CRITICAL: .env files are NOT checked into git. They must be copied manually.
cp $REPO_ROOT/autogpt_platform/.env $PLATFORM_DIR/.env
cp $REPO_ROOT/autogpt_platform/backend/.env $BACKEND_DIR/.env
cp $REPO_ROOT/autogpt_platform/frontend/.env $FRONTEND_DIR/.env
```

### 3b. Configure copilot authentication

The copilot needs an LLM API to function. Two approaches (try subscription first):

#### Option 1: Subscription mode (preferred — uses your Claude Max/Pro subscription)

The `claude_agent_sdk` Python package **bundles its own Claude CLI binary** — no need to install `@anthropic-ai/claude-code` via npm. The backend auto-provisions credentials from environment variables on startup.

Run the helper script to extract tokens from your host and auto-update `backend/.env` (works on macOS, Linux, and Windows/WSL):

```bash
# Extracts OAuth tokens and writes CLAUDE_CODE_OAUTH_TOKEN + CLAUDE_CODE_REFRESH_TOKEN into .env
bash $BACKEND_DIR/scripts/refresh_claude_token.sh --env-file $BACKEND_DIR/.env
```

**How it works:** The script reads the OAuth token from:
- **macOS**: system keychain (`"Claude Code-credentials"`)
- **Linux/WSL**: `~/.claude/.credentials.json`
- **Windows**: `%APPDATA%/claude/.credentials.json`

It sets `CLAUDE_CODE_OAUTH_TOKEN`, `CLAUDE_CODE_REFRESH_TOKEN`, and `CHAT_USE_CLAUDE_CODE_SUBSCRIPTION=true` in the `.env` file. On container startup, the backend auto-provisions `~/.claude/.credentials.json` inside the container from these env vars. The SDK's bundled CLI then authenticates using that file. No `claude login`, no npm install needed.

**Note:** The OAuth token expires (~24h). If copilot returns auth errors, re-run the script and restart: `$BACKEND_DIR/scripts/refresh_claude_token.sh --env-file $BACKEND_DIR/.env && docker compose up -d copilot_executor`

#### Option 2: OpenRouter API key mode (fallback)

If subscription mode doesn't work, switch to API key mode using OpenRouter:

```bash
# In $BACKEND_DIR/.env, ensure these are set:
CHAT_USE_CLAUDE_CODE_SUBSCRIPTION=false
CHAT_API_KEY=<value of OPEN_ROUTER_API_KEY from the same .env>
CHAT_BASE_URL=https://openrouter.ai/api/v1
CHAT_USE_CLAUDE_AGENT_SDK=true
```

Use `sed` to update these values:
```bash
ORKEY=$(grep "^OPEN_ROUTER_API_KEY=" $BACKEND_DIR/.env | cut -d= -f2)
[ -n "$ORKEY" ] || { echo "ERROR: OPEN_ROUTER_API_KEY is missing in $BACKEND_DIR/.env"; exit 1; }
perl -i -pe 's/CHAT_USE_CLAUDE_CODE_SUBSCRIPTION=true/CHAT_USE_CLAUDE_CODE_SUBSCRIPTION=false/' $BACKEND_DIR/.env
# Add or update CHAT_API_KEY and CHAT_BASE_URL
grep -q "^CHAT_API_KEY=" $BACKEND_DIR/.env && perl -i -pe "s|^CHAT_API_KEY=.*|CHAT_API_KEY=$ORKEY|" $BACKEND_DIR/.env || echo "CHAT_API_KEY=$ORKEY" >> $BACKEND_DIR/.env
grep -q "^CHAT_BASE_URL=" $BACKEND_DIR/.env && perl -i -pe 's|^CHAT_BASE_URL=.*|CHAT_BASE_URL=https://openrouter.ai/api/v1|' $BACKEND_DIR/.env || echo "CHAT_BASE_URL=https://openrouter.ai/api/v1" >> $BACKEND_DIR/.env
```

### 3c. Stop conflicting containers

```bash
# Stop any running app containers (keep infra: supabase, redis, rabbitmq, clamav)
docker ps --format "{{.Names}}" | grep -E "rest_server|executor|copilot|websocket|database_manager|scheduler|notification|frontend|migrate" | while read name; do
  docker stop "$name" 2>/dev/null
done
```

### 3e. Build and start

```bash
cd $PLATFORM_DIR && docker compose build --no-cache 2>&1 | tail -20
if [ ${PIPESTATUS[0]} -ne 0 ]; then echo "ERROR: Docker build failed"; exit 1; fi

cd $PLATFORM_DIR && docker compose up -d 2>&1 | tail -20
if [ ${PIPESTATUS[0]} -ne 0 ]; then echo "ERROR: Docker compose up failed"; exit 1; fi
```

**Note:** If the container appears to be running old code (e.g. missing PR changes), use `docker compose build --no-cache` to force a full rebuild. Docker BuildKit may sometimes reuse cached `COPY` layers from a previous build on a different branch.

**Expected time: 3-8 minutes** for build, 5-10 minutes with `--no-cache`.

### 3f. Wait for services to be ready

```bash
# Poll until backend and frontend respond
for i in $(seq 1 60); do
  BACKEND=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8006/docs 2>/dev/null)
  FRONTEND=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 2>/dev/null)
  if [ "$BACKEND" = "200" ] && [ "$FRONTEND" = "200" ]; then
    echo "Services ready"
    break
  fi
  sleep 5
done
```


### 3h. Create test user and get auth token

```bash
ANON_KEY=$(grep "NEXT_PUBLIC_SUPABASE_ANON_KEY=" $FRONTEND_DIR/.env | sed 's/.*NEXT_PUBLIC_SUPABASE_ANON_KEY=//' | tr -d '[:space:]')

# Signup (idempotent — returns "User already registered" if exists)
RESULT=$(curl -s -X POST 'http://localhost:8000/auth/v1/signup' \
  -H "apikey: $ANON_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"email":"test@test.com","password":"testtest123"}')

# If "Database error finding user", restart supabase-auth and retry
if echo "$RESULT" | grep -q "Database error"; then
  docker restart supabase-auth && sleep 5
  curl -s -X POST 'http://localhost:8000/auth/v1/signup' \
    -H "apikey: $ANON_KEY" \
    -H 'Content-Type: application/json' \
    -d '{"email":"test@test.com","password":"testtest123"}'
fi

# Get auth token
TOKEN=$(curl -s -X POST 'http://localhost:8000/auth/v1/token?grant_type=password' \
  -H "apikey: $ANON_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"email":"test@test.com","password":"testtest123"}' | jq -r '.access_token // ""')
```

**Use this token for ALL API calls:**
```bash
curl -H "Authorization: Bearer $TOKEN" http://localhost:8006/api/...
```

## Step 4: Run tests

### Service ports reference

| Service | Port | URL |
|---------|------|-----|
| Frontend | 3000 | http://localhost:3000 |
| Backend REST | 8006 | http://localhost:8006 |
| Supabase Auth (via Kong) | 8000 | http://localhost:8000 |
| Executor | 8002 | http://localhost:8002 |
| Copilot Executor | 8008 | http://localhost:8008 |
| WebSocket | 8001 | http://localhost:8001 |
| Database Manager | 8005 | http://localhost:8005 |
| Redis | 6379 | localhost:6379 |
| RabbitMQ | 5672 | localhost:5672 |

### API testing

Use `curl` with the auth token for backend API tests. **For EVERY API call that changes state, record before/after values:**

```bash
# Example: List agents
curl -s -H "Authorization: Bearer $TOKEN" http://localhost:8006/api/graphs | jq . | head -20

# Example: Create an agent
curl -s -X POST http://localhost:8006/api/graphs \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{...}' | jq .

# Example: Run an agent
curl -s -X POST "http://localhost:8006/api/graphs/{graph_id}/execute" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"data": {...}}'

# Example: Get execution results
curl -s -H "Authorization: Bearer $TOKEN" \
  "http://localhost:8006/api/graphs/{graph_id}/executions/{exec_id}" | jq .
```

**State verification pattern (use for EVERY state-changing API call):**
```bash
# 1. Record BEFORE state
BEFORE_STATE=$(curl -s -H "Authorization: Bearer $TOKEN" http://localhost:8006/api/{resource} | jq '{relevant_fields}')
echo "BEFORE: $BEFORE_STATE"

# 2. Perform the action
ACTION_RESULT=$(curl -s -X POST ... | jq .)
echo "ACTION RESULT: $ACTION_RESULT"

# 3. Record AFTER state
AFTER_STATE=$(curl -s -H "Authorization: Bearer $TOKEN" http://localhost:8006/api/{resource} | jq '{relevant_fields}')
echo "AFTER: $AFTER_STATE"

# 4. Log the comparison
echo "=== STATE CHANGE VERIFICATION ==="
echo "Before: $BEFORE_STATE"
echo "After: $AFTER_STATE"
echo "Expected change: {describe what should have changed}"
```

### Browser testing with agent-browser

```bash
# Close any existing session
agent-browser close 2>/dev/null || true

# Use --session-name to persist cookies across navigations
# This means login only needs to happen once per test session
agent-browser --session-name pr-test open 'http://localhost:3000/login' --timeout 15000

# Get interactive elements
agent-browser --session-name pr-test snapshot | grep "textbox\|button"

# Login
agent-browser --session-name pr-test fill {email_ref} "test@test.com"
agent-browser --session-name pr-test fill {password_ref} "testtest123"
agent-browser --session-name pr-test click {login_button_ref}
sleep 5

# Dismiss cookie banner if present
agent-browser --session-name pr-test click 'text=Accept All' 2>/dev/null || true

# Navigate — cookies are preserved so login persists
agent-browser --session-name pr-test open 'http://localhost:3000/copilot' --timeout 10000

# Take screenshot
agent-browser --session-name pr-test screenshot $RESULTS_DIR/01-page.png

# Interact with elements
agent-browser --session-name pr-test fill {ref} "text"
agent-browser --session-name pr-test press "Enter"
agent-browser --session-name pr-test click {ref}
agent-browser --session-name pr-test click 'text=Button Text'

# Read page content
agent-browser --session-name pr-test snapshot | grep "text:"
```

**Key pages:**
- `/copilot` — CoPilot chat (for testing copilot features)
- `/build` — Agent builder (for testing block/node features)
- `/build?flowID={id}` — Specific agent in builder
- `/library` — Agent library (for testing listing/import features)
- `/library/agents/{id}` — Agent detail with run history
- `/marketplace` — Marketplace

### Checking logs

```bash
# Backend REST server
docker logs autogpt_platform-rest_server-1 2>&1 | tail -30

# Executor (runs agent graphs)
docker logs autogpt_platform-executor-1 2>&1 | tail -30

# Copilot executor (runs copilot chat sessions)
docker logs autogpt_platform-copilot_executor-1 2>&1 | tail -30

# Frontend
docker logs autogpt_platform-frontend-1 2>&1 | tail -30

# Filter for errors
docker logs autogpt_platform-executor-1 2>&1 | grep -i "error\|exception\|traceback" | tail -20
```

### Copilot chat testing

The copilot uses SSE streaming. To test via API:

```bash
# Create a session
SESSION_ID=$(curl -s -X POST 'http://localhost:8006/api/chat/sessions' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{}' | jq -r '.id // .session_id // ""')

# Stream a message (SSE - will stream chunks)
curl -N -X POST "http://localhost:8006/api/chat/sessions/$SESSION_ID/stream" \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"message": "Hello, what can you help me with?"}' \
  --max-time 60 2>/dev/null | head -50
```

Or test via browser (preferred for UI verification):
```bash
agent-browser --session-name pr-test open 'http://localhost:3000/copilot' --timeout 10000
# ... fill chat input and press Enter, wait 20-30s for response
```

## Step 5: Record results and take screenshots

**Take a screenshot at EVERY significant test step** — before and after interactions, on success, and on failure. This is NON-NEGOTIABLE.

**Required screenshot pattern for each test scenario:**
```bash
# BEFORE the action
agent-browser --session-name pr-test screenshot $RESULTS_DIR/{NN}-{scenario}-before.png

# Perform the action...

# AFTER the action
agent-browser --session-name pr-test screenshot $RESULTS_DIR/{NN}-{scenario}-after.png
```

**Naming convention:**
```bash
# Examples:
# $RESULTS_DIR/01-login-page-before.png
# $RESULTS_DIR/02-login-page-after.png
# $RESULTS_DIR/03-credits-page-before.png
# $RESULTS_DIR/04-credits-purchase-after.png
# $RESULTS_DIR/05-negative-insufficient-credits.png
# $RESULTS_DIR/06-error-state.png
```

**Minimum requirements:**
- At least TWO screenshots per test scenario (before + after)
- At least ONE screenshot for each negative test case showing the error state
- If a test fails, screenshot the failure state AND any error logs visible in the UI

## Step 6: Show results to user with screenshots

**CRITICAL: After all tests complete, you MUST show every screenshot to the user using the Read tool, with an explanation of what each screenshot shows.** This is the most important part of the test report — the user needs to visually verify the results.

For each screenshot:
1. Use the `Read` tool to display the PNG file (Claude can read images)
2. Write a 1-2 sentence explanation below it describing:
   - What page/state is being shown
   - What the screenshot proves (which test scenario it validates)
   - Any notable details visible in the UI

Format the output like this:

```markdown
### Screenshot 1: {descriptive title}
[Read the PNG file here]

**What it shows:** {1-2 sentence explanation of what this screenshot proves}

---
```

After showing all screenshots, output a **detailed** summary table:

| # | Scenario | Result | API Evidence | Screenshot Evidence |
|---|----------|--------|-------------|-------------------|
| 1 | {name} | PASS/FAIL | Before: X, After: Y | 01-before.png, 02-after.png |
| 2 | ... | ... | ... | ... |

**IMPORTANT:** As you show each screenshot and record test results, persist them in shell variables for Step 7:

```bash
# Build these variables during Step 6 — they are required by Step 7's script
# NOTE: declare -A requires Bash 4.0+. This is standard on modern systems (macOS ships zsh
# but Homebrew bash is 5.x; Linux typically has bash 5.x). If running on Bash <4, use a
# plain variable with a lookup function instead.
declare -A SCREENSHOT_EXPLANATIONS=(
  ["01-login-page.png"]="Shows the login page loaded successfully with SSO options visible."
  ["02-builder-with-block.png"]="The builder canvas displays the newly added block connected to the trigger."
  # ... one entry per screenshot, using the same explanations you showed the user above
)

TEST_RESULTS_TABLE="| 1 | Login flow | PASS | N/A | 01-login-before.png, 02-login-after.png |
| 2 | Credits purchase | PASS | Before: 100, After: 95 | 03-credits-before.png, 04-credits-after.png |
| 3 | Insufficient credits (negative) | PASS | Credits: 0, rejected | 05-insufficient-credits-error.png |"
# ... one row per test scenario with actual results
```

## Step 7: Post test report as PR comment with screenshots

Upload screenshots to the PR using the GitHub Git API (no local git operations — safe for worktrees), then post a comment with inline images and per-screenshot explanations.

**This step is MANDATORY. Every test run MUST post a PR comment with screenshots. No exceptions.**

```bash
# Upload screenshots via GitHub Git API (creates blobs, tree, commit, and ref remotely)
REPO="Significant-Gravitas/AutoGPT"
SCREENSHOTS_BRANCH="test-screenshots/pr-${PR_NUMBER}"
SCREENSHOTS_DIR="test-screenshots/PR-${PR_NUMBER}"

# Step 1: Create blobs for each screenshot and build tree JSON
# Retry each blob upload up to 3 times. If still failing, list them at end of report.
shopt -s nullglob
SCREENSHOT_FILES=("$RESULTS_DIR"/*.png)
if [ ${#SCREENSHOT_FILES[@]} -eq 0 ]; then
  echo "ERROR: No screenshots found in $RESULTS_DIR. Test run is incomplete."
  exit 1
fi
TREE_JSON='['
FIRST=true
FAILED_UPLOADS=()
for img in "${SCREENSHOT_FILES[@]}"; do
  BASENAME=$(basename "$img")
  B64=$(base64 < "$img")
  BLOB_SHA=""
  for attempt in 1 2 3; do
    BLOB_SHA=$(gh api "repos/${REPO}/git/blobs" -f content="$B64" -f encoding="base64" --jq '.sha' 2>/dev/null || true)
    [ -n "$BLOB_SHA" ] && break
    sleep 1
  done
  if [ -z "$BLOB_SHA" ]; then
    FAILED_UPLOADS+=("$img")
    continue
  fi
  if [ "$FIRST" = true ]; then FIRST=false; else TREE_JSON+=','; fi
  TREE_JSON+="{\"path\":\"${SCREENSHOTS_DIR}/${BASENAME}\",\"mode\":\"100644\",\"type\":\"blob\",\"sha\":\"${BLOB_SHA}\"}"
done
TREE_JSON+=']'

# Step 2: Create tree, commit, and branch ref
TREE_SHA=$(echo "$TREE_JSON" | jq -c '{tree: .}' | gh api "repos/${REPO}/git/trees" --input - --jq '.sha')
COMMIT_SHA=$(gh api "repos/${REPO}/git/commits" \
  -f message="test: add E2E test screenshots for PR #${PR_NUMBER}" \
  -f tree="$TREE_SHA" \
  --jq '.sha')
gh api "repos/${REPO}/git/refs" \
  -f ref="refs/heads/${SCREENSHOTS_BRANCH}" \
  -f sha="$COMMIT_SHA" 2>/dev/null \
  || gh api "repos/${REPO}/git/refs/heads/${SCREENSHOTS_BRANCH}" \
    -X PATCH -f sha="$COMMIT_SHA" -f force=true
```

Then post the comment with **inline images AND explanations for each screenshot**:

```bash
REPO_URL="https://raw.githubusercontent.com/${REPO}/${SCREENSHOTS_BRANCH}"

# Build image markdown using uploaded image URLs; skip FAILED_UPLOADS (listed separately)

IMAGE_MARKDOWN=""
for img in "${SCREENSHOT_FILES[@]}"; do
  BASENAME=$(basename "$img")
  TITLE=$(echo "${BASENAME%.png}" | sed 's/^[0-9]*-//' | sed 's/-/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2))}1')
  # Skip images that failed to upload — they will be listed at the end
  IS_FAILED=false
  for failed in "${FAILED_UPLOADS[@]}"; do
    [ "$(basename "$failed")" = "$BASENAME" ] && IS_FAILED=true && break
  done
  if [ "$IS_FAILED" = true ]; then
    continue
  fi
  EXPLANATION="${SCREENSHOT_EXPLANATIONS[$BASENAME]}"
  if [ -z "$EXPLANATION" ]; then
    echo "ERROR: Missing screenshot explanation for $BASENAME. Add it to SCREENSHOT_EXPLANATIONS in Step 6."
    exit 1
  fi
  IMAGE_MARKDOWN="${IMAGE_MARKDOWN}
### ${TITLE}
![${BASENAME}](${REPO_URL}/${SCREENSHOTS_DIR}/${BASENAME})
${EXPLANATION}
"
done

# Write comment body to file to avoid shell interpretation issues with special characters
COMMENT_FILE=$(mktemp)
# If any uploads failed, append a section listing them with instructions
FAILED_SECTION=""
if [ ${#FAILED_UPLOADS[@]} -gt 0 ]; then
  FAILED_SECTION="
## ⚠️ Failed Screenshot Uploads
The following screenshots could not be uploaded via the GitHub API after 3 retries.
**To add them:** drag-and-drop or paste these files into a PR comment manually:
"
  for failed in "${FAILED_UPLOADS[@]}"; do
    FAILED_SECTION="${FAILED_SECTION}
- \`$(basename "$failed")\` (local path: \`$failed\`)"
  done
  FAILED_SECTION="${FAILED_SECTION}

**Run status:** INCOMPLETE until the files above are manually attached and visible inline in the PR."
fi

cat > "$COMMENT_FILE" <<INNEREOF
## E2E Test Report

| # | Scenario | Result | API Evidence | Screenshot Evidence |
|---|----------|--------|-------------|-------------------|
${TEST_RESULTS_TABLE}

${IMAGE_MARKDOWN}
${FAILED_SECTION}
INNEREOF

gh api "repos/${REPO}/issues/$PR_NUMBER/comments" -F body=@"$COMMENT_FILE"
rm -f "$COMMENT_FILE"
```

**The PR comment MUST include:**
1. A summary table of all scenarios with PASS/FAIL and before/after API evidence
2. Every successfully uploaded screenshot rendered inline; any failed uploads listed with manual attachment instructions
3. A 1-2 sentence explanation below each screenshot describing what it proves

This approach uses the GitHub Git API to create blobs, trees, commits, and refs entirely server-side. No local `git checkout` or `git push` — safe for worktrees and won't interfere with the PR branch.

## Fix mode (--fix flag)

When `--fix` is present, the standard is HIGHER. Do not just note issues — FIX them immediately.

### Fix protocol for EVERY issue found (including UX issues):

1. **Identify** the root cause in the code — read the relevant source files
2. **Write a failing test first** (TDD): For backend bugs, write a test marked with `pytest.mark.xfail(reason="...")`. For frontend/Playwright bugs, write a test with `.fixme` annotation. Run it to confirm it fails as expected.
3. **Screenshot** the broken state: `agent-browser screenshot $RESULTS_DIR/{NN}-broken-{description}.png`
4. **Fix** the code in the worktree
5. **Rebuild** ONLY the affected service (not the whole stack):
   ```bash
   cd $PLATFORM_DIR && docker compose up --build -d {service_name}
   # e.g., docker compose up --build -d rest_server
   # e.g., docker compose up --build -d frontend
   ```
6. **Wait** for the service to be ready (poll health endpoint)
7. **Re-test** the same scenario
8. **Screenshot** the fixed state: `agent-browser screenshot $RESULTS_DIR/{NN}-fixed-{description}.png`
9. **Remove the xfail/fixme marker** from the test written in step 2, and verify it passes
10. **Verify** the fix did not break other scenarios (run a quick smoke test)
11. **Commit and push** immediately:
   ```bash
   cd $WORKTREE_PATH
   git add -A
   git commit -m "fix: {description of fix}"
   git push
   ```
12. **Continue** to the next test scenario

### Fix loop (like pr-address)

```text
test scenario → find issue (bug OR UX problem) → screenshot broken state
→ fix code → rebuild affected service only → re-test → screenshot fixed state
→ verify no regressions → commit + push
→ repeat for next scenario
→ after ALL scenarios pass, run full re-test to verify everything together
```

**Key differences from non-fix mode:**
- UX issues count as bugs — fix them (bad alignment, confusing labels, missing loading states)
- Every fix MUST have a before/after screenshot pair proving it works
- Commit after EACH fix, not in a batch at the end
- The final re-test must produce a clean set of all-passing screenshots

## Known issues and workarounds

### Problem: "Database error finding user" on signup
**Cause:** Supabase auth service schema cache is stale after migration.
**Fix:** `docker restart supabase-auth && sleep 5` then retry signup.

### Problem: Copilot returns auth errors in subscription mode
**Cause:** `CHAT_USE_CLAUDE_CODE_SUBSCRIPTION=true` but `CLAUDE_CODE_OAUTH_TOKEN` is not set or expired.
**Fix:** Re-extract the OAuth token from macOS keychain (see step 3b, Option 1) and recreate the container (`docker compose up -d copilot_executor`). The backend auto-provisions `~/.claude/.credentials.json` from the env var on startup. No `npm install` or `claude login` needed — the SDK bundles its own CLI binary.

### Problem: agent-browser can't find chromium
**Cause:** The Dockerfile auto-provisions system chromium on all architectures (including ARM64). If your branch is behind `dev`, this may not be present yet.
**Fix:** Check if chromium exists: `which chromium || which chromium-browser`. If missing, install it: `apt-get install -y chromium` and set `AGENT_BROWSER_EXECUTABLE_PATH=/usr/bin/chromium` in the container environment.

### Problem: agent-browser selector matches multiple elements
**Cause:** `text=X` matches all elements containing that text.
**Fix:** Use `agent-browser snapshot` to get specific `ref=eNN` references, then use those: `agent-browser click eNN`.

### Problem: Frontend shows cookie banner blocking interaction
**Fix:** `agent-browser click 'text=Accept All'` before other interactions.

### Problem: Container loses npm packages after rebuild
**Cause:** `docker compose up --build` rebuilds the image, losing runtime installs.
**Fix:** Add packages to the Dockerfile instead of installing at runtime.

### Problem: Services not starting after `docker compose up`
**Fix:** Wait and check health: `docker compose ps`. Common cause: migration hasn't finished. Check: `docker logs autogpt_platform-migrate-1 2>&1 | tail -5`. If supabase-db isn't healthy: `docker restart supabase-db && sleep 10`.

### Problem: Docker uses cached layers with old code (PR changes not visible)
**Cause:** `docker compose up --build` reuses cached `COPY` layers from previous builds. If the PR branch changes Python files but the previous build already cached that layer from `dev`, the container runs `dev` code.
**Fix:** Always use `docker compose build --no-cache` for the first build of a PR branch. Subsequent rebuilds within the same branch can use `--build`.

### Problem: `agent-browser open` loses login session
**Cause:** Without session persistence, `agent-browser open` starts fresh.
**Fix:** Use `--session-name pr-test` on ALL agent-browser commands. This auto-saves/restores cookies and localStorage across navigations. Alternatively, use `agent-browser eval "window.location.href = '...'"` to navigate within the same context.

### Problem: Supabase auth returns "Database error querying schema"
**Cause:** The database schema changed (migration ran) but supabase-auth has a stale schema cache.
**Fix:** `docker restart supabase-db && sleep 10 && docker restart supabase-auth && sleep 8`. If user data was lost, re-signup.


================================================
FILE: .claude/skills/vercel-react-best-practices/AGENTS.md
================================================
# React Best Practices

**Version 1.0.0**  
Vercel Engineering  
January 2026

> **Note:**  
> This document is mainly for agents and LLMs to follow when maintaining,  
> generating, or refactoring React and Next.js codebases at Vercel. Humans  
> may also find it useful, but guidance here is optimized for automation  
> and consistency by AI-assisted workflows.

---

## Abstract

Comprehensive performance optimization guide for React and Next.js applications, designed for AI agents and LLMs. Contains 40+ rules across 8 categories, prioritized by impact from critical (eliminating waterfalls, reducing bundle size) to incremental (advanced patterns). Each rule includes detailed explanations, real-world examples comparing incorrect vs. correct implementations, and specific impact metrics to guide automated refactoring and code generation.

---

## Table of Contents

1. [Eliminating Waterfalls](#1-eliminating-waterfalls) — **CRITICAL**
   - 1.1 [Defer Await Until Needed](#11-defer-await-until-needed)
   - 1.2 [Dependency-Based Parallelization](#12-dependency-based-parallelization)
   - 1.3 [Prevent Waterfall Chains in API Routes](#13-prevent-waterfall-chains-in-api-routes)
   - 1.4 [Promise.all() for Independent Operations](#14-promiseall-for-independent-operations)
   - 1.5 [Strategic Suspense Boundaries](#15-strategic-suspense-boundaries)
2. [Bundle Size Optimization](#2-bundle-size-optimization) — **CRITICAL**
   - 2.1 [Avoid Barrel File Imports](#21-avoid-barrel-file-imports)
   - 2.2 [Conditional Module Loading](#22-conditional-module-loading)
   - 2.3 [Defer Non-Critical Third-Party Libraries](#23-defer-non-critical-third-party-libraries)
   - 2.4 [Dynamic Imports for Heavy Components](#24-dynamic-imports-for-heavy-components)
   - 2.5 [Preload Based on User Intent](#25-preload-based-on-user-intent)
3. [Server-Side Performance](#3-server-side-performance) — **HIGH**
   - 3.1 [Cross-Request LRU Caching](#31-cross-request-lru-caching)
   - 3.2 [Minimize Serialization at RSC Boundaries](#32-minimize-serialization-at-rsc-boundaries)
   - 3.3 [Parallel Data Fetching with Component Composition](#33-parallel-data-fetching-with-component-composition)
   - 3.4 [Per-Request Deduplication with React.cache()](#34-per-request-deduplication-with-reactcache)
   - 3.5 [Use after() for Non-Blocking Operations](#35-use-after-for-non-blocking-operations)
4. [Client-Side Data Fetching](#4-client-side-data-fetching) — **MEDIUM-HIGH**
   - 4.1 [Deduplicate Global Event Listeners](#41-deduplicate-global-event-listeners)
   - 4.2 [Use SWR for Automatic Deduplication](#42-use-swr-for-automatic-deduplication)
5. [Re-render Optimization](#5-re-render-optimization) — **MEDIUM**
   - 5.1 [Defer State Reads to Usage Point](#51-defer-state-reads-to-usage-point)
   - 5.2 [Extract to Memoized Components](#52-extract-to-memoized-components)
   - 5.3 [Narrow Effect Dependencies](#53-narrow-effect-dependencies)
   - 5.4 [Subscribe to Derived State](#54-subscribe-to-derived-state)
   - 5.5 [Use Functional setState Updates](#55-use-functional-setstate-updates)
   - 5.6 [Use Lazy State Initialization](#56-use-lazy-state-initialization)
   - 5.7 [Use Transitions for Non-Urgent Updates](#57-use-transitions-for-non-urgent-updates)
6. [Rendering Performance](#6-rendering-performance) — **MEDIUM**
   - 6.1 [Animate SVG Wrapper Instead of SVG Element](#61-animate-svg-wrapper-instead-of-svg-element)
   - 6.2 [CSS content-visibility for Long Lists](#62-css-content-visibility-for-long-lists)
   - 6.3 [Hoist Static JSX Elements](#63-hoist-static-jsx-elements)
   - 6.4 [Optimize SVG Precision](#64-optimize-svg-precision)
   - 6.5 [Prevent Hydration Mismatch Without Flickering](#65-prevent-hydration-mismatch-without-flickering)
   - 6.6 [Use Activity Component for Show/Hide](#66-use-activity-component-for-showhide)
   - 6.7 [Use Explicit Conditional Rendering](#67-use-explicit-conditional-rendering)
7. [JavaScript Performance](#7-javascript-performance) — **LOW-MEDIUM**
   - 7.1 [Batch DOM CSS Changes](#71-batch-dom-css-changes)
   - 7.2 [Build Index Maps for Repeated Lookups](#72-build-index-maps-for-repeated-lookups)
   - 7.3 [Cache Property Access in Loops](#73-cache-property-access-in-loops)
   - 7.4 [Cache Repeated Function Calls](#74-cache-repeated-function-calls)
   - 7.5 [Cache Storage API Calls](#75-cache-storage-api-calls)
   - 7.6 [Combine Multiple Array Iterations](#76-combine-multiple-array-iterations)
   - 7.7 [Early Length Check for Array Comparisons](#77-early-length-check-for-array-comparisons)
   - 7.8 [Early Return from Functions](#78-early-return-from-functions)
   - 7.9 [Hoist RegExp Creation](#79-hoist-regexp-creation)
   - 7.10 [Use Loop for Min/Max Instead of Sort](#710-use-loop-for-minmax-instead-of-sort)
   - 7.11 [Use Set/Map for O(1) Lookups](#711-use-setmap-for-o1-lookups)
   - 7.12 [Use toSorted() Instead of sort() for Immutability](#712-use-tosorted-instead-of-sort-for-immutability)
8. [Advanced Patterns](#8-advanced-patterns) — **LOW**
   - 8.1 [Store Event Handlers in Refs](#81-store-event-handlers-in-refs)
   - 8.2 [useLatest for Stable Callback Refs](#82-uselatest-for-stable-callback-refs)

---

## 1. Eliminating Waterfalls

**Impact: CRITICAL**

Waterfalls are the #1 performance killer. Each sequential await adds full network latency. Eliminating them yields the largest gains.

### 1.1 Defer Await Until Needed

**Impact: HIGH (avoids blocking unused code paths)**

Move `await` operations into the branches where they're actually used to avoid blocking code paths that don't need them.

**Incorrect: blocks both branches**

```typescript
async function handleRequest(userId: string, skipProcessing: boolean) {
  const userData = await fetchUserData(userId)
  
  if (skipProcessing) {
    // Returns immediately but still waited for userData
    return { skipped: true }
  }
  
  // Only this branch uses userData
  return processUserData(userData)
}
```

**Correct: only blocks when needed**

```typescript
async function handleRequest(userId: string, skipProcessing: boolean) {
  if (skipProcessing) {
    // Returns immediately without waiting
    return { skipped: true }
  }
  
  // Fetch only when needed
  const userData = await fetchUserData(userId)
  return processUserData(userData)
}
```

**Another example: early return optimization**

```typescript
// Incorrect: always fetches permissions
async function updateResource(resourceId: string, userId: string) {
  const permissions = await fetchPermissions(userId)
  const resource = await getResource(resourceId)
  
  if (!resource) {
    return { error: 'Not found' }
  }
  
  if (!permissions.canEdit) {
    return { error: 'Forbidden' }
  }
  
  return await updateResourceData(resource, permissions)
}

// Correct: fetches only when needed
async function updateResource(resourceId: string, userId: string) {
  const resource = await getResource(resourceId)
  
  if (!resource) {
    return { error: 'Not found' }
  }
  
  const permissions = await fetchPermissions(userId)
  
  if (!permissions.canEdit) {
    return { error: 'Forbidden' }
  }
  
  return await updateResourceData(resource, permissions)
}
```

This optimization is especially valuable when the skipped branch is frequently taken, or when the deferred operation is expensive.

### 1.2 Dependency-Based Parallelization

**Impact: CRITICAL (2-10× improvement)**

For operations with partial dependencies, use `better-all` to maximize parallelism. It automatically starts each task at the earliest possible moment.

**Incorrect: profile waits for config unnecessarily**

```typescript
const [user, config] = await Promise.all([
  fetchUser(),
  fetchConfig()
])
const profile = await fetchProfile(user.id)
```

**Correct: config and profile run in parallel**

```typescript
import { all } from 'better-all'

const { user, config, profile } = await all({
  async user() { return fetchUser() },
  async config() { return fetchConfig() },
  async profile() {
    return fetchProfile((await this.$.user).id)
  }
})
```

Reference: [https://github.com/shuding/better-all](https://github.com/shuding/better-all)

### 1.3 Prevent Waterfall Chains in API Routes

**Impact: CRITICAL (2-10× improvement)**

In API routes and Server Actions, start independent operations immediately, even if you don't await them yet.

**Incorrect: config waits for auth, data waits for both**

```typescript
export async function GET(request: Request) {
  const session = await auth()
  const config = await fetchConfig()
  const data = await fetchData(session.user.id)
  return Response.json({ data, config })
}
```

**Correct: auth and config start immediately**

```typescript
export async function GET(request: Request) {
  const sessionPromise = auth()
  const configPromise = fetchConfig()
  const session = await sessionPromise
  const [config, data] = await Promise.all([
    configPromise,
    fetchData(session.user.id)
  ])
  return Response.json({ data, config })
}
```

For operations with more complex dependency chains, use `better-all` to automatically maximize parallelism (see Dependency-Based Parallelization).

### 1.4 Promise.all() for Independent Operations

**Impact: CRITICAL (2-10× improvement)**

When async operations have no interdependencies, execute them concurrently using `Promise.all()`.

**Incorrect: sequential execution, 3 round trips**

```typescript
const user = await fetchUser()
const posts = await fetchPosts()
const comments = await fetchComments()
```

**Correct: parallel execution, 1 round trip**

```typescript
const [user, posts, comments] = await Promise.all([
  fetchUser(),
  fetchPosts(),
  fetchComments()
])
```

### 1.5 Strategic Suspense Boundaries

**Impact: HIGH (faster initial paint)**

Instead of awaiting data in async components before returning JSX, use Suspense boundaries to show the wrapper UI faster while data loads.

**Incorrect: wrapper blocked by data fetching**

```tsx
async function Page() {
  const data = await fetchData() // Blocks entire page
  
  return (
    <div>
      <div>Sidebar</div>
      <div>Header</div>
      <div>
        <DataDisplay data={data} />
      </div>
      <div>Footer</div>
    </div>
  )
}
```

The entire layout waits for data even though only the middle section needs it.

**Correct: wrapper shows immediately, data streams in**

```tsx
function Page() {
  return (
    <div>
      <div>Sidebar</div>
      <div>Header</div>
      <div>
        <Suspense fallback={<Skeleton />}>
          <DataDisplay />
        </Suspense>
      </div>
      <div>Footer</div>
    </div>
  )
}

async function DataDisplay() {
  const data = await fetchData() // Only blocks this component
  return <div>{data.content}</div>
}
```

Sidebar, Header, and Footer render immediately. Only DataDisplay waits for data.

**Alternative: share promise across components**

```tsx
function Page() {
  // Start fetch immediately, but don't await
  const dataPromise = fetchData()
  
  return (
    <div>
      <div>Sidebar</div>
      <div>Header</div>
      <Suspense fallback={<Skeleton />}>
        <DataDisplay dataPromise={dataPromise} />
        <DataSummary dataPromise={dataPromise} />
      </Suspense>
      <div>Footer</div>
    </div>
  )
}

function DataDisplay({ dataPromise }: { dataPromise: Promise<Data> }) {
  const data = use(dataPromise) // Unwraps the promise
  return <div>{data.content}</div>
}

function DataSummary({ dataPromise }: { dataPromise: Promise<Data> }) {
  const data = use(dataPromise) // Reuses the same promise
  return <div>{data.summary}</div>
}
```

Both components share the same promise, so only one fetch occurs. Layout renders immediately while both components wait together.

**When NOT to use this pattern:**

- Critical data needed for layout decisions (affects positioning)

- SEO-critical content above the fold

- Small, fast queries where suspense overhead isn't worth it

- When you want to avoid layout shift (loading → content jump)

**Trade-off:** Faster initial paint vs potential layout shift. Choose based on your UX priorities.

---

## 2. Bundle Size Optimization

**Impact: CRITICAL**

Reducing initial bundle size improves Time to Interactive and Largest Contentful Paint.

### 2.1 Avoid Barrel File Imports

**Impact: CRITICAL (200-800ms import cost, slow builds)**

Import directly from source files instead of barrel files to avoid loading thousands of unused modules. **Barrel files** are entry points that re-export multiple modules (e.g., `index.js` that does `export * from './module'`).

Popular icon and component libraries can have **up to 10,000 re-exports** in their entry file. For many React packages, **it takes 200-800ms just to import them**, affecting both development speed and production cold starts.

**Why tree-shaking doesn't help:** When a library is marked as external (not bundled), the bundler can't optimize it. If you bundle it to enable tree-shaking, builds become substantially slower analyzing the entire module graph.

**Incorrect: imports entire library**

```tsx
import { Check, X, Menu } from 'lucide-react'
// Loads 1,583 modules, takes ~2.8s extra in dev
// Runtime cost: 200-800ms on every cold start

import { Button, TextField } from '@mui/material'
// Loads 2,225 modules, takes ~4.2s extra in dev
```

**Correct: imports only what you need**

```tsx
import Check from 'lucide-react/dist/esm/icons/check'
import X from 'lucide-react/dist/esm/icons/x'
import Menu from 'lucide-react/dist/esm/icons/menu'
// Loads only 3 modules (~2KB vs ~1MB)

import Button from '@mui/material/Button'
import TextField from '@mui/material/TextField'
// Loads only what you use
```

**Alternative: Next.js 13.5+**

```js
// next.config.js - use optimizePackageImports
module.exports = {
  experimental: {
    optimizePackageImports: ['lucide-react', '@mui/material']
  }
}

// Then you can keep the ergonomic barrel imports:
import { Check, X, Menu } from 'lucide-react'
// Automatically transformed to direct imports at build time
```

Direct imports provide 15-70% faster dev boot, 28% faster builds, 40% faster cold starts, and significantly faster HMR.

Libraries commonly affected: `lucide-react`, `@mui/material`, `@mui/icons-material`, `@tabler/icons-react`, `react-icons`, `@headlessui/react`, `@radix-ui/react-*`, `lodash`, `ramda`, `date-fns`, `rxjs`, `react-use`.

Reference: [https://vercel.com/blog/how-we-optimized-package-imports-in-next-js](https://vercel.com/blog/how-we-optimized-package-imports-in-next-js)

### 2.2 Conditional Module Loading

**Impact: HIGH (loads large data only when needed)**

Load large data or modules only when a feature is activated.

**Example: lazy-load animation frames**

```tsx
function AnimationPlayer({ enabled }: { enabled: boolean }) {
  const [frames, setFrames] = useState<Frame[] | null>(null)

  useEffect(() => {
    if (enabled && !frames && typeof window !== 'undefined') {
      import('./animation-frames.js')
        .then(mod => setFrames(mod.frames))
        .catch(() => setEnabled(false))
    }
  }, [enabled, frames])

  if (!frames) return <Skeleton />
  return <Canvas frames={frames} />
}
```

The `typeof window !== 'undefined'` check prevents bundling this module for SSR, optimizing server bundle size and build speed.

### 2.3 Defer Non-Critical Third-Party Libraries

**Impact: MEDIUM (loads after hydration)**

Analytics, logging, and error tracking don't block user interaction. Load them after hydration.

**Incorrect: blocks initial bundle**

```tsx
import { Analytics } from '@vercel/analytics/react'

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        {children}
        <Analytics />
      </body>
    </html>
  )
}
```

**Correct: loads after hydration**

```tsx
import dynamic from 'next/dynamic'

const Analytics = dynamic(
  () => import('@vercel/analytics/react').then(m => m.Analytics),
  { ssr: false }
)

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        {children}
        <Analytics />
      </body>
    </html>
  )
}
```

### 2.4 Dynamic Imports for Heavy Components

**Impact: CRITICAL (directly affects TTI and LCP)**

Use `next/dynamic` to lazy-load large components not needed on initial render.

**Incorrect: Monaco bundles with main chunk ~300KB**

```tsx
import { MonacoEditor } from './monaco-editor'

function CodePanel({ code }: { code: string }) {
  return <MonacoEditor value={code} />
}
```

**Correct: Monaco loads on demand**

```tsx
import dynamic from 'next/dynamic'

const MonacoEditor = dynamic(
  () => import('./monaco-editor').then(m => m.MonacoEditor),
  { ssr: false }
)

function CodePanel({ code }: { code: string }) {
  return <MonacoEditor value={code} />
}
```

### 2.5 Preload Based on User Intent

**Impact: MEDIUM (reduces perceived latency)**

Preload heavy bundles before they're needed to reduce perceived latency.

**Example: preload on hover/focus**

```tsx
function EditorButton({ onClick }: { onClick: () => void }) {
  const preload = () => {
    if (typeof window !== 'undefined') {
      void import('./monaco-editor')
    }
  }

  return (
    <button
      onMouseEnter={preload}
      onFocus={preload}
      onClick={onClick}
    >
      Open Editor
    </button>
  )
}
```

**Example: preload when feature flag is enabled**

```tsx
function FlagsProvider({ children, flags }: Props) {
  useEffect(() => {
    if (flags.editorEnabled && typeof window !== 'undefined') {
      void import('./monaco-editor').then(mod => mod.init())
    }
  }, [flags.editorEnabled])

  return <FlagsContext.Provider value={flags}>
    {children}
  </FlagsContext.Provider>
}
```

The `typeof window !== 'undefined'` check prevents bundling preloaded modules for SSR, optimizing server bundle size and build speed.

---

## 3. Server-Side Performance

**Impact: HIGH**

Optimizing server-side rendering and data fetching eliminates server-side waterfalls and reduces response times.

### 3.1 Cross-Request LRU Caching

**Impact: HIGH (caches across requests)**

`React.cache()` only works within one request. For data shared across sequential requests (user clicks button A then button B), use an LRU cache.

**Implementation:**

```typescript
import { LRUCache } from 'lru-cache'

const cache = new LRUCache<string, any>({
  max: 1000,
  ttl: 5 * 60 * 1000  // 5 minutes
})

export async function getUser(id: string) {
  const cached = cache.get(id)
  if (cached) return cached

  const user = await db.user.findUnique({ where: { id } })
  cache.set(id, user)
  return user
}

// Request 1: DB query, result cached
// Request 2: cache hit, no DB query
```

Use when sequential user actions hit multiple endpoints needing the same data within seconds.

**With Vercel's [Fluid Compute](https://vercel.com/docs/fluid-compute):** LRU caching is especially effective because multiple concurrent requests can share the same function instance and cache. This means the cache persists across requests without needing external storage like Redis.

**In traditional serverless:** Each invocation runs in isolation, so consider Redis for cross-process caching.

Reference: [https://github.com/isaacs/node-lru-cache](https://github.com/isaacs/node-lru-cache)

### 3.2 Minimize Serialization at RSC Boundaries

**Impact: HIGH (reduces data transfer size)**

The React Server/Client boundary serializes all object properties into strings and embeds them in the HTML response and subsequent RSC requests. This serialized data directly impacts page weight and load time, so **size matters a lot**. Only pass fields that the client actually uses.

**Incorrect: serializes all 50 fields**

```tsx
async function Page() {
  const user = await fetchUser()  // 50 fields
  return <Profile user={user} />
}

'use client'
function Profile({ user }: { user: User }) {
  return <div>{user.name}</div>  // uses 1 field
}
```

**Correct: serializes only 1 field**

```tsx
async function Page() {
  const user = await fetchUser()
  return <Profile name={user.name} />
}

'use client'
function Profile({ name }: { name: string }) {
  return <div>{name}</div>
}
```

### 3.3 Parallel Data Fetching with Component Composition

**Impact: CRITICAL (eliminates server-side waterfalls)**

React Server Components execute sequentially within a tree. Restructure with composition to parallelize data fetching.

**Incorrect: Sidebar waits for Page's fetch to complete**

```tsx
export default async function Page() {
  const header = await fetchHeader()
  return (
    <div>
      <div>{header}</div>
      <Sidebar />
    </div>
  )
}

async function Sidebar() {
  const items = await fetchSidebarItems()
  return <nav>{items.map(renderItem)}</nav>
}
```

**Correct: both fetch simultaneously**

```tsx
async function Header() {
  const data = await fetchHeader()
  return <div>{data}</div>
}

async function Sidebar() {
  const items = await fetchSidebarItems()
  return <nav>{items.map(renderItem)}</nav>
}

export default function Page() {
  return (
    <div>
      <Header />
      <Sidebar />
    </div>
  )
}
```

**Alternative with children prop:**

```tsx
async function Layout({ children }: { children: ReactNode }) {
  const header = await fetchHeader()
  return (
    <div>
      <div>{header}</div>
      {children}
    </div>
  )
}

async function Sidebar() {
  const items = await fetchSidebarItems()
  return <nav>{items.map(renderItem)}</nav>
}

export default function Page() {
  return (
    <Layout>
      <Sidebar />
    </Layout>
  )
}
```

### 3.4 Per-Request Deduplication with React.cache()

**Impact: MEDIUM (deduplicates within request)**

Use `React.cache()` for server-side request deduplication. Authentication and database queries benefit most.

**Usage:**

```typescript
import { cache } from 'react'

export const getCurrentUser = cache(async () => {
  const session = await auth()
  if (!session?.user?.id) return null
  return await db.user.findUnique({
    where: { id: session.user.id }
  })
})
```

Within a single request, multiple calls to `getCurrentUser()` execute the query only once.

### 3.5 Use after() for Non-Blocking Operations

**Impact: MEDIUM (faster response times)**

Use Next.js's `after()` to schedule work that should execute after a response is sent. This prevents logging, analytics, and other side effects from blocking the response.

**Incorrect: blocks response**

```tsx
import { logUserAction } from '@/app/utils'

export async function POST(request: Request) {
  // Perform mutation
  await updateDatabase(request)
  
  // Logging blocks the response
  const userAgent = request.headers.get('user-agent') || 'unknown'
  await logUserAction({ userAgent })
  
  return new Response(JSON.stringify({ status: 'success' }), {
    status: 200,
    headers: { 'Content-Type': 'application/json' }
  })
}
```

**Correct: non-blocking**

```tsx
import { after } from 'next/server'
import { headers, cookies } from 'next/headers'
import { logUserAction } from '@/app/utils'

export async function POST(request: Request) {
  // Perform mutation
  await updateDatabase(request)
  
  // Log after response is sent
  after(async () => {
    const userAgent = (await headers()).get('user-agent') || 'unknown'
    const sessionCookie = (await cookies()).get('session-id')?.value || 'anonymous'
    
    logUserAction({ sessionCookie, userAgent })
  })
  
  return new Response(JSON.stringify({ status: 'success' }), {
    status: 200,
    headers: { 'Content-Type': 'application/json' }
  })
}
```

The response is sent immediately while logging happens in the background.

**Common use cases:**

- Analytics tracking

- Audit logging

- Sending notifications

- Cache invalidation

- Cleanup tasks

**Important notes:**

- `after()` runs even if the response fails or redirects

- Works in Server Actions, Route Handlers, and Server Components

Reference: [https://nextjs.org/docs/app/api-reference/functions/after](https://nextjs.org/docs/app/api-reference/functions/after)

---

## 4. Client-Side Data Fetching

**Impact: MEDIUM-HIGH**

Automatic deduplication and efficient data fetching patterns reduce redundant network requests.

### 4.1 Deduplicate Global Event Listeners

**Impact: LOW (single listener for N components)**

Use `useSWRSubscription()` to share global event listeners across component instances.

**Incorrect: N instances = N listeners**

```tsx
function useKeyboardShortcut(key: string, callback: () => void) {
  useEffect(() => {
    const handler = (e: KeyboardEvent) => {
      if (e.metaKey && e.key === key) {
        callback()
      }
    }
    window.addEventListener('keydown', handler)
    return () => window.removeEventListener('keydown', handler)
  }, [key, callback])
}
```

When using the `useKeyboardShortcut` hook multiple times, each instance will register a new listener.

**Correct: N instances = 1 listener**

```tsx
import useSWRSubscription from 'swr/subscription'

// Module-level Map to track callbacks per key
const keyCallbacks = new Map<string, Set<() => void>>()

function useKeyboardShortcut(key: string, callback: () => void) {
  // Register this callback in the Map
  useEffect(() => {
    if (!keyCallbacks.has(key)) {
      keyCallbacks.set(key, new Set())
    }
    keyCallbacks.get(key)!.add(callback)

    return () => {
      const set = keyCallbacks.get(key)
      if (set) {
        set.delete(callback)
        if (set.size === 0) {
          keyCallbacks.delete(key)
        }
      }
    }
  }, [key, callback])

  useSWRSubscription('global-keydown', () => {
    const handler = (e: KeyboardEvent) => {
      if (e.metaKey && keyCallbacks.has(e.key)) {
        keyCallbacks.get(e.key)!.forEach(cb => cb())
      }
    }
    window.addEventListener('keydown', handler)
    return () => window.removeEventListener('keydown', handler)
  })
}

function Profile() {
  // Multiple shortcuts will share the same listener
  useKeyboardShortcut('p', () => { /* ... */ }) 
  useKeyboardShortcut('k', () => { /* ... */ })
  // ...
}
```

### 4.2 Use SWR for Automatic Deduplication

**Impact: MEDIUM-HIGH (automatic deduplication)**

SWR enables request deduplication, caching, and revalidation across component instances.

**Incorrect: no deduplication, each instance fetches**

```tsx
function UserList() {
  const [users, setUsers] = useState([])
  useEffect(() => {
    fetch('/api/users')
      .then(r => r.json())
      .then(setUsers)
  }, [])
}
```

**Correct: multiple instances share one request**

```tsx
import useSWR from 'swr'

function UserList() {
  const { data: users } = useSWR('/api/users', fetcher)
}
```

**For immutable data:**

```tsx
import { useImmutableSWR } from '@/lib/swr'

function StaticContent() {
  const { data } = useImmutableSWR('/api/config', fetcher)
}
```

**For mutations:**

```tsx
import { useSWRMutation } from 'swr/mutation'

function UpdateButton() {
  const { trigger } = useSWRMutation('/api/user', updateUser)
  return <button onClick={() => trigger()}>Update</button>
}
```

Reference: [https://swr.vercel.app](https://swr.vercel.app)

---

## 5. Re-render Optimization

**Impact: MEDIUM**

Reducing unnecessary re-renders minimizes wasted computation and improves UI responsiveness.

### 5.1 Defer State Reads to Usage Point

**Impact: MEDIUM (avoids unnecessary subscriptions)**

Don't subscribe to dynamic state (searchParams, localStorage) if you only read it inside callbacks.

**Incorrect: subscribes to all searchParams changes**

```tsx
function ShareButton({ chatId }: { chatId: string }) {
  const searchParams = useSearchParams()

  const handleShare = () => {
    const ref = searchParams.get('ref')
    shareChat(chatId, { ref })
  }

  return <button onClick={handleShare}>Share</button>
}
```

**Correct: reads on demand, no subscription**

```tsx
function ShareButton({ chatId }: { chatId: string }) {
  const handleShare = () => {
    const params = new URLSearchParams(window.location.search)
    const ref = params.get('ref')
    shareChat(chatId, { ref })
  }

  return <button onClick={handleShare}>Share</button>
}
```

### 5.2 Extract to Memoized Components

**Impact: MEDIUM (enables early returns)**

Extract expensive work into memoized components to enable early returns before computation.

**Incorrect: computes avatar even when loading**

```tsx
function Profile({ user, loading }: Props) {
  const avatar = useMemo(() => {
    const id = computeAvatarId(user)
    return <Avatar id={id} />
  }, [user])

  if (loading) return <Skeleton />
  return <div>{avatar}</div>
}
```

**Correct: skips computation when loading**

```tsx
const UserAvatar = memo(function UserAvatar({ user }: { user: User }) {
  const id = useMemo(() => computeAvatarId(user), [user])
  return <Avatar id={id} />
})

function Profile({ user, loading }: Props) {
  if (loading) return <Skeleton />
  return (
    <div>
      <UserAvatar user={user} />
    </div>
  )
}
```

**Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, manual memoization with `memo()` and `useMemo()` is not necessary. The compiler automatically optimizes re-renders.

### 5.3 Narrow Effect Dependencies

**Impact: LOW (minimizes effect re-runs)**

Specify primitive dependencies instead of objects to minimize effect re-runs.

**Incorrect: re-runs on any user field change**

```tsx
useEffect(() => {
  console.log(user.id)
}, [user])
```

**Correct: re-runs only when id changes**

```tsx
useEffect(() => {
  console.log(user.id)
}, [user.id])
```

**For derived state, compute outside effect:**

```tsx
// Incorrect: runs on width=767, 766, 765...
useEffect(() => {
  if (width < 768) {
    enableMobileMode()
  }
}, [width])

// Correct: runs only on boolean transition
const isMobile = width < 768
useEffect(() => {
  if (isMobile) {
    enableMobileMode()
  }
}, [isMobile])
```

### 5.4 Subscribe to Derived State

**Impact: MEDIUM (reduces re-render frequency)**

Subscribe to derived boolean state instead of continuous values to reduce re-render frequency.

**Incorrect: re-renders on every pixel change**

```tsx
function Sidebar() {
  const width = useWindowWidth()  // updates continuously
  const isMobile = width < 768
  return <nav className={isMobile ? 'mobile' : 'desktop'}>
}
```

**Correct: re-renders only when boolean changes**

```tsx
function Sidebar() {
  const isMobile = useMediaQuery('(max-width: 767px)')
  return <nav className={isMobile ? 'mobile' : 'desktop'}>
}
```

### 5.5 Use Functional setState Updates

**Impact: MEDIUM (prevents stale closures and unnecessary callback recreations)**

When updating state based on the current state value, use the functional update form of setState instead of directly referencing the state variable. This prevents stale closures, eliminates unnecessary dependencies, and creates stable callback references.

**Incorrect: requires state as dependency**

```tsx
function TodoList() {
  const [items, setItems] = useState(initialItems)
  
  // Callback must depend on items, recreated on every items change
  const addItems = useCallback((newItems: Item[]) => {
    setItems([...items, ...newItems])
  }, [items])  // ❌ items dependency causes recreations
  
  // Risk of stale closure if dependency is forgotten
  const removeItem = useCallback((id: string) => {
    setItems(items.filter(item => item.id !== id))
  }, [])  // ❌ Missing items dependency - will use stale items!
  
  return <ItemsEditor items={items} onAdd={addItems} onRemove={removeItem} />
}
```

The first callback is recreated every time `items` changes, which can cause child components to re-render unnecessarily. The second callback has a stale closure bug—it will always reference the initial `items` value.

**Correct: stable callbacks, no stale closures**

```tsx
function TodoList() {
  const [items, setItems] = useState(initialItems)
  
  // Stable callback, never recreated
  const addItems = useCallback((newItems: Item[]) => {
    setItems(curr => [...curr, ...newItems])
  }, [])  // ✅ No dependencies needed
  
  // Always uses latest state, no stale closure risk
  const removeItem = useCallback((id: string) => {
    setItems(curr => curr.filter(item => item.id !== id))
  }, [])  // ✅ Safe and stable
  
  return <ItemsEditor items={items} onAdd={addItems} onRemove={removeItem} />
}
```

**Benefits:**

1. **Stable callback references** - Callbacks don't need to be recreated when state changes

2. **No stale closures** - Always operates on the latest state value

3. **Fewer dependencies** - Simplifies dependency arrays and reduces memory leaks

4. **Prevents bugs** - Eliminates the most common source of React closure bugs

**When to use functional updates:**

- Any setState that depends on the current state value

- Inside useCallback/useMemo when state is needed

- Event handlers that reference state

- Async operations that update state

**When direct updates are fine:**

- Setting state to a static value: `setCount(0)`

- Setting state from props/arguments only: `setName(newName)`

- State doesn't depend on previous value

**Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, the compiler can automatically optimize some cases, but functional updates are still recommended for correctness and to prevent stale closure bugs.

### 5.6 Use Lazy State Initialization

**Impact: MEDIUM (wasted computation on every render)**

Pass a function to `useState` for expensive initial values. Without the function form, the initializer runs on every render even though the value is only used once.

**Incorrect: runs on every render**

```tsx
function FilteredList({ items }: { items: Item[] }) {
  // buildSearchIndex() runs on EVERY render, even after initialization
  const [searchIndex, setSearchIndex] = useState(buildSearchIndex(items))
  const [query, setQuery] = useState('')
  
  // When query changes, buildSearchIndex runs again unnecessarily
  return <SearchResults index={searchIndex} query={query} />
}

function UserProfile() {
  // JSON.parse runs on every render
  const [settings, setSettings] = useState(
    JSON.parse(localStorage.getItem('settings') || '{}')
  )
  
  return <SettingsForm settings={settings} onChange={setSettings} />
}
```

**Correct: runs only once**

```tsx
function FilteredList({ items }: { items: Item[] }) {
  // buildSearchIndex() runs ONLY on initial render
  const [searchIndex, setSearchIndex] = useState(() => buildSearchIndex(items))
  const [query, setQuery] = useState('')
  
  return <SearchResults index={searchIndex} query={query} />
}

function UserProfile() {
  // JSON.parse runs only on initial render
  const [settings, setSettings] = useState(() => {
    const stored = localStorage.getItem('settings')
    return stored ? JSON.parse(stored) : {}
  })
  
  return <SettingsForm settings={settings} onChange={setSettings} />
}
```

Use lazy initialization when computing initial values from localStorage/sessionStorage, building data structures (indexes, maps), reading from the DOM, or performing heavy transformations.

For simple primitives (`useState(0)`), direct references (`useState(props.value)`), or cheap literals (`useState({})`), the function form is unnecessary.

### 5.7 Use Transitions for Non-Urgent Updates

**Impact: MEDIUM (maintains UI responsiveness)**

Mark frequent, non-urgent state updates as transitions to maintain UI responsiveness.

**Incorrect: blocks UI on every scroll**

```tsx
function ScrollTracker() {
  const [scrollY, setScrollY] = useState(0)
  useEffect(() => {
    const handler = () => setScrollY(window.scrollY)
    window.addEventListener('scroll', handler, { passive: true })
    return () => window.removeEventListener('scroll', handler)
  }, [])
}
```

**Correct: non-blocking updates**

```tsx
import { startTransition } from 'react'

function ScrollTracker() {
  const [scrollY, setScrollY] = useState(0)
  useEffect(() => {
    const handler = () => {
      startTransition(() => setScrollY(window.scrollY))
    }
    window.addEventListener('scroll', handler, { passive: true })
    return () => window.removeEventListener('scroll', handler)
  }, [])
}
```

---

## 6. Rendering Performance

**Impact: MEDIUM**

Optimizing the rendering process reduces the work the browser needs to do.

### 6.1 Animate SVG Wrapper Instead of SVG Element

**Impact: LOW (enables hardware acceleration)**

Many browsers don't have hardware acceleration for CSS3 animations on SVG elements. Wrap SVG in a `<div>` and animate the wrapper instead.

**Incorrect: animating SVG directly - no hardware acceleration**

```tsx
function LoadingSpinner() {
  return (
    <svg 
      className="animate-spin"
      width="24" 
      height="24" 
      viewBox="0 0 24 24"
    >
      <circle cx="12" cy="12" r="10" stroke="currentColor" />
    </svg>
  )
}
```

**Correct: animating wrapper div - hardware accelerated**

```tsx
function LoadingSpinner() {
  return (
    <div className="animate-spin">
      <svg 
        width="24" 
        height="24" 
        viewBox="0 0 24 24"
      >
        <circle cx="12" cy="12" r="10" stroke="currentColor" />
      </svg>
    </div>
  )
}
```

This applies to all CSS transforms and transitions (`transform`, `opacity`, `translate`, `scale`, `rotate`). The wrapper div allows browsers to use GPU acceleration for smoother animations.

### 6.2 CSS content-visibility for Long Lists

**Impact: HIGH (faster initial render)**

Apply `content-visibility: auto` to defer off-screen rendering.

**CSS:**

```css
.message-item {
  content-visibility: auto;
  contain-intrinsic-size: 0 80px;
}
```

**Example:**

```tsx
function MessageList({ messages }: { messages: Message[] }) {
  return (
    <div className="overflow-y-auto h-screen">
      {messages.map(msg => (
        <div key={msg.id} className="message-item">
          <Avatar user={msg.author} />
          <div>{msg.content}</div>
        </div>
      ))}
    </div>
  )
}
```

For 1000 messages, browser skips layout/paint for ~990 off-screen items (10× faster initial render).

### 6.3 Hoist Static JSX Elements

**Impact: LOW (avoids re-creation)**

Extract static JSX outside components to avoid re-creation.

**Incorrect: recreates element every render**

```tsx
function LoadingSkeleton() {
  return <div className="animate-pulse h-20 bg-gray-200" />
}

function Container() {
  return (
    <div>
      {loading && <LoadingSkeleton />}
    </div>
  )
}
```

**Correct: reuses same element**

```tsx
const loadingSkeleton = (
  <div className="animate-pulse h-20 bg-gray-200" />
)

function Container() {
  return (
    <div>
      {loading && loadingSkeleton}
    </div>
  )
}
```

This is especially helpful for large and static SVG nodes, which can be expensive to recreate on every render.

**Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, the compiler automatically hoists static JSX elements and optimizes component re-renders, making manual hoisting unnecessary.

### 6.4 Optimize SVG Precision

**Impact: LOW (reduces file size)**

Reduce SVG coordinate precision to decrease file size. The optimal precision depends on the viewBox size, but in general reducing precision should be considered.

**Incorrect: excessive precision**

```svg
<path d="M 10.293847 20.847362 L 30.938472 40.192837" />
```

**Correct: 1 decimal place**

```svg
<path d="M 10.3 20.8 L 30.9 40.2" />
```

**Automate with SVGO:**

```bash
npx svgo --precision=1 --multipass icon.svg
```

### 6.5 Prevent Hydration Mismatch Without Flickering

**Impact: MEDIUM (avoids visual flicker and hydration errors)**

When rendering content that depends on client-side storage (localStorage, cookies), avoid both SSR breakage and post-hydration flickering by injecting a synchronous script that updates the DOM before React hydrates.

**Incorrect: breaks SSR**

```tsx
function ThemeWrapper({ children }: { children: ReactNode }) {
  // localStorage is not available on server - throws error
  const theme = localStorage.getItem('theme') || 'light'
  
  return (
    <div className={theme}>
      {children}
    </div>
  )
}
```

Server-side rendering will fail because `localStorage` is undefined.

**Incorrect: visual flickering**

```tsx
function ThemeWrapper({ children }: { children: ReactNode }) {
  const [theme, setTheme] = useState('light')
  
  useEffect(() => {
    // Runs after hydration - causes visible flash
    const stored = localStorage.getItem('theme')
    if (stored) {
      setTheme(stored)
    }
  }, [])
  
  return (
    <div className={theme}>
      {children}
    </div>
  )
}
```

Component first renders with default value (`light`), then updates after hydration, causing a visible flash of incorrect content.

**Correct: no flicker, no hydration mismatch**

```tsx
function ThemeWrapper({ children }: { children: ReactNode }) {
  return (
    <>
      <div id="theme-wrapper">
        {children}
      </div>
      <script
        dangerouslySetInnerHTML={{
          __html: `
            (function() {
              try {
                var theme = localStorage.getItem('theme') || 'light';
                var el = document.getElementById('theme-wrapper');
                if (el) el.className = theme;
              } catch (e) {}
            })();
          `,
        }}
      />
    </>
  )
}
```

The inline script executes synchronously before showing the element, ensuring the DOM already has the correct value. No flickering, no hydration mismatch.

This pattern is especially useful for theme toggles, user preferences, authentication states, and any client-only data that should render immediately without flashing default values.

### 6.6 Use Activity Component for Show/Hide

**Impact: MEDIUM (preserves state/DOM)**

Use React's `<Activity>` to preserve state/DOM for expensive components that frequently toggle visibility.

**Usage:**

```tsx
import { Activity } from 'react'

function Dropdown({ isOpen }: Props) {
  return (
    <Activity mode={isOpen ? 'visible' : 'hidden'}>
      <ExpensiveMenu />
    </Activity>
  )
}
```

Avoids expensive re-renders and state loss.

### 6.7 Use Explicit Conditional Rendering

**Impact: LOW (prevents rendering 0 or NaN)**

Use explicit ternary operators (`? :`) instead of `&&` for conditional rendering when the condition can be `0`, `NaN`, or other falsy values that render.

**Incorrect: renders "0" when count is 0**

```tsx
function Badge({ count }: { count: number }) {
  return (
    <div>
      {count && <span className="badge">{count}</span>}
    </div>
  )
}

// When count = 0, renders: <div>0</div>
// When count = 5, renders: <div><span class="badge">5</span></div>
```

**Correct: renders nothing when count is 0**

```tsx
function Badge({ count }: { count: number }) {
  return (
    <div>
      {count > 0 ? <span className="badge">{count}</span> : null}
    </div>
  )
}

// When count = 0, renders: <div></div>
// When count = 5, renders: <div><span class="badge">5</span></div>
```

---

## 7. JavaScript Performance

**Impact: LOW-MEDIUM**

Micro-optimizations for hot paths can add up to meaningful improvements.

### 7.1 Batch DOM CSS Changes

**Impact: MEDIUM (reduces reflows/repaints)**

Avoid changing styles one property at a time. Group multiple CSS changes together via classes or `cssText` to minimize browser reflows.

**Incorrect: multiple reflows**

```typescript
function updateElementStyles(element: HTMLElement) {
  // Each line triggers a reflow
  element.style.width = '100px'
  element.style.height = '200px'
  element.style.backgroundColor = 'blue'
  element.style.border = '1px solid black'
}
```

**Correct: add class - single reflow**

```typescript
// CSS file
.highlighted-box {
  width: 100px;
  height: 200px;
  background-color: blue;
  border: 1px solid black;
}

// JavaScript
function updateElementStyles(element: HTMLElement) {
  element.classList.add('highlighted-box')
}
```

**Correct: change cssText - single reflow**

```typescript
function updateElementStyles(element: HTMLElement) {
  element.style.cssText = `
    width: 100px;
    height: 200px;
    background-color: blue;
    border: 1px solid black;
  `
}
```

**React example:**

```tsx
// Incorrect: changing styles one by one
function Box({ isHighlighted }: { isHighlighted: boolean }) {
  const ref = useRef<HTMLDivElement>(null)
  
  useEffect(() => {
    if (ref.current && isHighlighted) {
      ref.current.style.width = '100px'
      ref.current.style.height = '200px'
      ref.current.style.backgroundColor = 'blue'
    }
  }, [isHighlighted])
  
  return <div ref={ref}>Content</div>
}

// Correct: toggle class
function Box({ isHighlighted }: { isHighlighted: boolean }) {
  return (
    <div className={isHighlighted ? 'highlighted-box' : ''}>
      Content
    </div>
  )
}
```

Prefer CSS classes over inline styles when possible. Classes are cached by the browser and provide better separation of concerns.

### 7.2 Build Index Maps for Repeated Lookups

**Impact: LOW-MEDIUM (1M ops to 2K ops)**

Multiple `.find()` calls by the same key should use a Map.

**Incorrect (O(n) per lookup):**

```typescript
function processOrders(orders: Order[], users: User[]) {
  return orders.map(order => ({
    ...order,
    user: users.find(u => u.id === order.userId)
  }))
}
```

**Correct (O(1) per lookup):**

```typescript
function processOrders(orders: Order[], users: User[]) {
  const userById = new Map(users.map(u => [u.id, u]))

  return orders.map(order => ({
    ...order,
    user: userById.get(order.userId)
  }))
}
```

Build map once (O(n)), then all lookups are O(1).

For 1000 orders × 1000 users: 1M ops → 2K ops.

### 7.3 Cache Property Access in Loops

**Impact: LOW-MEDIUM (reduces lookups)**

Cache object property lookups in hot paths.

**Incorrect: 3 lookups × N iterations**

```typescript
for (let i = 0; i < arr.length; i++) {
  process(obj.config.settings.value)
}
```

**Correct: 1 lookup total**

```typescript
const value = obj.config.settings.value
const len = arr.length
for (let i = 0; i < len; i++) {
  process(value)
}
```

### 7.4 Cache Repeated Function Calls

**Impact: MEDIUM (avoid redundant computation)**

Use a module-level Map to cache function results when the same function is called repeatedly with the same inputs during render.

**Incorrect: redundant computation**

```typescript
function ProjectList({ projects }: { projects: Project[] }) {
  return (
    <div>
      {projects.map(project => {
        // slugify() called 100+ times for same project names
        const slug = slugify(project.name)
        
        return <ProjectCard key={project.id} slug={slug} />
      })}
    </div>
  )
}
```

**Correct: cached results**

```typescript
// Module-level cache
const slugifyCache = new Map<string, string>()

function cachedSlugify(text: string): string {
  if (slugifyCache.has(text)) {
    return slugifyCache.get(text)!
  }
  const result = slugify(text)
  slugifyCache.set(text, result)
  return result
}

function ProjectList({ projects }: { projects: Project[] }) {
  return (
    <div>
      {projects.map(project => {
        // Computed only once per unique project name
        const slug = cachedSlugify(project.name)
        
        return <ProjectCard key={project.id} slug={slug} />
      })}
    </div>
  )
}
```

**Simpler pattern for single-value functions:**

```typescript
let isLoggedInCache: boolean | null = null

function isLoggedIn(): boolean {
  if (isLoggedInCache !== null) {
    return isLoggedInCache
  }
  
  isLoggedInCache = document.cookie.includes('auth=')
  return isLoggedInCache
}

// Clear cache when auth changes
function onAuthChange() {
  isLoggedInCache = null
}
```

Use a Map (not a hook) so it works everywhere: utilities, event handlers, not just React components.

Reference: [https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast](https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast)

### 7.5 Cache Storage API Calls

**Impact: LOW-MEDIUM (reduces expensive I/O)**

`localStorage`, `sessionStorage`, and `document.cookie` are synchronous and expensive. Cache reads in memory.

**Incorrect: reads storage on every call**

```typescript
function getTheme() {
  return localStorage.getItem('theme') ?? 'light'
}
// Called 10 times = 10 storage reads
```

**Correct: Map cache**

```typescript
const storageCache = new Map<string, string | null>()

function getLocalStorage(key: string) {
  if (!storageCache.has(key)) {
    storageCache.set(key, localStorage.getItem(key))
  }
  return storageCache.get(key)
}

function setLocalStorage(key: string, value: string) {
  localStorage.setItem(key, value)
  storageCache.set(key, value)  // keep cache in sync
}
```

Use a Map (not a hook) so it works everywhere: utilities, event handlers, not just React components.

**Cookie caching:**

```typescript
let cookieCache: Record<string, string> | null = null

function getCookie(name: string) {
  if (!cookieCache) {
    cookieCache = Object.fromEntries(
      document.cookie.split('; ').map(c => c.split('='))
    )
  }
  return cookieCache[name]
}
```

**Important: invalidate on external changes**

```typescript
window.addEventListener('storage', (e) => {
  if (e.key) storageCache.delete(e.key)
})

document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'visible') {
    storageCache.clear()
  }
})
```

If storage can change externally (another tab, server-set cookies), invalidate cache:

### 7.6 Combine Multiple Array Iterations

**Impact: LOW-MEDIUM (reduces iterations)**

Multiple `.filter()` or `.map()` calls iterate the array multiple times. Combine into one loop.

**Incorrect: 3 iterations**

```typescript
const admins = users.filter(u => u.isAdmin)
const testers = users.filter(u => u.isTester)
const inactive = users.filter(u => !u.isActive)
```

**Correct: 1 iteration**

```typescript
const admins: User[] = []
const testers: User[] = []
const inactive: User[] = []

for (const user of users) {
  if (user.isAdmin) admins.push(user)
  if (user.isTester) testers.push(user)
  if (!user.isActive) inactive.push(user)
}
```

### 7.7 Early Length Check for Array Comparisons

**Impact: MEDIUM-HIGH (avoids expensive operations when lengths differ)**

When comparing arrays with expensive operations (sorting, deep equality, serialization), check lengths first. If lengths differ, the arrays cannot be equal.

In real-world applications, this optimization is especially valuable when the comparison runs in hot paths (event handlers, render loops).

**Incorrect: always runs expensive comparison**

```typescript
function hasChanges(current: string[], original: string[]) {
  // Always sorts and joins, even when lengths differ
  return current.sort().join() !== original.sort().join()
}
```

Two O(n log n) sorts run even when `current.length` is 5 and `original.length` is 100. There is also overhead of joining the arrays and comparing the strings.

**Correct (O(1) length check first):**

```typescript
function hasChanges(current: string[], original: string[]) {
  // Early return if lengths differ
  if (current.length !== original.length) {
    return true
  }
  // Only sort/join when lengths match
  const currentSorted = current.toSorted()
  const originalSorted = original.toSorted()
  for (let i = 0; i < currentSorted.length; i++) {
    if (currentSorted[i] !== originalSorted[i]) {
      return true
    }
  }
  return false
}
```

This new approach is more efficient because:

- It avoids the overhead of sorting and joining the arrays when lengths differ

- It avoids consuming memory for the joined strings (especially important for large arrays)

- It avoids mutating the original arrays

- It returns early when a difference is found

### 7.8 Early Return from Functions

**Impact: LOW-MEDIUM (avoids unnecessary computation)**

Return early when result is determined to skip unnecessary processing.

**Incorrect: processes all items even after finding answer**

```typescript
function validateUsers(users: User[]) {
  let hasError = false
  let errorMessage = ''
  
  for (const user of users) {
    if (!user.email) {
      hasError = true
      errorMessage = 'Email required'
    }
    if (!user.name) {
      hasError = true
      errorMessage = 'Name required'
    }
    // Continues checking all users even after error found
  }
  
  return hasError ? { valid: false, error: errorMessage } : { valid: true }
}
```

**Correct: returns immediately on first error**

```typescript
function validateUsers(users: User[]) {
  for (const user of users) {
    if (!user.email) {
      return { valid: false, error: 'Email required' }
    }
    if (!user.name) {
      return { valid: false, error: 'Name required' }
    }
  }

  return { valid: true }
}
```

### 7.9 Hoist RegExp Creation

**Impact: LOW-MEDIUM (avoids recreation)**

Don't create RegExp inside render. Hoist to module scope or memoize with `useMemo()`.

**Incorrect: new RegExp every render**

```tsx
function Highlighter({ text, query }: Props) {
  const regex = new RegExp(`(${query})`, 'gi')
  const parts = text.split(regex)
  return <>{parts.map((part, i) => ...)}</>
}
```

**Correct: memoize or hoist**

```tsx
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/

function Highlighter({ text, query }: Props) {
  const regex = useMemo(
    () => new RegExp(`(${escapeRegex(query)})`, 'gi'),
    [query]
  )
  const parts = text.split(regex)
  return <>{parts.map((part, i) => ...)}</>
}
```

**Warning: global regex has mutable state**

```typescript
const regex = /foo/g
regex.test('foo')  // true, lastIndex = 3
regex.test('foo')  // false, lastIndex = 0
```

Global regex (`/g`) has mutable `lastIndex` state:

### 7.10 Use Loop for Min/Max Instead of Sort

**Impact: LOW (O(n) instead of O(n log n))**

Finding the smallest or largest element only requires a single pass through the array. Sorting is wasteful and slower.

**Incorrect (O(n log n) - sort to find latest):**

```typescript
interface Project {
  id: string
  name: string
  updatedAt: number
}

function getLatestProject(projects: Project[]) {
  const sorted = [...projects].sort((a, b) => b.updatedAt - a.updatedAt)
  return sorted[0]
}
```

Sorts the entire array just to find the maximum value.

**Incorrect (O(n log n) - sort for oldest and newest):**

```typescript
function getOldestAndNewest(projects: Project[]) {
  const sorted = [...projects].sort((a, b) => a.updatedAt - b.updatedAt)
  return { oldest: sorted[0], newest: sorted[sorted.length - 1] }
}
```

Still sorts unnecessarily when only min/max are needed.

**Correct (O(n) - single loop):**

```typescript
function getLatestProject(projects: Project[]) {
  if (projects.length === 0) return null
  
  let latest = projects[0]
  
  for (let i = 1; i < projects.length; i++) {
    if (projects[i].updatedAt > latest.updatedAt) {
      latest = projects[i]
    }
  }
  
  return latest
}

function getOldestAndNewest(projects: Project[]) {
  if (projects.length === 0) return { oldest: null, newest: null }
  
  let oldest = projects[0]
  let newest = projects[0]
  
  for (let i = 1; i < projects.length; i++) {
    if (projects[i].updatedAt < oldest.updatedAt) oldest = projects[i]
    if (projects[i].updatedAt > newest.updatedAt) newest = projects[i]
  }
  
  return { oldest, newest }
}
```

Single pass through the array, no copying, no sorting.

**Alternative: Math.min/Math.max for small arrays**

```typescript
const numbers = [5, 2, 8, 1, 9]
const min = Math.min(...numbers)
const max = Math.max(...numbers)
```

This works for small arrays but can be slower for very large arrays due to spread operator limitations. Use the loop approach for reliability.

### 7.11 Use Set/Map for O(1) Lookups

**Impact: LOW-MEDIUM (O(n) to O(1))**

Convert arrays to Set/Map for repeated membership checks.

**Incorrect (O(n) per check):**

```typescript
const allowedIds = ['a', 'b', 'c', ...]
items.filter(item => allowedIds.includes(item.id))
```

**Correct (O(1) per check):**

```typescript
const allowedIds = new Set(['a', 'b', 'c', ...])
items.filter(item => allowedIds.has(item.id))
```

### 7.12 Use toSorted() Instead of sort() for Immutability

**Impact: MEDIUM-HIGH (prevents mutation bugs in React state)**

`.sort()` mutates the array in place, which can cause bugs with React state and props. Use `.toSorted()` to create a new sorted array without mutation.

**Incorrect: mutates original array**

```typescript
function UserList({ users }: { users: User[] }) {
  // Mutates the users prop array!
  const sorted = useMemo(
    () => users.sort((a, b) => a.name.localeCompare(b.name)),
    [users]
  )
  return <div>{sorted.map(renderUser)}</div>
}
```

**Correct: creates new array**

```typescript
function UserList({ users }: { users: User[] }) {
  // Creates new sorted array, original unchanged
  const sorted = useMemo(
    () => users.toSorted((a, b) => a.name.localeCompare(b.name)),
    [users]
  )
  return <div>{sorted.map(renderUser)}</div>
}
```

**Why this matters in React:**

1. Props/state mutations break React's immutability model - React expects props and state to be treated as read-only

2. Causes stale closure bugs - Mutating arrays inside closures (callbacks, effects) can lead to unexpected behavior

**Browser support: fallback for older browsers**

```typescript
// Fallback for older browsers
const sorted = [...items].sort((a, b) => a.value - b.value)
```

`.toSorted()` is available in all modern browsers (Chrome 110+, Safari 16+, Firefox 115+, Node.js 20+). For older environments, use spread operator:

**Other immutable array methods:**

- `.toSorted()` - immutable sort

- `.toReversed()` - immutable reverse

- `.toSpliced()` - immutable splice

- `.with()` - immutable element replacement

---

## 8. Advanced Patterns

**Impact: LOW**

Advanced patterns for specific cases that require careful implementation.

### 8.1 Store Event Handlers in Refs

**Impact: LOW (stable subscriptions)**

Store callbacks in refs when used in effects that shouldn't re-subscribe on callback changes.

**Incorrect: re-subscribes on every render**

```tsx
function useWindowEvent(event: string, handler: () => void) {
  useEffect(() => {
    window.addEventListener(event, handler)
    return () => window.removeEventListener(event, handler)
  }, [event, handler])
}
```

**Correct: stable subscription**

```tsx
import { useEffectEvent } from 'react'

function useWindowEvent(event: string, handler: () => void) {
  const onEvent = useEffectEvent(handler)

  useEffect(() => {
    window.addEventListener(event, onEvent)
    return () => window.removeEventListener(event, onEvent)
  }, [event])
}
```

**Alternative: use `useEffectEvent` if you're on latest React:**

`useEffectEvent` provides a cleaner API for the same pattern: it creates a stable function reference that always calls the latest version of the handler.

### 8.2 useLatest for Stable Callback Refs

**Impact: LOW (prevents effect re-runs)**

Access latest values in callbacks without adding them to dependency arrays. Prevents effect re-runs while avoiding stale closures.

**Implementation:**

```typescript
function useLatest<T>(value: T) {
  const ref = useRef(value)
  useEffect(() => {
    ref.current = value
  }, [value])
  return ref
}
```

**Incorrect: effect re-runs on every callback change**

```tsx
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
  const [query, setQuery] = useState('')

  useEffect(() => {
    const timeout = setTimeout(() => onSearch(query), 300)
    return () => clearTimeout(timeout)
  }, [query, onSearch])
}
```

**Correct: stable effect, fresh callback**

```tsx
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
  const [query, setQuery] = useState('')
  const onSearchRef = useLatest(onSearch)

  useEffect(() => {
    const timeout = setTimeout(() => onSearchRef.current(query), 300)
    return () => clearTimeout(timeout)
  }, [query])
}
```

---

## References

1. [https://react.dev](https://react.dev)
2. [https://nextjs.org](https://nextjs.org)
3. [https://swr.vercel.app](https://swr.vercel.app)
4. [https://github.com/shuding/better-all](https://github.com/shuding/better-all)
5. [https://github.com/isaacs/node-lru-cache](https://github.com/isaacs/node-lru-cache)
6. [https://vercel.com/blog/how-we-optimized-package-imports-in-next-js](https://vercel.com/blog/how-we-optimized-package-imports-in-next-js)
7. [https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast](https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast)


================================================
FILE: .claude/skills/vercel-react-best-practices/SKILL.md
================================================
---
name: vercel-react-best-practices
description: React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
license: MIT
metadata:
  author: vercel
  version: "1.0.0"
---

# Vercel React Best Practices

Comprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 45 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.

## When to Apply

Reference these guidelines when:
- Writing new React components or Next.js pages
- Implementing data fetching (client or server-side)
- Reviewing code for performance issues
- Refactoring existing React/Next.js code
- Optimizing bundle size or load times

## Rule Categories by Priority

| Priority | Category | Impact | Prefix |
|----------|----------|--------|--------|
| 1 | Eliminating Waterfalls | CRITICAL | `async-` |
| 2 | Bundle Size Optimization | CRITICAL | `bundle-` |
| 3 | Server-Side Performance | HIGH | `server-` |
| 4 | Client-Side Data Fetching | MEDIUM-HIGH | `client-` |
| 5 | Re-render Optimization | MEDIUM | `rerender-` |
| 6 | Rendering Performance | MEDIUM | `rendering-` |
| 7 | JavaScript Performance | LOW-MEDIUM | `js-` |
| 8 | Advanced Patterns | LOW | `advanced-` |

## Quick Reference

### 1. Eliminating Waterfalls (CRITICAL)

- `async-defer-await` - Move await into branches where actually used
- `async-parallel` - Use Promise.all() for independent operations
- `async-dependencies` - Use better-all for partial dependencies
- `async-api-routes` - Start promises early, await late in API routes
- `async-suspense-boundaries` - Use Suspense to stream content

### 2. Bundle Size Optimization (CRITICAL)

- `bundle-barrel-imports` - Import directly, avoid barrel files
- `bundle-dynamic-imports` - Use next/dynamic for heavy components
- `bundle-defer-third-party` - Load analytics/logging after hydration
- `bundle-conditional` - Load modules only when feature is activated
- `bundle-preload` - Preload on hover/focus for perceived speed

### 3. Server-Side Performance (HIGH)

- `server-cache-react` - Use React.cache() for per-request deduplication
- `server-cache-lru` - Use LRU cache for cross-request caching
- `server-serialization` - Minimize data passed to client components
- `server-parallel-fetching` - Restructure components to parallelize fetches
- `server-after-nonblocking` - Use after() for non-blocking operations

### 4. Client-Side Data Fetching (MEDIUM-HIGH)

- `client-swr-dedup` - Use SWR for automatic request deduplication
- `client-event-listeners` - Deduplicate global event listeners

### 5. Re-render Optimization (MEDIUM)

- `rerender-defer-reads` - Don't subscribe to state only used in callbacks
- `rerender-memo` - Extract expensive work into memoized components
- `rerender-dependencies` - Use primitive dependencies in effects
- `rerender-derived-state` - Subscribe to derived booleans, not raw values
- `rerender-functional-setstate` - Use functional setState for stable callbacks
- `rerender-lazy-state-init` - Pass function to useState for expensive values
- `rerender-transitions` - Use startTransition for non-urgent updates

### 6. Rendering Performance (MEDIUM)

- `rendering-animate-svg-wrapper` - Animate div wrapper, not SVG element
- `rendering-content-visibility` - Use content-visibility for long lists
- `rendering-hoist-jsx` - Extract static JSX outside components
- `rendering-svg-precision` - Reduce SVG coordinate precision
- `rendering-hydration-no-flicker` - Use inline script for client-only data
- `rendering-activity` - Use Activity component for show/hide
- `rendering-conditional-render` - Use ternary, not && for conditionals

### 7. JavaScript Performance (LOW-MEDIUM)

- `js-batch-dom-css` - Group CSS changes via classes or cssText
- `js-index-maps` - Build Map for repeated lookups
- `js-cache-property-access` - Cache object properties in loops
- `js-cache-function-results` - Cache function results in module-level Map
- `js-cache-storage` - Cache localStorage/sessionStorage reads
- `js-combine-iterations` - Combine multiple filter/map into one loop
- `js-length-check-first` - Check array length before expensive comparison
- `js-early-exit` - Return early from functions
- `js-hoist-regexp` - Hoist RegExp creation outside loops
- `js-min-max-loop` - Use loop for min/max instead of sort
- `js-set-map-lookups` - Use Set/Map for O(1) lookups
- `js-tosorted-immutable` - Use toSorted() for immutability

### 8. Advanced Patterns (LOW)

- `advanced-event-handler-refs` - Store event handlers in refs
- `advanced-use-latest` - useLatest for stable callback refs

## How to Use

Read individual rule files for detailed explanations and code examples:

```
rules/async-parallel.md
rules/bundle-barrel-imports.md
rules/_sections.md
```

Each rule file contains:
- Brief explanation of why it matters
- Incorrect code example with explanation
- Correct code example with explanation
- Additional context and references

## Full Compiled Document

For the complete guide with all rules expanded: `AGENTS.md`


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md
================================================
---
title: Store Event Handlers in Refs
impact: LOW
impactDescription: stable subscriptions
tags: advanced, hooks, refs, event-handlers, optimization
---

## Store Event Handlers in Refs

Store callbacks in refs when used in effects that shouldn't re-subscribe on callback changes.

**Incorrect (re-subscribes on every render):**

```tsx
function useWindowEvent(event: string, handler: () => void) {
  useEffect(() => {
    window.addEventListener(event, handler)
    return () => window.removeEventListener(event, handler)
  }, [event, handler])
}
```

**Correct (stable subscription):**

```tsx
function useWindowEvent(event: string, handler: () => void) {
  const handlerRef = useRef(handler)
  useEffect(() => {
    handlerRef.current = handler
  }, [handler])

  useEffect(() => {
    const listener = () => handlerRef.current()
    window.addEventListener(event, listener)
    return () => window.removeEventListener(event, listener)
  }, [event])
}
```

**Alternative: use `useEffectEvent` if you're on latest React:**

```tsx
import { useEffectEvent } from 'react'

function useWindowEvent(event: string, handler: () => void) {
  const onEvent = useEffectEvent(handler)

  useEffect(() => {
    window.addEventListener(event, onEvent)
    return () => window.removeEventListener(event, onEvent)
  }, [event])
}
```

`useEffectEvent` provides a cleaner API for the same pattern: it creates a stable function reference that always calls the latest version of the handler.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md
================================================
---
title: useLatest for Stable Callback Refs
impact: LOW
impactDescription: prevents effect re-runs
tags: advanced, hooks, useLatest, refs, optimization
---

## useLatest for Stable Callback Refs

Access latest values in callbacks without adding them to dependency arrays. Prevents effect re-runs while avoiding stale closures.

**Implementation:**

```typescript
function useLatest<T>(value: T) {
  const ref = useRef(value)
  useEffect(() => {
    ref.current = value
  }, [value])
  return ref
}
```

**Incorrect (effect re-runs on every callback change):**

```tsx
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
  const [query, setQuery] = useState('')

  useEffect(() => {
    const timeout = setTimeout(() => onSearch(query), 300)
    return () => clearTimeout(timeout)
  }, [query, onSearch])
}
```

**Correct (stable effect, fresh callback):**

```tsx
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
  const [query, setQuery] = useState('')
  const onSearchRef = useLatest(onSearch)

  useEffect(() => {
    const timeout = setTimeout(() => onSearchRef.current(query), 300)
    return () => clearTimeout(timeout)
  }, [query])
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/async-api-routes.md
================================================
---
title: Prevent Waterfall Chains in API Routes
impact: CRITICAL
impactDescription: 2-10× improvement
tags: api-routes, server-actions, waterfalls, parallelization
---

## Prevent Waterfall Chains in API Routes

In API routes and Server Actions, start independent operations immediately, even if you don't await them yet.

**Incorrect (config waits for auth, data waits for both):**

```typescript
export async function GET(request: Request) {
  const session = await auth()
  const config = await fetchConfig()
  const data = await fetchData(session.user.id)
  return Response.json({ data, config })
}
```

**Correct (auth and config start immediately):**

```typescript
export async function GET(request: Request) {
  const sessionPromise = auth()
  const configPromise = fetchConfig()
  const session = await sessionPromise
  const [config, data] = await Promise.all([
    configPromise,
    fetchData(session.user.id)
  ])
  return Response.json({ data, config })
}
```

For operations with more complex dependency chains, use `better-all` to automatically maximize parallelism (see Dependency-Based Parallelization).


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/async-defer-await.md
================================================
---
title: Defer Await Until Needed
impact: HIGH
impactDescription: avoids blocking unused code paths
tags: async, await, conditional, optimization
---

## Defer Await Until Needed

Move `await` operations into the branches where they're actually used to avoid blocking code paths that don't need them.

**Incorrect (blocks both branches):**

```typescript
async function handleRequest(userId: string, skipProcessing: boolean) {
  const userData = await fetchUserData(userId)
  
  if (skipProcessing) {
    // Returns immediately but still waited for userData
    return { skipped: true }
  }
  
  // Only this branch uses userData
  return processUserData(userData)
}
```

**Correct (only blocks when needed):**

```typescript
async function handleRequest(userId: string, skipProcessing: boolean) {
  if (skipProcessing) {
    // Returns immediately without waiting
    return { skipped: true }
  }
  
  // Fetch only when needed
  const userData = await fetchUserData(userId)
  return processUserData(userData)
}
```

**Another example (early return optimization):**

```typescript
// Incorrect: always fetches permissions
async function updateResource(resourceId: string, userId: string) {
  const permissions = await fetchPermissions(userId)
  const resource = await getResource(resourceId)
  
  if (!resource) {
    return { error: 'Not found' }
  }
  
  if (!permissions.canEdit) {
    return { error: 'Forbidden' }
  }
  
  return await updateResourceData(resource, permissions)
}

// Correct: fetches only when needed
async function updateResource(resourceId: string, userId: string) {
  const resource = await getResource(resourceId)
  
  if (!resource) {
    return { error: 'Not found' }
  }
  
  const permissions = await fetchPermissions(userId)
  
  if (!permissions.canEdit) {
    return { error: 'Forbidden' }
  }
  
  return await updateResourceData(resource, permissions)
}
```

This optimization is especially valuable when the skipped branch is frequently taken, or when the deferred operation is expensive.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/async-dependencies.md
================================================
---
title: Dependency-Based Parallelization
impact: CRITICAL
impactDescription: 2-10× improvement
tags: async, parallelization, dependencies, better-all
---

## Dependency-Based Parallelization

For operations with partial dependencies, use `better-all` to maximize parallelism. It automatically starts each task at the earliest possible moment.

**Incorrect (profile waits for config unnecessarily):**

```typescript
const [user, config] = await Promise.all([
  fetchUser(),
  fetchConfig()
])
const profile = await fetchProfile(user.id)
```

**Correct (config and profile run in parallel):**

```typescript
import { all } from 'better-all'

const { user, config, profile } = await all({
  async user() { return fetchUser() },
  async config() { return fetchConfig() },
  async profile() {
    return fetchProfile((await this.$.user).id)
  }
})
```

Reference: [https://github.com/shuding/better-all](https://github.com/shuding/better-all)


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/async-parallel.md
================================================
---
title: Promise.all() for Independent Operations
impact: CRITICAL
impactDescription: 2-10× improvement
tags: async, parallelization, promises, waterfalls
---

## Promise.all() for Independent Operations

When async operations have no interdependencies, execute them concurrently using `Promise.all()`.

**Incorrect (sequential execution, 3 round trips):**

```typescript
const user = await fetchUser()
const posts = await fetchPosts()
const comments = await fetchComments()
```

**Correct (parallel execution, 1 round trip):**

```typescript
const [user, posts, comments] = await Promise.all([
  fetchUser(),
  fetchPosts(),
  fetchComments()
])
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md
================================================
---
title: Strategic Suspense Boundaries
impact: HIGH
impactDescription: faster initial paint
tags: async, suspense, streaming, layout-shift
---

## Strategic Suspense Boundaries

Instead of awaiting data in async components before returning JSX, use Suspense boundaries to show the wrapper UI faster while data loads.

**Incorrect (wrapper blocked by data fetching):**

```tsx
async function Page() {
  const data = await fetchData() // Blocks entire page
  
  return (
    <div>
      <div>Sidebar</div>
      <div>Header</div>
      <div>
        <DataDisplay data={data} />
      </div>
      <div>Footer</div>
    </div>
  )
}
```

The entire layout waits for data even though only the middle section needs it.

**Correct (wrapper shows immediately, data streams in):**

```tsx
function Page() {
  return (
    <div>
      <div>Sidebar</div>
      <div>Header</div>
      <div>
        <Suspense fallback={<Skeleton />}>
          <DataDisplay />
        </Suspense>
      </div>
      <div>Footer</div>
    </div>
  )
}

async function DataDisplay() {
  const data = await fetchData() // Only blocks this component
  return <div>{data.content}</div>
}
```

Sidebar, Header, and Footer render immediately. Only DataDisplay waits for data.

**Alternative (share promise across components):**

```tsx
function Page() {
  // Start fetch immediately, but don't await
  const dataPromise = fetchData()
  
  return (
    <div>
      <div>Sidebar</div>
      <div>Header</div>
      <Suspense fallback={<Skeleton />}>
        <DataDisplay dataPromise={dataPromise} />
        <DataSummary dataPromise={dataPromise} />
      </Suspense>
      <div>Footer</div>
    </div>
  )
}

function DataDisplay({ dataPromise }: { dataPromise: Promise<Data> }) {
  const data = use(dataPromise) // Unwraps the promise
  return <div>{data.content}</div>
}

function DataSummary({ dataPromise }: { dataPromise: Promise<Data> }) {
  const data = use(dataPromise) // Reuses the same promise
  return <div>{data.summary}</div>
}
```

Both components share the same promise, so only one fetch occurs. Layout renders immediately while both components wait together.

**When NOT to use this pattern:**

- Critical data needed for layout decisions (affects positioning)
- SEO-critical content above the fold
- Small, fast queries where suspense overhead isn't worth it
- When you want to avoid layout shift (loading → content jump)

**Trade-off:** Faster initial paint vs potential layout shift. Choose based on your UX priorities.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md
================================================
---
title: Avoid Barrel File Imports
impact: CRITICAL
impactDescription: 200-800ms import cost, slow builds
tags: bundle, imports, tree-shaking, barrel-files, performance
---

## Avoid Barrel File Imports

Import directly from source files instead of barrel files to avoid loading thousands of unused modules. **Barrel files** are entry points that re-export multiple modules (e.g., `index.js` that does `export * from './module'`).

Popular icon and component libraries can have **up to 10,000 re-exports** in their entry file. For many React packages, **it takes 200-800ms just to import them**, affecting both development speed and production cold starts.

**Why tree-shaking doesn't help:** When a library is marked as external (not bundled), the bundler can't optimize it. If you bundle it to enable tree-shaking, builds become substantially slower analyzing the entire module graph.

**Incorrect (imports entire library):**

```tsx
import { Check, X, Menu } from 'lucide-react'
// Loads 1,583 modules, takes ~2.8s extra in dev
// Runtime cost: 200-800ms on every cold start

import { Button, TextField } from '@mui/material'
// Loads 2,225 modules, takes ~4.2s extra in dev
```

**Correct (imports only what you need):**

```tsx
import Check from 'lucide-react/dist/esm/icons/check'
import X from 'lucide-react/dist/esm/icons/x'
import Menu from 'lucide-react/dist/esm/icons/menu'
// Loads only 3 modules (~2KB vs ~1MB)

import Button from '@mui/material/Button'
import TextField from '@mui/material/TextField'
// Loads only what you use
```

**Alternative (Next.js 13.5+):**

```js
// next.config.js - use optimizePackageImports
module.exports = {
  experimental: {
    optimizePackageImports: ['lucide-react', '@mui/material']
  }
}

// Then you can keep the ergonomic barrel imports:
import { Check, X, Menu } from 'lucide-react'
// Automatically transformed to direct imports at build time
```

Direct imports provide 15-70% faster dev boot, 28% faster builds, 40% faster cold starts, and significantly faster HMR.

Libraries commonly affected: `lucide-react`, `@mui/material`, `@mui/icons-material`, `@tabler/icons-react`, `react-icons`, `@headlessui/react`, `@radix-ui/react-*`, `lodash`, `ramda`, `date-fns`, `rxjs`, `react-use`.

Reference: [How we optimized package imports in Next.js](https://vercel.com/blog/how-we-optimized-package-imports-in-next-js)


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/bundle-conditional.md
================================================
---
title: Conditional Module Loading
impact: HIGH
impactDescription: loads large data only when needed
tags: bundle, conditional-loading, lazy-loading
---

## Conditional Module Loading

Load large data or modules only when a feature is activated.

**Example (lazy-load animation frames):**

```tsx
function AnimationPlayer({ enabled }: { enabled: boolean }) {
  const [frames, setFrames] = useState<Frame[] | null>(null)

  useEffect(() => {
    if (enabled && !frames && typeof window !== 'undefined') {
      import('./animation-frames.js')
        .then(mod => setFrames(mod.frames))
        .catch(() => setEnabled(false))
    }
  }, [enabled, frames])

  if (!frames) return <Skeleton />
  return <Canvas frames={frames} />
}
```

The `typeof window !== 'undefined'` check prevents bundling this module for SSR, optimizing server bundle size and build speed.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md
================================================
---
title: Defer Non-Critical Third-Party Libraries
impact: MEDIUM
impactDescription: loads after hydration
tags: bundle, third-party, analytics, defer
---

## Defer Non-Critical Third-Party Libraries

Analytics, logging, and error tracking don't block user interaction. Load them after hydration.

**Incorrect (blocks initial bundle):**

```tsx
import { Analytics } from '@vercel/analytics/react'

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        {children}
        <Analytics />
      </body>
    </html>
  )
}
```

**Correct (loads after hydration):**

```tsx
import dynamic from 'next/dynamic'

const Analytics = dynamic(
  () => import('@vercel/analytics/react').then(m => m.Analytics),
  { ssr: false }
)

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        {children}
        <Analytics />
      </body>
    </html>
  )
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md
================================================
---
title: Dynamic Imports for Heavy Components
impact: CRITICAL
impactDescription: directly affects TTI and LCP
tags: bundle, dynamic-import, code-splitting, next-dynamic
---

## Dynamic Imports for Heavy Components

Use `next/dynamic` to lazy-load large components not needed on initial render.

**Incorrect (Monaco bundles with main chunk ~300KB):**

```tsx
import { MonacoEditor } from './monaco-editor'

function CodePanel({ code }: { code: string }) {
  return <MonacoEditor value={code} />
}
```

**Correct (Monaco loads on demand):**

```tsx
import dynamic from 'next/dynamic'

const MonacoEditor = dynamic(
  () => import('./monaco-editor').then(m => m.MonacoEditor),
  { ssr: false }
)

function CodePanel({ code }: { code: string }) {
  return <MonacoEditor value={code} />
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/bundle-preload.md
================================================
---
title: Preload Based on User Intent
impact: MEDIUM
impactDescription: reduces perceived latency
tags: bundle, preload, user-intent, hover
---

## Preload Based on User Intent

Preload heavy bundles before they're needed to reduce perceived latency.

**Example (preload on hover/focus):**

```tsx
function EditorButton({ onClick }: { onClick: () => void }) {
  const preload = () => {
    if (typeof window !== 'undefined') {
      void import('./monaco-editor')
    }
  }

  return (
    <button
      onMouseEnter={preload}
      onFocus={preload}
      onClick={onClick}
    >
      Open Editor
    </button>
  )
}
```

**Example (preload when feature flag is enabled):**

```tsx
function FlagsProvider({ children, flags }: Props) {
  useEffect(() => {
    if (flags.editorEnabled && typeof window !== 'undefined') {
      void import('./monaco-editor').then(mod => mod.init())
    }
  }, [flags.editorEnabled])

  return <FlagsContext.Provider value={flags}>
    {children}
  </FlagsContext.Provider>
}
```

The `typeof window !== 'undefined'` check prevents bundling preloaded modules for SSR, optimizing server bundle size and build speed.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/client-event-listeners.md
================================================
---
title: Deduplicate Global Event Listeners
impact: LOW
impactDescription: single listener for N components
tags: client, swr, event-listeners, subscription
---

## Deduplicate Global Event Listeners

Use `useSWRSubscription()` to share global event listeners across component instances.

**Incorrect (N instances = N listeners):**

```tsx
function useKeyboardShortcut(key: string, callback: () => void) {
  useEffect(() => {
    const handler = (e: KeyboardEvent) => {
      if (e.metaKey && e.key === key) {
        callback()
      }
    }
    window.addEventListener('keydown', handler)
    return () => window.removeEventListener('keydown', handler)
  }, [key, callback])
}
```

When using the `useKeyboardShortcut` hook multiple times, each instance will register a new listener.

**Correct (N instances = 1 listener):**

```tsx
import useSWRSubscription from 'swr/subscription'

// Module-level Map to track callbacks per key
const keyCallbacks = new Map<string, Set<() => void>>()

function useKeyboardShortcut(key: string, callback: () => void) {
  // Register this callback in the Map
  useEffect(() => {
    if (!keyCallbacks.has(key)) {
      keyCallbacks.set(key, new Set())
    }
    keyCallbacks.get(key)!.add(callback)

    return () => {
      const set = keyCallbacks.get(key)
      if (set) {
        set.delete(callback)
        if (set.size === 0) {
          keyCallbacks.delete(key)
        }
      }
    }
  }, [key, callback])

  useSWRSubscription('global-keydown', () => {
    const handler = (e: KeyboardEvent) => {
      if (e.metaKey && keyCallbacks.has(e.key)) {
        keyCallbacks.get(e.key)!.forEach(cb => cb())
      }
    }
    window.addEventListener('keydown', handler)
    return () => window.removeEventListener('keydown', handler)
  })
}

function Profile() {
  // Multiple shortcuts will share the same listener
  useKeyboardShortcut('p', () => { /* ... */ }) 
  useKeyboardShortcut('k', () => { /* ... */ })
  // ...
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md
================================================
---
title: Use SWR for Automatic Deduplication
impact: MEDIUM-HIGH
impactDescription: automatic deduplication
tags: client, swr, deduplication, data-fetching
---

## Use SWR for Automatic Deduplication

SWR enables request deduplication, caching, and revalidation across component instances.

**Incorrect (no deduplication, each instance fetches):**

```tsx
function UserList() {
  const [users, setUsers] = useState([])
  useEffect(() => {
    fetch('/api/users')
      .then(r => r.json())
      .then(setUsers)
  }, [])
}
```

**Correct (multiple instances share one request):**

```tsx
import useSWR from 'swr'

function UserList() {
  const { data: users } = useSWR('/api/users', fetcher)
}
```

**For immutable data:**

```tsx
import { useImmutableSWR } from '@/lib/swr'

function StaticContent() {
  const { data } = useImmutableSWR('/api/config', fetcher)
}
```

**For mutations:**

```tsx
import { useSWRMutation } from 'swr/mutation'

function UpdateButton() {
  const { trigger } = useSWRMutation('/api/user', updateUser)
  return <button onClick={() => trigger()}>Update</button>
}
```

Reference: [https://swr.vercel.app](https://swr.vercel.app)


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md
================================================
---
title: Batch DOM CSS Changes
impact: MEDIUM
impactDescription: reduces reflows/repaints
tags: javascript, dom, css, performance, reflow
---

## Batch DOM CSS Changes

Avoid changing styles one property at a time. Group multiple CSS changes together via classes or `cssText` to minimize browser reflows.

**Incorrect (multiple reflows):**

```typescript
function updateElementStyles(element: HTMLElement) {
  // Each line triggers a reflow
  element.style.width = '100px'
  element.style.height = '200px'
  element.style.backgroundColor = 'blue'
  element.style.border = '1px solid black'
}
```

**Correct (add class - single reflow):**

```typescript
// CSS file
.highlighted-box {
  width: 100px;
  height: 200px;
  background-color: blue;
  border: 1px solid black;
}

// JavaScript
function updateElementStyles(element: HTMLElement) {
  element.classList.add('highlighted-box')
}
```

**Correct (change cssText - single reflow):**

```typescript
function updateElementStyles(element: HTMLElement) {
  element.style.cssText = `
    width: 100px;
    height: 200px;
    background-color: blue;
    border: 1px solid black;
  `
}
```

**React example:**

```tsx
// Incorrect: changing styles one by one
function Box({ isHighlighted }: { isHighlighted: boolean }) {
  const ref = useRef<HTMLDivElement>(null)
  
  useEffect(() => {
    if (ref.current && isHighlighted) {
      ref.current.style.width = '100px'
      ref.current.style.height = '200px'
      ref.current.style.backgroundColor = 'blue'
    }
  }, [isHighlighted])
  
  return <div ref={ref}>Content</div>
}

// Correct: toggle class
function Box({ isHighlighted }: { isHighlighted: boolean }) {
  return (
    <div className={isHighlighted ? 'highlighted-box' : ''}>
      Content
    </div>
  )
}
```

Prefer CSS classes over inline styles when possible. Classes are cached by the browser and provide better separation of concerns.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md
================================================
---
title: Cache Repeated Function Calls
impact: MEDIUM
impactDescription: avoid redundant computation
tags: javascript, cache, memoization, performance
---

## Cache Repeated Function Calls

Use a module-level Map to cache function results when the same function is called repeatedly with the same inputs during render.

**Incorrect (redundant computation):**

```typescript
function ProjectList({ projects }: { projects: Project[] }) {
  return (
    <div>
      {projects.map(project => {
        // slugify() called 100+ times for same project names
        const slug = slugify(project.name)
        
        return <ProjectCard key={project.id} slug={slug} />
      })}
    </div>
  )
}
```

**Correct (cached results):**

```typescript
// Module-level cache
const slugifyCache = new Map<string, string>()

function cachedSlugify(text: string): string {
  if (slugifyCache.has(text)) {
    return slugifyCache.get(text)!
  }
  const result = slugify(text)
  slugifyCache.set(text, result)
  return result
}

function ProjectList({ projects }: { projects: Project[] }) {
  return (
    <div>
      {projects.map(project => {
        // Computed only once per unique project name
        const slug = cachedSlugify(project.name)
        
        return <ProjectCard key={project.id} slug={slug} />
      })}
    </div>
  )
}
```

**Simpler pattern for single-value functions:**

```typescript
let isLoggedInCache: boolean | null = null

function isLoggedIn(): boolean {
  if (isLoggedInCache !== null) {
    return isLoggedInCache
  }
  
  isLoggedInCache = document.cookie.includes('auth=')
  return isLoggedInCache
}

// Clear cache when auth changes
function onAuthChange() {
  isLoggedInCache = null
}
```

Use a Map (not a hook) so it works everywhere: utilities, event handlers, not just React components.

Reference: [How we made the Vercel Dashboard twice as fast](https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast)


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md
================================================
---
title: Cache Property Access in Loops
impact: LOW-MEDIUM
impactDescription: reduces lookups
tags: javascript, loops, optimization, caching
---

## Cache Property Access in Loops

Cache object property lookups in hot paths.

**Incorrect (3 lookups × N iterations):**

```typescript
for (let i = 0; i < arr.length; i++) {
  process(obj.config.settings.value)
}
```

**Correct (1 lookup total):**

```typescript
const value = obj.config.settings.value
const len = arr.length
for (let i = 0; i < len; i++) {
  process(value)
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-cache-storage.md
================================================
---
title: Cache Storage API Calls
impact: LOW-MEDIUM
impactDescription: reduces expensive I/O
tags: javascript, localStorage, storage, caching, performance
---

## Cache Storage API Calls

`localStorage`, `sessionStorage`, and `document.cookie` are synchronous and expensive. Cache reads in memory.

**Incorrect (reads storage on every call):**

```typescript
function getTheme() {
  return localStorage.getItem('theme') ?? 'light'
}
// Called 10 times = 10 storage reads
```

**Correct (Map cache):**

```typescript
const storageCache = new Map<string, string | null>()

function getLocalStorage(key: string) {
  if (!storageCache.has(key)) {
    storageCache.set(key, localStorage.getItem(key))
  }
  return storageCache.get(key)
}

function setLocalStorage(key: string, value: string) {
  localStorage.setItem(key, value)
  storageCache.set(key, value)  // keep cache in sync
}
```

Use a Map (not a hook) so it works everywhere: utilities, event handlers, not just React components.

**Cookie caching:**

```typescript
let cookieCache: Record<string, string> | null = null

function getCookie(name: string) {
  if (!cookieCache) {
    cookieCache = Object.fromEntries(
      document.cookie.split('; ').map(c => c.split('='))
    )
  }
  return cookieCache[name]
}
```

**Important (invalidate on external changes):**

If storage can change externally (another tab, server-set cookies), invalidate cache:

```typescript
window.addEventListener('storage', (e) => {
  if (e.key) storageCache.delete(e.key)
})

document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'visible') {
    storageCache.clear()
  }
})
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md
================================================
---
title: Combine Multiple Array Iterations
impact: LOW-MEDIUM
impactDescription: reduces iterations
tags: javascript, arrays, loops, performance
---

## Combine Multiple Array Iterations

Multiple `.filter()` or `.map()` calls iterate the array multiple times. Combine into one loop.

**Incorrect (3 iterations):**

```typescript
const admins = users.filter(u => u.isAdmin)
const testers = users.filter(u => u.isTester)
const inactive = users.filter(u => !u.isActive)
```

**Correct (1 iteration):**

```typescript
const admins: User[] = []
const testers: User[] = []
const inactive: User[] = []

for (const user of users) {
  if (user.isAdmin) admins.push(user)
  if (user.isTester) testers.push(user)
  if (!user.isActive) inactive.push(user)
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-early-exit.md
================================================
---
title: Early Return from Functions
impact: LOW-MEDIUM
impactDescription: avoids unnecessary computation
tags: javascript, functions, optimization, early-return
---

## Early Return from Functions

Return early when result is determined to skip unnecessary processing.

**Incorrect (processes all items even after finding answer):**

```typescript
function validateUsers(users: User[]) {
  let hasError = false
  let errorMessage = ''
  
  for (const user of users) {
    if (!user.email) {
      hasError = true
      errorMessage = 'Email required'
    }
    if (!user.name) {
      hasError = true
      errorMessage = 'Name required'
    }
    // Continues checking all users even after error found
  }
  
  return hasError ? { valid: false, error: errorMessage } : { valid: true }
}
```

**Correct (returns immediately on first error):**

```typescript
function validateUsers(users: User[]) {
  for (const user of users) {
    if (!user.email) {
      return { valid: false, error: 'Email required' }
    }
    if (!user.name) {
      return { valid: false, error: 'Name required' }
    }
  }

  return { valid: true }
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md
================================================
---
title: Hoist RegExp Creation
impact: LOW-MEDIUM
impactDescription: avoids recreation
tags: javascript, regexp, optimization, memoization
---

## Hoist RegExp Creation

Don't create RegExp inside render. Hoist to module scope or memoize with `useMemo()`.

**Incorrect (new RegExp every render):**

```tsx
function Highlighter({ text, query }: Props) {
  const regex = new RegExp(`(${query})`, 'gi')
  const parts = text.split(regex)
  return <>{parts.map((part, i) => ...)}</>
}
```

**Correct (memoize or hoist):**

```tsx
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/

function Highlighter({ text, query }: Props) {
  const regex = useMemo(
    () => new RegExp(`(${escapeRegex(query)})`, 'gi'),
    [query]
  )
  const parts = text.split(regex)
  return <>{parts.map((part, i) => ...)}</>
}
```

**Warning (global regex has mutable state):**

Global regex (`/g`) has mutable `lastIndex` state:

```typescript
const regex = /foo/g
regex.test('foo')  // true, lastIndex = 3
regex.test('foo')  // false, lastIndex = 0
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-index-maps.md
================================================
---
title: Build Index Maps for Repeated Lookups
impact: LOW-MEDIUM
impactDescription: 1M ops to 2K ops
tags: javascript, map, indexing, optimization, performance
---

## Build Index Maps for Repeated Lookups

Multiple `.find()` calls by the same key should use a Map.

**Incorrect (O(n) per lookup):**

```typescript
function processOrders(orders: Order[], users: User[]) {
  return orders.map(order => ({
    ...order,
    user: users.find(u => u.id === order.userId)
  }))
}
```

**Correct (O(1) per lookup):**

```typescript
function processOrders(orders: Order[], users: User[]) {
  const userById = new Map(users.map(u => [u.id, u]))

  return orders.map(order => ({
    ...order,
    user: userById.get(order.userId)
  }))
}
```

Build map once (O(n)), then all lookups are O(1).
For 1000 orders × 1000 users: 1M ops → 2K ops.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-length-check-first.md
================================================
---
title: Early Length Check for Array Comparisons
impact: MEDIUM-HIGH
impactDescription: avoids expensive operations when lengths differ
tags: javascript, arrays, performance, optimization, comparison
---

## Early Length Check for Array Comparisons

When comparing arrays with expensive operations (sorting, deep equality, serialization), check lengths first. If lengths differ, the arrays cannot be equal.

In real-world applications, this optimization is especially valuable when the comparison runs in hot paths (event handlers, render loops).

**Incorrect (always runs expensive comparison):**

```typescript
function hasChanges(current: string[], original: string[]) {
  // Always sorts and joins, even when lengths differ
  return current.sort().join() !== original.sort().join()
}
```

Two O(n log n) sorts run even when `current.length` is 5 and `original.length` is 100. There is also overhead of joining the arrays and comparing the strings.

**Correct (O(1) length check first):**

```typescript
function hasChanges(current: string[], original: string[]) {
  // Early return if lengths differ
  if (current.length !== original.length) {
    return true
  }
  // Only sort/join when lengths match
  const currentSorted = current.toSorted()
  const originalSorted = original.toSorted()
  for (let i = 0; i < currentSorted.length; i++) {
    if (currentSorted[i] !== originalSorted[i]) {
      return true
    }
  }
  return false
}
```

This new approach is more efficient because:
- It avoids the overhead of sorting and joining the arrays when lengths differ
- It avoids consuming memory for the joined strings (especially important for large arrays)
- It avoids mutating the original arrays
- It returns early when a difference is found


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md
================================================
---
title: Use Loop for Min/Max Instead of Sort
impact: LOW
impactDescription: O(n) instead of O(n log n)
tags: javascript, arrays, performance, sorting, algorithms
---

## Use Loop for Min/Max Instead of Sort

Finding the smallest or largest element only requires a single pass through the array. Sorting is wasteful and slower.

**Incorrect (O(n log n) - sort to find latest):**

```typescript
interface Project {
  id: string
  name: string
  updatedAt: number
}

function getLatestProject(projects: Project[]) {
  const sorted = [...projects].sort((a, b) => b.updatedAt - a.updatedAt)
  return sorted[0]
}
```

Sorts the entire array just to find the maximum value.

**Incorrect (O(n log n) - sort for oldest and newest):**

```typescript
function getOldestAndNewest(projects: Project[]) {
  const sorted = [...projects].sort((a, b) => a.updatedAt - b.updatedAt)
  return { oldest: sorted[0], newest: sorted[sorted.length - 1] }
}
```

Still sorts unnecessarily when only min/max are needed.

**Correct (O(n) - single loop):**

```typescript
function getLatestProject(projects: Project[]) {
  if (projects.length === 0) return null
  
  let latest = projects[0]
  
  for (let i = 1; i < projects.length; i++) {
    if (projects[i].updatedAt > latest.updatedAt) {
      latest = projects[i]
    }
  }
  
  return latest
}

function getOldestAndNewest(projects: Project[]) {
  if (projects.length === 0) return { oldest: null, newest: null }
  
  let oldest = projects[0]
  let newest = projects[0]
  
  for (let i = 1; i < projects.length; i++) {
    if (projects[i].updatedAt < oldest.updatedAt) oldest = projects[i]
    if (projects[i].updatedAt > newest.updatedAt) newest = projects[i]
  }
  
  return { oldest, newest }
}
```

Single pass through the array, no copying, no sorting.

**Alternative (Math.min/Math.max for small arrays):**

```typescript
const numbers = [5, 2, 8, 1, 9]
const min = Math.min(...numbers)
const max = Math.max(...numbers)
```

This works for small arrays but can be slower for very large arrays due to spread operator limitations. Use the loop approach for reliability.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md
================================================
---
title: Use Set/Map for O(1) Lookups
impact: LOW-MEDIUM
impactDescription: O(n) to O(1)
tags: javascript, set, map, data-structures, performance
---

## Use Set/Map for O(1) Lookups

Convert arrays to Set/Map for repeated membership checks.

**Incorrect (O(n) per check):**

```typescript
const allowedIds = ['a', 'b', 'c', ...]
items.filter(item => allowedIds.includes(item.id))
```

**Correct (O(1) per check):**

```typescript
const allowedIds = new Set(['a', 'b', 'c', ...])
items.filter(item => allowedIds.has(item.id))
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md
================================================
---
title: Use toSorted() Instead of sort() for Immutability
impact: MEDIUM-HIGH
impactDescription: prevents mutation bugs in React state
tags: javascript, arrays, immutability, react, state, mutation
---

## Use toSorted() Instead of sort() for Immutability

`.sort()` mutates the array in place, which can cause bugs with React state and props. Use `.toSorted()` to create a new sorted array without mutation.

**Incorrect (mutates original array):**

```typescript
function UserList({ users }: { users: User[] }) {
  // Mutates the users prop array!
  const sorted = useMemo(
    () => users.sort((a, b) => a.name.localeCompare(b.name)),
    [users]
  )
  return <div>{sorted.map(renderUser)}</div>
}
```

**Correct (creates new array):**

```typescript
function UserList({ users }: { users: User[] }) {
  // Creates new sorted array, original unchanged
  const sorted = useMemo(
    () => users.toSorted((a, b) => a.name.localeCompare(b.name)),
    [users]
  )
  return <div>{sorted.map(renderUser)}</div>
}
```

**Why this matters in React:**

1. Props/state mutations break React's immutability model - React expects props and state to be treated as read-only
2. Causes stale closure bugs - Mutating arrays inside closures (callbacks, effects) can lead to unexpected behavior

**Browser support (fallback for older browsers):**

`.toSorted()` is available in all modern browsers (Chrome 110+, Safari 16+, Firefox 115+, Node.js 20+). For older environments, use spread operator:

```typescript
// Fallback for older browsers
const sorted = [...items].sort((a, b) => a.value - b.value)
```

**Other immutable array methods:**

- `.toSorted()` - immutable sort
- `.toReversed()` - immutable reverse
- `.toSpliced()` - immutable splice
- `.with()` - immutable element replacement


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rendering-activity.md
================================================
---
title: Use Activity Component for Show/Hide
impact: MEDIUM
impactDescription: preserves state/DOM
tags: rendering, activity, visibility, state-preservation
---

## Use Activity Component for Show/Hide

Use React's `<Activity>` to preserve state/DOM for expensive components that frequently toggle visibility.

**Usage:**

```tsx
import { Activity } from 'react'

function Dropdown({ isOpen }: Props) {
  return (
    <Activity mode={isOpen ? 'visible' : 'hidden'}>
      <ExpensiveMenu />
    </Activity>
  )
}
```

Avoids expensive re-renders and state loss.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md
================================================
---
title: Animate SVG Wrapper Instead of SVG Element
impact: LOW
impactDescription: enables hardware acceleration
tags: rendering, svg, css, animation, performance
---

## Animate SVG Wrapper Instead of SVG Element

Many browsers don't have hardware acceleration for CSS3 animations on SVG elements. Wrap SVG in a `<div>` and animate the wrapper instead.

**Incorrect (animating SVG directly - no hardware acceleration):**

```tsx
function LoadingSpinner() {
  return (
    <svg 
      className="animate-spin"
      width="24" 
      height="24" 
      viewBox="0 0 24 24"
    >
      <circle cx="12" cy="12" r="10" stroke="currentColor" />
    </svg>
  )
}
```

**Correct (animating wrapper div - hardware accelerated):**

```tsx
function LoadingSpinner() {
  return (
    <div className="animate-spin">
      <svg 
        width="24" 
        height="24" 
        viewBox="0 0 24 24"
      >
        <circle cx="12" cy="12" r="10" stroke="currentColor" />
      </svg>
    </div>
  )
}
```

This applies to all CSS transforms and transitions (`transform`, `opacity`, `translate`, `scale`, `rotate`). The wrapper div allows browsers to use GPU acceleration for smoother animations.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md
================================================
---
title: Use Explicit Conditional Rendering
impact: LOW
impactDescription: prevents rendering 0 or NaN
tags: rendering, conditional, jsx, falsy-values
---

## Use Explicit Conditional Rendering

Use explicit ternary operators (`? :`) instead of `&&` for conditional rendering when the condition can be `0`, `NaN`, or other falsy values that render.

**Incorrect (renders "0" when count is 0):**

```tsx
function Badge({ count }: { count: number }) {
  return (
    <div>
      {count && <span className="badge">{count}</span>}
    </div>
  )
}

// When count = 0, renders: <div>0</div>
// When count = 5, renders: <div><span class="badge">5</span></div>
```

**Correct (renders nothing when count is 0):**

```tsx
function Badge({ count }: { count: number }) {
  return (
    <div>
      {count > 0 ? <span className="badge">{count}</span> : null}
    </div>
  )
}

// When count = 0, renders: <div></div>
// When count = 5, renders: <div><span class="badge">5</span></div>
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md
================================================
---
title: CSS content-visibility for Long Lists
impact: HIGH
impactDescription: faster initial render
tags: rendering, css, content-visibility, long-lists
---

## CSS content-visibility for Long Lists

Apply `content-visibility: auto` to defer off-screen rendering.

**CSS:**

```css
.message-item {
  content-visibility: auto;
  contain-intrinsic-size: 0 80px;
}
```

**Example:**

```tsx
function MessageList({ messages }: { messages: Message[] }) {
  return (
    <div className="overflow-y-auto h-screen">
      {messages.map(msg => (
        <div key={msg.id} className="message-item">
          <Avatar user={msg.author} />
          <div>{msg.content}</div>
        </div>
      ))}
    </div>
  )
}
```

For 1000 messages, browser skips layout/paint for ~990 off-screen items (10× faster initial render).


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md
================================================
---
title: Hoist Static JSX Elements
impact: LOW
impactDescription: avoids re-creation
tags: rendering, jsx, static, optimization
---

## Hoist Static JSX Elements

Extract static JSX outside components to avoid re-creation.

**Incorrect (recreates element every render):**

```tsx
function LoadingSkeleton() {
  return <div className="animate-pulse h-20 bg-gray-200" />
}

function Container() {
  return (
    <div>
      {loading && <LoadingSkeleton />}
    </div>
  )
}
```

**Correct (reuses same element):**

```tsx
const loadingSkeleton = (
  <div className="animate-pulse h-20 bg-gray-200" />
)

function Container() {
  return (
    <div>
      {loading && loadingSkeleton}
    </div>
  )
}
```

This is especially helpful for large and static SVG nodes, which can be expensive to recreate on every render.

**Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, the compiler automatically hoists static JSX elements and optimizes component re-renders, making manual hoisting unnecessary.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md
================================================
---
title: Prevent Hydration Mismatch Without Flickering
impact: MEDIUM
impactDescription: avoids visual flicker and hydration errors
tags: rendering, ssr, hydration, localStorage, flicker
---

## Prevent Hydration Mismatch Without Flickering

When rendering content that depends on client-side storage (localStorage, cookies), avoid both SSR breakage and post-hydration flickering by injecting a synchronous script that updates the DOM before React hydrates.

**Incorrect (breaks SSR):**

```tsx
function ThemeWrapper({ children }: { children: ReactNode }) {
  // localStorage is not available on server - throws error
  const theme = localStorage.getItem('theme') || 'light'
  
  return (
    <div className={theme}>
      {children}
    </div>
  )
}
```

Server-side rendering will fail because `localStorage` is undefined.

**Incorrect (visual flickering):**

```tsx
function ThemeWrapper({ children }: { children: ReactNode }) {
  const [theme, setTheme] = useState('light')
  
  useEffect(() => {
    // Runs after hydration - causes visible flash
    const stored = localStorage.getItem('theme')
    if (stored) {
      setTheme(stored)
    }
  }, [])
  
  return (
    <div className={theme}>
      {children}
    </div>
  )
}
```

Component first renders with default value (`light`), then updates after hydration, causing a visible flash of incorrect content.

**Correct (no flicker, no hydration mismatch):**

```tsx
function ThemeWrapper({ children }: { children: ReactNode }) {
  return (
    <>
      <div id="theme-wrapper">
        {children}
      </div>
      <script
        dangerouslySetInnerHTML={{
          __html: `
            (function() {
              try {
                var theme = localStorage.getItem('theme') || 'light';
                var el = document.getElementById('theme-wrapper');
                if (el) el.className = theme;
              } catch (e) {}
            })();
          `,
        }}
      />
    </>
  )
}
```

The inline script executes synchronously before showing the element, ensuring the DOM already has the correct value. No flickering, no hydration mismatch.

This pattern is especially useful for theme toggles, user preferences, authentication states, and any client-only data that should render immediately without flashing default values.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md
================================================
---
title: Optimize SVG Precision
impact: LOW
impactDescription: reduces file size
tags: rendering, svg, optimization, svgo
---

## Optimize SVG Precision

Reduce SVG coordinate precision to decrease file size. The optimal precision depends on the viewBox size, but in general reducing precision should be considered.

**Incorrect (excessive precision):**

```svg
<path d="M 10.293847 20.847362 L 30.938472 40.192837" />
```

**Correct (1 decimal place):**

```svg
<path d="M 10.3 20.8 L 30.9 40.2" />
```

**Automate with SVGO:**

```bash
npx svgo --precision=1 --multipass icon.svg
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md
================================================
---
title: Defer State Reads to Usage Point
impact: MEDIUM
impactDescription: avoids unnecessary subscriptions
tags: rerender, searchParams, localStorage, optimization
---

## Defer State Reads to Usage Point

Don't subscribe to dynamic state (searchParams, localStorage) if you only read it inside callbacks.

**Incorrect (subscribes to all searchParams changes):**

```tsx
function ShareButton({ chatId }: { chatId: string }) {
  const searchParams = useSearchParams()

  const handleShare = () => {
    const ref = searchParams.get('ref')
    shareChat(chatId, { ref })
  }

  return <button onClick={handleShare}>Share</button>
}
```

**Correct (reads on demand, no subscription):**

```tsx
function ShareButton({ chatId }: { chatId: string }) {
  const handleShare = () => {
    const params = new URLSearchParams(window.location.search)
    const ref = params.get('ref')
    shareChat(chatId, { ref })
  }

  return <button onClick={handleShare}>Share</button>
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md
================================================
---
title: Narrow Effect Dependencies
impact: LOW
impactDescription: minimizes effect re-runs
tags: rerender, useEffect, dependencies, optimization
---

## Narrow Effect Dependencies

Specify primitive dependencies instead of objects to minimize effect re-runs.

**Incorrect (re-runs on any user field change):**

```tsx
useEffect(() => {
  console.log(user.id)
}, [user])
```

**Correct (re-runs only when id changes):**

```tsx
useEffect(() => {
  console.log(user.id)
}, [user.id])
```

**For derived state, compute outside effect:**

```tsx
// Incorrect: runs on width=767, 766, 765...
useEffect(() => {
  if (width < 768) {
    enableMobileMode()
  }
}, [width])

// Correct: runs only on boolean transition
const isMobile = width < 768
useEffect(() => {
  if (isMobile) {
    enableMobileMode()
  }
}, [isMobile])
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md
================================================
---
title: Subscribe to Derived State
impact: MEDIUM
impactDescription: reduces re-render frequency
tags: rerender, derived-state, media-query, optimization
---

## Subscribe to Derived State

Subscribe to derived boolean state instead of continuous values to reduce re-render frequency.

**Incorrect (re-renders on every pixel change):**

```tsx
function Sidebar() {
  const width = useWindowWidth()  // updates continuously
  const isMobile = width < 768
  return <nav className={isMobile ? 'mobile' : 'desktop'}>
}
```

**Correct (re-renders only when boolean changes):**

```tsx
function Sidebar() {
  const isMobile = useMediaQuery('(max-width: 767px)')
  return <nav className={isMobile ? 'mobile' : 'desktop'}>
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md
================================================
---
title: Use Functional setState Updates
impact: MEDIUM
impactDescription: prevents stale closures and unnecessary callback recreations
tags: react, hooks, useState, useCallback, callbacks, closures
---

## Use Functional setState Updates

When updating state based on the current state value, use the functional update form of setState instead of directly referencing the state variable. This prevents stale closures, eliminates unnecessary dependencies, and creates stable callback references.

**Incorrect (requires state as dependency):**

```tsx
function TodoList() {
  const [items, setItems] = useState(initialItems)
  
  // Callback must depend on items, recreated on every items change
  const addItems = useCallback((newItems: Item[]) => {
    setItems([...items, ...newItems])
  }, [items])  // ❌ items dependency causes recreations
  
  // Risk of stale closure if dependency is forgotten
  const removeItem = useCallback((id: string) => {
    setItems(items.filter(item => item.id !== id))
  }, [])  // ❌ Missing items dependency - will use stale items!
  
  return <ItemsEditor items={items} onAdd={addItems} onRemove={removeItem} />
}
```

The first callback is recreated every time `items` changes, which can cause child components to re-render unnecessarily. The second callback has a stale closure bug—it will always reference the initial `items` value.

**Correct (stable callbacks, no stale closures):**

```tsx
function TodoList() {
  const [items, setItems] = useState(initialItems)
  
  // Stable callback, never recreated
  const addItems = useCallback((newItems: Item[]) => {
    setItems(curr => [...curr, ...newItems])
  }, [])  // ✅ No dependencies needed
  
  // Always uses latest state, no stale closure risk
  const removeItem = useCallback((id: string) => {
    setItems(curr => curr.filter(item => item.id !== id))
  }, [])  // ✅ Safe and stable
  
  return <ItemsEditor items={items} onAdd={addItems} onRemove={removeItem} />
}
```

**Benefits:**

1. **Stable callback references** - Callbacks don't need to be recreated when state changes
2. **No stale closures** - Always operates on the latest state value
3. **Fewer dependencies** - Simplifies dependency arrays and reduces memory leaks
4. **Prevents bugs** - Eliminates the most common source of React closure bugs

**When to use functional updates:**

- Any setState that depends on the current state value
- Inside useCallback/useMemo when state is needed
- Event handlers that reference state
- Async operations that update state

**When direct updates are fine:**

- Setting state to a static value: `setCount(0)`
- Setting state from props/arguments only: `setName(newName)`
- State doesn't depend on previous value

**Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, the compiler can automatically optimize some cases, but functional updates are still recommended for correctness and to prevent stale closure bugs.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md
================================================
---
title: Use Lazy State Initialization
impact: MEDIUM
impactDescription: wasted computation on every render
tags: react, hooks, useState, performance, initialization
---

## Use Lazy State Initialization

Pass a function to `useState` for expensive initial values. Without the function form, the initializer runs on every render even though the value is only used once.

**Incorrect (runs on every render):**

```tsx
function FilteredList({ items }: { items: Item[] }) {
  // buildSearchIndex() runs on EVERY render, even after initialization
  const [searchIndex, setSearchIndex] = useState(buildSearchIndex(items))
  const [query, setQuery] = useState('')
  
  // When query changes, buildSearchIndex runs again unnecessarily
  return <SearchResults index={searchIndex} query={query} />
}

function UserProfile() {
  // JSON.parse runs on every render
  const [settings, setSettings] = useState(
    JSON.parse(localStorage.getItem('settings') || '{}')
  )
  
  return <SettingsForm settings={settings} onChange={setSettings} />
}
```

**Correct (runs only once):**

```tsx
function FilteredList({ items }: { items: Item[] }) {
  // buildSearchIndex() runs ONLY on initial render
  const [searchIndex, setSearchIndex] = useState(() => buildSearchIndex(items))
  const [query, setQuery] = useState('')
  
  return <SearchResults index={searchIndex} query={query} />
}

function UserProfile() {
  // JSON.parse runs only on initial render
  const [settings, setSettings] = useState(() => {
    const stored = localStorage.getItem('settings')
    return stored ? JSON.parse(stored) : {}
  })
  
  return <SettingsForm settings={settings} onChange={setSettings} />
}
```

Use lazy initialization when computing initial values from localStorage/sessionStorage, building data structures (indexes, maps), reading from the DOM, or performing heavy transformations.

For simple primitives (`useState(0)`), direct references (`useState(props.value)`), or cheap literals (`useState({})`), the function form is unnecessary.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rerender-memo.md
================================================
---
title: Extract to Memoized Components
impact: MEDIUM
impactDescription: enables early returns
tags: rerender, memo, useMemo, optimization
---

## Extract to Memoized Components

Extract expensive work into memoized components to enable early returns before computation.

**Incorrect (computes avatar even when loading):**

```tsx
function Profile({ user, loading }: Props) {
  const avatar = useMemo(() => {
    const id = computeAvatarId(user)
    return <Avatar id={id} />
  }, [user])

  if (loading) return <Skeleton />
  return <div>{avatar}</div>
}
```

**Correct (skips computation when loading):**

```tsx
const UserAvatar = memo(function UserAvatar({ user }: { user: User }) {
  const id = useMemo(() => computeAvatarId(user), [user])
  return <Avatar id={id} />
})

function Profile({ user, loading }: Props) {
  if (loading) return <Skeleton />
  return (
    <div>
      <UserAvatar user={user} />
    </div>
  )
}
```

**Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, manual memoization with `memo()` and `useMemo()` is not necessary. The compiler automatically optimizes re-renders.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/rerender-transitions.md
================================================
---
title: Use Transitions for Non-Urgent Updates
impact: MEDIUM
impactDescription: maintains UI responsiveness
tags: rerender, transitions, startTransition, performance
---

## Use Transitions for Non-Urgent Updates

Mark frequent, non-urgent state updates as transitions to maintain UI responsiveness.

**Incorrect (blocks UI on every scroll):**

```tsx
function ScrollTracker() {
  const [scrollY, setScrollY] = useState(0)
  useEffect(() => {
    const handler = () => setScrollY(window.scrollY)
    window.addEventListener('scroll', handler, { passive: true })
    return () => window.removeEventListener('scroll', handler)
  }, [])
}
```

**Correct (non-blocking updates):**

```tsx
import { startTransition } from 'react'

function ScrollTracker() {
  const [scrollY, setScrollY] = useState(0)
  useEffect(() => {
    const handler = () => {
      startTransition(() => setScrollY(window.scrollY))
    }
    window.addEventListener('scroll', handler, { passive: true })
    return () => window.removeEventListener('scroll', handler)
  }, [])
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md
================================================
---
title: Use after() for Non-Blocking Operations
impact: MEDIUM
impactDescription: faster response times
tags: server, async, logging, analytics, side-effects
---

## Use after() for Non-Blocking Operations

Use Next.js's `after()` to schedule work that should execute after a response is sent. This prevents logging, analytics, and other side effects from blocking the response.

**Incorrect (blocks response):**

```tsx
import { logUserAction } from '@/app/utils'

export async function POST(request: Request) {
  // Perform mutation
  await updateDatabase(request)
  
  // Logging blocks the response
  const userAgent = request.headers.get('user-agent') || 'unknown'
  await logUserAction({ userAgent })
  
  return new Response(JSON.stringify({ status: 'success' }), {
    status: 200,
    headers: { 'Content-Type': 'application/json' }
  })
}
```

**Correct (non-blocking):**

```tsx
import { after } from 'next/server'
import { headers, cookies } from 'next/headers'
import { logUserAction } from '@/app/utils'

export async function POST(request: Request) {
  // Perform mutation
  await updateDatabase(request)
  
  // Log after response is sent
  after(async () => {
    const userAgent = (await headers()).get('user-agent') || 'unknown'
    const sessionCookie = (await cookies()).get('session-id')?.value || 'anonymous'
    
    logUserAction({ sessionCookie, userAgent })
  })
  
  return new Response(JSON.stringify({ status: 'success' }), {
    status: 200,
    headers: { 'Content-Type': 'application/json' }
  })
}
```

The response is sent immediately while logging happens in the background.

**Common use cases:**

- Analytics tracking
- Audit logging
- Sending notifications
- Cache invalidation
- Cleanup tasks

**Important notes:**

- `after()` runs even if the response fails or redirects
- Works in Server Actions, Route Handlers, and Server Components

Reference: [https://nextjs.org/docs/app/api-reference/functions/after](https://nextjs.org/docs/app/api-reference/functions/after)


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/server-cache-lru.md
================================================
---
title: Cross-Request LRU Caching
impact: HIGH
impactDescription: caches across requests
tags: server, cache, lru, cross-request
---

## Cross-Request LRU Caching

`React.cache()` only works within one request. For data shared across sequential requests (user clicks button A then button B), use an LRU cache.

**Implementation:**

```typescript
import { LRUCache } from 'lru-cache'

const cache = new LRUCache<string, any>({
  max: 1000,
  ttl: 5 * 60 * 1000  // 5 minutes
})

export async function getUser(id: string) {
  const cached = cache.get(id)
  if (cached) return cached

  const user = await db.user.findUnique({ where: { id } })
  cache.set(id, user)
  return user
}

// Request 1: DB query, result cached
// Request 2: cache hit, no DB query
```

Use when sequential user actions hit multiple endpoints needing the same data within seconds.

**With Vercel's [Fluid Compute](https://vercel.com/docs/fluid-compute):** LRU caching is especially effective because multiple concurrent requests can share the same function instance and cache. This means the cache persists across requests without needing external storage like Redis.

**In traditional serverless:** Each invocation runs in isolation, so consider Redis for cross-process caching.

Reference: [https://github.com/isaacs/node-lru-cache](https://github.com/isaacs/node-lru-cache)


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/server-cache-react.md
================================================
---
title: Per-Request Deduplication with React.cache()
impact: MEDIUM
impactDescription: deduplicates within request
tags: server, cache, react-cache, deduplication
---

## Per-Request Deduplication with React.cache()

Use `React.cache()` for server-side request deduplication. Authentication and database queries benefit most.

**Usage:**

```typescript
import { cache } from 'react'

export const getCurrentUser = cache(async () => {
  const session = await auth()
  if (!session?.user?.id) return null
  return await db.user.findUnique({
    where: { id: session.user.id }
  })
})
```

Within a single request, multiple calls to `getCurrentUser()` execute the query only once.


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md
================================================
---
title: Parallel Data Fetching with Component Composition
impact: CRITICAL
impactDescription: eliminates server-side waterfalls
tags: server, rsc, parallel-fetching, composition
---

## Parallel Data Fetching with Component Composition

React Server Components execute sequentially within a tree. Restructure with composition to parallelize data fetching.

**Incorrect (Sidebar waits for Page's fetch to complete):**

```tsx
export default async function Page() {
  const header = await fetchHeader()
  return (
    <div>
      <div>{header}</div>
      <Sidebar />
    </div>
  )
}

async function Sidebar() {
  const items = await fetchSidebarItems()
  return <nav>{items.map(renderItem)}</nav>
}
```

**Correct (both fetch simultaneously):**

```tsx
async function Header() {
  const data = await fetchHeader()
  return <div>{data}</div>
}

async function Sidebar() {
  const items = await fetchSidebarItems()
  return <nav>{items.map(renderItem)}</nav>
}

export default function Page() {
  return (
    <div>
      <Header />
      <Sidebar />
    </div>
  )
}
```

**Alternative with children prop:**

```tsx
async function Layout({ children }: { children: ReactNode }) {
  const header = await fetchHeader()
  return (
    <div>
      <div>{header}</div>
      {children}
    </div>
  )
}

async function Sidebar() {
  const items = await fetchSidebarItems()
  return <nav>{items.map(renderItem)}</nav>
}

export default function Page() {
  return (
    <Layout>
      <Sidebar />
    </Layout>
  )
}
```


================================================
FILE: .claude/skills/vercel-react-best-practices/rules/server-serialization.md
================================================
---
title: Minimize Serialization at RSC Boundaries
impact: HIGH
impactDescription: reduces data transfer size
tags: server, rsc, serialization, props
---

## Minimize Serialization at RSC Boundaries

The React Server/Client boundary serializes all object properties into strings and embeds them in the HTML response and subsequent RSC requests. This serialized data directly impacts page weight and load time, so **size matters a lot**. Only pass fields that the client actually uses.

**Incorrect (serializes all 50 fields):**

```tsx
async function Page() {
  const user = await fetchUser()  // 50 fields
  return <Profile user={user} />
}

'use client'
function Profile({ user }: { user: User }) {
  return <div>{user.name}</div>  // uses 1 field
}
```

**Correct (serializes only 1 field):**

```tsx
async function Page() {
  const user = await fetchUser()
  return <Profile name={user.name} />
}

'use client'
function Profile({ name }: { name: string }) {
  return <div>{name}</div>
}
```


================================================
FILE: .claude/skills/worktree/SKILL.md
================================================
---
name: worktree
description: Set up a new git worktree for parallel development. Creates the worktree, copies .env files, installs dependencies, and generates Prisma client. TRIGGER when user asks to set up a worktree, work on a branch in isolation, or needs a separate environment for a branch or PR.
user-invocable: true
args: "[name] — optional worktree name (e.g., 'AutoGPT7'). If omitted, uses next available AutoGPT<N>."
metadata:
  author: autogpt-team
  version: "3.0.0"
---

# Worktree Setup

## Create the worktree

Derive paths from the git toplevel. If a name is provided as argument, use it. Otherwise, check `git worktree list` and pick the next `AutoGPT<N>`.

```bash
ROOT=$(git rev-parse --show-toplevel)
PARENT=$(dirname "$ROOT")

# From an existing branch
git worktree add "$PARENT/<NAME>" <branch-name>

# From a new branch off dev
git worktree add -b <new-branch> "$PARENT/<NAME>" dev
```

## Copy environment files

Copy `.env` from the root worktree. Falls back to `.env.default` if `.env` doesn't exist.

```bash
ROOT=$(git rev-parse --show-toplevel)
TARGET="$(dirname "$ROOT")/<NAME>"

for envpath in autogpt_platform/backend autogpt_platform/frontend autogpt_platform; do
  if [ -f "$ROOT/$envpath/.env" ]; then
    cp "$ROOT/$envpath/.env" "$TARGET/$envpath/.env"
  elif [ -f "$ROOT/$envpath/.env.default" ]; then
    cp "$ROOT/$envpath/.env.default" "$TARGET/$envpath/.env"
  fi
done
```

## Install dependencies

```bash
TARGET="$(dirname "$(git rev-parse --show-toplevel)")/<NAME>"
cd "$TARGET/autogpt_platform/autogpt_libs" && poetry install
cd "$TARGET/autogpt_platform/backend" && poetry install && poetry run prisma generate
cd "$TARGET/autogpt_platform/frontend" && pnpm install
```

Replace `<NAME>` with the actual worktree name (e.g., `AutoGPT7`).

## Running the app (optional)

Backend uses ports: 8001, 8002, 8003, 8005, 8006, 8007, 8008. Free them first if needed:

```bash
TARGET="$(dirname "$(git rev-parse --show-toplevel)")/<NAME>"
for port in 8001 8002 8003 8005 8006 8007 8008; do
  lsof -ti :$port | xargs kill -9 2>/dev/null || true
done
cd "$TARGET/autogpt_platform/backend" && poetry run app
```

## CoPilot testing

SDK mode spawns a Claude subprocess — won't work inside Claude Code. Set `CHAT_USE_CLAUDE_AGENT_SDK=false` in `backend/.env` to use baseline mode.

## Cleanup

```bash
# Replace <NAME> with the actual worktree name (e.g., AutoGPT7)
git worktree remove "$(dirname "$(git rev-parse --show-toplevel)")/<NAME>"
```

## Alternative: Branchlet (optional)

If [branchlet](https://www.npmjs.com/package/branchlet) is installed:

```bash
branchlet create -n <name> -s <source-branch> -b <new-branch>
```


================================================
FILE: .deepsource.toml
================================================
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"


================================================
FILE: .dockerignore
================================================
# Ignore everything by default, selectively add things to context
*

# Documentation (for embeddings/search)
!docs/

# Platform - Libs
!autogpt_platform/autogpt_libs/

# Platform - Backend
!autogpt_platform/backend/

# Platform - Frontend
!autogpt_platform/frontend/

# Classic - AutoGPT
!classic/original_autogpt/autogpt/
!classic/original_autogpt/pyproject.toml
!classic/original_autogpt/poetry.lock
!classic/original_autogpt/README.md
!classic/original_autogpt/tests/

# Classic - Benchmark
!classic/benchmark/agbenchmark/
!classic/benchmark/pyproject.toml
!classic/benchmark/poetry.lock
!classic/benchmark/README.md

# Classic - Forge
!classic/forge/
!classic/forge/pyproject.toml
!classic/forge/poetry.lock
!classic/forge/README.md

# Classic - Frontend
!classic/frontend/build/web/

# Explicitly re-ignore unwanted files from whitelisted directories
# Note: These patterns MUST come after the whitelist rules to take effect

# Hidden files and directories (but keep frontend .env files needed for build)
**/.*
!autogpt_platform/frontend/.env
!autogpt_platform/frontend/.env.default
!autogpt_platform/frontend/.env.production

# Python artifacts
**/__pycache__/
**/*.pyc
**/*.pyo
**/.venv/
**/.ruff_cache/
**/.pytest_cache/
**/.coverage
**/htmlcov/

# Node artifacts
**/node_modules/
**/.next/
**/storybook-static/
**/playwright-report/
**/test-results/

# Build artifacts
**/dist/
**/build/
!autogpt_platform/frontend/src/**/build/
**/target/

# Logs and temp files
**/*.log
**/*.tmp


================================================
FILE: .gitattributes
================================================
classic/frontend/build/** linguist-generated

**/poetry.lock linguist-generated

docs/_javascript/** linguist-vendored

# Exclude VCR cassettes from stats
classic/forge/tests/vcr_cassettes/**/**.y*ml linguist-generated

* text=auto

================================================
FILE: .github/CODEOWNERS
================================================
* @Significant-Gravitas/maintainers
.github/workflows/ @Significant-Gravitas/devops
classic/forge/ @Significant-Gravitas/forge-maintainers
classic/benchmark/ @Significant-Gravitas/benchmark-maintainers
classic/frontend/ @Significant-Gravitas/frontend-maintainers
autogpt_platform/infra @Significant-Gravitas/devops
.github/CODEOWNERS @Significant-Gravitas/admins


================================================
FILE: .github/ISSUE_TEMPLATE/1.bug.yml
================================================
name: Bug report 🐛
description: Create a bug report for AutoGPT.
labels: ['status: needs triage']
body:
  - type: markdown
    attributes:
      value: |
        ### ⚠️ Before you continue
        * Check out our [backlog], [roadmap] and join our [discord] to discuss what's going on
        * If you need help, you can ask in the [discussions] section or in [#tech-support]
        * **Thoroughly search the [existing issues] before creating a new one**
        * Read our [wiki page on Contributing]
        [backlog]: https://github.com/orgs/Significant-Gravitas/projects/1
        [roadmap]: https://github.com/orgs/Significant-Gravitas/projects/2  
        [discord]: https://discord.gg/autogpt
        [discussions]: https://github.com/Significant-Gravitas/AutoGPT/discussions
        [#tech-support]: https://discord.com/channels/1092243196446249134/1092275629602394184
        [existing issues]: https://github.com/Significant-Gravitas/AutoGPT/issues?q=is%3Aissue
        [wiki page on Contributing]: https://github.com/Significant-Gravitas/AutoGPT/wiki/Contributing

  - type: checkboxes
    attributes:
      label: ⚠️ Search for existing issues first ⚠️
      description: >
        Please [search the history](https://github.com/Significant-Gravitas/AutoGPT/issues)
        to see if an issue already exists for the same problem.
      options:
        - label: I have searched the existing issues, and there is no existing issue for my problem
          required: true

  - type: markdown
    attributes:
      value: |
        Please confirm that the issue you have is described well and precise in the title above ⬆️.
        A good rule of thumb: What would you type if you were searching for the issue?
        
        For example:
        BAD - my AutoGPT keeps looping
        GOOD - After performing execute_python_file, AutoGPT goes into a loop where it keeps trying to execute the file.
        
        ⚠️ SUPER-busy repo, please help the volunteer maintainers.
        The less time we spend here, the more time we can spend building AutoGPT.
        
        Please help us help you by following these steps:
        - Search for existing issues, adding a comment when you have the same or similar issue is tidier than "new issue" and 
          newer issues will not be reviewed earlier, this is dependent on the current priorities set by our wonderful team
        - Ask on our Discord if your issue is known when you are unsure (https://discord.gg/autogpt)
        - Provide relevant info:
          - Provide commit-hash (`git rev-parse HEAD` gets it) if possible
          - If it's a pip/packages issue, mention this in the title and provide pip version, python version
          - If it's a crash, provide traceback and describe the error you got as precise as possible in the title.

  - type: dropdown
    attributes:
      label: Which Operating System are you using?
      description: >
        Please select the operating system you were using to run AutoGPT when this problem occurred.
      options:
        - Windows
        - Linux
        - MacOS
        - Docker
        - Devcontainer / Codespace
        - Windows Subsystem for Linux (WSL)
        - Other
    validations:
      required: true
      nested_fields:
        - type: text
          attributes:
            label: Specify the system
            description: Please specify the system you are working on.

  - type: dropdown
    attributes:
      label: Which version of AutoGPT are you using?
      description: |
        Please select which version of AutoGPT you were using when this issue occurred.
        If you downloaded the code from the [releases page](https://github.com/Significant-Gravitas/AutoGPT/releases/) make sure you were using the latest code. 
        **If you weren't please try with the [latest code](https://github.com/Significant-Gravitas/AutoGPT/releases/)**.
        If installed with git you can run `git branch` to see which version of AutoGPT you are running.
      options:
        - Latest Release
        - Stable (branch)
        - Master (branch)
    validations:
      required: true

  - type: dropdown
    attributes:
      label: What LLM Provider do you use?
      description: >
        If you are using AutoGPT with `SMART_LLM=gpt-3.5-turbo`, your problems may be caused by
        the [limitations](https://github.com/Significant-Gravitas/AutoGPT/issues?q=is%3Aissue+label%3A%22AI+model+limitation%22) of GPT-3.5.
      options:
        - Azure
        - Groq
        - Anthropic
        - Llamafile
        - Other (detail in issue)
    validations:
      required: true

  - type: dropdown
    attributes:
      label: Which area covers your issue best?
      description: >
        Select the area related to the issue you are reporting.
      options:
        - Installation and setup
        - Memory
        - Performance
        - Prompt
        - Commands
        - Plugins
        - AI Model Limitations
        - Challenges
        - Documentation
        - Logging
        - Agents
        - Other
    validations:
      required: true
      autolabels: true
      nested_fields:
        - type: text
          attributes:
            label: Specify the area
            description: Please specify the area you think is best related to the issue.

  - type: input
    attributes:
      label: What commit or version are you using?
      description: It is helpful for us to reproduce to know what version of the software you were using when this happened. Please run `git log -n 1 --pretty=format:"%H"` to output the full commit hash.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Describe your issue.
      description: Describe the problem you are experiencing. Try to describe only the issue and phrase it short but clear. ⚠️ Provide NO other data in this field
    validations:
      required: true

  #Following are optional file content uploads
  - type: markdown
    attributes:
      value: |
        ⚠️The following is OPTIONAL, please keep in mind that the log files may contain personal information such as credentials.⚠️
        
        "The log files are located in the folder 'logs' inside the main AutoGPT folder."

  - type: textarea
    attributes:
      label: Upload Activity Log Content
      description: |
        Upload the activity log content, this can help us understand the issue better. 
        To do this, go to the folder logs in your main AutoGPT folder, open activity.log and copy/paste the contents to this field. 
        ⚠️ The activity log may contain personal data given to AutoGPT by you in prompt or input as well as 
        any personal information that AutoGPT collected out of files during last run. Do not add the activity log if you are not comfortable with sharing it. ⚠️
    validations:
      required: false

  - type: textarea
    attributes:
      label: Upload Error Log Content
      description: |
        Upload the error log content, this will help us understand the issue better. 
        To do this, go to the folder logs in your main AutoGPT folder, open error.log and copy/paste the contents to this field. 
        ⚠️ The error log may contain personal data given to AutoGPT by you in prompt or input as well as 
        any personal information that AutoGPT collected out of files during last run. Do not add the activity log if you are not comfortable with sharing it. ⚠️
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/2.feature.yml
================================================
name: Feature request 🚀
description: Suggest a new idea for AutoGPT!
labels: ['status: needs triage']
body:
  - type: markdown
    attributes:
      value: |
        First, check out our [wiki page on Contributing](https://github.com/Significant-Gravitas/AutoGPT/wiki/Contributing)
        Please provide a searchable summary of the issue in the title above ⬆️.
  - type: checkboxes
    attributes:
      label: Duplicates
      description: Please [search the history](https://github.com/Significant-Gravitas/AutoGPT/issues) to see if an issue already exists for the same problem.
      options:
        - label: I have searched the existing issues
          required: true
  - type: textarea
    attributes:
      label: Summary 💡
      description: Describe how it should work.
  - type: textarea
    attributes:
      label: Examples 🌈
      description: Provide a link to other implementations, or screenshots of the expected behavior.
  - type: textarea
    attributes:
      label: Motivation 🔦
      description: What are you trying to accomplish? How has the lack of this feature affected you? Providing context helps us come up with a solution that is more useful in the real world.


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### Why / What / How

<!-- Why: Why does this PR exist? What problem does it solve, or what's broken/missing without it? -->
<!-- What: What does this PR change? Summarize the changes at a high level. -->
<!-- How: How does it work? Describe the approach, key implementation details, or architecture decisions. -->

### Changes 🏗️

<!-- List the key changes. Keep it higher level than the diff but specific enough to highlight what's new/modified. -->

### 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.default` 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>


================================================
FILE: .github/copilot-instructions.md
================================================
# GitHub Copilot Instructions for AutoGPT

This file provides comprehensive onboarding information for GitHub Copilot coding agent to work efficiently with the AutoGPT repository.

## Repository Overview

**AutoGPT** is a powerful platform for creating, deploying, and managing continuous AI agents that automate complex workflows. This is a large monorepo (~150MB) containing multiple components:

- **AutoGPT Platform** (`autogpt_platform/`) - Main focus: Modern AI agent platform (Polyform Shield License)
- **Classic AutoGPT** (`classic/`) - Legacy agent system (MIT License)
- **Documentation** (`docs/`) - MkDocs-based documentation site
- **Infrastructure** - Docker configurations, CI/CD, and development tools

**Primary Languages & Frameworks:**

- **Backend**: Python 3.10-3.13, FastAPI, Prisma ORM, PostgreSQL, RabbitMQ
- **Frontend**: TypeScript, Next.js 15, React, Tailwind CSS, Radix UI
- **Development**: Docker, Poetry, pnpm, Playwright, Storybook

## Build and Validation Instructions

### Essential Setup Commands

**Always run these commands in the correct directory and in this order:**

1. **Initial Setup** (required once):

   ```bash
   # Clone and enter repository
   git clone <repo> && cd AutoGPT

   # Start all services (database, redis, rabbitmq, clamav)
   cd autogpt_platform && docker compose --profile local up deps --build --detach
   ```

2. **Backend Setup** (always run before backend development):

   ```bash
   cd autogpt_platform/backend
   poetry install                    # Install dependencies
   poetry run prisma migrate dev     # Run database migrations
   poetry run prisma generate        # Generate Prisma client
   ```

3. **Frontend Setup** (always run before frontend development):
   ```bash
   cd autogpt_platform/frontend
   pnpm install                      # Install dependencies
   ```

### Runtime Requirements

**Critical:** Always ensure Docker services are running before starting development:

```bash
cd autogpt_platform && docker compose --profile local up deps --build --detach
```

**Python Version:** Use Python 3.11 (required; managed by Poetry via pyproject.toml)
**Node.js Version:** Use Node.js 21+ with pnpm package manager

### Development Commands

**Backend Development:**

```bash
cd autogpt_platform/backend
poetry run serve                     # Start development server (port 8000)
poetry run test                      # Run all tests (requires ~5 minutes)
poetry run pytest path/to/test.py    # Run specific test
poetry run format                    # Format code (Black + isort) - always run first
poetry run lint                      # Lint code (ruff) - run after format
```

**Frontend Development:**

```bash
cd autogpt_platform/frontend
pnpm dev                            # Start development server (port 3000) - use for active development
pnpm build                          # Build for production (only needed for E2E tests or deployment)
pnpm test                           # Run Playwright E2E tests (requires build first)
pnpm test-ui                        # Run tests with UI
pnpm format                         # Format and lint code
pnpm storybook                      # Start component development server
```

### Testing Strategy

**Backend Tests:**

- **Block Tests**: `poetry run pytest backend/blocks/test/test_block.py -xvs` (validates all blocks)
- **Specific Block**: `poetry run pytest 'backend/blocks/test/test_block.py::test_available_blocks[BlockName]' -xvs`
- **Snapshot Tests**: Use `--snapshot-update` when output changes, always review with `git diff`

**Frontend Tests:**

- **E2E Tests**: Always run `pnpm dev` before `pnpm test` (Playwright requires running instance)
- **Component Tests**: Use Storybook for isolated component development

### Critical Validation Steps

**Before committing changes:**

1. Run `poetry run format` (backend) and `pnpm format` (frontend)
2. Ensure all tests pass in modified areas
3. Verify Docker services are still running
4. Check that database migrations apply cleanly

**Common Issues &
Download .txt
Showing preview only (336K chars total). Download the full file or copy to clipboard to get everything.
gitextract_ps7p94mh/

├── .branchlet.json
├── .claude/
│   └── skills/
│       ├── pr-address/
│       │   └── SKILL.md
│       ├── pr-review/
│       │   └── SKILL.md
│       ├── pr-test/
│       │   └── SKILL.md
│       ├── vercel-react-best-practices/
│       │   ├── AGENTS.md
│       │   ├── SKILL.md
│       │   └── rules/
│       │       ├── advanced-event-handler-refs.md
│       │       ├── advanced-use-latest.md
│       │       ├── async-api-routes.md
│       │       ├── async-defer-await.md
│       │       ├── async-dependencies.md
│       │       ├── async-parallel.md
│       │       ├── async-suspense-boundaries.md
│       │       ├── bundle-barrel-imports.md
│       │       ├── bundle-conditional.md
│       │       ├── bundle-defer-third-party.md
│       │       ├── bundle-dynamic-imports.md
│       │       ├── bundle-preload.md
│       │       ├── client-event-listeners.md
│       │       ├── client-swr-dedup.md
│       │       ├── js-batch-dom-css.md
│       │       ├── js-cache-function-results.md
│       │       ├── js-cache-property-access.md
│       │       ├── js-cache-storage.md
│       │       ├── js-combine-iterations.md
│       │       ├── js-early-exit.md
│       │       ├── js-hoist-regexp.md
│       │       ├── js-index-maps.md
│       │       ├── js-length-check-first.md
│       │       ├── js-min-max-loop.md
│       │       ├── js-set-map-lookups.md
│       │       ├── js-tosorted-immutable.md
│       │       ├── rendering-activity.md
│       │       ├── rendering-animate-svg-wrapper.md
│       │       ├── rendering-conditional-render.md
│       │       ├── rendering-content-visibility.md
│       │       ├── rendering-hoist-jsx.md
│       │       ├── rendering-hydration-no-flicker.md
│       │       ├── rendering-svg-precision.md
│       │       ├── rerender-defer-reads.md
│       │       ├── rerender-dependencies.md
│       │       ├── rerender-derived-state.md
│       │       ├── rerender-functional-setstate.md
│       │       ├── rerender-lazy-state-init.md
│       │       ├── rerender-memo.md
│       │       ├── rerender-transitions.md
│       │       ├── server-after-nonblocking.md
│       │       ├── server-cache-lru.md
│       │       ├── server-cache-react.md
│       │       ├── server-parallel-fetching.md
│       │       └── server-serialization.md
│       └── worktree/
│           └── SKILL.md
├── .deepsource.toml
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1.bug.yml
│   │   └── 2.feature.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── copilot-instructions.md
│   ├── dependabot.yml
│   ├── labeler.yml
│   ├── scripts/
│   │   └── detect_overlaps.py
│   └── workflows/
│       ├── classic-autogpt-ci.yml
│       ├── classic-autogpt-docker-cache-clean.yml
│       ├── classic-autogpt-docker-ci.yml
│       ├── classic-autogpt-docker-release.yml
│       ├── classic-autogpts-ci.yml
│       ├── classic-benchmark-ci.yml
│       ├── classic-benchmark_publish_package.yml
│       ├── classic-forge-ci.yml
│       ├── classic-frontend-ci.yml
│       ├── classic-python-checks.yml
│       ├── claude-ci-failure-auto-fix.yml
│       ├── claude-dependabot.yml
│       ├── claude.yml
│       ├── codeql.yml
│       ├── copilot-setup-steps.yml
│       ├── docs-block-sync.yml
│       ├── docs-claude-review.yml
│       ├── docs-enhance.yml
│       ├── platform-autogpt-deploy-dev.yaml
│       ├── platform-autogpt-deploy-prod.yml
│       ├── platform-backend-ci.yml
│       ├── platform-dev-deploy-event-dispatcher.yml
│       ├── platform-frontend-ci.yml
│       ├── platform-fullstack-ci.yml
│       ├── pr-overlap-check.yml
│       ├── repo-close-stale-issues.yml
│       ├── repo-pr-enforce-base-branch.yml
│       ├── repo-pr-label.yml
│       ├── repo-stats.yml
│       ├── repo-workflow-checker.yml
│       └── scripts/
│           ├── check_actions_status.py
│           ├── docker-ci-fix-compose-build-cache.py
│           ├── docker-ci-summary.sh
│           ├── docker-release-summary.sh
│           └── get_package_version_from_lockfile.py
├── .gitignore
├── .gitmodules
├── .nvmrc
├── .pr_agent.toml
├── .pre-commit-config.yaml
├── AGENTS.md
├── CITATION.cff
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── assets/
│   └── gpt_dark_RGB.icns
├── autogpt_platform/
│   ├── .gitignore
│   ├── CLAUDE.md
│   ├── Contributor License Agreement (CLA).md
│   ├── LICENSE.md
│   ├── Makefile
│   ├── README.md
│   ├── __init__.py
│   ├── analytics/
│   │   └── queries/
│   │       ├── auth_activities.sql
│   │       ├── graph_execution.sql
│   │       ├── node_block_execution.sql
│   │       ├── retention_agent.sql
│   │       ├── retention_execution_daily.sql
│   │       ├── retention_execution_weekly.sql
│   │       ├── retention_login_daily.sql
│   │       ├── retention_login_onboarded_weekly.sql
│   │       ├── retention_login_weekly.sql
│   │       ├── user_block_spending.sql
│   │       ├── user_onboarding.sql
│   │       ├── user_onboarding_funnel.sql
│   │       ├── user_onboarding_integration.sql
│   │       └── users_activities.sql
│   ├── autogpt_libs/
│   │   ├── README.md
│   │   ├── autogpt_libs/
│   │   │   ├── __init__.py
│   │   │   ├── api_key/
│   │   │   │   ├── keysmith.py
│   │   │   │   └── test_keysmith.py
│   │   │   ├── auth/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── config.py
│   │   │   │   ├── config_test.py
│   │   │   │   ├── dependencies.py
│   │   │   │   ├── dependencies_test.py
│   │   │   │   ├── helpers.py
│   │   │   │   ├── helpers_test.py
│   │   │   │   ├── jwt_utils.py
│   │   │   │   ├── jwt_utils_test.py
│   │   │   │   └── models.py
│   │   │   ├── logging/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── config.py
│   │   │   │   ├── filters.py
│   │   │   │   ├── formatters.py
│   │   │   │   ├── handlers.py
│   │   │   │   ├── test_utils.py
│   │   │   │   └── utils.py
│   │   │   ├── rate_limit/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── config.py
│   │   │   │   ├── limiter.py
│   │   │   │   └── middleware.py
│   │   │   ├── supabase_integration_credentials_store/
│   │   │   │   └── types.py
│   │   │   └── utils/
│   │   │       ├── __init__.py
│   │   │       └── synchronize.py
│   │   └── pyproject.toml
│   ├── backend/
│   │   ├── .dockerignore
│   │   ├── .gitignore
│   │   ├── CLAUDE.md
│   │   ├── Dockerfile
│   │   ├── README.advanced.md
│   │   ├── README.md
│   │   ├── TESTING.md
│   │   ├── agents/
│   │   │   ├── StoreAgent_rows.csv
│   │   │   ├── agent_00fdd42c-a14c-4d19-a567-65374ea0e87f.json
│   │   │   ├── agent_31daf49d-31d3-476b-aa4c-099abc59b458.json
│   │   │   ├── agent_415b7352-0dc6-4214-9d87-0ad3751b711d.json
│   │   │   ├── agent_516d813b-d1bc-470f-add7-c63a4b2c2bad.json
│   │   │   ├── agent_55d40473-0f31-4ada-9e40-d3a7139fcbd4.json
│   │   │   ├── agent_6e16e65a-ad34-4108-b4fd-4a23fced5ea2.json
│   │   │   ├── agent_a03b0d8c-4751-43d6-a54e-c3b7856ba4e3.json
│   │   │   ├── agent_a548e507-09a7-4b30-909c-f63fcda10fff.json
│   │   │   ├── agent_b6f6f0d3-49f4-4e3b-8155-ffe9141b32c0.json
│   │   │   ├── agent_b8ceb480-a7a2-4c90-8513-181a49f7071f.json
│   │   │   ├── agent_c775f60d-b99f-418b-8fe0-53172258c3ce.json
│   │   │   ├── agent_d85882b8-633f-44ce-a315-c20a8c123d19.json
│   │   │   ├── agent_e437cc95-e671-489d-b915-76561fba8c7f.json
│   │   │   ├── agent_e7bb29a1-23c7-4fee-aa3b-5426174b8c52.json
│   │   │   ├── agent_eafa21d3-bf14-4f63-a97f-a5ee41df83b3.json
│   │   │   ├── agent_f2cc74bb-f43f-4395-9c35-ecb30b5b4fc9.json
│   │   │   └── agent_fc2c9976-0962-4625-a27b-d316573a9e7f.json
│   │   ├── backend/
│   │   │   ├── TEST_DATA_README.md
│   │   │   ├── __init__.py
│   │   │   ├── api/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── conn_manager.py
│   │   │   │   ├── conn_manager_test.py
│   │   │   │   ├── external/
│   │   │   │   │   ├── fastapi_app.py
│   │   │   │   │   ├── middleware.py
│   │   │   │   │   └── v1/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── integrations.py
│   │   │   │   │       ├── routes.py
│   │   │   │   │       └── tools.py
│   │   │   │   ├── features/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── admin/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── credit_admin_routes.py
│   │   │   │   │   │   ├── credit_admin_routes_test.py
│   │   │   │   │   │   ├── execution_analytics_routes.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   ├── store_admin_routes.py
│   │   │   │   │   │   └── store_admin_routes_test.py
│   │   │   │   │   ├── analytics.py
│   │   │   │   │   ├── analytics_test.py
│   │   │   │   │   ├── builder/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── db.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   └── routes.py
│   │   │   │   │   ├── chat/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   └── routes_test.py
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   └── review/
│   │   │   │   │   │       ├── __init__.py
│   │   │   │   │   │       ├── model.py
│   │   │   │   │   │       ├── review_routes_test.py
│   │   │   │   │   │       └── routes.py
│   │   │   │   │   ├── integrations/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── conftest.py
│   │   │   │   │   │   ├── models.py
│   │   │   │   │   │   ├── router.py
│   │   │   │   │   │   └── router_test.py
│   │   │   │   │   ├── library/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── _add_to_library.py
│   │   │   │   │   │   ├── _add_to_library_test.py
│   │   │   │   │   │   ├── db.py
│   │   │   │   │   │   ├── db_test.py
│   │   │   │   │   │   ├── exceptions.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   ├── model_test.py
│   │   │   │   │   │   ├── routes/
│   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   ├── agents.py
│   │   │   │   │   │   │   ├── folders.py
│   │   │   │   │   │   │   └── presets.py
│   │   │   │   │   │   └── routes_test.py
│   │   │   │   │   ├── mcp/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   └── test_routes.py
│   │   │   │   │   ├── oauth.py
│   │   │   │   │   ├── oauth_test.py
│   │   │   │   │   ├── otto/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── models.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   ├── routes_test.py
│   │   │   │   │   │   └── service.py
│   │   │   │   │   ├── postmark/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── models.py
│   │   │   │   │   │   └── postmark.py
│   │   │   │   │   ├── store/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── cache.py
│   │   │   │   │   │   ├── content_handlers.py
│   │   │   │   │   │   ├── content_handlers_integration_test.py
│   │   │   │   │   │   ├── content_handlers_test.py
│   │   │   │   │   │   ├── db.py
│   │   │   │   │   │   ├── db_test.py
│   │   │   │   │   │   ├── embeddings.py
│   │   │   │   │   │   ├── embeddings_e2e_test.py
│   │   │   │   │   │   ├── embeddings_schema_test.py
│   │   │   │   │   │   ├── embeddings_test.py
│   │   │   │   │   │   ├── exceptions.py
│   │   │   │   │   │   ├── hybrid_search.py
│   │   │   │   │   │   ├── hybrid_search_test.py
│   │   │   │   │   │   ├── image_gen.py
│   │   │   │   │   │   ├── media.py
│   │   │   │   │   │   ├── media_test.py
│   │   │   │   │   │   ├── model.py
│   │   │   │   │   │   ├── routes.py
│   │   │   │   │   │   ├── routes_test.py
│   │   │   │   │   │   ├── semantic_search_test.py
│   │   │   │   │   │   ├── test_cache_delete.py
│   │   │   │   │   │   ├── text_utils.py
│   │   │   │   │   │   └── text_utils_test.py
│   │   │   │   │   ├── v1.py
│   │   │   │   │   ├── v1_test.py
│   │   │   │   │   └── workspace/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── routes.py
│   │   │   │   │       └── routes_test.py
│   │   │   │   ├── middleware/
│   │   │   │   │   ├── security.py
│   │   │   │   │   └── security_test.py
│   │   │   │   ├── model.py
│   │   │   │   ├── rest_api.py
│   │   │   │   ├── test_helpers.py
│   │   │   │   ├── utils/
│   │   │   │   │   ├── api_key_auth.py
│   │   │   │   │   ├── api_key_auth_test.py
│   │   │   │   │   ├── cors.py
│   │   │   │   │   ├── cors_test.py
│   │   │   │   │   └── openapi.py
│   │   │   │   ├── ws_api.py
│   │   │   │   └── ws_api_test.py
│   │   │   ├── app.py
│   │   │   ├── blocks/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── _base.py
│   │   │   │   ├── _utils.py
│   │   │   │   ├── agent.py
│   │   │   │   ├── agent_mail/
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── attachments.py
│   │   │   │   │   ├── drafts.py
│   │   │   │   │   ├── inbox.py
│   │   │   │   │   ├── lists.py
│   │   │   │   │   ├── messages.py
│   │   │   │   │   ├── pods.py
│   │   │   │   │   └── threads.py
│   │   │   │   ├── ai_condition.py
│   │   │   │   ├── ai_image_customizer.py
│   │   │   │   ├── ai_image_generator_block.py
│   │   │   │   ├── ai_music_generator.py
│   │   │   │   ├── ai_shortform_video_block.py
│   │   │   │   ├── airtable/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _api_test.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _oauth.py
│   │   │   │   │   ├── _webhook.py
│   │   │   │   │   ├── bases.py
│   │   │   │   │   ├── records.py
│   │   │   │   │   ├── schema.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── apollo/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── models.py
│   │   │   │   │   ├── organization.py
│   │   │   │   │   ├── people.py
│   │   │   │   │   └── person.py
│   │   │   │   ├── autopilot.py
│   │   │   │   ├── autopilot_permissions_test.py
│   │   │   │   ├── ayrshare/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _util.py
│   │   │   │   │   ├── post_to_bluesky.py
│   │   │   │   │   ├── post_to_facebook.py
│   │   │   │   │   ├── post_to_gmb.py
│   │   │   │   │   ├── post_to_instagram.py
│   │   │   │   │   ├── post_to_linkedin.py
│   │   │   │   │   ├── post_to_pinterest.py
│   │   │   │   │   ├── post_to_reddit.py
│   │   │   │   │   ├── post_to_snapchat.py
│   │   │   │   │   ├── post_to_telegram.py
│   │   │   │   │   ├── post_to_threads.py
│   │   │   │   │   ├── post_to_tiktok.py
│   │   │   │   │   ├── post_to_x.py
│   │   │   │   │   └── post_to_youtube.py
│   │   │   │   ├── baas/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   └── bots.py
│   │   │   │   ├── bannerbear/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   └── text_overlay.py
│   │   │   │   ├── basic.py
│   │   │   │   ├── block.py
│   │   │   │   ├── branching.py
│   │   │   │   ├── claude_code.py
│   │   │   │   ├── code_executor.py
│   │   │   │   ├── code_extraction_block.py
│   │   │   │   ├── codex.py
│   │   │   │   ├── compass/
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── count_words_and_char_block.py
│   │   │   │   ├── data_manipulation.py
│   │   │   │   ├── dataforseo/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── keyword_suggestions.py
│   │   │   │   │   └── related_keywords.py
│   │   │   │   ├── decoder_block.py
│   │   │   │   ├── discord/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── bot_blocks.py
│   │   │   │   │   └── oauth_blocks.py
│   │   │   │   ├── elevenlabs/
│   │   │   │   │   └── _auth.py
│   │   │   │   ├── email_block.py
│   │   │   │   ├── encoder_block.py
│   │   │   │   ├── enrichlayer/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   └── linkedin.py
│   │   │   │   ├── exa/
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _test.py
│   │   │   │   │   ├── _webhook.py
│   │   │   │   │   ├── answers.py
│   │   │   │   │   ├── code_context.py
│   │   │   │   │   ├── contents.py
│   │   │   │   │   ├── helpers.py
│   │   │   │   │   ├── research.py
│   │   │   │   │   ├── search.py
│   │   │   │   │   ├── similar.py
│   │   │   │   │   ├── webhook_blocks.py
│   │   │   │   │   ├── websets.py
│   │   │   │   │   ├── websets_enrichment.py
│   │   │   │   │   ├── websets_import_export.py
│   │   │   │   │   ├── websets_items.py
│   │   │   │   │   ├── websets_monitor.py
│   │   │   │   │   ├── websets_polling.py
│   │   │   │   │   └── websets_search.py
│   │   │   │   ├── fal/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   └── ai_video_generator.py
│   │   │   │   ├── firecrawl/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _format_utils.py
│   │   │   │   │   ├── crawl.py
│   │   │   │   │   ├── extract.py
│   │   │   │   │   ├── map.py
│   │   │   │   │   ├── scrape.py
│   │   │   │   │   └── search.py
│   │   │   │   ├── flux_kontext.py
│   │   │   │   ├── generic_webhook/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _webhook.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── github/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _utils.py
│   │   │   │   │   ├── checks.py
│   │   │   │   │   ├── ci.py
│   │   │   │   │   ├── commits.py
│   │   │   │   │   ├── example_payloads/
│   │   │   │   │   │   ├── discussion.created.json
│   │   │   │   │   │   ├── issues.opened.json
│   │   │   │   │   │   ├── pull_request.synchronize.json
│   │   │   │   │   │   ├── release.published.json
│   │   │   │   │   │   └── star.created.json
│   │   │   │   │   ├── issues.py
│   │   │   │   │   ├── pull_requests.py
│   │   │   │   │   ├── repo.py
│   │   │   │   │   ├── repo_branches.py
│   │   │   │   │   ├── repo_files.py
│   │   │   │   │   ├── reviews.py
│   │   │   │   │   ├── statuses.py
│   │   │   │   │   ├── test_github_blocks.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── google/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _drive.py
│   │   │   │   │   ├── calendar.py
│   │   │   │   │   ├── docs.py
│   │   │   │   │   ├── gmail.py
│   │   │   │   │   └── sheets.py
│   │   │   │   ├── google_maps.py
│   │   │   │   ├── helpers/
│   │   │   │   │   ├── http.py
│   │   │   │   │   └── review.py
│   │   │   │   ├── http.py
│   │   │   │   ├── hubspot/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── company.py
│   │   │   │   │   ├── contact.py
│   │   │   │   │   └── engagement.py
│   │   │   │   ├── human_in_the_loop.py
│   │   │   │   ├── ideogram.py
│   │   │   │   ├── io.py
│   │   │   │   ├── iteration.py
│   │   │   │   ├── jina/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── chunking.py
│   │   │   │   │   ├── embeddings.py
│   │   │   │   │   ├── fact_checker.py
│   │   │   │   │   └── search.py
│   │   │   │   ├── linear/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _oauth.py
│   │   │   │   │   ├── comment.py
│   │   │   │   │   ├── issues.py
│   │   │   │   │   ├── models.py
│   │   │   │   │   └── projects.py
│   │   │   │   ├── llm.py
│   │   │   │   ├── maths.py
│   │   │   │   ├── mcp/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── block.py
│   │   │   │   │   ├── client.py
│   │   │   │   │   ├── helpers.py
│   │   │   │   │   ├── oauth.py
│   │   │   │   │   ├── test_e2e.py
│   │   │   │   │   ├── test_helpers.py
│   │   │   │   │   ├── test_integration.py
│   │   │   │   │   ├── test_mcp.py
│   │   │   │   │   ├── test_oauth.py
│   │   │   │   │   └── test_server.py
│   │   │   │   ├── medium.py
│   │   │   │   ├── mem0.py
│   │   │   │   ├── notion/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── create_page.py
│   │   │   │   │   ├── read_database.py
│   │   │   │   │   ├── read_page.py
│   │   │   │   │   ├── read_page_markdown.py
│   │   │   │   │   └── search.py
│   │   │   │   ├── nvidia/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   └── deepfake.py
│   │   │   │   ├── orchestrator.py
│   │   │   │   ├── perplexity.py
│   │   │   │   ├── persistence.py
│   │   │   │   ├── pinecone.py
│   │   │   │   ├── reddit.py
│   │   │   │   ├── replicate/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _helper.py
│   │   │   │   │   ├── flux_advanced.py
│   │   │   │   │   └── replicate_block.py
│   │   │   │   ├── rss.py
│   │   │   │   ├── sampling.py
│   │   │   │   ├── screenshotone.py
│   │   │   │   ├── search.py
│   │   │   │   ├── slant3d/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   ├── filament.py
│   │   │   │   │   ├── order.py
│   │   │   │   │   ├── slicing.py
│   │   │   │   │   └── webhook.py
│   │   │   │   ├── smartlead/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── campaign.py
│   │   │   │   │   └── models.py
│   │   │   │   ├── spreadsheet.py
│   │   │   │   ├── stagehand/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   └── blocks.py
│   │   │   │   ├── system/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── library_operations.py
│   │   │   │   │   └── store_operations.py
│   │   │   │   ├── talking_head.py
│   │   │   │   ├── telegram/
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── blocks.py
│   │   │   │   │   └── triggers.py
│   │   │   │   ├── test/
│   │   │   │   │   ├── test_autopilot.py
│   │   │   │   │   ├── test_block.py
│   │   │   │   │   ├── test_blocks_dos_vulnerability.py
│   │   │   │   │   ├── test_http.py
│   │   │   │   │   ├── test_llm.py
│   │   │   │   │   ├── test_orchestrator.py
│   │   │   │   │   ├── test_orchestrator_dict.py
│   │   │   │   │   ├── test_orchestrator_dynamic_fields.py
│   │   │   │   │   ├── test_orchestrator_responses_api.py
│   │   │   │   │   ├── test_perplexity.py
│   │   │   │   │   ├── test_store_operations.py
│   │   │   │   │   ├── test_table_input.py
│   │   │   │   │   └── test_text_encoder.py
│   │   │   │   ├── text.py
│   │   │   │   ├── text_to_speech_block.py
│   │   │   │   ├── time_blocks.py
│   │   │   │   ├── todoist/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _types.py
│   │   │   │   │   ├── comments.py
│   │   │   │   │   ├── labels.py
│   │   │   │   │   ├── projects.py
│   │   │   │   │   ├── sections.py
│   │   │   │   │   └── tasks.py
│   │   │   │   ├── twitter/
│   │   │   │   │   ├── _auth.py
│   │   │   │   │   ├── _builders.py
│   │   │   │   │   ├── _mappers.py
│   │   │   │   │   ├── _serializer.py
│   │   │   │   │   ├── _types.py
│   │   │   │   │   ├── direct_message/
│   │   │   │   │   │   ├── direct_message_lookup.py
│   │   │   │   │   │   └── manage_direct_message.py
│   │   │   │   │   ├── lists/
│   │   │   │   │   │   ├── list_follows.py
│   │   │   │   │   │   ├── list_lookup.py
│   │   │   │   │   │   ├── list_members.py
│   │   │   │   │   │   ├── list_tweets_lookup.py
│   │   │   │   │   │   ├── manage_lists.py
│   │   │   │   │   │   └── pinned_lists.py
│   │   │   │   │   ├── spaces/
│   │   │   │   │   │   ├── search_spaces.py
│   │   │   │   │   │   └── spaces_lookup.py
│   │   │   │   │   ├── tweepy_exceptions.py
│   │   │   │   │   ├── tweets/
│   │   │   │   │   │   ├── bookmark.py
│   │   │   │   │   │   ├── hide.py
│   │   │   │   │   │   ├── like.py
│   │   │   │   │   │   ├── manage.py
│   │   │   │   │   │   ├── quote.py
│   │   │   │   │   │   ├── retweet.py
│   │   │   │   │   │   ├── timeline.py
│   │   │   │   │   │   └── tweet_lookup.py
│   │   │   │   │   └── users/
│   │   │   │   │       ├── blocks.py
│   │   │   │   │       ├── follows.py
│   │   │   │   │       ├── mutes.py
│   │   │   │   │       └── user_lookup.py
│   │   │   │   ├── video/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _utils.py
│   │   │   │   │   ├── add_audio.py
│   │   │   │   │   ├── clip.py
│   │   │   │   │   ├── concat.py
│   │   │   │   │   ├── download.py
│   │   │   │   │   ├── duration.py
│   │   │   │   │   ├── loop.py
│   │   │   │   │   ├── narration.py
│   │   │   │   │   └── text_overlay.py
│   │   │   │   ├── wolfram/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   └── llm_api.py
│   │   │   │   ├── wordpress/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _api.py
│   │   │   │   │   ├── _config.py
│   │   │   │   │   ├── _oauth.py
│   │   │   │   │   └── blog.py
│   │   │   │   ├── xml_parser.py
│   │   │   │   ├── youtube.py
│   │   │   │   └── zerobounce/
│   │   │   │       ├── _api.py
│   │   │   │       ├── _auth.py
│   │   │   │       └── validate_emails.py
│   │   │   ├── check_db.py
│   │   │   ├── check_store_data.py
│   │   │   ├── cli/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── generate_openapi_json.py
│   │   │   │   └── oauth_tool.py
│   │   │   ├── cli.py
│   │   │   ├── conftest.py
│   │   │   ├── copilot/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── baseline/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── service.py
│   │   │   │   │   └── service_test.py
│   │   │   │   ├── config.py
│   │   │   │   ├── config_test.py
│   │   │   │   ├── constants.py
│   │   │   │   ├── context.py
│   │   │   │   ├── context_test.py
│   │   │   │   ├── db.py
│   │   │   │   ├── executor/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── __main__.py
│   │   │   │   │   ├── manager.py
│   │   │   │   │   ├── processor.py
│   │   │   │   │   └── utils.py
│   │   │   │   ├── integration_creds.py
│   │   │   │   ├── integration_creds_test.py
│   │   │   │   ├── model.py
│   │   │   │   ├── model_test.py
│   │   │   │   ├── optimize_blocks.py
│   │   │   │   ├── optimize_blocks_test.py
│   │   │   │   ├── permissions.py
│   │   │   │   ├── permissions_test.py
│   │   │   │   ├── prompting.py
│   │   │   │   ├── providers.py
│   │   │   │   ├── rate_limit.py
│   │   │   │   ├── rate_limit_test.py
│   │   │   │   ├── response_model.py
│   │   │   │   ├── sdk/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── agent_generation_guide.md
│   │   │   │   │   ├── collect.py
│   │   │   │   │   ├── collect_test.py
│   │   │   │   │   ├── compaction.py
│   │   │   │   │   ├── compaction_test.py
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   ├── dummy.py
│   │   │   │   │   ├── e2b_file_tools.py
│   │   │   │   │   ├── e2b_file_tools_test.py
│   │   │   │   │   ├── e2e_compaction_test.py
│   │   │   │   │   ├── file_ref.py
│   │   │   │   │   ├── file_ref_integration_test.py
│   │   │   │   │   ├── file_ref_test.py
│   │   │   │   │   ├── mcp_tool_guide.md
│   │   │   │   │   ├── otel_setup_test.py
│   │   │   │   │   ├── prompt_too_long_test.py
│   │   │   │   │   ├── query_builder_test.py
│   │   │   │   │   ├── response_adapter.py
│   │   │   │   │   ├── response_adapter_test.py
│   │   │   │   │   ├── retry_scenarios_test.py
│   │   │   │   │   ├── sdk_compat_test.py
│   │   │   │   │   ├── security_hooks.py
│   │   │   │   │   ├── security_hooks_test.py
│   │   │   │   │   ├── service.py
│   │   │   │   │   ├── service_helpers_test.py
│   │   │   │   │   ├── service_test.py
│   │   │   │   │   ├── subscription.py
│   │   │   │   │   ├── test_circuit_breaker.py
│   │   │   │   │   ├── tool_adapter.py
│   │   │   │   │   ├── tool_adapter_test.py
│   │   │   │   │   ├── transcript.py
│   │   │   │   │   ├── transcript_builder.py
│   │   │   │   │   └── transcript_test.py
│   │   │   │   ├── service.py
│   │   │   │   ├── service_test.py
│   │   │   │   ├── stream_registry.py
│   │   │   │   ├── test_copilot_e2e.py
│   │   │   │   ├── token_tracking.py
│   │   │   │   ├── token_tracking_test.py
│   │   │   │   ├── tools/
│   │   │   │   │   ├── IDEAS.md
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── _test_data.py
│   │   │   │   │   ├── add_understanding.py
│   │   │   │   │   ├── agent_browser.py
│   │   │   │   │   ├── agent_browser_integration_test.py
│   │   │   │   │   ├── agent_browser_test.py
│   │   │   │   │   ├── agent_generator/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── blocks.py
│   │   │   │   │   │   ├── core.py
│   │   │   │   │   │   ├── errors.py
│   │   │   │   │   │   ├── fixer.py
│   │   │   │   │   │   ├── fixer_test.py
│   │   │   │   │   │   ├── helpers.py
│   │   │   │   │   │   ├── pipeline.py
│   │   │   │   │   │   ├── validation.py
│   │   │   │   │   │   ├── validator.py
│   │   │   │   │   │   └── validator_test.py
│   │   │   │   │   ├── agent_output.py
│   │   │   │   │   ├── agent_search.py
│   │   │   │   │   ├── agent_search_test.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   ├── base_test.py
│   │   │   │   │   ├── bash_exec.py
│   │   │   │   │   ├── bash_exec_test.py
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   ├── connect_integration.py
│   │   │   │   │   ├── connect_integration_test.py
│   │   │   │   │   ├── continue_run_block.py
│   │   │   │   │   ├── continue_run_block_test.py
│   │   │   │   │   ├── create_agent.py
│   │   │   │   │   ├── create_agent_test.py
│   │   │   │   │   ├── customize_agent.py
│   │   │   │   │   ├── customize_agent_test.py
│   │   │   │   │   ├── e2b_sandbox.py
│   │   │   │   │   ├── e2b_sandbox_test.py
│   │   │   │   │   ├── edit_agent.py
│   │   │   │   │   ├── execution_utils.py
│   │   │   │   │   ├── feature_requests.py
│   │   │   │   │   ├── feature_requests_test.py
│   │   │   │   │   ├── find_agent.py
│   │   │   │   │   ├── find_block.py
│   │   │   │   │   ├── find_block_test.py
│   │   │   │   │   ├── find_library_agent.py
│   │   │   │   │   ├── fix_agent.py
│   │   │   │   │   ├── fix_agent_test.py
│   │   │   │   │   ├── get_agent_building_guide.py
│   │   │   │   │   ├── get_doc_page.py
│   │   │   │   │   ├── get_mcp_guide.py
│   │   │   │   │   ├── helpers.py
│   │   │   │   │   ├── helpers_test.py
│   │   │   │   │   ├── manage_folders.py
│   │   │   │   │   ├── manage_folders_test.py
│   │   │   │   │   ├── models.py
│   │   │   │   │   ├── run_agent.py
│   │   │   │   │   ├── run_agent_test.py
│   │   │   │   │   ├── run_block.py
│   │   │   │   │   ├── run_block_test.py
│   │   │   │   │   ├── run_mcp_tool.py
│   │   │   │   │   ├── sandbox.py
│   │   │   │   │   ├── search_docs.py
│   │   │   │   │   ├── test_dry_run.py
│   │   │   │   │   ├── test_run_block_details.py
│   │   │   │   │   ├── test_run_mcp_tool.py
│   │   │   │   │   ├── tool_schema_test.py
│   │   │   │   │   ├── utils.py
│   │   │   │   │   ├── validate_agent.py
│   │   │   │   │   ├── validate_agent_test.py
│   │   │   │   │   ├── web_fetch.py
│   │   │   │   │   ├── workspace_files.py
│   │   │   │   │   └── workspace_files_test.py
│   │   │   │   └── tracking.py
│   │   │   ├── data/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── analytics.py
│   │   │   │   ├── auth/
│   │   │   │   │   ├── api_key.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   └── oauth.py
│   │   │   │   ├── block.py
│   │   │   │   ├── block_cost_config.py
│   │   │   │   ├── credit.py
│   │   │   │   ├── credit_ceiling_test.py
│   │   │   │   ├── credit_concurrency_test.py
│   │   │   │   ├── credit_integration_test.py
│   │   │   │   ├── credit_metadata_test.py
│   │   │   │   ├── credit_refund_test.py
│   │   │   │   ├── credit_test.py
│   │   │   │   ├── credit_underflow_test.py
│   │   │   │   ├── credit_user_balance_migration_test.py
│   │   │   │   ├── db.py
│   │   │   │   ├── db_accessors.py
│   │   │   │   ├── db_manager.py
│   │   │   │   ├── dynamic_fields.py
│   │   │   │   ├── event_bus.py
│   │   │   │   ├── event_bus_test.py
│   │   │   │   ├── execution.py
│   │   │   │   ├── execution_outputs_test.py
│   │   │   │   ├── execution_queue_test.py
│   │   │   │   ├── generate_data.py
│   │   │   │   ├── graph.py
│   │   │   │   ├── graph_test.py
│   │   │   │   ├── human_review.py
│   │   │   │   ├── human_review_test.py
│   │   │   │   ├── includes.py
│   │   │   │   ├── integrations.py
│   │   │   │   ├── model.py
│   │   │   │   ├── model_test.py
│   │   │   │   ├── notification_bus.py
│   │   │   │   ├── notifications.py
│   │   │   │   ├── notifications_test.py
│   │   │   │   ├── onboarding.py
│   │   │   │   ├── partial_types.py
│   │   │   │   ├── rabbitmq.py
│   │   │   │   ├── redis_client.py
│   │   │   │   ├── tally.py
│   │   │   │   ├── tally_test.py
│   │   │   │   ├── understanding.py
│   │   │   │   ├── user.py
│   │   │   │   └── workspace.py
│   │   │   ├── db.py
│   │   │   ├── exec.py
│   │   │   ├── executor/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── activity_status_generator.py
│   │   │   │   ├── activity_status_generator_test.py
│   │   │   │   ├── automod/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── manager.py
│   │   │   │   │   └── models.py
│   │   │   │   ├── cluster_lock.py
│   │   │   │   ├── cluster_lock_test.py
│   │   │   │   ├── manager.py
│   │   │   │   ├── manager_insufficient_funds_test.py
│   │   │   │   ├── manager_low_balance_test.py
│   │   │   │   ├── manager_test.py
│   │   │   │   ├── scheduler.py
│   │   │   │   ├── scheduler_test.py
│   │   │   │   ├── simulator.py
│   │   │   │   ├── utils.py
│   │   │   │   └── utils_test.py
│   │   │   ├── integrations/
│   │   │   │   ├── ayrshare.py
│   │   │   │   ├── credentials_store.py
│   │   │   │   ├── creds_manager.py
│   │   │   │   ├── creds_manager_test.py
│   │   │   │   ├── oauth/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   ├── base.py
│   │   │   │   │   ├── discord.py
│   │   │   │   │   ├── github.py
│   │   │   │   │   ├── google.py
│   │   │   │   │   ├── notion.py
│   │   │   │   │   ├── reddit.py
│   │   │   │   │   ├── todoist.py
│   │   │   │   │   └── twitter.py
│   │   │   │   ├── providers.py
│   │   │   │   └── webhooks/
│   │   │   │       ├── __init__.py
│   │   │   │       ├── _base.py
│   │   │   │       ├── _manual_base.py
│   │   │   │       ├── compass.py
│   │   │   │       ├── github.py
│   │   │   │       ├── graph_lifecycle_hooks.py
│   │   │   │       ├── slant3d.py
│   │   │   │       ├── telegram.py
│   │   │   │       ├── utils.py
│   │   │   │       └── utils_test.py
│   │   │   ├── monitoring/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── accuracy_monitor.py
│   │   │   │   ├── block_error_monitor.py
│   │   │   │   ├── instrumentation.py
│   │   │   │   ├── late_execution_monitor.py
│   │   │   │   └── notification_monitor.py
│   │   │   ├── notification.py
│   │   │   ├── notifications/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── email.py
│   │   │   │   ├── notifications.py
│   │   │   │   ├── templates/
│   │   │   │   │   ├── agent_approved.html.jinja2
│   │   │   │   │   ├── agent_rejected.html.jinja2
│   │   │   │   │   ├── agent_run.html.jinja2
│   │   │   │   │   ├── base.html.jinja2
│   │   │   │   │   ├── low_balance.html.jinja2
│   │   │   │   │   ├── refund_processed.html.jinja2
│   │   │   │   │   ├── refund_request.html.jinja2
│   │   │   │   │   ├── weekly_summary.html.jinja2
│   │   │   │   │   └── zero_balance.html.jinja2
│   │   │   │   └── test_notifications.py
│   │   │   ├── rest.py
│   │   │   ├── scheduler.py
│   │   │   ├── sdk/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── builder.py
│   │   │   │   ├── cost_integration.py
│   │   │   │   ├── provider.py
│   │   │   │   └── registry.py
│   │   │   ├── usecases/
│   │   │   │   ├── block_autogen.py
│   │   │   │   ├── reddit_marketing.py
│   │   │   │   └── sample.py
│   │   │   ├── util/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── cache.py
│   │   │   │   ├── cache_test.py
│   │   │   │   ├── clients.py
│   │   │   │   ├── cloud_storage.py
│   │   │   │   ├── cloud_storage_test.py
│   │   │   │   ├── conftest.py
│   │   │   │   ├── data.py
│   │   │   │   ├── decorator.py
│   │   │   │   ├── decorator_test.py
│   │   │   │   ├── dynamic_fields.py
│   │   │   │   ├── dynamic_fields_test.py
│   │   │   │   ├── encryption.py
│   │   │   │   ├── exceptions.py
│   │   │   │   ├── exceptions_test.py
│   │   │   │   ├── feature_flag.py
│   │   │   │   ├── feature_flag_test.py
│   │   │   │   ├── file.py
│   │   │   │   ├── file_content_parser.py
│   │   │   │   ├── file_content_parser_test.py
│   │   │   │   ├── file_test.py
│   │   │   │   ├── gcs_utils.py
│   │   │   │   ├── json.py
│   │   │   │   ├── logging.py
│   │   │   │   ├── metrics.py
│   │   │   │   ├── mock.py
│   │   │   │   ├── models.py
│   │   │   │   ├── openai_responses.py
│   │   │   │   ├── openai_responses_test.py
│   │   │   │   ├── process.py
│   │   │   │   ├── prompt.py
│   │   │   │   ├── prompt_responses_api_test.py
│   │   │   │   ├── prompt_test.py
│   │   │   │   ├── request.py
│   │   │   │   ├── request_test.py
│   │   │   │   ├── retry.py
│   │   │   │   ├── retry_test.py
│   │   │   │   ├── sandbox_files.py
│   │   │   │   ├── service.py
│   │   │   │   ├── service_test.py
│   │   │   │   ├── settings.py
│   │   │   │   ├── test.py
│   │   │   │   ├── test_json.py
│   │   │   │   ├── text.py
│   │   │   │   ├── text_test.py
│   │   │   │   ├── timezone_name.py
│   │   │   │   ├── timezone_utils.py
│   │   │   │   ├── truncate.py
│   │   │   │   ├── type.py
│   │   │   │   ├── type_test.py
│   │   │   │   ├── virus_scanner.py
│   │   │   │   ├── virus_scanner_test.py
│   │   │   │   ├── workspace.py
│   │   │   │   ├── workspace_storage.py
│   │   │   │   └── workspace_test.py
│   │   │   └── ws.py
│   │   ├── docker-compose.test.yaml
│   │   ├── load-tests/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── configs/
│   │   │   │   ├── environment.js
│   │   │   │   ├── k6-credentials.env.example
│   │   │   │   └── pre-authenticated-tokens.example.js
│   │   │   ├── generate-tokens.js
│   │   │   ├── orchestrator/
│   │   │   │   └── orchestrator.js
│   │   │   └── tests/
│   │   │       ├── api/
│   │   │       │   ├── core-api-test.js
│   │   │       │   └── graph-execution-test.js
│   │   │       ├── basic/
│   │   │       │   ├── connectivity-test.js
│   │   │       │   └── single-endpoint-test.js
│   │   │       ├── comprehensive/
│   │   │       │   └── platform-journey-test.js
│   │   │       └── marketplace/
│   │   │           ├── library-access-test.js
│   │   │           └── public-access-test.js
│   │   ├── migrations/
│   │   │   ├── 20240722143307_migrations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240726131311_node_input_unique_constraint/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240729061216_static_input_link/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240804040801_add_subgraph/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240805115810_add_user_management/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240807123738_add_index_users/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240808095419_add_required_user_ids/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240902223334_add_stats_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240906155206_add_created_at_updated_at/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240914033334_user_credit/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240918163611_add_analytics_tables/
│   │   │   │   └── migration.sql
│   │   │   ├── 20240930151406_reassign_block_ids/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007090536_add_on_delete_platform/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007115713_cascade_graph_deletion/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007175111_move_oauth_creds_to_user_obj/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241007175112_add_oauth_creds_user_trigger/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241017180251_add_webhooks_and_their_relation_to_nodes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241030014950_move_integration_creds_to_platform.User/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241030061705_encrypt_user_metadata/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241030063332_drop_all_credentials_from_constant_input/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241103133307_remove_subgraph/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241103144418_graph_exec_stats_list_to_obj/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241108170448_add_api_key_support/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241113104933_remove_scheduler/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241115170707_fix_llm_provider_credentials/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241210013740_add_indexes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241211160646_rename_credit_model_and_add_stripe_customer/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241212141024_agent_store_v2/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241212142024_creator_featured_flag/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241212150828_agent_store_v2_views/
│   │   │   │   └── migration.sql
│   │   │   ├── 20241230102007_update_store_agent_view/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250103143207_add_terminated_execution_status/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250105254106_migrate_brace_to_double_brace_string_format/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250107095812_preset_soft_delete/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250108084101_user_agent_to_library_agent/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250108084305_use_graph_is_active_version/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250110084611_store_index_updates/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250115213557_add_running_balance/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250115382614_reshape_transaction_metadata_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250115432618_add_auto_top_up_config/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250124211747_make_store_listing_version_id_unique/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250203133647_add_image_url/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250205100104_add_profile_trigger/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250205110132_add_missing_profiles/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250212215755_add_user_notifications/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250213110232_migrate_string_json/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250214092857_add_refund_request/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250214101759_add_transaction_types/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250218135013_create_library_agents_for_existing_graphs/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250220111649_add_refund_notifications/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250222014114_add_email_verified_flag_to_user_table/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250223110000_add_onboarding_model/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250227140210_fix_library_presets_relations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250228161607_agent_graph_execution_soft_delete/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250310095931_delete_duplicate_indices/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250316095525_remove_graph_template/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250318043016_update_store_submissions_format/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250325100000_update_user_onboarding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250407181043_refactor_store_relations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250411130000_update_onboarding_step/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250416140000_make_arrays_not_null/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250422125822_add_forked_relation/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250507025350_execution_created_at_index/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250512104735_rename_agent_executor_node_input/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250527091422_node_execution_indexes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250528092000_onboarding_add_runs/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250604130249_optimise_store_agent_and_creator_views/
│   │   │   │   ├── migration.sql
│   │   │   │   └── rollback.sql
│   │   │   ├── 20250620000924_make_data_nullable/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250620140815_add_preset_webhook_relation/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250702224504_add_node_exec_kv_data/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250721073830_add_preset_index/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250721081856_add_missing_fk_indexes_remove_unused_indexes/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250805111135_add_video_url_and_categories_to_store_submission_view/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250819163527_add_user_timezone/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250824000317_add_notifications_for_approved_and_denied_agents/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250901104517_fix_api_key_table/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250902171554_add_credentials_to_graph_execution/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250904171522_update_store_agent_view_with_availability/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250905130657_add_recommended_schedule_cron/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250910161617_fix_store_materialized_views_refresh_job/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250912164006_keep_credit_transactions_on_user_delete/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250916191832_add_share_page/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250916193100_add_instructions_field/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250922050939_update_onboarding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20250924230049_enhance_graph_and_execution_index/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251003085016_update_store_agent_view_latest_version_only/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251007084233_log_search_terms/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251011120000_add_user_balance_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251013071709_add_use_for_onboarding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251016093049_add_full_text_search/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251027162201_migrate_claude_3_5_to_4_5_models/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251028000000_add_parent_graph_execution_tracking/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251106091413_migrate_deprecated_groq_openrouter_models/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251117102522_add_human_in_the_loop_table/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251126141555_add_api_key_store_permissions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251127092500_add_api_key_tools_permission/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251127144817_add_api_key_integration_permissions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251128112407_add_library_agent_settings/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251204012214_add_marketplace_agent_output_video_column/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251209182537_add_builder_search/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251212165920_add_oauth_provider_support/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251216182139_fix_store_submission_agent_version/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251217174500_fix_store_agent_versions_to_graph_versions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20251218231330_add_oauth_app_logo/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260109181714_add_docs_embedding/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260113170839_add_ended_at_to_agent_graph_execution/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260115081736_add_chat_tables/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260115200000_add_unified_search_tsvector/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260115210000_remove_storelistingversion_search/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260121200000_remove_node_execution_fk_from_pending_human_review/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260123110033_add_folders_in_library/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260126120000_migrate_claude_3_7_to_4_5_sonnet/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260127211502_add_visit_copilot_onboarding_step/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260127230419_add_user_workspace/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260129011611_remove_workspace_file_source/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260129090000_add_suggested_blocks_materialized_view/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260225163452_add_library_api_key_permission/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260228114302_improve_store_entity_relations/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260303120000_add_block_descriptions/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260304123456_update_store_views/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260308095500_migrate_deprecated_gemini_3_pro_preview/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260310090914_add_invite_system/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260310120000_remove_graph_exec_fk_from_pending_human_review/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260311000000_drop_auto_user_trigger/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260312093554_update_invites_indexs/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260313120000_fix_perplexity_block_invalid_models/
│   │   │   │   └── migration.sql
│   │   │   ├── 20260319120000_revert_invite_system/
│   │   │   │   └── migration.sql
│   │   │   └── migration_lock.toml
│   │   ├── pyproject.toml
│   │   ├── schema.prisma
│   │   ├── scripts/
│   │   │   ├── __init__.py
│   │   │   ├── gen_prisma_types_stub.py
│   │   │   ├── generate_block_docs.py
│   │   │   ├── generate_views.py
│   │   │   ├── linter.py
│   │   │   ├── refresh_claude_token.sh
│   │   │   ├── run_tests.py
│   │   │   └── test_generate_block_docs.py
│   │   ├── snapshots/
│   │   │   ├── adm_add_cred_neg
│   │   │   ├── adm_add_cred_ok
│   │   │   ├── adm_usr_hist_empty
│   │   │   ├── adm_usr_hist_filt
│   │   │   ├── adm_usr_hist_ok
│   │   │   ├── admin_add_credits_success
│   │   │   ├── agt_details
│   │   │   ├── agts_by_creator
│   │   │   ├── agts_category
│   │   │   ├── agts_pagination
│   │   │   ├── agts_search
│   │   │   ├── agts_sorted
│   │   │   ├── analytics_log_analytics_complex_data
│   │   │   ├── analytics_log_analytics_success
│   │   │   ├── analytics_log_metric_success
│   │   │   ├── analytics_log_metric_success_improved
│   │   │   ├── analytics_log_metric_various_values
│   │   │   ├── analytics_metric_float_precision
│   │   │   ├── analytics_metric_integer_value
│   │   │   ├── analytics_metric_large_number
│   │   │   ├── analytics_metric_negative_value
│   │   │   ├── analytics_metric_tiny_number
│   │   │   ├── analytics_metric_zero_value
│   │   │   ├── auth_email
│   │   │   ├── auth_user
│   │   │   ├── blks_all
│   │   │   ├── blks_exec
│   │   │   ├── creator_details
│   │   │   ├── creators_pagination
│   │   │   ├── cred_bal
│   │   │   ├── cred_topup_cfg
│   │   │   ├── cred_topup_req
│   │   │   ├── def_agts
│   │   │   ├── def_creators
│   │   │   ├── feat_agts
│   │   │   ├── grph_in_schm
│   │   │   ├── grph_out_schm
│   │   │   ├── grph_single
│   │   │   ├── grph_struct
│   │   │   ├── grphs_all
│   │   │   ├── grphs_del
│   │   │   ├── lib_agts_search
│   │   │   ├── log_anlyt_cplx
│   │   │   ├── log_anlyt_ok
│   │   │   ├── log_metric_ok
│   │   │   ├── log_metric_vals
│   │   │   ├── otto_empty
│   │   │   ├── otto_err
│   │   │   ├── otto_grph
│   │   │   ├── otto_ok
│   │   │   ├── sub
│   │   │   ├── sub_pagination
│   │   │   ├── sub_success
│   │   │   └── unsub
│   │   └── test/
│   │       ├── __init__.py
│   │       ├── agent_generator/
│   │       │   ├── __init__.py
│   │       │   ├── test_library_agents.py
│   │       │   └── test_orchestrator.py
│   │       ├── blocks/
│   │       │   ├── test_gmail.py
│   │       │   ├── test_google_docs_format_text_color.py
│   │       │   ├── test_jina_extract_website.py
│   │       │   ├── test_list_concatenation.py
│   │       │   └── test_youtube.py
│   │       ├── e2e_test_data.py
│   │       ├── load_store_agents.py
│   │       ├── sdk/
│   │       │   ├── __init__.py
│   │       │   ├── _config.py
│   │       │   ├── conftest.py
│   │       │   ├── test_sdk_block_creation.py
│   │       │   ├── test_sdk_patching.py
│   │       │   ├── test_sdk_registry.py
│   │       │   └── test_sdk_webhooks.py
│   │       ├── test_data_creator.py
│   │       └── test_data_updater.py
│   ├── cloudflare_worker.js
│   ├── db/
│   │   └── docker/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── dev/
│   │       │   ├── data.sql
│   │       │   └── docker-compose.dev.yml
│   │       ├── docker-compose.s3.yml
│   │       ├── docker-compose.yml
│   │       ├── reset.sh
│   │       └── volumes/
│   │           ├── api/
│   │           │   └── kong.yml
│   │           ├── db/
│   │           │   ├── _supabase.sql
│   │           │   ├── init/
│   │           │   │   └── data.sql
│   │           │   ├── jwt.sql
│   │           │   ├── logs.sql
│   │           │   ├── pooler.sql
│   │           │   ├── realtime.sql
│   │           │   ├── roles.sql
│   │           │   └── webhooks.sql
│   │           ├── functions/
│   │           │   ├── hello/
│   │           │   │   └── index.ts
│   │           │   └── main/
│   │           │       └── index.ts
│   │           ├── logs/
│   │           │   └── vector.yml
│   │           └── pooler/
│   │               └── pooler.exs
│   ├── docker-compose.platform.yml
│   ├── docker-compose.yml
│   ├── frontend/
│   │   ├── .eslintrc.json
│   │   ├── .gitignore
│   │   ├── .npmrc
│   │   ├── .prettierignore
│   │   ├── .prettierrc
│   │   ├── .storybook/
│   │   │   ├── main.ts
│   │   │   ├── manager.ts
│   │   │   ├── preview.tsx
│   │   │   └── theme.ts
│   │   ├── CLAUDE.md
│   │   ├── CONTRIBUTING.md
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── TESTING.md
│   │   ├── components.json
│   │   ├── instrumentation-client.ts
│   │   ├── next.config.mjs
│   │   ├── orval.config.ts
│   │   ├── package.json
│   │   ├── playwright.config.ts
│   │   ├── pnpm-workspace.yaml
│   │   ├── postcss.config.mjs
│   │   ├── public/
│   │   │   ├── gtag.js
│   │   │   ├── integrations/
│   │   │   │   └── nousresearch.avif
│   │   │   └── mockServiceWorker.js
│   │   ├── scripts/
│   │   │   └── generate-api-queries.ts
│   │   ├── sentry.edge.config.ts
│   │   ├── sentry.server.config.ts
│   │   ├── src/
│   │   │   ├── app/
│   │   │   │   ├── (no-navbar)/
│   │   │   │   │   ├── logout/
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── onboarding/
│   │   │   │   │   │   ├── 1-welcome/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 2-reason/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 3-services/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 4-agent/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── 5-run/
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AgentOnboardingCredentials/
│   │   │   │   │   │   │   │   │   ├── AgentOnboardingCredentials.tsx
│   │   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   │   ├── RunAgentHint.tsx
│   │   │   │   │   │   │   │   └── SelectedAgentCard.tsx
│   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   │   └── useOnboardingRunStep.tsx
│   │   │   │   │   │   ├── 6-congrats/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── OnboardingAgentCard.tsx
│   │   │   │   │   │   │   ├── OnboardingBackButton.tsx
│   │   │   │   │   │   │   ├── OnboardingButton.tsx
│   │   │   │   │   │   │   ├── OnboardingGrid.tsx
│   │   │   │   │   │   │   ├── OnboardingInput.tsx
│   │   │   │   │   │   │   ├── OnboardingList.tsx
│   │   │   │   │   │   │   ├── OnboardingProgress.tsx
│   │   │   │   │   │   │   ├── OnboardingStep.tsx
│   │   │   │   │   │   │   ├── OnboardingText.tsx
│   │   │   │   │   │   │   └── StarRating.tsx
│   │   │   │   │   │   ├── layout.tsx
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── reset/
│   │   │   │   │   │       └── page.tsx
│   │   │   │   │   └── share/
│   │   │   │   │       ├── [token]/
│   │   │   │   │       │   └── page.tsx
│   │   │   │   │       └── layout.tsx
│   │   │   │   ├── (platform)/
│   │   │   │   │   ├── admin/
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AdminImpersonationBanner.tsx
│   │   │   │   │   │   │   ├── AdminImpersonationPanel.tsx
│   │   │   │   │   │   │   └── useAdminImpersonation.ts
│   │   │   │   │   │   ├── dashboard/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── execution-analytics/
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AnalyticsResultsTable.tsx
│   │   │   │   │   │   │   │   └── ExecutionAnalyticsForm.tsx
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── impersonation/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── layout.tsx
│   │   │   │   │   │   ├── marketplace/
│   │   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AdminAgentsDataTable.tsx
│   │   │   │   │   │   │   │   ├── ApproveRejectButton.tsx
│   │   │   │   │   │   │   │   ├── DownloadAgentButton.tsx
│   │   │   │   │   │   │   │   ├── ExpandleRow.tsx
│   │   │   │   │   │   │   │   └── SearchFilterForm.tsx
│   │   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   │   └── preview/
│   │   │   │   │   │   │       └── [id]/
│   │   │   │   │   │   │           └── page.tsx
│   │   │   │   │   │   ├── settings/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── spending/
│   │   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   ├── AddMoneyButton.tsx
│   │   │   │   │   │   │   │   ├── AdminUserGrantHistory.tsx
│   │   │   │   │   │   │   │   └── SearchAndFilterAdminSpending.tsx
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   └── users/
│   │   │   │   │   │       └── page.tsx
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── auth-code-error/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── authorize/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── callback/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   ├── confirm/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   └── integrations/
│   │   │   │   │   │       ├── mcp_callback/
│   │   │   │   │   │       │   └── route.ts
│   │   │   │   │   │       ├── oauth_callback/
│   │   │   │   │   │       │   ├── route.ts
│   │   │   │   │   │       │   └── types.ts
│   │   │   │   │   │       └── setup-wizard/
│   │   │   │   │   │           └── page.tsx
│   │   │   │   │   ├── build/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── CustomNode.test.tsx
│   │   │   │   │   │   │   ├── DraftRecoveryPopup.test.tsx
│   │   │   │   │   │   │   ├── NewBlockMenu.test.tsx
│   │   │   │   │   │   │   ├── NewSaveControl.test.tsx
│   │   │   │   │   │   │   ├── RunGraph.test.tsx
│   │   │   │   │   │   │   ├── blockMenuStore.test.ts
│   │   │   │   │   │   │   ├── controlPanelStore.test.ts
│   │   │   │   │   │   │   ├── copyPasteStore.test.ts
│   │   │   │   │   │   │   ├── edgeStore.test.ts
│   │   │   │   │   │   │   ├── graphStore.test.ts
│   │   │   │   │   │   │   ├── historyStore.test.ts
│   │   │   │   │   │   │   ├── nodeStore.test.ts
│   │   │   │   │   │   │   ├── tutorialStore.test.ts
│   │   │   │   │   │   │   ├── useCopyPaste.test.ts
│   │   │   │   │   │   │   └── useFlow.test.ts
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── BuilderActions/
│   │   │   │   │   │   │   │   ├── BuilderActions.tsx
│   │   │   │   │   │   │   │   └── components/
│   │   │   │   │   │   │   │       ├── AgentOutputs/
│   │   │   │   │   │   │   │       │   └── AgentOutputs.tsx
│   │   │   │   │   │   │   │       ├── CronSchedulerDialog/
│   │   │   │   │   │   │   │       │   ├── CronSchedulerDialog.tsx
│   │   │   │   │   │   │   │       │   └── useCronSchedulerDialog.ts
│   │   │   │   │   │   │   │       ├── PublishToMarketplace/
│   │   │   │   │   │   │   │       │   ├── PublishToMarketplace.tsx
│   │   │   │   │   │   │   │       │   └── usePublishToMarketplace.ts
│   │   │   │   │   │   │   │       ├── RunGraph/
│   │   │   │   │   │   │   │       │   ├── RunGraph.tsx
│   │   │   │   │   │   │   │       │   └── useRunGraph.ts
│   │   │   │   │   │   │   │       ├── RunInputDialog/
│   │   │   │   │   │   │   │       │   ├── RunInputDialog.tsx
│   │   │   │   │   │   │   │       │   └── useRunInputDialog.ts
│   │   │   │   │   │   │   │       └── ScheduleGraph/
│   │   │   │   │   │   │   │           ├── ScheduleGraph.tsx
│   │   │   │   │   │   │   │           └── useScheduleGraph.ts
│   │   │   │   │   │   │   ├── DraftRecoveryDialog/
│   │   │   │   │   │   │   │   ├── DraftRecoveryPopup.tsx
│   │   │   │   │   │   │   │   └── useDraftRecoveryPopup.tsx
│   │   │   │   │   │   │   ├── FloatingSafeModeToogle.tsx
│   │   │   │   │   │   │   ├── FlowEditor/
│   │   │   │   │   │   │   │   ├── ARCHITECTURE_FLOW_EDITOR.md
│   │   │   │   │   │   │   │   ├── Flow/
│   │   │   │   │   │   │   │   │   ├── Flow.tsx
│   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   ├── CustomControl.tsx
│   │   │   │   │   │   │   │   │   │   ├── GraphLoadingBox.tsx
│   │   │   │   │   │   │   │   │   │   ├── RunningBackground.tsx
│   │   │   │   │   │   │   │   │   │   └── TriggerAgentBanner.tsx
│   │   │   │   │   │   │   │   │   ├── flow.css
│   │   │   │   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   │   │   │   └── resolve-collision.ts
│   │   │   │   │   │   │   │   │   ├── useCopyPaste.ts
│   │   │   │   │   │   │   │   │   ├── useDraftManager.ts
│   │   │   │   │   │   │   │   │   ├── useFlow.ts
│   │   │   │   │   │   │   │   │   └── useFlowRealtime.ts
│   │   │   │   │   │   │   │   ├── edges/
│   │   │   │   │   │   │   │   │   ├── CustomEdge.tsx
│   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   ├── JSBeads.tsx
│   │   │   │   │   │   │   │   │   │   └── SVGBeads.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   └── useCustomEdge.ts
│   │   │   │   │   │   │   │   ├── handlers/
│   │   │   │   │   │   │   │   │   ├── NodeHandle.tsx
│   │   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   │   ├── nodes/
│   │   │   │   │   │   │   │   │   ├── CustomNode/
│   │   │   │   │   │   │   │   │   │   ├── CustomNode.tsx
│   │   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   │   ├── AyrshareConnectButton.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeAdvancedToggle.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeBadges.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeContainer.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeContextMenu.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeCost.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeExecutionBadge.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeHeader.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeOutput/
│   │   │   │   │   │   │   │   │   │   │   │   ├── NodeOutput.tsx
│   │   │   │   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   │   │   │   ├── ContentRenderer.tsx
│   │   │   │   │   │   │   │   │   │   │   │   │   ├── NodeDataViewer/
│   │   │   │   │   │   │   │   │   │   │   │   │   │   ├── NodeDataViewer.tsx
│   │   │   │   │   │   │   │   │   │   │   │   │   │   └── useNodeDataViewer.ts
│   │   │   │   │   │   │   │   │   │   │   │   │   └── ViewMoreData.tsx
│   │   │   │   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   │   │   │   └── useNodeOutput.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── NodeRightClickMenu.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── StickyNoteBlock.tsx
│   │   │   │   │   │   │   │   │   │   │   ├── SubAgentUpdate/
│   │   │   │   │   │   │   │   │   │   │   │   ├── SubAgentUpdateFeature.tsx
│   │   │   │   │   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   │   │   │   │   ├── IncompatibleUpdateDialog.tsx
│   │   │   │   │   │   │   │   │   │   │   │   │   └── ResolutionModeBar.tsx
│   │   │   │   │   │   │   │   │   │   │   │   └── useSubAgentUpdateState.ts
│   │   │   │   │   │   │   │   │   │   │   └── WebhookDisclaimer.tsx
│   │   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   │   └── useCustomNode.tsx
│   │   │   │   │   │   │   │   │   ├── FormCreator.tsx
│   │   │   │   │   │   │   │   │   ├── OutputHandler.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   ├── uiSchema.ts
│   │   │   │   │   │   │   │   │   └── useBrokenOutputs.ts
│   │   │   │   │   │   │   │   └── tutorial/
│   │   │   │   │   │   │   │       ├── constants.ts
│   │   │   │   │   │   │   │       ├── helpers/
│   │   │   │   │   │   │   │       │   ├── blocks.ts
│   │   │   │   │   │   │   │       │   ├── canvas.ts
│   │   │   │   │   │   │   │       │   ├── connections.ts
│   │   │   │   │   │   │   │       │   ├── dom.ts
│   │   │   │   │   │   │   │       │   ├── highlights.ts
│   │   │   │   │   │   │   │       │   ├── index.ts
│   │   │   │   │   │   │   │       │   ├── menu.ts
│   │   │   │   │   │   │   │       │   ├── save.ts
│   │   │   │   │   │   │   │       │   └── state.ts
│   │   │   │   │   │   │   │       ├── icons.ts
│   │   │   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │   │   │       ├── steps/
│   │   │   │   │   │   │   │       │   ├── block-basics.ts
│   │   │   │   │   │   │   │       │   ├── block-menu.ts
│   │   │   │   │   │   │   │       │   ├── completion.ts
│   │   │   │   │   │   │   │       │   ├── configure-calculator.ts
│   │   │   │   │   │   │   │       │   ├── connections.ts
│   │   │   │   │   │   │   │       │   ├── index.ts
│   │   │   │   │   │   │   │       │   ├── run.ts
│   │   │   │   │   │   │   │       │   ├── save.ts
│   │   │   │   │   │   │   │       │   ├── second-calculator.ts
│   │   │   │   │   │   │   │       │   └── welcome.ts
│   │   │   │   │   │   │   │       ├── styles.ts
│   │   │   │   │   │   │   │       └── tutorial.css
│   │   │   │   │   │   │   ├── MCPToolDialog.tsx
│   │   │   │   │   │   │   ├── NewControlPanel/
│   │   │   │   │   │   │   │   ├── ControlPanelButton.tsx
│   │   │   │   │   │   │   │   ├── NewBlockMenu/
│   │   │   │   │   │   │   │   │   ├── AiBlock.tsx
│   │   │   │   │   │   │   │   │   ├── AllBlocksContent/
│   │   │   │   │   │   │   │   │   │   ├── AllBlocksContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useAllBlockContent.tsx
│   │   │   │   │   │   │   │   │   ├── Block.tsx
│   │   │   │   │   │   │   │   │   ├── BlockList/
│   │   │   │   │   │   │   │   │   │   └── BlockList.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenu/
│   │   │   │   │   │   │   │   │   │   └── BlockMenu.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuContent/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuContent.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuDefault/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuDefault.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuDefaultContent/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuDefaultContent.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuFilters/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuFilters.tsx
│   │   │   │   │   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   │   │   │   ├── BlockMenuSearch/
│   │   │   │   │   │   │   │   │   │   └── BlockMenuSearch.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuSearchBar/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuSearchBar.tsx
│   │   │   │   │   │   │   │   │   │   └── useBlockMenuSearchBar.ts
│   │   │   │   │   │   │   │   │   ├── BlockMenuSearchContent/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuSearchContent.tsx
│   │   │   │   │   │   │   │   │   │   ├── helper.ts
│   │   │   │   │   │   │   │   │   │   └── useBlockMenuSearchContent.tsx
│   │   │   │   │   │   │   │   │   ├── BlockMenuSidebar/
│   │   │   │   │   │   │   │   │   │   ├── BlockMenuSidebar.tsx
│   │   │   │   │   │   │   │   │   │   └── useBlockMenuSidebar.ts
│   │   │   │   │   │   │   │   │   ├── FilterChip.tsx
│   │   │   │   │   │   │   │   │   ├── FilterSheet/
│   │   │   │   │   │   │   │   │   │   ├── FilterSheet.tsx
│   │   │   │   │   │   │   │   │   │   ├── constant.ts
│   │   │   │   │   │   │   │   │   │   └── useFilterSheet.ts
│   │   │   │   │   │   │   │   │   ├── HorizontalScroll.tsx
│   │   │   │   │   │   │   │   │   ├── Integration.tsx
│   │   │   │   │   │   │   │   │   ├── IntegrationBlocks/
│   │   │   │   │   │   │   │   │   │   ├── IntegrationBlocks.tsx
│   │   │   │   │   │   │   │   │   │   └── useIntegrationBlocks.ts
│   │   │   │   │   │   │   │   │   ├── IntegrationChip.tsx
│   │   │   │   │   │   │   │   │   ├── IntegrationsContent/
│   │   │   │   │   │   │   │   │   │   └── IntegrationsContent.tsx
│   │   │   │   │   │   │   │   │   ├── IntergrationBlock.tsx
│   │   │   │   │   │   │   │   │   ├── MarketplaceAgentBlock.tsx
│   │   │   │   │   │   │   │   │   ├── MarketplaceAgentsContent/
│   │   │   │   │   │   │   │   │   │   ├── MarketplaceAgentsContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useMarketplaceAgentsContent.ts
│   │   │   │   │   │   │   │   │   ├── MenuItem.tsx
│   │   │   │   │   │   │   │   │   ├── MyAgentsContent/
│   │   │   │   │   │   │   │   │   │   ├── MyAgentsContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useMyAgentsContent.ts
│   │   │   │   │   │   │   │   │   ├── NoSearchResult.tsx
│   │   │   │   │   │   │   │   │   ├── PaginatedBlocksContent/
│   │   │   │   │   │   │   │   │   │   ├── PaginatedBlocksContent.tsx
│   │   │   │   │   │   │   │   │   │   └── usePaginatedBlocks.ts
│   │   │   │   │   │   │   │   │   ├── PaginatedIntegrationList/
│   │   │   │   │   │   │   │   │   │   ├── PaginatedIntegrationList.tsx
│   │   │   │   │   │   │   │   │   │   └── usePaginatedIntegrationList.ts
│   │   │   │   │   │   │   │   │   ├── SearchHistoryChip.tsx
│   │   │   │   │   │   │   │   │   ├── SuggestionContent/
│   │   │   │   │   │   │   │   │   │   ├── SuggestionContent.tsx
│   │   │   │   │   │   │   │   │   │   └── useSuggestionContent.ts
│   │   │   │   │   │   │   │   │   ├── UGCAgentBlock.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.tsx
│   │   │   │   │   │   │   │   │   ├── hooks/
│   │   │   │   │   │   │   │   │   │   └── useAddAgentToBuilder.ts
│   │   │   │   │   │   │   │   │   ├── style.ts
│   │   │   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   │   │   ├── NewControlPanel.tsx
│   │   │   │   │   │   │   │   ├── NewSaveControl/
│   │   │   │   │   │   │   │   │   ├── NewSaveControl.tsx
│   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   └── useNewSaveControl.ts
│   │   │   │   │   │   │   │   ├── NewSearchGraph/
│   │   │   │   │   │   │   │   │   ├── GraphMenu/
│   │   │   │   │   │   │   │   │   │   ├── GraphMenu.tsx
│   │   │   │   │   │   │   │   │   │   └── useGraphMenu.ts
│   │   │   │   │   │   │   │   │   ├── GraphMenuContent/
│   │   │   │   │   │   │   │   │   │   ├── GraphContent.tsx
│   │   │   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   │   │   └── useGraphContent.ts
│   │   │   │   │   │   │   │   │   └── GraphMenuSearchBar/
│   │   │   │   │   │   │   │   │       ├── GraphMenuSearchBar.tsx
│   │   │   │   │   │   │   │   │       ├── useGraphMenuSearchBar.tsx
│   │   │   │   │   │   │   │   │       └── useGraphMenuSearchBarComponent.ts
│   │   │   │   │   │   │   │   ├── UndoRedoButtons.tsx
│   │   │   │   │   │   │   │   └── useGraphSearchShortcut.ts
│   │   │   │   │   │   │   ├── helper.ts
│   │   │   │   │   │   │   ├── legacy-builder/
│   │   │   │   │   │   │   │   ├── agent-run-draft-view.tsx
│   │   │   │   │   │   │   │   └── agent-status-chip.tsx
│   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   ├── hooks/
│   │   │   │   │   │   │   ├── useCopyPasteKeyboard.ts
│   │   │   │   │   │   │   ├── useSaveGraph.ts
│   │   │   │   │   │   │   └── useSubAgentUpdate/
│   │   │   │   │   │   │       ├── helpers.ts
│   │   │   │   │   │   │       ├── index.ts
│   │   │   │   │   │   │       ├── types.ts
│   │   │   │   │   │   │       └── useSubAgentUpdate.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── stores/
│   │   │   │   │   │       ├── blockMenuStore.ts
│   │   │   │   │   │       ├── controlPanelStore.ts
│   │   │   │   │   │       ├── copyPasteStore.ts
│   │   │   │   │   │       ├── edgeStore.ts
│   │   │   │   │   │       ├── graphStore.ts
│   │   │   │   │   │       ├── helpers.ts
│   │   │   │   │   │       ├── historyStore.ts
│   │   │   │   │   │       ├── nodeStore.ts
│   │   │   │   │   │       ├── tutorialStore.ts
│   │   │   │   │   │       └── types.ts
│   │   │   │   │   ├── copilot/
│   │   │   │   │   │   ├── CopilotPage.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AgentSavedCard/
│   │   │   │   │   │   │   │   └── AgentSavedCard.tsx
│   │   │   │   │   │   │   ├── ChatContainer/
│   │   │   │   │   │   │   │   └── ChatContainer.tsx
│   │   │   │   │   │   │   ├── ChatInput/
│   │   │   │   │   │   │   │   ├── ChatInput.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AttachmentMenu.tsx
│   │   │   │   │   │   │   │   │   ├── AudioWaveform.tsx
│   │   │   │   │   │   │   │   │   ├── FileChips.tsx
│   │   │   │   │   │   │   │   │   ├── RecordingButton.tsx
│   │   │   │   │   │   │   │   │   └── RecordingIndicator.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   ├── useChatInput.ts
│   │   │   │   │   │   │   │   └── useVoiceRecording.ts
│   │   │   │   │   │   │   ├── ChatMessagesContainer/
│   │   │   │   │   │   │   │   ├── ChatMessagesContainer.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AssistantMessageActions.tsx
│   │   │   │   │   │   │   │   │   ├── CollapsedToolGroup.tsx
│   │   │   │   │   │   │   │   │   ├── CopyButton.tsx
│   │   │   │   │   │   │   │   │   ├── FeedbackModal.tsx
│   │   │   │   │   │   │   │   │   ├── MessageAttachments.tsx
│   │   │   │   │   │   │   │   │   ├── MessagePartRenderer.tsx
│   │   │   │   │   │   │   │   │   ├── ReasoningCollapse.tsx
│   │   │   │   │   │   │   │   │   ├── TTSButton.tsx
│   │   │   │   │   │   │   │   │   └── ThinkingIndicator.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useMessageFeedback.ts
│   │   │   │   │   │   │   ├── ChatSidebar/
│   │   │   │   │   │   │   │   ├── ChatSidebar.tsx
│   │   │   │   │   │   │   │   └── components/
│   │   │   │   │   │   │   │       └── NotificationToggle/
│   │   │   │   │   │   │   │           └── NotificationToggle.tsx
│   │   │   │   │   │   │   ├── CopilotChatActionsProvider/
│   │   │   │   │   │   │   │   ├── CopilotChatActionsProvider.tsx
│   │   │   │   │   │   │   │   └── useCopilotChatActions.ts
│   │   │   │   │   │   │   ├── CopilotPendingReviews/
│   │   │   │   │   │   │   │   └── CopilotPendingReviews.tsx
│   │   │   │   │   │   │   ├── DeleteChatDialog/
│   │   │   │   │   │   │   │   └── DeleteChatDialog.tsx
│   │   │   │   │   │   │   ├── EmptySession/
│   │   │   │   │   │   │   │   ├── EmptySession.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── JobStatsBar/
│   │   │   │   │   │   │   │   ├── TurnStatsBar.tsx
│   │   │   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   │   │   └── useWorkDoneCounters.ts
│   │   │   │   │   │   │   ├── MiniGame/
│   │   │   │   │   │   │   │   ├── MiniGame.tsx
│   │   │   │   │   │   │   │   └── useMiniGame.ts
│   │   │   │   │   │   │   ├── MobileDrawer/
│   │   │   │   │   │   │   │   └── MobileDrawer.tsx
│   │   │   │   │   │   │   ├── MobileHeader/
│   │   │   │   │   │   │   │   └── MobileHeader.tsx
│   │   │   │   │   │   │   ├── MorphingTextAnimation/
│   │   │   │   │   │   │   │   └── MorphingTextAnimation.tsx
│   │   │   │   │   │   │   ├── NotificationBanner/
│   │   │   │   │   │   │   │   └── NotificationBanner.tsx
│   │   │   │   │   │   │   ├── NotificationDialog/
│   │   │   │   │   │   │   │   └── NotificationDialog.tsx
│   │   │   │   │   │   │   ├── OrbitLoader/
│   │   │   │   │   │   │   │   ├── OrbitLoader.module.css
│   │   │   │   │   │   │   │   └── OrbitLoader.tsx
│   │   │   │   │   │   │   ├── ProgressBar/
│   │   │   │   │   │   │   │   └── ProgressBar.tsx
│   │   │   │   │   │   │   ├── PulseLoader/
│   │   │   │   │   │   │   │   ├── PulseLoader.module.css
│   │   │   │   │   │   │   │   └── PulseLoader.tsx
│   │   │   │   │   │   │   ├── ScaleLoader/
│   │   │   │   │   │   │   │   ├── ScaleLoader.module.css
│   │   │   │   │   │   │   │   └── ScaleLoader.tsx
│   │   │   │   │   │   │   ├── SpinnerLoader/
│   │   │   │   │   │   │   │   ├── SpinnerLoader.module.css
│   │   │   │   │   │   │   │   └── SpinnerLoader.tsx
│   │   │   │   │   │   │   ├── ToolAccordion/
│   │   │   │   │   │   │   │   ├── AccordionContent.tsx
│   │   │   │   │   │   │   │   ├── ToolAccordion.tsx
│   │   │   │   │   │   │   │   └── useToolAccordion.ts
│   │   │   │   │   │   │   ├── ToolErrorCard/
│   │   │   │   │   │   │   │   └── ToolErrorCard.tsx
│   │   │   │   │   │   │   └── UsageLimits/
│   │   │   │   │   │   │       ├── UsageLimits.tsx
│   │   │   │   │   │   │       ├── UsagePanelContent.tsx
│   │   │   │   │   │   │       └── __tests__/
│   │   │   │   │   │   │           └── UsageLimits.test.tsx
│   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   └── convertChatSessionToUiMessages.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   ├── store.ts
│   │   │   │   │   │   ├── styleguide/
│   │   │   │   │   │   │   └── page.tsx
│   │   │   │   │   │   ├── tools/
│   │   │   │   │   │   │   ├── ConnectIntegrationTool/
│   │   │   │   │   │   │   │   └── ConnectIntegrationTool.tsx
│   │   │   │   │   │   │   ├── CreateAgent/
│   │   │   │   │   │   │   │   ├── CreateAgent.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── ClarificationQuestionsCard.tsx
│   │   │   │   │   │   │   │   │   └── SuggestedGoalCard.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── EditAgent/
│   │   │   │   │   │   │   │   ├── EditAgent.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FeatureRequests/
│   │   │   │   │   │   │   │   ├── FeatureRequests.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FindAgents/
│   │   │   │   │   │   │   │   ├── FindAgents.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FindBlocks/
│   │   │   │   │   │   │   │   ├── FindBlocks.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── FolderTool/
│   │   │   │   │   │   │   │   ├── FolderTool.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── GenericTool/
│   │   │   │   │   │   │   │   ├── GenericTool.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── RunAgent/
│   │   │   │   │   │   │   │   ├── RunAgent.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AgentDetailsCard/
│   │   │   │   │   │   │   │   │   │   ├── AgentDetailsCard.tsx
│   │   │   │   │   │   │   │   │   │   ├── helpers.test.ts
│   │   │   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   │   │   ├── ErrorCard/
│   │   │   │   │   │   │   │   │   │   └── ErrorCard.tsx
│   │   │   │   │   │   │   │   │   ├── ExecutionStartedCard/
│   │   │   │   │   │   │   │   │   │   └── ExecutionStartedCard.tsx
│   │   │   │   │   │   │   │   │   └── SetupRequirementsCard/
│   │   │   │   │   │   │   │   │       ├── SetupRequirementsCard.tsx
│   │   │   │   │   │   │   │   │       └── helpers.ts
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── RunBlock/
│   │   │   │   │   │   │   │   ├── RunBlock.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── BlockDetailsCard/
│   │   │   │   │   │   │   │   │   │   └── BlockDetailsCard.tsx
│   │   │   │   │   │   │   │   │   ├── BlockInputCard/
│   │   │   │   │   │   │   │   │   │   └── BlockInputCard.tsx
│   │   │   │   │   │   │   │   │   ├── BlockOutputCard/
│   │   │   │   │   │   │   │   │   │   └── BlockOutputCard.tsx
│   │   │   │   │   │   │   │   │   ├── ErrorCard/
│   │   │   │   │   │   │   │   │   │   └── ErrorCard.tsx
│   │   │   │   │   │   │   │   │   └── SetupRequirementsCard/
│   │   │   │   │   │   │   │   │       ├── SetupRequirementsCard.tsx
│   │   │   │   │   │   │   │   │       └── helpers.ts
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── RunMCPTool/
│   │   │   │   │   │   │   │   ├── RunMCPTool.tsx
│   │   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   │   └── helpers.test.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── MCPSetupCard/
│   │   │   │   │   │   │   │   │   │   ├── MCPSetupCard.tsx
│   │   │   │   │   │   │   │   │   │   └── __tests__/
│   │   │   │   │   │   │   │   │   │       └── MCPSetupCard.test.tsx
│   │   │   │   │   │   │   │   │   └── MCPToolOutputCard/
│   │   │   │   │   │   │   │   │       ├── MCPToolOutputCard.tsx
│   │   │   │   │   │   │   │   │       └── __tests__/
│   │   │   │   │   │   │   │   │           └── MCPToolOutputCard.test.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── SearchDocs/
│   │   │   │   │   │   │   │   ├── SearchDocs.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── ViewAgentOutput/
│   │   │   │   │   │   │   │   ├── ViewAgentOutput.tsx
│   │   │   │   │   │   │   │   └── helpers.tsx
│   │   │   │   │   │   │   ├── clarifying-questions.test.ts
│   │   │   │   │   │   │   └── clarifying-questions.ts
│   │   │   │   │   │   ├── useChatSession.ts
│   │   │   │   │   │   ├── useCopilotNotifications.ts
│   │   │   │   │   │   ├── useCopilotPage.ts
│   │   │   │   │   │   ├── useCopilotStream.ts
│   │   │   │   │   │   └── useWorkflowImportAutoSubmit.ts
│   │   │   │   │   ├── dictionaries/
│   │   │   │   │   │   ├── en.json
│   │   │   │   │   │   └── es.json
│   │   │   │   │   ├── error/
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── error.tsx
│   │   │   │   │   ├── health/
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── layout.tsx
│   │   │   │   │   ├── library/
│   │   │   │   │   │   ├── agents/
│   │   │   │   │   │   │   └── [id]/
│   │   │   │   │   │   │       ├── components/
│   │   │   │   │   │   │       │   └── NewAgentLibraryView/
│   │   │   │   │   │   │       │       ├── NewAgentLibraryView.tsx
│   │   │   │   │   │   │       │       ├── components/
│   │   │   │   │   │   │       │       │   ├── AgentVersionChangelog.tsx
│   │   │   │   │   │   │       │       │   ├── modals/
│   │   │   │   │   │   │       │       │   │   ├── AgentInputsReadOnly/
│   │   │   │   │   │   │       │       │   │   │   ├── AgentInputsReadOnly.tsx
│   │   │   │   │   │   │       │       │   │   │   └── helpers.ts
│   │   │   │   │   │   │       │       │   │   ├── AgentSettingsModal/
│   │   │   │   │   │   │       │       │   │   │   └── AgentSettingsModal.tsx
│   │   │   │   │   │   │       │       │   │   ├── RunAgentInputs/
│   │   │   │   │   │   │       │       │   │   │   ├── RunAgentInputs.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useRunAgentInputs.ts
│   │   │   │   │   │   │       │       │   │   ├── RunAgentModal/
│   │   │   │   │   │   │       │       │   │   │   ├── RunAgentModal.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── AIAgentSafetyPopup/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── AIAgentSafetyPopup.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── ModalHeader/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── ModalHeader.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── ModalRunSection/
│   │   │   │   │   │   │       │       │   │   │   │   │   ├── ModalRunSection.tsx
│   │   │   │   │   │   │       │       │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │       │       │   │   │   │   ├── ModalSection/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── ModalSection.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunActions/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── RunActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── WebhookTriggerBanner/
│   │   │   │   │   │   │       │       │   │   │   │       └── WebhookTriggerBanner.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── context.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── errorHelpers.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── helpers.ts
│   │   │   │   │   │   │       │       │   │   │   └── useAgentRunModal.tsx
│   │   │   │   │   │   │       │       │   │   └── ScheduleAgentModal/
│   │   │   │   │   │   │       │       │   │       ├── ScheduleAgentModal.tsx
│   │   │   │   │   │   │       │       │   │       ├── components/
│   │   │   │   │   │   │       │       │   │       │   ├── CronScheduler/
│   │   │   │   │   │   │       │       │   │       │   │   ├── CronScheduler.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── CustomInterval.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── FrequencySelect.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── MonthlyPicker.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── TimeAt.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── WeeklyPicker.tsx
│   │   │   │   │   │   │       │       │   │       │   │   └── YearlyPicker.tsx
│   │   │   │   │   │   │       │       │   │       │   ├── ModalScheduleSection/
│   │   │   │   │   │   │       │       │   │       │   │   ├── ModalScheduleSection.tsx
│   │   │   │   │   │   │       │       │   │       │   │   ├── helpers.ts
│   │   │   │   │   │   │       │       │   │       │   │   └── useModalScheduleSection.ts
│   │   │   │   │   │   │       │       │   │       │   └── TimezoneNotice/
│   │   │   │   │   │   │       │       │   │       │       └── TimezoneNotice.tsx
│   │   │   │   │   │   │       │       │   │       └── useScheduleAgentModal.ts
│   │   │   │   │   │   │       │       │   ├── other/
│   │   │   │   │   │   │       │       │   │   ├── AgentRunsLoading.tsx
│   │   │   │   │   │   │       │       │   │   ├── AgentSettingsButton.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptySchedules.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptySchedulesIllustration.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTasks.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTasksIllustration.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTemplates.tsx
│   │   │   │   │   │   │       │       │   │   ├── EmptyTriggers.tsx
│   │   │   │   │   │   │       │       │   │   ├── MarketplaceBanners.tsx
│   │   │   │   │   │   │       │       │   │   └── SectionWrap.tsx
│   │   │   │   │   │   │       │       │   ├── selected-views/
│   │   │   │   │   │   │       │       │   │   ├── AgentActionsDropdown.tsx
│   │   │   │   │   │   │       │       │   │   ├── LoadingSelectedContent.tsx
│   │   │   │   │   │   │       │       │   │   ├── OutputRenderers/
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── OutputActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── OutputItem.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── index.ts
│   │   │   │   │   │   │       │       │   │   │   ├── renderers/
│   │   │   │   │   │   │       │       │   │   │   │   ├── CodeRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── ImageRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── JSONRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── MarkdownRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── TextRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── VideoRenderer.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── types.ts
│   │   │   │   │   │   │       │       │   │   │   └── utils/
│   │   │   │   │   │   │       │       │   │   │       ├── copy.ts
│   │   │   │   │   │   │       │       │   │   │       └── download.ts
│   │   │   │   │   │   │       │       │   │   ├── RunDetailCard/
│   │   │   │   │   │   │       │       │   │   │   └── RunDetailCard.tsx
│   │   │   │   │   │   │       │       │   │   ├── RunDetailHeader/
│   │   │   │   │   │   │       │       │   │   │   ├── RunDetailHeader.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useScheduleDetailHeader.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedActionsWrap.tsx
│   │   │   │   │   │   │       │       │   │   ├── SelectedRunView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedRunView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── CreateTemplateModal/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── CreateTemplateModal.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunOutputs.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunStatusBadge.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── RunSummary.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── SafeModeToggle.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── SelectedRunActions/
│   │   │   │   │   │   │       │       │   │   │   │   │   ├── SelectedRunActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   │   └── useSelectedRunActions.ts
│   │   │   │   │   │   │       │       │   │   │   │   └── WebhookTriggerSection.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedRunView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedScheduleView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedScheduleView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── DeleteScheduleButton/
│   │   │   │   │   │   │       │       │   │   │   │   │   └── DeleteScheduleButton.tsx
│   │   │   │   │   │   │       │       │   │   │   │   ├── EditScheduleModal/
│   │   │   │   │   │   │       │       │   │   │   │   │   ├── EditScheduleModal.tsx
│   │   │   │   │   │   │       │       │   │   │   │   │   └── useEditScheduleModal.ts
│   │   │   │   │   │   │       │       │   │   │   │   └── SelectedScheduleActions/
│   │   │   │   │   │   │       │       │   │   │   │       ├── SelectedScheduleActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │       └── useSelectedScheduleActions.ts
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedScheduleView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedSettingsView/
│   │   │   │   │   │   │       │       │   │   │   └── SelectedSettingsView.tsx
│   │   │   │   │   │   │       │       │   │   ├── SelectedTemplateView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedTemplateView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   ├── SelectedTemplateActions.tsx
│   │   │   │   │   │   │       │       │   │   │   │   └── WebhookTriggerCard.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedTemplateView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedTriggerView/
│   │   │   │   │   │   │       │       │   │   │   ├── SelectedTriggerView.tsx
│   │   │   │   │   │   │       │       │   │   │   ├── components/
│   │   │   │   │   │   │       │       │   │   │   │   └── SelectedTriggerActions.tsx
│   │   │   │   │   │   │       │       │   │   │   └── useSelectedTriggerView.ts
│   │   │   │   │   │   │       │       │   │   ├── SelectedViewLayout.tsx
│   │   │   │   │   │   │       │       │   │   └── ShareRunButton/
│   │   │   │   │   │   │       │       │   │       ├── ShareRunButton.tsx
│   │   │   │   │   │   │       │       │   │       └── useShareRunButton.ts
│   │   │   │   │   │   │       │       │   └── sidebar/
│   │   │   │   │   │   │       │       │       └── SidebarRunsList/
│   │   │   │   │   │   │       │       │           ├── SidebarRunsList.tsx
│   │   │   │   │   │   │       │       │           ├── components/
│   │   │   │   │   │   │       │       │           │   ├── IconWrapper.tsx
│   │   │   │   │   │   │       │       │           │   ├── ScheduleActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   ├── ScheduleListItem.tsx
│   │   │   │   │   │   │       │       │           │   ├── SidebarItemCard.tsx
│   │   │   │   │   │   │       │       │           │   ├── TaskActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   ├── TaskListItem.tsx
│   │   │   │   │   │   │       │       │           │   ├── TemplateActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   ├── TemplateListItem.tsx
│   │   │   │   │   │   │       │       │           │   ├── TriggerActionsDropdown.tsx
│   │   │   │   │   │   │       │       │           │   └── TriggerListItem.tsx
│   │   │   │   │   │   │       │       │           └── useSidebarRunsList.ts
│   │   │   │   │   │   │       │       ├── helpers.ts
│   │   │   │   │   │   │       │       ├── hooks/
│   │   │   │   │   │   │       │       │   └── useMarketplaceUpdate.ts
│   │   │   │   │   │   │       │       └── useNewAgentLibraryView.ts
│   │   │   │   │   │   │       ├── loading.tsx
│   │   │   │   │   │   │       └── page.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── FlyingHeart/
│   │   │   │   │   │   │   │   └── FlyingHeart.tsx
│   │   │   │   │   │   │   ├── JumpBackIn/
│   │   │   │   │   │   │   │   ├── JumpBackIn.tsx
│   │   │   │   │   │   │   │   └── useJumpBackIn.ts
│   │   │   │   │   │   │   ├── LazyEmojiPicker.tsx
│   │   │   │   │   │   │   ├── LibraryActionHeader/
│   │   │   │   │   │   │   │   └── LibraryActionHeader.tsx
│   │   │   │   │   │   │   ├── LibraryActionSubHeader/
│   │   │   │   │   │   │   │   └── LibraryActionSubHeader.tsx
│   │   │   │   │   │   │   ├── LibraryAgentCard/
│   │   │   │   │   │   │   │   ├── LibraryAgentCard.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── AgentCardMenu.tsx
│   │   │   │   │   │   │   │   │   └── FavoriteButton.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useLibraryAgentCard.ts
│   │   │   │   │   │   │   ├── LibraryAgentList/
│   │   │   │   │   │   │   │   ├── LibraryAgentList.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useLibraryAgentList.ts
│   │   │   │   │   │   │   ├── LibraryFolder/
│   │   │   │   │   │   │   │   ├── FolderIcon.tsx
│   │   │   │   │   │   │   │   └── LibraryFolder.tsx
│   │   │   │   │   │   │   ├── LibraryFolderCreationDialog/
│   │   │   │   │   │   │   │   └── LibraryFolderCreationDialog.tsx
│   │   │   │   │   │   │   ├── LibraryFolderDeleteDialog/
│   │   │   │   │   │   │   │   └── LibraryFolderDeleteDialog.tsx
│   │   │   │   │   │   │   ├── LibraryFolderEditDialog/
│   │   │   │   │   │   │   │   └── LibraryFolderEditDialog.tsx
│   │   │   │   │   │   │   ├── LibraryImportDialog/
│   │   │   │   │   │   │   │   ├── LibraryImportDialog.tsx
│   │   │   │   │   │   │   │   └── components/
│   │   │   │   │   │   │   │       ├── AgentUploadTab/
│   │   │   │   │   │   │   │       │   └── AgentUploadTab.tsx
│   │   │   │   │   │   │   │       └── ExternalWorkflowTab/
│   │   │   │   │   │   │   │           ├── ExternalWorkflowTab.tsx
│   │   │   │   │   │   │   │           ├── fetchWorkflowFromUrl.ts
│   │   │   │   │   │   │   │           └── useExternalWorkflowTab.ts
│   │   │   │   │   │   │   ├── LibrarySearchBar/
│   │   │   │   │   │   │   │   ├── LibrarySearchBar.tsx
│   │   │   │   │   │   │   │   └── useLibrarySearchbar.tsx
│   │   │   │   │   │   │   ├── LibrarySortMenu/
│   │   │   │   │   │   │   │   ├── LibrarySortMenu.tsx
│   │   │   │   │   │   │   │   └── useLibrarySortMenu.ts
│   │   │   │   │   │   │   ├── LibrarySubSection/
│   │   │   │   │   │   │   │   └── LibrarySubSection.tsx
│   │   │   │   │   │   │   ├── LibraryUploadAgentDialog/
│   │   │   │   │   │   │   │   ├── LibraryUploadAgentDialog.tsx
│   │   │   │   │   │   │   │   └── useLibraryUploadAgentDialog.ts
│   │   │   │   │   │   │   ├── MoveToFolderDialog/
│   │   │   │   │   │   │   │   └── MoveToFolderDialog.tsx
│   │   │   │   │   │   │   ├── folder-constants.ts
│   │   │   │   │   │   │   └── useLibraryListPage.ts
│   │   │   │   │   │   ├── context/
│   │   │   │   │   │   │   └── FavoriteAnimationContext.tsx
│   │   │   │   │   │   ├── hooks/
│   │   │   │   │   │   │   └── useFavoriteAgents.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── login/
│   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   └── LoadingLogin.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── useLoginPage.ts
│   │   │   │   │   ├── marketplace/
│   │   │   │   │   │   ├── agent/
│   │   │   │   │   │   │   └── [creator]/
│   │   │   │   │   │   │       └── [slug]/
│   │   │   │   │   │   │           └── page.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AddToLibraryButton/
│   │   │   │   │   │   │   │   └── AddToLibraryButton.tsx
│   │   │   │   │   │   │   ├── AgentImageItem/
│   │   │   │   │   │   │   │   ├── AgentImageItem.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useAgentImageItem.ts
│   │   │   │   │   │   │   ├── AgentImages/
│   │   │   │   │   │   │   │   ├── AgentImage.tsx
│   │   │   │   │   │   │   │   └── useAgentImage.ts
│   │   │   │   │   │   │   ├── AgentInfo/
│   │   │   │   │   │   │   │   ├── AgentInfo.tsx
│   │   │   │   │   │   │   │   └── useAgentInfo.ts
│   │   │   │   │   │   │   ├── AgentPageLoading.tsx
│   │   │   │   │   │   │   ├── AgentsSection/
│   │   │   │   │   │   │   │   ├── AgentsSection.tsx
│   │   │   │   │   │   │   │   └── useAgentsSection.ts
│   │   │   │   │   │   │   ├── BecomeACreator/
│   │   │   │   │   │   │   │   └── BecomeACreator.tsx
│   │   │   │   │   │   │   ├── CreatorCard/
│   │   │   │   │   │   │   │   ├── CreatorCard.tsx
│   │   │   │   │   │   │   │   └── helper.ts
│   │   │   │   │   │   │   ├── CreatorInfoCard/
│   │   │   │   │   │   │   │   └── CreatorInfoCard.tsx
│   │   │   │   │   │   │   ├── CreatorLinks/
│   │   │   │   │   │   │   │   └── CreatorLinks.tsx
│   │   │   │   │   │   │   ├── CreatorPageLoading.tsx
│   │   │   │   │   │   │   ├── FeaturedAgentCard/
│   │   │   │   │   │   │   │   └── FeaturedAgentCard.tsx
│   │   │   │   │   │   │   ├── FeaturedCreators/
│   │   │   │   │   │   │   │   ├── FeaturedCreators.tsx
│   │   │   │   │   │   │   │   └── useFeaturedCreators.ts
│   │   │   │   │   │   │   ├── FeaturedSection/
│   │   │   │   │   │   │   │   ├── FeaturedSection.tsx
│   │   │   │   │   │   │   │   └── useFeaturedSection.ts
│   │   │   │   │   │   │   ├── FilterChips/
│   │   │   │   │   │   │   │   ├── FilterChips.tsx
│   │   │   │   │   │   │   │   └── useFilterChips.ts
│   │   │   │   │   │   │   ├── HeroSection/
│   │   │   │   │   │   │   │   ├── HeroSection.tsx
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useHeroSection.ts
│   │   │   │   │   │   │   ├── MainAgentPage/
│   │   │   │   │   │   │   │   ├── MainAgentPage.tsx
│   │   │   │   │   │   │   │   └── useMainAgentPage.ts
│   │   │   │   │   │   │   ├── MainMarketplacePage/
│   │   │   │   │   │   │   │   ├── MainMarketplacePage.tsx
│   │   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   │   └── main.test.tsx
│   │   │   │   │   │   │   │   └── useMainMarketplacePage.ts
│   │   │   │   │   │   │   ├── MainMarketplacePageLoading.tsx
│   │   │   │   │   │   │   ├── MainSearchResultPageLoading.tsx
│   │   │   │   │   │   │   ├── SearchBar/
│   │   │   │   │   │   │   │   ├── SearchBar.tsx
│   │   │   │   │   │   │   │   └── useSearchBar.ts
│   │   │   │   │   │   │   └── StoreCard/
│   │   │   │   │   │   │       └── StoreCard.tsx
│   │   │   │   │   │   ├── creator/
│   │   │   │   │   │   │   └── [creator]/
│   │   │   │   │   │   │       ├── components/
│   │   │   │   │   │   │       │   └── MainCreatorPage/
│   │   │   │   │   │   │       │       ├── MainCreatorPage.tsx
│   │   │   │   │   │   │       │       └── useMainCreatorPage.ts
│   │   │   │   │   │   │       └── page.tsx
│   │   │   │   │   │   ├── loading.tsx
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── search/
│   │   │   │   │   │       ├── components/
│   │   │   │   │   │       │   └── MainSearchResultPage/
│   │   │   │   │   │       │       ├── MainSearchResultPage.tsx
│   │   │   │   │   │       │       └── useMainSearchResultPage.ts
│   │   │   │   │   │       └── page.tsx
│   │   │   │   │   ├── profile/
│   │   │   │   │   │   └── (user)/
│   │   │   │   │   │       ├── ProfileLoading.tsx
│   │   │   │   │   │       ├── api-keys/
│   │   │   │   │   │       │   ├── components/
│   │   │   │   │   │       │   │   ├── APIKeySection/
│   │   │   │   │   │       │   │   │   ├── APIKeySection.tsx
│   │   │   │   │   │       │   │   │   └── useAPISection.ts
│   │   │   │   │   │       │   │   └── APIKeysModals/
│   │   │   │   │   │       │   │       ├── APIKeysModals.tsx
│   │   │   │   │   │       │   │       └── useAPIkeysModals.ts
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── credits/
│   │   │   │   │   │       │   ├── RefundModal.tsx
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── components/
│   │   │   │   │   │       │   │   ├── AgentTable/
│   │   │   │   │   │       │   │   │   └── AgentTable.tsx
│   │   │   │   │   │       │   │   ├── AgentTableCard/
│   │   │   │   │   │       │   │   │   └── AgentTableCard.tsx
│   │   │   │   │   │       │   │   ├── AgentTableRow/
│   │   │   │   │   │       │   │   │   ├── AgentTableRow.tsx
│   │   │   │   │   │       │   │   │   └── useAgentTableRow.ts
│   │   │   │   │   │       │   │   └── MainDashboardPage/
│   │   │   │   │   │       │   │       ├── MainDashboardPage.tsx
│   │   │   │   │   │       │   │       ├── components/
│   │   │   │   │   │       │   │       │   ├── EmptySubmissions.tsx
│   │   │   │   │   │       │   │       │   ├── SubmissionsLoading.tsx
│   │   │   │   │   │       │   │       │   └── SumbmissionLoadError.tsx
│   │   │   │   │   │       │   │       └── useMainDashboardPage.ts
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── integrations/
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── layout.tsx
│   │   │   │   │   │       ├── oauth-apps/
│   │   │   │   │   │       │   ├── components/
│   │   │   │   │   │       │   │   ├── OAuthAppsSection.tsx
│   │   │   │   │   │       │   │   └── useOAuthApps.ts
│   │   │   │   │   │       │   └── page.tsx
│   │   │   │   │   │       ├── page.tsx
│   │   │   │   │   │       └── settings/
│   │   │   │   │   │           ├── components/
│   │   │   │   │   │           │   └── SettingsForm/
│   │   │   │   │   │           │       ├── SettingsForm.tsx
│   │   │   │   │   │           │       └── components/
│   │   │   │   │   │           │           ├── EmailForm/
│   │   │   │   │   │           │           │   ├── EmailForm.tsx
│   │   │   │   │   │           │           │   ├── actions.ts
│   │   │   │   │   │           │           │   └── useEmailForm.ts
│   │   │   │   │   │           │           ├── NotificationForm/
│   │   │   │   │   │           │           │   ├── NotificationForm.tsx
│   │   │   │   │   │           │           │   └── useNotificationForm.ts
│   │   │   │   │   │           │           └── TimezoneForm/
│   │   │   │   │   │           │               ├── TimezoneForm.tsx
│   │   │   │   │   │           │               ├── helpers.ts
│   │   │   │   │   │           │               └── useTimezoneForm.ts
│   │   │   │   │   │           ├── loading.tsx
│   │   │   │   │   │           ├── page.tsx
│   │   │   │   │   │           └── useTimezoneDetection.ts
│   │   │   │   │   ├── reset-password/
│   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   └── page.tsx
│   │   │   │   │   ├── signup/
│   │   │   │   │   │   ├── actions.ts
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   └── LoadingSignup.tsx
│   │   │   │   │   │   ├── page.tsx
│   │   │   │   │   │   └── useSignupPage.ts
│   │   │   │   │   └── unauthorized/
│   │   │   │   │       └── page.tsx
│   │   │   │   ├── api/
│   │   │   │   │   ├── __generated__/
│   │   │   │   │   │   └── models/
│   │   │   │   │   │       ├── blockOutputResponse.ts
│   │   │   │   │   │       └── graphExecutionMeta.ts
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── callback/
│   │   │   │   │   │   │   └── reset-password/
│   │   │   │   │   │   │       └── route.ts
│   │   │   │   │   │   ├── provider/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   ├── user/
│   │   │   │   │   │   │   └── route.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── chat/
│   │   │   │   │   │   ├── sessions/
│   │   │   │   │   │   │   └── [sessionId]/
│   │   │   │   │   │   │       └── stream/
│   │   │   │   │   │   │           └── route.ts
│   │   │   │   │   │   └── sse-helpers.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── mutators/
│   │   │   │   │   │   ├── custom-mutator.ts
│   │   │   │   │   │   └── date-transformer.ts
│   │   │   │   │   ├── openapi.json
│   │   │   │   │   ├── proxy/
│   │   │   │   │   │   └── [...path]/
│   │   │   │   │   │       └── route.ts
│   │   │   │   │   ├── transcribe/
│   │   │   │   │   │   └── route.ts
│   │   │   │   │   ├── transformers/
│   │   │   │   │   │   └── fix-tags.mjs
│   │   │   │   │   └── workspace/
│   │   │   │   │       └── files/
│   │   │   │   │           └── upload/
│   │   │   │   │               └── route.ts
│   │   │   │   ├── error.tsx
│   │   │   │   ├── global-error.tsx
│   │   │   │   ├── globals.css
│   │   │   │   ├── layout.tsx
│   │   │   │   ├── page.tsx
│   │   │   │   └── providers.tsx
│   │   │   ├── components/
│   │   │   │   ├── __legacy__/
│   │   │   │   │   ├── AgentImageItem.tsx
│   │   │   │   │   ├── AgentImages.tsx
│   │   │   │   │   ├── BecomeACreator.tsx
│   │   │   │   │   ├── Button.tsx
│   │   │   │   │   ├── CreatorCard.tsx
│   │   │   │   │   ├── CreatorInfoCard.tsx
│   │   │   │   │   ├── CreatorLinks.tsx
│   │   │   │   │   ├── FeaturedAgentCard.tsx
│   │   │   │   │   ├── FilterChips.tsx
│   │   │   │   │   ├── ProfileInfoForm.tsx
│   │   │   │   │   ├── RatingCard.tsx
│   │   │   │   │   ├── SearchBar.tsx
│   │   │   │   │   ├── SearchFilterChips.tsx
│   │   │   │   │   ├── Sidebar.tsx
│   │   │   │   │   ├── SmartImage.tsx
│   │   │   │   │   ├── SortDropdown.tsx
│   │   │   │   │   ├── Status.tsx
│   │   │   │   │   ├── StoreCard.tsx
│   │   │   │   │   ├── ThemeToggle.tsx
│   │   │   │   │   ├── action-button-group.tsx
│   │   │   │   │   ├── composite/
│   │   │   │   │   │   ├── AgentsSection.tsx
│   │   │   │   │   │   ├── FeaturedCreators.tsx
│   │   │   │   │   │   ├── FeaturedSection.tsx
│   │   │   │   │   │   └── HeroSection.tsx
│   │   │   │   │   ├── delete-confirm-dialog.tsx
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── ui/
│   │   │   │   │       ├── badge.tsx
│   │   │   │   │       ├── button.tsx
│   │   │   │   │       ├── calendar.tsx
│   │   │   │   │       ├── card.tsx
│   │   │   │   │       ├── carousel.tsx
│   │   │   │   │       ├── checkbox.tsx
│   │   │   │   │       ├── collapsible.tsx
│   │   │   │   │       ├── command.tsx
│   │   │   │   │       ├── data-table.tsx
│   │   │   │   │       ├── dialog.tsx
│   │   │   │   │       ├── dropdown-menu.tsx
│   │   │   │   │       ├── form.tsx
│   │   │   │   │       ├── icons.tsx
│   │   │   │   │       ├── input.tsx
│   │   │   │   │       ├── label.tsx
│   │   │   │   │       ├── loading.tsx
│   │   │   │   │       ├── multiselect.tsx
│   │   │   │   │       ├── pagination-controls.tsx
│   │   │   │   │       ├── popover.tsx
│   │   │   │   │       ├── radio-group.tsx
│   │   │   │   │       ├── render.tsx
│   │   │   │   │       ├── scroll-area.tsx
│   │   │   │   │       ├── select.tsx
│   │   │   │   │       ├── separator.tsx
│   │   │   │   │       ├── sheet.tsx
│   │   │   │   │       ├── skeleton.tsx
│   │   │   │   │       ├── table.tsx
│   │   │   │   │       ├── tabs.tsx
│   │   │   │   │       └── textarea.tsx
│   │   │   │   ├── ai-elements/
│   │   │   │   │   ├── conversation.tsx
│   │   │   │   │   ├── message.stories.tsx
│   │   │   │   │   ├── message.tsx
│   │   │   │   │   └── prompt-input.tsx
│   │   │   │   ├── atoms/
│   │   │   │   │   ├── Avatar/
│   │   │   │   │   │   ├── Avatar.stories.tsx
│   │   │   │   │   │   └── Avatar.tsx
│   │   │   │   │   ├── Badge/
│   │   │   │   │   │   ├── Badge.stories.tsx
│   │   │   │   │   │   └── Badge.tsx
│   │   │   │   │   ├── Button/
│   │   │   │   │   │   ├── Button.stories.tsx
│   │   │   │   │   │   ├── Button.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Card/
│   │   │   │   │   │   └── Card.tsx
│   │   │   │   │   ├── DateInput/
│   │   │   │   │   │   └── DateInput.tsx
│   │   │   │   │   ├── DateTimeInput/
│   │   │   │   │   │   └── DateTimeInput.tsx
│   │   │   │   │   ├── FileInput/
│   │   │   │   │   │   ├── FileInput.stories.tsx
│   │   │   │   │   │   ├── FileInput.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Input/
│   │   │   │   │   │   ├── Input.stories.tsx
│   │   │   │   │   │   ├── Input.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useInput.ts
│   │   │   │   │   ├── LLMItem/
│   │   │   │   │   │   ├── LLMItem.stories.tsx
│   │   │   │   │   │   └── LLMItem.tsx
│   │   │   │   │   ├── Link/
│   │   │   │   │   │   ├── Link.stories.tsx
│   │   │   │   │   │   └── Link.tsx
│   │   │   │   │   ├── LoadingSpinner/
│   │   │   │   │   │   ├── LoadingSpinner.stories.tsx
│   │   │   │   │   │   └── LoadingSpinner.tsx
│   │   │   │   │   ├── OverflowText/
│   │   │   │   │   │   ├── OverflowText.stories.tsx
│   │   │   │   │   │   └── OverflowText.tsx
│   │   │   │   │   ├── Progress/
│   │   │   │   │   │   ├── Progress.stories.tsx
│   │   │   │   │   │   └── Progress.tsx
│   │   │   │   │   ├── Select/
│   │   │   │   │   │   ├── Select.stories.tsx
│   │   │   │   │   │   └── Select.tsx
│   │   │   │   │   ├── Skeleton/
│   │   │   │   │   │   ├── Skeleton.tsx
│   │   │   │   │   │   └── skeleton.stories.tsx
│   │   │   │   │   ├── Switch/
│   │   │   │   │   │   ├── Switch.stories.tsx
│   │   │   │   │   │   └── Switch.tsx
│   │   │   │   │   ├── Text/
│   │   │   │   │   │   ├── Text.stories.tsx
│   │   │   │   │   │   ├── Text.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── TimeInput/
│   │   │   │   │   │   └── TimeInput.tsx
│   │   │   │   │   └── Tooltip/
│   │   │   │   │       ├── BaseTooltip.tsx
│   │   │   │   │       └── Tooltip.stories.tsx
│   │   │   │   ├── auth/
│   │   │   │   │   ├── AuthCard.tsx
│   │   │   │   │   ├── AuthFeedback.tsx
│   │   │   │   │   ├── EmailNotAllowedModal.tsx
│   │   │   │   │   ├── ExpiredLinkMessage.tsx
│   │   │   │   │   ├── GoogleOAuthButton.tsx
│   │   │   │   │   ├── MobileWarningBanner.tsx
│   │   │   │   │   ├── PasswordInput.tsx
│   │   │   │   │   ├── WaitlistErrorContent.tsx
│   │   │   │   │   └── help-item.tsx
│   │   │   │   ├── contextual/
│   │   │   │   │   ├── Chat/
│   │   │   │   │   │   └── components/
│   │   │   │   │   │       └── ChatMessage/
│   │   │   │   │   │           └── useTextToSpeech.ts
│   │   │   │   │   ├── CredentialsInput/
│   │   │   │   │   │   ├── CredentialsInput.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── APIKeyCredentialsModal/
│   │   │   │   │   │   │   │   ├── APIKeyCredentialsModal.tsx
│   │   │   │   │   │   │   │   └── useAPIKeyCredentialsModal.ts
│   │   │   │   │   │   │   ├── CredentialRow/
│   │   │   │   │   │   │   │   └── CredentialRow.tsx
│   │   │   │   │   │   │   ├── CredentialTypeSelector/
│   │   │   │   │   │   │   │   └── CredentialTypeSelector.tsx
│   │   │   │   │   │   │   ├── CredentialsAccordionView/
│   │   │   │   │   │   │   │   └── CredentialsAccordionView.tsx
│   │   │   │   │   │   │   ├── CredentialsFlatView/
│   │   │   │   │   │   │   │   └── CredentialsFlatView.tsx
│   │   │   │   │   │   │   ├── CredentialsGroupedView/
│   │   │   │   │   │   │   │   ├── CredentialsGroupedView.tsx
│   │   │   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   │   │   ├── CredentialsSelect/
│   │   │   │   │   │   │   │   └── CredentialsSelect.tsx
│   │   │   │   │   │   │   ├── DeleteConfirmationModal/
│   │   │   │   │   │   │   │   └── DeleteConfirmationModal.tsx
│   │   │   │   │   │   │   ├── HotScopedCredentialsModal/
│   │   │   │   │   │   │   │   └── HotScopedCredentialsModal.tsx
│   │   │   │   │   │   │   ├── OAuthWaitingModal/
│   │   │   │   │   │   │   │   └── OAuthWaitingModal.tsx
│   │   │   │   │   │   │   └── PasswordCredentialsModal/
│   │   │   │   │   │   │       └── PasswordCredentialsModal.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useCredentialsInput.ts
│   │   │   │   │   ├── CronScheduler/
│   │   │   │   │   │   ├── cron-scheduler-dialog.tsx
│   │   │   │   │   │   └── cron-scheduler.tsx
│   │   │   │   │   ├── EditAgentModal/
│   │   │   │   │   │   ├── EditAgentModal.tsx
│   │   │   │   │   │   └── components/
│   │   │   │   │   │       ├── EditAgentForm.tsx
│   │   │   │   │   │       └── useEditAgentForm.ts
│   │   │   │   │   ├── GoogleDrivePicker/
│   │   │   │   │   │   ├── GoogleDrivePicker.tsx
│   │   │   │   │   │   ├── GoogleDrivePickerInput.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── useGoogleDrivePicker.ts
│   │   │   │   │   ├── InfiniteScroll/
│   │   │   │   │   │   ├── InfiniteScroll.tsx
│   │   │   │   │   │   └── useInfiniteScroll.ts
│   │   │   │   │   ├── OutputRenderers/
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── OutputActions.tsx
│   │   │   │   │   │   │   └── OutputItem.tsx
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── renderers/
│   │   │   │   │   │   │   ├── AudioRenderer.test.ts
│   │   │   │   │   │   │   ├── AudioRenderer.tsx
│   │   │   │   │   │   │   ├── CodeRenderer.tsx
│   │   │   │   │   │   │   ├── ImageRenderer.tsx
│   │   │   │   │   │   │   ├── JSONRenderer.tsx
│   │   │   │   │   │   │   ├── LinkRenderer.test.ts
│   │   │   │   │   │   │   ├── LinkRenderer.tsx
│   │   │   │   │   │   │   ├── MarkdownRenderer.tsx
│   │   │   │   │   │   │   ├── TextRenderer.tsx
│   │   │   │   │   │   │   ├── VideoRenderer.test.ts
│   │   │   │   │   │   │   ├── VideoRenderer.tsx
│   │   │   │   │   │   │   ├── WorkspaceFileRenderer.test.ts
│   │   │   │   │   │   │   └── WorkspaceFileRenderer.tsx
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── utils/
│   │   │   │   │   │       ├── copy.ts
│   │   │   │   │   │       └── download.ts
│   │   │   │   │   ├── PublishAgentModal/
│   │   │   │   │   │   ├── PublishAgentModal.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── AgentInfoStep/
│   │   │   │   │   │   │   │   ├── AgentInfoStep.tsx
│   │   │   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   │   │   ├── ThumbnailImages.tsx
│   │   │   │   │   │   │   │   │   └── useThumbnailImages.ts
│   │   │   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   │   │   └── useAgentInfoStep.ts
│   │   │   │   │   │   │   ├── AgentReviewStep.tsx
│   │   │   │   │   │   │   ├── AgentSelectStep/
│   │   │   │   │   │   │   │   ├── AgentSelectStep.tsx
│   │   │   │   │   │   │   │   └── useAgentSelectStep.ts
│   │   │   │   │   │   │   ├── PublishAuthPrompt.tsx
│   │   │   │   │   │   │   └── StepHeader.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── usePublishAgentModal.ts
│   │   │   │   │   ├── RunAgentInputs/
│   │   │   │   │   │   ├── RunAgentInputs.tsx
│   │   │   │   │   │   └── useRunAgentInputs.ts
│   │   │   │   │   └── marketplaceHelpers.ts
│   │   │   │   ├── layout/
│   │   │   │   │   └── Navbar/
│   │   │   │   │       ├── Navbar.tsx
│   │   │   │   │       ├── components/
│   │   │   │   │       │   ├── AccountMenu/
│   │   │   │   │       │   │   ├── AccountMenu.tsx
│   │   │   │   │       │   │   └── components/
│   │   │   │   │       │   │       └── AccountLogoutOption.tsx
│   │   │   │   │       │   ├── AgentActivityDropdown/
│   │   │   │   │       │   │   ├── AgentActivityDropdown.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   ├── ActivityDropdown/
│   │   │   │   │       │   │   │   │   ├── ActivityDropdown.tsx
│   │   │   │   │       │   │   │   │   ├── helpers.ts
│   │   │   │   │       │   │   │   │   ├── styles.module.css
│   │   │   │   │       │   │   │   │   └── useActivityDropdown.ts
│   │   │   │   │       │   │   │   └── ActivityItem.tsx
│   │   │   │   │       │   │   ├── helpers.tsx
│   │   │   │   │       │   │   └── useAgentActivityDropdown.ts
│   │   │   │   │       │   ├── FeedbackButton.tsx
│   │   │   │   │       │   ├── LoginButton.tsx
│   │   │   │   │       │   ├── MenuIcon/
│   │   │   │   │       │   │   └── MenuIcon.tsx
│   │   │   │   │       │   ├── MobileNavbar/
│   │   │   │   │       │   │   ├── MobileNavBar.tsx
│   │   │   │   │       │   │   └── components/
│   │   │   │   │       │   │       ├── MobileNavbarLogoutItem.tsx
│   │   │   │   │       │   │       └── MobileNavbarMenuItem.tsx
│   │   │   │   │       │   ├── NavbarLink.tsx
│   │   │   │   │       │   ├── NavbarLoading.tsx
│   │   │   │   │       │   ├── PreviewBanner/
│   │   │   │   │       │   │   └── PreviewBanner.tsx
│   │   │   │   │       │   └── Wallet/
│   │   │   │   │       │       ├── Wallet.tsx
│   │   │   │   │       │       └── components/
│   │   │   │   │       │           ├── WalletRefill.tsx
│   │   │   │   │       │           └── WalletTaskGroups.tsx
│   │   │   │   │       ├── helpers.tsx
│   │   │   │   │       └── useNavbar.ts
│   │   │   │   ├── molecules/
│   │   │   │   │   ├── Accordion/
│   │   │   │   │   │   ├── Accordion.stories.tsx
│   │   │   │   │   │   └── Accordion.tsx
│   │   │   │   │   ├── Alert/
│   │   │   │   │   │   ├── Alert.stories.tsx
│   │   │   │   │   │   └── Alert.tsx
│   │   │   │   │   ├── Breadcrumbs/
│   │   │   │   │   │   ├── Breadcrumbs.stories.tsx
│   │   │   │   │   │   └── Breadcrumbs.tsx
│   │   │   │   │   ├── Collapsible/
│   │   │   │   │   │   ├── Collapsible.stories.tsx
│   │   │   │   │   │   └── Collapsible.tsx
│   │   │   │   │   ├── Confetti/
│   │   │   │   │   │   ├── Confetti.stories.tsx
│   │   │   │   │   │   └── Confetti.tsx
│   │   │   │   │   ├── CookieConsentBanner/
│   │   │   │   │   │   ├── CookieConsentBanner.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   └── CookieSettingsModal/
│   │   │   │   │   │   │       ├── CookieSettingsModal.tsx
│   │   │   │   │   │   │       └── useCookieSettingsModal.ts
│   │   │   │   │   │   ├── useCookieConsent.ts
│   │   │   │   │   │   └── useCookieConsentBanner.ts
│   │   │   │   │   ├── Dialog/
│   │   │   │   │   │   ├── Dialog.stories.tsx
│   │   │   │   │   │   ├── Dialog.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── BaseContent.tsx
│   │   │   │   │   │   │   ├── BaseFooter.tsx
│   │   │   │   │   │   │   ├── BaseTrigger.tsx
│   │   │   │   │   │   │   ├── DialogWrap.tsx
│   │   │   │   │   │   │   ├── DrawerWrap.tsx
│   │   │   │   │   │   │   └── styles.ts
│   │   │   │   │   │   ├── useDialogCtx.ts
│   │   │   │   │   │   └── useDialogInternal.ts
│   │   │   │   │   ├── DropdownMenu/
│   │   │   │   │   │   ├── DropdownMenu.stories.tsx
│   │   │   │   │   │   └── DropdownMenu.tsx
│   │   │   │   │   ├── ErrorBoundary/
│   │   │   │   │   │   └── ErrorBoundary.tsx
│   │   │   │   │   ├── ErrorCard/
│   │   │   │   │   │   ├── ErrorCard.stories.tsx
│   │   │   │   │   │   ├── ErrorCard.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── ActionButtons.tsx
│   │   │   │   │   │   │   ├── CardWrapper.tsx
│   │   │   │   │   │   │   ├── ErrorHeader.tsx
│   │   │   │   │   │   │   ├── ErrorMessage.tsx
│   │   │   │   │   │   │   └── LoadingState.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Form/
│   │   │   │   │   │   └── Form.tsx
│   │   │   │   │   ├── InfiniteList/
│   │   │   │   │   │   ├── InfiniteList.stories.tsx
│   │   │   │   │   │   └── InfiniteList.tsx
│   │   │   │   │   ├── InformationTooltip/
│   │   │   │   │   │   ├── InformationTooltip.stories.tsx
│   │   │   │   │   │   └── InformationTooltip.tsx
│   │   │   │   │   ├── MultiToggle/
│   │   │   │   │   │   ├── MultiToggle.stories.tsx
│   │   │   │   │   │   └── MultiToggle.tsx
│   │   │   │   │   ├── Popover/
│   │   │   │   │   │   └── Popover.tsx
│   │   │   │   │   ├── ScrollableTabs/
│   │   │   │   │   │   ├── ScrollableTabs.stories.tsx
│   │   │   │   │   │   ├── ScrollableTabs.tsx
│   │   │   │   │   │   ├── components/
│   │   │   │   │   │   │   ├── ScrollableTabsContent.tsx
│   │   │   │   │   │   │   ├── ScrollableTabsList.tsx
│   │   │   │   │   │   │   └── ScrollableTabsTrigger.tsx
│   │   │   │   │   │   ├── context.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useScrollableTabs.ts
│   │   │   │   │   ├── SecondaryMenu/
│   │   │   │   │   │   ├── SecondaryMenu.stories.tsx
│   │   │   │   │   │   └── SecondaryMenu.tsx
│   │   │   │   │   ├── ShowMore/
│   │   │   │   │   │   ├── ShowMore.stories.tsx
│   │   │   │   │   │   ├── ShowMore.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── ShowMoreText/
│   │   │   │   │   │   ├── ShowMoreText.stories.tsx
│   │   │   │   │   │   ├── ShowMoreText.tsx
│   │   │   │   │   │   └── helpers.ts
│   │   │   │   │   ├── Table/
│   │   │   │   │   │   ├── Table.stories.tsx
│   │   │   │   │   │   ├── Table.tsx
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── useTable.ts
│   │   │   │   │   ├── TabsLine/
│   │   │   │   │   │   ├── TabsLine.stories.tsx
│   │   │   │   │   │   └── TabsLine.tsx
│   │   │   │   │   ├── TallyPoup/
│   │   │   │   │   │   ├── TallyPopup.tsx
│   │   │   │   │   │   └── useTallyPopup.ts
│   │   │   │   │   ├── TimePicker/
│   │   │   │   │   │   ├── TimePicker.stories.tsx
│   │   │   │   │   │   └── TimePicker.tsx
│   │   │   │   │   ├── Toast/
│   │   │   │   │   │   ├── styles.module.css
│   │   │   │   │   │   ├── toast.stories.tsx
│   │   │   │   │   │   ├── toaster.tsx
│   │   │   │   │   │   └── use-toast.tsx
│   │   │   │   │   ├── file-tree.stories.tsx
│   │   │   │   │   └── file-tree.tsx
│   │   │   │   ├── monitor/
│   │   │   │   │   └── SentryUserTracker.tsx
│   │   │   │   ├── organisms/
│   │   │   │   │   ├── FloatingReviewsPanel/
│   │   │   │   │   │   └── FloatingReviewsPanel.tsx
│   │   │   │   │   ├── PendingReviewCard/
│   │   │   │   │   │   └── PendingReviewCard.tsx
│   │   │   │   │   └── PendingReviewsList/
│   │   │   │   │       └── PendingReviewsList.tsx
│   │   │   │   ├── overview.stories.tsx
│   │   │   │   ├── renderers/
│   │   │   │   │   └── InputRenderer/
│   │   │   │   │       ├── FormRenderer.tsx
│   │   │   │   │       ├── base/
│   │   │   │   │       │   ├── anyof/
│   │   │   │   │       │   │   ├── AnyOfField.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   └── AnyOfFieldTitle.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── useAnyOfField.ts
│   │   │   │   │       │   ├── array/
│   │   │   │   │       │   │   ├── ArrayFieldItemTemplate.tsx
│   │   │   │   │       │   │   ├── ArrayFieldTemplate.tsx
│   │   │   │   │       │   │   ├── ArraySchemaField.tsx
│   │   │   │   │       │   │   ├── context/
│   │   │   │   │       │   │   │   └── array-item-context.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── index.ts
│   │   │   │   │       │   ├── base-registry.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── object/
│   │   │   │   │       │   │   ├── ObjectFieldTemplate.tsx
│   │   │   │   │       │   │   ├── OptionalDataControlsTemplate.tsx
│   │   │   │   │       │   │   ├── WrapIfAdditionalTemplate.tsx
│   │   │   │   │       │   │   └── index.ts
│   │   │   │   │       │   ├── oneof/
│   │   │   │   │       │   │   └── OneOfField.tsx
│   │   │   │   │       │   └── standard/
│   │   │   │   │       │       ├── DescriptionField.tsx
│   │   │   │   │       │       ├── FieldError.tsx
│   │   │   │   │       │       ├── FieldTemplate.tsx
│   │   │   │   │       │       ├── TitleField.tsx
│   │   │   │   │       │       ├── buttons/
│   │   │   │   │       │       │   ├── AddButton.tsx
│   │   │   │   │       │       │   ├── IconButton.tsx
│   │   │   │   │       │       │   └── index.ts
│   │   │   │   │       │       ├── errors/
│   │   │   │   │       │       │   ├── ErrorList.tsx
│   │   │   │   │       │       │   └── index.ts
│   │   │   │   │       │       ├── helpers.ts
│   │   │   │   │       │       ├── index.ts
│   │   │   │   │       │       └── widgets/
│   │   │   │   │       │           ├── CheckboxInput/
│   │   │   │   │       │           │   ├── CheckBoxWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── DateInput/
│   │   │   │   │       │           │   ├── DateWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── DateTimeInput/
│   │   │   │   │       │           │   ├── DateTimeWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── FileInput/
│   │   │   │   │       │           │   ├── FileWidget.tsx
│   │   │   │   │       │           │   ├── index.ts
│   │   │   │   │       │           │   └── useWorkspaceUpload.ts
│   │   │   │   │       │           ├── GoogleDrivePicker/
│   │   │   │   │       │           │   ├── GoogleDrivePicketWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── SelectInput/
│   │   │   │   │       │           │   ├── SelectWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── TextInput/
│   │   │   │   │       │           │   ├── TextInputExpanderModal.tsx
│   │   │   │   │       │           │   ├── TextWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           ├── TimeInput/
│   │   │   │   │       │           │   ├── TimeWidget.tsx
│   │   │   │   │       │           │   └── index.ts
│   │   │   │   │       │           └── index.ts
│   │   │   │   │       ├── constants.ts
│   │   │   │   │       ├── custom/
│   │   │   │   │       │   ├── CredentialField/
│   │   │   │   │       │   │   ├── CredentialField.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   └── CredentialFieldTitle.tsx
│   │   │   │   │       │   │   └── helpers.ts
│   │   │   │   │       │   ├── GoogleDrivePickerField/
│   │   │   │   │       │   │   └── GoogleDrivePickerField.tsx
│   │   │   │   │       │   ├── JsonTextField/
│   │   │   │   │       │   │   ├── JsonTextField.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── useJsonTextField.ts
│   │   │   │   │       │   ├── LlmModelField/
│   │   │   │   │       │   │   ├── LlmModelField.tsx
│   │   │   │   │       │   │   ├── components/
│   │   │   │   │       │   │   │   ├── LlmIcon.tsx
│   │   │   │   │       │   │   │   ├── LlmMenuHeader.tsx
│   │   │   │   │       │   │   │   ├── LlmMenuItem.tsx
│   │   │   │   │       │   │   │   ├── LlmModelPicker.tsx
│   │   │   │   │       │   │   │   └── LlmPriceTier.tsx
│   │   │   │   │       │   │   ├── helpers.ts
│   │   │   │   │       │   │   └── types.ts
│   │   │   │   │       │   ├── MultiSelectField/
│   │   │   │   │       │   │   ├── MultiSelectField.tsx
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── useMultiSelectField.ts
│   │   │   │   │       │   ├── TableField/
│   │   │   │   │       │   │   └── TableField.tsx
│   │   │   │   │       │   └── custom-registry.ts
│   │   │   │   │       ├── docs/
│   │   │   │   │       │   └── HEIRARCHY.md
│   │   │   │   │       ├── helpers.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── registry/
│   │   │   │   │       │   ├── Form.tsx
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── types.ts
│   │   │   │   │       ├── types.ts
│   │   │   │   │       └── utils/
│   │   │   │   │           ├── custom-validator.ts
│   │   │   │   │           ├── generate-ui-schema.ts
│   │   │   │   │           ├── helpers.ts
│   │   │   │   │           ├── input-schema-pre-processor.ts
│   │   │   │   │           ├── rjsf-utils.ts
│   │   │   │   │           └── schema-utils.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── colors.ts
│   │   │   │   │   ├── fonts.css
│   │   │   │   │   ├── fonts.ts
│   │   │   │   │   └── scrollbars.ts
│   │   │   │   ├── tokens/
│   │   │   │   │   ├── border-radius.stories.tsx
│   │   │   │   │   ├── colors.stories.tsx
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   └── StoryCode.tsx
│   │   │   │   │   ├── icons.stories.tsx
│   │   │   │   │   ├── spacing.stories.tsx
│   │   │   │   │   └── typography.stories.tsx
│   │   │   │   └── ui/
│   │   │   │       ├── accordion.tsx
│   │   │   │       ├── button-group.tsx
│   │   │   │       ├── button.tsx
│   │   │   │       ├── input-group.tsx
│   │   │   │       ├── input.tsx
│   │   │   │       ├── scroll-area.tsx
│   │   │   │       ├── separator.tsx
│   │   │   │       ├── sheet.tsx
│   │   │   │       ├── sidebar.tsx
│   │   │   │       ├── skeleton.tsx
│   │   │   │       ├── spinner.tsx
│   │   │   │       ├── textarea.tsx
│   │   │   │       └── tooltip.tsx
│   │   │   ├── hooks/
│   │   │   │   ├── use-mobile.tsx
│   │   │   │   ├── useAgentSafeMode.ts
│   │   │   │   ├── useCredentials.ts
│   │   │   │   ├── useCredits.ts
│   │   │   │   ├── useExecutionEvents.ts
│   │   │   │   ├── useLibraryAgents/
│   │   │   │   │   ├── store.ts
│   │   │   │   │   └── useLibraryAgents.ts
│   │   │   │   ├── useOnboardingTimezoneDetection.ts
│   │   │   │   └── usePendingReviews.ts
│   │   │   ├── instrumentation.ts
│   │   │   ├── lib/
│   │   │   │   ├── autogpt-server-api/
│   │   │   │   │   ├── client.ts
│   │   │   │   │   ├── context.tsx
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── cron-expression-utils.ts
│   │   │   │   ├── dexie/
│   │   │   │   │   ├── db.ts
│   │   │   │   │   └── draft-utils.ts
│   │   │   │   ├── direct-upload.ts
│   │   │   │   ├── hooks/
│   │   │   │   │   ├── useBreakpoint.ts
│   │   │   │   │   └── useUserTimezone.ts
│   │   │   │   ├── impersonation.ts
│   │   │   │   ├── oauth-popup.ts
│   │   │   │   ├── platform.ts
│   │   │   │   ├── react-query/
│   │   │   │   │   └── queryClient.ts
│   │   │   │   ├── shiki-highlighter.ts
│   │   │   │   ├── streamdown-code-plugin.ts
│   │   │   │   ├── supabase/
│   │   │   │   │   ├── SESSION_VALIDATION.md
│   │   │   │   │   ├── actions.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── hooks/
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── useSupabase.ts
│   │   │   │   │   │   └── useSupabaseStore.ts
│   │   │   │   │   ├── middleware.ts
│   │   │   │   │   └── server/
│   │   │   │   │       ├── getServerSupabase.ts
│   │   │   │   │       └── getServerUser.ts
│   │   │   │   ├── timezone-utils.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── time.ts
│   │   │   │   │   └── url.ts
│   │   │   │   ├── utils.ts
│   │   │   │   ├── withRoleAccess.ts
│   │   │   │   └── workspace-uri.ts
│   │   │   ├── middleware.ts
│   │   │   ├── mocks/
│   │   │   │   ├── index.ts
│   │   │   │   ├── mock-browser.ts
│   │   │   │   ├── mock-handlers.ts
│   │   │   │   └── mock-server.ts
│   │   │   ├── providers/
│   │   │   │   ├── agent-credentials/
│   │   │   │   │   ├── credentials-provider.tsx
│   │   │   │   │   └── helper.ts
│   │   │   │   ├── onboarding/
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   └── onboarding-provider.tsx
│   │   │   │   └── posthog/
│   │   │   │       └── posthog-provider.tsx
│   │   │   ├── services/
│   │   │   │   ├── analytics/
│   │   │   │   │   ├── VercelAnalyticsWrapper.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── builder-draft/
│   │   │   │   │   └── draft-service.ts
│   │   │   │   ├── consent/
│   │   │   │   │   └── cookies.ts
│   │   │   │   ├── environment/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── feature-flags/
│   │   │   │   │   ├── FeatureFlagPage.tsx
│   │   │   │   │   ├── FeatureFlagRedirect.tsx
│   │   │   │   │   ├── feature-flag-provider.tsx
│   │   │   │   │   ├── use-get-flag.ts
│   │   │   │   │   └── with-feature-flag.tsx
│   │   │   │   ├── network-status/
│   │   │   │   │   ├── NetworkStatusMonitor.tsx
│   │   │   │   │   └── useNetworkStatus.ts
│   │   │   │   ├── scripts/
│   │   │   │   │   └── scripts.tsx
│   │   │   │   └── storage/
│   │   │   │       ├── local-storage.ts
│   │   │   │       └── session-storage.ts
│   │   │   ├── tests/
│   │   │   │   ├── CLAUDE.md
│   │   │   │   ├── agent-activity.spec.ts
│   │   │   │   ├── agent-dashboard.spec.ts
│   │   │   │   ├── api-keys.spec.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── testing_agent.json
│   │   │   │   ├── build.spec.ts
│   │   │   │   ├── credentials/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── global-setup.ts
│   │   │   │   ├── integrations/
│   │   │   │   │   ├── mock-supabase-request.tsx
│   │   │   │   │   ├── setup-nextjs-mocks.tsx
│   │   │   │   │   ├── test-utils.tsx
│   │   │   │   │   └── vitest.setup.tsx
│   │   │   │   ├── library.spec.ts
│   │   │   │   ├── marketplace-agent.spec.ts
│   │   │   │   ├── marketplace-creator.spec.ts
│   │   │   │   ├── marketplace.spec.ts
│   │   │   │   ├── pages/
│   │   │   │   │   ├── base.page.ts
│   │   │   │   │   ├── build.page.ts
│   │   │   │   │   ├── header.page.ts
│   │   │   │   │   ├── library.page.ts
│   │   │   │   │   ├── login.page.ts
│   │   │   │   │   ├── marketplace.page.ts
│   │   │   │   │   ├── navbar.page.ts
│   │   │   │   │   ├── profile-form.page.ts
│   │   │   │   │   └── profile.page.ts
│   │   │   │   ├── profile-form.spec.ts
│   │   │   │   ├── profile.spec.ts
│   │   │   │   ├── publish-agent.spec.ts
│   │   │   │   ├── settings.spec.ts
│   │   │   │   ├── signin.spec.ts
│   │   │   │   ├── signup.spec.ts
│   │   │   │   ├── title.spec.ts
│   │   │   │   ├── util.spec.ts
│   │   │   │   └── utils/
│   │   │   │       ├── assertion.ts
│   │   │   │       ├── auth.ts
│   │   │   │       ├── get-browser.ts
│   │   │   │       ├── selectors.ts
│   │   │   │       ├── signin.ts
│   │   │   │       └── signup.ts
│   │   │   └── types/
│   │   │       ├── auth.ts
│   │   │       ├── chat.ts
│   │   │       ├── google.ts
│   │   │       ├── images.d.ts
│   │   │       ├── svg.d.ts
│   │   │       └── types.ts
│   │   ├── tailwind.config.ts
│   │   ├── test-runner-jest.config.js
│   │   ├── tsconfig.json
│   │   └── vitest.config.mts
│   ├── graph_templates/
│   │   ├── Discord Bot Chat To LLM_v5.json
│   │   ├── Discord Chatbot with History_v145.json
│   │   ├── Discord Search Bot_v17.json
│   │   └── Medium Blogger_v28.json
│   └── installer/
│       ├── setup-autogpt.bat
│       └── setup-autogpt.sh
├── classic/
│   ├── .flake8
│   ├── CLI-USAGE.md
│   ├── Dockerfile.autogpt
│   ├── FORGE-QUICKSTART.md
│   ├── README.md
│   ├── SECURITY.md
│   ├── TROUBLESHOOTING.md
│   ├── benchmark/
│   │   ├── .flake8
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── agbenchmark/
│   │   │   ├── README.md
│   │   │   ├── __init__.py
│   │   │   ├── __main__.py
│   │   │   ├── agent_api_interface.py
│   │   │   ├── agent_interface.py
│   │   │   ├── app.py
│   │   │   ├── challenges/
│   │   │   │   ├── CHALLENGE.md
│   │   │   │   ├── README.md
│   │   │   │   ├── __init__.py
│   │   │   │   ├── abilities/
│   │   │   │   │   ├── read_file/
│   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   └── file_to_read.txt
│   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   ├── file_to_check.txt
│   │   │   │   │   │   │   └── output.txt
│   │   │   │   │   │   └── data.json
│   │   │   │   │   └── write_file/
│   │   │   │   │       ├── artifacts_out/
│   │   │   │   │       │   └── random_file.txt
│   │   │   │   │       └── data.json
│   │   │   │   ├── alignment/
│   │   │   │   │   ├── 1_distraction/
│   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   └── instructions.txt
│   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   └── goal.txt
│   │   │   │   │   │   └── data_draft.json
│   │   │   │   │   └── 2_injection/
│   │   │   │   │       ├── artifacts_in/
│   │   │   │   │       │   ├── instructions.txt
│   │   │   │   │       │   └── instructions_2.txt
│   │   │   │   │       ├── artifacts_out/
│   │   │   │   │       │   └── goal.txt
│   │   │   │   │       └── data_draft.json
│   │   │   │   ├── base.py
│   │   │   │   ├── builtin.py
│   │   │   │   ├── library/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── ethereum/
│   │   │   │   │       └── check_price/
│   │   │   │   │           ├── artifacts_in/
│   │   │   │   │           │   ├── __init__.py
│   │   │   │   │           │   ├── sample_code.py
│   │   │   │   │           │   └── test.py
│   │   │   │   │           ├── artifacts_out/
│   │   │   │   │           │   ├── __init__.py
│   │   │   │   │           │   ├── sample_code.py
│   │   │   │   │           │   └── test.py
│   │   │   │   │           └── data.json
│   │   │   │   ├── optional_categories.json
│   │   │   │   ├── verticals/
│   │   │   │   │   ├── code/
│   │   │   │   │   │   ├── 1_three_sum/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── sample_code.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 2_password_generator/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── password_generator.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 3_file_organizer/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── organize_files.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 4_url_shortener/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   ├── test.py
│   │   │   │   │   │   │   │   └── url_shortener.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 5_tic_tac_toe/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   │   └── tic_tac_toe.py
│   │   │   │   │   │   │   ├── custom_python/
│   │   │   │   │   │   │   │   └── test.py
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   └── 6_battleship/
│   │   │   │   │   │       ├── artifacts_in/
│   │   │   │   │   │       │   ├── __init__.py
│   │   │   │   │   │       │   ├── abstract_class.py
│   │   │   │   │   │       │   ├── conftest.py
│   │   │   │   │   │       │   ├── product_requirements.txt
│   │   │   │   │   │       │   ├── test_negative.py
│   │   │   │   │   │       │   ├── test_positive.py
│   │   │   │   │   │       │   └── user_stories.txt
│   │   │   │   │   │       ├── artifacts_out/
│   │   │   │   │   │       │   ├── __init__.py
│   │   │   │   │   │       │   ├── abstract_class.py
│   │   │   │   │   │       │   ├── battleship.py
│   │   │   │   │   │       │   ├── conftest.py
│   │   │   │   │   │       │   ├── test_negative.py
│   │   │   │   │   │       │   └── test_positive.py
│   │   │   │   │   │       └── data.json
│   │   │   │   │   ├── data/
│   │   │   │   │   │   ├── 1_sort_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── input.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.csv
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 2_label_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── input.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.csv
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 3_combine_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   ├── file1.csv
│   │   │   │   │   │   │   │   └── file2.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.csv
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 4_answer_question_small_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── file1.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 5_answer_question_csv/
│   │   │   │   │   │   │   ├── artifacts_in/
│   │   │   │   │   │   │   │   └── file1.csv
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── output.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   └── 6_answer_question_combine_csv/
│   │   │   │   │   │       ├── artifacts_in/
│   │   │   │   │   │       │   ├── file1.csv
│   │   │   │   │   │       │   └── file2.csv
│   │   │   │   │   │       ├── artifacts_out/
│   │   │   │   │   │       │   └── output.txt
│   │   │   │   │   │       └── data.json
│   │   │   │   │   ├── scrape/
│   │   │   │   │   │   ├── 1_search/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 2_book_price/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 3_revenue_retrieval/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   ├── 4_revenue_retrieval_2/
│   │   │   │   │   │   │   ├── artifacts_out/
│   │   │   │   │   │   │   │   └── random_file.txt
│   │   │   │   │   │   │   └── data.json
│   │   │   │   │   │   └── 5_get_information/
│   │   │   │   │   │       ├── artifacts_out/
│   │   │   │   │   │       │   └── output.txt
│   │   │   │   │   │       └── data.json
│   │   │   │   │   └── synthesize/
│   │   │   │   │       └── 1_basic_content_gen/
│   │   │   │   │           ├── artifacts_in/
│   │   │   │   │           │   ├── challenges.txt
│   │   │   │   │           │   └── companies.txt
│   │   │   │   │           ├── artifacts_out/
│   │   │   │   │           │   └── output.txt
│   │   │   │   │           └── data.json
│   │   │   │   ├── webarena.py
│   │   │   │   └── webarena_selection.json
│   │   │   ├── config.py
│   │   │   ├── conftest.py
│   │   │   ├── generate_test.py
│   │   │   ├── main.py
│   │   │   ├── schema.py
│   │   │   └── utils/
│   │   │       ├── data_types.py
│   │   │       ├── dependencies/
│   │   │       │   ├── __init__.py
│   │   │       │   ├── constants.py
│   │   │       │   ├── graphs.py
│   │   │       │   ├── main.py
│   │   │       │   └── util.py
│   │   │       ├── get_data_from_helicone.py
│   │   │       ├── logging.py
│   │   │       ├── prompts.py
│   │   │       └── utils.py
│   │   ├── agbenchmark_config/
│   │   │   └── config.json
│   │   ├── agents_to_benchmark.json
│   │   ├── backend/
│   │   │   └── __init__.py
│   │   ├── frontend/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── _eslintrc.cjs
│   │   │   ├── next.config.mjs
│   │   │   ├── package.json
│   │   │   ├── postcss.config.cjs
│   │   │   ├── prettier.config.cjs
│   │   │   ├── public/
│   │   │   │   └── graph.json
│   │   │   ├── src/
│   │   │   │   ├── components/
│   │   │   │   │   ├── data/
│   │   │   │   │   │   ├── Dashboard.tsx
│   │   │   │   │   │   ├── Reports.tsx
│   │   │   │   │   │   └── dashboard/
│   │   │   │   │   │       ├── CategorySuccess.tsx
│   │   │   │   │   │       ├── CurrentEnv.tsx
│   │   │   │   │   │       └── RadarChart.tsx
│   │   │   │   │   └── index/
│   │   │   │   │       ├── Graph.tsx
│   │   │   │   │       ├── MockCheckbox.tsx
│   │   │   │   │       ├── RunButton.tsx
│   │   │   │   │       ├── RunData.tsx
│   │   │   │   │       ├── SelectedTask.tsx
│   │   │   │   │       └── TaskInfo.tsx
│   │   │   │   ├── env.mjs
│   │   │   │   ├── pages/
│   │   │   │   │   ├── _app.tsx
│   │   │   │   │   ├── data.tsx
│   │   │   │   │   └── index.tsx
│   │   │   │   ├── server/
│   │   │   │   │   └── db.ts
│   │   │   │   └── styles/
│   │   │   │       └── globals.css
│   │   │   ├── tailwind.config.ts
│   │   │   └── tsconfig.json
│   │   ├── pyproject.toml
│   │   ├── reports/
│   │   │   ├── Auto-GPT/
│   │   │   │   ├── 20230817T000126_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081335_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081400_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081239_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081235_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081455_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081337_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081341_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032421_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081422_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081408_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081228_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081337_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081454_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081453_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081508_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081434_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153538_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081405_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081212_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081320_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081516_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081454_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011709_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080530_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080422_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080442_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file11_07-20-23-18.json
│   │   │   │   ├── file12_07-20-23-45.json
│   │   │   │   ├── file13_07-21-00-20.json
│   │   │   │   ├── file14_07-21-08-18.json
│   │   │   │   ├── file15_07-21-18-18.json
│   │   │   │   ├── file16_07-22-08-16.json
│   │   │   │   ├── file17_07-22-15-10.json
│   │   │   │   ├── file18_07-23-08-17.json
│   │   │   │   ├── file19_07-23-16-22.json
│   │   │   │   ├── file1_07-18-00-18.json
│   │   │   │   ├── file20_07-23-19-08.json
│   │   │   │   ├── file21_07-23-19-27.json
│   │   │   │   ├── file22_07-23-19-35.json
│   │   │   │   ├── file23_07-23-19-53.json
│   │   │   │   ├── file24_07-23-21-03.json
│   │   │   │   ├── file24_07-23-21-06.json
│   │   │   │   ├── file26_07-23-22-25.json
│   │   │   │   ├── file26_07-23-22-26.json
│   │   │   │   ├── file28_07-24-08-19.json
│   │   │   │   ├── file29_07-24-22-11.json
│   │   │   │   ├── file2_07-18-02-45.json
│   │   │   │   ├── file30_07-24-23-51.json
│   │   │   │   ├── file31_07-25-01-05.json
│   │   │   │   ├── file32_07-25-01-35.json
│   │   │   │   ├── file33_07-25-03-14.json
│   │   │   │   ├── file34_07-25-03-35.json
│   │   │   │   ├── file35_07-25-03-59.json
│   │   │   │   ├── file36_07-25-04-20.json
│   │   │   │   ├── file37_07-25-08-18.json
│   │   │   │   ├── file38_07-25-18-10.json
│   │   │   │   ├── file38_07-25-18-12.json
│   │   │   │   ├── file38_07-25-18-14.json
│   │   │   │   ├── file3_07-18-08-19.json
│   │   │   │   ├── file41_07-26-00-53.json
│   │   │   │   ├── file42_07-26-03-15.json
│   │   │   │   ├── file43_07-26-08-18.json
│   │   │   │   ├── file46_07-27-18-44.json
│   │   │   │   ├── file47_07-27-13-31.json
│   │   │   │   ├── file47_07-27-19-24.json
│   │   │   │   ├── file48_07-27-13-38.json
│   │   │   │   ├── file48_07-27-19-56.json
│   │   │   │   ├── file49_07-28-03-53.json
│   │   │   │   ├── file4_07-18-16-20.json
│   │   │   │   ├── file50_07-28-04-10.json
│   │   │   │   ├── file51_07-29-08-12.json
│   │   │   │   ├── file52_07-29-09-24.json
│   │   │   │   ├── file53_07-29-09-29.json
│   │   │   │   ├── file54_07-29-10-18.json
│   │   │   │   ├── file55_07-29-10-45.json
│   │   │   │   ├── file56_07-29-16-09.json
│   │   │   │   ├── file57_07-29-17-21.json
│   │   │   │   ├── file59_07-30-03-06.json
│   │   │   │   ├── file59_07-30-08-12.json
│   │   │   │   ├── file5_07-19-08-18.json
│   │   │   │   ├── file6_07-19-20-40.json
│   │   │   │   ├── file7_07-19-21-56.json
│   │   │   │   ├── file8_07-20-20-12.json
│   │   │   │   ├── file9_07-20-22-44.json
│   │   │   │   ├── file9_07-20-22-49.json
│   │   │   │   ├── folder10_08-01-02-43/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder10_08-01-12-47/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-03-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-13-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-16-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-16-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-19-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-02-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-03-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-03-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-31-02-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-15-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-17-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-17-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-02-00-08/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-03-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-02-01-35/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-23-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-04-03-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-05-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-06-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-03-06/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-08-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-09-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-10-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-11-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-12-02-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-12-02-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-12-03-04/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-12-03-45/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-12-17-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-12-44/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-13-01-53/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-13-02-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-13-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-14-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-14-21-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-15-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-16-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-13-05/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_07-31-16-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-19-06/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-39/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── Auto-GPT-Turbo/
│   │   │   │   ├── 20230824T032419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081333_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081326_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081254_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081413_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081447_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081439_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T130202_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T231152_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081441_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T145222_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153506_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081341_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T170512_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081222_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081239_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081450_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081456_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011647_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080459_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080438_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── PolyGPT/
│   │   │   │   ├── 20230817T000100_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081344_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081347_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081303_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081253_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081430_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081318_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081326_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032533_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081402_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081411_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081258_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081204_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081533_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081440_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081320_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081331_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081234_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081236_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081401_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081409_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011618_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080446_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080421_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080352_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080444_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder10_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-13-01-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-13-02-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-13-02-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-13-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-14-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-14-08-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder17_08-14-09-48/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-14-18-00/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-14-18-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_08-09-19-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-14-21-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-15-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-16-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_08-10-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_08-11-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_08-11-20-28/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_08-12-02-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_08-12-02-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_08-12-03-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder8_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder9_08-12-17-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── babyagi/
│   │   │   │   ├── 20230817T000257_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081542_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081621_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081418_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081523_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081708_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081534_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081622_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032717_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081600_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081559_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081425_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081454_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081736_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081638_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081613_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081539_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153608_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081621_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081425_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081538_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081752_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081727_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T003423_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011924_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080803_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080618_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080648_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080641_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file10_07-23-21-06.json
│   │   │   │   ├── file10_07-23-21-07.json
│   │   │   │   ├── file12_07-23-22-28.json
│   │   │   │   ├── file13_07-24-08-21.json
│   │   │   │   ├── file14_07-24-22-15.json
│   │   │   │   ├── file15_07-24-23-53.json
│   │   │   │   ├── file16_07-25-01-07.json
│   │   │   │   ├── file17_07-25-01-38.json
│   │   │   │   ├── file18_07-25-03-16.json
│   │   │   │   ├── file19_07-25-03-38.json
│   │   │   │   ├── file1_07-21-18-20.json
│   │   │   │   ├── file20_07-25-04-01.json
│   │   │   │   ├── file21_07-25-04-22.json
│   │   │   │   ├── file22_07-25-08-22.json
│   │   │   │   ├── file23_07-25-18-13.json
│   │   │   │   ├── file23_07-25-18-14.json
│   │   │   │   ├── file23_07-25-18-16.json
│   │   │   │   ├── file26_07-26-00-56.json
│   │   │   │   ├── file27_07-26-03-17.json
│   │   │   │   ├── file28_07-26-08-21.json
│   │   │   │   ├── file29_07-27-13-33.json
│   │   │   │   ├── file2_07-22-08-18.json
│   │   │   │   ├── file30_07-27-13-40.json
│   │   │   │   ├── file31_07-27-18-46.json
│   │   │   │   ├── file32_07-27-19-27.json
│   │   │   │   ├── file33_07-27-19-59.json
│   │   │   │   ├── file34_07-28-03-56.json
│   │   │   │   ├── file35_07-28-04-13.json
│   │   │   │   ├── file36_07-28-08-14.json
│   │   │   │   ├── file37_07-29-08-14.json
│   │   │   │   ├── file38_07-29-09-30.json
│   │   │   │   ├── file39_07-29-10-20.json
│   │   │   │   ├── file3_07-22-15-12.json
│   │   │   │   ├── file40_07-29-10-47.json
│   │   │   │   ├── file41_07-29-16-11.json
│   │   │   │   ├── file42_07-29-17-23.json
│   │   │   │   ├── file43_07-29-18-09.json
│   │   │   │   ├── file44_07-30-00-53.json
│   │   │   │   ├── file45_07-30-01-41.json
│   │   │   │   ├── file46_07-30-03-08.json
│   │   │   │   ├── file47_07-30-04-26.json
│   │   │   │   ├── file48_07-30-08-14.json
│   │   │   │   ├── file4_07-23-08-20.json
│   │   │   │   ├── file5_07-23-16-24.json
│   │   │   │   ├── file6_07-23-19-11.json
│   │   │   │   ├── file7_07-23-19-28.json
│   │   │   │   ├── file8_07-23-19-37.json
│   │   │   │   ├── file9_07-23-19-55.json
│   │   │   │   ├── folder11_08-01-02-46/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-12-50/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-03-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-13-39/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-16-20/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-17-00/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-01-17-35/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder16_08-01-19-54/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-01-36/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-02-39/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-03-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-30-22-55/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-04-02/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-15-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-17-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-02-17-41/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-08-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-03-23-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-03-27/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-04-04-34/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-04-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-02-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder30_08-05-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-06-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-07-08-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-08-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-09-03-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-09-08-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-10-08-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-11-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-12-02-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-12-02-54/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-03-08/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-12-03-06/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-12-08-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-12-17-26/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-13-01-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-13-01-54/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-13-02-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-13-02-40/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-13-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder48_08-14-21-40/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder49_08-15-08-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-12-47/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder50_08-16-08-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_07-31-13-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-16-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder8_07-31-19-41/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── beebot/
│   │   │   │   ├── 20230817T000111_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081401_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081430_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081151_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081303_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081428_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081327_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081409_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032431_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081331_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081219_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081219_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081452_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081405_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081406_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153356_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081447_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081302_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081311_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081412_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081437_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011630_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080421_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080428_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080431_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080433_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T151304_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file10_07-23-08-17.json
│   │   │   │   ├── file11_07-23-16-21.json
│   │   │   │   ├── file12_07-23-19-07.json
│   │   │   │   ├── file13_07-23-19-27.json
│   │   │   │   ├── file13_07-23-19-34.json
│   │   │   │   ├── file15_07-23-19-54.json
│   │   │   │   ├── file16_07-23-21-03.json
│   │   │   │   ├── file16_07-23-21-06.json
│   │   │   │   ├── file18_07-23-22-26.json
│   │   │   │   ├── file19_07-24-08-19.json
│   │   │   │   ├── file1_07-20-22-48.json
│   │   │   │   ├── file20_07-24-23-51.json
│   │   │   │   ├── file21_07-25-01-05.json
│   │   │   │   ├── file22_07-25-01-35.json
│   │   │   │   ├── file23_07-25-03-13.json
│   │   │   │   ├── file24_07-25-03-35.json
│   │   │   │   ├── file24_07-25-03-59.json
│   │   │   │   ├── file25_07-25-04-19.json
│   │   │   │   ├── file27_07-25-08-18.json
│   │   │   │   ├── file28_07-25-18-09.json
│   │   │   │   ├── file28_07-25-18-11.json
│   │   │   │   ├── file28_07-25-18-13.json
│   │   │   │   ├── file31_07-26-00-53.json
│   │   │   │   ├── file32_07-26-03-16.json
│   │   │   │   ├── file33_07-26-08-18.json
│   │   │   │   ├── file34_07-27-19-24.json
│   │   │   │   ├── file35_07-27-19-55.json
│   │   │   │   ├── file36_07-28-03-53.json
│   │   │   │   ├── file36_07-28-04-34.json
│   │   │   │   ├── file38_07-28-08-12.json
│   │   │   │   ├── file39_07-29-08-12.json
│   │   │   │   ├── file3_07-20-23-18.json
│   │   │   │   ├── file40_07-29-09-29.json
│   │   │   │   ├── file41_07-29-10-17.json
│   │   │   │   ├── file42_07-29-10-46.json
│   │   │   │   ├── file43_07-29-16-09.json
│   │   │   │   ├── file44_07-29-17-20.json
│   │   │   │   ├── file45_07-30-00-51.json
│   │   │   │   ├── file46_07-30-01-38.json
│   │   │   │   ├── file47_07-30-03-05.json
│   │   │   │   ├── file48_07-30-04-24.json
│   │   │   │   ├── file49_07-30-08-11.json
│   │   │   │   ├── file4_07-20-22-44.json
│   │   │   │   ├── file4_07-20-23-43.json
│   │   │   │   ├── file5_07-21-00-20.json
│   │   │   │   ├── file6_07-21-08-18.json
│   │   │   │   ├── file7_07-21-18-18.json
│   │   │   │   ├── file8_07-22-08-16.json
│   │   │   │   ├── file9_07-22-15-10.json
│   │   │   │   ├── folder10_07-31-23-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-03-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-12-48/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-13-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-16-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-01-16-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder16_08-01-17-31/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder17_08-01-19-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-01-34/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-30-22-53/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-02-36/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-03-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-03-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-15-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-03-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-23-50/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-04-03-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-05-08-11/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-06-01-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-02-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder30_08-06-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-06-17-15/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-07-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-07-22-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-08-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-09-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-10-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-11-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-11-18-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-11-19-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-03-06/
│   │   │   │   │   ├── folder11_08-01-02-42/
│   │   │   │   │   │   └── report.json
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-11-21-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-12-02-19/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-12-02-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-12-03-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-12-17-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-13-02-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder48_08-13-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder49_08-14-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-12-44/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder50_08-14-21-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder51_08-15-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder52_08-16-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-16-09/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-05/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder8_07-31-19-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder9_07-31-21-02/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── combined_charts/
│   │   │   │   ├── run1/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run10/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run11/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run12/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run13/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run14/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run15/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run16/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run17/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run18/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run19/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run2/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run20/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run21/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run22/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run23/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run24/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run25/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run26/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run27/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run28/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run29/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run3/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run30/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run31/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run32/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run33/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run35/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run35.1_best_performances/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run36/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run37/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run38/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run39/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run4/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run40/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run41/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run42/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run43/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run44/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run45/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run46/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run47/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run48/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run49/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run5/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run50/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run51/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run6/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run7/
│   │   │   │   │   └── run_info.json
│   │   │   │   ├── run8/
│   │   │   │   │   └── run_info.json
│   │   │   │   └── run9/
│   │   │   │       └── run_info.json
│   │   │   ├── format.py
│   │   │   ├── gpt-engineer/
│   │   │   │   ├── 1.json
│   │   │   │   ├── 20230817T000115_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081320_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081304_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081215_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081223_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081448_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081342_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081255_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032419_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081353_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081258_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081238_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081207_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081524_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081337_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081418_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081324_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153354_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081353_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081227_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081151_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081358_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081409_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011611_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080511_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080345_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080349_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080405_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── file11_07-20-23-17.json
│   │   │   │   ├── file12_07-20-23-43.json
│   │   │   │   ├── file13_07-21-00-20.json
│   │   │   │   ├── file14_07-21-08-18.json
│   │   │   │   ├── file15_07-21-18-17.json
│   │   │   │   ├── file16_07-22-08-16.json
│   │   │   │   ├── file17_07-22-15-10.json
│   │   │   │   ├── file18_07-23-08-16.json
│   │   │   │   ├── file19_07-23-16-21.json
│   │   │   │   ├── file1_07-18-00-17.json
│   │   │   │   ├── file20_07-23-19-07.json
│   │   │   │   ├── file21_07-23-19-26.json
│   │   │   │   ├── file22_07-23-19-35.json
│   │   │   │   ├── file23_07-23-19-53.json
│   │   │   │   ├── file24_07-23-21-03.json
│   │   │   │   ├── file24_07-23-21-05.json
│   │   │   │   ├── file26_07-23-22-25.json
│   │   │   │   ├── file27_07-24-08-19.json
│   │   │   │   ├── file28_07-24-22-11.json
│   │   │   │   ├── file29_07-24-23-50.json
│   │   │   │   ├── file2_07-18-02-44.json
│   │   │   │   ├── file30_07-25-01-05.json
│   │   │   │   ├── file31_07-25-01-35.json
│   │   │   │   ├── file32_07-25-03-14.json
│   │   │   │   ├── file33_07-25-03-35.json
│   │   │   │   ├── file34_07-25-03-58.json
│   │   │   │   ├── file35_07-25-04-19.json
│   │   │   │   ├── file36_07-25-08-18.json
│   │   │   │   ├── file37_07-25-18-09.json
│   │   │   │   ├── file37_07-25-18-11.json
│   │   │   │   ├── file37_07-25-18-13.json
│   │   │   │   ├── file3_07-18-08-19.json
│   │   │   │   ├── file40_07-26-00-53.json
│   │   │   │   ├── file41_07-26-03-15.json
│   │   │   │   ├── file42_07-26-08-17.json
│   │   │   │   ├── file43_07-27-13-30.json
│   │   │   │   ├── file44_07-27-13-37.json
│   │   │   │   ├── file45_07-27-18-44.json
│   │   │   │   ├── file46_07-27-19-23.json
│   │   │   │   ├── file47_07-27-19-56.json
│   │   │   │   ├── file48_07-28-04-10.json
│   │   │   │   ├── file49_07-28-08-12.json
│   │   │   │   ├── file4_07-18-16-19.json
│   │   │   │   ├── file50_07-29-08-11.json
│   │   │   │   ├── file51_07-29-09-29.json
│   │   │   │   ├── file52_07-29-10-17.json
│   │   │   │   ├── file53_07-29-10-45.json
│   │   │   │   ├── file54_07-29-16-10.json
│   │   │   │   ├── file55_07-29-17-21.json
│   │   │   │   ├── file56_07-29-18-06.json
│   │   │   │   ├── file57_07-30-00-51.json
│   │   │   │   ├── file58_07-30-01-38.json
│   │   │   │   ├── file59_07-30-03-05.json
│   │   │   │   ├── file5_07-19-08-18.json
│   │   │   │   ├── file60_07-30-04-24.json
│   │   │   │   ├── file61_07-30-08-12.json
│   │   │   │   ├── file6_07-19-21-55.json
│   │   │   │   ├── file7_07-20-08-18.json
│   │   │   │   ├── file8_07-20-20-10.json
│   │   │   │   ├── file9_07-20-22-44.json
│   │   │   │   ├── file9_07-20-22-48.json
│   │   │   │   ├── folder10_08-01-02-42/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder10_08-01-12-47/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-03-20/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder11_08-01-13-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder12_08-01-16-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder13_08-01-16-57/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder14_08-01-17-31/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder15_08-01-19-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder17_08-02-01-34/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-02-36/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder18_08-02-03-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder19_08-02-03-58/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder1_07-30-22-53/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder20_08-02-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder21_08-02-15-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder22_08-02-17-21/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder23_08-02-17-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder24_08-03-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder25_08-03-23-50/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder26_08-04-03-23/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder27_08-04-04-17/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder28_08-04-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder29_08-04-18-32/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder2_07-31-02-07/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder30_08-04-18-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder31_08-04-19-56/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder32_08-04-22-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder33_08-05-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder34_08-06-08-11/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder35_08-07-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder36_08-08-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder37_08-09-08-14/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder38_08-10-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder39_08-11-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder3_07-31-12-44/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder40_08-12-02-18/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder41_08-12-02-51/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder42_08-12-03-03/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder43_08-12-08-12/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder44_08-12-17-24/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder45_08-13-01-10/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder46_08-13-01-52/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder47_08-13-02-16/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder48_08-13-02-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder49_08-13-08-11/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder4_07-31-13-05/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder50_08-14-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder51_08-14-21-37/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder52_08-15-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder53_08-16-08-13/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder5_07-31-16-08/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder6_07-31-19-04/
│   │   │   │   │   └── report.json
│   │   │   │   ├── folder7_07-31-19-38/
│   │   │   │   │   └── report.json
│   │   │   │   ├── regression_tests.json
│   │   │   │   └── success_rate.json
│   │   │   ├── json_to_base_64.py
│   │   │   ├── match_records.py
│   │   │   ├── mini-agi/
│   │   │   │   ├── 1.1_TestWriteFile.json
│   │   │   │   ├── 10.1_TestRememberMultipleWithNoise.json
│   │   │   │   ├── 10_TestRememberMultipleWithNoise.json
│   │   │   │   ├── 11.1_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.2_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.3_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.4_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11.5_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 11_TestRememberMultiplePhrasesWithNoise.json
│   │   │   │   ├── 12.1_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12.2_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12.3_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12.4_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 12_TestDebugSimpleTypoWithGuidance.json
│   │   │   │   ├── 13.1_TestRevenueRetrieval.json
│   │   │   │   ├── 13_TestRevenueRetrieval.json.json
│   │   │   │   ├── 14_TestReturnCode.json
│   │   │   │   ├── 15_TestRevenueRetrieval.json
│   │   │   │   ├── 1_07-18-02-44.json
│   │   │   │   ├── 1_TestWriteFIle.json
│   │   │   │   ├── 2.1_TestReadFile.json
│   │   │   │   ├── 20230817T000109_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230817T081430_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230818T081402_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230819T081219_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230820T081326_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230821T081348_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230822T081356_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230823T081402_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T032434_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230824T081327_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230825T081334_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230826T081258_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230827T081225_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230828T081410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230829T081410_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230830T081335_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T051127_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T081335_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230831T153352_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230901T081339_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230902T081308_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230903T081306_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230904T081505_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230905T081354_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T001050_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T011712_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230908T080426_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230909T080415_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230910T080446_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 20230911T080548_full_run/
│   │   │   │   │   └── report.json
│   │   │   │   ├── 2_07-18-16-20.json
│   │   │   │   ├── 2_TestReadFile.json
│   │   │   │   ├── 3.1_TestSearch.json
│   │   │   │   ├── 3_07-20-22-44.json
│   │   │   │   ├── 3_TestSearch.json
│   │   │   │   ├── 4.1_TestBasicRetrieval.json
│   │   │   │   ├── 4_07-20-23-18.json
│   │   │   │   ├── 4_TestBasicRetrieval.json
│   │   │   │   ├── 5.1_TestRevenueRetrieval_1.0.json
│   │   │   │   ├── 5.2_TestRevenueRetrieval_1.0.json
│   │   │   │   ├── 5_07-20-23-43.json
│   │   │   │   ├── 5_TestRevenueRetrieval_1.0.json
│   │   │   │   ├── 6.1_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6.2_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6.3_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6.4_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 6_07-21-00-20.json
│   │   │   │   ├── 6_TestRevenueRetrieval_1.1.json
│   │   │   │   ├── 7.1_TestRevenueRetrieval_1.2.json
│   │   │   │   ├── 7_07-21-08-18.json
│   │   │   │   ├── 7_TestRevenueRetrieval_1.2.json
│   │   │   │   ├── 8.1_TestBasicMemory.json
│   │   │   │   ├── 8_07-21-18-18.json
│   │   │   │   ├── 8_TestBasicMemory.json
│   │   │   │   ├── 9.1_TestRememberMultipleIds.json
│   │   │   │   ├── 9_07-22-08-16.json
│   │   │   │   ├── 9_TestRememberMultipleIds.json
│   │   │   │   ├── file10_07-23-16-21.json
│   │   │   │   ├── file11_07-23-19-07.json
│   │   │   │   ├── file12_07-23-19-53.json
│   │   │   │   ├── file13_07-23-21-03.json
│   │   │   │   ├── file13_07-23-21-07.json
│   │   │   │   ├── file15_07-23-22-26.json
│   │   │   │   ├── file16_07-24-08-21.json
│   │   │   │   ├── file56_07-24-22-12.json
│   │   │   │   ├── file57_07-24-23-51.json
│   │   │   │   ├── file58_07-25-01-04.json
│   │   │   │   ├── file59_07-25-01-35.json
│   │   │   │   ├── file60_07-25-03-14.json
│   │   │   │   ├── file61_07-25-03-35.json
│   │   │   │   ├── file62_07-25-03-59.json
│   │   │   │   ├── file63_07-25-08-19.json
│   │   │   │   ├── file64_07-25-18-09.json
│   │   │   │   ├── file64_07-25-18-11.json
│   │   │   │   ├── file64_07-25-18-13.json
│   │   │   │   ├── file67_07-26-00-54.json
│   │   │   │   ├── file68_07-26-08-18.json
│   │   │   │   ├── file69_07-27-13-30.json
│   │   │   │   ├── file70_07-27-13-38.json
│   │   │   │   ├── file71_07-27-18-45.json
│   │   │   │   ├── file72_07-27-19-23.json
│   │   │   │   ├── file73_07-27-19-55.json
│   │   │   │   ├── file74_07-28-03-53.json
│   │   │   │   ├── file75_07-28-04-10.json
│   │   │   │   ├── file76_07-29-08-11.json
│   │   │   │   ├── file77_07-29-09-29.json
│   │   │   │   ├── file78_07-29-17-20.json
│   │   │   │   ├── file79_07-29-18-06.json
│   │   │   │   ├── file80_07-30-01-38.json
│   │   │   │   ├── file81_07-30-03-05.json
│   │   │   │   ├── file82_07-30-04-24.json
│   │   │   │   ├── file83_07-
Download .txt
Showing preview only (2,437K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (31360 symbols across 1946 files)

FILE: .github/scripts/detect_overlaps.py
  function main (line 23) | def main():
  function fetch_pr_details (line 80) | def fetch_pr_details(pr_number: int) -> "PullRequest":
  function find_overlapping_prs (line 103) | def find_overlapping_prs(
  function run_batch_merge_tests (line 150) | def run_batch_merge_tests(
  function analyze_pr_overlap (line 215) | def analyze_pr_overlap(
  function find_file_overlap_candidates (line 274) | def find_file_overlap_candidates(
  function report_results (line 307) | def report_results(overlaps: list["Overlap"]):
  function format_comment (line 325) | def format_comment(
  function format_base_conflicts (line 364) | def format_base_conflicts(overlaps: list["Overlap"], lines: list[str]):
  function format_conflicts_section (line 378) | def format_conflicts_section(conflicts: list[tuple], current_pr: int, li...
  function format_medium_risk_section (line 397) | def format_medium_risk_section(
  function format_low_risk_section (line 435) | def format_low_risk_section(low_risk: list[tuple], current_pr: int, line...
  function format_pr_entry (line 459) | def format_pr_entry(pr: "PullRequest", lines: list[str]):
  function format_conflict_details (line 467) | def format_conflict_details(overlap: "Overlap", lines: list[str]):
  function format_conflict_size (line 487) | def format_conflict_size(detail: "ConflictInfo") -> str:
  function format_line_overlaps (line 505) | def format_line_overlaps(line_overlaps: dict[str, list[tuple]], lines: l...
  function classify_all_overlaps (line 522) | def classify_all_overlaps(
  function classify_overlap_risk (line 548) | def classify_overlap_risk(
  function find_line_overlaps (line 582) | def find_line_overlaps(
  function find_range_overlaps (line 620) | def find_range_overlaps(
  function ranges_overlap (line 635) | def ranges_overlap(range_a: tuple[int, int], range_b: tuple[int, int]) -...
  function merge_ranges (line 640) | def merge_ranges(ranges: list[tuple[int, int]]) -> list[tuple[int, int]]:
  function test_merge_conflict (line 662) | def test_merge_conflict(
  function clone_repo (line 695) | def clone_repo(owner: str, repo: str, branch: str, tmpdir: str) -> bool:
  function configure_git (line 708) | def configure_git(tmpdir: str):
  function fetch_pr_branches (line 714) | def fetch_pr_branches(tmpdir: str, pr_a: int, pr_b: int) -> bool:
  function try_merge_pr (line 725) | def try_merge_pr(tmpdir: str, pr_number: int) -> Optional[tuple[list[str...
  function extract_conflict_info (line 739) | def extract_conflict_info(tmpdir: str, stderr: str) -> tuple[list[str], ...
  function analyze_conflict_markers (line 780) | def analyze_conflict_markers(file_path: str, cwd: str) -> "ConflictInfo":
  function parse_diff_ranges (line 813) | def parse_diff_ranges(diff: str) -> dict[str, "ChangedFile"]:
  function parse_hunk_header (line 853) | def parse_hunk_header(line: str, current_file: "ChangedFile"):
  function get_repo_info (line 872) | def get_repo_info() -> tuple[str, str]:
  function query_open_prs (line 883) | def query_open_prs(owner: str, repo: str, base_branch: str) -> list[dict]:
  function get_pr_diff (line 956) | def get_pr_diff(pr_number: int) -> str:
  function post_or_update_comment (line 962) | def post_or_update_comment(pr_number: int, body: str):
  function send_discord_notification (line 1024) | def send_discord_notification(webhook_url: str, pr: "PullRequest", overl...
  function run_gh (line 1075) | def run_gh(args: list[str], check: bool = True) -> subprocess.CompletedP...
  function run_git (line 1089) | def run_git(args: list[str], cwd: str = None, check: bool = True) -> sub...
  function should_ignore_file (line 1103) | def should_ignore_file(path: str) -> bool:
  function find_common_prefix (line 1111) | def find_common_prefix(paths: list[str]) -> str:
  function format_relative_time (line 1130) | def format_relative_time(iso_timestamp: str) -> str:
  class ChangedFile (line 1160) | class ChangedFile:
  class PullRequest (line 1170) | class PullRequest:
  class ConflictInfo (line 1184) | class ConflictInfo:
  class Overlap (line 1193) | class Overlap:
    method __post_init__ (line 1204) | def __post_init__(self):

FILE: .github/workflows/scripts/check_actions_status.py
  function get_environment_variables (line 11) | def get_environment_variables() -> Tuple[str, str, str, str, str]:
  function make_api_request (line 35) | def make_api_request(url: str, headers: Dict[str, str]) -> Dict:
  function process_check_runs (line 47) | def process_check_runs(check_runs: List[Dict]) -> Tuple[bool, bool]:
  function main (line 75) | def main():

FILE: .github/workflows/scripts/docker-ci-fix-compose-build-cache.py
  function main (line 16) | def main():

FILE: .github/workflows/scripts/get_package_version_from_lockfile.py
  function get_package_version (line 11) | def get_package_version(package_name: str, lockfile_path: str) -> str | ...
  function main (line 38) | def main():

FILE: autogpt_platform/autogpt_libs/autogpt_libs/api_key/keysmith.py
  class APIKeyContainer (line 8) | class APIKeyContainer(NamedTuple):
  class APIKeySmith (line 18) | class APIKeySmith:
    method generate_key (line 23) | def generate_key(self) -> APIKeyContainer:
    method verify_key (line 36) | def verify_key(
    method hash_key (line 58) | def hash_key(self, raw_key: str) -> tuple[str, str]:
    method _generate_salt (line 67) | def _generate_salt(self) -> bytes:
    method _hash_key_with_salt (line 71) | def _hash_key_with_salt(self, raw_key: str, salt: bytes) -> str:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/api_key/test_keysmith.py
  function test_generate_api_key (line 6) | def test_generate_api_key():
  function test_verify_new_secure_key (line 17) | def test_verify_new_secure_key():
  function test_verify_legacy_key (line 29) | def test_verify_legacy_key():
  function test_rehash_existing_key (line 42) | def test_rehash_existing_key():
  function test_invalid_key_prefix (line 57) | def test_invalid_key_prefix():
  function test_secure_hash_requires_salt (line 66) | def test_secure_hash_requires_salt():
  function test_invalid_salt_format (line 74) | def test_invalid_salt_format():

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/config.py
  class AuthConfigError (line 9) | class AuthConfigError(ValueError):
  class Settings (line 23) | class Settings:
    method __init__ (line 24) | def __init__(self):
    method validate (line 32) | def validate(self):
  function get_settings (line 74) | def get_settings() -> Settings:
  function verify_settings (line 83) | def verify_settings() -> None:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/config_test.py
  function test_environment_variable_precedence (line 15) | def test_environment_variable_precedence(mocker: MockerFixture):
  function test_environment_variable_backwards_compatible (line 24) | def test_environment_variable_backwards_compatible(mocker: MockerFixture):
  function test_auth_config_error_inheritance (line 33) | def test_auth_config_error_inheritance():
  function test_settings_static_after_creation (line 40) | def test_settings_static_after_creation(mocker: MockerFixture):
  function test_settings_load_with_valid_secret (line 54) | def test_settings_load_with_valid_secret(mocker: MockerFixture):
  function test_settings_load_with_strong_secret (line 63) | def test_settings_load_with_strong_secret(mocker: MockerFixture):
  function test_secret_empty_raises_error (line 73) | def test_secret_empty_raises_error(mocker: MockerFixture):
  function test_secret_missing_raises_error (line 82) | def test_secret_missing_raises_error(mocker: MockerFixture):
  function test_secret_only_whitespace_raises_error (line 92) | def test_secret_only_whitespace_raises_error(mocker: MockerFixture, secr...
  function test_secret_weak_logs_warning (line 100) | def test_secret_weak_logs_warning(
  function test_secret_31_char_logs_warning (line 114) | def test_secret_31_char_logs_warning(
  function test_secret_32_char_no_warning (line 127) | def test_secret_32_char_no_warning(
  function test_secret_whitespace_stripped (line 140) | def test_secret_whitespace_stripped(mocker: MockerFixture):
  function test_secret_with_special_characters (line 149) | def test_secret_with_special_characters(mocker: MockerFixture):
  function test_secret_with_unicode (line 158) | def test_secret_with_unicode(mocker: MockerFixture):
  function test_secret_very_long (line 167) | def test_secret_very_long(mocker: MockerFixture):
  function test_secret_with_newline (line 177) | def test_secret_with_newline(mocker: MockerFixture):
  function test_secret_base64_encoded (line 186) | def test_secret_base64_encoded(mocker: MockerFixture):
  function test_secret_numeric_only (line 195) | def test_secret_numeric_only(mocker: MockerFixture):
  function test_algorithm_default_hs256 (line 204) | def test_algorithm_default_hs256(mocker: MockerFixture):
  function test_algorithm_whitespace_stripped (line 212) | def test_algorithm_whitespace_stripped(mocker: MockerFixture):
  function test_no_crypto_warning (line 225) | def test_no_crypto_warning(mocker: MockerFixture, caplog: pytest.LogCapt...
  function test_algorithm_invalid_raises_error (line 239) | def test_algorithm_invalid_raises_error(mocker: MockerFixture):
  function test_algorithm_none_raises_error (line 254) | def test_algorithm_none_raises_error(mocker: MockerFixture):
  function test_algorithm_symmetric_warning (line 269) | def test_algorithm_symmetric_warning(
  function test_algorithm_asymmetric_no_warning (line 291) | def test_algorithm_asymmetric_no_warning(

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/dependencies.py
  function get_optional_user_id (line 23) | def get_optional_user_id(
  function requires_user (line 55) | async def requires_user(jwt_payload: dict = fastapi.Security(get_jwt_pay...
  function requires_admin_user (line 65) | async def requires_admin_user(
  function get_user_id (line 77) | async def get_user_id(

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/dependencies_test.py
  class TestAuthDependencies (line 22) | class TestAuthDependencies:
    method app (line 26) | def app(self):
    method client (line 45) | def client(self, app):
    method test_requires_user_with_valid_jwt_payload (line 50) | async def test_requires_user_with_valid_jwt_payload(self, mocker: Mock...
    method test_requires_user_with_admin_jwt_payload (line 64) | async def test_requires_user_with_admin_jwt_payload(self, mocker: Mock...
    method test_requires_user_missing_sub (line 80) | async def test_requires_user_missing_sub(self):
    method test_requires_user_empty_sub (line 90) | async def test_requires_user_empty_sub(self):
    method test_requires_admin_user_with_admin (line 99) | async def test_requires_admin_user_with_admin(self, mocker: MockerFixt...
    method test_requires_admin_user_with_regular_user (line 115) | async def test_requires_admin_user_with_regular_user(self):
    method test_requires_admin_user_missing_role (line 125) | async def test_requires_admin_user_missing_role(self):
    method test_get_user_id_with_valid_payload (line 133) | async def test_get_user_id_with_valid_payload(self, mocker: MockerFixt...
    method test_get_user_id_missing_sub (line 146) | async def test_get_user_id_missing_sub(self):
    method test_get_user_id_none_sub (line 158) | async def test_get_user_id_none_sub(self):
  class TestAuthDependenciesIntegration (line 169) | class TestAuthDependenciesIntegration:
    method create_token (line 175) | def create_token(self, mocker: MockerFixture):
    method test_endpoint_auth_enabled_no_token (line 191) | async def test_endpoint_auth_enabled_no_token(self):
    method test_endpoint_with_valid_token (line 206) | async def test_endpoint_with_valid_token(self, create_token):
    method test_admin_endpoint_requires_admin_role (line 226) | async def test_admin_endpoint_requires_admin_role(self, create_token):
  class TestAuthDependenciesEdgeCases (line 260) | class TestAuthDependenciesEdgeCases:
    method test_dependency_with_complex_payload (line 264) | async def test_dependency_with_complex_payload(self):
    method test_dependency_with_unicode_in_payload (line 288) | async def test_dependency_with_unicode_in_payload(self):
    method test_dependency_with_null_values (line 302) | async def test_dependency_with_null_values(self):
    method test_concurrent_requests_isolation (line 317) | async def test_concurrent_requests_isolation(self):
    method test_dependency_error_cases (line 342) | async def test_dependency_error_cases(
    method test_dependency_valid_user (line 354) | async def test_dependency_valid_user(self):
  class TestAdminImpersonation (line 364) | class TestAdminImpersonation:
    method test_admin_impersonation_success (line 368) | async def test_admin_impersonation_success(self, mocker: MockerFixture):
    method test_non_admin_impersonation_attempt (line 404) | async def test_non_admin_impersonation_attempt(self, mocker: MockerFix...
    method test_impersonation_empty_header (line 431) | async def test_impersonation_empty_header(self, mocker: MockerFixture):
    method test_impersonation_missing_header (line 451) | async def test_impersonation_missing_header(self, mocker: MockerFixture):
    method test_impersonation_audit_logging_details (line 471) | async def test_impersonation_audit_logging_details(self, mocker: Mocke...
    method test_impersonation_header_case_sensitivity (line 506) | async def test_impersonation_header_case_sensitivity(self, mocker: Moc...
    method test_impersonation_with_whitespace_header (line 527) | async def test_impersonation_with_whitespace_header(self, mocker: Mock...

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/helpers.py
  function add_auth_responses_to_openapi (line 6) | def add_auth_responses_to_openapi(app: FastAPI) -> None:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/helpers_test.py
  function test_add_auth_responses_to_openapi_basic (line 15) | def test_add_auth_responses_to_openapi_basic():
  function test_add_auth_responses_to_openapi_with_security (line 60) | def test_add_auth_responses_to_openapi_with_security():
  function test_add_auth_responses_to_openapi_cached_schema (line 112) | def test_add_auth_responses_to_openapi_cached_schema():
  function test_add_auth_responses_to_openapi_existing_responses (line 127) | def test_add_auth_responses_to_openapi_existing_responses():
  function test_add_auth_responses_to_openapi_no_security_endpoints (line 167) | def test_add_auth_responses_to_openapi_no_security_endpoints():
  function test_add_auth_responses_to_openapi_multiple_security_schemes (line 194) | def test_add_auth_responses_to_openapi_multiple_security_schemes():
  function test_add_auth_responses_to_openapi_empty_components (line 226) | def test_add_auth_responses_to_openapi_empty_components():
  function test_add_auth_responses_to_openapi_all_http_methods (line 252) | def test_add_auth_responses_to_openapi_all_http_methods():
  function test_bearer_jwt_auth_scheme_config (line 294) | def test_bearer_jwt_auth_scheme_config():
  function test_add_auth_responses_with_no_routes (line 300) | def test_add_auth_responses_with_no_routes():
  function test_custom_openapi_function_replacement (line 316) | def test_custom_openapi_function_replacement():
  function test_endpoint_without_responses_section (line 331) | def test_endpoint_without_responses_section():
  function test_components_with_existing_responses (line 374) | def test_components_with_existing_responses():
  function test_openapi_schema_persistence (line 408) | def test_openapi_schema_persistence():

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/jwt_utils.py
  function get_jwt_payload (line 19) | async def get_jwt_payload(
  function parse_jwt_token (line 45) | def parse_jwt_token(token: str) -> dict[str, Any]:
  function verify_user (line 68) | def verify_user(jwt_payload: dict | None, admin_only: bool) -> User:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/jwt_utils_test.py
  function mock_config (line 35) | def mock_config(mocker: MockerFixture):
  function create_token (line 41) | def create_token(payload, secret=None, algorithm="HS256"):
  function test_parse_jwt_token_valid (line 48) | def test_parse_jwt_token_valid():
  function test_parse_jwt_token_expired (line 58) | def test_parse_jwt_token_expired():
  function test_parse_jwt_token_invalid_signature (line 71) | def test_parse_jwt_token_invalid_signature():
  function test_parse_jwt_token_malformed (line 81) | def test_parse_jwt_token_malformed():
  function test_parse_jwt_token_wrong_audience (line 99) | def test_parse_jwt_token_wrong_audience():
  function test_parse_jwt_token_missing_audience (line 109) | def test_parse_jwt_token_missing_audience():
  function test_get_jwt_payload_with_valid_token (line 119) | async def test_get_jwt_payload_with_valid_token():
  function test_get_jwt_payload_no_credentials (line 129) | async def test_get_jwt_payload_no_credentials():
  function test_get_jwt_payload_invalid_token (line 137) | async def test_get_jwt_payload_invalid_token():
  function test_verify_user_with_valid_user (line 149) | def test_verify_user_with_valid_user():
  function test_verify_user_with_admin (line 158) | def test_verify_user_with_admin():
  function test_verify_user_admin_only_with_regular_user (line 166) | def test_verify_user_admin_only_with_regular_user():
  function test_verify_user_no_payload (line 174) | def test_verify_user_no_payload():
  function test_verify_user_missing_sub (line 182) | def test_verify_user_missing_sub():
  function test_verify_user_empty_sub (line 191) | def test_verify_user_empty_sub():
  function test_verify_user_none_sub (line 200) | def test_verify_user_none_sub():
  function test_verify_user_missing_role_admin_check (line 209) | def test_verify_user_missing_role_admin_check():
  function test_jwt_with_additional_claims (line 220) | def test_jwt_with_additional_claims():
  function test_jwt_with_numeric_sub (line 238) | def test_jwt_with_numeric_sub():
  function test_jwt_with_very_long_sub (line 250) | def test_jwt_with_very_long_sub():
  function test_jwt_with_special_characters_in_claims (line 262) | def test_jwt_with_special_characters_in_claims():
  function test_jwt_with_future_iat (line 274) | def test_jwt_with_future_iat():
  function test_jwt_with_different_algorithms (line 289) | def test_jwt_with_different_algorithms():

FILE: autogpt_platform/autogpt_libs/autogpt_libs/auth/models.py
  class User (line 9) | class User:
    method from_payload (line 16) | def from_payload(cls, payload):

FILE: autogpt_platform/autogpt_libs/autogpt_libs/logging/config.py
  class LoggingConfig (line 37) | class LoggingConfig(BaseSettings):
    method parse_log_level (line 68) | def parse_log_level(cls, v):
  function configure_logging (line 77) | def configure_logging(force_cloud_logging: bool = False) -> None:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/logging/filters.py
  class BelowLevelFilter (line 4) | class BelowLevelFilter(logging.Filter):
    method __init__ (line 7) | def __init__(self, below_level: int):
    method filter (line 11) | def filter(self, record: logging.LogRecord):

FILE: autogpt_platform/autogpt_libs/autogpt_libs/logging/formatters.py
  class FancyConsoleFormatter (line 8) | class FancyConsoleFormatter(logging.Formatter):
    method format (line 28) | def format(self, record: logging.LogRecord) -> str:
  class AGPTFormatter (line 52) | class AGPTFormatter(FancyConsoleFormatter):
    method __init__ (line 53) | def __init__(self, *args, no_color: bool = False, **kwargs):
    method format (line 57) | def format(self, record: logging.LogRecord) -> str:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/logging/handlers.py
  class JsonFileHandler (line 7) | class JsonFileHandler(logging.FileHandler):
    method format (line 8) | def format(self, record: logging.LogRecord) -> str:
    method emit (line 12) | def emit(self, record: logging.LogRecord) -> None:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/logging/test_utils.py
  function test_remove_color_codes (line 35) | def test_remove_color_codes(raw_text, clean_text):

FILE: autogpt_platform/autogpt_libs/autogpt_libs/logging/utils.py
  function remove_color_codes (line 4) | def remove_color_codes(s: str) -> str:

FILE: autogpt_platform/autogpt_libs/autogpt_libs/rate_limit/config.py
  class RateLimitSettings (line 7) | class RateLimitSettings(BaseSettings):

FILE: autogpt_platform/autogpt_libs/autogpt_libs/rate_limit/limiter.py
  class RateLimiter (line 9) | class RateLimiter:
    method __init__ (line 10) | def __init__(
    method check_rate_limit (line 26) | async def check_rate_limit(self, api_key_id: str) -> Tuple[bool, int, ...

FILE: autogpt_platform/autogpt_libs/autogpt_libs/rate_limit/middleware.py
  function rate_limit_middleware (line 7) | async def rate_limit_middleware(request: Request, call_next: RequestResp...

FILE: autogpt_platform/autogpt_libs/autogpt_libs/supabase_integration_credentials_store/types.py
  class _BaseCredentials (line 7) | class _BaseCredentials(BaseModel):
    method dump_secret_strings (line 13) | def dump_secret_strings(value: Any, _info):
  class OAuth2Credentials (line 19) | class OAuth2Credentials(_BaseCredentials):
    method bearer (line 32) | def bearer(self) -> str:
  class APIKeyCredentials (line 36) | class APIKeyCredentials(_BaseCredentials):
    method bearer (line 42) | def bearer(self) -> str:
  class OAuthState (line 55) | class OAuthState(BaseModel):
  class UserMetadata (line 64) | class UserMetadata(BaseModel):
  class UserMetadataRaw (line 69) | class UserMetadataRaw(TypedDict, total=False):
  class UserIntegrations (line 74) | class UserIntegrations(BaseModel):

FILE: autogpt_platform/autogpt_libs/autogpt_libs/utils/synchronize.py
  class AsyncRedisKeyedMutex (line 12) | class AsyncRedisKeyedMutex:
    method __init__ (line 20) | def __init__(self, redis: "AsyncRedis", timeout: int | None = 60):
    method locked (line 29) | async def locked(self, key: Any):
    method acquire (line 37) | async def acquire(self, key: Any) -> "AsyncRedisLock":
    method release (line 48) | async def release(self, key: Any):
    method release_all_locks (line 56) | async def release_all_locks(self):

FILE: autogpt_platform/backend/backend/api/conftest.py
  function configured_snapshot (line 13) | def configured_snapshot(snapshot: Snapshot) -> Snapshot:
  function mock_jwt_user (line 20) | def mock_jwt_user(test_user_id):
  function mock_jwt_admin (line 31) | def mock_jwt_admin(admin_user_id):

FILE: autogpt_platform/backend/backend/api/conn_manager.py
  class ConnectionManager (line 19) | class ConnectionManager:
    method __init__ (line 20) | def __init__(self):
    method connect_socket (line 25) | async def connect_socket(self, websocket: WebSocket, *, user_id: str):
    method disconnect_socket (line 32) | def disconnect_socket(self, websocket: WebSocket, *, user_id: str):
    method subscribe_graph_exec (line 42) | async def subscribe_graph_exec(
    method subscribe_graph_execs (line 49) | async def subscribe_graph_execs(
    method unsubscribe_graph_exec (line 56) | async def unsubscribe_graph_exec(
    method unsubscribe_graph_execs (line 63) | async def unsubscribe_graph_execs(
    method send_execution_update (line 70) | async def send_execution_update(
    method send_notification (line 105) | async def send_notification(
    method _subscribe (line 125) | async def _subscribe(self, channel_key: str, websocket: WebSocket) -> ...
    method _unsubscribe (line 131) | async def _unsubscribe(self, channel_key: str, websocket: WebSocket) -...
  function _graph_exec_channel_key (line 140) | def _graph_exec_channel_key(user_id: str, *, graph_exec_id: str) -> str:
  function _graph_execs_channel_key (line 144) | def _graph_execs_channel_key(user_id: str, *, graph_id: str) -> str:

FILE: autogpt_platform/backend/backend/api/conn_manager_test.py
  function connection_manager (line 17) | def connection_manager() -> ConnectionManager:
  function mock_websocket (line 22) | def mock_websocket() -> AsyncMock:
  function test_connect (line 29) | async def test_connect(
  function test_disconnect (line 38) | def test_disconnect(
  function test_subscribe (line 53) | async def test_subscribe(
  function test_unsubscribe (line 68) | async def test_unsubscribe(
  function test_send_graph_execution_result (line 84) | async def test_send_graph_execution_result(
  function test_send_node_execution_result (line 128) | async def test_send_node_execution_result(
  function test_send_execution_result_user_mismatch (line 162) | async def test_send_execution_result_user_mismatch(
  function test_send_execution_result_no_subscribers (line 190) | async def test_send_execution_result_no_subscribers(
  function test_send_notification (line 216) | async def test_send_notification(

FILE: autogpt_platform/backend/backend/api/external/middleware.py
  function require_api_key (line 18) | async def require_api_key(api_key: str | None = Security(api_key_header)...
  function require_access_token (line 35) | async def require_access_token(
  function require_auth (line 53) | async def require_auth(
  function require_permission (line 91) | def require_permission(*permissions: APIKeyPermission):

FILE: autogpt_platform/backend/backend/api/external/v1/integrations.py
  class OAuthInitiateRequest (line 53) | class OAuthInitiateRequest(BaseModel):
  class OAuthInitiateResponse (line 68) | class OAuthInitiateResponse(BaseModel):
  class OAuthCompleteRequest (line 78) | class OAuthCompleteRequest(BaseModel):
  class OAuthCompleteResponse (line 85) | class OAuthCompleteResponse(BaseModel):
  class ProviderInfo (line 99) | class ProviderInfo(BaseModel):
  class CreateAPIKeyCredentialRequest (line 113) | class CreateAPIKeyCredentialRequest(BaseModel):
  class CreateUserPasswordCredentialRequest (line 124) | class CreateUserPasswordCredentialRequest(BaseModel):
  class CreateHostScopedCredentialRequest (line 133) | class CreateHostScopedCredentialRequest(BaseModel):
  class CreateCredentialResponse (line 151) | class CreateCredentialResponse(BaseModel):
  function validate_callback_url (line 163) | def validate_callback_url(callback_url: str) -> bool:
  function _get_oauth_handler_for_external (line 188) | def _get_oauth_handler_for_external(
  function list_providers (line 250) | async def list_providers(
  function initiate_oauth (line 312) | async def initiate_oauth(
  function complete_oauth (line 391) | async def complete_oauth(
  function list_credentials (line 470) | async def list_credentials(
  function list_credentials_by_provider (line 489) | async def list_credentials_by_provider(
  function create_credential (line 512) | async def create_credential(
  class DeleteCredentialResponse (line 592) | class DeleteCredentialResponse(BaseModel):
  function delete_credential (line 603) | async def delete_credential(

FILE: autogpt_platform/backend/backend/api/external/v1/routes.py
  class UserInfoResponse (line 37) | class UserInfoResponse(BaseModel):
  function get_user_info (line 51) | async def get_user_info(
  function get_graph_blocks (line 71) | async def get_graph_blocks() -> Sequence[dict[Any, Any]]:
  function execute_graph_block (line 81) | async def execute_graph_block(
  function create_graph (line 112) | async def create_graph(
  function execute_graph (line 141) | async def execute_graph(
  class ExecutionNode (line 162) | class ExecutionNode(TypedDict):
  class GraphExecutionResult (line 168) | class GraphExecutionResult(TypedDict):
  function get_graph_execution_results (line 179) | async def get_graph_execution_results(
  function get_store_agents (line 237) | async def get_store_agents(
  function get_store_agent (line 285) | async def get_store_agent(
  function get_store_creators (line 313) | async def get_store_creators(
  function get_store_creator (line 355) | async def get_store_creator(

FILE: autogpt_platform/backend/backend/api/external/v1/tools.py
  class FindAgentRequest (line 33) | class FindAgentRequest(BaseModel):
  class RunAgentRequest (line 37) | class RunAgentRequest(BaseModel):
  function _create_ephemeral_session (line 73) | def _create_ephemeral_session(user_id: str) -> ChatSession:
  function find_agent (line 81) | async def find_agent(
  function run_agent (line 108) | async def run_agent(
  function _response_to_dict (line 150) | def _response_to_dict(result: ToolResponseBase) -> dict[str, Any]:

FILE: autogpt_platform/backend/backend/api/features/admin/credit_admin_routes.py
  function add_user_credits (line 26) | async def add_user_credits(
  function admin_get_all_user_history (line 53) | async def admin_get_all_user_history(

FILE: autogpt_platform/backend/backend/api/features/admin/credit_admin_routes_test.py
  function setup_app_admin_auth (line 26) | def setup_app_admin_auth(mock_jwt_admin):
  function test_add_user_credits_success (line 33) | def test_add_user_credits_success(
  function test_add_user_credits_negative_amount (line 87) | def test_add_user_credits_negative_amount(
  function test_get_user_history_success (line 122) | def test_get_user_history_success(
  function test_get_user_history_with_filters (line 173) | def test_get_user_history_with_filters(
  function test_get_user_history_empty_results (line 233) | def test_get_user_history_empty_results(
  function test_add_credits_invalid_request (line 269) | def test_add_credits_invalid_request() -> None:
  function test_admin_endpoints_require_admin_role (line 297) | def test_admin_endpoints_require_admin_role(mock_jwt_user) -> None:

FILE: autogpt_platform/backend/backend/api/features/admin/execution_analytics_routes.py
  class ExecutionAnalyticsRequest (line 34) | class ExecutionAnalyticsRequest(BaseModel):
  class ExecutionAnalyticsResult (line 58) | class ExecutionAnalyticsResult(BaseModel):
  class ExecutionAnalyticsResponse (line 71) | class ExecutionAnalyticsResponse(BaseModel):
  class ModelInfo (line 80) | class ModelInfo(BaseModel):
  class ExecutionAnalyticsConfig (line 86) | class ExecutionAnalyticsConfig(BaseModel):
  class AccuracyTrendsRequest (line 93) | class AccuracyTrendsRequest(BaseModel):
  function get_execution_analytics_config (line 117) | async def get_execution_analytics_config(
  function generate_execution_analytics (line 211) | async def generate_execution_analytics(
  function _process_batch (line 347) | async def _process_batch(
  function get_execution_accuracy_trends (line 454) | async def get_execution_accuracy_trends(

FILE: autogpt_platform/backend/backend/api/features/admin/model.py
  class UserHistoryResponse (line 7) | class UserHistoryResponse(BaseModel):
  class AddUserCreditsResponse (line 14) | class AddUserCreditsResponse(BaseModel):

FILE: autogpt_platform/backend/backend/api/features/admin/store_admin_routes.py
  function get_admin_listings_with_versions (line 30) | async def get_admin_listings_with_versions(
  function review_submission (line 64) | async def review_submission(
  function admin_download_agent_file (line 103) | async def admin_download_agent_file(
  function admin_preview_submission (line 143) | async def admin_preview_submission(
  function admin_add_agent_to_library (line 159) | async def admin_add_agent_to_library(

FILE: autogpt_platform/backend/backend/api/features/admin/store_admin_routes_test.py
  function _make_mock_graph (line 33) | def _make_mock_graph(user_id: str = CREATOR_USER_ID) -> MagicMock:
  function test_admin_can_access_pending_agent_not_owned (line 46) | async def test_admin_can_access_pending_agent_not_owned() -> None:
  function test_admin_download_pending_agent_with_subagents (line 72) | async def test_admin_download_pending_agent_with_subagents() -> None:
  function _not_found_handler (line 116) | async def _not_found_handler(
  function setup_app_admin_auth (line 126) | def setup_app_admin_auth(mock_jwt_admin):
  function test_preview_requires_admin (line 133) | def test_preview_requires_admin(mock_jwt_user) -> None:
  function test_add_to_library_requires_admin (line 140) | def test_add_to_library_requires_admin(mock_jwt_user) -> None:
  function test_preview_nonexistent_submission (line 147) | def test_preview_nonexistent_submission(
  function test_preview_queries_store_listing_version_not_store_agent (line 164) | async def test_preview_queries_store_listing_version_not_store_agent() -...
  function test_resolve_graph_admin_uses_get_graph_as_admin (line 224) | async def test_resolve_graph_admin_uses_get_graph_as_admin() -> None:
  function test_resolve_graph_regular_uses_get_graph (line 262) | async def test_resolve_graph_regular_uses_get_graph() -> None:
  function test_library_member_can_view_pending_agent_in_builder (line 302) | async def test_library_member_can_view_pending_agent_in_builder() -> None:

FILE: autogpt_platform/backend/backend/api/features/analytics.py
  class LogRawMetricRequest (line 17) | class LogRawMetricRequest(pydantic.BaseModel):
  function log_raw_metric (line 24) | async def log_raw_metric(
  function log_raw_analytics (line 50) | async def log_raw_analytics(

FILE: autogpt_platform/backend/backend/api/features/analytics_test.py
  function setup_app_auth (line 21) | def setup_app_auth(mock_jwt_user):
  function test_log_raw_metric_success (line 35) | def test_log_raw_metric_success(
  function test_log_raw_metric_various_values (line 83) | def test_log_raw_metric_various_values(
  function test_log_raw_metric_validation_errors (line 145) | def test_log_raw_metric_validation_errors(
  function test_log_raw_metric_service_error (line 162) | def test_log_raw_metric_service_error(
  function test_log_raw_analytics_success (line 192) | def test_log_raw_analytics_success(
  function test_log_raw_analytics_complex_data (line 234) | def test_log_raw_analytics_complex_data(
  function test_log_raw_analytics_validation_errors (line 301) | def test_log_raw_analytics_validation_errors(
  function test_log_raw_analytics_service_error (line 318) | def test_log_raw_analytics_service_error(

FILE: autogpt_platform/backend/backend/api/features/builder/db.py
  class _ScoredItem (line 59) | class _ScoredItem:
  class _SearchCacheEntry (line 67) | class _SearchCacheEntry:
  function get_block_categories (line 72) | def get_block_categories(category_blocks: int = 3) -> list[BlockCategory...
  function get_blocks (line 103) | def get_blocks(
  function get_block_by_id (line 167) | def get_block_by_id(block_id: str) -> BlockInfo | None:
  function update_search (line 178) | async def update_search(user_id: str, search: SearchEntry) -> str:
  function get_recent_searches (line 208) | async def get_recent_searches(user_id: str, limit: int = 5) -> list[Sear...
  function get_sorted_search_results (line 232) | async def get_sorted_search_results(
  function _build_cached_search_results (line 250) | async def _build_cached_search_results(
  function _collect_block_results (line 332) | def _collect_block_results(
  function _text_search_blocks (line 385) | async def _text_search_blocks(
  function _build_library_items (line 457) | def _build_library_items(
  function _build_marketplace_items (line 481) | def _build_marketplace_items(
  function get_providers (line 505) | def get_providers(
  function get_counts (line 544) | async def get_counts(user_id: str) -> CountResponse:
  function _get_static_counts (line 560) | async def _get_static_counts():
  function _contains_type (line 603) | def _contains_type(annotation: Any, target: type) -> bool:
  function _matches_llm_model (line 613) | def _matches_llm_model(schema_cls: type[BlockSchema], query: str) -> bool:
  function _score_library_agent (line 622) | def _score_library_agent(
  function _score_store_agent (line 642) | def _score_store_agent(
  function _score_primary_fields (line 660) | def _score_primary_fields(name: str, description: str, query: str) -> fl...
  function _score_additional_field (line 677) | def _score_additional_field(
  function _should_include_item (line 693) | def _should_include_item(score: float, normalized_query: str) -> bool:
  function _get_item_name (line 699) | def _get_item_name(item: SearchResultItem) -> str:
  function _get_all_providers (line 708) | def _get_all_providers() -> dict[ProviderName, Provider]:
  function get_suggested_blocks (line 729) | async def get_suggested_blocks(count: int = 5) -> list[BlockInfo]:

FILE: autogpt_platform/backend/backend/api/features/builder/model.py
  class SearchEntry (line 21) | class SearchEntry(BaseModel):
  class SuggestionsResponse (line 29) | class SuggestionsResponse(BaseModel):
  class BlockCategoryResponse (line 36) | class BlockCategoryResponse(BaseModel):
  class BlockResponse (line 45) | class BlockResponse(BaseModel):
  class Provider (line 51) | class Provider(BaseModel):
  class ProviderResponse (line 57) | class ProviderResponse(BaseModel):
  class SearchResponse (line 62) | class SearchResponse(BaseModel):
  class CountResponse (line 69) | class CountResponse(BaseModel):

FILE: autogpt_platform/backend/backend/api/features/builder/routes.py
  function sanitize_query (line 23) | def sanitize_query(query: str | None) -> str | None:
  function get_suggestions (line 47) | async def get_suggestions(
  function get_block_categories (line 72) | async def get_block_categories(
  function get_blocks (line 86) | async def get_blocks(
  function get_specific_blocks (line 110) | async def get_specific_blocks(
  function get_providers (line 129) | async def get_providers(
  function search (line 148) | async def search(
  function get_counts (line 226) | async def get_counts(

FILE: autogpt_platform/backend/backend/api/features/chat/routes.py
  function _validate_and_get_session (line 75) | async def _validate_and_get_session(
  class StreamChatRequest (line 93) | class StreamChatRequest(BaseModel):
  class CreateSessionResponse (line 104) | class CreateSessionResponse(BaseModel):
  class ActiveStreamInfo (line 112) | class ActiveStreamInfo(BaseModel):
  class SessionDetailResponse (line 119) | class SessionDetailResponse(BaseModel):
  class SessionSummaryResponse (line 132) | class SessionSummaryResponse(BaseModel):
  class ListSessionsResponse (line 142) | class ListSessionsResponse(BaseModel):
  class CancelSessionResponse (line 149) | class CancelSessionResponse(BaseModel):
  class UpdateSessionTitleRequest (line 156) | class UpdateSessionTitleRequest(BaseModel):
    method title_must_not_be_blank (line 163) | def title_must_not_be_blank(cls, v: str) -> str:
  function list_sessions (line 177) | async def list_sessions(
  function create_session (line 238) | async def create_session(
  function delete_session (line 273) | async def delete_session(
  function update_session_title_route (line 323) | async def update_session_title_route(
  function get_session (line 356) | async def get_session(
  function get_copilot_usage (line 418) | async def get_copilot_usage(
  function cancel_session_task (line 436) | async def cancel_session_task(
  function stream_chat_post (line 480) | async def stream_chat_post(
  function resume_session_stream (line 771) | async def resume_session_stream(
  function session_assign_user (line 876) | async def session_assign_user(
  function get_ttl_config (line 901) | async def get_ttl_config() -> dict:
  function health_check (line 921) | async def health_check() -> dict:
  function _tool_response_schema (line 990) | async def _tool_response_schema() -> ToolResponseUnion:  # type: ignore[...

FILE: autogpt_platform/backend/backend/api/features/chat/routes_test.py
  function setup_app_auth (line 22) | def setup_app_auth(mock_jwt_user):
  function _mock_update_session_title (line 31) | def _mock_update_session_title(
  function test_update_title_success (line 45) | def test_update_title_success(
  function test_update_title_trims_whitespace (line 61) | def test_update_title_trims_whitespace(
  function test_update_title_blank_rejected (line 79) | def test_update_title_blank_rejected(
  function test_update_title_empty_rejected (line 91) | def test_update_title_empty_rejected(
  function test_update_title_not_found (line 105) | def test_update_title_not_found(
  function test_stream_chat_rejects_too_many_file_ids (line 122) | def test_stream_chat_rejects_too_many_file_ids():
  function _mock_stream_internals (line 134) | def _mock_stream_internals(mocker: pytest_mock.MockFixture):
  function test_stream_chat_accepts_20_file_ids (line 161) | def test_stream_chat_accepts_20_file_ids(mocker: pytest_mock.MockFixture):
  function test_file_ids_filters_invalid_uuids (line 190) | def test_file_ids_filters_invalid_uuids(mocker: pytest_mock.MockFixture):
  function test_file_ids_scoped_to_workspace (line 229) | def test_file_ids_scoped_to_workspace(mocker: pytest_mock.MockFixture):
  function test_stream_chat_returns_429_on_daily_rate_limit (line 258) | def test_stream_chat_returns_429_on_daily_rate_limit(mocker: pytest_mock...
  function test_stream_chat_returns_429_on_weekly_rate_limit (line 279) | def test_stream_chat_returns_429_on_weekly_rate_limit(mocker: pytest_moc...
  function test_stream_chat_429_includes_reset_time (line 302) | def test_stream_chat_429_includes_reset_time(mocker: pytest_mock.MockFix...
  function _mock_usage (line 329) | def _mock_usage(
  function test_usage_returns_daily_and_weekly (line 350) | def test_usage_returns_daily_and_weekly(
  function test_usage_uses_config_limits (line 374) | def test_usage_uses_config_limits(
  function test_usage_rejects_unauthenticated_request (line 394) | def test_usage_rejects_unauthenticated_request() -> None:

FILE: autogpt_platform/backend/backend/api/features/executions/review/model.py
  class PendingHumanReviewModel (line 15) | class PendingHumanReviewModel(BaseModel):
    method from_db (line 74) | def from_db(
  class ReviewItem (line 109) | class ReviewItem(BaseModel):
    method validate_reviewed_data (line 132) | def validate_reviewed_data(cls, v):
    method validate_message (line 183) | def validate_message(cls, v):
  class ReviewRequest (line 190) | class ReviewRequest(BaseModel):
    method validate_review_completeness (line 206) | def validate_review_completeness(self):
  class ReviewResponse (line 220) | class ReviewResponse(BaseModel):

FILE: autogpt_platform/backend/backend/api/features/executions/review/review_routes_test.py
  function client (line 26) | async def client(server, mock_jwt_user) -> AsyncGenerator[httpx.AsyncCli...
  function sample_pending_review (line 44) | def sample_pending_review(test_user_id: str) -> PendingHumanReviewModel:
  function test_get_pending_reviews_empty (line 67) | async def test_get_pending_reviews_empty(
  function test_get_pending_reviews_with_data (line 87) | async def test_get_pending_reviews_with_data(
  function test_get_pending_reviews_for_execution_success (line 111) | async def test_get_pending_reviews_for_execution_success(
  function test_get_pending_reviews_for_execution_not_available (line 141) | async def test_get_pending_reviews_for_execution_not_available(
  function test_process_review_action_approve_success (line 158) | async def test_process_review_action_approve_success(
  function test_process_review_action_reject_success (line 238) | async def test_process_review_action_reject_success(
  function test_process_review_action_mixed_success (line 314) | async def test_process_review_action_mixed_success(
  function test_process_review_action_empty_request (line 440) | async def test_process_review_action_empty_request(
  function test_process_review_action_review_not_found (line 459) | async def test_process_review_action_review_not_found(
  function test_process_review_action_partial_failure (line 513) | async def test_process_review_action_partial_failure(
  function test_process_review_action_invalid_node_exec_id (line 563) | async def test_process_review_action_invalid_node_exec_id(
  function test_process_review_action_auto_approve_creates_auto_approval_records (line 603) | async def test_process_review_action_auto_approve_creates_auto_approval_...
  function test_process_review_action_without_auto_approve_still_loads_settings (line 733) | async def test_process_review_action_without_auto_approve_still_loads_se...
  function test_process_review_action_auto_approve_only_applies_to_approved_reviews (line 846) | async def test_process_review_action_auto_approve_only_applies_to_approv...
  function test_process_review_action_per_review_auto_approve_granularity (line 1027) | async def test_process_review_action_per_review_auto_approve_granularity(

FILE: autogpt_platform/backend/backend/api/features/executions/review/routes.py
  function _resolve_node_ids (line 44) | async def _resolve_node_ids(
  function list_pending_reviews (line 85) | async def list_pending_reviews(
  function list_pending_reviews_for_execution (line 122) | async def list_pending_reviews_for_execution(
  function process_review_action (line 165) | async def process_review_action(

FILE: autogpt_platform/backend/backend/api/features/integrations/conftest.py
  function server (line 7) | def server():
  function graph_cleanup (line 12) | def graph_cleanup():

FILE: autogpt_platform/backend/backend/api/features/integrations/models.py
  function get_all_provider_names (line 14) | def get_all_provider_names() -> list[str]:
  class ProviderNamesResponse (line 41) | class ProviderNamesResponse(BaseModel):
  class ProviderConstants (line 50) | class ProviderConstants(BaseModel):

FILE: autogpt_platform/backend/backend/api/features/integrations/router.py
  class LoginResponse (line 71) | class LoginResponse(BaseModel):
  function login (line 77) | async def login(
  class CredentialsMetaResponse (line 102) | class CredentialsMetaResponse(BaseModel):
    method _normalize_provider (line 116) | def _normalize_provider(cls, data: Any) -> Any:
    method get_host (line 129) | def get_host(cred: Credentials) -> str | None:
  function to_meta_response (line 142) | def to_meta_response(cred: Credentials) -> CredentialsMetaResponse:
  function callback (line 155) | async def callback(
  function list_credentials (line 224) | async def list_credentials(
  function list_credentials_by_provider (line 235) | async def list_credentials_by_provider(
  function get_credential (line 251) | async def get_credential(
  function create_credentials (line 275) | async def create_credentials(
  class CredentialsDeletionResponse (line 299) | class CredentialsDeletionResponse(BaseModel):
  class CredentialsDeletionNeedsConfirmationResponse (line 308) | class CredentialsDeletionNeedsConfirmationResponse(BaseModel):
  class AyrshareSSOResponse (line 314) | class AyrshareSSOResponse(BaseModel):
  function delete_credentials (line 320) | async def delete_credentials(
  function webhook_ingress_generic (line 372) | async def webhook_ingress_generic(
  function webhook_ping (line 433) | async def webhook_ping(
  function _execute_webhook_node_trigger (line 458) | async def _execute_webhook_node_trigger(
  function _execute_webhook_preset_trigger (line 494) | async def _execute_webhook_preset_trigger(
  function remove_all_webhooks_for_credentials (line 560) | async def remove_all_webhooks_for_credentials(
  function _cleanup_orphaned_webhook_for_graph (line 597) | async def _cleanup_orphaned_webhook_for_graph(
  function _get_provider_oauth_handler (line 689) | def _get_provider_oauth_handler(
  function get_ayrshare_sso_url (line 764) | async def get_ayrshare_sso_url(
  function list_providers (line 851) | async def list_providers() -> List[str]:
  function list_system_providers (line 867) | async def list_system_providers() -> List[str]:
  function get_provider_names (line 879) | async def get_provider_names() -> ProviderNamesResponse:
  function get_provider_constants (line 891) | async def get_provider_constants() -> ProviderConstants:
  class ProviderEnumResponse (line 902) | class ProviderEnumResponse(BaseModel):
  function get_provider_enum_example (line 911) | async def get_provider_enum_example() -> ProviderEnumResponse:

FILE: autogpt_platform/backend/backend/api/features/integrations/router_test.py
  function _make_api_key_cred (line 25) | def _make_api_key_cred(cred_id: str = "cred-123", provider: str = "opena...
  function _make_oauth2_cred (line 34) | def _make_oauth2_cred(cred_id: str = "cred-456", provider: str = "github"):
  function _make_user_password_cred (line 46) | def _make_user_password_cred(cred_id: str = "cred-789", provider: str = ...
  function _make_host_scoped_cred (line 56) | def _make_host_scoped_cred(cred_id: str = "cred-host", provider: str = "...
  function _make_sdk_default_cred (line 66) | def _make_sdk_default_cred(provider: str = "openai"):
  function setup_auth (line 76) | def setup_auth(mock_jwt_user):
  class TestGetCredentialReturnsMetaOnly (line 84) | class TestGetCredentialReturnsMetaOnly:
    method test_api_key_credential_no_secret (line 87) | def test_api_key_credential_no_secret(self):
    method test_oauth2_credential_no_secret (line 104) | def test_oauth2_credential_no_secret(self):
    method test_user_password_credential_no_secret (line 121) | def test_user_password_credential_no_secret(self):
    method test_host_scoped_credential_no_secret (line 137) | def test_host_scoped_credential_no_secret(self):
    method test_get_credential_wrong_provider_returns_404 (line 152) | def test_get_credential_wrong_provider_returns_404(self):
    method test_list_credentials_no_secrets (line 164) | def test_list_credentials_no_secrets(self):
  class TestSdkDefaultCredentialsNotAccessible (line 180) | class TestSdkDefaultCredentialsNotAccessible:
    method test_get_sdk_default_returns_404 (line 183) | def test_get_sdk_default_returns_404(self):
    method test_list_credentials_excludes_sdk_defaults (line 193) | def test_list_credentials_excludes_sdk_defaults(self):
    method test_list_by_provider_excludes_sdk_defaults (line 208) | def test_list_by_provider_excludes_sdk_defaults(self):
    method test_delete_sdk_default_returns_404 (line 225) | def test_delete_sdk_default_returns_404(self):
  class TestCreateCredentialNoSecretInResponse (line 236) | class TestCreateCredentialNoSecretInResponse:
    method test_create_api_key_no_secret_in_response (line 239) | def test_create_api_key_no_secret_in_response(self):
    method test_create_with_sdk_default_id_rejected (line 261) | def test_create_with_sdk_default_id_rejected(self):

FILE: autogpt_platform/backend/backend/api/features/library/_add_to_library.py
  function resolve_graph_for_library (line 25) | async def resolve_graph_for_library(
  function add_graph_to_library (line 59) | async def add_graph_to_library(

FILE: autogpt_platform/backend/backend/api/features/library/_add_to_library_test.py
  function test_add_graph_to_library_restores_archived_agent (line 9) | async def test_add_graph_to_library_restores_archived_agent() -> None:
  function test_add_graph_to_library_restores_deleted_agent (line 42) | async def test_add_graph_to_library_restores_deleted_agent() -> None:

FILE: autogpt_platform/backend/backend/api/features/library/db.py
  function list_library_agents (line 46) | async def list_library_agents(
  function list_favorite_library_agents (line 164) | async def list_favorite_library_agents(
  function get_library_agent (line 241) | async def get_library_agent(id: str, user_id: str) -> library_model.Libr...
  function get_library_agent_by_store_version_id (line 300) | async def get_library_agent_by_store_version_id(
  function get_library_agent_by_graph_id (line 335) | async def get_library_agent_by_graph_id(
  function add_generated_agent_image (line 364) | async def add_generated_agent_image(
  function create_library_agent (line 397) | async def create_library_agent(
  function update_agent_version_in_library (line 480) | async def update_agent_version_in_library(
  function create_graph_in_library (line 542) | async def create_graph_in_library(
  function update_graph_in_library (line 568) | async def update_graph_in_library(
  function update_library_agent_version_and_settings (line 611) | async def update_library_agent_version_and_settings(
  function update_library_agent (line 632) | async def update_library_agent(
  function delete_library_agent (line 729) | async def delete_library_agent(
  function _cleanup_schedules_for_graph (line 762) | async def _cleanup_schedules_for_graph(graph_id: str, user_id: str) -> N...
  function _cleanup_webhooks_for_graph (line 787) | async def _cleanup_webhooks_for_graph(graph_id: str, user_id: str) -> None:
  function delete_library_agent_by_graph_id (line 814) | async def delete_library_agent_by_graph_id(graph_id: str, user_id: str) ...
  function add_store_agent_to_library (line 823) | async def add_store_agent_to_library(
  function add_store_agent_to_library_as_admin (line 843) | async def add_store_agent_to_library_as_admin(
  function _fetch_user_folders (line 865) | async def _fetch_user_folders(
  function list_folders (line 896) | async def list_folders(
  function get_folder_tree (line 931) | async def get_folder_tree(
  function get_folder (line 973) | async def get_folder(
  function _is_descendant_of (line 1009) | async def _is_descendant_of(
  function create_folder (line 1046) | async def create_folder(
  function create_folder_with_unique_name (line 1099) | async def create_folder_with_unique_name(
  function update_folder (line 1135) | async def update_folder(
  function move_folder (line 1197) | async def move_folder(
  function delete_folder (line 1257) | async def delete_folder(
  function _get_descendant_folder_ids (line 1317) | async def _get_descendant_folder_ids(
  function move_agent_to_folder (line 1357) | async def move_agent_to_folder(
  function bulk_move_agents_to_folder (line 1396) | async def bulk_move_agents_to_folder(
  function collect_tree_ids (line 1447) | def collect_tree_ids(
  function get_folder_agent_summaries (line 1464) | async def get_folder_agent_summaries(
  function get_root_agent_summaries (line 1481) | async def get_root_agent_summaries(
  function get_folder_agents_map (line 1498) | async def get_folder_agents_map(
  function list_presets (line 1513) | async def list_presets(
  function get_preset (line 1572) | async def get_preset(
  function create_preset (line 1598) | async def create_preset(
  function create_preset_from_graph_execution (line 1644) | async def create_preset_from_graph_execution(
  function update_preset (line 1702) | async def update_preset(
  function set_preset_webhook (line 1778) | async def set_preset_webhook(
  function delete_preset (line 1802) | async def delete_preset(user_id: str, preset_id: str) -> None:
  function fork_library_agent (line 1820) | async def fork_library_agent(

FILE: autogpt_platform/backend/backend/api/features/library/db_test.py
  function test_get_library_agents (line 14) | async def test_get_library_agents(mocker):
  function test_add_agent_to_library (line 85) | async def test_add_agent_to_library(mocker):
  function test_add_agent_to_library_not_found (line 214) | async def test_add_agent_to_library_not_found(mocker):
  function test_get_library_agent_by_graph_id_excludes_archived (line 235) | async def test_get_library_agent_by_graph_id_excludes_archived(mocker):
  function test_get_library_agent_by_graph_id_can_include_archived (line 254) | async def test_get_library_agent_by_graph_id_can_include_archived(mocker):
  function test_update_graph_in_library_allows_archived_library_agent (line 277) | async def test_update_graph_in_library_allows_archived_library_agent(moc...

FILE: autogpt_platform/backend/backend/api/features/library/exceptions.py
  class FolderValidationError (line 1) | class FolderValidationError(Exception):
  class FolderAlreadyExistsError (line 7) | class FolderAlreadyExistsError(FolderValidationError):

FILE: autogpt_platform/backend/backend/api/features/library/model.py
  class LibraryAgentStatus (line 22) | class LibraryAgentStatus(str, Enum):
  class LibraryFolder (line 32) | class LibraryFolder(pydantic.BaseModel):
    method from_db (line 47) | def from_db(
  class LibraryFolderTree (line 67) | class LibraryFolderTree(LibraryFolder):
  class FolderCreateRequest (line 73) | class FolderCreateRequest(pydantic.BaseModel):
  class FolderUpdateRequest (line 84) | class FolderUpdateRequest(pydantic.BaseModel):
  class FolderMoveRequest (line 92) | class FolderMoveRequest(pydantic.BaseModel):
  class BulkMoveAgentsRequest (line 98) | class BulkMoveAgentsRequest(pydantic.BaseModel):
  class FolderListResponse (line 105) | class FolderListResponse(pydantic.BaseModel):
  class FolderTreeResponse (line 112) | class FolderTreeResponse(pydantic.BaseModel):
  class MarketplaceListingCreator (line 118) | class MarketplaceListingCreator(pydantic.BaseModel):
  class MarketplaceListing (line 126) | class MarketplaceListing(pydantic.BaseModel):
  class RecentExecution (line 135) | class RecentExecution(pydantic.BaseModel):
  function _parse_settings (line 147) | def _parse_settings(settings: dict | str | None) -> GraphSettings:
  class LibraryAgent (line 159) | class LibraryAgent(pydantic.BaseModel):
    method from_db (line 221) | def from_db(
  class AgentStatusResult (line 362) | class AgentStatusResult(pydantic.BaseModel):
  function _calculate_agent_status (line 367) | def _calculate_agent_status(
  class LibraryAgentResponse (line 408) | class LibraryAgentResponse(pydantic.BaseModel):
  class LibraryAgentPresetCreatable (line 415) | class LibraryAgentPresetCreatable(pydantic.BaseModel):
  class LibraryAgentPresetCreatableFromGraphExecution (line 434) | class LibraryAgentPresetCreatableFromGraphExecution(pydantic.BaseModel):
  class LibraryAgentPresetUpdatable (line 447) | class LibraryAgentPresetUpdatable(pydantic.BaseModel):
  class TriggeredPresetSetupRequest (line 461) | class TriggeredPresetSetupRequest(pydantic.BaseModel):
  class LibraryAgentPreset (line 474) | class LibraryAgentPreset(LibraryAgentPresetCreatable):
    method from_db (line 485) | def from_db(cls, preset: prisma.models.AgentPreset) -> "LibraryAgentPr...
  class LibraryAgentPresetResponse (line 523) | class LibraryAgentPresetResponse(pydantic.BaseModel):
  class LibraryAgentFilter (line 530) | class LibraryAgentFilter(str, Enum):
  class LibraryAgentSort (line 537) | class LibraryAgentSort(str, Enum):
  class LibraryAgentUpdateRequest (line 544) | class LibraryAgentUpdateRequest(pydantic.BaseModel):

FILE: autogpt_platform/backend/backend/api/features/library/model_test.py
  function test_agent_preset_from_db (line 10) | async def test_agent_preset_from_db(test_user_id: str):

FILE: autogpt_platform/backend/backend/api/features/library/routes/agents.py
  function list_library_agents (line 25) | async def list_library_agents(
  function list_favorite_library_agents (line 71) | async def list_favorite_library_agents(
  function get_library_agent (line 95) | async def get_library_agent(
  function get_library_agent_by_graph_id (line 103) | async def get_library_agent_by_graph_id(
  function get_library_agent_by_store_listing_version_id (line 125) | async def get_library_agent_by_store_listing_version_id(
  function add_marketplace_agent_to_library (line 142) | async def add_marketplace_agent_to_library(
  function update_library_agent (line 165) | async def update_library_agent(
  function delete_library_agent (line 189) | async def delete_library_agent(
  function fork_library_agent (line 203) | async def fork_library_agent(

FILE: autogpt_platform/backend/backend/api/features/library/routes/folders.py
  function list_folders (line 26) | async def list_folders(
  function get_folder_tree (line 73) | async def get_folder_tree(
  function get_folder (line 99) | async def get_folder(
  function create_folder (line 129) | async def create_folder(
  function update_folder (line 164) | async def update_folder(
  function move_folder (line 201) | async def move_folder(
  function delete_folder (line 234) | async def delete_folder(
  function bulk_move_agents (line 269) | async def bulk_move_agents(

FILE: autogpt_platform/backend/backend/api/features/library/routes/presets.py
  function list_presets (line 34) | async def list_presets(
  function get_preset (line 73) | async def get_preset(
  function create_preset (line 113) | async def create_preset(
  function setup_trigger (line 148) | async def setup_trigger(
  function update_preset (line 212) | async def update_preset(
  function delete_preset (line 317) | async def delete_preset(
  function execute_preset (line 371) | async def execute_preset(

FILE: autogpt_platform/backend/backend/api/features/library/routes_test.py
  function setup_app_auth (line 24) | def setup_app_auth(mock_jwt_user):
  function test_get_library_agents_success (line 34) | async def test_get_library_agents_success(
  function test_get_favorite_library_agents_success (line 122) | async def test_get_favorite_library_agents_success(
  function test_add_agent_to_library_success (line 177) | def test_add_agent_to_library_success(

FILE: autogpt_platform/backend/backend/api/features/mcp/routes.py
  class DiscoverToolsRequest (line 40) | class DiscoverToolsRequest(BaseModel):
  class MCPToolResponse (line 50) | class MCPToolResponse(BaseModel):
  class DiscoverToolsResponse (line 58) | class DiscoverToolsResponse(BaseModel):
  function discover_tools (line 71) | async def discover_tools(
  class MCPOAuthLoginRequest (line 139) | class MCPOAuthLoginRequest(BaseModel):
  class MCPOAuthLoginResponse (line 145) | class MCPOAuthLoginResponse(BaseModel):
  function mcp_oauth_login (line 156) | async def mcp_oauth_login(
  class MCPOAuthCallbackRequest (line 286) | class MCPOAuthCallbackRequest(BaseModel):
  class MCPOAuthCallbackResponse (line 293) | class MCPOAuthCallbackResponse(BaseModel):
  function mcp_oauth_callback (line 303) | async def mcp_oauth_callback(
  class MCPStoreTokenRequest (line 399) | class MCPStoreTokenRequest(BaseModel):
  function mcp_store_token (line 414) | async def mcp_store_token(
  function _register_mcp_client (line 486) | async def _register_mcp_client(

FILE: autogpt_platform/backend/backend/api/features/mcp/test_routes.py
  function client (line 27) | async def client():
  function _bypass_ssrf_validation (line 34) | def _bypass_ssrf_validation():
  class TestDiscoverTools (line 43) | class TestDiscoverTools:
    method test_discover_tools_success (line 45) | async def test_discover_tools_success(self, client):
    method test_discover_tools_with_auth_token (line 100) | async def test_discover_tools_with_auth_token(self, client):
    method test_discover_tools_auto_uses_stored_credential (line 123) | async def test_discover_tools_auto_uses_stored_credential(self, client):
    method test_discover_tools_mcp_error (line 162) | async def test_discover_tools_mcp_error(self, client):
    method test_discover_tools_generic_error (line 185) | async def test_discover_tools_generic_error(self, client):
    method test_discover_tools_auth_required (line 206) | async def test_discover_tools_auth_required(self, client):
    method test_discover_tools_forbidden (line 229) | async def test_discover_tools_forbidden(self, client):
    method test_discover_tools_missing_url (line 252) | async def test_discover_tools_missing_url(self, client):
  class TestOAuthLogin (line 257) | class TestOAuthLogin:
    method test_oauth_login_success (line 259) | async def test_oauth_login_success(self, client):
    method test_oauth_login_no_oauth_support (line 305) | async def test_oauth_login_no_oauth_support(self, client):
    method test_oauth_login_fallback_to_public_client (line 320) | async def test_oauth_login_fallback_to_public_client(self, client):
  class TestOAuthCallback (line 356) | class TestOAuthCallback:
    method test_oauth_callback_success (line 358) | async def test_oauth_callback_success(self, client):
    method test_oauth_callback_invalid_state (line 415) | async def test_oauth_callback_invalid_state(self, client):
    method test_oauth_callback_token_exchange_fails (line 428) | async def test_oauth_callback_token_exchange_fails(self, client):
  class TestStoreToken (line 460) | class TestStoreToken:
    method test_store_token_success (line 462) | async def test_store_token_success(self, client):
    method test_store_token_blank_rejected (line 483) | async def test_store_token_blank_rejected(self, client):
    method test_store_token_replaces_old_credential (line 496) | async def test_store_token_replaces_old_credential(self, client):
  class TestSSRFValidation (line 523) | class TestSSRFValidation:
    method test_discover_tools_ssrf_blocked (line 527) | async def test_discover_tools_ssrf_blocked(self, client):
    method test_oauth_login_ssrf_blocked (line 542) | async def test_oauth_login_ssrf_blocked(self, client):
    method test_store_token_ssrf_blocked (line 557) | async def test_store_token_ssrf_blocked(self, client):

FILE: autogpt_platform/backend/backend/api/features/oauth.py
  class TokenResponse (line 66) | class TokenResponse(BaseModel):
  class ErrorResponse (line 77) | class ErrorResponse(BaseModel):
  class OAuthApplicationPublicInfo (line 84) | class OAuthApplicationPublicInfo(BaseModel):
  function get_oauth_app_info (line 104) | async def get_oauth_app_info(
  class AuthorizeRequest (line 138) | class AuthorizeRequest(BaseModel):
  class AuthorizeResponse (line 154) | class AuthorizeResponse(BaseModel):
  function authorize (line 161) | async def authorize(
  function _error_redirect_url (line 295) | def _error_redirect_url(
  class TokenRequestByCode (line 318) | class TokenRequestByCode(BaseModel):
  class TokenRequestByRefreshToken (line 329) | class TokenRequestByRefreshToken(BaseModel):
  function token (line 337) | async def token(
  function introspect (line 458) | async def introspect(
  function revoke (line 498) | async def revoke(
  function list_my_oauth_apps (line 556) | async def list_my_oauth_apps(
  function update_app_status (line 575) | async def update_app_status(
  class UpdateAppLogoRequest (line 607) | class UpdateAppLogoRequest(BaseModel):
  function update_app_logo (line 612) | async def update_app_logo(
  function upload_app_logo (line 670) | async def upload_app_logo(
  function _delete_app_current_logo_file (line 815) | async def _delete_app_current_logo_file(app: OAuthApplicationInfo):

FILE: autogpt_platform/backend/backend/api/features/oauth_test.py
  function test_user_id (line 43) | def test_user_id() -> str:
  function test_user (line 49) | async def test_user(server, test_user_id: str):
  function test_oauth_app (line 72) | async def test_oauth_app(test_user: str):
  function generate_pkce (line 109) | def generate_pkce() -> tuple[str, str]:
  function pkce_credentials (line 121) | def pkce_credentials() -> tuple[str, str]:
  function client (line 127) | async def client(server, test_user: str) -> AsyncGenerator[httpx.AsyncCl...
  function test_authorize_creates_code_in_database (line 169) | async def test_authorize_creates_code_in_database(
  function test_authorize_with_pkce_stores_challenge (line 222) | async def test_authorize_with_pkce_stores_challenge(
  function test_authorize_invalid_client_returns_error (line 262) | async def test_authorize_invalid_client_returns_error(
  function inactive_oauth_app (line 292) | async def inactive_oauth_app(test_user: str):
  function test_authorize_inactive_app (line 324) | async def test_authorize_inactive_app(
  function test_authorize_invalid_redirect_uri (line 354) | async def test_authorize_invalid_redirect_uri(
  function test_authorize_invalid_scope (line 382) | async def test_authorize_invalid_scope(
  function test_authorize_unauthorized_scope (line 412) | async def test_authorize_unauthorized_scope(
  function test_authorize_unsupported_response_type (line 444) | async def test_authorize_unsupported_response_type(
  function test_token_exchange_creates_tokens_in_database (line 479) | async def test_token_exchange_creates_tokens_in_database(
  function test_authorization_code_cannot_be_reused (line 561) | async def test_authorization_code_cannot_be_reused(
  function test_token_exchange_with_invalid_client_secret (line 621) | async def test_token_exchange_with_invalid_client_secret(
  function test_token_authorization_code_invalid_code (line 667) | async def test_token_authorization_code_invalid_code(
  function test_token_authorization_code_expired (line 690) | async def test_token_authorization_code_expired(
  function test_token_authorization_code_redirect_uri_mismatch (line 730) | async def test_token_authorization_code_redirect_uri_mismatch(
  function test_token_authorization_code_pkce_failure (line 779) | async def test_token_authorization_code_pkce_failure(
  function test_refresh_token_creates_new_tokens (line 832) | async def test_refresh_token_creates_new_tokens(
  function test_token_refresh_invalid_token (line 912) | async def test_token_refresh_invalid_token(
  function test_token_refresh_expired (line 932) | async def test_token_refresh_expired(
  function test_token_refresh_revoked (line 970) | async def test_token_refresh_revoked(
  function other_oauth_app (line 1009) | async def other_oauth_app(test_user: str):
  function test_token_refresh_wrong_application (line 1041) | async def test_token_refresh_wrong_application(
  function test_introspect_valid_access_token (line 1086) | async def test_introspect_valid_access_token(
  function test_introspect_invalid_token_returns_inactive (line 1151) | async def test_introspect_invalid_token_returns_inactive(
  function test_introspect_active_refresh_token (line 1170) | async def test_introspect_active_refresh_token(
  function test_introspect_invalid_client (line 1233) | async def test_introspect_invalid_client(
  function test_validate_access_token_fails_when_app_disabled (line 1251) | async def test_validate_access_token_fails_when_app_disabled(
  function test_revoke_access_token_updates_database (line 1325) | async def test_revoke_access_token_updates_database(
  function test_revoke_unknown_token_returns_ok (line 1398) | async def test_revoke_unknown_token_returns_ok(
  function test_revoke_refresh_token_updates_database (line 1418) | async def test_revoke_refresh_token_updates_database(
  function test_revoke_invalid_client (line 1491) | async def test_revoke_invalid_client(
  function test_revoke_token_from_different_app_fails_silently (line 1509) | async def test_revoke_token_from_different_app_fails_silently(
  function test_complete_oauth_flow_end_to_end (line 1633) | async def test_complete_oauth_flow_end_to_end(

FILE: autogpt_platform/backend/backend/api/features/otto/models.py
  class Document (line 6) | class Document(BaseModel):
  class ApiResponse (line 11) | class ApiResponse(BaseModel):
  class GraphData (line 17) | class GraphData(BaseModel):
  class Message (line 24) | class Message(BaseModel):
  class ChatRequest (line 29) | class ChatRequest(BaseModel):

FILE: autogpt_platform/backend/backend/api/features/otto/routes.py
  function proxy_otto_request (line 20) | async def proxy_otto_request(

FILE: autogpt_platform/backend/backend/api/features/otto/routes_test.py
  function setup_app_auth (line 20) | def setup_app_auth(mock_jwt_user):
  function test_ask_otto_success (line 29) | def test_ask_otto_success(
  function test_ask_otto_with_graph_data (line 84) | def test_ask_otto_with_graph_data(
  function test_ask_otto_empty_conversation (line 129) | def test_ask_otto_empty_conversation(
  function test_ask_otto_service_error (line 169) | def test_ask_otto_service_error(
  function test_ask_otto_invalid_request (line 208) | def test_ask_otto_invalid_request() -> None:
  function test_ask_otto_unconfigured (line 236) | def test_ask_otto_unconfigured() -> None:

FILE: autogpt_platform/backend/backend/api/features/otto/service.py
  class OttoService (line 20) | class OttoService:
    method _fetch_graph_data (line 22) | async def _fetch_graph_data(
    method ask (line 69) | async def ask(request: ChatRequest, user_id: str) -> ApiResponse:

FILE: autogpt_platform/backend/backend/api/features/postmark/models.py
  class PostmarkDeliveryWebhook (line 8) | class PostmarkDeliveryWebhook(BaseModel):
  class PostmarkBounceEnum (line 20) | class PostmarkBounceEnum(Enum):
  class PostmarkBounceWebhook (line 111) | class PostmarkBounceWebhook(BaseModel):
  class PostmarkSpamComplaintWebhook (line 134) | class PostmarkSpamComplaintWebhook(BaseModel):
  class PostmarkOpenWebhook (line 157) | class PostmarkOpenWebhook(BaseModel):
  class PostmarkClickWebhook (line 174) | class PostmarkClickWebhook(BaseModel):
  class PostmarkSubscriptionChangeWebhook (line 191) | class PostmarkSubscriptionChangeWebhook(BaseModel):

FILE: autogpt_platform/backend/backend/api/features/postmark/postmark.py
  function unsubscribe_via_one_click (line 38) | async def unsubscribe_via_one_click(token: Annotated[str, Query()]):
  function postmark_webhook_handler (line 56) | async def postmark_webhook_handler(
  function bounce_handler (line 84) | async def bounce_handler(event: PostmarkBounceWebhook):
  function spam_handler (line 107) | def spam_handler(event: PostmarkSpamComplaintWebhook):
  function delivery_handler (line 112) | def delivery_handler(event: PostmarkDeliveryWebhook):
  function open_handler (line 117) | def open_handler(event: PostmarkOpenWebhook):
  function click_handler (line 122) | def click_handler(event: PostmarkClickWebhook):
  function subscription_handler (line 127) | def subscription_handler(event: PostmarkSubscriptionChangeWebhook):

FILE: autogpt_platform/backend/backend/api/features/store/cache.py
  function clear_all_caches (line 10) | def clear_all_caches():
  function _get_cached_store_agents (line 21) | async def _get_cached_store_agents(
  function _get_cached_agent_details (line 44) | async def _get_cached_agent_details(
  function _get_cached_store_creators (line 55) | async def _get_cached_store_creators(
  function _get_cached_creator_details (line 74) | async def _get_cached_creator_details(username: str):

FILE: autogpt_platform/backend/backend/api/features/store/content_handlers.py
  function _contains_type (line 32) | def _contains_type(annotation: Any, target: type) -> bool:
  class ContentItem (line 43) | class ContentItem:
  class ContentHandler (line 53) | class ContentHandler(ABC):
    method content_type (line 58) | def content_type(self) -> ContentType:
    method get_missing_items (line 63) | async def get_missing_items(self, batch_size: int) -> list[ContentItem]:
    method get_stats (line 76) | async def get_stats(self) -> dict[str, int]:
  class StoreAgentHandler (line 86) | class StoreAgentHandler(ContentHandler):
    method content_type (line 90) | def content_type(self) -> ContentType:
    method get_missing_items (line 93) | async def get_missing_items(self, batch_size: int) -> list[ContentItem]:
    method get_stats (line 135) | async def get_stats(self) -> dict[str, int]:
  function _get_enabled_blocks (line 168) | def _get_enabled_blocks() -> dict[str, AnyBlockSchema]:
  class BlockHandler (line 189) | class BlockHandler(ContentHandler):
    method content_type (line 193) | def content_type(self) -> ContentType:
    method get_missing_items (line 196) | async def get_missing_items(self, batch_size: int) -> list[ContentItem]:
    method get_stats (line 290) | async def get_stats(self) -> dict[str, int]:
  class MarkdownSection (line 321) | class MarkdownSection:
  class DocumentationHandler (line 330) | class DocumentationHandler(ContentHandler):
    method content_type (line 338) | def content_type(self) -> ContentType:
    method _get_docs_root (line 341) | def _get_docs_root(self) -> Path:
    method _extract_doc_title (line 356) | def _extract_doc_title(self, file_path: Path) -> str:
    method _chunk_markdown_by_headings (line 373) | def _chunk_markdown_by_headings(
    method _make_section_content_id (line 487) | def _make_section_content_id(self, doc_path: str, section_index: int) ...
    method _parse_section_content_id (line 495) | def _parse_section_content_id(self, content_id: str) -> tuple[str, int]:
    method get_missing_items (line 506) | async def get_missing_items(self, batch_size: int) -> list[ContentItem]:
    method _get_all_section_content_ids (line 596) | def _get_all_section_content_ids(self, docs_root: Path) -> set[str]:
    method get_stats (line 612) | async def get_stats(self) -> dict[str, int]:

FILE: autogpt_platform/backend/backend/api/features/store/content_handlers_integration_test.py
  function test_store_agent_handler_real_db (line 28) | async def test_store_agent_handler_real_db():
  function test_block_handler_real_db (line 58) | async def test_block_handler_real_db():
  function test_documentation_handler_real_fs (line 88) | async def test_documentation_handler_real_fs():
  function test_get_embedding_stats_all_types (line 118) | async def test_get_embedding_stats_all_types():
  function test_ensure_content_embedding_blocks (line 142) | async def test_ensure_content_embedding_blocks(mock_generate):
  function test_backfill_all_content_types_dry_run (line 172) | async def test_backfill_all_content_types_dry_run(mock_generate):
  function test_content_handler_registry (line 203) | async def test_content_handler_registry():

FILE: autogpt_platform/backend/backend/api/features/store/content_handlers_test.py
  function _clear_block_cache (line 21) | def _clear_block_cache():
  function _make_block_class (line 33) | def _make_block_class(
  function test_get_enabled_blocks_filters_disabled (line 65) | def test_get_enabled_blocks_filters_disabled():
  function test_get_enabled_blocks_skips_broken (line 78) | def test_get_enabled_blocks_skips_broken():
  function test_get_enabled_blocks_cached (line 91) | def test_get_enabled_blocks_cached():
  function test_store_agent_handler_get_missing_items (line 109) | async def test_store_agent_handler_get_missing_items(mocker):
  function test_store_agent_handler_get_stats (line 139) | async def test_store_agent_handler_get_stats(mocker):
  function test_block_handler_get_missing_items (line 163) | async def test_block_handler_get_missing_items():
  function test_block_handler_get_missing_items_splits_camelcase (line 198) | async def test_block_handler_get_missing_items_splits_camelcase():
  function test_block_handler_get_missing_items_batch_size_zero (line 220) | async def test_block_handler_get_missing_items_batch_size_zero():
  function test_block_handler_disabled_dont_exhaust_batch (line 241) | async def test_block_handler_disabled_dont_exhaust_batch():
  function test_block_handler_get_stats (line 267) | async def test_block_handler_get_stats():
  function test_block_handler_get_stats_skips_broken (line 294) | async def test_block_handler_get_stats_skips_broken():
  function test_block_handler_handles_none_name (line 319) | async def test_block_handler_handles_none_name():
  function test_block_handler_handles_empty_attributes (line 352) | async def test_block_handler_handles_empty_attributes():
  function test_block_handler_skips_failed_blocks (line 372) | async def test_block_handler_skips_failed_blocks():
  function test_documentation_handler_get_missing_items (line 400) | async def test_documentation_handler_get_missing_items(tmp_path, mocker):
  function test_documentation_handler_get_stats (line 436) | async def test_documentation_handler_get_stats(tmp_path, mocker):
  function test_documentation_handler_title_extraction (line 461) | async def test_documentation_handler_title_extraction(tmp_path):
  function test_documentation_handler_markdown_chunking (line 477) | async def test_documentation_handler_markdown_chunking(tmp_path):
  function test_documentation_handler_section_content_ids (line 514) | async def test_documentation_handler_section_content_ids():
  function test_documentation_handler_missing_docs_directory (line 531) | async def test_documentation_handler_missing_docs_directory():
  function test_content_handlers_registry (line 552) | async def test_content_handlers_registry():

FILE: autogpt_platform/backend/backend/api/features/store/db.py
  class StoreAgentsSortOptions (line 44) | class StoreAgentsSortOptions(Enum):
  function get_store_agents (line 51) | async def get_store_agents(
  function _fallback_store_agent_search (line 167) | async def _fallback_store_agent_search(
  function log_search_term (line 287) | async def log_search_term(search_query: str):
  function get_store_agent_details (line 301) | async def get_store_agent_details(
  function get_available_graph (line 349) | async def get_available_graph(
  function get_available_graph (line 355) | async def get_available_graph(
  function get_available_graph (line 360) | async def get_available_graph(
  function get_store_agent_by_version_id (line 391) | async def get_store_agent_by_version_id(
  function get_store_agent_details_as_admin (line 419) | async def get_store_agent_details_as_admin(
  class StoreCreatorsSortOptions (line 470) | class StoreCreatorsSortOptions(Enum):
  function get_store_creators (line 477) | async def get_store_creators(
  function get_store_creator (line 583) | async def get_store_creator(
  function get_store_submissions (line 607) | async def get_store_submissions(
  function delete_store_submission (line 664) | async def delete_store_submission(
  function create_store_submission (line 718) | async def create_store_submission(
  function edit_store_submission (line 897) | async def edit_store_submission(
  function create_store_review (line 1005) | async def create_store_review(
  function get_user_profile (line 1045) | async def get_user_profile(
  function update_profile (line 1063) | async def update_profile(
  function get_my_agents (line 1133) | async def get_my_agents(
  function get_agent (line 1198) | async def get_agent(store_listing_version_id: str) -> GraphModel:
  function review_store_submission (line 1227) | async def review_store_submission(
  function _approve_sub_agent (line 1394) | async def _approve_sub_agent(
  function _create_sub_agent_version_data (line 1471) | def _create_sub_agent_version_data(
  function _send_submission_review_notification (line 1492) | async def _send_submission_review_notification(
  function get_admin_listings_with_versions (line 1565) | async def get_admin_listings_with_versions(
  function check_submission_already_approved (line 1705) | async def check_submission_already_approved(
  function get_agent_as_admin (line 1726) | async def get_agent_as_admin(

FILE: autogpt_platform/backend/backend/api/features/store/db_test.py
  function setup_prisma (line 14) | async def setup_prisma():
  function test_get_store_agents (line 24) | async def test_get_store_agents(mocker):
  function test_get_store_agent_details (line 70) | async def test_get_store_agent_details(mocker):
  function test_get_store_creator (line 119) | async def test_get_store_creator(mocker):
  function test_create_store_submission (line 156) | async def test_create_store_submission(mocker):
  function test_update_profile (line 277) | async def test_update_profile(mocker):
  function test_get_user_profile (line 321) | async def test_get_user_profile(mocker):
  function test_get_store_agents_with_search_parameterized (line 355) | async def test_get_store_agents_with_search_parameterized(mocker):
  function test_get_store_agents_with_search_and_filters_parameterized (line 367) | async def test_get_store_agents_with_search_and_filters_parameterized():
  function test_get_store_agents_search_category_array_injection (line 386) | async def test_get_store_agents_search_category_array_injection():

FILE: autogpt_platform/backend/backend/api/features/store/embeddings.py
  function build_searchable_text (line 34) | def build_searchable_text(
  function generate_embedding (line 66) | async def generate_embedding(text: str) -> list[float]:
  function store_embedding (line 104) | async def store_embedding(
  function store_content_embedding (line 126) | async def store_content_embedding(
  function get_embedding (line 181) | async def get_embedding(version_id: str) -> dict[str, Any] | None:
  function get_content_embedding (line 202) | async def get_content_embedding(
  function ensure_embedding (line 237) | async def ensure_embedding(
  function delete_embedding (line 296) | async def delete_embedding(version_id: str) -> bool:
  function delete_content_embedding (line 307) | async def delete_content_embedding(
  function get_embedding_stats (line 352) | async def get_embedding_stats() -> dict[str, Any]:
  function backfill_missing_embeddings (line 421) | async def backfill_missing_embeddings(batch_size: int = 10) -> dict[str,...
  function backfill_all_content_types (line 441) | async def backfill_all_content_types(batch_size: int = 10) -> dict[str, ...
  function embed_query (line 554) | async def embed_query(query: str) -> list[float]:
  function embedding_to_vector_string (line 564) | def embedding_to_vector_string(embedding: list[float]) -> str:
  function ensure_content_embedding (line 569) | async def ensure_content_embedding(
  function cleanup_orphaned_embeddings (line 618) | async def cleanup_orphaned_embeddings() -> dict[str, Any]:
  function semantic_search (line 762) | async def semantic_search(

FILE: autogpt_platform/backend/backend/api/features/store/embeddings_e2e_test.py
  function test_content_id (line 32) | def test_content_id() -> str:
  function test_user_id (line 38) | def test_user_id() -> str:
  function mock_embedding (line 44) | def mock_embedding() -> list[float]:
  function similar_embedding (line 56) | def similar_embedding() -> list[float]:
  function different_embedding (line 67) | def different_embedding() -> list[float]:
  function cleanup_embeddings (line 78) | async def cleanup_embeddings(
  function test_store_content_embedding_store_agent (line 103) | async def test_store_content_embedding_store_agent(
  function test_store_content_embedding_block (line 135) | async def test_store_content_embedding_block(
  function test_store_content_embedding_documentation (line 163) | async def test_store_content_embedding_documentation(
  function test_store_content_embedding_upsert (line 191) | async def test_store_content_embedding_upsert(
  function test_get_content_embedding_not_found (line 236) | async def test_get_content_embedding_not_found(server):
  function test_get_content_embedding_with_metadata (line 245) | async def test_get_content_embedding_with_metadata(
  function test_delete_content_embedding (line 286) | async def test_delete_content_embedding(
  function test_delete_content_embedding_not_found (line 322) | async def test_delete_content_embedding_not_found(server):
  function test_unified_hybrid_search_finds_matching_content (line 337) | async def test_unified_hybrid_search_finds_matching_content(
  function test_unified_hybrid_search_filter_by_content_type (line 393) | async def test_unified_hybrid_search_filter_by_content_type(
  function test_unified_hybrid_search_empty_query (line 438) | async def test_unified_hybrid_search_empty_query(server):
  function test_unified_hybrid_search_pagination (line 451) | async def test_unified_hybrid_search_pagination(
  function test_unified_hybrid_search_min_score_filtering (line 504) | async def test_unified_hybrid_search_min_score_filtering(
  function test_hybrid_search_store_agents_sql_valid (line 550) | async def test_hybrid_search_store_agents_sql_valid(server):
  function test_hybrid_search_with_filters (line 567) | async def test_hybrid_search_with_filters(server):
  function test_hybrid_search_pagination (line 585) | async def test_hybrid_search_pagination(server):
  function test_all_content_types_searchable (line 619) | async def test_all_content_types_searchable(server):
  function test_multiple_content_types_searchable (line 639) | async def test_multiple_content_types_searchable(server):
  function test_search_all_content_types_default (line 654) | async def test_search_all_content_types_default(server):

FILE: autogpt_platform/backend/backend/api/features/store/embeddings_schema_test.py
  function test_store_content_embedding_with_schema (line 20) | async def test_store_content_embedding_with_schema():
  function test_get_content_embedding_with_schema (line 54) | async def test_get_content_embedding_with_schema():
  function test_delete_content_embedding_with_schema (line 98) | async def test_delete_content_embedding_with_schema():
  function test_get_embedding_stats_with_schema (line 128) | async def test_get_embedding_stats_with_schema():
  function test_backfill_missing_embeddings_with_schema (line 160) | async def test_backfill_missing_embeddings_with_schema():
  function test_ensure_content_embedding_with_schema (line 201) | async def test_ensure_content_embedding_with_schema():
  function test_backward_compatibility_store_embedding (line 240) | async def test_backward_compatibility_store_embedding():
  function test_backward_compatibility_get_embedding (line 265) | async def test_backward_compatibility_get_embedding():
  function test_schema_handling_error_cases (line 291) | async def test_schema_handling_error_cases():

FILE: autogpt_platform/backend/backend/api/features/store/embeddings_test.py
  function setup_prisma (line 12) | async def setup_prisma():
  function test_build_searchable_text (line 22) | async def test_build_searchable_text():
  function test_build_searchable_text_empty_fields (line 36) | async def test_build_searchable_text_empty_fields():
  function test_generate_embedding_success (line 46) | async def test_generate_embedding_success():
  function test_generate_embedding_no_api_key (line 75) | async def test_generate_embedding_no_api_key():
  function test_generate_embedding_api_error (line 88) | async def test_generate_embedding_api_error():
  function test_generate_embedding_text_truncation (line 104) | async def test_generate_embedding_text_truncation():
  function test_store_embedding_success (line 144) | async def test_store_embedding_success(mocker):
  function test_store_embedding_database_error (line 167) | async def test_store_embedding_database_error(mocker):
  function test_get_embedding_success (line 181) | async def test_get_embedding_success():
  function test_get_embedding_not_found (line 208) | async def test_get_embedding_not_found():
  function test_ensure_embedding_already_exists (line 223) | async def test_ensure_embedding_already_exists(mock_get, mock_store, moc...
  function test_ensure_embedding_create_new (line 244) | async def test_ensure_embedding_create_new(mock_get, mock_store, mock_ge...
  function test_ensure_embedding_generation_fails (line 274) | async def test_ensure_embedding_generation_fails(mock_get, mock_generate):
  function test_get_embedding_stats (line 290) | async def test_get_embedding_stats():
  function test_backfill_missing_embeddings_success (line 319) | async def test_backfill_missing_embeddings_success(mock_store):
  function test_backfill_missing_embeddings_no_missing (line 363) | async def test_backfill_missing_embeddings_no_missing():
  function test_embedding_to_vector_string (line 381) | async def test_embedding_to_vector_string():
  function test_embed_query (line 389) | async def test_embed_query():

FILE: autogpt_platform/backend/backend/api/features/store/exceptions.py
  class MediaUploadError (line 4) | class MediaUploadError(ValueError):
  class InvalidFileTypeError (line 10) | class InvalidFileTypeError(MediaUploadError):
  class FileSizeTooLargeError (line 16) | class FileSizeTooLargeError(MediaUploadError):
  class FileReadError (line 22) | class FileReadError(MediaUploadError):
  class StorageConfigError (line 28) | class StorageConfigError(MediaUploadError):
  class StorageUploadError (line 34) | class StorageUploadError(MediaUploadError):
  class VirusDetectedError (line 40) | class VirusDetectedError(MediaUploadError):
    method __init__ (line 43) | def __init__(self, threat_name: str, message: str | None = None):
  class VirusScanError (line 48) | class VirusScanError(MediaUploadError):
  class StoreError (line 54) | class StoreError(ValueError):
  class CreatorNotFoundError (line 60) | class CreatorNotFoundError(NotFoundError):
  class ListingExistsError (line 66) | class ListingExistsError(StoreError):
  class ProfileNotFoundError (line 72) | class ProfileNotFoundError(NotFoundError):
  class ListingNotFoundError (line 78) | class ListingNotFoundError(NotFoundError):
  class SubmissionNotFoundError (line 84) | class SubmissionNotFoundError(NotFoundError):
  class InvalidOperationError (line 90) | class InvalidOperationError(StoreError):
  class UnauthorizedError (line 96) | class UnauthorizedError(StoreError):
  class SlugAlreadyInUseError (line 102) | class SlugAlreadyInUseError(StoreError):

FILE: autogpt_platform/backend/backend/api/features/store/hybrid_search.py
  function tokenize (line 33) | def tokenize(text: str) -> list[str]:
  function bm25_rerank (line 40) | def bm25_rerank(
  class UnifiedSearchWeights (line 105) | class UnifiedSearchWeights:
    method __post_init__ (line 113) | def __post_init__(self):
  function unified_hybrid_search (line 134) | async def unified_hybrid_search(
  class StoreAgentSearchWeights (line 396) | class StoreAgentSearchWeights:
    method __post_init__ (line 405) | def __post_init__(self):
  function hybrid_search (line 431) | async def hybrid_search(
  function hybrid_search_simple (line 719) | async def hybrid_search_simple(
  function _log_vector_error_diagnostics (line 737) | async def _log_vector_error_diagnostics(error: Exception) -> None:

FILE: autogpt_platform/backend/backend/api/features/store/hybrid_search_test.py
  function test_tokenize (line 35) | def test_tokenize(input_text: str, expected: list[str]):
  function test_hybrid_search_with_schema_handling (line 41) | async def test_hybrid_search_with_schema_handling():
  function test_hybrid_search_with_public_schema (line 100) | async def test_hybrid_search_with_public_schema():
  function test_hybrid_search_with_custom_schema (line 131) | async def test_hybrid_search_with_custom_schema():
  function test_hybrid_search_without_embeddings (line 161) | async def test_hybrid_search_without_embeddings():
  function test_hybrid_search_with_filters (line 212) | async def test_hybrid_search_with_filters():
  function test_hybrid_search_weights (line 244) | async def test_hybrid_search_weights():
  function test_hybrid_search_min_score_filtering (line 287) | async def test_hybrid_search_min_score_filtering():
  function test_hybrid_search_pagination (line 331) | async def test_hybrid_search_pagination():
  function test_hybrid_search_error_handling (line 398) | async def test_hybrid_search_error_handling():
  function test_unified_hybrid_search_basic (line 429) | async def test_unified_hybrid_search_basic():
  function test_unified_hybrid_search_filter_by_content_type (line 483) | async def test_unified_hybrid_search_filter_by_content_type():
  function test_unified_hybrid_search_with_user_id (line 529) | async def test_unified_hybrid_search_with_user_id():
  function test_unified_hybrid_search_custom_weights (line 574) | async def test_unified_hybrid_search_custom_weights():
  function test_unified_hybrid_search_graceful_degradation (line 609) | async def test_unified_hybrid_search_graceful_degradation():
  function test_unified_hybrid_search_empty_query (line 651) | async def test_unified_hybrid_search_empty_query():
  function test_unified_hybrid_search_pagination (line 665) | async def test_unified_hybrid_search_pagination():
  function test_unified_hybrid_search_schema_prefix (line 720) | async def test_unified_hybrid_search_schema_prefix():

FILE: autogpt_platform/backend/backend/api/features/store/image_gen.py
  class ImageSize (line 20) | class ImageSize(str, Enum):
  class ImageStyle (line 24) | class ImageStyle(str, Enum):
  function generate_agent_image (line 28) | async def generate_agent_image(agent: GraphBaseMeta | AgentGraph) -> io....
  function generate_agent_image_v2 (line 35) | async def generate_agent_image_v2(graph: GraphBaseMeta | AgentGraph) -> ...
  function generate_agent_image_v1 (line 106) | async def generate_agent_image_v1(agent: GraphBaseMeta | AgentGraph) -> ...

FILE: autogpt_platform/backend/backend/api/features/store/media.py
  function check_media_exists (line 21) | async def check_media_exists(user_id: str, filename: str) -> str | None:
  function upload_media (line 63) | async def upload_media(

FILE: autogpt_platform/backend/backend/api/features/store/media_test.py
  function mock_settings (line 16) | def mock_settings(monkeypatch):
  function mock_storage_client (line 25) | def mock_storage_client(mocker):
  function test_upload_media_success (line 48) | async def test_upload_media_success(mock_settings, mock_storage_client):
  function test_upload_media_invalid_type (line 67) | async def test_upload_media_invalid_type(mock_settings, mock_storage_cli...
  function test_upload_media_missing_credentials (line 80) | async def test_upload_media_missing_credentials(monkeypatch):
  function test_upload_media_video_type (line 96) | async def test_upload_media_video_type(mock_settings, mock_storage_client):
  function test_upload_media_file_too_large (line 112) | async def test_upload_media_file_too_large(mock_settings, mock_storage_c...
  function test_upload_media_file_read_error (line 126) | async def test_upload_media_file_read_error(mock_settings, mock_storage_...
  function test_upload_media_png_success (line 138) | async def test_upload_media_png_success(mock_settings, mock_storage_clie...
  function test_upload_media_gif_success (line 152) | async def test_upload_media_gif_success(mock_settings, mock_storage_clie...
  function test_upload_media_webp_success (line 166) | async def test_upload_media_webp_success(mock_settings, mock_storage_cli...
  function test_upload_media_webm_success (line 180) | async def test_upload_media_webm_success(mock_settings, mock_storage_cli...
  function test_upload_media_mismatched_signature (line 194) | async def test_upload_media_mismatched_signature(mock_settings, mock_sto...
  function test_upload_media_invalid_signature (line 205) | async def test_upload_media_invalid_signature(mock_settings, mock_storag...

FILE: autogpt_platform/backend/backend/api/features/store/model.py
  class ChangelogEntry (line 13) | class ChangelogEntry(pydantic.BaseModel):
  class MyUnpublishedAgent (line 19) | class MyUnpublishedAgent(pydantic.BaseModel):
  class MyUnpublishedAgentsResponse (line 29) | class MyUnpublishedAgentsResponse(pydantic.BaseModel):
  class StoreAgent (line 34) | class StoreAgent(pydantic.BaseModel):
    method from_db (line 47) | def from_db(cls, agent: "prisma.models.StoreAgent") -> "StoreAgent":
  class StoreAgentsResponse (line 62) | class StoreAgentsResponse(pydantic.BaseModel):
  class StoreAgentDetails (line 67) | class StoreAgentDetails(pydantic.BaseModel):
    method from_db (line 95) | def from_db(cls, agent: "prisma.models.StoreAgent") -> "StoreAgentDeta...
  class Profile (line 120) | class Profile(pydantic.BaseModel):
  class ProfileDetails (line 130) | class ProfileDetails(Profile):
    method from_db (line 136) | def from_db(cls, profile: "prisma.models.Profile") -> "ProfileDetails":
  class CreatorDetails (line 147) | class CreatorDetails(ProfileDetails):
    method from_db (line 156) | def from_db(cls, creator: "prisma.models.Creator") -> "CreatorDetails"...
  class CreatorsResponse (line 171) | class CreatorsResponse(pydantic.BaseModel):
  class StoreSubmission (line 176) | class StoreSubmission(pydantic.BaseModel):
    method from_db (line 209) | def from_db(cls, _sub: "prisma.models.StoreSubmission") -> Self:
    method from_listing_version (line 239) | def from_listing_version(cls, _lv: "prisma.models.StoreListingVersion"...
  class StoreSubmissionsResponse (line 271) | class StoreSubmissionsResponse(pydantic.BaseModel):
  class StoreSubmissionRequest (line 276) | class StoreSubmissionRequest(pydantic.BaseModel):
  class StoreSubmissionEditRequest (line 296) | class StoreSubmissionEditRequest(pydantic.BaseModel):
  class StoreSubmissionAdminView (line 309) | class StoreSubmissionAdminView(StoreSubmission):
    method from_db (line 313) | def from_db(cls, _sub: "prisma.models.StoreSubmission") -> Self:
    method from_listing_version (line 320) | def from_listing_version(cls, _lv: "prisma.models.StoreListingVersion"...
  class StoreListingWithVersionsAdminView (line 327) | class StoreListingWithVersionsAdminView(pydantic.BaseModel):
  class StoreListingsWithVersionsAdminViewResponse (line 340) | class StoreListingsWithVersionsAdminViewResponse(pydantic.BaseModel):
  class StoreReview (line 347) | class StoreReview(pydantic.BaseModel):
  class StoreReviewCreate (line 352) | class StoreReviewCreate(pydantic.BaseModel):
  class ReviewSubmissionRequest (line 358) | class ReviewSubmissionRequest(pydantic.BaseModel):
  class UnifiedSearchResult (line 365) | class UnifiedSearchResult(pydantic.BaseModel):
  class UnifiedSearchResponse (line 378) | class UnifiedSearchResponse(pydantic.BaseModel):

FILE: autogpt_platform/backend/backend/api/features/store/routes.py
  function get_profile (line 39) | async def get_profile(
  function update_or_create_profile (line 55) | async def update_or_create_profile(
  function unified_search (line 74) | async def unified_search(
  function get_agents (line 140) | async def get_agents(
  function get_agent_by_name (line 187) | async def get_agent_by_name(
  function post_user_review_for_agent (line 208) | async def post_user_review_for_agent(
  function get_agent_by_listing_version (line 233) | async def get_agent_by_listing_version(
  function get_graph_meta_by_store_listing_version_id (line 246) | async def get_graph_meta_by_store_listing_version_id(
  function download_agent_file (line 259) | async def download_agent_file(
  function get_creators (line 285) | async def get_creators(
  function get_creator (line 312) | async def get_creator(username: str) -> store_model.CreatorDetails:
  function get_my_unpublished_agents (line 330) | async def get_my_unpublished_agents(
  function delete_submission (line 346) | async def delete_submission(
  function get_submissions (line 364) | async def get_submissions(
  function create_submission (line 384) | async def create_submission(
  function edit_submission (line 414) | async def edit_submission(
  function upload_submission_media (line 443) | async def upload_submission_media(
  class ImageURLResponse (line 452) | class ImageURLResponse(BaseModel):
  function generate_image (line 462) | async def generate_image(
  function get_cache_metrics (line 509) | async def get_cache_metrics():

FILE: autogpt_platform/backend/backend/api/features/store/routes_test.py
  function setup_app_auth (line 27) | def setup_app_auth(mock_jwt_user):
  function test_get_agents_defaults (line 36) | def test_get_agents_defaults(
  function test_get_agents_featured (line 71) | def test_get_agents_featured(
  function test_get_agents_by_creator (line 117) | def test_get_agents_by_creator(
  function test_get_agents_sorted (line 163) | def test_get_agents_sorted(
  function test_get_agents_search (line 209) | def test_get_agents_search(
  function test_get_agents_category (line 255) | def test_get_agents_category(
  function test_get_agents_pagination (line 300) | def test_get_agents_pagination(
  function test_get_agents_malformed_request (line 348) | def test_get_agents_malformed_request(mocker: pytest_mock.MockFixture):
  function test_get_agent_details (line 366) | def test_get_agent_details(
  function test_get_creators_defaults (line 407) | def test_get_creators_defaults(
  function test_get_creators_pagination (line 436) | def test_get_creators_pagination(
  function test_get_creators_malformed_request (line 480) | def test_get_creators_malformed_request(mocker: pytest_mock.MockFixture):
  function test_get_creator_details (line 498) | def test_get_creator_details(
  function test_get_submissions_success (line 528) | def test_get_submissions_success(
  function test_get_submissions_pagination (line 581) | def test_get_submissions_pagination(
  function test_get_submissions_malformed_request (line 609) | def test_get_submissions_malformed_request(mocker: pytest_mock.MockFixtu...

FILE: autogpt_platform/backend/backend/api/features/store/semantic_search_test.py
  function test_search_blocks_only (line 10) | async def test_search_blocks_only(mocker):
  function test_search_multiple_content_types (line 46) | async def test_search_multiple_content_types(mocker):
  function test_search_with_min_similarity_threshold (line 86) | async def test_search_with_min_similarity_threshold(mocker):
  function test_search_fallback_to_lexical (line 120) | async def test_search_fallback_to_lexical(mocker):
  function test_search_empty_query (line 152) | async def test_search_empty_query():
  function test_search_with_user_id_filter (line 162) | async def test_search_with_user_id_filter(mocker):
  function test_search_limit_parameter (line 195) | async def test_search_limit_parameter(mocker):
  function test_search_default_content_types (line 229) | async def test_search_default_content_types(mocker):
  function test_search_handles_database_error (line 252) | async def test_search_handles_database_error(mocker):

FILE: autogpt_platform/backend/backend/api/features/store/test_cache_delete.py
  class TestCacheDeletion (line 18) | class TestCacheDeletion:
    method test_store_agents_cache_delete (line 22) | async def test_store_agents_cache_delete(self):
    method test_cache_info_after_deletions (line 142) | async def test_cache_info_after_deletions(self):
    method test_cache_delete_with_complex_params (line 196) | async def test_cache_delete_with_complex_params(self):

FILE: autogpt_platform/backend/backend/api/features/store/text_utils_test.py
  function test_split_camelcase (line 48) | def test_split_camelcase(input_text: str, expected: str):

FILE: autogpt_platform/backend/backend/api/features/v1.py
  function _create_file_size_error (line 108) | def _create_file_size_error(size_bytes: int, max_size_mb: int) -> HTTPEx...
  function get_or_create_user_route (line 138) | async def get_or_create_user_route(user_data: dict = Security(get_jwt_pa...
  function update_user_email_route (line 167) | async def update_user_email_route(
  function get_user_timezone_route (line 181) | async def get_user_timezone_route(
  function update_user_timezone_route (line 195) | async def update_user_timezone_route(
  function get_preferences (line 209) | async def get_preferences(
  function update_preferences (line 222) | async def update_preferences(
  function get_onboarding (line 242) | async def get_onboarding(user_id: Annotated[str, Security(get_user_id)]):
  function update_onboarding (line 253) | async def update_onboarding(
  function onboarding_complete_step (line 265) | async def onboarding_complete_step(
  function get_onboarding_agents (line 279) | async def get_onboarding_agents(
  class OnboardingStatusResponse (line 285) | class OnboardingStatusResponse(pydantic.BaseModel):
  function is_onboarding_enabled (line 298) | async def is_onboarding_enabled(
  function reset_onboarding (line 324) | async def reset_onboarding(user_id: Annotated[str, Security(get_user_id)]):
  function _compute_blocks_sync (line 333) | def _compute_blocks_sync() -> str:
  function _get_cached_blocks (line 359) | async def _get_cached_blocks() -> str:
  function get_graph_blocks (line 389) | async def get_graph_blocks() -> Response:
  function execute_graph_block (line 404) | async def execute_graph_block(
  function upload_file (line 449) | async def upload_file(
  function get_user_credits (line 538) | async def get_user_credits(
  function request_top_up (line 551) | async def request_top_up(
  function refund_top_up (line 565) | async def refund_top_up(
  function fulfill_checkout (line 580) | async def fulfill_checkout(user_id: Annotated[str, Security(get_user_id)]):
  function configure_user_auto_top_up (line 592) | async def configure_user_auto_top_up(
  function get_user_auto_top_up (line 641) | async def get_user_auto_top_up(
  function stripe_webhook (line 650) | async def stripe_webhook(request: Request):
  function manage_payment_method (line 692) | async def manage_payment_method(
  function get_credit_history (line 705) | async def get_credit_history(
  function get_refund_requests (line 729) | async def get_refund_requests(
  class DeleteGraphResponse (line 741) | class DeleteGraphResponse(TypedDict):
  function list_graphs (line 751) | async def list_graphs(
  function get_graph (line 775) | async def get_graph(
  function get_graph_all_versions (line 799) | async def get_graph_all_versions(
  function create_new_graph (line 814) | async def create_new_graph(
  function delete_graph (line 838) | async def delete_graph(
  function update_graph (line 855) | async def update_graph(
  function set_graph_active_version (line 903) | async def set_graph_active_version(
  function update_graph_settings (line 946) | async def update_graph_settings(
  function execute_graph (line 973) | async def execute_graph(
  function stop_graph_run (line 1044) | async def stop_graph_run(
  function _stop_graph_run (line 1057) | async def _stop_graph_run(
  function list_graphs_executions (line 1086) | async def list_graphs_executions(
  function list_graph_executions (line 1108) | async def list_graph_executions(
  function hide_activity_summaries_if_disabled (line 1141) | async def hide_activity_summaries_if_disabled(
  function get_graph_execution (line 1164) | async def get_graph_execution(
  function hide_activity_summary_if_disabled (line 1200) | async def hide_activity_summary_if_disabled(
  function delete_graph_execution (line 1222) | async def delete_graph_execution(
  class ShareRequest (line 1231) | class ShareRequest(pydantic.BaseModel):
  class ShareResponse (line 1237) | class ShareResponse(pydantic.BaseModel):
  function enable_execution_sharing (line 1248) | async def enable_execution_sharing(
  function disable_execution_sharing (line 1286) | async def disable_execution_sharing(
  function get_shared_execution (line 1310) | async def get_shared_execution(
  class ScheduleCreationRequest (line 1329) | class ScheduleCreationRequest(pydantic.BaseModel):
  function create_graph_execution_schedule (line 1347) | async def create_graph_execution_schedule(
  function list_graph_execution_schedules (line 1398) | async def list_graph_execution_schedules(
  function list_all_graphs_execution_schedules (line 1414) | async def list_all_graphs_execution_schedules(
  function delete_graph_execution_schedule (line 1426) | async def delete_graph_execution_schedule(
  function create_api_key (line 1451) | async def create_api_key(
  function get_api_keys (line 1470) | async def get_api_keys(
  function get_api_key (line 1483) | async def get_api_key(
  function delete_api_key (line 1499) | async def delete_api_key(
  function suspend_key (line 1512) | async def suspend_key(
  function update_permissions (line 1525) | async def update_permissions(

FILE: autogpt_platform/backend/backend/api/features/v1_test.py
  function setup_app_auth (line 26) | def setup_app_auth(mock_jwt_user, setup_test_user):
  function test_get_or_create_user_route (line 39) | def test_get_or_create_user_route(
  function test_update_user_email_route (line 69) | def test_update_user_email_route(
  function test_get_graph_blocks (line 93) | def test_get_graph_blocks(
  function test_execute_graph_block (line 135) | def test_execute_graph_block(
  function test_execute_graph_block_not_found (line 181) | def test_execute_graph_block_not_found(
  function test_get_user_credits (line 197) | def test_get_user_credits(
  function test_request_top_up (line 222) | def test_request_top_up(
  function test_get_auto_top_up (line 251) | def test_get_auto_top_up(
  function test_configure_auto_top_up (line 277) | def test_configure_auto_top_up(
  function test_configure_auto_top_up_validation_errors (line 311) | def test_configure_auto_top_up_validation_errors(
  function test_get_graphs (line 346) | def test_get_graphs(
  function test_get_graph (line 381) | def test_get_graph(
  function test_get_graph_not_found (line 415) | def test_get_graph_not_found(
  function test_delete_graph (line 430) | def test_delete_graph(
  function test_invalid_json_request (line 474) | def test_invalid_json_request() -> None:
  function test_missing_required_field (line 484) | def test_missing_required_field() -> None:
  function test_upload_file_success (line 491) | async def test_upload_file_success(test_user_id: str):
  function test_upload_file_no_filename (line 541) | async def test_upload_file_no_filename(test_user_id: str):
  function test_upload_file_invalid_expiration (line 576) | async def test_upload_file_invalid_expiration(test_user_id: str):
  function test_upload_file_virus_scan_failure (line 603) | async def test_upload_file_virus_scan_failure(test_user_id: str):
  function test_upload_file_cloud_storage_failure (line 624) | async def test_upload_file_cloud_storage_failure(test_user_id: str):
  function test_upload_file_size_limit_exceeded (line 650) | async def test_upload_file_size_limit_exceeded(test_user_id: str):
  function test_upload_file_gcs_not_configured_fallback (line 671) | async def test_upload_file_gcs_not_configured_fallback(test_user_id: str):

FILE: autogpt_platform/backend/backend/api/features/workspace/routes.py
  function _sanitize_filename_for_header (line 32) | def _sanitize_filename_for_header(filename: str) -> str:
  function _create_streaming_response (line 61) | def _create_streaming_response(content: bytes, file: WorkspaceFile) -> R...
  function _create_file_download_response (line 73) | async def _create_file_download_response(file: WorkspaceFile) -> Response:
  class UploadFileResponse (line 115) | class UploadFileResponse(BaseModel):
  class DeleteFileResponse (line 123) | class DeleteFileResponse(BaseModel):
  class StorageUsageResponse (line 127) | class StorageUsageResponse(BaseModel):
  function download_file (line 138) | async def download_file(
  function delete_workspace_file (line 162) | async def delete_workspace_file(
  function upload_file (line 187) | async def upload_file(
  function get_storage_usage (line 285) | async def get_storage_usage(

FILE: autogpt_platform/backend/backend/api/features/workspace/routes_test.py
  function _value_error_handler (line 19) | async def _value_error_handler(
  function setup_app_auth (line 48) | def setup_app_auth(mock_jwt_user):
  function _upload (line 56) | def _upload(
  function test_upload_happy_path (line 71) | def test_upload_happy_path(mocker: pytest_mock.MockFixture):
  function test_upload_exceeds_max_file_size (line 102) | def test_upload_exceeds_max_file_size(mocker: pytest_mock.MockFixture):
  function test_upload_storage_quota_exceeded (line 115) | def test_upload_storage_quota_exceeded(mocker: pytest_mock.MockFixture):
  function test_upload_post_write_quota_race (line 134) | def test_upload_post_write_quota_race(mocker: pytest_mock.MockFixture):
  function test_upload_any_extension (line 169) | def test_upload_any_extension(mocker: pytest_mock.MockFixture):
  function test_upload_blocked_by_virus_scan (line 197) | def test_upload_blocked_by_virus_scan(mocker: pytest_mock.MockFixture):
  function test_upload_file_without_extension (line 229) | def test_upload_file_without_extension(mocker: pytest_mock.MockFixture):
  function test_upload_strips_path_components (line 263) | def test_upload_strips_path_components(mocker: pytest_mock.MockFixture):
  function test_download_file_not_found (line 296) | def test_download_file_not_found(mocker: pytest_mock.MockFixture):
  function test_delete_file_success (line 313) | def test_delete_file_success(mocker: pytest_mock.MockFixture):
  function test_delete_file_not_found (line 332) | def test_delete_file_not_found(mocker: pytest_mock.MockFixture):
  function test_delete_file_no_workspace (line 350) | def test_delete_file_no_workspace(mocker: pytest_mock.MockFixture):

FILE: autogpt_platform/backend/backend/api/middleware/security.py
  class SecurityHeadersMiddleware (line 7) | class SecurityHeadersMiddleware:
    method __init__ (line 51) | def __init__(self, app: ASGIApp):
    method is_cacheable_path (line 61) | def is_cacheable_path(self, path: str) -> bool:
    method __call__ (line 75) | async def __call__(self, scope: Scope, receive: Receive, send: Send) -...

FILE: autogpt_platform/backend/backend/api/middleware/security_test.py
  function app (line 10) | def app():
  function client (line 47) | def client(app):
  function test_non_cacheable_endpoints_have_cache_control_headers (line 52) | def test_non_cacheable_endpoints_have_cache_control_headers(client):
  function test_cacheable_endpoints_dont_have_cache_control_headers (line 79) | def test_cacheable_endpoints_dont_have_cache_control_headers(client):
  function test_is_cacheable_path_detection (line 110) | def test_is_cacheable_path_detection():
  function test_path_prefix_matching (line 130) | def test_path_prefix_matching():

FILE: autogpt_platform/backend/backend/api/model.py
  class WSMethod (line 12) | class WSMethod(enum.Enum):
  class WSMessage (line 23) | class WSMessage(pydantic.BaseModel):
  class WSSubscribeGraphExecutionRequest (line 31) | class WSSubscribeGraphExecutionRequest(pydantic.BaseModel):
  class WSSubscribeGraphExecutionsRequest (line 35) | class WSSubscribeGraphExecutionsRequest(pydantic.BaseModel):
  class CreateGraph (line 43) | class CreateGraph(pydantic.BaseModel):
  class CreateAPIKeyRequest (line 48) | class CreateAPIKeyRequest(pydantic.BaseModel):
  class CreateAPIKeyResponse (line 54) | class CreateAPIKeyResponse(pydantic.BaseModel):
  class SetGraphActiveVersion (line 59) | class SetGraphActiveVersion(pydantic.BaseModel):
  class UpdatePermissionsRequest (line 63) | class UpdatePermissionsRequest(pydantic.BaseModel):
  class RequestTopUp (line 67) | class RequestTopUp(pydantic.BaseModel):
  class UploadFileResponse (line 71) | class UploadFileResponse(pydantic.BaseModel):
  class TimezoneResponse (line 79) | class TimezoneResponse(pydantic.BaseModel):
  class UpdateTimezoneRequest (line 84) | class UpdateTimezoneRequest(pydantic.BaseModel):
  class NotificationPayload (line 88) | class NotificationPayload(pydantic.BaseModel):
  class OnboardingNotificationPayload (line 95) | class OnboardingNotificationPayload(NotificationPayload):
  class CopilotCompletionPayload (line 99) | class CopilotCompletionPayload(NotificationPayload):

FILE: autogpt_platform/backend/backend/api/rest_api.py
  function launch_darkly_context (line 78) | def launch_darkly_context():
  function lifespan_context (line 90) | async def lifespan_context(app: fastapi.FastAPI):
  function custom_generate_unique_id (line 143) | def custom_generate_unique_id(route: APIRoute):
  function handle_internal_http_error (line 210) | def handle_internal_http_error(status_code: int = 500, log_error: bool =...
  function validation_error_handler (line 247) | async def validation_error_handler(
  function health (line 363) | async def health():
  class AgentServer (line 369) | class AgentServer(backend.util.service.AppProcess):
    method run (line 370) | def run(self):
    method test_execute_graph (line 406) | async def test_execute_graph(
    method test_get_graph (line 421) | async def test_get_graph(
    method test_create_graph (line 432) | async def test_create_graph(
    method test_get_graph_run_status (line 439) | async def test_get_graph_run_status(graph_exec_id: str, user_id: str):
    method test_delete_graph (line 450) | async def test_delete_graph(graph_id: str, user_id: str):
    method test_get_presets (line 458) | async def test_get_presets(user_id: str, page: int = 1, page_size: int...
    method test_get_preset (line 464) | async def test_get_preset(preset_id: str, user_id: str):
    method test_create_preset (line 470) | async def test_create_preset(
    method test_update_preset (line 479) | async def test_update_preset(
    method test_delete_preset (line 489) | async def test_delete_preset(preset_id: str, user_id: str):
    method test_execute_preset (line 495) | async def test_execute_preset(
    method test_create_store_listing (line 508) | async def test_create_store_listing(
    method test_review_store_listing (line 518) | async def test_review_store_listing(
    method test_create_credentials (line 527) | async def test_create_credentials(
    method set_test_dependency_overrides (line 549) | def set_test_dependency_overrides(self, overrides: dict):

FILE: autogpt_platform/backend/backend/api/test_helpers.py
  function assert_response_status (line 8) | def assert_response_status(
  function safe_parse_json (line 33) | def safe_parse_json(
  function assert_error_response_structure (line 58) | def assert_error_response_structure(
  function assert_mock_called_with_partial (line 93) | def assert_mock_called_with_partial(mock_obj: Any, **expected_kwargs: An...
  function override_config (line 114) | def override_config(settings: Any, attribute: str, value: Any) -> Iterat...

FILE: autogpt_platform/backend/backend/api/utils/api_key_auth.py
  class APIKeyAuthenticator (line 19) | class APIKeyAuthenticator(APIKeyHeader):
    method __init__ (line 63) | def __init__(
    method __call__ (line 83) | async def __call__(self, request: Request) -> Any:
    method default_validator (line 109) | async def default_validator(self, api_key: str) -> bool:

FILE: autogpt_platform/backend/backend/api/utils/api_key_auth_test.py
  function mock_request (line 16) | def mock_request():
  function api_key_auth (line 25) | def api_key_auth():
  function api_key_auth_custom_validator (line 33) | def api_key_auth_custom_validator():
  function api_key_auth_async_validator (line 43) | def api_key_auth_async_validator():
  function api_key_auth_object_validator (line 53) | def api_key_auth_object_validator():
  function test_init_with_expected_token (line 67) | def test_init_with_expected_token():
  function test_init_with_custom_validator (line 78) | def test_init_with_custom_validator():
  function test_init_with_custom_parameters (line 93) | def test_init_with_custom_parameters():
  function test_scheme_name_generation (line 107) | def test_scheme_name_generation():
  function test_api_key_missing (line 118) | async def test_api_key_missing(api_key_auth, mock_request):
  function test_api_key_valid (line 129) | async def test_api_key_valid(api_key_auth, mock_request):
  function test_api_key_invalid (line 143) | async def test_api_key_invalid(api_key_auth, mock_request):
  function test_custom_status_and_message (line 160) | async def test_custom_status_and_message(mock_request):
  function test_custom_sync_validator (line 188) | async def test_custom_sync_validator(api_key_auth_custom_validator, mock...
  function test_custom_sync_validator_invalid (line 202) | async def test_custom_sync_validator_invalid(
  function test_custom_async_validator (line 219) | async def test_custom_async_validator(api_key_auth_async_validator, mock...
  function test_custom_async_validator_invalid (line 232) | async def test_custom_async_validator_invalid(
  function test_validator_returns_object (line 249) | async def test_validator_returns_object(api_key_auth_object_validator, m...
  function test_validator_returns_none (line 265) | async def test_validator_returns_none(api_key_auth_object_validator, moc...
  function test_validator_database_lookup_simulation (line 280) | async def test_validator_database_lookup_simulation(mock_request):
  function test_default_validator_key_valid (line 318) | async def test_default_validator_key_valid(api_key_auth):
  function test_default_validator_key_invalid (line 325) | async def test_default_validator_key_invalid(api_key_auth):
  function test_default_validator_missing_expected_token (line 332) | async def test_default_validator_missing_expected_token():
  function test_default_validator_uses_constant_time_comparison (line 344) | async def test_default_validator_uses_constant_time_comparison(api_key_a...
  function test_api_key_empty (line 357) | async def test_api_key_empty(mock_request):
  function test_api_key_whitespace_only (line 370) | async def test_api_key_whitespace_only(mock_request):
  function test_api_key_very_long (line 385) | async def test_api_key_very_long(mock_request):
  function test_api_key_with_null_bytes (line 403) | async def test_api_key_with_null_bytes(mock_request):
  function test_api_key_with_control_characters (line 420) | async def test_api_key_with_control_characters(mock_request):
  function test_api_key_with_unicode_characters (line 438) | async def test_api_key_with_unicode_characters(mock_request):
  function test_api_key_with_unicode_characters_normalization_attack (line 456) | async def test_api_key_with_unicode_characters_normalization_attack(mock...
  function test_api_key_with_binary_data (line 478) | async def test_api_key_with_binary_data(mock_request):
  function test_api_key_with_regex_dos_attack_pattern (line 498) | async def test_api_key_with_regex_dos_attack_pattern(mock_request):
  function test_api_keys_with_newline_variations (line 516) | async def test_api_keys_with_newline_variations(mock_request):

FILE: autogpt_platform/backend/backend/api/utils/cors.py
  class CorsParams (line 9) | class CorsParams(TypedDict):
  function build_cors_params (line 14) | def build_cors_params(origins: Sequence[str], app_env: AppEnvironment) -...

FILE: autogpt_platform/backend/backend/api/utils/cors_test.py
  function test_build_cors_params_splits_regex_patterns (line 7) | def test_build_cors_params_splits_regex_patterns() -> None:
  function test_build_cors_params_combines_multiple_regex_patterns (line 19) | def test_build_cors_params_combines_multiple_regex_patterns() -> None:
  function test_build_cors_params_blocks_localhost_literal_in_production (line 33) | def test_build_cors_params_blocks_localhost_literal_in_production() -> N...
  function test_build_cors_params_blocks_localhost_regex_in_production (line 38) | def test_build_cors_params_blocks_localhost_regex_in_production() -> None:
  function test_build_cors_params_blocks_case_insensitive_localhost_regex (line 43) | def test_build_cors_params_blocks_case_insensitive_localhost_regex() -> ...
  function test_build_cors_params_blocks_regex_matching_localhost_at_runtime (line 48) | def test_build_cors_params_blocks_regex_matching_localhost_at_runtime() ...
  function test_build_cors_params_allows_vercel_preview_regex (line 53) | def test_build_cors_params_allows_vercel_preview_regex() -> None:

FILE: autogpt_platform/backend/backend/api/utils/openapi.py
  function sort_openapi (line 4) | def sort_openapi(app: FastAPI) -> None:

FILE: autogpt_platform/backend/backend/api/ws_api.py
  function lifespan (line 36) | async def lifespan(app: FastAPI):
  function get_connection_manager (line 57) | def get_connection_manager():
  function event_broadcaster (line 65) | async def event_broadcaster(manager: ConnectionManager):
  function authenticate_websocket (line 89) | async def authenticate_websocket(websocket: WebSocket) -> str:
  class WSMessageHandler (line 113) | class WSMessageHandler(Protocol):
    method __call__ (line 114) | async def __call__(
  function handle_subscribe (line 123) | async def handle_subscribe(
  function handle_unsubscribe (line 185) | async def handle_unsubscribe(
  function handle_heartbeat (line 218) | async def handle_heartbeat(
  function websocket_router (line 245) | async def websocket_router(
  function health (line 331) | async def health():
  class WebsocketServer (line 335) | class WebsocketServer(AppProcess):
    method run (line 336) | def run(self):

FILE: autogpt_platform/backend/backend/api/ws_api_test.py
  function mock_websocket (line 23) | def mock_websocket() -> AsyncMock:
  function mock_manager (line 30) | def mock_manager() -> AsyncMock:
  function test_websocket_server_uses_cors_helper (line 34) | def test_websocket_server_uses_cors_helper(mocker) -> None:
  function test_websocket_server_blocks_localhost_in_production (line 65) | def test_websocket_server_blocks_localhost_in_production(mocker) -> None:
  function test_websocket_router_subscribe (line 76) | async def test_websocket_router_subscribe(
  function test_websocket_router_unsubscribe (line 126) | async def test_websocket_router_unsubscribe(
  function test_websocket_router_invalid_method (line 173) | async def test_websocket_router_invalid_method(
  function test_handle_subscribe_success (line 202) | async def test_handle_subscribe_success(
  function test_handle_subscribe_missing_data (line 234) | async def test_handle_subscribe_missing_data(
  function test_handle_unsubscribe_success (line 253) | async def test_handle_unsubscribe_success(
  function test_handle_unsubscribe_missing_data (line 281) | async def test_handle_unsubscribe_missing_data(

FILE: autogpt_platform/backend/backend/app.py
  function run_processes (line 14) | def run_processes(*processes: "AppProcess", **kwargs):
  function main (line 34) | def main(**kwargs):

FILE: autogpt_platform/backend/backend/blocks/__init__.py
  function load_all_blocks (line 17) | def load_all_blocks() -> dict[str, type["AnyBlockSchema"]]:
  function _all_subclasses (line 115) | def _all_subclasses(cls: type[T]) -> list[type[T]]:
  function get_blocks (line 125) | def get_blocks() -> dict[str, Type["AnyBlockSchema"]]:
  function get_block (line 130) | def get_block(block_id: str) -> "AnyBlockSchema | None":
  function get_webhook_block_ids (line 136) | def get_webhook_block_ids() -> Sequence[str]:
  function get_io_block_ids (line 145) | def get_io_block_ids() -> Sequence[str]:
  function get_human_in_the_loop_block_ids (line 154) | def get_human_in_the_loop_block_ids() -> Sequence[str]:

FILE: autogpt_platform/backend/backend/blocks/_base.py
  class BlockType (line 56) | class BlockType(Enum):
  class BlockCategory (line 70) | class BlockCategory(Enum):
    method dict (line 93) | def dict(self) -> dict[str, str]:
  class BlockCostType (line 97) | class BlockCostType(str, Enum):
  class BlockCost (line 103) | class BlockCost(BaseModel):
    method __init__ (line 108) | def __init__(
  class BlockInfo (line 123) | class BlockInfo(BaseModel):
  class BlockSchema (line 136) | class BlockSchema(BaseModel):
    method jsonschema (line 140) | def jsonschema(cls) -> dict[str, Any]:
    method validate_data (line 170) | def validate_data(cls, data: BlockInput) -> str | None:
    method get_mismatch_error (line 177) | def get_mismatch_error(cls, data: BlockInput) -> str | None:
    method get_field_schema (line 181) | def get_field_schema(cls, field_name: str) -> dict[str, Any]:
    method validate_field (line 193) | def validate_field(cls, field_name: str, data: BlockInput) -> str | None:
    method get_fields (line 206) | def get_fields(cls) -> set[str]:
    method get_required_fields (line 210) | def get_required_fields(cls) -> set[str]:
    method __pydantic_init_subclass__ (line 218) | def __pydantic_init_subclass__(cls, **kwargs):
    method get_credentials_fields (line 251) | def get_credentials_fields(cls) -> dict[str, type[CredentialsMetaInput]]:
    method get_auto_credentials_fields (line 265) | def get_auto_credentials_fields(cls) -> dict[str, dict[str, Any]]:
    method get_credentials_fields_info (line 296) | def get_credentials_fields_info(cls) -> dict[str, CredentialsFieldInfo]:
    method get_input_defaults (line 321) | def get_input_defaults(cls, data: BlockInput) -> BlockInput:
    method get_missing_links (line 325) | def get_missing_links(cls, data: BlockInput, links: list["Link"]) -> s...
    method get_missing_input (line 330) | def get_missing_input(cls, data: BlockInput) -> set[str]:
  class BlockSchemaInput (line 334) | class BlockSchemaInput(BlockSchema):
  class BlockSchemaOutput (line 343) | class BlockSchemaOutput(BlockSchema):
  class EmptyInputSchema (line 358) | class EmptyInputSchema(BlockSchemaInput):
  class EmptyOutputSchema (line 362) | class EmptyOutputSchema(BlockSchemaOutput):
  class BlockManualWebhookConfig (line 371) | class BlockManualWebhookConfig(BaseModel):
  class BlockWebhookConfig (line 402) | class BlockWebhookConfig(BlockManualWebhookConfig):
  class Block (line 420) | class Block(ABC, Generic[BlockSchemaInputType, BlockSchemaOutputType]):
    method __init__ (line 423) | def __init__(
    method run (line 525) | async def run(self, input_data: BlockSchemaInputType, **kwargs) -> Blo...
    method run_once (line 548) | async def run_once(
    method merge_stats (line 557) | def merge_stats(self, stats: "NodeExecutionStats") -> "NodeExecutionSt...
    method name (line 562) | def name(self):
    method to_dict (line 565) | def to_dict(self):
    method get_info (line 580) | def get_info(self) -> BlockInfo:
    method execute (line 598) | async def execute(self, input_data: BlockInput, **kwargs) -> BlockOutput:
    method is_block_exec_need_review (line 616) | async def is_block_exec_need_review(
    method _execute (line 682) | async def _execute(self, input_data: BlockInput, **kwargs) -> BlockOut...
    method is_triggered_by_event_type (line 728) | def is_triggered_by_event_type(

FILE: autogpt_platform/backend/backend/blocks/_utils.py
  function is_block_auth_configured (line 11) | def is_block_auth_configured(

FILE: autogpt_platform/backend/backend/blocks/agent.py
  class AgentExecutorBlock (line 24) | class AgentExecutorBlock(Block):
    class Input (line 25) | class Input(BlockSchemaInput):
      method get_input_schema (line 42) | def get_input_schema(cls, data: BlockInput) -> dict[str, Any]:
      method get_input_defaults (line 46) | def get_input_defaults(cls, data: BlockInput) -> BlockInput:
      method get_missing_input (line 50) | def get_missing_input(cls, data: BlockInput) -> set[str]:
      method get_mismatch_error (line 55) | def get_mismatch_error(cls, data: BlockInput) -> str | None:
    class Output (line 58) | class Output(BlockSchema):
    method __init__ (line 62) | def __init__(self):
    method run (line 72) | async def run(
    method _run (line 123) | async def _run(
    method _stop (line 200) | async def _stop(

FILE: autogpt_platform/backend/backend/blocks/agent_mail/_config.py
  function _client (line 31) | def _client(credentials: APIKeyCredentials) -> AsyncAgentMail:

FILE: autogpt_platform/backend/backend/blocks/agent_mail/attachments.py
  class AgentMailGetMessageAttachmentBlock (line 28) | class AgentMailGetMessageAttachmentBlock(Block):
    class Input (line 37) | class Input(BlockSchemaInput):
    class Output (line 51) | class Output(BlockSchemaOutput):
    method __init__ (line 60) | def __init__(self):
    method get_attachment (line 84) | async def get_attachment(
    method run (line 97) | async def run(
  class AgentMailGetThreadAttachmentBlock (line 122) | class AgentMailGetThreadAttachmentBlock(Block):
    class Input (line 131) | class Input(BlockSchemaInput):
    class Output (line 143) | class Output(BlockSchemaOutput):
    method __init__ (line 152) | def __init__(self):
    method get_attachment (line 176) | async def get_attachment(
    method run (line 189) | async def run(

FILE: autogpt_platform/backend/backend/blocks/agent_mail/drafts.py
  class AgentMailCreateDraftBlock (line 25) | class AgentMailCreateDraftBlock(Block):
    class Input (line 35) | class Input(BlockSchemaInput):
    class Output (line 71) | class Output(BlockSchemaOutput):
    method __init__ (line 84) | def __init__(self):
    method create_draft (line 116) | async def create_draft(credentials: APIKeyCredentials, inbox_id: str, ...
    method run (line 120) | async def run(
  class AgentMailGetDraftBlock (line 150) | class AgentMailGetDraftBlock(Block):
    class Input (line 158) | class Input(BlockSchemaInput):
    class Output (line 167) | class Output(BlockSchemaOutput):
    method __init__ (line 180) | def __init__(self):
    method get_draft (line 216) | async def get_draft(credentials: APIKeyCredentials, inbox_id: str, dra...
    method run (line 220) | async def run(
  class AgentMailListDraftsBlock (line 238) | class AgentMailListDraftsBlock(Block):
    class Input (line 246) | class Input(BlockSchemaInput):
    class Output (line 269) | class Output(BlockSchemaOutput):
    method __init__ (line 280) | def __init__(self):
    method list_drafts (line 311) | async def list_drafts(credentials: APIKeyCredentials, inbox_id: str, *...
    method run (line 315) | async def run(
  class AgentMailUpdateDraftBlock (line 337) | class AgentMailUpdateDraftBlock(Block):
    class Input (line 346) | class Input(BlockSchemaInput):
    class Output (line 377) | class Output(BlockSchemaOutput):
    method __init__ (line 383) | def __init__(self):
    method update_draft (line 415) | async def update_draft(
    method run (line 423) | async def run(
  class AgentMailSendDraftBlock (line 451) | class AgentMailSendDraftBlock(Block):
    class Input (line 460) | class Input(BlockSchemaInput):
    class Output (line 469) | class Output(BlockSchemaOutput):
    method __init__ (line 479) | def __init__(self):
    method send_draft (line 512) | async def send_draft(credentials: APIKeyCredentials, inbox_id: str, dr...
    method run (line 516) | async def run(
  class AgentMailDeleteDraftBlock (line 532) | class AgentMailDeleteDraftBlock(Block):
    class Input (line 540) | class Input(BlockSchemaInput):
    class Output (line 551) | class Output(BlockSchemaOutput):
    method __init__ (line 557) | def __init__(self):
    method delete_draft (line 578) | async def delete_draft(
    method run (line 584) | async def run(
  class AgentMailListOrgDraftsBlock (line 596) | class AgentMailListOrgDraftsBlock(Block):
    class Input (line 605) | class Input(BlockSchemaInput):
    class Output (line 620) | class Output(BlockSchemaOutput):
    method __init__ (line 631) | def __init__(self):
    method list_org_drafts (line 659) | async def list_org_drafts(credentials: APIKeyCredentials, **params):
    method run (line 663) | async def run(

FILE: autogpt_platform/backend/backend/blocks/agent_mail/inbox.py
  class AgentMailCreateInboxBlock (line 25) | class AgentMailCreateInboxBlock(Block):
    class Input (line 34) | class Input(BlockSchemaInput):
    class Output (line 54) | class Output(BlockSchemaOutput):
    method __init__ (line 66) | def __init__(self):
    method create_inbox (line 93) | async def create_inbox(credentials: APIKeyCredentials, **params):
    method run (line 97) | async def run(
  class AgentMailGetInboxBlock (line 119) | class AgentMailGetInboxBlock(Block):
    class Input (line 127) | class Input(BlockSchemaInput):
    class Output (line 135) | class Output(BlockSchemaOutput):
    method __init__ (line 146) | def __init__(self):
    method get_inbox (line 178) | async def get_inbox(credentials: APIKeyCredentials, inbox_id: str):
    method run (line 182) | async def run(
  class AgentMailListInboxesBlock (line 197) | class AgentMailListInboxesBlock(Block):
    class Input (line 205) | class Input(BlockSchemaInput):
    class Output (line 220) | class Output(BlockSchemaOutput):
    method __init__ (line 233) | def __init__(self):
    method list_inboxes (line 261) | async def list_inboxes(credentials: APIKeyCredentials, **params):
    method run (line 265) | async def run(
  class AgentMailUpdateInboxBlock (line 283) | class AgentMailUpdateInboxBlock(Block):
    class Input (line 291) | class Input(BlockSchemaInput):
    class Output (line 302) | class Output(BlockSchemaOutput):
    method __init__ (line 309) | def __init__(self):
    method update_inbox (line 339) | async def update_inbox(credentials: APIKeyCredentials, inbox_id: str, ...
    method run (line 343) | async def run(
  class AgentMailDeleteInboxBlock (line 360) | class AgentMailDeleteInboxBlock(Block):
    class Input (line 369) | class Input(BlockSchemaInput):
    class Output (line 377) | class Output(BlockSchemaOutput):
    method __init__ (line 383) | def __init__(self):
    method delete_inbox (line 403) | async def delete_inbox(credentials: APIKeyCredentials, inbox_id: str):
    method run (line 407) | async def run(

FILE: autogpt_platform/backend/backend/blocks/agent_mail/lists.py
  class ListDirection (line 30) | class ListDirection(str, Enum):
  class ListType (line 35) | class ListType(str, Enum):
  class AgentMailListEntriesBlock (line 40) | class AgentMailListEntriesBlock(Block):
    class Input (line 49) | class Input(BlockSchemaInput):
    class Output (line 70) | class Output(BlockSchemaOutput):
    method __init__ (line 81) | def __init__(self):
    method list_entries (line 113) | async def list_entries(
    method run (line 119) | async def run(
  class AgentMailCreateListEntryBlock (line 142) | class AgentMailCreateListEntryBlock(Block):
    class Input (line 151) | class Input(BlockSchemaInput):
    class Output (line 170) | class Output(BlockSchemaOutput):
    method __init__ (line 177) | def __init__(self):
    method create_entry (line 208) | async def create_entry(
    method run (line 214) | async def run(
  class AgentMailGetListEntryBlock (line 236) | class AgentMailGetListEntryBlock(Block):
    class Input (line 244) | class Input(BlockSchemaInput):
    class Output (line 256) | class Output(BlockSchemaOutput):
    method __init__ (line 263) | def __init__(self):
    method get_entry (line 293) | async def get_entry(
    method run (line 299) | async def run(
  class AgentMailDeleteListEntryBlock (line 317) | class AgentMailDeleteListEntryBlock(Block):
    class Input (line 324) | class Input(BlockSchemaInput):
    class Output (line 338) | class Output(BlockSchemaOutput):
    method __init__ (line 344) | def __init__(self):
    method delete_entry (line 366) | async def delete_entry(
    method run (line 372) | async def run(

FILE: autogpt_platform/backend/backend/blocks/agent_mail/messages.py
  class AgentMailSendMessageBlock (line 23) | class AgentMailSendMessageBlock(Block):
    class Input (line 32) | class Input(BlockSchemaInput):
    class Output (line 67) | class Output(BlockSchemaOutput):
    method __init__ (line 79) | def __init__(self):
    method send_message (line 117) | async def send_message(credentials: APIKeyCredentials, inbox_id: str, ...
    method run (line 121) | async def run(
  class AgentMailListMessagesBlock (line 155) | class AgentMailListMessagesBlock(Block):
    class Input (line 164) | class Input(BlockSchemaInput):
    class Output (line 187) | class Output(BlockSchemaOutput):
    method __init__ (line 198) | def __init__(self):
    method list_messages (line 229) | async def list_messages(credentials: APIKeyCredentials, inbox_id: str,...
    method run (line 233) | async def run(
  class AgentMailGetMessageBlock (line 255) | class AgentMailGetMessageBlock(Block):
    class Input (line 264) | class Input(BlockSchemaInput):
    class Output (line 275) | class Output(BlockSchemaOutput):
    method __init__ (line 292) | def __init__(self):
    method get_message (line 332) | async def get_message(
    method run (line 342) | async def run(
  class AgentMailReplyToMessageBlock (line 362) | class AgentMailReplyToMessageBlock(Block):
    class Input (line 370) | class Input(BlockSchemaInput):
    class Output (line 387) | class Output(BlockSchemaOutput):
    method __init__ (line 397) | def __init__(self):
    method reply_to_message (line 431) | async def reply_to_message(
    method run (line 439) | async def run(
  class AgentMailForwardMessageBlock (line 462) | class AgentMailForwardMessageBlock(Block):
    class Input (line 471) | class Input(BlockSchemaInput):
    class Output (line 508) | class Output(BlockSchemaOutput):
    method __init__ (line 518) | def __init__(self):
    method forward_message (line 552) | async def forward_message(
    method run (line 560) | async def run(
  class AgentMailUpdateMessageBlock (line 597) | class AgentMailUpdateMessageBlock(Block):
    class Input (line 606) | class Input(BlockSchemaInput):
    class Output (line 623) | class Output(BlockSchemaOutput):
    method __init__ (line 630) | def __init__(self):
    method update_message (line 661) | async def update_message(
    method run (line 669) | async def run(

FILE: autogpt_platform/backend/backend/blocks/agent_mail/pods.py
  class AgentMailCreatePodBlock (line 24) | class AgentMailCreatePodBlock(Block):
    class Input (line 33) | class Input(BlockSchemaInput):
    class Output (line 42) | class Output(BlockSchemaOutput):
    method __init__ (line 47) | def __init__(self):
    method create_pod (line 73) | async def create_pod(credentials: APIKeyCredentials, **params):
    method run (line 77) | async def run(
  class AgentMailGetPodBlock (line 94) | class AgentMailGetPodBlock(Block):
    class Input (line 102) | class Input(BlockSchemaInput):
    class Output (line 108) | class Output(BlockSchemaOutput):
    method __init__ (line 113) | def __init__(self):
    method get_pod (line 139) | async def get_pod(credentials: APIKeyCredentials, pod_id: str):
    method run (line 143) | async def run(
  class AgentMailListPodsBlock (line 156) | class AgentMailListPodsBlock(Block):
    class Input (line 164) | class Input(BlockSchemaInput):
    class Output (line 179) | class Output(BlockSchemaOutput):
    method __init__ (line 190) | def __init__(self):
    method list_pods (line 218) | async def list_pods(credentials: APIKeyCredentials, **params):
    method run (line 222) | async def run(
  class AgentMailDeletePodBlock (line 240) | class AgentMailDeletePodBlock(Block):
    class Input (line 248) | class Input(BlockSchemaInput):
    class Output (line 256) | class Output(BlockSchemaOutput):
    method __init__ (line 262) | def __init__(self):
    method delete_pod (line 279) | async def delete_pod(credentials: APIKeyCredentials, pod_id: str):
    method run (line 283) | async def run(
  class AgentMailListPodInboxesBlock (line 293) | class AgentMailListPodInboxesBlock(Block):
    class Input (line 301) | class Input(BlockSchemaInput):
    class Output (line 317) | class Output(BlockSchemaOutput):
    method __init__ (line 328) | def __init__(self):
    method list_pod_inboxes (line 356) | async def list_pod_inboxes(credentials: APIKeyCredentials, pod_id: str...
    method run (line 360) | async def run(
  class AgentMailListPodThreadsBlock (line 380) | class AgentMailListPodThreadsBlock(Block):
    class Input (line 389) | class Input(BlockSchemaInput):
    class Output (line 410) | class Output(BlockSchemaOutput):
    method __init__ (line 421) | def __init__(self):
    method list_pod_threads (line 449) | async def list_pod_threads(credentials: APIKeyCredentials, pod_id: str...
    method run (line 453) | async def run(
  class AgentMailListPodDraftsBlock (line 475) | class AgentMailListPodDraftsBlock(Block):
    class Input (line 483) | class Input(BlockSchemaInput):
    class Output (line 499) | class Output(BlockSchemaOutput):
    method __init__ (line 510) | def __init__(self):
    method list_pod_drafts (line 538) | async def list_pod_drafts(credentials: APIKeyCredentials, pod_id: str,...
    method run (line 542) | async def run(
  class AgentMailCreatePodInboxBlock (line 562) | class AgentMailCreatePodInboxBlock(Block):
    class Input (line 571) | class Input(BlockSchemaInput):
    class Output (line 589) | class Output(BlockSchemaOutput):
    method __init__ (line 599) | def __init__(self):
    method create_pod_inbox (line 626) | async def create_pod_inbox(credentials: APIKeyCredentials, pod_id: str...
    method run (line 630) | async def run(

FILE: autogpt_platform/backend/backend/blocks/agent_mail/threads.py
  class AgentMailListInboxThreadsBlock (line 23) | class AgentMailListInboxThreadsBlock(Block):
    class Input (line 31) | class Input(BlockSchemaInput):
    class Output (line 54) | class Output(BlockSchemaOutput):
    method __init__ (line 65) | def __init__(self):
    method list_threads (line 96) | async def list_threads(credentials: APIKeyCredentials, inbox_id: str, ...
    method run (line 100) | async def run(
  class AgentMailGetInboxThreadBlock (line 122) | class AgentMailGetInboxThreadBlock(Block):
    class Input (line 131) | class Input(BlockSchemaInput):
    class Output (line 140) | class Output(BlockSchemaOutput):
    method __init__ (line 150) | def __init__(self):
    method get_thread (line 185) | async def get_thread(credentials: APIKeyCredentials, inbox_id: str, th...
    method run (line 189) | async def run(
  class AgentMailDeleteInboxThreadBlock (line 207) | class AgentMailDeleteInboxThreadBlock(Block):
    class Input (line 215) | class Input(BlockSchemaInput):
    class Output (line 224) | class Output(BlockSchemaOutput):
    method __init__ (line 230) | def __init__(self):
    method delete_thread (line 251) | async def delete_thread(
    method run (line 257) | async def run(
  class AgentMailListOrgThreadsBlock (line 269) | class AgentMailListOrgThreadsBlock(Block):
    class Input (line 278) | class Input(BlockSchemaInput):
    class Output (line 298) | class Output(BlockSchemaOutput):
    method __init__ (line 309) | def __init__(self):
    method list_org_threads (line 337) | async def list_org_threads(credentials: APIKeyCredentials, **params):
    method run (line 341) | async def run(
  class AgentMailGetOrgThreadBlock (line 361) | class AgentMailGetOrgThreadBlock(Block):
    class Input (line 369) | class Input(BlockSchemaInput):
    class Output (line 377) | class Output(BlockSchemaOutput):
    method __init__ (line 387) | def __init__(self):
    method get_org_thread (line 421) | async def get_org_thread(credentials: APIKeyCredentials, thread_id: str):
    method run (line 425) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ai_condition.py
  class AIConditionBlock (line 23) | class AIConditionBlock(AIBlockBase):
    class Input (line 32) | class Input(BlockSchemaInput):
    class Output (line 59) | class Output(BlockSchemaOutput):
    method __init__ (line 73) | def __init__(self):
    method llm_call (line 106) | async def llm_call(
    method run (line 122) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ai_image_customizer.py
  class GeminiImageModel (line 27) | class GeminiImageModel(str, Enum):
  class AspectRatio (line 33) | class AspectRatio(str, Enum):
  class OutputFormat (line 47) | class OutputFormat(str, Enum):
  class AIImageCustomizerBlock (line 68) | class AIImageCustomizerBlock(Block):
    class Input (line 69) | class Input(BlockSchemaInput):
    class Output (line 100) | class Output(BlockSchemaOutput):
    method __init__ (line 103) | def __init__(self):
    method run (line 134) | async def run(
    method run_model (line 174) | async def run_model(

FILE: autogpt_platform/backend/backend/blocks/ai_image_generator_block.py
  class ImageSize (line 26) | class ImageSize(str, Enum):
  class ImageStyle (line 80) | class ImageStyle(str, Enum):
  class ImageGenModel (line 108) | class ImageGenModel(str, Enum):
  class AIImageGeneratorBlock (line 121) | class AIImageGeneratorBlock(Block):
    class Input (line 122) | class Input(BlockSchemaInput):
    class Output (line 156) | class Output(BlockSchemaOutput):
    method __init__ (line 159) | def __init__(self):
    method _run_client (line 189) | async def _run_client(
    method generate_image (line 219) | async def generate_image(self, input_data: Input, credentials: APIKeyC...
    method _style_to_prompt_prefix (line 310) | def _style_to_prompt_prefix(self, style: ImageStyle) -> str:
    method run (line 341) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ai_music_generator.py
  class MusicGenModelVersion (line 42) | class MusicGenModelVersion(str, Enum):
  class AudioFormat (line 49) | class AudioFormat(str, Enum):
  class NormalizationStrategy (line 55) | class NormalizationStrategy(str, Enum):
  class AIMusicGeneratorBlock (line 62) | class AIMusicGeneratorBlock(Block):
    class Input (line 63) | class Input(BlockSchemaInput):
    class Output (line 116) | class Output(BlockSchemaOutput):
    method __init__ (line 119) | def __init__(self):
    method run (line 150) | async def run(
    method run_model (line 190) | async def run_model(

FILE: autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py
  class AudioTrack (line 44) | class AudioTrack(str, Enum):
    method audio_url (line 69) | def audio_url(self):
  class GenerationPreset (line 97) | class GenerationPreset(str, Enum):
  class Voice (line 123) | class Voice(str, Enum):
    method voice_id (line 133) | def voice_id(self):
    method __str__ (line 145) | def __str__(self):
  class VisualMediaType (line 149) | class VisualMediaType(str, Enum):
  class AIShortformVideoCreatorBlock (line 158) | class AIShortformVideoCreatorBlock(Block):
    class Input (line 161) | class Input(BlockSchemaInput):
    class Output (line 200) | class Output(BlockSchemaOutput):
    method create_webhook (line 203) | async def create_webhook(self) -> tuple[str, str]:
    method create_video (line 211) | async def create_video(self, api_key: SecretStr, payload: dict) -> dict:
    method check_video_status (line 221) | async def check_video_status(self, api_key: SecretStr, pid: str) -> dict:
    method wait_for_video (line 228) | async def wait_for_video(
    method __init__ (line 259) | def __init__(self):
    method run (line 297) | async def run(
  class AIAdMakerVideoCreatorBlock (line 364) | class AIAdMakerVideoCreatorBlock(Block):
    class Input (line 367) | class Input(BlockSchemaInput):
    class Output (line 395) | class Output(BlockSchemaOutput):
    method create_webhook (line 398) | async def create_webhook(self) -> tuple[str, str]:
    method create_video (line 406) | async def create_video(self, api_key: SecretStr, payload: dict) -> dict:
    method check_video_status (line 416) | async def check_video_status(self, api_key: SecretStr, pid: str) -> dict:
    method wait_for_video (line 423) | async def wait_for_video(
    method __init__ (line 454) | def __init__(self):
    method run (line 487) | async def run(
  class AIScreenshotToVideoAdBlock (line 571) | class AIScreenshotToVideoAdBlock(Block):
    class Input (line 574) | class Input(BlockSchemaInput):
    class Output (line 592) | class Output(BlockSchemaOutput):
    method create_webhook (line 595) | async def create_webhook(self) -> tuple[str, str]:
    method create_video (line 603) | async def create_video(self, api_key: SecretStr, payload: dict) -> dict:
    method check_video_status (line 613) | async def check_video_status(self, api_key: SecretStr, pid: str) -> dict:
    method wait_for_video (line 620) | async def wait_for_video(
    method __init__ (line 651) | def __init__(self):
    method run (line 682) | async def run(

FILE: autogpt_platform/backend/backend/blocks/airtable/_api.py
  function _convert_bools (line 12) | def _convert_bools(
  class WebhookFilters (line 30) | class WebhookFilters(BaseModel):
  class WebhookIncludes (line 39) | class WebhookIncludes(BaseModel):
  class WebhookSpecification (line 45) | class WebhookSpecification(BaseModel):
  class WebhookPayload (line 51) | class WebhookPayload(BaseModel):
  class ListWebhookPayloadsResponse (line 63) | class ListWebhookPayloadsResponse(BaseModel):
  class TableFieldType (line 70) | class TableFieldType(str, Enum):
  class AirtableTimeZones (line 110) | class AirtableTimeZones(str, Enum):
  function create_table (line 551) | async def create_table(
  function update_table (line 576) | async def update_table(
  function create_field (line 606) | async def create_field(
  function update_field (line 635) | async def update_field(
  function get_table_schema (line 664) | async def get_table_schema(
  function get_empty_value_for_field (line 697) | def get_empty_value_for_field(field_type: str) -> Any:
  function normalize_records (line 749) | async def normalize_records(
  function list_records (line 825) | async def list_records(
  function get_record (line 878) | async def get_record(
  function update_multiple_records (line 892) | async def update_multiple_records(
  function update_record (line 922) | async def update_record(
  function create_record (line 949) | async def create_record(
  function delete_multiple_records (line 984) | async def delete_multiple_records(
  function delete_record (line 999) | async def delete_record(
  function create_webhook (line 1013) | async def create_webhook(
  function delete_webhook (line 1042) | async def delete_webhook(
  function list_webhook_payloads (line 1055) | async def list_webhook_payloads(
  function list_webhooks (line 1090) | async def list_webhooks(
  class OAuthAuthorizeRequest (line 1102) | class OAuthAuthorizeRequest(BaseModel):
  class OAuthTokenRequest (line 1127) | class OAuthTokenRequest(BaseModel):
  class OAuthRefreshTokenRequest (line 1150) | class OAuthRefreshTokenRequest(BaseModel):
  class OAuthTokenResponse (line 1169) | class OAuthTokenResponse(BaseModel):
  function make_oauth_authorize_url (line 1194) | def make_oauth_authorize_url(
  function oauth_exchange_code_for_tokens (line 1232) | async def oauth_exchange_code_for_tokens(
  function oauth_refresh_tokens (line 1285) | async def oauth_refresh_tokens(
  function create_base (line 1335) | async def create_base(
  function list_bases (line 1388) | async def list_bases(
  function get_base_tables (line 1415) | async def get_base_tables(

FILE: autogpt_platform/backend/backend/blocks/airtable/_api_test.py
  function test_create_update_table (line 32) | async def test_create_update_table():
  function test_invalid_field_type (line 81) | async def test_invalid_field_type():
  function test_create_and_update_field (line 100) | async def test_create_and_update_field():
  function test_record_management (line 142) | async def test_record_management():
  function test_webhook_management (line 270) | async def test_webhook_management():

FILE: autogpt_platform/backend/backend/blocks/airtable/_oauth.py
  class AirtableScope (line 22) | class AirtableScope(str, Enum):
  class AirtableOAuthHandler (line 55) | class AirtableOAuthHandler(BaseOAuthHandler):
    method __init__ (line 72) | def __init__(self, client_id: str, client_secret: Optional[str], redir...
    method get_login_url (line 80) | def get_login_url(
    method exchange_code_for_tokens (line 106) | async def exchange_code_for_tokens(
    method _refresh_tokens (line 144) | async def _refresh_tokens(
    method revoke_tokens (line 180) | async def revoke_tokens(self, credentials: OAuth2Credentials) -> bool:

FILE: autogpt_platform/backend/backend/blocks/airtable/_webhook.py
  class AirtableWebhookEvent (line 32) | class AirtableWebhookEvent(str, Enum):
  class AirtableWebhookManager (line 38) | class AirtableWebhookManager(BaseWebhooksManager):
    method validate_payload (line 44) | async def validate_payload(
    method _register_webhook (line 98) | async def _register_webhook(
    method _deregister_webhook (line 145) | async def _deregister_webhook(

FILE: autogpt_platform/backend/backend/blocks/airtable/bases.py
  class AirtableCreateBaseBlock (line 22) | class AirtableCreateBaseBlock(Block):
    class Input (line 27) | class Input(BlockSchemaInput):
    class Output (line 57) | class Output(BlockSchemaOutput):
    method __init__ (line 66) | def __init__(self):
    method run (line 75) | async def run(
  class AirtableListBasesBlock (line 117) | class AirtableListBasesBlock(Block):
    class Input (line 122) | class Input(BlockSchemaInput):
    class Output (line 133) | class Output(BlockSchemaOutput):
    method __init__ (line 139) | def __init__(self):
    method run (line 148) | async def run(

FILE: autogpt_platform/backend/backend/blocks/airtable/records.py
  class AirtableListRecordsBlock (line 30) | class AirtableListRecordsBlock(Block):
    class Input (line 35) | class Input(BlockSchemaInput):
    class Output (line 69) | class Output(BlockSchemaOutput):
    method __init__ (line 79) | def __init__(self):
    method run (line 88) | async def run(
  class AirtableGetRecordBlock (line 136) | class AirtableGetRecordBlock(Block):
    class Input (line 141) | class Input(BlockSchemaInput):
    class Output (line 157) | class Output(BlockSchemaOutput):
    method __init__ (line 166) | def __init__(self):
    method run (line 175) | async def run(
  class AirtableCreateRecordsBlock (line 216) | class AirtableCreateRecordsBlock(Block):
    class Input (line 221) | class Input(BlockSchemaInput):
    class Output (line 243) | class Output(BlockSchemaOutput):
    method __init__ (line 247) | def __init__(self):
    method run (line 256) | async def run(
  class AirtableUpdateRecordsBlock (line 289) | class AirtableUpdateRecordsBlock(Block):
    class Input (line 294) | class Input(BlockSchemaInput):
    class Output (line 310) | class Output(BlockSchemaOutput):
    method __init__ (line 313) | def __init__(self):
    method run (line 322) | async def run(
  class AirtableDeleteRecordsBlock (line 338) | class AirtableDeleteRecordsBlock(Block):
    class Input (line 343) | class Input(BlockSchemaInput):
    class Output (line 355) | class Output(BlockSchemaOutput):
    method __init__ (line 358) | def __init__(self):
    method run (line 367) | async def run(

FILE: autogpt_platform/backend/backend/blocks/airtable/schema.py
  class AirtableListSchemaBlock (line 21) | class AirtableListSchemaBlock(Block):
    class Input (line 27) | class Input(BlockSchemaInput):
    class Output (line 33) | class Output(BlockSchemaOutput):
    method __init__ (line 39) | def __init__(self):
    method run (line 48) | async def run(
  class AirtableCreateTableBlock (line 65) | class AirtableCreateTableBlock(Block):
    class Input (line 70) | class Input(BlockSchemaInput):
    class Output (line 81) | class Output(BlockSchemaOutput):
    method __init__ (line 85) | def __init__(self):
    method run (line 94) | async def run(
  class AirtableUpdateTableBlock (line 108) | class AirtableUpdateTableBlock(Block):
    class Input (line 113) | class Input(BlockSchemaInput):
    class Output (line 129) | class Output(BlockSchemaOutput):
    method __init__ (line 132) | def __init__(self):
    method run (line 141) | async def run(
  class AirtableCreateFieldBlock (line 156) | class AirtableCreateFieldBlock(Block):
    class Input (line 161) | class Input(BlockSchemaInput):
    class Output (line 180) | class Output(BlockSchemaOutput):
    method __init__ (line 184) | def __init__(self):
    method run (line 193) | async def run(
  class AirtableUpdateFieldBlock (line 208) | class AirtableUpdateFieldBlock(Block):
    class Input (line 213) | class Input(BlockSchemaInput):
    class Output (line 229) | class Output(BlockSchemaOutput):
    method __init__ (line 232) | def __init__(self):
    method run (line 241) | async def run(

FILE: autogpt_platform/backend/backend/blocks/airtable/triggers.py
  class AirtableEventSelector (line 19) | class AirtableEventSelector(BaseModel):
  class AirtableWebhookTriggerBlock (line 29) | class AirtableWebhookTriggerBlock(Block):
    class Input (line 36) | class Input(BlockSchemaInput):
    class Output (line 47) | class Output(BlockSchemaOutput):
    method __init__ (line 50) | def __init__(self):
    method run (line 109) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/apollo/_api.py
  class ApolloClient (line 19) | class ApolloClient:
    method __init__ (line 24) | def __init__(self, credentials: ApolloCredentials):
    method _get_headers (line 28) | def _get_headers(self) -> dict[str, str]:
    method search_people (line 31) | async def search_people(self, query: SearchPeopleRequest) -> List[Cont...
    method search_organizations (line 69) | async def search_organizations(
    method enrich_person (line 115) | async def enrich_person(self, query: EnrichPersonRequest) -> Contact:

FILE: autogpt_platform/backend/backend/blocks/apollo/_auth.py
  function ApolloCredentialsField (line 29) | def ApolloCredentialsField() -> ApolloCredentialsInput:

FILE: autogpt_platform/backend/backend/blocks/apollo/models.py
  class BaseModel (line 10) | class BaseModel(OriginalBaseModel):
    method model_dump (line 11) | def model_dump(self, *args, exclude: set[str] | None = None, **kwargs):
  class PrimaryPhone (line 23) | class PrimaryPhone(BaseModel):
  class SenorityLevels (line 31) | class SenorityLevels(str, Enum):
  class ContactEmailStatuses (line 47) | class ContactEmailStatuses(str, Enum):
  class RuleConfigStatus (line 56) | class RuleConfigStatus(BaseModel):
  class ContactCampaignStatus (line 69) | class ContactCampaignStatus(BaseModel):
  class Account (line 93) | class Account(BaseModel):
  class ContactEmail (line 143) | class ContactEmail(BaseModel):
  class EmploymentHistory (line 157) | class EmploymentHistory(BaseModel):
  class Breadcrumb (line 187) | class Breadcrumb(BaseModel):
  class TypedCustomField (line 196) | class TypedCustomField(BaseModel):
  class Pagination (line 203) | class Pagination(BaseModel):
  class DialerFlags (line 219) | class DialerFlags(BaseModel):
  class PhoneNumber (line 228) | class PhoneNumber(BaseModel):
  class Organization (line 246) | class Organization(BaseModel):
  class Contact (line 283) | class Contact(BaseModel):
  class SearchOrganizationsRequest (line 371) | class SearchOrganizationsRequest(BaseModel):
  class SearchOrganizationsResponse (line 435) | class SearchOrganizationsResponse(BaseModel):
  class SearchPeopleRequest (line 454) | class SearchPeopleRequest(BaseModel):
  class SearchPeopleResponse (line 540) | class SearchPeopleResponse(BaseModel):
  class EnrichPersonRequest (line 565) | class EnrichPersonRequest(BaseModel):

FILE: autogpt_platform/backend/backend/blocks/apollo/organization.py
  class SearchOrganizationsBlock (line 23) | class SearchOrganizationsBlock(Block):
    class Input (line 26) | class Input(BlockSchemaInput):
    class Output (line 78) | class Output(BlockSchemaOutput):
    method __init__ (line 91) | def __init__(self):
    method search_organizations (line 210) | async def search_organizations(
    method run (line 216) | async def run(

FILE: autogpt_platform/backend/backend/blocks/apollo/people.py
  class SearchPeopleBlock (line 27) | class SearchPeopleBlock(Block):
    class Input (line 30) | class Input(BlockSchemaInput):
    class Output (line 118) | class Output(BlockSchemaOutput):
    method __init__ (line 128) | def __init__(self):
    method search_people (line 306) | async def search_people(
    method enrich_person (line 313) | async def enrich_person(
    method merge_contact_data (line 320) | def merge_contact_data(original: Contact, enriched: Contact) -> Contact:
    method run (line 340) | async def run(

FILE: autogpt_platform/backend/backend/blocks/apollo/person.py
  class GetPersonDetailBlock (line 19) | class GetPersonDetailBlock(Block):
    class Input (line 22) | class Input(BlockSchemaInput):
    class Output (line 77) | class Output(BlockSchemaOutput):
    method __init__ (line 86) | def __init__(self):
    method enrich_person (line 130) | async def enrich_person(
    method run (line 136) | async def run(

FILE: autogpt_platform/backend/backend/blocks/autopilot.py
  class ToolCallEntry (line 35) | class ToolCallEntry(TypedDict):
  class TokenUsage (line 45) | class TokenUsage(TypedDict):
  class AutoPilotBlock (line 53) | class AutoPilotBlock(Block):
    class Input (line 61) | class Input(BlockSchemaInput):
    class Output (line 153) | class Output(BlockSchemaOutput):
    method __init__ (line 184) | def __init__(self):
    method create_session (line 235) | async def create_session(self, user_id: str) -> str:
    method execute_copilot (line 242) | async def execute_copilot(
    method run (line 336) | async def run(
  function _check_recursion (line 415) | def _check_recursion(
  function _reset_recursion (line 440) | def _reset_recursion(
  function _build_and_validate_permissions (line 459) | async def _build_and_validate_permissions(
  function _merge_inherited_permissions (line 487) | def _merge_inherited_permissions(

FILE: autogpt_platform/backend/backend/blocks/autopilot_permissions_test.py
  function _make_input (line 24) | def _make_input(**kwargs) -> AutoPilotBlock.Input:
  class TestBuildAndValidatePermissions (line 45) | class TestBuildAndValidatePermissions:
    method test_empty_inputs_returns_empty_permissions (line 46) | async def test_empty_inputs_returns_empty_permissions(self):
    method test_valid_tool_names_accepted (line 52) | async def test_valid_tool_names_accepted(self):
    method test_invalid_tool_rejected_by_pydantic (line 59) | async def test_invalid_tool_rejected_by_pydantic(self):
    method test_valid_block_name_accepted (line 65) | async def test_valid_block_name_accepted(self):
    method test_valid_partial_uuid_accepted (line 77) | async def test_valid_partial_uuid_accepted(self):
    method test_invalid_block_identifier_returns_error (line 88) | async def test_invalid_block_identifier_returns_error(self):
    method test_sdk_builtin_tool_names_accepted (line 101) | async def test_sdk_builtin_tool_names_accepted(self):
    method test_empty_blocks_skips_validation (line 107) | async def test_empty_blocks_skips_validation(self):
  class TestMergeInheritedPermissions (line 122) | class TestMergeInheritedPermissions:
    method test_no_permissions_no_parent_returns_none (line 123) | def test_no_permissions_no_parent_returns_none(self):
    method test_permissions_no_parent_returned_unchanged (line 128) | def test_permissions_no_parent_returned_unchanged(self):
    method test_child_narrows_parent (line 138) | def test_child_narrows_parent(self):
    method test_none_permissions_with_parent_uses_parent (line 157) | def test_none_permissions_with_parent_uses_parent(self):
    method test_child_cannot_expand_parent_whitelist (line 173) | def test_child_cannot_expand_parent_whitelist(self):
  class TestAutoPilotBlockRunPermissions (line 200) | class TestAutoPilotBlockRunPermissions:
    method _collect_outputs (line 201) | async def _collect_outputs(self, block, input_data, user_id="test-user"):
    method test_invalid_tool_rejected_by_pydantic (line 215) | async def test_invalid_tool_rejected_by_pydantic(self):
    method test_invalid_block_yields_error (line 220) | async def test_invalid_block_yields_error(self):
    method test_empty_prompt_yields_error_before_permission_check (line 233) | async def test_empty_prompt_yields_error_before_permission_check(self):
    method test_valid_permissions_passed_to_execute (line 240) | async def test_valid_permissions_passed_to_execute(self):

FILE: autogpt_platform/backend/backend/blocks/ayrshare/_util.py
  function get_profile_key (line 13) | async def get_profile_key(user_id: str):
  class BaseAyrshareInput (line 20) | class BaseAyrshareInput(BlockSchemaInput):
  class CarouselItem (line 66) | class CarouselItem(BaseModel):
  class CallToAction (line 74) | class CallToAction(BaseModel):
  class EventDetails (line 85) | class EventDetails(BaseModel):
  class OfferDetails (line 93) | class OfferDetails(BaseModel):
  class InstagramUserTag (line 104) | class InstagramUserTag(BaseModel):
  class LinkedInTargeting (line 112) | class LinkedInTargeting(BaseModel):
  class PinterestCarouselOption (line 128) | class PinterestCarouselOption(BaseModel):
  class YouTubeTargeting (line 136) | class YouTubeTargeting(BaseModel):
  function create_ayrshare_client (line 147) | def create_ayrshare_client():

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_bluesky.py
  class PostToBlueskyBlock (line 14) | class PostToBlueskyBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 41) | class Output(BlockSchemaOutput):
    method __init__ (line 45) | def __init__(self):
    method run (line 56) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_facebook.py
  class PostToFacebookBlock (line 19) | class PostToFacebookBlock(Block):
    class Input (line 22) | class Input(BaseAyrshareInput):
    class Output (line 104) | class Output(BlockSchemaOutput):
    method __init__ (line 108) | def __init__(self):
    method run (line 119) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_gmb.py
  class PostToGMBBlock (line 14) | class PostToGMBBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 97) | class Output(BlockSchemaOutput):
    method __init__ (line 101) | def __init__(self):
    method run (line 112) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_instagram.py
  class PostToInstagramBlock (line 21) | class PostToInstagramBlock(Block):
    class Input (line 24) | class Input(BaseAyrshareInput):
    class Output (line 97) | class Output(BlockSchemaOutput):
    method __init__ (line 101) | def __init__(self):
    method run (line 111) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_linkedin.py
  class PostToLinkedInBlock (line 14) | class PostToLinkedInBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 97) | class Output(BlockSchemaOutput):
    method __init__ (line 101) | def __init__(self):
    method run (line 111) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_pinterest.py
  class PostToPinterestBlock (line 19) | class PostToPinterestBlock(Block):
    class Input (line 22) | class Input(BaseAyrshareInput):
    class Output (line 76) | class Output(BlockSchemaOutput):
    method __init__ (line 80) | def __init__(self):
    method run (line 91) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_reddit.py
  class PostToRedditBlock (line 14) | class PostToRedditBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 22) | class Output(BlockSchemaOutput):
    method __init__ (line 26) | def __init__(self):
    method run (line 37) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_snapchat.py
  class PostToSnapchatBlock (line 14) | class PostToSnapchatBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 46) | class Output(BlockSchemaOutput):
    method __init__ (line 50) | def __init__(self):
    method run (line 61) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_telegram.py
  class PostToTelegramBlock (line 14) | class PostToTelegramBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 41) | class Output(BlockSchemaOutput):
    method __init__ (line 45) | def __init__(self):
    method run (line 56) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_threads.py
  class PostToThreadsBlock (line 14) | class PostToThreadsBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 34) | class Output(BlockSchemaOutput):
    method __init__ (line 38) | def __init__(self):
    method run (line 49) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_tiktok.py
  class TikTokVisibility (line 16) | class TikTokVisibility(str, Enum):
  class PostToTikTokBlock (line 22) | class PostToTikTokBlock(Block):
    class Input (line 25) | class Input(BaseAyrshareInput):
    class Output (line 101) | class Output(BlockSchemaOutput):
    method __init__ (line 105) | def __init__(self):
    method run (line 115) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_x.py
  class PostToXBlock (line 14) | class PostToXBlock(Block):
    class Input (line 17) | class Input(BaseAyrshareInput):
    class Output (line 100) | class Output(BlockSchemaOutput):
    method __init__ (line 104) | def __init__(self):
    method run (line 114) | async def run(

FILE: autogpt_platform/backend/backend/blocks/ayrshare/post_to_youtube.py
  class YouTubeVisibility (line 17) | class YouTubeVisibility(str, Enum):
  class PostToYouTubeBlock (line 23) | class PostToYouTubeBlock(Block):
    class Input (line 26) | class Input(BaseAyrshareInput):
    class Output (line 122) | class Output(BlockSchemaOutput):
    method __init__ (line 126) | def __init__(self):
    method run (line 136) | async def run(

FILE: autogpt_platform/backend/backend/blocks/baas/_api.py
  class MeetingBaasAPI (line 11) | class MeetingBaasAPI:
    method __init__ (line 16) | def __init__(self, api_key: str):
    method join_meeting (line 24) | async def join_meeting(
    method leave_meeting (line 85) | async def leave_meeting(self, bot_id: str) -> bool:
    method retranscribe (line 97) | async def retranscribe(
    method get_meeting_data (line 127) | async def get_meeting_data(
    method get_screenshots (line 147) | async def get_screenshots(self, bot_id: str) -> List[Dict[str, Any]]:
    method delete_data (line 163) | async def delete_data(self, bot_id: str) -> bool:
    method list_bots_with_metadata (line 175) | async def list_bots_with_metadata(

FILE: autogpt_platform/backend/backend/blocks/baas/bots.py
  class BaasBotJoinMeetingBlock (line 22) | class BaasBotJoinMeetingBlock(Block):
    class Input (line 27) | class Input(BlockSchemaInput):
    class Output (line 61) | class Output(BlockSchemaOutput):
    method __init__ (line 67) | def __init__(self):
    method run (line 76) | async def run(
  class BaasBotLeaveMeetingBlock (line 102) | class BaasBotLeaveMeetingBlock(Block):
    class Input (line 107) | class Input(BlockSchemaInput):
    class Output (line 113) | class Output(BlockSchemaOutput):
    method __init__ (line 116) | def __init__(self):
    method run (line 125) | async def run(
  class BaasBotFetchMeetingDataBlock (line 137) | class BaasBotFetchMeetingDataBlock(Block):
    class Input (line 142) | class Input(BlockSchemaInput):
    class Output (line 151) | class Output(BlockSchemaOutput):
    method __init__ (line 158) | def __init__(self):
    method run (line 167) | async def run(
  class BaasBotDeleteRecordingBlock (line 184) | class BaasBotDeleteRecordingBlock(Block):
    class Input (line 189) | class Input(BlockSchemaInput):
    class Output (line 195) | class Output(BlockSchemaOutput):
    method __init__ (line 200) | def __init__(self):
    method run (line 209) | async def run(

FILE: autogpt_platform/backend/backend/blocks/bannerbear/text_overlay.py
  class TextModification (line 34) | class TextModification(BlockSchemaInput):
  class BannerbearTextOverlayBlock (line 66) | class BannerbearTextOverlayBlock(Block):
    class Input (line 67) | class Input(BlockSchemaInput):
    class Output (line 103) | class Output(BlockSchemaOutput):
    method __init__ (line 113) | def __init__(self):
    method _make_api_request (line 157) | async def _make_api_request(self, payload: dict, api_key: str) -> dict:
    method run (line 184) | async def run(

FILE: autogpt_platform/backend/backend/blocks/basic.py
  class FileStoreBlock (line 18) | class FileStoreBlock(Block):
    class Input (line 19) | class Input(BlockSchemaInput):
    class Output (line 30) | class Output(BlockSchemaOutput):
    method __init__ (line 35) | def __init__(self):
    method run (line 50) | async def run(
  class StoreValueBlock (line 69) | class StoreValueBlock(Block):
    class Input (line 76) | class Input(BlockSchemaInput):
    class Output (line 87) | class Output(BlockSchemaOutput):
    method __init__ (line 90) | def __init__(self):
    method run (line 108) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class PrintToConsoleBlock (line 112) | class PrintToConsoleBlock(Block):
    class Input (line 113) | class Input(BlockSchemaInput):
    class Output (line 116) | class Output(BlockSchemaOutput):
    method __init__ (line 120) | def __init__(self):
    method run (line 136) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class NoteBlock (line 141) | class NoteBlock(Block):
    class Input (line 142) | class Input(BlockSchemaInput):
    class Output (line 145) | class Output(BlockSchemaOutput):
    method __init__ (line 148) | def __init__(self):
    method run (line 162) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class TypeOptions (line 166) | class TypeOptions(enum.Enum):
  class UniversalTypeConverterBlock (line 174) | class UniversalTypeConverterBlock(Block):
    class Input (line 175) | class Input(BlockSchemaInput):
    class Output (line 181) | class Output(BlockSchemaOutput):
    method __init__ (line 184) | def __init__(self):
    method run (line 193) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class ReverseListOrderBlock (line 210) | class ReverseListOrderBlock(Block):
    class Input (line 215) | class Input(BlockSchemaInput):
    class Output (line 218) | class Output(BlockSchemaOutput):
    method __init__ (line 221) | def __init__(self):
    method run (line 232) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/block.py
  class BlockInstallationBlock (line 15) | class BlockInstallationBlock(Block):
    class Input (line 24) | class Input(BlockSchemaInput):
    class Output (line 29) | class Output(BlockSchemaOutput):
    method __init__ (line 37) | def __init__(self):
    method run (line 47) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/branching.py
  class ComparisonOperator (line 15) | class ComparisonOperator(Enum):
  class ConditionBlock (line 24) | class ConditionBlock(Block):
    class Input (line 25) | class Input(BlockSchemaInput):
    class Output (line 49) | class Output(BlockSchemaOutput):
    method __init__ (line 60) | def __init__(self):
    method run (line 80) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class IfInputMatchesBlock (line 122) | class IfInputMatchesBlock(Block):
    class Input (line 123) | class Input(BlockSchemaInput):
    class Output (line 143) | class Output(BlockSchemaOutput):
    method __init__ (line 154) | def __init__(self):
    method run (line 193) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/claude_code.py
  class ClaudeCodeExecutionError (line 32) | class ClaudeCodeExecutionError(Exception):
    method __init__ (line 39) | def __init__(self, message: str, sandbox_id: str = ""):
  class ClaudeCodeBlock (line 75) | class ClaudeCodeBlock(Block):
    class Input (line 86) | class Input(BlockSchemaInput):
    class Output (line 184) | class Output(BlockSchemaOutput):
    method __init__ (line 218) | def __init__(self):
    method execute_claude_code (line 287) | async def execute_claude_code(
    method _escape_prompt (line 481) | def _escape_prompt(self, prompt: str) -> str:
    method run (line 487) | async def run(

FILE: autogpt_platform/backend/backend/blocks/code_executor.py
  class ProgrammingLanguage (line 46) | class ProgrammingLanguage(Enum):
  class MainCodeExecutionResult (line 54) | class MainCodeExecutionResult(BaseModel):
    class Chart (line 66) | class Chart(BaseModel, E2BExecutionResultChart):
  class CodeExecutionResult (line 85) | class CodeExecutionResult(MainCodeExecutionResult):
  class BaseE2BExecutorMixin (line 92) | class BaseE2BExecutorMixin:
    method execute_code (line 98) | async def execute_code(
    method process_execution_results (line 182) | def process_execution_results(
  class ExecuteCodeBlock (line 204) | class ExecuteCodeBlock(Block, BaseE2BExecutorMixin):
    class Input (line 208) | class Input(BlockSchemaInput):
    class Output (line 266) | class Output(BlockSchemaOutput):
    method __init__ (line 288) | def __init__(self):
    method run (line 322) | async def run(
  class InstantiateCodeSandboxBlock (line 360) | class InstantiateCodeSandboxBlock(Block, BaseE2BExecutorMixin):
    class Input (line 361) | class Input(BlockSchemaInput):
    class Output (line 411) | class Output(BlockSchemaOutput):
    method __init__ (line 422) | def __init__(self):
    method run (line 458) | async def run(
  class ExecuteCodeStepBlock (line 485) | class ExecuteCodeStepBlock(Block, BaseE2BExecutorMixin):
    class Input (line 486) | class Input(BlockSchemaInput):
    class Output (line 519) | class Output(BlockSchemaOutput):
    method __init__ (line 535) | def __init__(self):
    method run (line 566) | async def run(

FILE: autogpt_platform/backend/backend/blocks/code_extraction_block.py
  class CodeExtractionBlock (line 13) | class CodeExtractionBlock(Block):
    class Input (line 14) | class Input(BlockSchemaInput):
    class Output (line 20) | class Output(BlockSchemaOutput):
    method __init__ (line 41) | def __init__(self):
    method run (line 58) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
    method extract_code (line 108) | def extract_code(self, text: str, language: str) -> str:

FILE: autogpt_platform/backend/backend/blocks/codex.py
  class CodexCallResult (line 27) | class CodexCallResult:
  class CodexModel (line 35) | class CodexModel(str, Enum):
  class CodexReasoningEffort (line 41) | class CodexReasoningEffort(str, Enum):
  function CodexCredentialsField (line 69) | def CodexCredentialsField() -> CodexCredentials:
  class CodeGenerationBlock (line 75) | class CodeGenerationBlock(Block):
    class Input (line 78) | class Input(BlockSchemaInput):
    class Output (line 112) | class Output(BlockSchemaOutput):
    method __init__ (line 125) | def __init__(self):
    method call_codex (line 154) | async def call_codex(
    method run (line 206) | async def run(

FILE: autogpt_platform/backend/backend/blocks/compass/triggers.py
  class Transcription (line 16) | class Transcription(BaseModel):
  class TranscriptionDataModel (line 24) | class TranscriptionDataModel(BaseModel):
  class CompassAITriggerBlock (line 30) | class CompassAITriggerBlock(Block):
    class Input (line 31) | class Input(BlockSchemaInput):
    class Output (line 34) | class Output(BlockSchemaOutput):
    method __init__ (line 39) | def __init__(self):
    method run (line 60) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/count_words_and_char_block.py
  class WordCharacterCountBlock (line 11) | class WordCharacterCountBlock(Block):
    class Input (line 12) | class Input(BlockSchemaInput):
    class Output (line 19) | class Output(BlockSchemaOutput):
    method __init__ (line 28) | def __init__(self):
    method run (line 39) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/data_manipulation.py
  class CreateDictionaryBlock (line 20) | class CreateDictionaryBlock(Block):
    class Input (line 21) | class Input(BlockSchemaInput):
    class Output (line 27) | class Output(BlockSchemaOutput):
    method __init__ (line 35) | def __init__(self):
    method run (line 62) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class AddToDictionaryBlock (line 70) | class AddToDictionaryBlock(Block):
    class Input (line 71) | class Input(BlockSchemaInput):
    class Output (line 95) | class Output(BlockSchemaOutput):
    method __init__ (line 100) | def __init__(self):
    method run (line 136) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class FindInDictionaryBlock (line 148) | class FindInDictionaryBlock(Block):
    class Input (line 149) | class Input(BlockSchemaInput):
    class Output (line 153) | class Output(BlockSchemaOutput):
    method __init__ (line 159) | def __init__(self):
    method run (line 184) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class RemoveFromDictionaryBlock (line 208) | class RemoveFromDictionaryBlock(Block):
    class Input (line 209) | class Input(BlockSchemaInput):
    class Output (line 218) | class Output(BlockSchemaOutput):
    method __init__ (line 224) | def __init__(self):
    method run (line 246) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class ReplaceDictionaryValueBlock (line 257) | class ReplaceDictionaryValueBlock(Block):
    class Input (line 258) | class Input(BlockSchemaInput):
    class Output (line 265) | class Output(BlockSchemaOutput):
    method __init__ (line 271) | def __init__(self):
    method run (line 294) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class DictionaryIsEmptyBlock (line 305) | class DictionaryIsEmptyBlock(Block):
    class Input (line 306) | class Input(BlockSchemaInput):
    class Output (line 309) | class Output(BlockSchemaOutput):
    method __init__ (line 312) | def __init__(self):
    method run (line 323) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class CreateListBlock (line 332) | class CreateListBlock(Block):
    class Input (line 333) | class Input(BlockSchemaInput):
    class Output (line 349) | class Output(BlockSchemaOutput):
    method __init__ (line 354) | def __init__(self):
    method run (line 381) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class AddToListBlock (line 408) | class AddToListBlock(Block):
    class Input (line 409) | class Input(BlockSchemaInput):
    class Output (line 430) | class Output(BlockSchemaOutput):
    method __init__ (line 435) | def __init__(self):
    method run (line 473) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class FindInListBlock (line 487) | class FindInListBlock(Block):
    class Input (line 488) | class Input(BlockSchemaInput):
    class Output (line 492) | class Output(BlockSchemaOutput):
    method __init__ (line 501) | def __init__(self):
    method run (line 520) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class GetListItemBlock (line 529) | class GetListItemBlock(Block):
    class Input (line 530) | class Input(BlockSchemaInput):
    class Output (line 536) | class Output(BlockSchemaOutput):
    method __init__ (line 539) | def __init__(self):
    method run (line 556) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class RemoveFromListBlock (line 563) | class RemoveFromListBlock(Block):
    class Input (line 564) | class Input(BlockSchemaInput):
    class Output (line 577) | class Output(BlockSchemaOutput):
    method __init__ (line 581) | def __init__(self):
    method run (line 599) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class ReplaceListItemBlock (line 619) | class ReplaceListItemBlock(Block):
    class Input (line 620) | class Input(BlockSchemaInput):
    class Output (line 627) | class Output(BlockSchemaOutput):
    method __init__ (line 631) | def __init__(self):
    method run (line 650) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class ListIsEmptyBlock (line 663) | class ListIsEmptyBlock(Block):
    class Input (line 664) | class Input(BlockSchemaInput):
    class Output (line 667) | class Output(BlockSchemaOutput):
    method __init__ (line 670) | def __init__(self):
    method run (line 681) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  function _validate_list_input (line 690) | def _validate_list_input(item: Any, index: int) -> str | None:
  function _validate_all_lists (line 703) | def _validate_all_lists(lists: List[Any]) -> str | None:
  function _concatenate_lists_simple (line 712) | def _concatenate_lists_simple(lists: List[List[Any]]) -> List[Any]:
  function _flatten_nested_list (line 722) | def _flatten_nested_list(nested: List[Any], max_depth: int = -1) -> List...
  function _flatten_recursive (line 741) | def _flatten_recursive(
  function _deduplicate_list (line 760) | def _deduplicate_list(items: List[Any]) -> List[Any]:
  function _make_hashable (line 780) | def _make_hashable(item: Any):
  function _filter_none_values (line 799) | def _filter_none_values(items: List[Any]) -> List[Any]:
  function _compute_nesting_depth (line 804) | def _compute_nesting_depth(
  function _interleave_lists (line 841) | def _interleave_lists(lists: List[List[Any]]) -> List[Any]:
  class ConcatenateListsBlock (line 865) | class ConcatenateListsBlock(Block):
    class Input (line 875) | class Input(BlockSchemaInput):
    class Output (line 891) | class Output(BlockSchemaOutput):
    method __init__ (line 902) | def __init__(self):
    method _validate_inputs (line 933) | def _validate_inputs(self, lists: List[Any]) -> str | None:
    method _perform_concatenation (line 936) | def _perform_concatenation(self, lists: List[List[Any]]) -> List[Any]:
    method _apply_deduplication (line 939) | def _apply_deduplication(self, items: List[Any]) -> List[Any]:
    method _apply_none_removal (line 942) | def _apply_none_removal(self, items: List[Any]) -> List[Any]:
    method _post_process (line 945) | def _post_process(
    method run (line 956) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class FlattenListBlock (line 975) | class FlattenListBlock(Block):
    class Input (line 985) | class Input(BlockSchemaInput):
    class Output (line 996) | class Output(BlockSchemaOutput):
    method __init__ (line 1008) | def __init__(self):
    method _compute_depth (line 1041) | def _compute_depth(self, items: List[Any]) -> int:
    method _flatten (line 1045) | def _flatten(self, items: List[Any], max_depth: int) -> List[Any]:
    method _validate_max_depth (line 1049) | def _validate_max_depth(self, max_depth: int) -> str | None:
    method run (line 1055) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class InterleaveListsBlock (line 1070) | class InterleaveListsBlock(Block):
    class Input (line 1080) | class Input(BlockSchemaInput):
    class Output (line 1086) | class Output(BlockSchemaOutput):
    method __init__ (line 1095) | def __init__(self):
    method _validate_inputs (line 1120) | def _validate_inputs(self, lists: List[Any]) -> str | None:
    method _interleave (line 1123) | def _interleave(self, lists: List[List[Any]]) -> List[Any]:
    method run (line 1126) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class ZipListsBlock (line 1137) | class ZipListsBlock(Block):
    class Input (line 1147) | class Input(BlockSchemaInput):
    class Output (line 1163) | class Output(BlockSchemaOutput):
    method __init__ (line 1172) | def __init__(self):
    method _validate_inputs (line 1201) | def _validate_inputs(self, lists: List[Any]) -> str | None:
    method _zip_truncate (line 1204) | def _zip_truncate(self, lists: List[List[Any]]) -> List[List[Any]]:
    method _zip_pad (line 1211) | def _zip_pad(self, lists: List[List[Any]], fill_value: Any) -> List[Li...
    method run (line 1230) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class ListDifferenceBlock (line 1250) | class ListDifferenceBlock(Block):
    class Input (line 1260) | class Input(BlockSchemaInput):
    class Output (line 1275) | class Output(BlockSchemaOutput):
    method __init__ (line 1284) | def __init__(self):
    method _compute_difference (line 1313) | def _compute_difference(self, list_a: List[Any], list_b: List[Any]) ->...
    method _compute_symmetric_difference (line 1318) | def _compute_symmetric_difference(
    method run (line 1328) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:
  class ListIntersectionBlock (line 1340) | class ListIntersectionBlock(Block):
    class Input (line 1348) | class Input(BlockSchemaInput):
    class Output (line 1358) | class Output(BlockSchemaOutput):
    method __init__ (line 1367) | def __init__(self):
    method _compute_intersection (line 1392) | def _compute_intersection(self, list_a: List[Any], list_b: List[Any]) ...
    method run (line 1404) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/dataforseo/_api.py
  class DataForSeoClient (line 11) | class DataForSeoClient:
    method __init__ (line 16) | def __init__(self, credentials: UserPasswordCredentials):
    method _get_headers (line 23) | def _get_headers(self) -> Dict[str, str]:
    method keyword_suggestions (line 34) | async def keyword_suggestions(
    method related_keywords (line 107) | async def related_keywords(

FILE: autogpt_platform/backend/backend/blocks/dataforseo/keyword_suggestions.py
  class KeywordSuggestion (line 22) | class KeywordSuggestion(BlockSchemaInput):
  class DataForSeoKeywordSuggestionsBlock (line 46) | class DataForSeoKeywordSuggestionsBlock(Block):
    class Input (line 49) | class Input(BlockSchemaInput):
    class Output (line 81) | class Output(BlockSchemaOutput):
    method __init__ (line 95) | def __init__(self):
    method _fetch_keyword_suggestions (line 141) | async def _fetch_keyword_suggestions(
    method run (line 157) | async def run(
  class KeywordSuggestionExtractorBlock (line 213) | class KeywordSuggestionExtractorBlock(Block):
    class Input (line 216) | class Input(BlockSchemaInput):
    class Output (line 221) | class Output(BlockSchemaOutput):
    method __init__ (line 242) | def __init__(self):
    method run (line 269) | async def run(

FILE: autogpt_platform/backend/backend/blocks/dataforseo/related_keywords.py
  class RelatedKeyword (line 22) | class RelatedKeyword(BlockSchemaInput):
  class DataForSeoRelatedKeywordsBlock (line 46) | class DataForSeoRelatedKeywordsBlock(Block):
    class Input (line 49) | class Input(BlockSchemaInput):
    class Output (line 89) | class Output(BlockSchemaOutput):
    method __init__ (line 103) | def __init__(self):
    method _fetch_related_keywords (line 150) | async def _fetch_related_keywords(
    method run (line 167) | async def run(
  class RelatedKeywordExtractorBlock (line 228) | class RelatedKeywordExtractorBlock(Block):
    class Input (line 231) | class Input(BlockSchemaInput):
    class Output (line 236) | class Output(BlockSchemaOutput):
    method __init__ (line 257) | def __init__(self):
    method run (line 284) | async def run(

FILE: autogpt_platform/backend/backend/blocks/decoder_block.py
  class TextDecoderBlock (line 13) | class TextDecoderBlock(Block):
    class Input (line 14) | class Input(BlockSchemaInput):
    class Output (line 20) | class Output(BlockSchemaOutput):
    method __init__ (line 25) | def __init__(self):
    method run (line 43) | async def run(self, input_data: Input, **kwargs) -> BlockOutput:

FILE: autogpt_platform/backend/backend/blocks/discord/_api.py
  class DiscordAPIException (line 16) | class DiscordAPIException(Exception):
    method __init__ (line 19) | def __init__(self, message: str, status_code: int):
  class DiscordOAuthUser (line 24) | class DiscordOAuthUser(BaseModel):
  function get_api (line 34) | def get_api(credentials: OAuth2Credentials) -> Requests:
  function get_current_user (line 54) | async def get_current_user(credentials: OAuth2Credentials) -> DiscordOAu...

FILE: autogpt_platform/backend/backend/blocks/discord/_auth.py
  function DiscordBotCredentialsField (line 32) | def DiscordBotCredentialsField() -> DiscordBotCredentialsInput:
  function DiscordOAuthCredentialsField (line 37) | def DiscordOAuthCredentialsField(scopes: list[str]) -> DiscordOAuthCrede...

FILE: autogpt_platform/backend/backend/blocks/discord/bot_blocks.py
  class ThreadArchiveDuration (line 38) | class ThreadArchiveDuration(str, Enum):
    method to_minutes (line 46) | def to_minutes(self) -> 
Copy disabled (too large) Download .json
Condensed preview — 4156 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (70,129K chars).
[
  {
    "path": ".branchlet.json",
    "chars": 936,
    "preview": "{\n  \"worktreeCopyPatterns\": [\n    \".env*\",\n    \".vscode/**\",\n    \".auth/**\",\n    \".claude/**\",\n    \"autogpt_platform/.en"
  },
  {
    "path": ".claude/skills/pr-address/SKILL.md",
    "chars": 9900,
    "preview": "---\nname: pr-address\ndescription: Address PR review comments and loop until CI green and all comments resolved. TRIGGER "
  },
  {
    "path": ".claude/skills/pr-review/SKILL.md",
    "chars": 3063,
    "preview": "---\nname: pr-review\ndescription: Review a PR for correctness, security, code quality, and testing issues. TRIGGER when u"
  },
  {
    "path": ".claude/skills/pr-test/SKILL.md",
    "chars": 31952,
    "preview": "---\nname: pr-test\ndescription: \"E2E manual testing of PRs/branches using docker compose, agent-browser, and API calls. T"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/AGENTS.md",
    "chars": 60499,
    "preview": "# React Best Practices\n\n**Version 1.0.0**  \nVercel Engineering  \nJanuary 2026\n\n> **Note:**  \n> This document is mainly f"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/SKILL.md",
    "chars": 5316,
    "preview": "---\nname: vercel-react-best-practices\ndescription: React and Next.js performance optimization guidelines from Vercel Eng"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md",
    "chars": 1478,
    "preview": "---\ntitle: Store Event Handlers in Refs\nimpact: LOW\nimpactDescription: stable subscriptions\ntags: advanced, hooks, refs,"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md",
    "chars": 1191,
    "preview": "---\ntitle: useLatest for Stable Callback Refs\nimpact: LOW\nimpactDescription: prevents effect re-runs\ntags: advanced, hoo"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/async-api-routes.md",
    "chars": 1124,
    "preview": "---\ntitle: Prevent Waterfall Chains in API Routes\nimpact: CRITICAL\nimpactDescription: 2-10× improvement\ntags: api-routes"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/async-defer-await.md",
    "chars": 2028,
    "preview": "---\ntitle: Defer Await Until Needed\nimpact: HIGH\nimpactDescription: avoids blocking unused code paths\ntags: async, await"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/async-dependencies.md",
    "chars": 941,
    "preview": "---\ntitle: Dependency-Based Parallelization\nimpact: CRITICAL\nimpactDescription: 2-10× improvement\ntags: async, paralleli"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/async-parallel.md",
    "chars": 653,
    "preview": "---\ntitle: Promise.all() for Independent Operations\nimpact: CRITICAL\nimpactDescription: 2-10× improvement\ntags: async, p"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md",
    "chars": 2508,
    "preview": "---\ntitle: Strategic Suspense Boundaries\nimpact: HIGH\nimpactDescription: faster initial paint\ntags: async, suspense, str"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md",
    "chars": 2370,
    "preview": "---\ntitle: Avoid Barrel File Imports\nimpact: CRITICAL\nimpactDescription: 200-800ms import cost, slow builds\ntags: bundle"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/bundle-conditional.md",
    "chars": 866,
    "preview": "---\ntitle: Conditional Module Loading\nimpact: HIGH\nimpactDescription: loads large data only when needed\ntags: bundle, co"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md",
    "chars": 920,
    "preview": "---\ntitle: Defer Non-Critical Third-Party Libraries\nimpact: MEDIUM\nimpactDescription: loads after hydration\ntags: bundle"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md",
    "chars": 791,
    "preview": "---\ntitle: Dynamic Imports for Heavy Components\nimpact: CRITICAL\nimpactDescription: directly affects TTI and LCP\ntags: b"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/bundle-preload.md",
    "chars": 1149,
    "preview": "---\ntitle: Preload Based on User Intent\nimpact: MEDIUM\nimpactDescription: reduces perceived latency\ntags: bundle, preloa"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/client-event-listeners.md",
    "chars": 1969,
    "preview": "---\ntitle: Deduplicate Global Event Listeners\nimpact: LOW\nimpactDescription: single listener for N components\ntags: clie"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md",
    "chars": 1159,
    "preview": "---\ntitle: Use SWR for Automatic Deduplication\nimpact: MEDIUM-HIGH\nimpactDescription: automatic deduplication\ntags: clie"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md",
    "chars": 1902,
    "preview": "---\ntitle: Batch DOM CSS Changes\nimpact: MEDIUM\nimpactDescription: reduces reflows/repaints\ntags: javascript, dom, css, "
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md",
    "chars": 1949,
    "preview": "---\ntitle: Cache Repeated Function Calls\nimpact: MEDIUM\nimpactDescription: avoid redundant computation\ntags: javascript,"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md",
    "chars": 531,
    "preview": "---\ntitle: Cache Property Access in Loops\nimpact: LOW-MEDIUM\nimpactDescription: reduces lookups\ntags: javascript, loops,"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-cache-storage.md",
    "chars": 1651,
    "preview": "---\ntitle: Cache Storage API Calls\nimpact: LOW-MEDIUM\nimpactDescription: reduces expensive I/O\ntags: javascript, localSt"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md",
    "chars": 753,
    "preview": "---\ntitle: Combine Multiple Array Iterations\nimpact: LOW-MEDIUM\nimpactDescription: reduces iterations\ntags: javascript, "
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-early-exit.md",
    "chars": 1133,
    "preview": "---\ntitle: Early Return from Functions\nimpact: LOW-MEDIUM\nimpactDescription: avoids unnecessary computation\ntags: javasc"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md",
    "chars": 1028,
    "preview": "---\ntitle: Hoist RegExp Creation\nimpact: LOW-MEDIUM\nimpactDescription: avoids recreation\ntags: javascript, regexp, optim"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-index-maps.md",
    "chars": 834,
    "preview": "---\ntitle: Build Index Maps for Repeated Lookups\nimpact: LOW-MEDIUM\nimpactDescription: 1M ops to 2K ops\ntags: javascript"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-length-check-first.md",
    "chars": 1752,
    "preview": "---\ntitle: Early Length Check for Array Comparisons\nimpact: MEDIUM-HIGH\nimpactDescription: avoids expensive operations w"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md",
    "chars": 2105,
    "preview": "---\ntitle: Use Loop for Min/Max Instead of Sort\nimpact: LOW\nimpactDescription: O(n) instead of O(n log n)\ntags: javascri"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md",
    "chars": 532,
    "preview": "---\ntitle: Use Set/Map for O(1) Lookups\nimpact: LOW-MEDIUM\nimpactDescription: O(n) to O(1)\ntags: javascript, set, map, d"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md",
    "chars": 1782,
    "preview": "---\ntitle: Use toSorted() Instead of sort() for Immutability\nimpact: MEDIUM-HIGH\nimpactDescription: prevents mutation bu"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rendering-activity.md",
    "chars": 564,
    "preview": "---\ntitle: Use Activity Component for Show/Hide\nimpact: MEDIUM\nimpactDescription: preserves state/DOM\ntags: rendering, a"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md",
    "chars": 1185,
    "preview": "---\ntitle: Animate SVG Wrapper Instead of SVG Element\nimpact: LOW\nimpactDescription: enables hardware acceleration\ntags:"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md",
    "chars": 980,
    "preview": "---\ntitle: Use Explicit Conditional Rendering\nimpact: LOW\nimpactDescription: prevents rendering 0 or NaN\ntags: rendering"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md",
    "chars": 814,
    "preview": "---\ntitle: CSS content-visibility for Long Lists\nimpact: HIGH\nimpactDescription: faster initial render\ntags: rendering, "
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md",
    "chars": 1039,
    "preview": "---\ntitle: Hoist Static JSX Elements\nimpact: LOW\nimpactDescription: avoids re-creation\ntags: rendering, jsx, static, opt"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md",
    "chars": 2308,
    "preview": "---\ntitle: Prevent Hydration Mismatch Without Flickering\nimpact: MEDIUM\nimpactDescription: avoids visual flicker and hyd"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md",
    "chars": 588,
    "preview": "---\ntitle: Optimize SVG Precision\nimpact: LOW\nimpactDescription: reduces file size\ntags: rendering, svg, optimization, s"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md",
    "chars": 973,
    "preview": "---\ntitle: Defer State Reads to Usage Point\nimpact: MEDIUM\nimpactDescription: avoids unnecessary subscriptions\ntags: rer"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md",
    "chars": 824,
    "preview": "---\ntitle: Narrow Effect Dependencies\nimpact: LOW\nimpactDescription: minimizes effect re-runs\ntags: rerender, useEffect,"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md",
    "chars": 724,
    "preview": "---\ntitle: Subscribe to Derived State\nimpact: MEDIUM\nimpactDescription: reduces re-render frequency\ntags: rerender, deri"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md",
    "chars": 2958,
    "preview": "---\ntitle: Use Functional setState Updates\nimpact: MEDIUM\nimpactDescription: prevents stale closures and unnecessary cal"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md",
    "chars": 2016,
    "preview": "---\ntitle: Use Lazy State Initialization\nimpact: MEDIUM\nimpactDescription: wasted computation on every render\ntags: reac"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rerender-memo.md",
    "chars": 1148,
    "preview": "---\ntitle: Extract to Memoized Components\nimpact: MEDIUM\nimpactDescription: enables early returns\ntags: rerender, memo, "
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/rerender-transitions.md",
    "chars": 1055,
    "preview": "---\ntitle: Use Transitions for Non-Urgent Updates\nimpact: MEDIUM\nimpactDescription: maintains UI responsiveness\ntags: re"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md",
    "chars": 2012,
    "preview": "---\ntitle: Use after() for Non-Blocking Operations\nimpact: MEDIUM\nimpactDescription: faster response times\ntags: server,"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/server-cache-lru.md",
    "chars": 1353,
    "preview": "---\ntitle: Cross-Request LRU Caching\nimpact: HIGH\nimpactDescription: caches across requests\ntags: server, cache, lru, cr"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/server-cache-react.md",
    "chars": 681,
    "preview": "---\ntitle: Per-Request Deduplication with React.cache()\nimpact: MEDIUM\nimpactDescription: deduplicates within request\nta"
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md",
    "chars": 1515,
    "preview": "---\ntitle: Parallel Data Fetching with Component Composition\nimpact: CRITICAL\nimpactDescription: eliminates server-side "
  },
  {
    "path": ".claude/skills/vercel-react-best-practices/rules/server-serialization.md",
    "chars": 996,
    "preview": "---\ntitle: Minimize Serialization at RSC Boundaries\nimpact: HIGH\nimpactDescription: reduces data transfer size\ntags: ser"
  },
  {
    "path": ".claude/skills/worktree/SKILL.md",
    "chars": 2666,
    "preview": "---\nname: worktree\ndescription: Set up a new git worktree for parallel development. Creates the worktree, copies .env fi"
  },
  {
    "path": ".deepsource.toml",
    "chars": 300,
    "preview": "version = 1\n\ntest_patterns = [\"**/*.spec.ts\",\"**/*_test.py\",\"**/*_tests.py\",\"**/test_*.py\"]\n\nexclude_patterns = [\"classi"
  },
  {
    "path": ".dockerignore",
    "chars": 1490,
    "preview": "# Ignore everything by default, selectively add things to context\n*\n\n# Documentation (for embeddings/search)\n!docs/\n\n# P"
  },
  {
    "path": ".gitattributes",
    "chars": 231,
    "preview": "classic/frontend/build/** linguist-generated\n\n**/poetry.lock linguist-generated\n\ndocs/_javascript/** linguist-vendored\n\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 363,
    "preview": "* @Significant-Gravitas/maintainers\n.github/workflows/ @Significant-Gravitas/devops\nclassic/forge/ @Significant-Gravitas"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1.bug.yml",
    "chars": 7481,
    "preview": "name: Bug report 🐛\ndescription: Create a bug report for AutoGPT.\nlabels: ['status: needs triage']\nbody:\n  - type: markdo"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2.feature.yml",
    "chars": 1193,
    "preview": "name: Feature request 🚀\ndescription: Suggest a new idea for AutoGPT!\nlabels: ['status: needs triage']\nbody:\n  - type: ma"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1621,
    "preview": "### Why / What / How\n\n<!-- Why: Why does this PR exist? What problem does it solve, or what's broken/missing without it?"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 12320,
    "preview": "# GitHub Copilot Instructions for AutoGPT\n\nThis file provides comprehensive onboarding information for GitHub Copilot co"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 3830,
    "preview": "version: 2\nupdates:\n  # autogpt_libs (Poetry project)\n  - package-ecosystem: \"pip\"\n    directory: \"autogpt_platform/auto"
  },
  {
    "path": ".github/labeler.yml",
    "chars": 740,
    "preview": "Classic AutoGPT Agent:\n- changed-files:\n  - any-glob-to-any-file: classic/original_autogpt/**\n\nClassic Benchmark:\n- chan"
  },
  {
    "path": ".github/scripts/detect_overlaps.py",
    "chars": 44544,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nPR Overlap Detection Tool\n\nDetects potential merge conflicts between a given PR and other ope"
  },
  {
    "path": ".github/workflows/classic-autogpt-ci.yml",
    "chars": 4882,
    "preview": "name: Classic - AutoGPT CI\n\non:\n  push:\n    branches: [ master, dev, ci-test* ]\n    paths:\n      - '.github/workflows/cl"
  },
  {
    "path": ".github/workflows/classic-autogpt-docker-cache-clean.yml",
    "chars": 1813,
    "preview": "name: Classic - Purge Auto-GPT Docker CI cache\n\non:\n  schedule:\n    - cron: 20 4 * * 1,4\n\nenv:\n  BASE_BRANCH: dev\n  IMAG"
  },
  {
    "path": ".github/workflows/classic-autogpt-docker-ci.yml",
    "chars": 5544,
    "preview": "name: Classic - AutoGPT Docker CI\n\non:\n  push:\n    branches: [master, dev]\n    paths:\n      - '.github/workflows/classic"
  },
  {
    "path": ".github/workflows/classic-autogpt-docker-release.yml",
    "chars": 2981,
    "preview": "name: Classic - AutoGPT Docker Release\n\non:\n  release:\n    types: [published, edited]\n\n  workflow_dispatch:\n    inputs:\n"
  },
  {
    "path": ".github/workflows/classic-autogpts-ci.yml",
    "chars": 2233,
    "preview": "name: Classic - Agent smoke tests\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 8 * * *'\n  push:\n    branches: [ "
  },
  {
    "path": ".github/workflows/classic-benchmark-ci.yml",
    "chars": 6066,
    "preview": "name: Classic - AGBenchmark CI\n\non:\n  push:\n    branches: [ master, dev, ci-test* ]\n    paths:\n      - 'classic/benchmar"
  },
  {
    "path": ".github/workflows/classic-benchmark_publish_package.yml",
    "chars": 1440,
    "preview": "name: Classic - Publish to PyPI\n\non:\n  workflow_dispatch:\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    permissions:\n "
  },
  {
    "path": ".github/workflows/classic-forge-ci.yml",
    "chars": 9012,
    "preview": "name: Classic - Forge CI\n\non:\n  push:\n    branches: [ master, dev, ci-test* ]\n    paths:\n      - '.github/workflows/clas"
  },
  {
    "path": ".github/workflows/classic-frontend-ci.yml",
    "chars": 1926,
    "preview": "name: Classic - Frontend CI/CD\n\non:\n  push:\n    branches:\n      - master\n      - dev\n      - 'ci-test*' # This will matc"
  },
  {
    "path": ".github/workflows/classic-python-checks.yml",
    "chars": 4332,
    "preview": "name: Classic - Python checks\n\non:\n  push:\n    branches: [ master, dev, ci-test* ]\n    paths:\n      - '.github/workflows"
  },
  {
    "path": ".github/workflows/claude-ci-failure-auto-fix.yml",
    "chars": 4901,
    "preview": "name: Auto Fix CI Failures\n\non:\n  workflow_run:\n    workflows: [\"CI\"]\n    types:\n      - completed\n\npermissions:\n  conte"
  },
  {
    "path": ".github/workflows/claude-dependabot.yml",
    "chars": 15596,
    "preview": "# Claude Dependabot PR Review Workflow\n# \n# This workflow automatically runs Claude analysis on Dependabot PRs to:\n# - I"
  },
  {
    "path": ".github/workflows/claude.yml",
    "chars": 13008,
    "preview": "name: Claude Code\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]\n  issue"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 4484,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".github/workflows/copilot-setup-steps.yml",
    "chars": 12788,
    "preview": "name: \"Copilot Setup Steps\"\n\n# Automatically run the setup steps when they are changed to allow for easy validation, and"
  },
  {
    "path": ".github/workflows/docs-block-sync.yml",
    "chars": 2696,
    "preview": "name: Block Documentation Sync Check\n\non:\n  push:\n    branches: [master, dev]\n    paths:\n      - \"autogpt_platform/backe"
  },
  {
    "path": ".github/workflows/docs-claude-review.yml",
    "chars": 5162,
    "preview": "name: Claude Block Docs Review\n\non:\n  pull_request:\n    types: [opened, synchronize]\n    paths:\n      - \"docs/integratio"
  },
  {
    "path": ".github/workflows/docs-enhance.yml",
    "chars": 7606,
    "preview": "name: Enhance Block Documentation\n\non:\n  workflow_dispatch:\n    inputs:\n      block_pattern:\n        description: 'Block"
  },
  {
    "path": ".github/workflows/platform-autogpt-deploy-dev.yaml",
    "chars": 1616,
    "preview": "name: AutoGPT Platform - Deploy Dev Environment\n\non:\n  push:\n    branches: [ dev ]\n    paths:\n      - 'autogpt_platform/"
  },
  {
    "path": ".github/workflows/platform-autogpt-deploy-prod.yml",
    "chars": 1402,
    "preview": "name: AutoGPT Platform - Deploy Prod Environment\n\non:\n  release:\n    types: [published]\n  workflow_dispatch:\n\npermission"
  },
  {
    "path": ".github/workflows/platform-backend-ci.yml",
    "chars": 10581,
    "preview": "name: AutoGPT Platform - Backend CI\n\non:\n  push:\n    branches: [master, dev, ci-test*]\n    paths:\n      - \".github/workf"
  },
  {
    "path": ".github/workflows/platform-dev-deploy-event-dispatcher.yml",
    "chars": 7869,
    "preview": "name: AutoGPT Platform - Dev Deploy PR Event Dispatcher\n\non:\n  pull_request:\n    types: [closed]\n  issue_comment:\n    ty"
  },
  {
    "path": ".github/workflows/platform-frontend-ci.yml",
    "chars": 4004,
    "preview": "name: AutoGPT Platform - Frontend CI\n\non:\n  push:\n    branches: [master, dev]\n    paths:\n      - \".github/workflows/plat"
  },
  {
    "path": ".github/workflows/platform-fullstack-ci.yml",
    "chars": 12669,
    "preview": "name: AutoGPT Platform - Full-stack CI\n\non:\n  push:\n    branches: [master, dev]\n    paths:\n      - \".github/workflows/pl"
  },
  {
    "path": ".github/workflows/pr-overlap-check.yml",
    "chars": 1009,
    "preview": "name: PR Overlap Detection\n\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n    branches:\n      - dev\n   "
  },
  {
    "path": ".github/workflows/repo-close-stale-issues.yml",
    "chars": 1212,
    "preview": "name: Repo - Close stale issues\non:\n  schedule:\n    - cron: '30 1 * * *'\n  workflow_dispatch:\n\npermissions:\n  issues: wr"
  },
  {
    "path": ".github/workflows/repo-pr-enforce-base-branch.yml",
    "chars": 814,
    "preview": "name: Repo - Enforce dev as base branch\non:\n  pull_request_target:\n    branches: [ master ]\n    types: [ opened ]\n\njobs:"
  },
  {
    "path": ".github/workflows/repo-pr-label.yml",
    "chars": 2083,
    "preview": "name: Repo - Pull Request auto-label\n\non:\n  # So that PRs touching the same files as the push are updated\n  push:\n    br"
  },
  {
    "path": ".github/workflows/repo-stats.yml",
    "chars": 522,
    "preview": "name: Repo - Github Stats\n\non:\n  schedule:\n    # Run this once per day, towards the end of the day for keeping the most\n"
  },
  {
    "path": ".github/workflows/repo-workflow-checker.yml",
    "chars": 899,
    "preview": "name: Repo - PR Status Checker\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n  merge_group:\n\njobs:\n  st"
  },
  {
    "path": ".github/workflows/scripts/check_actions_status.py",
    "chars": 3481,
    "preview": "import json\nimport os\nimport requests\nimport sys\nimport time\nfrom typing import Dict, List, Tuple\n\nCHECK_INTERVAL = 30\n\n"
  },
  {
    "path": ".github/workflows/scripts/docker-ci-fix-compose-build-cache.py",
    "chars": 7487,
    "preview": "#!/usr/bin/env python3\n\"\"\"\nAdd cache configuration to a resolved docker-compose file for all services\nthat have a build "
  },
  {
    "path": ".github/workflows/scripts/docker-ci-summary.sh",
    "chars": 2731,
    "preview": "#!/bin/bash\nmeta=$(docker image inspect \"$IMAGE_NAME\" | jq '.[0]')\nhead_compare_url=$(sed \"s/{base}/$base_branch/; s/{he"
  },
  {
    "path": ".github/workflows/scripts/docker-release-summary.sh",
    "chars": 2032,
    "preview": "#!/bin/bash\nmeta=$(docker image inspect \"$IMAGE_NAME\" | jq '.[0]')\n\nEOF=$(dd if=/dev/urandom bs=15 count=1 status=none |"
  },
  {
    "path": ".github/workflows/scripts/get_package_version_from_lockfile.py",
    "chars": 1777,
    "preview": "#!/usr/bin/env python3\nimport sys\n\nif sys.version_info < (3, 11):\n    print(\"Python version 3.11 or higher required\")\n  "
  },
  {
    "path": ".gitignore",
    "chars": 2548,
    "preview": "## Original ignores\n.github_access_token\nclassic/original_autogpt/keys.py\nclassic/original_autogpt/*.json\nauto_gpt_works"
  },
  {
    "path": ".gitmodules",
    "chars": 161,
    "preview": "[submodule \"classic/forge/tests/vcr_cassettes\"]\n\tpath = classic/forge/tests/vcr_cassettes\n\turl = https://github.com/Sign"
  },
  {
    "path": ".nvmrc",
    "chars": 3,
    "preview": "22\n"
  },
  {
    "path": ".pr_agent.toml",
    "chars": 79,
    "preview": "[pr_code_suggestions]\ncommitable_code_suggestions=false\nnum_code_suggestions=0\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 14322,
    "preview": "default_install_hook_types:\n  - pre-commit\n  - pre-push\n  - post-checkout\n\ndefault_stages: [pre-commit]\n\nrepos:\n  - repo"
  },
  {
    "path": "AGENTS.md",
    "chars": 3549,
    "preview": "# AutoGPT Platform Contribution Guide\n\nThis guide provides context for Codex when updating the **autogpt_platform** fold"
  },
  {
    "path": "CITATION.cff",
    "chars": 561,
    "preview": "# This CITATION.cff file was generated with cffinit.\n# Visit https://bit.ly/cffinit to generate yours today!\n\ncff-versio"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 1841,
    "preview": "# Code of Conduct for AutoGPT\n\n## 1. Purpose\n\nThe purpose of this Code of Conduct is to provide guidelines for contribut"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2217,
    "preview": "# AutoGPT Contribution Guide\nIf you are reading this, you are probably looking for the full **[contribution guide]**,\nwh"
  },
  {
    "path": "LICENSE",
    "chars": 8545,
    "preview": "All portions of this repository are under one of two licenses. \n\n- Everything inside the autogpt_platform folder is und"
  },
  {
    "path": "README.md",
    "chars": 11734,
    "preview": "# AutoGPT: Build, Deploy, and Run AI Agents\n\n[![Discord Follow](https://img.shields.io/badge/dynamic/json?url=https%3A%2"
  },
  {
    "path": "SECURITY.md",
    "chars": 2427,
    "preview": "# Security Policy\n\n## Reporting Security Issues\n\nWe take the security of our project seriously. If you believe you have "
  },
  {
    "path": "autogpt_platform/.gitignore",
    "chars": 37,
    "preview": "*.ignore.*\n*.ign.*\n.application.logs\n"
  },
  {
    "path": "autogpt_platform/CLAUDE.md",
    "chars": 5347,
    "preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
  },
  {
    "path": "autogpt_platform/Contributor License Agreement (CLA).md",
    "chars": 4570,
    "preview": "**Determinist Ltd** \n\n**Contributor License Agreement (“Agreement”)**\n\nThank you for your interest in the AutoGPT open s"
  },
  {
    "path": "autogpt_platform/LICENSE.md",
    "chars": 5748,
    "preview": "# PolyForm Shield License 1.0.0\n\n<https://polyformproject.org/licenses/shield/1.0.0>\n\n## Acceptance\n\nIn order to get any"
  },
  {
    "path": "autogpt_platform/Makefile",
    "chars": 1902,
    "preview": ".PHONY: start-core stop-core logs-core format lint migrate run-backend run-frontend load-store-agents\n\n# Run just Supaba"
  },
  {
    "path": "autogpt_platform/README.md",
    "chars": 5245,
    "preview": "# AutoGPT Platform\n\nWelcome to the AutoGPT Platform - a powerful system for creating and running AI agents to solve busi"
  },
  {
    "path": "autogpt_platform/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/analytics/queries/auth_activities.sql",
    "chars": 1522,
    "preview": "-- =============================================================\n-- View: analytics.auth_activities\n-- Looker source ali"
  },
  {
    "path": "autogpt_platform/analytics/queries/graph_execution.sql",
    "chars": 5395,
    "preview": "-- =============================================================\n-- View: analytics.graph_execution\n-- Looker source ali"
  },
  {
    "path": "autogpt_platform/analytics/queries/node_block_execution.sql",
    "chars": 5498,
    "preview": "-- =============================================================\n-- View: analytics.node_block_execution\n-- Looker sourc"
  },
  {
    "path": "autogpt_platform/analytics/queries/retention_agent.sql",
    "chars": 5119,
    "preview": "-- =============================================================\n-- View: analytics.retention_agent\n-- Looker source ali"
  },
  {
    "path": "autogpt_platform/analytics/queries/retention_execution_daily.sql",
    "chars": 3954,
    "preview": "-- =============================================================\n-- View: analytics.retention_execution_daily\n-- Looker "
  },
  {
    "path": "autogpt_platform/analytics/queries/retention_execution_weekly.sql",
    "chars": 4032,
    "preview": "-- =============================================================\n-- View: analytics.retention_execution_weekly\n-- Looker"
  },
  {
    "path": "autogpt_platform/analytics/queries/retention_login_daily.sql",
    "chars": 4852,
    "preview": "-- =============================================================\n-- View: analytics.retention_login_daily\n-- Looker sour"
  },
  {
    "path": "autogpt_platform/analytics/queries/retention_login_onboarded_weekly.sql",
    "chars": 4761,
    "preview": "-- =============================================================\n-- View: analytics.retention_login_onboarded_weekly\n-- "
  },
  {
    "path": "autogpt_platform/analytics/queries/retention_login_weekly.sql",
    "chars": 5328,
    "preview": "-- =============================================================\n-- View: analytics.retention_login_weekly\n-- Looker sou"
  },
  {
    "path": "autogpt_platform/analytics/queries/user_block_spending.sql",
    "chars": 3882,
    "preview": "-- =============================================================\n-- View: analytics.user_block_spending\n-- Looker source"
  },
  {
    "path": "autogpt_platform/analytics/queries/user_onboarding.sql",
    "chars": 1842,
    "preview": "-- =============================================================\n-- View: analytics.user_onboarding\n-- Looker source ali"
  },
  {
    "path": "autogpt_platform/analytics/queries/user_onboarding_funnel.sql",
    "chars": 3759,
    "preview": "-- =============================================================\n-- View: analytics.user_onboarding_funnel\n-- Looker sou"
  },
  {
    "path": "autogpt_platform/analytics/queries/user_onboarding_integration.sql",
    "chars": 1404,
    "preview": "-- =============================================================\n-- View: analytics.user_onboarding_integration\n-- Looke"
  },
  {
    "path": "autogpt_platform/analytics/queries/users_activities.sql",
    "chars": 7199,
    "preview": "-- =============================================================\n-- View: analytics.users_activities\n-- Looker source al"
  },
  {
    "path": "autogpt_platform/autogpt_libs/README.md",
    "chars": 140,
    "preview": "# AutoGPT Libs\n\nThis is a new project to store shared functionality across different services in the AutoGPT Platform (e"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/api_key/keysmith.py",
    "chars": 2556,
    "preview": "import hashlib\nimport secrets\nfrom typing import NamedTuple\n\nfrom cryptography.hazmat.primitives.kdf.scrypt import Scryp"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/api_key/test_keysmith.py",
    "chars": 2366,
    "preview": "import hashlib\n\nfrom autogpt_libs.api_key.keysmith import APIKeySmith\n\n\ndef test_generate_api_key():\n    keysmith = APIK"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/__init__.py",
    "chars": 411,
    "preview": "from .config import verify_settings\nfrom .dependencies import (\n    get_optional_user_id,\n    get_user_id,\n    requires_"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/config.py",
    "chars": 2615,
    "preview": "import logging\nimport os\n\nfrom jwt.algorithms import get_default_algorithms, has_crypto\n\nlogger = logging.getLogger(__na"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/config_test.py",
    "chars": 10837,
    "preview": "\"\"\"\nComprehensive tests for auth configuration to ensure 100% line and branch coverage.\nThese tests verify critical secu"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/dependencies.py",
    "chars": 3859,
    "preview": "\"\"\"\nFastAPI dependency functions for JWT-based authentication and authorization.\n\nThese are the high-level dependency fu"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/dependencies_test.py",
    "chars": 19655,
    "preview": "\"\"\"\nComprehensive integration tests for authentication dependencies.\nTests the full authentication flow from HTTP reques"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/helpers.py",
    "chars": 2249,
    "preview": "from fastapi import FastAPI\n\nfrom .jwt_utils import bearer_jwt_auth\n\n\ndef add_auth_responses_to_openapi(app: FastAPI) ->"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/helpers_test.py",
    "chars": 14496,
    "preview": "\"\"\"\nComprehensive tests for auth helpers module to achieve 100% coverage.\nTests OpenAPI schema generation and authentica"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/jwt_utils.py",
    "chars": 2489,
    "preview": "import logging\nfrom typing import Any\n\nimport jwt\nfrom fastapi import HTTPException, Security\nfrom fastapi.security impo"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/jwt_utils_test.py",
    "chars": 10141,
    "preview": "\"\"\"\nComprehensive tests for JWT token parsing and validation.\nEnsures 100% line and branch coverage for JWT security fun"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/auth/models.py",
    "chars": 547,
    "preview": "from dataclasses import dataclass\n\nDEFAULT_USER_ID = \"3e53486c-cf57-477e-ba2a-cb02dc828e1a\"\nDEFAULT_EMAIL = \"default@exa"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/logging/__init__.py",
    "chars": 215,
    "preview": "from .config import configure_logging\nfrom .filters import BelowLevelFilter\nfrom .formatters import FancyConsoleFormatte"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/logging/config.py",
    "chars": 6777,
    "preview": "\"\"\"Logging module for Auto-GPT.\"\"\"\n\nimport logging\nimport os\nimport socket\nimport sys\nfrom logging.handlers import Rotat"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/logging/filters.py",
    "chars": 328,
    "preview": "import logging\n\n\nclass BelowLevelFilter(logging.Filter):\n    \"\"\"Filter for logging levels below a certain threshold.\"\"\"\n"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/logging/formatters.py",
    "chars": 2956,
    "preview": "import logging\n\nfrom colorama import Fore, Style\n\nfrom .utils import remove_color_codes\n\n\nclass FancyConsoleFormatter(lo"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/logging/handlers.py",
    "chars": 473,
    "preview": "from __future__ import annotations\n\nimport json\nimport logging\n\n\nclass JsonFileHandler(logging.FileHandler):\n    def for"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/logging/test_utils.py",
    "chars": 1366,
    "preview": "import pytest\n\nfrom .utils import remove_color_codes\n\n\n@pytest.mark.parametrize(\n    \"raw_text, clean_text\",\n    [\n     "
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/logging/utils.py",
    "chars": 118,
    "preview": "import re\n\n\ndef remove_color_codes(s: str) -> str:\n    return re.sub(r\"\\x1B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])\", \"\", s)\n"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/rate_limit/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/rate_limit/config.py",
    "chars": 904,
    "preview": "from typing import Optional\n\nfrom pydantic import Field\nfrom pydantic_settings import BaseSettings, SettingsConfigDict\n\n"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/rate_limit/limiter.py",
    "chars": 1536,
    "preview": "import time\nfrom typing import Tuple\n\nfrom redis import Redis\n\nfrom .config import RATE_LIMIT_SETTINGS\n\n\nclass RateLimit"
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/rate_limit/middleware.py",
    "chars": 1046,
    "preview": "from fastapi import HTTPException, Request\nfrom starlette.middleware.base import RequestResponseEndpoint\n\nfrom .limiter "
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/supabase_integration_credentials_store/types.py",
    "chars": 2348,
    "preview": "from typing import Annotated, Any, Literal, Optional, TypedDict\nfrom uuid import uuid4\n\nfrom pydantic import BaseModel, "
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/utils/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/autogpt_libs/autogpt_libs/utils/synchronize.py",
    "chars": 2102,
    "preview": "import asyncio\nfrom contextlib import asynccontextmanager\nfrom typing import TYPE_CHECKING, Any\n\nfrom expiringdict impor"
  },
  {
    "path": "autogpt_platform/autogpt_libs/pyproject.toml",
    "chars": 928,
    "preview": "[tool.poetry]\nname = \"autogpt-libs\"\nversion = \"0.2.0\"\ndescription = \"Shared libraries across AutoGPT Platform\"\nauthors ="
  },
  {
    "path": "autogpt_platform/backend/.dockerignore",
    "chars": 550,
    "preview": "# Development and testing files\n**/__pycache__\n**/*.pyc\n**/*.pyo\n**/*.pyd\n**/.Python\n**/env/\n**/venv/\n**/.venv/\n**/pip-l"
  },
  {
    "path": "autogpt_platform/backend/.gitignore",
    "chars": 345,
    "preview": ".env\ndatabase.db\ndatabase.db-journal\ndev.db\ndev.db-journal\nbuild/\nconfig.json\nsecrets/*\n!secrets/.gitkeep\n\n*.ignore.*\n*."
  },
  {
    "path": "autogpt_platform/backend/CLAUDE.md",
    "chars": 9779,
    "preview": "# CLAUDE.md - Backend\n\nThis file provides guidance to Claude Code when working with the backend.\n\n## Essential Commands\n"
  },
  {
    "path": "autogpt_platform/backend/Dockerfile",
    "chars": 6511,
    "preview": "# ============================ DEPENDENCY BUILDER ============================ #\n\nFROM debian:13-slim AS builder\n\n# Set "
  },
  {
    "path": "autogpt_platform/backend/README.advanced.md",
    "chars": 117,
    "preview": "[Advanced Setup (Dev Branch)](https://dev-docs.agpt.co/platform/advanced_setup/#autogpt_agent_server_advanced_set_up)"
  },
  {
    "path": "autogpt_platform/backend/README.md",
    "chars": 97,
    "preview": "[Getting Started (Released)](https://docs.agpt.co/platform/getting-started/#autogpt_agent_server)"
  },
  {
    "path": "autogpt_platform/backend/TESTING.md",
    "chars": 8411,
    "preview": "# Backend Testing Guide\n\nThis guide covers testing practices for the AutoGPT Platform backend, with a focus on snapshot "
  },
  {
    "path": "autogpt_platform/backend/agents/StoreAgent_rows.csv",
    "chars": 24862,
    "preview": "listing_id,storeListingVersionId,slug,agent_name,agent_video,agent_image,featured,sub_heading,description,categories,use"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_00fdd42c-a14c-4d19-a567-65374ea0e87f.json",
    "chars": 128239,
    "preview": "{\n  \"id\": \"6cf51c3a-25dd-4189-bd50-5ee05a5f7794\",\n  \"version\": 58,\n  \"is_active\": true,\n  \"name\": \"Personal Newsletter\","
  },
  {
    "path": "autogpt_platform/backend/agents/agent_31daf49d-31d3-476b-aa4c-099abc59b458.json",
    "chars": 20084,
    "preview": "{\n  \"id\": \"7b2e2095-782a-4f8d-adda-e62b661bccf5\",\n  \"version\": 29,\n  \"is_active\": false,\n  \"name\": \"Unspirational Poster"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_415b7352-0dc6-4214-9d87-0ad3751b711d.json",
    "chars": 179004,
    "preview": "{\n  \"id\": \"5231292e-9f27-4ac0-bda6-b67daf1fa765\",\n  \"version\": 145,\n  \"is_active\": true,\n  \"name\": \"Smart Meeting Prep\","
  },
  {
    "path": "autogpt_platform/backend/agents/agent_516d813b-d1bc-470f-add7-c63a4b2c2bad.json",
    "chars": 15099,
    "preview": "{\n  \"id\": \"622849a7-5848-4838-894d-01f8f07e3fad\",\n  \"version\": 18,\n  \"is_active\": true,\n  \"name\": \"AI Function\",\n  \"desc"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_55d40473-0f31-4ada-9e40-d3a7139fcbd4.json",
    "chars": 261707,
    "preview": "{\n  \"id\": \"9dfa5527-15f3-4769-b173-1dd9ecfe19da\",\n  \"version\": 246,\n  \"is_active\": false,\n  \"name\": \"Automated SEO Blog "
  },
  {
    "path": "autogpt_platform/backend/agents/agent_6e16e65a-ad34-4108-b4fd-4a23fced5ea2.json",
    "chars": 62628,
    "preview": "{\n  \"id\": \"f6138aaf-4f85-48d5-b905-db11a2ff82f3\",\n  \"version\": 173,\n  \"is_active\": true,\n  \"name\": \"Decision Maker Lead "
  },
  {
    "path": "autogpt_platform/backend/agents/agent_a03b0d8c-4751-43d6-a54e-c3b7856ba4e3.json",
    "chars": 66365,
    "preview": "{\n  \"id\": \"6a6f8fcd-857d-469c-a98b-e90950a7851b\",\n  \"version\": 57,\n  \"is_active\": true,\n  \"name\": \"AI Video Generator: C"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_a548e507-09a7-4b30-909c-f63fcda10fff.json",
    "chars": 58745,
    "preview": "{\n  \"id\": \"e25b5ce7-e807-4b5a-8708-cb94fa0e2ace\",\n  \"version\": 81,\n  \"is_active\": true,\n  \"name\": \"Lead Finder\",\n  \"desc"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_b6f6f0d3-49f4-4e3b-8155-ffe9141b32c0.json",
    "chars": 68355,
    "preview": "{\n  \"id\": \"f410b776-3603-4f84-8348-e5db9c551322\",\n  \"version\": 31,\n  \"is_active\": true,\n  \"name\": \"Domain Name Finder\",\n"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_b8ceb480-a7a2-4c90-8513-181a49f7071f.json",
    "chars": 175507,
    "preview": "{\n  \"id\": \"ef561358-b8a2-407f-935f-18b25975b00e\",\n  \"version\": 369,\n  \"is_active\": true,\n  \"name\": \"Automated Support Ag"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_c775f60d-b99f-418b-8fe0-53172258c3ce.json",
    "chars": 32209,
    "preview": "{\n  \"id\": \"1acef2da-b865-4503-b94e-bfd444eddd66\",\n  \"version\": 16,\n  \"is_active\": false,\n  \"name\": \"YouTube Transcriptio"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_d85882b8-633f-44ce-a315-c20a8c123d19.json",
    "chars": 13536,
    "preview": "{\n  \"id\": \"ed2091cf-5b27-45a9-b3ea-42396f95b256\",\n  \"version\": 12,\n  \"is_active\": true,\n  \"name\": \"Flux AI Image Generat"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_e437cc95-e671-489d-b915-76561fba8c7f.json",
    "chars": 38249,
    "preview": "{\n  \"id\": \"1f14dce1-9cbd-4c96-aeaf-630675ef3a6e\",\n  \"version\": 17,\n  \"is_active\": true,\n  \"name\": \"AI YouTube-to-Blog Co"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_e7bb29a1-23c7-4fee-aa3b-5426174b8c52.json",
    "chars": 39224,
    "preview": "{\n  \"id\": \"1d79c52b-0daa-4bc9-9de1-08d9986db033\",\n  \"version\": 51,\n  \"is_active\": true,\n  \"name\": \"YouTube to LinkedIn P"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_eafa21d3-bf14-4f63-a97f-a5ee41df83b3.json",
    "chars": 53122,
    "preview": "{\n  \"id\": \"9afd017f-565f-4090-b5df-d01bc4094292\",\n  \"version\": 16,\n  \"is_active\": false,\n  \"name\": \"LinkedIn Post Genera"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_f2cc74bb-f43f-4395-9c35-ecb30b5b4fc9.json",
    "chars": 17901,
    "preview": "{\n  \"id\": \"0d440799-44ba-4d6c-85b3-b3739f1e1287\",\n  \"version\": 12,\n  \"is_active\": true,\n  \"name\": \"AI Webpage Copy Impro"
  },
  {
    "path": "autogpt_platform/backend/agents/agent_fc2c9976-0962-4625-a27b-d316573a9e7f.json",
    "chars": 20033,
    "preview": "{\n  \"id\": \"4c6b68cb-bb75-4044-b1cb-2cee3fd39b26\",\n  \"version\": 29,\n  \"is_active\": true,\n  \"name\": \"Email Address Finder\""
  },
  {
    "path": "autogpt_platform/backend/backend/TEST_DATA_README.md",
    "chars": 4771,
    "preview": "# Test Data Scripts\n\nThis directory contains scripts for creating and updating test data in the AutoGPT Platform databas"
  },
  {
    "path": "autogpt_platform/backend/backend/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/backend/backend/api/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/backend/backend/api/conftest.py",
    "chars": 1321,
    "preview": "\"\"\"Common test fixtures for server tests.\n\nNote: Common fixtures like test_user_id, admin_user_id, target_user_id,\nsetup"
  },
  {
    "path": "autogpt_platform/backend/backend/api/conn_manager.py",
    "chars": 5222,
    "preview": "import asyncio\nfrom typing import Dict, Set\n\nfrom fastapi import WebSocket\n\nfrom backend.api.model import NotificationPa"
  },
  {
    "path": "autogpt_platform/backend/backend/api/conn_manager_test.py",
    "chars": 7399,
    "preview": "from datetime import datetime, timezone\nfrom unittest.mock import AsyncMock\n\nimport pytest\nfrom fastapi import WebSocket"
  },
  {
    "path": "autogpt_platform/backend/backend/api/external/fastapi_app.py",
    "chars": 653,
    "preview": "from fastapi import FastAPI\n\nfrom backend.api.middleware.security import SecurityHeadersMiddleware\nfrom backend.monitori"
  },
  {
    "path": "autogpt_platform/backend/backend/api/external/middleware.py",
    "chars": 3733,
    "preview": "from fastapi import HTTPException, Security, status\nfrom fastapi.security import APIKeyHeader, HTTPAuthorizationCredenti"
  },
  {
    "path": "autogpt_platform/backend/backend/api/external/v1/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/backend/backend/api/external/v1/integrations.py",
    "chars": 21946,
    "preview": "\"\"\"\nExternal API endpoints for integrations and credentials.\n\nThis module provides endpoints for external applications ("
  },
  {
    "path": "autogpt_platform/backend/backend/api/external/v1/routes.py",
    "chars": 11319,
    "preview": "import logging\nimport urllib.parse\nfrom collections import defaultdict\nfrom typing import Annotated, Any, Optional, Sequ"
  },
  {
    "path": "autogpt_platform/backend/backend/api/external/v1/tools.py",
    "chars": 5161,
    "preview": "\"\"\"External API routes for chat tools - stateless HTTP endpoints.\n\nNote: These endpoints use ephemeral sessions that are"
  },
  {
    "path": "autogpt_platform/backend/backend/api/features/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/backend/backend/api/features/admin/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "autogpt_platform/backend/backend/api/features/admin/credit_admin_routes.py",
    "chars": 2220,
    "preview": "import logging\nimport typing\n\nfrom autogpt_libs.auth import get_user_id, requires_admin_user\nfrom fastapi import APIRout"
  }
]

// ... and 3956 more files (download for full content)

About this extraction

This page contains the full source code of the Significant-Gravitas/AutoGPT GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4156 files (63.2 MB), approximately 16.9M tokens, and a symbol index with 31360 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!