@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
package/src/tools/acp/status.ts
CHANGED
|
@@ -1,11 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { getAcpSessionManager } from "../../acp/index.js";
|
|
4
|
+
import {
|
|
5
|
+
invalidToolInputResult,
|
|
6
|
+
nullAsOmitted,
|
|
7
|
+
} from "../shared/zod-tool-schema.js";
|
|
2
8
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
3
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Model-input schema, `safeParse`d at the top of {@link executeAcpStatus}.
|
|
12
|
+
* Same in-tool pattern and TOOLS.json drift guard as the other bundled-skill
|
|
13
|
+
* tools.
|
|
14
|
+
*/
|
|
15
|
+
export const acpStatusInputSchema = z.looseObject({
|
|
16
|
+
acp_session_id: nullAsOmitted(z.string()),
|
|
17
|
+
});
|
|
18
|
+
|
|
4
19
|
export async function executeAcpStatus(
|
|
5
20
|
input: Record<string, unknown>,
|
|
6
21
|
_context: ToolContext,
|
|
7
22
|
): Promise<ToolExecutionResult> {
|
|
8
|
-
const
|
|
23
|
+
const parsedInput = acpStatusInputSchema.safeParse(input);
|
|
24
|
+
if (!parsedInput.success) {
|
|
25
|
+
return invalidToolInputResult("acp_status", parsedInput.error);
|
|
26
|
+
}
|
|
27
|
+
const acpSessionId = parsedInput.data.acp_session_id;
|
|
9
28
|
const manager = getAcpSessionManager();
|
|
10
29
|
|
|
11
30
|
try {
|
|
@@ -195,3 +195,23 @@ describe("executeAcpSteer", () => {
|
|
|
195
195
|
expect(result.content).toContain("is not running");
|
|
196
196
|
});
|
|
197
197
|
});
|
|
198
|
+
|
|
199
|
+
describe("acp tools — model-input schema validation (LUM-2856)", () => {
|
|
200
|
+
test("steer rejects a non-string acp_session_id", async () => {
|
|
201
|
+
const result = await executeAcpSteer(
|
|
202
|
+
{ acp_session_id: 42, instruction: "redirect" },
|
|
203
|
+
makeContext(),
|
|
204
|
+
);
|
|
205
|
+
expect(result.isError).toBe(true);
|
|
206
|
+
expect(result.content).toContain('Invalid input for tool "acp_steer"');
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test("steer treats explicit null instruction as missing (bespoke error)", async () => {
|
|
210
|
+
const result = await executeAcpSteer(
|
|
211
|
+
{ acp_session_id: "acp-1", instruction: null },
|
|
212
|
+
makeContext(),
|
|
213
|
+
);
|
|
214
|
+
expect(result.isError).toBe(true);
|
|
215
|
+
expect(result.content).toContain('"instruction" is required');
|
|
216
|
+
});
|
|
217
|
+
});
|
package/src/tools/acp/steer.ts
CHANGED
|
@@ -1,17 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { getAcpSessionManager } from "../../acp/index.js";
|
|
4
|
+
import {
|
|
5
|
+
invalidToolInputResult,
|
|
6
|
+
nullAsOmitted,
|
|
7
|
+
} from "../shared/zod-tool-schema.js";
|
|
2
8
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
3
9
|
import { getSendToClient } from "./context.js";
|
|
4
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Model-input schema, `safeParse`d at the top of {@link executeAcpSteer}.
|
|
13
|
+
* Same in-tool pattern and TOOLS.json drift guard as the other bundled-skill
|
|
14
|
+
* tools. The bespoke required checks keep their (test-asserted) messages for
|
|
15
|
+
* the missing/null/empty cases.
|
|
16
|
+
*/
|
|
17
|
+
export const acpSteerInputSchema = z.looseObject({
|
|
18
|
+
acp_session_id: nullAsOmitted(z.string()),
|
|
19
|
+
instruction: nullAsOmitted(z.string()),
|
|
20
|
+
});
|
|
21
|
+
|
|
5
22
|
export async function executeAcpSteer(
|
|
6
23
|
input: Record<string, unknown>,
|
|
7
24
|
context: ToolContext,
|
|
8
25
|
): Promise<ToolExecutionResult> {
|
|
9
|
-
const
|
|
26
|
+
const parsedInput = acpSteerInputSchema.safeParse(input);
|
|
27
|
+
if (!parsedInput.success) {
|
|
28
|
+
return invalidToolInputResult("acp_steer", parsedInput.error);
|
|
29
|
+
}
|
|
30
|
+
const acpSessionId = parsedInput.data.acp_session_id;
|
|
10
31
|
if (!acpSessionId) {
|
|
11
32
|
return { content: '"acp_session_id" is required.', isError: true };
|
|
12
33
|
}
|
|
13
34
|
|
|
14
|
-
const instruction =
|
|
35
|
+
const instruction = parsedInput.data.instruction;
|
|
15
36
|
if (!instruction) {
|
|
16
37
|
return { content: '"instruction" is required.', isError: true };
|
|
17
38
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
isDirectAppConversation,
|
|
3
|
+
listAppsByConversation,
|
|
4
|
+
} from "../../apps/app-store.js";
|
|
2
5
|
|
|
3
6
|
/**
|
|
4
7
|
* Resolve the `app_id` an app-builder tool should operate on.
|
|
@@ -14,6 +17,12 @@ import { listAppsByConversation } from "../../apps/app-store.js";
|
|
|
14
17
|
* Returns `null` when no app_id is supplied and the conversation has no app, so
|
|
15
18
|
* callers can surface an actionable error instead of a raw store throw.
|
|
16
19
|
*
|
|
20
|
+
* Apps a conversation only inherited — created by a background subagent that
|
|
21
|
+
* forked from it — rank behind its own. Without that, a background
|
|
22
|
+
* continuation's freshly created app sits at the head of the parent thread's
|
|
23
|
+
* list and captures a foreground `app_update` that omitted `app_id`, writing to
|
|
24
|
+
* an app the user is not looking at.
|
|
25
|
+
*
|
|
17
26
|
* Not used for destructive operations (`app_delete`): deleting an inferred app
|
|
18
27
|
* is unsafe, so deletion requires an explicit id.
|
|
19
28
|
*/
|
|
@@ -25,9 +34,12 @@ export function resolveAppId(
|
|
|
25
34
|
return input.app_id;
|
|
26
35
|
}
|
|
27
36
|
// `listAppsByConversation` preserves `listApps`' updatedAt-descending order,
|
|
28
|
-
// so the first entry is the app the model is actively working on.
|
|
37
|
+
// so the first direct entry is the app the model is actively working on.
|
|
29
38
|
const apps = listAppsByConversation(conversationId);
|
|
30
|
-
|
|
39
|
+
const direct = apps.find((app) =>
|
|
40
|
+
isDirectAppConversation(app, conversationId),
|
|
41
|
+
);
|
|
42
|
+
return (direct ?? apps[0])?.id ?? null;
|
|
31
43
|
}
|
|
32
44
|
|
|
33
45
|
/** Error payload returned when no app_id is supplied and none can be inferred. */
|
|
@@ -342,6 +342,71 @@ describe("AskQuestionTool text fallback (supportsDynamicUi === false)", () => {
|
|
|
342
342
|
expect(calls).toHaveLength(0);
|
|
343
343
|
expect(result.content.toLowerCase()).toContain("no interactive user");
|
|
344
344
|
});
|
|
345
|
+
|
|
346
|
+
test("parks a single guardian question on a card-capable channel", async () => {
|
|
347
|
+
setNextResult(singleCompleted({ decision: "option", optionId: "a" }));
|
|
348
|
+
|
|
349
|
+
// A guardian's single-question turn on a channel with a card-rendering
|
|
350
|
+
// notification adapter parks on the prompter: the guardian-request
|
|
351
|
+
// pipeline delivers it as a tappable card, so falling back to text would
|
|
352
|
+
// regress it to an untappable message.
|
|
353
|
+
await askQuestionTool.execute(
|
|
354
|
+
validInput,
|
|
355
|
+
makeContext({
|
|
356
|
+
supportsDynamicUi: false,
|
|
357
|
+
supportsGuardianQuestionCards: true,
|
|
358
|
+
trustClass: "guardian",
|
|
359
|
+
}),
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
expect(calls).toHaveLength(1);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
test("text fallback when the channel has no question-card delivery", async () => {
|
|
366
|
+
const result = await askQuestionTool.execute(
|
|
367
|
+
validInput,
|
|
368
|
+
makeContext({
|
|
369
|
+
supportsDynamicUi: false,
|
|
370
|
+
supportsGuardianQuestionCards: false,
|
|
371
|
+
trustClass: "guardian",
|
|
372
|
+
}),
|
|
373
|
+
);
|
|
374
|
+
|
|
375
|
+
expect(calls).toHaveLength(0);
|
|
376
|
+
expect(result.content.toLowerCase()).toContain("plain-text");
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
test("text fallback for a non-guardian channel turn even with card delivery", async () => {
|
|
380
|
+
// The pipeline delivers cards to the guardian; a non-guardian chatter
|
|
381
|
+
// would never see one, so their turn degrades to text.
|
|
382
|
+
const result = await askQuestionTool.execute(
|
|
383
|
+
validInput,
|
|
384
|
+
makeContext({
|
|
385
|
+
supportsDynamicUi: false,
|
|
386
|
+
supportsGuardianQuestionCards: true,
|
|
387
|
+
trustClass: "trusted_contact",
|
|
388
|
+
}),
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
expect(calls).toHaveLength(0);
|
|
392
|
+
expect(result.content.toLowerCase()).toContain("plain-text");
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
test("text fallback for a multi-question batch on a channel", async () => {
|
|
396
|
+
// One card carries one answer; multi-question batches stay text on
|
|
397
|
+
// channels (the app card still handles them when dynamic UI is present).
|
|
398
|
+
const result = await askQuestionTool.execute(
|
|
399
|
+
{ questions: [singleQ, { ...singleQ, question: "Which size?" }] },
|
|
400
|
+
makeContext({
|
|
401
|
+
supportsDynamicUi: false,
|
|
402
|
+
supportsGuardianQuestionCards: true,
|
|
403
|
+
trustClass: "guardian",
|
|
404
|
+
}),
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
expect(calls).toHaveLength(0);
|
|
408
|
+
expect(result.content.toLowerCase()).toContain("plain-text");
|
|
409
|
+
});
|
|
345
410
|
});
|
|
346
411
|
|
|
347
412
|
describe("formatQuestionsAsTextFallback", () => {
|
|
@@ -2,6 +2,10 @@ import { z } from "zod";
|
|
|
2
2
|
|
|
3
3
|
import { QuestionPrompter } from "../../permissions/question-prompter.js";
|
|
4
4
|
import { RiskLevel } from "../../permissions/types.js";
|
|
5
|
+
import {
|
|
6
|
+
invalidToolInputResult,
|
|
7
|
+
toToolInputSchema,
|
|
8
|
+
} from "../shared/zod-tool-schema.js";
|
|
5
9
|
import type {
|
|
6
10
|
ToolContext,
|
|
7
11
|
ToolDefinition,
|
|
@@ -9,15 +13,21 @@ import type {
|
|
|
9
13
|
} from "../types.js";
|
|
10
14
|
|
|
11
15
|
// ── Input schema ────────────────────────────────────────────────────
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// (The codebase does not currently use zod-to-json-schema for tool defs,
|
|
15
|
-
// so the two are kept in sync manually.)
|
|
16
|
+
// One Zod source for both runtime validation (via `TOOL_INPUT_SCHEMAS`)
|
|
17
|
+
// and the LLM-facing `input_schema` (derived with `toToolInputSchema`).
|
|
16
18
|
|
|
17
19
|
const OptionSchema = z.object({
|
|
18
|
-
id: z
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
id: z
|
|
21
|
+
.string()
|
|
22
|
+
.min(1)
|
|
23
|
+
.describe(
|
|
24
|
+
"Stable identifier for this option (returned verbatim in the response).",
|
|
25
|
+
),
|
|
26
|
+
label: z.string().min(1).describe("Short human-readable label."),
|
|
27
|
+
description: z
|
|
28
|
+
.string()
|
|
29
|
+
.describe("Optional one-line context shown beneath the label.")
|
|
30
|
+
.optional(),
|
|
21
31
|
});
|
|
22
32
|
|
|
23
33
|
// One question in a (possibly single-element) batch. Intentionally has no
|
|
@@ -26,13 +36,27 @@ const OptionSchema = z.object({
|
|
|
26
36
|
// smaller and removes a validation surface (no duplicate-id check, no
|
|
27
37
|
// length cap on ids).
|
|
28
38
|
const SingleQuestionSchema = z.object({
|
|
29
|
-
question: z.string().min(1),
|
|
30
|
-
description: z
|
|
39
|
+
question: z.string().min(1).describe("The clarifying question to display."),
|
|
40
|
+
description: z
|
|
41
|
+
.string()
|
|
42
|
+
.describe("Optional one-line context shown beneath the question.")
|
|
43
|
+
.optional(),
|
|
31
44
|
// 2–4 LLM-supplied options. The client renders a fixed 5th "Type
|
|
32
45
|
// something else" slot for free-text, so the model must keep the
|
|
33
46
|
// structured set to 4 or fewer.
|
|
34
|
-
options: z
|
|
35
|
-
|
|
47
|
+
options: z
|
|
48
|
+
.array(OptionSchema)
|
|
49
|
+
.min(2)
|
|
50
|
+
.max(4)
|
|
51
|
+
.describe(
|
|
52
|
+
"2–4 structured options. The UI always appends a free-text fallback slot, so do not include a 'something else' option here.",
|
|
53
|
+
),
|
|
54
|
+
freeTextPlaceholder: z
|
|
55
|
+
.string()
|
|
56
|
+
.describe(
|
|
57
|
+
"Optional placeholder text shown inside the free-text fallback input.",
|
|
58
|
+
)
|
|
59
|
+
.optional(),
|
|
36
60
|
});
|
|
37
61
|
|
|
38
62
|
// Cap at 5 questions per batch. Past that it starts to feel like a form,
|
|
@@ -41,18 +65,22 @@ const SingleQuestionSchema = z.object({
|
|
|
41
65
|
const MAX_QUESTIONS_PER_BATCH = 5;
|
|
42
66
|
|
|
43
67
|
// Callers pass a (possibly single-element) batch of questions. `execute()`
|
|
44
|
-
// forwards them straight to the prompter.
|
|
45
|
-
|
|
68
|
+
// forwards them straight to the prompter. Loose so injected fields (e.g.
|
|
69
|
+
// `activity`) never fail validation.
|
|
70
|
+
export const askQuestionInputSchema = z.looseObject({
|
|
46
71
|
questions: z
|
|
47
72
|
.array(SingleQuestionSchema)
|
|
48
73
|
.min(1)
|
|
49
74
|
.max(MAX_QUESTIONS_PER_BATCH, {
|
|
50
75
|
message: `At most ${MAX_QUESTIONS_PER_BATCH} questions per batch; split into multiple turns if you need more.`,
|
|
51
|
-
})
|
|
76
|
+
})
|
|
77
|
+
.describe(
|
|
78
|
+
`1–${MAX_QUESTIONS_PER_BATCH} clarifying questions to ask in a single turn. Use a batch when several independent ambiguities block progress; ask one at a time when they're sequentially dependent. Past ${MAX_QUESTIONS_PER_BATCH} questions you should be implementing, not asking.`,
|
|
79
|
+
),
|
|
52
80
|
});
|
|
53
81
|
|
|
54
82
|
export type SingleQuestion = z.infer<typeof SingleQuestionSchema>;
|
|
55
|
-
export type AskQuestionInput = z.infer<typeof
|
|
83
|
+
export type AskQuestionInput = z.infer<typeof askQuestionInputSchema>;
|
|
56
84
|
|
|
57
85
|
// ── Tool description ────────────────────────────────────────────────
|
|
58
86
|
|
|
@@ -92,27 +120,6 @@ const DESCRIPTION = [
|
|
|
92
120
|
"context shown beneath the label.",
|
|
93
121
|
].join("\n");
|
|
94
122
|
|
|
95
|
-
// Option-schema fragment for the items in `questions[].options`.
|
|
96
|
-
const OPTION_ITEMS_SCHEMA = {
|
|
97
|
-
type: "object",
|
|
98
|
-
properties: {
|
|
99
|
-
id: {
|
|
100
|
-
type: "string",
|
|
101
|
-
description:
|
|
102
|
-
"Stable identifier for this option (returned verbatim in the response).",
|
|
103
|
-
},
|
|
104
|
-
label: {
|
|
105
|
-
type: "string",
|
|
106
|
-
description: "Short human-readable label.",
|
|
107
|
-
},
|
|
108
|
-
description: {
|
|
109
|
-
type: "string",
|
|
110
|
-
description: "Optional one-line context shown beneath the label.",
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
required: ["id", "label"],
|
|
114
|
-
} as const;
|
|
115
|
-
|
|
116
123
|
// ── Text fallback for channels without dynamic UI ───────────────────
|
|
117
124
|
|
|
118
125
|
/**
|
|
@@ -168,57 +175,15 @@ export const askQuestionTool = {
|
|
|
168
175
|
category: "interaction",
|
|
169
176
|
executionTarget: "sandbox",
|
|
170
177
|
defaultRiskLevel: RiskLevel.Low,
|
|
171
|
-
input_schema:
|
|
172
|
-
type: "object",
|
|
173
|
-
properties: {
|
|
174
|
-
questions: {
|
|
175
|
-
type: "array",
|
|
176
|
-
minItems: 1,
|
|
177
|
-
maxItems: MAX_QUESTIONS_PER_BATCH,
|
|
178
|
-
description: `1–${MAX_QUESTIONS_PER_BATCH} clarifying questions to ask in a single turn. Use a batch when several independent ambiguities block progress; ask one at a time when they're sequentially dependent. Past ${MAX_QUESTIONS_PER_BATCH} questions you should be implementing, not asking.`,
|
|
179
|
-
items: {
|
|
180
|
-
type: "object",
|
|
181
|
-
properties: {
|
|
182
|
-
question: {
|
|
183
|
-
type: "string",
|
|
184
|
-
description: "The clarifying question to display.",
|
|
185
|
-
},
|
|
186
|
-
description: {
|
|
187
|
-
type: "string",
|
|
188
|
-
description:
|
|
189
|
-
"Optional one-line context shown beneath the question.",
|
|
190
|
-
},
|
|
191
|
-
options: {
|
|
192
|
-
type: "array",
|
|
193
|
-
minItems: 2,
|
|
194
|
-
maxItems: 4,
|
|
195
|
-
description:
|
|
196
|
-
"2–4 structured options. The UI always appends a free-text fallback slot, so do not include a 'something else' option here.",
|
|
197
|
-
items: OPTION_ITEMS_SCHEMA,
|
|
198
|
-
},
|
|
199
|
-
freeTextPlaceholder: {
|
|
200
|
-
type: "string",
|
|
201
|
-
description:
|
|
202
|
-
"Optional placeholder text shown inside the free-text fallback input.",
|
|
203
|
-
},
|
|
204
|
-
},
|
|
205
|
-
required: ["question", "options"],
|
|
206
|
-
},
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
required: ["questions"],
|
|
210
|
-
},
|
|
178
|
+
input_schema: toToolInputSchema(askQuestionInputSchema),
|
|
211
179
|
|
|
212
180
|
async execute(
|
|
213
181
|
input: Record<string, unknown>,
|
|
214
182
|
context: ToolContext,
|
|
215
183
|
): Promise<ToolExecutionResult> {
|
|
216
|
-
const parsed =
|
|
184
|
+
const parsed = askQuestionInputSchema.safeParse(input);
|
|
217
185
|
if (!parsed.success) {
|
|
218
|
-
return
|
|
219
|
-
content: `Invalid input: ${parsed.error.message}`,
|
|
220
|
-
isError: true,
|
|
221
|
-
};
|
|
186
|
+
return invalidToolInputResult("ask_question", parsed.error);
|
|
222
187
|
}
|
|
223
188
|
|
|
224
189
|
const questions: SingleQuestion[] = parsed.data.questions;
|
|
@@ -236,17 +201,28 @@ export const askQuestionTool = {
|
|
|
236
201
|
};
|
|
237
202
|
}
|
|
238
203
|
|
|
239
|
-
//
|
|
240
|
-
//
|
|
241
|
-
//
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
//
|
|
248
|
-
//
|
|
249
|
-
|
|
204
|
+
// Channel turns (no dynamic UI) park only when the question can reach the
|
|
205
|
+
// user as a guardian-request card with tappable options: a single-question
|
|
206
|
+
// batch, asked by the guardian, on a channel whose notification adapter
|
|
207
|
+
// renders card actions. The prompter's promotion then delivers the card
|
|
208
|
+
// through the guardian-request pipeline, and a tap / request-code reply /
|
|
209
|
+
// bare-text answer resolves the parked prompt.
|
|
210
|
+
//
|
|
211
|
+
// Every other channel turn degrades to text: hand the model the formatted
|
|
212
|
+
// question(s) and options to present in its reply — which IS what gets
|
|
213
|
+
// delivered to the channel — and wait for a free-text answer. Mirrors the
|
|
214
|
+
// isInteractive guard above: return immediately instead of parking on a
|
|
215
|
+
// prompt the surface can't answer. (UI surface tools like ui_show are
|
|
216
|
+
// instead dropped from the wire for these channels; ask_question stays
|
|
217
|
+
// available because a question with options reads cleanly as text.)
|
|
218
|
+
const canDeliverGuardianQuestionCard =
|
|
219
|
+
questions.length === 1 &&
|
|
220
|
+
context.trustClass === "guardian" &&
|
|
221
|
+
context.supportsGuardianQuestionCards === true;
|
|
222
|
+
if (
|
|
223
|
+
context.supportsDynamicUi === false &&
|
|
224
|
+
!canDeliverGuardianQuestionCard
|
|
225
|
+
) {
|
|
250
226
|
return {
|
|
251
227
|
content: formatQuestionsAsTextFallback(questions),
|
|
252
228
|
isError: false,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AssistantEvent } from "../../api/index.js";
|
|
2
2
|
import { browserManager } from "./browser-manager.js";
|
|
3
3
|
|
|
4
4
|
// Track which conversations have an active browser page.
|
|
5
5
|
const activeBrowserConversations = new Set<string>();
|
|
6
6
|
|
|
7
7
|
// Registry of sendToClient callbacks per conversation
|
|
8
|
-
const conversationSenders = new Map<string, (msg:
|
|
8
|
+
const conversationSenders = new Map<string, (msg: AssistantEvent) => void>();
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Register a sendToClient callback for a conversation.
|
|
@@ -13,7 +13,7 @@ const conversationSenders = new Map<string, (msg: ServerMessage) => void>();
|
|
|
13
13
|
*/
|
|
14
14
|
export function registerConversationSender(
|
|
15
15
|
conversationId: string,
|
|
16
|
-
sendToClient: (msg:
|
|
16
|
+
sendToClient: (msg: AssistantEvent) => void,
|
|
17
17
|
): void {
|
|
18
18
|
conversationSenders.set(conversationId, sendToClient);
|
|
19
19
|
}
|
|
@@ -27,12 +27,12 @@ export function unregisterConversationSender(conversationId: string): void {
|
|
|
27
27
|
|
|
28
28
|
function getSender(
|
|
29
29
|
conversationId: string,
|
|
30
|
-
): ((msg:
|
|
30
|
+
): ((msg: AssistantEvent) => void) | undefined {
|
|
31
31
|
return conversationSenders.get(conversationId);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export async function ensureScreencast(conversationId: string): Promise<void> {
|
|
35
|
-
if (activeBrowserConversations.has(conversationId)) return;
|
|
35
|
+
if (activeBrowserConversations.has(conversationId)) {return;}
|
|
36
36
|
|
|
37
37
|
activeBrowserConversations.add(conversationId);
|
|
38
38
|
|
|
@@ -49,7 +49,7 @@ export async function ensureScreencast(conversationId: string): Promise<void> {
|
|
|
49
49
|
export async function stopBrowserScreencast(
|
|
50
50
|
conversationId: string,
|
|
51
51
|
): Promise<void> {
|
|
52
|
-
if (!activeBrowserConversations.has(conversationId)) return;
|
|
52
|
+
if (!activeBrowserConversations.has(conversationId)) {return;}
|
|
53
53
|
|
|
54
54
|
// Safe no-op if CDP screencast was never started
|
|
55
55
|
await browserManager.stopScreencast(conversationId);
|
|
@@ -1,19 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { cancelCall } from "../../calls/call-domain.js";
|
|
4
|
+
import {
|
|
5
|
+
invalidToolInputResult,
|
|
6
|
+
nullAsOmitted,
|
|
7
|
+
} from "../shared/zod-tool-schema.js";
|
|
2
8
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
3
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Model-input schema, `safeParse`d at the top of {@link executeCallEnd}.
|
|
12
|
+
* Same in-tool pattern and TOOLS.json drift guard as the other bundled-skill
|
|
13
|
+
* tools. The bespoke required check below keeps its error message for the
|
|
14
|
+
* missing/null/empty cases.
|
|
15
|
+
*/
|
|
16
|
+
export const callEndInputSchema = z.looseObject({
|
|
17
|
+
call_session_id: nullAsOmitted(z.string()),
|
|
18
|
+
end_reason: nullAsOmitted(z.string()),
|
|
19
|
+
});
|
|
20
|
+
|
|
4
21
|
export async function executeCallEnd(
|
|
5
22
|
input: Record<string, unknown>,
|
|
6
23
|
_context: ToolContext,
|
|
7
24
|
): Promise<ToolExecutionResult> {
|
|
8
|
-
const
|
|
9
|
-
if (!
|
|
25
|
+
const parsedInput = callEndInputSchema.safeParse(input);
|
|
26
|
+
if (!parsedInput.success) {
|
|
27
|
+
return invalidToolInputResult("call_end", parsedInput.error);
|
|
28
|
+
}
|
|
29
|
+
const callSessionId = parsedInput.data.call_session_id;
|
|
30
|
+
if (!callSessionId) {
|
|
10
31
|
return {
|
|
11
32
|
content: "Error: call_session_id is required and must be a string",
|
|
12
33
|
isError: true,
|
|
13
34
|
};
|
|
14
35
|
}
|
|
15
36
|
|
|
16
|
-
const reason =
|
|
37
|
+
const reason = parsedInput.data.end_reason;
|
|
17
38
|
|
|
18
39
|
const result = await cancelCall({ callSessionId, reason });
|
|
19
40
|
|
|
@@ -1,9 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { startCall } from "../../calls/call-domain.js";
|
|
2
4
|
import { findActiveSession } from "../../channels/gateway-verification-sessions.js";
|
|
3
5
|
import { getConfig } from "../../config/loader.js";
|
|
4
6
|
import { normalizePhoneNumber } from "../../util/phone.js";
|
|
7
|
+
import {
|
|
8
|
+
invalidToolInputResult,
|
|
9
|
+
nullAsOmitted,
|
|
10
|
+
} from "../shared/zod-tool-schema.js";
|
|
5
11
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
6
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Model-input schema, `safeParse`d at the top of {@link executeCallStart}.
|
|
15
|
+
* Same in-tool pattern and TOOLS.json drift guard as the other bundled-skill
|
|
16
|
+
* tools — see the schema block in `tools/document/document-tool.ts` for the
|
|
17
|
+
* framework. The advertised-required fields are required here — schema
|
|
18
|
+
* rejection is the only guard between a mistyped `phone_number`/`task` and
|
|
19
|
+
* `startCall`. `skip_disclosure` (deliberate `=== true` coercion) is
|
|
20
|
+
* UNDECLARED — loose passthrough.
|
|
21
|
+
*/
|
|
22
|
+
export const callStartInputSchema = z.looseObject({
|
|
23
|
+
phone_number: z.string(),
|
|
24
|
+
task: z.string(),
|
|
25
|
+
context: nullAsOmitted(z.string()),
|
|
26
|
+
caller_identity_mode: nullAsOmitted(
|
|
27
|
+
z.enum(["assistant_number", "user_number"]),
|
|
28
|
+
),
|
|
29
|
+
});
|
|
30
|
+
|
|
7
31
|
export async function executeCallStart(
|
|
8
32
|
input: Record<string, unknown>,
|
|
9
33
|
context: ToolContext,
|
|
@@ -16,10 +40,13 @@ export async function executeCallStart(
|
|
|
16
40
|
};
|
|
17
41
|
}
|
|
18
42
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
43
|
+
const parsedInput = callStartInputSchema.safeParse(input);
|
|
44
|
+
if (!parsedInput.success) {
|
|
45
|
+
return invalidToolInputResult("call_start", parsedInput.error);
|
|
46
|
+
}
|
|
47
|
+
const parsed = parsedInput.data;
|
|
48
|
+
|
|
49
|
+
const requestedPhone = normalizePhoneNumber(parsed.phone_number);
|
|
23
50
|
if (requestedPhone) {
|
|
24
51
|
const activeVoiceVerification = await findActiveSession("phone");
|
|
25
52
|
const verificationDestination =
|
|
@@ -37,15 +64,12 @@ export async function executeCallStart(
|
|
|
37
64
|
}
|
|
38
65
|
|
|
39
66
|
const result = await startCall({
|
|
40
|
-
phoneNumber:
|
|
41
|
-
task:
|
|
42
|
-
context:
|
|
67
|
+
phoneNumber: parsed.phone_number,
|
|
68
|
+
task: parsed.task,
|
|
69
|
+
context: parsed.context,
|
|
43
70
|
conversationId: context.conversationId,
|
|
44
71
|
assistantId: context.assistantId,
|
|
45
|
-
callerIdentityMode:
|
|
46
|
-
| "assistant_number"
|
|
47
|
-
| "user_number"
|
|
48
|
-
| undefined,
|
|
72
|
+
callerIdentityMode: parsed.caller_identity_mode,
|
|
49
73
|
skipDisclosure: input.skip_disclosure === true,
|
|
50
74
|
});
|
|
51
75
|
|
|
@@ -1,11 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { getCallStatus } from "../../calls/call-domain.js";
|
|
4
|
+
import {
|
|
5
|
+
invalidToolInputResult,
|
|
6
|
+
nullAsOmitted,
|
|
7
|
+
} from "../shared/zod-tool-schema.js";
|
|
2
8
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
3
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Model-input schema, `safeParse`d at the top of {@link executeCallStatus}.
|
|
12
|
+
* Same in-tool pattern and TOOLS.json drift guard as the other bundled-skill
|
|
13
|
+
* tools.
|
|
14
|
+
*/
|
|
15
|
+
export const callStatusInputSchema = z.looseObject({
|
|
16
|
+
call_session_id: nullAsOmitted(z.string()),
|
|
17
|
+
});
|
|
18
|
+
|
|
4
19
|
export async function executeCallStatus(
|
|
5
20
|
input: Record<string, unknown>,
|
|
6
21
|
context: ToolContext,
|
|
7
22
|
): Promise<ToolExecutionResult> {
|
|
8
|
-
const
|
|
23
|
+
const parsedInput = callStatusInputSchema.safeParse(input);
|
|
24
|
+
if (!parsedInput.success) {
|
|
25
|
+
return invalidToolInputResult("call_status", parsedInput.error);
|
|
26
|
+
}
|
|
27
|
+
const callSessionId = parsedInput.data.call_session_id;
|
|
9
28
|
|
|
10
29
|
const result = getCallStatus(callSessionId, context.conversationId);
|
|
11
30
|
|