@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
|
@@ -62,6 +62,14 @@ const CallsVoiceConfigSchema = z
|
|
|
62
62
|
.describe(
|
|
63
63
|
"How aggressively the STT provider detects the start of caller speech — low reduces false interrupts from background noise",
|
|
64
64
|
),
|
|
65
|
+
telephonyStreaming: z
|
|
66
|
+
.boolean({
|
|
67
|
+
error: "calls.voice.telephonyStreaming must be a boolean",
|
|
68
|
+
})
|
|
69
|
+
.default(true)
|
|
70
|
+
.describe(
|
|
71
|
+
"Whether phone-call audio is streamed to the STT provider in real time; disable to fall back to per-turn batch transcription",
|
|
72
|
+
),
|
|
65
73
|
})
|
|
66
74
|
.describe("Voice and speech settings for phone calls");
|
|
67
75
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Default ElevenLabs voice — "Amelia" (expressive, enthusiastic, British English).
|
|
2
|
-
// Used by both in-app TTS and phone calls
|
|
2
|
+
// Used by both in-app TTS and phone calls.
|
|
3
3
|
export const DEFAULT_ELEVENLABS_VOICE_ID = "ZF6FPAbjXT4488VcRRnw";
|
|
4
4
|
|
|
5
5
|
/** Valid conversation timeout values (seconds). Shared with voice-config-update tool. */
|
|
@@ -190,7 +190,7 @@ export const MemoryV2ConfigSchema = z
|
|
|
190
190
|
.positive(
|
|
191
191
|
"memory.v2.consolidation_interval_hours must be a positive integer",
|
|
192
192
|
)
|
|
193
|
-
.default(
|
|
193
|
+
.default(8)
|
|
194
194
|
.describe(
|
|
195
195
|
"Hours between scheduled consolidation runs that synthesize buffered memories into concept pages",
|
|
196
196
|
),
|
|
@@ -249,6 +249,87 @@ export const MemoryV3EntitySchema = z
|
|
|
249
249
|
"Memory v3 entity-lane (heading-anchored named-entity match) tuning.",
|
|
250
250
|
);
|
|
251
251
|
|
|
252
|
+
/**
|
|
253
|
+
* Per-turn injection-gate tuning: thresholds the retrieval signals must clear
|
|
254
|
+
* for the gate to open and run the selector. The gate runs only when the
|
|
255
|
+
* `memory-v3-injection-gate` feature flag (the rollout switch) AND the
|
|
256
|
+
* `enabled` kill-switch below are both on.
|
|
257
|
+
*/
|
|
258
|
+
export const MemoryV3GateSchema = z
|
|
259
|
+
.object({
|
|
260
|
+
enabled: z
|
|
261
|
+
.boolean({ error: "memory.v3.gate.enabled must be a boolean" })
|
|
262
|
+
.default(true)
|
|
263
|
+
.describe(
|
|
264
|
+
"Whether the injection gate may run at all. false forces the full selection process every turn regardless of the `memory-v3-injection-gate` feature flag; true (default) defers to the flag.",
|
|
265
|
+
),
|
|
266
|
+
denseThreshold: z
|
|
267
|
+
.number({ error: "memory.v3.gate.denseThreshold must be a number" })
|
|
268
|
+
.min(0)
|
|
269
|
+
.max(1)
|
|
270
|
+
.default(0.66)
|
|
271
|
+
.describe(
|
|
272
|
+
"Top-1 dense cosine similarity must clear this for a dense pass.",
|
|
273
|
+
),
|
|
274
|
+
sparseThreshold: z
|
|
275
|
+
.number({ error: "memory.v3.gate.sparseThreshold must be a number" })
|
|
276
|
+
.min(0)
|
|
277
|
+
.max(1)
|
|
278
|
+
.default(0.35)
|
|
279
|
+
.describe(
|
|
280
|
+
"Normalized top-1 BM25F must clear this for any sparse signal.",
|
|
281
|
+
),
|
|
282
|
+
sparseOnlyThreshold: z
|
|
283
|
+
.number({ error: "memory.v3.gate.sparseOnlyThreshold must be a number" })
|
|
284
|
+
.min(0)
|
|
285
|
+
.max(1)
|
|
286
|
+
.default(0.75)
|
|
287
|
+
.describe(
|
|
288
|
+
"Higher normalized-BM25F bar to pass on sparse signal alone when dense fails.",
|
|
289
|
+
),
|
|
290
|
+
denseClusterThreshold: z
|
|
291
|
+
.number({
|
|
292
|
+
error: "memory.v3.gate.denseClusterThreshold must be a number",
|
|
293
|
+
})
|
|
294
|
+
.min(0)
|
|
295
|
+
.max(1)
|
|
296
|
+
.default(0.6)
|
|
297
|
+
.describe(
|
|
298
|
+
"Floor every top-3 dense score must clear for a borderline-cluster pass.",
|
|
299
|
+
),
|
|
300
|
+
denseClusterMaxDelta: z
|
|
301
|
+
.number({ error: "memory.v3.gate.denseClusterMaxDelta must be a number" })
|
|
302
|
+
.min(0)
|
|
303
|
+
.max(1)
|
|
304
|
+
.default(0.02)
|
|
305
|
+
.describe(
|
|
306
|
+
"Maximum spread (max-min) within the top-3 dense cluster for a cluster pass.",
|
|
307
|
+
),
|
|
308
|
+
topK: z
|
|
309
|
+
.number({ error: "memory.v3.gate.topK must be a number" })
|
|
310
|
+
.int("memory.v3.gate.topK must be an integer")
|
|
311
|
+
.positive("memory.v3.gate.topK must be a positive integer")
|
|
312
|
+
.default(5)
|
|
313
|
+
.describe(
|
|
314
|
+
"Number of top candidates examined per retriever (dense, sparse).",
|
|
315
|
+
),
|
|
316
|
+
bm25NormK: z
|
|
317
|
+
.union([z.number().positive(), z.null()])
|
|
318
|
+
.default(null)
|
|
319
|
+
.describe(
|
|
320
|
+
"BM25F normalization constant k in norm = raw/(raw+k). null = built-in default (auto-calibration pending).",
|
|
321
|
+
),
|
|
322
|
+
bypassForCore: z
|
|
323
|
+
.boolean({ error: "memory.v3.gate.bypassForCore must be a boolean" })
|
|
324
|
+
.default(false)
|
|
325
|
+
.describe(
|
|
326
|
+
"When the gate closes, still run selectPool over only the stable prefix (core/hot/fresh/skills) instead of skipping entirely. Off by default — the gate is a hard skip.",
|
|
327
|
+
),
|
|
328
|
+
})
|
|
329
|
+
.describe(
|
|
330
|
+
"Memory v3 per-turn injection gate tuning (thresholds; the gate runs when the `memory-v3-injection-gate` feature flag AND `enabled` are both on).",
|
|
331
|
+
);
|
|
332
|
+
|
|
252
333
|
// NOTE: a retired `workingSet` sub-config (maxPages/evictWindow for the old
|
|
253
334
|
// per-turn carry set) used to live here. Existing user config files may still
|
|
254
335
|
// contain the key; zod default unknown-key stripping accepts and ignores it,
|
|
@@ -317,6 +398,7 @@ export const MemoryV3ConfigSchema = z
|
|
|
317
398
|
),
|
|
318
399
|
edge: MemoryV3EdgeSchema.default(MemoryV3EdgeSchema.parse({})),
|
|
319
400
|
entity: MemoryV3EntitySchema.default(MemoryV3EntitySchema.parse({})),
|
|
401
|
+
gate: MemoryV3GateSchema.default(MemoryV3GateSchema.parse({})),
|
|
320
402
|
})
|
|
321
403
|
.describe("Memory v3 — section-grain lane retrieval");
|
|
322
404
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resource monitor configuration.
|
|
5
|
+
*
|
|
6
|
+
* The resource monitor runs as a separate OS process (a child of the assistant)
|
|
7
|
+
* that samples the container's own cgroup memory + workspace disk off the main
|
|
8
|
+
* event loop, so it keeps recording during a main-thread freeze and its samples
|
|
9
|
+
* survive an OOM SIGKILL. `assistant monitoring start`/`stop` flip
|
|
10
|
+
* `enabled` (and spawn/stop the process) to switch it on or off at runtime
|
|
11
|
+
* without a restart; when `enabled` is set the assistant also spawns it at
|
|
12
|
+
* startup.
|
|
13
|
+
*/
|
|
14
|
+
export const MonitoringConfigSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
enabled: z
|
|
17
|
+
.boolean({ error: "monitoring.enabled must be a boolean" })
|
|
18
|
+
.default(false)
|
|
19
|
+
.describe(
|
|
20
|
+
"Whether the resource monitor process runs. When set, the assistant spawns it at startup and it samples cgroup memory + workspace disk into a ring buffer on the workspace volume. `assistant monitoring start`/`stop` flip this flag at runtime.",
|
|
21
|
+
),
|
|
22
|
+
sampleIntervalMs: z
|
|
23
|
+
.number({ error: "monitoring.sampleIntervalMs must be a number" })
|
|
24
|
+
.int("monitoring.sampleIntervalMs must be an integer")
|
|
25
|
+
.min(50, "monitoring.sampleIntervalMs must be at least 50ms")
|
|
26
|
+
.max(10_000, "monitoring.sampleIntervalMs must be <= 10000ms")
|
|
27
|
+
.default(250)
|
|
28
|
+
.describe(
|
|
29
|
+
"How often the monitor samples memory + disk, in milliseconds. Fast (default 250ms) so vertical memory spikes are caught before an OOM kill.",
|
|
30
|
+
),
|
|
31
|
+
ringBufferSize: z
|
|
32
|
+
.number({ error: "monitoring.ringBufferSize must be a number" })
|
|
33
|
+
.int("monitoring.ringBufferSize must be an integer")
|
|
34
|
+
.min(100, "monitoring.ringBufferSize must be at least 100")
|
|
35
|
+
.max(100_000, "monitoring.ringBufferSize must be <= 100000")
|
|
36
|
+
.default(4000)
|
|
37
|
+
.describe(
|
|
38
|
+
"How many recent samples the on-disk ring buffer retains. At the default 250ms interval, 4000 samples is ~16 minutes of history preserved across a crash.",
|
|
39
|
+
),
|
|
40
|
+
highMemThresholdRatio: z
|
|
41
|
+
.number({
|
|
42
|
+
error: "monitoring.highMemThresholdRatio must be a number",
|
|
43
|
+
})
|
|
44
|
+
.min(0.1, "monitoring.highMemThresholdRatio must be >= 0.1")
|
|
45
|
+
.max(1, "monitoring.highMemThresholdRatio must be <= 1")
|
|
46
|
+
.default(0.75)
|
|
47
|
+
.describe(
|
|
48
|
+
"Fraction of the container memory limit at which a high-memory snapshot (cgroup stats + process tree) is captured to the workspace volume. Default 0.75 (e.g. ~6 GiB of an 8 GiB limit).",
|
|
49
|
+
),
|
|
50
|
+
snapshotCooldownMs: z
|
|
51
|
+
.number({ error: "monitoring.snapshotCooldownMs must be a number" })
|
|
52
|
+
.int("monitoring.snapshotCooldownMs must be an integer")
|
|
53
|
+
.min(0, "monitoring.snapshotCooldownMs must be non-negative")
|
|
54
|
+
.default(30_000)
|
|
55
|
+
.describe(
|
|
56
|
+
"Minimum interval between high-memory snapshots, in milliseconds, so a sustained spike does not write a snapshot on every sample.",
|
|
57
|
+
),
|
|
58
|
+
})
|
|
59
|
+
.describe("Resource monitor process configuration");
|
|
60
|
+
|
|
61
|
+
export type MonitoringConfig = z.infer<typeof MonitoringConfigSchema>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Schedule worker process configuration.
|
|
5
|
+
*
|
|
6
|
+
* The schedule worker runs scheduled jobs as a separate OS process — a child
|
|
7
|
+
* of the assistant — so expensive scheduled work executes off the assistant's
|
|
8
|
+
* main event loop and keeps running during a main-thread freeze. The
|
|
9
|
+
* assistant's scheduler re-reads the flag on every tick: while it is set, the
|
|
10
|
+
* in-process scheduler leaves schedule execution to the worker (spawned at
|
|
11
|
+
* startup when set); while it is unset, the in-process scheduler runs
|
|
12
|
+
* schedules itself. `assistant schedules worker start`/`stop` flip the flag
|
|
13
|
+
* (and spawn/stop the worker process) to switch modes at runtime without a
|
|
14
|
+
* restart.
|
|
15
|
+
*/
|
|
16
|
+
export const ScheduleWorkerConfigSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
enabled: z
|
|
19
|
+
.boolean({ error: "schedules.worker.enabled must be a boolean" })
|
|
20
|
+
.default(false)
|
|
21
|
+
.describe(
|
|
22
|
+
"Whether scheduled jobs run in a separate schedule worker OS process instead of the assistant's in-process scheduler. When set, the assistant spawns the worker at startup and its own scheduler stands down from executing schedules. `assistant schedules worker start`/`stop` flip this flag at runtime.",
|
|
23
|
+
),
|
|
24
|
+
})
|
|
25
|
+
.describe("Schedule worker process configuration");
|
|
26
|
+
|
|
27
|
+
export const SchedulesConfigSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
worker: ScheduleWorkerConfigSchema.default(
|
|
30
|
+
ScheduleWorkerConfigSchema.parse({}),
|
|
31
|
+
),
|
|
32
|
+
})
|
|
33
|
+
.describe("Scheduler configuration");
|
|
34
|
+
|
|
35
|
+
export type SchedulesConfig = z.infer<typeof SchedulesConfigSchema>;
|
|
@@ -58,8 +58,8 @@ const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
58
58
|
thinking: { enabled: true, streamThinking: true },
|
|
59
59
|
contextWindow: { maxInputTokens: DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS },
|
|
60
60
|
},
|
|
61
|
-
// Served by Anthropic
|
|
62
|
-
// managed profile. The `quality-optimized` intent resolves to
|
|
61
|
+
// Served by Anthropic via managed platform inference — the most capable
|
|
62
|
+
// managed profile. The `quality-optimized` intent resolves to Fable for the
|
|
63
63
|
// `anthropic` provider.
|
|
64
64
|
"quality-optimized": {
|
|
65
65
|
intent: "quality-optimized",
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import { filterSkillsByEnabledPlugins, type SkillSummary } from "./skills.js";
|
|
4
|
+
|
|
5
|
+
function makeSkill(
|
|
6
|
+
id: string,
|
|
7
|
+
overrides: Partial<SkillSummary> = {},
|
|
8
|
+
): SkillSummary {
|
|
9
|
+
return {
|
|
10
|
+
id,
|
|
11
|
+
name: id,
|
|
12
|
+
displayName: id,
|
|
13
|
+
description: `Skill ${id}`,
|
|
14
|
+
directoryPath: `/skills/${id}`,
|
|
15
|
+
skillFilePath: `/skills/${id}/SKILL.md`,
|
|
16
|
+
source: "managed",
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function makePluginSkill(id: string, pluginId: string): SkillSummary {
|
|
22
|
+
return makeSkill(id, {
|
|
23
|
+
source: "plugin",
|
|
24
|
+
owner: { kind: "plugin", id: pluginId },
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe("filterSkillsByEnabledPlugins", () => {
|
|
29
|
+
test("null set is a no-op: returns the same array reference unchanged", () => {
|
|
30
|
+
const skills = [
|
|
31
|
+
makeSkill("bundled-one", { source: "bundled" }),
|
|
32
|
+
makePluginSkill("from-a", "a"),
|
|
33
|
+
makePluginSkill("from-b", "b"),
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const result = filterSkillsByEnabledPlugins(skills, null);
|
|
37
|
+
|
|
38
|
+
expect(result).toBe(skills);
|
|
39
|
+
expect(result.map((s) => s.id)).toEqual([
|
|
40
|
+
"bundled-one",
|
|
41
|
+
"from-a",
|
|
42
|
+
"from-b",
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("drops plugin skills whose owning plugin is outside the set", () => {
|
|
47
|
+
const skills = [
|
|
48
|
+
makeSkill("bundled-one", { source: "bundled" }),
|
|
49
|
+
makePluginSkill("from-a", "a"),
|
|
50
|
+
makePluginSkill("from-b", "b"),
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const result = filterSkillsByEnabledPlugins(skills, new Set(["a"]));
|
|
54
|
+
|
|
55
|
+
expect(result.map((s) => s.id)).toEqual(["bundled-one", "from-a"]);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("retains non-plugin skills even when the set is empty", () => {
|
|
59
|
+
const skills = [
|
|
60
|
+
makeSkill("bundled-one", { source: "bundled" }),
|
|
61
|
+
makeSkill("managed-one", { source: "managed" }),
|
|
62
|
+
makeSkill("workspace-one", { source: "workspace" }),
|
|
63
|
+
makePluginSkill("from-a", "a"),
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
const result = filterSkillsByEnabledPlugins(skills, new Set());
|
|
67
|
+
|
|
68
|
+
expect(result.map((s) => s.id)).toEqual([
|
|
69
|
+
"bundled-one",
|
|
70
|
+
"managed-one",
|
|
71
|
+
"workspace-one",
|
|
72
|
+
]);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("keeps every plugin skill when all owners are in the set", () => {
|
|
76
|
+
const skills = [
|
|
77
|
+
makePluginSkill("from-a", "a"),
|
|
78
|
+
makePluginSkill("from-b", "b"),
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
const result = filterSkillsByEnabledPlugins(skills, new Set(["a", "b"]));
|
|
82
|
+
|
|
83
|
+
expect(result.map((s) => s.id)).toEqual(["from-a", "from-b"]);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("does not mutate the input array when filtering", () => {
|
|
87
|
+
const skills = [
|
|
88
|
+
makePluginSkill("from-a", "a"),
|
|
89
|
+
makePluginSkill("from-b", "b"),
|
|
90
|
+
];
|
|
91
|
+
|
|
92
|
+
filterSkillsByEnabledPlugins(skills, new Set(["a"]));
|
|
93
|
+
|
|
94
|
+
expect(skills.map((s) => s.id)).toEqual(["from-a", "from-b"]);
|
|
95
|
+
});
|
|
96
|
+
});
|
package/src/config/skills.ts
CHANGED
|
@@ -783,6 +783,32 @@ function discoverPluginResidentSkills(): SkillSummary[] {
|
|
|
783
783
|
|
|
784
784
|
// ─── Catalog loading ─────────────────────────────────────────────────────────
|
|
785
785
|
|
|
786
|
+
/**
|
|
787
|
+
* Scope a list of skills to a conversation's per-chat plugin selection.
|
|
788
|
+
*
|
|
789
|
+
* `effectiveEnabledPluginSet` is the conversation's effective set as produced
|
|
790
|
+
* by `getEffectiveEnabledPluginSet`: `null` means there is no per-chat
|
|
791
|
+
* restriction, so the input is returned unchanged (all globally-enabled
|
|
792
|
+
* plugins apply). When a set is given, a plugin-contributed skill
|
|
793
|
+
* (`owner.kind === "plugin"`) survives only if its owning plugin id is in the
|
|
794
|
+
* set; non-plugin skills (bundled/managed/workspace/extra) are always retained.
|
|
795
|
+
*
|
|
796
|
+
* Pure: returns the same array reference when there is no restriction, and a
|
|
797
|
+
* filtered copy otherwise, so callers can pass a cached catalog without
|
|
798
|
+
* mutating the cache.
|
|
799
|
+
*/
|
|
800
|
+
export function filterSkillsByEnabledPlugins(
|
|
801
|
+
skills: SkillSummary[],
|
|
802
|
+
effectiveEnabledPluginSet: Set<string> | null,
|
|
803
|
+
): SkillSummary[] {
|
|
804
|
+
if (effectiveEnabledPluginSet === null) return skills;
|
|
805
|
+
return skills.filter((skill) => {
|
|
806
|
+
const owner = skill.owner;
|
|
807
|
+
if (owner?.kind !== "plugin") return true;
|
|
808
|
+
return effectiveEnabledPluginSet.has(owner.id);
|
|
809
|
+
});
|
|
810
|
+
}
|
|
811
|
+
|
|
786
812
|
function skillSummaryFromDefinition(
|
|
787
813
|
skill: SkillDefinition,
|
|
788
814
|
source: SkillSource,
|
|
@@ -17,11 +17,32 @@ type IpcCall = { method: string; params?: Record<string, unknown> };
|
|
|
17
17
|
let ipcCalls: IpcCall[] = [];
|
|
18
18
|
let ipcVerified = true;
|
|
19
19
|
let ipcThrows = false;
|
|
20
|
+
let createContactChannelId = "gw-ch1";
|
|
21
|
+
let revokeOk = true;
|
|
20
22
|
|
|
21
23
|
const ipcCallPersistentMock = mock(
|
|
22
24
|
async (method: string, params?: Record<string, unknown>) => {
|
|
23
25
|
ipcCalls.push({ method, params });
|
|
24
|
-
if (ipcThrows)
|
|
26
|
+
if (ipcThrows) {
|
|
27
|
+
throw new Error("gateway unavailable");
|
|
28
|
+
}
|
|
29
|
+
if (method === "create_contact") {
|
|
30
|
+
return { contactId: "gw-c1", channelId: createContactChannelId };
|
|
31
|
+
}
|
|
32
|
+
if (method === "mark_channel_revoked") {
|
|
33
|
+
return {
|
|
34
|
+
ok: revokeOk,
|
|
35
|
+
didWrite: true,
|
|
36
|
+
channel: {
|
|
37
|
+
id: (params?.contactChannelId as string) ?? "gw-ch1",
|
|
38
|
+
contactId: "gw-c1",
|
|
39
|
+
type: "slack",
|
|
40
|
+
address: "addr",
|
|
41
|
+
status: "revoked",
|
|
42
|
+
revokedReason: (params?.reason as string) ?? null,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
25
46
|
return {
|
|
26
47
|
ok: true,
|
|
27
48
|
verified: ipcVerified,
|
|
@@ -57,13 +78,23 @@ const upsertContactChannelMock = mock(
|
|
|
57
78
|
return localResult;
|
|
58
79
|
},
|
|
59
80
|
);
|
|
81
|
+
const actualContactStore = await import("../contact-store.js");
|
|
82
|
+
mock.module("../contact-store.js", () => ({
|
|
83
|
+
...actualContactStore,
|
|
84
|
+
findContactChannel: () => null,
|
|
85
|
+
}));
|
|
86
|
+
|
|
60
87
|
const actualContactsWrite = await import("../contacts-write.js");
|
|
61
88
|
mock.module("../contacts-write.js", () => ({
|
|
62
89
|
...actualContactsWrite,
|
|
63
90
|
upsertContactChannel: upsertContactChannelMock,
|
|
64
91
|
}));
|
|
65
92
|
|
|
66
|
-
const {
|
|
93
|
+
const {
|
|
94
|
+
activateMemberChannel,
|
|
95
|
+
blockSenderChannel,
|
|
96
|
+
seedUnverifiedMemberChannel,
|
|
97
|
+
} = await import("../member-write-relay.js");
|
|
67
98
|
|
|
68
99
|
describe("activateMemberChannel gateway-first relay", () => {
|
|
69
100
|
beforeEach(() => {
|
|
@@ -86,7 +117,6 @@ describe("activateMemberChannel gateway-first relay", () => {
|
|
|
86
117
|
externalChatId: "chat-1",
|
|
87
118
|
displayName: "Mom",
|
|
88
119
|
contactId: "target-mom",
|
|
89
|
-
inviteId: "inv-1",
|
|
90
120
|
verifiedVia: "invite",
|
|
91
121
|
});
|
|
92
122
|
|
|
@@ -121,7 +151,6 @@ describe("activateMemberChannel gateway-first relay", () => {
|
|
|
121
151
|
externalChatId: "chat-1",
|
|
122
152
|
displayName: "Mom",
|
|
123
153
|
username: undefined,
|
|
124
|
-
inviteId: "inv-1",
|
|
125
154
|
contactId: "target-mom",
|
|
126
155
|
});
|
|
127
156
|
for (const aclKey of [
|
|
@@ -224,3 +253,126 @@ describe("activateMemberChannel gateway-first relay", () => {
|
|
|
224
253
|
});
|
|
225
254
|
});
|
|
226
255
|
});
|
|
256
|
+
|
|
257
|
+
describe("seedUnverifiedMemberChannel gateway-first relay", () => {
|
|
258
|
+
beforeEach(() => {
|
|
259
|
+
ipcCalls = [];
|
|
260
|
+
ipcThrows = false;
|
|
261
|
+
ipcCallPersistentMock.mockClear();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test("relays to the gateway create_contact IPC with channelType + address + displayName", async () => {
|
|
265
|
+
await seedUnverifiedMemberChannel({
|
|
266
|
+
sourceChannel: "telegram",
|
|
267
|
+
externalUserId: "user-1",
|
|
268
|
+
displayName: "Alice",
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
expect(ipcCalls).toEqual([
|
|
272
|
+
{
|
|
273
|
+
method: "create_contact",
|
|
274
|
+
params: {
|
|
275
|
+
channelType: "telegram",
|
|
276
|
+
address: "user-1",
|
|
277
|
+
displayName: "Alice",
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
]);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
test("omits displayName when not supplied", async () => {
|
|
284
|
+
await seedUnverifiedMemberChannel({
|
|
285
|
+
sourceChannel: "slack",
|
|
286
|
+
externalUserId: "U123",
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
expect(ipcCalls).toHaveLength(1);
|
|
290
|
+
expect(ipcCalls[0]!.method).toBe("create_contact");
|
|
291
|
+
expect(ipcCalls[0]!.params).toEqual({
|
|
292
|
+
channelType: "slack",
|
|
293
|
+
address: "U123",
|
|
294
|
+
});
|
|
295
|
+
expect("displayName" in (ipcCalls[0]!.params ?? {})).toBe(false);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
test("swallows gateway errors (best-effort) so a deny is never blocked", async () => {
|
|
299
|
+
ipcThrows = true;
|
|
300
|
+
|
|
301
|
+
// Must not throw — the gateway owns the ACL verdict and a failed seed must
|
|
302
|
+
// not fail the guardian's deny decision.
|
|
303
|
+
await seedUnverifiedMemberChannel({
|
|
304
|
+
sourceChannel: "telegram",
|
|
305
|
+
externalUserId: "user-1",
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
expect(ipcCalls).toHaveLength(1);
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
describe("blockSenderChannel gateway-first relay", () => {
|
|
313
|
+
beforeEach(() => {
|
|
314
|
+
ipcCalls = [];
|
|
315
|
+
ipcThrows = false;
|
|
316
|
+
createContactChannelId = "gw-ch1";
|
|
317
|
+
revokeOk = true;
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test("ensures a contact row exists, then revokes the gateway channel", async () => {
|
|
321
|
+
const result = await blockSenderChannel({
|
|
322
|
+
sourceChannel: "slack",
|
|
323
|
+
externalUserId: "U-BLOCKED",
|
|
324
|
+
displayName: "Mallory",
|
|
325
|
+
reason: "introduction_block",
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
expect(result.revoked).toBe(true);
|
|
329
|
+
expect(ipcCalls.map((c) => c.method)).toEqual([
|
|
330
|
+
"create_contact",
|
|
331
|
+
"mark_channel_revoked",
|
|
332
|
+
]);
|
|
333
|
+
expect(ipcCalls[0]!.params).toEqual({
|
|
334
|
+
channelType: "slack",
|
|
335
|
+
address: "U-BLOCKED",
|
|
336
|
+
displayName: "Mallory",
|
|
337
|
+
});
|
|
338
|
+
expect(ipcCalls[1]!.params).toEqual({
|
|
339
|
+
contactChannelId: "gw-ch1",
|
|
340
|
+
reason: "introduction_block",
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
test("fails closed when the gateway returns no channel id", async () => {
|
|
345
|
+
createContactChannelId = "";
|
|
346
|
+
|
|
347
|
+
const result = await blockSenderChannel({
|
|
348
|
+
sourceChannel: "slack",
|
|
349
|
+
externalUserId: "U-BLOCKED",
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
expect(result.revoked).toBe(false);
|
|
353
|
+
// The revoke must not be attempted against an unknown channel.
|
|
354
|
+
expect(ipcCalls.map((c) => c.method)).toEqual(["create_contact"]);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test("fails closed when the gateway relay throws", async () => {
|
|
358
|
+
ipcThrows = true;
|
|
359
|
+
|
|
360
|
+
const result = await blockSenderChannel({
|
|
361
|
+
sourceChannel: "slack",
|
|
362
|
+
externalUserId: "U-BLOCKED",
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
expect(result.revoked).toBe(false);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
test("fails closed when the revoke is refused", async () => {
|
|
369
|
+
revokeOk = false;
|
|
370
|
+
|
|
371
|
+
const result = await blockSenderChannel({
|
|
372
|
+
sourceChannel: "slack",
|
|
373
|
+
externalUserId: "U-BLOCKED",
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
expect(result.revoked).toBe(false);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
@@ -64,6 +64,8 @@ export interface CanonicalGuardianRequest {
|
|
|
64
64
|
riskLevel: string | null;
|
|
65
65
|
activityText: string | null;
|
|
66
66
|
executionTarget: string | null;
|
|
67
|
+
/** JSON-encoded requester identity signals (see introduction-policy.ts). */
|
|
68
|
+
requesterSignals: string | null;
|
|
67
69
|
status: CanonicalRequestStatus;
|
|
68
70
|
answerText: string | null;
|
|
69
71
|
decidedByExternalUserId: string | null;
|
|
@@ -158,6 +160,7 @@ function rowToRequest(
|
|
|
158
160
|
riskLevel: row.riskLevel,
|
|
159
161
|
activityText: row.activityText,
|
|
160
162
|
executionTarget: row.executionTarget,
|
|
163
|
+
requesterSignals: row.requesterSignals,
|
|
161
164
|
status: row.status as CanonicalRequestStatus,
|
|
162
165
|
answerText: row.answerText,
|
|
163
166
|
decidedByExternalUserId: row.decidedByExternalUserId,
|
|
@@ -209,6 +212,7 @@ interface CreateCanonicalGuardianRequestParams {
|
|
|
209
212
|
riskLevel?: string;
|
|
210
213
|
activityText?: string;
|
|
211
214
|
executionTarget?: string;
|
|
215
|
+
requesterSignals?: string;
|
|
212
216
|
status?: CanonicalRequestStatus;
|
|
213
217
|
answerText?: string;
|
|
214
218
|
decidedByExternalUserId?: string;
|
|
@@ -267,6 +271,7 @@ export function createCanonicalGuardianRequest(
|
|
|
267
271
|
riskLevel: params.riskLevel ?? null,
|
|
268
272
|
activityText: params.activityText ?? null,
|
|
269
273
|
executionTarget: params.executionTarget ?? null,
|
|
274
|
+
requesterSignals: params.requesterSignals ?? null,
|
|
270
275
|
status: params.status ?? ("pending" as const),
|
|
271
276
|
answerText: params.answerText ?? null,
|
|
272
277
|
decidedByExternalUserId: params.decidedByExternalUserId ?? null,
|