@vellumai/assistant 0.7.1 → 0.7.3
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/ARCHITECTURE.md +48 -50
- package/Dockerfile +1 -0
- package/README.md +1 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
- package/bun.lock +26 -26
- package/docs/architecture/memory.md +5 -2
- package/docs/architecture/security.md +20 -0
- package/docs/plugins.md +7 -9
- package/knip.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
- package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +1020 -40
- package/package.json +6 -3
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +384 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-routes-http.test.ts +23 -6
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +157 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
- package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
- package/src/__tests__/background-shell-host-bash.test.ts +14 -15
- package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +49 -1
- package/src/__tests__/call-conversation-messages.test.ts +8 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
- package/src/__tests__/channel-readiness-service.test.ts +62 -2
- package/src/__tests__/checker.test.ts +3 -4
- package/src/__tests__/config-loader-backfill.test.ts +461 -147
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
- package/src/__tests__/config-watcher.test.ts +142 -71
- package/src/__tests__/context-search-agent-runner.test.ts +61 -3
- package/src/__tests__/context-search-conversations-source.test.ts +0 -24
- package/src/__tests__/context-search-fanout.test.ts +0 -1
- package/src/__tests__/context-search-memory-source.test.ts +3 -7
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +0 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
- package/src/__tests__/conversation-agent-loop.test.ts +454 -5
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-error.test.ts +150 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +36 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +43 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
- package/src/__tests__/conversation-slash-commands.test.ts +0 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-store.test.ts +0 -18
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credentials-cli.test.ts +12 -12
- package/src/__tests__/cu-unified-flow.test.ts +351 -23
- package/src/__tests__/daemon-credential-client.test.ts +101 -19
- package/src/__tests__/date-context.test.ts +164 -2
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/disk-pressure-guard.test.ts +262 -0
- package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
- package/src/__tests__/disk-pressure-policy.test.ts +241 -0
- package/src/__tests__/disk-pressure-routes.test.ts +379 -0
- package/src/__tests__/disk-pressure-tools.test.ts +277 -0
- package/src/__tests__/disk-usage.test.ts +150 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/events-client-registration.test.ts +52 -0
- package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
- package/src/__tests__/file-write-tool.test.ts +4 -10
- package/src/__tests__/filing-service.test.ts +3 -4
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
- package/src/__tests__/heartbeat-service.test.ts +968 -2
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/host-app-control-proxy.test.ts +772 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +439 -47
- package/src/__tests__/host-bash-routes.test.ts +459 -0
- package/src/__tests__/host-browser-proxy.test.ts +24 -22
- package/src/__tests__/host-browser-routes.test.ts +39 -13
- package/src/__tests__/host-cu-proxy.test.ts +248 -52
- package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
- package/src/__tests__/host-file-proxy.test.ts +301 -45
- package/src/__tests__/host-file-read-tool.test.ts +17 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +22 -4
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
- package/src/__tests__/host-transfer-proxy.test.ts +121 -22
- package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
- package/src/__tests__/http-user-message-parity.test.ts +108 -1
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +18 -6
- package/src/__tests__/injector-disk-pressure.test.ts +224 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -1
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/managed-profile-guard.test.ts +18 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
- package/src/__tests__/mcp-abort-signal.test.ts +130 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-admin-recall.test.ts +3 -11
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
- package/src/__tests__/migration-import-commit-http.test.ts +108 -2
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/normalize-onboarding.test.ts +180 -0
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-connect-routes.test.ts +316 -0
- package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/onboarding-persona-write.test.ts +308 -0
- package/src/__tests__/openai-provider.test.ts +45 -8
- package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
- package/src/__tests__/platform-callback-registration.test.ts +21 -4
- package/src/__tests__/platform.test.ts +2 -1
- package/src/__tests__/playbook-execution.test.ts +0 -43
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-tool-name.test.ts +23 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/relay-server.test.ts +15 -4
- package/src/__tests__/require-fresh-approval.test.ts +0 -1
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-events-sse.test.ts +2 -2
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/suggestion-routes.test.ts +46 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
- package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
- package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/approvals/guardian-decision-primitive.ts +13 -0
- package/src/approvals/guardian-request-resolvers.ts +16 -17
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +51 -151
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +107 -231
- package/src/backup/snapshot-lock.ts +2 -27
- package/src/bundler/app-bundler.ts +51 -3
- package/src/bundler/compiler-tools.ts +3 -2
- package/src/calls/call-conversation-messages.ts +46 -10
- package/src/calls/relay-server.ts +4 -44
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +33 -105
- package/src/calls/twilio-routes.ts +11 -12
- package/src/channels/types.ts +8 -7
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/bash.ts +35 -108
- package/src/cli/commands/clients.ts +36 -37
- package/src/cli/commands/contacts.ts +137 -25
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +71 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +9 -6
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +303 -7
- package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
- package/src/cli/commands/oauth/connect.ts +127 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
- package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +16 -25
- package/src/cli/commands/status.ts +57 -0
- package/src/cli/lib/daemon-credential-client.ts +110 -28
- package/src/cli/program.ts +6 -2
- package/src/config/assistant-feature-flags.ts +79 -12
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +0 -2
- package/src/config/env.ts +19 -20
- package/src/config/feature-flag-registry.json +47 -135
- package/src/config/loader.ts +197 -104
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/calls.ts +0 -9
- package/src/config/schemas/channels.ts +0 -5
- package/src/config/schemas/heartbeat.ts +64 -1
- package/src/config/schemas/ingress.ts +10 -6
- package/src/config/schemas/llm.ts +7 -10
- package/src/config/schemas/memory-lifecycle.ts +90 -24
- package/src/config/schemas/memory-v2.ts +121 -13
- package/src/config/schemas/platform.ts +49 -3
- package/src/config/schemas/services.ts +29 -15
- package/src/config/schemas/skills.ts +0 -6
- package/src/config/seed-inference-profiles.ts +230 -33
- package/src/contacts/contact-store.ts +0 -55
- package/src/contacts/contacts-write.ts +0 -27
- package/src/context/window-manager.ts +1 -2
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +12 -41
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
- package/src/daemon/assistant-attachments.ts +4 -4
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +89 -60
- package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
- package/src/daemon/conversation-agent-loop.ts +202 -61
- package/src/daemon/conversation-error.ts +87 -15
- package/src/daemon/conversation-lifecycle.ts +9 -4
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-runtime-assembly.ts +28 -2
- package/src/daemon/conversation-store.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +305 -4
- package/src/daemon/conversation-tool-setup.ts +66 -62
- package/src/daemon/conversation.ts +38 -24
- package/src/daemon/date-context.ts +71 -22
- package/src/daemon/disk-pressure-background-gate.ts +73 -0
- package/src/daemon/disk-pressure-guard.ts +343 -0
- package/src/daemon/disk-pressure-policy.ts +163 -0
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/shared.ts +4 -2
- package/src/daemon/handlers/skills.ts +3 -4
- package/src/daemon/host-app-control-proxy.ts +389 -0
- package/src/daemon/host-bash-proxy.ts +117 -82
- package/src/daemon/host-browser-proxy.ts +67 -82
- package/src/daemon/host-cu-proxy.ts +127 -86
- package/src/daemon/host-file-proxy.ts +129 -69
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +338 -129
- package/src/daemon/lifecycle.ts +194 -145
- package/src/daemon/meet-host-supervisor.ts +4 -4
- package/src/daemon/meet-manifest-loader.ts +0 -1
- package/src/daemon/memory-v2-startup.ts +14 -4
- package/src/daemon/message-protocol.ts +6 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +15 -8
- package/src/daemon/message-types/disk-pressure.ts +9 -0
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +4 -0
- package/src/daemon/message-types/host-cu.ts +2 -0
- package/src/daemon/message-types/host-file.ts +4 -0
- package/src/daemon/message-types/host-transfer.ts +3 -0
- package/src/daemon/message-types/messages.ts +3 -0
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/process-message.ts +18 -1
- package/src/daemon/profiler-run-store.ts +5 -5
- package/src/daemon/shutdown-handlers.ts +0 -3
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/documents/document-store.ts +85 -0
- package/src/events/tool-audit-listener.ts +2 -1
- package/src/filing/filing-service.ts +30 -5
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
- package/src/heartbeat/heartbeat-run-store.ts +249 -0
- package/src/heartbeat/heartbeat-service.ts +459 -54
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-scheduler.ts +18 -0
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +17 -92
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/platform-callback-registration.ts +8 -15
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/assistant-server.ts +70 -3
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/gateway-client.ts +37 -3
- package/src/live-voice/live-voice-archive.ts +4 -4
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +5 -7
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/media/image-service.ts +1 -7
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/admin.ts +5 -9
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +51 -9
- package/src/memory/context-search/sources/conversations.ts +2 -11
- package/src/memory/context-search/sources/memory-v2.ts +22 -9
- package/src/memory/context-search/sources/memory.ts +0 -1
- package/src/memory/context-search/types.ts +0 -1
- package/src/memory/conversation-crud.ts +5 -13
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +9 -21
- package/src/memory/embedding-runtime-manager.ts +119 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
- package/src/memory/graph/conversation-graph-memory.ts +43 -78
- package/src/memory/graph/extraction.ts +1 -3
- package/src/memory/graph/graph-search.test.ts +10 -67
- package/src/memory/graph/graph-search.ts +9 -20
- package/src/memory/graph/retriever.test.ts +6 -0
- package/src/memory/graph/retriever.ts +34 -10
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/indexer.ts +54 -45
- package/src/memory/job-handlers/backfill.ts +2 -11
- package/src/memory/job-handlers/cleanup.ts +43 -0
- package/src/memory/job-handlers/embedding.ts +6 -8
- package/src/memory/job-handlers/summarization.ts +2 -7
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +114 -22
- package/src/memory/jobs-worker.ts +193 -106
- package/src/memory/memory-v2-activation-log-store.ts +33 -15
- package/src/memory/memory-v2-concept-frequency.ts +169 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +49 -32
- package/src/memory/rerank-local.ts +374 -0
- package/src/memory/schema/infrastructure.ts +15 -0
- package/src/memory/search/semantic.ts +13 -67
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/trace-event-store.ts +1 -17
- package/src/memory/v2/__tests__/activation.test.ts +387 -344
- package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
- package/src/memory/v2/__tests__/injection.test.ts +181 -169
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
- package/src/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/memory/v2/__tests__/sim.test.ts +154 -188
- package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +76 -2
- package/src/memory/v2/activation.ts +213 -239
- package/src/memory/v2/consolidation-job.ts +65 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/injection.ts +123 -103
- package/src/memory/v2/prompts/consolidation.ts +348 -92
- package/src/memory/v2/qdrant.ts +198 -1
- package/src/memory/v2/reranker.ts +177 -0
- package/src/memory/v2/sim.ts +113 -77
- package/src/memory/v2/skill-content.ts +4 -3
- package/src/memory/v2/skill-store.ts +91 -53
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +28 -5
- package/src/memory/v2/types.ts +10 -10
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/slack/adapter.ts +1 -31
- package/src/messaging/providers/slack/types.ts +0 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/copy-composer.ts +13 -0
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/notifications/signal.ts +4 -0
- package/src/oauth/AGENTS.md +3 -1
- package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
- package/src/oauth/connect-orchestrator.ts +6 -0
- package/src/oauth/connection-resolver.test.ts +66 -1
- package/src/oauth/connection-resolver.ts +55 -1
- package/src/oauth/credential-token-resolver.ts +1 -3
- package/src/oauth/manual-token-connection.ts +0 -4
- package/src/oauth/oauth-connect-state.ts +77 -0
- package/src/oauth/seed-providers.ts +58 -1
- package/src/outbound-proxy/index.ts +1 -37
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +3 -17
- package/src/permissions/gateway-threshold-reader.ts +2 -0
- package/src/permissions/prompter.ts +34 -1
- package/src/permissions/secret-prompter.ts +6 -2
- package/src/plugins/defaults/injectors.ts +35 -2
- package/src/plugins/defaults/memory-retrieval.ts +5 -6
- package/src/plugins/types.ts +7 -0
- package/src/proactive-artifact/aux-message-injector.ts +74 -0
- package/src/proactive-artifact/decision.test.ts +226 -0
- package/src/proactive-artifact/decision.ts +165 -0
- package/src/proactive-artifact/index.ts +7 -0
- package/src/proactive-artifact/job.test.ts +867 -0
- package/src/proactive-artifact/job.ts +352 -0
- package/src/proactive-artifact/message-copy.ts +41 -0
- package/src/proactive-artifact/trigger-state.test.ts +277 -0
- package/src/proactive-artifact/trigger-state.ts +119 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/normalize-onboarding.ts +80 -0
- package/src/prompts/persona-resolver.ts +101 -9
- package/src/prompts/system-prompt.ts +23 -24
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/providers/__tests__/retry-callsite.test.ts +222 -1
- package/src/providers/model-intents.ts +7 -0
- package/src/providers/openrouter/client.ts +8 -0
- package/src/providers/retry.ts +50 -0
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +1 -0
- package/src/runtime/__tests__/agent-wake.test.ts +456 -3
- package/src/runtime/agent-wake.ts +238 -100
- package/src/runtime/assistant-event-hub.ts +151 -99
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
- package/src/runtime/auth/middleware.ts +0 -96
- package/src/runtime/auth/route-policy.ts +32 -0
- package/src/runtime/auth/same-actor.ts +216 -0
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-retry-sweep.ts +65 -1
- package/src/runtime/guardian-reply-router.ts +10 -0
- package/src/runtime/http-server.ts +3 -329
- package/src/runtime/http-types.ts +0 -5
- package/src/runtime/local-actor-identity.ts +52 -11
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
- package/src/runtime/migrations/migration-transport.ts +7 -7
- package/src/runtime/migrations/vbundle-builder.ts +327 -60
- package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +245 -68
- package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
- package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +114 -0
- package/src/runtime/pending-interactions.ts +43 -9
- package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
- package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/client-routes.ts +21 -2
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/contact-routes.ts +0 -25
- package/src/runtime/routes/conversation-query-routes.ts +36 -1
- package/src/runtime/routes/conversation-routes.ts +65 -39
- package/src/runtime/routes/debug-bash-routes.ts +163 -0
- package/src/runtime/routes/disk-pressure-routes.ts +121 -0
- package/src/runtime/routes/document-pdf-renderer.ts +169 -0
- package/src/runtime/routes/documents-routes.ts +32 -75
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +38 -0
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +56 -6
- package/src/runtime/routes/host-browser-routes.ts +108 -13
- package/src/runtime/routes/host-cu-routes.ts +66 -9
- package/src/runtime/routes/host-file-routes.ts +54 -5
- package/src/runtime/routes/host-transfer-routes.ts +122 -19
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +21 -180
- package/src/runtime/routes/inbound-message-handler.ts +78 -21
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +14 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.test.ts +41 -15
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +474 -1
- package/src/runtime/routes/migration-routes.ts +96 -0
- package/src/runtime/routes/oauth-connect-routes.ts +153 -0
- package/src/runtime/routes/schedule-routes.ts +7 -0
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/run-script.ts +37 -5
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -2
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +83 -39
- package/src/security/encrypted-store.ts +2 -0
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secure-keys.ts +55 -0
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/remote-skill-policy.ts +10 -16
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/index.ts +1 -7
- package/src/subagent/manager.ts +1 -15
- package/src/tasks/task-runner.ts +0 -1
- package/src/tasks/task-store.ts +0 -3
- package/src/telemetry/types.ts +2 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/background-tool-registry.ts +17 -3
- package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +23 -24
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +2 -0
- package/src/tools/host-filesystem/edit.test.ts +151 -0
- package/src/tools/host-filesystem/edit.ts +68 -0
- package/src/tools/host-filesystem/read.test.ts +129 -0
- package/src/tools/host-filesystem/read.ts +68 -0
- package/src/tools/host-filesystem/transfer.test.ts +127 -2
- package/src/tools/host-filesystem/transfer.ts +78 -3
- package/src/tools/host-filesystem/write.test.ts +134 -0
- package/src/tools/host-filesystem/write.ts +68 -0
- package/src/tools/host-terminal/host-shell.ts +66 -1
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/memory/register.test.ts +12 -9
- package/src/tools/memory/register.ts +1 -2
- package/src/tools/provider-tool-name.ts +28 -0
- package/src/tools/registry.ts +30 -9
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/terminal/shell.ts +9 -1
- package/src/tools/tool-approval-handler.ts +32 -11
- package/src/tools/types.ts +28 -2
- package/src/tts/provider-catalog.ts +3 -5
- package/src/usage/pricing.ts +1 -1
- package/src/util/disk-usage.ts +138 -0
- package/src/util/platform.ts +21 -11
- package/src/util/process-liveness.ts +26 -0
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/heartbeat-service.ts +19 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
- package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
- package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -782
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -472
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
- package/src/memory/v2/skill-qdrant.ts +0 -395
- package/src/outbound-proxy/config.ts +0 -20
- package/src/outbound-proxy/health.ts +0 -18
- package/src/outbound-proxy/types.ts +0 -150
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/signals/bash.ts +0 -198
- package/src/signals/mcp-reload.ts +0 -18
|
@@ -43,6 +43,7 @@ import type {
|
|
|
43
43
|
} from "../plugins/types.js";
|
|
44
44
|
import type { ContentBlock, ImageContent } from "../providers/types.js";
|
|
45
45
|
import { isContextOverflowError } from "../providers/types.js";
|
|
46
|
+
import { redactSecrets } from "../security/secret-scanner.js";
|
|
46
47
|
import { ProviderError } from "../util/errors.js";
|
|
47
48
|
import { getLogger } from "../util/logger.js";
|
|
48
49
|
import type { DirectiveRequest } from "./assistant-attachments.js";
|
|
@@ -136,6 +137,8 @@ export interface EventHandlerState {
|
|
|
136
137
|
readonly directiveWarnings: string[];
|
|
137
138
|
readonly toolUseIdToName: Map<string, string>;
|
|
138
139
|
currentTurnToolNames: string[];
|
|
140
|
+
/** Sticky for the whole run: this turn created/refreshed an app. */
|
|
141
|
+
appBuildToolUsedThisRun: boolean;
|
|
139
142
|
/** Tracks whether the first text delta has been emitted this turn for activity state transitions. */
|
|
140
143
|
firstTextDeltaEmitted: boolean;
|
|
141
144
|
/** Tracks whether a thinking delta has been emitted this turn for activity state transitions. */
|
|
@@ -218,6 +221,7 @@ export function createEventHandlerState(): EventHandlerState {
|
|
|
218
221
|
directiveWarnings: [],
|
|
219
222
|
toolUseIdToName: new Map(),
|
|
220
223
|
currentTurnToolNames: [],
|
|
224
|
+
appBuildToolUsedThisRun: false,
|
|
221
225
|
firstTextDeltaEmitted: false,
|
|
222
226
|
firstThinkingDeltaEmitted: false,
|
|
223
227
|
lastCompletedToolName: undefined,
|
|
@@ -364,6 +368,9 @@ export function handleToolUse(
|
|
|
364
368
|
): void {
|
|
365
369
|
state.toolUseIdToName.set(event.id, event.name);
|
|
366
370
|
state.currentTurnToolNames.push(event.name);
|
|
371
|
+
if (event.name === "app_create" || event.name === "app_refresh") {
|
|
372
|
+
state.appBuildToolUsedThisRun = true;
|
|
373
|
+
}
|
|
367
374
|
state.toolCallTimestamps.set(event.id, { startedAt: Date.now() });
|
|
368
375
|
state.currentToolUseId = event.id;
|
|
369
376
|
state.currentTurnToolUseIds.push(event.id);
|
|
@@ -804,10 +811,16 @@ export async function handleMessageComplete(
|
|
|
804
811
|
([toolUseId, result]) => ({
|
|
805
812
|
type: "tool_result",
|
|
806
813
|
tool_use_id: toolUseId,
|
|
807
|
-
content: result.content,
|
|
814
|
+
content: redactSecrets(result.content),
|
|
808
815
|
is_error: result.isError,
|
|
809
816
|
...(result.contentBlocks
|
|
810
|
-
? {
|
|
817
|
+
? {
|
|
818
|
+
contentBlocks: result.contentBlocks.map((block) =>
|
|
819
|
+
block.type === "text"
|
|
820
|
+
? { ...block, text: redactSecrets(block.text) }
|
|
821
|
+
: block,
|
|
822
|
+
),
|
|
823
|
+
}
|
|
811
824
|
: {}),
|
|
812
825
|
}),
|
|
813
826
|
);
|
|
@@ -929,6 +942,17 @@ export async function handleMessageComplete(
|
|
|
929
942
|
);
|
|
930
943
|
}
|
|
931
944
|
}
|
|
945
|
+
// Redact known-pattern secrets from assistant text blocks before they are
|
|
946
|
+
// written to durable storage. Non-text blocks (images, UI surfaces) pass
|
|
947
|
+
// through unchanged. The live model history retains the original values.
|
|
948
|
+
const contentForPersistence = contentWithSurfaces.map((block) => {
|
|
949
|
+
if (block.type === "text") {
|
|
950
|
+
const tb = block as Extract<ContentBlock, { type: "text" }>;
|
|
951
|
+
return { ...tb, text: redactSecrets(tb.text) };
|
|
952
|
+
}
|
|
953
|
+
return block;
|
|
954
|
+
});
|
|
955
|
+
|
|
932
956
|
// Route the assistant-message persistence through the `persistence`
|
|
933
957
|
// pipeline. No `syncToDisk` here — the orchestrator separately invokes
|
|
934
958
|
// `syncMessageToDisk` on `state.lastAssistantMessageId` after the loop
|
|
@@ -941,7 +965,7 @@ export async function handleMessageComplete(
|
|
|
941
965
|
op: "add",
|
|
942
966
|
conversationId: deps.ctx.conversationId,
|
|
943
967
|
role: "assistant",
|
|
944
|
-
content: JSON.stringify(
|
|
968
|
+
content: JSON.stringify(contentForPersistence),
|
|
945
969
|
metadata: assistantChannelMetadata,
|
|
946
970
|
},
|
|
947
971
|
buildHandlerTurnContext(deps),
|
|
@@ -24,7 +24,6 @@ import type {
|
|
|
24
24
|
TurnChannelContext,
|
|
25
25
|
TurnInterfaceContext,
|
|
26
26
|
} from "../channels/types.js";
|
|
27
|
-
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
28
27
|
import {
|
|
29
28
|
contextWindowConfigFromEffective,
|
|
30
29
|
resolveEffectiveContextWindow,
|
|
@@ -74,7 +73,10 @@ import type { ConversationGraphMemory } from "../memory/graph/conversation-graph
|
|
|
74
73
|
import { recordMemoryRecallLog } from "../memory/memory-recall-log-store.js";
|
|
75
74
|
import { PKB_WORKSPACE_SCOPE } from "../memory/pkb/types.js";
|
|
76
75
|
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
77
|
-
import {
|
|
76
|
+
import {
|
|
77
|
+
readMemoryV2StaticContent,
|
|
78
|
+
shouldLoadMemoryV2Static,
|
|
79
|
+
} from "../memory/v2/static-context.js";
|
|
78
80
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
79
81
|
import { defaultCompactionTerminal } from "../plugins/defaults/compaction.js";
|
|
80
82
|
import { defaultHistoryRepairTerminal } from "../plugins/defaults/history-repair.js";
|
|
@@ -107,6 +109,11 @@ import type {
|
|
|
107
109
|
TurnContext as PluginTurnContext,
|
|
108
110
|
} from "../plugins/types.js";
|
|
109
111
|
import { PluginExecutionError, PluginTimeoutError } from "../plugins/types.js";
|
|
112
|
+
import {
|
|
113
|
+
hasProactiveArtifactCompleted,
|
|
114
|
+
runProactiveArtifactJob,
|
|
115
|
+
tryClaimProactiveArtifactTrigger,
|
|
116
|
+
} from "../proactive-artifact/index.js";
|
|
110
117
|
import type {
|
|
111
118
|
ContentBlock,
|
|
112
119
|
Message,
|
|
@@ -114,7 +121,9 @@ import type {
|
|
|
114
121
|
} from "../providers/types.js";
|
|
115
122
|
import type { Provider } from "../providers/types.js";
|
|
116
123
|
import { resolveActorTrust } from "../runtime/actor-trust-resolver.js";
|
|
124
|
+
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
117
125
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
126
|
+
import { redactSecrets } from "../security/secret-scanner.js";
|
|
118
127
|
import { getSubagentManager } from "../subagent/index.js";
|
|
119
128
|
import type { UsageActor } from "../usage/actors.js";
|
|
120
129
|
import { getLogger } from "../util/logger.js";
|
|
@@ -127,6 +136,7 @@ import {
|
|
|
127
136
|
type AssistantAttachmentDraft,
|
|
128
137
|
cleanAssistantContent,
|
|
129
138
|
} from "./assistant-attachments.js";
|
|
139
|
+
import { cleanupBootstrapAfterTurnThreshold } from "./bootstrap-turn-cleanup.js";
|
|
130
140
|
import { resolveOverflowAction } from "./context-overflow-policy.js";
|
|
131
141
|
import {
|
|
132
142
|
createInitialReducerState,
|
|
@@ -174,7 +184,12 @@ import type { SkillProjectionCache } from "./conversation-skill-tools.js";
|
|
|
174
184
|
import { markSurfaceCompleted } from "./conversation-surfaces.js";
|
|
175
185
|
import { resolveTrustClass } from "./conversation-tool-setup.js";
|
|
176
186
|
import { recordUsage } from "./conversation-usage.js";
|
|
177
|
-
import {
|
|
187
|
+
import {
|
|
188
|
+
formatTurnTimestamp,
|
|
189
|
+
resolveTurnTimezoneContext,
|
|
190
|
+
} from "./date-context.js";
|
|
191
|
+
import { getDiskPressureStatus } from "./disk-pressure-guard.js";
|
|
192
|
+
import { classifyDiskPressureTurnPolicy } from "./disk-pressure-policy.js";
|
|
178
193
|
import { deepRepairHistory } from "./history-repair.js";
|
|
179
194
|
import type {
|
|
180
195
|
DynamicPageSurfaceData,
|
|
@@ -191,6 +206,8 @@ import type { TrustContext } from "./trust-context.js";
|
|
|
191
206
|
import { stripHistoricalWebSearchResults } from "./web-search-history.js";
|
|
192
207
|
|
|
193
208
|
const log = getLogger("conversation-agent-loop");
|
|
209
|
+
const DISK_PRESSURE_ERROR_CODE = "DISK_SPACE_CRITICAL" as const;
|
|
210
|
+
const DISK_PRESSURE_ERROR_CATEGORY = "disk_pressure";
|
|
194
211
|
|
|
195
212
|
/** Title-cased friendly labels for tool names, used in confirmation chips. */
|
|
196
213
|
const TOOL_FRIENDLY_LABEL: Record<string, string> = {
|
|
@@ -210,6 +227,10 @@ type GitServiceInitializer = {
|
|
|
210
227
|
ensureInitialized(): Promise<void>;
|
|
211
228
|
};
|
|
212
229
|
|
|
230
|
+
function formatDiskPressureBlockedMessage(): string {
|
|
231
|
+
return "Storage is critically low, so background processes are paused and remote messages are ignored until the guardian frees enough space. Remote senders should try again later.";
|
|
232
|
+
}
|
|
233
|
+
|
|
213
234
|
// ── Compaction circuit-breaker pipeline helpers ─────────────────────
|
|
214
235
|
//
|
|
215
236
|
// The circuit-breaker behavior (3 consecutive summary-LLM failures trips a
|
|
@@ -437,7 +458,6 @@ export interface AgentLoopConversationContext {
|
|
|
437
458
|
/** Timestamp (ms since epoch) until which the circuit breaker is open. */
|
|
438
459
|
compactionCircuitOpenUntil: number | null;
|
|
439
460
|
|
|
440
|
-
readonly memoryPolicy: { scopeId: string; includeDefaultFallback: boolean };
|
|
441
461
|
readonly graphMemory: ConversationGraphMemory;
|
|
442
462
|
|
|
443
463
|
currentActiveSurfaceId?: string;
|
|
@@ -494,9 +514,11 @@ export interface AgentLoopConversationContext {
|
|
|
494
514
|
voiceCallControlPrompt?: string;
|
|
495
515
|
transportHints?: string[];
|
|
496
516
|
slackRuntimeContextNotice?: string;
|
|
517
|
+
clientTimezone?: string;
|
|
497
518
|
|
|
498
519
|
readonly coreToolNames: Set<string>;
|
|
499
520
|
allowedToolNames?: Set<string>;
|
|
521
|
+
diskPressureCleanupModeActive?: boolean;
|
|
500
522
|
toolsDisabledDepth: number;
|
|
501
523
|
preactivatedSkillIds?: string[];
|
|
502
524
|
readonly skillProjectionState: Map<string, string>;
|
|
@@ -706,19 +728,39 @@ export async function runAgentLoopImpl(
|
|
|
706
728
|
};
|
|
707
729
|
})();
|
|
708
730
|
|
|
731
|
+
const isInteractiveResolved =
|
|
732
|
+
options?.isInteractive ?? (!ctx.hasNoClient && !ctx.headlessLock);
|
|
733
|
+
const diskPressureDecision = classifyDiskPressureTurnPolicy(
|
|
734
|
+
getDiskPressureStatus(),
|
|
735
|
+
{
|
|
736
|
+
conversationType: turnStartConversation?.conversationType ?? null,
|
|
737
|
+
conversationSource: turnStartConversation?.source ?? null,
|
|
738
|
+
callSite: turnCallSite,
|
|
739
|
+
isInteractive: isInteractiveResolved,
|
|
740
|
+
sourceChannel:
|
|
741
|
+
ctx.trustContext?.sourceChannel ??
|
|
742
|
+
capturedTurnChannelContext.userMessageChannel,
|
|
743
|
+
sourceInterface:
|
|
744
|
+
ctx.channelCapabilities?.clientOS ??
|
|
745
|
+
capturedTurnInterfaceContext.userMessageInterface,
|
|
746
|
+
trustContext: ctx.trustContext
|
|
747
|
+
? {
|
|
748
|
+
sourceChannel: ctx.trustContext.sourceChannel,
|
|
749
|
+
trustClass: ctx.trustContext.trustClass,
|
|
750
|
+
}
|
|
751
|
+
: null,
|
|
752
|
+
},
|
|
753
|
+
);
|
|
754
|
+
const diskPressureContext =
|
|
755
|
+
diskPressureDecision.action === "allow-cleanup-mode"
|
|
756
|
+
? { cleanupModeActive: true }
|
|
757
|
+
: null;
|
|
758
|
+
ctx.diskPressureCleanupModeActive =
|
|
759
|
+
diskPressureDecision.action === "allow-cleanup-mode";
|
|
760
|
+
|
|
709
761
|
ctx.lastAssistantAttachments = [];
|
|
710
762
|
ctx.lastAttachmentWarnings = [];
|
|
711
763
|
|
|
712
|
-
// Ensure workspace git repo is initialized before any tools run.
|
|
713
|
-
try {
|
|
714
|
-
const getWorkspaceGitServiceFn =
|
|
715
|
-
ctx.getWorkspaceGitService ?? getWorkspaceGitService;
|
|
716
|
-
const gitService = getWorkspaceGitServiceFn(ctx.workingDir);
|
|
717
|
-
await gitService.ensureInitialized();
|
|
718
|
-
} catch (err) {
|
|
719
|
-
rlog.warn({ err }, "Failed to initialize workspace git repo (non-fatal)");
|
|
720
|
-
}
|
|
721
|
-
|
|
722
764
|
ctx.profiler.startRequest();
|
|
723
765
|
let turnStarted = false;
|
|
724
766
|
|
|
@@ -735,6 +777,52 @@ export async function runAgentLoopImpl(
|
|
|
735
777
|
});
|
|
736
778
|
|
|
737
779
|
try {
|
|
780
|
+
if (diskPressureDecision.action === "block") {
|
|
781
|
+
const message = formatDiskPressureBlockedMessage();
|
|
782
|
+
rlog.warn(
|
|
783
|
+
{ reason: diskPressureDecision.reason },
|
|
784
|
+
"Blocked turn during disk pressure cleanup mode",
|
|
785
|
+
);
|
|
786
|
+
ctx.emitActivityState("idle", "error_terminal", "global", reqId);
|
|
787
|
+
ctx.traceEmitter.emit("request_error", message, {
|
|
788
|
+
requestId: reqId,
|
|
789
|
+
status: "error",
|
|
790
|
+
attributes: {
|
|
791
|
+
errorCategory: DISK_PRESSURE_ERROR_CATEGORY,
|
|
792
|
+
errorCode: DISK_PRESSURE_ERROR_CODE,
|
|
793
|
+
diskPressureReason: diskPressureDecision.reason,
|
|
794
|
+
},
|
|
795
|
+
});
|
|
796
|
+
onEvent({
|
|
797
|
+
type: "error",
|
|
798
|
+
conversationId: ctx.conversationId,
|
|
799
|
+
requestId: reqId,
|
|
800
|
+
code: DISK_PRESSURE_ERROR_CODE,
|
|
801
|
+
message,
|
|
802
|
+
category: DISK_PRESSURE_ERROR_CATEGORY,
|
|
803
|
+
errorCategory: DISK_PRESSURE_ERROR_CATEGORY,
|
|
804
|
+
});
|
|
805
|
+
onEvent({
|
|
806
|
+
type: "conversation_error",
|
|
807
|
+
conversationId: ctx.conversationId,
|
|
808
|
+
code: DISK_PRESSURE_ERROR_CODE,
|
|
809
|
+
userMessage: message,
|
|
810
|
+
retryable: true,
|
|
811
|
+
errorCategory: DISK_PRESSURE_ERROR_CATEGORY,
|
|
812
|
+
});
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
// Ensure workspace git repo is initialized before any tools run.
|
|
817
|
+
try {
|
|
818
|
+
const getWorkspaceGitServiceFn =
|
|
819
|
+
ctx.getWorkspaceGitService ?? getWorkspaceGitService;
|
|
820
|
+
const gitService = getWorkspaceGitServiceFn(ctx.workingDir);
|
|
821
|
+
await gitService.ensureInitialized();
|
|
822
|
+
} catch (err) {
|
|
823
|
+
rlog.warn({ err }, "Failed to initialize workspace git repo (non-fatal)");
|
|
824
|
+
}
|
|
825
|
+
|
|
738
826
|
// Auto-complete stale interactive surfaces from previous turns.
|
|
739
827
|
// Only dismiss when the user sends a new message (not a surface action
|
|
740
828
|
// response), so internal turns (subagent notifications, lifecycle
|
|
@@ -1237,14 +1325,16 @@ export async function runAgentLoopImpl(
|
|
|
1237
1325
|
|
|
1238
1326
|
// Compute fresh turn timestamp for date grounding.
|
|
1239
1327
|
// Absolute "now" is always anchored to assistant host clock, while local
|
|
1240
|
-
// date semantics prefer configured user timezone, then
|
|
1328
|
+
// date semantics prefer configured user timezone, then device timezones.
|
|
1241
1329
|
const hostTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
1242
|
-
const
|
|
1243
|
-
|
|
1244
|
-
|
|
1330
|
+
const timezoneContext = resolveTurnTimezoneContext({
|
|
1331
|
+
configuredUserTimeZone: config.ui.userTimezone ?? null,
|
|
1332
|
+
clientTimezone: ctx.clientTimezone ?? null,
|
|
1333
|
+
detectedTimezone: config.ui.detectedTimezone ?? null,
|
|
1245
1334
|
hostTimeZone,
|
|
1246
|
-
|
|
1247
|
-
|
|
1335
|
+
});
|
|
1336
|
+
const timestamp = formatTurnTimestamp({
|
|
1337
|
+
timeZone: timezoneContext.effectiveTimezone,
|
|
1248
1338
|
});
|
|
1249
1339
|
|
|
1250
1340
|
// Resolve the inbound actor context for the unified <turn_context> block.
|
|
@@ -1298,23 +1388,26 @@ export async function runAgentLoopImpl(
|
|
|
1298
1388
|
}
|
|
1299
1389
|
}
|
|
1300
1390
|
|
|
1391
|
+
const baseTurnContext = {
|
|
1392
|
+
timestamp,
|
|
1393
|
+
interfaceName,
|
|
1394
|
+
channelName,
|
|
1395
|
+
configuredUserTimezone: timezoneContext.configuredUserTimezone,
|
|
1396
|
+
clientTimezone: timezoneContext.clientTimezone,
|
|
1397
|
+
detectedTimezone: timezoneContext.detectedTimezone,
|
|
1398
|
+
timeSinceLastMessage,
|
|
1399
|
+
};
|
|
1301
1400
|
const unifiedTurnContextStr = buildUnifiedTurnContextBlock(
|
|
1302
1401
|
isGuardian
|
|
1303
|
-
?
|
|
1402
|
+
? baseTurnContext
|
|
1304
1403
|
: {
|
|
1305
|
-
|
|
1306
|
-
interfaceName,
|
|
1307
|
-
channelName,
|
|
1404
|
+
...baseTurnContext,
|
|
1308
1405
|
actorContext: resolvedInboundActorContext,
|
|
1309
|
-
timeSinceLastMessage,
|
|
1310
1406
|
},
|
|
1311
1407
|
);
|
|
1312
1408
|
|
|
1313
1409
|
// The `remember` tool handles scratchpad-style memory writes directly to the graph.
|
|
1314
1410
|
|
|
1315
|
-
const isInteractiveResolved =
|
|
1316
|
-
options?.isInteractive ?? (!ctx.hasNoClient && !ctx.headlessLock);
|
|
1317
|
-
|
|
1318
1411
|
// Inject NOW.md and PKB content only on the first turn (or after
|
|
1319
1412
|
// compaction re-strips them). Old injections persist in history and
|
|
1320
1413
|
// are never stripped on normal turns — this preserves the cached prefix.
|
|
@@ -1329,10 +1422,16 @@ export async function runAgentLoopImpl(
|
|
|
1329
1422
|
const pkbActive = currentPkbContent !== null;
|
|
1330
1423
|
|
|
1331
1424
|
// V2 static memory block (essentials/threads/recent/buffer). Same
|
|
1332
|
-
// first-turn / post-compaction cadence as PKB
|
|
1333
|
-
//
|
|
1334
|
-
//
|
|
1335
|
-
|
|
1425
|
+
// first-turn / post-compaction cadence as PKB. `shouldLoadMemoryV2Static`
|
|
1426
|
+
// also blocks remote-channel non-guardian actors from inducing the
|
|
1427
|
+
// model to recite private memory; `readMemoryV2StaticContent` self-gates
|
|
1428
|
+
// on the v2 flag + config and returns null when v2 is off, so the file
|
|
1429
|
+
// reads are skipped on non-injection turns.
|
|
1430
|
+
const currentMemoryV2Static = shouldLoadMemoryV2Static({
|
|
1431
|
+
shouldInjectNowAndPkb,
|
|
1432
|
+
sourceChannel: ctx.trustContext?.sourceChannel,
|
|
1433
|
+
isTrustedActor,
|
|
1434
|
+
})
|
|
1336
1435
|
? readMemoryV2StaticContent()
|
|
1337
1436
|
: null;
|
|
1338
1437
|
const memoryV2Static = currentMemoryV2Static;
|
|
@@ -1348,8 +1447,8 @@ export async function runAgentLoopImpl(
|
|
|
1348
1447
|
// `getInContextPkbPaths` re-reads `conversation.messages` on each call,
|
|
1349
1448
|
// so post-compaction re-injects see the updated history.
|
|
1350
1449
|
const pkbConversation = pkbActive ? ctx : undefined;
|
|
1351
|
-
// PKB points live under a single workspace sentinel scope
|
|
1352
|
-
//
|
|
1450
|
+
// PKB points live under a single workspace sentinel scope.
|
|
1451
|
+
// See `PKB_WORKSPACE_SCOPE` for why.
|
|
1353
1452
|
const pkbScopeId = pkbActive ? PKB_WORKSPACE_SCOPE : undefined;
|
|
1354
1453
|
|
|
1355
1454
|
// Subagent status injection — gives the parent LLM visibility into active/completed children.
|
|
@@ -1416,6 +1515,7 @@ export async function runAgentLoopImpl(
|
|
|
1416
1515
|
|
|
1417
1516
|
// Shared injection options — reused whenever we need to re-inject after reduction.
|
|
1418
1517
|
const injectionOpts = {
|
|
1518
|
+
diskPressureContext,
|
|
1419
1519
|
activeSurface,
|
|
1420
1520
|
workspaceTopLevelContext: shouldInjectWorkspace
|
|
1421
1521
|
? ctx.workspaceTopLevelContext
|
|
@@ -2533,10 +2633,16 @@ export async function runAgentLoopImpl(
|
|
|
2533
2633
|
).map(([toolUseId, result]) => ({
|
|
2534
2634
|
type: "tool_result",
|
|
2535
2635
|
tool_use_id: toolUseId,
|
|
2536
|
-
content: result.content,
|
|
2636
|
+
content: redactSecrets(result.content),
|
|
2537
2637
|
is_error: result.isError,
|
|
2538
2638
|
...(result.contentBlocks
|
|
2539
|
-
? {
|
|
2639
|
+
? {
|
|
2640
|
+
contentBlocks: result.contentBlocks.map((block) =>
|
|
2641
|
+
block.type === "text"
|
|
2642
|
+
? { ...block, text: redactSecrets(block.text) }
|
|
2643
|
+
: block,
|
|
2644
|
+
),
|
|
2645
|
+
}
|
|
2540
2646
|
: {}),
|
|
2541
2647
|
}));
|
|
2542
2648
|
const toolResultMetadata = {
|
|
@@ -2619,34 +2725,29 @@ export async function runAgentLoopImpl(
|
|
|
2619
2725
|
|
|
2620
2726
|
// Post-turn tool result truncation: save large results to disk and
|
|
2621
2727
|
// replace in-context content with a prefix/suffix stub + file pointer.
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2728
|
+
try {
|
|
2729
|
+
const conv = getConversation(ctx.conversationId);
|
|
2730
|
+
if (conv) {
|
|
2731
|
+
const convDir = getResolvedConversationDirPath(
|
|
2732
|
+
ctx.conversationId,
|
|
2733
|
+
conv.createdAt,
|
|
2734
|
+
);
|
|
2735
|
+
const { messages: derefMessages, dereferencedCount } =
|
|
2736
|
+
derefToolResultReReads(restoredHistory);
|
|
2737
|
+
const { messages: truncatedMessages, truncatedCount } =
|
|
2738
|
+
postTurnTruncateToolResults(derefMessages, {
|
|
2739
|
+
conversationDir: convDir,
|
|
2740
|
+
});
|
|
2741
|
+
if (truncatedCount > 0 || dereferencedCount > 0) {
|
|
2742
|
+
rlog.info(
|
|
2743
|
+
{ truncatedCount, dereferencedCount },
|
|
2744
|
+
"Post-turn tool result truncation applied",
|
|
2629
2745
|
);
|
|
2630
|
-
const { messages: derefMessages, dereferencedCount } =
|
|
2631
|
-
derefToolResultReReads(restoredHistory);
|
|
2632
|
-
const { messages: truncatedMessages, truncatedCount } =
|
|
2633
|
-
postTurnTruncateToolResults(derefMessages, {
|
|
2634
|
-
conversationDir: convDir,
|
|
2635
|
-
});
|
|
2636
|
-
if (truncatedCount > 0 || dereferencedCount > 0) {
|
|
2637
|
-
rlog.info(
|
|
2638
|
-
{ truncatedCount, dereferencedCount },
|
|
2639
|
-
"Post-turn tool result truncation applied",
|
|
2640
|
-
);
|
|
2641
|
-
}
|
|
2642
|
-
restoredHistory = truncatedMessages;
|
|
2643
2746
|
}
|
|
2644
|
-
|
|
2645
|
-
rlog.warn(
|
|
2646
|
-
{ err },
|
|
2647
|
-
"Post-turn tool result truncation failed (non-fatal)",
|
|
2648
|
-
);
|
|
2747
|
+
restoredHistory = truncatedMessages;
|
|
2649
2748
|
}
|
|
2749
|
+
} catch (err) {
|
|
2750
|
+
rlog.warn({ err }, "Post-turn tool result truncation failed (non-fatal)");
|
|
2650
2751
|
}
|
|
2651
2752
|
|
|
2652
2753
|
// Persist injections in history: runtime-injected context stays on
|
|
@@ -2872,6 +2973,42 @@ export async function runAgentLoopImpl(
|
|
|
2872
2973
|
"Failed to build home-feed event for background conversation",
|
|
2873
2974
|
);
|
|
2874
2975
|
}
|
|
2976
|
+
|
|
2977
|
+
// Proactive artifact: fire once when the processed turn was the 4th user message.
|
|
2978
|
+
// Only trigger for real user-authored turns (not subagent/system messages).
|
|
2979
|
+
{
|
|
2980
|
+
const paConv = getConversation(ctx.conversationId);
|
|
2981
|
+
if (
|
|
2982
|
+
paConv &&
|
|
2983
|
+
paConv.conversationType === "standard" &&
|
|
2984
|
+
options?.isUserMessage
|
|
2985
|
+
) {
|
|
2986
|
+
void (async () => {
|
|
2987
|
+
try {
|
|
2988
|
+
if (hasProactiveArtifactCompleted()) return;
|
|
2989
|
+
const userMsg = getMessageById(
|
|
2990
|
+
userMessageId,
|
|
2991
|
+
ctx.conversationId,
|
|
2992
|
+
);
|
|
2993
|
+
if (!userMsg) return;
|
|
2994
|
+
if (!tryClaimProactiveArtifactTrigger(userMsg.createdAt))
|
|
2995
|
+
return;
|
|
2996
|
+
await runProactiveArtifactJob({
|
|
2997
|
+
conversationId: ctx.conversationId,
|
|
2998
|
+
userMessageCutoff: userMsg.createdAt,
|
|
2999
|
+
assistantMessageId: state.lastAssistantMessageId,
|
|
3000
|
+
suppressAppBuild: state.appBuildToolUsedThisRun,
|
|
3001
|
+
broadcastMessage,
|
|
3002
|
+
});
|
|
3003
|
+
} catch (err) {
|
|
3004
|
+
log.warn(
|
|
3005
|
+
{ err, conversationId: ctx.conversationId },
|
|
3006
|
+
"Proactive artifact trigger failed",
|
|
3007
|
+
);
|
|
3008
|
+
}
|
|
3009
|
+
})();
|
|
3010
|
+
}
|
|
3011
|
+
}
|
|
2875
3012
|
}
|
|
2876
3013
|
}
|
|
2877
3014
|
|
|
@@ -2935,11 +3072,14 @@ export async function runAgentLoopImpl(
|
|
|
2935
3072
|
conversationId: ctx.conversationId,
|
|
2936
3073
|
code: classified.code,
|
|
2937
3074
|
message: classified.userMessage,
|
|
3075
|
+
errorCategory: classified.errorCategory,
|
|
2938
3076
|
});
|
|
2939
3077
|
onEvent(buildConversationErrorMessage(ctx.conversationId, classified));
|
|
2940
3078
|
}
|
|
2941
3079
|
} finally {
|
|
2942
3080
|
if (turnStarted) {
|
|
3081
|
+
cleanupBootstrapAfterTurnThreshold(ctx.conversationId);
|
|
3082
|
+
|
|
2943
3083
|
ctx.turnCount++;
|
|
2944
3084
|
const config = getConfig();
|
|
2945
3085
|
const maxWait = config.workspaceGit?.turnCommitMaxWaitMs ?? 4000;
|
|
@@ -2984,6 +3124,7 @@ export async function runAgentLoopImpl(
|
|
|
2984
3124
|
ctx.currentRequestId = undefined;
|
|
2985
3125
|
ctx.currentActiveSurfaceId = undefined;
|
|
2986
3126
|
ctx.allowedToolNames = undefined;
|
|
3127
|
+
ctx.diskPressureCleanupModeActive = false;
|
|
2987
3128
|
ctx.preactivatedSkillIds = undefined;
|
|
2988
3129
|
ctx.currentTurnOverrideProfile = undefined;
|
|
2989
3130
|
ctx.slackRuntimeContextNotice = undefined;
|
|
@@ -36,6 +36,23 @@ const NETWORK_PATTERNS = [
|
|
|
36
36
|
// Rate limit patterns (HTTP 429 or explicit rate limit messages)
|
|
37
37
|
const RATE_LIMIT_PATTERNS = [/429/, /rate.?limit/i, /too many requests/i];
|
|
38
38
|
|
|
39
|
+
// Managed usage-limit responses are generated by Vellum, even though they can
|
|
40
|
+
// travel through provider SDKs and get wrapped as ProviderError.
|
|
41
|
+
const MANAGED_USAGE_LIMIT_PATTERNS = [
|
|
42
|
+
/"code"\s*:\s*"daily_quota_exceeded"/i,
|
|
43
|
+
/"code"\s*:\s*"rate_limit_exceeded"/i,
|
|
44
|
+
/system credential proxy rate limit/i,
|
|
45
|
+
/you've reached your usage limit for today/i,
|
|
46
|
+
/current plan allows/i,
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
const PROVIDER_BILLING_PATTERNS = [
|
|
50
|
+
/credit balance is too low/i,
|
|
51
|
+
/insufficient.*credits?/i,
|
|
52
|
+
/requires more credits/i,
|
|
53
|
+
/can only afford/i,
|
|
54
|
+
];
|
|
55
|
+
|
|
39
56
|
// Overloaded patterns — provider is capacity-constrained (distinct from rate limiting)
|
|
40
57
|
const OVERLOADED_PATTERNS = [/overloaded/i];
|
|
41
58
|
|
|
@@ -259,15 +276,21 @@ function classifyCore(
|
|
|
259
276
|
};
|
|
260
277
|
}
|
|
261
278
|
if (error.statusCode === 402) {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
retryable: false,
|
|
267
|
-
errorCategory: "credits_exhausted",
|
|
268
|
-
};
|
|
279
|
+
if (isManagedBalanceError(error)) {
|
|
280
|
+
return managedBalanceClassification();
|
|
281
|
+
}
|
|
282
|
+
return providerBillingClassification();
|
|
269
283
|
}
|
|
270
284
|
if (error.statusCode === 429) {
|
|
285
|
+
if (isManagedUsageLimitError(error, message)) {
|
|
286
|
+
return {
|
|
287
|
+
code: "MANAGED_USAGE_LIMIT",
|
|
288
|
+
userMessage:
|
|
289
|
+
"Vellum managed inference is rate limited. This is a Vellum-side usage limit, not an AI provider outage.",
|
|
290
|
+
retryable: true,
|
|
291
|
+
errorCategory: "managed_usage_limit",
|
|
292
|
+
};
|
|
293
|
+
}
|
|
271
294
|
return {
|
|
272
295
|
code: "PROVIDER_RATE_LIMIT",
|
|
273
296
|
userMessage:
|
|
@@ -331,13 +354,8 @@ function classifyCore(
|
|
|
331
354
|
errorCategory: "tool_ordering",
|
|
332
355
|
};
|
|
333
356
|
}
|
|
334
|
-
if (
|
|
335
|
-
return
|
|
336
|
-
code: "PROVIDER_BILLING",
|
|
337
|
-
userMessage: "Your API key has insufficient credits.",
|
|
338
|
-
retryable: false,
|
|
339
|
-
errorCategory: "provider_billing",
|
|
340
|
-
};
|
|
357
|
+
if (isProviderBillingError(message)) {
|
|
358
|
+
return providerBillingClassification();
|
|
341
359
|
}
|
|
342
360
|
if (
|
|
343
361
|
/invalid.*api.?key|invalid.*x-api-key|authentication.?error|invalid.authentication/i.test(
|
|
@@ -362,7 +380,7 @@ function classifyCore(
|
|
|
362
380
|
}
|
|
363
381
|
|
|
364
382
|
// Regex fallback for non-ProviderError or ProviderError without statusCode
|
|
365
|
-
return classifyByMessage(message);
|
|
383
|
+
return classifyByMessage(error, message);
|
|
366
384
|
}
|
|
367
385
|
|
|
368
386
|
/** Check whether an error message indicates a context-too-large failure. */
|
|
@@ -394,7 +412,52 @@ function isStreamingError(message: string): boolean {
|
|
|
394
412
|
return STREAMING_ERROR_PATTERNS.some((p) => p.test(message));
|
|
395
413
|
}
|
|
396
414
|
|
|
415
|
+
function isManagedUsageLimitError(error: unknown, message: string): boolean {
|
|
416
|
+
if (
|
|
417
|
+
error instanceof ProviderError &&
|
|
418
|
+
getProviderRoutingSource(error.provider) === "managed-proxy"
|
|
419
|
+
) {
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
return MANAGED_USAGE_LIMIT_PATTERNS.some((p) => p.test(message));
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
function isManagedBalanceError(error: ProviderError): boolean {
|
|
426
|
+
return getProviderRoutingSource(error.provider) === "managed-proxy";
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function isProviderBillingError(message: string): boolean {
|
|
430
|
+
return PROVIDER_BILLING_PATTERNS.some((p) => p.test(message));
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function managedBalanceClassification(): Omit<
|
|
434
|
+
ClassifiedConversationError,
|
|
435
|
+
"debugDetails"
|
|
436
|
+
> {
|
|
437
|
+
return {
|
|
438
|
+
code: "PROVIDER_BILLING",
|
|
439
|
+
userMessage:
|
|
440
|
+
"You've run out of credits. Add funds to continue using the assistant.",
|
|
441
|
+
retryable: false,
|
|
442
|
+
errorCategory: "credits_exhausted",
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function providerBillingClassification(): Omit<
|
|
447
|
+
ClassifiedConversationError,
|
|
448
|
+
"debugDetails"
|
|
449
|
+
> {
|
|
450
|
+
return {
|
|
451
|
+
code: "PROVIDER_BILLING",
|
|
452
|
+
userMessage:
|
|
453
|
+
"Your API provider account or key needs credits. Add funds with the provider or update the key in Settings.",
|
|
454
|
+
retryable: false,
|
|
455
|
+
errorCategory: "provider_billing",
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
|
|
397
459
|
function classifyByMessage(
|
|
460
|
+
error: unknown,
|
|
398
461
|
message: string,
|
|
399
462
|
): Omit<ClassifiedConversationError, "debugDetails"> {
|
|
400
463
|
// Check context-too-large before other patterns
|
|
@@ -411,6 +474,15 @@ function classifyByMessage(
|
|
|
411
474
|
// Check rate limit first (before network, since 429 could match both)
|
|
412
475
|
for (const pattern of RATE_LIMIT_PATTERNS) {
|
|
413
476
|
if (pattern.test(message)) {
|
|
477
|
+
if (isManagedUsageLimitError(error, message)) {
|
|
478
|
+
return {
|
|
479
|
+
code: "MANAGED_USAGE_LIMIT",
|
|
480
|
+
userMessage:
|
|
481
|
+
"Vellum managed inference is rate limited. This is a Vellum-side usage limit, not an AI provider outage.",
|
|
482
|
+
retryable: true,
|
|
483
|
+
errorCategory: "managed_usage_limit",
|
|
484
|
+
};
|
|
485
|
+
}
|
|
414
486
|
return {
|
|
415
487
|
code: "PROVIDER_RATE_LIMIT",
|
|
416
488
|
userMessage:
|