@agent-native/core 0.92.11 → 0.93.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +45 -0
- package/corpus/core/docs/content/automation-connectors.mdx +80 -0
- package/corpus/core/docs/content/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ar-SA/messaging.mdx +84 -15
- package/corpus/core/docs/content/locales/ar-SA/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/de-DE/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/de-DE/messaging.mdx +92 -15
- package/corpus/core/docs/content/locales/de-DE/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/es-ES/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/es-ES/messaging.mdx +91 -15
- package/corpus/core/docs/content/locales/es-ES/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +10 -0
- package/corpus/core/docs/content/locales/fr-FR/messaging.mdx +91 -15
- package/corpus/core/docs/content/locales/fr-FR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/hi-IN/messaging.mdx +81 -15
- package/corpus/core/docs/content/locales/hi-IN/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +9 -0
- package/corpus/core/docs/content/locales/ja-JP/messaging.mdx +81 -15
- package/corpus/core/docs/content/locales/ja-JP/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +8 -0
- package/corpus/core/docs/content/locales/ko-KR/messaging.mdx +80 -15
- package/corpus/core/docs/content/locales/ko-KR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +9 -0
- package/corpus/core/docs/content/locales/pt-BR/messaging.mdx +88 -15
- package/corpus/core/docs/content/locales/pt-BR/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-CN/messaging.mdx +78 -15
- package/corpus/core/docs/content/locales/zh-CN/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-TW/messaging.mdx +78 -15
- package/corpus/core/docs/content/locales/zh-TW/template-clips.mdx +1 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +1 -0
- package/corpus/core/docs/content/messaging.mdx +227 -45
- package/corpus/core/docs/content/template-clips.mdx +3 -0
- package/corpus/core/docs/content/template-design.mdx +4 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/a2a/artifact-response.ts +131 -2
- package/corpus/core/src/a2a/client.ts +10 -0
- package/corpus/core/src/a2a/handlers.ts +40 -76
- package/corpus/core/src/a2a/types.ts +2 -0
- package/corpus/core/src/agent/durable-background.ts +24 -0
- package/corpus/core/src/agent/production-agent.ts +48 -5
- package/corpus/core/src/agent/run-manager.ts +171 -20
- package/corpus/core/src/agent/run-store.ts +297 -42
- package/corpus/core/src/agent/types.ts +23 -0
- package/corpus/core/src/audit/record.ts +31 -0
- package/corpus/core/src/audit/store.ts +69 -3
- package/corpus/core/src/audit/types.ts +13 -0
- package/corpus/core/src/automation/index.ts +802 -0
- package/corpus/core/src/cli/create.ts +12 -5
- package/corpus/core/src/cli/design-connect.ts +596 -36
- package/corpus/core/src/client/AgentPanel.tsx +51 -6
- package/corpus/core/src/client/AssistantChat.tsx +274 -147
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
- package/corpus/core/src/client/RunStuckBanner.tsx +69 -20
- package/corpus/core/src/client/agent-chat-adapter.ts +110 -17
- package/corpus/core/src/client/automation.ts +22 -0
- package/corpus/core/src/client/chat/run-recovery.tsx +67 -50
- package/corpus/core/src/client/composer/TiptapComposer.tsx +8 -0
- package/corpus/core/src/client/index.ts +30 -0
- package/corpus/core/src/client/integrations/api.ts +295 -0
- package/corpus/core/src/client/integrations/index.ts +26 -0
- package/corpus/core/src/client/transcription/use-live-transcription.ts +68 -5
- package/corpus/core/src/client/use-run-stuck-detection.ts +41 -3
- package/corpus/core/src/deploy/build.ts +59 -3
- package/corpus/core/src/deploy/workspace-deploy.ts +37 -2
- package/corpus/core/src/file-upload/types.ts +2 -0
- package/corpus/core/src/index.ts +37 -0
- package/corpus/core/src/integrations/a2a-continuations-store.ts +6 -4
- package/corpus/core/src/integrations/adapters/discord.ts +362 -0
- package/corpus/core/src/integrations/adapters/index.ts +29 -0
- package/corpus/core/src/integrations/adapters/microsoft-teams.ts +411 -0
- package/corpus/core/src/integrations/adapters/slack.ts +861 -27
- package/corpus/core/src/integrations/adapters/telegram.ts +54 -15
- package/corpus/core/src/integrations/adapters/whatsapp.ts +41 -17
- package/corpus/core/src/integrations/catalog.ts +571 -0
- package/corpus/core/src/integrations/controls-store.ts +187 -0
- package/corpus/core/src/integrations/index.ts +100 -0
- package/corpus/core/src/integrations/installations-store.ts +677 -0
- package/corpus/core/src/integrations/integration-memory.ts +187 -0
- package/corpus/core/src/integrations/pending-tasks-retry-job.ts +6 -6
- package/corpus/core/src/integrations/pending-tasks-store.ts +83 -5
- package/corpus/core/src/integrations/plugin.ts +685 -47
- package/corpus/core/src/integrations/scope-store.ts +498 -0
- package/corpus/core/src/integrations/slack-manifest.ts +78 -0
- package/corpus/core/src/integrations/slack-oauth.ts +343 -0
- package/corpus/core/src/integrations/types.ts +179 -0
- package/corpus/core/src/integrations/usage-budget-store.ts +906 -0
- package/corpus/core/src/integrations/webhook-handler.ts +562 -51
- package/corpus/core/src/jobs/scheduler.ts +100 -2
- package/corpus/core/src/jobs/tools.ts +45 -9
- package/corpus/core/src/provider-api/index.ts +72 -1
- package/corpus/core/src/resources/handlers.ts +88 -14
- package/corpus/core/src/resources/script-helpers.ts +36 -7
- package/corpus/core/src/resources/store.ts +59 -52
- package/corpus/core/src/scripts/call-agent.ts +107 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +294 -119
- package/corpus/core/src/server/auth.ts +10 -14
- package/corpus/core/src/server/builder-design-systems.ts +16 -1
- package/corpus/core/src/server/edge.ts +18 -0
- package/corpus/core/src/server/index.ts +26 -0
- package/corpus/core/src/server/request-context.ts +18 -0
- package/corpus/core/src/server/social-og-image.ts +3 -2
- package/corpus/core/src/styles/agent-native.css +62 -44
- package/corpus/core/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/core/src/templates/default/AGENTS.md +7 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/core/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +3 -2
- package/corpus/core/src/usage/store.ts +37 -2
- package/corpus/templates/analytics/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +23 -0
- package/corpus/templates/analytics/.builder/skills/provider-api/SKILL.md +15 -0
- package/corpus/templates/analytics/actions/save-monitor.ts +25 -2
- package/corpus/templates/analytics/app/lib/data-sources.ts +28 -0
- package/corpus/templates/analytics/changelog/2026-07-10-agent-created-uptime-monitors-now-return-a-direct-link-to-th.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-10-dashboard-email-reports-still-arrive-when-screenshot-capture-temporarily-fails.md +6 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +3 -7
- package/corpus/templates/analytics/server/lib/credential-keys.ts +12 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +5 -1
- package/corpus/templates/analytics/server/lib/provider-credentials.ts +2 -0
- package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +16 -0
- package/corpus/templates/assets/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/brain/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/calendar/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +98 -108
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +97 -90
- package/corpus/templates/calendar/changelog/2026-07-10-event-guest-details-and-option-menus-now-use-valid-accessibl.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-10-natural-language-event-phrases-stay-available-as-quick-creat.md +6 -0
- package/corpus/templates/chat/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
- package/corpus/templates/clips/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +17 -1
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +8 -0
- package/corpus/templates/clips/AGENTS.md +8 -3
- package/corpus/templates/clips/actions/finalize-recording.ts +63 -23
- package/corpus/templates/clips/actions/get-recording-player-data.ts +6 -2
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +72 -9
- package/corpus/templates/clips/actions/list-recordings.ts +19 -3
- package/corpus/templates/clips/actions/navigate.ts +2 -0
- package/corpus/templates/clips/actions/reprocess-recording.ts +20 -6
- package/corpus/templates/clips/actions/request-transcript.ts +16 -31
- package/corpus/templates/clips/actions/view-screen.ts +57 -5
- package/corpus/templates/clips/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -0
- package/corpus/templates/clips/app/components/library/library-grid.tsx +69 -42
- package/corpus/templates/clips/app/components/library/library-layout.tsx +15 -1
- package/corpus/templates/clips/app/components/library/recording-card.tsx +81 -68
- package/corpus/templates/clips/app/components/library/search-bar.tsx +4 -3
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +9 -3
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +27 -5
- package/corpus/templates/clips/app/hooks/use-library.ts +1 -1
- package/corpus/templates/clips/app/hooks/use-navigation-state.ts +10 -2
- package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +1 -0
- package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +7 -1
- package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +8 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +8 -1
- package/corpus/templates/clips/app/lib/recording-visibility.ts +70 -0
- package/corpus/templates/clips/app/routes/_app.shared.tsx +20 -0
- package/corpus/templates/clips/app/routes/download.tsx +24 -8
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +115 -2
- package/corpus/templates/clips/app/routes/record.tsx +62 -0
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +25 -16
- package/corpus/templates/clips/changelog/2026-07-10-clips-desktop-is-now-available-for-linux-with-appimage-debia.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-downloads-updates-sooner-in-the-background-and-offers-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-shared-with-you-now-appear-in-a-searchable-shared-with.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-clips-with-missing-mobile-video-frames-can-be-repaired-witho.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-fixed-copying-agent-responses-and-transcript-text-from-recor.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-mobile-camera-recordings-pause-while-backgrounded.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-mp4-downloads-now-show-progress-immediately-after-the-option.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-recording-pages-now-open-as-soon-as-you-stop-with-a-share-li.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-recordings-now-seek-smoothly-downloads-use-the-correct-file-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-10-s3-compatible-storage-now-saves-hosted-recordings-without-re.md +6 -0
- package/corpus/templates/clips/desktop/README.md +22 -6
- package/corpus/templates/clips/desktop/package.json +1 -1
- package/corpus/templates/clips/desktop/src/app.tsx +32 -19
- package/corpus/templates/clips/desktop/src/components/ReadinessPanel.tsx +15 -9
- package/corpus/templates/clips/desktop/src/lib/finalization-guard.ts +22 -0
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +3 -1
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +97 -120
- package/corpus/templates/clips/desktop/src/lib/updater.ts +26 -4
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +4 -8
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +1 -1
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +2 -2
- package/corpus/templates/clips/desktop/src-tauri/src/permission_status.rs +11 -7
- package/corpus/templates/clips/desktop/src-tauri/tauri.linux.conf.json +11 -0
- package/corpus/templates/clips/netlify.toml +3 -0
- package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +106 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +9 -1
- package/corpus/templates/clips/server/lib/resumable-upload-provider.ts +52 -0
- package/corpus/templates/clips/server/lib/s3-upload-provider.ts +433 -85
- package/corpus/templates/clips/server/lib/video-remux.ts +114 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +109 -0
- package/corpus/templates/clips/server/routes/api/clips-updater.json.get.ts +22 -11
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +4 -2
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +47 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +10 -2
- package/corpus/templates/clips/shared/share-loader-response.ts +12 -0
- package/corpus/templates/clips/shared/transcript-status.ts +40 -0
- package/corpus/templates/content/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/content/.agents/skills/content/SKILL.md +57 -5
- package/corpus/templates/content/AGENTS.md +65 -55
- package/corpus/templates/content/actions/_builder-cms-read-client.ts +92 -23
- package/corpus/templates/content/actions/_database-source-utils.ts +207 -41
- package/corpus/templates/content/actions/_property-utils.ts +30 -2
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +316 -121
- package/corpus/templates/content/actions/attach-content-database-source.ts +41 -17
- package/corpus/templates/content/actions/change-content-database-source-role.ts +46 -8
- package/corpus/templates/content/actions/submit-content-database-form.ts +497 -0
- package/corpus/templates/content/actions/suggest-source-join-key.ts +8 -1
- package/corpus/templates/content/actions/update-content-database-view.ts +8 -1
- package/corpus/templates/content/actions/view-screen.ts +4 -1
- package/corpus/templates/content/agent-native.app-skill.json +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +250 -64
- package/corpus/templates/content/app/components/editor/database/FormView.tsx +460 -0
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +3 -0
- package/corpus/templates/content/app/components/editor/database/settings.tsx +30 -37
- package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
- package/corpus/templates/content/app/components/editor/database/view-config.ts +29 -1
- package/corpus/templates/content/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +22 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +21 -0
- package/corpus/templates/content/app/i18n-data.ts +225 -0
- package/corpus/templates/content/changelog/2026-07-09-builder-source-refreshes-now-keep-mapped-fields-such-as-topi.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-builder-backed-properties-now-load-current-source-values-as-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-builder-database-refreshes-now-stay-explicit-and-accurate.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-database-form-views-now-collect-ordered-required-answers-and.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-database-tables-now-use-a-quieter-more-compact-layout-with-c.md +6 -0
- package/corpus/templates/content/changelog/2026-07-10-slack-intake-routes-to-content-database-forms.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -0
- package/corpus/templates/content/parity/matrix.ts +18 -0
- package/corpus/templates/content/shared/api.ts +28 -1
- package/corpus/templates/content/shared/database-form.ts +53 -0
- package/corpus/templates/design/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +26 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +85 -12
- package/corpus/templates/design/AGENTS.md +72 -18
- package/corpus/templates/design/DESIGN.md +1 -1
- package/corpus/templates/design/DEVELOPING.md +1 -1
- package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +116 -0
- package/corpus/templates/design/actions/create-design-from-template.ts +220 -0
- package/corpus/templates/design/actions/create-design-system.ts +92 -16
- package/corpus/templates/design/actions/delete-design-template.ts +28 -0
- package/corpus/templates/design/actions/delete-file.ts +7 -0
- package/corpus/templates/design/actions/edit-design.ts +3 -0
- package/corpus/templates/design/actions/export-design-as-figma-svg.ts +137 -5
- package/corpus/templates/design/actions/export-pdf.ts +1 -1
- package/corpus/templates/design/actions/generate-design.ts +3 -0
- package/corpus/templates/design/actions/get-design-snapshot.ts +9 -0
- package/corpus/templates/design/actions/get-figma-connection-status.ts +26 -0
- package/corpus/templates/design/actions/get-figma-design-context.ts +138 -0
- package/corpus/templates/design/actions/get-figma-styles.ts +2 -2
- package/corpus/templates/design/actions/import-figma-clipboard.ts +112 -16
- package/corpus/templates/design/actions/import-figma-frame.ts +15 -4
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +4 -0
- package/corpus/templates/design/actions/list-design-templates.ts +118 -0
- package/corpus/templates/design/actions/navigate.ts +16 -2
- package/corpus/templates/design/actions/provider-api-request.ts +11 -1
- package/corpus/templates/design/actions/save-design-as-template.ts +156 -0
- package/corpus/templates/design/actions/set-active-breakpoint.ts +13 -4
- package/corpus/templates/design/actions/take-design-screenshot.ts +73 -3
- package/corpus/templates/design/actions/update-file.ts +39 -22
- package/corpus/templates/design/actions/view-screen.ts +36 -1
- package/corpus/templates/design/actions/write-local-file.ts +50 -38
- package/corpus/templates/design/app/components/design/AutoLayoutSuggestionDialog.tsx +151 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +20 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +251 -22
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +3 -3
- package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +384 -9
- package/corpus/templates/design/app/components/design/EditPanel.tsx +105 -32
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +58 -28
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -0
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +539 -53
- package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +40 -0
- package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +1 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +1 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +5 -1
- package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +2 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +3 -1
- package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +2 -0
- package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +19 -0
- package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +1 -0
- package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +27 -0
- package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +137 -81
- package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +25 -5
- package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +1 -1
- package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +220 -3
- package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +13 -0
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +22 -1
- package/corpus/templates/design/app/components/design/types.ts +4 -0
- package/corpus/templates/design/app/components/design-system/ProductionDesignSystemShowcase.tsx +208 -0
- package/corpus/templates/design/app/components/editor/FigmaLinkComposerBubble.tsx +321 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +24 -4
- package/corpus/templates/design/app/components/layout/Layout.tsx +16 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -0
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +72 -0
- package/corpus/templates/design/app/global.css +2 -35
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +10 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +127 -5
- package/corpus/templates/design/app/i18n-breakpoints.ts +209 -0
- package/corpus/templates/design/app/i18n-data.ts +1317 -59
- package/corpus/templates/design/app/i18n-template-feature.ts +458 -0
- package/corpus/templates/design/app/lib/design-clipboard.ts +202 -0
- package/corpus/templates/design/app/lib/design-file-upload.ts +87 -0
- package/corpus/templates/design/app/lib/design-import.ts +168 -11
- package/corpus/templates/design/app/lib/desktop-design-preview.ts +423 -0
- package/corpus/templates/design/app/lib/figma-clipboard.ts +74 -8
- package/corpus/templates/design/app/lib/figma-connection.ts +161 -0
- package/corpus/templates/design/app/lib/figma-svg-copy.ts +814 -22
- package/corpus/templates/design/app/lib/figma-url.ts +77 -0
- package/corpus/templates/design/app/lib/pending-generation.ts +35 -0
- package/corpus/templates/design/app/pages/DesignSystems.tsx +236 -177
- package/corpus/templates/design/app/pages/Index.tsx +38 -0
- package/corpus/templates/design/app/pages/Templates.tsx +498 -0
- package/corpus/templates/design/app/pages/design-editor/auto-layout-suggestion.ts +328 -0
- package/corpus/templates/design/app/pages/design-editor/clone-idrefs.ts +113 -0
- package/corpus/templates/design/app/pages/design-editor/created-screen-navigation.ts +55 -0
- package/corpus/templates/design/app/pages/design-editor/editor-session.ts +32 -0
- package/corpus/templates/design/app/pages/design-editor/editor-state.ts +49 -2
- package/corpus/templates/design/app/pages/design-editor/export-capture.ts +296 -0
- package/corpus/templates/design/app/pages/design-editor/history.ts +101 -2
- package/corpus/templates/design/app/pages/design-editor/layout-operations.ts +28 -1
- package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +34 -0
- package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +202 -6
- package/corpus/templates/design/app/pages/design-editor/pending-structure-verification.ts +92 -0
- package/corpus/templates/design/app/pages/design-editor/save-failure.ts +58 -0
- package/corpus/templates/design/app/routes/templates.tsx +4 -6
- package/corpus/templates/design/changelog/2026-07-10-app-workspaces-now-use-clean-borderless-main-surfaces-throug.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-ask-chat-what-s-in-a-figma-file-or-frame-structure-screensho.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-canvas-edits-now-reject-malformed-html-before-it-can-corrupt.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-complex-designs-now-export-as-valid-secure-svgs-and-crisp-ra.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-complex-figma-masks-arcs-rich-text-transformed-images-and-ad.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copied-layers-paste-across-designs-and-browser-tabs.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copy-and-download-editable-figma-svg.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-copying-design-text-now-pastes-readable-text-into-other-apps.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-deleted-screens-can-be-restored-with-undo-and-removed-again-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-design-changes-now-save-before-switching-apps-and-retry-when.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-design-stays-usable-on-phones-by-keeping-editor-panels-and-f.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-download-all-screens-as-one-multi-page-pdf-from-the-overview.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-duplicated-layers-now-keep-labels-aria-relationships-fragmen.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fig-import-results-stay-compact.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-figma-imports-now-load-real-fonts-fix-rotated-gradient-dashe.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-figma-links-in-chat-and-the-import-tab-now-offer-secure-one-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-cmd-z-not-restoring-content-after-an-agent-driven-desi.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-download-pdf-being-unreachable-from-the-export-panel-e.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-dragging-a-layer-out-of-an-auto-layout-row-column-no-l.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-figma-svg-export-text-wrapping-sizing-and-inner-layer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-hiding-or-locking-one-layer-no-longer-hides-or-blocks-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-png-screenshots-of-tall-screens-being-cropped-to-one-v.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-fixed-png-svg-exports-capturing-broken-layout-when-webfonts-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-frame-tool-now-offers-standard-ad-unit-size-presets-medium-r.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-full-view-controls-stay-within-their-frame-instead-of-coveri.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-hover-focus-focus-visible-pressed-and-disabled-states-now-pr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-layer-drops-now-land-in-the-intended-grid-row-stay-visually-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-local-code-workspaces-now-keep-unsaved-edits-across-panel-sw.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-local-visual-editing-now-keeps-authenticated-sessions-shared.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-long-running-agent-work-no-longer-shows-a-premature-stuck-wa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-managed-figma-connections-are-recognized-automatically.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-designs-can-open-directly-in-the-editor-without-a-pr.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-screens-are-selected-and-revealed-immediately.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-new-text-layers-undo-as-one-safe-creation.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-preview-and-apply-inferred-auto-layout-without-changing-yo.md +5 -0
- package/corpus/templates/design/changelog/2026-07-10-print-pdf-exports-and-paper-size-presets-letter-a4-now-match.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-responsive-frame-editing.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-reusable-design-templates.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-screen-overview-frames-now-use-a-clearer-interact-action-wit.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-start-designs-from-source-linked-material-3-carbon-or-primer.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-tweaks-guidance.md +6 -0
- package/corpus/templates/design/changelog/2026-07-10-uploaded-fig-files-can-now-become-editable-design-screens-wi.md +6 -0
- package/corpus/templates/design/e2e/helpers.ts +3 -3
- package/corpus/templates/design/package.json +2 -0
- package/corpus/templates/design/scripts/qa-figma-stress-import.ts +96 -0
- package/corpus/templates/design/server/db/index.ts +10 -0
- package/corpus/templates/design/server/db/schema.ts +44 -0
- package/corpus/templates/design/server/handlers/import-design-file.ts +114 -80
- package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +19 -6
- package/corpus/templates/design/server/lib/design-export.ts +240 -3
- package/corpus/templates/design/server/lib/design-template-data.ts +89 -0
- package/corpus/templates/design/server/lib/design-to-figma-svg.ts +250 -26
- package/corpus/templates/design/server/lib/fig-file-decoder.ts +839 -0
- package/corpus/templates/design/server/lib/fig-file-import.ts +287 -0
- package/corpus/templates/design/server/lib/fig-file-limits.ts +3 -0
- package/corpus/templates/design/server/lib/fig-file-to-html.ts +2568 -0
- package/corpus/templates/design/server/lib/figma-design-context.ts +359 -0
- package/corpus/templates/design/server/lib/figma-node-import.ts +478 -22
- package/corpus/templates/design/server/lib/figma-node-to-html.ts +554 -29
- package/corpus/templates/design/server/lib/local-figma-qa-upload.ts +112 -0
- package/corpus/templates/design/server/lib/verify-write-grant.ts +16 -2
- package/corpus/templates/design/server/lib/visible-clipboard-html.ts +13 -3
- package/corpus/templates/design/server/plugins/agent-chat.ts +7 -0
- package/corpus/templates/design/server/plugins/db.ts +42 -0
- package/corpus/templates/design/server/plugins/local-figma-qa-upload.ts +7 -0
- package/corpus/templates/design/server/register-secrets.ts +8 -8
- package/corpus/templates/design/server/routes/api/qa-figma-import-assets/[assetId].get.ts +46 -0
- package/corpus/templates/design/server/source-workspace.ts +104 -12
- package/corpus/templates/design/shared/code-layer.ts +105 -28
- package/corpus/templates/design/shared/design-system-templates.ts +301 -0
- package/corpus/templates/design/shared/design-template-presets.ts +195 -0
- package/corpus/templates/design/shared/figma-url.ts +8 -0
- package/corpus/templates/design/shared/html-integrity.ts +306 -0
- package/corpus/templates/design/shared/interaction-states.ts +318 -23
- package/corpus/templates/design/shared/locked-layers.ts +151 -0
- package/corpus/templates/dispatch/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/dispatch/app/i18n/zh-TW.ts +48 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +536 -1
- package/corpus/templates/dispatch/changelog/2026-07-10-connect-slack-workspaces-with-oauth-and-manage-channel-ident.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-10-microsoft-teams-bots-and-discord-slash-commands-can-now-conn.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-10-slack-and-telegram-now-route-uptime-monitor-requests-to-anal.md +6 -0
- package/corpus/templates/forms/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/forms/.agents/skills/form-publishing/SKILL.md +7 -0
- package/corpus/templates/forms/AGENTS.md +4 -0
- package/corpus/templates/forms/actions/create-form.ts +44 -7
- package/corpus/templates/forms/actions/lib/assert-publishable-form.ts +38 -0
- package/corpus/templates/forms/actions/patch-form-fields.ts +4 -0
- package/corpus/templates/forms/actions/update-form.ts +2 -36
- package/corpus/templates/forms/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +17 -0
- package/corpus/templates/forms/changelog/2026-07-10-agent-created-published-forms-now-return-the-anonymous-publi.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-10-published-forms-can-no-longer-be-edited-into-an-unusable-emp.md +6 -0
- package/corpus/templates/forms/server/handlers/submissions.ts +4 -3
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/forms/shared/types.ts +5 -0
- package/corpus/templates/mail/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/mail/changelog/2026-07-10-mail-navigation-now-uses-a-clean-borderless-drawer.md +6 -0
- package/corpus/templates/plan/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +4 -1
- package/corpus/templates/plan/changelog/2026-07-10-local-plans-now-keep-valid-content-visible-when-one-generate.md +6 -0
- package/corpus/templates/plan/server/lib/local-plan-files.ts +4 -1
- package/corpus/templates/slides/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/a2a/artifact-response.d.ts.map +1 -1
- package/dist/a2a/artifact-response.js +88 -2
- package/dist/a2a/artifact-response.js.map +1 -1
- package/dist/a2a/client.d.ts +9 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +1 -0
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +24 -69
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/types.d.ts +2 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/durable-background.d.ts +11 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +17 -0
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/production-agent.d.ts +5 -3
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +34 -8
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +44 -2
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +124 -18
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +109 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +274 -37
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/types.d.ts +22 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/audit/record.d.ts.map +1 -1
- package/dist/audit/record.js +29 -0
- package/dist/audit/record.js.map +1 -1
- package/dist/audit/store.d.ts.map +1 -1
- package/dist/audit/store.js +62 -3
- package/dist/audit/store.js.map +1 -1
- package/dist/audit/types.d.ts +13 -0
- package/dist/audit/types.d.ts.map +1 -1
- package/dist/audit/types.js.map +1 -1
- package/dist/automation/index.d.ts +193 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +464 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +10 -3
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +492 -35
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +7 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +32 -8
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +15 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +115 -47
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +14 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +35 -7
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +4 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +97 -16
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/automation.d.ts +14 -0
- package/dist/client/automation.d.ts.map +1 -0
- package/dist/client/automation.js +9 -0
- package/dist/client/automation.js.map +1 -0
- package/dist/client/chat/run-recovery.d.ts +4 -0
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +12 -10
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +8 -0
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/integrations/api.d.ts +115 -0
- package/dist/client/integrations/api.d.ts.map +1 -0
- package/dist/client/integrations/api.js +123 -0
- package/dist/client/integrations/api.js.map +1 -0
- package/dist/client/integrations/index.d.ts +1 -0
- package/dist/client/integrations/index.d.ts.map +1 -1
- package/dist/client/integrations/index.js +1 -0
- package/dist/client/integrations/index.js.map +1 -1
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
- package/dist/client/transcription/use-live-transcription.js +59 -5
- package/dist/client/transcription/use-live-transcription.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts +16 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +23 -4
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +49 -4
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +31 -2
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/file-upload/types.d.ts +2 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
- package/dist/integrations/a2a-continuations-store.js +6 -4
- package/dist/integrations/a2a-continuations-store.js.map +1 -1
- package/dist/integrations/adapters/discord.d.ts +3 -0
- package/dist/integrations/adapters/discord.d.ts.map +1 -0
- package/dist/integrations/adapters/discord.js +261 -0
- package/dist/integrations/adapters/discord.js.map +1 -0
- package/dist/integrations/adapters/index.d.ts +4 -0
- package/dist/integrations/adapters/index.d.ts.map +1 -0
- package/dist/integrations/adapters/index.js +26 -0
- package/dist/integrations/adapters/index.js.map +1 -0
- package/dist/integrations/adapters/microsoft-teams.d.ts +5 -0
- package/dist/integrations/adapters/microsoft-teams.d.ts.map +1 -0
- package/dist/integrations/adapters/microsoft-teams.js +295 -0
- package/dist/integrations/adapters/microsoft-teams.js.map +1 -0
- package/dist/integrations/adapters/slack.d.ts +8 -2
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +736 -27
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts +0 -2
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +49 -15
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/adapters/whatsapp.d.ts +0 -2
- package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
- package/dist/integrations/adapters/whatsapp.js +40 -17
- package/dist/integrations/adapters/whatsapp.js.map +1 -1
- package/dist/integrations/catalog.d.ts +75 -0
- package/dist/integrations/catalog.d.ts.map +1 -0
- package/dist/integrations/catalog.js +451 -0
- package/dist/integrations/catalog.js.map +1 -0
- package/dist/integrations/controls-store.d.ts +44 -0
- package/dist/integrations/controls-store.d.ts.map +1 -0
- package/dist/integrations/controls-store.js +129 -0
- package/dist/integrations/controls-store.js.map +1 -0
- package/dist/integrations/index.d.ts +13 -1
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +9 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/installations-store.d.ts +112 -0
- package/dist/integrations/installations-store.d.ts.map +1 -0
- package/dist/integrations/installations-store.js +493 -0
- package/dist/integrations/installations-store.js.map +1 -0
- package/dist/integrations/integration-memory.d.ts +24 -0
- package/dist/integrations/integration-memory.d.ts.map +1 -0
- package/dist/integrations/integration-memory.js +136 -0
- package/dist/integrations/integration-memory.js.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.js +6 -5
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +17 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-store.js +71 -5
- package/dist/integrations/pending-tasks-store.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +520 -35
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/scope-store.d.ts +65 -0
- package/dist/integrations/scope-store.d.ts.map +1 -0
- package/dist/integrations/scope-store.js +361 -0
- package/dist/integrations/scope-store.js.map +1 -0
- package/dist/integrations/slack-manifest.d.ts +66 -0
- package/dist/integrations/slack-manifest.d.ts.map +1 -0
- package/dist/integrations/slack-manifest.js +70 -0
- package/dist/integrations/slack-manifest.js.map +1 -0
- package/dist/integrations/slack-oauth.d.ts +99 -0
- package/dist/integrations/slack-oauth.d.ts.map +1 -0
- package/dist/integrations/slack-oauth.js +226 -0
- package/dist/integrations/slack-oauth.js.map +1 -0
- package/dist/integrations/types.d.ts +144 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/types.js +16 -1
- package/dist/integrations/types.js.map +1 -1
- package/dist/integrations/usage-budget-store.d.ts +84 -0
- package/dist/integrations/usage-budget-store.d.ts.map +1 -0
- package/dist/integrations/usage-budget-store.js +650 -0
- package/dist/integrations/usage-budget-store.js.map +1 -0
- package/dist/integrations/webhook-handler.d.ts +4 -0
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +415 -47
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +6 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +83 -4
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +43 -11
- package/dist/jobs/tools.js.map +1 -1
- package/dist/provider-api/index.d.ts +4 -4
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +72 -1
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +57 -15
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +34 -8
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts +10 -0
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +54 -47
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +106 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +15 -4
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +248 -113
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +10 -14
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +3 -1
- package/dist/server/builder-design-systems.d.ts.map +1 -1
- package/dist/server/builder-design-systems.js +9 -2
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/edge.d.ts +1 -1
- package/dist/server/edge.d.ts.map +1 -1
- package/dist/server/edge.js +1 -1
- package/dist/server/edge.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/request-context.d.ts +18 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/social-og-image.d.ts.map +1 -1
- package/dist/server/social-og-image.js +3 -2
- package/dist/server/social-og-image.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +62 -44
- package/dist/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/templates/default/AGENTS.md +7 -3
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/dist/templates/workspace-core/AGENTS.md +3 -2
- package/dist/usage/store.d.ts +7 -0
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +24 -3
- package/dist/usage/store.js.map +1 -1
- package/docs/content/automation-connectors.mdx +80 -0
- package/docs/content/extensions.mdx +8 -0
- package/docs/content/locales/ar-SA/extensions.mdx +8 -0
- package/docs/content/locales/ar-SA/messaging.mdx +84 -15
- package/docs/content/locales/ar-SA/template-clips.mdx +1 -0
- package/docs/content/locales/ar-SA/template-design.mdx +1 -0
- package/docs/content/locales/de-DE/extensions.mdx +10 -0
- package/docs/content/locales/de-DE/messaging.mdx +92 -15
- package/docs/content/locales/de-DE/template-clips.mdx +1 -0
- package/docs/content/locales/de-DE/template-design.mdx +1 -0
- package/docs/content/locales/es-ES/extensions.mdx +10 -0
- package/docs/content/locales/es-ES/messaging.mdx +91 -15
- package/docs/content/locales/es-ES/template-clips.mdx +1 -0
- package/docs/content/locales/es-ES/template-design.mdx +1 -0
- package/docs/content/locales/fr-FR/extensions.mdx +10 -0
- package/docs/content/locales/fr-FR/messaging.mdx +91 -15
- package/docs/content/locales/fr-FR/template-clips.mdx +1 -0
- package/docs/content/locales/fr-FR/template-design.mdx +1 -0
- package/docs/content/locales/hi-IN/extensions.mdx +8 -0
- package/docs/content/locales/hi-IN/messaging.mdx +81 -15
- package/docs/content/locales/hi-IN/template-clips.mdx +1 -0
- package/docs/content/locales/hi-IN/template-design.mdx +1 -0
- package/docs/content/locales/ja-JP/extensions.mdx +9 -0
- package/docs/content/locales/ja-JP/messaging.mdx +81 -15
- package/docs/content/locales/ja-JP/template-clips.mdx +1 -0
- package/docs/content/locales/ja-JP/template-design.mdx +1 -0
- package/docs/content/locales/ko-KR/extensions.mdx +8 -0
- package/docs/content/locales/ko-KR/messaging.mdx +80 -15
- package/docs/content/locales/ko-KR/template-clips.mdx +1 -0
- package/docs/content/locales/ko-KR/template-design.mdx +1 -0
- package/docs/content/locales/pt-BR/extensions.mdx +9 -0
- package/docs/content/locales/pt-BR/messaging.mdx +88 -15
- package/docs/content/locales/pt-BR/template-clips.mdx +1 -0
- package/docs/content/locales/pt-BR/template-design.mdx +1 -0
- package/docs/content/locales/zh-CN/extensions.mdx +6 -0
- package/docs/content/locales/zh-CN/messaging.mdx +78 -15
- package/docs/content/locales/zh-CN/template-clips.mdx +1 -0
- package/docs/content/locales/zh-CN/template-design.mdx +1 -0
- package/docs/content/locales/zh-TW/extensions.mdx +6 -0
- package/docs/content/locales/zh-TW/messaging.mdx +78 -15
- package/docs/content/locales/zh-TW/template-clips.mdx +1 -0
- package/docs/content/locales/zh-TW/template-design.mdx +1 -0
- package/docs/content/messaging.mdx +227 -45
- package/docs/content/template-clips.mdx +3 -0
- package/docs/content/template-design.mdx +4 -0
- package/package.json +5 -1
- package/src/templates/default/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/src/templates/default/AGENTS.md +7 -3
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +22 -9
- package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +6 -3
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +25 -0
- package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +15 -0
- package/src/templates/workspace-core/AGENTS.md +3 -2
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
createProductionAgentHandler,
|
|
60
60
|
actionsToEngineTools,
|
|
61
61
|
getActiveRunForThreadAsync,
|
|
62
|
-
|
|
62
|
+
abortRunDurably,
|
|
63
63
|
subscribeToRun,
|
|
64
64
|
type ActionEntry,
|
|
65
65
|
} from "../agent/production-agent.js";
|
|
@@ -158,6 +158,8 @@ import {
|
|
|
158
158
|
resourceGet,
|
|
159
159
|
resourceGetByPath,
|
|
160
160
|
ensurePersonalDefaults,
|
|
161
|
+
organizationIdFromResourceOwner,
|
|
162
|
+
sharedResourceOwner,
|
|
161
163
|
SHARED_OWNER,
|
|
162
164
|
WORKSPACE_OWNER,
|
|
163
165
|
} from "../resources/store.js";
|
|
@@ -638,7 +640,9 @@ function getResourceSummaryFromContent(content: string): string | null {
|
|
|
638
640
|
|
|
639
641
|
function resourceScopeForOwner(owner: string, currentOwner?: string): string {
|
|
640
642
|
if (owner === WORKSPACE_OWNER) return "workspace";
|
|
641
|
-
if (owner === SHARED_OWNER)
|
|
643
|
+
if (owner === SHARED_OWNER || organizationIdFromResourceOwner(owner)) {
|
|
644
|
+
return "shared";
|
|
645
|
+
}
|
|
642
646
|
if (currentOwner && owner === currentOwner) return "personal";
|
|
643
647
|
return "resource";
|
|
644
648
|
}
|
|
@@ -694,31 +698,37 @@ async function loadInstructionResourcesForPrompt(
|
|
|
694
698
|
|
|
695
699
|
async function loadResourceSkillsPromptBlock(
|
|
696
700
|
owner: string,
|
|
701
|
+
orgId?: string | null,
|
|
697
702
|
): Promise<string | null> {
|
|
698
703
|
try {
|
|
704
|
+
const organizationOwner = sharedResourceOwner(orgId);
|
|
699
705
|
const resources =
|
|
700
706
|
owner === SHARED_OWNER
|
|
701
707
|
? [
|
|
702
708
|
...(await resourceList(SHARED_OWNER, "skills/")),
|
|
703
709
|
...(await resourceList(WORKSPACE_OWNER, "skills/")),
|
|
704
710
|
]
|
|
705
|
-
: await resourceListAccessible(owner, "skills/");
|
|
711
|
+
: await resourceListAccessible(owner, "skills/", { orgId });
|
|
706
712
|
const sorted = resources.sort((a, b) => {
|
|
707
713
|
const ownerOrder =
|
|
708
714
|
(a.owner === owner
|
|
709
715
|
? 0
|
|
710
|
-
: a.owner ===
|
|
716
|
+
: a.owner === organizationOwner
|
|
711
717
|
? 1
|
|
712
|
-
: a.owner ===
|
|
718
|
+
: a.owner === SHARED_OWNER
|
|
713
719
|
? 2
|
|
714
|
-
:
|
|
720
|
+
: a.owner === WORKSPACE_OWNER
|
|
721
|
+
? 3
|
|
722
|
+
: 4) -
|
|
715
723
|
(b.owner === owner
|
|
716
724
|
? 0
|
|
717
|
-
: b.owner ===
|
|
725
|
+
: b.owner === organizationOwner
|
|
718
726
|
? 1
|
|
719
|
-
: b.owner ===
|
|
727
|
+
: b.owner === SHARED_OWNER
|
|
720
728
|
? 2
|
|
721
|
-
:
|
|
729
|
+
: b.owner === WORKSPACE_OWNER
|
|
730
|
+
? 3
|
|
731
|
+
: 4);
|
|
722
732
|
if (ownerOrder !== 0) return ownerOrder;
|
|
723
733
|
return a.path.localeCompare(b.path);
|
|
724
734
|
});
|
|
@@ -1765,7 +1775,7 @@ async function createResourceScriptEntries(): Promise<
|
|
|
1765
1775
|
}
|
|
1766
1776
|
const owner =
|
|
1767
1777
|
scope === "shared"
|
|
1768
|
-
? store.
|
|
1778
|
+
? store.sharedResourceOwner(getRequestOrgId())
|
|
1769
1779
|
: (getRequestRunContext()?.owner ??
|
|
1770
1780
|
getRequestUserEmail() ??
|
|
1771
1781
|
process.env.AGENT_USER_EMAIL);
|
|
@@ -2078,7 +2088,7 @@ function createBuilderBrowserTool(deps: {
|
|
|
2078
2088
|
const extensionRequestGuidance =
|
|
2079
2089
|
deps.extensionTools === false
|
|
2080
2090
|
? "Do NOT call this for requests to create or edit user-authored extensions/widgets/dashboards/calculators/mini-apps; extension tools are disabled for this app, and Builder is only for source-code changes to the host app. "
|
|
2081
|
-
: "Do NOT call this for
|
|
2091
|
+
: "Do NOT call this for a self-contained extension/widget/dashboard/calculator/mini-app or an extension that fits an existing named slot; those use create-extension/update-extension instead. If the requested result requires changing the host UI or placing UI where no named slot exists, it IS a source-code change: call this through the normal flow even when the user describes it as an extension. Never stop at saying an extension cannot do it. ";
|
|
2082
2092
|
const setBuiltinForCurrentUser = async (
|
|
2083
2093
|
id: BuiltinMcpCapabilityId,
|
|
2084
2094
|
enabled: boolean,
|
|
@@ -2898,6 +2908,35 @@ export interface AgentChatPluginOptions {
|
|
|
2898
2908
|
toolLimits?: { timeoutMs?: number; maxResultChars?: number };
|
|
2899
2909
|
}
|
|
2900
2910
|
|
|
2911
|
+
type A2AAgentLoopRunner = typeof runAgentLoopDirectWithSoftTimeout;
|
|
2912
|
+
|
|
2913
|
+
/**
|
|
2914
|
+
* Run an A2A-delegated agent turn with the same final-response guard used by
|
|
2915
|
+
* the app's interactive chat surface.
|
|
2916
|
+
*
|
|
2917
|
+
* Keeping this in one helper prevents delegated calls from silently bypassing
|
|
2918
|
+
* template guarantees such as Analytics' requirement to query real data
|
|
2919
|
+
* before presenting metrics or exhaustive provider conclusions.
|
|
2920
|
+
*/
|
|
2921
|
+
export function runA2AAgentLoop(
|
|
2922
|
+
runOptions: Parameters<A2AAgentLoopRunner>[0],
|
|
2923
|
+
pluginOptions: Pick<
|
|
2924
|
+
AgentChatPluginOptions,
|
|
2925
|
+
"finalResponseGuard" | "runSoftTimeoutMs"
|
|
2926
|
+
>,
|
|
2927
|
+
timeoutOptions: Parameters<A2AAgentLoopRunner>[2],
|
|
2928
|
+
runner: A2AAgentLoopRunner = runAgentLoopDirectWithSoftTimeout,
|
|
2929
|
+
) {
|
|
2930
|
+
return runner(
|
|
2931
|
+
{
|
|
2932
|
+
...runOptions,
|
|
2933
|
+
finalResponseGuard: pluginOptions.finalResponseGuard,
|
|
2934
|
+
},
|
|
2935
|
+
pluginOptions.runSoftTimeoutMs,
|
|
2936
|
+
timeoutOptions,
|
|
2937
|
+
);
|
|
2938
|
+
}
|
|
2939
|
+
|
|
2901
2940
|
/**
|
|
2902
2941
|
* Verbose framework sections returned by the `get-framework-context` tool.
|
|
2903
2942
|
* Keyed by topic so the agent can request specific sections.
|
|
@@ -3112,7 +3151,7 @@ function buildFrameworkPrompts(
|
|
|
3112
3151
|
? "`render-inline-extension`, `create-extension`, `update-extension`, `connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data"
|
|
3113
3152
|
: "`connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data";
|
|
3114
3153
|
const extensionConnectBuilderGuard = extensionToolsEnabled
|
|
3115
|
-
? "If the request
|
|
3154
|
+
? "If the complete request can be satisfied by a self-contained extension or an existing named slot, use `render-inline-extension`, `create-extension`, `show-extension-inline`, or `update-extension` instead. If the exact placement or behavior requires changing the host UI or no suitable slot exists, continue with the normal `connect-builder` source-change flow even if the user called it an extension; never stop at saying extensions cannot do it."
|
|
3116
3155
|
: "Because extension tools are disabled, do NOT invent an extension workflow. Only use `connect-builder` when the request genuinely requires changing the host app's source code.";
|
|
3117
3156
|
const extensionInstructionsFull = extensionToolsEnabled
|
|
3118
3157
|
? `### Generative UI and Extensions (Mini-Apps)
|
|
@@ -3141,7 +3180,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
|
|
|
3141
3180
|
|
|
3142
3181
|
### Extensions vs. Code Changes — Pick the Right Path
|
|
3143
3182
|
|
|
3144
|
-
Route by
|
|
3183
|
+
Route by the exact outcome, not by whether the user calls it an extension. Extensions render in their own sandboxed iframe, either on their own page or inside an existing named slot. They CANNOT change the host app's nav, restyle or inject elements into existing native components, replace built-in views, or render at an arbitrary location that has no slot.
|
|
3145
3184
|
|
|
3146
3185
|
<routing>
|
|
3147
3186
|
| The request is for… | Path |
|
|
@@ -3151,10 +3190,13 @@ Route by what the request changes, not how it is phrased. Extensions render in t
|
|
|
3151
3190
|
| Loading a saved extension inside chat | \`show-extension-inline\` |
|
|
3152
3191
|
| Editing an existing extension (fix, restyle, rename, add behavior) | \`update-extension\` |
|
|
3153
3192
|
| The host app's own chrome (nav bar, sidebar, layout, routes, shipped components, existing styles, business logic) | \`connect-builder\` — a real source-code change |
|
|
3193
|
+
| UI inside or beside a native component where no named slot exists | \`connect-builder\` — add the native UI or a suitable slot in source |
|
|
3154
3194
|
| Ambiguous, satisfiable either way (e.g. "give me an unread view") | \`render-inline-extension\` for chat-only, \`create-extension\` for reusable |
|
|
3155
3195
|
</routing>
|
|
3156
3196
|
|
|
3157
|
-
|
|
3197
|
+
If an extension could only approximate the request in a different location, do not silently downgrade the requirement and do not end with "extensions cannot do that." Briefly explain the boundary, then follow the normal source-code handoff so the app can still be customized fully.
|
|
3198
|
+
|
|
3199
|
+
Worked examples: "a widget showing unread emails grouped by sender", "a tracker for my newsletter subscriptions", "a custom kanban board with drag-and-drop rules the app does not have" → \`create-extension\`. "Add an Unread tab to the left navigation", "show local time beside every native Calendar attendee row", "make the subject lines wrap", "change the inbox grouping logic", "add a field to the compose form" → \`connect-builder\`.`
|
|
3158
3200
|
: `### Extensions Disabled
|
|
3159
3201
|
|
|
3160
3202
|
Extension creation and management tools are disabled for this app. Do not claim you can create, edit, hide, or delete Agent-Native extensions unless the template exposes its own typed action for that workflow. For requests that would otherwise be handled as an extension/widget/dashboard/calculator mini-app, explain that this app has disabled extension tools and use the app's available actions instead.`;
|
|
@@ -3175,7 +3217,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
|
|
|
3175
3217
|
|
|
3176
3218
|
### Extensions vs. Code Changes — Pick the Right Path
|
|
3177
3219
|
|
|
3178
|
-
If the user wants a **one-off interactive answer in chat**, use \`render-inline-extension\`. If they want a **new reusable self-contained surface** (custom widget, dashboard, list, viewer, calculator), use \`create-extension\` — extensions ship instantly without a PR.
|
|
3220
|
+
If the user wants a **one-off interactive answer in chat**, use \`render-inline-extension\`. If they want a **new reusable self-contained surface** (custom widget, dashboard, list, viewer, calculator), use \`create-extension\` — extensions ship instantly without a PR. Extensions can render only on their own page or in an existing named slot; they cannot inject UI into arbitrary native components. If the exact request changes host chrome, native components, layout, styles, routes, business logic, or needs placement where no slot exists, treat it as a source-code change and use the normal \`connect-builder\` flow even if the user called it an extension. Never stop at "extensions cannot do that" or silently offer a different placement; explain the boundary briefly and continue the code-change handoff.`
|
|
3179
3221
|
: `### Extensions Disabled
|
|
3180
3222
|
|
|
3181
3223
|
Extension creation and management tools are disabled for this app. Do not claim you can create, edit, hide, or delete Agent-Native extensions unless the template exposes its own typed action for that workflow.`;
|
|
@@ -3309,9 +3351,9 @@ export const _agentChatPromptSectionsForTests = (() => {
|
|
|
3309
3351
|
* 2. `<template>` — AGENTS.md + skills index from the Vite plugin bundle.
|
|
3310
3352
|
* 3. `<workspace>` — SQL workspace AGENTS.md and instructions/*.md.
|
|
3311
3353
|
* Runtime global defaults managed from Dispatch and inherited by apps.
|
|
3312
|
-
* 4. `<
|
|
3313
|
-
*
|
|
3314
|
-
*
|
|
3354
|
+
* 4. `<app-default>` — legacy app-wide SQL defaults.
|
|
3355
|
+
* 5. `<shared>` — organization AGENTS.md, instructions, and LEARNINGS.md.
|
|
3356
|
+
* These are isolated by active org and override app/workspace defaults.
|
|
3315
3357
|
* 6. `<personal>` — memory/MEMORY.md from the SQL personal scope. The
|
|
3316
3358
|
* current user's structured memory index.
|
|
3317
3359
|
*
|
|
@@ -3323,6 +3365,7 @@ export async function loadResourcesForPrompt(
|
|
|
3323
3365
|
owner: string,
|
|
3324
3366
|
compact = false,
|
|
3325
3367
|
selfAppId?: string,
|
|
3368
|
+
orgId: string | null = getRequestOrgId() ?? null,
|
|
3326
3369
|
): Promise<string> {
|
|
3327
3370
|
await ensurePersonalDefaults(owner);
|
|
3328
3371
|
|
|
@@ -3402,23 +3445,46 @@ export async function loadResourcesForPrompt(
|
|
|
3402
3445
|
)),
|
|
3403
3446
|
);
|
|
3404
3447
|
|
|
3405
|
-
|
|
3406
|
-
|
|
3407
|
-
|
|
3448
|
+
const organizationOwner = sharedResourceOwner(orgId);
|
|
3449
|
+
|
|
3450
|
+
// 4. Legacy app-wide defaults. Existing deployments keep their seeded
|
|
3451
|
+
// shared guidance as an inherited fallback; organization writes never
|
|
3452
|
+
// mutate this owner.
|
|
3453
|
+
const appDefaultAgents = await loadAgentsResourceForPrompt(
|
|
3408
3454
|
SHARED_OWNER,
|
|
3409
|
-
"shared",
|
|
3455
|
+
organizationOwner === SHARED_OWNER ? "shared" : "app-default",
|
|
3410
3456
|
promptResourceMaxChars,
|
|
3411
3457
|
);
|
|
3412
|
-
if (
|
|
3458
|
+
if (appDefaultAgents) sections.push(appDefaultAgents);
|
|
3413
3459
|
sections.push(
|
|
3414
3460
|
...(await loadInstructionResourcesForPrompt(
|
|
3415
3461
|
SHARED_OWNER,
|
|
3416
|
-
|
|
3462
|
+
organizationOwner === SHARED_OWNER
|
|
3463
|
+
? "shared-instruction"
|
|
3464
|
+
: "app-default-instruction",
|
|
3417
3465
|
promptResourceMaxChars,
|
|
3418
3466
|
)),
|
|
3419
3467
|
);
|
|
3420
3468
|
|
|
3421
|
-
// 5.
|
|
3469
|
+
// 5. Active organization resources. These are the durable team rules and
|
|
3470
|
+
// learnings that Slack/integration runs share with interactive app chat.
|
|
3471
|
+
if (organizationOwner !== SHARED_OWNER) {
|
|
3472
|
+
const organizationAgents = await loadAgentsResourceForPrompt(
|
|
3473
|
+
organizationOwner,
|
|
3474
|
+
"shared",
|
|
3475
|
+
promptResourceMaxChars,
|
|
3476
|
+
);
|
|
3477
|
+
if (organizationAgents) sections.push(organizationAgents);
|
|
3478
|
+
sections.push(
|
|
3479
|
+
...(await loadInstructionResourcesForPrompt(
|
|
3480
|
+
organizationOwner,
|
|
3481
|
+
"shared-instruction",
|
|
3482
|
+
promptResourceMaxChars,
|
|
3483
|
+
)),
|
|
3484
|
+
);
|
|
3485
|
+
}
|
|
3486
|
+
|
|
3487
|
+
// 6. Personal SQL resources. These come last in the instruction stack so a
|
|
3422
3488
|
// user can narrow or override organization/app and workspace defaults.
|
|
3423
3489
|
if (owner !== SHARED_OWNER && owner !== WORKSPACE_OWNER) {
|
|
3424
3490
|
const personalAgents = await loadAgentsResourceForPrompt(
|
|
@@ -3436,27 +3502,43 @@ export async function loadResourcesForPrompt(
|
|
|
3436
3502
|
);
|
|
3437
3503
|
}
|
|
3438
3504
|
|
|
3439
|
-
const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner);
|
|
3505
|
+
const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner, orgId);
|
|
3440
3506
|
if (resourceSkillsBlock) sections.push(resourceSkillsBlock);
|
|
3441
3507
|
|
|
3508
|
+
let sharedLearnings: Awaited<ReturnType<typeof resourceGetByPath>> = null;
|
|
3509
|
+
try {
|
|
3510
|
+
sharedLearnings =
|
|
3511
|
+
(organizationOwner !== SHARED_OWNER
|
|
3512
|
+
? await resourceGetByPath(organizationOwner, "LEARNINGS.md")
|
|
3513
|
+
: null) ?? (await resourceGetByPath(SHARED_OWNER, "LEARNINGS.md"));
|
|
3514
|
+
} catch {}
|
|
3515
|
+
|
|
3442
3516
|
if (compact) {
|
|
3443
|
-
//
|
|
3444
|
-
//
|
|
3445
|
-
//
|
|
3517
|
+
// Integration/Slack turns use compact context, but organization learnings
|
|
3518
|
+
// are operational routing input, not optional background. Preload the
|
|
3519
|
+
// bounded shared file so canonical destinations/fields are available on
|
|
3520
|
+
// the first turn; keep personal memory on-demand to preserve the compact
|
|
3521
|
+
// budget.
|
|
3522
|
+
if (sharedLearnings?.content?.trim()) {
|
|
3523
|
+
const block = promptResourceBlock({
|
|
3524
|
+
name: "LEARNINGS.md",
|
|
3525
|
+
scope: "shared",
|
|
3526
|
+
path: "LEARNINGS.md",
|
|
3527
|
+
content: sharedLearnings.content,
|
|
3528
|
+
maxChars: COMPACT_PROMPT_RESOURCE_MAX_CHARS,
|
|
3529
|
+
});
|
|
3530
|
+
if (block) sections.push(block);
|
|
3531
|
+
}
|
|
3446
3532
|
sections.push(
|
|
3447
|
-
`<context-note>
|
|
3533
|
+
`<context-note>Organization learnings above and your personal memory (memory/MEMORY.md) are available via the \`resources\` tool. Save durable team facts and routing conventions to shared LEARNINGS.md; keep personal preferences in save-memory.</context-note>`,
|
|
3448
3534
|
);
|
|
3449
3535
|
} else {
|
|
3450
3536
|
// LEARNINGS.md from SQL (template-level instructions are in AGENTS.md above).
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
`<resource name="LEARNINGS.md" scope="shared">\n${shared.content.trim()}\n</resource>`,
|
|
3457
|
-
);
|
|
3458
|
-
}
|
|
3459
|
-
} catch {}
|
|
3537
|
+
if (sharedLearnings?.content?.trim()) {
|
|
3538
|
+
sections.push(
|
|
3539
|
+
`<resource name="LEARNINGS.md" scope="shared">\n${sharedLearnings.content.trim()}\n</resource>`,
|
|
3540
|
+
);
|
|
3541
|
+
}
|
|
3460
3542
|
|
|
3461
3543
|
// 3. Personal memory index (skip if owner is the shared sentinel)
|
|
3462
3544
|
if (owner !== SHARED_OWNER) {
|
|
@@ -3477,11 +3559,18 @@ export async function loadResourcesForPrompt(
|
|
|
3477
3559
|
);
|
|
3478
3560
|
if (workspaceResourceIndex) sections.push(workspaceResourceIndex);
|
|
3479
3561
|
|
|
3480
|
-
const
|
|
3562
|
+
const appDefaultResourceIndex = await loadResourceIndexForPrompt(
|
|
3481
3563
|
SHARED_OWNER,
|
|
3482
3564
|
"shared",
|
|
3483
3565
|
);
|
|
3484
|
-
if (
|
|
3566
|
+
if (appDefaultResourceIndex) sections.push(appDefaultResourceIndex);
|
|
3567
|
+
if (organizationOwner !== SHARED_OWNER) {
|
|
3568
|
+
const organizationResourceIndex = await loadResourceIndexForPrompt(
|
|
3569
|
+
organizationOwner,
|
|
3570
|
+
"shared",
|
|
3571
|
+
);
|
|
3572
|
+
if (organizationResourceIndex) sections.push(organizationResourceIndex);
|
|
3573
|
+
}
|
|
3485
3574
|
|
|
3486
3575
|
try {
|
|
3487
3576
|
const agents = (await discoverAgents(selfAppId)).slice(0, 30);
|
|
@@ -4754,6 +4843,7 @@ export function createAgentChatPlugin(
|
|
|
4754
4843
|
skills: buildPublicAgentA2ASkills(allScripts),
|
|
4755
4844
|
publicSkillsOnly: true,
|
|
4756
4845
|
streaming: true,
|
|
4846
|
+
durableBackgroundRuns: options?.durableBackgroundRuns,
|
|
4757
4847
|
handler: async function* (message, context) {
|
|
4758
4848
|
// Resolve the caller's identity for user-scoped data access.
|
|
4759
4849
|
// Priority: A2A-JWT verified email (set by the A2A handler in
|
|
@@ -5008,7 +5098,7 @@ export function createAgentChatPlugin(
|
|
|
5008
5098
|
`[A2A] Starting agent loop: ${a2aTools.length} tools, prompt ${systemPrompt.length} chars`,
|
|
5009
5099
|
);
|
|
5010
5100
|
|
|
5011
|
-
await
|
|
5101
|
+
await runA2AAgentLoop(
|
|
5012
5102
|
{
|
|
5013
5103
|
engine: a2aEngine,
|
|
5014
5104
|
model,
|
|
@@ -5058,7 +5148,10 @@ export function createAgentChatPlugin(
|
|
|
5058
5148
|
},
|
|
5059
5149
|
signal: controller.signal,
|
|
5060
5150
|
},
|
|
5061
|
-
|
|
5151
|
+
{
|
|
5152
|
+
finalResponseGuard: options?.finalResponseGuard,
|
|
5153
|
+
runSoftTimeoutMs: options?.runSoftTimeoutMs,
|
|
5154
|
+
},
|
|
5062
5155
|
{
|
|
5063
5156
|
backgroundFunction:
|
|
5064
5157
|
options?.durableBackgroundRuns === true &&
|
|
@@ -7453,7 +7546,10 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
7453
7546
|
} catch {
|
|
7454
7547
|
// Empty/invalid body — keep the default user abort reason.
|
|
7455
7548
|
}
|
|
7456
|
-
|
|
7549
|
+
// Recovery starts as soon as this response resolves, so wait for
|
|
7550
|
+
// the cross-isolate abort + terminal event to be durable. Returning
|
|
7551
|
+
// early lets Retry collide with the still-running row.
|
|
7552
|
+
await abortRunDurably(runId, reason);
|
|
7457
7553
|
return { ok: true };
|
|
7458
7554
|
}
|
|
7459
7555
|
|
|
@@ -7599,6 +7695,26 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
7599
7695
|
// Server clock so the client computes "stuck" elapsed time
|
|
7600
7696
|
// server-relative, immune to client clock skew.
|
|
7601
7697
|
serverNow: Date.now(),
|
|
7698
|
+
// True exactly when this run is a `chainServerDrivenContinuation`
|
|
7699
|
+
// deferral still inside `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS`
|
|
7700
|
+
// — silently recovering server-side via the unclaimed-background-run
|
|
7701
|
+
// sweep(s), never a dead run. See `getActiveRunForThreadAsync`'s doc
|
|
7702
|
+
// comment (run-manager.ts) and the THREE-SITE INVARIANT comments in
|
|
7703
|
+
// agent-chat-plugin.ts / production-agent.ts / agent-chat-adapter.ts.
|
|
7704
|
+
awaitingRedispatch: run.awaitingRedispatch === true,
|
|
7705
|
+
// True exactly when this run holds an open tool call or A2A
|
|
7706
|
+
// `agent_call` delegation (`in_flight_since` set — the same
|
|
7707
|
+
// marker `reapIfStale` reads to grant its bounded stale-reap
|
|
7708
|
+
// grace, see run-store.ts). This is the server-authoritative
|
|
7709
|
+
// signal for "would aborting this run right now destroy live
|
|
7710
|
+
// work" — RunStuckBanner's Retry gating should prefer this
|
|
7711
|
+
// field over its client-side proxy (unresolved `tool-call`
|
|
7712
|
+
// content parts in the local message list), which can go stale
|
|
7713
|
+
// after a reconnect or reader-mode replay. NOTE: this response
|
|
7714
|
+
// object is explicitly field-picked, not spread — a field added
|
|
7715
|
+
// to `getActiveRunForThreadAsync`'s return type does NOT reach
|
|
7716
|
+
// the wire on its own; it must be listed here too.
|
|
7717
|
+
hasInFlightWork: run.hasInFlightWork === true,
|
|
7602
7718
|
};
|
|
7603
7719
|
}
|
|
7604
7720
|
|
|
@@ -8565,30 +8681,144 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
8565
8681
|
// turn hangs silently. `chainServerDrivenContinuation` (production-agent.ts)
|
|
8566
8682
|
// leaves exactly such a row behind — status='running', dispatch_mode=
|
|
8567
8683
|
// 'background', `dispatch_payload` intact — when it exhausts its own
|
|
8568
|
-
// dispatch retry budget, instead of erroring it immediately.
|
|
8569
|
-
//
|
|
8570
|
-
//
|
|
8571
|
-
//
|
|
8572
|
-
//
|
|
8573
|
-
//
|
|
8574
|
-
//
|
|
8575
|
-
//
|
|
8576
|
-
//
|
|
8577
|
-
//
|
|
8578
|
-
//
|
|
8579
|
-
//
|
|
8580
|
-
//
|
|
8684
|
+
// dispatch retry budget, instead of erroring it immediately. Two timers
|
|
8685
|
+
// cooperate to recover it, both reading `listUnclaimedBackgroundRunRows`
|
|
8686
|
+
// fresh each tick and gated by `shouldRedispatchUnclaimedBackgroundRun`
|
|
8687
|
+
// (so they always agree on which rows are still eligible):
|
|
8688
|
+
// - the FAST sweep (`UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS`, 20s)
|
|
8689
|
+
// below ONLY attempts redispatch — never reaps — so it puts the
|
|
8690
|
+
// first recovery attempt well inside the client's
|
|
8691
|
+
// `BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS` (see the derived budget on
|
|
8692
|
+
// `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` in run-store.ts).
|
|
8693
|
+
// - the SLOW sweep (2 minutes, immediately below the fast one) is the
|
|
8694
|
+
// one that falls back to the loud reap once
|
|
8695
|
+
// `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` is exceeded; it
|
|
8696
|
+
// also still attempts redispatch itself so a fast-sweep outage
|
|
8697
|
+
// (e.g. a restart between ticks) is not the only path to recovery.
|
|
8698
|
+
// A redispatch is always safe to attempt — even a duplicate, concurrent,
|
|
8699
|
+
// or late-arriving one, including the fast and slow sweeps racing each
|
|
8700
|
+
// other on the SAME row — because the worker's `claimBackgroundRun`
|
|
8701
|
+
// atomic CAS (status='running' AND dispatch_mode='background' ->
|
|
8702
|
+
// 'background-processing') is the sole gate on actual execution; a row
|
|
8703
|
+
// that was already claimed or already reaped by a concurrent path just
|
|
8704
|
+
// loses the CAS and no-ops. Cheap: one indexed-ish query per tick.
|
|
8581
8705
|
//
|
|
8582
8706
|
// THREE-SITE INVARIANT (keep in lockstep): this sweep only ever sees the
|
|
8583
8707
|
// deferred successor because the ~1s client poll in
|
|
8584
8708
|
// `getActiveRunForThreadAsync` (run-manager.ts) skips its own
|
|
8585
8709
|
// `reapUnclaimedBackgroundRun` while the row is within the redispatch
|
|
8586
|
-
// bound (`shouldRedispatchUnclaimedBackgroundRun`).
|
|
8587
|
-
//
|
|
8588
|
-
//
|
|
8589
|
-
//
|
|
8590
|
-
//
|
|
8591
|
-
//
|
|
8710
|
+
// bound (`shouldRedispatchUnclaimedBackgroundRun`). That same client
|
|
8711
|
+
// poll also surfaces `awaitingRedispatch: true` on `/runs/active` for
|
|
8712
|
+
// exactly this state, which `agent-chat-adapter.ts`'s follow loop uses
|
|
8713
|
+
// to stop counting the quiet gap against its own idle timeout. If a
|
|
8714
|
+
// future change makes the client poll reap deferred successors at the
|
|
8715
|
+
// 25s grace again, or stops surfacing `awaitingRedispatch`, both sweeps
|
|
8716
|
+
// here will almost never win the race for connected clients. Do not
|
|
8717
|
+
// edit one site without the others (producer: chainServerDrivenContinuation
|
|
8718
|
+
// in production-agent.ts; guard + wire signal: run-manager.ts; recovery
|
|
8719
|
+
// actors: here).
|
|
8720
|
+
const attemptUnclaimedBackgroundRunRedispatch = async (row: {
|
|
8721
|
+
id: string;
|
|
8722
|
+
startedAt: number;
|
|
8723
|
+
}): Promise<void> => {
|
|
8724
|
+
const { updateRunHeartbeat } = await import("../agent/run-store.js");
|
|
8725
|
+
const { resolveAgentChatProcessRunDispatchPath } =
|
|
8726
|
+
await import("../agent/durable-background.js");
|
|
8727
|
+
const { fireInternalDispatch } = await import("./self-dispatch.js");
|
|
8728
|
+
// Bump liveness BEFORE attempting the redispatch so the row doesn't
|
|
8729
|
+
// look freshly-stale again the instant this tick returns —
|
|
8730
|
+
// best-effort, the CAS is what actually matters for correctness, not
|
|
8731
|
+
// this timing.
|
|
8732
|
+
await updateRunHeartbeat(row.id).catch(() => {});
|
|
8733
|
+
try {
|
|
8734
|
+
// DELIBERATE: this marker omits `continuationCount`.
|
|
8735
|
+
// `chainServerDrivenContinuation` (production-agent.ts) reads
|
|
8736
|
+
// `backgroundRunMarker.continuationCount` to compute
|
|
8737
|
+
// `backgroundContinuationCount`, defaulting to 0 when absent — so a
|
|
8738
|
+
// chunk recovered here always starts a fresh nested-dispatch
|
|
8739
|
+
// segment at depth 0, regardless of how deep the chain was before
|
|
8740
|
+
// this sweep picked it up. This is what makes the sweep a genuine
|
|
8741
|
+
// CHAIN BREAK, not just a retry: this redispatch fires from an
|
|
8742
|
+
// unrelated, timer-driven invocation rather than from inside the
|
|
8743
|
+
// prior chain's own live execution, so starting its nested-depth
|
|
8744
|
+
// count over at 0 here is correct — see
|
|
8745
|
+
// `MAX_NESTED_SELF_DISPATCH_DEPTH` in production-agent.ts for why
|
|
8746
|
+
// nested depth is bounded and how this reset keeps a long turn
|
|
8747
|
+
// progressing past Netlify's undocumented self-invocation
|
|
8748
|
+
// loop-protection limit instead of dying at it. Do not "fix" this
|
|
8749
|
+
// by adding `continuationCount` back without re-reading that
|
|
8750
|
+
// constant's doc comment.
|
|
8751
|
+
await fireInternalDispatch({
|
|
8752
|
+
path: resolveAgentChatProcessRunDispatchPath(),
|
|
8753
|
+
taskId: row.id,
|
|
8754
|
+
body: {
|
|
8755
|
+
internalContinuation: true,
|
|
8756
|
+
[AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
|
|
8757
|
+
runId: row.id,
|
|
8758
|
+
payloadRef: true,
|
|
8759
|
+
},
|
|
8760
|
+
},
|
|
8761
|
+
awaitResponse: true,
|
|
8762
|
+
responseTimeoutMs: 15_000,
|
|
8763
|
+
});
|
|
8764
|
+
console.error(
|
|
8765
|
+
"[agent-chat] redispatched unclaimed background run (handoff recovery):",
|
|
8766
|
+
row.id,
|
|
8767
|
+
);
|
|
8768
|
+
} catch (redispatchErr) {
|
|
8769
|
+
console.error(
|
|
8770
|
+
"[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):",
|
|
8771
|
+
row.id,
|
|
8772
|
+
redispatchErr instanceof Error
|
|
8773
|
+
? redispatchErr.message
|
|
8774
|
+
: redispatchErr,
|
|
8775
|
+
);
|
|
8776
|
+
}
|
|
8777
|
+
};
|
|
8778
|
+
|
|
8779
|
+
// FAST sweep — redispatch-only, tight cadence. See the invariant
|
|
8780
|
+
// comment above for why this exists and the timing budget in
|
|
8781
|
+
// run-store.ts's `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` doc comment.
|
|
8782
|
+
(() => {
|
|
8783
|
+
setTimeout(() => {
|
|
8784
|
+
(async () => {
|
|
8785
|
+
const { UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS } =
|
|
8786
|
+
await import("../agent/run-store.js");
|
|
8787
|
+
setInterval(() => {
|
|
8788
|
+
(async () => {
|
|
8789
|
+
const {
|
|
8790
|
+
listUnclaimedBackgroundRunRows,
|
|
8791
|
+
shouldRedispatchUnclaimedBackgroundRun,
|
|
8792
|
+
} = await import("../agent/run-store.js");
|
|
8793
|
+
let rows: { id: string; startedAt: number }[];
|
|
8794
|
+
try {
|
|
8795
|
+
rows = await listUnclaimedBackgroundRunRows();
|
|
8796
|
+
} catch {
|
|
8797
|
+
return; // Table may not exist yet on first boot
|
|
8798
|
+
}
|
|
8799
|
+
for (const row of rows) {
|
|
8800
|
+
if (!shouldRedispatchUnclaimedBackgroundRun(row)) continue;
|
|
8801
|
+
await attemptUnclaimedBackgroundRunRedispatch(row).catch(
|
|
8802
|
+
() => {},
|
|
8803
|
+
);
|
|
8804
|
+
}
|
|
8805
|
+
})().catch(() => {
|
|
8806
|
+
// best-effort — never break the server
|
|
8807
|
+
});
|
|
8808
|
+
}, UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS);
|
|
8809
|
+
})().catch(() => {
|
|
8810
|
+
// best-effort — if run-store fails to load, the slow sweep below
|
|
8811
|
+
// still provides eventual (loud) recovery.
|
|
8812
|
+
});
|
|
8813
|
+
}, 10_000); // Start 10s after init — before the slow sweep's first tick.
|
|
8814
|
+
})();
|
|
8815
|
+
|
|
8816
|
+
// SLOW sweep — redispatch AND the loud-failure reap fallback past the
|
|
8817
|
+
// redispatch bound. Kept on its original 2-minute cadence: it is not
|
|
8818
|
+
// the latency-critical path anymore (the fast sweep above is), it is
|
|
8819
|
+
// the correctness backstop that guarantees a genuinely lost handoff
|
|
8820
|
+
// still fails loud, and it survives the fast sweep having missed a row
|
|
8821
|
+
// entirely (e.g. a restart landed between fast-sweep ticks).
|
|
8592
8822
|
(() => {
|
|
8593
8823
|
let lastSweep = 0;
|
|
8594
8824
|
const SWEEP_INTERVAL_MS = 2 * 60 * 1000;
|
|
@@ -8603,13 +8833,8 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
8603
8833
|
const {
|
|
8604
8834
|
listUnclaimedBackgroundRunRows,
|
|
8605
8835
|
reapUnclaimedBackgroundRun,
|
|
8606
|
-
updateRunHeartbeat,
|
|
8607
8836
|
shouldRedispatchUnclaimedBackgroundRun,
|
|
8608
8837
|
} = await import("../agent/run-store.js");
|
|
8609
|
-
const { resolveAgentChatProcessRunDispatchPath } =
|
|
8610
|
-
await import("../agent/durable-background.js");
|
|
8611
|
-
const { fireInternalDispatch } =
|
|
8612
|
-
await import("./self-dispatch.js");
|
|
8613
8838
|
let rows: { id: string; startedAt: number }[];
|
|
8614
8839
|
try {
|
|
8615
8840
|
rows = await listUnclaimedBackgroundRunRows();
|
|
@@ -8619,57 +8844,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
8619
8844
|
for (const row of rows) {
|
|
8620
8845
|
try {
|
|
8621
8846
|
if (shouldRedispatchUnclaimedBackgroundRun(row)) {
|
|
8622
|
-
|
|
8623
|
-
// row doesn't look freshly-stale again the instant this
|
|
8624
|
-
// tick returns — best-effort, the CAS is what actually
|
|
8625
|
-
// matters for correctness, not this timing.
|
|
8626
|
-
await updateRunHeartbeat(row.id).catch(() => {});
|
|
8627
|
-
try {
|
|
8628
|
-
// DELIBERATE: this marker omits `continuationCount`.
|
|
8629
|
-
// `chainServerDrivenContinuation` (production-agent.ts)
|
|
8630
|
-
// reads `backgroundRunMarker.continuationCount` to
|
|
8631
|
-
// compute `backgroundContinuationCount`, defaulting to 0
|
|
8632
|
-
// when absent — so a chunk recovered here always starts
|
|
8633
|
-
// a fresh nested-dispatch segment at depth 0, regardless
|
|
8634
|
-
// of how deep the chain was before this sweep picked it
|
|
8635
|
-
// up. This is what makes the sweep a genuine CHAIN
|
|
8636
|
-
// BREAK, not just a retry: this redispatch fires from an
|
|
8637
|
-
// unrelated, timer-driven invocation rather than from
|
|
8638
|
-
// inside the prior chain's own live execution, so
|
|
8639
|
-
// starting its nested-depth count over at 0 here is
|
|
8640
|
-
// correct — see `MAX_NESTED_SELF_DISPATCH_DEPTH` in
|
|
8641
|
-
// production-agent.ts for why nested depth is bounded
|
|
8642
|
-
// and how this reset keeps a long turn progressing past
|
|
8643
|
-
// Netlify's undocumented self-invocation loop-protection
|
|
8644
|
-
// limit instead of dying at it. Do not "fix" this by
|
|
8645
|
-
// adding `continuationCount` back without re-reading
|
|
8646
|
-
// that constant's doc comment.
|
|
8647
|
-
await fireInternalDispatch({
|
|
8648
|
-
path: resolveAgentChatProcessRunDispatchPath(),
|
|
8649
|
-
taskId: row.id,
|
|
8650
|
-
body: {
|
|
8651
|
-
internalContinuation: true,
|
|
8652
|
-
[AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
|
|
8653
|
-
runId: row.id,
|
|
8654
|
-
payloadRef: true,
|
|
8655
|
-
},
|
|
8656
|
-
},
|
|
8657
|
-
awaitResponse: true,
|
|
8658
|
-
responseTimeoutMs: 15_000,
|
|
8659
|
-
});
|
|
8660
|
-
console.error(
|
|
8661
|
-
"[agent-chat] redispatched unclaimed background run (handoff recovery):",
|
|
8662
|
-
row.id,
|
|
8663
|
-
);
|
|
8664
|
-
} catch (redispatchErr) {
|
|
8665
|
-
console.error(
|
|
8666
|
-
"[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):",
|
|
8667
|
-
row.id,
|
|
8668
|
-
redispatchErr instanceof Error
|
|
8669
|
-
? redispatchErr.message
|
|
8670
|
-
: redispatchErr,
|
|
8671
|
-
);
|
|
8672
|
-
}
|
|
8847
|
+
await attemptUnclaimedBackgroundRunRedispatch(row);
|
|
8673
8848
|
continue;
|
|
8674
8849
|
}
|
|
8675
8850
|
// Redispatch bound exceeded — this handoff is not
|