@agent-native/core 0.122.4 → 0.123.1
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 +554 -0
- package/corpus/core/docs/content/actions.mdx +33 -20
- package/corpus/core/docs/content/agent-mentions.mdx +30 -19
- package/corpus/core/docs/content/agent-native-toolkit.mdx +8 -6
- package/corpus/core/docs/content/agent-resources.mdx +11 -0
- package/corpus/core/docs/content/agent-surfaces.mdx +41 -30
- package/corpus/core/docs/content/audit-log.mdx +78 -0
- package/corpus/core/docs/content/authentication.mdx +7 -5
- package/corpus/core/docs/content/automations.mdx +15 -9
- package/corpus/core/docs/content/client.mdx +11 -11
- package/corpus/core/docs/content/cloneable-saas.mdx +7 -1
- package/corpus/core/docs/content/code-agents-ui.mdx +9 -1
- package/corpus/core/docs/content/components.mdx +7 -0
- package/corpus/core/docs/content/context-awareness.mdx +1 -0
- package/corpus/core/docs/content/creating-templates.mdx +9 -1
- package/corpus/core/docs/content/custom-design-system.mdx +8 -0
- package/corpus/core/docs/content/data-programs.mdx +6 -0
- package/corpus/core/docs/content/deployment.mdx +2 -0
- package/corpus/core/docs/content/doctor.mdx +5 -3
- package/corpus/core/docs/content/extensions.mdx +26 -0
- package/corpus/core/docs/content/external-agents-catalog.mdx +533 -0
- package/corpus/core/docs/content/external-agents.mdx +20 -514
- package/corpus/core/docs/content/faq.mdx +2 -2
- package/corpus/core/docs/content/file-uploads.mdx +44 -0
- package/corpus/core/docs/content/frames.mdx +2 -2
- package/corpus/core/docs/content/generative-ui.mdx +8 -0
- package/corpus/core/docs/content/getting-started.mdx +45 -17
- package/corpus/core/docs/content/human-approval.mdx +9 -0
- package/corpus/core/docs/content/integrations.mdx +4 -3
- package/corpus/core/docs/content/internationalization.mdx +4 -11
- package/corpus/core/docs/content/key-concepts.mdx +1 -1
- package/corpus/core/docs/content/local-file-mode.mdx +5 -0
- package/corpus/core/docs/content/mcp-apps.mdx +2 -1
- package/corpus/core/docs/content/mcp-clients.mdx +32 -1
- package/corpus/core/docs/content/mcp-protocol.mdx +4 -3
- package/corpus/core/docs/content/messaging-internals.mdx +328 -0
- package/corpus/core/docs/content/messaging-recipes.mdx +194 -0
- package/corpus/core/docs/content/messaging.mdx +9 -307
- package/corpus/core/docs/content/multi-app-workspace.mdx +1 -1
- package/corpus/core/docs/content/multi-tenancy.mdx +1 -0
- package/corpus/core/docs/content/native-chat-ui.mdx +8 -0
- package/corpus/core/docs/content/notifications.mdx +18 -20
- package/corpus/core/docs/content/observability.mdx +1 -0
- package/corpus/core/docs/content/onboarding.mdx +20 -6
- package/corpus/core/docs/content/organizations-teams-permissions.mdx +99 -124
- package/corpus/core/docs/content/package-lifecycle.mdx +19 -7
- package/corpus/core/docs/content/progress.mdx +11 -0
- package/corpus/core/docs/content/real-time-collaboration.mdx +44 -3
- package/corpus/core/docs/content/recurring-jobs.mdx +14 -1
- package/corpus/core/docs/content/security.mdx +5 -2
- package/corpus/core/docs/content/server.mdx +2 -1
- package/corpus/core/docs/content/sharing.mdx +22 -3
- package/corpus/core/docs/content/skills-guide.mdx +62 -19
- package/corpus/core/docs/content/syncing-template-changes.mdx +9 -0
- package/corpus/core/docs/content/template-analytics-connectors.mdx +75 -0
- package/corpus/core/docs/content/template-analytics-dashboards.mdx +106 -0
- package/corpus/core/docs/content/template-analytics-developers.mdx +287 -0
- package/corpus/core/docs/content/template-analytics-monitoring-and-sessions.mdx +109 -0
- package/corpus/core/docs/content/template-analytics.mdx +21 -263
- package/corpus/core/docs/content/template-assets-developers.mdx +456 -0
- package/corpus/core/docs/content/template-assets-generation.mdx +147 -0
- package/corpus/core/docs/content/template-assets-integrations.mdx +319 -0
- package/corpus/core/docs/content/template-assets-presets.mdx +185 -0
- package/corpus/core/docs/content/template-assets.mdx +12 -562
- package/corpus/core/docs/content/template-brain-agent.mdx +103 -0
- package/corpus/core/docs/content/template-brain-developers.mdx +379 -0
- package/corpus/core/docs/content/template-brain-knowledge.mdx +50 -0
- package/corpus/core/docs/content/template-brain-sources.mdx +163 -0
- package/corpus/core/docs/content/template-brain.mdx +30 -390
- package/corpus/core/docs/content/template-calendar-agent.mdx +133 -0
- package/corpus/core/docs/content/template-calendar-booking-links.mdx +73 -0
- package/corpus/core/docs/content/template-calendar-developers.mdx +366 -0
- package/corpus/core/docs/content/template-calendar-scheduling.mdx +128 -0
- package/corpus/core/docs/content/template-calendar.mdx +13 -260
- package/corpus/core/docs/content/template-chat-developers.mdx +88 -0
- package/corpus/core/docs/content/template-chat-first-edits.mdx +145 -0
- package/corpus/core/docs/content/template-chat.mdx +12 -77
- package/corpus/core/docs/content/template-clips-ai-and-editing.mdx +114 -0
- package/corpus/core/docs/content/template-clips-capture-everywhere.mdx +120 -0
- package/corpus/core/docs/content/template-clips-developers.mdx +373 -0
- package/corpus/core/docs/content/template-clips-sharing-and-teams.mdx +182 -0
- package/corpus/core/docs/content/template-clips.mdx +19 -508
- package/corpus/core/docs/content/template-content-databases.mdx +406 -0
- package/corpus/core/docs/content/template-content-developers.mdx +364 -0
- package/corpus/core/docs/content/template-content-editing.mdx +60 -0
- package/corpus/core/docs/content/template-content-sync.mdx +149 -0
- package/corpus/core/docs/content/template-content.mdx +21 -561
- package/corpus/core/docs/content/template-design-brand-and-figma.mdx +150 -0
- package/corpus/core/docs/content/template-design-collaboration-and-full-apps.mdx +125 -0
- package/corpus/core/docs/content/template-design-developers.mdx +358 -0
- package/corpus/core/docs/content/template-design-quality-and-components.mdx +95 -0
- package/corpus/core/docs/content/template-design.mdx +20 -344
- package/corpus/core/docs/content/template-dispatch-developers.mdx +121 -0
- package/corpus/core/docs/content/template-dispatch-messaging-routing.mdx +114 -0
- package/corpus/core/docs/content/template-dispatch-operations.mdx +160 -0
- package/corpus/core/docs/content/template-dispatch-vault-integrations.mdx +316 -0
- package/corpus/core/docs/content/template-dispatch.mdx +24 -283
- package/corpus/core/docs/content/template-forms-building-publishing.mdx +135 -0
- package/corpus/core/docs/content/template-forms-developers.mdx +195 -0
- package/corpus/core/docs/content/template-forms-responses.mdx +120 -0
- package/corpus/core/docs/content/template-forms.mdx +21 -230
- package/corpus/core/docs/content/template-mail-agent.mdx +114 -0
- package/corpus/core/docs/content/template-mail-developers.mdx +356 -0
- package/corpus/core/docs/content/template-mail-drafts-and-queue.mdx +103 -0
- package/corpus/core/docs/content/template-mail-inbox.mdx +118 -0
- package/corpus/core/docs/content/template-mail.mdx +23 -274
- package/corpus/core/docs/content/template-plan-automations.mdx +213 -0
- package/corpus/core/docs/content/template-plan-developers.mdx +703 -0
- package/corpus/core/docs/content/template-plan-local-and-desktop.mdx +236 -0
- package/corpus/core/docs/content/template-plan-review-workflow.mdx +180 -0
- package/corpus/core/docs/content/template-plan.mdx +60 -910
- package/corpus/core/docs/content/template-slides-agent.mdx +102 -0
- package/corpus/core/docs/content/template-slides-design-and-media.mdx +94 -0
- package/corpus/core/docs/content/template-slides-developers.mdx +488 -0
- package/corpus/core/docs/content/template-slides-editing.mdx +56 -0
- package/corpus/core/docs/content/template-slides.mdx +20 -362
- package/corpus/core/docs/content/toolkit-capability-packages.mdx +38 -13
- package/corpus/core/docs/content/toolkit-context-knowledge.mdx +49 -9
- package/corpus/core/docs/content/toolkit-editors-canvases.mdx +72 -10
- package/corpus/core/docs/content/toolkit-resources.mdx +16 -0
- package/corpus/core/docs/content/toolkit-settings.mdx +3 -3
- package/corpus/core/docs/content/toolkit-sharing.mdx +5 -7
- package/corpus/core/docs/content/using-your-agent.mdx +25 -2
- package/corpus/core/docs/content/voice-input.mdx +11 -7
- package/corpus/core/docs/content/what-is-agent-native.mdx +1 -0
- package/corpus/core/docs/content/workspace-connections.mdx +21 -11
- package/corpus/core/docs/content/workspace-management.mdx +1 -1
- package/corpus/core/package.json +1 -3
- package/corpus/core/src/a2a/client.ts +4 -2
- package/corpus/core/src/agent/action-warnings.ts +103 -0
- package/corpus/core/src/agent/durable-background.ts +42 -5
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +58 -6
- package/corpus/core/src/agent/engine/anthropic-engine.ts +51 -8
- package/corpus/core/src/agent/engine/builder-engine.ts +56 -18
- package/corpus/core/src/agent/engine/continuation-dispatch-retry.ts +10 -9
- package/corpus/core/src/agent/engine/credential-errors.ts +11 -0
- package/corpus/core/src/agent/engine/error-detail.ts +39 -0
- package/corpus/core/src/agent/engine/prompt-cache.ts +44 -0
- package/corpus/core/src/agent/engine/registry.ts +22 -30
- package/corpus/core/src/agent/engine/tool-call-journal-seed.ts +2 -1
- package/corpus/core/src/agent/engine/translate-anthropic.ts +99 -0
- package/corpus/core/src/agent/loop-settings.ts +94 -7
- package/corpus/core/src/agent/production-agent.ts +667 -157
- package/corpus/core/src/agent/run-loop-with-resume.ts +27 -1
- package/corpus/core/src/agent/run-manager.ts +229 -39
- package/corpus/core/src/agent/run-store.ts +397 -64
- package/corpus/core/src/agent/thread-data-builder.ts +5 -1
- package/corpus/core/src/agent/types.ts +23 -6
- package/corpus/core/src/application-state/script-helpers.ts +5 -2
- package/corpus/core/src/cli/agents.ts +69 -1
- package/corpus/core/src/cli/app-skill.ts +1 -1
- package/corpus/core/src/cli/code-agent-executor.ts +7 -3
- package/corpus/core/src/cli/design-connect.ts +82 -8
- package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +169 -24
- package/corpus/core/src/cli/templates-meta.ts +12 -0
- package/corpus/core/src/client/AssistantChat.tsx +623 -607
- package/corpus/core/src/client/agent-chat-adapter.ts +176 -29
- package/corpus/core/src/client/chat/message-components.tsx +13 -0
- package/corpus/core/src/client/embed-auth.ts +3 -1
- package/corpus/core/src/client/integrations/IntegrationCard.tsx +41 -24
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +37 -21
- package/corpus/core/src/client/integrations/webhook-url.ts +29 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +41 -27
- package/corpus/core/src/client/org/RequireActiveOrg.tsx +7 -0
- package/corpus/core/src/client/org/TeamPage.tsx +144 -14
- package/corpus/core/src/client/org/hooks.ts +27 -0
- package/corpus/core/src/client/org/index.ts +2 -0
- package/corpus/core/src/client/require-session.tsx +40 -29
- package/corpus/core/src/client/session-replay.ts +1 -1
- package/corpus/core/src/client/settings/DemoModeSection.tsx +0 -5
- package/corpus/core/src/client/settings/SecretsSection.tsx +47 -42
- package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
- package/corpus/core/src/client/sse-event-processor.ts +83 -8
- package/corpus/core/src/client/use-action.ts +22 -13
- package/corpus/core/src/client/use-agent-engine-configured.ts +36 -4
- package/corpus/core/src/client/use-db-sync.ts +21 -1
- package/corpus/core/src/credentials/index.ts +124 -2
- package/corpus/core/src/deploy/build.ts +93 -30
- package/corpus/core/src/deploy/workspace-deploy.ts +21 -16
- package/corpus/core/src/guards/no-localhost-fallback.ts +76 -14
- package/corpus/core/src/integrations/google-docs-poller.ts +19 -12
- package/corpus/core/src/integrations/webhook-handler.ts +56 -33
- package/corpus/core/src/jobs/scheduler.ts +57 -23
- package/corpus/core/src/localization/default-messages.ts +23 -1
- package/corpus/core/src/observability/evals.ts +7 -8
- package/corpus/core/src/observability/traces.ts +2 -0
- package/corpus/core/src/org/accept-pending.ts +2 -2
- package/corpus/core/src/org/active-org.ts +73 -0
- package/corpus/core/src/org/auto-join-domain.ts +7 -2
- package/corpus/core/src/org/context.ts +169 -66
- package/corpus/core/src/org/handlers.ts +148 -10
- package/corpus/core/src/org/plugin.ts +8 -1
- package/corpus/core/src/org/types.ts +6 -1
- package/corpus/core/src/provider-api/index.ts +6 -1
- package/corpus/core/src/resources/handlers.ts +2 -6
- package/corpus/core/src/resources/script-helpers.ts +2 -1
- package/corpus/core/src/scripts/chat/search-chats.ts +5 -2
- package/corpus/core/src/scripts/describe-workspace-apps.ts +59 -0
- package/corpus/core/src/scripts/resources/delete-memory.ts +5 -2
- package/corpus/core/src/scripts/resources/delete.ts +5 -2
- package/corpus/core/src/scripts/resources/effective.ts +5 -2
- package/corpus/core/src/scripts/resources/list.ts +5 -2
- package/corpus/core/src/scripts/resources/read.ts +5 -2
- package/corpus/core/src/scripts/resources/save-memory.ts +5 -2
- package/corpus/core/src/scripts/resources/write.ts +5 -2
- package/corpus/core/src/server/agent-capabilities.ts +147 -0
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +11 -13
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +183 -57
- package/corpus/core/src/server/agent-chat/script-entries.ts +20 -7
- package/corpus/core/src/server/agent-chat-plugin.ts +27 -0
- package/corpus/core/src/server/auth.ts +38 -32
- package/corpus/core/src/server/core-routes-plugin.ts +229 -179
- package/corpus/core/src/server/credential-provider.ts +196 -44
- package/corpus/core/src/server/embed-session.ts +10 -0
- package/corpus/core/src/server/framework-request-handler.ts +43 -0
- package/corpus/core/src/server/google-auth-plugin.ts +13 -450
- package/corpus/core/src/server/index.ts +4 -1
- package/corpus/core/src/server/onboarding-html.ts +20 -56
- package/corpus/core/src/server/open-route.ts +6 -1
- package/corpus/core/src/server/poll.ts +1 -1
- package/corpus/core/src/server/prompts/framework-core-compact.ts +5 -5
- package/corpus/core/src/server/prompts/framework-core.ts +7 -9
- package/corpus/core/src/server/prompts/shared-rules.ts +20 -9
- package/corpus/core/src/server/request-context.ts +58 -2
- package/corpus/core/src/server/scoped-key-storage.ts +1 -1
- package/corpus/core/src/settings/org-settings.ts +9 -0
- package/corpus/core/src/settings/store.ts +29 -0
- package/corpus/core/src/shared/index.ts +13 -0
- package/corpus/core/src/shared/sign-in-journey.ts +331 -0
- package/corpus/core/src/styles/agent-native.css +8 -0
- package/corpus/core/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/core/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/core/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/corpus/core/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/core/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/core/src/templates/chat/AGENTS.md +8 -0
- package/corpus/core/src/templates/chat/app/entry.client.tsx +3 -0
- package/corpus/core/src/templates/chat/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/core/src/templates/chat/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/core/src/templates/chat/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +2 -0
- package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/core/src/templates/default/AGENTS.md +68 -195
- package/corpus/core/src/templates/default/app/entry.client.tsx +3 -0
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +8 -0
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +8 -0
- package/corpus/core/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/core/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
- package/corpus/core/src/templates/workspace-core/AGENTS.md +62 -124
- package/corpus/core/src/templates/workspace-root/AGENTS.md +6 -1
- package/corpus/core/src/triggers/dispatcher.ts +28 -17
- package/corpus/core/src/vite/client.ts +20 -8
- package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +41 -1
- package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +50 -22
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +1 -1
- package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +8 -0
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/analytics/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/analytics/.builder/skills/charts/SKILL.md +2 -2
- package/corpus/templates/analytics/actions/delete-dashboard-view.ts +24 -0
- package/corpus/templates/analytics/actions/delete-user-pref.ts +22 -0
- package/corpus/templates/analytics/actions/generate-chart.ts +8 -245
- package/corpus/templates/analytics/actions/get-theme.ts +27 -0
- package/corpus/templates/analytics/actions/get-user-pref.ts +22 -0
- package/corpus/templates/analytics/actions/list-dashboard-views.ts +25 -0
- package/corpus/templates/analytics/actions/save-dashboard-view.ts +33 -0
- package/corpus/templates/analytics/actions/set-theme.ts +22 -0
- package/corpus/templates/analytics/actions/set-user-pref.ts +24 -0
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +134 -27
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -9
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +0 -17
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +10 -5
- package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +22 -52
- package/corpus/templates/analytics/app/hooks/use-user-pref.ts +21 -31
- package/corpus/templates/analytics/app/i18n-data.ts +10 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dual-axis.ts +73 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +8 -27
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +0 -57
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +8 -0
- package/corpus/templates/analytics/app/root.tsx +0 -28
- package/corpus/templates/analytics/changelog/2026-07-26-error-issues-now-group-by-message-as-well-as-stack-frame-and.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-26-line-area-and-bar-dashboard-panels-can-plot-series-on-a-seco.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-26-scheduled-dashboard-email-reports-now-arrive-complete-and-re.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-26-session-replays-now-detect-rage-clicks-so-the-rage-click-fil.md +6 -0
- package/corpus/templates/analytics/docs/error-capture.md +8 -4
- package/corpus/templates/analytics/package.json +1 -2
- package/corpus/templates/analytics/scripts/preview-dashboard-report.ts +221 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +39 -32
- package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +1168 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +111 -1358
- package/corpus/templates/analytics/server/lib/error-capture.ts +32 -15
- package/corpus/templates/analytics/server/lib/report-chart-svg.ts +901 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +77 -1
- package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +3 -4
- package/corpus/templates/assets/.agents/skills/a2a-assets/SKILL.md +28 -0
- package/corpus/templates/assets/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/assets/.agents/skills/assets-navigation/SKILL.md +46 -0
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +12 -0
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +28 -0
- package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +9 -0
- package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +11 -0
- package/corpus/templates/assets/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/assets/AGENTS.md +58 -125
- package/corpus/templates/assets/actions/variant-slots.ts +8 -4
- package/corpus/templates/assets/app/entry.client.tsx +3 -0
- package/corpus/templates/assets/package.json +0 -2
- package/corpus/templates/brain/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +78 -4
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +15 -3
- package/corpus/templates/brain/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/brain/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/brain/AGENTS.md +73 -119
- package/corpus/templates/brain/app/entry.client.tsx +3 -0
- package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +56 -3
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/calendar/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/calendar/AGENTS.md +22 -45
- package/corpus/templates/calendar/app/entry.client.tsx +3 -0
- package/corpus/templates/calendar/server/handlers/events.ts +0 -364
- package/corpus/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/chat/AGENTS.md +8 -0
- package/corpus/templates/chat/app/entry.client.tsx +3 -0
- package/corpus/templates/clips/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +42 -0
- package/corpus/templates/clips/.agents/skills/brain-export/SKILL.md +59 -0
- package/corpus/templates/clips/.agents/skills/bug-reports/SKILL.md +37 -0
- package/corpus/templates/clips/.agents/skills/crm-call-evidence/SKILL.md +41 -0
- package/corpus/templates/clips/.agents/skills/dictate/SKILL.md +4 -0
- package/corpus/templates/clips/.agents/skills/external-integrations/SKILL.md +45 -0
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +9 -0
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +45 -0
- package/corpus/templates/clips/.agents/skills/screen-memory/SKILL.md +43 -0
- package/corpus/templates/clips/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +38 -1
- package/corpus/templates/clips/AGENTS.md +82 -224
- package/corpus/templates/clips/actions/create-recording.ts +4 -0
- package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +6 -10
- package/corpus/templates/clips/app/routes/invite.$token.tsx +6 -5
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +4 -5
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +8 -8
- package/corpus/templates/clips/changelog/2026-07-26-long-agent-chat-turns-now-finish-instead-of-stopping-partway.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-26-recordings-no-longer-get-stuck-on-uploading-uploads-now-hold.md +6 -0
- package/corpus/templates/clips/server/db/schema.ts +3 -0
- package/corpus/templates/clips/server/jobs/brain-export.ts +4 -0
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +0 -52
- package/corpus/templates/clips/server/lib/upload-lease.ts +241 -0
- package/corpus/templates/clips/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/clips/server/plugins/db.ts +18 -347
- package/corpus/templates/clips/server/routes/api/clips/brain-export/run.post.ts +7 -1
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +123 -126
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +4 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +118 -0
- package/corpus/templates/clips/server/routes/api/uploads/reap.post.ts +69 -0
- package/corpus/templates/content/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/content/.agents/skills/content/SKILL.md +4 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +8 -0
- package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +55 -0
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +12 -1
- package/corpus/templates/content/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/content/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/content/AGENTS.md +63 -131
- package/corpus/templates/content/app/routes/_app.tsx +4 -4
- package/corpus/templates/content/server/routes/api/notion/callback.get.ts +6 -24
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +177 -0
- package/corpus/templates/crm/.agents/skills/crm/SKILL.md +205 -0
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +220 -0
- package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/crm/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +122 -0
- package/corpus/templates/crm/.env.example +5 -0
- package/corpus/templates/crm/AGENTS.md +82 -0
- package/corpus/templates/crm/CHANGELOG.md +25 -0
- package/corpus/templates/crm/DEVELOPING.md +66 -0
- package/corpus/templates/crm/README.md +122 -0
- package/corpus/templates/crm/_gitignore +12 -0
- package/corpus/templates/crm/actions/_crm-action-utils.ts +98 -0
- package/corpus/templates/crm/actions/_crm-attribute-utils.ts +219 -0
- package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
- package/corpus/templates/crm/actions/_crm-data-program-actions.ts +15 -0
- package/corpus/templates/crm/actions/_crm-list-utils.ts +775 -0
- package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
- package/corpus/templates/crm/actions/add-crm-record-to-list.ts +164 -0
- package/corpus/templates/crm/actions/apply-crm-proposals.ts +291 -0
- package/corpus/templates/crm/actions/archive-crm-attribute.ts +69 -0
- package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
- package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
- package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
- package/corpus/templates/crm/actions/create-crm-attribute.ts +350 -0
- package/corpus/templates/crm/actions/create-crm-list.ts +194 -0
- package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
- package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
- package/corpus/templates/crm/actions/delete-crm-saved-view.ts +68 -0
- package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
- package/corpus/templates/crm/actions/estimate-crm-enrichment.ts +229 -0
- package/corpus/templates/crm/actions/find-crm-duplicates.ts +87 -0
- package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +35 -0
- package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
- package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
- package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
- package/corpus/templates/crm/actions/get-crm-record-page.ts +287 -0
- package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
- package/corpus/templates/crm/actions/get-crm-workspace.ts +364 -0
- package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
- package/corpus/templates/crm/actions/list-crm-attributes.ts +71 -0
- package/corpus/templates/crm/actions/list-crm-connections.ts +68 -0
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
- package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
- package/corpus/templates/crm/actions/list-crm-enrichment-slots.ts +28 -0
- package/corpus/templates/crm/actions/list-crm-list-entries.ts +192 -0
- package/corpus/templates/crm/actions/list-crm-lists.ts +80 -0
- package/corpus/templates/crm/actions/list-crm-proposals.ts +55 -0
- package/corpus/templates/crm/actions/list-crm-record-field-history.ts +201 -0
- package/corpus/templates/crm/actions/list-crm-record-values.ts +200 -0
- package/corpus/templates/crm/actions/list-crm-records.ts +103 -0
- package/corpus/templates/crm/actions/list-crm-saved-views.ts +66 -0
- package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
- package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
- package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
- package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
- package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
- package/corpus/templates/crm/actions/manage-crm-attribute-option.ts +272 -0
- package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
- package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
- package/corpus/templates/crm/actions/merge-crm-records.ts +691 -0
- package/corpus/templates/crm/actions/navigate.ts +54 -0
- package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
- package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
- package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
- package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
- package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
- package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
- package/corpus/templates/crm/actions/remove-crm-list-entry.ts +79 -0
- package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
- package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
- package/corpus/templates/crm/actions/run-crm-attribute-fill.ts +443 -0
- package/corpus/templates/crm/actions/run-crm-enrichment.ts +647 -0
- package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
- package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +265 -0
- package/corpus/templates/crm/actions/run.ts +7 -0
- package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
- package/corpus/templates/crm/actions/save-crm-saved-view.ts +296 -0
- package/corpus/templates/crm/actions/sync-crm.ts +146 -0
- package/corpus/templates/crm/actions/update-crm-attribute.ts +111 -0
- package/corpus/templates/crm/actions/update-crm-list-entry.ts +102 -0
- package/corpus/templates/crm/actions/update-crm-list.ts +97 -0
- package/corpus/templates/crm/actions/update-crm-record.ts +543 -0
- package/corpus/templates/crm/actions/view-screen.ts +324 -0
- package/corpus/templates/crm/agent-native.app-skill.json +69 -0
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +78 -0
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +220 -0
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +414 -0
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +648 -0
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +488 -0
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +232 -0
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +93 -0
- package/corpus/templates/crm/app/components/crm/Surface.tsx +97 -0
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
- package/corpus/templates/crm/app/components/crm/board/CrmBoard.tsx +988 -0
- package/corpus/templates/crm/app/components/crm/board/board-model.ts +399 -0
- package/corpus/templates/crm/app/components/crm/board/entry-filter.ts +150 -0
- package/corpus/templates/crm/app/components/crm/board/view-draft.ts +227 -0
- package/corpus/templates/crm/app/components/crm/grid/CrmGrid.tsx +1033 -0
- package/corpus/templates/crm/app/components/crm/grid/GridCell.tsx +620 -0
- package/corpus/templates/crm/app/components/crm/grid/clipboard.ts +84 -0
- package/corpus/templates/crm/app/components/crm/grid/model.ts +304 -0
- package/corpus/templates/crm/app/components/crm/grid/navigation.ts +220 -0
- package/corpus/templates/crm/app/components/crm/grid/query.ts +214 -0
- package/corpus/templates/crm/app/components/crm/record/AttributePanel.tsx +192 -0
- package/corpus/templates/crm/app/components/crm/record/FieldHistory.tsx +179 -0
- package/corpus/templates/crm/app/components/crm/record/RecordHeader.tsx +103 -0
- package/corpus/templates/crm/app/components/crm/record/RecordLists.tsx +235 -0
- package/corpus/templates/crm/app/components/crm/record/RecordTabs.tsx +206 -0
- package/corpus/templates/crm/app/components/crm/record/field-editors.tsx +245 -0
- package/corpus/templates/crm/app/components/crm/record/record-data.ts +603 -0
- package/corpus/templates/crm/app/components/crm/settings/AdvancedSettings.tsx +49 -0
- package/corpus/templates/crm/app/components/crm/settings/AttributeOptionsEditor.tsx +441 -0
- package/corpus/templates/crm/app/components/crm/settings/ConnectionSettings.tsx +169 -0
- package/corpus/templates/crm/app/components/crm/settings/FieldsSettings.tsx +935 -0
- package/corpus/templates/crm/app/components/crm/settings/ListsSettings.tsx +339 -0
- package/corpus/templates/crm/app/components/crm/settings/settings-admin.ts +377 -0
- package/corpus/templates/crm/app/components/crm/shared/AttributeValueParts.tsx +69 -0
- package/corpus/templates/crm/app/components/crm/shared/attribute-value.ts +591 -0
- package/corpus/templates/crm/app/components/layout/CrmCommandMenu.tsx +556 -0
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +130 -0
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +407 -0
- package/corpus/templates/crm/app/components/layout/command-palette-search.ts +126 -0
- package/corpus/templates/crm/app/components/layout/crm-ui-intents.ts +41 -0
- package/corpus/templates/crm/app/components/layout/sidebar-collapse.ts +40 -0
- package/corpus/templates/crm/app/components/layout/sidebar-lists.ts +109 -0
- package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/hover-card.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/popover.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/crm/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/crm/app/design-system.ts +3 -0
- package/corpus/templates/crm/app/entry.client.tsx +19 -0
- package/corpus/templates/crm/app/entry.server.tsx +10 -0
- package/corpus/templates/crm/app/global.css +167 -0
- package/corpus/templates/crm/app/hooks/use-keyboard-shortcuts.ts +206 -0
- package/corpus/templates/crm/app/hooks/use-navigation-state.ts +48 -0
- package/corpus/templates/crm/app/i18n/en-US.ts +684 -0
- package/corpus/templates/crm/app/i18n/index.ts +34 -0
- package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
- package/corpus/templates/crm/app/lib/navigation.ts +17 -0
- package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
- package/corpus/templates/crm/app/lib/types.ts +172 -0
- package/corpus/templates/crm/app/lib/utils.ts +1 -0
- package/corpus/templates/crm/app/root.tsx +93 -0
- package/corpus/templates/crm/app/routes/_index.tsx +26 -0
- package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
- package/corpus/templates/crm/app/routes/agent.tsx +5 -0
- package/corpus/templates/crm/app/routes/ask.tsx +53 -0
- package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
- package/corpus/templates/crm/app/routes/lists.tsx +228 -0
- package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
- package/corpus/templates/crm/app/routes/people.tsx +41 -0
- package/corpus/templates/crm/app/routes/proposals.tsx +388 -0
- package/corpus/templates/crm/app/routes/records.$recordId.tsx +53 -0
- package/corpus/templates/crm/app/routes/records.tsx +64 -0
- package/corpus/templates/crm/app/routes/settings.tsx +118 -0
- package/corpus/templates/crm/app/routes/setup.tsx +308 -0
- package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
- package/corpus/templates/crm/app/routes/views.tsx +683 -0
- package/corpus/templates/crm/app/routes.ts +19 -0
- package/corpus/templates/crm/app/vite-env.d.ts +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-any-list-or-view-can-be-shown-as-a-board-grouped-by-stage-so.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-crm-now-finds-likely-duplicate-records-and-tells-you-exactly.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-enrichment-now-shows-what-a-run-will-cost-before-it-starts-g.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-lists-turn-any-set-of-records-into-a-pipeline-with-its-own-s.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-moving-a-record-or-list-entry-into-a-stage-that-was-retired-.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-opening-a-record-now-shows-one-page-with-its-fields-the-list.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-press-cmd-k-to-jump-to-any-record-list-view-or-setting-and-u.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-provider-record-edits-now-show-an-exact-before-after-diff-an.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-record-page-attribute-labels-now-read-in-full-instead-of-bei.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-records-now-use-typed-fields-currency-dates-ratings-status-s.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-retyping-a-value-on-the-record-page-now-replaces-it-instead-.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-settings-now-has-fields-and-lists-tabs-for-adding-fields-edi.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-the-proposal-review-now-shows-the-field-that-actually-change.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-26-the-record-grid-is-now-a-real-spreadsheet-filter-sort-and-pa.md +6 -0
- package/corpus/templates/crm/components.json +20 -0
- package/corpus/templates/crm/docs/architecture/crm-contract.md +214 -0
- package/corpus/templates/crm/docs/features/README.md +55 -0
- package/corpus/templates/crm/docs/features/f1-records-and-fields.mdx +52 -0
- package/corpus/templates/crm/docs/features/f2-lists-pipelines-and-views.mdx +48 -0
- package/corpus/templates/crm/docs/features/f3-work-and-record-quality.mdx +40 -0
- package/corpus/templates/crm/docs/features/f4-evidence-and-chat.mdx +47 -0
- package/corpus/templates/crm/learnings.defaults.md +5 -0
- package/corpus/templates/crm/netlify.toml +11 -0
- package/corpus/templates/crm/package.json +61 -0
- package/corpus/templates/crm/public/favicon.svg +1 -0
- package/corpus/templates/crm/public/icon-180.svg +1 -0
- package/corpus/templates/crm/public/manifest.json +11 -0
- package/corpus/templates/crm/react-router.config.ts +7 -0
- package/corpus/templates/crm/server/crm/adapter.ts +32 -0
- package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
- package/corpus/templates/crm/server/crm/crm-mirror.ts +721 -0
- package/corpus/templates/crm/server/crm/field-policy-attributes.ts +48 -0
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1146 -0
- package/corpus/templates/crm/server/crm/native-adapter.ts +1810 -0
- package/corpus/templates/crm/server/crm/provider-record-link.ts +264 -0
- package/corpus/templates/crm/server/crm/read-through.ts +207 -0
- package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
- package/corpus/templates/crm/server/db/crm-store.ts +1112 -0
- package/corpus/templates/crm/server/db/index.ts +191 -0
- package/corpus/templates/crm/server/db/schema.ts +647 -0
- package/corpus/templates/crm/server/lib/crm-query.ts +1558 -0
- package/corpus/templates/crm/server/lib/dedupe.ts +714 -0
- package/corpus/templates/crm/server/lib/enrichment-cost.ts +381 -0
- package/corpus/templates/crm/server/lib/enrichment-slots.ts +519 -0
- package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
- package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
- package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +94 -0
- package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +39 -0
- package/corpus/templates/crm/server/lib/intelligence/summary.ts +19 -0
- package/corpus/templates/crm/server/lib/lifecycle.ts +634 -0
- package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
- package/corpus/templates/crm/server/middleware/auth.ts +4 -0
- package/corpus/templates/crm/server/plugins/agent-chat.ts +65 -0
- package/corpus/templates/crm/server/plugins/auth.ts +14 -0
- package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
- package/corpus/templates/crm/server/plugins/db.ts +738 -0
- package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/crm/shared/crm-attributes.ts +469 -0
- package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
- package/corpus/templates/crm/shared/crm-contract.ts +417 -0
- package/corpus/templates/crm/shared/crm-navigation.ts +190 -0
- package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
- package/corpus/templates/crm/ssr-entry.ts +11 -0
- package/corpus/templates/crm/tsconfig.json +24 -0
- package/corpus/templates/crm/vite.config.ts +15 -0
- package/corpus/templates/crm/vitest.config.ts +5 -0
- package/corpus/templates/design/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +15 -0
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +12 -0
- package/corpus/templates/design/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/design/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/design/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +201 -102
- package/corpus/templates/design/AGENTS.md +58 -71
- package/corpus/templates/design/actions/open-visual-edit.ts +111 -2
- package/corpus/templates/design/app/components/design/AddLocalhostScreenDialog.tsx +236 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +1 -1
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2 -2
- package/corpus/templates/design/app/entry.client.tsx +3 -0
- package/corpus/templates/design/app/i18n-data.ts +192 -12
- package/corpus/templates/design/app/pages/Present.tsx +6 -9
- package/corpus/templates/design/app/pages/VisualEdit.tsx +4 -7
- package/corpus/templates/design/app/pages/design-editor/design-data-geometry-utils.ts +20 -0
- package/corpus/templates/design/changelog/2026-07-26-apply-design-updates-from-a-centered-top-toolbar-without-cov.md +6 -0
- package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/dispatch/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/dispatch/app/entry.client.tsx +3 -0
- package/corpus/templates/dispatch/server/plugins/identity-sso.ts +27 -16
- package/corpus/templates/forms/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/forms/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/forms/DEVELOPING.md +1 -1
- package/corpus/templates/forms/app/entry.client.tsx +3 -0
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +3 -5
- package/corpus/templates/forms/app/routes/_app.tsx +4 -4
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/macros/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/macros/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/macros/app/entry.client.tsx +3 -0
- package/corpus/templates/mail/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +10 -0
- package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +3 -0
- package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +26 -2
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/mail/.agents/skills/inbox-automations/SKILL.md +37 -0
- package/corpus/templates/mail/.agents/skills/inbox-reads-and-triage/SKILL.md +58 -0
- package/corpus/templates/mail/.agents/skills/mail-backends/SKILL.md +33 -0
- package/corpus/templates/mail/.agents/skills/provider-api-scans/SKILL.md +39 -0
- package/corpus/templates/mail/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/mail/AGENTS.md +74 -143
- package/corpus/templates/mail/actions/create-alias.ts +36 -0
- package/corpus/templates/mail/actions/create-automation.ts +28 -0
- package/corpus/templates/mail/actions/create-scheduled-job.ts +45 -0
- package/corpus/templates/mail/actions/delete-alias.ts +26 -0
- package/corpus/templates/mail/actions/delete-automation.ts +21 -0
- package/corpus/templates/mail/actions/get-automation-settings.ts +32 -0
- package/corpus/templates/mail/actions/get-mail-preferences.ts +18 -0
- package/corpus/templates/mail/actions/list-aliases.ts +17 -0
- package/corpus/templates/mail/actions/list-automations.ts +18 -0
- package/corpus/templates/mail/actions/list-scheduled-jobs.ts +18 -0
- package/corpus/templates/mail/actions/update-alias.ts +37 -0
- package/corpus/templates/mail/actions/update-automation-settings.ts +33 -0
- package/corpus/templates/mail/actions/update-automation.ts +33 -0
- package/corpus/templates/mail/actions/update-mail-preferences.ts +68 -0
- package/corpus/templates/mail/actions/update-scheduled-job.ts +25 -0
- package/corpus/templates/mail/app/entry.client.tsx +3 -0
- package/corpus/templates/mail/app/hooks/use-aliases.ts +6 -36
- package/corpus/templates/mail/app/hooks/use-automations.ts +9 -16
- package/corpus/templates/mail/app/hooks/use-emails.ts +6 -5
- package/corpus/templates/mail/app/hooks/use-scheduled-jobs.ts +12 -15
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +15 -9
- package/corpus/templates/mail/server/handlers/automations.ts +5 -142
- package/corpus/templates/mail/server/handlers/emails.ts +1 -56
- package/corpus/templates/mail/server/handlers/scheduled-jobs.ts +0 -134
- package/corpus/templates/mail/server/lib/aliases.ts +18 -0
- package/corpus/templates/mail/server/lib/automations.ts +104 -0
- package/corpus/templates/mail/server/lib/jobs.ts +34 -0
- package/corpus/templates/mail/server/lib/mail-settings.ts +43 -0
- package/corpus/templates/mail/shared/automation-schema.ts +10 -0
- package/corpus/templates/plan/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/plan/.agents/skills/plan-authoring-flow/SKILL.md +98 -0
- package/corpus/templates/plan/.agents/skills/plan-browser-editing/SKILL.md +42 -0
- package/corpus/templates/plan/.agents/skills/plan-comments-and-feedback/SKILL.md +68 -0
- package/corpus/templates/plan/.agents/skills/plan-events/SKILL.md +22 -0
- package/corpus/templates/plan/.agents/skills/plan-hosted-writes/SKILL.md +42 -0
- package/corpus/templates/plan/.agents/skills/plan-local-codebase-chat/SKILL.md +38 -0
- package/corpus/templates/plan/.agents/skills/plan-review-recaps/SKILL.md +25 -0
- package/corpus/templates/plan/.agents/skills/plan-source-sync/SKILL.md +68 -0
- package/corpus/templates/plan/.agents/skills/plan-version-history/SKILL.md +25 -0
- package/corpus/templates/plan/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/plan/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/plan/AGENTS.md +64 -296
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +9 -8
- package/corpus/templates/plan/app/pages/PlansPage.tsx +5 -10
- package/corpus/templates/slides/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +7 -7
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/slides/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -2
- package/corpus/templates/slides/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/slides/DEVELOPING.md +3 -3
- package/corpus/templates/slides/actions/_deck-write.ts +52 -0
- package/corpus/templates/slides/actions/add-deck.ts +73 -0
- package/corpus/templates/slides/actions/delete-deck.ts +60 -0
- package/corpus/templates/slides/actions/get-deck.ts +3 -1
- package/corpus/templates/slides/actions/save-deck.ts +144 -0
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +27 -20
- package/corpus/templates/slides/app/context/DeckContext.tsx +173 -100
- package/corpus/templates/slides/app/pages/Index.tsx +3 -6
- package/corpus/templates/slides/app/routes/slide.tsx +16 -12
- package/corpus/templates/slides/changelog/2026-07-26-a-newly-created-deck-now-appears-in-the-deck-list-right-away.md +6 -0
- package/corpus/templates/slides/server/handlers/decks.ts +2 -378
- package/corpus/templates/tasks/.agents/skills/action-reference/SKILL.md +47 -0
- package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +19 -1
- package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +19 -1
- package/corpus/templates/tasks/.agents/skills/custom-fields/SKILL.md +63 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +20 -6
- package/corpus/templates/tasks/.agents/skills/security/SKILL.md +2 -0
- package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +228 -0
- package/corpus/templates/tasks/.agents/skills/store-conventions/SKILL.md +45 -0
- package/corpus/templates/tasks/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/tasks/.agents/skills/task-inbox-workflow/SKILL.md +66 -0
- package/corpus/templates/tasks/AGENTS.md +48 -113
- package/corpus/templates/tasks/app/entry.client.tsx +3 -0
- package/corpus/toolkit/CHANGELOG.md +12 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/composer/PromptComposer.tsx +23 -20
- package/dist/a2a/client.d.ts +3 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +4 -2
- package/dist/a2a/client.js.map +1 -1
- package/dist/agent/action-warnings.d.ts +27 -0
- package/dist/agent/action-warnings.d.ts.map +1 -0
- package/dist/agent/action-warnings.js +73 -0
- package/dist/agent/action-warnings.js.map +1 -0
- package/dist/agent/durable-background.d.ts +8 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +37 -5
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +47 -6
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +41 -9
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +46 -19
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/continuation-dispatch-retry.d.ts.map +1 -1
- package/dist/agent/engine/continuation-dispatch-retry.js +11 -9
- package/dist/agent/engine/continuation-dispatch-retry.js.map +1 -1
- package/dist/agent/engine/credential-errors.d.ts +6 -0
- package/dist/agent/engine/credential-errors.d.ts.map +1 -1
- package/dist/agent/engine/credential-errors.js +10 -0
- package/dist/agent/engine/credential-errors.js.map +1 -1
- package/dist/agent/engine/error-detail.d.ts +2 -0
- package/dist/agent/engine/error-detail.d.ts.map +1 -0
- package/dist/agent/engine/error-detail.js +37 -0
- package/dist/agent/engine/error-detail.js.map +1 -0
- package/dist/agent/engine/prompt-cache.d.ts +34 -0
- package/dist/agent/engine/prompt-cache.d.ts.map +1 -0
- package/dist/agent/engine/prompt-cache.js +39 -0
- package/dist/agent/engine/prompt-cache.js.map +1 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +23 -33
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/tool-call-journal-seed.d.ts +1 -1
- package/dist/agent/engine/tool-call-journal-seed.d.ts.map +1 -1
- package/dist/agent/engine/tool-call-journal-seed.js +2 -2
- package/dist/agent/engine/tool-call-journal-seed.js.map +1 -1
- package/dist/agent/engine/translate-anthropic.d.ts +28 -0
- package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
- package/dist/agent/engine/translate-anthropic.js +75 -0
- package/dist/agent/engine/translate-anthropic.js.map +1 -1
- package/dist/agent/loop-settings.d.ts +35 -2
- package/dist/agent/loop-settings.d.ts.map +1 -1
- package/dist/agent/loop-settings.js +71 -8
- package/dist/agent/loop-settings.js.map +1 -1
- package/dist/agent/production-agent.d.ts +105 -20
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +516 -123
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +24 -2
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-manager.d.ts +52 -9
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +191 -36
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +87 -14
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +331 -59
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +6 -1
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +18 -6
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +9 -5
- package/dist/agent/types.js.map +1 -1
- package/dist/application-state/script-helpers.d.ts.map +1 -1
- package/dist/application-state/script-helpers.js +2 -2
- package/dist/application-state/script-helpers.js.map +1 -1
- package/dist/cli/agents.d.ts +2 -0
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +48 -1
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/app-skill.js +1 -1
- package/dist/cli/app-skill.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +3 -3
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +73 -8
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/design-visual-edit-skill.js +169 -24
- package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +12 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +135 -125
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +17 -0
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +141 -31
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +9 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +12 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/embed-auth.d.ts.map +1 -1
- package/dist/client/embed-auth.js +3 -1
- package/dist/client/embed-auth.js.map +1 -1
- package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationCard.js +9 -4
- package/dist/client/integrations/IntegrationCard.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +13 -7
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/integrations/webhook-url.d.ts +7 -0
- package/dist/client/integrations/webhook-url.d.ts.map +1 -0
- package/dist/client/integrations/webhook-url.js +32 -0
- package/dist/client/integrations/webhook-url.js.map +1 -0
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +13 -11
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +2 -2
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +52 -13
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +9 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +24 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +1 -1
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/require-session.d.ts +12 -17
- package/dist/client/require-session.d.ts.map +1 -1
- package/dist/client/require-session.js +36 -23
- package/dist/client/require-session.js.map +1 -1
- package/dist/client/session-replay.js +1 -1
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/DemoModeSection.d.ts +0 -1
- package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
- package/dist/client/settings/DemoModeSection.js +0 -4
- package/dist/client/settings/DemoModeSection.js.map +1 -1
- package/dist/client/settings/SecretsSection.d.ts.map +1 -1
- package/dist/client/settings/SecretsSection.js +12 -8
- package/dist/client/settings/SecretsSection.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts +0 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +1 -4
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +33 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +83 -8
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +23 -14
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +9 -3
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +30 -3
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +3 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +18 -1
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/credentials/index.d.ts +29 -1
- package/dist/credentials/index.d.ts.map +1 -1
- package/dist/credentials/index.js +111 -2
- package/dist/credentials/index.js.map +1 -1
- package/dist/deploy/build.d.ts +14 -3
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +81 -24
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.d.ts +15 -0
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +19 -18
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/guards/no-localhost-fallback.d.ts +7 -0
- package/dist/guards/no-localhost-fallback.d.ts.map +1 -1
- package/dist/guards/no-localhost-fallback.js +75 -16
- package/dist/guards/no-localhost-fallback.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +8 -3
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +22 -4
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +17 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +60 -33
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/localization/default-messages.d.ts +17 -1
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +17 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/evals.d.ts.map +1 -1
- package/dist/observability/evals.js +7 -10
- package/dist/observability/evals.js.map +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/observability/traces.d.ts +2 -0
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/org/accept-pending.js +2 -2
- package/dist/org/accept-pending.js.map +1 -1
- package/dist/org/active-org.d.ts +16 -0
- package/dist/org/active-org.d.ts.map +1 -0
- package/dist/org/active-org.js +57 -0
- package/dist/org/active-org.js.map +1 -0
- package/dist/org/auto-join-domain.d.ts.map +1 -1
- package/dist/org/auto-join-domain.js +3 -2
- package/dist/org/auto-join-domain.js.map +1 -1
- package/dist/org/context.d.ts +19 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +159 -71
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts +24 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +129 -10
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/plugin.d.ts +2 -0
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +9 -2
- package/dist/org/plugin.js.map +1 -1
- package/dist/org/types.d.ts +6 -1
- package/dist/org/types.d.ts.map +1 -1
- package/dist/org/types.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +3 -2
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +2 -7
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +2 -2
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/scripts/chat/search-chats.d.ts.map +1 -1
- package/dist/scripts/chat/search-chats.js +2 -2
- package/dist/scripts/chat/search-chats.js.map +1 -1
- package/dist/scripts/describe-workspace-apps.d.ts +4 -0
- package/dist/scripts/describe-workspace-apps.d.ts.map +1 -0
- package/dist/scripts/describe-workspace-apps.js +34 -0
- package/dist/scripts/describe-workspace-apps.js.map +1 -0
- package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
- package/dist/scripts/resources/delete-memory.js +2 -2
- package/dist/scripts/resources/delete-memory.js.map +1 -1
- package/dist/scripts/resources/delete.d.ts.map +1 -1
- package/dist/scripts/resources/delete.js +2 -2
- package/dist/scripts/resources/delete.js.map +1 -1
- package/dist/scripts/resources/effective.d.ts.map +1 -1
- package/dist/scripts/resources/effective.js +2 -2
- package/dist/scripts/resources/effective.js.map +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +2 -2
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/read.d.ts.map +1 -1
- package/dist/scripts/resources/read.js +2 -2
- package/dist/scripts/resources/read.js.map +1 -1
- package/dist/scripts/resources/save-memory.d.ts.map +1 -1
- package/dist/scripts/resources/save-memory.js +2 -2
- package/dist/scripts/resources/save-memory.js.map +1 -1
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +2 -2
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-capabilities.d.ts +21 -0
- package/dist/server/agent-capabilities.d.ts.map +1 -0
- package/dist/server/agent-capabilities.js +106 -0
- package/dist/server/agent-capabilities.js.map +1 -0
- package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +11 -13
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.d.ts +32 -0
- package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +117 -56
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat/script-entries.d.ts.map +1 -1
- package/dist/server/agent-chat/script-entries.js +18 -8
- package/dist/server/agent-chat/script-entries.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +27 -1
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts +9 -9
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +32 -33
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +45 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +162 -139
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +35 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +155 -40
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/embed-session.d.ts.map +1 -1
- package/dist/server/embed-session.js +10 -0
- package/dist/server/embed-session.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +38 -0
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +12 -444
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +20 -56
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/open-route.d.ts.map +1 -1
- package/dist/server/open-route.js +6 -1
- package/dist/server/open-route.js.map +1 -1
- package/dist/server/poll.js +1 -1
- package/dist/server/poll.js.map +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
- package/dist/server/prompts/framework-core-compact.js +5 -6
- package/dist/server/prompts/framework-core-compact.js.map +1 -1
- package/dist/server/prompts/framework-core.d.ts.map +1 -1
- package/dist/server/prompts/framework-core.js +7 -10
- package/dist/server/prompts/framework-core.js.map +1 -1
- package/dist/server/prompts/shared-rules.d.ts +20 -2
- package/dist/server/prompts/shared-rules.d.ts.map +1 -1
- package/dist/server/prompts/shared-rules.js +20 -10
- package/dist/server/prompts/shared-rules.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/request-context.d.ts +26 -1
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +52 -2
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/scoped-key-storage.js +1 -1
- package/dist/server/scoped-key-storage.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/settings/org-settings.d.ts +2 -0
- package/dist/settings/org-settings.d.ts.map +1 -1
- package/dist/settings/org-settings.js +5 -1
- package/dist/settings/org-settings.js.map +1 -1
- package/dist/settings/store.d.ts +6 -0
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +25 -0
- package/dist/settings/store.js.map +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/sign-in-journey.d.ts +102 -0
- package/dist/shared/sign-in-journey.d.ts.map +1 -0
- package/dist/shared/sign-in-journey.js +269 -0
- package/dist/shared/sign-in-journey.js.map +1 -0
- package/dist/styles/agent-native.css +8 -0
- package/dist/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/dist/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/dist/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
- package/dist/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
- package/dist/templates/chat/AGENTS.md +8 -0
- package/dist/templates/chat/app/entry.client.tsx +3 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
- package/dist/templates/default/.agents/skills/security/SKILL.md +2 -0
- package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/dist/templates/default/AGENTS.md +68 -195
- package/dist/templates/default/app/entry.client.tsx +3 -0
- package/dist/templates/default/app/i18n/ar-SA.ts +8 -0
- package/dist/templates/default/app/i18n/de-DE.ts +8 -0
- package/dist/templates/default/app/i18n/en-US.ts +8 -0
- package/dist/templates/default/app/i18n/es-ES.ts +8 -0
- package/dist/templates/default/app/i18n/fr-FR.ts +8 -0
- package/dist/templates/default/app/i18n/hi-IN.ts +8 -0
- package/dist/templates/default/app/i18n/ja-JP.ts +8 -0
- package/dist/templates/default/app/i18n/ko-KR.ts +8 -0
- package/dist/templates/default/app/i18n/pt-BR.ts +8 -0
- package/dist/templates/default/app/i18n/zh-CN.ts +8 -0
- package/dist/templates/default/app/i18n/zh-TW.ts +8 -0
- package/dist/templates/headless/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
- package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
- package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
- package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
- package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
- package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
- package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
- package/dist/templates/workspace-core/AGENTS.md +62 -124
- package/dist/templates/workspace-root/AGENTS.md +6 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +10 -3
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +18 -8
- package/dist/vite/client.js.map +1 -1
- package/docs/content/actions.mdx +33 -20
- package/docs/content/agent-mentions.mdx +30 -19
- package/docs/content/agent-native-toolkit.mdx +8 -6
- package/docs/content/agent-resources.mdx +11 -0
- package/docs/content/agent-surfaces.mdx +41 -30
- package/docs/content/audit-log.mdx +78 -0
- package/docs/content/authentication.mdx +7 -5
- package/docs/content/automations.mdx +15 -9
- package/docs/content/client.mdx +11 -11
- package/docs/content/cloneable-saas.mdx +7 -1
- package/docs/content/code-agents-ui.mdx +9 -1
- package/docs/content/components.mdx +7 -0
- package/docs/content/context-awareness.mdx +1 -0
- package/docs/content/creating-templates.mdx +9 -1
- package/docs/content/custom-design-system.mdx +8 -0
- package/docs/content/data-programs.mdx +6 -0
- package/docs/content/deployment.mdx +2 -0
- package/docs/content/doctor.mdx +5 -3
- package/docs/content/extensions.mdx +26 -0
- package/docs/content/external-agents-catalog.mdx +533 -0
- package/docs/content/external-agents.mdx +20 -514
- package/docs/content/faq.mdx +2 -2
- package/docs/content/file-uploads.mdx +44 -0
- package/docs/content/frames.mdx +2 -2
- package/docs/content/generative-ui.mdx +8 -0
- package/docs/content/getting-started.mdx +45 -17
- package/docs/content/human-approval.mdx +9 -0
- package/docs/content/integrations.mdx +4 -3
- package/docs/content/internationalization.mdx +4 -11
- package/docs/content/key-concepts.mdx +1 -1
- package/docs/content/local-file-mode.mdx +5 -0
- package/docs/content/mcp-apps.mdx +2 -1
- package/docs/content/mcp-clients.mdx +32 -1
- package/docs/content/mcp-protocol.mdx +4 -3
- package/docs/content/messaging-internals.mdx +328 -0
- package/docs/content/messaging-recipes.mdx +194 -0
- package/docs/content/messaging.mdx +9 -307
- package/docs/content/multi-app-workspace.mdx +1 -1
- package/docs/content/multi-tenancy.mdx +1 -0
- package/docs/content/native-chat-ui.mdx +8 -0
- package/docs/content/notifications.mdx +18 -20
- package/docs/content/observability.mdx +1 -0
- package/docs/content/onboarding.mdx +20 -6
- package/docs/content/organizations-teams-permissions.mdx +99 -124
- package/docs/content/package-lifecycle.mdx +19 -7
- package/docs/content/progress.mdx +11 -0
- package/docs/content/real-time-collaboration.mdx +44 -3
- package/docs/content/recurring-jobs.mdx +14 -1
- package/docs/content/security.mdx +5 -2
- package/docs/content/server.mdx +2 -1
- package/docs/content/sharing.mdx +22 -3
- package/docs/content/skills-guide.mdx +62 -19
- package/docs/content/syncing-template-changes.mdx +9 -0
- package/docs/content/template-analytics-connectors.mdx +75 -0
- package/docs/content/template-analytics-dashboards.mdx +106 -0
- package/docs/content/template-analytics-developers.mdx +287 -0
- package/docs/content/template-analytics-monitoring-and-sessions.mdx +109 -0
- package/docs/content/template-analytics.mdx +21 -263
- package/docs/content/template-assets-developers.mdx +456 -0
- package/docs/content/template-assets-generation.mdx +147 -0
- package/docs/content/template-assets-integrations.mdx +319 -0
- package/docs/content/template-assets-presets.mdx +185 -0
- package/docs/content/template-assets.mdx +12 -562
- package/docs/content/template-brain-agent.mdx +103 -0
- package/docs/content/template-brain-developers.mdx +379 -0
- package/docs/content/template-brain-knowledge.mdx +50 -0
- package/docs/content/template-brain-sources.mdx +163 -0
- package/docs/content/template-brain.mdx +30 -390
- package/docs/content/template-calendar-agent.mdx +133 -0
- package/docs/content/template-calendar-booking-links.mdx +73 -0
- package/docs/content/template-calendar-developers.mdx +366 -0
- package/docs/content/template-calendar-scheduling.mdx +128 -0
- package/docs/content/template-calendar.mdx +13 -260
- package/docs/content/template-chat-developers.mdx +88 -0
- package/docs/content/template-chat-first-edits.mdx +145 -0
- package/docs/content/template-chat.mdx +12 -77
- package/docs/content/template-clips-ai-and-editing.mdx +114 -0
- package/docs/content/template-clips-capture-everywhere.mdx +120 -0
- package/docs/content/template-clips-developers.mdx +373 -0
- package/docs/content/template-clips-sharing-and-teams.mdx +182 -0
- package/docs/content/template-clips.mdx +19 -508
- package/docs/content/template-content-databases.mdx +406 -0
- package/docs/content/template-content-developers.mdx +364 -0
- package/docs/content/template-content-editing.mdx +60 -0
- package/docs/content/template-content-sync.mdx +149 -0
- package/docs/content/template-content.mdx +21 -561
- package/docs/content/template-design-brand-and-figma.mdx +150 -0
- package/docs/content/template-design-collaboration-and-full-apps.mdx +125 -0
- package/docs/content/template-design-developers.mdx +358 -0
- package/docs/content/template-design-quality-and-components.mdx +95 -0
- package/docs/content/template-design.mdx +20 -344
- package/docs/content/template-dispatch-developers.mdx +121 -0
- package/docs/content/template-dispatch-messaging-routing.mdx +114 -0
- package/docs/content/template-dispatch-operations.mdx +160 -0
- package/docs/content/template-dispatch-vault-integrations.mdx +316 -0
- package/docs/content/template-dispatch.mdx +24 -283
- package/docs/content/template-forms-building-publishing.mdx +135 -0
- package/docs/content/template-forms-developers.mdx +195 -0
- package/docs/content/template-forms-responses.mdx +120 -0
- package/docs/content/template-forms.mdx +21 -230
- package/docs/content/template-mail-agent.mdx +114 -0
- package/docs/content/template-mail-developers.mdx +356 -0
- package/docs/content/template-mail-drafts-and-queue.mdx +103 -0
- package/docs/content/template-mail-inbox.mdx +118 -0
- package/docs/content/template-mail.mdx +23 -274
- package/docs/content/template-plan-automations.mdx +213 -0
- package/docs/content/template-plan-developers.mdx +703 -0
- package/docs/content/template-plan-local-and-desktop.mdx +236 -0
- package/docs/content/template-plan-review-workflow.mdx +180 -0
- package/docs/content/template-plan.mdx +60 -910
- package/docs/content/template-slides-agent.mdx +102 -0
- package/docs/content/template-slides-design-and-media.mdx +94 -0
- package/docs/content/template-slides-developers.mdx +488 -0
- package/docs/content/template-slides-editing.mdx +56 -0
- package/docs/content/template-slides.mdx +20 -362
- package/docs/content/toolkit-capability-packages.mdx +38 -13
- package/docs/content/toolkit-context-knowledge.mdx +49 -9
- package/docs/content/toolkit-editors-canvases.mdx +72 -10
- package/docs/content/toolkit-resources.mdx +16 -0
- package/docs/content/toolkit-settings.mdx +3 -3
- package/docs/content/toolkit-sharing.mdx +5 -7
- package/docs/content/using-your-agent.mdx +25 -2
- package/docs/content/voice-input.mdx +11 -7
- package/docs/content/what-is-agent-native.mdx +1 -0
- package/docs/content/workspace-connections.mdx +21 -11
- package/docs/content/workspace-management.mdx +1 -1
- package/package.json +2 -4
- package/src/a2a/client.ts +4 -2
- package/src/agent/action-warnings.ts +103 -0
- package/src/agent/durable-background.ts +42 -5
- package/src/agent/engine/ai-sdk-engine.ts +58 -6
- package/src/agent/engine/anthropic-engine.ts +51 -8
- package/src/agent/engine/builder-engine.ts +56 -18
- package/src/agent/engine/continuation-dispatch-retry.ts +10 -9
- package/src/agent/engine/credential-errors.ts +11 -0
- package/src/agent/engine/error-detail.ts +39 -0
- package/src/agent/engine/prompt-cache.ts +44 -0
- package/src/agent/engine/registry.ts +22 -30
- package/src/agent/engine/tool-call-journal-seed.ts +2 -1
- package/src/agent/engine/translate-anthropic.ts +99 -0
- package/src/agent/loop-settings.ts +94 -7
- package/src/agent/production-agent.ts +667 -157
- package/src/agent/run-loop-with-resume.ts +27 -1
- package/src/agent/run-manager.ts +229 -39
- package/src/agent/run-store.ts +397 -64
- package/src/agent/thread-data-builder.ts +5 -1
- package/src/agent/types.ts +23 -6
- package/src/application-state/script-helpers.ts +5 -2
- package/src/cli/agents.ts +69 -1
- package/src/cli/app-skill.ts +1 -1
- package/src/cli/code-agent-executor.ts +7 -3
- package/src/cli/design-connect.ts +82 -8
- package/src/cli/skills-content/design-visual-edit-skill.ts +169 -24
- package/src/cli/templates-meta.ts +12 -0
- package/src/client/AssistantChat.tsx +623 -607
- package/src/client/agent-chat-adapter.ts +176 -29
- package/src/client/chat/message-components.tsx +13 -0
- package/src/client/embed-auth.ts +3 -1
- package/src/client/integrations/IntegrationCard.tsx +41 -24
- package/src/client/integrations/IntegrationsPanel.tsx +37 -21
- package/src/client/integrations/webhook-url.ts +29 -0
- package/src/client/org/OrgSwitcher.tsx +41 -27
- package/src/client/org/RequireActiveOrg.tsx +7 -0
- package/src/client/org/TeamPage.tsx +144 -14
- package/src/client/org/hooks.ts +27 -0
- package/src/client/org/index.ts +2 -0
- package/src/client/require-session.tsx +40 -29
- package/src/client/session-replay.ts +1 -1
- package/src/client/settings/DemoModeSection.tsx +0 -5
- package/src/client/settings/SecretsSection.tsx +47 -42
- package/src/client/settings/VoiceTranscriptionSection.tsx +0 -5
- package/src/client/sse-event-processor.ts +83 -8
- package/src/client/use-action.ts +22 -13
- package/src/client/use-agent-engine-configured.ts +36 -4
- package/src/client/use-db-sync.ts +21 -1
- package/src/credentials/index.ts +124 -2
- package/src/deploy/build.ts +93 -30
- package/src/deploy/workspace-deploy.ts +21 -16
- package/src/guards/no-localhost-fallback.ts +76 -14
- package/src/integrations/google-docs-poller.ts +19 -12
- package/src/integrations/webhook-handler.ts +56 -33
- package/src/jobs/scheduler.ts +57 -23
- package/src/localization/default-messages.ts +23 -1
- package/src/observability/evals.ts +7 -8
- package/src/observability/traces.ts +2 -0
- package/src/org/accept-pending.ts +2 -2
- package/src/org/active-org.ts +73 -0
- package/src/org/auto-join-domain.ts +7 -2
- package/src/org/context.ts +169 -66
- package/src/org/handlers.ts +148 -10
- package/src/org/plugin.ts +8 -1
- package/src/org/types.ts +6 -1
- package/src/provider-api/index.ts +6 -1
- package/src/resources/handlers.ts +2 -6
- package/src/resources/script-helpers.ts +2 -1
- package/src/scripts/chat/search-chats.ts +5 -2
- package/src/scripts/describe-workspace-apps.ts +59 -0
- package/src/scripts/resources/delete-memory.ts +5 -2
- package/src/scripts/resources/delete.ts +5 -2
- package/src/scripts/resources/effective.ts +5 -2
- package/src/scripts/resources/list.ts +5 -2
- package/src/scripts/resources/read.ts +5 -2
- package/src/scripts/resources/save-memory.ts +5 -2
- package/src/scripts/resources/write.ts +5 -2
- package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +11 -31
- package/src/server/agent-capabilities.ts +147 -0
- package/src/server/agent-chat/framework-prompts.ts +11 -13
- package/src/server/agent-chat/prompt-resources.ts +183 -57
- package/src/server/agent-chat/script-entries.ts +20 -7
- package/src/server/agent-chat-plugin.ts +27 -0
- package/src/server/auth.ts +38 -32
- package/src/server/core-routes-plugin.ts +229 -179
- package/src/server/credential-provider.ts +196 -44
- package/src/server/embed-session.ts +10 -0
- package/src/server/framework-request-handler.ts +43 -0
- package/src/server/google-auth-plugin.ts +13 -450
- package/src/server/index.ts +4 -1
- package/src/server/onboarding-html.ts +20 -56
- package/src/server/open-route.ts +6 -1
- package/src/server/poll.ts +1 -1
- package/src/server/prompts/framework-core-compact.ts +5 -5
- package/src/server/prompts/framework-core.ts +7 -9
- package/src/server/prompts/shared-rules.ts +20 -9
- package/src/server/request-context.ts +58 -2
- package/src/server/scoped-key-storage.ts +1 -1
- package/src/settings/org-settings.ts +9 -0
- package/src/settings/store.ts +29 -0
- package/src/shared/index.ts +13 -0
- package/src/shared/sign-in-journey.ts +331 -0
- package/src/styles/agent-native.css +8 -0
- package/src/templates/chat/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +20 -6
- package/src/templates/chat/.agents/skills/security/SKILL.md +2 -0
- package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/src/templates/chat/.agents/skills/sharing/SKILL.md +228 -0
- package/src/templates/chat/.agents/skills/storing-data/SKILL.md +178 -0
- package/src/templates/chat/AGENTS.md +8 -0
- package/src/templates/chat/app/entry.client.tsx +3 -0
- package/src/templates/default/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +20 -6
- package/src/templates/default/.agents/skills/security/SKILL.md +2 -0
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/src/templates/default/AGENTS.md +68 -195
- package/src/templates/default/app/entry.client.tsx +3 -0
- package/src/templates/default/app/i18n/ar-SA.ts +8 -0
- package/src/templates/default/app/i18n/de-DE.ts +8 -0
- package/src/templates/default/app/i18n/en-US.ts +8 -0
- package/src/templates/default/app/i18n/es-ES.ts +8 -0
- package/src/templates/default/app/i18n/fr-FR.ts +8 -0
- package/src/templates/default/app/i18n/hi-IN.ts +8 -0
- package/src/templates/default/app/i18n/ja-JP.ts +8 -0
- package/src/templates/default/app/i18n/ko-KR.ts +8 -0
- package/src/templates/default/app/i18n/pt-BR.ts +8 -0
- package/src/templates/default/app/i18n/zh-CN.ts +8 -0
- package/src/templates/default/app/i18n/zh-TW.ts +8 -0
- package/src/templates/headless/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +19 -1
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +100 -0
- package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -1
- package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +28 -0
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +14 -1
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +20 -6
- package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +6 -3
- package/src/templates/workspace-core/.agents/skills/security/SKILL.md +2 -0
- package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -3
- package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +7 -3
- package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +91 -0
- package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +60 -0
- package/src/templates/workspace-core/AGENTS.md +62 -124
- package/src/templates/workspace-root/AGENTS.md +6 -1
- package/src/triggers/dispatcher.ts +28 -17
- package/src/vite/client.ts +20 -8
- package/corpus/core/src/client/components/MissingKeyCard.tsx +0 -61
- package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +0 -495
- package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +0 -193
- package/corpus/core/src/client/settings/BrowserSection.tsx +0 -110
- package/corpus/templates/analytics/app/components/InlineMetric.tsx +0 -31
- package/corpus/templates/analytics/app/components/auth/LoginScreen.tsx +0 -4
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +0 -128
- package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +0 -264
- package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +0 -84
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +0 -92
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +0 -154
- package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +0 -49
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +0 -120
- package/corpus/templates/analytics/server/handlers/dashboard-views.ts +0 -85
- package/corpus/templates/analytics/server/handlers/user-prefs.ts +0 -58
- package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId]/[viewId].delete.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/dashboard-views/[dashboardId].post.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/theme.get.ts +0 -17
- package/corpus/templates/analytics/server/routes/api/theme.post.ts +0 -15
- package/corpus/templates/analytics/server/routes/api/user-prefs/[key].delete.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/user-prefs/[key].get.ts +0 -1
- package/corpus/templates/analytics/server/routes/api/user-prefs/[key].put.ts +0 -1
- package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +0 -156
- package/corpus/templates/assets/app/components/library/LibraryCard.tsx +0 -213
- package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +0 -49
- package/corpus/templates/calendar/server/routes/api/events/[id].delete.ts +0 -1
- package/corpus/templates/calendar/server/routes/api/events/[id].get.ts +0 -1
- package/corpus/templates/calendar/server/routes/api/events/[id].put.ts +0 -1
- package/corpus/templates/content/app/components/layout/AppLayout.tsx +0 -9
- package/corpus/templates/content/server/routes/api/comments/[id].delete.ts +0 -69
- package/corpus/templates/content/server/routes/api/comments/[id].patch.ts +0 -109
- package/corpus/templates/content/server/routes/api/documents/[id]/versions.get.ts +0 -53
- package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +0 -85
- package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +0 -129
- package/corpus/templates/forms/app/components/layout/AppLayout.tsx +0 -9
- package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +0 -213
- package/corpus/templates/mail/server/handlers/aliases.ts +0 -98
- package/corpus/templates/mail/server/routes/api/aliases/[id].delete.ts +0 -1
- package/corpus/templates/mail/server/routes/api/aliases/[id].patch.ts +0 -1
- package/corpus/templates/mail/server/routes/api/aliases/index.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/aliases/index.post.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/[id].delete.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/[id].patch.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/index.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/index.post.ts +0 -1
- package/corpus/templates/mail/server/routes/api/automations/settings.get.ts +0 -22
- package/corpus/templates/mail/server/routes/api/automations/settings.put.ts +0 -25
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].delete.ts +0 -1
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/[id].patch.ts +0 -1
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/scheduled-jobs/index.post.ts +0 -1
- package/corpus/templates/mail/server/routes/api/settings.get.ts +0 -1
- package/corpus/templates/mail/server/routes/api/settings.patch.ts +0 -1
- package/corpus/templates/slides/app/components/deck/BuilderLogo.tsx +0 -22
- package/corpus/templates/slides/app/components/design-system/DesignSystemPreview.tsx +0 -176
- package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +0 -244
- package/corpus/templates/slides/app/components/editor/ImportButton.tsx +0 -84
- package/corpus/templates/slides/server/routes/api/comments/[id].delete.ts +0 -43
- package/corpus/templates/slides/server/routes/api/comments/[id].patch.ts +0 -50
- package/corpus/templates/slides/server/routes/api/decks/[id].delete.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/[id].get.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/[id].put.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/index.get.ts +0 -1
- package/corpus/templates/slides/server/routes/api/decks/index.post.ts +0 -1
- package/dist/client/components/MissingKeyCard.d.ts +0 -7
- package/dist/client/components/MissingKeyCard.d.ts.map +0 -1
- package/dist/client/components/MissingKeyCard.js +0 -32
- package/dist/client/components/MissingKeyCard.js.map +0 -1
- package/dist/client/extensions/agent-native-extension-runtime.d.ts +0 -69
- package/dist/client/extensions/agent-native-extension-runtime.d.ts.map +0 -1
- package/dist/client/extensions/agent-native-extension-runtime.js +0 -348
- package/dist/client/extensions/agent-native-extension-runtime.js.map +0 -1
- package/dist/client/settings/BackgroundAgentSection.d.ts +0 -2
- package/dist/client/settings/BackgroundAgentSection.d.ts.map +0 -1
- package/dist/client/settings/BackgroundAgentSection.js +0 -68
- package/dist/client/settings/BackgroundAgentSection.js.map +0 -1
- package/dist/client/settings/BrowserSection.d.ts +0 -2
- package/dist/client/settings/BrowserSection.d.ts.map +0 -1
- package/dist/client/settings/BrowserSection.js +0 -40
- package/dist/client/settings/BrowserSection.js.map +0 -1
- package/dist/templates/chat/.react-router/types/+server-build.d.ts +0 -18
- package/dist/templates/chat/.react-router/types/app/+types/root.ts +0 -68
- package/src/client/components/MissingKeyCard.tsx +0 -61
- package/src/client/extensions/agent-native-extension-runtime.ts +0 -495
- package/src/client/settings/BackgroundAgentSection.tsx +0 -193
- package/src/client/settings/BrowserSection.tsx +0 -110
- package/src/templates/chat/.react-router/types/+server-build.d.ts +0 -18
- package/src/templates/chat/.react-router/types/app/+types/root.ts +0 -68
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
} from "../action.js";
|
|
20
20
|
import { readAppState } from "../application-state/script-helpers.js";
|
|
21
21
|
import { isReadOnlyShellCommand } from "../coding-tools/index.js";
|
|
22
|
+
import { getDbExec } from "../db/client.js";
|
|
22
23
|
import { extensionIdFromPathname } from "../extensions/path.js";
|
|
23
24
|
import { preUploadAttachments } from "../file-upload/pre-upload-attachments.js";
|
|
24
25
|
import { isMcpActionResult } from "../mcp-client/app-result.js";
|
|
@@ -56,6 +57,10 @@ import {
|
|
|
56
57
|
type ReasoningEffort,
|
|
57
58
|
} from "../shared/reasoning-effort.js";
|
|
58
59
|
import { actionPreparationContinuationNote } from "./action-continuation-guidance.js";
|
|
60
|
+
import {
|
|
61
|
+
drainAgentWarnings,
|
|
62
|
+
formatAgentWarningsForToolResult,
|
|
63
|
+
} from "./action-warnings.js";
|
|
59
64
|
import {
|
|
60
65
|
buildSystemManifestSections,
|
|
61
66
|
readContextXraySystemSections,
|
|
@@ -109,9 +114,11 @@ import { EngineError } from "./engine/types.js";
|
|
|
109
114
|
import {
|
|
110
115
|
type AgentLoopSettings,
|
|
111
116
|
getDefaultMaxIterations,
|
|
117
|
+
getDefaultMaxRunInputTokens,
|
|
112
118
|
MAX_AGENT_MAX_ITERATIONS,
|
|
113
119
|
MIN_AGENT_MAX_ITERATIONS,
|
|
114
120
|
normalizeMaxIterations,
|
|
121
|
+
normalizeMaxRunInputTokens,
|
|
115
122
|
readAgentLoopSettings,
|
|
116
123
|
} from "./loop-settings.js";
|
|
117
124
|
import {
|
|
@@ -137,6 +144,7 @@ import {
|
|
|
137
144
|
tryClaimRunSlot,
|
|
138
145
|
isHostedRuntime,
|
|
139
146
|
resolveRunSoftTimeoutMs,
|
|
147
|
+
resolveRunToolTimeoutCeilingMs,
|
|
140
148
|
} from "./run-manager.js";
|
|
141
149
|
import type { ActiveRun } from "./run-manager.js";
|
|
142
150
|
import {
|
|
@@ -144,6 +152,7 @@ import {
|
|
|
144
152
|
readLedgerEntry,
|
|
145
153
|
clearLedgerForThread,
|
|
146
154
|
insertRun,
|
|
155
|
+
insertRunEvent,
|
|
147
156
|
isTurnAborted,
|
|
148
157
|
markRunAborted,
|
|
149
158
|
updateRunHeartbeat,
|
|
@@ -158,7 +167,10 @@ import {
|
|
|
158
167
|
UNCLAIMED_BACKGROUND_RUN_GRACE_MS,
|
|
159
168
|
} from "./run-store.js";
|
|
160
169
|
import { buildCurrentTimeUserContext } from "./runtime-context.js";
|
|
161
|
-
import {
|
|
170
|
+
import {
|
|
171
|
+
findCompletedJournalEntry,
|
|
172
|
+
type ToolCallJournal,
|
|
173
|
+
} from "./tool-call-journal.js";
|
|
162
174
|
import {
|
|
163
175
|
redactSensitiveFields,
|
|
164
176
|
sanitizeToolErrorText,
|
|
@@ -180,6 +192,7 @@ import type {
|
|
|
180
192
|
AgentChatEvent,
|
|
181
193
|
AgentChatReference,
|
|
182
194
|
AgentChatStructuredMessage,
|
|
195
|
+
RunEvent,
|
|
183
196
|
} from "./types.js";
|
|
184
197
|
|
|
185
198
|
// Register built-in engines on first import
|
|
@@ -1086,9 +1099,11 @@ const MODEL_STREAM_NO_PROGRESS_TIMEOUT_MS = 90_000;
|
|
|
1086
1099
|
* around 40s, so that watchdog could never actually fire: the run died as a
|
|
1087
1100
|
* silent platform kill instead of a recoverable checkpoint (observed: ~40s of
|
|
1088
1101
|
* "Contacting model" with zero tokens, then a hard timeout with no
|
|
1089
|
-
* auto_continue ever emitted). Once
|
|
1090
|
-
*
|
|
1091
|
-
*
|
|
1102
|
+
* auto_continue ever emitted). Once a real model event has been observed for
|
|
1103
|
+
* this model call, subsequent gaps revert to the normal 90s watchdog — this
|
|
1104
|
+
* only guards the "nothing has happened yet" window. A `gateway-heartbeat`
|
|
1105
|
+
* does NOT count as that first event (it proves the transport is up, not that
|
|
1106
|
+
* the model started); it is excluded from stream progress for the same reason.
|
|
1092
1107
|
*
|
|
1093
1108
|
* ORDERING INVARIANT (each bound must stay strictly smaller than the next —
|
|
1094
1109
|
* do not change one without re-checking the others). This cap exists ONLY
|
|
@@ -1123,6 +1138,16 @@ const MAX_RESOURCE_INVENTORY_ITEMS = 40;
|
|
|
1123
1138
|
const MAX_RESOURCE_INVENTORY_DESCRIPTION_CHARS = 160;
|
|
1124
1139
|
const MAX_INLINE_SKILL_REFERENCE_CHARS = 40_000;
|
|
1125
1140
|
const SOURCE_SWEEP_TOOL_CALL_THRESHOLD = 12;
|
|
1141
|
+
/**
|
|
1142
|
+
* Serialized-byte threshold at which a run reports how much tool schema
|
|
1143
|
+
* `expandActiveTools` has loaded on top of its starting set. Expansion is
|
|
1144
|
+
* monotonic — schemas added mid-turn are never released — and failing runs
|
|
1145
|
+
* carry ~3.4x the event payload of clean ones, but that is a correlation, not
|
|
1146
|
+
* a cause. Measure first; a cap or LRU eviction can only be sized safely once
|
|
1147
|
+
* the real distribution is known (dropping a tool the model is about to call
|
|
1148
|
+
* is worse than a large request).
|
|
1149
|
+
*/
|
|
1150
|
+
const EXPANDED_TOOL_SCHEMA_WARN_BYTES = 32_000;
|
|
1126
1151
|
|
|
1127
1152
|
/**
|
|
1128
1153
|
* Hard cap on the `<current-screen>` block injected into EVERY user message.
|
|
@@ -1322,6 +1347,43 @@ export function trimOldToolResults(
|
|
|
1322
1347
|
return trimmed ? result : null;
|
|
1323
1348
|
}
|
|
1324
1349
|
|
|
1350
|
+
/** Upper bound (jitter included) on what `retryDelay(attempt)` will sleep. */
|
|
1351
|
+
function maxRetryDelayMs(attempt: number): number {
|
|
1352
|
+
return RETRY_BASE_DELAY_MS * Math.pow(2, attempt) * 1.1;
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
/**
|
|
1356
|
+
* Wall-clock left in this invocation's soft-timeout budget, measured from
|
|
1357
|
+
* `startedAt`. `Infinity` off the hosted soft-timeout regime (local dev,
|
|
1358
|
+
* self-hosted), where runs are genuinely unbounded. Uses the same ceiling
|
|
1359
|
+
* `startRun` sizes the round to, so budget math here can't disagree with the
|
|
1360
|
+
* soft timeout that actually aborts the run.
|
|
1361
|
+
*/
|
|
1362
|
+
export function remainingRunBudgetMs(startedAt: number): number {
|
|
1363
|
+
const ceilingMs = resolveRunSoftTimeoutMs(undefined, {
|
|
1364
|
+
useHostedDefault: true,
|
|
1365
|
+
backgroundFunction: isInBackgroundFunctionRuntime(),
|
|
1366
|
+
});
|
|
1367
|
+
if (ceilingMs <= 0) return Number.POSITIVE_INFINITY;
|
|
1368
|
+
return ceilingMs - (Date.now() - startedAt);
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
/**
|
|
1372
|
+
* Whether one more engine retry — its backoff sleep, plus a minimal window for
|
|
1373
|
+
* the resume layer above — still fits in the run budget. Count-based retries
|
|
1374
|
+
* alone burn the entire hosted foreground budget on a deterministic failure
|
|
1375
|
+
* (observed: every failing run spent all 3 retries, ~14s of it asleep, and
|
|
1376
|
+
* left nothing for recovery).
|
|
1377
|
+
*/
|
|
1378
|
+
function hasBudgetForEngineRetry(startedAt: number, attempt: number): boolean {
|
|
1379
|
+
const remainingMs = remainingRunBudgetMs(startedAt);
|
|
1380
|
+
if (remainingMs === Number.POSITIVE_INFINITY) return true;
|
|
1381
|
+
return (
|
|
1382
|
+
remainingMs - maxRetryDelayMs(attempt) >=
|
|
1383
|
+
SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS
|
|
1384
|
+
);
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1325
1387
|
/** Wait with exponential backoff, respecting abort signal */
|
|
1326
1388
|
function retryDelay(attempt: number, signal: AbortSignal): Promise<void> {
|
|
1327
1389
|
const baseMs = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
|
|
@@ -2332,11 +2394,63 @@ async function applyObservationalMemoryToContext(
|
|
|
2332
2394
|
}
|
|
2333
2395
|
}
|
|
2334
2396
|
|
|
2397
|
+
/**
|
|
2398
|
+
* Cross-chunk read-only result cache seed.
|
|
2399
|
+
*
|
|
2400
|
+
* A chained continuation chunk rebuilds `messages` without the prior chunk's
|
|
2401
|
+
* tool results, so `seedReadOnlyToolResultsFromHistory` sees nothing and every
|
|
2402
|
+
* read-only tool (run-code, provider-api-request, tool-search, every research
|
|
2403
|
+
* tool) re-executes from scratch. Their only cross-chunk protection was the
|
|
2404
|
+
* prompt-level resume note, which truncates each result to 400 chars — a
|
|
2405
|
+
* 50,000-char run-code result came back as 400 chars, leaving the model no
|
|
2406
|
+
* option but to re-run it. Re-executed reads were the dominant term in
|
|
2407
|
+
* production spend.
|
|
2408
|
+
*
|
|
2409
|
+
* The full `tool_done` result IS in the durable run ledger, so seed the same
|
|
2410
|
+
* cache the in-run duplicate guard uses. The tool layer then serves the real
|
|
2411
|
+
* result while the prompt note keeps its short summary.
|
|
2412
|
+
*
|
|
2413
|
+
* Staleness is bounded to the CURRENT TURN: the journal is built from
|
|
2414
|
+
* `getCurrentTurnEventsForThread`, so nothing older than the user's current
|
|
2415
|
+
* request can be replayed, and a successful write inside the turn clears the
|
|
2416
|
+
* cache exactly as it does for in-chunk reads.
|
|
2417
|
+
*/
|
|
2418
|
+
function seedReadOnlyToolResultsFromJournal(
|
|
2419
|
+
journal: ToolCallJournal | null,
|
|
2420
|
+
actions: Record<string, ActionEntry>,
|
|
2421
|
+
): Map<string, string> {
|
|
2422
|
+
const cache = new Map<string, string>();
|
|
2423
|
+
if (!journal) return cache;
|
|
2424
|
+
for (const entry of journal.completed) {
|
|
2425
|
+
const action = actions[entry.tool];
|
|
2426
|
+
if (action?.readOnly !== true) {
|
|
2427
|
+
// Mirror the live loop: a completed write invalidates every cached read.
|
|
2428
|
+
cache.clear();
|
|
2429
|
+
continue;
|
|
2430
|
+
}
|
|
2431
|
+
if (action.dedupe === false) continue;
|
|
2432
|
+
const result = entry.result ?? "";
|
|
2433
|
+
if (
|
|
2434
|
+
!isReusableReadOnlyToolResult({
|
|
2435
|
+
type: "tool-result",
|
|
2436
|
+
toolCallId: "",
|
|
2437
|
+
toolName: entry.tool,
|
|
2438
|
+
content: result,
|
|
2439
|
+
} as EngineToolResultPart)
|
|
2440
|
+
) {
|
|
2441
|
+
continue;
|
|
2442
|
+
}
|
|
2443
|
+
cache.set(toolCallCacheKey(entry.tool, entry.input), result);
|
|
2444
|
+
}
|
|
2445
|
+
return cache;
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2335
2448
|
function seedReadOnlyToolResultsFromHistory(
|
|
2336
2449
|
messages: EngineMessage[],
|
|
2337
2450
|
actions: Record<string, ActionEntry>,
|
|
2451
|
+
seed?: Map<string, string>,
|
|
2338
2452
|
): Map<string, string> {
|
|
2339
|
-
const cache = new Map<string, string>();
|
|
2453
|
+
const cache = new Map<string, string>(seed);
|
|
2340
2454
|
if (!isInternalContinuationTurn(messages)) return cache;
|
|
2341
2455
|
|
|
2342
2456
|
// Scoped to the current turn only (same slice as
|
|
@@ -2552,6 +2666,21 @@ const INTERRUPTED_TOOL_RESULT_MARKER =
|
|
|
2552
2666
|
"Interrupted before this tool returned a result.";
|
|
2553
2667
|
const MAX_WRITE_TOOL_INTERRUPTIONS = 2;
|
|
2554
2668
|
const MAX_IDENTICAL_TOOL_ERRORS = 3;
|
|
2669
|
+
/**
|
|
2670
|
+
* Identical (tool, arguments) invocations tolerated in one turn before the turn
|
|
2671
|
+
* is stopped, whether or not they errored.
|
|
2672
|
+
*
|
|
2673
|
+
* This is the guard that distinguishes a spiral from deep work. Volume ceilings
|
|
2674
|
+
* cannot: prod contains a legitimate 117-tool-call analysis alongside turns that
|
|
2675
|
+
* issued 39 identical `run-code` webFetches and 43 identical `docs-search`
|
|
2676
|
+
* calls. Repetition is what separates them, so repetition is what we bound —
|
|
2677
|
+
* leaving genuinely long analyses free to keep making NEW calls.
|
|
2678
|
+
*
|
|
2679
|
+
* Above `MAX_IDENTICAL_TOOL_ERRORS` (3) because a repeated SUCCESS is weaker
|
|
2680
|
+
* evidence of a loop than a repeated failure: a few identical reads can be a
|
|
2681
|
+
* legitimate re-check after a write.
|
|
2682
|
+
*/
|
|
2683
|
+
export const MAX_IDENTICAL_TOOL_CALLS = 8;
|
|
2555
2684
|
|
|
2556
2685
|
function seedWriteToolInterruptionsFromHistory(
|
|
2557
2686
|
messages: EngineMessage[],
|
|
@@ -2834,6 +2963,14 @@ const DEFAULT_INITIAL_TOOL_NAMES = new Set([
|
|
|
2834
2963
|
"docs-search",
|
|
2835
2964
|
"get-framework-context",
|
|
2836
2965
|
"read-attachment",
|
|
2966
|
+
// The `<available-apps>` prompt block names these two BY NAME on the same
|
|
2967
|
+
// request, and "which app should I use for this?" is answered on turn one or
|
|
2968
|
+
// not at all. Omitting them made the model read the instruction, find no
|
|
2969
|
+
// schema, and answer from its own assumptions instead of spending a
|
|
2970
|
+
// tool-search turn — so users were told a capability did not exist while a
|
|
2971
|
+
// sibling app owned it.
|
|
2972
|
+
"describe-workspace-apps",
|
|
2973
|
+
"call-agent",
|
|
2837
2974
|
]);
|
|
2838
2975
|
|
|
2839
2976
|
function isDefaultInitialToolName(name: string): boolean {
|
|
@@ -3474,6 +3611,8 @@ export async function runAgentLoop(opts: {
|
|
|
3474
3611
|
actions: Record<string, ActionEntry>;
|
|
3475
3612
|
send: (event: AgentChatEvent) => void;
|
|
3476
3613
|
signal: AbortSignal;
|
|
3614
|
+
/** Observe usage as each model response reports it, including aborted loops. */
|
|
3615
|
+
onUsage?: (usage: AgentLoopUsage) => void;
|
|
3477
3616
|
ownerEmail?: string | null;
|
|
3478
3617
|
orgId?: string | null;
|
|
3479
3618
|
/** Action invocation attribution. Defaults to the normal agent tool loop. */
|
|
@@ -3482,6 +3621,12 @@ export async function runAgentLoop(opts: {
|
|
|
3482
3621
|
automation?: ActionAutomationContext;
|
|
3483
3622
|
/** Concrete execution id used for cross-app trace correlation. */
|
|
3484
3623
|
runId?: string;
|
|
3624
|
+
/**
|
|
3625
|
+
* Wall-clock anchor for run-budget math (engine-retry backoff, in-process
|
|
3626
|
+
* resume). Defaults to loop entry; a continuation wrapper passes the round's
|
|
3627
|
+
* start so later attempts don't each believe they have a fresh budget.
|
|
3628
|
+
*/
|
|
3629
|
+
budgetStartedAt?: number;
|
|
3485
3630
|
/** Verified/telemetry-only delegated lineage supplied by the transport. */
|
|
3486
3631
|
networkProtocol?: "a2a" | "mcp" | "provider-api";
|
|
3487
3632
|
networkId?: string;
|
|
@@ -3499,6 +3644,19 @@ export async function runAgentLoop(opts: {
|
|
|
3499
3644
|
maxOutputTokens?: number;
|
|
3500
3645
|
executionMode?: AgentExecutionMode;
|
|
3501
3646
|
maxIterations?: number;
|
|
3647
|
+
/**
|
|
3648
|
+
* Per-TURN input-token ceiling. Iteration count and wall clock do not bound
|
|
3649
|
+
* spend — retained tool results are re-sent every iteration, so cost is
|
|
3650
|
+
* quadratic in tool-call count. Crossing this stops the turn outright
|
|
3651
|
+
* (unlike `maxIterations`, which hands off to the next chunk).
|
|
3652
|
+
*/
|
|
3653
|
+
maxRunInputTokens?: number;
|
|
3654
|
+
/**
|
|
3655
|
+
* Input tokens already consumed by EARLIER chunks of this same logical turn.
|
|
3656
|
+
* Without it every chained chunk would get a fresh allowance and 25 chunks
|
|
3657
|
+
* would multiply the ceiling by 25.
|
|
3658
|
+
*/
|
|
3659
|
+
priorTurnInputTokens?: number;
|
|
3502
3660
|
finalResponseGuard?: AgentLoopFinalResponseGuard;
|
|
3503
3661
|
/**
|
|
3504
3662
|
* Stable real-user request text preserved across internal continuation
|
|
@@ -3541,6 +3699,7 @@ export async function runAgentLoop(opts: {
|
|
|
3541
3699
|
send,
|
|
3542
3700
|
signal,
|
|
3543
3701
|
} = opts;
|
|
3702
|
+
const budgetStartedAt = opts.budgetStartedAt ?? Date.now();
|
|
3544
3703
|
const finalResponseGuardRequestText =
|
|
3545
3704
|
opts.finalResponseGuardRequestText ??
|
|
3546
3705
|
resolveFinalResponseGuardRequestText(messages);
|
|
@@ -3550,6 +3709,8 @@ export async function runAgentLoop(opts: {
|
|
|
3550
3709
|
const activeToolNames = new Set(tools.map((tool) => tool.name));
|
|
3551
3710
|
let activeTools = tools;
|
|
3552
3711
|
|
|
3712
|
+
let expandedToolSchemaBytes = 0;
|
|
3713
|
+
let reportedExpandedToolSchemaBytes = false;
|
|
3553
3714
|
const expandActiveTools = (names: string[]): string[] => {
|
|
3554
3715
|
const added: string[] = [];
|
|
3555
3716
|
for (const name of names) {
|
|
@@ -3557,6 +3718,7 @@ export async function runAgentLoop(opts: {
|
|
|
3557
3718
|
const tool = availableToolMap.get(name);
|
|
3558
3719
|
if (!tool) continue;
|
|
3559
3720
|
activeToolNames.add(name);
|
|
3721
|
+
expandedToolSchemaBytes += JSON.stringify(tool).length;
|
|
3560
3722
|
added.push(name);
|
|
3561
3723
|
}
|
|
3562
3724
|
if (added.length > 0) {
|
|
@@ -3564,6 +3726,15 @@ export async function runAgentLoop(opts: {
|
|
|
3564
3726
|
activeToolNames.has(tool.name),
|
|
3565
3727
|
);
|
|
3566
3728
|
}
|
|
3729
|
+
if (
|
|
3730
|
+
!reportedExpandedToolSchemaBytes &&
|
|
3731
|
+
expandedToolSchemaBytes > EXPANDED_TOOL_SCHEMA_WARN_BYTES
|
|
3732
|
+
) {
|
|
3733
|
+
reportedExpandedToolSchemaBytes = true;
|
|
3734
|
+
console.warn(
|
|
3735
|
+
`[agent-loop] expanded tool schemas reached ${expandedToolSchemaBytes} bytes across ${activeToolNames.size} active tools (runId=${opts.runId ?? "none"})`,
|
|
3736
|
+
);
|
|
3737
|
+
}
|
|
3567
3738
|
return added;
|
|
3568
3739
|
};
|
|
3569
3740
|
|
|
@@ -3588,6 +3759,25 @@ export async function runAgentLoop(opts: {
|
|
|
3588
3759
|
opts.maxIterations,
|
|
3589
3760
|
getDefaultMaxIterations(),
|
|
3590
3761
|
);
|
|
3762
|
+
const maxRunInputTokens = normalizeMaxRunInputTokens(
|
|
3763
|
+
opts.maxRunInputTokens,
|
|
3764
|
+
getDefaultMaxRunInputTokens(),
|
|
3765
|
+
);
|
|
3766
|
+
const priorTurnInputTokens =
|
|
3767
|
+
typeof opts.priorTurnInputTokens === "number" &&
|
|
3768
|
+
Number.isFinite(opts.priorTurnInputTokens)
|
|
3769
|
+
? Math.max(0, opts.priorTurnInputTokens)
|
|
3770
|
+
: 0;
|
|
3771
|
+
// A per-tool timeout above the chunk's own soft timeout can never fire — the
|
|
3772
|
+
// chunk boundary always wins — so the 12-minute default is dead code on a
|
|
3773
|
+
// ~40s hosted foreground chunk. Background-function runs resolve to a ~13min
|
|
3774
|
+
// ceiling and keep the default unchanged.
|
|
3775
|
+
const runToolTimeoutCeilingMs = resolveRunToolTimeoutCeilingMs(
|
|
3776
|
+
resolveRunSoftTimeoutMs(undefined, {
|
|
3777
|
+
useHostedDefault: true,
|
|
3778
|
+
backgroundFunction: isInBackgroundFunctionRuntime(),
|
|
3779
|
+
}),
|
|
3780
|
+
);
|
|
3591
3781
|
const toolCallHistory: AgentLoopToolCallSummary[] = [];
|
|
3592
3782
|
const sourceSweepToolCallHistory = seedSourceSweepToolCallsFromHistory(
|
|
3593
3783
|
messages,
|
|
@@ -3603,9 +3793,24 @@ export async function runAgentLoop(opts: {
|
|
|
3603
3793
|
runCtx.toolCalls = toolCallHistory;
|
|
3604
3794
|
runCtx.toolResults = toolResultHistory;
|
|
3605
3795
|
}
|
|
3796
|
+
// Tool-call journal hard-block (resume safety). See
|
|
3797
|
+
// `loadPriorTurnToolCallJournal` for the full rationale — snapshotted ONCE
|
|
3798
|
+
// here, before any tool runs in this chunk, and its prior-chunk tool
|
|
3799
|
+
// calls/results are folded into `toolCallHistory` / `toolResultHistory` so
|
|
3800
|
+
// final response guards see evidence from earlier chunks of this turn.
|
|
3801
|
+
const consumedJournalKeys = new Set<string>();
|
|
3802
|
+
const {
|
|
3803
|
+
toolCallJournal,
|
|
3804
|
+
priorToolCalls: journaledPriorToolCalls,
|
|
3805
|
+
priorToolResults: journaledPriorToolResults,
|
|
3806
|
+
} = await loadPriorTurnToolCallJournal(opts.threadId, opts.turnId);
|
|
3807
|
+
toolCallHistory.push(...journaledPriorToolCalls);
|
|
3808
|
+
toolResultHistory.push(...journaledPriorToolResults);
|
|
3809
|
+
|
|
3606
3810
|
const readOnlyToolResultCache = seedReadOnlyToolResultsFromHistory(
|
|
3607
3811
|
messages,
|
|
3608
3812
|
actions,
|
|
3813
|
+
seedReadOnlyToolResultsFromJournal(toolCallJournal, actions),
|
|
3609
3814
|
);
|
|
3610
3815
|
const duplicateReadOnlyToolCalls = seedDuplicateReadOnlyToolCallsFromHistory(
|
|
3611
3816
|
messages,
|
|
@@ -3616,24 +3821,14 @@ export async function runAgentLoop(opts: {
|
|
|
3616
3821
|
actions,
|
|
3617
3822
|
);
|
|
3618
3823
|
const repeatedToolErrors = new Map<string, number>();
|
|
3619
|
-
|
|
3620
|
-
// Tool-call journal hard-block (resume safety). See
|
|
3621
|
-
// `loadPriorTurnToolCallJournal` for the full rationale — snapshotted ONCE
|
|
3622
|
-
// here, before any tool runs in this chunk, and its prior-chunk tool
|
|
3623
|
-
// calls/results are folded into `toolCallHistory` / `toolResultHistory` so
|
|
3624
|
-
// final response guards see evidence from earlier chunks of this turn.
|
|
3625
|
-
const consumedJournalKeys = new Set<string>();
|
|
3626
|
-
const {
|
|
3627
|
-
toolCallJournal,
|
|
3628
|
-
priorToolCalls: journaledPriorToolCalls,
|
|
3629
|
-
priorToolResults: journaledPriorToolResults,
|
|
3630
|
-
} = await loadPriorTurnToolCallJournal(opts.threadId);
|
|
3631
|
-
toolCallHistory.push(...journaledPriorToolCalls);
|
|
3632
|
-
toolResultHistory.push(...journaledPriorToolResults);
|
|
3824
|
+
const repeatedToolCalls = new Map<string, number>();
|
|
3633
3825
|
|
|
3634
3826
|
let finalGuardRetries = 0;
|
|
3635
3827
|
let emptyFinalResponseRetries = 0;
|
|
3636
3828
|
let iterations = 0;
|
|
3829
|
+
// `loop_limit` and `done` share one terminal-event slot in run-manager, so a
|
|
3830
|
+
// trailing `done` would overwrite the boundary the continuation logic reads.
|
|
3831
|
+
let endedAtLoopLimit = false;
|
|
3637
3832
|
// Overridden (raised tokens, lowered effort) only after an empty-final-
|
|
3638
3833
|
// response retry below — kept separate from `opts.maxOutputTokens`/
|
|
3639
3834
|
// `opts.reasoningEffort` so the very first attempt is unaffected and later
|
|
@@ -3661,9 +3856,30 @@ export async function runAgentLoop(opts: {
|
|
|
3661
3856
|
|
|
3662
3857
|
while (true) {
|
|
3663
3858
|
if (signal.aborted) break;
|
|
3859
|
+
const turnInputTokens = priorTurnInputTokens + usage.inputTokens;
|
|
3860
|
+
if (turnInputTokens > maxRunInputTokens) {
|
|
3861
|
+
// Terminal for the whole TURN, not a chunk boundary: emitting
|
|
3862
|
+
// `loop_limit` here would hand off to a successor chunk that inherits the
|
|
3863
|
+
// same exhausted total and immediately re-terminate, burning the run
|
|
3864
|
+
// ledger 25 times over.
|
|
3865
|
+
emitTripwire(
|
|
3866
|
+
new TripWire(
|
|
3867
|
+
`I stopped because this request consumed ${turnInputTokens.toLocaleString()} input tokens, past the ${maxRunInputTokens.toLocaleString()} budget for a single turn. ` +
|
|
3868
|
+
`Anything already completed above is saved. Please retry as a smaller, more specific follow-up.`,
|
|
3869
|
+
{ processor: "run-input-token-budget" },
|
|
3870
|
+
),
|
|
3871
|
+
);
|
|
3872
|
+
break;
|
|
3873
|
+
}
|
|
3874
|
+
// Terminal, NOT a nudge-and-reset: the run ends at `loop_limit` and the
|
|
3875
|
+
// durable per-turn ledger (or the client's own continuation) decides
|
|
3876
|
+
// whether the turn gets another chunk. Resetting the counter in-process
|
|
3877
|
+
// made the budget unenforceable and meant this event was never emitted,
|
|
3878
|
+
// even though run-manager, thread-data-builder and the client all handle it.
|
|
3664
3879
|
if (++iterations > maxIterations) {
|
|
3665
|
-
|
|
3666
|
-
|
|
3880
|
+
send({ type: "loop_limit", maxIterations });
|
|
3881
|
+
endedAtLoopLimit = true;
|
|
3882
|
+
break;
|
|
3667
3883
|
}
|
|
3668
3884
|
|
|
3669
3885
|
let assistantContent: EngineContentPart[] | undefined;
|
|
@@ -3755,10 +3971,10 @@ export async function runAgentLoop(opts: {
|
|
|
3755
3971
|
let zeroByteToolInputRestart: ZeroByteToolInputRestart | undefined;
|
|
3756
3972
|
let endedForNoProgress = false;
|
|
3757
3973
|
let lastModelStreamProgressAt = Date.now();
|
|
3758
|
-
// FIX 2: true once
|
|
3759
|
-
//
|
|
3760
|
-
// `FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS` below to
|
|
3761
|
-
//
|
|
3974
|
+
// FIX 2: true once a real (non-heartbeat) engine-stream event has been
|
|
3975
|
+
// retrieved for THIS model call — gates
|
|
3976
|
+
// `FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS` below to the window before
|
|
3977
|
+
// the model has produced anything, never subsequent gaps.
|
|
3762
3978
|
let hasReceivedFirstEngineEvent = false;
|
|
3763
3979
|
// Resolved once per model-call attempt (not per event) so a single
|
|
3764
3980
|
// call's deadline math can't observe the runtime predicates changing
|
|
@@ -3961,17 +4177,17 @@ export async function runAgentLoop(opts: {
|
|
|
3961
4177
|
eventIteratorDone = true;
|
|
3962
4178
|
break;
|
|
3963
4179
|
}
|
|
3964
|
-
// FIX 2: only the deadline for THIS await could have been
|
|
3965
|
-
// tightened by FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS — every
|
|
3966
|
-
// subsequent call in this model call reverts to the normal 90s
|
|
3967
|
-
// watchdog regardless of what kind of event this turned out to be.
|
|
3968
|
-
hasReceivedFirstEngineEvent = true;
|
|
3969
4180
|
const event = nextEvent.value;
|
|
3970
4181
|
if (hasNoProgressStalled()) {
|
|
3971
4182
|
checkpointNoProgress();
|
|
3972
4183
|
break;
|
|
3973
4184
|
}
|
|
4185
|
+
// A gateway keepalive proves the transport is up, not that the
|
|
4186
|
+
// model started: it must not release the 25s first-model-event cap
|
|
4187
|
+
// any more than it counts as stream progress, or an endless
|
|
4188
|
+
// keepalive stream rides the unreachable 90s watchdog instead.
|
|
3974
4189
|
if (event.type !== "gateway-heartbeat") {
|
|
4190
|
+
hasReceivedFirstEngineEvent = true;
|
|
3975
4191
|
lastModelStreamProgressAt = Date.now();
|
|
3976
4192
|
}
|
|
3977
4193
|
// In-loop processor seam (stream hook). Each chunk is offered to every
|
|
@@ -4075,10 +4291,18 @@ export async function runAgentLoop(opts: {
|
|
|
4075
4291
|
} else if (event.type === "assistant-content") {
|
|
4076
4292
|
assistantContent = event.parts;
|
|
4077
4293
|
} else if (event.type === "usage") {
|
|
4078
|
-
|
|
4079
|
-
|
|
4080
|
-
|
|
4081
|
-
|
|
4294
|
+
const eventUsage = {
|
|
4295
|
+
inputTokens: event.inputTokens,
|
|
4296
|
+
outputTokens: event.outputTokens,
|
|
4297
|
+
cacheReadTokens: event.cacheReadTokens ?? 0,
|
|
4298
|
+
cacheWriteTokens: event.cacheWriteTokens ?? 0,
|
|
4299
|
+
model,
|
|
4300
|
+
};
|
|
4301
|
+
usage.inputTokens += eventUsage.inputTokens;
|
|
4302
|
+
usage.outputTokens += eventUsage.outputTokens;
|
|
4303
|
+
usage.cacheReadTokens += eventUsage.cacheReadTokens;
|
|
4304
|
+
usage.cacheWriteTokens += eventUsage.cacheWriteTokens;
|
|
4305
|
+
opts.onUsage?.(eventUsage);
|
|
4082
4306
|
} else if (event.type === "stop") {
|
|
4083
4307
|
terminalStopReason = event.reason;
|
|
4084
4308
|
if (event.reason === "error") {
|
|
@@ -4146,7 +4370,11 @@ export async function runAgentLoop(opts: {
|
|
|
4146
4370
|
{ errorCode: "context_length_exceeded" },
|
|
4147
4371
|
);
|
|
4148
4372
|
}
|
|
4149
|
-
if (
|
|
4373
|
+
if (
|
|
4374
|
+
retry < maxRetriesForError(err) &&
|
|
4375
|
+
isRetryableError(err) &&
|
|
4376
|
+
hasBudgetForEngineRetry(budgetStartedAt, retry)
|
|
4377
|
+
) {
|
|
4150
4378
|
// Clear partial text from the failed attempt so the retry
|
|
4151
4379
|
// doesn't produce garbled duplicate output. Keep the retry itself
|
|
4152
4380
|
// silent so transient provider/backend failures do not leak into
|
|
@@ -4388,6 +4616,20 @@ export async function runAgentLoop(opts: {
|
|
|
4388
4616
|
let requestedActionStop: { message: string; errorCode?: string } | null =
|
|
4389
4617
|
null;
|
|
4390
4618
|
|
|
4619
|
+
const noteRepeatedToolCall = (toolName: string, input: unknown) => {
|
|
4620
|
+
const key = toolCallCacheKey(toolName, input);
|
|
4621
|
+
const count = (repeatedToolCalls.get(key) ?? 0) + 1;
|
|
4622
|
+
repeatedToolCalls.set(key, count);
|
|
4623
|
+
if (count < MAX_IDENTICAL_TOOL_CALLS) return;
|
|
4624
|
+
requestedActionStop ??= {
|
|
4625
|
+
message:
|
|
4626
|
+
`Stopped because ${toolName} was called ${count} times with identical arguments in one turn, ` +
|
|
4627
|
+
`which means the same step is repeating rather than making progress. ` +
|
|
4628
|
+
`Everything completed before this point is preserved above.`,
|
|
4629
|
+
errorCode: "repeated_tool_call",
|
|
4630
|
+
};
|
|
4631
|
+
};
|
|
4632
|
+
|
|
4391
4633
|
// Human-in-the-loop approvals granted by the user for this turn (opt-in;
|
|
4392
4634
|
// empty for the overwhelming majority of turns). Keyed by the stable
|
|
4393
4635
|
// tool-call approval key so a re-issued continuation can let an approved
|
|
@@ -4397,6 +4639,9 @@ export async function runAgentLoop(opts: {
|
|
|
4397
4639
|
const runToolCall = async (
|
|
4398
4640
|
toolCall: import("./engine/types.js").EngineToolCallPart,
|
|
4399
4641
|
): Promise<EngineContentPart> => {
|
|
4642
|
+
// Counted before any journal/cache short-circuit: serving a repeat from
|
|
4643
|
+
// cache still means the model is asking the same question again.
|
|
4644
|
+
noteRepeatedToolCall(toolCall.name, toolCall.input);
|
|
4400
4645
|
const actionEntry = actions[toolCall.name];
|
|
4401
4646
|
const placeholderNormalization = actionEntry
|
|
4402
4647
|
? normalizeOptionalToolPlaceholders(
|
|
@@ -4659,10 +4904,14 @@ export async function runAgentLoop(opts: {
|
|
|
4659
4904
|
// run-manager still aborts foreground hosted runs around 40s, while
|
|
4660
4905
|
// background runs get nearly the full 15-minute function budget.
|
|
4661
4906
|
const DEFAULT_TOOL_TIMEOUT_MS = 12 * 60_000;
|
|
4662
|
-
const
|
|
4907
|
+
const requestedToolTimeoutMs =
|
|
4663
4908
|
actionEntry.timeoutMs ??
|
|
4664
4909
|
opts.toolLimits?.timeoutMs ??
|
|
4665
4910
|
DEFAULT_TOOL_TIMEOUT_MS;
|
|
4911
|
+
const toolTimeoutMs =
|
|
4912
|
+
runToolTimeoutCeilingMs > 0
|
|
4913
|
+
? Math.min(requestedToolTimeoutMs, runToolTimeoutCeilingMs)
|
|
4914
|
+
: requestedToolTimeoutMs;
|
|
4666
4915
|
const toolMaxResultChars =
|
|
4667
4916
|
actionEntry.maxResultChars ??
|
|
4668
4917
|
opts.toolLimits?.maxResultChars ??
|
|
@@ -4680,6 +4929,12 @@ export async function runAgentLoop(opts: {
|
|
|
4680
4929
|
// calls with no completed journal entry are completely unaffected). The
|
|
4681
4930
|
// snapshot was taken before this chunk's tools ran, so it can only match a
|
|
4682
4931
|
// PRIOR completion, never one from the current chunk.
|
|
4932
|
+
//
|
|
4933
|
+
// Read-only tools take the OTHER half of this protection:
|
|
4934
|
+
// `seedReadOnlyToolResultsFromJournal` puts their journaled results into
|
|
4935
|
+
// `readOnlyToolResultCache`, so the duplicate-read guard below serves them
|
|
4936
|
+
// as a cache hit (respecting `dedupe: false` and write invalidation)
|
|
4937
|
+
// instead of re-executing.
|
|
4683
4938
|
if (!actionEntry.readOnly && toolCallJournal) {
|
|
4684
4939
|
const journaled = findCompletedJournalEntry(
|
|
4685
4940
|
toolCallJournal,
|
|
@@ -5187,6 +5442,15 @@ export async function runAgentLoop(opts: {
|
|
|
5187
5442
|
result = finalizeToolErrorResult(result);
|
|
5188
5443
|
}
|
|
5189
5444
|
|
|
5445
|
+
// Side-channel warnings raised anywhere inside the action's call stack
|
|
5446
|
+
// (see `action-warnings.ts`). Drained here rather than in the success
|
|
5447
|
+
// branch so an action that warns and then throws still surfaces it, and
|
|
5448
|
+
// so nothing stays pending to bleed into a later tool's result.
|
|
5449
|
+
const agentWarnings = drainAgentWarnings();
|
|
5450
|
+
if (agentWarnings.length > 0) {
|
|
5451
|
+
result = `${result}\n\n${formatAgentWarningsForToolResult(agentWarnings)}`;
|
|
5452
|
+
}
|
|
5453
|
+
|
|
5190
5454
|
// Auto-refresh the UI after a successful mutating tool call. Any action
|
|
5191
5455
|
// that isn't explicitly read-only is assumed to mutate. The client's
|
|
5192
5456
|
// useDbSync listener sees a change event with source:"action" and
|
|
@@ -5328,7 +5592,7 @@ export async function runAgentLoop(opts: {
|
|
|
5328
5592
|
return usage;
|
|
5329
5593
|
}
|
|
5330
5594
|
|
|
5331
|
-
if (!signal.aborted) {
|
|
5595
|
+
if (!signal.aborted && !endedAtLoopLimit) {
|
|
5332
5596
|
// In-loop processor seam (result hook). Fires once at clean run end with the
|
|
5333
5597
|
// final assistant text so processors (e.g. a proof-of-done gate) can record
|
|
5334
5598
|
// a verdict. A result-hook abort cannot un-finish a completed run, so a
|
|
@@ -5600,26 +5864,21 @@ export function backgroundContinuationReasonForRun(
|
|
|
5600
5864
|
export async function runAgentLoopWithMainChatInternalContinuations(
|
|
5601
5865
|
opts: Parameters<typeof runAgentLoop>[0] & {
|
|
5602
5866
|
/**
|
|
5603
|
-
*
|
|
5604
|
-
*
|
|
5605
|
-
*
|
|
5606
|
-
*
|
|
5607
|
-
* propagate out to the caller. Default false/omitted preserves the exact
|
|
5608
|
-
* prior behavior: such an error is NOT caught here and propagates to
|
|
5609
|
-
* `startRun`'s outer catch, which marks the run "errored" and (for a
|
|
5610
|
-
* background worker) hands off to `chainServerDrivenContinuation` for a
|
|
5611
|
-
* fresh invocation.
|
|
5867
|
+
* Resume a thrown `isResumableEngineError` (gateway drop / transport
|
|
5868
|
+
* interruption surviving engine retries) in-process UNCONDITIONALLY — the
|
|
5869
|
+
* same "continue from where you left off" treatment applied to in-loop
|
|
5870
|
+
* `auto_continue` events below.
|
|
5612
5871
|
*
|
|
5613
|
-
*
|
|
5614
|
-
*
|
|
5615
|
-
*
|
|
5616
|
-
* a
|
|
5617
|
-
*
|
|
5618
|
-
*
|
|
5619
|
-
*
|
|
5620
|
-
*
|
|
5621
|
-
* the
|
|
5622
|
-
* client
|
|
5872
|
+
* Set it only for a proven durable-background worker
|
|
5873
|
+
* (`isInBackgroundFunctionRuntime()`), which has minutes of budget left on
|
|
5874
|
+
* this invocation AND cannot fall back to `chainServerDrivenContinuation`
|
|
5875
|
+
* (a background function cannot invoke its own public URL from inside a
|
|
5876
|
+
* live invocation — that self-dispatch 404s).
|
|
5877
|
+
*
|
|
5878
|
+
* When omitted, the resume still happens but only while enough wall-clock
|
|
5879
|
+
* remains (`SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS`); below that the error
|
|
5880
|
+
* propagates to `startRun`'s outer catch and the cross-invocation recovery
|
|
5881
|
+
* paths (foreground self-chain, client `auto_continue` re-POST) as before.
|
|
5623
5882
|
*/
|
|
5624
5883
|
resumeResumableErrorsInProcess?: boolean;
|
|
5625
5884
|
/**
|
|
@@ -5651,6 +5910,7 @@ export async function runAgentLoopWithMainChatInternalContinuations(
|
|
|
5651
5910
|
usage.model = next.model;
|
|
5652
5911
|
};
|
|
5653
5912
|
|
|
5913
|
+
const budgetStartedAt = opts.budgetStartedAt ?? Date.now();
|
|
5654
5914
|
const resumeResumableErrorsInProcess =
|
|
5655
5915
|
opts.resumeResumableErrorsInProcess === true;
|
|
5656
5916
|
const maxContinuations =
|
|
@@ -5683,19 +5943,25 @@ export async function runAgentLoopWithMainChatInternalContinuations(
|
|
|
5683
5943
|
try {
|
|
5684
5944
|
const nextUsage = await runAgentLoop({
|
|
5685
5945
|
...opts,
|
|
5946
|
+
budgetStartedAt,
|
|
5686
5947
|
send,
|
|
5687
5948
|
finalResponseGuardRequestText,
|
|
5688
5949
|
});
|
|
5689
5950
|
addUsage(nextUsage);
|
|
5690
5951
|
} catch (err) {
|
|
5691
|
-
//
|
|
5692
|
-
//
|
|
5693
|
-
|
|
5694
|
-
//
|
|
5952
|
+
// An aborted signal (real soft-timeout / user stop) or a non-resumable
|
|
5953
|
+
// error is always rethrown.
|
|
5954
|
+
if (opts.signal.aborted || !isResumableEngineError(err)) throw err;
|
|
5955
|
+
// A caller with a proven long budget (`resumeResumableErrorsInProcess`)
|
|
5956
|
+
// always resumes here. Everyone else — notably the foreground chat turn,
|
|
5957
|
+
// where a resumable transport error previously ALWAYS propagated and in
|
|
5958
|
+
// practice was never resumed by any other layer — resumes too, but only
|
|
5959
|
+
// while enough wall-clock remains to attempt it without being cut off
|
|
5960
|
+
// mid-stream by the platform wall.
|
|
5695
5961
|
if (
|
|
5696
|
-
!resumeResumableErrorsInProcess
|
|
5697
|
-
|
|
5698
|
-
|
|
5962
|
+
!resumeResumableErrorsInProcess &&
|
|
5963
|
+
remainingRunBudgetMs(budgetStartedAt) <
|
|
5964
|
+
SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS
|
|
5699
5965
|
) {
|
|
5700
5966
|
throw err;
|
|
5701
5967
|
}
|
|
@@ -5925,12 +6191,16 @@ export async function claimBackgroundWorkerRunEarly(opts: {
|
|
|
5925
6191
|
insertRun?: typeof insertRun;
|
|
5926
6192
|
claimBackgroundRun?: typeof claimBackgroundRun;
|
|
5927
6193
|
updateRunHeartbeat?: typeof updateRunHeartbeat;
|
|
6194
|
+
isTurnAborted?: typeof isTurnAborted;
|
|
6195
|
+
markRunAborted?: typeof markRunAborted;
|
|
5928
6196
|
};
|
|
5929
6197
|
}): Promise<{ claimed: true } | { claimed: false; skipped: string }> {
|
|
5930
6198
|
const record = opts.deps?.recordRunDiagnostic ?? recordRunDiagnostic;
|
|
5931
6199
|
const insert = opts.deps?.insertRun ?? insertRun;
|
|
5932
6200
|
const claim = opts.deps?.claimBackgroundRun ?? claimBackgroundRun;
|
|
5933
6201
|
const heartbeat = opts.deps?.updateRunHeartbeat ?? updateRunHeartbeat;
|
|
6202
|
+
const turnAborted = opts.deps?.isTurnAborted ?? isTurnAborted;
|
|
6203
|
+
const abortRun = opts.deps?.markRunAborted ?? markRunAborted;
|
|
5934
6204
|
const threadId =
|
|
5935
6205
|
typeof opts.threadId === "string" && opts.threadId.trim()
|
|
5936
6206
|
? opts.threadId.trim()
|
|
@@ -5954,12 +6224,24 @@ export async function claimBackgroundWorkerRunEarly(opts: {
|
|
|
5954
6224
|
.join(" "),
|
|
5955
6225
|
).catch(() => {});
|
|
5956
6226
|
|
|
6227
|
+
// A failed durable abort read is fail-closed: never let a worker execute
|
|
6228
|
+
// after cancellation just because the database was temporarily unreadable.
|
|
6229
|
+
if (await turnAborted(threadId, turnId).catch(() => true)) {
|
|
6230
|
+
await abortRun(opts.runId, "user").catch(() => {});
|
|
6231
|
+
return { claimed: false, skipped: "turn-aborted" };
|
|
6232
|
+
}
|
|
6233
|
+
|
|
5957
6234
|
if (opts.continuationCount > 0) {
|
|
5958
6235
|
await insert(opts.runId, threadId, turnId, {
|
|
5959
6236
|
dispatchMode: "background",
|
|
5960
6237
|
}).catch(() => {});
|
|
5961
6238
|
}
|
|
5962
6239
|
|
|
6240
|
+
if (await turnAborted(threadId, turnId).catch(() => true)) {
|
|
6241
|
+
await abortRun(opts.runId, "user").catch(() => {});
|
|
6242
|
+
return { claimed: false, skipped: "turn-aborted" };
|
|
6243
|
+
}
|
|
6244
|
+
|
|
5963
6245
|
const won = await claim(opts.runId);
|
|
5964
6246
|
if (!won) {
|
|
5965
6247
|
await record(opts.runId, RUN_DIAG_STAGE.workerClaimLost).catch(() => {});
|
|
@@ -5968,17 +6250,114 @@ export async function claimBackgroundWorkerRunEarly(opts: {
|
|
|
5968
6250
|
|
|
5969
6251
|
await record(opts.runId, RUN_DIAG_STAGE.workerClaimed).catch(() => {});
|
|
5970
6252
|
await heartbeat(opts.runId).catch(() => {});
|
|
6253
|
+
if (await turnAborted(threadId, turnId).catch(() => true)) {
|
|
6254
|
+
await abortRun(opts.runId, "user").catch(() => {});
|
|
6255
|
+
return { claimed: false, skipped: "turn-aborted" };
|
|
6256
|
+
}
|
|
5971
6257
|
return { claimed: true };
|
|
5972
6258
|
}
|
|
5973
6259
|
|
|
6260
|
+
/**
|
|
6261
|
+
* Wall-clock ceiling on a single logical turn. The run-count ledger alone is
|
|
6262
|
+
* not a time bound: in durable mode each of the ~25 permitted chunks may burn
|
|
6263
|
+
* ~780s, so the ledger's real worst case is over five hours (production has an
|
|
6264
|
+
* observed 2h34m turn). Nobody is waiting that long, and every minute past
|
|
6265
|
+
* this point is spend on a request the user has abandoned.
|
|
6266
|
+
*/
|
|
6267
|
+
export const MAX_TURN_WALL_CLOCK_MS = 90 * 60_000;
|
|
6268
|
+
|
|
6269
|
+
/**
|
|
6270
|
+
* Request-body field carrying the turn's running input-token total across
|
|
6271
|
+
* chunks. It rides the BODY (not the background-run marker) because the marker
|
|
6272
|
+
* is stripped from `continuationBody` on every handoff while the body is the
|
|
6273
|
+
* successor's persisted rehydration payload.
|
|
6274
|
+
*/
|
|
6275
|
+
export const AGENT_CHAT_TURN_INPUT_TOKENS_FIELD =
|
|
6276
|
+
"__agentNativeTurnInputTokens";
|
|
6277
|
+
|
|
6278
|
+
/**
|
|
6279
|
+
* First `started_at` for a logical turn — the turn's true wall-clock origin
|
|
6280
|
+
* (`agent_runs.started_at` is never bumped by heartbeats). Returns null when
|
|
6281
|
+
* the turn has no rows or the read fails, in which case the deadline simply
|
|
6282
|
+
* does not apply and the run-count ledger remains the only bound.
|
|
6283
|
+
*
|
|
6284
|
+
* Costs one extra round trip per chain. Folding `MIN(started_at)` into
|
|
6285
|
+
* `countRunsForTurn`'s existing SELECT in run-store.ts would remove it.
|
|
6286
|
+
*/
|
|
6287
|
+
async function readTurnStartedAt(
|
|
6288
|
+
threadId: string,
|
|
6289
|
+
turnId: string,
|
|
6290
|
+
): Promise<number | null> {
|
|
6291
|
+
const { rows } = await getDbExec().execute({
|
|
6292
|
+
sql: `SELECT MIN(started_at) AS turn_started_at FROM agent_runs WHERE thread_id = ? AND turn_id = ?`,
|
|
6293
|
+
args: [threadId, turnId],
|
|
6294
|
+
});
|
|
6295
|
+
const raw = (rows?.[0] as { turn_started_at?: unknown } | undefined)
|
|
6296
|
+
?.turn_started_at;
|
|
6297
|
+
const startedAt = Number(raw);
|
|
6298
|
+
return Number.isFinite(startedAt) && startedAt > 0 ? startedAt : null;
|
|
6299
|
+
}
|
|
6300
|
+
|
|
6301
|
+
/**
|
|
6302
|
+
* Append a user-visible assistant text event to a live run from outside the
|
|
6303
|
+
* agent loop. The budget-exhaustion paths below terminate a turn that has
|
|
6304
|
+
* already done real work; without this the user sees only a bare
|
|
6305
|
+
* `turn_continuation_budget_exhausted` error string and every completed tool
|
|
6306
|
+
* result looks discarded. Best-effort — a failed ledger write must not turn a
|
|
6307
|
+
* budget stop into a thrown error.
|
|
6308
|
+
*/
|
|
6309
|
+
async function emitRunText(run: ActiveRun, text: string): Promise<void> {
|
|
6310
|
+
const runEvent: RunEvent = {
|
|
6311
|
+
seq: run.events.length,
|
|
6312
|
+
event: { type: "text", text },
|
|
6313
|
+
};
|
|
6314
|
+
run.events.push(runEvent);
|
|
6315
|
+
for (const subscriber of run.subscribers) {
|
|
6316
|
+
try {
|
|
6317
|
+
subscriber(runEvent);
|
|
6318
|
+
} catch {}
|
|
6319
|
+
}
|
|
6320
|
+
await insertRunEvent(
|
|
6321
|
+
run.runId,
|
|
6322
|
+
runEvent.seq,
|
|
6323
|
+
JSON.stringify(runEvent.event),
|
|
6324
|
+
).catch(() => {});
|
|
6325
|
+
}
|
|
6326
|
+
|
|
6327
|
+
/**
|
|
6328
|
+
* One sentence naming what the turn actually finished, derived from the same
|
|
6329
|
+
* per-turn journal the resume note uses (no new ledger read shape).
|
|
6330
|
+
*/
|
|
6331
|
+
async function describeTurnProgress(
|
|
6332
|
+
threadId: string,
|
|
6333
|
+
turnId?: string,
|
|
6334
|
+
): Promise<string> {
|
|
6335
|
+
const { toolCallJournal } = await loadPriorTurnToolCallJournal(
|
|
6336
|
+
threadId,
|
|
6337
|
+
turnId,
|
|
6338
|
+
);
|
|
6339
|
+
const completed = toolCallJournal?.completed ?? [];
|
|
6340
|
+
if (completed.length === 0) return "No steps had completed yet.";
|
|
6341
|
+
const names = [...new Set(completed.map((entry) => entry.tool))];
|
|
6342
|
+
const shown = names.slice(0, 8).join(", ");
|
|
6343
|
+
return (
|
|
6344
|
+
`${completed.length} step(s) completed before I stopped (${shown}` +
|
|
6345
|
+
`${names.length > 8 ? ", …" : ""}). Their results are in the messages above.`
|
|
6346
|
+
);
|
|
6347
|
+
}
|
|
6348
|
+
|
|
5974
6349
|
/** Injectable dependencies for `chainServerDrivenContinuation` (unit tests). */
|
|
5975
6350
|
export interface ChainServerDrivenContinuationDeps {
|
|
5976
6351
|
countRunsForTurn?: typeof countRunsForTurn;
|
|
6352
|
+
readTurnStartedAt?: typeof readTurnStartedAt;
|
|
6353
|
+
isTurnAborted?: typeof isTurnAborted;
|
|
6354
|
+
emitRunText?: typeof emitRunText;
|
|
5977
6355
|
insertRun?: typeof insertRun;
|
|
5978
6356
|
fireInternalDispatch?: typeof fireInternalDispatch;
|
|
5979
6357
|
readBackgroundRunClaim?: typeof readBackgroundRunClaim;
|
|
5980
6358
|
updateRunHeartbeat?: typeof updateRunHeartbeat;
|
|
5981
6359
|
updateRunStatusIfRunning?: typeof updateRunStatusIfRunning;
|
|
6360
|
+
markRunAborted?: typeof markRunAborted;
|
|
5982
6361
|
setRunTerminalReason?: typeof setRunTerminalReason;
|
|
5983
6362
|
recordRunDiagnostic?: typeof recordRunDiagnostic;
|
|
5984
6363
|
markBackgroundContinuationChunkTerminal?: typeof markBackgroundContinuationChunkTerminal;
|
|
@@ -6180,6 +6559,12 @@ export async function chainServerDrivenContinuation(opts: {
|
|
|
6180
6559
|
* is derived from it (marker stripped, `internalContinuation` set). */
|
|
6181
6560
|
requestBody: Record<string, unknown>;
|
|
6182
6561
|
backgroundContinuationCount: number;
|
|
6562
|
+
/**
|
|
6563
|
+
* Input tokens this logical turn has consumed across every chunk so far,
|
|
6564
|
+
* carried on the successor's body so the per-turn token ceiling is a real
|
|
6565
|
+
* turn budget instead of a fresh allowance per chunk.
|
|
6566
|
+
*/
|
|
6567
|
+
turnInputTokens?: number;
|
|
6183
6568
|
chainViaDurableBackground: boolean;
|
|
6184
6569
|
/** True only when this worker is PROVEN (by runtime function name) to
|
|
6185
6570
|
* already be executing inside a real Netlify `-background` function —
|
|
@@ -6192,6 +6577,9 @@ export async function chainServerDrivenContinuation(opts: {
|
|
|
6192
6577
|
}): Promise<void> {
|
|
6193
6578
|
const d = {
|
|
6194
6579
|
countRunsForTurn: opts.deps?.countRunsForTurn ?? countRunsForTurn,
|
|
6580
|
+
readTurnStartedAt: opts.deps?.readTurnStartedAt ?? readTurnStartedAt,
|
|
6581
|
+
isTurnAborted: opts.deps?.isTurnAborted ?? isTurnAborted,
|
|
6582
|
+
emitRunText: opts.deps?.emitRunText ?? emitRunText,
|
|
6195
6583
|
insertRun: opts.deps?.insertRun ?? insertRun,
|
|
6196
6584
|
fireInternalDispatch:
|
|
6197
6585
|
opts.deps?.fireInternalDispatch ?? fireInternalDispatch,
|
|
@@ -6200,6 +6588,7 @@ export async function chainServerDrivenContinuation(opts: {
|
|
|
6200
6588
|
updateRunHeartbeat: opts.deps?.updateRunHeartbeat ?? updateRunHeartbeat,
|
|
6201
6589
|
updateRunStatusIfRunning:
|
|
6202
6590
|
opts.deps?.updateRunStatusIfRunning ?? updateRunStatusIfRunning,
|
|
6591
|
+
markRunAborted: opts.deps?.markRunAborted ?? markRunAborted,
|
|
6203
6592
|
setRunTerminalReason:
|
|
6204
6593
|
opts.deps?.setRunTerminalReason ?? setRunTerminalReason,
|
|
6205
6594
|
recordRunDiagnostic: opts.deps?.recordRunDiagnostic ?? recordRunDiagnostic,
|
|
@@ -6223,22 +6612,59 @@ export async function chainServerDrivenContinuation(opts: {
|
|
|
6223
6612
|
const turnRunCount = await d
|
|
6224
6613
|
.countRunsForTurn(effectiveThreadId, effectiveTurnId)
|
|
6225
6614
|
.catch(() => null);
|
|
6226
|
-
|
|
6227
|
-
|
|
6228
|
-
|
|
6229
|
-
|
|
6230
|
-
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6615
|
+
const stopTurn = async (
|
|
6616
|
+
terminalReason: string,
|
|
6617
|
+
logLine: string,
|
|
6618
|
+
userMessage: string,
|
|
6619
|
+
) => {
|
|
6620
|
+
console.error(`[agent-chat] ${logLine}`, runId);
|
|
6621
|
+
const progress = await describeTurnProgress(
|
|
6622
|
+
effectiveThreadId,
|
|
6623
|
+
effectiveTurnId,
|
|
6624
|
+
).catch(() => "");
|
|
6625
|
+
await d
|
|
6626
|
+
.emitRunText(
|
|
6627
|
+
run,
|
|
6628
|
+
progress ? `${userMessage}\n\n${progress}` : userMessage,
|
|
6629
|
+
)
|
|
6630
|
+
.catch(() => {});
|
|
6234
6631
|
const statusUpdated = await d
|
|
6235
6632
|
.updateRunStatusIfRunning(runId, "errored")
|
|
6236
6633
|
.catch(() => false);
|
|
6237
6634
|
if (statusUpdated) {
|
|
6238
|
-
await d
|
|
6239
|
-
.setRunTerminalReason(runId, "turn_continuation_budget_exhausted")
|
|
6240
|
-
.catch(() => {});
|
|
6635
|
+
await d.setRunTerminalReason(runId, terminalReason).catch(() => {});
|
|
6241
6636
|
}
|
|
6637
|
+
};
|
|
6638
|
+
|
|
6639
|
+
if (
|
|
6640
|
+
turnRunCount !== null &&
|
|
6641
|
+
turnRunCount > MAX_BACKGROUND_RUN_CONTINUATIONS + 5
|
|
6642
|
+
) {
|
|
6643
|
+
await stopTurn(
|
|
6644
|
+
"turn_continuation_budget_exhausted",
|
|
6645
|
+
`turn ${effectiveTurnId} consumed ${turnRunCount} runs — refusing to chain further`,
|
|
6646
|
+
`I stopped after ${turnRunCount} internal continuations without finishing this request.`,
|
|
6647
|
+
);
|
|
6648
|
+
return;
|
|
6649
|
+
}
|
|
6650
|
+
|
|
6651
|
+
// WALL-CLOCK CEILING. The run-count ledger above bounds chunks, not time: in
|
|
6652
|
+
// durable mode 25 chunks x ~780s is over five hours, and prod has an observed
|
|
6653
|
+
// 2h34m turn. Measured from the turn's FIRST run row, so it survives every
|
|
6654
|
+
// recovery path exactly like the run count does.
|
|
6655
|
+
const turnStartedAt = await d
|
|
6656
|
+
.readTurnStartedAt(effectiveThreadId, effectiveTurnId)
|
|
6657
|
+
.catch(() => null);
|
|
6658
|
+
const turnElapsedMs = turnStartedAt === null ? 0 : Date.now() - turnStartedAt;
|
|
6659
|
+
if (turnElapsedMs > MAX_TURN_WALL_CLOCK_MS) {
|
|
6660
|
+
const elapsedMinutes = Math.round(turnElapsedMs / 60_000);
|
|
6661
|
+
await stopTurn(
|
|
6662
|
+
"turn_wall_clock_budget_exhausted",
|
|
6663
|
+
`turn ${effectiveTurnId} ran ${elapsedMinutes}min (limit ${Math.round(
|
|
6664
|
+
MAX_TURN_WALL_CLOCK_MS / 60_000,
|
|
6665
|
+
)}min) — refusing to chain further`,
|
|
6666
|
+
`I stopped after ${elapsedMinutes} minutes without finishing this request.`,
|
|
6667
|
+
);
|
|
6242
6668
|
return;
|
|
6243
6669
|
}
|
|
6244
6670
|
|
|
@@ -6274,9 +6700,20 @@ export async function chainServerDrivenContinuation(opts: {
|
|
|
6274
6700
|
const continuationBody: Record<string, unknown> = {
|
|
6275
6701
|
...opts.requestBody,
|
|
6276
6702
|
internalContinuation: true,
|
|
6703
|
+
...(typeof opts.turnInputTokens === "number"
|
|
6704
|
+
? { [AGENT_CHAT_TURN_INPUT_TOKENS_FIELD]: opts.turnInputTokens }
|
|
6705
|
+
: {}),
|
|
6277
6706
|
};
|
|
6278
6707
|
delete continuationBody[AGENT_CHAT_BACKGROUND_RUN_FIELD];
|
|
6279
6708
|
try {
|
|
6709
|
+
if (
|
|
6710
|
+
await d
|
|
6711
|
+
.isTurnAborted(effectiveThreadId, effectiveTurnId)
|
|
6712
|
+
.catch(() => true)
|
|
6713
|
+
) {
|
|
6714
|
+
await d.markRunAborted(runId, "user").catch(() => {});
|
|
6715
|
+
return;
|
|
6716
|
+
}
|
|
6280
6717
|
await d
|
|
6281
6718
|
.recordRunDiagnostic(
|
|
6282
6719
|
runId,
|
|
@@ -6322,6 +6759,16 @@ export async function chainServerDrivenContinuation(opts: {
|
|
|
6322
6759
|
insertErr instanceof Error ? insertErr.message : insertErr,
|
|
6323
6760
|
);
|
|
6324
6761
|
}
|
|
6762
|
+
if (
|
|
6763
|
+
await d
|
|
6764
|
+
.isTurnAborted(effectiveThreadId, effectiveTurnId)
|
|
6765
|
+
.catch(() => true)
|
|
6766
|
+
) {
|
|
6767
|
+
if (nextRowInserted)
|
|
6768
|
+
await d.markRunAborted(nextRunId, "user").catch(() => {});
|
|
6769
|
+
await d.markRunAborted(runId, "user").catch(() => {});
|
|
6770
|
+
return;
|
|
6771
|
+
}
|
|
6325
6772
|
const dispatchBody = nextRowInserted
|
|
6326
6773
|
? {
|
|
6327
6774
|
internalContinuation: true,
|
|
@@ -6431,8 +6878,13 @@ export async function chainServerDrivenContinuation(opts: {
|
|
|
6431
6878
|
? lastDispatchErr.message
|
|
6432
6879
|
: lastDispatchErr,
|
|
6433
6880
|
);
|
|
6881
|
+
// `completed`, not `errored`: this chunk's work IS durably persisted
|
|
6882
|
+
// and a successor row exists for the sweep to redispatch. Only the
|
|
6883
|
+
// handoff attempt failed, and the terminal reason already says so —
|
|
6884
|
+
// recording the chunk as errored made a recoverable deferral look like
|
|
6885
|
+
// a failed turn everywhere run status is read.
|
|
6434
6886
|
const statusUpdated = await d
|
|
6435
|
-
.updateRunStatusIfRunning(runId, "
|
|
6887
|
+
.updateRunStatusIfRunning(runId, "completed")
|
|
6436
6888
|
.catch(() => false);
|
|
6437
6889
|
if (statusUpdated) {
|
|
6438
6890
|
await d
|
|
@@ -7295,6 +7747,8 @@ export function createProductionAgentHandler(
|
|
|
7295
7747
|
defaultMaxIterations: getDefaultMaxIterations(),
|
|
7296
7748
|
minMaxIterations: MIN_AGENT_MAX_ITERATIONS,
|
|
7297
7749
|
maxMaxIterations: MAX_AGENT_MAX_ITERATIONS,
|
|
7750
|
+
maxRunInputTokens: getDefaultMaxRunInputTokens(),
|
|
7751
|
+
defaultMaxRunInputTokens: getDefaultMaxRunInputTokens(),
|
|
7298
7752
|
scope: "default",
|
|
7299
7753
|
source: "default",
|
|
7300
7754
|
};
|
|
@@ -7468,11 +7922,31 @@ export function createProductionAgentHandler(
|
|
|
7468
7922
|
: typeof requestTurnId === "string" && requestTurnId.trim()
|
|
7469
7923
|
? requestTurnId.trim()
|
|
7470
7924
|
: runId;
|
|
7925
|
+
if (
|
|
7926
|
+
isBackgroundWorker &&
|
|
7927
|
+
(await isTurnAborted(effectiveThreadId, effectiveTurnId).catch(
|
|
7928
|
+
() => true,
|
|
7929
|
+
))
|
|
7930
|
+
) {
|
|
7931
|
+
await markRunAborted(runId, "user").catch(() => {});
|
|
7932
|
+
return { ok: true, stopped: true };
|
|
7933
|
+
}
|
|
7471
7934
|
const messageToPersist =
|
|
7472
7935
|
typeof requestDisplayMessage === "string" &&
|
|
7473
7936
|
requestDisplayMessage.trim().length > 0
|
|
7474
7937
|
? requestDisplayMessage
|
|
7475
7938
|
: requestMessage;
|
|
7939
|
+
// Running per-turn input-token total. Seeded from the predecessor chunk's
|
|
7940
|
+
// body, advanced by this chunk's own usage, and handed to the successor so
|
|
7941
|
+
// the token ceiling bounds the TURN rather than resetting every chunk.
|
|
7942
|
+
const priorTurnInputTokensFromBody = Number(
|
|
7943
|
+
(body as unknown as Record<string, unknown>)[
|
|
7944
|
+
AGENT_CHAT_TURN_INPUT_TOKENS_FIELD
|
|
7945
|
+
],
|
|
7946
|
+
);
|
|
7947
|
+
let turnInputTokens = Number.isFinite(priorTurnInputTokensFromBody)
|
|
7948
|
+
? Math.max(0, priorTurnInputTokensFromBody)
|
|
7949
|
+
: 0;
|
|
7476
7950
|
|
|
7477
7951
|
// Server-driven background continuation: when the background worker re-fired
|
|
7478
7952
|
// itself at a soft-timeout boundary (a chained continuation chunk), rebuild
|
|
@@ -7591,6 +8065,16 @@ export function createProductionAgentHandler(
|
|
|
7591
8065
|
// the Authorization Bearer HMAC is preserved either way.
|
|
7592
8066
|
path: backgroundDispatchPath,
|
|
7593
8067
|
taskId: runId,
|
|
8068
|
+
// A Netlify background function 202s on enqueue in well under a
|
|
8069
|
+
// second, so a 404/401/508 from it is an IMMEDIATE, knowable failure.
|
|
8070
|
+
// Fire-and-forget recorded those as `dispatched = true` and the user
|
|
8071
|
+
// waited out the claim grace for a worker that never existed. Only
|
|
8072
|
+
// for a real background-function target: a regular-function target
|
|
8073
|
+
// replies only after the successor chunk finishes, so awaiting it
|
|
8074
|
+
// would time out on every healthy dispatch.
|
|
8075
|
+
...(expectsNetlifyBackgroundFunction
|
|
8076
|
+
? { awaitResponse: true, responseTimeoutMs: 5_000 }
|
|
8077
|
+
: {}),
|
|
7594
8078
|
// When the row (and its persisted payload) landed, send only the
|
|
7595
8079
|
// marker — the worker rehydrates the body from dispatch_payload
|
|
7596
8080
|
// (`payloadRef`), keeping the self-POST far under Netlify's 256KB
|
|
@@ -7901,6 +8385,7 @@ export function createProductionAgentHandler(
|
|
|
7901
8385
|
effectiveTurnId,
|
|
7902
8386
|
requestBody: body as unknown as Record<string, unknown>,
|
|
7903
8387
|
backgroundContinuationCount,
|
|
8388
|
+
turnInputTokens,
|
|
7904
8389
|
// Re-evaluate the durable gate rather than keying off
|
|
7905
8390
|
// isBackgroundWorker: a successor chunk of a FOREGROUND
|
|
7906
8391
|
// self-chain re-enters as a worker too, and must keep
|
|
@@ -8158,6 +8643,9 @@ export function createProductionAgentHandler(
|
|
|
8158
8643
|
cacheWriteTokens: subUsage.cacheWriteTokens,
|
|
8159
8644
|
model: subUsage.model,
|
|
8160
8645
|
label: `custom-agent:${ref.name}`,
|
|
8646
|
+
runId,
|
|
8647
|
+
threadId: effectiveThreadId,
|
|
8648
|
+
taskId: effectiveTurnId,
|
|
8161
8649
|
});
|
|
8162
8650
|
} catch {}
|
|
8163
8651
|
|
|
@@ -8271,6 +8759,13 @@ export function createProductionAgentHandler(
|
|
|
8271
8759
|
: typeof message === "string" && message.trim().length > 0
|
|
8272
8760
|
? message
|
|
8273
8761
|
: undefined;
|
|
8762
|
+
const turnUsage: AgentLoopUsage = {
|
|
8763
|
+
inputTokens: 0,
|
|
8764
|
+
outputTokens: 0,
|
|
8765
|
+
cacheReadTokens: 0,
|
|
8766
|
+
cacheWriteTokens: 0,
|
|
8767
|
+
model: effectiveModel,
|
|
8768
|
+
};
|
|
8274
8769
|
const agentLoopOpts = {
|
|
8275
8770
|
engine,
|
|
8276
8771
|
model: effectiveModel,
|
|
@@ -8283,6 +8778,13 @@ export function createProductionAgentHandler(
|
|
|
8283
8778
|
actions: requestActions,
|
|
8284
8779
|
send,
|
|
8285
8780
|
signal,
|
|
8781
|
+
onUsage: (usage: AgentLoopUsage) => {
|
|
8782
|
+
turnUsage.inputTokens += usage.inputTokens;
|
|
8783
|
+
turnUsage.outputTokens += usage.outputTokens;
|
|
8784
|
+
turnUsage.cacheReadTokens += usage.cacheReadTokens;
|
|
8785
|
+
turnUsage.cacheWriteTokens += usage.cacheWriteTokens;
|
|
8786
|
+
turnUsage.model = usage.model;
|
|
8787
|
+
},
|
|
8286
8788
|
ownerEmail,
|
|
8287
8789
|
orgId: getRequestOrgId() ?? null,
|
|
8288
8790
|
attachments: requestAttachments,
|
|
@@ -8295,6 +8797,8 @@ export function createProductionAgentHandler(
|
|
|
8295
8797
|
providerOptions: options.providerOptions,
|
|
8296
8798
|
executionMode: requestMode,
|
|
8297
8799
|
maxIterations: loopSettings.maxIterations,
|
|
8800
|
+
maxRunInputTokens: loopSettings.maxRunInputTokens,
|
|
8801
|
+
priorTurnInputTokens: turnInputTokens,
|
|
8298
8802
|
finalResponseGuard: options.finalResponseGuard,
|
|
8299
8803
|
finalResponseGuardRequestText: messageToPersist,
|
|
8300
8804
|
...(options.toolLimits ? { toolLimits: options.toolLimits } : {}),
|
|
@@ -8335,94 +8839,100 @@ export function createProductionAgentHandler(
|
|
|
8335
8839
|
|
|
8336
8840
|
send({ type: "activity", label: "Contacting model" });
|
|
8337
8841
|
|
|
8338
|
-
// loopUsage is always assigned — either via instrumentAgentLoop or
|
|
8339
|
-
// runAgentLoop before use below. The definite-assignment guard is
|
|
8340
|
-
// conservative because the try/catch makes the control flow non-obvious.
|
|
8341
|
-
let loopUsage: AgentLoopUsage = undefined!;
|
|
8342
8842
|
let instrumented = false;
|
|
8343
8843
|
try {
|
|
8344
|
-
|
|
8345
|
-
|
|
8346
|
-
|
|
8347
|
-
|
|
8348
|
-
|
|
8349
|
-
|
|
8350
|
-
|
|
8351
|
-
|
|
8352
|
-
|
|
8353
|
-
|
|
8354
|
-
|
|
8355
|
-
|
|
8356
|
-
|
|
8844
|
+
try {
|
|
8845
|
+
const { getObservabilityConfig, instrumentAgentLoop } =
|
|
8846
|
+
await import("../observability/traces.js");
|
|
8847
|
+
const obsConfig = await getObservabilityConfig();
|
|
8848
|
+
if (obsConfig.enabled) {
|
|
8849
|
+
instrumented = true;
|
|
8850
|
+
await instrumentAgentLoop({
|
|
8851
|
+
runAgentLoop: runAgentLoopWithMainChatInternalContinuations,
|
|
8852
|
+
loopOpts: agentLoopOpts,
|
|
8853
|
+
runId,
|
|
8854
|
+
threadId: threadId ?? null,
|
|
8855
|
+
userId: ownerEmail,
|
|
8856
|
+
config: obsConfig,
|
|
8857
|
+
metadata: {
|
|
8858
|
+
modelSelectionSource,
|
|
8859
|
+
...(experimentAssignments.length > 0
|
|
8860
|
+
? { experimentAssignments }
|
|
8861
|
+
: {}),
|
|
8862
|
+
},
|
|
8863
|
+
experimentAssignments,
|
|
8357
8864
|
modelSelectionSource,
|
|
8358
|
-
|
|
8359
|
-
|
|
8360
|
-
|
|
8361
|
-
|
|
8362
|
-
|
|
8363
|
-
|
|
8364
|
-
|
|
8365
|
-
|
|
8366
|
-
|
|
8367
|
-
|
|
8368
|
-
|
|
8369
|
-
|
|
8370
|
-
|
|
8371
|
-
|
|
8372
|
-
|
|
8373
|
-
|
|
8374
|
-
|
|
8375
|
-
|
|
8376
|
-
|
|
8377
|
-
|
|
8378
|
-
|
|
8379
|
-
|
|
8380
|
-
|
|
8381
|
-
|
|
8382
|
-
|
|
8383
|
-
|
|
8384
|
-
|
|
8385
|
-
|
|
8386
|
-
|
|
8387
|
-
|
|
8388
|
-
|
|
8865
|
+
sentimentInput: shouldInferSentimentForTurn({
|
|
8866
|
+
internalContinuation: Boolean(internalContinuation),
|
|
8867
|
+
isBackgroundWorker,
|
|
8868
|
+
backgroundContinuationCount,
|
|
8869
|
+
hasUserText: Boolean(userVisibleSentimentInput),
|
|
8870
|
+
})
|
|
8871
|
+
? userVisibleSentimentInput
|
|
8872
|
+
: undefined,
|
|
8873
|
+
classifyError: () => {
|
|
8874
|
+
if (
|
|
8875
|
+
agentLoopOpts.signal.aborted &&
|
|
8876
|
+
agentLoopOpts.signal.reason === "run_timeout"
|
|
8877
|
+
) {
|
|
8878
|
+
return {
|
|
8879
|
+
status: "success",
|
|
8880
|
+
errorMessage: null,
|
|
8881
|
+
metadata: {
|
|
8882
|
+
terminalReason: "run_timeout",
|
|
8883
|
+
recoverableContinuation: true,
|
|
8884
|
+
},
|
|
8885
|
+
};
|
|
8886
|
+
}
|
|
8887
|
+
return null;
|
|
8888
|
+
},
|
|
8889
|
+
});
|
|
8890
|
+
}
|
|
8891
|
+
} catch (err) {
|
|
8892
|
+
// If instrumentation setup failed, fall through to uninstrumented.
|
|
8893
|
+
// If the agent loop itself failed, re-throw after the outer finally
|
|
8894
|
+
// records any usage events that arrived before the failure.
|
|
8895
|
+
if (instrumented) throw err;
|
|
8389
8896
|
}
|
|
8390
|
-
|
|
8391
|
-
// If instrumentation setup failed, fall through to uninstrumented.
|
|
8392
|
-
// If the agent loop itself failed (via instrumentAgentLoop), re-throw.
|
|
8393
|
-
if (instrumented) throw err;
|
|
8394
|
-
}
|
|
8395
|
-
if (!instrumented) {
|
|
8396
|
-
loopUsage =
|
|
8897
|
+
if (!instrumented) {
|
|
8397
8898
|
await runAgentLoopWithMainChatInternalContinuations(agentLoopOpts);
|
|
8398
|
-
}
|
|
8399
|
-
|
|
8400
|
-
// Record token usage for cost monitoring so the Usage panel in
|
|
8401
|
-
// settings works in every mode, including local dev.
|
|
8402
|
-
try {
|
|
8403
|
-
const ownerEmail = options.resolveOwnerEmail
|
|
8404
|
-
? await options.resolveOwnerEmail(event)
|
|
8405
|
-
: getRequestUserEmail();
|
|
8406
|
-
if (
|
|
8407
|
-
ownerEmail &&
|
|
8408
|
-
(loopUsage.inputTokens > 0 ||
|
|
8409
|
-
loopUsage.outputTokens > 0 ||
|
|
8410
|
-
loopUsage.cacheReadTokens > 0 ||
|
|
8411
|
-
loopUsage.cacheWriteTokens > 0)
|
|
8412
|
-
) {
|
|
8413
|
-
const { recordUsage } = await import("../usage/store.js");
|
|
8414
|
-
await recordUsage({
|
|
8415
|
-
ownerEmail,
|
|
8416
|
-
inputTokens: loopUsage.inputTokens,
|
|
8417
|
-
outputTokens: loopUsage.outputTokens,
|
|
8418
|
-
cacheReadTokens: loopUsage.cacheReadTokens,
|
|
8419
|
-
cacheWriteTokens: loopUsage.cacheWriteTokens,
|
|
8420
|
-
model: loopUsage.model,
|
|
8421
|
-
label: body.usageLabel || "chat",
|
|
8422
|
-
});
|
|
8423
8899
|
}
|
|
8424
|
-
}
|
|
8425
|
-
//
|
|
8900
|
+
} finally {
|
|
8901
|
+
// Advance and persist usage even when the provider aborts the loop
|
|
8902
|
+
// before its promise resolves; the per-event accumulator is the only
|
|
8903
|
+
// durable view of those partial model calls.
|
|
8904
|
+
turnInputTokens += turnUsage.inputTokens;
|
|
8905
|
+
try {
|
|
8906
|
+
const resolvedOwnerEmail = options.resolveOwnerEmail
|
|
8907
|
+
? await options.resolveOwnerEmail(event)
|
|
8908
|
+
: getRequestUserEmail();
|
|
8909
|
+
if (
|
|
8910
|
+
resolvedOwnerEmail &&
|
|
8911
|
+
(turnUsage.inputTokens > 0 ||
|
|
8912
|
+
turnUsage.outputTokens > 0 ||
|
|
8913
|
+
turnUsage.cacheReadTokens > 0 ||
|
|
8914
|
+
turnUsage.cacheWriteTokens > 0)
|
|
8915
|
+
) {
|
|
8916
|
+
const { recordUsage } = await import("../usage/store.js");
|
|
8917
|
+
await recordUsage({
|
|
8918
|
+
ownerEmail: resolvedOwnerEmail,
|
|
8919
|
+
inputTokens: turnUsage.inputTokens,
|
|
8920
|
+
outputTokens: turnUsage.outputTokens,
|
|
8921
|
+
cacheReadTokens: turnUsage.cacheReadTokens,
|
|
8922
|
+
cacheWriteTokens: turnUsage.cacheWriteTokens,
|
|
8923
|
+
model: turnUsage.model,
|
|
8924
|
+
label: body.usageLabel || "chat",
|
|
8925
|
+
// token_usage has had run_id/thread_id/task_id since it was
|
|
8926
|
+
// created and every row was NULL on all three, so no spend could
|
|
8927
|
+
// be tied back to a run, thread, or outcome.
|
|
8928
|
+
runId,
|
|
8929
|
+
threadId: effectiveThreadId,
|
|
8930
|
+
taskId: effectiveTurnId,
|
|
8931
|
+
});
|
|
8932
|
+
}
|
|
8933
|
+
} catch {
|
|
8934
|
+
// Usage recording failed — don't break the run
|
|
8935
|
+
}
|
|
8426
8936
|
}
|
|
8427
8937
|
},
|
|
8428
8938
|
handleRunComplete,
|