@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
|
@@ -4,7 +4,7 @@ import { SttServiceSchema } from "./stt.js";
|
|
|
4
4
|
import { TtsServiceSchema } from "./tts.js";
|
|
5
5
|
|
|
6
6
|
const ServiceModeSchema = z.enum(["managed", "your-own"]);
|
|
7
|
-
|
|
7
|
+
type ServiceMode = z.infer<typeof ServiceModeSchema>;
|
|
8
8
|
|
|
9
9
|
export const VALID_INFERENCE_PROVIDERS = [
|
|
10
10
|
"anthropic",
|
|
@@ -26,7 +26,6 @@ const VALID_WEB_SEARCH_PROVIDERS = [
|
|
|
26
26
|
const BaseServiceSchema = z.object({
|
|
27
27
|
mode: ServiceModeSchema.default("your-own"),
|
|
28
28
|
});
|
|
29
|
-
export type BaseService = z.infer<typeof BaseServiceSchema>;
|
|
30
29
|
|
|
31
30
|
/**
|
|
32
31
|
* Inference service entry. Carries only the routing `mode`
|
|
@@ -37,52 +36,57 @@ export type BaseService = z.infer<typeof BaseServiceSchema>;
|
|
|
37
36
|
* workspace migration `039-drop-legacy-llm-keys`.
|
|
38
37
|
*/
|
|
39
38
|
const InferenceServiceSchema = BaseServiceSchema;
|
|
40
|
-
export type InferenceService = z.infer<typeof InferenceServiceSchema>;
|
|
41
39
|
|
|
42
40
|
const ImageGenerationServiceSchema = BaseServiceSchema.extend({
|
|
43
41
|
provider: z.enum(VALID_IMAGE_GEN_PROVIDERS).default("gemini"),
|
|
44
42
|
model: z.string().default("gemini-3.1-flash-image-preview"),
|
|
45
43
|
});
|
|
46
|
-
export type ImageGenerationService = z.infer<
|
|
47
|
-
typeof ImageGenerationServiceSchema
|
|
48
|
-
>;
|
|
49
44
|
|
|
50
45
|
const WebSearchServiceSchema = BaseServiceSchema.extend({
|
|
51
46
|
provider: z
|
|
52
47
|
.enum(VALID_WEB_SEARCH_PROVIDERS)
|
|
53
48
|
.default("inference-provider-native"),
|
|
54
49
|
});
|
|
55
|
-
export type WebSearchService = z.infer<typeof WebSearchServiceSchema>;
|
|
56
50
|
|
|
57
51
|
const GoogleOAuthServiceSchema = BaseServiceSchema.extend({
|
|
58
52
|
mode: ServiceModeSchema.default("your-own"),
|
|
59
53
|
});
|
|
60
|
-
export type GoogleOAuthService = z.infer<typeof GoogleOAuthServiceSchema>;
|
|
61
54
|
|
|
62
55
|
const OutlookOAuthServiceSchema = BaseServiceSchema.extend({
|
|
63
56
|
mode: ServiceModeSchema.default("your-own"),
|
|
64
57
|
});
|
|
65
|
-
export type OutlookOAuthService = z.infer<typeof OutlookOAuthServiceSchema>;
|
|
66
58
|
|
|
67
59
|
const LinearOAuthServiceSchema = BaseServiceSchema.extend({
|
|
68
60
|
mode: ServiceModeSchema.default("your-own"),
|
|
69
61
|
});
|
|
70
|
-
export type LinearOAuthService = z.infer<typeof LinearOAuthServiceSchema>;
|
|
71
62
|
|
|
72
63
|
const GitHubOAuthServiceSchema = BaseServiceSchema.extend({
|
|
73
64
|
mode: ServiceModeSchema.default("your-own"),
|
|
74
65
|
});
|
|
75
|
-
export type GitHubOAuthService = z.infer<typeof GitHubOAuthServiceSchema>;
|
|
76
66
|
|
|
77
67
|
const NotionOAuthServiceSchema = BaseServiceSchema.extend({
|
|
78
68
|
mode: ServiceModeSchema.default("your-own"),
|
|
79
69
|
});
|
|
80
|
-
export type NotionOAuthService = z.infer<typeof NotionOAuthServiceSchema>;
|
|
81
70
|
|
|
82
71
|
const TwitterOAuthServiceSchema = BaseServiceSchema.extend({
|
|
83
72
|
mode: ServiceModeSchema.default("your-own"),
|
|
84
73
|
});
|
|
85
|
-
|
|
74
|
+
|
|
75
|
+
const AsanaOAuthServiceSchema = BaseServiceSchema.extend({
|
|
76
|
+
mode: ServiceModeSchema.default("your-own"),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const TodoistOAuthServiceSchema = BaseServiceSchema.extend({
|
|
80
|
+
mode: ServiceModeSchema.default("your-own"),
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const DiscordOAuthServiceSchema = BaseServiceSchema.extend({
|
|
84
|
+
mode: ServiceModeSchema.default("your-own"),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const HubspotOAuthServiceSchema = BaseServiceSchema.extend({
|
|
88
|
+
mode: ServiceModeSchema.default("your-own"),
|
|
89
|
+
});
|
|
86
90
|
|
|
87
91
|
/**
|
|
88
92
|
* `services.meet.host.*` — daemon-side knobs for the externalized meet-join
|
|
@@ -106,7 +110,6 @@ const MeetHostConfigSchema = z
|
|
|
106
110
|
),
|
|
107
111
|
})
|
|
108
112
|
.describe("Daemon-side configuration for the external meet-join skill host");
|
|
109
|
-
export type MeetHostConfig = z.infer<typeof MeetHostConfigSchema>;
|
|
110
113
|
|
|
111
114
|
/**
|
|
112
115
|
* Daemon-side `services.meet` block. Intentionally distinct from the
|
|
@@ -120,7 +123,6 @@ const MeetDaemonServiceSchema = z
|
|
|
120
123
|
host: MeetHostConfigSchema.default(MeetHostConfigSchema.parse({})),
|
|
121
124
|
})
|
|
122
125
|
.describe("meet-join skill daemon-side configuration");
|
|
123
|
-
export type MeetDaemonService = z.infer<typeof MeetDaemonServiceSchema>;
|
|
124
126
|
|
|
125
127
|
export const ServicesSchema = z.object({
|
|
126
128
|
inference: InferenceServiceSchema.default(InferenceServiceSchema.parse({})),
|
|
@@ -154,6 +156,18 @@ export const ServicesSchema = z.object({
|
|
|
154
156
|
"twitter-oauth": TwitterOAuthServiceSchema.default(
|
|
155
157
|
TwitterOAuthServiceSchema.parse({}),
|
|
156
158
|
),
|
|
159
|
+
"asana-oauth": AsanaOAuthServiceSchema.default(
|
|
160
|
+
AsanaOAuthServiceSchema.parse({}),
|
|
161
|
+
),
|
|
162
|
+
"todoist-oauth": TodoistOAuthServiceSchema.default(
|
|
163
|
+
TodoistOAuthServiceSchema.parse({}),
|
|
164
|
+
),
|
|
165
|
+
"discord-oauth": DiscordOAuthServiceSchema.default(
|
|
166
|
+
DiscordOAuthServiceSchema.parse({}),
|
|
167
|
+
),
|
|
168
|
+
"hubspot-oauth": HubspotOAuthServiceSchema.default(
|
|
169
|
+
HubspotOAuthServiceSchema.parse({}),
|
|
170
|
+
),
|
|
157
171
|
meet: MeetDaemonServiceSchema.default(MeetDaemonServiceSchema.parse({})),
|
|
158
172
|
});
|
|
159
173
|
export type Services = z.infer<typeof ServicesSchema>;
|
|
@@ -149,9 +149,3 @@ export const SkillsConfigSchema = z
|
|
|
149
149
|
);
|
|
150
150
|
|
|
151
151
|
export type SkillEntryConfig = z.infer<typeof SkillEntryConfigSchema>;
|
|
152
|
-
export type SkillsLoadConfig = z.infer<typeof SkillsLoadConfigSchema>;
|
|
153
|
-
export type SkillsInstallConfig = z.infer<typeof SkillsInstallConfigSchema>;
|
|
154
|
-
export type RemoteProviderConfig = z.infer<typeof RemoteProviderConfigSchema>;
|
|
155
|
-
export type RemoteProvidersConfig = z.infer<typeof RemoteProvidersConfigSchema>;
|
|
156
|
-
export type RemotePolicyConfig = z.infer<typeof RemotePolicyConfigSchema>;
|
|
157
|
-
export type SkillsConfig = z.infer<typeof SkillsConfigSchema>;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { PROVIDER_CATALOG } from "../providers/model-catalog.js";
|
|
2
|
+
import { resolveModelIntent } from "../providers/model-intents.js";
|
|
3
|
+
import type { ModelIntent } from "../providers/types.js";
|
|
1
4
|
import { loadRawConfig, saveRawConfig } from "./loader.js";
|
|
2
5
|
import {
|
|
3
6
|
DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS,
|
|
@@ -5,41 +8,82 @@ import {
|
|
|
5
8
|
} from "./schemas/llm.js";
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* updates propagate automatically. User-created profiles (keyed by
|
|
12
|
-
* different names) are never touched.
|
|
11
|
+
* Template for a daemon-managed inference profile. The profile's model is
|
|
12
|
+
* resolved at seed time from `PROVIDER_MODEL_INTENTS` so the catalog stays the
|
|
13
|
+
* single source of truth for "which model does this intent map to?".
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
|
+
type ManagedProfileTemplate = Omit<ProfileEntry, "provider" | "model"> & {
|
|
16
|
+
intent: ModelIntent;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Anthropic-managed profiles. Always seeded so users can target Anthropic via
|
|
21
|
+
* their own key, even when the resolved default provider is something else.
|
|
22
|
+
*/
|
|
23
|
+
const ANTHROPIC_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
15
24
|
balanced: {
|
|
25
|
+
intent: "balanced",
|
|
16
26
|
source: "managed",
|
|
17
27
|
label: "Balanced",
|
|
18
28
|
description: "Good balance of quality, cost, and speed",
|
|
19
|
-
provider: "anthropic",
|
|
20
|
-
model: "claude-sonnet-4-6",
|
|
21
29
|
maxTokens: 16000,
|
|
22
30
|
effort: "high",
|
|
23
31
|
thinking: { enabled: true, streamThinking: true },
|
|
24
32
|
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
25
33
|
},
|
|
26
34
|
"quality-optimized": {
|
|
35
|
+
intent: "quality-optimized",
|
|
27
36
|
source: "managed",
|
|
28
37
|
label: "Quality",
|
|
29
38
|
description: "Best results with the most capable model",
|
|
30
|
-
provider: "anthropic",
|
|
31
|
-
model: "claude-opus-4-7",
|
|
32
39
|
maxTokens: 32000,
|
|
33
40
|
effort: "max",
|
|
34
41
|
thinking: { enabled: true, streamThinking: true },
|
|
35
42
|
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
36
43
|
},
|
|
37
44
|
"cost-optimized": {
|
|
45
|
+
intent: "latency-optimized",
|
|
38
46
|
source: "managed",
|
|
39
47
|
label: "Speed",
|
|
40
48
|
description: "Fastest responses at lower cost",
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
maxTokens: 8192,
|
|
50
|
+
effort: "low",
|
|
51
|
+
thinking: { enabled: false, streamThinking: false },
|
|
52
|
+
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Custom-provider profile templates. Materialized at seed time when the
|
|
58
|
+
* resolved default provider is non-Anthropic, using `resolveModelIntent` to
|
|
59
|
+
* pick the model.
|
|
60
|
+
*/
|
|
61
|
+
const CUSTOM_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
62
|
+
"custom-balanced": {
|
|
63
|
+
intent: "balanced",
|
|
64
|
+
source: "user",
|
|
65
|
+
label: "Balanced (Custom Provider)",
|
|
66
|
+
description: "Good balance of quality, cost, and speed",
|
|
67
|
+
maxTokens: 16000,
|
|
68
|
+
effort: "high",
|
|
69
|
+
thinking: { enabled: true, streamThinking: true },
|
|
70
|
+
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
71
|
+
},
|
|
72
|
+
"custom-quality-optimized": {
|
|
73
|
+
intent: "quality-optimized",
|
|
74
|
+
source: "user",
|
|
75
|
+
label: "Quality (Custom Provider)",
|
|
76
|
+
description: "Best results with the most capable model",
|
|
77
|
+
maxTokens: 32000,
|
|
78
|
+
effort: "max",
|
|
79
|
+
thinking: { enabled: true, streamThinking: true },
|
|
80
|
+
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
81
|
+
},
|
|
82
|
+
"custom-cost-optimized": {
|
|
83
|
+
intent: "latency-optimized",
|
|
84
|
+
source: "user",
|
|
85
|
+
label: "Speed (Custom Provider)",
|
|
86
|
+
description: "Fastest responses at lower cost",
|
|
43
87
|
maxTokens: 8192,
|
|
44
88
|
effort: "low",
|
|
45
89
|
thinking: { enabled: false, streamThinking: false },
|
|
@@ -48,26 +92,47 @@ export const MANAGED_PROFILE_SEED_DATA: Record<string, ProfileEntry> = {
|
|
|
48
92
|
};
|
|
49
93
|
|
|
50
94
|
export const MANAGED_PROFILE_NAMES = new Set(
|
|
51
|
-
Object.keys(
|
|
95
|
+
Object.keys(ANTHROPIC_PROFILE_TEMPLATES),
|
|
52
96
|
);
|
|
53
97
|
|
|
98
|
+
const SEEDED_PROFILE_NAMES = new Set([
|
|
99
|
+
...Object.keys(ANTHROPIC_PROFILE_TEMPLATES),
|
|
100
|
+
...Object.keys(CUSTOM_PROFILE_TEMPLATES),
|
|
101
|
+
]);
|
|
102
|
+
|
|
103
|
+
const KNOWN_PROVIDERS = new Set(PROVIDER_CATALOG.map((entry) => entry.id));
|
|
104
|
+
|
|
105
|
+
export type SeedInferenceProfilesOptions = {
|
|
106
|
+
/**
|
|
107
|
+
* Managed profile names supplied by the platform/default overlay for this
|
|
108
|
+
* startup. Those entries are already on disk by the time seeding runs and
|
|
109
|
+
* should remain authoritative for this boot.
|
|
110
|
+
*/
|
|
111
|
+
preserveProfileNames?: Iterable<string>;
|
|
112
|
+
preserveActiveProfile?: boolean;
|
|
113
|
+
};
|
|
114
|
+
|
|
54
115
|
/**
|
|
55
116
|
* Seed managed inference profiles into the workspace config.
|
|
56
117
|
*
|
|
57
|
-
* Called on every daemon startup after workspace migrations and
|
|
58
|
-
* the first `loadConfig()`.
|
|
59
|
-
* (
|
|
60
|
-
*
|
|
61
|
-
*
|
|
118
|
+
* Called on every daemon startup after workspace migrations and default-config
|
|
119
|
+
* overlay merge, but before the first `loadConfig()`. The 3 Anthropic-managed
|
|
120
|
+
* profiles (`balanced`, `quality-optimized`, `cost-optimized`) are always
|
|
121
|
+
* written so users can target Anthropic via their own key. When the resolved
|
|
122
|
+
* default provider is non-Anthropic, the 3 `custom-*` profiles are also
|
|
123
|
+
* materialized using `resolveModelIntent` against that provider, and
|
|
124
|
+
* `custom-balanced` becomes the active profile for fresh hatches.
|
|
62
125
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
126
|
+
* Default-config overlays can provide their own profile fragments and active
|
|
127
|
+
* profile. Lifecycle passes those explicit fields in `options`, letting local
|
|
128
|
+
* hatches still receive managed defaults while platform-owned profile choices
|
|
129
|
+
* remain authoritative.
|
|
66
130
|
*/
|
|
67
|
-
export function seedInferenceProfiles(
|
|
68
|
-
|
|
69
|
-
|
|
131
|
+
export function seedInferenceProfiles(
|
|
132
|
+
options: SeedInferenceProfilesOptions = {},
|
|
133
|
+
): void {
|
|
70
134
|
const config = loadRawConfig();
|
|
135
|
+
const preservedProfileNames = new Set(options.preserveProfileNames ?? []);
|
|
71
136
|
|
|
72
137
|
if (config.llm == null || typeof config.llm !== "object") {
|
|
73
138
|
config.llm = {};
|
|
@@ -79,25 +144,135 @@ export function seedInferenceProfiles(): void {
|
|
|
79
144
|
}
|
|
80
145
|
const profiles = llm.profiles as Record<string, Record<string, unknown>>;
|
|
81
146
|
|
|
82
|
-
|
|
83
|
-
|
|
147
|
+
const requestedProvider =
|
|
148
|
+
readString(readObject(llm.default)?.provider) ?? "anthropic";
|
|
149
|
+
const isKnownProvider = KNOWN_PROVIDERS.has(requestedProvider);
|
|
150
|
+
const resolvedProvider: NonNullable<ProfileEntry["provider"]> =
|
|
151
|
+
isKnownProvider
|
|
152
|
+
? (requestedProvider as NonNullable<ProfileEntry["provider"]>)
|
|
153
|
+
: "anthropic";
|
|
154
|
+
const isAnthropicDefault = resolvedProvider === "anthropic";
|
|
155
|
+
|
|
156
|
+
// Persist the resolved provider when the overlay supplied an unrecognized
|
|
157
|
+
// value, so the on-disk config doesn't keep emitting Zod warnings for
|
|
158
|
+
// `unknownprov` on every load.
|
|
159
|
+
if (!isKnownProvider) {
|
|
160
|
+
const defaultBlock = (readObject(llm.default) ?? {}) as Record<
|
|
161
|
+
string,
|
|
162
|
+
unknown
|
|
163
|
+
>;
|
|
164
|
+
defaultBlock.provider = resolvedProvider;
|
|
165
|
+
llm.default = defaultBlock;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
for (const [name, template] of Object.entries(ANTHROPIC_PROFILE_TEMPLATES)) {
|
|
169
|
+
if (preservedProfileNames.has(name)) continue;
|
|
170
|
+
// Preserve a previously overlay-supplied profile whose provider matches
|
|
171
|
+
// the resolved default — that's the platform-managed case where the
|
|
172
|
+
// overlay file has already been consumed and archived. Only valid for
|
|
173
|
+
// non-Anthropic resolutions; when the default is Anthropic the daemon
|
|
174
|
+
// owns these names and re-seeds with Anthropic data so a stale openai
|
|
175
|
+
// `balanced` doesn't keep routing through the wrong provider after a
|
|
176
|
+
// re-hatch back to Anthropic.
|
|
177
|
+
const existing = readObject(profiles[name]);
|
|
178
|
+
const existingProvider = readString(existing?.provider);
|
|
179
|
+
if (
|
|
180
|
+
existing !== null &&
|
|
181
|
+
!isAnthropicDefault &&
|
|
182
|
+
existingProvider === resolvedProvider
|
|
183
|
+
) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
profiles[name] = materializeProfile(template, "anthropic");
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (!isAnthropicDefault) {
|
|
190
|
+
for (const [name, template] of Object.entries(CUSTOM_PROFILE_TEMPLATES)) {
|
|
191
|
+
if (preservedProfileNames.has(name)) continue;
|
|
192
|
+
if (readObject(profiles[name]) !== null) continue;
|
|
193
|
+
profiles[name] = materializeProfile(template, resolvedProvider);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const requestedActiveProfile = readString(llm.activeProfile);
|
|
198
|
+
const requestedActiveEntry =
|
|
199
|
+
requestedActiveProfile !== undefined
|
|
200
|
+
? readObject(profiles[requestedActiveProfile])
|
|
201
|
+
: null;
|
|
202
|
+
const requestedActiveExists = requestedActiveEntry !== null;
|
|
203
|
+
const shouldPreserveActiveProfile =
|
|
204
|
+
options.preserveActiveProfile === true && requestedActiveExists;
|
|
205
|
+
|
|
206
|
+
// Decide whether the existing active profile is still appropriate. A managed
|
|
207
|
+
// profile whose provider no longer matches the resolved default goes stale
|
|
208
|
+
// (e.g. re-hatching anthropic→openai leaves `balanced` pointing at anthropic;
|
|
209
|
+
// re-hatching openai→anthropic leaves `custom-balanced` pointing at openai).
|
|
210
|
+
// Either direction should land the user on the new default's `balanced`
|
|
211
|
+
// counterpart rather than routing the main agent to a stale provider.
|
|
212
|
+
// User-created profiles are left alone — those are the user's choice.
|
|
213
|
+
let keepActiveProfile = shouldPreserveActiveProfile;
|
|
214
|
+
if (!keepActiveProfile && requestedActiveExists) {
|
|
215
|
+
const isSeededName = SEEDED_PROFILE_NAMES.has(requestedActiveProfile!);
|
|
216
|
+
const activeProvider = readString(requestedActiveEntry?.provider);
|
|
217
|
+
const managedActiveProviderMismatch =
|
|
218
|
+
isSeededName && activeProvider !== resolvedProvider;
|
|
219
|
+
keepActiveProfile = !managedActiveProviderMismatch;
|
|
84
220
|
}
|
|
85
221
|
|
|
86
|
-
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
llm.activeProfile =
|
|
222
|
+
let activeProfileName: string;
|
|
223
|
+
if (keepActiveProfile) {
|
|
224
|
+
activeProfileName = requestedActiveProfile!;
|
|
225
|
+
} else {
|
|
226
|
+
activeProfileName = isAnthropicDefault ? "balanced" : "custom-balanced";
|
|
227
|
+
llm.activeProfile = activeProfileName;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Sync `llm.default.model` to the active profile's model so the providers
|
|
231
|
+
// registry sees a coherent provider/model pair. Only writes when the on-disk
|
|
232
|
+
// default model is missing or unambiguously belongs to a *different*
|
|
233
|
+
// provider's catalog (e.g. `claude-opus-4-7` paired with `provider: openai`).
|
|
234
|
+
// A user-supplied model not listed in any provider's catalog is preserved —
|
|
235
|
+
// ollama and openrouter expose far more models than `PROVIDER_CATALOG` lists,
|
|
236
|
+
// and silently overwriting `codellama`/`phi3`/etc. on every restart would
|
|
237
|
+
// break those users' configs. Skipped when the overlay owns the active
|
|
238
|
+
// profile (platform mode).
|
|
239
|
+
if (!shouldPreserveActiveProfile) {
|
|
240
|
+
const activeEntry = readObject(profiles[activeProfileName]);
|
|
241
|
+
const activeModel = readString(activeEntry?.model);
|
|
242
|
+
if (activeModel !== undefined) {
|
|
243
|
+
const defaultBlock = (readObject(llm.default) ?? {}) as Record<
|
|
244
|
+
string,
|
|
245
|
+
unknown
|
|
246
|
+
>;
|
|
247
|
+
const currentModel = readString(defaultBlock.model);
|
|
248
|
+
const modelBelongsToOtherProvider =
|
|
249
|
+
currentModel !== undefined &&
|
|
250
|
+
PROVIDER_CATALOG.some(
|
|
251
|
+
(p) =>
|
|
252
|
+
p.id !== resolvedProvider &&
|
|
253
|
+
p.models.some((m) => m.id === currentModel),
|
|
254
|
+
);
|
|
255
|
+
const shouldOverwriteDefaultModel =
|
|
256
|
+
currentModel === undefined || modelBelongsToOtherProvider;
|
|
257
|
+
if (shouldOverwriteDefaultModel) {
|
|
258
|
+
defaultBlock.model = activeModel;
|
|
259
|
+
llm.default = defaultBlock;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
92
262
|
}
|
|
93
263
|
|
|
94
264
|
const profileOrder = Array.isArray(llm.profileOrder)
|
|
95
265
|
? (llm.profileOrder as string[])
|
|
96
266
|
: [];
|
|
97
267
|
const orderSet = new Set(profileOrder);
|
|
98
|
-
|
|
268
|
+
const seededOrder = [
|
|
269
|
+
...Object.keys(ANTHROPIC_PROFILE_TEMPLATES),
|
|
270
|
+
...(isAnthropicDefault ? [] : Object.keys(CUSTOM_PROFILE_TEMPLATES)),
|
|
271
|
+
];
|
|
272
|
+
for (const name of seededOrder) {
|
|
99
273
|
if (!orderSet.has(name)) {
|
|
100
274
|
profileOrder.push(name);
|
|
275
|
+
orderSet.add(name);
|
|
101
276
|
}
|
|
102
277
|
}
|
|
103
278
|
llm.profileOrder = profileOrder;
|
|
@@ -115,3 +290,25 @@ export function seedInferenceProfiles(): void {
|
|
|
115
290
|
|
|
116
291
|
saveRawConfig(config);
|
|
117
292
|
}
|
|
293
|
+
|
|
294
|
+
function materializeProfile(
|
|
295
|
+
template: ManagedProfileTemplate,
|
|
296
|
+
provider: NonNullable<ProfileEntry["provider"]>,
|
|
297
|
+
): ProfileEntry {
|
|
298
|
+
const { intent, ...rest } = template;
|
|
299
|
+
return {
|
|
300
|
+
...rest,
|
|
301
|
+
provider,
|
|
302
|
+
model: resolveModelIntent(provider, intent),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function readObject(value: unknown): Record<string, unknown> | null {
|
|
307
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
308
|
+
? (value as Record<string, unknown>)
|
|
309
|
+
: null;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function readString(value: unknown): string | undefined {
|
|
313
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
314
|
+
}
|
|
@@ -704,31 +704,6 @@ export function mergeContacts(
|
|
|
704
704
|
return getContactInternal(keepId)!;
|
|
705
705
|
}
|
|
706
706
|
|
|
707
|
-
/**
|
|
708
|
-
* Delete a contact by ID. Guardians cannot be deleted as a safety guard.
|
|
709
|
-
* Associated contactChannels and assistantContactMetadata rows are
|
|
710
|
-
* cascade-deleted by the DB schema's onDelete constraints.
|
|
711
|
-
*/
|
|
712
|
-
export function deleteContact(
|
|
713
|
-
contactId: string,
|
|
714
|
-
): "ok" | "not_found" | "is_guardian" {
|
|
715
|
-
const db = getDb();
|
|
716
|
-
|
|
717
|
-
const contact = db
|
|
718
|
-
.select()
|
|
719
|
-
.from(contacts)
|
|
720
|
-
.where(eq(contacts.id, contactId))
|
|
721
|
-
.get();
|
|
722
|
-
|
|
723
|
-
if (!contact) return "not_found";
|
|
724
|
-
if (contact.role === "guardian") return "is_guardian";
|
|
725
|
-
|
|
726
|
-
db.delete(contacts).where(eq(contacts.id, contactId)).run();
|
|
727
|
-
|
|
728
|
-
emitContactChange();
|
|
729
|
-
return "ok";
|
|
730
|
-
}
|
|
731
|
-
|
|
732
707
|
/**
|
|
733
708
|
* Find a contact by a specific channel address. Returns null if not found.
|
|
734
709
|
*/
|
|
@@ -961,19 +936,6 @@ export function updateChannelStatus(
|
|
|
961
936
|
return parseChannel(existing);
|
|
962
937
|
}
|
|
963
938
|
|
|
964
|
-
/**
|
|
965
|
-
* Update the lastSeenAt timestamp on a contact channel by its primary key.
|
|
966
|
-
* Optimized for the hot path — single UPDATE with no prior SELECT.
|
|
967
|
-
*/
|
|
968
|
-
export function updateChannelLastSeenById(channelId: string): void {
|
|
969
|
-
const db = getDb();
|
|
970
|
-
const now = Date.now();
|
|
971
|
-
db.update(contactChannels)
|
|
972
|
-
.set({ lastSeenAt: now, updatedAt: now })
|
|
973
|
-
.where(eq(contactChannels.id, channelId))
|
|
974
|
-
.run();
|
|
975
|
-
}
|
|
976
|
-
|
|
977
939
|
/**
|
|
978
940
|
* Update a guardian contact's principalId and its channel's identity fields.
|
|
979
941
|
* Used for healing guardian binding drift when the JWT principal no longer
|
|
@@ -1037,23 +999,6 @@ export function updateContactPrincipalAndChannel(
|
|
|
1037
999
|
return true;
|
|
1038
1000
|
}
|
|
1039
1001
|
|
|
1040
|
-
/**
|
|
1041
|
-
* Atomically increment interactionCount and set lastInteraction on a contact channel.
|
|
1042
|
-
* Optimized for the hot path — single UPDATE with no prior SELECT.
|
|
1043
|
-
*/
|
|
1044
|
-
export function updateChannelInteraction(channelId: string): void {
|
|
1045
|
-
const db = getDb();
|
|
1046
|
-
const now = Date.now();
|
|
1047
|
-
db.update(contactChannels)
|
|
1048
|
-
.set({
|
|
1049
|
-
lastInteraction: now,
|
|
1050
|
-
interactionCount: sql`${contactChannels.interactionCount} + 1`,
|
|
1051
|
-
updatedAt: now,
|
|
1052
|
-
})
|
|
1053
|
-
.where(eq(contactChannels.id, channelId))
|
|
1054
|
-
.run();
|
|
1055
|
-
}
|
|
1056
|
-
|
|
1057
1002
|
// ── Assistant Contact Metadata ──────────────────────────────────────
|
|
1058
1003
|
|
|
1059
1004
|
function parseAssistantMetadata(
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
import type { ChannelId } from "../channels/types.js";
|
|
10
10
|
import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
|
|
11
|
-
import { getLogger } from "../util/logger.js";
|
|
12
11
|
import { emitContactChange } from "./contact-events.js";
|
|
13
12
|
import {
|
|
14
13
|
findContactChannel,
|
|
@@ -16,8 +15,6 @@ import {
|
|
|
16
15
|
getChannelById,
|
|
17
16
|
getContact,
|
|
18
17
|
getContactInternal,
|
|
19
|
-
updateChannelInteraction,
|
|
20
|
-
updateChannelLastSeenById,
|
|
21
18
|
updateChannelStatus,
|
|
22
19
|
upsertContact,
|
|
23
20
|
} from "./contact-store.js";
|
|
@@ -28,7 +25,6 @@ import type {
|
|
|
28
25
|
ContactWriteResult,
|
|
29
26
|
} from "./types.js";
|
|
30
27
|
|
|
31
|
-
const log = getLogger("contacts-write");
|
|
32
28
|
|
|
33
29
|
// ── Guardian operations ──────────────────────────────────────────────
|
|
34
30
|
|
|
@@ -179,26 +175,3 @@ export function revokeMember(
|
|
|
179
175
|
return { contact, channel: updatedChannel };
|
|
180
176
|
}
|
|
181
177
|
|
|
182
|
-
/**
|
|
183
|
-
* Update the lastSeenAt timestamp on a contact channel by its ID.
|
|
184
|
-
* Expects a plain channel UUID (ContactChannel.id), not the composite API ID.
|
|
185
|
-
*/
|
|
186
|
-
export function touchChannelLastSeen(channelId: string): void {
|
|
187
|
-
try {
|
|
188
|
-
updateChannelLastSeenById(channelId);
|
|
189
|
-
} catch (err) {
|
|
190
|
-
log.warn({ err }, "Failed to update channel lastSeenAt");
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Track an interaction on the specific channel that received it.
|
|
196
|
-
* Swallows errors to avoid disrupting the inbound message hot path.
|
|
197
|
-
*/
|
|
198
|
-
export function touchContactInteraction(channelId: string): void {
|
|
199
|
-
try {
|
|
200
|
-
updateChannelInteraction(channelId);
|
|
201
|
-
} catch (err) {
|
|
202
|
-
log.warn({ err }, "Failed to update channel interaction stats");
|
|
203
|
-
}
|
|
204
|
-
}
|
|
@@ -22,8 +22,7 @@ import { truncateToolResultsAcrossHistory } from "./tool-result-truncation.js";
|
|
|
22
22
|
const log = getLogger("context-window");
|
|
23
23
|
|
|
24
24
|
export const CONTEXT_SUMMARY_MARKER = "<context_summary>";
|
|
25
|
-
|
|
26
|
-
"conversationSummarization";
|
|
25
|
+
const CONVERSATION_SUMMARY_CALL_SITE: LLMCallSite = "conversationSummarization";
|
|
27
26
|
const MAX_BLOCK_PREVIEW_CHARS = 3000;
|
|
28
27
|
const MAX_FALLBACK_SUMMARY_CHARS = 12000;
|
|
29
28
|
const COMPACTION_COOLDOWN_MS = 2 * 60 * 1000;
|
|
@@ -28,12 +28,12 @@ export const CES_SECURE_INSTALL_FLAG_KEY = "ces-secure-install" as const;
|
|
|
28
28
|
/** Gate for credential grant and audit inspection surfaces. */
|
|
29
29
|
export const CES_GRANT_AUDIT_FLAG_KEY = "ces-grant-audit" as const;
|
|
30
30
|
|
|
31
|
-
/** Gate for managed sidecar transport in containerized environments. */
|
|
32
|
-
export const CES_MANAGED_SIDECAR_FLAG_KEY = "ces-managed-sidecar" as const;
|
|
33
|
-
|
|
34
31
|
/** Gate for routing credential reads/writes through the CES process. */
|
|
35
32
|
const CES_CREDENTIAL_BACKEND_FLAG_KEY = "ces-credential-backend" as const;
|
|
36
33
|
|
|
34
|
+
/** Gate for managed sidecar transport in containerized environments. */
|
|
35
|
+
export const CES_MANAGED_SIDECAR_FLAG_KEY = "ces-managed-sidecar" as const;
|
|
36
|
+
|
|
37
37
|
// ---------------------------------------------------------------------------
|
|
38
38
|
// Public API — predicate functions
|
|
39
39
|
// ---------------------------------------------------------------------------
|
|
@@ -66,13 +66,6 @@ export function isCesGrantAuditEnabled(config: AssistantConfig): boolean {
|
|
|
66
66
|
return isAssistantFeatureFlagEnabled(CES_GRANT_AUDIT_FLAG_KEY, config);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
/**
|
|
70
|
-
* Whether managed sidecar transport should be used for CES communication.
|
|
71
|
-
*/
|
|
72
|
-
export function isCesManagedSidecarEnabled(config: AssistantConfig): boolean {
|
|
73
|
-
return isAssistantFeatureFlagEnabled(CES_MANAGED_SIDECAR_FLAG_KEY, config);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
69
|
/**
|
|
77
70
|
* Whether credential reads and writes should be routed through the CES process.
|
|
78
71
|
*/
|
|
@@ -81,3 +74,10 @@ export function isCesCredentialBackendEnabled(
|
|
|
81
74
|
): boolean {
|
|
82
75
|
return isAssistantFeatureFlagEnabled(CES_CREDENTIAL_BACKEND_FLAG_KEY, config);
|
|
83
76
|
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Whether managed sidecar transport should be used for CES communication.
|
|
80
|
+
*/
|
|
81
|
+
export function isCesManagedSidecarEnabled(config: AssistantConfig): boolean {
|
|
82
|
+
return isAssistantFeatureFlagEnabled(CES_MANAGED_SIDECAR_FLAG_KEY, config);
|
|
83
|
+
}
|