@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
|
@@ -286,19 +286,19 @@ The `allowOneTimeSend` config gate (default: `false`) enables a secondary "Send
|
|
|
286
286
|
|
|
287
287
|
### Key Files
|
|
288
288
|
|
|
289
|
-
| File
|
|
290
|
-
|
|
|
291
|
-
| `assistant/src/runtime/routes/credential-routes.ts`
|
|
292
|
-
| `assistant/src/credential-execution/prompted-credential.ts`
|
|
293
|
-
| `assistant/src/security/secure-keys.ts`
|
|
294
|
-
| `assistant/src/tools/credentials/metadata-store.ts`
|
|
295
|
-
| `assistant/src/tools/credentials/broker.ts`
|
|
296
|
-
| `assistant/src/tools/credentials/policy-validate.ts`
|
|
297
|
-
| `assistant/src/permissions/secret-prompter.ts`
|
|
298
|
-
| `assistant/src/security/secret-scanner.ts`
|
|
299
|
-
| `assistant/src/security/secret-ingress.ts`
|
|
300
|
-
| `assistant/src/util/log-redact.ts`
|
|
301
|
-
| `clients/web/src/domains/chat/components/secret-prompt-card.tsx` | UI for secure credential entry
|
|
289
|
+
| File | Role |
|
|
290
|
+
| ---------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
|
|
291
|
+
| `assistant/src/runtime/routes/credential-routes.ts` | `assistant credentials` CLI — store, list, delete, inspect, reveal handlers |
|
|
292
|
+
| `assistant/src/credential-execution/prompted-credential.ts` | Persists credentials collected through the secure `credentials prompt` flow |
|
|
293
|
+
| `assistant/src/security/secure-keys.ts` | Async secure key CRUD via CES and encrypted file store |
|
|
294
|
+
| `assistant/src/tools/credentials/metadata-store.ts` | JSON file metadata CRUD for credential records |
|
|
295
|
+
| `assistant/src/tools/credentials/broker.ts` | Brokered credential access with policy enforcement and transient send |
|
|
296
|
+
| `assistant/src/tools/credentials/policy-validate.ts` | Policy input validation (allowedTools, allowedDomains) |
|
|
297
|
+
| `assistant/src/permissions/secret-prompter.ts` | HTTP secret_request/secret_response flow |
|
|
298
|
+
| `assistant/src/security/secret-scanner.ts` | Prefix + shape-based secret regex detection (used by display-time `redactSecrets`) |
|
|
299
|
+
| `assistant/src/security/secret-ingress.ts` | Prefix-only ingress check on user messages |
|
|
300
|
+
| `assistant/src/util/log-redact.ts` | Pino log serializers — prefix-based redaction for logs |
|
|
301
|
+
| `clients/web/src/domains/chat/components/secret-prompt-card.tsx` | UI for secure credential entry |
|
|
302
302
|
|
|
303
303
|
---
|
|
304
304
|
|
|
@@ -363,13 +363,13 @@ sequenceDiagram
|
|
|
363
363
|
|
|
364
364
|
### Key Source Files
|
|
365
365
|
|
|
366
|
-
| File
|
|
367
|
-
|
|
|
368
|
-
| `assistant/src/
|
|
369
|
-
| `assistant/src/
|
|
370
|
-
| `assistant/src/security/tool-approval-digest.ts`
|
|
371
|
-
| `assistant/src/runtime/routes/guardian-approval-interception.ts`
|
|
372
|
-
| `assistant/src/calls/voice-session-bridge.ts`
|
|
366
|
+
| File | Role |
|
|
367
|
+
| -------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
368
|
+
| `assistant/src/approvals/scoped-approval-grants.ts` | CRUD, atomic CAS consume, expiry sweep, context-based revocation |
|
|
369
|
+
| `assistant/src/persistence/migrations/033-scoped-approval-grants.ts` | SQLite schema migration for the `scoped_approval_grants` table |
|
|
370
|
+
| `assistant/src/security/tool-approval-digest.ts` | Canonical JSON serialization + SHA-256 digest for tool signatures |
|
|
371
|
+
| `assistant/src/runtime/routes/guardian-approval-interception.ts` | Grant minting on guardian approve_once decisions (`tryMintToolApprovalGrant`) |
|
|
372
|
+
| `assistant/src/calls/voice-session-bridge.ts` | Voice consumer: checks and consumes grants before auto-denying |
|
|
373
373
|
|
|
374
374
|
### Test Coverage
|
|
375
375
|
|
|
@@ -12,8 +12,7 @@ Add a new entry to the `CATALOG` map with:
|
|
|
12
12
|
- `credentialProvider` — the credential-store key name used by `getProviderKeyAsync` to retrieve the API key. If the provider shares an API key with another service (e.g. `openai-whisper` shares the `"openai"` key, or `google-gemini` shares the `"gemini"` key), reuse that name; otherwise use the provider's own name (e.g. `"deepgram"` maps to `"deepgram"`).
|
|
13
13
|
- `supportedBoundaries` — the set of `SttBoundaryId` values the provider supports. Valid values are `"daemon-batch"` (post-recording transcription) and `"daemon-streaming"` (real-time streaming transcription during conversation).
|
|
14
14
|
- `conversationStreamingMode` — how the provider handles streaming transcription in conversation mode: `"realtime-ws"` (provider supports real-time streaming natively via WebSocket), `"incremental-batch"` (streaming emulated via throttled polling), or `"none"` (no streaming support). Required for all providers.
|
|
15
|
-
- `telephonyMode` — how the provider participates in real-time telephony STT: `"realtime-ws"`, `"batch-only"`, or `"none"`.
|
|
16
|
-
- `telephonyRouting` — telephony routing metadata that drives Twilio call setup strategy selection. Declare `strategyKind` as `"conversation-relay-native"` or `"media-stream-custom"`. For native providers, include `twilioNativeMapping` with the Twilio `provider` name and `defaultSpeechModel`.
|
|
15
|
+
- `telephonyMode` — how the provider participates in real-time telephony STT: `"realtime-ws"`, `"batch-only"`, or `"none"`. The telephony capability resolver (`resolveTelephonySttCapability()` in `src/providers/speech-to-text/resolve.ts`) reads this field plus credential availability to decide whether phone calls can run with the provider.
|
|
17
16
|
|
|
18
17
|
## 2. Type-system registration
|
|
19
18
|
|
|
@@ -84,8 +83,8 @@ Clients derive shared-vs-exclusive key behavior from the catalog automatically:
|
|
|
84
83
|
|
|
85
84
|
Before submitting the PR, verify that:
|
|
86
85
|
|
|
87
|
-
1. **No stale config references** — grep for any references to a separate telephony transcription config.
|
|
86
|
+
1. **No stale config references** — grep for any references to a separate telephony transcription config. Telephony transcription runs daemon-side over the Twilio media-stream transport (`src/calls/media-stream-stt-session.ts`), which reads `services.stt.provider` like every other boundary.
|
|
88
87
|
|
|
89
|
-
2. **Provider catalog
|
|
88
|
+
2. **Provider catalog telephony metadata** — the new provider's catalog entry (step 1) declares `telephonyMode` and `supportedBoundaries`; these are the single source of truth for the telephony capability check (`resolveTelephonySttCapability()`) and for streaming-vs-batch mode selection in the media-stream STT session. No per-provider routing maps exist.
|
|
90
89
|
|
|
91
|
-
3. **No duplicate wiring** — a provider should appear only once in `services.stt`. The telephony
|
|
90
|
+
3. **No duplicate wiring** — a provider should appear only once in `services.stt`. The telephony layer consumes the same provider ID; there is no second registration step for telephony.
|
|
@@ -114,11 +114,11 @@ No member record is created. No verification session is created.
|
|
|
114
114
|
|
|
115
115
|
### Invites (alternative path)
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
Invites are gateway-native: the gateway's `ingress_invites` table is the sole invite store, and its redemption engine (`gateway/src/verification/invite-redemption.ts`) validates the SHA-256 hashed token, atomically claims the row, and activates the channel in the gateway ACL. The daemon only mirrors the contact/channel identity locally via the `invite_redeemed` event. This path is distinct from the trusted contact flow but serves the same end state: an active member channel.
|
|
118
118
|
|
|
119
|
-
| Table
|
|
120
|
-
|
|
|
121
|
-
| `
|
|
119
|
+
| Table | Purpose in trusted contact flow |
|
|
120
|
+
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
121
|
+
| `ingress_invites` (gateway DB) | Not used in the guardian-mediated flow. Available as an alternative for direct invite links (e.g., guardian shares a URL instead of going through the approval + verification flow). |
|
|
122
122
|
|
|
123
123
|
### Voice In-Call Guardian Approval (friend-initiated)
|
|
124
124
|
|
|
@@ -126,10 +126,10 @@ Voice calls have a dedicated in-call guardian approval flow that differs from th
|
|
|
126
126
|
|
|
127
127
|
**Flow:**
|
|
128
128
|
|
|
129
|
-
1. Unknown caller dials in. `relay-
|
|
130
|
-
2.
|
|
129
|
+
1. Unknown caller dials in. `routeSetup` (`relay-setup-router.ts`) resolves trust — caller is `unknown`, no pending challenge, no active invite.
|
|
130
|
+
2. The `CallSetupFlow` enters `capturing_name` state and prompts the caller for their name (with a timeout).
|
|
131
131
|
3. On name capture, `notifyGuardianOfAccessRequest` creates a canonical guardian request (`kind: 'access_request'`) and notifies the guardian.
|
|
132
|
-
4.
|
|
132
|
+
4. The flow hands off to a `GuardianWaitController` (`awaiting_guardian_decision`), which speaks hold messaging while polling `canonical_guardian_requests` for status changes.
|
|
133
133
|
5. Guardian approves or denies via any channel. All decisions route through `applyCanonicalGuardianDecision`.
|
|
134
134
|
6. On approval: the `access_request` resolver directly activates the caller as a trusted contact (`upsertContactChannel` with `status: 'active'`, `policy: 'allow'`) — no verification session needed since the caller is already authenticated by their phone number.
|
|
135
135
|
7. On denial or timeout: the caller hears a denial message and the call ends.
|
|
@@ -21,6 +21,10 @@ const ALLOWED_PREFIXES = {
|
|
|
21
21
|
// Status command's daemon-down fallback needs socket path + platform.
|
|
22
22
|
"../../ipc/socket-path",
|
|
23
23
|
"../../util/platform",
|
|
24
|
+
// App version constant (leaf module; reads package.json/env, no daemon
|
|
25
|
+
// deps) — status prints it to surface CLI-vs-runtime version drift.
|
|
26
|
+
"../../version",
|
|
27
|
+
"../../../version",
|
|
24
28
|
// Logger / output at depth-1 and depth-2.
|
|
25
29
|
"../logger",
|
|
26
30
|
"../output",
|
package/eslint.config.mjs
CHANGED
|
@@ -12,6 +12,10 @@ const eslintConfig = defineConfig([
|
|
|
12
12
|
"simple-import-sort": simpleImportSort,
|
|
13
13
|
},
|
|
14
14
|
rules: {
|
|
15
|
+
// Require braces on every control-statement body (if/else/for/
|
|
16
|
+
// while/do). A braceless body is a maintenance hazard: a second
|
|
17
|
+
// line added under the condition reads as guarded but always runs.
|
|
18
|
+
curly: ["warn", "all"],
|
|
15
19
|
"simple-import-sort/imports": [
|
|
16
20
|
"error",
|
|
17
21
|
{
|
|
@@ -52,7 +56,9 @@ const eslintConfig = defineConfig([
|
|
|
52
56
|
{
|
|
53
57
|
files: ["src/cli/commands/**/*.ts"],
|
|
54
58
|
ignores: ["src/cli/commands/**/__tests__/**"],
|
|
55
|
-
plugins: {
|
|
59
|
+
plugins: {
|
|
60
|
+
cli: { rules: { "no-daemon-internals": cliNoDaemonInternals } },
|
|
61
|
+
},
|
|
56
62
|
rules: { "cli/no-daemon-internals": "error" },
|
|
57
63
|
},
|
|
58
64
|
]);
|
package/knip.json
CHANGED
|
@@ -48,6 +48,42 @@ describe("contact read contracts", () => {
|
|
|
48
48
|
expect(parsed.updatedAt).toBe(1700000000);
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
+
test("ContactReadSchema accepts null interactionCount (daemon-native gateway-telemetry outage fail-soft)", () => {
|
|
52
|
+
const contact = {
|
|
53
|
+
id: "c1",
|
|
54
|
+
displayName: "Example User",
|
|
55
|
+
role: "contact",
|
|
56
|
+
contactType: "human",
|
|
57
|
+
lastInteraction: null,
|
|
58
|
+
interactionCount: null,
|
|
59
|
+
createdAt: 1699000000,
|
|
60
|
+
updatedAt: 1700000000,
|
|
61
|
+
channels: [
|
|
62
|
+
{
|
|
63
|
+
id: "ch1",
|
|
64
|
+
contactId: "c1",
|
|
65
|
+
type: "imessage",
|
|
66
|
+
address: "+15555550100",
|
|
67
|
+
isPrimary: true,
|
|
68
|
+
externalUserId: null,
|
|
69
|
+
status: "active",
|
|
70
|
+
policy: "allow",
|
|
71
|
+
verifiedAt: null,
|
|
72
|
+
verifiedVia: null,
|
|
73
|
+
lastSeenAt: null,
|
|
74
|
+
interactionCount: null,
|
|
75
|
+
lastInteraction: null,
|
|
76
|
+
revokedReason: null,
|
|
77
|
+
blockedReason: null,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const parsed = ContactReadSchema.parse(contact);
|
|
83
|
+
expect(parsed.interactionCount).toBeNull();
|
|
84
|
+
expect(parsed.channels[0].interactionCount).toBeNull();
|
|
85
|
+
});
|
|
86
|
+
|
|
51
87
|
test("ContactReadSchema requires createdAt/updatedAt", () => {
|
|
52
88
|
const withoutTimestamps = {
|
|
53
89
|
id: "c1",
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the shared invite contract.
|
|
3
|
+
*
|
|
4
|
+
* The pinned hash vectors below define the hash compatibility contract:
|
|
5
|
+
* `hashInviteToken` and `hashInviteCode` must produce exactly these outputs
|
|
6
|
+
* because invite hashes already stored in the assistant and gateway DBs were
|
|
7
|
+
* produced with them. Do not update the vectors to "fix" a failure — a
|
|
8
|
+
* mismatch means the hash scheme broke.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, expect, test } from "bun:test";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
ActiveVoiceInviteSchema,
|
|
15
|
+
generateInviteCode,
|
|
16
|
+
generateInviteToken,
|
|
17
|
+
GetActiveVoiceInviteRequestSchema,
|
|
18
|
+
hashInviteCode,
|
|
19
|
+
hashInviteToken,
|
|
20
|
+
INVITE_CODE_REDEMPTION_CHANNELS,
|
|
21
|
+
InviteRedemptionOutcomeSchema,
|
|
22
|
+
isInviteCodeRedemptionEnabled,
|
|
23
|
+
isValidE164,
|
|
24
|
+
RedeemInviteByCodeRequestSchema,
|
|
25
|
+
RedeemInviteByTokenRequestSchema,
|
|
26
|
+
RedeemVoiceInviteRequestSchema,
|
|
27
|
+
type InviteRedemptionOutcome,
|
|
28
|
+
} from "../invite-contract.js";
|
|
29
|
+
|
|
30
|
+
describe("hash helpers — pinned compatibility vectors", () => {
|
|
31
|
+
test("hashInviteToken matches invite-store.ts hashToken output", () => {
|
|
32
|
+
expect(hashInviteToken("test-raw-token")).toBe(
|
|
33
|
+
"7ef58e99b3406554f5ce0c0055b8ed3ea4db2c8a36613092d644c57c6a033330",
|
|
34
|
+
);
|
|
35
|
+
expect(hashInviteToken("AbC123_-xyz")).toBe(
|
|
36
|
+
"860c47c13bb8d13decd6815b20be7de8cf11597e4b704af58b00048e90a5a337",
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("hashInviteCode matches voice-code.ts hashVoiceCode output", () => {
|
|
41
|
+
expect(hashInviteCode("123456")).toBe(
|
|
42
|
+
"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
|
|
43
|
+
);
|
|
44
|
+
expect(hashInviteCode("0000")).toBe(
|
|
45
|
+
"9af15b336e6a9619928537df30b2e6a2376569fcf9d7e773eccede65606529a0",
|
|
46
|
+
);
|
|
47
|
+
expect(hashInviteCode("987654321")).toBe(
|
|
48
|
+
"8a9bcf1e51e812d0af8465a8dbcc9f741064bf0af3b3d08e6b0246437c19f7fb",
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe("generateInviteToken", () => {
|
|
54
|
+
test("produces a 43-character base64url token", () => {
|
|
55
|
+
const token = generateInviteToken();
|
|
56
|
+
expect(token).toMatch(/^[A-Za-z0-9_-]{43}$/);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("produces unique tokens", () => {
|
|
60
|
+
expect(generateInviteToken()).not.toBe(generateInviteToken());
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("generateInviteCode", () => {
|
|
65
|
+
test("defaults to 6 digits with no leading zero", () => {
|
|
66
|
+
const code = generateInviteCode();
|
|
67
|
+
expect(code).toMatch(/^[1-9]\d{5}$/);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("honors the digit count at both bounds", () => {
|
|
71
|
+
expect(generateInviteCode(4)).toMatch(/^[1-9]\d{3}$/);
|
|
72
|
+
expect(generateInviteCode(10)).toMatch(/^[1-9]\d{9}$/);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("rejects out-of-range digit counts", () => {
|
|
76
|
+
expect(() => generateInviteCode(3)).toThrow();
|
|
77
|
+
expect(() => generateInviteCode(11)).toThrow();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe("isValidE164", () => {
|
|
82
|
+
test("valid E.164 number", () => {
|
|
83
|
+
expect(isValidE164("+15551234567")).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("missing + prefix", () => {
|
|
87
|
+
expect(isValidE164("5551234567")).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("too short", () => {
|
|
91
|
+
expect(isValidE164("+123")).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe("invite-code channel gating", () => {
|
|
96
|
+
test("allows exactly the redemption-enabled channels", () => {
|
|
97
|
+
expect([...INVITE_CODE_REDEMPTION_CHANNELS].sort()).toEqual([
|
|
98
|
+
"email",
|
|
99
|
+
"slack",
|
|
100
|
+
"telegram",
|
|
101
|
+
"whatsapp",
|
|
102
|
+
]);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("isInviteCodeRedemptionEnabled matches the allowlist", () => {
|
|
106
|
+
for (const channel of ["telegram", "whatsapp", "slack", "email"]) {
|
|
107
|
+
expect(isInviteCodeRedemptionEnabled(channel)).toBe(true);
|
|
108
|
+
}
|
|
109
|
+
for (const channel of ["vellum", "platform", "phone", "a2a", "nope"]) {
|
|
110
|
+
expect(isInviteCodeRedemptionEnabled(channel)).toBe(false);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const fullOutcome: InviteRedemptionOutcome = {
|
|
116
|
+
inviteId: "inv-1",
|
|
117
|
+
contactId: "c-1",
|
|
118
|
+
sourceChannel: "telegram",
|
|
119
|
+
memberExternalUserId: "tg-user-1",
|
|
120
|
+
memberExternalChatId: "tg-chat-1",
|
|
121
|
+
displayName: "Member Name",
|
|
122
|
+
username: "member",
|
|
123
|
+
sourceConversationId: "conv-1",
|
|
124
|
+
result: "redeemed",
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
describe("InviteRedemptionOutcomeSchema", () => {
|
|
128
|
+
test("round-trips a fully-populated outcome", () => {
|
|
129
|
+
expect(InviteRedemptionOutcomeSchema.parse(fullOutcome)).toEqual(
|
|
130
|
+
fullOutcome,
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("parses a minimal outcome", () => {
|
|
135
|
+
const minimal = {
|
|
136
|
+
inviteId: "inv-1",
|
|
137
|
+
contactId: "c-1",
|
|
138
|
+
sourceChannel: "slack",
|
|
139
|
+
memberExternalUserId: "U123",
|
|
140
|
+
result: "already_member",
|
|
141
|
+
} satisfies InviteRedemptionOutcome;
|
|
142
|
+
expect(InviteRedemptionOutcomeSchema.parse(minimal)).toEqual(minimal);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("rejects an invalid result", () => {
|
|
146
|
+
expect(() =>
|
|
147
|
+
InviteRedemptionOutcomeSchema.parse({
|
|
148
|
+
...fullOutcome,
|
|
149
|
+
result: "definitely_not_a_result",
|
|
150
|
+
}),
|
|
151
|
+
).toThrow();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe("invite IPC request schemas", () => {
|
|
156
|
+
test("RedeemInviteByCodeRequestSchema round-trips full and minimal requests", () => {
|
|
157
|
+
const full = {
|
|
158
|
+
code: "123456",
|
|
159
|
+
sourceChannel: "telegram",
|
|
160
|
+
externalUserId: "tg-user-1",
|
|
161
|
+
externalChatId: "tg-chat-1",
|
|
162
|
+
displayName: "Member Name",
|
|
163
|
+
username: "member",
|
|
164
|
+
};
|
|
165
|
+
expect(RedeemInviteByCodeRequestSchema.parse(full)).toEqual(full);
|
|
166
|
+
const minimal = { code: "123456", sourceChannel: "email" };
|
|
167
|
+
expect(RedeemInviteByCodeRequestSchema.parse(minimal)).toEqual(minimal);
|
|
168
|
+
expect(() =>
|
|
169
|
+
RedeemInviteByCodeRequestSchema.parse({ code: "", sourceChannel: "" }),
|
|
170
|
+
).toThrow();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("RedeemInviteByTokenRequestSchema round-trips full and minimal requests", () => {
|
|
174
|
+
const full = {
|
|
175
|
+
token: "raw-token",
|
|
176
|
+
sourceChannel: "slack",
|
|
177
|
+
externalUserId: "U123",
|
|
178
|
+
externalChatId: "D456",
|
|
179
|
+
displayName: "Member Name",
|
|
180
|
+
username: "member",
|
|
181
|
+
};
|
|
182
|
+
expect(RedeemInviteByTokenRequestSchema.parse(full)).toEqual(full);
|
|
183
|
+
const minimal = { token: "raw-token", sourceChannel: "slack" };
|
|
184
|
+
expect(RedeemInviteByTokenRequestSchema.parse(minimal)).toEqual(minimal);
|
|
185
|
+
expect(() =>
|
|
186
|
+
RedeemInviteByTokenRequestSchema.parse({ sourceChannel: "slack" }),
|
|
187
|
+
).toThrow();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("RedeemVoiceInviteRequestSchema requires caller and code", () => {
|
|
191
|
+
const request = { callerExternalUserId: "+15555550100", code: "123456" };
|
|
192
|
+
expect(RedeemVoiceInviteRequestSchema.parse(request)).toEqual(request);
|
|
193
|
+
expect(() =>
|
|
194
|
+
RedeemVoiceInviteRequestSchema.parse({ callerExternalUserId: "+1555" }),
|
|
195
|
+
).toThrow();
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("GetActiveVoiceInviteRequestSchema requires the caller", () => {
|
|
199
|
+
const request = { callerExternalUserId: "+15555550100" };
|
|
200
|
+
expect(GetActiveVoiceInviteRequestSchema.parse(request)).toEqual(request);
|
|
201
|
+
expect(() => GetActiveVoiceInviteRequestSchema.parse({})).toThrow();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
describe("ActiveVoiceInviteSchema", () => {
|
|
206
|
+
test("round-trips populated and null display fields", () => {
|
|
207
|
+
const populated = {
|
|
208
|
+
inviteId: "inv-1",
|
|
209
|
+
inviteeName: "Friend",
|
|
210
|
+
guardianName: "Guardian",
|
|
211
|
+
codeDigits: 6,
|
|
212
|
+
};
|
|
213
|
+
expect(ActiveVoiceInviteSchema.parse(populated)).toEqual(populated);
|
|
214
|
+
const anonymous = {
|
|
215
|
+
inviteId: "inv-2",
|
|
216
|
+
inviteeName: null,
|
|
217
|
+
guardianName: null,
|
|
218
|
+
codeDigits: 6,
|
|
219
|
+
};
|
|
220
|
+
expect(ActiveVoiceInviteSchema.parse(anonymous)).toEqual(anonymous);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
test("rejects a non-integer codeDigits", () => {
|
|
224
|
+
expect(() =>
|
|
225
|
+
ActiveVoiceInviteSchema.parse({
|
|
226
|
+
inviteId: "inv-1",
|
|
227
|
+
inviteeName: null,
|
|
228
|
+
guardianName: null,
|
|
229
|
+
codeDigits: 6.5,
|
|
230
|
+
}),
|
|
231
|
+
).toThrow();
|
|
232
|
+
});
|
|
233
|
+
});
|
|
@@ -8,6 +8,7 @@ import { describe, expect, test } from "bun:test";
|
|
|
8
8
|
import { SourceMetadataSchema } from "../inbound-contract.js";
|
|
9
9
|
import {
|
|
10
10
|
makeResolutionFailedVerdict,
|
|
11
|
+
makeUnauthenticatedSenderVerdict,
|
|
11
12
|
TrustVerdictSchema,
|
|
12
13
|
type TrustVerdict,
|
|
13
14
|
} from "../trust-verdict-contract.js";
|
|
@@ -28,6 +29,8 @@ const fullVerdict: TrustVerdict = {
|
|
|
28
29
|
policy: "allow",
|
|
29
30
|
verifiedAt: 1699999999,
|
|
30
31
|
verifiedVia: "voice",
|
|
32
|
+
interactionCount: 12,
|
|
33
|
+
lastInteraction: 1699999998,
|
|
31
34
|
memberDisplayName: "Member Name",
|
|
32
35
|
};
|
|
33
36
|
|
|
@@ -74,6 +77,43 @@ describe("TrustVerdictSchema", () => {
|
|
|
74
77
|
});
|
|
75
78
|
});
|
|
76
79
|
|
|
80
|
+
test("makeUnauthenticatedSenderVerdict builds a plain stranger (not resolutionFailed)", () => {
|
|
81
|
+
// Distinct from makeResolutionFailedVerdict: an unauthenticated sender is
|
|
82
|
+
// a real stranger and must flow through the normal admission/verification
|
|
83
|
+
// lane, so it carries no resolutionFailed flag and no guardian/member keys.
|
|
84
|
+
const verdict = makeUnauthenticatedSenderVerdict("+15555550100");
|
|
85
|
+
expect(verdict).toEqual({
|
|
86
|
+
trustClass: "unknown",
|
|
87
|
+
canonicalSenderId: "+15555550100",
|
|
88
|
+
});
|
|
89
|
+
expect(verdict.resolutionFailed).toBeUndefined();
|
|
90
|
+
expect(TrustVerdictSchema.parse(verdict)).toEqual(verdict);
|
|
91
|
+
expect(makeUnauthenticatedSenderVerdict(null)).toEqual({
|
|
92
|
+
trustClass: "unknown",
|
|
93
|
+
canonicalSenderId: null,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("carries interaction telemetry and tolerates a null lastInteraction", () => {
|
|
98
|
+
const parsed = TrustVerdictSchema.parse({
|
|
99
|
+
trustClass: "trusted_contact",
|
|
100
|
+
canonicalSenderId: "+15555550100",
|
|
101
|
+
interactionCount: 0,
|
|
102
|
+
lastInteraction: null,
|
|
103
|
+
});
|
|
104
|
+
expect(parsed.interactionCount).toBe(0);
|
|
105
|
+
expect(parsed.lastInteraction).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test("leaves interaction telemetry undefined when absent", () => {
|
|
109
|
+
const parsed = TrustVerdictSchema.parse({
|
|
110
|
+
trustClass: "unknown",
|
|
111
|
+
canonicalSenderId: null,
|
|
112
|
+
});
|
|
113
|
+
expect(parsed.interactionCount).toBeUndefined();
|
|
114
|
+
expect(parsed.lastInteraction).toBeUndefined();
|
|
115
|
+
});
|
|
116
|
+
|
|
77
117
|
test("rejects an invalid trustClass", () => {
|
|
78
118
|
expect(() =>
|
|
79
119
|
TrustVerdictSchema.parse({
|
|
@@ -181,6 +181,17 @@ export type UpsertVerifiedChannelIpcResponse = z.infer<
|
|
|
181
181
|
typeof UpsertVerifiedChannelIpcResponseSchema
|
|
182
182
|
>;
|
|
183
183
|
|
|
184
|
+
export const CreateContactIpcResponseSchema = z.object({
|
|
185
|
+
contactId: z.string(),
|
|
186
|
+
// Gateway channel id for the (channelType, address) pair, resolved from the
|
|
187
|
+
// gateway DB (source of truth). Empty when the read-back found no row.
|
|
188
|
+
channelId: z.string(),
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
export type CreateContactIpcResponse = z.infer<
|
|
192
|
+
typeof CreateContactIpcResponseSchema
|
|
193
|
+
>;
|
|
194
|
+
|
|
184
195
|
export const MarkChannelRevokedIpcParamsSchema = z.object({
|
|
185
196
|
contactChannelId: z.string().min(1),
|
|
186
197
|
// Audit reason for the downgrade. The verification-revoke flow passes
|
|
@@ -222,7 +233,7 @@ export const ContactReadChannelSchema = z.object({
|
|
|
222
233
|
verifiedAt: z.number().nullable(),
|
|
223
234
|
verifiedVia: z.string().nullable(),
|
|
224
235
|
lastSeenAt: z.number().nullable(),
|
|
225
|
-
interactionCount: z.number(),
|
|
236
|
+
interactionCount: z.number().nullable(),
|
|
226
237
|
lastInteraction: z.number().nullable(),
|
|
227
238
|
revokedReason: z.string().nullable(),
|
|
228
239
|
blockedReason: z.string().nullable(),
|
|
@@ -237,7 +248,7 @@ export const ContactReadSchema = z.object({
|
|
|
237
248
|
notes: z.string().nullable().optional(),
|
|
238
249
|
contactType: z.string().nullable().optional(),
|
|
239
250
|
lastInteraction: z.number().nullable().optional(),
|
|
240
|
-
interactionCount: z.number(),
|
|
251
|
+
interactionCount: z.number().nullable(),
|
|
241
252
|
createdAt: z.number(),
|
|
242
253
|
updatedAt: z.number(),
|
|
243
254
|
channels: z.array(ContactReadChannelSchema),
|
|
@@ -259,13 +270,16 @@ export const ListContactsIpcParamsSchema = z
|
|
|
259
270
|
.object({
|
|
260
271
|
limit: z.number().optional(),
|
|
261
272
|
role: z.string().optional(),
|
|
273
|
+
// Restrict the read to these contact ids (any order). Used by the daemon to
|
|
274
|
+
// batch-hydrate gateway-owned telemetry onto daemon-native filtered/search
|
|
275
|
+
// results without re-implementing search in the gateway. When present,
|
|
276
|
+
// `role`/`limit` filtering is bypassed — the id set is the filter.
|
|
277
|
+
ids: z.array(z.string()).optional(),
|
|
262
278
|
})
|
|
263
279
|
.strict()
|
|
264
280
|
.default({});
|
|
265
281
|
|
|
266
|
-
export type ListContactsIpcParams = z.infer<
|
|
267
|
-
typeof ListContactsIpcParamsSchema
|
|
268
|
-
>;
|
|
282
|
+
export type ListContactsIpcParams = z.infer<typeof ListContactsIpcParamsSchema>;
|
|
269
283
|
|
|
270
284
|
export const ListContactsIpcResponseSchema = z.object({
|
|
271
285
|
ok: z.boolean(),
|
|
@@ -288,9 +302,7 @@ export const GetContactIpcResponseSchema = z.object({
|
|
|
288
302
|
assistantMetadata: AssistantContactMetadataSchema.optional(),
|
|
289
303
|
});
|
|
290
304
|
|
|
291
|
-
export type GetContactIpcResponse = z.infer<
|
|
292
|
-
typeof GetContactIpcResponseSchema
|
|
293
|
-
>;
|
|
305
|
+
export type GetContactIpcResponse = z.infer<typeof GetContactIpcResponseSchema>;
|
|
294
306
|
|
|
295
307
|
export const GetGuardianContactIpcParamsSchema = z
|
|
296
308
|
.object({})
|
|
@@ -69,6 +69,11 @@ export const SourceMetadataSchema = z
|
|
|
69
69
|
slackBotMentioned: z.boolean().optional(),
|
|
70
70
|
/** Slack workspace/team ID. */
|
|
71
71
|
account: z.string().optional(),
|
|
72
|
+
/**
|
|
73
|
+
* Slack-specific: team ID the inbound actor belongs to. Threads to the
|
|
74
|
+
* daemon as the `recipient_team_id` for channel reply streaming.
|
|
75
|
+
*/
|
|
76
|
+
actorTeamId: z.string().optional(),
|
|
72
77
|
|
|
73
78
|
/**
|
|
74
79
|
* Per-channel inbound admission policy attached by the gateway. The
|
|
@@ -86,6 +91,11 @@ export const SourceMetadataSchema = z
|
|
|
86
91
|
trustVerdict: TrustVerdictSchema.optional(),
|
|
87
92
|
|
|
88
93
|
// Email-specific fields
|
|
94
|
+
/**
|
|
95
|
+
* Ingress provider that delivered the email to the gateway
|
|
96
|
+
* (e.g. "mailgun", "resend", or "platform" for the Vellum relay).
|
|
97
|
+
*/
|
|
98
|
+
emailProvider: z.string().optional(),
|
|
89
99
|
/** Email subject line. */
|
|
90
100
|
emailSubject: z.string().optional(),
|
|
91
101
|
/** Email recipient address. */
|
|
@@ -27,6 +27,8 @@ export {
|
|
|
27
27
|
ChannelDeliveryResultSchema,
|
|
28
28
|
ChannelReplyPayloadSchema,
|
|
29
29
|
PermissionRequestDetailsSchema,
|
|
30
|
+
SlackStreamOpSchema,
|
|
31
|
+
SlackStreamTaskSchema,
|
|
30
32
|
} from "./outbound-contract.js";
|
|
31
33
|
|
|
32
34
|
export type {
|
|
@@ -36,6 +38,8 @@ export type {
|
|
|
36
38
|
ChannelDeliveryResult,
|
|
37
39
|
ChannelReplyPayload,
|
|
38
40
|
PermissionRequestDetails,
|
|
41
|
+
SlackStreamOp,
|
|
42
|
+
SlackStreamTask,
|
|
39
43
|
} from "./outbound-contract.js";
|
|
40
44
|
|
|
41
45
|
// Inbound contract (gateway → daemon) — Zod schemas + derived types
|
|
@@ -73,7 +77,9 @@ export type { AdmissionPolicy } from "./admission-policy-contract.js";
|
|
|
73
77
|
|
|
74
78
|
// Trust verdict contract (gateway → daemon) — Zod schemas + derived types
|
|
75
79
|
export {
|
|
80
|
+
isTrustClass,
|
|
76
81
|
makeResolutionFailedVerdict,
|
|
82
|
+
makeUnauthenticatedSenderVerdict,
|
|
77
83
|
ResolveInboundTrustRequestSchema,
|
|
78
84
|
TRUST_CLASS_VALUES,
|
|
79
85
|
TrustClassSchema,
|
|
@@ -86,6 +92,33 @@ export type {
|
|
|
86
92
|
TrustVerdict,
|
|
87
93
|
} from "./trust-verdict-contract.js";
|
|
88
94
|
|
|
95
|
+
// Invite contract (shared gateway ↔ daemon) — hash/generate helpers,
|
|
96
|
+
// channel gating, redemption outcome + invite IPC schemas
|
|
97
|
+
export {
|
|
98
|
+
ActiveVoiceInviteSchema,
|
|
99
|
+
generateInviteCode,
|
|
100
|
+
generateInviteToken,
|
|
101
|
+
GetActiveVoiceInviteRequestSchema,
|
|
102
|
+
hashInviteCode,
|
|
103
|
+
hashInviteToken,
|
|
104
|
+
InviteRedemptionOutcomeSchema,
|
|
105
|
+
isInviteCodeRedemptionEnabled,
|
|
106
|
+
isValidE164,
|
|
107
|
+
RedeemInviteByCodeRequestSchema,
|
|
108
|
+
RedeemInviteByTokenRequestSchema,
|
|
109
|
+
RedeemVoiceInviteRequestSchema,
|
|
110
|
+
} from "./invite-contract.js";
|
|
111
|
+
|
|
112
|
+
export type {
|
|
113
|
+
ActiveVoiceInvite,
|
|
114
|
+
GetActiveVoiceInviteRequest,
|
|
115
|
+
InviteRedemptionOutcome,
|
|
116
|
+
InviteRedemptionResult,
|
|
117
|
+
RedeemInviteByCodeRequest,
|
|
118
|
+
RedeemInviteByTokenRequest,
|
|
119
|
+
RedeemVoiceInviteRequest,
|
|
120
|
+
} from "./invite-contract.js";
|
|
121
|
+
|
|
89
122
|
// Guardian delivery contract (daemon → gateway pull) — Zod schemas + derived types
|
|
90
123
|
export {
|
|
91
124
|
GuardianDeliverySchema,
|