@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,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `DaemonSkillHost` — in-process concretion of the neutral `SkillHost`
|
|
3
|
-
* interface defined in `@vellumai/skill-host-contracts`.
|
|
4
|
-
*
|
|
5
|
-
* `createDaemonSkillHost(skillId)` returns a plain object whose nine facets
|
|
6
|
-
* (`logger`, `config`, `identity`, `platform`, `providers`, `memory`,
|
|
7
|
-
* `events`, `registries`, `speakers`) delegate to the daemon's existing
|
|
8
|
-
* singleton modules. First-party skills that live in-process receive this
|
|
9
|
-
* host via the bootstrap path instead of reaching into `assistant/` with
|
|
10
|
-
* relative imports.
|
|
11
|
-
*
|
|
12
|
-
* Where a delegate's signature does not line up exactly with the contract
|
|
13
|
-
* — pino's `(meta, msg)` log methods vs the contract's `(msg, meta)`,
|
|
14
|
-
* `getAssistantName()` returning `null` vs the contract's `undefined`,
|
|
15
|
-
* `getProviderKeyAsync()` returning `undefined` vs the contract's `null`,
|
|
16
|
-
* `buildAssistantEvent()` signature differences, etc. — the
|
|
17
|
-
* adaptation happens inside this file so the contract stays narrow and the
|
|
18
|
-
* underlying daemon APIs stay unchanged.
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import type {
|
|
22
|
-
AssistantEvent,
|
|
23
|
-
AssistantEventCallback,
|
|
24
|
-
ConfigFacet,
|
|
25
|
-
EventsFacet,
|
|
26
|
-
Filter,
|
|
27
|
-
IdentityFacet,
|
|
28
|
-
LlmProvidersFacet,
|
|
29
|
-
Logger,
|
|
30
|
-
LoggerFacet,
|
|
31
|
-
MemoryFacet,
|
|
32
|
-
PlatformFacet,
|
|
33
|
-
Provider,
|
|
34
|
-
ProvidersFacet,
|
|
35
|
-
RegistriesFacet,
|
|
36
|
-
SecureKeysFacet,
|
|
37
|
-
ServerMessage,
|
|
38
|
-
SkillHost,
|
|
39
|
-
SkillRoute,
|
|
40
|
-
SkillRouteHandle,
|
|
41
|
-
SpeakersFacet,
|
|
42
|
-
StreamingTranscriber,
|
|
43
|
-
SttProvidersFacet,
|
|
44
|
-
Subscription,
|
|
45
|
-
ToolUse,
|
|
46
|
-
TtsConfig,
|
|
47
|
-
TtsProvider,
|
|
48
|
-
TtsProvidersFacet,
|
|
49
|
-
UserMessage,
|
|
50
|
-
} from "@vellumai/skill-host-contracts";
|
|
51
|
-
|
|
52
|
-
import { SpeakerIdentityTracker } from "../calls/speaker-identification.js";
|
|
53
|
-
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
54
|
-
import { getConfig, getNestedValue } from "../config/loader.js";
|
|
55
|
-
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
56
|
-
import { addMessage } from "../persistence/conversation-crud.js";
|
|
57
|
-
import {
|
|
58
|
-
createTimeout,
|
|
59
|
-
extractToolUse,
|
|
60
|
-
getConfiguredProvider,
|
|
61
|
-
userMessage,
|
|
62
|
-
} from "../providers/provider-send-message.js";
|
|
63
|
-
import {
|
|
64
|
-
listProviderIds as sttListProviderIds,
|
|
65
|
-
supportsBoundary as sttSupportsBoundary,
|
|
66
|
-
} from "../providers/speech-to-text/provider-catalog.js";
|
|
67
|
-
import { resolveStreamingTranscriber as sttResolveStreamingTranscriber } from "../providers/speech-to-text/resolve.js";
|
|
68
|
-
import { wakeAgentForOpportunity } from "../runtime/agent-wake.js";
|
|
69
|
-
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
70
|
-
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
71
|
-
import { getDaemonRuntimeMode } from "../runtime/runtime-mode.js";
|
|
72
|
-
import { registerSkillRoute } from "../runtime/skill-route-registry.js";
|
|
73
|
-
import { getProviderKeyAsync } from "../security/secure-keys.js";
|
|
74
|
-
import { registerExternalTools } from "../tools/registry.js";
|
|
75
|
-
import { getTtsProvider } from "../tts/provider-registry.js";
|
|
76
|
-
import { resolveTtsConfig } from "../tts/tts-config-resolver.js";
|
|
77
|
-
import { getLogger } from "../util/logger.js";
|
|
78
|
-
import { getWorkspaceDir, vellumRoot } from "../util/platform.js";
|
|
79
|
-
import { getAssistantName } from "./identity-helpers.js";
|
|
80
|
-
import { registerShutdownHook } from "./shutdown-registry.js";
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Adapt pino's `(meta, msg)` call shape to the contract's `(msg, meta?)`
|
|
84
|
-
* shape so skills can use `host.logger.get(...).info("msg", { ... })`
|
|
85
|
-
* without knowing about pino.
|
|
86
|
-
*/
|
|
87
|
-
function adaptLogger(name: string): Logger {
|
|
88
|
-
const pino = getLogger(name);
|
|
89
|
-
return {
|
|
90
|
-
debug: (msg, meta) => pino.debug(meta ?? {}, msg),
|
|
91
|
-
info: (msg, meta) => pino.info(meta ?? {}, msg),
|
|
92
|
-
warn: (msg, meta) => pino.warn(meta ?? {}, msg),
|
|
93
|
-
error: (msg, meta) => pino.error(meta ?? {}, msg),
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function buildLoggerFacet(skillId: string): LoggerFacet {
|
|
98
|
-
return {
|
|
99
|
-
get: (name) => adaptLogger(`${skillId}:${name}`),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function buildConfigFacet(): ConfigFacet {
|
|
104
|
-
return {
|
|
105
|
-
isFeatureFlagEnabled: (key) =>
|
|
106
|
-
isAssistantFeatureFlagEnabled(key, getConfig()),
|
|
107
|
-
getSection: <T>(path: string): T | undefined =>
|
|
108
|
-
getNestedValue(
|
|
109
|
-
getConfig() as unknown as Record<string, unknown>,
|
|
110
|
-
path,
|
|
111
|
-
) as T | undefined,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function buildIdentityFacet(): IdentityFacet {
|
|
116
|
-
return {
|
|
117
|
-
// Contract uses `undefined`; delegate returns `null`. Normalize here.
|
|
118
|
-
getAssistantName: () => getAssistantName() ?? undefined,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function buildPlatformFacet(): PlatformFacet {
|
|
123
|
-
return {
|
|
124
|
-
workspaceDir: () => getWorkspaceDir(),
|
|
125
|
-
vellumRoot: () => vellumRoot(),
|
|
126
|
-
runtimeMode: () => getDaemonRuntimeMode(),
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function buildLlmProvidersFacet(): LlmProvidersFacet {
|
|
131
|
-
return {
|
|
132
|
-
getConfigured: async (callSite) =>
|
|
133
|
-
(await getConfiguredProvider(callSite as LLMCallSite)) as Provider | null,
|
|
134
|
-
userMessage: (text) => userMessage(text) as unknown as UserMessage,
|
|
135
|
-
extractToolUse: (response) =>
|
|
136
|
-
(extractToolUse(response as Parameters<typeof extractToolUse>[0]) ??
|
|
137
|
-
null) as ToolUse | null,
|
|
138
|
-
createTimeout,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function buildSttProvidersFacet(): SttProvidersFacet {
|
|
143
|
-
return {
|
|
144
|
-
listProviderIds: () => [...sttListProviderIds()],
|
|
145
|
-
// Contract asks whether a provider id is usable; we check against the
|
|
146
|
-
// daemon-streaming boundary which is the only boundary skills currently
|
|
147
|
-
// care about. Passes the id through to the daemon helper.
|
|
148
|
-
supportsBoundary: (id) =>
|
|
149
|
-
sttSupportsBoundary(
|
|
150
|
-
id as Parameters<typeof sttSupportsBoundary>[0],
|
|
151
|
-
"daemon-streaming",
|
|
152
|
-
),
|
|
153
|
-
resolveStreamingTranscriber: async (spec) =>
|
|
154
|
-
(await sttResolveStreamingTranscriber(
|
|
155
|
-
spec as Parameters<typeof sttResolveStreamingTranscriber>[0],
|
|
156
|
-
)) as StreamingTranscriber | null,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function buildTtsProvidersFacet(): TtsProvidersFacet {
|
|
161
|
-
return {
|
|
162
|
-
get: (id) => getTtsProvider(id as never) as unknown as TtsProvider,
|
|
163
|
-
// `resolveTtsConfig` needs the current config; the contract takes no
|
|
164
|
-
// args, so we fetch `getConfig()` at call time and pass it through.
|
|
165
|
-
resolveConfig: () => resolveTtsConfig(getConfig()) as unknown as TtsConfig,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function buildSecureKeysFacet(): SecureKeysFacet {
|
|
170
|
-
return {
|
|
171
|
-
// Daemon returns `undefined`; contract returns `null`. Normalize.
|
|
172
|
-
getProviderKey: async (id) => (await getProviderKeyAsync(id)) ?? null,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function buildProvidersFacet(): ProvidersFacet {
|
|
177
|
-
return {
|
|
178
|
-
llm: buildLlmProvidersFacet(),
|
|
179
|
-
stt: buildSttProvidersFacet(),
|
|
180
|
-
tts: buildTtsProvidersFacet(),
|
|
181
|
-
secureKeys: buildSecureKeysFacet(),
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
function buildMemoryFacet(): MemoryFacet {
|
|
186
|
-
return {
|
|
187
|
-
addMessage: addMessage,
|
|
188
|
-
wakeAgentForOpportunity: async (req) => {
|
|
189
|
-
// Contract returns `void`; daemon returns a `WakeResult` that
|
|
190
|
-
// in-process callers don't need through the host surface.
|
|
191
|
-
await wakeAgentForOpportunity(req as never);
|
|
192
|
-
},
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function buildEventsFacet(): EventsFacet {
|
|
197
|
-
return {
|
|
198
|
-
// Contract types events/messages as opaque supersets of the daemon's
|
|
199
|
-
// narrower discriminated unions; cast at the boundary so
|
|
200
|
-
// `assistantEventHub` continues to accept its existing type.
|
|
201
|
-
publish: (event: AssistantEvent) =>
|
|
202
|
-
assistantEventHub.publish(event as never),
|
|
203
|
-
subscribe: (filter: Filter, cb: AssistantEventCallback): Subscription =>
|
|
204
|
-
assistantEventHub.subscribe({
|
|
205
|
-
type: "process",
|
|
206
|
-
filter,
|
|
207
|
-
callback: cb,
|
|
208
|
-
}),
|
|
209
|
-
// `buildAssistantEvent` takes `(message, conversationId?)`.
|
|
210
|
-
buildEvent: (message: ServerMessage, conversationId?: string) =>
|
|
211
|
-
buildAssistantEvent(message as never, conversationId) as AssistantEvent,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function buildRegistriesFacet(skillId: string): RegistriesFacet {
|
|
216
|
-
return {
|
|
217
|
-
// Contract's `Tool` is structurally independent of the daemon's
|
|
218
|
-
// overlay (`assistant/src/tools/types.ts`); the assistant-side
|
|
219
|
-
// registry accepts the daemon flavor. Skills construct tools via
|
|
220
|
-
// helpers that already produce the daemon shape, so a cast at this
|
|
221
|
-
// boundary is safe. The contract's `registerTools(provider)` stays
|
|
222
|
-
// single-arg — skill code never needs to know its own id — and this
|
|
223
|
-
// adapter pairs the provider with the owner derived from the
|
|
224
|
-
// surrounding {@link buildRegistriesFacet} closure.
|
|
225
|
-
registerTools: (provider) =>
|
|
226
|
-
registerExternalTools({ kind: "skill", id: skillId }, provider as never),
|
|
227
|
-
registerSkillRoute: (route: SkillRoute): SkillRouteHandle =>
|
|
228
|
-
registerSkillRoute(route) as unknown as SkillRouteHandle,
|
|
229
|
-
// Namespace hook names by skillId so two skills using the same label
|
|
230
|
-
// (e.g. "cleanup") cannot silently overwrite each other's entries in
|
|
231
|
-
// the shared shutdown-hook map.
|
|
232
|
-
registerShutdownHook: (name, hook) =>
|
|
233
|
-
registerShutdownHook(`${skillId}:${name}`, hook),
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function buildSpeakersFacet(): SpeakersFacet {
|
|
238
|
-
return {
|
|
239
|
-
createTracker: () => new SpeakerIdentityTracker(),
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Build a `SkillHost` for the in-process first-party skill identified by
|
|
245
|
-
* `skillId`. The id prefixes logger names (so cross-cutting diagnostics
|
|
246
|
-
* carry the owning skill) and namespaces shutdown-hook registrations (so
|
|
247
|
-
* two skills using the same hook label cannot silently overwrite each
|
|
248
|
-
* other in the shared shutdown-hook map).
|
|
249
|
-
*/
|
|
250
|
-
export function createDaemonSkillHost(skillId: string): SkillHost {
|
|
251
|
-
return {
|
|
252
|
-
logger: buildLoggerFacet(skillId),
|
|
253
|
-
config: buildConfigFacet(),
|
|
254
|
-
identity: buildIdentityFacet(),
|
|
255
|
-
platform: buildPlatformFacet(),
|
|
256
|
-
providers: buildProvidersFacet(),
|
|
257
|
-
memory: buildMemoryFacet(),
|
|
258
|
-
events: buildEventsFacet(),
|
|
259
|
-
registries: buildRegistriesFacet(skillId),
|
|
260
|
-
speakers: buildSpeakersFacet(),
|
|
261
|
-
};
|
|
262
|
-
}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Meet — server → client push messages for live meeting state.
|
|
3
|
-
*
|
|
4
|
-
* Emitted by the assistant daemon as the Meet-bot progresses through its
|
|
5
|
-
* lifecycle (joining → joined → left) and as in-meeting state changes
|
|
6
|
-
* (participants, active speaker, transcript chunks).
|
|
7
|
-
*
|
|
8
|
-
* Keep payloads small and client-actionable: these events power the
|
|
9
|
-
* macOS "In meeting" status panel and the conversation bridge's live
|
|
10
|
-
* transcript feed. A client that missed an event can always refetch
|
|
11
|
-
* authoritative state from the daemon's HTTP routes.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/** A single participant in a meeting. Shape mirrors the wire-level type. */
|
|
15
|
-
export interface MeetParticipant {
|
|
16
|
-
/** Stable participant identifier (provider-specific). */
|
|
17
|
-
id: string;
|
|
18
|
-
/** Display name of the participant. */
|
|
19
|
-
name: string;
|
|
20
|
-
/** Whether the participant is the meeting host. */
|
|
21
|
-
isHost?: boolean;
|
|
22
|
-
/** Whether the participant is the bot itself. */
|
|
23
|
-
isSelf?: boolean;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** The bot has started attempting to join a meeting. */
|
|
27
|
-
export interface MeetJoining {
|
|
28
|
-
type: "meet.joining";
|
|
29
|
-
meetingId: string;
|
|
30
|
-
/** The Meet URL the bot was asked to join. */
|
|
31
|
-
url: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** The bot has successfully joined and is live in the meeting. */
|
|
35
|
-
export interface MeetJoined {
|
|
36
|
-
type: "meet.joined";
|
|
37
|
-
meetingId: string;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Participants joined and/or left the meeting since the last snapshot. */
|
|
41
|
-
export interface MeetParticipantChanged {
|
|
42
|
-
type: "meet.participant_changed";
|
|
43
|
-
meetingId: string;
|
|
44
|
-
/** Participants who joined since the last snapshot. */
|
|
45
|
-
joined: MeetParticipant[];
|
|
46
|
-
/** Participants who left since the last snapshot. */
|
|
47
|
-
left: MeetParticipant[];
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** The active speaker in the meeting changed. */
|
|
51
|
-
export interface MeetSpeakerChanged {
|
|
52
|
-
type: "meet.speaker_changed";
|
|
53
|
-
meetingId: string;
|
|
54
|
-
/** Stable speaker identifier for the new active speaker. */
|
|
55
|
-
speakerId: string;
|
|
56
|
-
/** Display name of the new active speaker. */
|
|
57
|
-
speakerName: string;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* A finalized chunk of transcribed speech. Interim chunks are filtered
|
|
62
|
-
* out before publication so clients only render stable text.
|
|
63
|
-
*/
|
|
64
|
-
export interface MeetTranscriptChunk {
|
|
65
|
-
type: "meet.transcript_chunk";
|
|
66
|
-
meetingId: string;
|
|
67
|
-
/** The transcribed text. */
|
|
68
|
-
text: string;
|
|
69
|
-
/** Human-readable speaker label, if the ASR provided one. */
|
|
70
|
-
speakerLabel?: string;
|
|
71
|
-
/** Stable speaker identifier across the meeting, if available. */
|
|
72
|
-
speakerId?: string;
|
|
73
|
-
/** ASR confidence in [0, 1], if available. */
|
|
74
|
-
confidence?: number;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** The bot has left the meeting. */
|
|
78
|
-
export interface MeetLeft {
|
|
79
|
-
type: "meet.left";
|
|
80
|
-
meetingId: string;
|
|
81
|
-
/** Free-form reason passed to `leave()` (e.g. "user-requested", "timeout"). */
|
|
82
|
-
reason: string;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* The assistant successfully posted a chat message into the meeting via
|
|
87
|
-
* the bot's `/send_chat` endpoint. Emitted once per successful send so
|
|
88
|
-
* SSE-subscribed clients can render the outbound chat without waiting for
|
|
89
|
-
* the bot to echo it back through the transcript/chat stream.
|
|
90
|
-
*/
|
|
91
|
-
export interface MeetChatSent {
|
|
92
|
-
type: "meet.chat_sent";
|
|
93
|
-
meetingId: string;
|
|
94
|
-
/** The text that was posted into the meeting's chat. */
|
|
95
|
-
text: string;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** The bot hit a non-recoverable error (container crash, join failure, etc.). */
|
|
99
|
-
export interface MeetError {
|
|
100
|
-
type: "meet.error";
|
|
101
|
-
meetingId: string;
|
|
102
|
-
/** Human-readable error detail. */
|
|
103
|
-
detail: string;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* The assistant has begun speaking into the meeting via the TTS bridge. Fired
|
|
108
|
-
* once per {@link MeetSessionManager.speak} invocation immediately before the
|
|
109
|
-
* synthesis stream starts flowing to the bot's `/play_audio` endpoint. Useful
|
|
110
|
-
* for clients that want to render a "speaking …" indicator.
|
|
111
|
-
*/
|
|
112
|
-
export interface MeetSpeakingStarted {
|
|
113
|
-
type: "meet.speaking_started";
|
|
114
|
-
meetingId: string;
|
|
115
|
-
/** Opaque stream identifier — matches `meet.speaking_ended.streamId`. */
|
|
116
|
-
streamId: string;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* The assistant has finished (or cancelled) a TTS playback stream. Fired
|
|
121
|
-
* after the bot-side playback request settles — whether normally, via an
|
|
122
|
-
* explicit cancel, or due to an upstream error.
|
|
123
|
-
*/
|
|
124
|
-
export interface MeetSpeakingEnded {
|
|
125
|
-
type: "meet.speaking_ended";
|
|
126
|
-
meetingId: string;
|
|
127
|
-
/** Opaque stream identifier — matches `meet.speaking_started.streamId`. */
|
|
128
|
-
streamId: string;
|
|
129
|
-
/** Why the stream ended: natural completion, caller-initiated cancel, or an upstream error. */
|
|
130
|
-
reason: "completed" | "cancelled" | "error";
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export type _MeetServerMessages =
|
|
134
|
-
| MeetJoining
|
|
135
|
-
| MeetJoined
|
|
136
|
-
| MeetParticipantChanged
|
|
137
|
-
| MeetSpeakerChanged
|
|
138
|
-
| MeetTranscriptChunk
|
|
139
|
-
| MeetLeft
|
|
140
|
-
| MeetChatSent
|
|
141
|
-
| MeetError
|
|
142
|
-
| MeetSpeakingStarted
|
|
143
|
-
| MeetSpeakingEnded;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Registry for skill shutdown hooks.
|
|
3
|
-
*
|
|
4
|
-
* Skills register async shutdown callbacks at initialization time. The daemon
|
|
5
|
-
* calls {@link runShutdownHooks} during graceful shutdown so skill-owned
|
|
6
|
-
* resources (containers, sockets, etc.) are torn down before the process exits.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { getLogger } from "../util/logger.js";
|
|
10
|
-
|
|
11
|
-
const log = getLogger("shutdown-registry");
|
|
12
|
-
|
|
13
|
-
type ShutdownHook = (reason: string) => Promise<void>;
|
|
14
|
-
|
|
15
|
-
const hooks = new Map<string, ShutdownHook>();
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Register a named shutdown hook. Called by skills at initialization time.
|
|
19
|
-
* If a hook with the same name already exists it is silently replaced (supports
|
|
20
|
-
* hot-reload).
|
|
21
|
-
*/
|
|
22
|
-
export function registerShutdownHook(name: string, hook: ShutdownHook): void {
|
|
23
|
-
hooks.set(name, hook);
|
|
24
|
-
log.info({ name }, "Shutdown hook registered");
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Run all registered shutdown hooks. Each hook receives a human-readable
|
|
29
|
-
* `reason` string (e.g. "daemon-shutdown"). Failures are logged but do not
|
|
30
|
-
* prevent other hooks from running.
|
|
31
|
-
*/
|
|
32
|
-
export async function runShutdownHooks(reason: string): Promise<void> {
|
|
33
|
-
for (const [name, hook] of hooks) {
|
|
34
|
-
try {
|
|
35
|
-
await hook(reason);
|
|
36
|
-
} catch (err) {
|
|
37
|
-
log.warn({ err, name }, `Shutdown hook "${name}" failed (non-fatal)`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bidirectional RPC smoke test for the skill IPC channel.
|
|
3
|
-
*
|
|
4
|
-
* Spins up `SkillIpcServer` on a temp socket and connects a real
|
|
5
|
-
* `SkillHostClient`. Verifies the daemon→skill direction end-to-end:
|
|
6
|
-
* - Happy path: server `sendRequest` resolves with the handler's return.
|
|
7
|
-
* - Handler-throw path: server `sendRequest` rejects with the thrown
|
|
8
|
-
* error message.
|
|
9
|
-
* - Missing-handler path: server `sendRequest` rejects with a "method
|
|
10
|
-
* not found" error.
|
|
11
|
-
* - Connection-close path: server `sendRequest` rejects with a clear
|
|
12
|
-
* "connection closed" error when the peer disconnects mid-flight.
|
|
13
|
-
*
|
|
14
|
-
* Sits in the assistant package (not the contracts package) because it
|
|
15
|
-
* exercises both `SkillIpcServer` and `SkillHostClient` — the contracts
|
|
16
|
-
* package's own tests deliberately stand up a stub server to avoid a
|
|
17
|
-
* dependency on `assistant/`.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
21
|
-
import { connect, type Socket } from "node:net";
|
|
22
|
-
import { tmpdir } from "node:os";
|
|
23
|
-
import { join } from "node:path";
|
|
24
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
25
|
-
|
|
26
|
-
import { SkillHostClient } from "@vellumai/skill-host-contracts";
|
|
27
|
-
|
|
28
|
-
import {
|
|
29
|
-
SKILL_IPC_DAEMON_ID_PREFIX,
|
|
30
|
-
type SkillIpcConnection,
|
|
31
|
-
SkillIpcServer,
|
|
32
|
-
} from "../skill-server.js";
|
|
33
|
-
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
// Harness
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
|
|
38
|
-
let tempDir: string | null = null;
|
|
39
|
-
let socketPath: string | null = null;
|
|
40
|
-
let server: SkillIpcServer | null = null;
|
|
41
|
-
let client: SkillHostClient | null = null;
|
|
42
|
-
let savedSkillIpcSocketDir: string | undefined;
|
|
43
|
-
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
savedSkillIpcSocketDir = process.env.ASSISTANT_SKILL_IPC_SOCKET_DIR;
|
|
46
|
-
tempDir = mkdtempSync(join(tmpdir(), "skill-ipc-bidir-"));
|
|
47
|
-
process.env.ASSISTANT_SKILL_IPC_SOCKET_DIR = tempDir;
|
|
48
|
-
socketPath = join(tempDir, "assistant-skill.sock");
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
afterEach(async () => {
|
|
52
|
-
client?.close();
|
|
53
|
-
client = null;
|
|
54
|
-
server?.stop();
|
|
55
|
-
server = null;
|
|
56
|
-
if (savedSkillIpcSocketDir === undefined) {
|
|
57
|
-
delete process.env.ASSISTANT_SKILL_IPC_SOCKET_DIR;
|
|
58
|
-
} else {
|
|
59
|
-
process.env.ASSISTANT_SKILL_IPC_SOCKET_DIR = savedSkillIpcSocketDir;
|
|
60
|
-
}
|
|
61
|
-
if (tempDir) {
|
|
62
|
-
rmSync(tempDir, { recursive: true, force: true });
|
|
63
|
-
tempDir = null;
|
|
64
|
-
socketPath = null;
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Stand up the server, connect a client, and return the
|
|
70
|
-
* server-side `SkillIpcConnection` handle once the connection is
|
|
71
|
-
* established. The handle is the target the daemon's `sendRequest`
|
|
72
|
-
* needs.
|
|
73
|
-
*/
|
|
74
|
-
async function startPair(): Promise<{
|
|
75
|
-
server: SkillIpcServer;
|
|
76
|
-
client: SkillHostClient;
|
|
77
|
-
connection: SkillIpcConnection;
|
|
78
|
-
}> {
|
|
79
|
-
if (!socketPath) throw new Error("socketPath not initialized");
|
|
80
|
-
const srv = new SkillIpcServer();
|
|
81
|
-
await srv.start();
|
|
82
|
-
const c = new SkillHostClient({
|
|
83
|
-
socketPath,
|
|
84
|
-
skillId: "bidir-test",
|
|
85
|
-
});
|
|
86
|
-
// Stub the routes the contracts client prefetches at connect-time.
|
|
87
|
-
srv.registerMethod("host.identity.getAssistantName", () => null);
|
|
88
|
-
srv.registerMethod("host.platform.workspaceDir", () => "/tmp/workspace");
|
|
89
|
-
srv.registerMethod("host.platform.vellumRoot", () => "/tmp/vellum");
|
|
90
|
-
srv.registerMethod("host.platform.runtimeMode", () => "bare-metal");
|
|
91
|
-
|
|
92
|
-
await c.connect();
|
|
93
|
-
// The server does not expose its per-socket connection map publicly
|
|
94
|
-
// (it is a WeakMap keyed by the `Socket` object). Reach in via the
|
|
95
|
-
// private fields — acceptable for a same-package smoke test that
|
|
96
|
-
// needs the `SkillIpcConnection` handle to call `sendRequest`.
|
|
97
|
-
const internals = srv as unknown as {
|
|
98
|
-
clients: Set<object>;
|
|
99
|
-
connections: WeakMap<object, SkillIpcConnection>;
|
|
100
|
-
};
|
|
101
|
-
const connections: SkillIpcConnection[] = [];
|
|
102
|
-
for (const sock of internals.clients) {
|
|
103
|
-
const conn = internals.connections.get(sock);
|
|
104
|
-
if (conn) connections.push(conn);
|
|
105
|
-
}
|
|
106
|
-
if (connections.length !== 1) {
|
|
107
|
-
throw new Error(
|
|
108
|
-
`expected exactly one server-side connection, got ${connections.length}`,
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
const connection = connections[0]!;
|
|
112
|
-
server = srv;
|
|
113
|
-
client = c;
|
|
114
|
-
return { server: srv, client: c, connection };
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// ---------------------------------------------------------------------------
|
|
118
|
-
// Tests
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
|
|
121
|
-
describe("SkillIpcServer.sendRequest", () => {
|
|
122
|
-
test("happy path — registered handler returns a value", async () => {
|
|
123
|
-
const pair = await startPair();
|
|
124
|
-
pair.client.registerHandler("echo", (params) => ({ got: params }));
|
|
125
|
-
|
|
126
|
-
const result = await pair.server.sendRequest(pair.connection, "echo", {
|
|
127
|
-
hi: "there",
|
|
128
|
-
});
|
|
129
|
-
expect(result).toEqual({ got: { hi: "there" } });
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
test("happy path — async handler is awaited", async () => {
|
|
133
|
-
const pair = await startPair();
|
|
134
|
-
pair.client.registerHandler("delayed", async (params) => {
|
|
135
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
136
|
-
return { delayed: true, params };
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
const result = await pair.server.sendRequest(pair.connection, "delayed", {
|
|
140
|
-
tag: 7,
|
|
141
|
-
});
|
|
142
|
-
expect(result).toEqual({ delayed: true, params: { tag: 7 } });
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("handler error — rejected with the thrown message", async () => {
|
|
146
|
-
const pair = await startPair();
|
|
147
|
-
pair.client.registerHandler("boom", () => {
|
|
148
|
-
throw new Error("kaboom");
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
await expect(
|
|
152
|
-
pair.server.sendRequest(pair.connection, "boom"),
|
|
153
|
-
).rejects.toThrow(/kaboom/);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
test("missing handler — rejected with method-not-found", async () => {
|
|
157
|
-
const pair = await startPair();
|
|
158
|
-
// No handler registered for "missing".
|
|
159
|
-
|
|
160
|
-
await expect(
|
|
161
|
-
pair.server.sendRequest(pair.connection, "missing"),
|
|
162
|
-
).rejects.toThrow(/method not found/);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
test("connection close — rejects in-flight requests with a clear error", async () => {
|
|
166
|
-
const pair = await startPair();
|
|
167
|
-
// Handler that never returns so the request stays in-flight until the
|
|
168
|
-
// peer disconnects.
|
|
169
|
-
pair.client.registerHandler("hang", () => new Promise(() => {}));
|
|
170
|
-
|
|
171
|
-
const inFlight = pair.server.sendRequest(pair.connection, "hang");
|
|
172
|
-
// Force the client side to drop the socket. The server's "close"
|
|
173
|
-
// handler will then dispose the connection state and reject every
|
|
174
|
-
// pending daemon-initiated request.
|
|
175
|
-
pair.client.close();
|
|
176
|
-
|
|
177
|
-
await expect(inFlight).rejects.toThrow(/connection closed/);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
test("daemon-initiated id prefix is `d:`", () => {
|
|
181
|
-
// Public-constant assertion: the `d:` prefix is part of the wire
|
|
182
|
-
// contract — peers (e.g. the contracts client) read it directly to
|
|
183
|
-
// route inbound frames. A future rename here without updating the
|
|
184
|
-
// peers would silently break bidirectional dispatch, so the
|
|
185
|
-
// constant is asserted.
|
|
186
|
-
expect(SKILL_IPC_DAEMON_ID_PREFIX).toBe("d:");
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
test("server rejects inbound skill-initiated requests whose ids start with `d:`", async () => {
|
|
190
|
-
if (!socketPath) throw new Error("socketPath not initialized");
|
|
191
|
-
const srv = new SkillIpcServer();
|
|
192
|
-
await srv.start();
|
|
193
|
-
server = srv;
|
|
194
|
-
srv.registerMethod("test.echo", (params) => ({ ok: true, params }));
|
|
195
|
-
|
|
196
|
-
// Send a request with a reserved-prefix id over a raw socket so we
|
|
197
|
-
// bypass the contracts client (which never mints `d:` ids).
|
|
198
|
-
const response = await new Promise<{
|
|
199
|
-
id: string;
|
|
200
|
-
error?: string;
|
|
201
|
-
result?: unknown;
|
|
202
|
-
}>((resolve, reject) => {
|
|
203
|
-
const sock: Socket = connect(socketPath!);
|
|
204
|
-
let buffer = "";
|
|
205
|
-
let settled = false;
|
|
206
|
-
const finish = (
|
|
207
|
-
v: { id: string; error?: string; result?: unknown } | Error,
|
|
208
|
-
): void => {
|
|
209
|
-
if (settled) return;
|
|
210
|
-
settled = true;
|
|
211
|
-
sock.destroy();
|
|
212
|
-
if (v instanceof Error) reject(v);
|
|
213
|
-
else resolve(v);
|
|
214
|
-
};
|
|
215
|
-
sock.on("connect", () => {
|
|
216
|
-
sock.write(JSON.stringify({ id: "d:99", method: "test.echo" }) + "\n");
|
|
217
|
-
});
|
|
218
|
-
sock.on("data", (chunk) => {
|
|
219
|
-
buffer += chunk.toString();
|
|
220
|
-
const idx = buffer.indexOf("\n");
|
|
221
|
-
if (idx === -1) return;
|
|
222
|
-
const line = buffer.slice(0, idx).trim();
|
|
223
|
-
try {
|
|
224
|
-
finish(JSON.parse(line));
|
|
225
|
-
} catch (err) {
|
|
226
|
-
finish(err as Error);
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
sock.on("error", (err) => finish(err));
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
expect(response.id).toBe("d:99");
|
|
233
|
-
expect(response.result).toBeUndefined();
|
|
234
|
-
expect(response.error).toMatch(/Reserved id prefix/);
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
test("existing skill→daemon RPCs still succeed alongside daemon→skill ones", async () => {
|
|
238
|
-
const pair = await startPair();
|
|
239
|
-
pair.server.registerMethod("test.add", (params) => {
|
|
240
|
-
const p = params as { a: number; b: number };
|
|
241
|
-
return p.a + p.b;
|
|
242
|
-
});
|
|
243
|
-
pair.client.registerHandler("client-echo", (params) => params);
|
|
244
|
-
|
|
245
|
-
// Round-trip both directions concurrently.
|
|
246
|
-
const [skillResult, daemonResult] = await Promise.all([
|
|
247
|
-
pair.client.rawCall<number>("test.add", { a: 2, b: 3 }),
|
|
248
|
-
pair.server.sendRequest(pair.connection, "client-echo", { value: "ok" }),
|
|
249
|
-
]);
|
|
250
|
-
expect(skillResult).toBe(5);
|
|
251
|
-
expect(daemonResult).toEqual({ value: "ok" });
|
|
252
|
-
});
|
|
253
|
-
});
|