@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
|
@@ -9,7 +9,7 @@ import { canUpdateAgentAppModelDefaultSettings, normalizeAgentAppModelDefaultApp
|
|
|
9
9
|
import { DEFAULT_ANTHROPIC_MODEL } from "../agent/default-model.js";
|
|
10
10
|
import { AGENT_CHAT_BACKGROUND_RUN_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, backgroundRunMarkerExpectsBackgroundRuntime, isInBackgroundFunctionRuntime, prepareProcessRunRequest, } from "../agent/durable-background.js";
|
|
11
11
|
import { resolveEngine, createAnthropicEngine, getStoredModelForEngine, normalizeModelForEngine, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, listAgentEngines, registerBuiltinEngines, } from "../agent/engine/index.js";
|
|
12
|
-
import { createProductionAgentHandler, actionsToEngineTools, getActiveRunForThreadAsync,
|
|
12
|
+
import { createProductionAgentHandler, actionsToEngineTools, getActiveRunForThreadAsync, abortRunDurably, subscribeToRun, } from "../agent/production-agent.js";
|
|
13
13
|
import { runAgentLoopDirectWithSoftTimeout } from "../agent/run-loop-with-resume.js";
|
|
14
14
|
import { callerHasRunAccess, callerHasThreadAccess, } from "../agent/run-ownership.js";
|
|
15
15
|
import { CLAIMED_BACKGROUND_WORKER_FAILED_ERROR_EVENT, ensureTerminalRunEvent, readBackgroundRunClaim, recordRunDiagnostic, RUN_DIAG_STAGE, setRunError, setRunTerminalReason, updateRunStatusIfRunning, } from "../agent/run-store.js";
|
|
@@ -23,7 +23,7 @@ import { verifyInternalToken, extractBearerToken, } from "../integrations/intern
|
|
|
23
23
|
import { McpClientManager, loadMcpConfig, autoDetectMcpConfig, mcpToolsToActionEntries, syncMcpActionEntries, mountMcpServersRoutes, mountMcpHubRoutes, buildMergedConfig, startMcpConfigRefresh, areBuiltinMcpCapabilitiesSupported, setBuiltinMcpCapabilityEnabled, getHubStatus, isHubServeEnabled, } from "../mcp-client/index.js";
|
|
24
24
|
import { setProgressPreListHook } from "../progress/store.js";
|
|
25
25
|
import { getFrontmatterValue, getSkillNameFromPath, parseFrontmatter, } from "../resources/metadata.js";
|
|
26
|
-
import { resourceList, resourceListAccessible, resourceGet, resourceGetByPath, ensurePersonalDefaults, SHARED_OWNER, WORKSPACE_OWNER, } from "../resources/store.js";
|
|
26
|
+
import { resourceList, resourceListAccessible, resourceGet, resourceGetByPath, ensurePersonalDefaults, organizationIdFromResourceOwner, sharedResourceOwner, SHARED_OWNER, WORKSPACE_OWNER, } from "../resources/store.js";
|
|
27
27
|
import { normalizeDatabaseToolsMode, } from "../scripts/db/tool-mode.js";
|
|
28
28
|
import { dbExecToolParameters } from "../scripts/db/tool-schemas.js";
|
|
29
29
|
import { getSetting, putSetting } from "../settings/store.js";
|
|
@@ -382,8 +382,9 @@ function getResourceSummaryFromContent(content) {
|
|
|
382
382
|
function resourceScopeForOwner(owner, currentOwner) {
|
|
383
383
|
if (owner === WORKSPACE_OWNER)
|
|
384
384
|
return "workspace";
|
|
385
|
-
if (owner === SHARED_OWNER)
|
|
385
|
+
if (owner === SHARED_OWNER || organizationIdFromResourceOwner(owner)) {
|
|
386
386
|
return "shared";
|
|
387
|
+
}
|
|
387
388
|
if (currentOwner && owner === currentOwner)
|
|
388
389
|
return "personal";
|
|
389
390
|
return "resource";
|
|
@@ -432,29 +433,34 @@ async function loadInstructionResourcesForPrompt(owner, scope, maxChars = SHARED
|
|
|
432
433
|
return [];
|
|
433
434
|
}
|
|
434
435
|
}
|
|
435
|
-
async function loadResourceSkillsPromptBlock(owner) {
|
|
436
|
+
async function loadResourceSkillsPromptBlock(owner, orgId) {
|
|
436
437
|
try {
|
|
438
|
+
const organizationOwner = sharedResourceOwner(orgId);
|
|
437
439
|
const resources = owner === SHARED_OWNER
|
|
438
440
|
? [
|
|
439
441
|
...(await resourceList(SHARED_OWNER, "skills/")),
|
|
440
442
|
...(await resourceList(WORKSPACE_OWNER, "skills/")),
|
|
441
443
|
]
|
|
442
|
-
: await resourceListAccessible(owner, "skills/");
|
|
444
|
+
: await resourceListAccessible(owner, "skills/", { orgId });
|
|
443
445
|
const sorted = resources.sort((a, b) => {
|
|
444
446
|
const ownerOrder = (a.owner === owner
|
|
445
447
|
? 0
|
|
446
|
-
: a.owner ===
|
|
448
|
+
: a.owner === organizationOwner
|
|
447
449
|
? 1
|
|
448
|
-
: a.owner ===
|
|
450
|
+
: a.owner === SHARED_OWNER
|
|
449
451
|
? 2
|
|
450
|
-
:
|
|
452
|
+
: a.owner === WORKSPACE_OWNER
|
|
453
|
+
? 3
|
|
454
|
+
: 4) -
|
|
451
455
|
(b.owner === owner
|
|
452
456
|
? 0
|
|
453
|
-
: b.owner ===
|
|
457
|
+
: b.owner === organizationOwner
|
|
454
458
|
? 1
|
|
455
|
-
: b.owner ===
|
|
459
|
+
: b.owner === SHARED_OWNER
|
|
456
460
|
? 2
|
|
457
|
-
:
|
|
461
|
+
: b.owner === WORKSPACE_OWNER
|
|
462
|
+
? 3
|
|
463
|
+
: 4);
|
|
458
464
|
if (ownerOrder !== 0)
|
|
459
465
|
return ownerOrder;
|
|
460
466
|
return a.path.localeCompare(b.path);
|
|
@@ -1301,7 +1307,7 @@ async function createResourceScriptEntries() {
|
|
|
1301
1307
|
return "Error: promote supports personal or shared scope only";
|
|
1302
1308
|
}
|
|
1303
1309
|
const owner = scope === "shared"
|
|
1304
|
-
? store.
|
|
1310
|
+
? store.sharedResourceOwner(getRequestOrgId())
|
|
1305
1311
|
: (getRequestRunContext()?.owner ??
|
|
1306
1312
|
getRequestUserEmail() ??
|
|
1307
1313
|
process.env.AGENT_USER_EMAIL);
|
|
@@ -1568,7 +1574,7 @@ async function createCallAgentScriptEntry(selfAppId) {
|
|
|
1568
1574
|
function createBuilderBrowserTool(deps) {
|
|
1569
1575
|
const extensionRequestGuidance = deps.extensionTools === false
|
|
1570
1576
|
? "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. "
|
|
1571
|
-
: "Do NOT call this for
|
|
1577
|
+
: "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. ";
|
|
1572
1578
|
const setBuiltinForCurrentUser = async (id, enabled) => {
|
|
1573
1579
|
const email = getRequestUserEmail();
|
|
1574
1580
|
if (!email) {
|
|
@@ -1973,6 +1979,20 @@ function createTeamTools(deps) {
|
|
|
1973
1979
|
},
|
|
1974
1980
|
};
|
|
1975
1981
|
}
|
|
1982
|
+
/**
|
|
1983
|
+
* Run an A2A-delegated agent turn with the same final-response guard used by
|
|
1984
|
+
* the app's interactive chat surface.
|
|
1985
|
+
*
|
|
1986
|
+
* Keeping this in one helper prevents delegated calls from silently bypassing
|
|
1987
|
+
* template guarantees such as Analytics' requirement to query real data
|
|
1988
|
+
* before presenting metrics or exhaustive provider conclusions.
|
|
1989
|
+
*/
|
|
1990
|
+
export function runA2AAgentLoop(runOptions, pluginOptions, timeoutOptions, runner = runAgentLoopDirectWithSoftTimeout) {
|
|
1991
|
+
return runner({
|
|
1992
|
+
...runOptions,
|
|
1993
|
+
finalResponseGuard: pluginOptions.finalResponseGuard,
|
|
1994
|
+
}, pluginOptions.runSoftTimeoutMs, timeoutOptions);
|
|
1995
|
+
}
|
|
1976
1996
|
/**
|
|
1977
1997
|
* Verbose framework sections returned by the `get-framework-context` tool.
|
|
1978
1998
|
* Keyed by topic so the agent can request specific sections.
|
|
@@ -2168,7 +2188,7 @@ function buildFrameworkPrompts(examples, options) {
|
|
|
2168
2188
|
? "`render-inline-extension`, `create-extension`, `update-extension`, `connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data"
|
|
2169
2189
|
: "`connect-builder`, or any action that creates, updates, deletes, sends, publishes, or persists data";
|
|
2170
2190
|
const extensionConnectBuilderGuard = extensionToolsEnabled
|
|
2171
|
-
? "If the request
|
|
2191
|
+
? "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."
|
|
2172
2192
|
: "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.";
|
|
2173
2193
|
const extensionInstructionsFull = extensionToolsEnabled
|
|
2174
2194
|
? `### Generative UI and Extensions (Mini-Apps)
|
|
@@ -2197,7 +2217,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
|
|
|
2197
2217
|
|
|
2198
2218
|
### Extensions vs. Code Changes — Pick the Right Path
|
|
2199
2219
|
|
|
2200
|
-
Route by
|
|
2220
|
+
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.
|
|
2201
2221
|
|
|
2202
2222
|
<routing>
|
|
2203
2223
|
| The request is for… | Path |
|
|
@@ -2207,10 +2227,13 @@ Route by what the request changes, not how it is phrased. Extensions render in t
|
|
|
2207
2227
|
| Loading a saved extension inside chat | \`show-extension-inline\` |
|
|
2208
2228
|
| Editing an existing extension (fix, restyle, rename, add behavior) | \`update-extension\` |
|
|
2209
2229
|
| The host app's own chrome (nav bar, sidebar, layout, routes, shipped components, existing styles, business logic) | \`connect-builder\` — a real source-code change |
|
|
2230
|
+
| UI inside or beside a native component where no named slot exists | \`connect-builder\` — add the native UI or a suitable slot in source |
|
|
2210
2231
|
| Ambiguous, satisfiable either way (e.g. "give me an unread view") | \`render-inline-extension\` for chat-only, \`create-extension\` for reusable |
|
|
2211
2232
|
</routing>
|
|
2212
2233
|
|
|
2213
|
-
|
|
2234
|
+
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.
|
|
2235
|
+
|
|
2236
|
+
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\`.`
|
|
2214
2237
|
: `### Extensions Disabled
|
|
2215
2238
|
|
|
2216
2239
|
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.`;
|
|
@@ -2231,7 +2254,7 @@ For existing extensions, use \`get-extension\` or \`update-extension\` directly
|
|
|
2231
2254
|
|
|
2232
2255
|
### Extensions vs. Code Changes — Pick the Right Path
|
|
2233
2256
|
|
|
2234
|
-
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.
|
|
2257
|
+
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.`
|
|
2235
2258
|
: `### Extensions Disabled
|
|
2236
2259
|
|
|
2237
2260
|
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.`;
|
|
@@ -2355,9 +2378,9 @@ export const _agentChatPromptSectionsForTests = (() => {
|
|
|
2355
2378
|
* 2. `<template>` — AGENTS.md + skills index from the Vite plugin bundle.
|
|
2356
2379
|
* 3. `<workspace>` — SQL workspace AGENTS.md and instructions/*.md.
|
|
2357
2380
|
* Runtime global defaults managed from Dispatch and inherited by apps.
|
|
2358
|
-
* 4. `<
|
|
2359
|
-
*
|
|
2360
|
-
*
|
|
2381
|
+
* 4. `<app-default>` — legacy app-wide SQL defaults.
|
|
2382
|
+
* 5. `<shared>` — organization AGENTS.md, instructions, and LEARNINGS.md.
|
|
2383
|
+
* These are isolated by active org and override app/workspace defaults.
|
|
2361
2384
|
* 6. `<personal>` — memory/MEMORY.md from the SQL personal scope. The
|
|
2362
2385
|
* current user's structured memory index.
|
|
2363
2386
|
*
|
|
@@ -2365,7 +2388,7 @@ export const _agentChatPromptSectionsForTests = (() => {
|
|
|
2365
2388
|
* AGENTS.md and restarting the server is all it takes; Vite HMR invalidates
|
|
2366
2389
|
* the bundle in dev so changes land instantly.
|
|
2367
2390
|
*/
|
|
2368
|
-
export async function loadResourcesForPrompt(owner, compact = false, selfAppId) {
|
|
2391
|
+
export async function loadResourcesForPrompt(owner, compact = false, selfAppId, orgId = getRequestOrgId() ?? null) {
|
|
2369
2392
|
await ensurePersonalDefaults(owner);
|
|
2370
2393
|
const sections = [];
|
|
2371
2394
|
const promptResourceMaxChars = compact
|
|
@@ -2428,13 +2451,25 @@ export async function loadResourcesForPrompt(owner, compact = false, selfAppId)
|
|
|
2428
2451
|
if (workspaceAgents)
|
|
2429
2452
|
sections.push(workspaceAgents);
|
|
2430
2453
|
sections.push(...(await loadInstructionResourcesForPrompt(WORKSPACE_OWNER, "workspace-instruction", promptResourceMaxChars)));
|
|
2431
|
-
|
|
2432
|
-
//
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2454
|
+
const organizationOwner = sharedResourceOwner(orgId);
|
|
2455
|
+
// 4. Legacy app-wide defaults. Existing deployments keep their seeded
|
|
2456
|
+
// shared guidance as an inherited fallback; organization writes never
|
|
2457
|
+
// mutate this owner.
|
|
2458
|
+
const appDefaultAgents = await loadAgentsResourceForPrompt(SHARED_OWNER, organizationOwner === SHARED_OWNER ? "shared" : "app-default", promptResourceMaxChars);
|
|
2459
|
+
if (appDefaultAgents)
|
|
2460
|
+
sections.push(appDefaultAgents);
|
|
2461
|
+
sections.push(...(await loadInstructionResourcesForPrompt(SHARED_OWNER, organizationOwner === SHARED_OWNER
|
|
2462
|
+
? "shared-instruction"
|
|
2463
|
+
: "app-default-instruction", promptResourceMaxChars)));
|
|
2464
|
+
// 5. Active organization resources. These are the durable team rules and
|
|
2465
|
+
// learnings that Slack/integration runs share with interactive app chat.
|
|
2466
|
+
if (organizationOwner !== SHARED_OWNER) {
|
|
2467
|
+
const organizationAgents = await loadAgentsResourceForPrompt(organizationOwner, "shared", promptResourceMaxChars);
|
|
2468
|
+
if (organizationAgents)
|
|
2469
|
+
sections.push(organizationAgents);
|
|
2470
|
+
sections.push(...(await loadInstructionResourcesForPrompt(organizationOwner, "shared-instruction", promptResourceMaxChars)));
|
|
2471
|
+
}
|
|
2472
|
+
// 6. Personal SQL resources. These come last in the instruction stack so a
|
|
2438
2473
|
// user can narrow or override organization/app and workspace defaults.
|
|
2439
2474
|
if (owner !== SHARED_OWNER && owner !== WORKSPACE_OWNER) {
|
|
2440
2475
|
const personalAgents = await loadAgentsResourceForPrompt(owner, "personal", promptResourceMaxChars);
|
|
@@ -2442,25 +2477,41 @@ export async function loadResourcesForPrompt(owner, compact = false, selfAppId)
|
|
|
2442
2477
|
sections.push(personalAgents);
|
|
2443
2478
|
sections.push(...(await loadInstructionResourcesForPrompt(owner, "personal-instruction", promptResourceMaxChars)));
|
|
2444
2479
|
}
|
|
2445
|
-
const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner);
|
|
2480
|
+
const resourceSkillsBlock = await loadResourceSkillsPromptBlock(owner, orgId);
|
|
2446
2481
|
if (resourceSkillsBlock)
|
|
2447
2482
|
sections.push(resourceSkillsBlock);
|
|
2483
|
+
let sharedLearnings = null;
|
|
2484
|
+
try {
|
|
2485
|
+
sharedLearnings =
|
|
2486
|
+
(organizationOwner !== SHARED_OWNER
|
|
2487
|
+
? await resourceGetByPath(organizationOwner, "LEARNINGS.md")
|
|
2488
|
+
: null) ?? (await resourceGetByPath(SHARED_OWNER, "LEARNINGS.md"));
|
|
2489
|
+
}
|
|
2490
|
+
catch { }
|
|
2448
2491
|
if (compact) {
|
|
2449
|
-
//
|
|
2450
|
-
//
|
|
2451
|
-
//
|
|
2452
|
-
|
|
2492
|
+
// Integration/Slack turns use compact context, but organization learnings
|
|
2493
|
+
// are operational routing input, not optional background. Preload the
|
|
2494
|
+
// bounded shared file so canonical destinations/fields are available on
|
|
2495
|
+
// the first turn; keep personal memory on-demand to preserve the compact
|
|
2496
|
+
// budget.
|
|
2497
|
+
if (sharedLearnings?.content?.trim()) {
|
|
2498
|
+
const block = promptResourceBlock({
|
|
2499
|
+
name: "LEARNINGS.md",
|
|
2500
|
+
scope: "shared",
|
|
2501
|
+
path: "LEARNINGS.md",
|
|
2502
|
+
content: sharedLearnings.content,
|
|
2503
|
+
maxChars: COMPACT_PROMPT_RESOURCE_MAX_CHARS,
|
|
2504
|
+
});
|
|
2505
|
+
if (block)
|
|
2506
|
+
sections.push(block);
|
|
2507
|
+
}
|
|
2508
|
+
sections.push(`<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>`);
|
|
2453
2509
|
}
|
|
2454
2510
|
else {
|
|
2455
2511
|
// LEARNINGS.md from SQL (template-level instructions are in AGENTS.md above).
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
const shared = await resourceGetByPath(SHARED_OWNER, "LEARNINGS.md");
|
|
2459
|
-
if (shared?.content?.trim()) {
|
|
2460
|
-
sections.push(`<resource name="LEARNINGS.md" scope="shared">\n${shared.content.trim()}\n</resource>`);
|
|
2461
|
-
}
|
|
2512
|
+
if (sharedLearnings?.content?.trim()) {
|
|
2513
|
+
sections.push(`<resource name="LEARNINGS.md" scope="shared">\n${sharedLearnings.content.trim()}\n</resource>`);
|
|
2462
2514
|
}
|
|
2463
|
-
catch { }
|
|
2464
2515
|
// 3. Personal memory index (skip if owner is the shared sentinel)
|
|
2465
2516
|
if (owner !== SHARED_OWNER) {
|
|
2466
2517
|
try {
|
|
@@ -2475,9 +2526,14 @@ export async function loadResourcesForPrompt(owner, compact = false, selfAppId)
|
|
|
2475
2526
|
const workspaceResourceIndex = await loadResourceIndexForPrompt(WORKSPACE_OWNER, "workspace");
|
|
2476
2527
|
if (workspaceResourceIndex)
|
|
2477
2528
|
sections.push(workspaceResourceIndex);
|
|
2478
|
-
const
|
|
2479
|
-
if (
|
|
2480
|
-
sections.push(
|
|
2529
|
+
const appDefaultResourceIndex = await loadResourceIndexForPrompt(SHARED_OWNER, "shared");
|
|
2530
|
+
if (appDefaultResourceIndex)
|
|
2531
|
+
sections.push(appDefaultResourceIndex);
|
|
2532
|
+
if (organizationOwner !== SHARED_OWNER) {
|
|
2533
|
+
const organizationResourceIndex = await loadResourceIndexForPrompt(organizationOwner, "shared");
|
|
2534
|
+
if (organizationResourceIndex)
|
|
2535
|
+
sections.push(organizationResourceIndex);
|
|
2536
|
+
}
|
|
2481
2537
|
try {
|
|
2482
2538
|
const agents = (await discoverAgents(selfAppId)).slice(0, 30);
|
|
2483
2539
|
if (agents.length > 0) {
|
|
@@ -3519,6 +3575,7 @@ export function createAgentChatPlugin(options) {
|
|
|
3519
3575
|
skills: buildPublicAgentA2ASkills(allScripts),
|
|
3520
3576
|
publicSkillsOnly: true,
|
|
3521
3577
|
streaming: true,
|
|
3578
|
+
durableBackgroundRuns: options?.durableBackgroundRuns,
|
|
3522
3579
|
handler: async function* (message, context) {
|
|
3523
3580
|
// Resolve the caller's identity for user-scoped data access.
|
|
3524
3581
|
// Priority: A2A-JWT verified email (set by the A2A handler in
|
|
@@ -3744,7 +3801,7 @@ export function createAgentChatPlugin(options) {
|
|
|
3744
3801
|
let lastRecoverableArtifactText = "";
|
|
3745
3802
|
const controller = new AbortController();
|
|
3746
3803
|
console.log(`[A2A] Starting agent loop: ${a2aTools.length} tools, prompt ${systemPrompt.length} chars`);
|
|
3747
|
-
await
|
|
3804
|
+
await runA2AAgentLoop({
|
|
3748
3805
|
engine: a2aEngine,
|
|
3749
3806
|
model,
|
|
3750
3807
|
systemPrompt,
|
|
@@ -3789,7 +3846,10 @@ export function createAgentChatPlugin(options) {
|
|
|
3789
3846
|
}
|
|
3790
3847
|
},
|
|
3791
3848
|
signal: controller.signal,
|
|
3792
|
-
},
|
|
3849
|
+
}, {
|
|
3850
|
+
finalResponseGuard: options?.finalResponseGuard,
|
|
3851
|
+
runSoftTimeoutMs: options?.runSoftTimeoutMs,
|
|
3852
|
+
}, {
|
|
3793
3853
|
backgroundFunction: options?.durableBackgroundRuns === true &&
|
|
3794
3854
|
isInBackgroundFunctionRuntime(),
|
|
3795
3855
|
});
|
|
@@ -5738,7 +5798,10 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
5738
5798
|
catch {
|
|
5739
5799
|
// Empty/invalid body — keep the default user abort reason.
|
|
5740
5800
|
}
|
|
5741
|
-
|
|
5801
|
+
// Recovery starts as soon as this response resolves, so wait for
|
|
5802
|
+
// the cross-isolate abort + terminal event to be durable. Returning
|
|
5803
|
+
// early lets Retry collide with the still-running row.
|
|
5804
|
+
await abortRunDurably(runId, reason);
|
|
5742
5805
|
return { ok: true };
|
|
5743
5806
|
}
|
|
5744
5807
|
// Route: GET /runs/:id/background-events
|
|
@@ -5850,6 +5913,26 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
5850
5913
|
// Server clock so the client computes "stuck" elapsed time
|
|
5851
5914
|
// server-relative, immune to client clock skew.
|
|
5852
5915
|
serverNow: Date.now(),
|
|
5916
|
+
// True exactly when this run is a `chainServerDrivenContinuation`
|
|
5917
|
+
// deferral still inside `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS`
|
|
5918
|
+
// — silently recovering server-side via the unclaimed-background-run
|
|
5919
|
+
// sweep(s), never a dead run. See `getActiveRunForThreadAsync`'s doc
|
|
5920
|
+
// comment (run-manager.ts) and the THREE-SITE INVARIANT comments in
|
|
5921
|
+
// agent-chat-plugin.ts / production-agent.ts / agent-chat-adapter.ts.
|
|
5922
|
+
awaitingRedispatch: run.awaitingRedispatch === true,
|
|
5923
|
+
// True exactly when this run holds an open tool call or A2A
|
|
5924
|
+
// `agent_call` delegation (`in_flight_since` set — the same
|
|
5925
|
+
// marker `reapIfStale` reads to grant its bounded stale-reap
|
|
5926
|
+
// grace, see run-store.ts). This is the server-authoritative
|
|
5927
|
+
// signal for "would aborting this run right now destroy live
|
|
5928
|
+
// work" — RunStuckBanner's Retry gating should prefer this
|
|
5929
|
+
// field over its client-side proxy (unresolved `tool-call`
|
|
5930
|
+
// content parts in the local message list), which can go stale
|
|
5931
|
+
// after a reconnect or reader-mode replay. NOTE: this response
|
|
5932
|
+
// object is explicitly field-picked, not spread — a field added
|
|
5933
|
+
// to `getActiveRunForThreadAsync`'s return type does NOT reach
|
|
5934
|
+
// the wire on its own; it must be listed here too.
|
|
5935
|
+
hasInFlightWork: run.hasInFlightWork === true,
|
|
5853
5936
|
};
|
|
5854
5937
|
}
|
|
5855
5938
|
setResponseStatus(event, 405);
|
|
@@ -6658,30 +6741,128 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
6658
6741
|
// turn hangs silently. `chainServerDrivenContinuation` (production-agent.ts)
|
|
6659
6742
|
// leaves exactly such a row behind — status='running', dispatch_mode=
|
|
6660
6743
|
// 'background', `dispatch_payload` intact — when it exhausts its own
|
|
6661
|
-
// dispatch retry budget, instead of erroring it immediately.
|
|
6662
|
-
//
|
|
6663
|
-
//
|
|
6664
|
-
//
|
|
6665
|
-
//
|
|
6666
|
-
//
|
|
6667
|
-
//
|
|
6668
|
-
//
|
|
6669
|
-
//
|
|
6670
|
-
//
|
|
6671
|
-
//
|
|
6672
|
-
//
|
|
6673
|
-
//
|
|
6744
|
+
// dispatch retry budget, instead of erroring it immediately. Two timers
|
|
6745
|
+
// cooperate to recover it, both reading `listUnclaimedBackgroundRunRows`
|
|
6746
|
+
// fresh each tick and gated by `shouldRedispatchUnclaimedBackgroundRun`
|
|
6747
|
+
// (so they always agree on which rows are still eligible):
|
|
6748
|
+
// - the FAST sweep (`UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS`, 20s)
|
|
6749
|
+
// below ONLY attempts redispatch — never reaps — so it puts the
|
|
6750
|
+
// first recovery attempt well inside the client's
|
|
6751
|
+
// `BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS` (see the derived budget on
|
|
6752
|
+
// `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` in run-store.ts).
|
|
6753
|
+
// - the SLOW sweep (2 minutes, immediately below the fast one) is the
|
|
6754
|
+
// one that falls back to the loud reap once
|
|
6755
|
+
// `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` is exceeded; it
|
|
6756
|
+
// also still attempts redispatch itself so a fast-sweep outage
|
|
6757
|
+
// (e.g. a restart between ticks) is not the only path to recovery.
|
|
6758
|
+
// A redispatch is always safe to attempt — even a duplicate, concurrent,
|
|
6759
|
+
// or late-arriving one, including the fast and slow sweeps racing each
|
|
6760
|
+
// other on the SAME row — because the worker's `claimBackgroundRun`
|
|
6761
|
+
// atomic CAS (status='running' AND dispatch_mode='background' ->
|
|
6762
|
+
// 'background-processing') is the sole gate on actual execution; a row
|
|
6763
|
+
// that was already claimed or already reaped by a concurrent path just
|
|
6764
|
+
// loses the CAS and no-ops. Cheap: one indexed-ish query per tick.
|
|
6674
6765
|
//
|
|
6675
6766
|
// THREE-SITE INVARIANT (keep in lockstep): this sweep only ever sees the
|
|
6676
6767
|
// deferred successor because the ~1s client poll in
|
|
6677
6768
|
// `getActiveRunForThreadAsync` (run-manager.ts) skips its own
|
|
6678
6769
|
// `reapUnclaimedBackgroundRun` while the row is within the redispatch
|
|
6679
|
-
// bound (`shouldRedispatchUnclaimedBackgroundRun`).
|
|
6680
|
-
//
|
|
6681
|
-
//
|
|
6682
|
-
//
|
|
6683
|
-
//
|
|
6684
|
-
//
|
|
6770
|
+
// bound (`shouldRedispatchUnclaimedBackgroundRun`). That same client
|
|
6771
|
+
// poll also surfaces `awaitingRedispatch: true` on `/runs/active` for
|
|
6772
|
+
// exactly this state, which `agent-chat-adapter.ts`'s follow loop uses
|
|
6773
|
+
// to stop counting the quiet gap against its own idle timeout. If a
|
|
6774
|
+
// future change makes the client poll reap deferred successors at the
|
|
6775
|
+
// 25s grace again, or stops surfacing `awaitingRedispatch`, both sweeps
|
|
6776
|
+
// here will almost never win the race for connected clients. Do not
|
|
6777
|
+
// edit one site without the others (producer: chainServerDrivenContinuation
|
|
6778
|
+
// in production-agent.ts; guard + wire signal: run-manager.ts; recovery
|
|
6779
|
+
// actors: here).
|
|
6780
|
+
const attemptUnclaimedBackgroundRunRedispatch = async (row) => {
|
|
6781
|
+
const { updateRunHeartbeat } = await import("../agent/run-store.js");
|
|
6782
|
+
const { resolveAgentChatProcessRunDispatchPath } = await import("../agent/durable-background.js");
|
|
6783
|
+
const { fireInternalDispatch } = await import("./self-dispatch.js");
|
|
6784
|
+
// Bump liveness BEFORE attempting the redispatch so the row doesn't
|
|
6785
|
+
// look freshly-stale again the instant this tick returns —
|
|
6786
|
+
// best-effort, the CAS is what actually matters for correctness, not
|
|
6787
|
+
// this timing.
|
|
6788
|
+
await updateRunHeartbeat(row.id).catch(() => { });
|
|
6789
|
+
try {
|
|
6790
|
+
// DELIBERATE: this marker omits `continuationCount`.
|
|
6791
|
+
// `chainServerDrivenContinuation` (production-agent.ts) reads
|
|
6792
|
+
// `backgroundRunMarker.continuationCount` to compute
|
|
6793
|
+
// `backgroundContinuationCount`, defaulting to 0 when absent — so a
|
|
6794
|
+
// chunk recovered here always starts a fresh nested-dispatch
|
|
6795
|
+
// segment at depth 0, regardless of how deep the chain was before
|
|
6796
|
+
// this sweep picked it up. This is what makes the sweep a genuine
|
|
6797
|
+
// CHAIN BREAK, not just a retry: this redispatch fires from an
|
|
6798
|
+
// unrelated, timer-driven invocation rather than from inside the
|
|
6799
|
+
// prior chain's own live execution, so starting its nested-depth
|
|
6800
|
+
// count over at 0 here is correct — see
|
|
6801
|
+
// `MAX_NESTED_SELF_DISPATCH_DEPTH` in production-agent.ts for why
|
|
6802
|
+
// nested depth is bounded and how this reset keeps a long turn
|
|
6803
|
+
// progressing past Netlify's undocumented self-invocation
|
|
6804
|
+
// loop-protection limit instead of dying at it. Do not "fix" this
|
|
6805
|
+
// by adding `continuationCount` back without re-reading that
|
|
6806
|
+
// constant's doc comment.
|
|
6807
|
+
await fireInternalDispatch({
|
|
6808
|
+
path: resolveAgentChatProcessRunDispatchPath(),
|
|
6809
|
+
taskId: row.id,
|
|
6810
|
+
body: {
|
|
6811
|
+
internalContinuation: true,
|
|
6812
|
+
[AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
|
|
6813
|
+
runId: row.id,
|
|
6814
|
+
payloadRef: true,
|
|
6815
|
+
},
|
|
6816
|
+
},
|
|
6817
|
+
awaitResponse: true,
|
|
6818
|
+
responseTimeoutMs: 15_000,
|
|
6819
|
+
});
|
|
6820
|
+
console.error("[agent-chat] redispatched unclaimed background run (handoff recovery):", row.id);
|
|
6821
|
+
}
|
|
6822
|
+
catch (redispatchErr) {
|
|
6823
|
+
console.error("[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):", row.id, redispatchErr instanceof Error
|
|
6824
|
+
? redispatchErr.message
|
|
6825
|
+
: redispatchErr);
|
|
6826
|
+
}
|
|
6827
|
+
};
|
|
6828
|
+
// FAST sweep — redispatch-only, tight cadence. See the invariant
|
|
6829
|
+
// comment above for why this exists and the timing budget in
|
|
6830
|
+
// run-store.ts's `UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS` doc comment.
|
|
6831
|
+
(() => {
|
|
6832
|
+
setTimeout(() => {
|
|
6833
|
+
(async () => {
|
|
6834
|
+
const { UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS } = await import("../agent/run-store.js");
|
|
6835
|
+
setInterval(() => {
|
|
6836
|
+
(async () => {
|
|
6837
|
+
const { listUnclaimedBackgroundRunRows, shouldRedispatchUnclaimedBackgroundRun, } = await import("../agent/run-store.js");
|
|
6838
|
+
let rows;
|
|
6839
|
+
try {
|
|
6840
|
+
rows = await listUnclaimedBackgroundRunRows();
|
|
6841
|
+
}
|
|
6842
|
+
catch {
|
|
6843
|
+
return; // Table may not exist yet on first boot
|
|
6844
|
+
}
|
|
6845
|
+
for (const row of rows) {
|
|
6846
|
+
if (!shouldRedispatchUnclaimedBackgroundRun(row))
|
|
6847
|
+
continue;
|
|
6848
|
+
await attemptUnclaimedBackgroundRunRedispatch(row).catch(() => { });
|
|
6849
|
+
}
|
|
6850
|
+
})().catch(() => {
|
|
6851
|
+
// best-effort — never break the server
|
|
6852
|
+
});
|
|
6853
|
+
}, UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS);
|
|
6854
|
+
})().catch(() => {
|
|
6855
|
+
// best-effort — if run-store fails to load, the slow sweep below
|
|
6856
|
+
// still provides eventual (loud) recovery.
|
|
6857
|
+
});
|
|
6858
|
+
}, 10_000); // Start 10s after init — before the slow sweep's first tick.
|
|
6859
|
+
})();
|
|
6860
|
+
// SLOW sweep — redispatch AND the loud-failure reap fallback past the
|
|
6861
|
+
// redispatch bound. Kept on its original 2-minute cadence: it is not
|
|
6862
|
+
// the latency-critical path anymore (the fast sweep above is), it is
|
|
6863
|
+
// the correctness backstop that guarantees a genuinely lost handoff
|
|
6864
|
+
// still fails loud, and it survives the fast sweep having missed a row
|
|
6865
|
+
// entirely (e.g. a restart landed between fast-sweep ticks).
|
|
6685
6866
|
(() => {
|
|
6686
6867
|
let lastSweep = 0;
|
|
6687
6868
|
const SWEEP_INTERVAL_MS = 2 * 60 * 1000;
|
|
@@ -6692,9 +6873,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
6692
6873
|
return;
|
|
6693
6874
|
lastSweep = now;
|
|
6694
6875
|
(async () => {
|
|
6695
|
-
const { listUnclaimedBackgroundRunRows, reapUnclaimedBackgroundRun,
|
|
6696
|
-
const { resolveAgentChatProcessRunDispatchPath } = await import("../agent/durable-background.js");
|
|
6697
|
-
const { fireInternalDispatch } = await import("./self-dispatch.js");
|
|
6876
|
+
const { listUnclaimedBackgroundRunRows, reapUnclaimedBackgroundRun, shouldRedispatchUnclaimedBackgroundRun, } = await import("../agent/run-store.js");
|
|
6698
6877
|
let rows;
|
|
6699
6878
|
try {
|
|
6700
6879
|
rows = await listUnclaimedBackgroundRunRows();
|
|
@@ -6705,51 +6884,7 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
|
|
|
6705
6884
|
for (const row of rows) {
|
|
6706
6885
|
try {
|
|
6707
6886
|
if (shouldRedispatchUnclaimedBackgroundRun(row)) {
|
|
6708
|
-
|
|
6709
|
-
// row doesn't look freshly-stale again the instant this
|
|
6710
|
-
// tick returns — best-effort, the CAS is what actually
|
|
6711
|
-
// matters for correctness, not this timing.
|
|
6712
|
-
await updateRunHeartbeat(row.id).catch(() => { });
|
|
6713
|
-
try {
|
|
6714
|
-
// DELIBERATE: this marker omits `continuationCount`.
|
|
6715
|
-
// `chainServerDrivenContinuation` (production-agent.ts)
|
|
6716
|
-
// reads `backgroundRunMarker.continuationCount` to
|
|
6717
|
-
// compute `backgroundContinuationCount`, defaulting to 0
|
|
6718
|
-
// when absent — so a chunk recovered here always starts
|
|
6719
|
-
// a fresh nested-dispatch segment at depth 0, regardless
|
|
6720
|
-
// of how deep the chain was before this sweep picked it
|
|
6721
|
-
// up. This is what makes the sweep a genuine CHAIN
|
|
6722
|
-
// BREAK, not just a retry: this redispatch fires from an
|
|
6723
|
-
// unrelated, timer-driven invocation rather than from
|
|
6724
|
-
// inside the prior chain's own live execution, so
|
|
6725
|
-
// starting its nested-depth count over at 0 here is
|
|
6726
|
-
// correct — see `MAX_NESTED_SELF_DISPATCH_DEPTH` in
|
|
6727
|
-
// production-agent.ts for why nested depth is bounded
|
|
6728
|
-
// and how this reset keeps a long turn progressing past
|
|
6729
|
-
// Netlify's undocumented self-invocation loop-protection
|
|
6730
|
-
// limit instead of dying at it. Do not "fix" this by
|
|
6731
|
-
// adding `continuationCount` back without re-reading
|
|
6732
|
-
// that constant's doc comment.
|
|
6733
|
-
await fireInternalDispatch({
|
|
6734
|
-
path: resolveAgentChatProcessRunDispatchPath(),
|
|
6735
|
-
taskId: row.id,
|
|
6736
|
-
body: {
|
|
6737
|
-
internalContinuation: true,
|
|
6738
|
-
[AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
|
|
6739
|
-
runId: row.id,
|
|
6740
|
-
payloadRef: true,
|
|
6741
|
-
},
|
|
6742
|
-
},
|
|
6743
|
-
awaitResponse: true,
|
|
6744
|
-
responseTimeoutMs: 15_000,
|
|
6745
|
-
});
|
|
6746
|
-
console.error("[agent-chat] redispatched unclaimed background run (handoff recovery):", row.id);
|
|
6747
|
-
}
|
|
6748
|
-
catch (redispatchErr) {
|
|
6749
|
-
console.error("[agent-chat] unclaimed background run redispatch attempt failed (retrying until the redispatch bound, then reaping):", row.id, redispatchErr instanceof Error
|
|
6750
|
-
? redispatchErr.message
|
|
6751
|
-
: redispatchErr);
|
|
6752
|
-
}
|
|
6887
|
+
await attemptUnclaimedBackgroundRunRedispatch(row);
|
|
6753
6888
|
continue;
|
|
6754
6889
|
}
|
|
6755
6890
|
// Redispatch bound exceeded — this handoff is not
|