@vellumai/assistant 0.8.0 → 0.8.2
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/AGENTS.md +11 -0
- package/ARCHITECTURE.md +2 -7
- package/Dockerfile +80 -5
- package/README.md +2 -2
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +21 -0
- package/docker-init-apt-root.sh +94 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +4462 -991
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +135 -14
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +129 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +137 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +35 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +278 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +159 -18
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -4
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +1 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +93 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +80 -3
- package/src/__tests__/conversation-fork-crud.test.ts +323 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +54 -18
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +297 -0
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +25 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +80 -13
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +482 -0
- package/src/__tests__/filing-service.test.ts +163 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +42 -69
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +162 -0
- package/src/__tests__/host-app-control-proxy.test.ts +365 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +156 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +410 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +248 -0
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +157 -39
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +107 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +190 -2
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +222 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +100 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +145 -14
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +863 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +48 -19
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +41 -38
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +31 -4
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -18
- package/src/__tests__/plugin-types.test.ts +15 -23
- package/src/__tests__/process-message-background-slack.test.ts +53 -0
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +20 -12
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +151 -0
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +208 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +12 -4
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -12
- package/src/__tests__/skill-load-tool.test.ts +29 -93
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +143 -5
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +108 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +170 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +241 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/agent/image-optimize.ts +13 -5
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +74 -36
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +109 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +578 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +478 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +429 -434
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +342 -304
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +40 -6
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -2
- package/src/config/feature-flag-registry.json +57 -1
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +140 -52
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +8 -7
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm-request-logs.ts +81 -0
- package/src/config/schemas/llm.ts +55 -2
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/config/skills.ts +3 -96
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1334
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +113 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +183 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +26 -30
- package/src/daemon/config-watcher.ts +94 -29
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +293 -103
- package/src/daemon/conversation-error.ts +188 -33
- package/src/daemon/conversation-lifecycle.ts +80 -26
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +85 -31
- package/src/daemon/conversation-runtime-assembly.ts +30 -6
- package/src/daemon/conversation-slash.ts +184 -25
- package/src/daemon/conversation-store.ts +24 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +63 -21
- package/src/daemon/conversation.ts +81 -10
- package/src/daemon/external-plugins-bootstrap.ts +231 -185
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +13 -130
- package/src/daemon/handlers/config-slack-channel.ts +25 -10
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +166 -84
- package/src/daemon/history-repair.ts +61 -7
- package/src/daemon/host-app-control-proxy.ts +129 -29
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +79 -70
- package/src/daemon/meet-host-supervisor.ts +20 -19
- package/src/daemon/memory-v2-startup.ts +58 -2
- package/src/daemon/message-protocol.ts +7 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +37 -9
- package/src/daemon/message-types/messages.ts +70 -1
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +61 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +77 -26
- package/src/daemon/server.ts +34 -20
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +79 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +444 -0
- package/src/heartbeat/heartbeat-run-store.ts +3 -1
- package/src/heartbeat/heartbeat-service.ts +189 -127
- package/src/home/__tests__/feed-types.test.ts +99 -127
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +41 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +2 -3
- package/src/index.ts +18 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +318 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +211 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +80 -8
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +17 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +368 -22
- package/src/memory/conversation-queries.ts +116 -12
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +6 -5
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +92 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +45 -6
- package/src/memory/indexer.ts +51 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +86 -15
- package/src/memory/jobs/embed-concept-page.ts +65 -20
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +57 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +324 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +64 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +175 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +107 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +19 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +13 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +36 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +27 -0
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -12
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +726 -18
- package/src/memory/v2/__tests__/migration.test.ts +94 -3
- package/src/memory/v2/__tests__/page-index.test.ts +360 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +309 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +138 -3
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +531 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +445 -11
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -109
- package/src/memory/v2/migration.ts +147 -20
- package/src/memory/v2/page-index.ts +221 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +195 -0
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +234 -93
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +323 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +204 -30
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +4 -3
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +48 -2
- package/src/notifications/home-feed-side-effect.ts +165 -0
- package/src/notifications/signal.ts +8 -1
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.ts +6 -2
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +14 -0
- package/src/permissions/ipc-risk-types.ts +3 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +46 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +144 -0
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +55 -6
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +367 -0
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +74 -53
- package/src/plugins/user-loader.ts +85 -43
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +49 -9
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +117 -0
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +72 -154
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +303 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +123 -54
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +170 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +210 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +401 -0
- package/src/providers/inference/resolve-auth.ts +73 -0
- package/src/providers/model-catalog.ts +386 -6
- package/src/providers/openai/chat-completions-provider.ts +10 -2
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/openrouter/client.ts +7 -0
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +36 -0
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +151 -159
- package/src/providers/retry.ts +65 -11
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +64 -7
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +311 -9
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +3 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +21 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +268 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +319 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +280 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +70 -3
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +12 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +156 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +233 -0
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +47 -85
- package/src/runtime/routes/conversation-query-routes.ts +350 -97
- package/src/runtime/routes/conversation-routes.ts +121 -21
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +248 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +118 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +42 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +285 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +84 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +361 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +7 -13
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +3 -1
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1097 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +79 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +93 -1
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +117 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +208 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/sequence/engine.ts +38 -40
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +28 -15
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +29 -14
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +14 -6
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +72 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +323 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +94 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +94 -5
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +117 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +95 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +46 -5
- package/src/workspace/migrations/types.ts +17 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/context-window-manager.test.ts +0 -2093
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -11,6 +11,7 @@ import { join } from "node:path";
|
|
|
11
11
|
|
|
12
12
|
import { v4 as uuid } from "uuid";
|
|
13
13
|
|
|
14
|
+
import { optimizeImageForTransport } from "../agent/image-optimize.js";
|
|
14
15
|
import type {
|
|
15
16
|
AgentEvent,
|
|
16
17
|
AgentLoop,
|
|
@@ -28,9 +29,11 @@ import {
|
|
|
28
29
|
contextWindowConfigFromEffective,
|
|
29
30
|
resolveEffectiveContextWindow,
|
|
30
31
|
} from "../config/llm-context-resolution.js";
|
|
32
|
+
import { resolveCallSiteConfig } from "../config/llm-resolver.js";
|
|
31
33
|
import { getConfig } from "../config/loader.js";
|
|
32
34
|
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
33
35
|
import type { ContextWindowConfig } from "../config/types.js";
|
|
36
|
+
import { runEmergencyCompaction } from "../context/compactor.js";
|
|
34
37
|
import {
|
|
35
38
|
derefToolResultReReads,
|
|
36
39
|
postTurnTruncateToolResults,
|
|
@@ -40,10 +43,9 @@ import {
|
|
|
40
43
|
getCalibrationProviderKey,
|
|
41
44
|
} from "../context/token-estimator.js";
|
|
42
45
|
import type { ContextWindowManager } from "../context/window-manager.js";
|
|
46
|
+
import { getDocumentsForConversation } from "../documents/document-store.js";
|
|
43
47
|
import type { ToolProfiler } from "../events/tool-profiling-listener.js";
|
|
44
|
-
import { emitFeedEvent } from "../home/emit-feed-event.js";
|
|
45
48
|
import { writeRelationshipState } from "../home/relationship-state-writer.js";
|
|
46
|
-
import { rewriteFeedTitle } from "../home/rewrite-feed-title.js";
|
|
47
49
|
import {
|
|
48
50
|
clearSentryConversationContext,
|
|
49
51
|
setSentryConversationContext,
|
|
@@ -71,13 +73,16 @@ import {
|
|
|
71
73
|
} from "../memory/conversation-title-service.js";
|
|
72
74
|
import type { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
|
|
73
75
|
import { recordMemoryRecallLog } from "../memory/memory-recall-log-store.js";
|
|
76
|
+
import { enqueueMemoryRetrospectiveOnCompaction } from "../memory/memory-retrospective-enqueue.js";
|
|
74
77
|
import { PKB_WORKSPACE_SCOPE } from "../memory/pkb/types.js";
|
|
75
78
|
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
76
79
|
import {
|
|
77
80
|
readMemoryV2StaticContent,
|
|
78
|
-
|
|
81
|
+
shouldExposePersonalMemory,
|
|
79
82
|
} from "../memory/v2/static-context.js";
|
|
80
83
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
84
|
+
import { HOOKS } from "../plugin-api/constants.js";
|
|
85
|
+
import type { UserPromptSubmitContext } from "../plugin-api/types.js";
|
|
81
86
|
import { defaultCompactionTerminal } from "../plugins/defaults/compaction.js";
|
|
82
87
|
import { defaultHistoryRepairTerminal } from "../plugins/defaults/history-repair.js";
|
|
83
88
|
import {
|
|
@@ -89,7 +94,7 @@ import {
|
|
|
89
94
|
import { defaultPersistenceTerminal } from "../plugins/defaults/persistence.js";
|
|
90
95
|
import { defaultTitleGenerateTerminal } from "../plugins/defaults/title-generate.js";
|
|
91
96
|
import { defaultTokenEstimateTerminal } from "../plugins/defaults/token-estimate.js";
|
|
92
|
-
import { DEFAULT_TIMEOUTS, runPipeline } from "../plugins/pipeline.js";
|
|
97
|
+
import { DEFAULT_TIMEOUTS, runHook, runPipeline } from "../plugins/pipeline.js";
|
|
93
98
|
import { getMiddlewaresFor } from "../plugins/registry.js";
|
|
94
99
|
import type {
|
|
95
100
|
CircuitBreakerArgs,
|
|
@@ -123,6 +128,7 @@ import type { Provider } from "../providers/types.js";
|
|
|
123
128
|
import { resolveActorTrust } from "../runtime/actor-trust-resolver.js";
|
|
124
129
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
125
130
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
131
|
+
import { publishConversationMessagesChanged } from "../runtime/sync/resource-sync-events.js";
|
|
126
132
|
import { redactSecrets } from "../security/secret-scanner.js";
|
|
127
133
|
import { getSubagentManager } from "../subagent/index.js";
|
|
128
134
|
import type { UsageActor } from "../usage/actors.js";
|
|
@@ -147,6 +153,7 @@ import {
|
|
|
147
153
|
createEventHandlerState,
|
|
148
154
|
dispatchAgentEvent,
|
|
149
155
|
type EventHandlerDeps,
|
|
156
|
+
getClientDisplayMessageId,
|
|
150
157
|
} from "./conversation-agent-loop-handlers.js";
|
|
151
158
|
import {
|
|
152
159
|
approveHostAttachmentRead,
|
|
@@ -200,6 +207,10 @@ import type {
|
|
|
200
207
|
} from "./message-protocol.js";
|
|
201
208
|
import type { MemoryRecalled } from "./message-types/memory.js";
|
|
202
209
|
import type { ConfirmationStateChanged } from "./message-types/messages.js";
|
|
210
|
+
import {
|
|
211
|
+
conversationMetadataSyncTag,
|
|
212
|
+
SYNC_TAGS,
|
|
213
|
+
} from "./message-types/sync.js";
|
|
203
214
|
import { parseActualTokensFromError } from "./parse-actual-tokens-from-error.js";
|
|
204
215
|
import type { TraceEmitter } from "./trace-emitter.js";
|
|
205
216
|
import type { TrustContext } from "./trust-context.js";
|
|
@@ -453,6 +464,15 @@ export interface AgentLoopConversationContext {
|
|
|
453
464
|
readonly contextWindowManager: ContextWindowManager;
|
|
454
465
|
contextCompactedMessageCount: number;
|
|
455
466
|
contextCompactedAt: number | null;
|
|
467
|
+
/**
|
|
468
|
+
* Set by `applyCompactionResult` when compaction strips runtime injections
|
|
469
|
+
* from the preserved tail. The next agent loop turn promotes this into a
|
|
470
|
+
* `compactedThisTurn` signal so NOW.md, PKB, and the v2 static block are
|
|
471
|
+
* re-injected on the first turn following `/compact` (which runs outside
|
|
472
|
+
* the agent loop and so has no other way to surface that compaction
|
|
473
|
+
* happened just before this turn).
|
|
474
|
+
*/
|
|
475
|
+
pendingPostCompactReinject: boolean;
|
|
456
476
|
/** Tracks consecutive compaction failures (summary LLM call threw). */
|
|
457
477
|
consecutiveCompactionFailures: number;
|
|
458
478
|
/** Timestamp (ms since epoch) until which the circuit breaker is open. */
|
|
@@ -679,7 +699,9 @@ export async function runAgentLoopImpl(
|
|
|
679
699
|
overrideProfile: turnOverrideProfile ?? undefined,
|
|
680
700
|
});
|
|
681
701
|
const turnContextWindowConfig = contextWindowConfigFromEffective(
|
|
682
|
-
config.llm
|
|
702
|
+
resolveCallSiteConfig(turnCallSite, config.llm, {
|
|
703
|
+
overrideProfile: turnOverrideProfile ?? undefined,
|
|
704
|
+
}).contextWindow,
|
|
683
705
|
effectiveContextWindow,
|
|
684
706
|
);
|
|
685
707
|
(
|
|
@@ -763,6 +785,18 @@ export async function runAgentLoopImpl(
|
|
|
763
785
|
|
|
764
786
|
ctx.profiler.startRequest();
|
|
765
787
|
let turnStarted = false;
|
|
788
|
+
const state = createEventHandlerState();
|
|
789
|
+
let persistedErrorAssistantMessage = false;
|
|
790
|
+
|
|
791
|
+
const publishLoopMessagesChanged = (): void => {
|
|
792
|
+
if (
|
|
793
|
+
state.lastAssistantMessageId ||
|
|
794
|
+
state.persistedToolUseIds.size > 0 ||
|
|
795
|
+
persistedErrorAssistantMessage
|
|
796
|
+
) {
|
|
797
|
+
publishConversationMessagesChanged(ctx.conversationId);
|
|
798
|
+
}
|
|
799
|
+
};
|
|
766
800
|
|
|
767
801
|
// Populate Sentry scope with conversation-specific tags so any exception
|
|
768
802
|
// captured during this turn (e.g. inside agent/loop.ts) can be
|
|
@@ -867,6 +901,13 @@ export async function runAgentLoopImpl(
|
|
|
867
901
|
conversationId: ctx.conversationId,
|
|
868
902
|
title,
|
|
869
903
|
});
|
|
904
|
+
onEvent({
|
|
905
|
+
type: "sync_changed",
|
|
906
|
+
tags: [
|
|
907
|
+
SYNC_TAGS.conversationsList,
|
|
908
|
+
conversationMetadataSyncTag(ctx.conversationId),
|
|
909
|
+
],
|
|
910
|
+
});
|
|
870
911
|
},
|
|
871
912
|
};
|
|
872
913
|
setTimeout(() => {
|
|
@@ -888,8 +929,14 @@ export async function runAgentLoopImpl(
|
|
|
888
929
|
}
|
|
889
930
|
|
|
890
931
|
const isFirstMessage = ctx.messages.length === 1;
|
|
891
|
-
|
|
892
|
-
|
|
932
|
+
// Promote a pending post-compaction re-inject signal (e.g. from `/compact`)
|
|
933
|
+
// into `compactedThisTurn` so NOW.md / PKB / v2 static blocks land on this
|
|
934
|
+
// turn even when no mid-turn compaction fires. Clear the flag immediately
|
|
935
|
+
// so this fires exactly once per `/compact` event.
|
|
936
|
+
const consumedPostCompactReinject = ctx.pendingPostCompactReinject;
|
|
937
|
+
ctx.pendingPostCompactReinject = false;
|
|
938
|
+
let shouldInjectWorkspace = isFirstMessage || consumedPostCompactReinject;
|
|
939
|
+
let compactedThisTurn = consumedPostCompactReinject;
|
|
893
940
|
let slackCompactedThisTurn = false;
|
|
894
941
|
const isSlackConversation = ctx.channelCapabilities?.channel === "slack";
|
|
895
942
|
let currentSlackContextSummary =
|
|
@@ -1097,8 +1144,6 @@ export async function runAgentLoopImpl(
|
|
|
1097
1144
|
}
|
|
1098
1145
|
}
|
|
1099
1146
|
|
|
1100
|
-
const state = createEventHandlerState();
|
|
1101
|
-
|
|
1102
1147
|
// Register confirmation outcome tracker so the agent loop can link
|
|
1103
1148
|
// confirmation decisions to tool_use_ids for persistence.
|
|
1104
1149
|
ctx.onConfirmationOutcome = (
|
|
@@ -1324,6 +1369,20 @@ export async function runAgentLoopImpl(
|
|
|
1324
1369
|
}
|
|
1325
1370
|
}
|
|
1326
1371
|
|
|
1372
|
+
// Query active documents for this conversation so the injector chain
|
|
1373
|
+
// can surface them to the assistant (prevents duplicate document_create
|
|
1374
|
+
// calls when existing documents should be targeted with document_update).
|
|
1375
|
+
const conversationDocs = getDocumentsForConversation(ctx.conversationId);
|
|
1376
|
+
const activeDocuments =
|
|
1377
|
+
conversationDocs.length > 0
|
|
1378
|
+
? conversationDocs.map((d) => ({
|
|
1379
|
+
surfaceId: d.surfaceId,
|
|
1380
|
+
title: d.title,
|
|
1381
|
+
wordCount: d.wordCount,
|
|
1382
|
+
updatedAt: d.updatedAt,
|
|
1383
|
+
}))
|
|
1384
|
+
: null;
|
|
1385
|
+
|
|
1327
1386
|
ctx.refreshWorkspaceTopLevelContextIfNeeded();
|
|
1328
1387
|
|
|
1329
1388
|
// Compute fresh turn timestamp for date grounding.
|
|
@@ -1411,33 +1470,48 @@ export async function runAgentLoopImpl(
|
|
|
1411
1470
|
|
|
1412
1471
|
// The `remember` tool handles scratchpad-style memory writes directly to the graph.
|
|
1413
1472
|
|
|
1473
|
+
// Personal-memory trust gate: PKB, NOW.md, and v2 static blocks all
|
|
1474
|
+
// hold private user content. Block exposure to non-guardian actors
|
|
1475
|
+
// arriving over a remote channel; internal/local flows pass through.
|
|
1476
|
+
// See `shouldExposePersonalMemory` for the threat model.
|
|
1477
|
+
const personalMemoryAllowed = shouldExposePersonalMemory({
|
|
1478
|
+
sourceChannel: ctx.trustContext?.sourceChannel,
|
|
1479
|
+
isTrustedActor,
|
|
1480
|
+
});
|
|
1481
|
+
|
|
1414
1482
|
// Inject NOW.md and PKB content only on the first turn (or after
|
|
1415
1483
|
// compaction re-strips them). Old injections persist in history and
|
|
1416
1484
|
// are never stripped on normal turns — this preserves the cached prefix.
|
|
1417
1485
|
// PKB/NOW content is sourced from the `memoryRetrieval` pipeline above
|
|
1418
1486
|
// so plugins can override either source without touching the agent loop.
|
|
1419
|
-
|
|
1487
|
+
// NOW.md injection can be disabled via `memory.retrieval.scratchpadInjection.enabled`.
|
|
1488
|
+
const scratchpadInjectionEnabled =
|
|
1489
|
+
getConfig().memory.retrieval.scratchpadInjection.enabled;
|
|
1490
|
+
const currentNowContent =
|
|
1491
|
+
personalMemoryAllowed && scratchpadInjectionEnabled
|
|
1492
|
+
? memoryResult.nowContent
|
|
1493
|
+
: null;
|
|
1420
1494
|
const shouldInjectNowAndPkb = isFirstMessage || compactedThisTurn;
|
|
1421
1495
|
const nowScratchpad = shouldInjectNowAndPkb ? currentNowContent : null;
|
|
1422
1496
|
|
|
1423
|
-
const currentPkbContent =
|
|
1497
|
+
const currentPkbContent = personalMemoryAllowed
|
|
1498
|
+
? memoryResult.pkbContent
|
|
1499
|
+
: null;
|
|
1424
1500
|
const pkbContext = shouldInjectNowAndPkb ? currentPkbContent : null;
|
|
1425
1501
|
const pkbActive = currentPkbContent !== null;
|
|
1426
1502
|
|
|
1427
|
-
// V2 static memory block (essentials/threads/recent/buffer).
|
|
1428
|
-
//
|
|
1429
|
-
//
|
|
1430
|
-
//
|
|
1431
|
-
//
|
|
1432
|
-
//
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
isTrustedActor,
|
|
1437
|
-
})
|
|
1503
|
+
// V2 static memory block (essentials/threads/recent/buffer).
|
|
1504
|
+
// `currentMemoryV2Static` is the trust-gated content reused by every
|
|
1505
|
+
// re-injection path — it stays non-null on non-full-mode turns so
|
|
1506
|
+
// that mid-turn reducer compaction (which strips the prior `<memory>`
|
|
1507
|
+
// block) can restore the freshest content. `memoryV2Static` is the
|
|
1508
|
+
// first-turn / post-compaction cadence-gated value for initial
|
|
1509
|
+
// injection only. `readMemoryV2StaticContent` self-gates on the v2
|
|
1510
|
+
// flag + config and returns null when v2 is off.
|
|
1511
|
+
const currentMemoryV2Static = personalMemoryAllowed
|
|
1438
1512
|
? readMemoryV2StaticContent()
|
|
1439
1513
|
: null;
|
|
1440
|
-
const memoryV2Static = currentMemoryV2Static;
|
|
1514
|
+
const memoryV2Static = shouldInjectNowAndPkb ? currentMemoryV2Static : null;
|
|
1441
1515
|
|
|
1442
1516
|
// PKB relevance-hint inputs. Resolved once per turn and reused across
|
|
1443
1517
|
// re-injections so post-compaction rebuilds pick up fresh hints against
|
|
@@ -1520,6 +1594,7 @@ export async function runAgentLoopImpl(
|
|
|
1520
1594
|
const injectionOpts = {
|
|
1521
1595
|
diskPressureContext,
|
|
1522
1596
|
activeSurface,
|
|
1597
|
+
activeDocuments,
|
|
1523
1598
|
workspaceTopLevelContext: shouldInjectWorkspace
|
|
1524
1599
|
? ctx.workspaceTopLevelContext
|
|
1525
1600
|
: null,
|
|
@@ -1575,7 +1650,8 @@ export async function runAgentLoopImpl(
|
|
|
1575
1650
|
injection.blocks.pkbSystemReminder ||
|
|
1576
1651
|
injection.blocks.workspaceBlock ||
|
|
1577
1652
|
injection.blocks.nowScratchpadBlock ||
|
|
1578
|
-
injection.blocks.pkbContextBlock
|
|
1653
|
+
injection.blocks.pkbContextBlock ||
|
|
1654
|
+
injection.blocks.memoryV2StaticBlock
|
|
1579
1655
|
) {
|
|
1580
1656
|
try {
|
|
1581
1657
|
const metadataUpdates: Record<string, unknown> = {};
|
|
@@ -1597,6 +1673,10 @@ export async function runAgentLoopImpl(
|
|
|
1597
1673
|
if (injection.blocks.pkbContextBlock) {
|
|
1598
1674
|
metadataUpdates.pkbContextBlock = injection.blocks.pkbContextBlock;
|
|
1599
1675
|
}
|
|
1676
|
+
if (injection.blocks.memoryV2StaticBlock) {
|
|
1677
|
+
metadataUpdates.memoryV2StaticBlock =
|
|
1678
|
+
injection.blocks.memoryV2StaticBlock;
|
|
1679
|
+
}
|
|
1600
1680
|
await runPipeline<PersistArgs, PersistResult>(
|
|
1601
1681
|
"persistence",
|
|
1602
1682
|
getMiddlewaresFor("persistence"),
|
|
@@ -1948,6 +2028,30 @@ export async function runAgentLoopImpl(
|
|
|
1948
2028
|
runMessages = webSearchStrip.messages;
|
|
1949
2029
|
}
|
|
1950
2030
|
|
|
2031
|
+
// user-prompt-submit hook: plugins may transform `runMessages` right
|
|
2032
|
+
// before the agent loop receives them. Fires once per user turn at
|
|
2033
|
+
// the primary `agentLoop.run` only — the re-entry / retry calls
|
|
2034
|
+
// further down in this function do not refire it (they're not new
|
|
2035
|
+
// user submissions). Plugins may mutate `ctx.latestMessages` in place
|
|
2036
|
+
// OR return a new context with a fresh array; `runHook` forwards
|
|
2037
|
+
// whichever the chain settles on. Order is plugin registration order.
|
|
2038
|
+
//
|
|
2039
|
+
// Fires BEFORE `preRunHistoryLength` is captured so the boundary
|
|
2040
|
+
// between pre-existing and hook-emitted messages — consumed by the
|
|
2041
|
+
// ordering-error retry gate, the post-run reconcile loop, and the
|
|
2042
|
+
// new-message extraction for persistence — reflects exactly what
|
|
2043
|
+
// `agentLoop.run` receives.
|
|
2044
|
+
const userPromptCtx: UserPromptSubmitContext = {
|
|
2045
|
+
conversationId: ctx.conversationId,
|
|
2046
|
+
originalMessages: ctx.messages,
|
|
2047
|
+
latestMessages: runMessages,
|
|
2048
|
+
};
|
|
2049
|
+
const finalUserPromptCtx = await runHook(
|
|
2050
|
+
HOOKS.USER_PROMPT_SUBMIT,
|
|
2051
|
+
userPromptCtx,
|
|
2052
|
+
);
|
|
2053
|
+
runMessages = finalUserPromptCtx.latestMessages;
|
|
2054
|
+
|
|
1951
2055
|
let preRunHistoryLength = runMessages.length;
|
|
1952
2056
|
|
|
1953
2057
|
const shouldGenerateTitle = isReplaceableTitle(
|
|
@@ -2240,6 +2344,83 @@ export async function runAgentLoopImpl(
|
|
|
2240
2344
|
}
|
|
2241
2345
|
}
|
|
2242
2346
|
|
|
2347
|
+
// ── Image-dimension overflow recovery ──────────────────────────
|
|
2348
|
+
// When the provider rejects because an image block exceeds its pixel
|
|
2349
|
+
// cap, strip every image block from ctx.messages and retry once.
|
|
2350
|
+
// optimizeImageForTransport already ran at upload time; if sips was
|
|
2351
|
+
// unavailable (non-macOS) it returns the same bytes unchanged. In
|
|
2352
|
+
// that case we swap the block for a text note so the model can tell
|
|
2353
|
+
// the user what happened instead of hard-failing with a red banner.
|
|
2354
|
+
if (state.imageTooLargeDetected) {
|
|
2355
|
+
state.imageTooLargeDetected = false;
|
|
2356
|
+
rlog.warn(
|
|
2357
|
+
{ phase: "image-recovery" },
|
|
2358
|
+
"Image too large — stripping oversized image blocks and retrying",
|
|
2359
|
+
);
|
|
2360
|
+
ctx.messages = ctx.messages.map((msg) => {
|
|
2361
|
+
if (!Array.isArray(msg.content)) return msg;
|
|
2362
|
+
if (!msg.content.some((b) => b.type === "image")) return msg;
|
|
2363
|
+
return {
|
|
2364
|
+
...msg,
|
|
2365
|
+
content: msg.content.flatMap((b): ContentBlock[] => {
|
|
2366
|
+
if (b.type !== "image") return [b];
|
|
2367
|
+
const resized = optimizeImageForTransport(
|
|
2368
|
+
b.source.data,
|
|
2369
|
+
b.source.media_type,
|
|
2370
|
+
);
|
|
2371
|
+
if (resized.data !== b.source.data) {
|
|
2372
|
+
// sips managed to downscale — use the smaller version
|
|
2373
|
+
return [
|
|
2374
|
+
{
|
|
2375
|
+
...b,
|
|
2376
|
+
source: {
|
|
2377
|
+
type: "base64" as const,
|
|
2378
|
+
media_type: resized.mediaType,
|
|
2379
|
+
data: resized.data,
|
|
2380
|
+
},
|
|
2381
|
+
},
|
|
2382
|
+
];
|
|
2383
|
+
}
|
|
2384
|
+
// Can't resize — replace with a text annotation so the model
|
|
2385
|
+
// can explain the situation rather than silently dropping context
|
|
2386
|
+
return [
|
|
2387
|
+
{
|
|
2388
|
+
type: "text" as const,
|
|
2389
|
+
text: "(An image was attached but could not be sent — its dimensions exceed the provider limit and automatic resize was not available. Please resize the image and try again.)",
|
|
2390
|
+
},
|
|
2391
|
+
];
|
|
2392
|
+
}),
|
|
2393
|
+
};
|
|
2394
|
+
});
|
|
2395
|
+
runMessages = ctx.messages;
|
|
2396
|
+
updatedHistory = await ctx.agentLoop.run(
|
|
2397
|
+
runMessages,
|
|
2398
|
+
eventHandler,
|
|
2399
|
+
abortController.signal,
|
|
2400
|
+
reqId,
|
|
2401
|
+
onCheckpoint,
|
|
2402
|
+
turnCallSite,
|
|
2403
|
+
loopTurnCtx,
|
|
2404
|
+
turnOverrideProfile,
|
|
2405
|
+
effectiveContextWindow.maxInputTokens,
|
|
2406
|
+
);
|
|
2407
|
+
if (state.imageTooLargeDetected) {
|
|
2408
|
+
rlog.error(
|
|
2409
|
+
{ phase: "image-recovery" },
|
|
2410
|
+
"Image-recovery retry also failed — surfacing error to user",
|
|
2411
|
+
);
|
|
2412
|
+
const classified = classifyConversationError(
|
|
2413
|
+
new Error("Image dimensions too large"),
|
|
2414
|
+
{ phase: "agent_loop" },
|
|
2415
|
+
);
|
|
2416
|
+
deps.onEvent(
|
|
2417
|
+
buildConversationErrorMessage(deps.ctx.conversationId, classified),
|
|
2418
|
+
);
|
|
2419
|
+
state.providerErrorUserMessage = classified.userMessage;
|
|
2420
|
+
state.imageTooLargeDetected = false;
|
|
2421
|
+
}
|
|
2422
|
+
}
|
|
2423
|
+
|
|
2243
2424
|
// ── Bounded context overflow convergence loop ──────────────────
|
|
2244
2425
|
// When the provider rejects with context-too-large, iterate through
|
|
2245
2426
|
// reducer tiers (forced compaction, tool-result truncation, media
|
|
@@ -2311,6 +2492,64 @@ export async function runAgentLoopImpl(
|
|
|
2311
2492
|
}
|
|
2312
2493
|
}
|
|
2313
2494
|
|
|
2495
|
+
// ── Emergency mid-turn compaction ────────────────────────────
|
|
2496
|
+
// Before entering the reducer tier loop, attempt a targeted
|
|
2497
|
+
// emergency compaction: summarize everything before the last
|
|
2498
|
+
// tool_use + tool_result pair and let the agent continue with
|
|
2499
|
+
// [summary, last_tool_call, last_tool_result]. This preserves
|
|
2500
|
+
// the agent's most recent action context while aggressively
|
|
2501
|
+
// compressing history. Falls through to reducer tiers on failure.
|
|
2502
|
+
{
|
|
2503
|
+
try {
|
|
2504
|
+
const emergencyConfig = getConfig().compaction;
|
|
2505
|
+
const emergencyResult = await runEmergencyCompaction({
|
|
2506
|
+
conversationId: ctx.conversationId,
|
|
2507
|
+
messages: ctx.messages,
|
|
2508
|
+
provider: ctx.provider,
|
|
2509
|
+
systemPrompt: ctx.systemPrompt,
|
|
2510
|
+
tools: undefined,
|
|
2511
|
+
compaction: emergencyConfig,
|
|
2512
|
+
maxInputTokens: effectiveContextWindow.maxInputTokens,
|
|
2513
|
+
previousEstimatedInputTokens: estimatedTokensAtOverflow,
|
|
2514
|
+
force: true,
|
|
2515
|
+
signal: abortController.signal,
|
|
2516
|
+
overrideProfile: turnOverrideProfile ?? null,
|
|
2517
|
+
nonPersistedPrefixCount:
|
|
2518
|
+
ctx.contextWindowManager.nonPersistedPrefixCount,
|
|
2519
|
+
});
|
|
2520
|
+
if (emergencyResult.compacted) {
|
|
2521
|
+
rlog.info(
|
|
2522
|
+
{
|
|
2523
|
+
phase: "convergence",
|
|
2524
|
+
compactedMessages: emergencyResult.compactedMessages,
|
|
2525
|
+
summaryChars: emergencyResult.summaryText.length,
|
|
2526
|
+
},
|
|
2527
|
+
"Emergency mid-turn compaction succeeded — bypassing reducer tiers",
|
|
2528
|
+
);
|
|
2529
|
+
if (emergencyResult.summaryFailed !== undefined) {
|
|
2530
|
+
await trackCompactionOutcome(
|
|
2531
|
+
ctx,
|
|
2532
|
+
emergencyResult.summaryFailed,
|
|
2533
|
+
onEvent,
|
|
2534
|
+
);
|
|
2535
|
+
}
|
|
2536
|
+
if (emergencyResult.compacted) {
|
|
2537
|
+
await applySuccessfulCompaction(emergencyResult, ctx.messages);
|
|
2538
|
+
shouldInjectWorkspace = true;
|
|
2539
|
+
}
|
|
2540
|
+
// Clear the overflow flag and re-run the agent loop with
|
|
2541
|
+
// the compacted context.
|
|
2542
|
+
state.contextTooLargeDetected = false;
|
|
2543
|
+
}
|
|
2544
|
+
} catch (err) {
|
|
2545
|
+
rlog.warn(
|
|
2546
|
+
{ phase: "convergence", err },
|
|
2547
|
+
"Emergency mid-turn compaction failed; continuing to reducer tiers",
|
|
2548
|
+
);
|
|
2549
|
+
}
|
|
2550
|
+
// If emergency compaction failed, fall through to reducer tiers.
|
|
2551
|
+
}
|
|
2552
|
+
|
|
2314
2553
|
let convergenceAttempts = 0;
|
|
2315
2554
|
const maxAttempts = overflowRecovery.maxAttempts;
|
|
2316
2555
|
|
|
@@ -2717,6 +2956,7 @@ export async function runAgentLoopImpl(
|
|
|
2717
2956
|
buildPluginTurnContext(ctx, reqId),
|
|
2718
2957
|
DEFAULT_TIMEOUTS.persistence,
|
|
2719
2958
|
);
|
|
2959
|
+
persistedErrorAssistantMessage = true;
|
|
2720
2960
|
newMessages.push(errorAssistantMessage);
|
|
2721
2961
|
// Do NOT send assistant_text_delta here — handleProviderError already
|
|
2722
2962
|
// emitted a conversation_error event for this same error text, and the
|
|
@@ -2792,7 +3032,6 @@ export async function runAgentLoopImpl(
|
|
|
2792
3032
|
convForDisk.createdAt,
|
|
2793
3033
|
);
|
|
2794
3034
|
};
|
|
2795
|
-
|
|
2796
3035
|
// Fast-path: when the user cancelled, skip expensive post-loop work
|
|
2797
3036
|
// (attachment resolution) and emit the cancellation event immediately
|
|
2798
3037
|
// so the client can re-enable the UI without delay.
|
|
@@ -2811,6 +3050,7 @@ export async function runAgentLoopImpl(
|
|
|
2811
3050
|
type: "generation_cancelled",
|
|
2812
3051
|
conversationId: ctx.conversationId,
|
|
2813
3052
|
});
|
|
3053
|
+
publishLoopMessagesChanged();
|
|
2814
3054
|
} else {
|
|
2815
3055
|
// Resolve attachments (only when not cancelled — this is expensive async I/O)
|
|
2816
3056
|
const attachmentResult = await resolveAssistantAttachments(
|
|
@@ -2834,6 +3074,7 @@ export async function runAgentLoopImpl(
|
|
|
2834
3074
|
ctx.lastAssistantAttachments = assistantAttachments;
|
|
2835
3075
|
ctx.lastAttachmentWarnings = attachmentResult.directiveWarnings;
|
|
2836
3076
|
syncLastAssistantMessageToDisk();
|
|
3077
|
+
const clientDisplayMessageId = getClientDisplayMessageId(state);
|
|
2837
3078
|
|
|
2838
3079
|
// Re-check: the user may have cancelled during attachment resolution
|
|
2839
3080
|
if (abortController.signal.aborted) {
|
|
@@ -2850,6 +3091,7 @@ export async function runAgentLoopImpl(
|
|
|
2850
3091
|
type: "generation_cancelled",
|
|
2851
3092
|
conversationId: ctx.conversationId,
|
|
2852
3093
|
});
|
|
3094
|
+
publishLoopMessagesChanged();
|
|
2853
3095
|
} else if (yieldedForHandoff) {
|
|
2854
3096
|
ctx.traceEmitter.emit(
|
|
2855
3097
|
"generation_handoff",
|
|
@@ -2874,7 +3116,11 @@ export async function runAgentLoopImpl(
|
|
|
2874
3116
|
...(state.lastAssistantMessageId
|
|
2875
3117
|
? { messageId: state.lastAssistantMessageId }
|
|
2876
3118
|
: {}),
|
|
3119
|
+
...(clientDisplayMessageId
|
|
3120
|
+
? { displayMessageId: clientDisplayMessageId }
|
|
3121
|
+
: {}),
|
|
2877
3122
|
});
|
|
3123
|
+
publishLoopMessagesChanged();
|
|
2878
3124
|
} else {
|
|
2879
3125
|
ctx.emitActivityState("idle", "message_complete", "global", reqId);
|
|
2880
3126
|
ctx.traceEmitter.emit(
|
|
@@ -2897,85 +3143,11 @@ export async function runAgentLoopImpl(
|
|
|
2897
3143
|
...(state.lastAssistantMessageId
|
|
2898
3144
|
? { messageId: state.lastAssistantMessageId }
|
|
2899
3145
|
: {}),
|
|
3146
|
+
...(clientDisplayMessageId
|
|
3147
|
+
? { displayMessageId: clientDisplayMessageId }
|
|
3148
|
+
: {}),
|
|
2900
3149
|
});
|
|
2901
|
-
|
|
2902
|
-
// Emit a home-feed event for background/scheduled conversation completions.
|
|
2903
|
-
// Scoped to message_complete only (not cancelled/handoff), wrapped in
|
|
2904
|
-
// try-catch so malformed message content can never propagate errors.
|
|
2905
|
-
try {
|
|
2906
|
-
const conv = getConversation(ctx.conversationId);
|
|
2907
|
-
if (
|
|
2908
|
-
conv &&
|
|
2909
|
-
(conv.conversationType === "background" ||
|
|
2910
|
-
conv.conversationType === "scheduled")
|
|
2911
|
-
) {
|
|
2912
|
-
const lastMsg = state.lastAssistantMessageId
|
|
2913
|
-
? getMessageById(state.lastAssistantMessageId, ctx.conversationId)
|
|
2914
|
-
: undefined;
|
|
2915
|
-
let summary: string;
|
|
2916
|
-
if (lastMsg) {
|
|
2917
|
-
const parsed: unknown = JSON.parse(lastMsg.content);
|
|
2918
|
-
if (typeof parsed === "string") {
|
|
2919
|
-
summary = parsed.slice(0, 200);
|
|
2920
|
-
} else if (Array.isArray(parsed)) {
|
|
2921
|
-
const textBlock = parsed.find(
|
|
2922
|
-
(b: { type?: string }) => b.type === "text",
|
|
2923
|
-
);
|
|
2924
|
-
summary =
|
|
2925
|
-
typeof textBlock?.text === "string"
|
|
2926
|
-
? textBlock.text.slice(0, 200)
|
|
2927
|
-
: (conv.title ?? "Background task completed.");
|
|
2928
|
-
} else {
|
|
2929
|
-
summary = conv.title ?? "Background task completed.";
|
|
2930
|
-
}
|
|
2931
|
-
} else {
|
|
2932
|
-
summary = conv.title ?? "Background task completed.";
|
|
2933
|
-
}
|
|
2934
|
-
const feedTitle =
|
|
2935
|
-
conv.title && !isReplaceableTitle(conv.title)
|
|
2936
|
-
? conv.title
|
|
2937
|
-
: "Background task";
|
|
2938
|
-
const dedupKey = `bg-conv:${ctx.conversationId}`;
|
|
2939
|
-
void emitFeedEvent({
|
|
2940
|
-
source: "assistant",
|
|
2941
|
-
title: feedTitle,
|
|
2942
|
-
summary,
|
|
2943
|
-
dedupKey,
|
|
2944
|
-
conversationId: ctx.conversationId,
|
|
2945
|
-
}).catch((err) => {
|
|
2946
|
-
log.warn(
|
|
2947
|
-
{ err, conversationId: ctx.conversationId },
|
|
2948
|
-
"Failed to emit background conversation feed event",
|
|
2949
|
-
);
|
|
2950
|
-
});
|
|
2951
|
-
|
|
2952
|
-
if (isReplaceableTitle(conv.title ?? null)) {
|
|
2953
|
-
void rewriteFeedTitle(feedTitle)
|
|
2954
|
-
.then((prose) => {
|
|
2955
|
-
if (prose && prose !== feedTitle) {
|
|
2956
|
-
return emitFeedEvent({
|
|
2957
|
-
source: "assistant",
|
|
2958
|
-
title: prose,
|
|
2959
|
-
summary,
|
|
2960
|
-
dedupKey,
|
|
2961
|
-
conversationId: ctx.conversationId,
|
|
2962
|
-
});
|
|
2963
|
-
}
|
|
2964
|
-
})
|
|
2965
|
-
.catch((err) => {
|
|
2966
|
-
log.warn(
|
|
2967
|
-
{ err, conversationId: ctx.conversationId },
|
|
2968
|
-
"Failed to update feed event with prose title rewrite",
|
|
2969
|
-
);
|
|
2970
|
-
});
|
|
2971
|
-
}
|
|
2972
|
-
}
|
|
2973
|
-
} catch (feedErr) {
|
|
2974
|
-
log.warn(
|
|
2975
|
-
{ err: feedErr, conversationId: ctx.conversationId },
|
|
2976
|
-
"Failed to build home-feed event for background conversation",
|
|
2977
|
-
);
|
|
2978
|
-
}
|
|
3150
|
+
publishLoopMessagesChanged();
|
|
2979
3151
|
|
|
2980
3152
|
// Proactive artifact: fire once when the processed turn was the 4th user message.
|
|
2981
3153
|
// Only trigger for real user-authored turns (not subagent/system messages).
|
|
@@ -3030,6 +3202,13 @@ export async function runAgentLoopImpl(
|
|
|
3030
3202
|
conversationId: ctx.conversationId,
|
|
3031
3203
|
title,
|
|
3032
3204
|
});
|
|
3205
|
+
onEvent({
|
|
3206
|
+
type: "sync_changed",
|
|
3207
|
+
tags: [
|
|
3208
|
+
SYNC_TAGS.conversationsList,
|
|
3209
|
+
conversationMetadataSyncTag(ctx.conversationId),
|
|
3210
|
+
],
|
|
3211
|
+
});
|
|
3033
3212
|
},
|
|
3034
3213
|
signal: abortController.signal,
|
|
3035
3214
|
});
|
|
@@ -3054,6 +3233,7 @@ export async function runAgentLoopImpl(
|
|
|
3054
3233
|
type: "generation_cancelled",
|
|
3055
3234
|
conversationId: ctx.conversationId,
|
|
3056
3235
|
});
|
|
3236
|
+
publishLoopMessagesChanged();
|
|
3057
3237
|
} else {
|
|
3058
3238
|
ctx.emitActivityState("idle", "error_terminal", "global", reqId);
|
|
3059
3239
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -3078,6 +3258,7 @@ export async function runAgentLoopImpl(
|
|
|
3078
3258
|
errorCategory: classified.errorCategory,
|
|
3079
3259
|
});
|
|
3080
3260
|
onEvent(buildConversationErrorMessage(ctx.conversationId, classified));
|
|
3261
|
+
publishLoopMessagesChanged();
|
|
3081
3262
|
}
|
|
3082
3263
|
} finally {
|
|
3083
3264
|
if (turnStarted) {
|
|
@@ -3208,6 +3389,7 @@ export interface CompactionApplyContext {
|
|
|
3208
3389
|
messages: Message[];
|
|
3209
3390
|
contextCompactedMessageCount: number;
|
|
3210
3391
|
contextCompactedAt: number | null;
|
|
3392
|
+
pendingPostCompactReinject: boolean;
|
|
3211
3393
|
readonly graphMemory: ConversationGraphMemory;
|
|
3212
3394
|
readonly provider: Provider;
|
|
3213
3395
|
usageStats: UsageStats;
|
|
@@ -3257,6 +3439,10 @@ export async function applyCompactionResult(
|
|
|
3257
3439
|
ctx.contextCompactedMessageCount += result.compactedPersistedMessages;
|
|
3258
3440
|
const compactedAt = Date.now();
|
|
3259
3441
|
ctx.contextCompactedAt = compactedAt;
|
|
3442
|
+
// Signal to the next agent loop turn that NOW.md / PKB / v2 static blocks
|
|
3443
|
+
// were stripped from the tail and need fresh re-injection. Consumed and
|
|
3444
|
+
// cleared at the top of the next `runAgentLoopImpl` run.
|
|
3445
|
+
ctx.pendingPostCompactReinject = true;
|
|
3260
3446
|
await ctx.graphMemory.onCompacted(result.compactedPersistedMessages);
|
|
3261
3447
|
updateConversationContextWindow(
|
|
3262
3448
|
ctx.conversationId,
|
|
@@ -3274,6 +3460,10 @@ export async function applyCompactionResult(
|
|
|
3274
3460
|
ctx.conversationId,
|
|
3275
3461
|
ctx.trustContext?.trustClass,
|
|
3276
3462
|
);
|
|
3463
|
+
enqueueMemoryRetrospectiveOnCompaction(
|
|
3464
|
+
ctx.conversationId,
|
|
3465
|
+
ctx.trustContext?.trustClass,
|
|
3466
|
+
);
|
|
3277
3467
|
const summarySignals = computeSummaryQualitySignals(result.summaryText);
|
|
3278
3468
|
onEvent({
|
|
3279
3469
|
type: "context_compacted",
|