@agent-native/core 0.122.4 → 0.123.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +538 -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/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/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 +180 -0
- 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/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/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/collab/routes.d.ts +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 +1 -1
- 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.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/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/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/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
|
@@ -5,6 +5,7 @@ import { parseA2AAgentActivityPart } from "../a2a/activity.js";
|
|
|
5
5
|
import { isAgentActionStopError, } from "../action.js";
|
|
6
6
|
import { readAppState } from "../application-state/script-helpers.js";
|
|
7
7
|
import { isReadOnlyShellCommand } from "../coding-tools/index.js";
|
|
8
|
+
import { getDbExec } from "../db/client.js";
|
|
8
9
|
import { extensionIdFromPathname } from "../extensions/path.js";
|
|
9
10
|
import { preUploadAttachments } from "../file-upload/pre-upload-attachments.js";
|
|
10
11
|
import { isMcpActionResult } from "../mcp-client/app-result.js";
|
|
@@ -19,6 +20,7 @@ import { getRequestRunContext, ensureRequestRunContext, getRequestContext, getRe
|
|
|
19
20
|
import { fireInternalDispatch } from "../server/self-dispatch.js";
|
|
20
21
|
import { isReasoningEffort, normalizeReasoningEffortForRequest, stepDownReasoningEffort, } from "../shared/reasoning-effort.js";
|
|
21
22
|
import { actionPreparationContinuationNote } from "./action-continuation-guidance.js";
|
|
23
|
+
import { drainAgentWarnings, formatAgentWarningsForToolResult, } from "./action-warnings.js";
|
|
22
24
|
import { buildSystemManifestSections, readContextXraySystemSections, } from "./context-xray/manifest.js";
|
|
23
25
|
import { AGENT_CHAT_BACKGROUND_RUN_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, backgroundRuntimeDiagnosticDetail, dispatchPathTargetsNetlifyBackgroundFunction, isAgentChatDurableBackgroundEnabled, isAgentChatForegroundSelfChainEnabled, isInBackgroundFunctionRuntime, resolveAgentChatProcessRunDispatchPath, shouldUseBackgroundFunctionTimeoutForWorker, } from "./durable-background.js";
|
|
24
26
|
import { applyContextXrayTransformForIteration } from "./engine/context-directives-transform.js";
|
|
@@ -30,13 +32,13 @@ import { PROVIDER_TO_ENV } from "./engine/provider-env-vars.js";
|
|
|
30
32
|
import { loadPriorTurnToolCallJournal } from "./engine/tool-call-journal-seed.js";
|
|
31
33
|
import { backfillEngineMessagesToolResults, stringifyToolUseInputForGateway, unmatchedToolResultReplayText, } from "./engine/translate-anthropic.js";
|
|
32
34
|
import { EngineError } from "./engine/types.js";
|
|
33
|
-
import { getDefaultMaxIterations, MAX_AGENT_MAX_ITERATIONS, MIN_AGENT_MAX_ITERATIONS, normalizeMaxIterations, readAgentLoopSettings, } from "./loop-settings.js";
|
|
35
|
+
import { getDefaultMaxIterations, getDefaultMaxRunInputTokens, MAX_AGENT_MAX_ITERATIONS, MIN_AGENT_MAX_ITERATIONS, normalizeMaxIterations, normalizeMaxRunInputTokens, readAgentLoopSettings, } from "./loop-settings.js";
|
|
34
36
|
import { maybeCompactThread, buildObservationalContext, hasObservationalMemory, serializeObservationalMemoryBlock, } from "./observational-memory/index.js";
|
|
35
37
|
import { ProcessorChain, TripWire, toolCallsFromContent, } from "./processors.js";
|
|
36
|
-
import { startRun, subscribeToRun, getActiveRunForThread, getActiveRunForThreadAsync, getRun, abortRun, abortRunDurably, tryClaimRunSlot, isHostedRuntime, resolveRunSoftTimeoutMs, } from "./run-manager.js";
|
|
37
|
-
import { writeLedgerEntry, readLedgerEntry, clearLedgerForThread, insertRun, isTurnAborted, markRunAborted, updateRunHeartbeat, updateRunStatusIfRunning, setRunError, setRunTerminalReason, claimBackgroundRun, readBackgroundRunClaim, recordRunDiagnostic, countRunsForTurn, RUN_DIAG_STAGE, UNCLAIMED_BACKGROUND_RUN_GRACE_MS, } from "./run-store.js";
|
|
38
|
+
import { startRun, subscribeToRun, getActiveRunForThread, getActiveRunForThreadAsync, getRun, abortRun, abortRunDurably, tryClaimRunSlot, isHostedRuntime, resolveRunSoftTimeoutMs, resolveRunToolTimeoutCeilingMs, } from "./run-manager.js";
|
|
39
|
+
import { writeLedgerEntry, readLedgerEntry, clearLedgerForThread, insertRun, insertRunEvent, isTurnAborted, markRunAborted, updateRunHeartbeat, updateRunStatusIfRunning, setRunError, setRunTerminalReason, claimBackgroundRun, readBackgroundRunClaim, recordRunDiagnostic, countRunsForTurn, RUN_DIAG_STAGE, UNCLAIMED_BACKGROUND_RUN_GRACE_MS, } from "./run-store.js";
|
|
38
40
|
import { buildCurrentTimeUserContext } from "./runtime-context.js";
|
|
39
|
-
import { findCompletedJournalEntry } from "./tool-call-journal.js";
|
|
41
|
+
import { findCompletedJournalEntry, } from "./tool-call-journal.js";
|
|
40
42
|
import { redactSensitiveFields, sanitizeToolErrorText, sanitizeToolErrorValue, } from "./tool-error-redaction.js";
|
|
41
43
|
import { describeToolResultImages, extractAgentImagesFromActionResult, } from "./tool-result-images.js";
|
|
42
44
|
import { createToolSearchEntry, TOOL_SEARCH_ACTION_NAME, } from "./tool-search.js";
|
|
@@ -600,9 +602,11 @@ const MODEL_STREAM_NO_PROGRESS_TIMEOUT_MS = 90_000;
|
|
|
600
602
|
* around 40s, so that watchdog could never actually fire: the run died as a
|
|
601
603
|
* silent platform kill instead of a recoverable checkpoint (observed: ~40s of
|
|
602
604
|
* "Contacting model" with zero tokens, then a hard timeout with no
|
|
603
|
-
* auto_continue ever emitted). Once
|
|
604
|
-
*
|
|
605
|
-
*
|
|
605
|
+
* auto_continue ever emitted). Once a real model event has been observed for
|
|
606
|
+
* this model call, subsequent gaps revert to the normal 90s watchdog — this
|
|
607
|
+
* only guards the "nothing has happened yet" window. A `gateway-heartbeat`
|
|
608
|
+
* does NOT count as that first event (it proves the transport is up, not that
|
|
609
|
+
* the model started); it is excluded from stream progress for the same reason.
|
|
606
610
|
*
|
|
607
611
|
* ORDERING INVARIANT (each bound must stay strictly smaller than the next —
|
|
608
612
|
* do not change one without re-checking the others). This cap exists ONLY
|
|
@@ -636,6 +640,16 @@ const MAX_RESOURCE_INVENTORY_ITEMS = 40;
|
|
|
636
640
|
const MAX_RESOURCE_INVENTORY_DESCRIPTION_CHARS = 160;
|
|
637
641
|
const MAX_INLINE_SKILL_REFERENCE_CHARS = 40_000;
|
|
638
642
|
const SOURCE_SWEEP_TOOL_CALL_THRESHOLD = 12;
|
|
643
|
+
/**
|
|
644
|
+
* Serialized-byte threshold at which a run reports how much tool schema
|
|
645
|
+
* `expandActiveTools` has loaded on top of its starting set. Expansion is
|
|
646
|
+
* monotonic — schemas added mid-turn are never released — and failing runs
|
|
647
|
+
* carry ~3.4x the event payload of clean ones, but that is a correlation, not
|
|
648
|
+
* a cause. Measure first; a cap or LRU eviction can only be sized safely once
|
|
649
|
+
* the real distribution is known (dropping a tool the model is about to call
|
|
650
|
+
* is worse than a large request).
|
|
651
|
+
*/
|
|
652
|
+
const EXPANDED_TOOL_SCHEMA_WARN_BYTES = 32_000;
|
|
639
653
|
/**
|
|
640
654
|
* Hard cap on the `<current-screen>` block injected into EVERY user message.
|
|
641
655
|
*
|
|
@@ -812,6 +826,40 @@ export function trimOldToolResults(messages, keepTail = CONTEXT_TRIM_KEEP_TAIL)
|
|
|
812
826
|
});
|
|
813
827
|
return trimmed ? result : null;
|
|
814
828
|
}
|
|
829
|
+
/** Upper bound (jitter included) on what `retryDelay(attempt)` will sleep. */
|
|
830
|
+
function maxRetryDelayMs(attempt) {
|
|
831
|
+
return RETRY_BASE_DELAY_MS * Math.pow(2, attempt) * 1.1;
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* Wall-clock left in this invocation's soft-timeout budget, measured from
|
|
835
|
+
* `startedAt`. `Infinity` off the hosted soft-timeout regime (local dev,
|
|
836
|
+
* self-hosted), where runs are genuinely unbounded. Uses the same ceiling
|
|
837
|
+
* `startRun` sizes the round to, so budget math here can't disagree with the
|
|
838
|
+
* soft timeout that actually aborts the run.
|
|
839
|
+
*/
|
|
840
|
+
export function remainingRunBudgetMs(startedAt) {
|
|
841
|
+
const ceilingMs = resolveRunSoftTimeoutMs(undefined, {
|
|
842
|
+
useHostedDefault: true,
|
|
843
|
+
backgroundFunction: isInBackgroundFunctionRuntime(),
|
|
844
|
+
});
|
|
845
|
+
if (ceilingMs <= 0)
|
|
846
|
+
return Number.POSITIVE_INFINITY;
|
|
847
|
+
return ceilingMs - (Date.now() - startedAt);
|
|
848
|
+
}
|
|
849
|
+
/**
|
|
850
|
+
* Whether one more engine retry — its backoff sleep, plus a minimal window for
|
|
851
|
+
* the resume layer above — still fits in the run budget. Count-based retries
|
|
852
|
+
* alone burn the entire hosted foreground budget on a deterministic failure
|
|
853
|
+
* (observed: every failing run spent all 3 retries, ~14s of it asleep, and
|
|
854
|
+
* left nothing for recovery).
|
|
855
|
+
*/
|
|
856
|
+
function hasBudgetForEngineRetry(startedAt, attempt) {
|
|
857
|
+
const remainingMs = remainingRunBudgetMs(startedAt);
|
|
858
|
+
if (remainingMs === Number.POSITIVE_INFINITY)
|
|
859
|
+
return true;
|
|
860
|
+
return (remainingMs - maxRetryDelayMs(attempt) >=
|
|
861
|
+
SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS);
|
|
862
|
+
}
|
|
815
863
|
/** Wait with exponential backoff, respecting abort signal */
|
|
816
864
|
function retryDelay(attempt, signal) {
|
|
817
865
|
const baseMs = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
|
|
@@ -1563,8 +1611,55 @@ async function applyObservationalMemoryToContext(messages, opts) {
|
|
|
1563
1611
|
return messages;
|
|
1564
1612
|
}
|
|
1565
1613
|
}
|
|
1566
|
-
|
|
1614
|
+
/**
|
|
1615
|
+
* Cross-chunk read-only result cache seed.
|
|
1616
|
+
*
|
|
1617
|
+
* A chained continuation chunk rebuilds `messages` without the prior chunk's
|
|
1618
|
+
* tool results, so `seedReadOnlyToolResultsFromHistory` sees nothing and every
|
|
1619
|
+
* read-only tool (run-code, provider-api-request, tool-search, every research
|
|
1620
|
+
* tool) re-executes from scratch. Their only cross-chunk protection was the
|
|
1621
|
+
* prompt-level resume note, which truncates each result to 400 chars — a
|
|
1622
|
+
* 50,000-char run-code result came back as 400 chars, leaving the model no
|
|
1623
|
+
* option but to re-run it. Re-executed reads were the dominant term in
|
|
1624
|
+
* production spend.
|
|
1625
|
+
*
|
|
1626
|
+
* The full `tool_done` result IS in the durable run ledger, so seed the same
|
|
1627
|
+
* cache the in-run duplicate guard uses. The tool layer then serves the real
|
|
1628
|
+
* result while the prompt note keeps its short summary.
|
|
1629
|
+
*
|
|
1630
|
+
* Staleness is bounded to the CURRENT TURN: the journal is built from
|
|
1631
|
+
* `getCurrentTurnEventsForThread`, so nothing older than the user's current
|
|
1632
|
+
* request can be replayed, and a successful write inside the turn clears the
|
|
1633
|
+
* cache exactly as it does for in-chunk reads.
|
|
1634
|
+
*/
|
|
1635
|
+
function seedReadOnlyToolResultsFromJournal(journal, actions) {
|
|
1567
1636
|
const cache = new Map();
|
|
1637
|
+
if (!journal)
|
|
1638
|
+
return cache;
|
|
1639
|
+
for (const entry of journal.completed) {
|
|
1640
|
+
const action = actions[entry.tool];
|
|
1641
|
+
if (action?.readOnly !== true) {
|
|
1642
|
+
// Mirror the live loop: a completed write invalidates every cached read.
|
|
1643
|
+
cache.clear();
|
|
1644
|
+
continue;
|
|
1645
|
+
}
|
|
1646
|
+
if (action.dedupe === false)
|
|
1647
|
+
continue;
|
|
1648
|
+
const result = entry.result ?? "";
|
|
1649
|
+
if (!isReusableReadOnlyToolResult({
|
|
1650
|
+
type: "tool-result",
|
|
1651
|
+
toolCallId: "",
|
|
1652
|
+
toolName: entry.tool,
|
|
1653
|
+
content: result,
|
|
1654
|
+
})) {
|
|
1655
|
+
continue;
|
|
1656
|
+
}
|
|
1657
|
+
cache.set(toolCallCacheKey(entry.tool, entry.input), result);
|
|
1658
|
+
}
|
|
1659
|
+
return cache;
|
|
1660
|
+
}
|
|
1661
|
+
function seedReadOnlyToolResultsFromHistory(messages, actions, seed) {
|
|
1662
|
+
const cache = new Map(seed);
|
|
1568
1663
|
if (!isInternalContinuationTurn(messages))
|
|
1569
1664
|
return cache;
|
|
1570
1665
|
// Scoped to the current turn only (same slice as
|
|
@@ -1754,6 +1849,21 @@ export function isCachedToolResultVisibleInContext(contextMessages, toolCall, ca
|
|
|
1754
1849
|
const INTERRUPTED_TOOL_RESULT_MARKER = "Interrupted before this tool returned a result.";
|
|
1755
1850
|
const MAX_WRITE_TOOL_INTERRUPTIONS = 2;
|
|
1756
1851
|
const MAX_IDENTICAL_TOOL_ERRORS = 3;
|
|
1852
|
+
/**
|
|
1853
|
+
* Identical (tool, arguments) invocations tolerated in one turn before the turn
|
|
1854
|
+
* is stopped, whether or not they errored.
|
|
1855
|
+
*
|
|
1856
|
+
* This is the guard that distinguishes a spiral from deep work. Volume ceilings
|
|
1857
|
+
* cannot: prod contains a legitimate 117-tool-call analysis alongside turns that
|
|
1858
|
+
* issued 39 identical `run-code` webFetches and 43 identical `docs-search`
|
|
1859
|
+
* calls. Repetition is what separates them, so repetition is what we bound —
|
|
1860
|
+
* leaving genuinely long analyses free to keep making NEW calls.
|
|
1861
|
+
*
|
|
1862
|
+
* Above `MAX_IDENTICAL_TOOL_ERRORS` (3) because a repeated SUCCESS is weaker
|
|
1863
|
+
* evidence of a loop than a repeated failure: a few identical reads can be a
|
|
1864
|
+
* legitimate re-check after a write.
|
|
1865
|
+
*/
|
|
1866
|
+
export const MAX_IDENTICAL_TOOL_CALLS = 8;
|
|
1757
1867
|
function seedWriteToolInterruptionsFromHistory(messages, actions) {
|
|
1758
1868
|
const interruptions = new Map();
|
|
1759
1869
|
if (!isInternalContinuationTurn(messages))
|
|
@@ -1966,6 +2076,14 @@ const DEFAULT_INITIAL_TOOL_NAMES = new Set([
|
|
|
1966
2076
|
"docs-search",
|
|
1967
2077
|
"get-framework-context",
|
|
1968
2078
|
"read-attachment",
|
|
2079
|
+
// The `<available-apps>` prompt block names these two BY NAME on the same
|
|
2080
|
+
// request, and "which app should I use for this?" is answered on turn one or
|
|
2081
|
+
// not at all. Omitting them made the model read the instruction, find no
|
|
2082
|
+
// schema, and answer from its own assumptions instead of spending a
|
|
2083
|
+
// tool-search turn — so users were told a capability did not exist while a
|
|
2084
|
+
// sibling app owned it.
|
|
2085
|
+
"describe-workspace-apps",
|
|
2086
|
+
"call-agent",
|
|
1969
2087
|
]);
|
|
1970
2088
|
function isDefaultInitialToolName(name) {
|
|
1971
2089
|
return DEFAULT_INITIAL_TOOL_NAMES.has(name);
|
|
@@ -2487,11 +2605,14 @@ function validateRawToolInput(entry, input) {
|
|
|
2487
2605
|
*/
|
|
2488
2606
|
export async function runAgentLoop(opts) {
|
|
2489
2607
|
const { engine, model, systemPrompt, tools, availableTools, messages, actions, send, signal, } = opts;
|
|
2608
|
+
const budgetStartedAt = opts.budgetStartedAt ?? Date.now();
|
|
2490
2609
|
const finalResponseGuardRequestText = opts.finalResponseGuardRequestText ??
|
|
2491
2610
|
resolveFinalResponseGuardRequestText(messages);
|
|
2492
2611
|
const availableToolMap = new Map((availableTools ?? tools).map((tool) => [tool.name, tool]));
|
|
2493
2612
|
const activeToolNames = new Set(tools.map((tool) => tool.name));
|
|
2494
2613
|
let activeTools = tools;
|
|
2614
|
+
let expandedToolSchemaBytes = 0;
|
|
2615
|
+
let reportedExpandedToolSchemaBytes = false;
|
|
2495
2616
|
const expandActiveTools = (names) => {
|
|
2496
2617
|
const added = [];
|
|
2497
2618
|
for (const name of names) {
|
|
@@ -2501,11 +2622,17 @@ export async function runAgentLoop(opts) {
|
|
|
2501
2622
|
if (!tool)
|
|
2502
2623
|
continue;
|
|
2503
2624
|
activeToolNames.add(name);
|
|
2625
|
+
expandedToolSchemaBytes += JSON.stringify(tool).length;
|
|
2504
2626
|
added.push(name);
|
|
2505
2627
|
}
|
|
2506
2628
|
if (added.length > 0) {
|
|
2507
2629
|
activeTools = (availableTools ?? tools).filter((tool) => activeToolNames.has(tool.name));
|
|
2508
2630
|
}
|
|
2631
|
+
if (!reportedExpandedToolSchemaBytes &&
|
|
2632
|
+
expandedToolSchemaBytes > EXPANDED_TOOL_SCHEMA_WARN_BYTES) {
|
|
2633
|
+
reportedExpandedToolSchemaBytes = true;
|
|
2634
|
+
console.warn(`[agent-loop] expanded tool schemas reached ${expandedToolSchemaBytes} bytes across ${activeToolNames.size} active tools (runId=${opts.runId ?? "none"})`);
|
|
2635
|
+
}
|
|
2509
2636
|
return added;
|
|
2510
2637
|
};
|
|
2511
2638
|
expandActiveTools(extractToolSearchResultNamesFromMessages(messages));
|
|
@@ -2522,6 +2649,19 @@ export async function runAgentLoop(opts) {
|
|
|
2522
2649
|
model,
|
|
2523
2650
|
};
|
|
2524
2651
|
const maxIterations = normalizeMaxIterations(opts.maxIterations, getDefaultMaxIterations());
|
|
2652
|
+
const maxRunInputTokens = normalizeMaxRunInputTokens(opts.maxRunInputTokens, getDefaultMaxRunInputTokens());
|
|
2653
|
+
const priorTurnInputTokens = typeof opts.priorTurnInputTokens === "number" &&
|
|
2654
|
+
Number.isFinite(opts.priorTurnInputTokens)
|
|
2655
|
+
? Math.max(0, opts.priorTurnInputTokens)
|
|
2656
|
+
: 0;
|
|
2657
|
+
// A per-tool timeout above the chunk's own soft timeout can never fire — the
|
|
2658
|
+
// chunk boundary always wins — so the 12-minute default is dead code on a
|
|
2659
|
+
// ~40s hosted foreground chunk. Background-function runs resolve to a ~13min
|
|
2660
|
+
// ceiling and keep the default unchanged.
|
|
2661
|
+
const runToolTimeoutCeilingMs = resolveRunToolTimeoutCeilingMs(resolveRunSoftTimeoutMs(undefined, {
|
|
2662
|
+
useHostedDefault: true,
|
|
2663
|
+
backgroundFunction: isInBackgroundFunctionRuntime(),
|
|
2664
|
+
}));
|
|
2525
2665
|
const toolCallHistory = [];
|
|
2526
2666
|
const sourceSweepToolCallHistory = seedSourceSweepToolCallsFromHistory(messages, actions);
|
|
2527
2667
|
let sourceSweepDelegationGuardActive = hasExhaustedSourceSweepBudget({
|
|
@@ -2534,22 +2674,26 @@ export async function runAgentLoop(opts) {
|
|
|
2534
2674
|
runCtx.toolCalls = toolCallHistory;
|
|
2535
2675
|
runCtx.toolResults = toolResultHistory;
|
|
2536
2676
|
}
|
|
2537
|
-
const readOnlyToolResultCache = seedReadOnlyToolResultsFromHistory(messages, actions);
|
|
2538
|
-
const duplicateReadOnlyToolCalls = seedDuplicateReadOnlyToolCallsFromHistory(messages, actions);
|
|
2539
|
-
const writeToolInterruptions = seedWriteToolInterruptionsFromHistory(messages, actions);
|
|
2540
|
-
const repeatedToolErrors = new Map();
|
|
2541
2677
|
// Tool-call journal hard-block (resume safety). See
|
|
2542
2678
|
// `loadPriorTurnToolCallJournal` for the full rationale — snapshotted ONCE
|
|
2543
2679
|
// here, before any tool runs in this chunk, and its prior-chunk tool
|
|
2544
2680
|
// calls/results are folded into `toolCallHistory` / `toolResultHistory` so
|
|
2545
2681
|
// final response guards see evidence from earlier chunks of this turn.
|
|
2546
2682
|
const consumedJournalKeys = new Set();
|
|
2547
|
-
const { toolCallJournal, priorToolCalls: journaledPriorToolCalls, priorToolResults: journaledPriorToolResults, } = await loadPriorTurnToolCallJournal(opts.threadId);
|
|
2683
|
+
const { toolCallJournal, priorToolCalls: journaledPriorToolCalls, priorToolResults: journaledPriorToolResults, } = await loadPriorTurnToolCallJournal(opts.threadId, opts.turnId);
|
|
2548
2684
|
toolCallHistory.push(...journaledPriorToolCalls);
|
|
2549
2685
|
toolResultHistory.push(...journaledPriorToolResults);
|
|
2686
|
+
const readOnlyToolResultCache = seedReadOnlyToolResultsFromHistory(messages, actions, seedReadOnlyToolResultsFromJournal(toolCallJournal, actions));
|
|
2687
|
+
const duplicateReadOnlyToolCalls = seedDuplicateReadOnlyToolCallsFromHistory(messages, actions);
|
|
2688
|
+
const writeToolInterruptions = seedWriteToolInterruptionsFromHistory(messages, actions);
|
|
2689
|
+
const repeatedToolErrors = new Map();
|
|
2690
|
+
const repeatedToolCalls = new Map();
|
|
2550
2691
|
let finalGuardRetries = 0;
|
|
2551
2692
|
let emptyFinalResponseRetries = 0;
|
|
2552
2693
|
let iterations = 0;
|
|
2694
|
+
// `loop_limit` and `done` share one terminal-event slot in run-manager, so a
|
|
2695
|
+
// trailing `done` would overwrite the boundary the continuation logic reads.
|
|
2696
|
+
let endedAtLoopLimit = false;
|
|
2553
2697
|
// Overridden (raised tokens, lowered effort) only after an empty-final-
|
|
2554
2698
|
// response retry below — kept separate from `opts.maxOutputTokens`/
|
|
2555
2699
|
// `opts.reasoningEffort` so the very first attempt is unaffected and later
|
|
@@ -2576,9 +2720,25 @@ export async function runAgentLoop(opts) {
|
|
|
2576
2720
|
while (true) {
|
|
2577
2721
|
if (signal.aborted)
|
|
2578
2722
|
break;
|
|
2723
|
+
const turnInputTokens = priorTurnInputTokens + usage.inputTokens;
|
|
2724
|
+
if (turnInputTokens > maxRunInputTokens) {
|
|
2725
|
+
// Terminal for the whole TURN, not a chunk boundary: emitting
|
|
2726
|
+
// `loop_limit` here would hand off to a successor chunk that inherits the
|
|
2727
|
+
// same exhausted total and immediately re-terminate, burning the run
|
|
2728
|
+
// ledger 25 times over.
|
|
2729
|
+
emitTripwire(new TripWire(`I stopped because this request consumed ${turnInputTokens.toLocaleString()} input tokens, past the ${maxRunInputTokens.toLocaleString()} budget for a single turn. ` +
|
|
2730
|
+
`Anything already completed above is saved. Please retry as a smaller, more specific follow-up.`, { processor: "run-input-token-budget" }));
|
|
2731
|
+
break;
|
|
2732
|
+
}
|
|
2733
|
+
// Terminal, NOT a nudge-and-reset: the run ends at `loop_limit` and the
|
|
2734
|
+
// durable per-turn ledger (or the client's own continuation) decides
|
|
2735
|
+
// whether the turn gets another chunk. Resetting the counter in-process
|
|
2736
|
+
// made the budget unenforceable and meant this event was never emitted,
|
|
2737
|
+
// even though run-manager, thread-data-builder and the client all handle it.
|
|
2579
2738
|
if (++iterations > maxIterations) {
|
|
2580
|
-
|
|
2581
|
-
|
|
2739
|
+
send({ type: "loop_limit", maxIterations });
|
|
2740
|
+
endedAtLoopLimit = true;
|
|
2741
|
+
break;
|
|
2582
2742
|
}
|
|
2583
2743
|
let assistantContent;
|
|
2584
2744
|
let streamedAssistantText = "";
|
|
@@ -2639,10 +2799,10 @@ export async function runAgentLoop(opts) {
|
|
|
2639
2799
|
let zeroByteToolInputRestart;
|
|
2640
2800
|
let endedForNoProgress = false;
|
|
2641
2801
|
let lastModelStreamProgressAt = Date.now();
|
|
2642
|
-
// FIX 2: true once
|
|
2643
|
-
//
|
|
2644
|
-
// `FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS` below to
|
|
2645
|
-
//
|
|
2802
|
+
// FIX 2: true once a real (non-heartbeat) engine-stream event has been
|
|
2803
|
+
// retrieved for THIS model call — gates
|
|
2804
|
+
// `FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS` below to the window before
|
|
2805
|
+
// the model has produced anything, never subsequent gaps.
|
|
2646
2806
|
let hasReceivedFirstEngineEvent = false;
|
|
2647
2807
|
// Resolved once per model-call attempt (not per event) so a single
|
|
2648
2808
|
// call's deadline math can't observe the runtime predicates changing
|
|
@@ -2818,17 +2978,17 @@ export async function runAgentLoop(opts) {
|
|
|
2818
2978
|
eventIteratorDone = true;
|
|
2819
2979
|
break;
|
|
2820
2980
|
}
|
|
2821
|
-
// FIX 2: only the deadline for THIS await could have been
|
|
2822
|
-
// tightened by FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS — every
|
|
2823
|
-
// subsequent call in this model call reverts to the normal 90s
|
|
2824
|
-
// watchdog regardless of what kind of event this turned out to be.
|
|
2825
|
-
hasReceivedFirstEngineEvent = true;
|
|
2826
2981
|
const event = nextEvent.value;
|
|
2827
2982
|
if (hasNoProgressStalled()) {
|
|
2828
2983
|
checkpointNoProgress();
|
|
2829
2984
|
break;
|
|
2830
2985
|
}
|
|
2986
|
+
// A gateway keepalive proves the transport is up, not that the
|
|
2987
|
+
// model started: it must not release the 25s first-model-event cap
|
|
2988
|
+
// any more than it counts as stream progress, or an endless
|
|
2989
|
+
// keepalive stream rides the unreachable 90s watchdog instead.
|
|
2831
2990
|
if (event.type !== "gateway-heartbeat") {
|
|
2991
|
+
hasReceivedFirstEngineEvent = true;
|
|
2832
2992
|
lastModelStreamProgressAt = Date.now();
|
|
2833
2993
|
}
|
|
2834
2994
|
// In-loop processor seam (stream hook). Each chunk is offered to every
|
|
@@ -2939,10 +3099,18 @@ export async function runAgentLoop(opts) {
|
|
|
2939
3099
|
assistantContent = event.parts;
|
|
2940
3100
|
}
|
|
2941
3101
|
else if (event.type === "usage") {
|
|
2942
|
-
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
3102
|
+
const eventUsage = {
|
|
3103
|
+
inputTokens: event.inputTokens,
|
|
3104
|
+
outputTokens: event.outputTokens,
|
|
3105
|
+
cacheReadTokens: event.cacheReadTokens ?? 0,
|
|
3106
|
+
cacheWriteTokens: event.cacheWriteTokens ?? 0,
|
|
3107
|
+
model,
|
|
3108
|
+
};
|
|
3109
|
+
usage.inputTokens += eventUsage.inputTokens;
|
|
3110
|
+
usage.outputTokens += eventUsage.outputTokens;
|
|
3111
|
+
usage.cacheReadTokens += eventUsage.cacheReadTokens;
|
|
3112
|
+
usage.cacheWriteTokens += eventUsage.cacheWriteTokens;
|
|
3113
|
+
opts.onUsage?.(eventUsage);
|
|
2946
3114
|
}
|
|
2947
3115
|
else if (event.type === "stop") {
|
|
2948
3116
|
terminalStopReason = event.reason;
|
|
@@ -3003,7 +3171,9 @@ export async function runAgentLoop(opts) {
|
|
|
3003
3171
|
}
|
|
3004
3172
|
throw new EngineError("Conversation has grown too long. The agent tried to recover automatically but the context is still too large. You can continue in a new chat, or ask the agent to summarize the conversation and continue.", { errorCode: "context_length_exceeded" });
|
|
3005
3173
|
}
|
|
3006
|
-
if (retry < maxRetriesForError(err) &&
|
|
3174
|
+
if (retry < maxRetriesForError(err) &&
|
|
3175
|
+
isRetryableError(err) &&
|
|
3176
|
+
hasBudgetForEngineRetry(budgetStartedAt, retry)) {
|
|
3007
3177
|
// Clear partial text from the failed attempt so the retry
|
|
3008
3178
|
// doesn't produce garbled duplicate output. Keep the retry itself
|
|
3009
3179
|
// silent so transient provider/backend failures do not leak into
|
|
@@ -3211,12 +3381,28 @@ export async function runAgentLoop(opts) {
|
|
|
3211
3381
|
emptyFinalResponseRetries = 0;
|
|
3212
3382
|
flushUnstreamedAssistantText();
|
|
3213
3383
|
let requestedActionStop = null;
|
|
3384
|
+
const noteRepeatedToolCall = (toolName, input) => {
|
|
3385
|
+
const key = toolCallCacheKey(toolName, input);
|
|
3386
|
+
const count = (repeatedToolCalls.get(key) ?? 0) + 1;
|
|
3387
|
+
repeatedToolCalls.set(key, count);
|
|
3388
|
+
if (count < MAX_IDENTICAL_TOOL_CALLS)
|
|
3389
|
+
return;
|
|
3390
|
+
requestedActionStop ??= {
|
|
3391
|
+
message: `Stopped because ${toolName} was called ${count} times with identical arguments in one turn, ` +
|
|
3392
|
+
`which means the same step is repeating rather than making progress. ` +
|
|
3393
|
+
`Everything completed before this point is preserved above.`,
|
|
3394
|
+
errorCode: "repeated_tool_call",
|
|
3395
|
+
};
|
|
3396
|
+
};
|
|
3214
3397
|
// Human-in-the-loop approvals granted by the user for this turn (opt-in;
|
|
3215
3398
|
// empty for the overwhelming majority of turns). Keyed by the stable
|
|
3216
3399
|
// tool-call approval key so a re-issued continuation can let an approved
|
|
3217
3400
|
// call run. The model cannot populate this — it comes from the request.
|
|
3218
3401
|
const approvedToolCallKeys = new Set(opts.approvedToolCalls ?? []);
|
|
3219
3402
|
const runToolCall = async (toolCall) => {
|
|
3403
|
+
// Counted before any journal/cache short-circuit: serving a repeat from
|
|
3404
|
+
// cache still means the model is asking the same question again.
|
|
3405
|
+
noteRepeatedToolCall(toolCall.name, toolCall.input);
|
|
3220
3406
|
const actionEntry = actions[toolCall.name];
|
|
3221
3407
|
const placeholderNormalization = actionEntry
|
|
3222
3408
|
? normalizeOptionalToolPlaceholders(actionEntry.tool.parameters, toolCall.input)
|
|
@@ -3456,9 +3642,12 @@ export async function runAgentLoop(opts) {
|
|
|
3456
3642
|
// run-manager still aborts foreground hosted runs around 40s, while
|
|
3457
3643
|
// background runs get nearly the full 15-minute function budget.
|
|
3458
3644
|
const DEFAULT_TOOL_TIMEOUT_MS = 12 * 60_000;
|
|
3459
|
-
const
|
|
3645
|
+
const requestedToolTimeoutMs = actionEntry.timeoutMs ??
|
|
3460
3646
|
opts.toolLimits?.timeoutMs ??
|
|
3461
3647
|
DEFAULT_TOOL_TIMEOUT_MS;
|
|
3648
|
+
const toolTimeoutMs = runToolTimeoutCeilingMs > 0
|
|
3649
|
+
? Math.min(requestedToolTimeoutMs, runToolTimeoutCeilingMs)
|
|
3650
|
+
: requestedToolTimeoutMs;
|
|
3462
3651
|
const toolMaxResultChars = actionEntry.maxResultChars ??
|
|
3463
3652
|
opts.toolLimits?.maxResultChars ??
|
|
3464
3653
|
DEFAULT_TOOL_RESULT_CHARS;
|
|
@@ -3474,6 +3663,12 @@ export async function runAgentLoop(opts) {
|
|
|
3474
3663
|
// calls with no completed journal entry are completely unaffected). The
|
|
3475
3664
|
// snapshot was taken before this chunk's tools ran, so it can only match a
|
|
3476
3665
|
// PRIOR completion, never one from the current chunk.
|
|
3666
|
+
//
|
|
3667
|
+
// Read-only tools take the OTHER half of this protection:
|
|
3668
|
+
// `seedReadOnlyToolResultsFromJournal` puts their journaled results into
|
|
3669
|
+
// `readOnlyToolResultCache`, so the duplicate-read guard below serves them
|
|
3670
|
+
// as a cache hit (respecting `dedupe: false` and write invalidation)
|
|
3671
|
+
// instead of re-executing.
|
|
3477
3672
|
if (!actionEntry.readOnly && toolCallJournal) {
|
|
3478
3673
|
const journaled = findCompletedJournalEntry(toolCallJournal, toolCall.name, toolCall.input, consumedJournalKeys);
|
|
3479
3674
|
if (journaled) {
|
|
@@ -3905,6 +4100,14 @@ export async function runAgentLoop(opts) {
|
|
|
3905
4100
|
if (isError) {
|
|
3906
4101
|
result = finalizeToolErrorResult(result);
|
|
3907
4102
|
}
|
|
4103
|
+
// Side-channel warnings raised anywhere inside the action's call stack
|
|
4104
|
+
// (see `action-warnings.ts`). Drained here rather than in the success
|
|
4105
|
+
// branch so an action that warns and then throws still surfaces it, and
|
|
4106
|
+
// so nothing stays pending to bleed into a later tool's result.
|
|
4107
|
+
const agentWarnings = drainAgentWarnings();
|
|
4108
|
+
if (agentWarnings.length > 0) {
|
|
4109
|
+
result = `${result}\n\n${formatAgentWarningsForToolResult(agentWarnings)}`;
|
|
4110
|
+
}
|
|
3908
4111
|
// Auto-refresh the UI after a successful mutating tool call. Any action
|
|
3909
4112
|
// that isn't explicitly read-only is assumed to mutate. The client's
|
|
3910
4113
|
// useDbSync listener sees a change event with source:"action" and
|
|
@@ -4037,7 +4240,7 @@ export async function runAgentLoop(opts) {
|
|
|
4037
4240
|
}
|
|
4038
4241
|
return usage;
|
|
4039
4242
|
}
|
|
4040
|
-
if (!signal.aborted) {
|
|
4243
|
+
if (!signal.aborted && !endedAtLoopLimit) {
|
|
4041
4244
|
// In-loop processor seam (result hook). Fires once at clean run end with the
|
|
4042
4245
|
// final assistant text so processors (e.g. a proof-of-done gate) can record
|
|
4043
4246
|
// a verdict. A result-hook abort cannot un-finish a completed run, so a
|
|
@@ -4263,6 +4466,7 @@ export async function runAgentLoopWithMainChatInternalContinuations(opts) {
|
|
|
4263
4466
|
usage.cacheWriteTokens += next.cacheWriteTokens;
|
|
4264
4467
|
usage.model = next.model;
|
|
4265
4468
|
};
|
|
4469
|
+
const budgetStartedAt = opts.budgetStartedAt ?? Date.now();
|
|
4266
4470
|
const resumeResumableErrorsInProcess = opts.resumeResumableErrorsInProcess === true;
|
|
4267
4471
|
const maxContinuations = typeof opts.maxContinuations === "number" && opts.maxContinuations > 0
|
|
4268
4472
|
? opts.maxContinuations
|
|
@@ -4285,19 +4489,26 @@ export async function runAgentLoopWithMainChatInternalContinuations(opts) {
|
|
|
4285
4489
|
try {
|
|
4286
4490
|
const nextUsage = await runAgentLoop({
|
|
4287
4491
|
...opts,
|
|
4492
|
+
budgetStartedAt,
|
|
4288
4493
|
send,
|
|
4289
4494
|
finalResponseGuardRequestText,
|
|
4290
4495
|
});
|
|
4291
4496
|
addUsage(nextUsage);
|
|
4292
4497
|
}
|
|
4293
4498
|
catch (err) {
|
|
4294
|
-
//
|
|
4295
|
-
//
|
|
4296
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4499
|
+
// An aborted signal (real soft-timeout / user stop) or a non-resumable
|
|
4500
|
+
// error is always rethrown.
|
|
4501
|
+
if (opts.signal.aborted || !isResumableEngineError(err))
|
|
4502
|
+
throw err;
|
|
4503
|
+
// A caller with a proven long budget (`resumeResumableErrorsInProcess`)
|
|
4504
|
+
// always resumes here. Everyone else — notably the foreground chat turn,
|
|
4505
|
+
// where a resumable transport error previously ALWAYS propagated and in
|
|
4506
|
+
// practice was never resumed by any other layer — resumes too, but only
|
|
4507
|
+
// while enough wall-clock remains to attempt it without being cut off
|
|
4508
|
+
// mid-stream by the platform wall.
|
|
4509
|
+
if (!resumeResumableErrorsInProcess &&
|
|
4510
|
+
remainingRunBudgetMs(budgetStartedAt) <
|
|
4511
|
+
SELF_CHAIN_MIN_CONTINUATION_BUDGET_MS) {
|
|
4301
4512
|
throw err;
|
|
4302
4513
|
}
|
|
4303
4514
|
continuationReason = continuationReasonForResumableError(err);
|
|
@@ -4432,6 +4643,8 @@ export async function claimBackgroundWorkerRunEarly(opts) {
|
|
|
4432
4643
|
const insert = opts.deps?.insertRun ?? insertRun;
|
|
4433
4644
|
const claim = opts.deps?.claimBackgroundRun ?? claimBackgroundRun;
|
|
4434
4645
|
const heartbeat = opts.deps?.updateRunHeartbeat ?? updateRunHeartbeat;
|
|
4646
|
+
const turnAborted = opts.deps?.isTurnAborted ?? isTurnAborted;
|
|
4647
|
+
const abortRun = opts.deps?.markRunAborted ?? markRunAborted;
|
|
4435
4648
|
const threadId = typeof opts.threadId === "string" && opts.threadId.trim()
|
|
4436
4649
|
? opts.threadId.trim()
|
|
4437
4650
|
: opts.runId;
|
|
@@ -4447,11 +4660,21 @@ export async function claimBackgroundWorkerRunEarly(opts) {
|
|
|
4447
4660
|
]
|
|
4448
4661
|
.filter(Boolean)
|
|
4449
4662
|
.join(" ")).catch(() => { });
|
|
4663
|
+
// A failed durable abort read is fail-closed: never let a worker execute
|
|
4664
|
+
// after cancellation just because the database was temporarily unreadable.
|
|
4665
|
+
if (await turnAborted(threadId, turnId).catch(() => true)) {
|
|
4666
|
+
await abortRun(opts.runId, "user").catch(() => { });
|
|
4667
|
+
return { claimed: false, skipped: "turn-aborted" };
|
|
4668
|
+
}
|
|
4450
4669
|
if (opts.continuationCount > 0) {
|
|
4451
4670
|
await insert(opts.runId, threadId, turnId, {
|
|
4452
4671
|
dispatchMode: "background",
|
|
4453
4672
|
}).catch(() => { });
|
|
4454
4673
|
}
|
|
4674
|
+
if (await turnAborted(threadId, turnId).catch(() => true)) {
|
|
4675
|
+
await abortRun(opts.runId, "user").catch(() => { });
|
|
4676
|
+
return { claimed: false, skipped: "turn-aborted" };
|
|
4677
|
+
}
|
|
4455
4678
|
const won = await claim(opts.runId);
|
|
4456
4679
|
if (!won) {
|
|
4457
4680
|
await record(opts.runId, RUN_DIAG_STAGE.workerClaimLost).catch(() => { });
|
|
@@ -4459,8 +4682,82 @@ export async function claimBackgroundWorkerRunEarly(opts) {
|
|
|
4459
4682
|
}
|
|
4460
4683
|
await record(opts.runId, RUN_DIAG_STAGE.workerClaimed).catch(() => { });
|
|
4461
4684
|
await heartbeat(opts.runId).catch(() => { });
|
|
4685
|
+
if (await turnAborted(threadId, turnId).catch(() => true)) {
|
|
4686
|
+
await abortRun(opts.runId, "user").catch(() => { });
|
|
4687
|
+
return { claimed: false, skipped: "turn-aborted" };
|
|
4688
|
+
}
|
|
4462
4689
|
return { claimed: true };
|
|
4463
4690
|
}
|
|
4691
|
+
/**
|
|
4692
|
+
* Wall-clock ceiling on a single logical turn. The run-count ledger alone is
|
|
4693
|
+
* not a time bound: in durable mode each of the ~25 permitted chunks may burn
|
|
4694
|
+
* ~780s, so the ledger's real worst case is over five hours (production has an
|
|
4695
|
+
* observed 2h34m turn). Nobody is waiting that long, and every minute past
|
|
4696
|
+
* this point is spend on a request the user has abandoned.
|
|
4697
|
+
*/
|
|
4698
|
+
export const MAX_TURN_WALL_CLOCK_MS = 90 * 60_000;
|
|
4699
|
+
/**
|
|
4700
|
+
* Request-body field carrying the turn's running input-token total across
|
|
4701
|
+
* chunks. It rides the BODY (not the background-run marker) because the marker
|
|
4702
|
+
* is stripped from `continuationBody` on every handoff while the body is the
|
|
4703
|
+
* successor's persisted rehydration payload.
|
|
4704
|
+
*/
|
|
4705
|
+
export const AGENT_CHAT_TURN_INPUT_TOKENS_FIELD = "__agentNativeTurnInputTokens";
|
|
4706
|
+
/**
|
|
4707
|
+
* First `started_at` for a logical turn — the turn's true wall-clock origin
|
|
4708
|
+
* (`agent_runs.started_at` is never bumped by heartbeats). Returns null when
|
|
4709
|
+
* the turn has no rows or the read fails, in which case the deadline simply
|
|
4710
|
+
* does not apply and the run-count ledger remains the only bound.
|
|
4711
|
+
*
|
|
4712
|
+
* Costs one extra round trip per chain. Folding `MIN(started_at)` into
|
|
4713
|
+
* `countRunsForTurn`'s existing SELECT in run-store.ts would remove it.
|
|
4714
|
+
*/
|
|
4715
|
+
async function readTurnStartedAt(threadId, turnId) {
|
|
4716
|
+
const { rows } = await getDbExec().execute({
|
|
4717
|
+
sql: `SELECT MIN(started_at) AS turn_started_at FROM agent_runs WHERE thread_id = ? AND turn_id = ?`,
|
|
4718
|
+
args: [threadId, turnId],
|
|
4719
|
+
});
|
|
4720
|
+
const raw = rows?.[0]
|
|
4721
|
+
?.turn_started_at;
|
|
4722
|
+
const startedAt = Number(raw);
|
|
4723
|
+
return Number.isFinite(startedAt) && startedAt > 0 ? startedAt : null;
|
|
4724
|
+
}
|
|
4725
|
+
/**
|
|
4726
|
+
* Append a user-visible assistant text event to a live run from outside the
|
|
4727
|
+
* agent loop. The budget-exhaustion paths below terminate a turn that has
|
|
4728
|
+
* already done real work; without this the user sees only a bare
|
|
4729
|
+
* `turn_continuation_budget_exhausted` error string and every completed tool
|
|
4730
|
+
* result looks discarded. Best-effort — a failed ledger write must not turn a
|
|
4731
|
+
* budget stop into a thrown error.
|
|
4732
|
+
*/
|
|
4733
|
+
async function emitRunText(run, text) {
|
|
4734
|
+
const runEvent = {
|
|
4735
|
+
seq: run.events.length,
|
|
4736
|
+
event: { type: "text", text },
|
|
4737
|
+
};
|
|
4738
|
+
run.events.push(runEvent);
|
|
4739
|
+
for (const subscriber of run.subscribers) {
|
|
4740
|
+
try {
|
|
4741
|
+
subscriber(runEvent);
|
|
4742
|
+
}
|
|
4743
|
+
catch { }
|
|
4744
|
+
}
|
|
4745
|
+
await insertRunEvent(run.runId, runEvent.seq, JSON.stringify(runEvent.event)).catch(() => { });
|
|
4746
|
+
}
|
|
4747
|
+
/**
|
|
4748
|
+
* One sentence naming what the turn actually finished, derived from the same
|
|
4749
|
+
* per-turn journal the resume note uses (no new ledger read shape).
|
|
4750
|
+
*/
|
|
4751
|
+
async function describeTurnProgress(threadId, turnId) {
|
|
4752
|
+
const { toolCallJournal } = await loadPriorTurnToolCallJournal(threadId, turnId);
|
|
4753
|
+
const completed = toolCallJournal?.completed ?? [];
|
|
4754
|
+
if (completed.length === 0)
|
|
4755
|
+
return "No steps had completed yet.";
|
|
4756
|
+
const names = [...new Set(completed.map((entry) => entry.tool))];
|
|
4757
|
+
const shown = names.slice(0, 8).join(", ");
|
|
4758
|
+
return (`${completed.length} step(s) completed before I stopped (${shown}` +
|
|
4759
|
+
`${names.length > 8 ? ", …" : ""}). Their results are in the messages above.`);
|
|
4760
|
+
}
|
|
4464
4761
|
/**
|
|
4465
4762
|
* Sizes the dispatch retry budget by *remaining wall-clock capacity*, not by
|
|
4466
4763
|
* dispatch TARGET — the two are independent concerns. `chainViaDurableBackground`
|
|
@@ -4632,11 +4929,15 @@ export const MAX_NESTED_SELF_DISPATCH_DEPTH = 6;
|
|
|
4632
4929
|
export async function chainServerDrivenContinuation(opts) {
|
|
4633
4930
|
const d = {
|
|
4634
4931
|
countRunsForTurn: opts.deps?.countRunsForTurn ?? countRunsForTurn,
|
|
4932
|
+
readTurnStartedAt: opts.deps?.readTurnStartedAt ?? readTurnStartedAt,
|
|
4933
|
+
isTurnAborted: opts.deps?.isTurnAborted ?? isTurnAborted,
|
|
4934
|
+
emitRunText: opts.deps?.emitRunText ?? emitRunText,
|
|
4635
4935
|
insertRun: opts.deps?.insertRun ?? insertRun,
|
|
4636
4936
|
fireInternalDispatch: opts.deps?.fireInternalDispatch ?? fireInternalDispatch,
|
|
4637
4937
|
readBackgroundRunClaim: opts.deps?.readBackgroundRunClaim ?? readBackgroundRunClaim,
|
|
4638
4938
|
updateRunHeartbeat: opts.deps?.updateRunHeartbeat ?? updateRunHeartbeat,
|
|
4639
4939
|
updateRunStatusIfRunning: opts.deps?.updateRunStatusIfRunning ?? updateRunStatusIfRunning,
|
|
4940
|
+
markRunAborted: opts.deps?.markRunAborted ?? markRunAborted,
|
|
4640
4941
|
setRunTerminalReason: opts.deps?.setRunTerminalReason ?? setRunTerminalReason,
|
|
4641
4942
|
recordRunDiagnostic: opts.deps?.recordRunDiagnostic ?? recordRunDiagnostic,
|
|
4642
4943
|
markBackgroundContinuationChunkTerminal: opts.deps?.markBackgroundContinuationChunkTerminal ??
|
|
@@ -4656,17 +4957,35 @@ export async function chainServerDrivenContinuation(opts) {
|
|
|
4656
4957
|
const turnRunCount = await d
|
|
4657
4958
|
.countRunsForTurn(effectiveThreadId, effectiveTurnId)
|
|
4658
4959
|
.catch(() => null);
|
|
4659
|
-
|
|
4660
|
-
|
|
4661
|
-
|
|
4960
|
+
const stopTurn = async (terminalReason, logLine, userMessage) => {
|
|
4961
|
+
console.error(`[agent-chat] ${logLine}`, runId);
|
|
4962
|
+
const progress = await describeTurnProgress(effectiveThreadId, effectiveTurnId).catch(() => "");
|
|
4963
|
+
await d
|
|
4964
|
+
.emitRunText(run, progress ? `${userMessage}\n\n${progress}` : userMessage)
|
|
4965
|
+
.catch(() => { });
|
|
4662
4966
|
const statusUpdated = await d
|
|
4663
4967
|
.updateRunStatusIfRunning(runId, "errored")
|
|
4664
4968
|
.catch(() => false);
|
|
4665
4969
|
if (statusUpdated) {
|
|
4666
|
-
await d
|
|
4667
|
-
.setRunTerminalReason(runId, "turn_continuation_budget_exhausted")
|
|
4668
|
-
.catch(() => { });
|
|
4970
|
+
await d.setRunTerminalReason(runId, terminalReason).catch(() => { });
|
|
4669
4971
|
}
|
|
4972
|
+
};
|
|
4973
|
+
if (turnRunCount !== null &&
|
|
4974
|
+
turnRunCount > MAX_BACKGROUND_RUN_CONTINUATIONS + 5) {
|
|
4975
|
+
await stopTurn("turn_continuation_budget_exhausted", `turn ${effectiveTurnId} consumed ${turnRunCount} runs — refusing to chain further`, `I stopped after ${turnRunCount} internal continuations without finishing this request.`);
|
|
4976
|
+
return;
|
|
4977
|
+
}
|
|
4978
|
+
// WALL-CLOCK CEILING. The run-count ledger above bounds chunks, not time: in
|
|
4979
|
+
// durable mode 25 chunks x ~780s is over five hours, and prod has an observed
|
|
4980
|
+
// 2h34m turn. Measured from the turn's FIRST run row, so it survives every
|
|
4981
|
+
// recovery path exactly like the run count does.
|
|
4982
|
+
const turnStartedAt = await d
|
|
4983
|
+
.readTurnStartedAt(effectiveThreadId, effectiveTurnId)
|
|
4984
|
+
.catch(() => null);
|
|
4985
|
+
const turnElapsedMs = turnStartedAt === null ? 0 : Date.now() - turnStartedAt;
|
|
4986
|
+
if (turnElapsedMs > MAX_TURN_WALL_CLOCK_MS) {
|
|
4987
|
+
const elapsedMinutes = Math.round(turnElapsedMs / 60_000);
|
|
4988
|
+
await stopTurn("turn_wall_clock_budget_exhausted", `turn ${effectiveTurnId} ran ${elapsedMinutes}min (limit ${Math.round(MAX_TURN_WALL_CLOCK_MS / 60_000)}min) — refusing to chain further`, `I stopped after ${elapsedMinutes} minutes without finishing this request.`);
|
|
4670
4989
|
return;
|
|
4671
4990
|
}
|
|
4672
4991
|
// Mint the next chunk's runId here and sign the dispatch token over it, so
|
|
@@ -4698,9 +5017,18 @@ export async function chainServerDrivenContinuation(opts) {
|
|
|
4698
5017
|
const continuationBody = {
|
|
4699
5018
|
...opts.requestBody,
|
|
4700
5019
|
internalContinuation: true,
|
|
5020
|
+
...(typeof opts.turnInputTokens === "number"
|
|
5021
|
+
? { [AGENT_CHAT_TURN_INPUT_TOKENS_FIELD]: opts.turnInputTokens }
|
|
5022
|
+
: {}),
|
|
4701
5023
|
};
|
|
4702
5024
|
delete continuationBody[AGENT_CHAT_BACKGROUND_RUN_FIELD];
|
|
4703
5025
|
try {
|
|
5026
|
+
if (await d
|
|
5027
|
+
.isTurnAborted(effectiveThreadId, effectiveTurnId)
|
|
5028
|
+
.catch(() => true)) {
|
|
5029
|
+
await d.markRunAborted(runId, "user").catch(() => { });
|
|
5030
|
+
return;
|
|
5031
|
+
}
|
|
4704
5032
|
await d
|
|
4705
5033
|
.recordRunDiagnostic(runId, RUN_DIAG_STAGE.workerSetupStep, `chain_dispatch_start nextRunId=${nextRunId} reason=${continuationReason} path=${continuationDispatchPath}`)
|
|
4706
5034
|
.catch(() => { });
|
|
@@ -4734,6 +5062,14 @@ export async function chainServerDrivenContinuation(opts) {
|
|
|
4734
5062
|
.catch(() => { });
|
|
4735
5063
|
console.error("[agent-chat] continuation insertRun failed; dispatching with inline body:", insertErr instanceof Error ? insertErr.message : insertErr);
|
|
4736
5064
|
}
|
|
5065
|
+
if (await d
|
|
5066
|
+
.isTurnAborted(effectiveThreadId, effectiveTurnId)
|
|
5067
|
+
.catch(() => true)) {
|
|
5068
|
+
if (nextRowInserted)
|
|
5069
|
+
await d.markRunAborted(nextRunId, "user").catch(() => { });
|
|
5070
|
+
await d.markRunAborted(runId, "user").catch(() => { });
|
|
5071
|
+
return;
|
|
5072
|
+
}
|
|
4737
5073
|
const dispatchBody = nextRowInserted
|
|
4738
5074
|
? {
|
|
4739
5075
|
internalContinuation: true,
|
|
@@ -4827,8 +5163,13 @@ export async function chainServerDrivenContinuation(opts) {
|
|
|
4827
5163
|
console.error(`[agent-chat] background continuation dispatch deferred (${deferralClassification}); leaving the pre-inserted successor for the unclaimed-run sweep to redispatch:`, lastDispatchErr instanceof Error
|
|
4828
5164
|
? lastDispatchErr.message
|
|
4829
5165
|
: lastDispatchErr);
|
|
5166
|
+
// `completed`, not `errored`: this chunk's work IS durably persisted
|
|
5167
|
+
// and a successor row exists for the sweep to redispatch. Only the
|
|
5168
|
+
// handoff attempt failed, and the terminal reason already says so —
|
|
5169
|
+
// recording the chunk as errored made a recoverable deferral look like
|
|
5170
|
+
// a failed turn everywhere run status is read.
|
|
4830
5171
|
const statusUpdated = await d
|
|
4831
|
-
.updateRunStatusIfRunning(runId, "
|
|
5172
|
+
.updateRunStatusIfRunning(runId, "completed")
|
|
4832
5173
|
.catch(() => false);
|
|
4833
5174
|
if (statusUpdated) {
|
|
4834
5175
|
await d
|
|
@@ -5514,6 +5855,8 @@ export function createProductionAgentHandler(options) {
|
|
|
5514
5855
|
defaultMaxIterations: getDefaultMaxIterations(),
|
|
5515
5856
|
minMaxIterations: MIN_AGENT_MAX_ITERATIONS,
|
|
5516
5857
|
maxMaxIterations: MAX_AGENT_MAX_ITERATIONS,
|
|
5858
|
+
maxRunInputTokens: getDefaultMaxRunInputTokens(),
|
|
5859
|
+
defaultMaxRunInputTokens: getDefaultMaxRunInputTokens(),
|
|
5517
5860
|
scope: "default",
|
|
5518
5861
|
source: "default",
|
|
5519
5862
|
};
|
|
@@ -5652,10 +5995,22 @@ export function createProductionAgentHandler(options) {
|
|
|
5652
5995
|
: typeof requestTurnId === "string" && requestTurnId.trim()
|
|
5653
5996
|
? requestTurnId.trim()
|
|
5654
5997
|
: runId;
|
|
5998
|
+
if (isBackgroundWorker &&
|
|
5999
|
+
(await isTurnAborted(effectiveThreadId, effectiveTurnId).catch(() => true))) {
|
|
6000
|
+
await markRunAborted(runId, "user").catch(() => { });
|
|
6001
|
+
return { ok: true, stopped: true };
|
|
6002
|
+
}
|
|
5655
6003
|
const messageToPersist = typeof requestDisplayMessage === "string" &&
|
|
5656
6004
|
requestDisplayMessage.trim().length > 0
|
|
5657
6005
|
? requestDisplayMessage
|
|
5658
6006
|
: requestMessage;
|
|
6007
|
+
// Running per-turn input-token total. Seeded from the predecessor chunk's
|
|
6008
|
+
// body, advanced by this chunk's own usage, and handed to the successor so
|
|
6009
|
+
// the token ceiling bounds the TURN rather than resetting every chunk.
|
|
6010
|
+
const priorTurnInputTokensFromBody = Number(body[AGENT_CHAT_TURN_INPUT_TOKENS_FIELD]);
|
|
6011
|
+
let turnInputTokens = Number.isFinite(priorTurnInputTokensFromBody)
|
|
6012
|
+
? Math.max(0, priorTurnInputTokensFromBody)
|
|
6013
|
+
: 0;
|
|
5659
6014
|
// Server-driven background continuation: when the background worker re-fired
|
|
5660
6015
|
// itself at a soft-timeout boundary (a chained continuation chunk), rebuild
|
|
5661
6016
|
// the conversation from the persisted thread_data so the next chunk resumes
|
|
@@ -5761,6 +6116,16 @@ export function createProductionAgentHandler(options) {
|
|
|
5761
6116
|
// the Authorization Bearer HMAC is preserved either way.
|
|
5762
6117
|
path: backgroundDispatchPath,
|
|
5763
6118
|
taskId: runId,
|
|
6119
|
+
// A Netlify background function 202s on enqueue in well under a
|
|
6120
|
+
// second, so a 404/401/508 from it is an IMMEDIATE, knowable failure.
|
|
6121
|
+
// Fire-and-forget recorded those as `dispatched = true` and the user
|
|
6122
|
+
// waited out the claim grace for a worker that never existed. Only
|
|
6123
|
+
// for a real background-function target: a regular-function target
|
|
6124
|
+
// replies only after the successor chunk finishes, so awaiting it
|
|
6125
|
+
// would time out on every healthy dispatch.
|
|
6126
|
+
...(expectsNetlifyBackgroundFunction
|
|
6127
|
+
? { awaitResponse: true, responseTimeoutMs: 5_000 }
|
|
6128
|
+
: {}),
|
|
5764
6129
|
// When the row (and its persisted payload) landed, send only the
|
|
5765
6130
|
// marker — the worker rehydrates the body from dispatch_payload
|
|
5766
6131
|
// (`payloadRef`), keeping the self-POST far under Netlify's 256KB
|
|
@@ -6023,6 +6388,7 @@ export function createProductionAgentHandler(options) {
|
|
|
6023
6388
|
effectiveTurnId,
|
|
6024
6389
|
requestBody: body,
|
|
6025
6390
|
backgroundContinuationCount,
|
|
6391
|
+
turnInputTokens,
|
|
6026
6392
|
// Re-evaluate the durable gate rather than keying off
|
|
6027
6393
|
// isBackgroundWorker: a successor chunk of a FOREGROUND
|
|
6028
6394
|
// self-chain re-enters as a worker too, and must keep
|
|
@@ -6234,6 +6600,9 @@ export function createProductionAgentHandler(options) {
|
|
|
6234
6600
|
cacheWriteTokens: subUsage.cacheWriteTokens,
|
|
6235
6601
|
model: subUsage.model,
|
|
6236
6602
|
label: `custom-agent:${ref.name}`,
|
|
6603
|
+
runId,
|
|
6604
|
+
threadId: effectiveThreadId,
|
|
6605
|
+
taskId: effectiveTurnId,
|
|
6237
6606
|
});
|
|
6238
6607
|
}
|
|
6239
6608
|
catch { }
|
|
@@ -6326,6 +6695,13 @@ export function createProductionAgentHandler(options) {
|
|
|
6326
6695
|
: typeof message === "string" && message.trim().length > 0
|
|
6327
6696
|
? message
|
|
6328
6697
|
: undefined;
|
|
6698
|
+
const turnUsage = {
|
|
6699
|
+
inputTokens: 0,
|
|
6700
|
+
outputTokens: 0,
|
|
6701
|
+
cacheReadTokens: 0,
|
|
6702
|
+
cacheWriteTokens: 0,
|
|
6703
|
+
model: effectiveModel,
|
|
6704
|
+
};
|
|
6329
6705
|
const agentLoopOpts = {
|
|
6330
6706
|
engine,
|
|
6331
6707
|
model: effectiveModel,
|
|
@@ -6338,6 +6714,13 @@ export function createProductionAgentHandler(options) {
|
|
|
6338
6714
|
actions: requestActions,
|
|
6339
6715
|
send,
|
|
6340
6716
|
signal,
|
|
6717
|
+
onUsage: (usage) => {
|
|
6718
|
+
turnUsage.inputTokens += usage.inputTokens;
|
|
6719
|
+
turnUsage.outputTokens += usage.outputTokens;
|
|
6720
|
+
turnUsage.cacheReadTokens += usage.cacheReadTokens;
|
|
6721
|
+
turnUsage.cacheWriteTokens += usage.cacheWriteTokens;
|
|
6722
|
+
turnUsage.model = usage.model;
|
|
6723
|
+
},
|
|
6341
6724
|
ownerEmail,
|
|
6342
6725
|
orgId: getRequestOrgId() ?? null,
|
|
6343
6726
|
attachments: requestAttachments,
|
|
@@ -6350,6 +6733,8 @@ export function createProductionAgentHandler(options) {
|
|
|
6350
6733
|
providerOptions: options.providerOptions,
|
|
6351
6734
|
executionMode: requestMode,
|
|
6352
6735
|
maxIterations: loopSettings.maxIterations,
|
|
6736
|
+
maxRunInputTokens: loopSettings.maxRunInputTokens,
|
|
6737
|
+
priorTurnInputTokens: turnInputTokens,
|
|
6353
6738
|
finalResponseGuard: options.finalResponseGuard,
|
|
6354
6739
|
finalResponseGuardRequestText: messageToPersist,
|
|
6355
6740
|
...(options.toolLimits ? { toolLimits: options.toolLimits } : {}),
|
|
@@ -6388,91 +6773,99 @@ export function createProductionAgentHandler(options) {
|
|
|
6388
6773
|
: {}),
|
|
6389
6774
|
};
|
|
6390
6775
|
send({ type: "activity", label: "Contacting model" });
|
|
6391
|
-
// loopUsage is always assigned — either via instrumentAgentLoop or
|
|
6392
|
-
// runAgentLoop before use below. The definite-assignment guard is
|
|
6393
|
-
// conservative because the try/catch makes the control flow non-obvious.
|
|
6394
|
-
let loopUsage = undefined;
|
|
6395
6776
|
let instrumented = false;
|
|
6396
6777
|
try {
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6778
|
+
try {
|
|
6779
|
+
const { getObservabilityConfig, instrumentAgentLoop } = await import("../observability/traces.js");
|
|
6780
|
+
const obsConfig = await getObservabilityConfig();
|
|
6781
|
+
if (obsConfig.enabled) {
|
|
6782
|
+
instrumented = true;
|
|
6783
|
+
await instrumentAgentLoop({
|
|
6784
|
+
runAgentLoop: runAgentLoopWithMainChatInternalContinuations,
|
|
6785
|
+
loopOpts: agentLoopOpts,
|
|
6786
|
+
runId,
|
|
6787
|
+
threadId: threadId ?? null,
|
|
6788
|
+
userId: ownerEmail,
|
|
6789
|
+
config: obsConfig,
|
|
6790
|
+
metadata: {
|
|
6791
|
+
modelSelectionSource,
|
|
6792
|
+
...(experimentAssignments.length > 0
|
|
6793
|
+
? { experimentAssignments }
|
|
6794
|
+
: {}),
|
|
6795
|
+
},
|
|
6796
|
+
experimentAssignments,
|
|
6409
6797
|
modelSelectionSource,
|
|
6410
|
-
|
|
6411
|
-
|
|
6412
|
-
|
|
6413
|
-
|
|
6414
|
-
|
|
6415
|
-
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
};
|
|
6435
|
-
}
|
|
6436
|
-
return null;
|
|
6437
|
-
},
|
|
6438
|
-
});
|
|
6798
|
+
sentimentInput: shouldInferSentimentForTurn({
|
|
6799
|
+
internalContinuation: Boolean(internalContinuation),
|
|
6800
|
+
isBackgroundWorker,
|
|
6801
|
+
backgroundContinuationCount,
|
|
6802
|
+
hasUserText: Boolean(userVisibleSentimentInput),
|
|
6803
|
+
})
|
|
6804
|
+
? userVisibleSentimentInput
|
|
6805
|
+
: undefined,
|
|
6806
|
+
classifyError: () => {
|
|
6807
|
+
if (agentLoopOpts.signal.aborted &&
|
|
6808
|
+
agentLoopOpts.signal.reason === "run_timeout") {
|
|
6809
|
+
return {
|
|
6810
|
+
status: "success",
|
|
6811
|
+
errorMessage: null,
|
|
6812
|
+
metadata: {
|
|
6813
|
+
terminalReason: "run_timeout",
|
|
6814
|
+
recoverableContinuation: true,
|
|
6815
|
+
},
|
|
6816
|
+
};
|
|
6817
|
+
}
|
|
6818
|
+
return null;
|
|
6819
|
+
},
|
|
6820
|
+
});
|
|
6821
|
+
}
|
|
6439
6822
|
}
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
loopUsage =
|
|
6823
|
+
catch (err) {
|
|
6824
|
+
// If instrumentation setup failed, fall through to uninstrumented.
|
|
6825
|
+
// If the agent loop itself failed, re-throw after the outer finally
|
|
6826
|
+
// records any usage events that arrived before the failure.
|
|
6827
|
+
if (instrumented)
|
|
6828
|
+
throw err;
|
|
6829
|
+
}
|
|
6830
|
+
if (!instrumented) {
|
|
6449
6831
|
await runAgentLoopWithMainChatInternalContinuations(agentLoopOpts);
|
|
6450
|
-
}
|
|
6451
|
-
// Record token usage for cost monitoring so the Usage panel in
|
|
6452
|
-
// settings works in every mode, including local dev.
|
|
6453
|
-
try {
|
|
6454
|
-
const ownerEmail = options.resolveOwnerEmail
|
|
6455
|
-
? await options.resolveOwnerEmail(event)
|
|
6456
|
-
: getRequestUserEmail();
|
|
6457
|
-
if (ownerEmail &&
|
|
6458
|
-
(loopUsage.inputTokens > 0 ||
|
|
6459
|
-
loopUsage.outputTokens > 0 ||
|
|
6460
|
-
loopUsage.cacheReadTokens > 0 ||
|
|
6461
|
-
loopUsage.cacheWriteTokens > 0)) {
|
|
6462
|
-
const { recordUsage } = await import("../usage/store.js");
|
|
6463
|
-
await recordUsage({
|
|
6464
|
-
ownerEmail,
|
|
6465
|
-
inputTokens: loopUsage.inputTokens,
|
|
6466
|
-
outputTokens: loopUsage.outputTokens,
|
|
6467
|
-
cacheReadTokens: loopUsage.cacheReadTokens,
|
|
6468
|
-
cacheWriteTokens: loopUsage.cacheWriteTokens,
|
|
6469
|
-
model: loopUsage.model,
|
|
6470
|
-
label: body.usageLabel || "chat",
|
|
6471
|
-
});
|
|
6472
6832
|
}
|
|
6473
6833
|
}
|
|
6474
|
-
|
|
6475
|
-
//
|
|
6834
|
+
finally {
|
|
6835
|
+
// Advance and persist usage even when the provider aborts the loop
|
|
6836
|
+
// before its promise resolves; the per-event accumulator is the only
|
|
6837
|
+
// durable view of those partial model calls.
|
|
6838
|
+
turnInputTokens += turnUsage.inputTokens;
|
|
6839
|
+
try {
|
|
6840
|
+
const resolvedOwnerEmail = options.resolveOwnerEmail
|
|
6841
|
+
? await options.resolveOwnerEmail(event)
|
|
6842
|
+
: getRequestUserEmail();
|
|
6843
|
+
if (resolvedOwnerEmail &&
|
|
6844
|
+
(turnUsage.inputTokens > 0 ||
|
|
6845
|
+
turnUsage.outputTokens > 0 ||
|
|
6846
|
+
turnUsage.cacheReadTokens > 0 ||
|
|
6847
|
+
turnUsage.cacheWriteTokens > 0)) {
|
|
6848
|
+
const { recordUsage } = await import("../usage/store.js");
|
|
6849
|
+
await recordUsage({
|
|
6850
|
+
ownerEmail: resolvedOwnerEmail,
|
|
6851
|
+
inputTokens: turnUsage.inputTokens,
|
|
6852
|
+
outputTokens: turnUsage.outputTokens,
|
|
6853
|
+
cacheReadTokens: turnUsage.cacheReadTokens,
|
|
6854
|
+
cacheWriteTokens: turnUsage.cacheWriteTokens,
|
|
6855
|
+
model: turnUsage.model,
|
|
6856
|
+
label: body.usageLabel || "chat",
|
|
6857
|
+
// token_usage has had run_id/thread_id/task_id since it was
|
|
6858
|
+
// created and every row was NULL on all three, so no spend could
|
|
6859
|
+
// be tied back to a run, thread, or outcome.
|
|
6860
|
+
runId,
|
|
6861
|
+
threadId: effectiveThreadId,
|
|
6862
|
+
taskId: effectiveTurnId,
|
|
6863
|
+
});
|
|
6864
|
+
}
|
|
6865
|
+
}
|
|
6866
|
+
catch {
|
|
6867
|
+
// Usage recording failed — don't break the run
|
|
6868
|
+
}
|
|
6476
6869
|
}
|
|
6477
6870
|
}, handleRunComplete, {
|
|
6478
6871
|
// A synchronous self-chain chunk with enough remaining budget gets
|