@vellumai/assistant 0.10.12 → 0.11.0-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +264 -14
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
- package/src/__tests__/app-conversation-ids.test.ts +204 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-group-tools.test.ts +279 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-lineage.test.ts +235 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/platform-callback-registration.test.ts +10 -10
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/resolve-app-id.test.ts +32 -0
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +26 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +587 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +482 -2
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/api/responses/subagent-detail.ts +13 -0
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/apps/app-store.ts +95 -4
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +178 -65
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/commands/webhooks.help.ts +9 -4
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
- package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/bundled-skills/schedule/SKILL.md +2 -0
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -38
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-lineage.ts +76 -0
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +8 -14
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +32 -16
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +1288 -439
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +298 -15
- package/src/permissions/checker.ts +102 -36
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +269 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/conversation-parent.ts +27 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +9 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/prompts/sections.ts +4 -16
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/subagents-routes.ts +35 -8
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/webhook-routes.ts +89 -30
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/apps/resolve-app-id.ts +15 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/conversation-groups/group_create.ts +63 -0
- package/src/tools/conversation-groups/group_list.ts +20 -0
- package/src/tools/conversation-groups/group_shared.ts +52 -0
- package/src/tools/conversation-groups/move_to_group.ts +106 -0
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/util/platform.ts +15 -0
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/tsconfig.plugin-api.json +1 -1
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
3
4
|
import {
|
|
4
5
|
createSurfaceMutex,
|
|
5
6
|
type SurfaceConversationContext,
|
|
@@ -8,14 +9,13 @@ import {
|
|
|
8
9
|
import type {
|
|
9
10
|
CardSurfaceData,
|
|
10
11
|
DynamicPageSurfaceData,
|
|
11
|
-
ServerMessage,
|
|
12
12
|
SurfaceType,
|
|
13
13
|
UiSurfaceShow,
|
|
14
14
|
UISurfaceUpdateEvent,
|
|
15
15
|
} from "../daemon/message-protocol.js";
|
|
16
16
|
|
|
17
17
|
function makeContext(
|
|
18
|
-
sent:
|
|
18
|
+
sent: AssistantEvent[] = [],
|
|
19
19
|
channelCapabilities?: SurfaceConversationContext["channelCapabilities"],
|
|
20
20
|
): SurfaceConversationContext {
|
|
21
21
|
return {
|
|
@@ -42,7 +42,7 @@ function makeContext(
|
|
|
42
42
|
|
|
43
43
|
describe("task_progress surface compatibility", () => {
|
|
44
44
|
test("blocks ui_show when channel lacks dynamic UI support", async () => {
|
|
45
|
-
const sent:
|
|
45
|
+
const sent: AssistantEvent[] = [];
|
|
46
46
|
const ctx = makeContext(sent, {
|
|
47
47
|
channel: "phone",
|
|
48
48
|
supportsDynamicUi: false,
|
|
@@ -61,7 +61,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
test("blocks ui_update when channel lacks dynamic UI support", async () => {
|
|
64
|
-
const sent:
|
|
64
|
+
const sent: AssistantEvent[] = [];
|
|
65
65
|
const ctx = makeContext(sent, {
|
|
66
66
|
channel: "telegram",
|
|
67
67
|
supportsDynamicUi: false,
|
|
@@ -80,7 +80,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
test("allows Slack ui_show for task_progress card when dynamic UI is otherwise disabled", async () => {
|
|
83
|
-
const sent:
|
|
83
|
+
const sent: AssistantEvent[] = [];
|
|
84
84
|
const ctx = makeContext(sent, {
|
|
85
85
|
channel: "slack",
|
|
86
86
|
supportsDynamicUi: false,
|
|
@@ -110,7 +110,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
110
110
|
});
|
|
111
111
|
|
|
112
112
|
test("blocks Slack ui_show for non-task_progress card when dynamic UI is disabled", async () => {
|
|
113
|
-
const sent:
|
|
113
|
+
const sent: AssistantEvent[] = [];
|
|
114
114
|
const ctx = makeContext(sent, {
|
|
115
115
|
channel: "slack",
|
|
116
116
|
supportsDynamicUi: false,
|
|
@@ -130,7 +130,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
130
130
|
});
|
|
131
131
|
|
|
132
132
|
test("blocks Slack ui_show when normalized card data is not task_progress", async () => {
|
|
133
|
-
const sent:
|
|
133
|
+
const sent: AssistantEvent[] = [];
|
|
134
134
|
const ctx = makeContext(sent, {
|
|
135
135
|
channel: "slack",
|
|
136
136
|
supportsDynamicUi: false,
|
|
@@ -151,7 +151,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
151
151
|
});
|
|
152
152
|
|
|
153
153
|
test("blocks Slack ui_show for non-card task_progress input when dynamic UI is disabled", async () => {
|
|
154
|
-
const sent:
|
|
154
|
+
const sent: AssistantEvent[] = [];
|
|
155
155
|
const ctx = makeContext(sent, {
|
|
156
156
|
channel: "slack",
|
|
157
157
|
supportsDynamicUi: false,
|
|
@@ -171,7 +171,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
171
171
|
});
|
|
172
172
|
|
|
173
173
|
test("ui_show maps legacy top-level task_progress fields into card data", async () => {
|
|
174
|
-
const sent:
|
|
174
|
+
const sent: AssistantEvent[] = [];
|
|
175
175
|
const ctx = makeContext(sent);
|
|
176
176
|
|
|
177
177
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -208,7 +208,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
208
208
|
});
|
|
209
209
|
|
|
210
210
|
test("ui_show fills well-formed templateData for a stepless task_progress card", async () => {
|
|
211
|
-
const sent:
|
|
211
|
+
const sent: AssistantEvent[] = [];
|
|
212
212
|
const ctx = makeContext(sent);
|
|
213
213
|
|
|
214
214
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -237,7 +237,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
237
237
|
});
|
|
238
238
|
|
|
239
239
|
test("ui_show coerces invalid status and malformed steps on a task_progress card", async () => {
|
|
240
|
-
const sent:
|
|
240
|
+
const sent: AssistantEvent[] = [];
|
|
241
241
|
const ctx = makeContext(sent);
|
|
242
242
|
|
|
243
243
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -279,7 +279,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
279
279
|
});
|
|
280
280
|
|
|
281
281
|
test("ui_show normalizes top-level dynamic_page fields into data", async () => {
|
|
282
|
-
const sent:
|
|
282
|
+
const sent: AssistantEvent[] = [];
|
|
283
283
|
const ctx = makeContext(sent);
|
|
284
284
|
|
|
285
285
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -308,7 +308,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
308
308
|
});
|
|
309
309
|
|
|
310
310
|
test("ui_show supports file_upload surfaces directly", async () => {
|
|
311
|
-
const sent:
|
|
311
|
+
const sent: AssistantEvent[] = [];
|
|
312
312
|
const ctx = makeContext(sent);
|
|
313
313
|
|
|
314
314
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -344,7 +344,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
344
344
|
});
|
|
345
345
|
|
|
346
346
|
test("ui_show file_upload normalizes a comma-joined acceptedTypes string", async () => {
|
|
347
|
-
const sent:
|
|
347
|
+
const sent: AssistantEvent[] = [];
|
|
348
348
|
const ctx = makeContext(sent);
|
|
349
349
|
|
|
350
350
|
// The model may emit acceptedTypes as a comma-joined string; the renderer
|
|
@@ -375,7 +375,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
375
375
|
});
|
|
376
376
|
|
|
377
377
|
test("ui_show dynamic_page uses data.html when properly nested", async () => {
|
|
378
|
-
const sent:
|
|
378
|
+
const sent: AssistantEvent[] = [];
|
|
379
379
|
const ctx = makeContext(sent);
|
|
380
380
|
|
|
381
381
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -399,7 +399,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
399
399
|
});
|
|
400
400
|
|
|
401
401
|
test("ui_update normalizes top-level task_progress fields into templateData", async () => {
|
|
402
|
-
const sent:
|
|
402
|
+
const sent: AssistantEvent[] = [];
|
|
403
403
|
const ctx = makeContext(sent);
|
|
404
404
|
const existingCard: CardSurfaceData = {
|
|
405
405
|
title: "Ordering from DoorDash",
|
|
@@ -448,7 +448,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
448
448
|
});
|
|
449
449
|
|
|
450
450
|
test("allows Slack ui_update for stored task_progress card when dynamic UI is disabled", async () => {
|
|
451
|
-
const sent:
|
|
451
|
+
const sent: AssistantEvent[] = [];
|
|
452
452
|
const ctx = makeContext(sent, {
|
|
453
453
|
channel: "slack",
|
|
454
454
|
supportsDynamicUi: false,
|
|
@@ -482,7 +482,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
482
482
|
});
|
|
483
483
|
|
|
484
484
|
test("blocks Slack ui_update when stored surface is not a task_progress card", async () => {
|
|
485
|
-
const sent:
|
|
485
|
+
const sent: AssistantEvent[] = [];
|
|
486
486
|
const ctx = makeContext(sent, {
|
|
487
487
|
channel: "slack",
|
|
488
488
|
supportsDynamicUi: false,
|
|
@@ -505,7 +505,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
505
505
|
});
|
|
506
506
|
|
|
507
507
|
test("blocks Slack ui_update that would convert a plain card to task_progress", async () => {
|
|
508
|
-
const sent:
|
|
508
|
+
const sent: AssistantEvent[] = [];
|
|
509
509
|
const ctx = makeContext(sent, {
|
|
510
510
|
channel: "slack",
|
|
511
511
|
supportsDynamicUi: false,
|
|
@@ -531,7 +531,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
531
531
|
});
|
|
532
532
|
|
|
533
533
|
test("blocks Slack ui_update that would change task_progress card template", async () => {
|
|
534
|
-
const sent:
|
|
534
|
+
const sent: AssistantEvent[] = [];
|
|
535
535
|
const ctx = makeContext(sent, {
|
|
536
536
|
channel: "slack",
|
|
537
537
|
supportsDynamicUi: false,
|
|
@@ -562,7 +562,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
562
562
|
});
|
|
563
563
|
|
|
564
564
|
test("blocks Slack ui_update when the surface is not already stored", async () => {
|
|
565
|
-
const sent:
|
|
565
|
+
const sent: AssistantEvent[] = [];
|
|
566
566
|
const ctx = makeContext(sent, {
|
|
567
567
|
channel: "slack",
|
|
568
568
|
supportsDynamicUi: false,
|
|
@@ -581,7 +581,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
581
581
|
});
|
|
582
582
|
|
|
583
583
|
test("ui_show rejects new interactive surface when a non-dynamic_page pending surface exists", async () => {
|
|
584
|
-
const sent:
|
|
584
|
+
const sent: AssistantEvent[] = [];
|
|
585
585
|
const ctx = makeContext(sent);
|
|
586
586
|
|
|
587
587
|
// Pre-populate a pending table surface (simulates a previously shown interactive surface)
|
|
@@ -603,7 +603,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
603
603
|
});
|
|
604
604
|
|
|
605
605
|
test("ui_show allows new interactive surface when only dynamic_page surfaces are pending", async () => {
|
|
606
|
-
const sent:
|
|
606
|
+
const sent: AssistantEvent[] = [];
|
|
607
607
|
const ctx = makeContext(sent);
|
|
608
608
|
|
|
609
609
|
// dynamic_page pending entries should not block new interactive surfaces
|
|
@@ -622,7 +622,7 @@ describe("task_progress surface compatibility", () => {
|
|
|
622
622
|
});
|
|
623
623
|
|
|
624
624
|
describe("ui_show card content recovery", () => {
|
|
625
|
-
function shownCard(sent:
|
|
625
|
+
function shownCard(sent: AssistantEvent[]): CardSurfaceData | undefined {
|
|
626
626
|
const show = sent.find(
|
|
627
627
|
(m): m is UiSurfaceShow => m.type === "ui_surface_show",
|
|
628
628
|
);
|
|
@@ -633,7 +633,7 @@ describe("ui_show card content recovery", () => {
|
|
|
633
633
|
}
|
|
634
634
|
|
|
635
635
|
test("recovers body from a copy_block-style `text` field", async () => {
|
|
636
|
-
const sent:
|
|
636
|
+
const sent: AssistantEvent[] = [];
|
|
637
637
|
const ctx = makeContext(sent);
|
|
638
638
|
|
|
639
639
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -650,7 +650,7 @@ describe("ui_show card content recovery", () => {
|
|
|
650
650
|
});
|
|
651
651
|
|
|
652
652
|
test("recovers body from a confirmation-style `message` field", async () => {
|
|
653
|
-
const sent:
|
|
653
|
+
const sent: AssistantEvent[] = [];
|
|
654
654
|
const ctx = makeContext(sent);
|
|
655
655
|
|
|
656
656
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -662,7 +662,7 @@ describe("ui_show card content recovery", () => {
|
|
|
662
662
|
});
|
|
663
663
|
|
|
664
664
|
test("recovers top-level subtitle and metadata into the card", async () => {
|
|
665
|
-
const sent:
|
|
665
|
+
const sent: AssistantEvent[] = [];
|
|
666
666
|
const ctx = makeContext(sent);
|
|
667
667
|
|
|
668
668
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -678,7 +678,7 @@ describe("ui_show card content recovery", () => {
|
|
|
678
678
|
});
|
|
679
679
|
|
|
680
680
|
test("title-only card with actions renders with actions intact", async () => {
|
|
681
|
-
const sent:
|
|
681
|
+
const sent: AssistantEvent[] = [];
|
|
682
682
|
const ctx = makeContext(sent);
|
|
683
683
|
|
|
684
684
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -699,7 +699,7 @@ describe("ui_show card content recovery", () => {
|
|
|
699
699
|
});
|
|
700
700
|
|
|
701
701
|
test("title-only card without actions renders without error", async () => {
|
|
702
|
-
const sent:
|
|
702
|
+
const sent: AssistantEvent[] = [];
|
|
703
703
|
const ctx = makeContext(sent);
|
|
704
704
|
|
|
705
705
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -713,7 +713,7 @@ describe("ui_show card content recovery", () => {
|
|
|
713
713
|
});
|
|
714
714
|
|
|
715
715
|
test("card with body and actions is interactive", async () => {
|
|
716
|
-
const sent:
|
|
716
|
+
const sent: AssistantEvent[] = [];
|
|
717
717
|
const ctx = makeContext(sent);
|
|
718
718
|
|
|
719
719
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -734,7 +734,7 @@ describe("ui_show card content recovery", () => {
|
|
|
734
734
|
// ── Body alias recovery from cross-surface keys ────────────────────
|
|
735
735
|
|
|
736
736
|
test("recovers body from choice/form-style `description` field", async () => {
|
|
737
|
-
const sent:
|
|
737
|
+
const sent: AssistantEvent[] = [];
|
|
738
738
|
const ctx = makeContext(sent);
|
|
739
739
|
|
|
740
740
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -749,7 +749,7 @@ describe("ui_show card content recovery", () => {
|
|
|
749
749
|
});
|
|
750
750
|
|
|
751
751
|
test("recovers body from work_result-style `summary` field", async () => {
|
|
752
|
-
const sent:
|
|
752
|
+
const sent: AssistantEvent[] = [];
|
|
753
753
|
const ctx = makeContext(sent);
|
|
754
754
|
|
|
755
755
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -761,7 +761,7 @@ describe("ui_show card content recovery", () => {
|
|
|
761
761
|
});
|
|
762
762
|
|
|
763
763
|
test("recovers body from confirmation-style `detail` field", async () => {
|
|
764
|
-
const sent:
|
|
764
|
+
const sent: AssistantEvent[] = [];
|
|
765
765
|
const ctx = makeContext(sent);
|
|
766
766
|
|
|
767
767
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -773,7 +773,7 @@ describe("ui_show card content recovery", () => {
|
|
|
773
773
|
});
|
|
774
774
|
|
|
775
775
|
test("recovers body from top-level `description`", async () => {
|
|
776
|
-
const sent:
|
|
776
|
+
const sent: AssistantEvent[] = [];
|
|
777
777
|
const ctx = makeContext(sent);
|
|
778
778
|
|
|
779
779
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -787,7 +787,7 @@ describe("ui_show card content recovery", () => {
|
|
|
787
787
|
});
|
|
788
788
|
|
|
789
789
|
test("concatenates multiple body aliases when they co-occur", async () => {
|
|
790
|
-
const sent:
|
|
790
|
+
const sent: AssistantEvent[] = [];
|
|
791
791
|
const ctx = makeContext(sent);
|
|
792
792
|
|
|
793
793
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -809,7 +809,7 @@ describe("ui_show card content recovery", () => {
|
|
|
809
809
|
// ── Title alias recovery ────────────────────────────────────────────
|
|
810
810
|
|
|
811
811
|
test("recovers title from `heading` alias", async () => {
|
|
812
|
-
const sent:
|
|
812
|
+
const sent: AssistantEvent[] = [];
|
|
813
813
|
const ctx = makeContext(sent);
|
|
814
814
|
|
|
815
815
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -821,7 +821,7 @@ describe("ui_show card content recovery", () => {
|
|
|
821
821
|
});
|
|
822
822
|
|
|
823
823
|
test("recovers title from `header` alias", async () => {
|
|
824
|
-
const sent:
|
|
824
|
+
const sent: AssistantEvent[] = [];
|
|
825
825
|
const ctx = makeContext(sent);
|
|
826
826
|
|
|
827
827
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -835,7 +835,7 @@ describe("ui_show card content recovery", () => {
|
|
|
835
835
|
// ── Subtitle alias recovery ─────────────────────────────────────────
|
|
836
836
|
|
|
837
837
|
test("recovers subtitle from `subheading` alias", async () => {
|
|
838
|
-
const sent:
|
|
838
|
+
const sent: AssistantEvent[] = [];
|
|
839
839
|
const ctx = makeContext(sent);
|
|
840
840
|
|
|
841
841
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -847,7 +847,7 @@ describe("ui_show card content recovery", () => {
|
|
|
847
847
|
});
|
|
848
848
|
|
|
849
849
|
test("recovers subtitle from table-style `caption` alias", async () => {
|
|
850
|
-
const sent:
|
|
850
|
+
const sent: AssistantEvent[] = [];
|
|
851
851
|
const ctx = makeContext(sent);
|
|
852
852
|
|
|
853
853
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -861,7 +861,7 @@ describe("ui_show card content recovery", () => {
|
|
|
861
861
|
// ── Alias precedence ───────────────────────────────────────────────
|
|
862
862
|
|
|
863
863
|
test("canonical `body` takes precedence over aliased `description`", async () => {
|
|
864
|
-
const sent:
|
|
864
|
+
const sent: AssistantEvent[] = [];
|
|
865
865
|
const ctx = makeContext(sent);
|
|
866
866
|
|
|
867
867
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -873,7 +873,7 @@ describe("ui_show card content recovery", () => {
|
|
|
873
873
|
});
|
|
874
874
|
|
|
875
875
|
test("card with recovered `description` and actions keeps actions (has content)", async () => {
|
|
876
|
-
const sent:
|
|
876
|
+
const sent: AssistantEvent[] = [];
|
|
877
877
|
const ctx = makeContext(sent);
|
|
878
878
|
|
|
879
879
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -892,7 +892,7 @@ describe("ui_show card content recovery", () => {
|
|
|
892
892
|
});
|
|
893
893
|
|
|
894
894
|
test("recovers actions nested inside data when top-level actions is absent", async () => {
|
|
895
|
-
const sent:
|
|
895
|
+
const sent: AssistantEvent[] = [];
|
|
896
896
|
const ctx = makeContext(sent);
|
|
897
897
|
|
|
898
898
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -914,7 +914,7 @@ describe("ui_show card content recovery", () => {
|
|
|
914
914
|
});
|
|
915
915
|
|
|
916
916
|
test("top-level actions take precedence over data.actions", async () => {
|
|
917
|
-
const sent:
|
|
917
|
+
const sent: AssistantEvent[] = [];
|
|
918
918
|
const ctx = makeContext(sent);
|
|
919
919
|
|
|
920
920
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -935,7 +935,7 @@ describe("ui_show card content recovery", () => {
|
|
|
935
935
|
});
|
|
936
936
|
|
|
937
937
|
test("genuinely empty card (no title, body, subtitle, metadata, template, or actions) is rejected", async () => {
|
|
938
|
-
const sent:
|
|
938
|
+
const sent: AssistantEvent[] = [];
|
|
939
939
|
const ctx = makeContext(sent);
|
|
940
940
|
|
|
941
941
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -949,7 +949,7 @@ describe("ui_show card content recovery", () => {
|
|
|
949
949
|
});
|
|
950
950
|
|
|
951
951
|
test("a card with a real body broadcasts unchanged", async () => {
|
|
952
|
-
const sent:
|
|
952
|
+
const sent: AssistantEvent[] = [];
|
|
953
953
|
const ctx = makeContext(sent);
|
|
954
954
|
|
|
955
955
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -961,7 +961,7 @@ describe("ui_show card content recovery", () => {
|
|
|
961
961
|
});
|
|
962
962
|
|
|
963
963
|
test("a task_progress card with empty data broadcasts (template renders a shell)", async () => {
|
|
964
|
-
const sent:
|
|
964
|
+
const sent: AssistantEvent[] = [];
|
|
965
965
|
const ctx = makeContext(sent);
|
|
966
966
|
|
|
967
967
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { afterAll, beforeEach, describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
+
import type { AssistantEventEnvelope } from "../api/index.js";
|
|
3
4
|
import {
|
|
4
5
|
conversationMetadataSyncTag,
|
|
5
6
|
SYNC_TAGS,
|
|
@@ -14,7 +15,6 @@ import {
|
|
|
14
15
|
} from "../persistence/conversation-crud.js";
|
|
15
16
|
import { getDb } from "../persistence/db-connection.js";
|
|
16
17
|
import { initializeDb } from "../persistence/db-init.js";
|
|
17
|
-
import type { AssistantEvent } from "../runtime/assistant-event.js";
|
|
18
18
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
19
19
|
import { ROUTES as CONVERSATION_LIST_ROUTES } from "../runtime/routes/conversation-list-routes.js";
|
|
20
20
|
import { ROUTES as CONVERSATION_MANAGEMENT_ROUTES } from "../runtime/routes/conversation-management-routes.js";
|
|
@@ -50,8 +50,8 @@ function findRoute(
|
|
|
50
50
|
async function captureEvents(
|
|
51
51
|
action: () => void | Promise<unknown>,
|
|
52
52
|
expectedCount: number,
|
|
53
|
-
): Promise<
|
|
54
|
-
const received:
|
|
53
|
+
): Promise<AssistantEventEnvelope[]> {
|
|
54
|
+
const received: AssistantEventEnvelope[] = [];
|
|
55
55
|
const subscription = assistantEventHub.subscribe({
|
|
56
56
|
type: "process",
|
|
57
57
|
callback: (event) => {
|
|
@@ -371,7 +371,7 @@ describe("conversation sync tags", () => {
|
|
|
371
371
|
JSON.stringify([{ type: "text", text: "first" }]),
|
|
372
372
|
);
|
|
373
373
|
|
|
374
|
-
const received:
|
|
374
|
+
const received: AssistantEventEnvelope[] = [];
|
|
375
375
|
const subscription = assistantEventHub.subscribe({
|
|
376
376
|
type: "process",
|
|
377
377
|
callback: (event) => {
|
|
@@ -404,7 +404,7 @@ describe("conversation sync tags", () => {
|
|
|
404
404
|
// messages advance the attention cursor via projectAssistantMessage.
|
|
405
405
|
const conversation = createConversation("User message");
|
|
406
406
|
|
|
407
|
-
const received:
|
|
407
|
+
const received: AssistantEventEnvelope[] = [];
|
|
408
408
|
const subscription = assistantEventHub.subscribe({
|
|
409
409
|
type: "process",
|
|
410
410
|
callback: (event) => {
|
|
@@ -12,7 +12,7 @@ import { describe, expect, mock, test } from "bun:test";
|
|
|
12
12
|
|
|
13
13
|
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
14
14
|
import type { AgentEvent } from "../agent/loop.js";
|
|
15
|
-
import type {
|
|
15
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
16
16
|
import type { Message, ProviderResponse } from "../providers/types.js";
|
|
17
17
|
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
@@ -195,7 +195,7 @@ function makeConversation(): Conversation {
|
|
|
195
195
|
`conv-wait-for-idle-${conversationSeq}`,
|
|
196
196
|
makeProvider(),
|
|
197
197
|
"system prompt",
|
|
198
|
-
(_msg:
|
|
198
|
+
(_msg: AssistantEvent) => {},
|
|
199
199
|
"/tmp",
|
|
200
200
|
{ maxTokens: 4096 },
|
|
201
201
|
);
|
|
@@ -90,10 +90,6 @@ mock.module("../memory/query-builder.js", () => ({
|
|
|
90
90
|
buildMemoryQuery: () => "",
|
|
91
91
|
}));
|
|
92
92
|
|
|
93
|
-
mock.module("../plugins/defaults/memory/retrieval-budget.js", () => ({
|
|
94
|
-
computeRecallBudget: () => 0,
|
|
95
|
-
}));
|
|
96
|
-
|
|
97
93
|
mock.module("../plugins/defaults/compaction/window-manager.js", () => ({
|
|
98
94
|
ContextWindowManager: class {
|
|
99
95
|
estimateInputTokens() {
|
|
@@ -106,9 +106,6 @@ mock.module("../memory/retriever.js", () => ({
|
|
|
106
106
|
mock.module("../memory/query-builder.js", () => ({
|
|
107
107
|
buildMemoryQuery: () => "",
|
|
108
108
|
}));
|
|
109
|
-
mock.module("../plugins/defaults/memory/retrieval-budget.js", () => ({
|
|
110
|
-
computeRecallBudget: () => 0,
|
|
111
|
-
}));
|
|
112
109
|
mock.module("../plugins/defaults/compaction/window-manager.js", () => ({
|
|
113
110
|
ContextWindowManager: class {
|
|
114
111
|
estimateInputTokens() {
|
|
@@ -103,9 +103,6 @@ mock.module("../memory/retriever.js", () => ({
|
|
|
103
103
|
mock.module("../memory/query-builder.js", () => ({
|
|
104
104
|
buildMemoryQuery: () => "",
|
|
105
105
|
}));
|
|
106
|
-
mock.module("../plugins/defaults/memory/retrieval-budget.js", () => ({
|
|
107
|
-
computeRecallBudget: () => 0,
|
|
108
|
-
}));
|
|
109
106
|
mock.module("../plugins/defaults/compaction/window-manager.js", () => ({
|
|
110
107
|
ContextWindowManager: class {
|
|
111
108
|
estimateInputTokens() {
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests for the trusted contact lifecycle fallback copy templates.
|
|
3
3
|
*
|
|
4
|
-
* Verifies that `ingress.trusted_contact.guardian_decision`
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* for raw user IDs on the Slack source channel.
|
|
4
|
+
* Verifies that the `ingress.trusted_contact.guardian_decision` template in
|
|
5
|
+
* copy-composer.ts renders display names when available and falls back to
|
|
6
|
+
* Slack <@ID> mention format for raw user IDs on the Slack source channel.
|
|
8
7
|
*/
|
|
9
8
|
import { describe, expect, test } from "bun:test";
|
|
10
9
|
|
|
@@ -42,35 +41,6 @@ function buildGuardianDecisionSignal(
|
|
|
42
41
|
};
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
function buildDeniedSignal(
|
|
46
|
-
payloadOverrides: Record<string, unknown> = {},
|
|
47
|
-
sourceChannel: "slack" | "telegram" | "vellum" = "slack",
|
|
48
|
-
): NotificationSignal {
|
|
49
|
-
return {
|
|
50
|
-
signalId: "test-signal-denied",
|
|
51
|
-
createdAt: Date.now(),
|
|
52
|
-
sourceChannel,
|
|
53
|
-
sourceContextId: "test-ctx-2",
|
|
54
|
-
sourceEventName: "ingress.trusted_contact.denied",
|
|
55
|
-
contextPayload: {
|
|
56
|
-
sourceChannel,
|
|
57
|
-
requesterExternalUserId: "U07CLDQ4TB3",
|
|
58
|
-
requesterChatId: "D0AQ9C5PPPF",
|
|
59
|
-
decidedByExternalUserId: "U099H19C0KA",
|
|
60
|
-
requesterDisplayName: null,
|
|
61
|
-
decidedByDisplayName: null,
|
|
62
|
-
decision: "denied",
|
|
63
|
-
...payloadOverrides,
|
|
64
|
-
},
|
|
65
|
-
attentionHints: {
|
|
66
|
-
requiresAction: false,
|
|
67
|
-
urgency: "low",
|
|
68
|
-
isAsyncBackground: false,
|
|
69
|
-
visibleInSourceNow: false,
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
44
|
// ── guardian_decision template ────────────────────────────────────────────────
|
|
75
45
|
|
|
76
46
|
describe("guardian_decision fallback copy", () => {
|
|
@@ -252,101 +222,3 @@ describe("guardian_decision fallback copy", () => {
|
|
|
252
222
|
);
|
|
253
223
|
});
|
|
254
224
|
});
|
|
255
|
-
|
|
256
|
-
// ── denied template ──────────────────────────────────────────────────────────
|
|
257
|
-
|
|
258
|
-
describe("trusted_contact.denied fallback copy", () => {
|
|
259
|
-
test("uses display name when present", () => {
|
|
260
|
-
const signal = buildDeniedSignal({
|
|
261
|
-
requesterDisplayName: "Alice",
|
|
262
|
-
});
|
|
263
|
-
const result = composeFallbackCopy(signal, ["vellum"]);
|
|
264
|
-
const copy = result.vellum!;
|
|
265
|
-
|
|
266
|
-
expect(copy.title).toBe("Trusted Contact Denied");
|
|
267
|
-
expect(copy.body).toBe(
|
|
268
|
-
"A trusted contact request from Alice has been denied.",
|
|
269
|
-
);
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
test("falls back to Slack <@ID> mention format on Slack when display name absent", () => {
|
|
273
|
-
const signal = buildDeniedSignal({
|
|
274
|
-
requesterDisplayName: null,
|
|
275
|
-
requesterExternalUserId: "U07CLDQ4TB3",
|
|
276
|
-
sourceChannel: "slack",
|
|
277
|
-
});
|
|
278
|
-
const result = composeFallbackCopy(signal, ["vellum"]);
|
|
279
|
-
const copy = result.vellum!;
|
|
280
|
-
|
|
281
|
-
expect(copy.body).toBe(
|
|
282
|
-
"A trusted contact request from <@U07CLDQ4TB3> has been denied.",
|
|
283
|
-
);
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
test("uses raw user ID without Slack formatting on non-Slack channels", () => {
|
|
287
|
-
const signal = buildDeniedSignal(
|
|
288
|
-
{
|
|
289
|
-
requesterDisplayName: null,
|
|
290
|
-
requesterExternalUserId: "U07CLDQ4TB3",
|
|
291
|
-
sourceChannel: "telegram",
|
|
292
|
-
},
|
|
293
|
-
"telegram",
|
|
294
|
-
);
|
|
295
|
-
const result = composeFallbackCopy(signal, ["vellum"]);
|
|
296
|
-
const copy = result.vellum!;
|
|
297
|
-
|
|
298
|
-
expect(copy.body).toBe(
|
|
299
|
-
"A trusted contact request from U07CLDQ4TB3 has been denied.",
|
|
300
|
-
);
|
|
301
|
-
expect(copy.body).not.toContain("<@");
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
test("falls back to 'Someone' when requester identity is absent", () => {
|
|
305
|
-
const signal = buildDeniedSignal({
|
|
306
|
-
requesterDisplayName: null,
|
|
307
|
-
requesterExternalUserId: null,
|
|
308
|
-
});
|
|
309
|
-
const result = composeFallbackCopy(signal, ["vellum"]);
|
|
310
|
-
const copy = result.vellum!;
|
|
311
|
-
|
|
312
|
-
expect(copy.body).toBe(
|
|
313
|
-
"A trusted contact request from Someone has been denied.",
|
|
314
|
-
);
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
test("does not expose raw conversation IDs (requesterChatId) in output", () => {
|
|
318
|
-
const signal = buildDeniedSignal({
|
|
319
|
-
requesterDisplayName: null,
|
|
320
|
-
requesterExternalUserId: "U07CLDQ4TB3",
|
|
321
|
-
requesterChatId: "D0AQ9C5PPPF",
|
|
322
|
-
});
|
|
323
|
-
const result = composeFallbackCopy(signal, ["vellum"]);
|
|
324
|
-
const copy = result.vellum!;
|
|
325
|
-
|
|
326
|
-
expect(copy.body).not.toContain("D0AQ9C5PPPF");
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
test("sanitizes control characters from display names", () => {
|
|
330
|
-
const signal = buildDeniedSignal({
|
|
331
|
-
requesterDisplayName: "Alice\x00\x07\nEvil",
|
|
332
|
-
});
|
|
333
|
-
const result = composeFallbackCopy(signal, ["vellum"]);
|
|
334
|
-
const copy = result.vellum!;
|
|
335
|
-
|
|
336
|
-
expect(copy.body).not.toMatch(/[\x00-\x1f\x7f-\x9f]/);
|
|
337
|
-
expect(copy.body).toContain("Alice");
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
test("clamps excessively long display names", () => {
|
|
341
|
-
const longName = "A".repeat(200);
|
|
342
|
-
const signal = buildDeniedSignal({
|
|
343
|
-
requesterDisplayName: longName,
|
|
344
|
-
});
|
|
345
|
-
const result = composeFallbackCopy(signal, ["vellum"]);
|
|
346
|
-
const copy = result.vellum!;
|
|
347
|
-
|
|
348
|
-
// sanitizeIdentityField clamps to 120 chars + ellipsis
|
|
349
|
-
expect(copy.body.length).toBeLessThan(longName.length);
|
|
350
|
-
expect(copy.body).toContain("…");
|
|
351
|
-
});
|
|
352
|
-
});
|
|
@@ -170,6 +170,7 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
|
|
|
170
170
|
"messaging/providers/slack/api.ts", // Slack Web API client (bot token for direct sends)
|
|
171
171
|
"messaging/providers/telegram-bot/api.ts", // Telegram Bot API client (bot token for direct sends)
|
|
172
172
|
"runtime/channel-readiness-service.ts", // channel readiness probes for Telegram connectivity
|
|
173
|
+
"telegram/webhook-health.ts", // Telegram webhook health sweep — reads bot_token to call getWebhookInfo (Bot API authenticates via the token in the URL path) and checks webhook_secret for existence only; neither value is logged, persisted, or returned
|
|
173
174
|
"messaging/providers/whatsapp/adapter.ts", // WhatsApp credential lookup for connectivity check
|
|
174
175
|
"messaging/providers/whatsapp/api.ts", // WhatsApp Cloud API client (bot token for direct sends)
|
|
175
176
|
"messaging/providers/slack/adapter.ts", // Slack bot token lookup for Socket Mode connectivity check
|