@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
|
@@ -151,8 +151,11 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
151
151
|
{ endpoint: "confirm", scopes: ["approval.write"] },
|
|
152
152
|
{ endpoint: "secret", scopes: ["approval.write"] },
|
|
153
153
|
{ endpoint: "trust-rules", scopes: ["approval.write"] },
|
|
154
|
+
{ endpoint: "host-app-control-result", scopes: ["approval.write"] },
|
|
154
155
|
{ endpoint: "host-bash-result", scopes: ["approval.write"] },
|
|
155
156
|
{ endpoint: "host-browser-result", scopes: ["approval.write"] },
|
|
157
|
+
{ endpoint: "host-browser-event", scopes: ["approval.write"] },
|
|
158
|
+
{ endpoint: "host-browser-session-invalidated", scopes: ["approval.write"] },
|
|
156
159
|
{ endpoint: "host-cu-result", scopes: ["approval.write"] },
|
|
157
160
|
{ endpoint: "host-file-result", scopes: ["approval.write"] },
|
|
158
161
|
{ endpoint: "host-transfer-result", scopes: ["approval.write"] },
|
|
@@ -183,6 +186,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
183
186
|
{ endpoint: "calls/instruction", scopes: ["calls.write"] },
|
|
184
187
|
|
|
185
188
|
// Settings / integrations / identity
|
|
189
|
+
{ endpoint: "disk-pressure/status", scopes: ["settings.read"] },
|
|
190
|
+
{ endpoint: "disk-pressure/acknowledge", scopes: ["settings.write"] },
|
|
191
|
+
{ endpoint: "disk-pressure/override", scopes: ["settings.write"] },
|
|
186
192
|
{ endpoint: "ps", scopes: ["settings.read"] },
|
|
187
193
|
{ endpoint: "identity", scopes: ["settings.read"] },
|
|
188
194
|
{ endpoint: "identity/intro", scopes: ["settings.read"] },
|
|
@@ -204,6 +210,8 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
204
210
|
{ endpoint: "contacts/invites:POST", scopes: ["settings.write"] },
|
|
205
211
|
{ endpoint: "contacts/invites/redeem", scopes: ["settings.write"] },
|
|
206
212
|
{ endpoint: "contacts/invites:DELETE", scopes: ["settings.write"] },
|
|
213
|
+
{ endpoint: "contacts/prompt:POST", scopes: ["settings.write"] },
|
|
214
|
+
{ endpoint: "resolve_contact_prompt:POST", scopes: ["settings.write"] },
|
|
207
215
|
{ endpoint: "integrations/telegram/config", scopes: ["settings.read"] },
|
|
208
216
|
{ endpoint: "integrations/telegram/config:POST", scopes: ["settings.write"] },
|
|
209
217
|
{
|
|
@@ -322,6 +330,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
322
330
|
{ endpoint: "clients", scopes: ["settings.read"] },
|
|
323
331
|
{ endpoint: "clients/disconnect", scopes: ["settings.write"] },
|
|
324
332
|
{ endpoint: "debug", scopes: ["settings.read"] },
|
|
333
|
+
{ endpoint: "debug/bash", scopes: ["settings.write"] },
|
|
325
334
|
|
|
326
335
|
// Workspace file browsing
|
|
327
336
|
{ endpoint: "workspace/tree", scopes: ["settings.read"] },
|
|
@@ -422,7 +431,16 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
422
431
|
{ endpoint: "memory-items:DELETE", scopes: ["settings.write"] },
|
|
423
432
|
{ endpoint: "memory/v2/backfill:POST", scopes: ["settings.write"] },
|
|
424
433
|
{ endpoint: "memory/v2/validate:POST", scopes: ["settings.read"] },
|
|
434
|
+
{ endpoint: "memory/v2/concept-page:POST", scopes: ["settings.read"] },
|
|
425
435
|
{ endpoint: "memory/v2/reembed-skills:POST", scopes: ["settings.write"] },
|
|
436
|
+
{ endpoint: "memory/v2/explain-similarity:POST", scopes: ["settings.read"] },
|
|
437
|
+
{ endpoint: "memory/v2/fit-anisotropy:POST", scopes: ["settings.write"] },
|
|
438
|
+
{
|
|
439
|
+
endpoint: "memory/v2/rebuild-corpus-stats:POST",
|
|
440
|
+
scopes: ["settings.write"],
|
|
441
|
+
},
|
|
442
|
+
{ endpoint: "memory/v2/concept-frequency:POST", scopes: ["settings.read"] },
|
|
443
|
+
{ endpoint: "memory/v2/fit-anisotropy:POST", scopes: ["settings.write"] },
|
|
426
444
|
|
|
427
445
|
// Trust rule listing
|
|
428
446
|
{ endpoint: "trust-rules/manage:GET", scopes: ["settings.read"] },
|
|
@@ -490,6 +508,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
|
|
|
490
508
|
{ endpoint: "consolidation", scopes: ["settings.read"] },
|
|
491
509
|
{ endpoint: "consolidation:POST", scopes: ["settings.write"] },
|
|
492
510
|
|
|
511
|
+
// Gateway log proxy
|
|
512
|
+
{ endpoint: "gateway/logs/tail", scopes: ["settings.read"] },
|
|
513
|
+
|
|
493
514
|
// Heartbeat (config, runs, checklist — all share the "heartbeat" policyKey)
|
|
494
515
|
{ endpoint: "heartbeat:GET", scopes: ["settings.read"] },
|
|
495
516
|
{ endpoint: "heartbeat", scopes: ["settings.write"] },
|
|
@@ -551,6 +572,12 @@ registerPolicy("conversations/clear-all", {
|
|
|
551
572
|
allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "local"],
|
|
552
573
|
});
|
|
553
574
|
|
|
575
|
+
// Event emission: gateway-only internal notification
|
|
576
|
+
registerPolicy("events/emit", {
|
|
577
|
+
requiredScopes: ["internal.write"],
|
|
578
|
+
allowedPrincipalTypes: ["svc_gateway"],
|
|
579
|
+
});
|
|
580
|
+
|
|
554
581
|
// Channel inbound: gateway-only
|
|
555
582
|
registerPolicy("channels/inbound", {
|
|
556
583
|
requiredScopes: ["ingress.write"],
|
|
@@ -563,6 +590,11 @@ const INTERNAL_ENDPOINTS = [
|
|
|
563
590
|
"internal/twilio/status",
|
|
564
591
|
"internal/twilio/connect-action",
|
|
565
592
|
"internal/oauth/callback",
|
|
593
|
+
"internal/mcp/auth/start",
|
|
594
|
+
"internal/mcp/auth/status",
|
|
595
|
+
"internal/mcp/reload", // ← new
|
|
596
|
+
"internal/oauth/connect/start",
|
|
597
|
+
"internal/oauth/connect/status",
|
|
566
598
|
];
|
|
567
599
|
for (const endpoint of INTERNAL_ENDPOINTS) {
|
|
568
600
|
registerPolicy(endpoint, {
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Same-actor (same-user) binding check used by host proxies and result
|
|
3
|
+
* routes.
|
|
4
|
+
*
|
|
5
|
+
* Verifies that the submitting (source) actor's principal id matches the
|
|
6
|
+
* actor principal id captured for the target client at SSE subscription
|
|
7
|
+
* time. This is the authoritative gate that prevents cross-user
|
|
8
|
+
* execution and cross-user result submission across all three host-proxy
|
|
9
|
+
* capabilities (host_bash, host_file, host_cu).
|
|
10
|
+
*
|
|
11
|
+
* Two entry points map onto the two control-flow styles in the codebase:
|
|
12
|
+
* - {@link enforceSameActorOrErrorResult} for proxies — returns a
|
|
13
|
+
* tool-execution error result on rejection, `null` on success.
|
|
14
|
+
* - {@link enforceSameActorOrThrow} for HTTP/IPC route handlers —
|
|
15
|
+
* throws {@link ForbiddenError} on rejection so the route adapter
|
|
16
|
+
* maps it to HTTP 403.
|
|
17
|
+
*
|
|
18
|
+
* Both paths log a single structured warn line on rejection with the
|
|
19
|
+
* shape `{ sourceActorPrincipalId, targetClientId, targetActorPrincipalId,
|
|
20
|
+
* op, reason }` so that bash, file, and CU rejections render identically
|
|
21
|
+
* in the audit log.
|
|
22
|
+
*/
|
|
23
|
+
import type { HostProxyCapability } from "../../channels/types.js";
|
|
24
|
+
import { getLogger } from "../../util/logger.js";
|
|
25
|
+
import type { AssistantEventHub } from "../assistant-event-hub.js";
|
|
26
|
+
import { ForbiddenError } from "../routes/errors.js";
|
|
27
|
+
|
|
28
|
+
const log = getLogger("same-actor");
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Canonical user-facing rejection message. Used by both the proxy and
|
|
32
|
+
* route paths so operators and auditors see identical wording regardless
|
|
33
|
+
* of whether the failure surfaced as a tool-execution result or an HTTP
|
|
34
|
+
* 403.
|
|
35
|
+
*/
|
|
36
|
+
const REJECTION_MESSAGE =
|
|
37
|
+
"Submitting actor does not match the target client's actor for this request. The targeted client's authenticated user must submit the result.";
|
|
38
|
+
|
|
39
|
+
/** OpenAPI 403 description for `*-result` endpoints, kept identical. */
|
|
40
|
+
export const SAME_ACTOR_FORBIDDEN_DESCRIPTION =
|
|
41
|
+
"Submitting client does not match the targeted client, or the submitting actor's principal does not match the target client's actor.";
|
|
42
|
+
|
|
43
|
+
/** Per-capability scope for the structured warn log entry. */
|
|
44
|
+
export type SameActorOp =
|
|
45
|
+
| "host_bash"
|
|
46
|
+
| "host_file"
|
|
47
|
+
| "host_cu"
|
|
48
|
+
| "host_transfer";
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Args for the live-lookup variant: caller supplies the hub + target client
|
|
52
|
+
* id, and the helper looks up the target's actor principal in real time.
|
|
53
|
+
* Used at proxy request time (registration), where the SSE subscription is
|
|
54
|
+
* present by definition.
|
|
55
|
+
*/
|
|
56
|
+
export interface SameActorLiveArgs {
|
|
57
|
+
hub: Pick<AssistantEventHub, "getActorPrincipalIdForClient">;
|
|
58
|
+
sourceActorPrincipalId: string | undefined;
|
|
59
|
+
targetClientId: string;
|
|
60
|
+
op: SameActorOp;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Args for the persisted-value variant: caller supplies a target actor
|
|
65
|
+
* principal id captured at registration time. Used at result-submission
|
|
66
|
+
* time, where the SSE subscription may have briefly disconnected and the
|
|
67
|
+
* live hub lookup would falsely 403 a legitimate result.
|
|
68
|
+
*/
|
|
69
|
+
export interface SameActorPersistedArgs {
|
|
70
|
+
sourceActorPrincipalId: string | undefined;
|
|
71
|
+
targetActorPrincipalId: string | undefined;
|
|
72
|
+
targetClientId: string;
|
|
73
|
+
op: SameActorOp;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export type SameActorArgs = SameActorLiveArgs;
|
|
77
|
+
|
|
78
|
+
type RejectionReason = "missing_source" | "missing_target" | "mismatch";
|
|
79
|
+
|
|
80
|
+
function isLive(
|
|
81
|
+
args: SameActorLiveArgs | SameActorPersistedArgs,
|
|
82
|
+
): args is SameActorLiveArgs {
|
|
83
|
+
return (args as SameActorLiveArgs).hub != null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Internal: returns the rejection reason or `undefined` when the source
|
|
88
|
+
* matches the target. Always logs on rejection so all callers share the
|
|
89
|
+
* same audit shape.
|
|
90
|
+
*/
|
|
91
|
+
function detectRejection(
|
|
92
|
+
args: SameActorLiveArgs | SameActorPersistedArgs,
|
|
93
|
+
): RejectionReason | undefined {
|
|
94
|
+
const { sourceActorPrincipalId, targetClientId, op } = args;
|
|
95
|
+
const targetActorPrincipalId = isLive(args)
|
|
96
|
+
? args.hub.getActorPrincipalIdForClient(targetClientId)
|
|
97
|
+
: args.targetActorPrincipalId;
|
|
98
|
+
|
|
99
|
+
let reason: RejectionReason | undefined;
|
|
100
|
+
if (sourceActorPrincipalId == null) {
|
|
101
|
+
reason = "missing_source";
|
|
102
|
+
} else if (targetActorPrincipalId == null) {
|
|
103
|
+
reason = "missing_target";
|
|
104
|
+
} else if (sourceActorPrincipalId !== targetActorPrincipalId) {
|
|
105
|
+
reason = "mismatch";
|
|
106
|
+
}
|
|
107
|
+
if (reason == null) return undefined;
|
|
108
|
+
|
|
109
|
+
log.warn(
|
|
110
|
+
{
|
|
111
|
+
sourceActorPrincipalId,
|
|
112
|
+
targetClientId,
|
|
113
|
+
targetActorPrincipalId,
|
|
114
|
+
op,
|
|
115
|
+
reason,
|
|
116
|
+
},
|
|
117
|
+
"Rejecting cross-user host proxy request",
|
|
118
|
+
);
|
|
119
|
+
return reason;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Route-flavored variant: throws {@link ForbiddenError} on rejection so
|
|
124
|
+
* the existing route adapter maps it to HTTP 403. Returns void on
|
|
125
|
+
* success.
|
|
126
|
+
*
|
|
127
|
+
* Accepts EITHER {@link SameActorLiveArgs} (live hub lookup, used at
|
|
128
|
+
* proxy registration time) OR {@link SameActorPersistedArgs} (compare
|
|
129
|
+
* against a value captured earlier, used at result-submission time so a
|
|
130
|
+
* brief SSE reconnect doesn't 403 a legitimate result).
|
|
131
|
+
*/
|
|
132
|
+
export function enforceSameActorOrThrow(
|
|
133
|
+
args: SameActorLiveArgs | SameActorPersistedArgs,
|
|
134
|
+
): void {
|
|
135
|
+
if (detectRejection(args) != null) {
|
|
136
|
+
throw new ForbiddenError(REJECTION_MESSAGE);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Proxy-flavored variant: returns a tool-execution-shaped error result
|
|
142
|
+
* on rejection (so the proxy can pass it directly back to the agent),
|
|
143
|
+
* or `null` on success. Always uses the live hub lookup — proxy
|
|
144
|
+
* registration runs while the target SSE subscription is active.
|
|
145
|
+
*/
|
|
146
|
+
export function enforceSameActorOrErrorResult(
|
|
147
|
+
args: SameActorLiveArgs,
|
|
148
|
+
): { content: string; isError: true } | null {
|
|
149
|
+
if (detectRejection(args) == null) return null;
|
|
150
|
+
return { content: REJECTION_MESSAGE, isError: true };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Result of attempting to auto-resolve a single same-user target client.
|
|
155
|
+
*
|
|
156
|
+
* - `match`: exactly one same-user client supports the capability. Use the
|
|
157
|
+
* returned clientId.
|
|
158
|
+
* - `none`: no same-user client supports the capability. Caller's choice
|
|
159
|
+
* how to handle (typically: fall through to no-target, which broadcasts
|
|
160
|
+
* to nobody when no clients are connected).
|
|
161
|
+
* - `ambiguous`: more than one same-user client supports the capability.
|
|
162
|
+
* Caller MUST refuse to silently broadcast across them; instead surface
|
|
163
|
+
* an error asking the caller to specify `target_client_id`.
|
|
164
|
+
*/
|
|
165
|
+
export type AutoResolveResult =
|
|
166
|
+
| { kind: "match"; clientId: string }
|
|
167
|
+
| { kind: "none" }
|
|
168
|
+
| { kind: "ambiguous" };
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Filter capable clients by `actorPrincipalId === sourcePrincipalId` and
|
|
172
|
+
* report whether exactly one matched, zero matched, or more than one
|
|
173
|
+
* matched.
|
|
174
|
+
*
|
|
175
|
+
* Used by host proxies to auto-resolve a target client when the caller
|
|
176
|
+
* did not specify one. Skipping when the caller has no principal keeps
|
|
177
|
+
* the same-user binding closed: an unauthenticated caller cannot
|
|
178
|
+
* piggyback on a connected user's session.
|
|
179
|
+
*
|
|
180
|
+
* Why three outcomes (vs. just `string | undefined`)? Earlier revisions
|
|
181
|
+
* collapsed `none` and `ambiguous` into `undefined`, which caused the
|
|
182
|
+
* proxy to fall through to an untargeted broadcast — fanning a single
|
|
183
|
+
* targeted-style request out across every same-user machine. Surfacing
|
|
184
|
+
* `ambiguous` separately lets the proxy reject with a clear "specify
|
|
185
|
+
* target_client_id" error instead.
|
|
186
|
+
*/
|
|
187
|
+
export function pickSameUserAutoResolve(args: {
|
|
188
|
+
hub: Pick<AssistantEventHub, "listClientsByCapability">;
|
|
189
|
+
capability: HostProxyCapability;
|
|
190
|
+
sourceActorPrincipalId: string | undefined;
|
|
191
|
+
}): AutoResolveResult {
|
|
192
|
+
const { hub, capability, sourceActorPrincipalId } = args;
|
|
193
|
+
if (sourceActorPrincipalId == null) return { kind: "none" };
|
|
194
|
+
const sameUser = hub
|
|
195
|
+
.listClientsByCapability(capability)
|
|
196
|
+
.filter((c) => c.actorPrincipalId === sourceActorPrincipalId);
|
|
197
|
+
if (sameUser.length === 0) return { kind: "none" };
|
|
198
|
+
if (sameUser.length === 1) {
|
|
199
|
+
return { kind: "match", clientId: sameUser[0].clientId };
|
|
200
|
+
}
|
|
201
|
+
return { kind: "ambiguous" };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Standard error result for proxies when {@link pickSameUserAutoResolve}
|
|
206
|
+
* returns `ambiguous`. Asks the caller to specify `target_client_id`.
|
|
207
|
+
*/
|
|
208
|
+
export function ambiguousSameUserError(capability: HostProxyCapability): {
|
|
209
|
+
content: string;
|
|
210
|
+
isError: true;
|
|
211
|
+
} {
|
|
212
|
+
return {
|
|
213
|
+
content: `Multiple ${capability} clients are connected for this user. Specify target_client_id to disambiguate. Run \`assistant clients list --capability ${capability}\` to see client IDs.`,
|
|
214
|
+
isError: true,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
2
|
-
import { buildToolDefinitions } from "../daemon/conversation-tool-setup.js";
|
|
3
2
|
import { buildSystemPrompt } from "../prompts/system-prompt.js";
|
|
4
3
|
import {
|
|
5
4
|
createTimeout,
|
|
@@ -27,7 +26,7 @@ export interface RunBtwSidechainParams {
|
|
|
27
26
|
provider?: Provider;
|
|
28
27
|
messages?: Message[];
|
|
29
28
|
systemPrompt?: string;
|
|
30
|
-
tools
|
|
29
|
+
tools: ToolDefinition[];
|
|
31
30
|
maxTokens?: number;
|
|
32
31
|
/**
|
|
33
32
|
* Unified call-site identifier. The provider layer resolves
|
|
@@ -68,7 +67,7 @@ export async function runBtwSidechain(
|
|
|
68
67
|
throw new Error("BTW side-chain requires a provider");
|
|
69
68
|
}
|
|
70
69
|
|
|
71
|
-
const tools = params.tools
|
|
70
|
+
const tools = params.tools;
|
|
72
71
|
const history = params.messages ?? params.conversation?.getMessages() ?? [];
|
|
73
72
|
const messages = [...history, userMessage(trimmedContent)];
|
|
74
73
|
const systemPrompt =
|
|
@@ -20,57 +20,11 @@ import { slackInviteAdapter } from "./channel-invite-transports/slack.js";
|
|
|
20
20
|
import { telegramInviteAdapter } from "./channel-invite-transports/telegram.js";
|
|
21
21
|
import { voiceInviteAdapter } from "./channel-invite-transports/voice.js";
|
|
22
22
|
import { whatsappInviteAdapter } from "./channel-invite-transports/whatsapp.js";
|
|
23
|
-
|
|
24
23
|
// ---------------------------------------------------------------------------
|
|
25
24
|
// Types
|
|
26
25
|
// ---------------------------------------------------------------------------
|
|
27
|
-
|
|
28
|
-
export
|
|
29
|
-
/** The full URL the recipient can open to redeem the invite. */
|
|
30
|
-
url: string;
|
|
31
|
-
/** Human-readable text suitable for display alongside the link. */
|
|
32
|
-
displayText: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface ChannelInviteAdapter {
|
|
36
|
-
/** The channel this adapter handles. */
|
|
37
|
-
channel: ChannelId;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Build a channel-specific shareable link (e.g. Telegram deep link).
|
|
41
|
-
* Optional — not all channels support link-based invites.
|
|
42
|
-
*/
|
|
43
|
-
buildShareLink?(params: {
|
|
44
|
-
rawToken: string;
|
|
45
|
-
sourceChannel: ChannelId;
|
|
46
|
-
}): InviteShareLink;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Extract a channel-specific invite token from an inbound message
|
|
50
|
-
* (e.g. Telegram `/start iv_<token>`). Optional — only needed for
|
|
51
|
-
* channels with link-based invites.
|
|
52
|
-
*/
|
|
53
|
-
extractInboundToken?(params: {
|
|
54
|
-
commandIntent?: Record<string, unknown>;
|
|
55
|
-
content: string;
|
|
56
|
-
sourceMetadata?: Record<string, unknown>;
|
|
57
|
-
}): string | undefined;
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Resolve the channel-specific handle to reach the assistant (e.g.
|
|
61
|
-
* "@botName", "+15551234567", "hello@vellum.me").
|
|
62
|
-
* Returns `undefined` when the handle cannot be resolved (e.g.
|
|
63
|
-
* credentials not yet configured).
|
|
64
|
-
*/
|
|
65
|
-
resolveChannelHandle?(): string | undefined;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Async variant of `resolveChannelHandle` for adapters that need to
|
|
69
|
-
* perform I/O (e.g. querying a provider API for the assigned address).
|
|
70
|
-
* When both are present, `resolveAdapterHandle()` prefers this method.
|
|
71
|
-
*/
|
|
72
|
-
resolveChannelHandleAsync?(): Promise<string | undefined>;
|
|
73
|
-
}
|
|
26
|
+
import type { ChannelInviteAdapter } from "./channel-invite-types.js";
|
|
27
|
+
export type { ChannelInviteAdapter, InviteShareLink } from "./channel-invite-types.js";
|
|
74
28
|
|
|
75
29
|
// ---------------------------------------------------------------------------
|
|
76
30
|
// Registry
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { getNestedValue, loadRawConfig } from "../../config/loader.js";
|
|
15
|
-
import type { ChannelInviteAdapter } from "../channel-invite-
|
|
15
|
+
import type { ChannelInviteAdapter } from "../channel-invite-types.js";
|
|
16
16
|
|
|
17
17
|
// ---------------------------------------------------------------------------
|
|
18
18
|
// Adapter implementation
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import type { ChannelId } from "../../channels/types.js";
|
|
11
11
|
import { getConfig } from "../../config/loader.js";
|
|
12
|
-
import type { ChannelInviteAdapter } from "../channel-invite-
|
|
12
|
+
import type { ChannelInviteAdapter } from "../channel-invite-types.js";
|
|
13
13
|
|
|
14
14
|
// ---------------------------------------------------------------------------
|
|
15
15
|
// Slack bot info resolution
|
|
@@ -26,7 +26,7 @@ import { getLogger } from "../../util/logger.js";
|
|
|
26
26
|
import type {
|
|
27
27
|
ChannelInviteAdapter,
|
|
28
28
|
InviteShareLink,
|
|
29
|
-
} from "../channel-invite-
|
|
29
|
+
} from "../channel-invite-types.js";
|
|
30
30
|
|
|
31
31
|
// ---------------------------------------------------------------------------
|
|
32
32
|
// Bot username resolution
|
|
@@ -15,7 +15,7 @@ import type { ChannelId } from "../../channels/types.js";
|
|
|
15
15
|
import type {
|
|
16
16
|
ChannelInviteAdapter,
|
|
17
17
|
InviteShareLink,
|
|
18
|
-
} from "../channel-invite-
|
|
18
|
+
} from "../channel-invite-types.js";
|
|
19
19
|
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
21
|
// Adapter implementation
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import type { ChannelId } from "../../channels/types.js";
|
|
12
12
|
import { getConfig } from "../../config/loader.js";
|
|
13
|
-
import type { ChannelInviteAdapter } from "../channel-invite-
|
|
13
|
+
import type { ChannelInviteAdapter } from "../channel-invite-types.js";
|
|
14
14
|
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
// Phone number resolution
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types extracted from channel-invite-transport.ts to break the
|
|
3
|
+
* transport ↔ channel-invite-transports/* cycles (×5).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ChannelId } from "../channels/types.js";
|
|
7
|
+
|
|
8
|
+
export interface InviteShareLink {
|
|
9
|
+
/** The full URL the recipient can open to redeem the invite. */
|
|
10
|
+
url: string;
|
|
11
|
+
/** Human-readable text suitable for display alongside the link. */
|
|
12
|
+
displayText: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ChannelInviteAdapter {
|
|
16
|
+
/** The channel this adapter handles. */
|
|
17
|
+
channel: ChannelId;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Build a channel-specific shareable link (e.g. Telegram deep link).
|
|
21
|
+
* Optional — not all channels support link-based invites.
|
|
22
|
+
*/
|
|
23
|
+
buildShareLink?(params: {
|
|
24
|
+
rawToken: string;
|
|
25
|
+
sourceChannel: ChannelId;
|
|
26
|
+
}): InviteShareLink;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Extract a channel-specific invite token from an inbound message
|
|
30
|
+
* (e.g. Telegram `/start iv_<token>`). Optional — only needed for
|
|
31
|
+
* channels with link-based invites.
|
|
32
|
+
*/
|
|
33
|
+
extractInboundToken?(params: {
|
|
34
|
+
commandIntent?: Record<string, unknown>;
|
|
35
|
+
content: string;
|
|
36
|
+
sourceMetadata?: Record<string, unknown>;
|
|
37
|
+
}): string | undefined;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the channel-specific handle to reach the assistant (e.g.
|
|
41
|
+
* // generic-examples:ignore-next-line — reason: illustrative docstring examples, not real data
|
|
42
|
+
* "@botName", "+15551234567", "hello@vellum.me").
|
|
43
|
+
* Returns `undefined` when the handle cannot be resolved (e.g.
|
|
44
|
+
* credentials not yet configured).
|
|
45
|
+
*/
|
|
46
|
+
resolveChannelHandle?(): string | undefined;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Async variant of `resolveChannelHandle` for adapters that need to
|
|
50
|
+
* perform I/O (e.g. querying a provider API for the assigned address).
|
|
51
|
+
* When both are present, `resolveAdapterHandle()` prefers this method.
|
|
52
|
+
*/
|
|
53
|
+
resolveChannelHandleAsync?(): Promise<string | undefined>;
|
|
54
|
+
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizePublicBaseUrl,
|
|
3
|
+
resolveTwilioPublicBaseUrl,
|
|
4
|
+
} from "@vellumai/service-contracts/twilio-ingress";
|
|
5
|
+
|
|
1
6
|
import { resolveTwilioPhoneNumber } from "../calls/twilio-config.js";
|
|
2
7
|
import { hasTwilioCredentials } from "../calls/twilio-rest.js";
|
|
3
8
|
import { getChannelInvitePolicy } from "../channels/config.js";
|
|
@@ -19,31 +24,35 @@ import type {
|
|
|
19
24
|
/** Remote check results are cached for 5 minutes before being considered stale. */
|
|
20
25
|
export const REMOTE_TTL_MS = 5 * 60 * 1000;
|
|
21
26
|
|
|
22
|
-
function hasIngressConfigured(): boolean {
|
|
27
|
+
function hasIngressConfigured(options: { twilio?: boolean } = {}): boolean {
|
|
23
28
|
try {
|
|
24
29
|
const raw = loadRawConfig();
|
|
25
30
|
const ingress = (raw?.ingress ?? {}) as Record<string, unknown>;
|
|
26
|
-
const
|
|
31
|
+
const effectiveBaseUrl = options.twilio
|
|
32
|
+
? (resolveTwilioPublicBaseUrl(ingress) ?? "")
|
|
33
|
+
: (normalizePublicBaseUrl(ingress.publicBaseUrl) ?? "");
|
|
27
34
|
const enabled =
|
|
28
35
|
(ingress.enabled as boolean | undefined) ??
|
|
29
|
-
(
|
|
30
|
-
return enabled &&
|
|
36
|
+
(effectiveBaseUrl ? true : false);
|
|
37
|
+
return enabled && effectiveBaseUrl.trim().length > 0;
|
|
31
38
|
} catch {
|
|
32
39
|
return false;
|
|
33
40
|
}
|
|
34
41
|
}
|
|
35
42
|
|
|
36
|
-
function hasWebhookRoutingConfigured(
|
|
43
|
+
function hasWebhookRoutingConfigured(
|
|
44
|
+
allowManagedCallbacks = false,
|
|
45
|
+
options: { twilio?: boolean } = {},
|
|
46
|
+
): {
|
|
37
47
|
configured: boolean;
|
|
38
48
|
usesManagedCallbacks: boolean;
|
|
39
49
|
} {
|
|
40
|
-
const ingressConfigured = hasIngressConfigured();
|
|
50
|
+
const ingressConfigured = hasIngressConfigured(options);
|
|
41
51
|
if (ingressConfigured) {
|
|
42
52
|
return { configured: true, usesManagedCallbacks: false };
|
|
43
53
|
}
|
|
44
54
|
|
|
45
|
-
const usesManagedCallbacks =
|
|
46
|
-
allowManagedCallbacks && getIsPlatform();
|
|
55
|
+
const usesManagedCallbacks = allowManagedCallbacks && getIsPlatform();
|
|
47
56
|
return {
|
|
48
57
|
configured: usesManagedCallbacks,
|
|
49
58
|
usesManagedCallbacks,
|
|
@@ -79,19 +88,29 @@ async function checkCredential(
|
|
|
79
88
|
}
|
|
80
89
|
|
|
81
90
|
/** Check that public ingress is configured and enabled. */
|
|
82
|
-
function checkIngress(
|
|
91
|
+
function checkIngress(
|
|
92
|
+
allowManagedCallbacks = false,
|
|
93
|
+
options: { twilio?: boolean } = {},
|
|
94
|
+
): ReadinessCheckResult {
|
|
83
95
|
const { configured, usesManagedCallbacks } = hasWebhookRoutingConfigured(
|
|
84
96
|
allowManagedCallbacks,
|
|
97
|
+
options,
|
|
85
98
|
);
|
|
86
99
|
return check(
|
|
87
100
|
"ingress",
|
|
88
101
|
configured,
|
|
89
102
|
usesManagedCallbacks
|
|
90
103
|
? "Managed platform callback routing is configured"
|
|
91
|
-
:
|
|
104
|
+
: options.twilio
|
|
105
|
+
? "Twilio public ingress URL is configured"
|
|
106
|
+
: "Public ingress URL is configured",
|
|
92
107
|
allowManagedCallbacks
|
|
93
|
-
?
|
|
94
|
-
|
|
108
|
+
? options.twilio
|
|
109
|
+
? "No Twilio public ingress URL or managed callback route is configured"
|
|
110
|
+
: "No public ingress URL or managed callback route is configured"
|
|
111
|
+
: options.twilio
|
|
112
|
+
? "Twilio public ingress URL is not configured or disabled"
|
|
113
|
+
: "Public ingress URL is not configured or disabled",
|
|
95
114
|
);
|
|
96
115
|
}
|
|
97
116
|
|
|
@@ -102,7 +121,7 @@ const voiceProbe: ChannelProbe = {
|
|
|
102
121
|
async runLocalChecks(): Promise<ReadinessCheckResult[]> {
|
|
103
122
|
const hasCreds = await hasTwilioCredentials();
|
|
104
123
|
const hasPhone = !!resolveTwilioPhoneNumber();
|
|
105
|
-
const ingress = checkIngress(true);
|
|
124
|
+
const ingress = checkIngress(true, { twilio: true });
|
|
106
125
|
|
|
107
126
|
return [
|
|
108
127
|
check(
|