@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
|
@@ -89,6 +89,82 @@ export declare const UNCLAIMED_BACKGROUND_RUN_GRACE_MS = 25000;
|
|
|
89
89
|
* bound how long a real user turn is worth waiting on before failing loud.
|
|
90
90
|
*/
|
|
91
91
|
export declare const UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS: number;
|
|
92
|
+
/**
|
|
93
|
+
* Tick interval for the DEDICATED fast redispatch sweep in
|
|
94
|
+
* agent-chat-plugin.ts (distinct from that file's general-purpose 2-minute
|
|
95
|
+
* orphan/reap sweep). Only attempts redispatch for rows still inside
|
|
96
|
+
* `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` — it never reaps, so it
|
|
97
|
+
* cannot race the loud-failure fallback onto an earlier trigger.
|
|
98
|
+
*
|
|
99
|
+
* This constant exists because the general sweep's 2-minute cadence puts the
|
|
100
|
+
* FIRST redispatch attempt uncomfortably close to (and on a slow tick, past)
|
|
101
|
+
* `BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS` (150s, agent-chat-adapter.ts) — the
|
|
102
|
+
* client following a deferred successor would give up and report a fatal
|
|
103
|
+
* error for a turn the server was silently about to recover. The whole
|
|
104
|
+
* budget is a derived chain, each bound following from the one before it:
|
|
105
|
+
*
|
|
106
|
+
* UNCLAIMED_BACKGROUND_RUN_GRACE_MS (25s) row must look abandoned
|
|
107
|
+
* + UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS (20s) worst-case tick latency
|
|
108
|
+
* = ~45s worst-case time-to-first-redispatch-attempt, ~65s to a second
|
|
109
|
+
* attempt if the first fails — both comfortably under the client's 150s
|
|
110
|
+
* idle timeout, which additionally no longer counts a known-deferred row
|
|
111
|
+
* against its idle window at all (see `awaitingRedispatch` surfaced by
|
|
112
|
+
* `/runs/active` and consumed by the client follow loop).
|
|
113
|
+
* < BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS (150s) client's own backstop
|
|
114
|
+
* < UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS (300s) hard, unresettable
|
|
115
|
+
* ceiling — untouched by this constant — past which the slow sweep's
|
|
116
|
+
* existing loud reap (`background_worker_never_started`) still fires.
|
|
117
|
+
*/
|
|
118
|
+
export declare const UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS = 20000;
|
|
119
|
+
/**
|
|
120
|
+
* Maximum time the stale reapers (`reapIfStale`, `reapAllStaleRuns`,
|
|
121
|
+
* `cleanupOldRuns`'s heartbeat-stale pass) will suspend reaping a "running"
|
|
122
|
+
* row that is marked in-flight (`in_flight_since`, see `setRunInFlightMarker`)
|
|
123
|
+
* even though its heartbeat/progress liveness basis
|
|
124
|
+
* (`livenessBasisSql`/`backgroundAwareStaleCutoffSql`) has gone stale.
|
|
125
|
+
*
|
|
126
|
+
* WHY a marker column at all: `inFlightWorkCount` in run-manager.ts (the
|
|
127
|
+
* no-progress backstop's guard) is in-memory, per-isolate — but all three
|
|
128
|
+
* reapers above can run in a DIFFERENT isolate than the one holding the
|
|
129
|
+
* producing run (a client's SQL-subscription poll, a sibling isolate's
|
|
130
|
+
* opportunistic `cleanupOldRuns` after ITS OWN run completes, or a fresh
|
|
131
|
+
* boot's `reapAllStaleRuns`). None of them can read another isolate's
|
|
132
|
+
* in-memory counter, so the counter's 0->1 / 1->0 transitions are mirrored
|
|
133
|
+
* into this column (`setRunInFlightMarker`, called from
|
|
134
|
+
* run-manager.ts's `trackInFlightWork`) so it is observable from SQL. This is
|
|
135
|
+
* exactly the gap that let a demonstrably-alive run holding a long tool call
|
|
136
|
+
* or A2A `call-agent` delegation get reaped: the heartbeat WRITE can fail
|
|
137
|
+
* silently (Neon pooler saturation) for the whole `BACKGROUND_RUN_STALE_MS`
|
|
138
|
+
* window while the run is provably still doing work.
|
|
139
|
+
*
|
|
140
|
+
* BOUNDED, not a silent hang — derived from two independent ceilings already
|
|
141
|
+
* in the codebase, not picked by feel:
|
|
142
|
+
* - `DEFAULT_TOOL_TIMEOUT_MS` (12 min, production-agent.ts) is the longest
|
|
143
|
+
* any SINGLE tool call or `agent_call` (A2A delegation) may legitimately
|
|
144
|
+
* stay in flight — past that its own `AbortSignal.timeout` forces a
|
|
145
|
+
* tool_done/error and clears the marker.
|
|
146
|
+
* - `BACKGROUND_SOFT_TIMEOUT_CEILING_MS` (13 min, run-manager.ts) is the
|
|
147
|
+
* background chunk's OWN soft-timeout ceiling. Unlike the no-progress
|
|
148
|
+
* backstop, this timer is NOT gated on in-flight work (see the "secondary"
|
|
149
|
+
* hazard documented next to the soft-timeout timer in run-manager.ts) —
|
|
150
|
+
* it fires unconditionally and checkpoints/continues the run, so by 13
|
|
151
|
+
* minutes the row leaves status='running' via that path regardless of
|
|
152
|
+
* what the marker says.
|
|
153
|
+
* This grace is the LARGER of the two (13 min) plus one `BACKGROUND_RUN_STALE_MS`
|
|
154
|
+
* (90s) buffer for that checkpoint's own completion write to land under the
|
|
155
|
+
* same DB pressure that could have caused the heartbeat to lapse in the first
|
|
156
|
+
* place: 780_000 + 90_000 = 870_000ms (14.5 min). Past that, a "running" row
|
|
157
|
+
* that still shows in-flight work AND a stale liveness basis is not a slow
|
|
158
|
+
* producer anymore — every backstop that should have ended it has ALSO failed
|
|
159
|
+
* to write, and it is reaped loud like any other stale run.
|
|
160
|
+
*
|
|
161
|
+
* Never applied when a caller passes an explicit `maxStaleMs` override to
|
|
162
|
+
* `reapIfStale` — that escape hatch is an exact, caller-chosen window and
|
|
163
|
+
* stays exact. Never weakens the no-in-flight case: a row with no marker set
|
|
164
|
+
* evaluates this grace clause to a no-op and is reaped at the original
|
|
165
|
+
* `BACKGROUND_RUN_STALE_MS` / `RUN_STALE_MS` exactly as before.
|
|
166
|
+
*/
|
|
167
|
+
export declare const IN_FLIGHT_RUN_STALE_GRACE_MS: number;
|
|
92
168
|
/**
|
|
93
169
|
* Persist a zombie tool-call completion to the ledger. Called by the detached
|
|
94
170
|
* promise continuation after `Promise.race` abandons it. Best-effort — never
|
|
@@ -321,6 +397,28 @@ export declare function updateRunHeartbeat(runId: string): Promise<void>;
|
|
|
321
397
|
* "process dead." Callers should throttle (run-manager debounces to ~1/s).
|
|
322
398
|
*/
|
|
323
399
|
export declare function bumpRunProgress(runId: string): Promise<void>;
|
|
400
|
+
/**
|
|
401
|
+
* Mirror run-manager's in-memory `inFlightWorkCount` 0<->N transitions into
|
|
402
|
+
* SQL so a stale reaper running in a DIFFERENT isolate can tell a
|
|
403
|
+
* demonstrably-alive run (holding a tool call or A2A `agent_call` delegation)
|
|
404
|
+
* apart from a genuinely dead one — see `IN_FLIGHT_RUN_STALE_GRACE_MS`'s doc
|
|
405
|
+
* comment for the full reasoning.
|
|
406
|
+
*
|
|
407
|
+
* `inFlight: true` only writes when the row is still `NULL` — a defense-in-
|
|
408
|
+
* depth belt-and-suspenders against a nested 1->2 transition clobbering the
|
|
409
|
+
* ORIGINAL start time with a later one (the caller's own counter already
|
|
410
|
+
* dedupes 0->1 transitions; this WHERE just makes the write itself
|
|
411
|
+
* idempotent/order-independent too). `inFlight: false` always clears
|
|
412
|
+
* unconditionally — if it races a fresh 0->1 write from a *different* tool
|
|
413
|
+
* finishing/starting back to back, worst case is losing a few seconds of
|
|
414
|
+
* grace, never gaining an incorrect one.
|
|
415
|
+
*
|
|
416
|
+
* Best-effort: callers fire-and-forget (`.catch(() => {})`) so a write
|
|
417
|
+
* failure here never blocks event emission or aborts the run. If this write
|
|
418
|
+
* itself fails (the same DB pressure that could be starving the heartbeat),
|
|
419
|
+
* the row simply gets no grace — never worse than today's behavior.
|
|
420
|
+
*/
|
|
421
|
+
export declare function setRunInFlightMarker(runId: string, inFlight: boolean): Promise<void>;
|
|
324
422
|
/**
|
|
325
423
|
* If the given run is marked "running" in SQL but its heartbeat is stale
|
|
326
424
|
* (producer likely crashed), flip it to "errored" so watchers stop waiting.
|
|
@@ -416,6 +514,17 @@ export declare function getRunByThread(threadId: string, options?: {
|
|
|
416
514
|
dispatchMode: string | null;
|
|
417
515
|
terminalReason: string | null;
|
|
418
516
|
diagStage: string | null;
|
|
517
|
+
/**
|
|
518
|
+
* Raw `in_flight_since` marker (see `setRunInFlightMarker`) — non-null
|
|
519
|
+
* exactly when run-manager's in-memory `inFlightWorkCount` was last known
|
|
520
|
+
* (from THIS row's own producer) to be > 0: a tool call or A2A `agent_call`
|
|
521
|
+
* delegation is open and has not yet resolved. Callers that want the
|
|
522
|
+
* authoritative "does this run currently hold live work" signal (e.g. the
|
|
523
|
+
* `hasInFlightWork` wire field on `/runs/active`) should test this for
|
|
524
|
+
* non-null, not re-derive their own notion of in-flight — see
|
|
525
|
+
* `getActiveRunForThreadAsync` in run-manager.ts.
|
|
526
|
+
*/
|
|
527
|
+
inFlightSince: number | null;
|
|
419
528
|
} | null>;
|
|
420
529
|
export interface AgentRunSummary {
|
|
421
530
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/agent/run-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/agent/run-store.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/run-store.js
CHANGED
|
@@ -7,6 +7,7 @@ import { getDbExec, intType, isPostgres } from "../db/client.js";
|
|
|
7
7
|
import { ensureColumnExists, ensureTableExists } from "../db/ddl-guard.js";
|
|
8
8
|
import { widenIntColumnsToBigInt } from "../db/widen-columns.js";
|
|
9
9
|
import { captureError } from "../server/capture-error.js";
|
|
10
|
+
import { LLM_MISSING_CREDENTIALS_ERROR_CODE, LLM_MISSING_CREDENTIALS_MESSAGE, } from "./engine/credential-errors.js";
|
|
10
11
|
let _initPromise;
|
|
11
12
|
/**
|
|
12
13
|
* Max time without a heartbeat before a "running" run is considered dead.
|
|
@@ -98,6 +99,82 @@ export const UNCLAIMED_BACKGROUND_RUN_GRACE_MS = 25_000;
|
|
|
98
99
|
* bound how long a real user turn is worth waiting on before failing loud.
|
|
99
100
|
*/
|
|
100
101
|
export const UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS = 5 * 60_000;
|
|
102
|
+
/**
|
|
103
|
+
* Tick interval for the DEDICATED fast redispatch sweep in
|
|
104
|
+
* agent-chat-plugin.ts (distinct from that file's general-purpose 2-minute
|
|
105
|
+
* orphan/reap sweep). Only attempts redispatch for rows still inside
|
|
106
|
+
* `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` — it never reaps, so it
|
|
107
|
+
* cannot race the loud-failure fallback onto an earlier trigger.
|
|
108
|
+
*
|
|
109
|
+
* This constant exists because the general sweep's 2-minute cadence puts the
|
|
110
|
+
* FIRST redispatch attempt uncomfortably close to (and on a slow tick, past)
|
|
111
|
+
* `BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS` (150s, agent-chat-adapter.ts) — the
|
|
112
|
+
* client following a deferred successor would give up and report a fatal
|
|
113
|
+
* error for a turn the server was silently about to recover. The whole
|
|
114
|
+
* budget is a derived chain, each bound following from the one before it:
|
|
115
|
+
*
|
|
116
|
+
* UNCLAIMED_BACKGROUND_RUN_GRACE_MS (25s) row must look abandoned
|
|
117
|
+
* + UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS (20s) worst-case tick latency
|
|
118
|
+
* = ~45s worst-case time-to-first-redispatch-attempt, ~65s to a second
|
|
119
|
+
* attempt if the first fails — both comfortably under the client's 150s
|
|
120
|
+
* idle timeout, which additionally no longer counts a known-deferred row
|
|
121
|
+
* against its idle window at all (see `awaitingRedispatch` surfaced by
|
|
122
|
+
* `/runs/active` and consumed by the client follow loop).
|
|
123
|
+
* < BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS (150s) client's own backstop
|
|
124
|
+
* < UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS (300s) hard, unresettable
|
|
125
|
+
* ceiling — untouched by this constant — past which the slow sweep's
|
|
126
|
+
* existing loud reap (`background_worker_never_started`) still fires.
|
|
127
|
+
*/
|
|
128
|
+
export const UNCLAIMED_BACKGROUND_RUN_FAST_SWEEP_MS = 20_000;
|
|
129
|
+
/**
|
|
130
|
+
* Maximum time the stale reapers (`reapIfStale`, `reapAllStaleRuns`,
|
|
131
|
+
* `cleanupOldRuns`'s heartbeat-stale pass) will suspend reaping a "running"
|
|
132
|
+
* row that is marked in-flight (`in_flight_since`, see `setRunInFlightMarker`)
|
|
133
|
+
* even though its heartbeat/progress liveness basis
|
|
134
|
+
* (`livenessBasisSql`/`backgroundAwareStaleCutoffSql`) has gone stale.
|
|
135
|
+
*
|
|
136
|
+
* WHY a marker column at all: `inFlightWorkCount` in run-manager.ts (the
|
|
137
|
+
* no-progress backstop's guard) is in-memory, per-isolate — but all three
|
|
138
|
+
* reapers above can run in a DIFFERENT isolate than the one holding the
|
|
139
|
+
* producing run (a client's SQL-subscription poll, a sibling isolate's
|
|
140
|
+
* opportunistic `cleanupOldRuns` after ITS OWN run completes, or a fresh
|
|
141
|
+
* boot's `reapAllStaleRuns`). None of them can read another isolate's
|
|
142
|
+
* in-memory counter, so the counter's 0->1 / 1->0 transitions are mirrored
|
|
143
|
+
* into this column (`setRunInFlightMarker`, called from
|
|
144
|
+
* run-manager.ts's `trackInFlightWork`) so it is observable from SQL. This is
|
|
145
|
+
* exactly the gap that let a demonstrably-alive run holding a long tool call
|
|
146
|
+
* or A2A `call-agent` delegation get reaped: the heartbeat WRITE can fail
|
|
147
|
+
* silently (Neon pooler saturation) for the whole `BACKGROUND_RUN_STALE_MS`
|
|
148
|
+
* window while the run is provably still doing work.
|
|
149
|
+
*
|
|
150
|
+
* BOUNDED, not a silent hang — derived from two independent ceilings already
|
|
151
|
+
* in the codebase, not picked by feel:
|
|
152
|
+
* - `DEFAULT_TOOL_TIMEOUT_MS` (12 min, production-agent.ts) is the longest
|
|
153
|
+
* any SINGLE tool call or `agent_call` (A2A delegation) may legitimately
|
|
154
|
+
* stay in flight — past that its own `AbortSignal.timeout` forces a
|
|
155
|
+
* tool_done/error and clears the marker.
|
|
156
|
+
* - `BACKGROUND_SOFT_TIMEOUT_CEILING_MS` (13 min, run-manager.ts) is the
|
|
157
|
+
* background chunk's OWN soft-timeout ceiling. Unlike the no-progress
|
|
158
|
+
* backstop, this timer is NOT gated on in-flight work (see the "secondary"
|
|
159
|
+
* hazard documented next to the soft-timeout timer in run-manager.ts) —
|
|
160
|
+
* it fires unconditionally and checkpoints/continues the run, so by 13
|
|
161
|
+
* minutes the row leaves status='running' via that path regardless of
|
|
162
|
+
* what the marker says.
|
|
163
|
+
* This grace is the LARGER of the two (13 min) plus one `BACKGROUND_RUN_STALE_MS`
|
|
164
|
+
* (90s) buffer for that checkpoint's own completion write to land under the
|
|
165
|
+
* same DB pressure that could have caused the heartbeat to lapse in the first
|
|
166
|
+
* place: 780_000 + 90_000 = 870_000ms (14.5 min). Past that, a "running" row
|
|
167
|
+
* that still shows in-flight work AND a stale liveness basis is not a slow
|
|
168
|
+
* producer anymore — every backstop that should have ended it has ALSO failed
|
|
169
|
+
* to write, and it is reaped loud like any other stale run.
|
|
170
|
+
*
|
|
171
|
+
* Never applied when a caller passes an explicit `maxStaleMs` override to
|
|
172
|
+
* `reapIfStale` — that escape hatch is an exact, caller-chosen window and
|
|
173
|
+
* stays exact. Never weakens the no-in-flight case: a row with no marker set
|
|
174
|
+
* evaluates this grace clause to a no-op and is reaped at the original
|
|
175
|
+
* `BACKGROUND_RUN_STALE_MS` / `RUN_STALE_MS` exactly as before.
|
|
176
|
+
*/
|
|
177
|
+
export const IN_FLIGHT_RUN_STALE_GRACE_MS = 14.5 * 60_000; // 870_000
|
|
101
178
|
async function ensureRunTables() {
|
|
102
179
|
if (!_initPromise) {
|
|
103
180
|
_initPromise = (async () => {
|
|
@@ -203,6 +280,14 @@ async function ensureRunTables() {
|
|
|
203
280
|
// rehydrates the body from this column via the marker's payloadRef.
|
|
204
281
|
// Cleared on terminal status writes.
|
|
205
282
|
["dispatch_payload", "TEXT"],
|
|
283
|
+
// in_flight_since = ms epoch when run-manager's in-memory
|
|
284
|
+
// `inFlightWorkCount` last transitioned 0->1 (a tool call or nested
|
|
285
|
+
// `agent_call`/A2A delegation started), NULL once it drops back to 0.
|
|
286
|
+
// Lets the cross-isolate stale reapers grant a bounded grace to a
|
|
287
|
+
// demonstrably-alive run even when the SAME-isolate heartbeat write
|
|
288
|
+
// has failed. See `IN_FLIGHT_RUN_STALE_GRACE_MS` and
|
|
289
|
+
// `setRunInFlightMarker`.
|
|
290
|
+
["in_flight_since", intType()],
|
|
206
291
|
]) {
|
|
207
292
|
await ensureColumnExists("agent_runs", col, `ALTER TABLE agent_runs ADD COLUMN IF NOT EXISTS ${col} ${colType}`);
|
|
208
293
|
}
|
|
@@ -220,6 +305,7 @@ async function ensureRunTables() {
|
|
|
220
305
|
"completed_at",
|
|
221
306
|
"heartbeat_at",
|
|
222
307
|
"last_progress_at",
|
|
308
|
+
"in_flight_since",
|
|
223
309
|
]);
|
|
224
310
|
await widenIntColumnsToBigInt("agent_run_events", ["event_at"]);
|
|
225
311
|
await widenIntColumnsToBigInt("agent_tool_ledger", ["completed_at"]);
|
|
@@ -252,6 +338,17 @@ async function ensureRunTables() {
|
|
|
252
338
|
catch {
|
|
253
339
|
// Column already exists — ignore
|
|
254
340
|
}
|
|
341
|
+
// Backfill in_flight_since — ms epoch when run-manager's in-memory
|
|
342
|
+
// `inFlightWorkCount` last transitioned 0->1, NULL once back to 0. Lets
|
|
343
|
+
// the cross-isolate stale reapers grant a bounded grace to a
|
|
344
|
+
// demonstrably-alive run even when the heartbeat write itself has
|
|
345
|
+
// failed. See `IN_FLIGHT_RUN_STALE_GRACE_MS` and `setRunInFlightMarker`.
|
|
346
|
+
try {
|
|
347
|
+
await client.execute(`ALTER TABLE agent_runs ADD COLUMN in_flight_since ${intType()}`);
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
// Column already exists — ignore
|
|
351
|
+
}
|
|
255
352
|
// Backfill turn_id / error_code / error_detail.
|
|
256
353
|
// turn_id = stable identity for one logical assistant turn that may
|
|
257
354
|
// span several continuation runs, so the durable record
|
|
@@ -305,6 +402,7 @@ async function ensureRunTables() {
|
|
|
305
402
|
"completed_at",
|
|
306
403
|
"heartbeat_at",
|
|
307
404
|
"last_progress_at",
|
|
405
|
+
"in_flight_since",
|
|
308
406
|
]);
|
|
309
407
|
await widenIntColumnsToBigInt("agent_run_events", ["event_at"]);
|
|
310
408
|
await widenIntColumnsToBigInt("agent_tool_ledger", ["completed_at"]);
|
|
@@ -467,6 +565,22 @@ function terminalRunEventExclusionSql(runIdColumn = "id") {
|
|
|
467
565
|
function livenessBasisSql() {
|
|
468
566
|
return `(CASE WHEN COALESCE(last_progress_at, started_at) > COALESCE(heartbeat_at, started_at) THEN COALESCE(last_progress_at, started_at) ELSE COALESCE(heartbeat_at, started_at) END)`;
|
|
469
567
|
}
|
|
568
|
+
/**
|
|
569
|
+
* Additive grace clause for the default (no explicit `maxStaleMs` override)
|
|
570
|
+
* heartbeat/liveness-based stale reap conditions — TRUE (row remains eligible
|
|
571
|
+
* for the surrounding staleness check) unless `in_flight_since` is set AND
|
|
572
|
+
* still inside `IN_FLIGHT_RUN_STALE_GRACE_MS`. A row with no marker set
|
|
573
|
+
* (`in_flight_since IS NULL`, the common case and every pre-existing row
|
|
574
|
+
* before this migration) always evaluates TRUE here, so this can only make
|
|
575
|
+
* reaping MORE conservative — the no-in-flight `BACKGROUND_RUN_STALE_MS` /
|
|
576
|
+
* `RUN_STALE_MS` behavior is unchanged. See `IN_FLIGHT_RUN_STALE_GRACE_MS`'s
|
|
577
|
+
* doc comment for why this is sound and bounded.
|
|
578
|
+
*
|
|
579
|
+
* Binds one param: the same `now` value the surrounding cutoff clause binds.
|
|
580
|
+
*/
|
|
581
|
+
function inFlightGraceSql() {
|
|
582
|
+
return `(in_flight_since IS NULL OR in_flight_since <= (CAST(? AS BIGINT) - ${IN_FLIGHT_RUN_STALE_GRACE_MS}))`;
|
|
583
|
+
}
|
|
470
584
|
/**
|
|
471
585
|
* Atomically claim a background-dispatched run for processing. The foreground
|
|
472
586
|
* POST inserts the run row with `dispatch_mode = 'background'`; the FIRST
|
|
@@ -767,8 +881,9 @@ export async function setRunTerminalReason(runId, terminalReason) {
|
|
|
767
881
|
function terminalStatusForEvent(event) {
|
|
768
882
|
if (event.type === "error")
|
|
769
883
|
return "errored";
|
|
884
|
+
if (event.type === "missing_api_key")
|
|
885
|
+
return "errored";
|
|
770
886
|
if (event.type === "done" ||
|
|
771
|
-
event.type === "missing_api_key" ||
|
|
772
887
|
event.type === "loop_limit" ||
|
|
773
888
|
event.type === "auto_continue") {
|
|
774
889
|
return "completed";
|
|
@@ -788,26 +903,73 @@ function terminalReasonForEvent(event) {
|
|
|
788
903
|
return "done";
|
|
789
904
|
return null;
|
|
790
905
|
}
|
|
791
|
-
|
|
906
|
+
function isRealFailureTerminalEvent(event) {
|
|
907
|
+
if (event.type === "missing_api_key")
|
|
908
|
+
return true;
|
|
909
|
+
if (event.type !== "error")
|
|
910
|
+
return false;
|
|
911
|
+
return event.errorCode !== STALE_RUN_ERROR_EVENT.errorCode;
|
|
912
|
+
}
|
|
913
|
+
const RUN_RECONCILIATION_TERMINAL_EVENT_LIMIT = 100;
|
|
914
|
+
async function getRunEventForReconciliation(runId) {
|
|
792
915
|
const client = getDbExec();
|
|
793
916
|
const { rows } = await client.execute({
|
|
794
|
-
sql: `SELECT seq, event_data, event_at
|
|
795
|
-
|
|
917
|
+
sql: `SELECT seq, event_data, event_at
|
|
918
|
+
FROM agent_run_events
|
|
919
|
+
WHERE run_id = ?
|
|
920
|
+
AND (
|
|
921
|
+
event_data LIKE '{"type":"done"%'
|
|
922
|
+
OR event_data LIKE '{"type":"error"%'
|
|
923
|
+
OR event_data LIKE '{"type":"missing_api_key"%'
|
|
924
|
+
OR event_data LIKE '{"type":"loop_limit"%'
|
|
925
|
+
OR event_data LIKE '{"type":"auto_continue"%'
|
|
926
|
+
)
|
|
927
|
+
ORDER BY seq DESC
|
|
928
|
+
LIMIT ?`,
|
|
929
|
+
args: [runId, RUN_RECONCILIATION_TERMINAL_EVENT_LIMIT],
|
|
796
930
|
});
|
|
797
|
-
|
|
798
|
-
const
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
event
|
|
805
|
-
|
|
806
|
-
|
|
931
|
+
let latestTerminal = null;
|
|
932
|
+
for (const row of rows) {
|
|
933
|
+
const raw = row.event_data;
|
|
934
|
+
if (!raw)
|
|
935
|
+
continue;
|
|
936
|
+
try {
|
|
937
|
+
const event = JSON.parse(raw);
|
|
938
|
+
if (!terminalStatusForEvent(event) || !terminalReasonForEvent(event)) {
|
|
939
|
+
continue;
|
|
940
|
+
}
|
|
941
|
+
const rawEventAt = row.event_at == null ? NaN : Number(row.event_at);
|
|
942
|
+
const parsed = {
|
|
943
|
+
event,
|
|
944
|
+
eventAt: Number.isFinite(rawEventAt) && rawEventAt > 0 ? rawEventAt : null,
|
|
945
|
+
};
|
|
946
|
+
if (!latestTerminal)
|
|
947
|
+
latestTerminal = parsed;
|
|
948
|
+
// A real stream failure must not be laundered into success by a later
|
|
949
|
+
// done/continuation boundary. Keep the synthetic stale-run error special:
|
|
950
|
+
// that repair marker may be superseded by a later durable done event.
|
|
951
|
+
if (isRealFailureTerminalEvent(event))
|
|
952
|
+
return parsed;
|
|
953
|
+
}
|
|
954
|
+
catch {
|
|
955
|
+
continue;
|
|
956
|
+
}
|
|
807
957
|
}
|
|
808
|
-
|
|
958
|
+
return latestTerminal;
|
|
959
|
+
}
|
|
960
|
+
function errorCodeForTerminalEvent(event) {
|
|
961
|
+
if (event.type === "missing_api_key")
|
|
962
|
+
return LLM_MISSING_CREDENTIALS_ERROR_CODE;
|
|
963
|
+
if (event.type === "error")
|
|
964
|
+
return event.errorCode ?? null;
|
|
965
|
+
return null;
|
|
966
|
+
}
|
|
967
|
+
function errorDetailForTerminalEvent(event) {
|
|
968
|
+
if (event.type === "missing_api_key")
|
|
969
|
+
return LLM_MISSING_CREDENTIALS_MESSAGE;
|
|
970
|
+
if (event.type !== "error")
|
|
809
971
|
return null;
|
|
810
|
-
|
|
972
|
+
return (event.details || event.error || "").slice(0, 2000) || null;
|
|
811
973
|
}
|
|
812
974
|
/**
|
|
813
975
|
* Repair a run whose terminal event was durably appended but whose final
|
|
@@ -820,7 +982,7 @@ async function getLatestRunEvent(runId) {
|
|
|
820
982
|
*/
|
|
821
983
|
export async function reconcileTerminalRunFromEvents(runId) {
|
|
822
984
|
await ensureRunTables();
|
|
823
|
-
const latest = await
|
|
985
|
+
const latest = await getRunEventForReconciliation(runId);
|
|
824
986
|
if (!latest)
|
|
825
987
|
return false;
|
|
826
988
|
const status = terminalStatusForEvent(latest.event);
|
|
@@ -828,11 +990,8 @@ export async function reconcileTerminalRunFromEvents(runId) {
|
|
|
828
990
|
if (!status || !terminalReason)
|
|
829
991
|
return false;
|
|
830
992
|
const client = getDbExec();
|
|
831
|
-
const errorCode =
|
|
832
|
-
const errorDetail = latest.event
|
|
833
|
-
? (latest.event.details || latest.event.error || "").slice(0, 2000) ||
|
|
834
|
-
null
|
|
835
|
-
: null;
|
|
993
|
+
const errorCode = errorCodeForTerminalEvent(latest.event);
|
|
994
|
+
const errorDetail = errorDetailForTerminalEvent(latest.event);
|
|
836
995
|
const { rowsAffected } = await client.execute({
|
|
837
996
|
sql: `UPDATE agent_runs
|
|
838
997
|
SET status = ?,
|
|
@@ -967,11 +1126,53 @@ export async function updateRunHeartbeat(runId) {
|
|
|
967
1126
|
export async function bumpRunProgress(runId) {
|
|
968
1127
|
await ensureRunTables();
|
|
969
1128
|
const client = getDbExec();
|
|
1129
|
+
const now = Date.now();
|
|
970
1130
|
await client.execute({
|
|
971
|
-
|
|
972
|
-
|
|
1131
|
+
// Multiple event-persistence paths and serverless isolates can bump the
|
|
1132
|
+
// same run concurrently. A slower, older write must never land after a
|
|
1133
|
+
// newer one and move the user-visible no-progress clock backwards.
|
|
1134
|
+
// CASE keeps this portable across SQLite and Postgres.
|
|
1135
|
+
sql: `UPDATE agent_runs SET last_progress_at = CASE WHEN last_progress_at IS NULL OR last_progress_at < ? THEN ? ELSE last_progress_at END WHERE id = ? AND status = 'running'`,
|
|
1136
|
+
args: [now, now, runId],
|
|
973
1137
|
});
|
|
974
1138
|
}
|
|
1139
|
+
/**
|
|
1140
|
+
* Mirror run-manager's in-memory `inFlightWorkCount` 0<->N transitions into
|
|
1141
|
+
* SQL so a stale reaper running in a DIFFERENT isolate can tell a
|
|
1142
|
+
* demonstrably-alive run (holding a tool call or A2A `agent_call` delegation)
|
|
1143
|
+
* apart from a genuinely dead one — see `IN_FLIGHT_RUN_STALE_GRACE_MS`'s doc
|
|
1144
|
+
* comment for the full reasoning.
|
|
1145
|
+
*
|
|
1146
|
+
* `inFlight: true` only writes when the row is still `NULL` — a defense-in-
|
|
1147
|
+
* depth belt-and-suspenders against a nested 1->2 transition clobbering the
|
|
1148
|
+
* ORIGINAL start time with a later one (the caller's own counter already
|
|
1149
|
+
* dedupes 0->1 transitions; this WHERE just makes the write itself
|
|
1150
|
+
* idempotent/order-independent too). `inFlight: false` always clears
|
|
1151
|
+
* unconditionally — if it races a fresh 0->1 write from a *different* tool
|
|
1152
|
+
* finishing/starting back to back, worst case is losing a few seconds of
|
|
1153
|
+
* grace, never gaining an incorrect one.
|
|
1154
|
+
*
|
|
1155
|
+
* Best-effort: callers fire-and-forget (`.catch(() => {})`) so a write
|
|
1156
|
+
* failure here never blocks event emission or aborts the run. If this write
|
|
1157
|
+
* itself fails (the same DB pressure that could be starving the heartbeat),
|
|
1158
|
+
* the row simply gets no grace — never worse than today's behavior.
|
|
1159
|
+
*/
|
|
1160
|
+
export async function setRunInFlightMarker(runId, inFlight) {
|
|
1161
|
+
await ensureRunTables();
|
|
1162
|
+
const client = getDbExec();
|
|
1163
|
+
if (inFlight) {
|
|
1164
|
+
await client.execute({
|
|
1165
|
+
sql: `UPDATE agent_runs SET in_flight_since = ? WHERE id = ? AND status = 'running' AND in_flight_since IS NULL`,
|
|
1166
|
+
args: [Date.now(), runId],
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
else {
|
|
1170
|
+
await client.execute({
|
|
1171
|
+
sql: `UPDATE agent_runs SET in_flight_since = NULL WHERE id = ?`,
|
|
1172
|
+
args: [runId],
|
|
1173
|
+
});
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
975
1176
|
/**
|
|
976
1177
|
* If the given run is marked "running" in SQL but its heartbeat is stale
|
|
977
1178
|
* (producer likely crashed), flip it to "errored" so watchers stop waiting.
|
|
@@ -985,11 +1186,18 @@ export async function reapIfStale(runId, maxStaleMs) {
|
|
|
985
1186
|
const completedAt = Date.now();
|
|
986
1187
|
// Background-dispatched runs get the wider stale window so a slow cold-start
|
|
987
1188
|
// isn't reaped; foreground runs keep the tight 15s window. An explicit
|
|
988
|
-
// override forces a flat window for callers that want one
|
|
1189
|
+
// override forces a flat window for callers that want one — and, like that
|
|
1190
|
+
// override already bypasses the background-aware widening, it also bypasses
|
|
1191
|
+
// the in-flight grace below: an explicit `maxStaleMs` is an exact,
|
|
1192
|
+
// caller-chosen window and stays exact.
|
|
989
1193
|
const staleClause = typeof maxStaleMs === "number"
|
|
990
1194
|
? `${livenessBasisSql()} < ?`
|
|
991
|
-
: `${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}`;
|
|
992
|
-
const staleArgs = typeof maxStaleMs === "number"
|
|
1195
|
+
: `${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()} AND ${inFlightGraceSql()}`;
|
|
1196
|
+
const staleArgs = typeof maxStaleMs === "number"
|
|
1197
|
+
? [completedAt - maxStaleMs]
|
|
1198
|
+
: // First `?` is backgroundAwareStaleCutoffSql's CAST param, second is
|
|
1199
|
+
// inFlightGraceSql's — both bound to the same "now".
|
|
1200
|
+
[completedAt, completedAt];
|
|
993
1201
|
const { rowsAffected } = await client.execute({
|
|
994
1202
|
sql: `UPDATE agent_runs
|
|
995
1203
|
SET status = 'errored',
|
|
@@ -1247,8 +1455,8 @@ export async function getRunByThread(threadId, options) {
|
|
|
1247
1455
|
await ensureRunTables();
|
|
1248
1456
|
const client = getDbExec();
|
|
1249
1457
|
const sql = options?.includeTerminal
|
|
1250
|
-
? `SELECT id, thread_id, turn_id, status, started_at, heartbeat_at, completed_at, last_progress_at, dispatch_mode, terminal_reason, diag_stage, error_code FROM agent_runs WHERE thread_id = ? ORDER BY started_at DESC LIMIT 1`
|
|
1251
|
-
: `SELECT id, thread_id, turn_id, status, started_at, heartbeat_at, completed_at, last_progress_at, dispatch_mode, terminal_reason, diag_stage, error_code FROM agent_runs WHERE thread_id = ? AND status = 'running' ORDER BY started_at DESC LIMIT 1`;
|
|
1458
|
+
? `SELECT id, thread_id, turn_id, status, started_at, heartbeat_at, completed_at, last_progress_at, dispatch_mode, terminal_reason, diag_stage, error_code, in_flight_since FROM agent_runs WHERE thread_id = ? ORDER BY started_at DESC LIMIT 1`
|
|
1459
|
+
: `SELECT id, thread_id, turn_id, status, started_at, heartbeat_at, completed_at, last_progress_at, dispatch_mode, terminal_reason, diag_stage, error_code, in_flight_since FROM agent_runs WHERE thread_id = ? AND status = 'running' ORDER BY started_at DESC LIMIT 1`;
|
|
1252
1460
|
const { rows } = await client.execute({ sql, args: [threadId] });
|
|
1253
1461
|
if (rows.length === 0)
|
|
1254
1462
|
return null;
|
|
@@ -1271,6 +1479,7 @@ export async function getRunByThread(threadId, options) {
|
|
|
1271
1479
|
dispatchMode: r.dispatch_mode ?? null,
|
|
1272
1480
|
terminalReason: r.terminal_reason ?? null,
|
|
1273
1481
|
diagStage: r.diag_stage ?? null,
|
|
1482
|
+
inFlightSince: r.in_flight_since == null ? null : Number(r.in_flight_since),
|
|
1274
1483
|
};
|
|
1275
1484
|
}
|
|
1276
1485
|
export async function listRunsForThread(threadId, options = {}) {
|
|
@@ -1395,12 +1604,21 @@ export async function reapAllStaleRuns() {
|
|
|
1395
1604
|
await ensureRunTables();
|
|
1396
1605
|
const client = getDbExec();
|
|
1397
1606
|
const now = Date.now();
|
|
1398
|
-
// Background-dispatched runs use the wider window; everything else 15s.
|
|
1607
|
+
// Background-dispatched runs use the wider window; everything else 15s. The
|
|
1608
|
+
// in-flight grace clause is applied identically to this SELECT and the
|
|
1609
|
+
// UPDATE below (both derive `stale.rows`/the terminal-event-append loop
|
|
1610
|
+
// from the SAME predicate) so a row the grace clause protects from the
|
|
1611
|
+
// UPDATE is never mistakenly given a terminal event anyway — see
|
|
1612
|
+
// `inFlightGraceSql` and `IN_FLIGHT_RUN_STALE_GRACE_MS`. This runs at
|
|
1613
|
+
// server startup across possibly-multiple isolates, so a sibling isolate's
|
|
1614
|
+
// still-alive, in-flight run must not be reaped just because THIS isolate
|
|
1615
|
+
// just booted and has no heartbeat history for it.
|
|
1399
1616
|
const stale = await client.execute({
|
|
1400
1617
|
sql: `SELECT id FROM agent_runs
|
|
1401
1618
|
WHERE status = 'running'
|
|
1402
|
-
AND ${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}
|
|
1403
|
-
|
|
1619
|
+
AND ${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}
|
|
1620
|
+
AND ${inFlightGraceSql()}`,
|
|
1621
|
+
args: [now, now],
|
|
1404
1622
|
});
|
|
1405
1623
|
for (const row of stale.rows) {
|
|
1406
1624
|
const id = row.id;
|
|
@@ -1418,13 +1636,15 @@ export async function reapAllStaleRuns() {
|
|
|
1418
1636
|
terminal_reason = ?
|
|
1419
1637
|
WHERE status = 'running'
|
|
1420
1638
|
AND ${terminalRunEventExclusionSql()}
|
|
1421
|
-
AND ${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}
|
|
1639
|
+
AND ${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}
|
|
1640
|
+
AND ${inFlightGraceSql()}`,
|
|
1422
1641
|
args: [
|
|
1423
1642
|
completedAt,
|
|
1424
1643
|
STALE_RUN_ERROR_EVENT.errorCode,
|
|
1425
1644
|
STALE_RUN_ERROR_EVENT.details,
|
|
1426
1645
|
STALE_RUN_ERROR_EVENT.errorCode,
|
|
1427
1646
|
completedAt,
|
|
1647
|
+
completedAt,
|
|
1428
1648
|
],
|
|
1429
1649
|
});
|
|
1430
1650
|
for (const row of stale.rows) {
|
|
@@ -1450,15 +1670,24 @@ export async function cleanupOldRuns(olderThanMs, erroredOlderThanMs) {
|
|
|
1450
1670
|
// SELECT covers BOTH UPDATE conditions so the terminal-event-append loop
|
|
1451
1671
|
// below catches every row we're about to flip — a 24h-old row with a
|
|
1452
1672
|
// somehow-fresh heartbeat would slip past a heartbeat-only SELECT.
|
|
1673
|
+
//
|
|
1674
|
+
// The in-flight grace clause is applied ONLY to the heartbeat-based branch
|
|
1675
|
+
// (mirroring the second UPDATE below), never the absolute-age branch:
|
|
1676
|
+
// nothing can legitimately hold in-flight work anywhere near `olderThanMs`
|
|
1677
|
+
// (default on the order of a day) — `IN_FLIGHT_RUN_STALE_GRACE_MS` bounds
|
|
1678
|
+
// any real grace at ~14.5 minutes — so a row that old is dead regardless of
|
|
1679
|
+
// its in-flight marker. This runs opportunistically after EVERY run
|
|
1680
|
+
// completes in ANY isolate, so a different thread's still-in-flight A2A
|
|
1681
|
+
// call must not be reaped as a side effect of an unrelated run finishing.
|
|
1453
1682
|
const now = Date.now();
|
|
1454
1683
|
const stale = await client.execute({
|
|
1455
1684
|
sql: `SELECT id FROM agent_runs
|
|
1456
1685
|
WHERE status = 'running'
|
|
1457
1686
|
AND (
|
|
1458
|
-
${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}
|
|
1687
|
+
(${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()} AND ${inFlightGraceSql()})
|
|
1459
1688
|
OR started_at < ?
|
|
1460
1689
|
)`,
|
|
1461
|
-
args: [now, cutoff],
|
|
1690
|
+
args: [now, now, cutoff],
|
|
1462
1691
|
});
|
|
1463
1692
|
for (const row of stale.rows) {
|
|
1464
1693
|
const id = row.id;
|
|
@@ -1486,7 +1715,13 @@ export async function cleanupOldRuns(olderThanMs, erroredOlderThanMs) {
|
|
|
1486
1715
|
],
|
|
1487
1716
|
});
|
|
1488
1717
|
// Also expire runs whose heartbeat is stale — producer has died. Uses the
|
|
1489
|
-
// background-aware window so a slow background cold-start isn't reaped
|
|
1718
|
+
// background-aware window so a slow background cold-start isn't reaped
|
|
1719
|
+
// early, and the in-flight grace so a demonstrably-alive run holding a tool
|
|
1720
|
+
// call / A2A delegation survives a heartbeat write failure. Must match the
|
|
1721
|
+
// SELECT's heartbeat branch above exactly — the terminal-event-append loop
|
|
1722
|
+
// below fires for every row the SELECT returned, so a mismatch would
|
|
1723
|
+
// silently inject a terminal error event onto a row this UPDATE left
|
|
1724
|
+
// status='running'.
|
|
1490
1725
|
await client.execute({
|
|
1491
1726
|
sql: `UPDATE agent_runs
|
|
1492
1727
|
SET status = 'errored',
|
|
@@ -1496,13 +1731,15 @@ export async function cleanupOldRuns(olderThanMs, erroredOlderThanMs) {
|
|
|
1496
1731
|
terminal_reason = ?
|
|
1497
1732
|
WHERE status = 'running'
|
|
1498
1733
|
AND ${terminalRunEventExclusionSql()}
|
|
1499
|
-
AND ${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}
|
|
1734
|
+
AND ${livenessBasisSql()} < ${backgroundAwareStaleCutoffSql()}
|
|
1735
|
+
AND ${inFlightGraceSql()}`,
|
|
1500
1736
|
args: [
|
|
1501
1737
|
completedAt,
|
|
1502
1738
|
STALE_RUN_ERROR_EVENT.errorCode,
|
|
1503
1739
|
STALE_RUN_ERROR_EVENT.details,
|
|
1504
1740
|
STALE_RUN_ERROR_EVENT.errorCode,
|
|
1505
1741
|
completedAt,
|
|
1742
|
+
completedAt,
|
|
1506
1743
|
],
|
|
1507
1744
|
});
|
|
1508
1745
|
for (const row of stale.rows) {
|