@vellumai/assistant 0.10.4 → 0.10.5-dev.202607022329.d89bf2f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +94 -91
- package/Dockerfile +5 -16
- package/README.md +7 -10
- package/bun.lock +0 -4
- package/docs/architecture/security.md +20 -20
- package/docs/stt-provider-onboarding.md +4 -5
- package/docs/trusted-contact-access.md +7 -7
- package/eslint-rules/cli-no-daemon-internals.js +4 -0
- package/eslint.config.mjs +7 -1
- package/knip.json +0 -1
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +36 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/invite-contract.test.ts +233 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +40 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +20 -8
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +33 -0
- package/node_modules/@vellumai/gateway-client/src/invite-contract.ts +216 -0
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +39 -3
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +0 -8
- package/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +1 -5
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +3 -14
- package/openapi.yaml +1073 -225
- package/package.json +1 -4
- package/scripts/test.sh +35 -13
- package/src/__tests__/access-request-seed-content-blocks.test.ts +60 -4
- package/src/__tests__/acp-session.test.ts +4 -1
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +0 -6
- package/src/__tests__/add-message-preassigned-id.test.ts +56 -0
- package/src/__tests__/agent-loop-set-system-prompt.test.ts +139 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +3 -0
- package/src/__tests__/app-source-watcher.test.ts +11 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +148 -3
- package/src/__tests__/assistant-attachments.test.ts +62 -4
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -1
- package/src/__tests__/attachments-store-heic-normalize.test.ts +230 -0
- package/src/__tests__/attachments-store.test.ts +3 -0
- package/src/__tests__/background-shell-bash.test.ts +34 -0
- package/src/__tests__/background-shell-host-bash.test.ts +12 -0
- package/src/__tests__/background-tool-registry.test.ts +97 -0
- package/src/__tests__/background-tool-routes.test.ts +72 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +2 -1
- package/src/__tests__/btw-routes.test.ts +57 -3
- package/src/__tests__/call-controller.test.ts +474 -84
- package/src/__tests__/call-domain.test.ts +48 -1
- package/src/__tests__/call-pointer-messages.test.ts +57 -19
- package/src/__tests__/call-pointer-no-hardcoded-copy.guard.test.ts +2 -6
- package/src/__tests__/call-routes-http.test.ts +15 -14
- package/src/__tests__/call-setup-flow-invite.test.ts +568 -0
- package/src/__tests__/call-setup-flow-midcall-trust.test.ts +231 -0
- package/src/__tests__/call-setup-flow-name-capture.test.ts +754 -0
- package/src/__tests__/call-setup-flow-verification.test.ts +925 -0
- package/src/__tests__/call-setup-flow.test.ts +311 -0
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +4 -7
- package/src/__tests__/channel-readiness-service.test.ts +0 -6
- package/src/__tests__/channel-readiness-slack-remote.test.ts +0 -4
- package/src/__tests__/channel-retry-sweep.test.ts +76 -64
- package/src/__tests__/channel-setup-panel-ack.test.ts +184 -0
- package/src/__tests__/clear-all-lexical.test.ts +90 -0
- package/src/__tests__/compactor-media-strip.test.ts +177 -0
- package/src/__tests__/config-loader-backfill.test.ts +5 -5
- package/src/__tests__/config-schema.test.ts +17 -0
- package/src/__tests__/contact-store-interaction-info.test.ts +27 -70
- package/src/__tests__/contacts-relay-reads.test.ts +188 -23
- package/src/__tests__/contacts-tools.test.ts +42 -1
- package/src/__tests__/contacts-write.test.ts +181 -0
- package/src/__tests__/context-search-conversations-source.test.ts +220 -81
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +39 -0
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -1
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -0
- package/src/__tests__/conversation-clear-safety.test.ts +0 -1
- package/src/__tests__/conversation-crud-enabled-plugins.test.ts +60 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -1
- package/src/__tests__/conversation-disk-view.test.ts +1 -0
- package/src/__tests__/conversation-enabledplugins-route.test.ts +184 -0
- package/src/__tests__/conversation-error.test.ts +0 -18
- package/src/__tests__/conversation-fork-crud.test.ts +67 -0
- package/src/__tests__/conversation-history-web-search.test.ts +7 -137
- package/src/__tests__/conversation-initial-prompt.test.ts +110 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +191 -0
- package/src/__tests__/conversation-process-callsite.test.ts +37 -0
- package/src/__tests__/conversation-queue.test.ts +149 -0
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +392 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +84 -0
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +407 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +36 -16
- package/src/__tests__/conversation-skill-tools.test.ts +73 -0
- package/src/__tests__/conversation-wipe.test.ts +20 -5
- package/src/__tests__/credential-prompt-route.test.ts +69 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -3
- package/src/__tests__/db-drop-messages-fts.test.ts +115 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +1 -62
- package/src/__tests__/edit-propagation.test.ts +56 -2
- package/src/__tests__/empty-state-greeting-cache.test.ts +9 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +15 -110
- package/src/__tests__/guardian-expiry-notifier.test.ts +1 -0
- package/src/__tests__/guardian-question-mode.test.ts +57 -0
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/guardian-wait-controller.test.ts +619 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +33 -2
- package/src/__tests__/heic-fixture.ts +55 -0
- package/src/__tests__/helpers/seed-contact-channel.ts +0 -2
- package/src/__tests__/http-conversation-lineage.test.ts +6 -1
- package/src/__tests__/image-conversion.test.ts +170 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +72 -341
- package/src/__tests__/introduction-card-resolver.test.ts +354 -0
- package/src/__tests__/invite-redeemed-ipc.test.ts +97 -0
- package/src/__tests__/invite-routes-http.test.ts +246 -420
- package/src/__tests__/job-handler-registration-guard.test.ts +104 -0
- package/src/__tests__/lexical-index-dual-write.test.ts +426 -0
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +2 -2
- package/src/__tests__/list-messages-attachments.test.ts +159 -0
- package/src/__tests__/list-messages-background-tool-completion.test.ts +141 -0
- package/src/__tests__/list-messages-queued.test.ts +25 -0
- package/src/__tests__/managed-store.test.ts +129 -1
- package/src/__tests__/media-stream-audio-transcode.test.ts +113 -0
- package/src/__tests__/media-stream-output.test.ts +350 -19
- package/src/__tests__/media-stream-server-integration.test.ts +943 -169
- package/src/__tests__/media-stream-stt-session.test.ts +498 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +2 -2
- package/src/__tests__/model-intents.test.ts +1 -1
- package/src/__tests__/mtime-cache.test.ts +19 -0
- package/src/__tests__/non-member-access-request.test.ts +349 -3
- package/src/__tests__/notification-decision-fallback.test.ts +104 -8
- package/src/__tests__/notification-decision-strategy.test.ts +57 -8
- package/src/__tests__/onboarding-template-contract.test.ts +27 -43
- package/src/__tests__/openai-provider.test.ts +33 -0
- package/src/__tests__/openai-responses-provider.test.ts +40 -0
- package/src/__tests__/persistence-layering-guard.test.ts +29 -20
- package/src/__tests__/persona-resolver.test.ts +56 -2
- package/src/__tests__/personal-memory-auth-bypass.test.ts +62 -0
- package/src/__tests__/phone.test.ts +1 -15
- package/src/__tests__/plugin-bootstrap.test.ts +25 -196
- package/src/__tests__/plugin-disabled-state.test.ts +33 -0
- package/src/__tests__/plugin-effective-enabled-set.test.ts +227 -0
- package/src/__tests__/plugin-event-hub-facade.test.ts +323 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +156 -42
- package/src/__tests__/plugin-injector-contribution.test.ts +4 -20
- package/src/__tests__/plugin-pipeline.test.ts +63 -1
- package/src/__tests__/plugin-route-contribution.test.ts +62 -115
- package/src/__tests__/plugin-tool-contribution.test.ts +0 -22
- package/src/__tests__/plugin-types.test.ts +0 -1
- package/src/__tests__/pointer-conversation-trust.test.ts +38 -6
- package/src/__tests__/pre-model-call-sanitize.test.ts +1 -1
- package/src/__tests__/prune-old-tool-invocations-job.test.ts +97 -0
- package/src/__tests__/public-ingress-urls.test.ts +0 -48
- package/src/__tests__/qdrant-collection-migration.test.ts +145 -2
- package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +0 -1
- package/src/__tests__/resolve-trust-class.test.ts +28 -10
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +137 -0
- package/src/__tests__/schedule-retry.test.ts +38 -14
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +3 -3
- package/src/__tests__/schedule-routes.test.ts +14 -6
- package/src/__tests__/schedule-store.test.ts +3 -1
- package/src/__tests__/scheduler-disk-pressure.test.ts +17 -6
- package/src/__tests__/scheduler-recurrence.test.ts +57 -107
- package/src/__tests__/scheduler-reuse-conversation.test.ts +51 -46
- package/src/__tests__/scheduler-wake.test.ts +13 -23
- package/src/__tests__/scheduler-worker-standdown.test.ts +220 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -1
- package/src/__tests__/shell-observability.test.ts +1 -0
- package/src/__tests__/skill-boundary-guard.test.ts +3 -4
- package/src/__tests__/skill-load-plugin-scope.test.ts +238 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +2 -0
- package/src/__tests__/skill-script-runner-host.test.ts +53 -0
- package/src/__tests__/skill-script-runner-sandbox.test.ts +5 -2
- package/src/__tests__/skill-tool-factory.test.ts +73 -1
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -14
- package/src/__tests__/slack-inbound-verification.test.ts +36 -0
- package/src/__tests__/slack-notification-approval-card.test.ts +89 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +51 -1
- package/src/__tests__/stt-hints.test.ts +2 -256
- package/src/__tests__/subagent-allowlist-validation.test.ts +47 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +72 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +14 -2
- package/src/__tests__/subagent-persistence.test.ts +122 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
- package/src/__tests__/subagent-terminal-message.test.ts +99 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -1
- package/src/__tests__/system-prompt.test.ts +17 -118
- package/src/__tests__/task-scheduler.test.ts +68 -89
- package/src/__tests__/telephony-credential-preflight.test.ts +312 -0
- package/src/__tests__/telephony-tts-guard.test.ts +538 -0
- package/src/__tests__/title-generate-hook.test.ts +16 -0
- package/src/__tests__/tool-approval-handler.test.ts +87 -1
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +45 -20
- package/src/__tests__/tool-grant-request-escalation.test.ts +39 -0
- package/src/__tests__/trust-context-guards.test.ts +21 -10
- package/src/__tests__/trusted-contact-multichannel.test.ts +4 -0
- package/src/__tests__/twilio-provider.test.ts +17 -17
- package/src/__tests__/twilio-routes-twiml.test.ts +6 -543
- package/src/__tests__/twilio-routes.test.ts +257 -387
- package/src/__tests__/twilio-validation.test.ts +1 -1
- package/src/__tests__/unified-turn-context-client-os.test.ts +45 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +5 -0
- package/src/__tests__/voice-approval-resolver-relay.test.ts +150 -0
- package/src/__tests__/voice-ingress-preflight.test.ts +61 -0
- package/src/__tests__/voice-quality.test.ts +2 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -7
- package/src/__tests__/voice-session-bridge-processing-wait.test.ts +27 -0
- package/src/__tests__/voice-session-bridge.test.ts +1 -10
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -0
- package/src/__tests__/workspace-migration-118-seed-now-md.test.ts +120 -0
- package/src/__tests__/workspace-migration-120-revise-onboarding-threads.test.ts +175 -0
- package/src/__tests__/workspace-migration-121-seed-default-user-guardrails.test.ts +118 -0
- package/src/__tests__/workspace-migration-122-relocate-default-user-boundary.test.ts +119 -0
- package/src/__tests__/workspace-migration-123-swap-quality-profile-to-fable.test.ts +191 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +235 -241
- package/src/acp/__tests__/prepare-agent-env.test.ts +0 -97
- package/src/acp/__tests__/session-manager-persistence.test.ts +2 -0
- package/src/acp/__tests__/session-manager-resume.test.ts +8 -0
- package/src/acp/__tests__/session-manager-usage.test.ts +6 -0
- package/src/acp/__tests__/session-manager.test.ts +6 -0
- package/src/acp/agent-process.test.ts +116 -0
- package/src/acp/agent-process.ts +71 -0
- package/src/acp/auto-install.ts +12 -8
- package/src/acp/failure-error.test.ts +109 -0
- package/src/acp/failure-error.ts +111 -0
- package/src/acp/prepare-agent-env.ts +0 -12
- package/src/acp/resolve-agent.test.ts +6 -45
- package/src/acp/resolve-agent.ts +2 -4
- package/src/acp/session-manager.test.ts +312 -0
- package/src/acp/session-manager.ts +102 -46
- package/src/agent/ax-tree-compaction.test.ts +4 -1
- package/src/agent/image-optimize.ts +17 -127
- package/src/agent/loop.ts +45 -192
- package/src/api/events/background-tool-completed.test.ts +51 -0
- package/src/api/events/background-tool-completed.ts +29 -0
- package/src/api/events/background-tool-started.test.ts +36 -0
- package/src/api/events/background-tool-started.ts +28 -0
- package/src/api/events/conversation-error.ts +0 -1
- package/src/api/events/open-panel.ts +33 -0
- package/src/api/events/subagent-status-changed.ts +4 -1
- package/src/api/index.ts +19 -0
- package/src/api/responses/conversation-message.ts +34 -0
- package/src/approvals/guardian-decision-primitive.ts +74 -24
- package/src/approvals/guardian-request-resolvers.ts +450 -122
- package/src/apps/app-store.ts +1 -0
- package/src/apps/shared-app-links-store.ts +1 -0
- package/src/avatar/identity-avatar.ts +3 -7
- package/src/background-wake/wake-intent-hooks.test.ts +1 -1
- package/src/calls/__tests__/fish-audio-client.test.ts +73 -0
- package/src/calls/__tests__/gateway-invite-reader.test.ts +170 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +126 -102
- package/src/calls/call-controller.ts +134 -48
- package/src/calls/call-domain.ts +18 -42
- package/src/calls/call-pointer-messages.ts +51 -67
- package/src/calls/call-setup-flow-types.ts +76 -0
- package/src/calls/call-setup-flow.ts +1743 -0
- package/src/calls/call-speech-output.ts +87 -23
- package/src/calls/call-store.ts +4 -0
- package/src/calls/call-transport.ts +22 -36
- package/src/calls/fish-audio-client.ts +3 -0
- package/src/calls/gateway-invite-reader.ts +98 -0
- package/src/calls/guardian-wait-controller.ts +451 -0
- package/src/calls/media-stream-audio-transcode.ts +82 -2
- package/src/calls/media-stream-output.ts +142 -36
- package/src/calls/media-stream-server.ts +297 -178
- package/src/calls/media-stream-stt-session.ts +393 -50
- package/src/calls/media-turn-detector.ts +4 -6
- package/src/calls/relay-access-wait.ts +3 -4
- package/src/calls/relay-setup-router.ts +22 -43
- package/src/calls/relay-verification.ts +17 -24
- package/src/calls/resolve-call-tts-provider.ts +96 -29
- package/src/calls/stt-hints.ts +24 -87
- package/src/calls/telephony-credential-preflight.ts +159 -0
- package/src/calls/telephony-tts-capability.ts +183 -0
- package/src/calls/tts-call-strategy.ts +18 -20
- package/src/calls/twilio-provider.ts +3 -2
- package/src/calls/twilio-routes.ts +47 -351
- package/src/calls/types.ts +5 -3
- package/src/calls/voice-ingress-preflight.ts +9 -0
- package/src/calls/voice-quality.ts +13 -18
- package/src/calls/voice-session-bridge.ts +25 -35
- package/src/channels/__tests__/types.test.ts +28 -0
- package/src/channels/channel-verification-sessions.ts +7 -2
- package/src/channels/config.ts +0 -42
- package/src/channels/slack-thread-store.ts +12 -0
- package/src/channels/types.ts +23 -0
- package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -1
- package/src/cli/commands/__tests__/schedules.test.ts +83 -34
- package/src/cli/commands/__tests__/status.test.ts +42 -2
- package/src/cli/commands/contacts.ts +2 -2
- package/src/cli/commands/credentials.ts +17 -0
- package/src/cli/commands/monitoring.ts +191 -0
- package/src/cli/commands/schedules-worker.ts +175 -0
- package/src/cli/commands/schedules.ts +169 -43
- package/src/cli/commands/status.ts +12 -1
- package/src/cli/commands/tools.ts +5 -1
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +1 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +29 -1
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +7 -0
- package/src/cli/lib/search-plugins.ts +6 -0
- package/src/cli/lib/toggle-plugin.ts +21 -2
- package/src/cli/program.ts +3 -1
- package/src/config/__tests__/deployment-context-defaults.test.ts +23 -0
- package/src/config/acp-defaults.test.ts +0 -10
- package/src/config/acp-defaults.ts +0 -6
- package/src/config/bundled-skills/acp/SKILL.md +13 -45
- package/src/config/bundled-skills/acp/TOOLS.json +3 -3
- package/src/config/bundled-skills/app-builder/SKILL.md +3 -3
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +9 -9
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +1 -1
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -9
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +10 -7
- package/src/config/bundled-skills/skill-management/TOOLS.json +10 -0
- package/src/config/call-site-defaults.ts +0 -2
- package/src/config/feature-flag-registry.json +16 -8
- package/src/config/loader.ts +11 -0
- package/src/config/schema.ts +9 -1
- package/src/config/schemas/__tests__/memory-v2.test.ts +2 -2
- package/src/config/schemas/__tests__/memory-v3.test.ts +64 -0
- package/src/config/schemas/call-site-catalog.ts +0 -12
- package/src/config/schemas/calls.ts +8 -0
- package/src/config/schemas/elevenlabs.ts +1 -1
- package/src/config/schemas/llm.ts +0 -2
- package/src/config/schemas/memory-v2.ts +1 -1
- package/src/config/schemas/memory-v3.ts +82 -0
- package/src/config/schemas/monitoring.ts +61 -0
- package/src/config/schemas/schedules.ts +35 -0
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills-plugin-filter.test.ts +96 -0
- package/src/config/skills.ts +26 -0
- package/src/contacts/__tests__/member-write-relay.test.ts +156 -4
- package/src/contacts/canonical-guardian-store.ts +5 -0
- package/src/contacts/contact-store.ts +81 -35
- package/src/contacts/contacts-write.ts +50 -25
- package/src/contacts/member-write-relay.ts +115 -31
- package/src/contacts/types.ts +0 -8
- package/src/context/compactor.ts +29 -15
- package/src/context/outbound-sanitize.ts +202 -0
- package/src/daemon/__tests__/abort-null-controller.test.ts +167 -0
- package/src/daemon/__tests__/conversation-tool-setup-plugin-scope.test.ts +122 -0
- package/src/daemon/__tests__/embedding-reconcile.test.ts +99 -16
- package/src/daemon/__tests__/wake-conversation-ops-completion.test.ts +107 -0
- package/src/daemon/abort-watchdog.ts +7 -0
- package/src/daemon/app-source-watcher.ts +9 -0
- package/src/daemon/assistant-attachments.ts +42 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +256 -147
- package/src/daemon/conversation-agent-loop.ts +61 -68
- package/src/daemon/conversation-error.ts +1 -15
- package/src/daemon/conversation-history.ts +32 -236
- package/src/daemon/conversation-initial-prompt.ts +77 -0
- package/src/daemon/conversation-lifecycle.ts +25 -1
- package/src/daemon/conversation-messaging.ts +2 -2
- package/src/daemon/conversation-plugin-scope.ts +38 -0
- package/src/daemon/conversation-process.ts +50 -14
- package/src/daemon/conversation-runtime-assembly.ts +36 -6
- package/src/daemon/conversation-skill-tools.ts +19 -3
- package/src/daemon/conversation-store.ts +3 -3
- package/src/daemon/conversation-surfaces.ts +171 -0
- package/src/daemon/conversation-tool-setup.test.ts +95 -0
- package/src/daemon/conversation-tool-setup.ts +116 -1
- package/src/daemon/conversation-turn-finalize.ts +211 -0
- package/src/daemon/conversation.ts +92 -1
- package/src/daemon/disk-pressure-policy.ts +2 -1
- package/src/daemon/event-loop-watchdog.ts +22 -6
- package/src/daemon/external-plugins-bootstrap.ts +47 -134
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +26 -14
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +27 -14
- package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -5
- package/src/daemon/handlers/config-a2a.ts +7 -14
- package/src/daemon/handlers/config-channels.ts +2 -10
- package/src/daemon/handlers/conversation-history.ts +3 -1
- package/src/daemon/handlers/conversations.ts +0 -52
- package/src/daemon/handlers/shared.ts +4 -24
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/lifecycle.ts +59 -472
- package/src/daemon/message-protocol.ts +3 -3
- package/src/daemon/message-provenance.ts +12 -14
- package/src/daemon/message-types/background-tools.ts +28 -0
- package/src/daemon/message-types/contacts.ts +2 -10
- package/src/daemon/message-types/conversations.ts +10 -0
- package/src/daemon/message-types/integrations.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +1 -0
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/pointer-conversation-trust.ts +23 -9
- package/src/daemon/pointer-turn-runner.ts +174 -0
- package/src/daemon/providers-setup.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +139 -47
- package/src/daemon/skill-memory-refresh.ts +2 -2
- package/src/daemon/sqlite-corruption-watchdog.test.ts +217 -0
- package/src/daemon/sqlite-corruption-watchdog.ts +155 -0
- package/src/daemon/tool-setup-types.ts +8 -0
- package/src/daemon/trust-context.ts +21 -6
- package/src/daemon/turn-latency-tracker.test.ts +93 -0
- package/src/daemon/turn-latency-tracker.ts +38 -0
- package/src/daemon/wake-conversation-ops.ts +10 -8
- package/src/documents/document-comments-store.test.ts +7 -1
- package/src/documents/document-comments-store.ts +8 -0
- package/src/documents/document-store.ts +15 -0
- package/src/export/__tests__/transcript-formatter.test.ts +11 -0
- package/src/export/transcript-formatter.ts +49 -67
- package/src/home/__tests__/feed-writer.test.ts +247 -1
- package/src/home/conversation-starter-checkpoints.ts +1 -0
- package/src/home/feed-writer.ts +61 -0
- package/src/home/job-handlers/conversation-starters.ts +1 -0
- package/src/hooks/hook-loader.ts +12 -0
- package/src/hooks/registry.ts +32 -4
- package/src/inbound/public-ingress-urls.ts +0 -17
- package/src/ipc/__tests__/contacts-info-ipc.test.ts +285 -0
- package/src/ipc/assistant-server.ts +28 -7
- package/src/ipc/routes/__tests__/contacts-mirror-apply-atomicity.test.ts +62 -0
- package/src/ipc/routes/__tests__/contacts-mirror-apply.test.ts +272 -0
- package/src/ipc/routes/__tests__/contacts-mirror-ipc-routes.test.ts +322 -0
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +60 -4
- package/src/ipc/routes/contacts-info-ipc-routes.ts +239 -0
- package/src/ipc/routes/contacts-mirror-ipc-routes.ts +202 -0
- package/src/ipc/routes/db-proxy.ts +5 -2
- package/src/ipc/routes/invite-ipc-routes.ts +53 -39
- package/src/jobs/worker.ts +9 -2
- package/src/live-voice/__tests__/live-voice-archive.test.ts +10 -1
- package/src/live-voice/live-voice-archive.ts +5 -0
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +22 -6
- package/src/messaging/providers/channel-transport.ts +6 -0
- package/src/messaging/providers/index.ts +3 -0
- package/src/messaging/providers/slack/api.test.ts +49 -1
- package/src/messaging/providers/slack/api.ts +110 -0
- package/src/messaging/providers/slack/send.test.ts +85 -0
- package/src/messaging/providers/slack/send.ts +100 -28
- package/src/messaging/providers/slack/transport.ts +7 -13
- package/src/messaging/providers/whatsapp/send.ts +29 -9
- package/src/monitoring/__tests__/control.test.ts +235 -0
- package/src/monitoring/__tests__/sample-ring-buffer.test.ts +96 -0
- package/src/monitoring/control.ts +105 -0
- package/src/monitoring/resource-sampler.ts +258 -0
- package/src/monitoring/sample-ring-buffer.ts +108 -0
- package/src/monitoring/worker.ts +94 -0
- package/src/notifications/README.md +1 -1
- package/src/notifications/access-request-copy.ts +94 -23
- package/src/notifications/adapters/slack.ts +89 -21
- package/src/notifications/approval-card-builder.ts +33 -18
- package/src/notifications/approval-card-data.ts +48 -15
- package/src/notifications/broadcaster.ts +25 -16
- package/src/notifications/decision-engine.ts +131 -32
- package/src/notifications/guardian-question-mode.ts +58 -10
- package/src/permissions/approval-policy.ts +8 -1
- package/src/permissions/checker.ts +2 -0
- package/src/permissions/gateway-threshold-reader.ts +7 -6
- package/src/permissions/ipc-risk-types.ts +1 -0
- package/src/permissions/secret-prompter.ts +11 -3
- package/src/permissions/types.ts +2 -2
- package/src/persistence/__tests__/conversation-queries-search.test.ts +397 -0
- package/src/persistence/__tests__/conversation-search-lexical.test.ts +103 -0
- package/src/persistence/__tests__/jobs-worker-memory-disabled.test.ts +95 -0
- package/src/persistence/__tests__/slow-query-log.test.ts +266 -0
- package/src/persistence/__tests__/slow-sync-log.test.ts +155 -0
- package/src/persistence/a2a-invite-store.ts +205 -0
- package/src/persistence/attachments-store.ts +94 -10
- package/src/persistence/checkpoints.ts +45 -0
- package/src/persistence/conversation-crud.ts +453 -260
- package/src/persistence/conversation-display-order-migration.ts +8 -2
- package/src/persistence/conversation-group-migration.test.ts +8 -0
- package/src/persistence/conversation-group-migration.ts +9 -0
- package/src/persistence/conversation-queries.ts +244 -125
- package/src/persistence/conversation-row-batch-delete.ts +9 -5
- package/src/persistence/conversation-search-lexical.ts +49 -0
- package/src/persistence/db-async-query.ts +42 -0
- package/src/persistence/db-connection.ts +13 -0
- package/src/persistence/delivery-channels.ts +0 -82
- package/src/persistence/delivery-crud.ts +27 -6
- package/src/persistence/embeddings/__tests__/embedding-identity.test.ts +18 -5
- package/src/persistence/embeddings/__tests__/messages-lexical-index.test.ts +334 -0
- package/src/persistence/embeddings/embedding-identity.ts +17 -5
- package/src/persistence/embeddings/embedding-runtime-manager.ts +31 -0
- package/src/persistence/embeddings/messages-lexical-index.ts +396 -0
- package/src/persistence/embeddings/qdrant-client.ts +81 -5
- package/src/persistence/group-crud.ts +13 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +506 -0
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +164 -0
- package/src/persistence/job-handlers/__tests__/message-lexical.test.ts +259 -0
- package/src/persistence/job-handlers/cleanup.ts +57 -9
- package/src/persistence/job-handlers/message-lexical-backfill.ts +187 -0
- package/src/persistence/job-handlers/message-lexical.ts +251 -0
- package/src/persistence/jobs-store.ts +102 -8
- package/src/persistence/jobs-worker.ts +68 -28
- package/src/persistence/llm-request-log-store.ts +35 -19
- package/src/persistence/llm-usage-store.ts +11 -0
- package/src/persistence/memory-lifecycle-hooks.test.ts +65 -0
- package/src/persistence/memory-lifecycle-hooks.ts +55 -1
- package/src/persistence/migrations/028-call-session-mode.ts +1 -1
- package/src/persistence/migrations/116-messages-fts.ts +8 -1
- package/src/persistence/migrations/311-create-subagents-table.ts +50 -0
- package/src/persistence/migrations/312-drop-inbox-conversation-state-table.ts +15 -0
- package/src/persistence/migrations/313-drop-messages-fts.ts +17 -0
- package/src/persistence/migrations/314-add-conversation-enabled-plugins.ts +25 -0
- package/src/persistence/migrations/315-create-a2a-invites.ts +58 -0
- package/src/persistence/migrations/316-drop-contact-channels-invite-id.ts +28 -0
- package/src/persistence/migrations/317-canonical-guardian-requester-signals.ts +24 -0
- package/src/persistence/migrations/318-drop-contact-channel-telemetry.ts +32 -0
- package/src/persistence/migrations/__tests__/315-create-a2a-invites.test.ts +161 -0
- package/src/persistence/migrations/__tests__/316-drop-contact-channels-invite-id.test.ts +156 -0
- package/src/persistence/migrations/__tests__/318-drop-contact-channel-telemetry.test.ts +134 -0
- package/src/persistence/migrations/__tests__/migration-prefix-guard.test.ts +99 -0
- package/src/persistence/raw-query.ts +50 -11
- package/src/persistence/schema/a2a.ts +14 -0
- package/src/persistence/schema/contacts.ts +0 -62
- package/src/persistence/schema/conversation-groups.ts +12 -0
- package/src/persistence/schema/conversations.ts +2 -0
- package/src/persistence/schema/documents.ts +65 -0
- package/src/persistence/schema/guardian.ts +4 -0
- package/src/persistence/schema/index.ts +4 -0
- package/src/persistence/schema/memory-injection.ts +62 -0
- package/src/persistence/schema/workflows.ts +55 -0
- package/src/persistence/slow-query-log.ts +437 -0
- package/src/persistence/slow-sync-log.ts +204 -0
- package/src/persistence/steps.ts +16 -0
- package/src/persistence/subagent-store.ts +125 -0
- package/src/persistence/worker-control.ts +45 -238
- package/src/plugin-api/event-hub-facade.ts +172 -0
- package/src/plugin-api/index.ts +9 -1
- package/src/plugin-api/types.ts +40 -9
- package/src/plugins/defaults/default-plugin-names.ts +60 -0
- package/src/plugins/defaults/index.ts +19 -29
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +46 -67
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +2 -4
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +9 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +7 -4
- package/src/plugins/defaults/memory/config.ts +11 -0
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +124 -113
- package/src/plugins/defaults/memory/embeddings.ts +77 -0
- package/src/plugins/defaults/memory/find-most-recent-retrospective-for.ts +66 -0
- package/src/plugins/defaults/memory/frontmatter.ts +50 -0
- package/src/plugins/defaults/memory/graph/bootstrap.test.ts +36 -10
- package/src/plugins/defaults/memory/graph/bootstrap.ts +6 -5
- package/src/plugins/defaults/memory/graph/consolidation.ts +3 -5
- package/src/plugins/defaults/memory/graph/extraction.ts +3 -6
- package/src/plugins/defaults/memory/graph/graph-search.ts +12 -23
- package/src/plugins/defaults/memory/graph/narrative.ts +3 -5
- package/src/plugins/defaults/memory/graph/pattern-scan.ts +3 -5
- package/src/plugins/defaults/memory/graph/retriever.test.ts +1 -6
- package/src/plugins/defaults/memory/graph/retriever.ts +5 -10
- package/src/plugins/defaults/memory/graph/tools.ts +1 -1
- package/src/plugins/defaults/memory/hooks/init.ts +31 -5
- package/src/plugins/defaults/memory/indexer.ts +2 -3
- package/src/plugins/defaults/memory/injectors.ts +2 -2
- package/src/plugins/defaults/memory/job-handler-registration.ts +96 -0
- package/src/plugins/defaults/memory/job-handlers/backfill.ts +4 -26
- package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +6 -19
- package/src/plugins/defaults/memory/job-handlers/embedding.ts +9 -22
- package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +2 -3
- package/src/plugins/defaults/memory/job-handlers.ts +13 -12
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +1 -1
- package/src/plugins/defaults/memory/llm-helpers.ts +76 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +8 -5
- package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +2 -2
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +2 -0
- package/src/plugins/defaults/memory/persistence-hooks.ts +46 -1
- package/src/plugins/defaults/memory/pkb/pkb-index.ts +1 -5
- package/src/plugins/defaults/memory/pkb/pkb-search.ts +2 -2
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +4 -6
- package/src/plugins/defaults/memory/routes/memory-item-routes.ts +1 -1
- package/src/plugins/defaults/memory/search/semantic.ts +2 -2
- package/src/plugins/defaults/memory/startup.ts +244 -0
- package/src/plugins/defaults/memory/task-memory-cleanup.ts +8 -0
- package/src/{daemon → plugins/defaults/memory/v2}/__tests__/memory-v2-startup.test.ts +6 -6
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +2 -13
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +4 -5
- package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +1 -8
- package/src/plugins/defaults/memory/v2/activation.ts +2 -4
- package/src/plugins/defaults/memory/v2/cli-command-store.ts +2 -4
- package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +1 -1
- package/src/{daemon → plugins/defaults/memory/v2}/memory-v2-startup.test.ts +8 -8
- package/src/{daemon → plugins/defaults/memory/v2}/memory-v2-startup.ts +20 -22
- package/src/plugins/defaults/memory/v2/migration.ts +2 -5
- package/src/plugins/defaults/memory/v2/page-store.ts +1 -1
- package/src/plugins/defaults/memory/v2/qdrant.ts +2 -3
- package/src/plugins/defaults/memory/v2/router.ts +5 -5
- package/src/plugins/defaults/memory/v2/sim.ts +2 -4
- package/src/plugins/defaults/memory/v2/skill-store.ts +2 -4
- package/src/plugins/defaults/memory/v2/sweep-job.ts +6 -6
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +11 -9
- package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +107 -2
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +69 -0
- package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +181 -0
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +7 -3
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +345 -8
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +1 -4
- package/src/plugins/defaults/memory/v3/__tests__/section-needle.test.ts +64 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +18 -13
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +62 -1
- package/src/plugins/defaults/memory/v3/card.ts +1 -4
- package/src/plugins/defaults/memory/v3/dense.ts +60 -25
- package/src/plugins/defaults/memory/v3/edge.ts +1 -1
- package/src/plugins/defaults/memory/v3/gate-flag.ts +20 -0
- package/src/plugins/defaults/memory/v3/gate.ts +158 -0
- package/src/plugins/defaults/memory/v3/maintain-job.ts +2 -4
- package/src/plugins/defaults/memory/v3/orchestrate.ts +186 -25
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +7 -9
- package/src/plugins/defaults/memory/v3/pool-select.ts +6 -6
- package/src/plugins/defaults/memory/v3/prune.ts +2 -2
- package/src/plugins/defaults/memory/v3/section-dense-store.ts +8 -11
- package/src/plugins/defaults/memory/v3/section-needle.ts +27 -7
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +10 -0
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +1 -4
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +5 -0
- package/src/plugins/defaults/turn-context/injectors.ts +1 -0
- package/src/plugins/defaults/turn-context/unified-turn-context.ts +12 -0
- package/src/plugins/injector-registry.ts +13 -2
- package/src/plugins/mtime-cache.ts +36 -47
- package/src/plugins/pipeline.ts +15 -1
- package/src/plugins/types.ts +14 -23
- package/src/prompts/__tests__/system-prompt.test.ts +170 -32
- package/src/prompts/persona-resolver.ts +13 -9
- package/src/prompts/system-prompt.ts +30 -9
- package/src/prompts/templates/BOOTSTRAP.md +16 -119
- package/src/prompts/templates/SOUL.md +43 -13
- package/src/prompts/templates/system-sections.ts +32 -27
- package/src/prompts/templates/users/default.md +19 -0
- package/src/providers/__tests__/placeholder-sentinels.test.ts +56 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +96 -1
- package/src/providers/model-intents.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +14 -1
- package/src/providers/openai/responses-provider.ts +18 -0
- package/src/providers/placeholder-sentinels.ts +18 -8
- package/src/providers/retry.ts +1 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +0 -64
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +92 -79
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +98 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +62 -3
- package/src/providers/speech-to-text/provider-catalog.ts +0 -89
- package/src/providers/speech-to-text/resolve.ts +55 -0
- package/src/providers/tool-progress-events.test.ts +50 -0
- package/src/providers/tool-progress-events.ts +99 -0
- package/src/providers/types.ts +1 -1
- package/src/providers/vellum-model-routing.test.ts +51 -0
- package/src/providers/vellum-model-routing.ts +84 -0
- package/src/runtime/AGENTS.md +5 -4
- package/src/runtime/__tests__/agent-wake.test.ts +158 -1
- package/src/runtime/__tests__/channel-verification-service.test.ts +2 -2
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +37 -8
- package/src/runtime/access-request-helper.ts +154 -3
- package/src/runtime/actor-trust-resolver.ts +7 -21
- package/src/runtime/agent-wake.ts +41 -1
- package/src/runtime/assistant-event.ts +86 -12
- package/src/runtime/auth/__tests__/route-policy.test.ts +31 -0
- package/src/runtime/channel-approval-types.ts +52 -2
- package/src/runtime/channel-approvals.ts +23 -8
- package/src/runtime/channel-invite-transport.ts +2 -2
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-readiness-service.ts +3 -5
- package/src/runtime/channel-retry-sweep.ts +18 -24
- package/src/runtime/channel-verification-service.ts +9 -11
- package/src/runtime/finalize-event-delivery.ts +30 -16
- package/src/runtime/guardian-action-service.ts +10 -11
- package/src/runtime/guardian-reply-router.ts +122 -21
- package/src/runtime/http-server.ts +44 -101
- package/src/runtime/introduction-policy.test.ts +214 -0
- package/src/runtime/introduction-policy.ts +284 -0
- package/src/runtime/invite-service.ts +104 -361
- package/src/runtime/local-actor-identity.test.ts +38 -0
- package/src/runtime/local-actor-identity.ts +14 -0
- package/src/runtime/middleware/__tests__/rate-limiter.test.ts +22 -0
- package/src/runtime/middleware/rate-limiter.ts +30 -0
- package/src/runtime/middleware/twilio-validation.ts +5 -7
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +28 -0
- package/src/runtime/migrations/origin-mode.ts +6 -6
- package/src/runtime/pre-first-message-gate.ts +1 -0
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +6 -35
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +24 -3
- package/src/runtime/routes/__tests__/contact-routes.test.ts +80 -15
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +7 -1
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -3
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +142 -1
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +119 -30
- package/src/runtime/routes/__tests__/migration-import-allowed-hosts-env.test.ts +70 -0
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +194 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +755 -29
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +4 -0
- package/src/runtime/routes/__tests__/schedule-routes-create.test.ts +70 -0
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +161 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes.ts +15 -3
- package/src/runtime/routes/app-management-routes.ts +4 -7
- package/src/runtime/routes/approval-routes.ts +4 -0
- package/src/runtime/routes/attachment-routes.ts +54 -3
- package/src/runtime/routes/avatar-routes.ts +0 -4
- package/src/runtime/routes/background-tool-routes.ts +34 -5
- package/src/runtime/routes/btw-routes.ts +32 -4
- package/src/runtime/routes/channel-route-shared.ts +18 -14
- package/src/runtime/routes/channel-verification-routes.ts +0 -3
- package/src/runtime/routes/contact-routes.ts +298 -117
- package/src/runtime/routes/conversation-list-routes.ts +6 -0
- package/src/runtime/routes/conversation-management-routes.ts +74 -37
- package/src/runtime/routes/conversation-query-routes.ts +5 -2
- package/src/runtime/routes/conversation-routes.ts +222 -82
- package/src/runtime/routes/conversations-import-routes.ts +8 -1
- package/src/runtime/routes/credential-prompt-routes.ts +20 -5
- package/src/runtime/routes/debug-routes.ts +1 -0
- package/src/runtime/routes/documents-routes.ts +5 -2
- package/src/runtime/routes/empty-state-greeting-cache.ts +37 -10
- package/src/runtime/routes/global-search-routes.ts +2 -1
- package/src/runtime/routes/guardian-approval-interception.ts +51 -0
- package/src/runtime/routes/home-feed-routes.ts +60 -1
- package/src/runtime/routes/identity-routes.ts +4 -87
- package/src/runtime/routes/inbound-message-handler.ts +82 -41
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +430 -57
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +302 -572
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +76 -270
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +21 -116
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +9 -1
- package/src/runtime/routes/inbound-stages/escalation-intercept.test.ts +158 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +22 -1
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +22 -16
- package/src/runtime/routes/internal-twilio-routes.ts +0 -15
- package/src/runtime/routes/messages-lexical-routes.ts +75 -0
- package/src/runtime/routes/migration-routes.ts +69 -6
- package/src/runtime/routes/monitoring-routes.ts +237 -0
- package/src/runtime/routes/plugins-routes.ts +329 -8
- package/src/runtime/routes/schedule-routes.ts +49 -8
- package/src/runtime/routes/schedule-worker-routes.ts +210 -0
- package/src/runtime/routes/secret-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +54 -9
- package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +30 -6
- package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +43 -8
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +20 -0
- package/src/runtime/services/analyze-conversation.ts +14 -4
- package/src/runtime/services/conversation-serializer.ts +5 -0
- package/src/runtime/slack-no-response.ts +47 -0
- package/src/runtime/slack-reply-session.test.ts +633 -0
- package/src/runtime/slack-reply-session.ts +382 -0
- package/src/runtime/slack-task-progress.ts +95 -0
- package/src/runtime/sync/resource-sync-events.ts +25 -0
- package/src/runtime/tool-grant-request-helper.ts +17 -1
- package/src/runtime/trust-class.test.ts +141 -0
- package/src/runtime/trust-class.ts +121 -0
- package/src/runtime/trust-verdict-consumer.ts +7 -6
- package/src/schedule/__tests__/run-script.test.ts +21 -0
- package/src/schedule/__tests__/worker-control.test.ts +241 -0
- package/src/schedule/run-script.ts +13 -6
- package/src/schedule/schedule-usage-store.ts +1 -0
- package/src/schedule/scheduler.ts +178 -127
- package/src/schedule/worker-control.ts +118 -0
- package/src/schedule/worker.ts +131 -0
- package/src/skills/__tests__/categories-cache.test.ts +38 -0
- package/src/skills/categories-cache.ts +40 -5
- package/src/skills/managed-store.ts +41 -6
- package/src/skills/validate-input.ts +47 -0
- package/src/stt/types.ts +5 -9
- package/src/subagent/manager.ts +267 -39
- package/src/subagent/types.ts +6 -2
- package/src/subagent/validate-allowlists.ts +65 -0
- package/src/telemetry/watchdog-direct-emit.test.ts +109 -0
- package/src/telemetry/watchdog-direct-emit.ts +89 -0
- package/src/tools/acp/list-agents.test.ts +0 -6
- package/src/tools/background-tool-registry.ts +61 -0
- package/src/tools/document/document-comment-tool.test.ts +4 -0
- package/src/tools/host-terminal/host-shell.test.ts +397 -0
- package/src/tools/host-terminal/host-shell.ts +203 -14
- package/src/tools/skills/find-similar-skills.test.ts +152 -1
- package/src/tools/skills/find-similar-skills.ts +30 -4
- package/src/tools/skills/load.ts +36 -0
- package/src/tools/skills/scaffold-managed.ts +66 -34
- package/src/tools/skills/skill-script-runner.ts +17 -0
- package/src/tools/skills/skill-tool-factory.ts +5 -1
- package/src/tools/terminal/safe-env.ts +3 -0
- package/src/tools/terminal/shell.test.ts +177 -0
- package/src/tools/terminal/shell.ts +98 -4
- package/src/tools/tool-approval-handler.ts +106 -29
- package/{node_modules/@vellumai/skill-host-contracts/src → src/tools}/tool-types.ts +16 -17
- package/src/tools/types.ts +29 -17
- package/src/tools/ui-surface/definitions.ts +3 -1
- package/src/tts/__tests__/provider-adapters.test.ts +37 -0
- package/src/tts/__tests__/provider-catalog.test.ts +21 -0
- package/src/tts/provider-catalog.ts +40 -9
- package/src/tts/providers/fish-audio-provider.ts +19 -10
- package/src/tts/types.ts +3 -4
- package/src/util/__tests__/process-tree.test.ts +10 -2
- package/src/util/__tests__/text-spacing.test.ts +53 -0
- package/src/util/cgroup-memory.ts +142 -0
- package/src/util/image-conversion.ts +281 -0
- package/src/util/phone.ts +1 -8
- package/src/util/platform.ts +33 -0
- package/src/util/process-tree.ts +10 -2
- package/src/util/text-spacing.ts +53 -0
- package/src/util/worker-process.ts +271 -0
- package/src/workflows/journal-store.ts +16 -1
- package/src/workflows/library.test.ts +35 -20
- package/src/workflows/library.ts +105 -66
- package/src/workspace/git-service.ts +1 -0
- package/src/workspace/migrations/011-backfill-installation-id.ts +83 -31
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +41 -22
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +1 -1
- package/src/workspace/migrations/118-seed-now-md.ts +64 -0
- package/src/workspace/migrations/119-strip-persisted-memory-v3-tuning-defaults.ts +169 -0
- package/src/workspace/migrations/120-revise-onboarding-threads.ts +47 -0
- package/src/workspace/migrations/121-seed-default-user-guardrails.ts +82 -0
- package/src/workspace/migrations/122-relocate-default-user-boundary.ts +111 -0
- package/src/workspace/migrations/123-swap-quality-profile-to-fable.ts +85 -0
- package/src/workspace/migrations/__tests__/119-strip-persisted-memory-v3-tuning-defaults.test.ts +181 -0
- package/src/workspace/migrations/registry.ts +12 -0
- package/drizzle/0000_dizzy_maggott.sql +0 -301
- package/drizzle/meta/0000_snapshot.json +0 -1933
- package/drizzle/meta/_journal.json +0 -13
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +0 -887
- package/node_modules/@vellumai/skill-host-contracts/bun.lock +0 -24
- package/node_modules/@vellumai/skill-host-contracts/package.json +0 -18
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -97
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +0 -1349
- package/node_modules/@vellumai/skill-host-contracts/src/index.ts +0 -6
- package/node_modules/@vellumai/skill-host-contracts/src/runtime-mode.ts +0 -11
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +0 -32
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +0 -333
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.json +0 -20
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.test.json +0 -12
- package/src/__tests__/invite-redemption-service.test.ts +0 -1180
- package/src/__tests__/invite-service-ipc.test.ts +0 -350
- package/src/__tests__/job-handler-registry-guard.test.ts +0 -125
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -203
- package/src/__tests__/relay-server.test.ts +0 -6153
- package/src/__tests__/telephony-stt-routing.test.ts +0 -329
- package/src/__tests__/voice-invite-redemption.test.ts +0 -702
- package/src/calls/relay-server.ts +0 -2463
- package/src/calls/telephony-stt-routing.ts +0 -145
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -128
- package/src/daemon/__tests__/daemon-skill-host.test.ts +0 -273
- package/src/daemon/daemon-skill-host.ts +0 -262
- package/src/daemon/message-types/meet.ts +0 -143
- package/src/daemon/shutdown-registry.ts +0 -40
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -253
- package/src/ipc/__tests__/skill-server.test.ts +0 -182
- package/src/ipc/skill-ipc-types.ts +0 -54
- package/src/ipc/skill-routes/__tests__/config.test.ts +0 -146
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +0 -448
- package/src/ipc/skill-routes/__tests__/identity.test.ts +0 -62
- package/src/ipc/skill-routes/__tests__/log.test.ts +0 -133
- package/src/ipc/skill-routes/__tests__/memory.test.ts +0 -203
- package/src/ipc/skill-routes/__tests__/platform.test.ts +0 -111
- package/src/ipc/skill-routes/__tests__/providers.test.ts +0 -265
- package/src/ipc/skill-routes/__tests__/registries.test.ts +0 -400
- package/src/ipc/skill-routes/config.ts +0 -47
- package/src/ipc/skill-routes/events.ts +0 -147
- package/src/ipc/skill-routes/identity.ts +0 -21
- package/src/ipc/skill-routes/index.ts +0 -37
- package/src/ipc/skill-routes/log.ts +0 -40
- package/src/ipc/skill-routes/memory.ts +0 -92
- package/src/ipc/skill-routes/platform.ts +0 -39
- package/src/ipc/skill-routes/providers.ts +0 -162
- package/src/ipc/skill-routes/registries.ts +0 -338
- package/src/ipc/skill-server.ts +0 -831
- package/src/ipc/skill-socket-path.ts +0 -20
- package/src/jobs/register-job-handlers.ts +0 -74
- package/src/persistence/invite-store.ts +0 -481
- package/src/plugins/job-handler-registry.ts +0 -94
- package/src/providers/cache-control.ts +0 -26
- package/src/runtime/__tests__/runtime-mode.test.ts +0 -62
- package/src/runtime/invite-redemption-service.ts +0 -828
- package/src/runtime/invite-redemption-templates.ts +0 -46
- package/src/runtime/runtime-mode.ts +0 -40
- package/src/runtime/slack-dm-text-delivery.ts +0 -177
- package/src/util/voice-code.ts +0 -31
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill IPC routes for the `host.memory.*` facet.
|
|
3
|
-
*
|
|
4
|
-
* These mirror the in-process delegates used by `DaemonSkillHost`
|
|
5
|
-
* (see `assistant/src/daemon/daemon-skill-host.ts`). Every handler is a
|
|
6
|
-
* thin pass-through to the underlying daemon module, with schema-validated
|
|
7
|
-
* params and a serializable return shape.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { z } from "zod";
|
|
11
|
-
|
|
12
|
-
import { addMessage } from "../../persistence/conversation-crud.js";
|
|
13
|
-
import { wakeAgentForOpportunity } from "../../runtime/agent-wake.js";
|
|
14
|
-
import type { SkillIpcRoute } from "../skill-ipc-types.js";
|
|
15
|
-
|
|
16
|
-
// -- Param schemas --------------------------------------------------------
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* IPC params for `addMessage()`. `role` is constrained to the
|
|
20
|
-
* renderable conversation roles (`user`/`assistant`): the messages store
|
|
21
|
-
* is UI-facing (`ConversationMessage`), so agent-context `system` rows are
|
|
22
|
-
* not accepted here. `metadata` is a free-form record (validated
|
|
23
|
-
* downstream by `messageMetadataSchema` with a warn-and-store fallback).
|
|
24
|
-
* `skipIndexing` and `clientMessageId` mirror `AddMessageOptions`.
|
|
25
|
-
*
|
|
26
|
-
* The `opts` field is a backward-compat shim: the macOS app and platform
|
|
27
|
-
* do not release together, so a skill-host built against an older contract
|
|
28
|
-
* may still send `{ opts: { skipIndexing } }` instead of the flat shape.
|
|
29
|
-
* The handler flattens it via `skipIndexing ?? opts?.skipIndexing`.
|
|
30
|
-
*/
|
|
31
|
-
const MemoryAddMessageParams = z.object({
|
|
32
|
-
conversationId: z.string().min(1),
|
|
33
|
-
role: z.enum(["user", "assistant"]),
|
|
34
|
-
content: z.string(),
|
|
35
|
-
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
36
|
-
skipIndexing: z.boolean().optional(),
|
|
37
|
-
clientMessageId: z.string().optional(),
|
|
38
|
-
opts: z.object({ skipIndexing: z.boolean().optional() }).optional(),
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
/** Mirrors `WakeOptions` from `runtime/agent-wake.ts`. */
|
|
42
|
-
const MemoryWakeOpportunityParams = z.object({
|
|
43
|
-
conversationId: z.string().min(1),
|
|
44
|
-
hint: z.string().min(1),
|
|
45
|
-
source: z.string().min(1),
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// -- Handlers -------------------------------------------------------------
|
|
49
|
-
|
|
50
|
-
async function handleAddMessage(params?: Record<string, unknown>) {
|
|
51
|
-
const {
|
|
52
|
-
conversationId,
|
|
53
|
-
role,
|
|
54
|
-
content,
|
|
55
|
-
metadata,
|
|
56
|
-
skipIndexing,
|
|
57
|
-
clientMessageId,
|
|
58
|
-
opts,
|
|
59
|
-
} = MemoryAddMessageParams.parse(params);
|
|
60
|
-
return addMessage(conversationId, role, content, {
|
|
61
|
-
metadata,
|
|
62
|
-
skipIndexing: skipIndexing ?? opts?.skipIndexing,
|
|
63
|
-
clientMessageId,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function handleWakeAgentForOpportunity(
|
|
68
|
-
params?: Record<string, unknown>,
|
|
69
|
-
): Promise<void> {
|
|
70
|
-
const opts = MemoryWakeOpportunityParams.parse(params);
|
|
71
|
-
// Contract exposes `void` even though the daemon returns a `WakeResult` —
|
|
72
|
-
// the skill surface does not need the producedToolCalls / reason fields.
|
|
73
|
-
await wakeAgentForOpportunity(opts);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// -- Route definitions ----------------------------------------------------
|
|
77
|
-
|
|
78
|
-
export const memoryAddMessageRoute: SkillIpcRoute = {
|
|
79
|
-
method: "host.memory.addMessage",
|
|
80
|
-
handler: handleAddMessage,
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
export const memoryWakeAgentForOpportunityRoute: SkillIpcRoute = {
|
|
84
|
-
method: "host.memory.wakeAgentForOpportunity",
|
|
85
|
-
handler: handleWakeAgentForOpportunity,
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/** All `host.memory.*` IPC routes. */
|
|
89
|
-
export const memorySkillRoutes: SkillIpcRoute[] = [
|
|
90
|
-
memoryAddMessageRoute,
|
|
91
|
-
memoryWakeAgentForOpportunityRoute,
|
|
92
|
-
];
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill IPC routes: `host.platform.workspaceDir`, `host.platform.vellumRoot`,
|
|
3
|
-
* and `host.platform.runtimeMode`.
|
|
4
|
-
*
|
|
5
|
-
* Surface the platform-path helpers and deployment mode so out-of-process
|
|
6
|
-
* skills can compute workspace-relative paths and branch on docker vs
|
|
7
|
-
* bare-metal behavior without reaching into assistant internals.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { getDaemonRuntimeMode } from "../../runtime/runtime-mode.js";
|
|
11
|
-
import { getWorkspaceDir, vellumRoot } from "../../util/platform.js";
|
|
12
|
-
import type { SkillIpcRoute } from "../skill-ipc-types.js";
|
|
13
|
-
|
|
14
|
-
export const hostPlatformWorkspaceDirRoute: SkillIpcRoute = {
|
|
15
|
-
method: "host.platform.workspaceDir",
|
|
16
|
-
handler: () => {
|
|
17
|
-
return getWorkspaceDir();
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export const hostPlatformVellumRootRoute: SkillIpcRoute = {
|
|
22
|
-
method: "host.platform.vellumRoot",
|
|
23
|
-
handler: () => {
|
|
24
|
-
return vellumRoot();
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const hostPlatformRuntimeModeRoute: SkillIpcRoute = {
|
|
29
|
-
method: "host.platform.runtimeMode",
|
|
30
|
-
handler: () => {
|
|
31
|
-
return getDaemonRuntimeMode();
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export const platformRoutes: SkillIpcRoute[] = [
|
|
36
|
-
hostPlatformWorkspaceDirRoute,
|
|
37
|
-
hostPlatformVellumRootRoute,
|
|
38
|
-
hostPlatformRuntimeModeRoute,
|
|
39
|
-
];
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill IPC routes for the `host.providers.*` facet.
|
|
3
|
-
*
|
|
4
|
-
* These mirror the in-process delegates used by `DaemonSkillHost`
|
|
5
|
-
* (see `assistant/src/daemon/daemon-skill-host.ts`). Every handler is a
|
|
6
|
-
* thin pass-through to the underlying daemon module, with schema-validated
|
|
7
|
-
* params and a serializable return shape.
|
|
8
|
-
*
|
|
9
|
-
* Sub-facets:
|
|
10
|
-
* - `host.providers.llm.complete`
|
|
11
|
-
* - `host.providers.stt.listProviderIds`
|
|
12
|
-
* - `host.providers.stt.supportsBoundary`
|
|
13
|
-
* - `host.providers.tts.resolveConfig`
|
|
14
|
-
* - `host.providers.tts.get` (returns a handle-as-id; synthesis
|
|
15
|
-
* happens in-skill via the returned config)
|
|
16
|
-
* - `host.providers.secureKeys.getProviderKey`
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { z } from "zod";
|
|
20
|
-
|
|
21
|
-
import { getConfig } from "../../config/loader.js";
|
|
22
|
-
import { LLMCallSiteEnum } from "../../config/schemas/llm.js";
|
|
23
|
-
import { getConfiguredProvider } from "../../providers/provider-send-message.js";
|
|
24
|
-
import {
|
|
25
|
-
listProviderIds as sttListProviderIds,
|
|
26
|
-
supportsBoundary as sttSupportsBoundary,
|
|
27
|
-
} from "../../providers/speech-to-text/provider-catalog.js";
|
|
28
|
-
import type {
|
|
29
|
-
Message,
|
|
30
|
-
SendMessageConfig,
|
|
31
|
-
ToolDefinition,
|
|
32
|
-
} from "../../providers/types.js";
|
|
33
|
-
import { getProviderKeyAsync } from "../../security/secure-keys.js";
|
|
34
|
-
import { getTtsProvider } from "../../tts/provider-registry.js";
|
|
35
|
-
import { resolveTtsConfig } from "../../tts/tts-config-resolver.js";
|
|
36
|
-
import type { SkillIpcRoute } from "../skill-ipc-types.js";
|
|
37
|
-
|
|
38
|
-
// -- Param schemas --------------------------------------------------------
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* LLM completion request. The IPC surface only accepts the serializable
|
|
42
|
-
* subset of `Provider.sendMessage(messages, options?)`.
|
|
43
|
-
* Non-serializable fields (`onEvent`, `signal`) are intentionally omitted —
|
|
44
|
-
* streaming deltas and per-call cancellation belong on future streaming
|
|
45
|
-
* routes, not this one-shot RPC.
|
|
46
|
-
*/
|
|
47
|
-
const ProvidersLlmCompleteParams = z.object({
|
|
48
|
-
callSite: LLMCallSiteEnum,
|
|
49
|
-
messages: z.array(z.unknown()),
|
|
50
|
-
tools: z.array(z.unknown()).optional(),
|
|
51
|
-
systemPrompt: z.string().optional(),
|
|
52
|
-
config: z.record(z.string(), z.unknown()).optional(),
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
const ProvidersSttSupportsBoundaryParams = z.object({
|
|
56
|
-
id: z.string().min(1),
|
|
57
|
-
boundary: z.string().min(1),
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
const ProvidersTtsGetParams = z.object({
|
|
61
|
-
id: z.string().min(1),
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
const ProvidersSecureKeysGetParams = z.object({
|
|
65
|
-
id: z.string().min(1),
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
// -- Handlers -------------------------------------------------------------
|
|
69
|
-
|
|
70
|
-
async function handleLlmComplete(params?: Record<string, unknown>) {
|
|
71
|
-
const { callSite, messages, tools, systemPrompt, config } =
|
|
72
|
-
ProvidersLlmCompleteParams.parse(params);
|
|
73
|
-
const provider = await getConfiguredProvider(callSite);
|
|
74
|
-
if (!provider) {
|
|
75
|
-
throw new Error(
|
|
76
|
-
`host.providers.llm.complete: no provider configured for callSite '${callSite}'`,
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
return provider.sendMessage(messages as Message[], {
|
|
80
|
-
tools: tools as ToolDefinition[] | undefined,
|
|
81
|
-
systemPrompt,
|
|
82
|
-
config: { ...((config as SendMessageConfig) ?? {}), callSite },
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function handleSttListProviderIds(): string[] {
|
|
87
|
-
return [...sttListProviderIds()];
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function handleSttSupportsBoundary(params?: Record<string, unknown>): boolean {
|
|
91
|
-
const { id, boundary } = ProvidersSttSupportsBoundaryParams.parse(params);
|
|
92
|
-
// Unknown ids return `false`, so the narrowing cast is safe.
|
|
93
|
-
return sttSupportsBoundary(id as never, boundary as never);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function handleTtsResolveConfig(): ReturnType<typeof resolveTtsConfig> {
|
|
97
|
-
return resolveTtsConfig(getConfig());
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Return a serializable handle for a TTS provider. The actual `TtsProvider`
|
|
102
|
-
* object holds method closures that cannot cross the IPC boundary — skills
|
|
103
|
-
* identify the provider by id and do synthesis via the config returned from
|
|
104
|
-
* `resolveConfig`. We still invoke `getTtsProvider(id)` here so an invalid
|
|
105
|
-
* id surfaces as an error rather than a silently invalid handle.
|
|
106
|
-
*/
|
|
107
|
-
function handleTtsGet(params?: Record<string, unknown>): { id: string } {
|
|
108
|
-
const { id } = ProvidersTtsGetParams.parse(params);
|
|
109
|
-
const provider = getTtsProvider(id as never);
|
|
110
|
-
return { id: provider.id };
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async function handleSecureKeysGetProviderKey(
|
|
114
|
-
params?: Record<string, unknown>,
|
|
115
|
-
): Promise<string | null> {
|
|
116
|
-
const { id } = ProvidersSecureKeysGetParams.parse(params);
|
|
117
|
-
// Daemon helper returns `undefined` for absent keys; the contract returns
|
|
118
|
-
// `null`. Normalize at the boundary.
|
|
119
|
-
return (await getProviderKeyAsync(id)) ?? null;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// -- Route definitions ----------------------------------------------------
|
|
123
|
-
|
|
124
|
-
export const providersLlmCompleteRoute: SkillIpcRoute = {
|
|
125
|
-
method: "host.providers.llm.complete",
|
|
126
|
-
handler: handleLlmComplete,
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
export const providersSttListProviderIdsRoute: SkillIpcRoute = {
|
|
130
|
-
method: "host.providers.stt.listProviderIds",
|
|
131
|
-
handler: handleSttListProviderIds,
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
export const providersSttSupportsBoundaryRoute: SkillIpcRoute = {
|
|
135
|
-
method: "host.providers.stt.supportsBoundary",
|
|
136
|
-
handler: handleSttSupportsBoundary,
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
export const providersTtsResolveConfigRoute: SkillIpcRoute = {
|
|
140
|
-
method: "host.providers.tts.resolveConfig",
|
|
141
|
-
handler: handleTtsResolveConfig,
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
export const providersTtsGetRoute: SkillIpcRoute = {
|
|
145
|
-
method: "host.providers.tts.get",
|
|
146
|
-
handler: handleTtsGet,
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
export const providersSecureKeysGetProviderKeyRoute: SkillIpcRoute = {
|
|
150
|
-
method: "host.providers.secureKeys.getProviderKey",
|
|
151
|
-
handler: handleSecureKeysGetProviderKey,
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
/** All `host.providers.*` IPC routes. */
|
|
155
|
-
export const providerSkillRoutes: SkillIpcRoute[] = [
|
|
156
|
-
providersLlmCompleteRoute,
|
|
157
|
-
providersSttListProviderIdsRoute,
|
|
158
|
-
providersSttSupportsBoundaryRoute,
|
|
159
|
-
providersTtsResolveConfigRoute,
|
|
160
|
-
providersTtsGetRoute,
|
|
161
|
-
providersSecureKeysGetProviderKeyRoute,
|
|
162
|
-
];
|
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill IPC routes — `host.registries.*` surface.
|
|
3
|
-
*
|
|
4
|
-
* Lets an out-of-process skill install tools, HTTP routes, shutdown hooks
|
|
5
|
-
* and session-tracking signals into the daemon's in-memory registries. When
|
|
6
|
-
* a `SessionSupervisor` is attached (production lazy-external path),
|
|
7
|
-
* the register_* handlers short-circuit because the manifest loader has
|
|
8
|
-
* already installed proxy entries that round-trip via `skill.dispatch_*`;
|
|
9
|
-
* the handler simply pins the incoming connection on the supervisor so
|
|
10
|
-
* dispatches have a target. When no supervisor is attached (tests, boot
|
|
11
|
-
* race), the handler installs in-memory proxies whose stubs surface a
|
|
12
|
-
* 501/501-equivalent error — those paths are not exercised end-to-end.
|
|
13
|
-
*
|
|
14
|
-
* `report_session_started` / `report_session_ended` keep an internal counter
|
|
15
|
-
* mirrored to the supervisor's own counter (which is the source of truth
|
|
16
|
-
* once attached); the local set backs tests that exercise the IPC routes
|
|
17
|
-
* without a supervisor.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { z } from "zod";
|
|
21
|
-
|
|
22
|
-
import { registerShutdownHook } from "../../daemon/shutdown-registry.js";
|
|
23
|
-
import { registerSkillRoute } from "../../runtime/skill-route-registry.js";
|
|
24
|
-
import { registerSkillTools } from "../../tools/registry.js";
|
|
25
|
-
import { finalizeTool } from "../../tools/tool-defaults.js";
|
|
26
|
-
import { ToolDefinitionSchema } from "../../tools/types.js";
|
|
27
|
-
import { getLogger } from "../../util/logger.js";
|
|
28
|
-
import type { SkillIpcRoute } from "../skill-ipc-types.js";
|
|
29
|
-
import type { SkillIpcConnection } from "../skill-server.js";
|
|
30
|
-
|
|
31
|
-
const log = getLogger("skill-routes-registries");
|
|
32
|
-
|
|
33
|
-
// `skillId` lives at the params level rather than per-tool: a single
|
|
34
|
-
// `register_tools` IPC frame is always one skill's batch, ownership flows
|
|
35
|
-
// through `registerSkillTools(skillId, tools)` into the registry's
|
|
36
|
-
// `ownersByName` map, and the tools themselves stay free of owner
|
|
37
|
-
// metadata so callers cannot spoof ownership by forging a field on the
|
|
38
|
-
// manifest. Only skill-owned tools cross IPC — plugin and MCP tools live
|
|
39
|
-
// in-process on the assistant side.
|
|
40
|
-
const RegisterToolsParams = z.object({
|
|
41
|
-
skillId: z.string().min(1),
|
|
42
|
-
tools: z.array(ToolDefinitionSchema).min(1),
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const RegisterSkillRouteParams = z.object({
|
|
46
|
-
patternSource: z.string().min(1),
|
|
47
|
-
// `new RegExp(patternSource)` alone silently drops i/m/g/s/u/y flags from
|
|
48
|
-
// the skill-side RegExp — keep them as a separate field to survive IPC.
|
|
49
|
-
patternFlags: z.string().default(""),
|
|
50
|
-
methods: z.array(z.string().min(1)).min(1),
|
|
51
|
-
skillId: z.string().min(1).optional(),
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const RegisterShutdownHookParams = z.object({
|
|
55
|
-
name: z.string().min(1),
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const ReportSessionParams = z.object({
|
|
59
|
-
meetingId: z.string().min(1),
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
// ── Session counter ───────────────────────────────────────────────────
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Fallback active-session set. Keyed by meetingId so duplicate
|
|
66
|
-
* `report_session_started` calls are idempotent and `report_session_ended`
|
|
67
|
-
* for an unknown id is a no-op. Used in the narrow window before
|
|
68
|
-
* `meet-host-startup.ts` registers the supervisor and in tests that
|
|
69
|
-
* exercise the IPC routes in isolation. Also backs the test-only peek
|
|
70
|
-
* helper since the supervisor owns its own counter.
|
|
71
|
-
*/
|
|
72
|
-
const activeSessions = new Set<string>();
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Supervisor injected by `meet-host-startup.ts` at daemon boot. When set,
|
|
76
|
-
* IPC session-report frames are forwarded to it so its active-session
|
|
77
|
-
* counter and idle-shutdown timer stay in sync with the routes; the
|
|
78
|
-
* `register_*` handlers also pin the incoming connection on the
|
|
79
|
-
* supervisor so daemon→skill dispatches have a target. When unset (boot
|
|
80
|
-
* race, tests), the fallback set above is mutated directly and the
|
|
81
|
-
* register_* handlers fall back to in-memory proxy installation.
|
|
82
|
-
*/
|
|
83
|
-
interface SessionSupervisor {
|
|
84
|
-
reportSessionStarted(sessionId: string): void;
|
|
85
|
-
reportSessionEnded(sessionId: string): void;
|
|
86
|
-
readonly activeSessionCount: number;
|
|
87
|
-
setActiveConnection(connection: SkillIpcConnection): void;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
let sessionSupervisor: SessionSupervisor | null = null;
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Install a `SessionSupervisor` as the session-report sink and
|
|
94
|
-
* connection holder for daemon→skill dispatch. The IPC routes still
|
|
95
|
-
* maintain their fallback {@link Set} for diagnostics, but the
|
|
96
|
-
* supervisor's counter is the source of truth for the `activeCount`
|
|
97
|
-
* returned to the skill. Passing `null` detaches the supervisor — used
|
|
98
|
-
* by tests that want to exercise the fallback path cleanly.
|
|
99
|
-
*/
|
|
100
|
-
export function setMeetHostSupervisorForSessionReports(
|
|
101
|
-
supervisor: SessionSupervisor | null,
|
|
102
|
-
): void {
|
|
103
|
-
sessionSupervisor = supervisor;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function reportSessionStarted(meetingId: string): number {
|
|
107
|
-
if (sessionSupervisor) {
|
|
108
|
-
sessionSupervisor.reportSessionStarted(meetingId);
|
|
109
|
-
const count = sessionSupervisor.activeSessionCount;
|
|
110
|
-
log.info(
|
|
111
|
-
{ meetingId, activeCount: count },
|
|
112
|
-
"Skill reported session started",
|
|
113
|
-
);
|
|
114
|
-
return count;
|
|
115
|
-
}
|
|
116
|
-
activeSessions.add(meetingId);
|
|
117
|
-
log.info(
|
|
118
|
-
{ meetingId, activeCount: activeSessions.size },
|
|
119
|
-
"Skill reported session started",
|
|
120
|
-
);
|
|
121
|
-
return activeSessions.size;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function reportSessionEnded(meetingId: string): number {
|
|
125
|
-
if (sessionSupervisor) {
|
|
126
|
-
sessionSupervisor.reportSessionEnded(meetingId);
|
|
127
|
-
const count = sessionSupervisor.activeSessionCount;
|
|
128
|
-
log.info({ meetingId, activeCount: count }, "Skill reported session ended");
|
|
129
|
-
return count;
|
|
130
|
-
}
|
|
131
|
-
activeSessions.delete(meetingId);
|
|
132
|
-
log.info(
|
|
133
|
-
{ meetingId, activeCount: activeSessions.size },
|
|
134
|
-
"Skill reported session ended",
|
|
135
|
-
);
|
|
136
|
-
return activeSessions.size;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/** Test-only: drop all active sessions between test cases. */
|
|
140
|
-
export function __resetActiveSessionsForTesting(): void {
|
|
141
|
-
activeSessions.clear();
|
|
142
|
-
sessionSupervisor = null;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/** Test-only: peek at the current active set size. */
|
|
146
|
-
export function __getActiveSessionCountForTesting(): number {
|
|
147
|
-
return activeSessions.size;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// ── Handlers ──────────────────────────────────────────────────────────
|
|
151
|
-
|
|
152
|
-
async function handleRegisterTools(
|
|
153
|
-
params: Record<string, unknown> | undefined,
|
|
154
|
-
connection?: unknown,
|
|
155
|
-
): Promise<{ registered: string[] }> {
|
|
156
|
-
const { skillId, tools } = RegisterToolsParams.parse(params);
|
|
157
|
-
const conn = connection as SkillIpcConnection | undefined;
|
|
158
|
-
|
|
159
|
-
// Finalize before branching so both the supervisor short-circuit and
|
|
160
|
-
// the in-memory registration path see a `Tool[]` with guaranteed
|
|
161
|
-
// `name`. The execute closure arrives as a no-op error closure from
|
|
162
|
-
// `finalizeTool`; the production (supervisor) path replaces it with
|
|
163
|
-
// the dispatching closure installed by the manifest loader at boot.
|
|
164
|
-
const proxies = tools.map((t) => finalizeTool(t));
|
|
165
|
-
|
|
166
|
-
// Supervisor short-circuit: when a supervisor is registered, the
|
|
167
|
-
// manifest loader has already installed proxy tools at daemon boot.
|
|
168
|
-
// Re-installing here would double-register and clobber the manifest's
|
|
169
|
-
// execute closures with these placeholder ones. Pin the incoming
|
|
170
|
-
// connection on the supervisor so daemon→skill dispatches have a
|
|
171
|
-
// target, then return the manifest-declared tool names.
|
|
172
|
-
if (sessionSupervisor) {
|
|
173
|
-
if (conn) sessionSupervisor.setActiveConnection(conn);
|
|
174
|
-
log.info(
|
|
175
|
-
{
|
|
176
|
-
count: proxies.length,
|
|
177
|
-
names: proxies.map((t) => t.name),
|
|
178
|
-
ownerSkillId: skillId,
|
|
179
|
-
},
|
|
180
|
-
"Supervisor active: skipping in-memory tool re-registration; manifest proxies serve dispatches",
|
|
181
|
-
);
|
|
182
|
-
return { registered: proxies.map((t) => t.name) };
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// `registerExternalTools` is only consumed inside `initializeTools()` at
|
|
186
|
-
// daemon boot; IPC children connect after boot, so route through
|
|
187
|
-
// `registerSkillTools` into the live registry the agent-loop reads from.
|
|
188
|
-
// Owner is stamped registry-side from `skillId`; the proxy `Tool` objects
|
|
189
|
-
// carry no owner field.
|
|
190
|
-
const accepted = registerSkillTools(skillId, proxies);
|
|
191
|
-
|
|
192
|
-
// `registerSkillTools` increments the registry refcount once per call;
|
|
193
|
-
// mirror that on the connection so disconnect issues exactly one matching
|
|
194
|
-
// decrement.
|
|
195
|
-
if (conn && accepted.length > 0) {
|
|
196
|
-
conn.addSkillToolsOwner(skillId);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
log.info(
|
|
200
|
-
{
|
|
201
|
-
count: accepted.length,
|
|
202
|
-
names: accepted.map((t) => t.name),
|
|
203
|
-
ownerSkillId: skillId,
|
|
204
|
-
},
|
|
205
|
-
"Registered skill proxy tools via IPC",
|
|
206
|
-
);
|
|
207
|
-
return { registered: accepted.map((t) => t.name) };
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
async function handleRegisterSkillRoute(
|
|
211
|
-
params: Record<string, unknown> | undefined,
|
|
212
|
-
connection?: unknown,
|
|
213
|
-
): Promise<{ patternSource: string; methods: string[] }> {
|
|
214
|
-
const { patternSource, patternFlags, methods, skillId } =
|
|
215
|
-
RegisterSkillRouteParams.parse(params);
|
|
216
|
-
const conn = connection as SkillIpcConnection | undefined;
|
|
217
|
-
|
|
218
|
-
// Supervisor short-circuit: route already installed by the manifest
|
|
219
|
-
// loader; pin the connection and let the manifest's proxy handler call
|
|
220
|
-
// supervisor.dispatchRoute over IPC.
|
|
221
|
-
if (sessionSupervisor) {
|
|
222
|
-
if (conn) sessionSupervisor.setActiveConnection(conn);
|
|
223
|
-
log.info(
|
|
224
|
-
{ patternSource, patternFlags, methods, skillId },
|
|
225
|
-
"Supervisor active: skipping in-memory route re-registration; manifest proxy serves dispatches",
|
|
226
|
-
);
|
|
227
|
-
return { patternSource, methods };
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
let pattern: RegExp;
|
|
231
|
-
try {
|
|
232
|
-
pattern = new RegExp(patternSource, patternFlags);
|
|
233
|
-
} catch (err) {
|
|
234
|
-
throw new Error(
|
|
235
|
-
`Invalid skill-route pattern "${patternSource}" (flags "${patternFlags}"): ${String(err)}`,
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
const handle = registerSkillRoute({
|
|
239
|
-
pattern,
|
|
240
|
-
methods,
|
|
241
|
-
handler: async () => {
|
|
242
|
-
// Only reached when no supervisor is attached (tests/boot race);
|
|
243
|
-
// the supervisor short-circuit above keeps the manifest's
|
|
244
|
-
// dispatching handler in place on the production path.
|
|
245
|
-
return new Response(
|
|
246
|
-
"Skill route dispatch requires an attached MeetHostSupervisor",
|
|
247
|
-
{ status: 501 },
|
|
248
|
-
);
|
|
249
|
-
},
|
|
250
|
-
});
|
|
251
|
-
// Retain the handle on the connection so disconnect revokes this route;
|
|
252
|
-
// without it, reconnects accumulate routes with no owner to unregister them.
|
|
253
|
-
conn?.addRouteHandle(skillId ?? conn.connectionId, handle);
|
|
254
|
-
|
|
255
|
-
log.info(
|
|
256
|
-
{ patternSource, patternFlags, methods, skillId },
|
|
257
|
-
"Registered skill proxy HTTP route via IPC",
|
|
258
|
-
);
|
|
259
|
-
return { patternSource, methods };
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
async function handleRegisterShutdownHook(
|
|
263
|
-
params: Record<string, unknown> | undefined,
|
|
264
|
-
connection?: unknown,
|
|
265
|
-
): Promise<{ name: string }> {
|
|
266
|
-
const { name } = RegisterShutdownHookParams.parse(params);
|
|
267
|
-
const conn = connection as SkillIpcConnection | undefined;
|
|
268
|
-
|
|
269
|
-
// Supervisor short-circuit: shutdown hook already registered by the
|
|
270
|
-
// manifest loader; just pin the connection so dispatches can flow.
|
|
271
|
-
if (sessionSupervisor) {
|
|
272
|
-
if (conn) sessionSupervisor.setActiveConnection(conn);
|
|
273
|
-
log.info(
|
|
274
|
-
{ name },
|
|
275
|
-
"Supervisor active: skipping shutdown-hook re-registration; manifest hook serves dispatches",
|
|
276
|
-
);
|
|
277
|
-
return { name };
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
registerShutdownHook(name, async (reason) => {
|
|
281
|
-
// Only reached when no supervisor is attached; production attaches a
|
|
282
|
-
// dispatching hook via the manifest loader.
|
|
283
|
-
log.info(
|
|
284
|
-
{ name, reason },
|
|
285
|
-
"Skill shutdown hook fired (no-op without attached MeetHostSupervisor)",
|
|
286
|
-
);
|
|
287
|
-
});
|
|
288
|
-
return { name };
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
async function handleReportSessionStarted(
|
|
292
|
-
params?: Record<string, unknown>,
|
|
293
|
-
): Promise<{ activeCount: number }> {
|
|
294
|
-
const { meetingId } = ReportSessionParams.parse(params);
|
|
295
|
-
return { activeCount: reportSessionStarted(meetingId) };
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
async function handleReportSessionEnded(
|
|
299
|
-
params?: Record<string, unknown>,
|
|
300
|
-
): Promise<{ activeCount: number }> {
|
|
301
|
-
const { meetingId } = ReportSessionParams.parse(params);
|
|
302
|
-
return { activeCount: reportSessionEnded(meetingId) };
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// ── Route exports ─────────────────────────────────────────────────────
|
|
306
|
-
|
|
307
|
-
export const registerToolsRoute: SkillIpcRoute = {
|
|
308
|
-
method: "host.registries.register_tools",
|
|
309
|
-
handler: handleRegisterTools,
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
export const registerSkillRouteRoute: SkillIpcRoute = {
|
|
313
|
-
method: "host.registries.register_skill_route",
|
|
314
|
-
handler: handleRegisterSkillRoute,
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
export const registerShutdownHookRoute: SkillIpcRoute = {
|
|
318
|
-
method: "host.registries.register_shutdown_hook",
|
|
319
|
-
handler: handleRegisterShutdownHook,
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
export const reportSessionStartedRoute: SkillIpcRoute = {
|
|
323
|
-
method: "host.registries.report_session_started",
|
|
324
|
-
handler: handleReportSessionStarted,
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
export const reportSessionEndedRoute: SkillIpcRoute = {
|
|
328
|
-
method: "host.registries.report_session_ended",
|
|
329
|
-
handler: handleReportSessionEnded,
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
export const registriesRoutes: SkillIpcRoute[] = [
|
|
333
|
-
registerToolsRoute,
|
|
334
|
-
registerSkillRouteRoute,
|
|
335
|
-
registerShutdownHookRoute,
|
|
336
|
-
reportSessionStartedRoute,
|
|
337
|
-
reportSessionEndedRoute,
|
|
338
|
-
];
|