@vellumai/assistant 0.6.6 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +20 -0
- package/ARCHITECTURE.md +45 -36
- package/Dockerfile +26 -6
- package/README.md +8 -10
- package/__tests__/permissions/gateway-threshold-reader.test.ts +14 -20
- package/bun.lock +306 -119
- package/docs/architecture/memory.md +1 -90
- package/docs/architecture/security.md +15 -30
- package/docs/credential-execution-service.md +7 -5
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +17 -45
- package/examples/plugins/echo/bun.lock +25 -0
- package/knip.json +8 -22
- package/node_modules/@vellumai/ces-client/bun.lock +33 -0
- package/node_modules/@vellumai/ces-client/package.json +25 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +631 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/package-boundary.test.ts +138 -0
- package/node_modules/@vellumai/ces-client/src/credential-rpc.ts +13 -0
- package/node_modules/@vellumai/ces-client/src/http-credentials.ts +296 -0
- package/node_modules/@vellumai/ces-client/src/http-log-export.ts +111 -0
- package/node_modules/@vellumai/ces-client/src/index.ts +43 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +445 -0
- package/node_modules/@vellumai/credential-storage/src/__tests__/package-boundary.test.ts +32 -6
- package/node_modules/@vellumai/egress-proxy/src/__tests__/package-boundary.test.ts +32 -1
- package/node_modules/@vellumai/gateway-client/bun.lock +39 -0
- package/node_modules/@vellumai/gateway-client/package.json +23 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/gateway-client.test.ts +343 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/package-boundary.test.ts +140 -0
- package/node_modules/@vellumai/gateway-client/src/http-delivery.ts +422 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +35 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +331 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +131 -0
- package/node_modules/@vellumai/gateway-client/tsconfig.json +20 -0
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/bun.lock +1 -1
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/package.json +4 -2
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/contracts.test.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +155 -0
- package/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +23 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +25 -0
- package/node_modules/@vellumai/{ces-contracts/src/index.ts → service-contracts/src/transport.ts} +6 -28
- package/node_modules/@vellumai/service-contracts/src/trust-rules.ts +116 -0
- package/node_modules/@vellumai/service-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +891 -0
- package/node_modules/@vellumai/skill-host-contracts/bun.lock +24 -0
- package/node_modules/@vellumai/skill-host-contracts/package.json +18 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +91 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +1348 -0
- package/node_modules/@vellumai/skill-host-contracts/src/index.ts +6 -0
- package/node_modules/@vellumai/skill-host-contracts/src/runtime-mode.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +32 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +333 -0
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +444 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.test.json +12 -0
- package/openapi.yaml +2855 -556
- package/package.json +13 -7
- package/scripts/check-circular-deps.ts +80 -0
- package/scripts/generate-openapi.ts +24 -7
- package/{src/memory/graph/inspect.ts → scripts/memory-inspect.ts} +27 -27
- package/src/__tests__/access-request-decision.test.ts +2 -11
- package/src/__tests__/acp-session.test.ts +4 -150
- package/src/__tests__/actor-token-service.test.ts +17 -678
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +2 -6
- package/src/__tests__/agent-loop-override-profile.test.ts +404 -0
- package/src/__tests__/agent-loop-thinking.test.ts +4 -4
- package/src/__tests__/agent-wake-override-profile.test.ts +261 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -1
- package/src/__tests__/anthropic-provider.test.ts +127 -15
- package/src/__tests__/app-routes-csp.test.ts +106 -55
- package/src/__tests__/approval-cascade.test.ts +3 -355
- package/src/__tests__/approval-conversation-turn.test.ts +3 -8
- package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +2 -1
- package/src/__tests__/approval-routes-http.test.ts +34 -451
- package/src/__tests__/assistant-events-sse-hardening.test.ts +73 -80
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -3
- package/src/__tests__/attachment-upload-trusted-source.test.ts +139 -0
- package/src/__tests__/attachments-store.test.ts +46 -1
- package/src/__tests__/audit-log-rotation.test.ts +2 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +8 -20
- package/src/__tests__/background-shell-bash.test.ts +227 -0
- package/src/__tests__/background-shell-host-bash.test.ts +474 -0
- package/src/__tests__/background-tool-registry.test.ts +145 -0
- package/src/__tests__/background-tool-routes.test.ts +175 -0
- package/src/__tests__/btw-routes.test.ts +147 -183
- package/src/__tests__/call-controller.test.ts +15 -2
- package/src/__tests__/call-conversation-messages.test.ts +2 -1
- package/src/__tests__/call-domain.test.ts +2 -2
- package/src/__tests__/call-pointer-messages.test.ts +11 -13
- package/src/__tests__/call-recovery.test.ts +2 -1
- package/src/__tests__/call-routes-http.test.ts +3 -14
- package/src/__tests__/call-store.test.ts +2 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +31 -62
- package/src/__tests__/canonical-guardian-store.test.ts +2 -2
- package/src/__tests__/catalog-files.test.ts +0 -26
- package/src/__tests__/ces-rpc-credential-backend.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +79 -49
- package/src/__tests__/channel-approval.test.ts +9 -7
- package/src/__tests__/channel-approvals.test.ts +9 -180
- package/src/__tests__/channel-delivery-store.test.ts +11 -10
- package/src/__tests__/channel-guardian.test.ts +14 -25
- package/src/__tests__/channel-readiness-service.test.ts +8 -6
- package/src/__tests__/channel-reply-delivery.test.ts +3 -19
- package/src/__tests__/channel-retry-sweep.test.ts +2 -5
- package/src/__tests__/checker.test.ts +274 -3921
- package/src/__tests__/circuit-breaker-pipeline.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +208 -0
- package/src/__tests__/cli.test.ts +1 -38
- package/src/__tests__/compaction-events.test.ts +0 -1
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +2 -2
- package/src/__tests__/compaction-timeout-recovery.test.ts +1 -1
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -7
- package/src/__tests__/config-model-image-provider.test.ts +0 -1
- package/src/__tests__/config-schema-cmd.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +30 -221
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -25
- package/src/__tests__/contact-store-user-file.test.ts +2 -1
- package/src/__tests__/contacts-tools.test.ts +56 -29
- package/src/__tests__/contacts-write.test.ts +6 -61
- package/src/__tests__/context-search-agent-protocol.test.ts +230 -0
- package/src/__tests__/context-search-agent-runner.test.ts +998 -0
- package/src/__tests__/context-search-conversations-source.test.ts +320 -0
- package/src/__tests__/context-search-fanout.test.ts +380 -0
- package/src/__tests__/context-search-memory-source.test.ts +311 -0
- package/src/__tests__/context-search-pkb-source.test.ts +444 -0
- package/src/__tests__/context-search-types.test.ts +95 -0
- package/src/__tests__/context-search-workspace-source.test.ts +545 -0
- package/src/__tests__/context-window-manager.test.ts +25 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +631 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +15 -2
- package/src/__tests__/conversation-agent-loop.test.ts +24 -2
- package/src/__tests__/conversation-analysis-routes.test.ts +60 -82
- package/src/__tests__/conversation-attachments.test.ts +9 -20
- package/src/__tests__/conversation-attention-store.test.ts +2 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +4 -2
- package/src/__tests__/conversation-clear-safety.test.ts +53 -95
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -39
- package/src/__tests__/conversation-crud-inference-profile.test.ts +54 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +63 -157
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +5 -4
- package/src/__tests__/conversation-fork-crud.test.ts +26 -55
- package/src/__tests__/conversation-fork-route.test.ts +5 -74
- package/src/__tests__/conversation-inference-profile-list.test.ts +128 -0
- package/src/__tests__/conversation-inference-profile-route.test.ts +216 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +4 -81
- package/src/__tests__/conversation-key-store-disk-view.test.ts +2 -1
- package/src/__tests__/conversation-lifecycle.test.ts +0 -1
- package/src/__tests__/conversation-list-source.test.ts +2 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -1
- package/src/__tests__/conversation-pairing.test.ts +0 -1
- package/src/__tests__/conversation-pre-run-repair.test.ts +137 -297
- package/src/__tests__/conversation-process-callsite.test.ts +0 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -1
- package/src/__tests__/conversation-queue.test.ts +1 -33
- package/src/__tests__/conversation-routes-disk-view.test.ts +124 -97
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +80 -55
- package/src/__tests__/conversation-routes-slash-commands.test.ts +83 -12
- package/src/__tests__/conversation-runtime-assembly.test.ts +41 -84
- package/src/__tests__/conversation-slash-commands.test.ts +6 -43
- package/src/__tests__/conversation-slash-queue.test.ts +0 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -1
- package/src/__tests__/conversation-speed-override.test.ts +0 -1
- package/src/__tests__/conversation-starter-routes.test.ts +177 -55
- package/src/__tests__/conversation-starters-cadence.test.ts +2 -2
- package/src/__tests__/conversation-store.test.ts +2 -375
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +6 -6
- package/src/__tests__/conversation-unread-route.test.ts +1 -1
- package/src/__tests__/conversation-usage.test.ts +2 -1
- package/src/__tests__/conversation-wipe.test.ts +2 -103
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -1
- package/src/__tests__/conversations-defer-cli.test.ts +150 -0
- package/src/__tests__/credential-execution-admin-cli.test.ts +1 -1
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +2 -2
- package/src/__tests__/credential-execution-approval-bridge.test.ts +22 -289
- package/src/__tests__/credential-execution-client.test.ts +1 -1
- package/src/__tests__/credential-execution-managed-contract.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +14 -0
- package/src/__tests__/credentials-cli.test.ts +45 -21
- package/src/__tests__/daemon-credential-client.test.ts +23 -108
- package/src/__tests__/db-acp-history.test.ts +284 -0
- package/src/__tests__/db-activation-state.test.ts +240 -0
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +2 -1
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +248 -0
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +2 -1
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +116 -0
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +132 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
- package/src/__tests__/delete-propagation.test.ts +3 -2
- package/src/__tests__/deterministic-verification-control-plane.test.ts +39 -32
- package/src/__tests__/dm-backfill.test.ts +3 -2
- package/src/__tests__/edit-propagation.test.ts +5 -7
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +1 -1
- package/src/__tests__/empty-response-pipeline.test.ts +1 -1
- package/src/__tests__/events-client-registration.test.ts +297 -0
- package/src/__tests__/file-write-tool.test.ts +2 -4
- package/src/__tests__/filing-service.test.ts +144 -17
- package/src/__tests__/followup-tools.test.ts +2 -1
- package/src/__tests__/gateway-client-managed-outbound.test.ts +8 -12
- package/src/__tests__/gateway-only-enforcement.test.ts +2 -6
- package/src/__tests__/gateway-only-guard.test.ts +4 -3
- package/src/__tests__/gemini-provider.test.ts +276 -10
- package/src/__tests__/graph-extraction-event-date.test.ts +30 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +2 -2
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +9 -9
- package/src/__tests__/guardian-action-late-reply.test.ts +2 -1
- package/src/__tests__/guardian-action-store.test.ts +2 -1
- package/src/__tests__/guardian-action-sweep.test.ts +9 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +21 -118
- package/src/__tests__/guardian-dispatch.test.ts +14 -11
- package/src/__tests__/guardian-grant-minting.test.ts +9 -15
- package/src/__tests__/guardian-outbound-http.test.ts +71 -106
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +34 -90
- package/src/__tests__/guardian-routing-state.test.ts +14 -22
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +253 -0
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +8 -4
- package/src/__tests__/heartbeat-service.test.ts +39 -21
- package/src/__tests__/helpers/call-route-handler.ts +72 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +161 -0
- package/src/__tests__/helpers/gateway-classify-mock.ts +67 -0
- package/src/__tests__/helpers/mock-logger.ts +36 -0
- package/src/__tests__/history-repair-pipeline.test.ts +1 -1
- package/src/__tests__/home-state-routes.test.ts +10 -31
- package/src/__tests__/host-browser-e2e-cloud.test.ts +2 -1
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +12 -2
- package/src/__tests__/host-browser-routes.test.ts +36 -91
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +10 -2
- package/src/__tests__/host-proxy-interface.test.ts +3 -3
- package/src/__tests__/host-shell-tool.test.ts +2 -4
- package/src/__tests__/host-transfer-pending-interactions.test.ts +160 -0
- package/src/__tests__/host-transfer-proxy.test.ts +733 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +20 -11
- package/src/__tests__/inbound-invite-redemption.test.ts +3 -2
- package/src/__tests__/injector-chain.test.ts +16 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +41 -206
- package/src/__tests__/install-skill-routing.test.ts +1 -1
- package/src/__tests__/invite-redemption-service.test.ts +2 -1
- package/src/__tests__/invite-routes-http.test.ts +80 -12
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +2 -1
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +2 -1
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +157 -0
- package/src/__tests__/list-messages-attachments.test.ts +52 -55
- package/src/__tests__/list-messages-page-latest.test.ts +283 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +16 -17
- package/src/__tests__/llm-call-pipeline.test.ts +7 -8
- package/src/__tests__/llm-context-normalization.test.ts +69 -4
- package/src/__tests__/llm-context-route-provider.test.ts +39 -113
- package/src/__tests__/llm-request-log-turn-query.test.ts +2 -1
- package/src/__tests__/llm-resolver.test.ts +211 -0
- package/src/__tests__/llm-schema.test.ts +57 -1
- package/src/__tests__/llm-usage-store.test.ts +2 -1
- package/src/__tests__/log-export-workspace.test.ts +28 -17
- package/src/__tests__/mcp-abort-signal.test.ts +2 -3
- package/src/__tests__/mcp-client-auth.test.ts +2 -3
- package/src/__tests__/memory-admin-recall.test.ts +221 -0
- package/src/__tests__/memory-recall-log-store.test.ts +2 -1
- package/src/__tests__/memory-retrieval-pipeline.test.ts +6 -8
- package/src/__tests__/memory-upsert-concurrency.test.ts +2 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +14 -13
- package/src/__tests__/migration-export-http.test.ts +17 -17
- package/src/__tests__/migration-export-to-gcs.test.ts +491 -0
- package/src/__tests__/migration-import-commit-http.test.ts +16 -16
- package/src/__tests__/migration-import-from-gcs.test.ts +533 -0
- package/src/__tests__/migration-import-from-url.test.ts +16 -23
- package/src/__tests__/migration-import-preflight-http.test.ts +13 -13
- package/src/__tests__/migration-jobs-status.test.ts +164 -0
- package/src/__tests__/migration-validate-http.test.ts +48 -83
- package/src/__tests__/mock-gateway-ipc.ts +32 -62
- package/src/__tests__/model-intents.test.ts +15 -2
- package/src/__tests__/nl-approval-parser.test.ts +13 -17
- package/src/__tests__/non-member-access-request.test.ts +13 -5
- package/src/__tests__/notification-guardian-path.test.ts +15 -8
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +2 -1
- package/src/__tests__/notification-telegram-adapter.test.ts +57 -55
- package/src/__tests__/oauth-apps-routes.test.ts +76 -122
- package/src/__tests__/oauth-cli.test.ts +14 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +3 -1
- package/src/__tests__/oauth-providers-routes.test.ts +78 -101
- package/src/__tests__/oauth-store.test.ts +3 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +6 -3
- package/src/__tests__/openai-provider.test.ts +105 -6
- package/src/__tests__/openai-responses-provider.test.ts +146 -4
- package/src/__tests__/openrouter-provider-only.test.ts +22 -4
- package/src/__tests__/overflow-reduce-pipeline.test.ts +4 -9
- package/src/__tests__/permission-types.test.ts +3 -18
- package/src/__tests__/persistence-pipeline.test.ts +3 -2
- package/src/__tests__/pipeline-runner.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +27 -20
- package/src/__tests__/platform.test.ts +11 -63
- package/src/__tests__/playbook-execution.test.ts +2 -1
- package/src/__tests__/playbook-tools.test.ts +2 -1
- package/src/__tests__/plugin-bootstrap.test.ts +51 -5
- package/src/__tests__/plugin-registry.test.ts +30 -0
- package/src/__tests__/plugin-route-contribution.test.ts +17 -11
- package/src/__tests__/plugin-skill-contribution.test.ts +3 -3
- package/src/__tests__/plugin-tool-contribution.test.ts +10 -4
- package/src/__tests__/plugin-types.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +151 -2
- package/src/__tests__/profiler-routes.test.ts +112 -177
- package/src/__tests__/provider-send-message-override-profile.test.ts +223 -0
- package/src/__tests__/proxy-approval-callback.test.ts +6 -554
- package/src/__tests__/qdrant-collection-migration.test.ts +7 -7
- package/src/__tests__/reaction-persistence.test.ts +3 -2
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/recording-handler.test.ts +0 -2
- package/src/__tests__/registry.test.ts +1 -0
- package/src/__tests__/relay-server.test.ts +19 -4
- package/src/__tests__/require-fresh-approval.test.ts +19 -168
- package/src/__tests__/resolve-trust-class.test.ts +2 -1
- package/src/__tests__/retry-thinking-tool-choice.test.ts +19 -7
- package/src/__tests__/retry-verbosity-normalization.test.ts +139 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +26 -6
- package/src/__tests__/runtime-events-sse-parity.test.ts +12 -13
- package/src/__tests__/runtime-events-sse.test.ts +13 -21
- package/src/__tests__/schedule-routes.test.ts +226 -129
- package/src/__tests__/schedule-store.test.ts +119 -1
- package/src/__tests__/schedule-tools.test.ts +2 -1
- package/src/__tests__/scheduler-recurrence.test.ts +2 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +2 -1
- package/src/__tests__/scheduler-wake.test.ts +356 -0
- package/src/__tests__/scoped-approval-grants.test.ts +2 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -1
- package/src/__tests__/secret-detection-handler.test.ts +2 -9
- package/src/__tests__/secret-ingress-http.test.ts +38 -21
- package/src/__tests__/secret-routes-managed-proxy.test.ts +46 -102
- package/src/__tests__/secret-scanner-executor.test.ts +1 -2
- package/src/__tests__/send-endpoint-busy.test.ts +38 -25
- package/src/__tests__/sequence-store.test.ts +2 -1
- package/src/__tests__/server-history-render.test.ts +2 -2
- package/src/__tests__/service-contracts-import-guard.test.ts +185 -0
- package/src/__tests__/set-permission-mode.test.ts +0 -10
- package/src/__tests__/settings-routes.test.ts +35 -68
- package/src/__tests__/skill-boundary-guard.test.ts +105 -0
- package/src/__tests__/skill-load-inline-command.test.ts +2 -2
- package/src/__tests__/skill-load-inline-includes.test.ts +2 -2
- package/src/__tests__/skill-runtime-path.test.ts +64 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +0 -2
- package/src/__tests__/slack-inbound-verification.test.ts +11 -2
- package/src/__tests__/slack-messaging-token-resolution.test.ts +1 -3
- package/src/__tests__/slack-reaction-approvals.test.ts +4 -4
- package/src/__tests__/slack-share-routes.test.ts +37 -72
- package/src/__tests__/subagent-call-site-routing.test.ts +79 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +20 -28
- package/src/__tests__/subagent-notify-parent.test.ts +6 -29
- package/src/__tests__/subagent-role-registry.test.ts +3 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +52 -104
- package/src/__tests__/subagent-tools.test.ts +0 -1
- package/src/__tests__/suggestion-routes.test.ts +55 -62
- package/src/__tests__/task-compiler.test.ts +2 -1
- package/src/__tests__/task-management-tools.test.ts +2 -1
- package/src/__tests__/task-memory-cleanup.test.ts +2 -1
- package/src/__tests__/task-scheduler.test.ts +2 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +5 -314
- package/src/__tests__/test-preload.ts +0 -11
- package/src/__tests__/thread-backfill.test.ts +3 -2
- package/src/__tests__/token-estimate-pipeline.test.ts +68 -15
- package/src/__tests__/tool-approval-handler.test.ts +21 -63
- package/src/__tests__/tool-audit-listener.test.ts +3 -3
- package/src/__tests__/tool-domain-event-publisher.test.ts +3 -3
- package/src/__tests__/tool-error-pipeline.test.ts +6 -6
- package/src/__tests__/tool-execute-pipeline.test.ts +6 -8
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +64 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +28 -56
- package/src/__tests__/tool-executor.test.ts +322 -1633
- package/src/__tests__/tool-grant-request-escalation.test.ts +90 -311
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +1 -1
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +7 -15
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +178 -354
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +3 -2
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -2
- package/src/__tests__/trusted-contact-verification.test.ts +2 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +2 -1
- package/src/__tests__/twilio-routes.test.ts +25 -66
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -7
- package/src/__tests__/usage-routes.test.ts +73 -90
- package/src/__tests__/user-plugin-loader.test.ts +54 -12
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +2 -2
- package/src/__tests__/verification-control-plane-policy.test.ts +95 -14
- package/src/__tests__/voice-ingress-preflight.test.ts +5 -5
- package/src/__tests__/voice-invite-redemption.test.ts +2 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +3 -3
- package/src/__tests__/voice-session-bridge.test.ts +285 -106
- package/src/__tests__/volume-security-guard.test.ts +0 -2
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +3 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +1 -1
- package/src/__tests__/workspace-migration-052-seed-default-inference-profiles.test.ts +260 -0
- package/src/__tests__/workspace-migration-053-release-notes-acp-codex.test.ts +225 -0
- package/src/__tests__/workspace-migration-054-seed-recall-callsite.test.ts +235 -0
- package/src/__tests__/workspace-migration-055-release-notes-agentic-recall.test.ts +128 -0
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +232 -0
- package/src/__tests__/workspace-migration-acp-sessions-ui.test.ts +144 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +1 -1
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +274 -0
- package/src/acp/__tests__/client-handler.test.ts +64 -0
- package/src/acp/__tests__/helpers/acp-config-stub.ts +62 -0
- package/src/acp/__tests__/helpers/which-stub.ts +45 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +366 -0
- package/src/acp/__tests__/session-manager-startup.test.ts +159 -0
- package/src/acp/__tests__/session-manager.test.ts +83 -0
- package/src/acp/client-handler.ts +23 -139
- package/src/acp/resolve-agent.test.ts +291 -0
- package/src/acp/resolve-agent.ts +176 -0
- package/src/acp/session-manager.ts +166 -7
- package/src/acp/types.ts +2 -50
- package/src/agent/loop.ts +37 -14
- package/src/agent/message-types.ts +0 -2
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/__tests__/guardian-feed-event.test.ts +1 -9
- package/src/approvals/approval-primitive.ts +3 -20
- package/src/approvals/guardian-decision-primitive.ts +37 -68
- package/src/approvals/guardian-request-resolvers.ts +29 -103
- package/src/avatar/character-components.ts +6 -6
- package/src/{config/bundled-skills/settings/tools → avatar}/identity-avatar.ts +1 -1
- package/src/backup/__tests__/backup-worker.test.ts +0 -2
- package/src/backup/__tests__/paths.test.ts +3 -2
- package/src/backup/backup-worker.ts +1 -10
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +7 -11
- package/src/browser/__tests__/operations.test.ts +0 -35
- package/src/browser/operations.ts +1 -47
- package/src/bundler/package-resolver.ts +2 -6
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-constants.ts +1 -1
- package/src/calls/call-controller.ts +1 -5
- package/src/calls/call-domain.ts +14 -14
- package/src/calls/call-pointer-messages.ts +4 -9
- package/src/calls/call-store.ts +2 -1
- package/src/calls/guardian-action-sweep.ts +9 -25
- package/src/calls/guardian-dispatch.ts +1 -20
- package/src/calls/media-stream-audio-transcode.ts +2 -41
- package/src/calls/media-stream-server.ts +2 -3
- package/src/calls/media-stream-stt-session.ts +1 -3
- package/src/calls/relay-access-wait.ts +5 -8
- package/src/calls/relay-server.ts +15 -18
- package/src/calls/relay-setup-router.ts +2 -2
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/twilio-routes.ts +160 -78
- package/src/calls/voice-control-protocol.ts +10 -10
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/calls/voice-session-bridge.ts +137 -42
- package/src/channels/__tests__/types.test.ts +25 -3
- package/src/channels/permission-profiles.ts +2 -72
- package/src/channels/types.ts +42 -26
- package/src/cli/AGENTS.md +1 -0
- package/src/cli/__tests__/notifications.test.ts +12 -10
- package/src/cli/commands/__tests__/attachment.test.ts +14 -8
- package/src/cli/commands/__tests__/backup.test.ts +3 -14
- package/src/cli/commands/__tests__/browser.test.ts +36 -31
- package/src/cli/commands/__tests__/cache.test.ts +23 -18
- package/src/cli/commands/__tests__/memory-v2.test.ts +396 -0
- package/src/cli/commands/__tests__/task.test.ts +36 -35
- package/src/cli/commands/__tests__/trust.test.ts +602 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +14 -14
- package/src/cli/commands/__tests__/ui.test.ts +17 -17
- package/src/cli/commands/__tests__/watchers.test.ts +29 -29
- package/src/cli/commands/__tests__/webhooks.test.ts +544 -0
- package/src/cli/commands/attachment.ts +12 -8
- package/src/cli/commands/auth.ts +1 -1
- package/src/cli/commands/avatar.ts +192 -9
- package/src/cli/commands/backup.ts +14 -44
- package/src/cli/commands/browser.ts +52 -4
- package/src/cli/commands/cache.ts +7 -5
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/clients.ts +11 -12
- package/src/cli/commands/completions.ts +1 -1
- package/src/cli/commands/contacts.ts +10 -10
- package/src/cli/commands/conversations-defer.ts +364 -0
- package/src/cli/commands/conversations-import.ts +2 -3
- package/src/cli/commands/conversations.ts +63 -53
- package/src/cli/commands/credential-execution.ts +1 -1
- package/src/cli/commands/credentials.ts +139 -5
- package/src/cli/commands/default-action.ts +1 -1
- package/src/cli/commands/domain.ts +2 -2
- package/src/cli/commands/email.ts +7 -7
- package/src/cli/commands/image-generation.ts +1 -1
- package/src/cli/commands/keys.ts +2 -2
- package/src/cli/commands/mcp.ts +1 -1
- package/src/cli/commands/memory-v2.ts +343 -0
- package/src/cli/commands/memory.ts +8 -8
- package/src/cli/commands/notifications.ts +21 -20
- package/src/cli/commands/oauth/__tests__/connect.test.ts +23 -5
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/mode.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/status.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/token.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +2 -2
- package/src/cli/commands/oauth/shared.ts +29 -2
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -6
- package/src/cli/commands/platform/__tests__/connect.test.ts +23 -11
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +22 -10
- package/src/cli/commands/platform/__tests__/status.test.ts +22 -10
- package/src/cli/commands/platform/connect.ts +3 -3
- package/src/cli/commands/platform/disconnect.ts +4 -6
- package/src/cli/commands/platform/index.ts +12 -10
- package/src/cli/commands/routes.ts +7 -1
- package/src/cli/commands/sequence.ts +7 -7
- package/src/cli/commands/skills.ts +188 -82
- package/src/cli/commands/task.ts +12 -10
- package/src/cli/commands/trust.ts +460 -162
- package/src/cli/commands/ui.ts +3 -3
- package/src/cli/commands/usage.ts +10 -5
- package/src/cli/commands/watchers.ts +8 -8
- package/src/cli/commands/webhooks.ts +270 -0
- package/src/cli/lib/daemon-avatar-client.ts +37 -0
- package/src/cli/lib/daemon-credential-client.ts +27 -189
- package/src/cli/lib/ipc-params.ts +22 -0
- package/src/cli/program.ts +4 -0
- package/src/cli.ts +1 -61
- package/src/config/acp-defaults.test.ts +57 -0
- package/src/config/acp-defaults.ts +40 -0
- package/src/config/acp-schema.ts +1 -1
- package/src/config/assistant-feature-flags.ts +18 -142
- package/src/config/bundled-skills/acp/SKILL.md +44 -16
- package/src/config/bundled-skills/acp/TOOLS.json +45 -1
- package/src/config/bundled-skills/acp/tools/acp-list-agents.ts +12 -0
- package/src/config/bundled-skills/acp/tools/acp-steer.ts +12 -0
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +14 -14
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +1 -4
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +11 -6
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +6 -6
- package/src/config/bundled-skills/media-processing/services/reduce.ts +0 -13
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +1 -1
- package/src/config/bundled-skills/settings/SKILL.md +2 -17
- package/src/config/bundled-skills/settings/TOOLS.json +0 -56
- package/src/config/bundled-skills/subagent/SKILL.md +2 -0
- package/src/config/bundled-tool-registry.ts +4 -6
- package/src/config/env.ts +7 -8
- package/src/config/feature-flag-registry.json +16 -24
- package/src/config/llm-resolver.ts +51 -33
- package/src/config/loader.ts +12 -15
- package/src/config/schema.ts +5 -72
- package/src/config/schemas/__tests__/filing.test.ts +58 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +186 -0
- package/src/config/schemas/filing.ts +12 -0
- package/src/config/schemas/host-browser.ts +2 -2
- package/src/config/schemas/inference.ts +0 -2
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +51 -9
- package/src/config/schemas/memory-storage.ts +1 -1
- package/src/config/schemas/memory-v2.ts +176 -0
- package/src/config/schemas/memory.ts +2 -0
- package/src/config/schemas/security.ts +0 -60
- package/src/config/schemas/services.ts +46 -7
- package/src/config/skills.ts +1 -1
- package/src/config/types.ts +0 -41
- package/src/contacts/contact-store.ts +2 -2
- package/src/contacts/contacts-write.ts +0 -38
- package/src/contacts/types.ts +8 -10
- package/src/context/token-estimator.ts +1 -1
- package/src/context/tool-result-truncation.ts +1 -1
- package/src/context/window-manager.ts +1 -1
- package/src/credential-execution/approval-bridge.ts +7 -69
- package/src/credential-execution/client.ts +17 -422
- package/src/credential-execution/feature-gates.ts +1 -2
- package/src/credential-execution/managed-catalog.ts +1 -1
- package/src/credential-health/credential-health-service.ts +1 -1
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -13
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/daemon-skill-host.test.ts +272 -0
- package/src/daemon/__tests__/meet-host-supervisor.test.ts +587 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +463 -0
- package/src/daemon/approval-generators.ts +2 -14
- package/src/daemon/classifier.ts +0 -106
- package/src/daemon/config-watcher.ts +14 -54
- package/src/daemon/connection-policy.ts +0 -14
- package/src/daemon/conversation-agent-loop-handlers.ts +37 -6
- package/src/daemon/conversation-agent-loop.ts +164 -53
- package/src/daemon/conversation-attachments.ts +5 -81
- package/src/daemon/conversation-error.ts +9 -5
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-launch.ts +1 -1
- package/src/daemon/conversation-messaging.ts +1 -1
- package/src/daemon/conversation-notifiers.ts +1 -1
- package/src/daemon/conversation-process.ts +9 -13
- package/src/daemon/conversation-runtime-assembly.ts +26 -88
- package/src/daemon/conversation-slash.ts +4 -160
- package/src/daemon/conversation-store.ts +368 -0
- package/src/daemon/conversation-surfaces.ts +5 -4
- package/src/daemon/conversation-tool-setup.ts +23 -172
- package/src/daemon/conversation.ts +46 -182
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/daemon-skill-host.ts +262 -0
- package/src/daemon/external-plugins-bootstrap.ts +67 -13
- package/src/daemon/handlers/config-channels.ts +2 -2
- package/src/daemon/handlers/config-embeddings.ts +1 -1
- package/src/daemon/handlers/config-ingress.ts +24 -2
- package/src/daemon/handlers/config-model.test.ts +17 -0
- package/src/daemon/handlers/config-model.ts +7 -52
- package/src/daemon/handlers/config-telegram.ts +6 -53
- package/src/daemon/handlers/config-voice.ts +1 -1
- package/src/daemon/handlers/conversations.ts +22 -156
- package/src/daemon/handlers/recording.ts +1 -1
- package/src/daemon/handlers/shared.ts +34 -35
- package/src/daemon/handlers/skills.ts +15 -23
- package/src/daemon/host-transfer-proxy.ts +500 -0
- package/src/daemon/lifecycle.ts +23 -258
- package/src/daemon/meet-host-startup.ts +51 -0
- package/src/daemon/meet-host-supervisor.ts +781 -0
- package/src/daemon/meet-manifest-loader.ts +410 -0
- package/src/daemon/memory-v2-startup.ts +35 -0
- package/src/daemon/message-protocol.ts +4 -7
- package/src/daemon/message-types/acp.ts +1 -0
- package/src/daemon/message-types/conversations.ts +16 -2
- package/src/daemon/message-types/host-transfer.ts +41 -0
- package/src/daemon/message-types/integrations.ts +6 -0
- package/src/daemon/message-types/messages.ts +14 -14
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +0 -6
- package/src/daemon/message-types/shared.ts +5 -2
- package/src/daemon/message-types/subagents.ts +2 -1
- package/src/daemon/message-types/workspace.ts +0 -2
- package/src/daemon/pkb-reminder-builder.test.ts +13 -12
- package/src/daemon/pkb-reminder-builder.ts +8 -16
- package/src/daemon/process-message.ts +616 -0
- package/src/daemon/providers-setup.ts +14 -6
- package/src/daemon/server.ts +79 -1274
- package/src/daemon/shutdown-handlers.ts +1 -1
- package/src/daemon/startup-error.ts +1 -1
- package/src/daemon/trust-context.ts +32 -0
- package/src/daemon/wake-target-adapter.ts +223 -0
- package/src/email/feature-gate.ts +1 -1
- package/src/events/domain-events.ts +1 -8
- package/src/events/tool-audit-listener.ts +2 -8
- package/src/events/tool-metrics-listener.ts +1 -4
- package/src/filing/filing-service.ts +194 -54
- package/src/followups/followup-store.ts +3 -71
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +89 -21
- package/src/heartbeat/heartbeat-service.ts +32 -11
- package/src/home/__tests__/phase5-exit-criteria.test.ts +18 -1
- package/src/home/__tests__/rollup-producer.test.ts +67 -2
- package/src/home/assistant-feed-authoring.ts +8 -1
- package/src/home/feed-types.ts +1 -1
- package/src/home/relationship-state-writer.ts +1 -1
- package/src/home/rewrite-feed-title.ts +58 -0
- package/src/home/rollup-producer.ts +16 -3
- package/src/inbound/platform-callback-registration.ts +1 -17
- package/src/ipc/__tests__/attachment-ipc.test.ts +128 -66
- package/src/ipc/__tests__/browser-ipc.test.ts +75 -51
- package/src/ipc/__tests__/cache-ipc.test.ts +52 -107
- package/src/ipc/__tests__/cli-ipc.test.ts +9 -6
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +254 -0
- package/src/ipc/__tests__/skill-server.test.ts +182 -0
- package/src/ipc/__tests__/socket-path.test.ts +69 -23
- package/src/ipc/__tests__/ui-request-route.test.ts +241 -216
- package/src/ipc/__tests__/watcher-ipc.test.ts +33 -33
- package/src/ipc/assistant-server.ts +450 -0
- package/src/ipc/cli-client.ts +3 -3
- package/src/ipc/gateway-client.test.ts +131 -0
- package/src/ipc/gateway-client.ts +98 -123
- package/src/ipc/ipc-framing.ts +281 -0
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +152 -0
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +219 -0
- package/src/ipc/routes/db-proxy.ts +73 -0
- package/src/ipc/routes/route-adapter.ts +32 -0
- package/src/ipc/routes/trust-rules.test.ts +218 -0
- package/src/ipc/skill-ipc-types.ts +13 -0
- package/src/ipc/skill-routes/__tests__/config.test.ts +146 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +402 -0
- package/src/ipc/skill-routes/__tests__/identity.test.ts +81 -0
- package/src/ipc/skill-routes/__tests__/log.test.ts +133 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +178 -0
- package/src/ipc/skill-routes/__tests__/platform.test.ts +111 -0
- package/src/ipc/skill-routes/__tests__/providers.test.ts +265 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +361 -0
- package/src/ipc/skill-routes/config.ts +47 -0
- package/src/ipc/skill-routes/events.ts +131 -0
- package/src/ipc/skill-routes/identity.ts +34 -0
- package/src/ipc/skill-routes/index.ts +37 -0
- package/src/ipc/skill-routes/log.ts +40 -0
- package/src/ipc/skill-routes/memory.ts +76 -0
- package/src/ipc/skill-routes/platform.ts +39 -0
- package/src/ipc/skill-routes/providers.ts +163 -0
- package/src/ipc/skill-routes/registries.ts +393 -0
- package/src/ipc/skill-server.ts +771 -0
- package/src/ipc/skill-socket-path.ts +20 -0
- package/src/ipc/socket-cleanup.ts +92 -0
- package/src/ipc/socket-path.ts +63 -32
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +374 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +525 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +473 -0
- package/src/live-voice/__tests__/live-voice-integration.test.ts +359 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +179 -0
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +349 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +244 -0
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +337 -0
- package/src/live-voice/__tests__/live-voice-tts.test.ts +337 -0
- package/src/live-voice/__tests__/protocol.test.ts +295 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +421 -0
- package/src/live-voice/live-voice-archive.ts +758 -0
- package/src/live-voice/live-voice-metrics.ts +472 -0
- package/src/live-voice/live-voice-session-manager.ts +222 -0
- package/src/live-voice/live-voice-session.ts +1144 -0
- package/src/live-voice/live-voice-tts.ts +260 -0
- package/src/live-voice/protocol.ts +524 -0
- package/src/mcp/client.ts +2 -2
- package/src/media/types.ts +4 -4
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +4 -28
- package/src/memory/__tests__/auto-analysis-guard.test.ts +2 -2
- package/src/memory/__tests__/conversation-analyze-job.test.ts +7 -62
- package/src/memory/__tests__/conversation-group-migration.test.ts +2 -2
- package/src/memory/__tests__/find-analysis-conversation.test.ts +2 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +235 -0
- package/src/memory/admin.ts +65 -7
- package/src/memory/app-git-service.ts +0 -14
- package/src/memory/attachments-store.ts +14 -16
- package/src/memory/auto-analysis-enqueue.ts +2 -17
- package/src/memory/canonical-guardian-store.ts +2 -1
- package/src/memory/channel-verification-sessions.ts +1 -1
- package/src/memory/checkpoints.ts +1 -1
- package/src/memory/context-search/agent-protocol.ts +424 -0
- package/src/memory/context-search/agent-runner.ts +1295 -0
- package/src/memory/context-search/format.ts +160 -0
- package/src/memory/context-search/limits.ts +106 -0
- package/src/memory/context-search/search.ts +387 -0
- package/src/memory/context-search/sources/conversations.ts +278 -0
- package/src/memory/context-search/sources/memory.ts +90 -0
- package/src/memory/context-search/sources/pkb.ts +468 -0
- package/src/memory/context-search/sources/workspace.ts +1255 -0
- package/src/memory/context-search/types.ts +49 -0
- package/src/memory/conversation-analyze-job.ts +3 -24
- package/src/memory/conversation-attention-store.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +1 -1
- package/src/memory/conversation-crud.ts +69 -127
- package/src/memory/conversation-directories.ts +1 -11
- package/src/memory/conversation-display-order-migration.ts +11 -2
- package/src/memory/conversation-group-migration.ts +20 -4
- package/src/memory/conversation-key-store.ts +3 -4
- package/src/memory/conversation-queries.ts +13 -26
- package/src/memory/conversation-starter-validation.ts +88 -0
- package/src/memory/conversation-starters-cadence.ts +1 -1
- package/src/memory/conversation-title-service.ts +2 -1
- package/src/memory/db-init.ts +14 -4
- package/src/memory/db-maintenance.ts +1 -1
- package/src/memory/delivery-channels.ts +1 -14
- package/src/memory/delivery-crud.ts +2 -32
- package/src/memory/delivery-status.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +4 -4
- package/src/memory/external-conversation-store.ts +1 -1
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +412 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +225 -0
- package/src/memory/graph/bootstrap.test.ts +2 -7
- package/src/memory/graph/bootstrap.ts +2 -1
- package/src/memory/graph/capability-seed.ts +3 -3
- package/src/memory/graph/compaction.ts +1 -1
- package/src/memory/graph/consolidation.ts +13 -10
- package/src/memory/graph/conversation-graph-memory.ts +151 -1
- package/src/memory/graph/decay.ts +1 -1
- package/src/memory/graph/extraction.ts +53 -21
- package/src/memory/graph/graph-memory-state-store.ts +1 -1
- package/src/memory/graph/graph-search.test.ts +94 -2
- package/src/memory/graph/graph-search.ts +22 -7
- package/src/memory/graph/image-ref-utils.ts +1 -1
- package/src/memory/graph/retriever.test.ts +158 -4
- package/src/memory/graph/retriever.ts +17 -5
- package/src/memory/graph/store.test.ts +2 -1
- package/src/memory/graph/store.ts +1 -1
- package/src/memory/graph/tool-handlers.ts +73 -247
- package/src/memory/graph/tools.ts +35 -53
- package/src/memory/group-crud.ts +1 -2
- package/src/memory/guardian-action-store.ts +2 -1
- package/src/memory/guardian-approvals.ts +1 -1
- package/src/memory/guardian-rate-limits.ts +1 -1
- package/src/memory/indexer.ts +43 -17
- package/src/memory/invite-store.ts +1 -1
- package/src/memory/job-handlers/backfill.ts +1 -1
- package/src/memory/job-handlers/cleanup.ts +2 -1
- package/src/memory/job-handlers/conversation-starters.ts +18 -10
- package/src/memory/job-handlers/embedding.test.ts +2 -1
- package/src/memory/job-handlers/embedding.ts +1 -1
- package/src/memory/job-handlers/index-maintenance.ts +1 -1
- package/src/memory/job-handlers/summarization.ts +3 -3
- package/src/memory/job-utils.ts +3 -3
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +362 -0
- package/src/memory/jobs/embed-concept-page.ts +210 -0
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -1
- package/src/memory/jobs-store.ts +10 -2
- package/src/memory/jobs-worker.ts +58 -5
- package/src/memory/lifecycle-events-store.ts +1 -1
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +1 -1
- package/src/memory/media-store.ts +1 -1
- package/src/memory/memory-recall-log-store.ts +1 -1
- package/src/memory/migrations/038-actor-token-records.ts +3 -0
- package/src/memory/migrations/039-actor-refresh-token-records.ts +3 -0
- package/src/memory/migrations/226-schedule-wake-conversation-id.ts +11 -0
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +18 -0
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +27 -0
- package/src/memory/migrations/229-delete-private-conversations.test.ts +1087 -0
- package/src/memory/migrations/229-delete-private-conversations.ts +210 -0
- package/src/memory/migrations/230-acp-session-history.ts +41 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +128 -0
- package/src/memory/migrations/232-activation-state.ts +38 -0
- package/src/memory/migrations/index.ts +10 -0
- package/src/memory/migrations/registry.ts +7 -0
- package/src/memory/pkb/pkb-index.test.ts +4 -5
- package/src/memory/pkb/pkb-reconcile.test.ts +4 -5
- package/src/memory/pkb/pkb-search.test.ts +83 -3
- package/src/memory/pkb/pkb-search.ts +27 -14
- package/src/memory/published-pages-store.ts +1 -1
- package/src/memory/schema/acp.ts +30 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/infrastructure.ts +1 -32
- package/src/memory/schema/memory-graph.ts +36 -14
- package/src/memory/scoped-approval-grants.ts +2 -1
- package/src/memory/search/semantic.ts +2 -2
- package/src/memory/shared-app-links-store.ts +2 -1
- package/src/memory/tool-usage-store.ts +1 -1
- package/src/memory/trace-event-store.ts +2 -1
- package/src/memory/turn-events-store.ts +1 -1
- package/src/memory/v2/__tests__/activation-store.test.ts +202 -0
- package/src/memory/v2/__tests__/activation.test.ts +956 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +610 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +395 -0
- package/src/memory/v2/__tests__/edges.test.ts +435 -0
- package/src/memory/v2/__tests__/injection.test.ts +792 -0
- package/src/memory/v2/__tests__/migration.test.ts +812 -0
- package/src/memory/v2/__tests__/page-store.test.ts +334 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +438 -0
- package/src/memory/v2/__tests__/sim.test.ts +549 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +85 -0
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +657 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +351 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +441 -0
- package/src/memory/v2/activation-store.ts +109 -0
- package/src/memory/v2/activation.ts +490 -0
- package/src/memory/v2/backfill-jobs.ts +442 -0
- package/src/memory/v2/consolidation-job.ts +304 -0
- package/src/memory/v2/edges.ts +217 -0
- package/src/memory/v2/injection.ts +307 -0
- package/src/memory/v2/migration.ts +654 -0
- package/src/memory/v2/now-text.ts +38 -0
- package/src/memory/v2/page-store.ts +245 -0
- package/src/memory/v2/prompts/consolidation.ts +185 -0
- package/src/memory/v2/prompts/sweep.ts +56 -0
- package/src/memory/v2/qdrant.ts +342 -0
- package/src/memory/v2/sim.ts +206 -0
- package/src/memory/v2/skill-content.ts +42 -0
- package/src/memory/v2/skill-qdrant.ts +395 -0
- package/src/memory/v2/skill-store.ts +128 -0
- package/src/memory/v2/sweep-job.ts +298 -0
- package/src/memory/v2/types.ts +116 -0
- package/src/memory/validation.ts +1 -1
- package/src/messaging/providers/index.ts +262 -0
- package/src/messaging/providers/slack/api.ts +242 -0
- package/src/messaging/providers/slack/message-metadata.ts +1 -1
- package/src/messaging/providers/slack/send.ts +383 -0
- package/src/messaging/providers/telegram-bot/adapter.ts +4 -42
- package/src/messaging/providers/telegram-bot/api.ts +253 -0
- package/src/messaging/providers/telegram-bot/client.ts +17 -58
- package/src/messaging/providers/telegram-bot/send.ts +232 -0
- package/src/messaging/providers/whatsapp/adapter.ts +4 -36
- package/src/messaging/providers/whatsapp/api.ts +319 -0
- package/src/messaging/providers/whatsapp/client.ts +4 -48
- package/src/messaging/providers/whatsapp/send.ts +209 -0
- package/src/notifications/adapters/slack.ts +5 -23
- package/src/notifications/adapters/telegram.ts +8 -29
- package/src/notifications/conversation-candidates.ts +1 -1
- package/src/notifications/conversation-seed-composer.ts +12 -6
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +1 -1
- package/src/notifications/decisions-store.ts +1 -1
- package/src/notifications/deliveries-store.ts +2 -1
- package/src/notifications/deterministic-checks.ts +1 -1
- package/src/notifications/events-store.ts +1 -13
- package/src/notifications/preferences-store.ts +1 -1
- package/src/notifications/signal.ts +0 -9
- package/src/oauth/connection-resolver.ts +11 -2
- package/src/oauth/oauth-store.ts +2 -1
- package/src/outbound-proxy/index.ts +0 -1
- package/src/permissions/approval-policy.test.ts +149 -132
- package/src/permissions/approval-policy.ts +65 -91
- package/src/permissions/checker.test.ts +632 -0
- package/src/permissions/checker.ts +266 -459
- package/src/permissions/gateway-threshold-reader.ts +28 -47
- package/src/permissions/ipc-risk-types.ts +95 -0
- package/src/permissions/prompter.ts +4 -9
- package/src/permissions/risk-types.ts +24 -210
- package/src/permissions/types.ts +17 -47
- package/src/permissions/workspace-policy.ts +2 -4
- package/src/playbooks/playbook-compiler.ts +1 -1
- package/src/plugins/defaults/index.ts +1 -1
- package/src/plugins/defaults/injectors.ts +18 -21
- package/src/plugins/defaults/llm-call.ts +6 -9
- package/src/plugins/defaults/memory-retrieval.ts +1 -6
- package/src/plugins/defaults/overflow-reduce.ts +9 -5
- package/src/plugins/defaults/token-estimate.ts +2 -3
- package/src/plugins/registry.ts +61 -1
- package/src/plugins/types.ts +6 -7
- package/src/plugins/user-loader.ts +36 -10
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +197 -0
- package/src/prompts/persona-resolver.ts +2 -4
- package/src/prompts/system-prompt.ts +39 -0
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/providers/__tests__/provider-env-vars.test.ts +0 -21
- package/src/providers/__tests__/retry-callsite.test.ts +3 -6
- package/src/providers/anthropic/client.ts +71 -19
- package/src/providers/call-site-routing.ts +7 -3
- package/src/providers/fireworks/client.ts +3 -0
- package/src/providers/gemini/client.ts +96 -22
- package/src/providers/managed-proxy/context.ts +0 -12
- package/src/providers/model-catalog.ts +83 -8
- package/src/providers/model-intents.ts +7 -8
- package/src/providers/openai/chat-completions-provider.ts +37 -7
- package/src/providers/openai/responses-provider.ts +39 -4
- package/src/providers/openrouter/client.ts +4 -5
- package/src/providers/provider-env-vars.ts +4 -12
- package/src/providers/provider-send-message.ts +16 -11
- package/src/providers/registry.ts +1 -1
- package/src/providers/retry.ts +52 -23
- package/src/providers/speech-to-text/openai-whisper-stream.ts +1 -1
- package/src/providers/speech-to-text/openai-whisper.ts +3 -6
- package/src/providers/speech-to-text/provider-catalog.ts +75 -0
- package/src/providers/speech-to-text/xai.ts +5 -5
- package/src/providers/thinking-config.ts +34 -0
- package/src/providers/types.ts +22 -10
- package/src/runtime/AGENTS.md +10 -9
- package/src/runtime/__tests__/agent-wake.test.ts +33 -9
- package/src/runtime/__tests__/client-registry.test.ts +5 -27
- package/src/runtime/__tests__/interactive-ui.test.ts +157 -246
- package/src/runtime/access-request-helper.ts +9 -20
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/agent-wake.ts +174 -68
- package/src/runtime/approval-conversation-turn.ts +2 -15
- package/src/runtime/approval-message-composer.ts +11 -60
- package/src/runtime/assistant-event.ts +18 -66
- package/src/runtime/auth/__tests__/guard-tests.test.ts +6 -30
- package/src/runtime/auth/__tests__/middleware.test.ts +10 -10
- package/src/runtime/auth/__tests__/route-policy.test.ts +0 -8
- package/src/runtime/auth/context.ts +9 -0
- package/src/runtime/auth/middleware.ts +4 -4
- package/src/runtime/auth/route-policy.ts +195 -4
- package/src/runtime/auth/token-service.ts +1 -100
- package/src/runtime/capability-tokens.ts +89 -313
- package/src/runtime/channel-approval-types.ts +1 -6
- package/src/runtime/channel-approvals.ts +7 -79
- package/src/runtime/channel-readiness-service.ts +2 -2
- package/src/runtime/channel-reply-delivery.ts +2 -8
- package/src/runtime/channel-retry-sweep.ts +20 -17
- package/src/runtime/client-registry.ts +21 -28
- package/src/runtime/confirmation-request-guardian-bridge.ts +2 -7
- package/src/runtime/gateway-client.ts +37 -378
- package/src/runtime/guardian-action-grant-minter.ts +2 -3
- package/src/runtime/guardian-action-message-composer.ts +11 -52
- package/src/runtime/guardian-action-service.ts +19 -7
- package/src/runtime/guardian-decision-types.ts +4 -65
- package/src/runtime/guardian-reply-router.ts +10 -19
- package/src/runtime/guardian-vellum-migration.ts +5 -64
- package/src/runtime/http-errors.ts +3 -0
- package/src/runtime/http-router.ts +50 -7
- package/src/runtime/http-server.ts +345 -1110
- package/src/runtime/http-types.ts +15 -98
- package/src/runtime/interactive-ui-types.ts +145 -0
- package/src/runtime/interactive-ui.ts +38 -196
- package/src/runtime/invite-redemption-service.ts +1 -1
- package/src/runtime/invite-redemption-templates.ts +1 -1
- package/src/runtime/local-actor-identity.ts +13 -43
- package/src/runtime/message-composer-types.ts +134 -0
- package/src/runtime/middleware/rate-limiter.ts +1 -1
- package/src/runtime/middleware/request-logger.ts +5 -2
- package/src/runtime/migrations/__tests__/job-registry.test.ts +346 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +16 -0
- package/src/runtime/migrations/job-registry.ts +281 -0
- package/src/runtime/migrations/vbundle-builder.ts +3 -4
- package/src/runtime/migrations/vbundle-importer.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +0 -13
- package/src/runtime/migrations/vbundle-tar-stream.ts +11 -3
- package/src/runtime/nl-approval-parser.ts +16 -21
- package/src/runtime/pending-interactions.ts +29 -12
- package/src/runtime/routes/__tests__/acp-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +204 -320
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +72 -4
- package/src/runtime/routes/__tests__/stt-routes.test.ts +182 -223
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +230 -0
- package/src/{ipc/__tests__/task-ipc.test.ts → runtime/routes/__tests__/task-routes.test.ts} +116 -96
- package/src/runtime/routes/__tests__/tts-routes.test.ts +185 -289
- package/src/runtime/routes/access-request-decision.ts +25 -50
- package/src/runtime/routes/acp-routes.test.ts +371 -0
- package/src/runtime/routes/acp-routes.ts +392 -166
- package/src/runtime/routes/app-management-routes.ts +464 -660
- package/src/runtime/routes/app-routes.ts +192 -177
- package/src/runtime/routes/approval-routes.ts +116 -434
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +24 -84
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +3 -10
- package/src/runtime/routes/attachment-routes.ts +409 -253
- package/src/runtime/routes/audio-routes.ts +51 -18
- package/src/runtime/routes/avatar-routes.ts +82 -75
- package/src/runtime/routes/background-tool-routes.ts +94 -0
- package/src/runtime/routes/backup-routes.ts +154 -336
- package/src/runtime/routes/brain-graph-routes.ts +83 -110
- package/src/runtime/routes/browser-routes.ts +141 -0
- package/src/runtime/routes/btw-routes.ts +62 -106
- package/src/runtime/routes/cache-routes.ts +96 -0
- package/src/runtime/routes/call-routes.ts +208 -247
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
- package/src/runtime/routes/channel-delivery-routes.ts +25 -27
- package/src/runtime/routes/channel-readiness-routes.ts +83 -120
- package/src/runtime/routes/channel-route-definitions.ts +62 -0
- package/src/runtime/routes/channel-route-shared.ts +14 -18
- package/src/runtime/routes/channel-verification-routes.ts +207 -187
- package/src/runtime/routes/client-routes.ts +48 -0
- package/src/runtime/routes/contact-routes.ts +533 -407
- package/src/runtime/routes/conversation-analysis-routes.ts +48 -49
- package/src/runtime/routes/conversation-attention-routes.ts +55 -67
- package/src/runtime/routes/conversation-list-routes.ts +265 -0
- package/src/runtime/routes/conversation-management-routes.ts +626 -715
- package/src/runtime/routes/conversation-query-routes.ts +510 -460
- package/src/runtime/routes/conversation-routes.ts +456 -368
- package/src/runtime/routes/conversation-starter-routes.ts +121 -71
- package/src/runtime/routes/credential-prompt-routes.ts +124 -0
- package/src/runtime/routes/debug-routes.ts +34 -39
- package/src/runtime/routes/defer-routes.ts +230 -0
- package/src/runtime/routes/diagnostics-routes.ts +79 -70
- package/src/runtime/routes/documents-routes.ts +117 -106
- package/src/runtime/routes/errors.ts +132 -0
- package/src/runtime/routes/events-routes.ts +97 -58
- package/src/runtime/routes/filing-routes.ts +65 -78
- package/src/runtime/routes/global-search-routes.ts +51 -57
- package/src/runtime/routes/group-routes.ts +199 -181
- package/src/runtime/routes/guardian-action-routes.ts +103 -169
- package/src/runtime/routes/guardian-approval-interception.ts +27 -58
- package/src/runtime/routes/guardian-approval-prompt.ts +10 -21
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +2 -6
- package/src/runtime/routes/guardian-expiry-sweep.ts +19 -36
- package/src/runtime/routes/heartbeat-routes.ts +194 -209
- package/src/runtime/routes/home-feed-routes.ts +85 -187
- package/src/runtime/routes/home-state-routes.ts +27 -24
- package/src/runtime/routes/host-bash-routes.ts +42 -52
- package/src/runtime/routes/host-browser-routes.ts +38 -69
- package/src/runtime/routes/host-cu-routes.ts +74 -70
- package/src/runtime/routes/host-file-routes.ts +50 -60
- package/src/runtime/routes/host-transfer-routes.ts +220 -0
- package/src/runtime/routes/http-adapter.ts +172 -0
- package/src/runtime/routes/identity-routes.ts +83 -79
- package/src/runtime/routes/inbound-conversation.ts +11 -18
- package/src/runtime/routes/inbound-message-handler.ts +74 -110
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +79 -138
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +2 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +54 -90
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +25 -50
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +5 -6
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -24
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -10
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +3 -3
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +19 -26
- package/src/runtime/routes/index.ts +197 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +25 -32
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +22 -31
- package/src/runtime/routes/integrations/slack/channel.ts +69 -66
- package/src/runtime/routes/integrations/slack/share.ts +49 -58
- package/src/runtime/routes/integrations/telegram.ts +91 -74
- package/src/runtime/routes/integrations/twilio.ts +163 -240
- package/src/runtime/routes/integrations/vercel.ts +57 -54
- package/src/runtime/routes/interface-routes.ts +43 -0
- package/src/runtime/routes/internal-oauth-routes.ts +56 -0
- package/src/runtime/routes/internal-twilio-routes.ts +46 -0
- package/src/runtime/routes/llm-context-normalization.ts +4 -2
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +90 -100
- package/src/runtime/routes/memory-item-routes.test.ts +152 -175
- package/src/runtime/routes/memory-item-routes.ts +243 -323
- package/src/runtime/routes/memory-v2-routes.ts +193 -0
- package/src/runtime/routes/migration-rollback-routes.ts +167 -212
- package/src/runtime/routes/migration-routes.ts +877 -374
- package/src/runtime/routes/notification-routes.ts +199 -70
- package/src/runtime/routes/oauth-apps.ts +254 -251
- package/src/runtime/routes/oauth-providers.ts +66 -57
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +60 -120
- package/src/runtime/routes/playground/__tests__/guard.test.ts +34 -54
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +107 -151
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +41 -117
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +95 -138
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +115 -217
- package/src/runtime/routes/playground/__tests__/state.test.ts +41 -90
- package/src/runtime/routes/playground/conversation-not-found.ts +9 -11
- package/src/runtime/routes/playground/force-compact.ts +41 -54
- package/src/runtime/routes/playground/guard.ts +18 -19
- package/src/runtime/routes/playground/helpers.ts +103 -0
- package/src/runtime/routes/playground/index.ts +15 -25
- package/src/runtime/routes/playground/inject-failures.ts +48 -64
- package/src/runtime/routes/playground/reset-circuit.ts +31 -57
- package/src/runtime/routes/playground/seed-conversation.ts +66 -92
- package/src/runtime/routes/playground/seeded-conversations.ts +60 -64
- package/src/runtime/routes/playground/state.ts +23 -24
- package/src/runtime/routes/profiler-routes.ts +132 -167
- package/src/runtime/routes/ps-routes.ts +120 -0
- package/src/runtime/routes/recording-routes.ts +197 -258
- package/src/runtime/routes/rename-conversation-routes.ts +89 -0
- package/src/runtime/routes/schedule-routes.ts +238 -242
- package/src/runtime/routes/secret-routes.ts +219 -265
- package/src/runtime/routes/secrets-deps.ts +24 -0
- package/src/runtime/routes/settings-routes.ts +361 -441
- package/src/runtime/routes/skills-routes.ts +434 -469
- package/src/runtime/routes/stt-routes.ts +196 -206
- package/src/runtime/routes/subagents-routes.ts +125 -141
- package/src/runtime/routes/suggest-trust-rule-routes.ts +244 -0
- package/src/runtime/routes/surface-action-routes.ts +135 -190
- package/src/runtime/routes/surface-content-routes.ts +84 -118
- package/src/runtime/routes/task-routes.ts +354 -0
- package/src/runtime/routes/telemetry-routes.ts +33 -49
- package/src/runtime/routes/trace-event-routes.ts +55 -74
- package/src/runtime/routes/trust-rules-routes.ts +147 -239
- package/src/runtime/routes/tts-routes.ts +187 -169
- package/src/runtime/routes/types.ts +139 -0
- package/src/{ipc/routes/ui-request.ts → runtime/routes/ui-request-routes.ts} +23 -17
- package/src/runtime/routes/upgrade-broadcast-routes.ts +156 -197
- package/src/runtime/routes/usage-routes.ts +143 -169
- package/src/runtime/routes/user-routes.ts +102 -18
- package/src/runtime/routes/wake-conversation-routes.ts +49 -0
- package/src/{ipc/routes/watcher.ts → runtime/routes/watcher-routes.ts} +84 -39
- package/src/runtime/routes/wipe-conversation-routes.ts +89 -0
- package/src/runtime/routes/work-items-routes.test.ts +10 -20
- package/src/runtime/routes/work-items-routes.ts +418 -433
- package/src/runtime/routes/workspace-commit-routes.ts +30 -61
- package/src/runtime/routes/workspace-routes.test.ts +254 -381
- package/src/runtime/routes/workspace-routes.ts +238 -246
- package/src/runtime/runtime-mode.ts +8 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +80 -118
- package/src/runtime/services/analyze-conversation.ts +14 -41
- package/src/runtime/services/conversation-serializer.ts +181 -0
- package/src/runtime/trust-context-resolver.ts +3 -2
- package/src/runtime/verification-outbound-actions.ts +13 -49
- package/src/schedule/schedule-store.ts +64 -2
- package/src/schedule/scheduler.ts +101 -0
- package/src/security/ces-credential-client.ts +32 -169
- package/src/security/ces-rpc-credential-backend.ts +1 -1
- package/src/security/credential-backend.ts +6 -6
- package/src/security/oauth-completion-page.ts +1 -1
- package/src/security/oauth2.ts +3 -6
- package/src/sequence/analytics.ts +1 -1
- package/src/sequence/guardrails.ts +3 -3
- package/src/sequence/store.ts +2 -1
- package/src/signals/bash.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/skills/catalog-cache.ts +7 -0
- package/src/skills/catalog-files.ts +0 -5
- package/src/skills/catalog-install.ts +28 -18
- package/src/skills/category-inference.ts +0 -11
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/managed-store.ts +2 -2
- package/src/skills/remote-skill-policy.ts +6 -7
- package/src/subagent/index.ts +2 -6
- package/src/subagent/manager.ts +27 -23
- package/src/subagent/types.ts +9 -0
- package/src/tasks/SPEC.md +2 -2
- package/src/tasks/task-compiler.ts +1 -1
- package/src/tasks/task-runner.ts +2 -22
- package/src/tasks/task-store.ts +1 -1
- package/src/tools/acp/list-agents.test.ts +115 -0
- package/src/tools/acp/list-agents.ts +31 -0
- package/src/tools/acp/spawn.test.ts +379 -0
- package/src/tools/acp/spawn.ts +142 -62
- package/src/tools/acp/steer.test.ts +101 -0
- package/src/tools/acp/steer.ts +38 -0
- package/src/tools/background-tool-registry.ts +98 -0
- package/src/tools/browser/browser-execution.ts +34 -7
- package/src/tools/browser/browser-manager.ts +1 -8
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +1 -1
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +3 -1
- package/src/tools/browser/cdp-client/types.ts +4 -1
- package/src/tools/computer-use/definitions.ts +1 -1
- package/src/tools/credential-execution/make-authenticated-request.ts +2 -2
- package/src/tools/credential-execution/manage-secure-command-tool.ts +1 -1
- package/src/tools/credential-execution/run-authenticated-command.ts +2 -2
- package/src/tools/credentials/broker-types.ts +2 -1
- package/src/tools/document/editor-template.ts +1 -1
- package/src/tools/execution-timeout.ts +1 -1
- package/src/tools/executor.ts +10 -15
- package/src/tools/host-filesystem/transfer.test.ts +268 -0
- package/src/tools/host-filesystem/transfer.ts +234 -0
- package/src/tools/host-terminal/host-shell.ts +189 -11
- package/src/tools/mcp/mcp-tool-factory.ts +1 -1
- package/src/tools/memory/register.test.ts +161 -1
- package/src/tools/memory/register.ts +19 -34
- package/src/tools/permission-checker.ts +18 -219
- package/src/tools/policy-context.ts +1 -8
- package/src/tools/registry.ts +16 -1
- package/src/tools/secret-detection-handler.ts +13 -103
- package/src/tools/shared/shell-output.ts +4 -1
- package/src/tools/side-effects.ts +2 -2
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/subagent/spawn.ts +35 -11
- package/src/tools/terminal/safe-env.ts +9 -1
- package/src/tools/terminal/shell.ts +161 -31
- package/src/tools/tool-approval-handler.ts +4 -70
- package/src/tools/tool-input-summary.ts +10 -0
- package/src/tools/types.ts +143 -163
- package/src/tools/ui-surface/definitions.ts +2 -2
- package/src/util/debounce.ts +0 -21
- package/src/util/errors.ts +0 -8
- package/src/util/log-redact.ts +0 -1
- package/src/util/platform.ts +85 -124
- package/src/util/pricing.ts +109 -6
- package/src/watcher/engine.ts +42 -20
- package/src/watcher/watcher-store.ts +2 -1
- package/src/work-items/work-item-store.ts +1 -1
- package/src/workspace/git-service.ts +1 -6
- package/src/workspace/migrations/006-services-config.ts +10 -1
- package/src/workspace/migrations/017-seed-persona-dirs.ts +1 -1
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +1 -1
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +1 -1
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +3 -4
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +150 -0
- package/src/workspace/migrations/053-release-notes-acp-codex.ts +107 -0
- package/src/workspace/migrations/054-seed-recall-callsite.ts +102 -0
- package/src/workspace/migrations/055-release-notes-agentic-recall.ts +63 -0
- package/src/workspace/migrations/056-release-notes-inference-profile-reordering.ts +65 -0
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +98 -0
- package/src/workspace/migrations/058-release-notes-acp-sessions-ui.ts +71 -0
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +53 -0
- package/src/workspace/migrations/060-memory-v2-init.ts +53 -0
- package/src/workspace/migrations/rebuild-conversation-disk-view.ts +1 -1
- package/src/workspace/migrations/registry.ts +18 -0
- package/src/workspace/migrations/runner.ts +2 -2
- package/src/workspace/provider-commit-message-generator.ts +1 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +0 -471
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +0 -436
- package/src/__tests__/cli-command-risk-guard.test.ts +0 -368
- package/src/__tests__/config-watcher-feature-flags.test.ts +0 -211
- package/src/__tests__/conversation-approval-overrides.test.ts +0 -207
- package/src/__tests__/conversation-host-access-routes.test.ts +0 -229
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +0 -226
- package/src/__tests__/conversation-tool-setup-side-effect-flag.test.ts +0 -167
- package/src/__tests__/ephemeral-permissions.test.ts +0 -474
- package/src/__tests__/extension-id-sync-guard.test.ts +0 -241
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +0 -374
- package/src/__tests__/native-host-marker-sync-guard.test.ts +0 -157
- package/src/__tests__/pairing-concurrent.test.ts +0 -84
- package/src/__tests__/pairing-routes.test.ts +0 -181
- package/src/__tests__/parser.test.ts +0 -595
- package/src/__tests__/permission-checker-host-gate.test.ts +0 -488
- package/src/__tests__/permission-controls-v2-flag.test.ts +0 -55
- package/src/__tests__/permission-mode.test.ts +0 -89
- package/src/__tests__/provider-env-vars-scope.test.ts +0 -52
- package/src/__tests__/risk-classifier-parity.test.ts +0 -230
- package/src/__tests__/shell-identity.test.ts +0 -236
- package/src/__tests__/shell-parser-fuzz.test.ts +0 -629
- package/src/__tests__/shell-parser-property.test.ts +0 -936
- package/src/__tests__/starter-bundle.test.ts +0 -173
- package/src/__tests__/stt-catalog-parity.test.ts +0 -282
- package/src/__tests__/task-runner.test.ts +0 -224
- package/src/__tests__/tool-executor-shell-integration.test.ts +0 -354
- package/src/__tests__/trust-store-pattern-matches.test.ts +0 -29
- package/src/__tests__/trust-store.test.ts +0 -2013
- package/src/__tests__/v2-consent-policy.test.ts +0 -103
- package/src/browser/identifiers.ts +0 -51
- package/src/cli/db.ts +0 -1
- package/src/config/bundled-skills/settings/tools/avatar-get.ts +0 -40
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +0 -64
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +0 -88
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +0 -127
- package/src/daemon/approved-devices-store.ts +0 -110
- package/src/daemon/external-skills-bootstrap.ts +0 -41
- package/src/daemon/message-types/trust.ts +0 -71
- package/src/daemon/pairing-store.ts +0 -229
- package/src/ipc/cli-server.ts +0 -252
- package/src/ipc/routes/attachment.ts +0 -114
- package/src/ipc/routes/browser-context.ts +0 -63
- package/src/ipc/routes/browser.ts +0 -97
- package/src/ipc/routes/cache.ts +0 -96
- package/src/ipc/routes/get-contact.ts +0 -16
- package/src/ipc/routes/index.ts +0 -35
- package/src/ipc/routes/list-clients.ts +0 -31
- package/src/ipc/routes/merge-contacts.ts +0 -17
- package/src/ipc/routes/notification.ts +0 -133
- package/src/ipc/routes/rename-conversation.ts +0 -59
- package/src/ipc/routes/search-contacts.ts +0 -19
- package/src/ipc/routes/task-queue.ts +0 -226
- package/src/ipc/routes/task.ts +0 -173
- package/src/ipc/routes/upsert-contact.ts +0 -25
- package/src/ipc/routes/wake-conversation.ts +0 -19
- package/src/memory/db.ts +0 -23
- package/src/permissions/arg-parser.test.ts +0 -161
- package/src/permissions/arg-parser.ts +0 -141
- package/src/permissions/bash-risk-classifier.test.ts +0 -1620
- package/src/permissions/bash-risk-classifier.ts +0 -950
- package/src/permissions/command-registry.test.ts +0 -774
- package/src/permissions/command-registry.ts +0 -1005
- package/src/permissions/defaults.ts +0 -314
- package/src/permissions/file-risk-classifier.test.ts +0 -535
- package/src/permissions/file-risk-classifier.ts +0 -274
- package/src/permissions/permission-mode.ts +0 -24
- package/src/permissions/schedule-risk-classifier.test.ts +0 -129
- package/src/permissions/schedule-risk-classifier.ts +0 -85
- package/src/permissions/shell-identity.ts +0 -297
- package/src/permissions/skill-risk-classifier.test.ts +0 -311
- package/src/permissions/skill-risk-classifier.ts +0 -214
- package/src/permissions/trust-client.ts +0 -359
- package/src/permissions/trust-store-interface.ts +0 -100
- package/src/permissions/trust-store.ts +0 -1330
- package/src/permissions/v2-consent-policy.ts +0 -87
- package/src/permissions/web-risk-classifier.test.ts +0 -170
- package/src/permissions/web-risk-classifier.ts +0 -89
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +0 -715
- package/src/runtime/__tests__/capability-tokens.test.ts +0 -258
- package/src/runtime/actor-refresh-token-store.ts +0 -156
- package/src/runtime/actor-token-store.ts +0 -207
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -264
- package/src/runtime/auth/credential-service.ts +0 -352
- package/src/runtime/conversation-approval-overrides.ts +0 -86
- package/src/runtime/routes/browser-extension-pair-routes.ts +0 -575
- package/src/runtime/routes/channel-routes.ts +0 -112
- package/src/runtime/routes/contact-routes.test.ts +0 -298
- package/src/runtime/routes/guardian-bootstrap-routes.ts +0 -175
- package/src/runtime/routes/guardian-refresh-routes.ts +0 -79
- package/src/runtime/routes/invite-routes.ts +0 -280
- package/src/runtime/routes/pairing-routes.ts +0 -431
- package/src/runtime/routes/playground/deps.ts +0 -56
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +0 -67
- package/src/runtime/services/analyze-deps-singleton.ts +0 -32
- package/src/tasks/ephemeral-permissions.ts +0 -55
- package/src/tools/terminal/parser.ts +0 -623
- package/src/types/qrcode.d.ts +0 -13
- package/src/util/network-info.ts +0 -55
- /package/node_modules/@vellumai/{ces-contracts → ces-client}/tsconfig.json +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/grants.test.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/error.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/grants.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/handles.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rendering.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rpc.ts +0 -0
|
@@ -0,0 +1,781 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `MeetHostSupervisor` — owns the lifecycle of the lazily-spawned
|
|
3
|
+
* `bun run skills/meet-join/register.ts` child process (the meet-host).
|
|
4
|
+
*
|
|
5
|
+
* The daemon stays skill-agnostic at the process layer: the supervisor
|
|
6
|
+
* is the one place that knows how to find the bun binary, resolve the
|
|
7
|
+
* installed skill path, spawn the child, wait for its handshake, count
|
|
8
|
+
* active sessions, and idle-shut it down. The IPC surface between the
|
|
9
|
+
* two processes lives in `assistant/src/ipc/skill-server.ts` and the
|
|
10
|
+
* `host.registries.*` routes that back it.
|
|
11
|
+
*
|
|
12
|
+
* ## Lifecycle
|
|
13
|
+
*
|
|
14
|
+
* - `ensureRunning()` — idempotent. First caller triggers
|
|
15
|
+
* `child_process.spawn`, subsequent concurrent callers await the
|
|
16
|
+
* same in-flight promise. Resolves once the child dials
|
|
17
|
+
* `assistant-skill.sock` and sends a handshake frame (via
|
|
18
|
+
* `notifyHandshake`) whose reported source-tree hash matches the
|
|
19
|
+
* shipped manifest's hash. A mismatch kills the spawn and throws
|
|
20
|
+
* a clear error pointing the user at regenerating the manifest.
|
|
21
|
+
*
|
|
22
|
+
* - `reportSessionStarted(id)` / `reportSessionEnded(id)` — mutate
|
|
23
|
+
* the active-session counter, called by the
|
|
24
|
+
* `host.registries.report_session_*` IPC routes. The counter is
|
|
25
|
+
* tracked by session id (Set of live ids) so duplicate or
|
|
26
|
+
* out-of-order `ended` frames can't drop the count below zero.
|
|
27
|
+
*
|
|
28
|
+
* - `setActiveConnection(connection)` / `clearActiveConnection()` —
|
|
29
|
+
* called by the `host.registries.register_*` route handlers when
|
|
30
|
+
* the child sends its first registration frame. Pinning the live
|
|
31
|
+
* `SkillIpcConnection` lets `dispatchTool/Route/Shutdown` route
|
|
32
|
+
* daemon→skill RPC traffic to the right peer.
|
|
33
|
+
*
|
|
34
|
+
* - `dispatchTool` / `dispatchRoute` / `dispatchShutdown` — send
|
|
35
|
+
* `skill.dispatch_*` / `skill.shutdown` frames to the meet-host
|
|
36
|
+
* child over the active connection and resolve with its response.
|
|
37
|
+
* Used by the manifest proxies installed in `meet-manifest-loader`.
|
|
38
|
+
*
|
|
39
|
+
* - Idle timer — when the counter reaches zero the supervisor arms
|
|
40
|
+
* a 5-minute timer (configurable via
|
|
41
|
+
* `services.meet.host.idle_timeout_ms`). On expiry it sends a
|
|
42
|
+
* `skill.shutdown` frame over the IPC socket (best-effort — if no
|
|
43
|
+
* IPC sink is wired yet the supervisor still falls through to the
|
|
44
|
+
* signal path), waits briefly for graceful exit, then
|
|
45
|
+
* SIGTERM/SIGKILLs the child. Any new session before the timer
|
|
46
|
+
* fires disarms it.
|
|
47
|
+
*
|
|
48
|
+
* - Crash detection — the supervisor listens for the child's `exit`
|
|
49
|
+
* event; when it fires unexpectedly the handle is nulled and the
|
|
50
|
+
* next `ensureRunning()` call respawns.
|
|
51
|
+
*
|
|
52
|
+
* - `shutdown()` — graceful termination on daemon shutdown.
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
import {
|
|
56
|
+
type ChildProcess,
|
|
57
|
+
spawn as defaultSpawn,
|
|
58
|
+
type SpawnOptions,
|
|
59
|
+
} from "node:child_process";
|
|
60
|
+
import { connect as defaultConnect, type Socket } from "node:net";
|
|
61
|
+
|
|
62
|
+
import { getConfig, getNestedValue } from "../config/loader.js";
|
|
63
|
+
import type { SkillIpcConnection } from "../ipc/skill-server.js";
|
|
64
|
+
import { getSkillSocketPath } from "../ipc/skill-socket-path.js";
|
|
65
|
+
import { getLogger } from "../util/logger.js";
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Shipped manifest payload the supervisor needs for handshake
|
|
69
|
+
* validation. Callers load the JSON manifest (written by
|
|
70
|
+
* `skills/meet-join/scripts/emit-manifest.ts`) and pass just the
|
|
71
|
+
* hash through. Accepting the value rather than reading the file
|
|
72
|
+
* keeps the supervisor free of path assumptions and simplifies
|
|
73
|
+
* tests.
|
|
74
|
+
*/
|
|
75
|
+
export interface MeetHostManifest {
|
|
76
|
+
/** SHA-256 of the shipped skill source tree. */
|
|
77
|
+
sourceHash: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Payload the external IPC route handler passes to `notifyHandshake`
|
|
82
|
+
* when the meet-host sends its `register_tools` / `ready` frame.
|
|
83
|
+
* Currently just the source hash; additional fields (pid echo,
|
|
84
|
+
* protocol version) can be threaded through later without a
|
|
85
|
+
* signature break.
|
|
86
|
+
*/
|
|
87
|
+
export interface MeetHostHandshakePayload {
|
|
88
|
+
sourceHash: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Minimal sender surface the supervisor needs to dispatch frames over
|
|
93
|
+
* the bidirectional skill IPC channel. {@link SkillIpcServer.sendRequest}
|
|
94
|
+
* satisfies this shape; tests can pass a stub that records calls instead.
|
|
95
|
+
*
|
|
96
|
+
* Pulling the dependency through a one-method interface keeps the
|
|
97
|
+
* supervisor unaware of the rest of the IPC server's surface and avoids a
|
|
98
|
+
* circular import in tests that already stub `skill-server.js`.
|
|
99
|
+
*/
|
|
100
|
+
export interface SkillRequestSender {
|
|
101
|
+
sendRequest(
|
|
102
|
+
connection: SkillIpcConnection,
|
|
103
|
+
method: string,
|
|
104
|
+
params?: unknown,
|
|
105
|
+
opts?: { timeoutMs?: number },
|
|
106
|
+
): Promise<unknown>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Dependencies the supervisor needs to spawn and supervise the
|
|
111
|
+
* child. All are optional on construction — production callers
|
|
112
|
+
* rely on the defaults and tests override one or two at a time.
|
|
113
|
+
*/
|
|
114
|
+
export interface MeetHostSupervisorDeps {
|
|
115
|
+
/** Absolute path to the shipped `meet-join` skill dir, containing `register.ts`. */
|
|
116
|
+
skillRuntimePath: string;
|
|
117
|
+
/** Absolute path to a standalone bun binary, or `"bun"` for PATH lookup. */
|
|
118
|
+
bunBinaryPath: string;
|
|
119
|
+
/** Path to the skill IPC socket the child should dial. */
|
|
120
|
+
skillSocketPath?: string;
|
|
121
|
+
/** Shipped manifest (source of the hash we check handshake against). */
|
|
122
|
+
manifest: MeetHostManifest;
|
|
123
|
+
/**
|
|
124
|
+
* Sender used to dispatch `skill.dispatch_*` and `skill.shutdown` frames
|
|
125
|
+
* back to the meet-host child over the active IPC connection. Optional
|
|
126
|
+
* because the bootstrap wires this at runtime via the daemon-wide
|
|
127
|
+
* sender; tests that exercise lifecycle without dispatch can omit it.
|
|
128
|
+
*/
|
|
129
|
+
ipcSender?: SkillRequestSender;
|
|
130
|
+
/** Child-process spawn function (override for tests). */
|
|
131
|
+
spawnFn?: (
|
|
132
|
+
command: string,
|
|
133
|
+
args: readonly string[],
|
|
134
|
+
options: SpawnOptions,
|
|
135
|
+
) => ChildProcess;
|
|
136
|
+
/**
|
|
137
|
+
* Socket-connect function used to open an IPC control channel for
|
|
138
|
+
* sending `skill.shutdown` on idle. Override for tests.
|
|
139
|
+
*/
|
|
140
|
+
connectFn?: (path: string) => Socket;
|
|
141
|
+
/** Override for the idle timeout in ms. Falls back to config key then default. */
|
|
142
|
+
idleTimeoutMsOverride?: number;
|
|
143
|
+
/** How long (ms) to wait for graceful exit before SIGTERM on idle/shutdown. */
|
|
144
|
+
gracefulExitGraceMs?: number;
|
|
145
|
+
/** How long (ms) to wait after SIGTERM before SIGKILL. */
|
|
146
|
+
sigkillGraceMs?: number;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Default idle timeout when no config override is set: 5 minutes. */
|
|
150
|
+
const DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
151
|
+
/** Config path for overriding the idle timeout. */
|
|
152
|
+
const IDLE_TIMEOUT_CONFIG_KEY = "services.meet.host.idle_timeout_ms";
|
|
153
|
+
/** Default grace period for a `skill.shutdown` frame to induce clean exit. */
|
|
154
|
+
const DEFAULT_GRACEFUL_EXIT_GRACE_MS = 2_000;
|
|
155
|
+
/** Default grace period between SIGTERM and SIGKILL. */
|
|
156
|
+
const DEFAULT_SIGKILL_GRACE_MS = 1_000;
|
|
157
|
+
|
|
158
|
+
const log = getLogger("meet-host-supervisor");
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Module-level reference to the daemon's `SkillIpcServer.sendRequest`
|
|
162
|
+
* capability. The bootstrap constructs the supervisor before the
|
|
163
|
+
* `DaemonServer` instance exists, so the supervisor cannot receive the
|
|
164
|
+
* sender via constructor injection on the production path. The daemon
|
|
165
|
+
* sets this once during construction (see `daemon/server.ts`) and the
|
|
166
|
+
* supervisor consults it lazily at dispatch time. Tests still inject
|
|
167
|
+
* `ipcSender` directly via constructor deps and bypass this global.
|
|
168
|
+
*/
|
|
169
|
+
let globalIpcSender: SkillRequestSender | null = null;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Install the daemon-wide skill IPC sender used by every supervisor that
|
|
173
|
+
* doesn't carry an explicit `ipcSender` dep. Idempotent: re-installing
|
|
174
|
+
* the same sender is a no-op so the daemon can call this from any setup
|
|
175
|
+
* path without double-wiring.
|
|
176
|
+
*/
|
|
177
|
+
export function setGlobalSkillIpcSender(sender: SkillRequestSender): void {
|
|
178
|
+
globalIpcSender = sender;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** Test-only: drop the global sender between tests. */
|
|
182
|
+
export function __clearGlobalSkillIpcSenderForTesting(): void {
|
|
183
|
+
globalIpcSender = null;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Read the idle timeout from config, falling back to the default. The
|
|
188
|
+
* config-loader `getNestedValue` helper is nullable; we coerce only
|
|
189
|
+
* finite positive numbers and log + drop any other value so a malformed
|
|
190
|
+
* config entry can't disable the idle shutdown entirely.
|
|
191
|
+
*/
|
|
192
|
+
function readIdleTimeoutFromConfig(): number {
|
|
193
|
+
try {
|
|
194
|
+
const raw = getNestedValue(
|
|
195
|
+
getConfig() as unknown as Record<string, unknown>,
|
|
196
|
+
IDLE_TIMEOUT_CONFIG_KEY,
|
|
197
|
+
);
|
|
198
|
+
if (typeof raw === "number" && Number.isFinite(raw) && raw >= 0) {
|
|
199
|
+
return raw;
|
|
200
|
+
}
|
|
201
|
+
if (raw !== undefined) {
|
|
202
|
+
log.warn(
|
|
203
|
+
{ configKey: IDLE_TIMEOUT_CONFIG_KEY, value: raw },
|
|
204
|
+
"Ignoring non-numeric idle timeout override from config",
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
} catch (err) {
|
|
208
|
+
log.warn({ err }, "Failed to read idle timeout config; using default");
|
|
209
|
+
}
|
|
210
|
+
return DEFAULT_IDLE_TIMEOUT_MS;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export class MeetHostSupervisor {
|
|
214
|
+
private readonly skillRuntimePath: string;
|
|
215
|
+
private readonly bunBinaryPath: string;
|
|
216
|
+
private readonly skillSocketPath: string;
|
|
217
|
+
private readonly manifest: MeetHostManifest;
|
|
218
|
+
private readonly spawnFn: NonNullable<MeetHostSupervisorDeps["spawnFn"]>;
|
|
219
|
+
private readonly connectFn: NonNullable<MeetHostSupervisorDeps["connectFn"]>;
|
|
220
|
+
private readonly idleTimeoutMs: number;
|
|
221
|
+
private readonly gracefulExitGraceMs: number;
|
|
222
|
+
private readonly sigkillGraceMs: number;
|
|
223
|
+
private readonly ipcSender: SkillRequestSender | null;
|
|
224
|
+
|
|
225
|
+
private child: ChildProcess | null = null;
|
|
226
|
+
private spawnPromise: Promise<void> | null = null;
|
|
227
|
+
private handshakeResolve: (() => void) | null = null;
|
|
228
|
+
private handshakeReject: ((err: Error) => void) | null = null;
|
|
229
|
+
private readonly activeSessions = new Set<string>();
|
|
230
|
+
private idleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
231
|
+
private shuttingDown = false;
|
|
232
|
+
/**
|
|
233
|
+
* Live IPC connection to the meet-host child. Captured by the
|
|
234
|
+
* `host.registries.register_*` route handlers when the child sends its
|
|
235
|
+
* first registration frame, cleared on disconnect/shutdown. Dispatch
|
|
236
|
+
* methods reject when this is `null`.
|
|
237
|
+
*/
|
|
238
|
+
private activeConnection: SkillIpcConnection | null = null;
|
|
239
|
+
|
|
240
|
+
constructor(deps: MeetHostSupervisorDeps) {
|
|
241
|
+
this.skillRuntimePath = deps.skillRuntimePath;
|
|
242
|
+
this.bunBinaryPath = deps.bunBinaryPath;
|
|
243
|
+
this.skillSocketPath = deps.skillSocketPath ?? getSkillSocketPath();
|
|
244
|
+
this.manifest = deps.manifest;
|
|
245
|
+
this.ipcSender = deps.ipcSender ?? null;
|
|
246
|
+
this.spawnFn = deps.spawnFn ?? defaultSpawn;
|
|
247
|
+
this.connectFn = deps.connectFn ?? defaultConnect;
|
|
248
|
+
this.idleTimeoutMs =
|
|
249
|
+
deps.idleTimeoutMsOverride ?? readIdleTimeoutFromConfig();
|
|
250
|
+
this.gracefulExitGraceMs =
|
|
251
|
+
deps.gracefulExitGraceMs ?? DEFAULT_GRACEFUL_EXIT_GRACE_MS;
|
|
252
|
+
this.sigkillGraceMs = deps.sigkillGraceMs ?? DEFAULT_SIGKILL_GRACE_MS;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Ensure the meet-host child is spawned, the IPC handshake has been
|
|
257
|
+
* received, and the manifest hash validated. Idempotent: a second
|
|
258
|
+
* call while the child is already running is a no-op; a second call
|
|
259
|
+
* during an in-flight spawn awaits the same promise.
|
|
260
|
+
*/
|
|
261
|
+
ensureRunning(): Promise<void> {
|
|
262
|
+
if (this.shuttingDown) {
|
|
263
|
+
return Promise.reject(
|
|
264
|
+
new Error("MeetHostSupervisor is shutting down; cannot spawn"),
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
if (this.child && !this.child.killed && this.child.exitCode == null) {
|
|
268
|
+
return this.spawnPromise ?? Promise.resolve();
|
|
269
|
+
}
|
|
270
|
+
if (this.spawnPromise) return this.spawnPromise;
|
|
271
|
+
|
|
272
|
+
this.spawnPromise = this.spawnAndHandshake().catch((err) => {
|
|
273
|
+
this.spawnPromise = null;
|
|
274
|
+
this.teardownChild();
|
|
275
|
+
throw err;
|
|
276
|
+
});
|
|
277
|
+
return this.spawnPromise;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Called by the IPC route handler when the child sends its
|
|
282
|
+
* `host.registries.register_tools` / `ready` frame. The supervisor
|
|
283
|
+
* validates the reported source hash against the shipped manifest
|
|
284
|
+
* and either resolves or rejects the in-flight `ensureRunning()`
|
|
285
|
+
* promise accordingly.
|
|
286
|
+
*
|
|
287
|
+
* Intentionally public so PR 24's `host.registries.*` route (which
|
|
288
|
+
* owns the IPC socket) can forward the payload without the
|
|
289
|
+
* supervisor owning any socket state itself.
|
|
290
|
+
*/
|
|
291
|
+
notifyHandshake(payload: MeetHostHandshakePayload): void {
|
|
292
|
+
if (!this.handshakeResolve || !this.handshakeReject) {
|
|
293
|
+
log.debug("notifyHandshake called with no in-flight spawn; ignoring");
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (payload.sourceHash !== this.manifest.sourceHash) {
|
|
297
|
+
const err = new Error(
|
|
298
|
+
`meet-join source hash mismatch: handshake reported ${payload.sourceHash} ` +
|
|
299
|
+
`but manifest expects ${this.manifest.sourceHash}. ` +
|
|
300
|
+
"Regenerate the meet-join manifest or rebuild the assistant to match.",
|
|
301
|
+
);
|
|
302
|
+
this.handshakeReject(err);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
this.handshakeResolve();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Increment the active-session counter. Called by PR 24's
|
|
310
|
+
* `host.registries.report_session_started` IPC route when a new
|
|
311
|
+
* meet session is joined. Idempotent for the same id.
|
|
312
|
+
*/
|
|
313
|
+
reportSessionStarted(sessionId: string): void {
|
|
314
|
+
this.activeSessions.add(sessionId);
|
|
315
|
+
if (this.idleTimer) {
|
|
316
|
+
clearTimeout(this.idleTimer);
|
|
317
|
+
this.idleTimer = null;
|
|
318
|
+
log.debug({ sessionId }, "Idle timer cancelled — new session active");
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Decrement the active-session counter. Called by PR 24's
|
|
324
|
+
* `host.registries.report_session_ended` IPC route when a meet
|
|
325
|
+
* session completes. When the counter drops to zero the idle
|
|
326
|
+
* timer is armed.
|
|
327
|
+
*/
|
|
328
|
+
reportSessionEnded(sessionId: string): void {
|
|
329
|
+
const had = this.activeSessions.delete(sessionId);
|
|
330
|
+
if (!had) {
|
|
331
|
+
log.debug({ sessionId }, "Ignoring report_session_ended for unknown id");
|
|
332
|
+
}
|
|
333
|
+
if (this.activeSessions.size === 0) {
|
|
334
|
+
this.armIdleTimer();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Read-only view of the active session count — exposed for
|
|
340
|
+
* diagnostics and tests. Not part of the IPC protocol.
|
|
341
|
+
*/
|
|
342
|
+
get activeSessionCount(): number {
|
|
343
|
+
return this.activeSessions.size;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** Whether the child is currently running. Exposed for tests. */
|
|
347
|
+
get isRunning(): boolean {
|
|
348
|
+
return (
|
|
349
|
+
this.child != null && !this.child.killed && this.child.exitCode == null
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Register the live IPC connection to the meet-host child. The
|
|
355
|
+
* `host.registries.register_*` route handlers call this once the child
|
|
356
|
+
* has dialed the skill socket and started installing tools/routes —
|
|
357
|
+
* that handshake doubles as the signal that the child is ready to
|
|
358
|
+
* receive `skill.dispatch_*` frames.
|
|
359
|
+
*
|
|
360
|
+
* Re-registering with the same connection is a no-op so duplicate
|
|
361
|
+
* `register_tools` / `register_skill_route` / `register_shutdown_hook`
|
|
362
|
+
* frames from the same child do not churn the field. A different
|
|
363
|
+
* connection replaces the old one — the prior child is presumed dead
|
|
364
|
+
* (its socket close path has already cleared its handles via
|
|
365
|
+
* {@link clearActiveConnection} or `dispose()`).
|
|
366
|
+
*/
|
|
367
|
+
setActiveConnection(connection: SkillIpcConnection): void {
|
|
368
|
+
if (this.activeConnection === connection) return;
|
|
369
|
+
this.activeConnection = connection;
|
|
370
|
+
log.debug(
|
|
371
|
+
{ connectionId: connection.connectionId },
|
|
372
|
+
"Active meet-host IPC connection registered",
|
|
373
|
+
);
|
|
374
|
+
// The first `host.registries.register_*` frame doubles as the
|
|
375
|
+
// readiness signal: it means `register(client)` ran to completion and
|
|
376
|
+
// the IPC socket is healthy. Resolve any in-flight handshake so
|
|
377
|
+
// `ensureRunning()` unblocks. `notifyHandshake` remains the path for
|
|
378
|
+
// callers that send a dedicated hash-bearing handshake frame.
|
|
379
|
+
this.handshakeResolve?.();
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Drop the active IPC connection. Called by route handlers (or future
|
|
384
|
+
* connection-disconnect plumbing) when the meet-host child goes away;
|
|
385
|
+
* subsequent dispatches will trigger a fresh `ensureRunning()` and a
|
|
386
|
+
* new handshake before any frame is sent.
|
|
387
|
+
*/
|
|
388
|
+
clearActiveConnection(): void {
|
|
389
|
+
if (!this.activeConnection) return;
|
|
390
|
+
log.debug(
|
|
391
|
+
{ connectionId: this.activeConnection.connectionId },
|
|
392
|
+
"Active meet-host IPC connection cleared",
|
|
393
|
+
);
|
|
394
|
+
this.activeConnection = null;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Dispatch a tool invocation to the meet-host child over the
|
|
399
|
+
* bidirectional IPC channel. Spawns the child first if it isn't
|
|
400
|
+
* running, fails fast if no IPC sender was injected, and propagates
|
|
401
|
+
* any remote error back to the caller (the LLM-facing tool execute).
|
|
402
|
+
*/
|
|
403
|
+
async dispatchTool(
|
|
404
|
+
name: string,
|
|
405
|
+
input: unknown,
|
|
406
|
+
context?: unknown,
|
|
407
|
+
): Promise<unknown> {
|
|
408
|
+
const connection = await this.ensureConnection(`dispatch_tool:${name}`);
|
|
409
|
+
const sender = this.requireSender(`dispatch_tool:${name}`);
|
|
410
|
+
const response = await sender.sendRequest(
|
|
411
|
+
connection,
|
|
412
|
+
"skill.dispatch_tool",
|
|
413
|
+
{
|
|
414
|
+
name,
|
|
415
|
+
input,
|
|
416
|
+
context,
|
|
417
|
+
},
|
|
418
|
+
);
|
|
419
|
+
// The skill-side handler wraps the tool's return value in
|
|
420
|
+
// `{ result }` so the daemon can distinguish the wrapper from a
|
|
421
|
+
// potentially-undefined tool return; unwrap before handing back.
|
|
422
|
+
if (
|
|
423
|
+
response &&
|
|
424
|
+
typeof response === "object" &&
|
|
425
|
+
"result" in (response as Record<string, unknown>)
|
|
426
|
+
) {
|
|
427
|
+
return (response as { result: unknown }).result;
|
|
428
|
+
}
|
|
429
|
+
return response;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* Dispatch an HTTP route invocation to the meet-host child. The skill
|
|
434
|
+
* looks up the route by `patternSource`, invokes its handler with a
|
|
435
|
+
* synthesized `Request`, and returns a `{ status, headers, body }`
|
|
436
|
+
* envelope the daemon-side proxy materializes back into a `Response`.
|
|
437
|
+
*/
|
|
438
|
+
async dispatchRoute(
|
|
439
|
+
patternSource: string,
|
|
440
|
+
request: {
|
|
441
|
+
method: string;
|
|
442
|
+
url: string;
|
|
443
|
+
headers?: Record<string, string>;
|
|
444
|
+
body?: string;
|
|
445
|
+
},
|
|
446
|
+
): Promise<{
|
|
447
|
+
status: number;
|
|
448
|
+
headers: Record<string, string>;
|
|
449
|
+
body: string;
|
|
450
|
+
}> {
|
|
451
|
+
const connection = await this.ensureConnection(
|
|
452
|
+
`dispatch_route:${patternSource}`,
|
|
453
|
+
);
|
|
454
|
+
const sender = this.requireSender(`dispatch_route:${patternSource}`);
|
|
455
|
+
const response = await sender.sendRequest(
|
|
456
|
+
connection,
|
|
457
|
+
"skill.dispatch_route",
|
|
458
|
+
{ patternSource, request },
|
|
459
|
+
);
|
|
460
|
+
return response as {
|
|
461
|
+
status: number;
|
|
462
|
+
headers: Record<string, string>;
|
|
463
|
+
body: string;
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Dispatch a shutdown hook invocation. With `name` set, runs only that
|
|
469
|
+
* hook on the skill side; otherwise the skill runs every registered
|
|
470
|
+
* hook in reverse-registration order. Returns once the skill has
|
|
471
|
+
* acknowledged completion. Safe to call when no connection is active
|
|
472
|
+
* (or no sender is wired) — the call is a best-effort notification and
|
|
473
|
+
* silently no-ops in those cases since the supervisor's process-level
|
|
474
|
+
* `shutdown()` will tear the child down regardless.
|
|
475
|
+
*/
|
|
476
|
+
async dispatchShutdown(name?: string, reason?: string): Promise<void> {
|
|
477
|
+
if (!this.activeConnection) {
|
|
478
|
+
log.debug(
|
|
479
|
+
{ name, reason },
|
|
480
|
+
"dispatchShutdown skipped: no active meet-host connection",
|
|
481
|
+
);
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
const sender = this.ipcSender ?? globalIpcSender;
|
|
485
|
+
if (!sender) {
|
|
486
|
+
log.debug(
|
|
487
|
+
{ name, reason },
|
|
488
|
+
"dispatchShutdown skipped: no IPC sender available",
|
|
489
|
+
);
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
const params: Record<string, unknown> = {};
|
|
493
|
+
if (name !== undefined) params.name = name;
|
|
494
|
+
if (reason !== undefined) params.reason = reason;
|
|
495
|
+
await sender.sendRequest(this.activeConnection, "skill.shutdown", params);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Graceful termination. Cancels the idle timer, sends
|
|
500
|
+
* `skill.shutdown` to the child, then SIGTERM → SIGKILL on
|
|
501
|
+
* escalation. Safe to call multiple times. `stopChild` calls
|
|
502
|
+
* `teardownChild` which already nulls `activeConnection`, so no
|
|
503
|
+
* separate clear is needed here.
|
|
504
|
+
*/
|
|
505
|
+
async shutdown(): Promise<void> {
|
|
506
|
+
this.shuttingDown = true;
|
|
507
|
+
if (this.idleTimer) {
|
|
508
|
+
clearTimeout(this.idleTimer);
|
|
509
|
+
this.idleTimer = null;
|
|
510
|
+
}
|
|
511
|
+
await this.stopChild("daemon-shutdown");
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// ── Internal ──────────────────────────────────────────────────────────
|
|
515
|
+
|
|
516
|
+
private async spawnAndHandshake(): Promise<void> {
|
|
517
|
+
const registerPath = `${this.skillRuntimePath}/register.ts`;
|
|
518
|
+
log.info(
|
|
519
|
+
{
|
|
520
|
+
bun: this.bunBinaryPath,
|
|
521
|
+
register: registerPath,
|
|
522
|
+
socket: this.skillSocketPath,
|
|
523
|
+
},
|
|
524
|
+
"Spawning meet-host child process",
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
const child = this.spawnFn(
|
|
528
|
+
this.bunBinaryPath,
|
|
529
|
+
[
|
|
530
|
+
"run",
|
|
531
|
+
registerPath,
|
|
532
|
+
`--ipc=${this.skillSocketPath}`,
|
|
533
|
+
"--skill-id=meet-join",
|
|
534
|
+
],
|
|
535
|
+
{
|
|
536
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
537
|
+
env: {
|
|
538
|
+
...process.env,
|
|
539
|
+
VELLUM_SKILL_IPC_SOCKET: this.skillSocketPath,
|
|
540
|
+
VELLUM_SKILL_ID: "meet-join",
|
|
541
|
+
},
|
|
542
|
+
},
|
|
543
|
+
);
|
|
544
|
+
this.child = child;
|
|
545
|
+
|
|
546
|
+
// Forward stdout/stderr to the daemon log so meet-host diagnostics
|
|
547
|
+
// aren't lost. Best-effort — streams may be null in tests.
|
|
548
|
+
child.stdout?.on("data", (chunk: Buffer) => {
|
|
549
|
+
const text = chunk.toString().trim();
|
|
550
|
+
if (text) log.info({ source: "meet-host-stdout" }, text);
|
|
551
|
+
});
|
|
552
|
+
child.stderr?.on("data", (chunk: Buffer) => {
|
|
553
|
+
const text = chunk.toString().trim();
|
|
554
|
+
if (text) log.warn({ source: "meet-host-stderr" }, text);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
child.on("exit", (code, signal) => {
|
|
558
|
+
log.info({ code, signal }, "meet-host child exited");
|
|
559
|
+
// Stale exit from a child we already replaced: SIGKILL delivers
|
|
560
|
+
// SIGCHLD on a later event-loop tick, so an old child's exit can
|
|
561
|
+
// fire after teardownChild has nulled the field and ensureRunning
|
|
562
|
+
// has spawned a successor. Mutating supervisor state here would
|
|
563
|
+
// reject the new child's handshake and SIGKILL it.
|
|
564
|
+
if (this.child !== child) return;
|
|
565
|
+
// Reject any in-flight handshake so callers fail fast instead of
|
|
566
|
+
// hanging waiting for a frame that will never arrive.
|
|
567
|
+
if (this.handshakeReject) {
|
|
568
|
+
this.handshakeReject(
|
|
569
|
+
new Error(
|
|
570
|
+
`meet-host exited before handshake (code=${code ?? "null"}, ` +
|
|
571
|
+
`signal=${signal ?? "null"})`,
|
|
572
|
+
),
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
this.teardownChild();
|
|
576
|
+
});
|
|
577
|
+
child.on("error", (err) => {
|
|
578
|
+
log.error({ err }, "meet-host spawn error");
|
|
579
|
+
if (this.child !== child) return;
|
|
580
|
+
if (this.handshakeReject) this.handshakeReject(err);
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
await new Promise<void>((resolve, reject) => {
|
|
584
|
+
this.handshakeResolve = () => {
|
|
585
|
+
this.handshakeResolve = null;
|
|
586
|
+
this.handshakeReject = null;
|
|
587
|
+
resolve();
|
|
588
|
+
};
|
|
589
|
+
this.handshakeReject = (err) => {
|
|
590
|
+
this.handshakeResolve = null;
|
|
591
|
+
this.handshakeReject = null;
|
|
592
|
+
reject(err);
|
|
593
|
+
};
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Drop references to the current child and any handshake waiters.
|
|
599
|
+
* Called on `exit`, on hash-mismatch rejection, and during shutdown.
|
|
600
|
+
* If the child is still live (e.g. hash-mismatch path aborts before
|
|
601
|
+
* stopChild runs), SIGKILL it so we don't leak an orphan process on
|
|
602
|
+
* respawn.
|
|
603
|
+
*/
|
|
604
|
+
private teardownChild(): void {
|
|
605
|
+
const child = this.child;
|
|
606
|
+
if (child && !child.killed && child.exitCode == null) {
|
|
607
|
+
try {
|
|
608
|
+
child.kill("SIGKILL");
|
|
609
|
+
} catch (err) {
|
|
610
|
+
log.warn({ err }, "SIGKILL during teardown failed");
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
this.child = null;
|
|
614
|
+
this.spawnPromise = null;
|
|
615
|
+
this.handshakeResolve = null;
|
|
616
|
+
this.handshakeReject = null;
|
|
617
|
+
this.activeSessions.clear();
|
|
618
|
+
// The connection belonged to the dying child. Drop it so the next
|
|
619
|
+
// ensureRunning re-handshake captures a fresh handle, even if the
|
|
620
|
+
// server's socket-close path hasn't run yet (event ordering varies).
|
|
621
|
+
this.activeConnection = null;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Resolve the active IPC connection, spawning the child if necessary.
|
|
626
|
+
* Throws a clear error when no connection is registered after
|
|
627
|
+
* `ensureRunning` resolves — that means the child handshook against the
|
|
628
|
+
* supervisor but never reached the registries route handlers, which is
|
|
629
|
+
* a packaging or wiring bug rather than a transient state.
|
|
630
|
+
*/
|
|
631
|
+
private async ensureConnection(
|
|
632
|
+
callContext: string,
|
|
633
|
+
): Promise<SkillIpcConnection> {
|
|
634
|
+
if (!this.activeConnection) {
|
|
635
|
+
await this.ensureRunning();
|
|
636
|
+
}
|
|
637
|
+
if (!this.activeConnection) {
|
|
638
|
+
throw new Error(
|
|
639
|
+
`meet-host dispatch (${callContext}): handshake completed but no IPC connection was registered. ` +
|
|
640
|
+
"This indicates the meet-host child finished spawning without invoking host.registries.register_*; check the bootstrap wiring.",
|
|
641
|
+
);
|
|
642
|
+
}
|
|
643
|
+
return this.activeConnection;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
private requireSender(callContext: string): SkillRequestSender {
|
|
647
|
+
const sender = this.ipcSender ?? globalIpcSender;
|
|
648
|
+
if (!sender) {
|
|
649
|
+
throw new Error(
|
|
650
|
+
`meet-host dispatch (${callContext}): no IPC sender configured on the supervisor.`,
|
|
651
|
+
);
|
|
652
|
+
}
|
|
653
|
+
return sender;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
private armIdleTimer(): void {
|
|
657
|
+
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
658
|
+
if (!this.isRunning) return;
|
|
659
|
+
log.debug(
|
|
660
|
+
{ idleTimeoutMs: this.idleTimeoutMs },
|
|
661
|
+
"No active sessions — arming idle-shutdown timer",
|
|
662
|
+
);
|
|
663
|
+
this.idleTimer = setTimeout(() => {
|
|
664
|
+
this.idleTimer = null;
|
|
665
|
+
void this.stopChild("idle-timeout").catch((err) => {
|
|
666
|
+
log.warn({ err }, "Idle-timeout shutdown failed");
|
|
667
|
+
});
|
|
668
|
+
}, this.idleTimeoutMs);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Stop the child: send `skill.shutdown` over the control socket,
|
|
673
|
+
* wait briefly, then SIGTERM, then SIGKILL. Safe to call with no
|
|
674
|
+
* child (no-op). Reason is surfaced in logs for diagnostics.
|
|
675
|
+
*/
|
|
676
|
+
private async stopChild(reason: string): Promise<void> {
|
|
677
|
+
const child = this.child;
|
|
678
|
+
if (!child || child.exitCode != null) {
|
|
679
|
+
this.teardownChild();
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
log.info({ reason, pid: child.pid }, "Stopping meet-host child");
|
|
683
|
+
|
|
684
|
+
// Best-effort graceful shutdown over the IPC socket. If no frame
|
|
685
|
+
// can be sent (socket closed, control channel not wired yet) we
|
|
686
|
+
// fall straight through to signals.
|
|
687
|
+
try {
|
|
688
|
+
await this.sendShutdownFrame();
|
|
689
|
+
} catch (err) {
|
|
690
|
+
log.debug(
|
|
691
|
+
{ err },
|
|
692
|
+
"skill.shutdown frame could not be delivered; escalating to SIGTERM",
|
|
693
|
+
);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
if (await waitForExit(child, this.gracefulExitGraceMs)) return;
|
|
697
|
+
|
|
698
|
+
if (child.exitCode == null) {
|
|
699
|
+
try {
|
|
700
|
+
child.kill("SIGTERM");
|
|
701
|
+
} catch (err) {
|
|
702
|
+
log.warn({ err }, "SIGTERM to meet-host failed");
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
if (await waitForExit(child, this.sigkillGraceMs)) return;
|
|
706
|
+
|
|
707
|
+
if (child.exitCode == null) {
|
|
708
|
+
try {
|
|
709
|
+
child.kill("SIGKILL");
|
|
710
|
+
} catch (err) {
|
|
711
|
+
log.warn({ err }, "SIGKILL to meet-host failed");
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
this.teardownChild();
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* Open a one-shot socket connection, write a `skill.shutdown`
|
|
719
|
+
* request frame, close. Errors are surfaced to the caller so
|
|
720
|
+
* `stopChild` can log + escalate to signals.
|
|
721
|
+
*/
|
|
722
|
+
private sendShutdownFrame(): Promise<void> {
|
|
723
|
+
return new Promise<void>((resolve, reject) => {
|
|
724
|
+
let sock: Socket;
|
|
725
|
+
try {
|
|
726
|
+
sock = this.connectFn(this.skillSocketPath);
|
|
727
|
+
} catch (err) {
|
|
728
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
const frame =
|
|
732
|
+
JSON.stringify({ id: "meet-host-shutdown", method: "skill.shutdown" }) +
|
|
733
|
+
"\n";
|
|
734
|
+
let settled = false;
|
|
735
|
+
const finish = (err?: Error) => {
|
|
736
|
+
if (settled) return;
|
|
737
|
+
settled = true;
|
|
738
|
+
try {
|
|
739
|
+
sock.destroy();
|
|
740
|
+
} catch {
|
|
741
|
+
// Ignore — destroy is best-effort.
|
|
742
|
+
}
|
|
743
|
+
if (err) reject(err);
|
|
744
|
+
else resolve();
|
|
745
|
+
};
|
|
746
|
+
sock.once("connect", () => {
|
|
747
|
+
sock.write(frame, (writeErr) => {
|
|
748
|
+
if (writeErr) finish(writeErr);
|
|
749
|
+
else finish();
|
|
750
|
+
});
|
|
751
|
+
});
|
|
752
|
+
sock.once("error", (err) => finish(err));
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/**
|
|
758
|
+
* Resolve when the child exits or the given grace period elapses.
|
|
759
|
+
* Returns `true` if the child exited within the grace window, `false`
|
|
760
|
+
* if the timeout fired first.
|
|
761
|
+
*/
|
|
762
|
+
function waitForExit(child: ChildProcess, graceMs: number): Promise<boolean> {
|
|
763
|
+
return new Promise<boolean>((resolve) => {
|
|
764
|
+
if (child.exitCode != null) {
|
|
765
|
+
resolve(true);
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
768
|
+
let settled = false;
|
|
769
|
+
const timer = setTimeout(() => {
|
|
770
|
+
if (settled) return;
|
|
771
|
+
settled = true;
|
|
772
|
+
resolve(false);
|
|
773
|
+
}, graceMs);
|
|
774
|
+
child.once("exit", () => {
|
|
775
|
+
if (settled) return;
|
|
776
|
+
settled = true;
|
|
777
|
+
clearTimeout(timer);
|
|
778
|
+
resolve(true);
|
|
779
|
+
});
|
|
780
|
+
});
|
|
781
|
+
}
|