@vellumai/assistant 0.4.26 → 0.4.29
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/.env.example +2 -2
- package/AGENTS.md +5 -0
- package/ARCHITECTURE.md +169 -69
- package/Dockerfile +1 -1
- package/README.md +111 -112
- package/bun.lock +0 -3
- package/docs/architecture/integrations.md +0 -1
- package/docs/architecture/memory.md +100 -63
- package/docs/error-handling.md +71 -0
- package/docs/runbook-trusted-contacts.md +10 -9
- package/docs/trusted-contact-access.md +48 -46
- package/package.json +3 -3
- package/scripts/compare-benchmarks.sh +12 -5
- package/scripts/ipc/check-swift-decoder-drift.ts +3 -0
- package/scripts/test.sh +89 -5
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +46 -0
- package/src/__tests__/access-request-decision.test.ts +0 -1
- package/src/__tests__/account-registry.test.ts +1 -1
- package/src/__tests__/actor-token-service.test.ts +36 -23
- package/src/__tests__/agent-loop-thinking.test.ts +29 -13
- package/src/__tests__/agent-loop.test.ts +2 -1
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -1
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/asset-materialize-tool.test.ts +7 -7
- package/src/__tests__/asset-search-tool.test.ts +7 -7
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +217 -0
- package/src/__tests__/call-controller.test.ts +99 -69
- package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +113 -70
- package/src/__tests__/channel-guardian.test.ts +173 -282
- package/src/__tests__/channel-readiness-service.test.ts +6 -2
- package/src/__tests__/channel-reply-delivery.test.ts +2 -2
- package/src/__tests__/channel-retry-sweep.test.ts +14 -14
- package/src/__tests__/checker.test.ts +12 -31
- package/src/__tests__/claude-code-tool-profiles.test.ts +1 -1
- package/src/__tests__/commit-message-enrichment-service.test.ts +67 -59
- package/src/__tests__/compaction.benchmark.test.ts +6 -2
- package/src/__tests__/computer-use-tools.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +66 -7
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -29
- package/src/__tests__/contacts-tools.test.ts +63 -2
- package/src/__tests__/context-overflow-approval.test.ts +141 -0
- package/src/__tests__/context-overflow-policy.test.ts +171 -0
- package/src/__tests__/context-overflow-reducer.test.ts +533 -0
- package/src/__tests__/context-window-manager.test.ts +97 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +38 -46
- package/src/__tests__/conversation-pairing.test.ts +2 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +214 -10
- package/src/__tests__/conversation-routes.test.ts +4 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +13 -2
- package/src/__tests__/credential-security-e2e.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/credential-vault-unit.test.ts +1 -1
- package/src/__tests__/credential-vault.test.ts +11 -8
- package/src/__tests__/daemon-lifecycle.test.ts +2 -2
- package/src/__tests__/daemon-server-session-init.test.ts +6 -6
- package/src/__tests__/delete-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +4 -0
- package/src/__tests__/encrypted-store.test.ts +10 -7
- package/src/__tests__/ephemeral-permissions.test.ts +3 -3
- package/src/__tests__/file-edit-tool.test.ts +1 -1
- package/src/__tests__/file-read-tool.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +1 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +87 -64
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +37 -31
- package/src/__tests__/fixtures/mock-signup-server.ts +171 -115
- package/src/__tests__/fixtures/proxy-fixtures.ts +39 -39
- package/src/__tests__/followup-tools.test.ts +1 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -0
- package/src/__tests__/guardian-actions-endpoint.test.ts +543 -1
- package/src/__tests__/guardian-control-plane-policy.test.ts +15 -15
- package/src/__tests__/guardian-dispatch.test.ts +79 -1
- package/src/__tests__/guardian-grant-minting.test.ts +14 -14
- package/src/__tests__/guardian-outbound-http.test.ts +1 -2
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -41
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -5
- package/src/__tests__/guardian-routing-state.test.ts +36 -52
- package/src/__tests__/guardian-verification-intent-routing.test.ts +4 -6
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
- package/src/__tests__/handle-user-message-secret-resume.test.ts +39 -1
- package/src/__tests__/handlers-cu-observation-blob.test.ts +21 -10
- package/src/__tests__/handlers-telegram-config.test.ts +14 -14
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +23 -2
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +1 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
- package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +45 -2
- package/src/__tests__/host-file-edit-tool.test.ts +1 -1
- package/src/__tests__/host-file-read-tool.test.ts +1 -1
- package/src/__tests__/host-file-write-tool.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/inbound-invite-redemption.test.ts +16 -18
- package/src/__tests__/ingress-reconcile.test.ts +2 -2
- package/src/__tests__/ingress-routes-http.test.ts +2 -1
- package/src/__tests__/integrations-cli.test.ts +256 -0
- package/src/__tests__/intent-routing.test.ts +4 -5
- package/src/__tests__/invite-redemption-service.test.ts +4 -3
- package/src/__tests__/ipc-snapshot.test.ts +28 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -1
- package/src/__tests__/mcp-cli.test.ts +136 -57
- package/src/__tests__/mcp-client-auth.test.ts +95 -0
- package/src/__tests__/media-generate-image.test.ts +2 -2
- package/src/__tests__/media-reuse-story.e2e.test.ts +8 -8
- package/src/__tests__/memory-regressions.test.ts +6 -6
- package/src/__tests__/messaging-send-tool.test.ts +1 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +1855 -0
- package/src/__tests__/migration-export-http.test.ts +540 -0
- package/src/__tests__/migration-import-commit-http.test.ts +823 -0
- package/src/__tests__/migration-import-preflight-http.test.ts +755 -0
- package/src/__tests__/migration-parity-persistence.test.ts +1854 -0
- package/src/__tests__/migration-transport.test.ts +904 -0
- package/src/__tests__/migration-validate-http.test.ts +698 -0
- package/src/__tests__/migration-wizard.test.ts +1289 -0
- package/src/__tests__/non-member-access-request.test.ts +17 -17
- package/src/__tests__/notification-decision-strategy.test.ts +110 -2
- package/src/__tests__/notification-deep-link.test.ts +18 -0
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +1 -1
- package/src/__tests__/playbook-execution.test.ts +1 -1
- package/src/__tests__/playbook-tools.test.ts +1 -1
- package/src/__tests__/provider-streaming.benchmark.test.ts +3 -1
- package/src/__tests__/proxy-approval-callback.test.ts +1 -1
- package/src/__tests__/qdrant-manager.test.ts +40 -11
- package/src/__tests__/rebind-secrets-screen.test.ts +839 -0
- package/src/__tests__/recording-handler.test.ts +2 -2
- package/src/__tests__/recording-intent-handler.test.ts +3 -3
- package/src/__tests__/recording-state-machine.test.ts +2 -2
- package/src/__tests__/relay-server.test.ts +506 -227
- package/src/__tests__/reminder-store.test.ts +8 -0
- package/src/__tests__/reminder.test.ts +8 -0
- package/src/__tests__/{resolve-guardian-trust-class.test.ts → resolve-trust-class.test.ts} +11 -17
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +1 -1
- package/src/__tests__/schedule-tools.test.ts +1 -1
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +2 -3
- package/src/__tests__/script-proxy-decision-trace.test.ts +2 -2
- package/src/__tests__/script-proxy-http-forwarder.test.ts +1 -1
- package/src/__tests__/script-proxy-injection-runtime.test.ts +5 -5
- package/src/__tests__/script-proxy-mitm-handler.test.ts +4 -4
- package/src/__tests__/script-proxy-policy-runtime.test.ts +2 -2
- package/src/__tests__/script-proxy-policy.test.ts +2 -2
- package/src/__tests__/script-proxy-session-manager.test.ts +4 -7
- package/src/__tests__/script-proxy-session-runtime.test.ts +1 -6
- package/src/__tests__/secret-onetime-send.test.ts +4 -4
- package/src/__tests__/secret-scanner-executor.test.ts +2 -2
- package/src/__tests__/send-endpoint-busy.test.ts +11 -9
- package/src/__tests__/send-notification-tool.test.ts +2 -2
- package/src/__tests__/session-abort-tool-results.test.ts +17 -2
- package/src/__tests__/session-agent-loop.test.ts +456 -35
- package/src/__tests__/session-confirmation-signals.test.ts +3 -2
- package/src/__tests__/session-conflict-gate.test.ts +20 -3
- package/src/__tests__/session-init.benchmark.test.ts +2 -2
- package/src/__tests__/session-load-history-repair.test.ts +7 -7
- package/src/__tests__/session-pre-run-repair.test.ts +17 -2
- package/src/__tests__/session-profile-injection.test.ts +20 -3
- package/src/__tests__/session-provider-retry-repair.test.ts +86 -6
- package/src/__tests__/session-queue.test.ts +33 -18
- package/src/__tests__/session-runtime-assembly.test.ts +147 -1
- package/src/__tests__/session-runtime-workspace.test.ts +40 -0
- package/src/__tests__/session-slash-known.test.ts +21 -3
- package/src/__tests__/session-slash-queue.test.ts +17 -2
- package/src/__tests__/session-slash-unknown.test.ts +17 -2
- package/src/__tests__/session-surfaces-deselection.test.ts +208 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +2 -2
- package/src/__tests__/session-workspace-injection.test.ts +17 -2
- package/src/__tests__/session-workspace-tool-tracking.test.ts +17 -2
- package/src/__tests__/shell-credential-ref.test.ts +1 -1
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -1
- package/src/__tests__/skill-load-tool.test.ts +1 -1
- package/src/__tests__/skill-script-runner-host.test.ts +1 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -1
- package/src/__tests__/skill-script-runner.test.ts +1 -1
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/slack-skill.test.ts +3 -2
- package/src/__tests__/subagent-tools.test.ts +3 -3
- package/src/__tests__/swarm-recursion.test.ts +1 -1
- package/src/__tests__/swarm-session-integration.test.ts +1 -1
- package/src/__tests__/swarm-tool.test.ts +1 -1
- package/src/__tests__/task-management-tools.test.ts +1 -1
- package/src/__tests__/task-tools.test.ts +1 -1
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/test-support/browser-skill-harness.ts +39 -27
- package/src/__tests__/test-support/computer-use-skill-harness.ts +14 -14
- package/src/__tests__/tool-approval-handler.test.ts +15 -15
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +23 -182
- package/src/__tests__/tool-grant-request-escalation.test.ts +11 -11
- package/src/__tests__/tool-permission-simulate-handler.test.ts +4 -4
- package/src/__tests__/transfer-progress-screen.test.ts +1180 -0
- package/src/__tests__/trust-context-guards.test.ts +25 -29
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +23 -21
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +37 -40
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +29 -25
- package/src/__tests__/trusted-contact-multichannel.test.ts +25 -24
- package/src/__tests__/trusted-contact-verification.test.ts +63 -77
- package/src/__tests__/turn-commit.test.ts +18 -18
- package/src/__tests__/twilio-provider.test.ts +7 -7
- package/src/__tests__/validation-results-screen.test.ts +1107 -0
- package/src/__tests__/view-image-tool.test.ts +1 -1
- package/src/__tests__/voice-invite-redemption.test.ts +3 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +12 -12
- package/src/__tests__/voice-session-bridge.test.ts +24 -24
- package/src/agent/attachments.ts +3 -1
- package/src/agent/loop.ts +13 -13
- package/src/agent/message-types.ts +13 -7
- package/src/amazon/cart.ts +59 -32
- package/src/amazon/checkout.ts +25 -14
- package/src/amazon/client.ts +68 -48
- package/src/amazon/product-details.ts +3 -3
- package/src/amazon/request-extractor.ts +46 -31
- package/src/amazon/search.ts +6 -4
- package/src/amazon/session.ts +33 -24
- package/src/approvals/AGENTS.md +26 -0
- package/src/approvals/approval-primitive.ts +87 -64
- package/src/approvals/guardian-decision-primitive.ts +172 -81
- package/src/approvals/guardian-request-resolvers.ts +262 -155
- package/src/autonomy/autonomy-resolver.ts +7 -5
- package/src/autonomy/autonomy-store.ts +34 -19
- package/src/autonomy/disposition-mapper.ts +5 -5
- package/src/autonomy/index.ts +6 -6
- package/src/autonomy/types.ts +7 -3
- package/src/browser-extension-relay/client.ts +50 -19
- package/src/browser-extension-relay/protocol.ts +11 -11
- package/src/browser-extension-relay/server.ts +45 -20
- package/src/bundler/app-bundler.ts +75 -50
- package/src/bundler/bundle-scanner.ts +145 -41
- package/src/bundler/bundle-signer.ts +16 -14
- package/src/bundler/signature-verifier.ts +36 -33
- package/src/calls/call-constants.ts +10 -3
- package/src/calls/call-controller.ts +473 -214
- package/src/calls/call-conversation-messages.ts +25 -15
- package/src/calls/call-domain.ts +401 -148
- package/src/calls/call-pointer-message-composer.ts +26 -21
- package/src/calls/call-pointer-messages.ts +52 -28
- package/src/calls/call-recovery.ts +53 -37
- package/src/calls/call-state-machine.ts +37 -7
- package/src/calls/call-state.ts +35 -13
- package/src/calls/call-store.ts +165 -77
- package/src/calls/elevenlabs-client.ts +39 -20
- package/src/calls/guardian-action-sweep.ts +42 -24
- package/src/calls/guardian-dispatch.ts +79 -56
- package/src/calls/guardian-question-copy.ts +28 -23
- package/src/calls/relay-server.ts +1121 -532
- package/src/calls/speaker-identification.ts +21 -15
- package/src/calls/twilio-config.ts +34 -17
- package/src/calls/twilio-provider.ts +108 -55
- package/src/calls/twilio-rest.ts +212 -100
- package/src/calls/twilio-routes.ts +165 -92
- package/src/calls/types.ts +55 -7
- package/src/calls/voice-quality.ts +6 -4
- package/src/calls/voice-session-bridge.ts +181 -133
- package/src/channels/config.ts +17 -13
- package/src/channels/types.ts +38 -10
- package/src/cli/amazon.ts +333 -227
- package/src/cli/config-commands.ts +236 -146
- package/src/cli/core-commands.ts +403 -329
- package/src/cli/email-guardrails.ts +38 -19
- package/src/cli/email.ts +207 -153
- package/src/cli/influencer.ts +58 -56
- package/src/cli/integrations.ts +362 -0
- package/src/cli/ipc-client.ts +24 -19
- package/src/cli/map.ts +176 -129
- package/src/cli/mcp.ts +260 -152
- package/src/cli/sequence.ts +165 -107
- package/src/cli/twitter.ts +302 -218
- package/src/cli.ts +418 -279
- package/src/commands/cc-command-registry.ts +52 -27
- package/src/config/agent-schema.ts +217 -134
- package/src/config/assistant-feature-flags.ts +23 -18
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +19 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +7 -4
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +6 -3
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +6 -3
- package/src/config/bundled-skills/browser/tools/browser-click.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-close.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-type.ts +5 -2
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +13 -6
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +5 -2
- package/src/config/bundled-skills/claude-code/TOOLS.json +4 -0
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +5 -2
- package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +10 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +6 -3
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +6 -3
- package/src/config/bundled-skills/configure-settings/SKILL.md +28 -14
- package/src/config/bundled-skills/contacts/SKILL.md +446 -15
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +99 -20
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +74 -17
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +89 -26
- package/src/config/bundled-skills/document/tools/document-create.ts +5 -2
- package/src/config/bundled-skills/document/tools/document-update.ts +5 -2
- package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -7
- package/src/config/bundled-skills/email-setup/SKILL.md +9 -9
- package/src/config/bundled-skills/followups/tools/followup-create.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-list.ts +5 -2
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +5 -2
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +44 -32
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +11 -5
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +13 -7
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +28 -12
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +6 -4
- package/src/config/bundled-skills/google-calendar/types.ts +3 -3
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +46 -24
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +36 -19
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +60 -35
- package/src/config/bundled-skills/mcp-setup/SKILL.md +75 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +55 -15
- package/src/config/bundled-skills/media-processing/TOOLS.json +20 -2
- package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +12 -10
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +34 -19
- package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +82 -66
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +148 -0
- package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +8 -3
- package/src/config/bundled-skills/media-processing/services/gemini-map.ts +117 -53
- package/src/config/bundled-skills/media-processing/services/gemini-video.ts +273 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +185 -97
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +32 -27
- package/src/config/bundled-skills/media-processing/services/reduce.ts +101 -24
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +121 -55
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +58 -24
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +177 -91
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +98 -70
- package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +59 -19
- package/src/config/bundled-skills/media-processing/tools/media-status.ts +26 -10
- package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +29 -14
- package/src/config/bundled-skills/messaging/SKILL.md +7 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +7 -7
- package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +16 -10
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +18 -9
- package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +23 -16
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +28 -12
- package/src/config/bundled-skills/messaging/tools/gmail-filters.ts +41 -21
- package/src/config/bundled-skills/messaging/tools/gmail-follow-up.ts +44 -23
- package/src/config/bundled-skills/messaging/tools/gmail-forward.ts +73 -33
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +22 -14
- package/src/config/bundled-skills/messaging/tools/gmail-outreach-scan.ts +99 -50
- package/src/config/bundled-skills/messaging/tools/gmail-send-draft.ts +14 -8
- package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +63 -44
- package/src/config/bundled-skills/messaging/tools/gmail-sender-digest.ts +90 -46
- package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +43 -22
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +15 -9
- package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +51 -22
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +62 -26
- package/src/config/bundled-skills/messaging/tools/gmail-vacation.ts +34 -19
- package/src/config/bundled-skills/messaging/tools/google-contacts.ts +32 -16
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +91 -47
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +21 -9
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +9 -3
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +30 -17
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +16 -5
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +63 -36
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +10 -4
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +30 -12
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +48 -29
- package/src/config/bundled-skills/messaging/tools/scan-result-store.ts +20 -6
- package/src/config/bundled-skills/messaging/tools/send-notification.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/sequence-analytics.ts +59 -22
- package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +13 -7
- package/src/config/bundled-skills/messaging/tools/sequence-create.ts +27 -12
- package/src/config/bundled-skills/messaging/tools/sequence-delete.ts +14 -6
- package/src/config/bundled-skills/messaging/tools/sequence-enroll.ts +30 -11
- package/src/config/bundled-skills/messaging/tools/sequence-enrollment-list.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-get.ts +31 -13
- package/src/config/bundled-skills/messaging/tools/sequence-import.ts +38 -22
- package/src/config/bundled-skills/messaging/tools/sequence-list.ts +16 -7
- package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +29 -10
- package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +16 -8
- package/src/config/bundled-skills/messaging/tools/sequence-update.ts +35 -16
- package/src/config/bundled-skills/messaging/tools/shared.ts +26 -12
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +69 -34
- package/src/config/bundled-skills/notifications/tools/shared.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +46 -48
- package/src/config/bundled-skills/phone-calls/tools/call-end.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-start.ts +1 -1
- package/src/config/bundled-skills/phone-calls/tools/call-status.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +91 -51
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +30 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +66 -27
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +89 -42
- package/src/config/bundled-skills/public-ingress/SKILL.md +26 -19
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +5 -2
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +5 -2
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +5 -2
- package/src/config/bundled-skills/screen-recording/SKILL.md +11 -3
- package/src/config/bundled-skills/self-upgrade/SKILL.md +9 -8
- package/src/config/bundled-skills/slack/TOOLS.json +33 -15
- package/src/config/bundled-skills/slack/tools/shared.ts +7 -5
- package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-configure-channels.ts +46 -16
- package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +11 -5
- package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +28 -0
- package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +12 -6
- package/src/config/bundled-skills/sms-setup/SKILL.md +5 -8
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +5 -2
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-list.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-run.ts +5 -2
- package/src/config/bundled-skills/tasks/tools/task-save.ts +5 -2
- package/src/config/bundled-skills/telegram-setup/SKILL.md +7 -8
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +232 -127
- package/src/config/bundled-skills/twilio-setup/SKILL.md +7 -12
- package/src/config/bundled-skills/twitter/SKILL.md +19 -2
- package/src/config/bundled-skills/voice-setup/SKILL.md +5 -5
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +5 -2
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +5 -2
- package/src/config/bundled-skills/weather/tools/get-weather.ts +5 -2
- package/src/config/calls-schema.ts +108 -63
- package/src/config/computer-use-prompt.ts +7 -7
- package/src/config/core-schema.ts +239 -155
- package/src/config/defaults.ts +2 -2
- package/src/config/elevenlabs-schema.ts +15 -15
- package/src/config/env-registry.ts +33 -33
- package/src/config/feature-flag-registry.json +31 -7
- package/src/config/loader.ts +118 -58
- package/src/config/mcp-schema.ts +29 -15
- package/src/config/memory-schema.ts +434 -229
- package/src/config/notifications-schema.ts +4 -4
- package/src/config/sandbox-schema.ts +2 -2
- package/src/config/schema.ts +12 -2
- package/src/config/skill-state.ts +27 -15
- package/src/config/skills-schema.ts +72 -23
- package/src/config/skills.ts +303 -143
- package/src/config/system-prompt.ts +25 -6
- package/src/config/types.ts +1 -1
- package/src/config/update-bulletin-format.ts +3 -3
- package/src/config/update-bulletin-state.ts +15 -6
- package/src/config/update-bulletin-template-path.ts +8 -4
- package/src/config/update-bulletin.ts +33 -14
- package/src/config/user-reference.ts +8 -8
- package/src/contacts/contact-events.ts +21 -0
- package/src/contacts/contact-store.ts +622 -100
- package/src/contacts/contacts-write.ts +287 -0
- package/src/contacts/index.ts +13 -4
- package/src/contacts/startup-migration.ts +21 -0
- package/src/contacts/types.ts +47 -2
- package/src/context/token-estimator.ts +54 -31
- package/src/context/tool-result-truncation.ts +41 -7
- package/src/context/window-manager.ts +225 -120
- package/src/daemon/approval-generators.ts +83 -55
- package/src/daemon/approved-devices-store.ts +33 -20
- package/src/daemon/assistant-attachments.ts +134 -98
- package/src/daemon/auth-manager.ts +17 -15
- package/src/daemon/classifier.ts +117 -46
- package/src/daemon/computer-use-session.ts +316 -187
- package/src/daemon/config-watcher.ts +91 -44
- package/src/daemon/connection-policy.ts +18 -10
- package/src/daemon/context-overflow-approval.ts +48 -0
- package/src/daemon/context-overflow-policy.ts +50 -0
- package/src/daemon/context-overflow-reducer.ts +300 -0
- package/src/daemon/daemon-control.ts +79 -51
- package/src/daemon/date-context.ts +119 -69
- package/src/daemon/dictation-profile-store.ts +94 -48
- package/src/daemon/dictation-text-processing.ts +33 -12
- package/src/daemon/doordash-steps.ts +92 -49
- package/src/daemon/guardian-action-generators.ts +62 -46
- package/src/daemon/guardian-verification-intent.ts +31 -18
- package/src/daemon/handlers/apps.ts +257 -111
- package/src/daemon/handlers/avatar.ts +20 -15
- package/src/daemon/handlers/computer-use.ts +82 -39
- package/src/daemon/handlers/config-channels.ts +146 -69
- package/src/daemon/handlers/config-heartbeat.ts +114 -59
- package/src/daemon/handlers/config-inbox.ts +277 -106
- package/src/daemon/handlers/config-ingress.ts +127 -55
- package/src/daemon/handlers/config-integrations.ts +145 -88
- package/src/daemon/handlers/config-model.ts +58 -22
- package/src/daemon/handlers/config-platform.ts +40 -16
- package/src/daemon/handlers/config-scheduling.ts +109 -48
- package/src/daemon/handlers/config-slack-channel.ts +67 -35
- package/src/daemon/handlers/config-slack.ts +21 -20
- package/src/daemon/handlers/config-telegram.ts +100 -70
- package/src/daemon/handlers/config-tools.ts +103 -55
- package/src/daemon/handlers/config-trust.ts +50 -20
- package/src/daemon/handlers/config.ts +72 -24
- package/src/daemon/handlers/contacts.ts +163 -0
- package/src/daemon/handlers/diagnostics.ts +90 -48
- package/src/daemon/handlers/documents.ts +74 -46
- package/src/daemon/handlers/guardian-actions.ts +118 -71
- package/src/daemon/handlers/home-base.ts +19 -16
- package/src/daemon/handlers/identity.ts +65 -45
- package/src/daemon/handlers/index.ts +78 -54
- package/src/daemon/handlers/misc.ts +664 -234
- package/src/daemon/handlers/navigate-settings.ts +14 -11
- package/src/daemon/handlers/oauth-connect.ts +48 -35
- package/src/daemon/handlers/open-bundle-handler.ts +31 -24
- package/src/daemon/handlers/pairing.ts +51 -25
- package/src/daemon/handlers/publish.ts +55 -33
- package/src/daemon/handlers/recording.ts +378 -162
- package/src/daemon/handlers/sessions.ts +923 -423
- package/src/daemon/handlers/shared.ts +202 -117
- package/src/daemon/handlers/signing.ts +25 -6
- package/src/daemon/handlers/subagents.ts +117 -56
- package/src/daemon/handlers/twitter-auth.ts +70 -49
- package/src/daemon/handlers/work-items.ts +264 -112
- package/src/daemon/handlers/workspace-files.ts +27 -20
- package/src/daemon/handlers.ts +2 -2
- package/src/daemon/history-repair.ts +16 -15
- package/src/daemon/identity-helpers.ts +4 -4
- package/src/daemon/install-cli-launchers.ts +33 -22
- package/src/daemon/ipc-blob-store.ts +38 -24
- package/src/daemon/ipc-contract/apps.ts +61 -49
- package/src/daemon/ipc-contract/computer-use.ts +47 -37
- package/src/daemon/ipc-contract/contacts.ts +69 -0
- package/src/daemon/ipc-contract/diagnostics.ts +14 -14
- package/src/daemon/ipc-contract/documents.ts +8 -8
- package/src/daemon/ipc-contract/guardian-actions.ts +4 -4
- package/src/daemon/ipc-contract/inbox.ts +16 -16
- package/src/daemon/ipc-contract/integrations.ts +57 -44
- package/src/daemon/ipc-contract/memory.ts +3 -5
- package/src/daemon/ipc-contract/messages.ts +95 -69
- package/src/daemon/ipc-contract/notifications.ts +10 -6
- package/src/daemon/ipc-contract/pairing.ts +8 -8
- package/src/daemon/ipc-contract/schedules.ts +20 -20
- package/src/daemon/ipc-contract/sessions.ts +88 -57
- package/src/daemon/ipc-contract/settings.ts +12 -7
- package/src/daemon/ipc-contract/shared.ts +9 -7
- package/src/daemon/ipc-contract/skills.ts +46 -26
- package/src/daemon/ipc-contract/subagents.ts +9 -9
- package/src/daemon/ipc-contract/trust.ts +11 -11
- package/src/daemon/ipc-contract/work-items.ts +33 -28
- package/src/daemon/ipc-contract/workspace.ts +28 -21
- package/src/daemon/ipc-contract-inventory.json +8 -0
- package/src/daemon/ipc-contract-inventory.ts +29 -26
- package/src/daemon/ipc-contract.ts +111 -44
- package/src/daemon/ipc-handler.ts +27 -19
- package/src/daemon/ipc-protocol.ts +22 -12
- package/src/daemon/ipc-validate.ts +91 -46
- package/src/daemon/lifecycle.ts +25 -1
- package/src/daemon/main.ts +10 -8
- package/src/daemon/media-visibility-policy.ts +3 -1
- package/src/daemon/pairing-store.ts +72 -40
- package/src/daemon/providers-setup.ts +35 -25
- package/src/daemon/recording-executor.ts +37 -30
- package/src/daemon/recording-intent-fallback.ts +58 -28
- package/src/daemon/recording-intent.ts +71 -61
- package/src/daemon/ride-shotgun-handler.ts +201 -121
- package/src/daemon/seed-files.ts +28 -17
- package/src/daemon/server.ts +23 -14
- package/src/daemon/session-agent-loop-handlers.ts +261 -135
- package/src/daemon/session-agent-loop.ts +795 -253
- package/src/daemon/session-attachments.ts +104 -39
- package/src/daemon/session-conflict-gate.ts +72 -28
- package/src/daemon/session-dynamic-profile.ts +36 -22
- package/src/daemon/session-error.ts +50 -45
- package/src/daemon/session-evictor.ts +17 -10
- package/src/daemon/session-history.ts +201 -89
- package/src/daemon/session-lifecycle.ts +79 -42
- package/src/daemon/session-media-retry.ts +89 -41
- package/src/daemon/session-memory.ts +77 -55
- package/src/daemon/session-messaging.ts +261 -111
- package/src/daemon/session-notifiers.ts +57 -45
- package/src/daemon/session-process.ts +370 -154
- package/src/daemon/session-queue-manager.ts +30 -13
- package/src/daemon/session-runtime-assembly.ts +61 -15
- package/src/daemon/session-skill-tools.ts +84 -36
- package/src/daemon/session-slash.ts +178 -113
- package/src/daemon/session-surfaces.ts +498 -211
- package/src/daemon/session-tool-setup.ts +22 -17
- package/src/daemon/session-usage.ts +26 -13
- package/src/daemon/session-workspace.ts +7 -4
- package/src/daemon/session.ts +18 -19
- package/src/daemon/shutdown-handlers.ts +36 -33
- package/src/daemon/tls-certs.ts +90 -57
- package/src/daemon/tool-side-effects.ts +97 -65
- package/src/daemon/trace-emitter.ts +8 -7
- package/src/daemon/video-thumbnail.ts +55 -25
- package/src/daemon/watch-handler.ts +164 -86
- package/src/email/provider.ts +1 -1
- package/src/email/providers/agentmail.ts +87 -45
- package/src/email/providers/index.ts +19 -14
- package/src/email/service.ts +52 -24
- package/src/email/types.ts +2 -2
- package/src/errors.ts +1 -1
- package/src/events/bus.ts +30 -10
- package/src/events/domain-events.ts +19 -13
- package/src/events/index.ts +6 -6
- package/src/events/tool-audit-listener.ts +34 -20
- package/src/events/tool-domain-event-publisher.ts +22 -20
- package/src/events/tool-metrics-listener.ts +26 -21
- package/src/events/tool-notification-listener.ts +5 -5
- package/src/events/tool-profiling-listener.ts +33 -23
- package/src/events/tool-trace-listener.ts +70 -46
- package/src/export/formatter.ts +38 -32
- package/src/followups/followup-store.ts +43 -36
- package/src/followups/index.ts +2 -2
- package/src/followups/types.ts +1 -1
- package/src/gallery/default-gallery.ts +37 -34
- package/src/gallery/gallery-manifest.ts +9 -9
- package/src/heartbeat/heartbeat-service.ts +59 -37
- package/src/home-base/app-link-store.ts +14 -12
- package/src/home-base/bootstrap.ts +14 -8
- package/src/home-base/prebuilt/seed.ts +35 -26
- package/src/home-base/prebuilt-home-base-updater.ts +14 -8
- package/src/hooks/cli.ts +56 -43
- package/src/hooks/config.ts +27 -14
- package/src/hooks/discovery.ts +53 -33
- package/src/hooks/manager.ts +50 -26
- package/src/hooks/runner.ts +35 -29
- package/src/hooks/templates.ts +38 -15
- package/src/hooks/types.ts +13 -13
- package/src/inbound/platform-callback-registration.ts +21 -15
- package/src/inbound/public-ingress-urls.ts +9 -6
- package/src/index.ts +20 -19
- package/src/influencer/client.ts +269 -108
- package/src/instrument.ts +3 -1
- package/src/logfire.ts +64 -39
- package/src/mcp/client.ts +107 -55
- package/src/mcp/manager.ts +45 -18
- package/src/mcp/mcp-oauth-provider.ts +114 -62
- package/src/media/gemini-image-service.ts +28 -21
- package/src/memory/account-store.ts +16 -9
- package/src/memory/admin.ts +87 -57
- package/src/memory/app-git-service.ts +77 -47
- package/src/memory/app-store.ts +151 -77
- package/src/memory/attachments-store.ts +123 -53
- package/src/memory/canonical-guardian-store.ts +190 -48
- package/src/memory/channel-delivery-store.ts +5 -5
- package/src/memory/channel-guardian-store.ts +31 -16
- package/src/memory/checkpoints.ts +14 -7
- package/src/memory/clarification-resolver.ts +219 -104
- package/src/memory/conflict-intent.ts +74 -23
- package/src/memory/conflict-policy.ts +20 -7
- package/src/memory/conflict-store.ts +144 -94
- package/src/memory/contradiction-checker.ts +257 -132
- package/src/memory/conversation-attention-store.ts +72 -32
- package/src/memory/conversation-bootstrap.ts +28 -0
- package/src/memory/conversation-crud.ts +12 -5
- package/src/memory/conversation-display-order-migration.ts +7 -7
- package/src/memory/conversation-key-store.ts +18 -13
- package/src/memory/conversation-queries.ts +130 -52
- package/src/memory/conversation-store.ts +43 -26
- package/src/memory/conversation-title-service.ts +89 -66
- package/src/memory/db-init.ts +90 -2
- package/src/memory/db.ts +10 -3
- package/src/memory/delivery-channels.ts +12 -6
- package/src/memory/delivery-crud.ts +26 -12
- package/src/memory/delivery-status.ts +19 -16
- package/src/memory/embedding-backend.ts +205 -77
- package/src/memory/embedding-gemini.ts +23 -10
- package/src/memory/embedding-local.ts +89 -44
- package/src/memory/embedding-ollama.ts +25 -13
- package/src/memory/embedding-openai.ts +20 -11
- package/src/memory/embedding-runtime-manager.ts +163 -90
- package/src/memory/entity-extractor.ts +185 -123
- package/src/memory/external-conversation-store.ts +30 -12
- package/src/memory/fingerprint.ts +2 -2
- package/src/memory/fts-reconciler.ts +57 -28
- package/src/memory/guardian-action-store.ts +162 -100
- package/src/memory/guardian-approvals.ts +63 -129
- package/src/memory/guardian-rate-limits.ts +20 -9
- package/src/memory/guardian-verification.ts +82 -35
- package/src/memory/indexer.ts +96 -55
- package/src/memory/ingress-invite-store.ts +28 -169
- package/src/memory/items-extractor.ts +313 -157
- package/src/memory/job-handlers/backfill.ts +116 -63
- package/src/memory/job-handlers/cleanup.ts +64 -41
- package/src/memory/job-handlers/conflict.ts +90 -49
- package/src/memory/job-handlers/embedding.ts +32 -17
- package/src/memory/job-handlers/extraction.ts +58 -33
- package/src/memory/job-handlers/index-maintenance.ts +31 -17
- package/src/memory/job-handlers/media-processing.ts +65 -24
- package/src/memory/job-handlers/summarization.ts +186 -128
- package/src/memory/job-utils.ts +100 -57
- package/src/memory/jobs-store.ts +235 -142
- package/src/memory/jobs-worker.ts +167 -83
- package/src/memory/llm-request-log-store.ts +13 -11
- package/src/memory/llm-usage-store.ts +35 -26
- package/src/memory/media-store.ts +151 -44
- package/src/memory/message-content.ts +28 -18
- package/src/memory/migrations/001-job-deferrals.ts +11 -5
- package/src/memory/migrations/002-tool-invocations-fk.ts +14 -6
- package/src/memory/migrations/003-memory-fts-backfill.ts +11 -5
- package/src/memory/migrations/004-entity-relation-dedup.ts +17 -11
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +36 -21
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +35 -20
- package/src/memory/migrations/007-assistant-id-to-self.ts +40 -27
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +58 -36
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +36 -22
- package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +21 -11
- package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +30 -15
- package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +4 -2
- package/src/memory/migrations/013-guardian-action-tables.ts +29 -11
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +35 -21
- package/src/memory/migrations/015-drop-active-search-index.ts +17 -11
- package/src/memory/migrations/016-memory-segments-indexes.ts +7 -3
- package/src/memory/migrations/017-memory-items-indexes.ts +4 -2
- package/src/memory/migrations/018-remaining-table-indexes.ts +13 -5
- package/src/memory/migrations/019-notification-tables-schema-migration.ts +34 -20
- package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +87 -53
- package/src/memory/migrations/021-conversation-status-indexes.ts +7 -3
- package/src/memory/migrations/022-add-origin-interface.ts +4 -2
- package/src/memory/migrations/023-memory-item-sources-indexes.ts +4 -2
- package/src/memory/migrations/024-embedding-vector-blob.ts +34 -18
- package/src/memory/migrations/025-messages-fts-backfill.ts +11 -5
- package/src/memory/migrations/026-guardian-verification-sessions.ts +80 -14
- package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +42 -26
- package/src/memory/migrations/027-notification-delivery-pairing-columns.ts +22 -8
- package/src/memory/migrations/027a-guardian-bootstrap-token.ts +11 -3
- package/src/memory/migrations/028-call-session-mode.ts +13 -3
- package/src/memory/migrations/028-notification-delivery-client-ack.ts +22 -8
- package/src/memory/migrations/029-channel-inbound-delivered-segments.ts +7 -3
- package/src/memory/migrations/030-guardian-action-followup.ts +46 -8
- package/src/memory/migrations/030-guardian-verification-purpose.ts +4 -2
- package/src/memory/migrations/031-conversations-thread-type-index.ts +4 -2
- package/src/memory/migrations/032-guardian-delivery-conversation-index.ts +4 -2
- package/src/memory/migrations/032-notification-delivery-thread-decision.ts +22 -8
- package/src/memory/migrations/033-scoped-approval-grants.ts +1 -1
- package/src/memory/migrations/034-guardian-action-tool-metadata.ts +15 -3
- package/src/memory/migrations/035-guardian-action-supersession.ts +15 -3
- package/src/memory/migrations/036-normalize-phone-identities.ts +101 -87
- package/src/memory/migrations/037-voice-invite-columns.ts +22 -4
- package/src/memory/migrations/038-actor-token-records.ts +5 -9
- package/src/memory/migrations/039-actor-refresh-token-records.ts +7 -13
- package/src/memory/migrations/100-core-tables.ts +1 -1
- package/src/memory/migrations/101-watchers-and-logs.ts +1 -1
- package/src/memory/migrations/103-complex-migrations.ts +9 -9
- package/src/memory/migrations/104-core-indexes.ts +188 -64
- package/src/memory/migrations/105-contacts-and-triage.ts +28 -10
- package/src/memory/migrations/106-call-sessions.ts +58 -16
- package/src/memory/migrations/107-followups.ts +16 -6
- package/src/memory/migrations/108-tasks-and-work-items.ts +43 -11
- package/src/memory/migrations/109-external-conversation-bindings.ts +11 -5
- package/src/memory/migrations/110-channel-guardian.ts +48 -10
- package/src/memory/migrations/111-media-assets.ts +52 -18
- package/src/memory/migrations/112-assistant-inbox.ts +32 -12
- package/src/memory/migrations/113-late-migrations.ts +12 -12
- package/src/memory/migrations/114-notifications.ts +28 -12
- package/src/memory/migrations/115-sequences.ts +10 -4
- package/src/memory/migrations/116-messages-fts.ts +1 -1
- package/src/memory/migrations/117-conversation-attention.ts +16 -6
- package/src/memory/migrations/118-reminder-routing-intent.ts +7 -3
- package/src/memory/migrations/119-schema-indexes-and-columns.ts +35 -15
- package/src/memory/migrations/120-fk-cascade-rebuilds.ts +36 -17
- package/src/memory/migrations/121-canonical-guardian-requests.ts +25 -9
- package/src/memory/migrations/122-canonical-guardian-requester-chat-id.ts +11 -3
- package/src/memory/migrations/123-canonical-guardian-deliveries-destination-index.ts +4 -2
- package/src/memory/migrations/124-voice-invite-display-metadata.ts +15 -3
- package/src/memory/migrations/125-guardian-principal-id-columns.ts +22 -4
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +174 -126
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +58 -42
- package/src/memory/migrations/128-contacts-role-principal.ts +26 -0
- package/src/memory/migrations/129-contact-channels-access-fields.ts +105 -0
- package/src/memory/migrations/130-contact-channels-type-ext-chat-id-index.ts +15 -0
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +134 -0
- package/src/memory/migrations/132-contacts-assistant-id.ts +21 -0
- package/src/memory/migrations/index.ts +82 -73
- package/src/memory/migrations/registry.ts +53 -37
- package/src/memory/migrations/validate-migration-state.ts +73 -46
- package/src/memory/profile-compiler.ts +58 -24
- package/src/memory/published-pages-store.ts +12 -16
- package/src/memory/qdrant-circuit-breaker.ts +28 -20
- package/src/memory/qdrant-client.ts +99 -63
- package/src/memory/qdrant-manager.ts +89 -57
- package/src/memory/query-builder.ts +9 -7
- package/src/memory/raw-query.ts +63 -14
- package/src/memory/recall-cache.ts +15 -8
- package/src/memory/retrieval-budget.ts +0 -1
- package/src/memory/retriever.ts +385 -192
- package/src/memory/schema-migration.ts +1 -1
- package/src/memory/schema.ts +44 -56
- package/src/memory/scoped-approval-grants.ts +99 -45
- package/src/memory/search/entity.ts +102 -40
- package/src/memory/search/formatting.ts +70 -52
- package/src/memory/search/lexical.ts +82 -43
- package/src/memory/search/ranking.ts +103 -39
- package/src/memory/search/semantic.ts +59 -35
- package/src/memory/search/types.ts +8 -8
- package/src/memory/segmenter.ts +20 -12
- package/src/memory/shared-app-links-store.ts +21 -16
- package/src/memory/task-memory-cleanup.ts +18 -8
- package/src/memory/tool-usage-store.ts +27 -19
- package/src/memory/validation.ts +4 -2
- package/src/messaging/activity-analyzer.ts +7 -7
- package/src/messaging/draft-store.ts +13 -10
- package/src/messaging/email-classifier.ts +73 -37
- package/src/messaging/index.ts +3 -3
- package/src/messaging/outreach-classifier.ts +76 -38
- package/src/messaging/provider-types.ts +2 -4
- package/src/messaging/provider.ts +37 -8
- package/src/messaging/providers/gmail/adapter.ts +183 -66
- package/src/messaging/providers/gmail/client.ts +3 -1
- package/src/messaging/providers/gmail/mime-builder.ts +21 -19
- package/src/messaging/providers/gmail/people-client.ts +22 -9
- package/src/messaging/providers/gmail/types.ts +6 -6
- package/src/messaging/providers/slack/adapter.ts +93 -43
- package/src/messaging/providers/slack/client.ts +100 -41
- package/src/messaging/providers/slack/types.ts +6 -0
- package/src/messaging/providers/sms/adapter.ts +76 -40
- package/src/messaging/providers/sms/client.ts +4 -4
- package/src/messaging/providers/telegram-bot/adapter.ts +52 -30
- package/src/messaging/providers/telegram-bot/client.ts +7 -7
- package/src/messaging/providers/whatsapp/adapter.ts +58 -31
- package/src/messaging/providers/whatsapp/client.ts +4 -4
- package/src/messaging/registry.ts +9 -5
- package/src/messaging/style-analyzer.ts +69 -39
- package/src/messaging/thread-summarizer.ts +101 -53
- package/src/messaging/triage-engine.ts +111 -82
- package/src/messaging/types.ts +10 -10
- package/src/migrations/config-merge.ts +18 -10
- package/src/migrations/data-layout.ts +35 -22
- package/src/migrations/data-merge.ts +17 -7
- package/src/migrations/hooks-merge.ts +43 -16
- package/src/migrations/index.ts +6 -6
- package/src/migrations/log.ts +9 -5
- package/src/migrations/skills-merge.ts +17 -7
- package/src/migrations/workspace-layout.ts +39 -25
- package/src/notifications/AGENTS.md +5 -0
- package/src/notifications/adapters/macos.ts +21 -14
- package/src/notifications/adapters/sms.ts +28 -15
- package/src/notifications/adapters/telegram.ts +24 -15
- package/src/notifications/broadcaster.ts +108 -52
- package/src/notifications/conversation-pairing.ts +64 -29
- package/src/notifications/copy-composer.ts +165 -95
- package/src/notifications/decision-engine.ts +353 -147
- package/src/notifications/decisions-store.ts +26 -10
- package/src/notifications/deliveries-store.ts +23 -13
- package/src/notifications/destination-resolver.ts +42 -24
- package/src/notifications/deterministic-checks.ts +78 -27
- package/src/notifications/emit-signal.ts +83 -45
- package/src/notifications/events-store.ts +13 -7
- package/src/notifications/guardian-question-mode.ts +125 -75
- package/src/notifications/preference-extractor.ts +85 -53
- package/src/notifications/preference-summary.ts +31 -18
- package/src/notifications/preferences-store.ts +29 -18
- package/src/notifications/runtime-dispatch.ts +22 -12
- package/src/notifications/signal.ts +4 -4
- package/src/notifications/thread-candidates.ts +59 -23
- package/src/notifications/thread-seed-composer.ts +45 -27
- package/src/notifications/types.ts +19 -10
- package/src/oauth/connect-orchestrator.ts +105 -54
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/provider-profiles.ts +80 -59
- package/src/oauth/scope-policy.ts +5 -2
- package/src/oauth/token-persistence.ts +58 -24
- package/src/outbound-proxy/certs.ts +284 -0
- package/src/outbound-proxy/config.ts +94 -0
- package/src/outbound-proxy/connect-tunnel.ts +84 -0
- package/src/outbound-proxy/health.ts +62 -0
- package/src/outbound-proxy/host-pattern-match.ts +67 -0
- package/src/outbound-proxy/http-forwarder.ts +162 -0
- package/src/outbound-proxy/index.ts +80 -0
- package/src/outbound-proxy/logging.ts +193 -0
- package/src/outbound-proxy/mitm-handler.ts +292 -0
- package/src/outbound-proxy/policy.ts +172 -0
- package/src/outbound-proxy/router.ts +64 -0
- package/src/outbound-proxy/server.ts +145 -0
- package/src/outbound-proxy/types.ts +150 -0
- package/src/permissions/checker.ts +481 -189
- package/src/permissions/defaults.ts +135 -108
- package/src/permissions/prompter.ts +53 -27
- package/src/permissions/secret-prompter.ts +21 -15
- package/src/permissions/shell-identity.ts +47 -16
- package/src/permissions/trust-store.ts +185 -73
- package/src/permissions/types.ts +22 -12
- package/src/permissions/workspace-policy.ts +47 -38
- package/src/playbooks/index.ts +10 -2
- package/src/playbooks/playbook-compiler.ts +30 -24
- package/src/playbooks/types.ts +11 -8
- package/src/providers/anthropic/client.ts +325 -168
- package/src/providers/failover.ts +57 -22
- package/src/providers/fireworks/client.ts +9 -5
- package/src/providers/gemini/client.ts +61 -39
- package/src/providers/model-intents.ts +40 -33
- package/src/providers/ollama/client.ts +7 -7
- package/src/providers/openai/client.ts +106 -68
- package/src/providers/openrouter/client.ts +9 -5
- package/src/providers/provider-send-message.ts +59 -27
- package/src/providers/ratelimit.ts +25 -8
- package/src/providers/registry.ts +86 -38
- package/src/providers/retry.ts +84 -36
- package/src/providers/stream-timeout.ts +5 -3
- package/src/providers/types.ts +7 -6
- package/src/runtime/AGENTS.md +42 -0
- package/src/runtime/access-request-helper.ts +118 -68
- package/src/runtime/actor-refresh-token-store.ts +21 -16
- package/src/runtime/actor-token-store.ts +25 -18
- package/src/runtime/actor-trust-resolver.ts +183 -80
- package/src/runtime/approval-conversation-turn.ts +39 -26
- package/src/runtime/approval-message-composer.ts +116 -84
- package/src/runtime/assistant-event-hub.ts +25 -6
- package/src/runtime/assistant-event.ts +4 -4
- package/src/runtime/assistant-scope.ts +1 -1
- package/src/runtime/auth/__tests__/guard-tests.test.ts +36 -14
- package/src/runtime/auth/context.ts +8 -7
- package/src/runtime/auth/credential-service.ts +60 -38
- package/src/runtime/auth/external-assistant-id.ts +16 -8
- package/src/runtime/auth/index.ts +23 -16
- package/src/runtime/auth/route-policy.ts +170 -104
- package/src/runtime/auth/scopes.ts +22 -29
- package/src/runtime/auth/subject.ts +19 -13
- package/src/runtime/auth/token-service.ts +3 -3
- package/src/runtime/auth/types.ts +23 -23
- package/src/runtime/channel-approval-parser.ts +37 -14
- package/src/runtime/channel-approval-types.ts +12 -4
- package/src/runtime/channel-approvals.ts +41 -23
- package/src/runtime/channel-guardian-service.ts +144 -103
- package/src/runtime/channel-invite-transport.ts +4 -2
- package/src/runtime/channel-invite-transports/telegram.ts +16 -10
- package/src/runtime/channel-invite-transports/voice.ts +7 -7
- package/src/runtime/channel-readiness-service.ts +139 -90
- package/src/runtime/channel-readiness-types.ts +4 -2
- package/src/runtime/channel-reply-delivery.ts +21 -11
- package/src/runtime/channel-retry-sweep.ts +111 -62
- package/src/runtime/confirmation-request-guardian-bridge.ts +73 -54
- package/src/runtime/gateway-client.ts +86 -53
- package/src/runtime/guardian-action-conversation-turn.ts +34 -18
- package/src/runtime/guardian-action-followup-executor.ts +115 -45
- package/src/runtime/guardian-action-grant-minter.ts +40 -24
- package/src/runtime/guardian-action-message-composer.ts +105 -84
- package/src/runtime/guardian-decision-types.ts +28 -13
- package/src/runtime/guardian-outbound-actions.ts +9 -0
- package/src/runtime/guardian-reply-router.ts +274 -145
- package/src/runtime/guardian-vellum-migration.ts +38 -24
- package/src/runtime/guardian-verification-templates.ts +8 -11
- package/src/runtime/http-router.ts +175 -0
- package/src/runtime/http-server.ts +931 -669
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/ingress-service.ts +182 -89
- package/src/runtime/invite-redemption-service.ts +211 -134
- package/src/runtime/invite-redemption-templates.ts +18 -11
- package/src/runtime/local-actor-identity.ts +73 -55
- package/src/runtime/middleware/auth.ts +25 -14
- package/src/runtime/middleware/error-handler.ts +15 -11
- package/src/runtime/middleware/rate-limiter.ts +23 -17
- package/src/runtime/middleware/request-logger.ts +4 -4
- package/src/runtime/middleware/twilio-validation.ts +29 -20
- package/src/runtime/migrations/migration-transport.ts +575 -0
- package/src/runtime/migrations/migration-wizard.ts +715 -0
- package/src/runtime/migrations/rebind-secrets-screen.ts +351 -0
- package/src/runtime/migrations/transfer-progress-screen.ts +321 -0
- package/src/runtime/migrations/validation-results-screen.ts +467 -0
- package/src/runtime/migrations/vbundle-builder.ts +295 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +212 -0
- package/src/runtime/migrations/vbundle-importer.ts +339 -0
- package/src/runtime/migrations/vbundle-validator.ts +356 -0
- package/src/runtime/pending-interactions.ts +16 -7
- package/src/runtime/routes/access-request-decision.ts +73 -52
- package/src/runtime/routes/app-routes.ts +56 -38
- package/src/runtime/routes/approval-routes.ts +165 -74
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +930 -0
- package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +82 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +151 -0
- package/src/runtime/routes/attachment-routes.ts +59 -48
- package/src/runtime/routes/brain-graph-routes.ts +85 -69
- package/src/runtime/routes/call-routes.ts +79 -38
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +10 -10
- package/src/runtime/routes/channel-delivery-routes.ts +19 -14
- package/src/runtime/routes/channel-guardian-routes.ts +3 -3
- package/src/runtime/routes/channel-inbound-routes.ts +2 -2
- package/src/runtime/routes/channel-readiness-routes.ts +12 -6
- package/src/runtime/routes/channel-route-shared.ts +33 -25
- package/src/runtime/routes/channel-routes.ts +4 -6
- package/src/runtime/routes/contact-routes.ts +205 -16
- package/src/runtime/routes/conversation-attention-routes.ts +57 -28
- package/src/runtime/routes/conversation-routes.ts +321 -174
- package/src/runtime/routes/debug-routes.ts +14 -10
- package/src/runtime/routes/events-routes.ts +90 -57
- package/src/runtime/routes/global-search-routes.ts +266 -0
- package/src/runtime/routes/guardian-action-routes.ts +147 -56
- package/src/runtime/routes/guardian-approval-interception.ts +255 -880
- package/src/runtime/routes/guardian-approval-prompt.ts +40 -24
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +135 -0
- package/src/runtime/routes/guardian-bootstrap-routes.ts +55 -36
- package/src/runtime/routes/guardian-expiry-sweep.ts +63 -37
- package/src/runtime/routes/guardian-refresh-routes.ts +40 -19
- package/src/runtime/routes/identity-routes.ts +71 -42
- package/src/runtime/routes/inbound-conversation.ts +17 -11
- package/src/runtime/routes/inbound-message-handler.ts +278 -1460
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +658 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +492 -0
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +214 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +116 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +167 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +185 -0
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +132 -0
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +340 -0
- package/src/runtime/routes/ingress-routes.ts +34 -23
- package/src/runtime/routes/integration-routes.ts +60 -21
- package/src/runtime/routes/migration-routes.ts +434 -0
- package/src/runtime/routes/pairing-routes.ts +157 -79
- package/src/runtime/routes/secret-routes.ts +6 -2
- package/src/runtime/routes/twilio-routes.ts +443 -249
- package/src/runtime/tool-grant-request-helper.ts +36 -27
- package/src/runtime/{guardian-context-resolver.ts → trust-context-resolver.ts} +29 -41
- package/src/schedule/integration-status.ts +44 -9
- package/src/schedule/recurrence-engine.ts +47 -24
- package/src/schedule/recurrence-types.ts +12 -7
- package/src/schedule/schedule-store.ts +166 -83
- package/src/schedule/scheduler.ts +26 -22
- package/src/security/encrypted-store.ts +68 -38
- package/src/security/keychain.ts +183 -120
- package/src/security/oauth-callback-registry.ts +3 -3
- package/src/security/oauth2.ts +226 -138
- package/src/security/redaction.ts +24 -24
- package/src/security/secret-allowlist.ts +46 -21
- package/src/security/secret-ingress.ts +15 -7
- package/src/security/secret-scanner.ts +193 -104
- package/src/security/secure-keys.ts +9 -3
- package/src/security/token-manager.ts +99 -40
- package/src/security/tool-approval-digest.ts +3 -3
- package/src/sequence/analytics.ts +52 -27
- package/src/sequence/engine.ts +135 -72
- package/src/sequence/guardrails.ts +32 -20
- package/src/sequence/importer.ts +75 -37
- package/src/sequence/reply-matcher.ts +36 -18
- package/src/sequence/store.ts +137 -75
- package/src/sequence/types.ts +30 -16
- package/src/services/published-app-updater.ts +26 -16
- package/src/services/vercel-deploy.ts +19 -15
- package/src/skills/active-skill-tools.ts +3 -3
- package/src/skills/clawhub.ts +178 -90
- package/src/skills/include-graph.ts +24 -17
- package/src/skills/managed-store.ts +89 -42
- package/src/skills/path-classifier.ts +10 -10
- package/src/skills/remote-skill-policy.ts +31 -22
- package/src/skills/slash-commands.ts +36 -30
- package/src/skills/tool-manifest.ts +60 -31
- package/src/skills/version-hash.ts +25 -15
- package/src/slack/slack-webhook.ts +19 -15
- package/src/subagent/index.ts +4 -8
- package/src/subagent/manager.ts +119 -69
- package/src/subagent/types.ts +9 -12
- package/src/swarm/backend-claude-code.ts +124 -45
- package/src/swarm/checkpoint.ts +36 -16
- package/src/swarm/graph-utils.ts +1 -3
- package/src/swarm/index.ts +38 -19
- package/src/swarm/limits.ts +13 -4
- package/src/swarm/orchestrator.ts +108 -57
- package/src/swarm/plan-validator.ts +23 -17
- package/src/swarm/router-planner.ts +51 -22
- package/src/swarm/router-prompts.ts +4 -1
- package/src/swarm/synthesizer.ts +26 -18
- package/src/swarm/types.ts +14 -4
- package/src/swarm/worker-backend.ts +36 -26
- package/src/swarm/worker-prompts.ts +13 -9
- package/src/swarm/worker-runner.ts +40 -34
- package/src/tasks/candidate-store.ts +14 -6
- package/src/tasks/ephemeral-permissions.ts +9 -5
- package/src/tasks/task-compiler.ts +41 -38
- package/src/tasks/task-runner.ts +54 -26
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/tasks/task-store.ts +20 -7
- package/src/tasks/tool-sanitizer.ts +3 -3
- package/src/tools/apps/definitions.ts +23 -15
- package/src/tools/apps/executors.ts +118 -37
- package/src/tools/apps/open-proxy.ts +5 -5
- package/src/tools/apps/registry.ts +2 -2
- package/src/tools/assets/materialize.ts +59 -41
- package/src/tools/assets/search.ts +86 -48
- package/src/tools/browser/api-map.ts +52 -36
- package/src/tools/browser/auth-cache.ts +21 -18
- package/src/tools/browser/auth-detector.ts +43 -28
- package/src/tools/browser/auto-navigate.ts +149 -68
- package/src/tools/browser/browser-execution.ts +9 -3
- package/src/tools/browser/headless-browser.ts +287 -150
- package/src/tools/browser/jit-auth.ts +37 -21
- package/src/tools/browser/network-recorder.ts +138 -56
- package/src/tools/browser/recording-store.ts +22 -15
- package/src/tools/browser/runtime-check.ts +8 -5
- package/src/tools/browser/x-auto-navigate.ts +88 -47
- package/src/tools/calls/call-end.ts +9 -6
- package/src/tools/calls/call-start.ts +30 -20
- package/src/tools/calls/call-status.ts +8 -5
- package/src/tools/claude-code/claude-code.ts +301 -165
- package/src/tools/computer-use/definitions.ts +159 -130
- package/src/tools/computer-use/registry.ts +2 -2
- package/src/tools/computer-use/request-computer-control.ts +21 -13
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
- package/src/tools/credentials/account-registry.ts +52 -35
- package/src/tools/credentials/broker-types.ts +1 -1
- package/src/tools/credentials/broker.ts +97 -55
- package/src/tools/credentials/domain-policy.ts +5 -2
- package/src/tools/credentials/host-pattern-match.ts +15 -8
- package/src/tools/credentials/metadata-store.ts +93 -43
- package/src/tools/credentials/policy-types.ts +5 -2
- package/src/tools/credentials/policy-validate.ts +21 -14
- package/src/tools/credentials/post-connect-hooks.ts +18 -7
- package/src/tools/credentials/resolve.ts +11 -10
- package/src/tools/credentials/selection.ts +30 -25
- package/src/tools/credentials/tool-policy.ts +5 -2
- package/src/tools/credentials/vault.ts +452 -183
- package/src/tools/document/document-tool.ts +23 -17
- package/src/tools/document/editor-template.ts +12 -7
- package/src/tools/execution-target.ts +13 -10
- package/src/tools/execution-timeout.ts +6 -5
- package/src/tools/executor.ts +141 -74
- package/src/tools/filesystem/edit.ts +82 -45
- package/src/tools/filesystem/fuzzy-match.ts +70 -32
- package/src/tools/filesystem/read.ts +46 -28
- package/src/tools/filesystem/view-image.ts +86 -42
- package/src/tools/filesystem/write.ts +53 -32
- package/src/tools/followups/followup_create.ts +43 -17
- package/src/tools/followups/followup_list.ts +28 -13
- package/src/tools/followups/followup_resolve.ts +9 -6
- package/src/tools/guardian-control-plane-policy.ts +15 -14
- package/src/tools/host-filesystem/edit.ts +77 -42
- package/src/tools/host-filesystem/read.ts +52 -33
- package/src/tools/host-filesystem/write.ts +50 -29
- package/src/tools/host-terminal/host-shell.ts +97 -61
- package/src/tools/mcp/mcp-tool-factory.ts +21 -14
- package/src/tools/memory/definitions.ts +60 -28
- package/src/tools/memory/handlers.ts +149 -77
- package/src/tools/memory/register.ts +39 -16
- package/src/tools/network/__tests__/web-search.test.ts +236 -177
- package/src/tools/network/domain-normalize.ts +13 -9
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +193 -123
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +225 -127
- package/src/tools/network/script-proxy/index.ts +1 -17
- package/src/tools/network/script-proxy/session-manager.ts +151 -84
- package/src/tools/network/url-safety.ts +56 -34
- package/src/tools/network/web-fetch.ts +273 -155
- package/src/tools/network/web-search.ts +166 -81
- package/src/tools/permission-checker.ts +6 -25
- package/src/tools/policy-context.ts +8 -5
- package/src/tools/registry.ts +73 -46
- package/src/tools/reminder/reminder-store.ts +65 -44
- package/src/tools/reminder/reminder.ts +76 -35
- package/src/tools/schedule/create.ts +44 -21
- package/src/tools/schedule/delete.ts +8 -5
- package/src/tools/schedule/list.ts +39 -19
- package/src/tools/schedule/update.ts +49 -26
- package/src/tools/secret-detection-handler.ts +130 -49
- package/src/tools/sensitive-output-placeholders.ts +15 -8
- package/src/tools/shared/filesystem/edit-engine.ts +45 -14
- package/src/tools/shared/filesystem/errors.ts +18 -18
- package/src/tools/shared/filesystem/file-ops-service.ts +59 -32
- package/src/tools/shared/filesystem/format-diff.ts +21 -11
- package/src/tools/shared/filesystem/path-policy.ts +17 -13
- package/src/tools/shared/filesystem/size-guard.ts +8 -4
- package/src/tools/shared/filesystem/types.ts +2 -2
- package/src/tools/shared/shell-output.ts +4 -3
- package/src/tools/side-effects.ts +36 -28
- package/src/tools/skills/delete-managed.ts +30 -17
- package/src/tools/skills/load.ts +88 -46
- package/src/tools/skills/sandbox-runner.ts +62 -46
- package/src/tools/skills/scaffold-managed.ts +98 -48
- package/src/tools/skills/script-contract.ts +5 -2
- package/src/tools/skills/skill-script-runner.ts +29 -13
- package/src/tools/skills/skill-tool-factory.ts +20 -10
- package/src/tools/subagent/abort.ts +10 -4
- package/src/tools/subagent/message.ts +14 -8
- package/src/tools/subagent/read.ts +20 -11
- package/src/tools/subagent/spawn.ts +14 -6
- package/src/tools/subagent/status.ts +7 -4
- package/src/tools/swarm/delegate.ts +75 -49
- package/src/tools/system/avatar-generator.ts +46 -33
- package/src/tools/system/navigate-settings.ts +29 -19
- package/src/tools/system/open-system-settings.ts +30 -20
- package/src/tools/system/request-permission.ts +59 -44
- package/src/tools/system/version.ts +27 -16
- package/src/tools/system/voice-config.ts +116 -53
- package/src/tools/tasks/index.ts +8 -8
- package/src/tools/tasks/task-delete.ts +61 -22
- package/src/tools/tasks/task-list.ts +23 -11
- package/src/tools/tasks/task-run.ts +41 -16
- package/src/tools/tasks/task-save.ts +27 -10
- package/src/tools/tasks/work-item-enqueue.ts +114 -48
- package/src/tools/tasks/work-item-list.ts +20 -10
- package/src/tools/tasks/work-item-remove.ts +49 -15
- package/src/tools/tasks/work-item-run.ts +34 -13
- package/src/tools/tasks/work-item-update.ts +84 -31
- package/src/tools/terminal/backends/native.ts +64 -35
- package/src/tools/terminal/backends/types.ts +6 -2
- package/src/tools/terminal/parser.ts +200 -125
- package/src/tools/terminal/safe-env.ts +27 -21
- package/src/tools/terminal/sandbox-diagnostics.ts +31 -13
- package/src/tools/terminal/sandbox.ts +10 -6
- package/src/tools/terminal/shell.ts +124 -68
- package/src/tools/tool-approval-handler.ts +193 -138
- package/src/tools/types.ts +43 -23
- package/src/tools/ui-surface/definitions.ts +124 -89
- package/src/tools/ui-surface/registry.ts +2 -2
- package/src/tools/watch/screen-watch.ts +50 -32
- package/src/tools/watch/watch-state.ts +41 -15
- package/src/tools/watcher/create.ts +37 -15
- package/src/tools/watcher/delete.ts +9 -6
- package/src/tools/watcher/digest.ts +10 -6
- package/src/tools/watcher/list.ts +37 -14
- package/src/tools/watcher/update.ts +33 -18
- package/src/tools/weather/service.ts +331 -174
- package/src/twitter/client.ts +261 -138
- package/src/twitter/oauth-client.ts +17 -13
- package/src/twitter/router.ts +51 -23
- package/src/twitter/session.ts +27 -18
- package/src/types/qrcode.d.ts +6 -3
- package/src/usage/actors.ts +16 -16
- package/src/usage/types.ts +3 -3
- package/src/util/bundled-asset.ts +10 -6
- package/src/util/canonicalize-identity.ts +11 -4
- package/src/util/clipboard.ts +7 -7
- package/src/util/content-id.ts +3 -3
- package/src/util/debounce.ts +3 -2
- package/src/util/diff.ts +55 -33
- package/src/util/errors.ts +26 -26
- package/src/util/fs.ts +8 -2
- package/src/util/log-redact.ts +12 -12
- package/src/util/logger.ts +112 -51
- package/src/util/network-info.ts +13 -5
- package/src/util/object.ts +4 -2
- package/src/util/phone.ts +4 -4
- package/src/util/platform.ts +80 -58
- package/src/util/pricing.ts +49 -31
- package/src/util/retry.ts +18 -7
- package/src/util/row-mapper.ts +7 -4
- package/src/util/silently.ts +7 -4
- package/src/util/spawn.ts +48 -0
- package/src/util/spinner.ts +9 -7
- package/src/util/time.ts +16 -3
- package/src/util/truncate.ts +1 -1
- package/src/util/voice-code.ts +6 -4
- package/src/util/xml.ts +5 -1
- package/src/version.ts +12 -8
- package/src/watcher/engine.ts +71 -44
- package/src/watcher/provider-registry.ts +1 -1
- package/src/watcher/providers/github.ts +40 -23
- package/src/watcher/providers/gmail.ts +59 -38
- package/src/watcher/providers/google-calendar.ts +62 -48
- package/src/watcher/providers/linear.ts +219 -150
- package/src/watcher/providers/slack.ts +93 -27
- package/src/watcher/watcher-store.ts +75 -55
- package/src/work-items/work-item-runner.ts +62 -29
- package/src/work-items/work-item-store.ts +137 -47
- package/src/workspace/commit-message-enrichment-service.ts +65 -25
- package/src/workspace/commit-message-provider.ts +14 -12
- package/src/workspace/git-service.ts +355 -239
- package/src/workspace/heartbeat-service.ts +74 -37
- package/src/workspace/provider-commit-message-generator.ts +95 -70
- package/src/workspace/top-level-renderer.ts +10 -8
- package/src/workspace/top-level-scanner.ts +9 -3
- package/src/workspace/turn-commit.ts +63 -36
- package/src/__tests__/ingress-member-store.test.ts +0 -294
- package/src/__tests__/script-proxy-router.test.ts +0 -215
- package/src/config/bundled-skills/trusted-contacts/SKILL.md +0 -372
- package/src/memory/guardian-bindings.ts +0 -158
- package/src/memory/ingress-member-store.ts +0 -352
- package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -77
- package/src/tools/network/script-proxy/certs.ts +0 -7
- package/src/tools/network/script-proxy/connect-tunnel.ts +0 -1
- package/src/tools/network/script-proxy/http-forwarder.ts +0 -2
- package/src/tools/network/script-proxy/logging.ts +0 -12
- package/src/tools/network/script-proxy/mitm-handler.ts +0 -2
- package/src/tools/network/script-proxy/policy.ts +0 -4
- package/src/tools/network/script-proxy/router.ts +0 -2
- package/src/tools/network/script-proxy/server.ts +0 -5
- package/src/tools/network/script-proxy/types.ts +0 -19
|
@@ -110,9 +110,10 @@ globalThis.fetch = (async (
|
|
|
110
110
|
return new Response(JSON.stringify({ ok: true }), { status: 200 });
|
|
111
111
|
}
|
|
112
112
|
return originalFetch(input, init as never);
|
|
113
|
-
}) as typeof fetch;
|
|
113
|
+
}) as unknown as typeof fetch;
|
|
114
114
|
import { eq } from "drizzle-orm";
|
|
115
115
|
|
|
116
|
+
import { createGuardianBinding } from "../contacts/contacts-write.js";
|
|
116
117
|
import {
|
|
117
118
|
handleGuardianVerification,
|
|
118
119
|
MAX_SENDS_PER_SESSION,
|
|
@@ -127,7 +128,6 @@ import {
|
|
|
127
128
|
bindSessionIdentity as _storeBindSessionIdentity,
|
|
128
129
|
consumeChallenge,
|
|
129
130
|
createApprovalRequest,
|
|
130
|
-
createBinding,
|
|
131
131
|
createChallenge,
|
|
132
132
|
createVerificationSession,
|
|
133
133
|
findActiveSession as storeFindActiveSession,
|
|
@@ -135,19 +135,21 @@ import {
|
|
|
135
135
|
findPendingChallengeForChannel,
|
|
136
136
|
findSessionByBootstrapTokenHash as _storeFindSessionByBootstrapTokenHash,
|
|
137
137
|
findSessionByIdentity as _storeFindSessionByIdentity,
|
|
138
|
-
getActiveBinding,
|
|
139
138
|
getPendingApprovalByGuardianChat,
|
|
140
|
-
|
|
139
|
+
getPendingApprovalForRequest,
|
|
141
140
|
getRateLimit,
|
|
142
141
|
recordInvalidAttempt,
|
|
143
142
|
resetRateLimit,
|
|
144
|
-
revokeBinding,
|
|
145
143
|
updateApprovalDecision,
|
|
146
144
|
updateSessionDelivery as storeUpdateSessionDelivery,
|
|
147
145
|
updateSessionStatus as _storeUpdateSessionStatus,
|
|
148
146
|
} from "../memory/channel-guardian-store.js";
|
|
149
147
|
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
150
|
-
import {
|
|
148
|
+
import { upsertBinding as upsertExternalBinding } from "../memory/external-conversation-store.js";
|
|
149
|
+
import {
|
|
150
|
+
channelGuardianVerificationChallenges,
|
|
151
|
+
conversations,
|
|
152
|
+
} from "../memory/schema.js";
|
|
151
153
|
import {
|
|
152
154
|
bindSessionIdentity as serviceBindSessionIdentity,
|
|
153
155
|
createOutboundSession,
|
|
@@ -182,135 +184,18 @@ afterAll(() => {
|
|
|
182
184
|
|
|
183
185
|
function resetTables(): void {
|
|
184
186
|
const db = getDb();
|
|
185
|
-
db.run("DELETE FROM channel_guardian_bindings");
|
|
186
187
|
db.run("DELETE FROM channel_guardian_verification_challenges");
|
|
187
188
|
db.run("DELETE FROM channel_guardian_approval_requests");
|
|
188
189
|
db.run("DELETE FROM channel_guardian_rate_limits");
|
|
190
|
+
db.run("DELETE FROM contact_channels");
|
|
191
|
+
db.run("DELETE FROM contacts");
|
|
192
|
+
db.run("DELETE FROM external_conversation_bindings");
|
|
189
193
|
smsSendCalls.length = 0;
|
|
190
194
|
telegramDeliverCalls.length = 0;
|
|
191
195
|
voiceCallInitCalls.length = 0;
|
|
192
196
|
mockBotUsername = "test_bot";
|
|
193
197
|
}
|
|
194
198
|
|
|
195
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
196
|
-
// 1. Guardian Binding CRUD (Store)
|
|
197
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
198
|
-
|
|
199
|
-
describe("guardian binding CRUD", () => {
|
|
200
|
-
beforeEach(() => {
|
|
201
|
-
resetTables();
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
test("createBinding creates an active binding with correct fields", () => {
|
|
205
|
-
const binding = createBinding({
|
|
206
|
-
assistantId: "asst-1",
|
|
207
|
-
channel: "telegram",
|
|
208
|
-
guardianExternalUserId: "user-42",
|
|
209
|
-
guardianPrincipalId: "user-42",
|
|
210
|
-
guardianDeliveryChatId: "chat-42",
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
expect(binding.id).toBeDefined();
|
|
214
|
-
expect(binding.assistantId).toBe("asst-1");
|
|
215
|
-
expect(binding.channel).toBe("telegram");
|
|
216
|
-
expect(binding.guardianExternalUserId).toBe("user-42");
|
|
217
|
-
expect(binding.guardianDeliveryChatId).toBe("chat-42");
|
|
218
|
-
expect(binding.status).toBe("active");
|
|
219
|
-
expect(binding.verifiedVia).toBe("challenge");
|
|
220
|
-
expect(binding.verifiedAt).toBeGreaterThan(0);
|
|
221
|
-
expect(binding.createdAt).toBeGreaterThan(0);
|
|
222
|
-
expect(binding.updatedAt).toBeGreaterThan(0);
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
test("getActiveBinding returns the active binding", () => {
|
|
226
|
-
createBinding({
|
|
227
|
-
assistantId: "asst-1",
|
|
228
|
-
channel: "telegram",
|
|
229
|
-
guardianExternalUserId: "user-42",
|
|
230
|
-
guardianPrincipalId: "user-42",
|
|
231
|
-
guardianDeliveryChatId: "chat-42",
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
const found = getActiveBinding("asst-1", "telegram");
|
|
235
|
-
expect(found).not.toBeNull();
|
|
236
|
-
expect(found!.guardianExternalUserId).toBe("user-42");
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test("getActiveBinding returns null when no binding exists", () => {
|
|
240
|
-
const found = getActiveBinding("asst-1", "telegram");
|
|
241
|
-
expect(found).toBeNull();
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
test("getActiveBinding returns null for different assistant", () => {
|
|
245
|
-
createBinding({
|
|
246
|
-
assistantId: "asst-1",
|
|
247
|
-
channel: "telegram",
|
|
248
|
-
guardianExternalUserId: "user-42",
|
|
249
|
-
guardianPrincipalId: "user-42",
|
|
250
|
-
guardianDeliveryChatId: "chat-42",
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
const found = getActiveBinding("asst-2", "telegram");
|
|
254
|
-
expect(found).toBeNull();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
test("getActiveBinding returns null for different channel", () => {
|
|
258
|
-
createBinding({
|
|
259
|
-
assistantId: "asst-1",
|
|
260
|
-
channel: "telegram",
|
|
261
|
-
guardianExternalUserId: "user-42",
|
|
262
|
-
guardianPrincipalId: "user-42",
|
|
263
|
-
guardianDeliveryChatId: "chat-42",
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
const found = getActiveBinding("asst-1", "slack");
|
|
267
|
-
expect(found).toBeNull();
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
test("revokeBinding transitions active binding to revoked", () => {
|
|
271
|
-
createBinding({
|
|
272
|
-
assistantId: "asst-1",
|
|
273
|
-
channel: "telegram",
|
|
274
|
-
guardianExternalUserId: "user-42",
|
|
275
|
-
guardianPrincipalId: "user-42",
|
|
276
|
-
guardianDeliveryChatId: "chat-42",
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
const result = revokeBinding("asst-1", "telegram");
|
|
280
|
-
expect(result).toBe(true);
|
|
281
|
-
|
|
282
|
-
const found = getActiveBinding("asst-1", "telegram");
|
|
283
|
-
expect(found).toBeNull();
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
test("revokeBinding returns false when no active binding exists", () => {
|
|
287
|
-
const result = revokeBinding("asst-1", "telegram");
|
|
288
|
-
expect(result).toBe(false);
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
test("revokeBinding does not affect bindings on other channels", () => {
|
|
292
|
-
createBinding({
|
|
293
|
-
assistantId: "asst-1",
|
|
294
|
-
channel: "telegram",
|
|
295
|
-
guardianExternalUserId: "user-42",
|
|
296
|
-
guardianPrincipalId: "user-42",
|
|
297
|
-
guardianDeliveryChatId: "chat-42",
|
|
298
|
-
});
|
|
299
|
-
createBinding({
|
|
300
|
-
assistantId: "asst-1",
|
|
301
|
-
channel: "slack",
|
|
302
|
-
guardianExternalUserId: "user-99",
|
|
303
|
-
guardianPrincipalId: "user-99",
|
|
304
|
-
guardianDeliveryChatId: "chat-99",
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
revokeBinding("asst-1", "telegram");
|
|
308
|
-
|
|
309
|
-
expect(getActiveBinding("asst-1", "telegram")).toBeNull();
|
|
310
|
-
expect(getActiveBinding("asst-1", "slack")).not.toBeNull();
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
|
|
314
199
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
315
200
|
// 2. Verification Challenge Lifecycle (Store)
|
|
316
201
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -509,12 +394,10 @@ describe("guardian service challenge validation", () => {
|
|
|
509
394
|
);
|
|
510
395
|
|
|
511
396
|
expect(result.success).toBe(true);
|
|
512
|
-
|
|
513
|
-
expect(result.bindingId).toBeDefined();
|
|
514
|
-
}
|
|
397
|
+
expect(result.verificationType).toBe("guardian");
|
|
515
398
|
});
|
|
516
399
|
|
|
517
|
-
test("validateAndConsumeChallenge
|
|
400
|
+
test("validateAndConsumeChallenge does not create a guardian binding (caller responsibility)", () => {
|
|
518
401
|
const { secret } = createVerificationChallenge("asst-1", "telegram");
|
|
519
402
|
|
|
520
403
|
validateAndConsumeChallenge(
|
|
@@ -525,11 +408,8 @@ describe("guardian service challenge validation", () => {
|
|
|
525
408
|
"chat-42",
|
|
526
409
|
);
|
|
527
410
|
|
|
528
|
-
const binding =
|
|
529
|
-
expect(binding).
|
|
530
|
-
expect(binding!.guardianExternalUserId).toBe("user-42");
|
|
531
|
-
expect(binding!.guardianDeliveryChatId).toBe("chat-42");
|
|
532
|
-
expect(binding!.verifiedVia).toBe("challenge");
|
|
411
|
+
const binding = getGuardianBinding("asst-1", "telegram");
|
|
412
|
+
expect(binding).toBeNull();
|
|
533
413
|
});
|
|
534
414
|
|
|
535
415
|
test("validateAndConsumeChallenge fails with wrong secret", () => {
|
|
@@ -617,16 +497,12 @@ describe("guardian service challenge validation", () => {
|
|
|
617
497
|
);
|
|
618
498
|
|
|
619
499
|
expect(result.success).toBe(true);
|
|
620
|
-
|
|
621
|
-
expect(result.bindingId).toBeDefined();
|
|
622
|
-
}
|
|
500
|
+
expect(result.verificationType).toBe("guardian");
|
|
623
501
|
|
|
624
|
-
//
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
expect(binding
|
|
628
|
-
expect(binding!.guardianDeliveryChatId).toBe("sms-chat-1");
|
|
629
|
-
expect(binding!.channel).toBe("sms");
|
|
502
|
+
// validateAndConsumeChallenge no longer creates bindings — that is
|
|
503
|
+
// now handled by the caller (verification-intercept / relay-server).
|
|
504
|
+
const binding = getGuardianBinding("asst-1", "sms");
|
|
505
|
+
expect(binding).toBeNull();
|
|
630
506
|
});
|
|
631
507
|
|
|
632
508
|
test("sms and telegram guardian challenges are independent", () => {
|
|
@@ -664,9 +540,9 @@ describe("guardian service challenge validation", () => {
|
|
|
664
540
|
expect(telegramResult.success).toBe(true);
|
|
665
541
|
});
|
|
666
542
|
|
|
667
|
-
test("validateAndConsumeChallenge
|
|
543
|
+
test("validateAndConsumeChallenge succeeds even with existing binding (conflict check is caller responsibility)", () => {
|
|
668
544
|
// Create initial guardian binding
|
|
669
|
-
|
|
545
|
+
createGuardianBinding({
|
|
670
546
|
assistantId: "asst-1",
|
|
671
547
|
channel: "telegram",
|
|
672
548
|
guardianExternalUserId: "old-user",
|
|
@@ -674,12 +550,10 @@ describe("guardian service challenge validation", () => {
|
|
|
674
550
|
guardianDeliveryChatId: "old-chat",
|
|
675
551
|
});
|
|
676
552
|
|
|
677
|
-
const oldBinding =
|
|
553
|
+
const oldBinding = getGuardianBinding("asst-1", "telegram");
|
|
678
554
|
expect(oldBinding).not.toBeNull();
|
|
679
555
|
expect(oldBinding!.guardianExternalUserId).toBe("old-user");
|
|
680
556
|
|
|
681
|
-
// Attempt verification with a different user — should be rejected
|
|
682
|
-
// because a different guardian is already bound for this channel.
|
|
683
557
|
const { secret } = createVerificationChallenge("asst-1", "telegram");
|
|
684
558
|
const result = validateAndConsumeChallenge(
|
|
685
559
|
"asst-1",
|
|
@@ -689,11 +563,10 @@ describe("guardian service challenge validation", () => {
|
|
|
689
563
|
"new-chat",
|
|
690
564
|
);
|
|
691
565
|
|
|
692
|
-
//
|
|
693
|
-
expect(result.success).toBe(
|
|
566
|
+
// Challenge validation succeeds — the caller decides how to handle binding conflicts
|
|
567
|
+
expect(result.success).toBe(true);
|
|
694
568
|
|
|
695
|
-
|
|
696
|
-
const binding = getActiveBinding("asst-1", "telegram");
|
|
569
|
+
const binding = getGuardianBinding("asst-1", "telegram");
|
|
697
570
|
expect(binding).not.toBeNull();
|
|
698
571
|
expect(binding!.guardianExternalUserId).toBe("old-user");
|
|
699
572
|
});
|
|
@@ -709,7 +582,7 @@ describe("guardian identity check", () => {
|
|
|
709
582
|
});
|
|
710
583
|
|
|
711
584
|
test("isGuardian returns true for matching user", () => {
|
|
712
|
-
|
|
585
|
+
createGuardianBinding({
|
|
713
586
|
assistantId: "asst-1",
|
|
714
587
|
channel: "telegram",
|
|
715
588
|
guardianExternalUserId: "user-42",
|
|
@@ -721,7 +594,7 @@ describe("guardian identity check", () => {
|
|
|
721
594
|
});
|
|
722
595
|
|
|
723
596
|
test("isGuardian returns false for non-matching user", () => {
|
|
724
|
-
|
|
597
|
+
createGuardianBinding({
|
|
725
598
|
assistantId: "asst-1",
|
|
726
599
|
channel: "telegram",
|
|
727
600
|
guardianExternalUserId: "user-42",
|
|
@@ -737,7 +610,7 @@ describe("guardian identity check", () => {
|
|
|
737
610
|
});
|
|
738
611
|
|
|
739
612
|
test("isGuardian returns false after binding is revoked", () => {
|
|
740
|
-
|
|
613
|
+
createGuardianBinding({
|
|
741
614
|
assistantId: "asst-1",
|
|
742
615
|
channel: "telegram",
|
|
743
616
|
guardianExternalUserId: "user-42",
|
|
@@ -745,13 +618,13 @@ describe("guardian identity check", () => {
|
|
|
745
618
|
guardianDeliveryChatId: "chat-42",
|
|
746
619
|
});
|
|
747
620
|
|
|
748
|
-
|
|
621
|
+
serviceRevokeBinding("asst-1", "telegram");
|
|
749
622
|
|
|
750
623
|
expect(isGuardian("asst-1", "telegram", "user-42")).toBe(false);
|
|
751
624
|
});
|
|
752
625
|
|
|
753
626
|
test("getGuardianBinding returns the active binding", () => {
|
|
754
|
-
|
|
627
|
+
createGuardianBinding({
|
|
755
628
|
assistantId: "asst-1",
|
|
756
629
|
channel: "telegram",
|
|
757
630
|
guardianExternalUserId: "user-42",
|
|
@@ -770,7 +643,7 @@ describe("guardian identity check", () => {
|
|
|
770
643
|
});
|
|
771
644
|
|
|
772
645
|
test("isGuardian works for sms channel", () => {
|
|
773
|
-
|
|
646
|
+
createGuardianBinding({
|
|
774
647
|
assistantId: "asst-1",
|
|
775
648
|
channel: "sms",
|
|
776
649
|
guardianExternalUserId: "phone-user-1",
|
|
@@ -785,7 +658,7 @@ describe("guardian identity check", () => {
|
|
|
785
658
|
});
|
|
786
659
|
|
|
787
660
|
test("serviceRevokeBinding revokes the active binding", () => {
|
|
788
|
-
|
|
661
|
+
createGuardianBinding({
|
|
789
662
|
assistantId: "asst-1",
|
|
790
663
|
channel: "telegram",
|
|
791
664
|
guardianExternalUserId: "user-42",
|
|
@@ -811,6 +684,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
811
684
|
test("createApprovalRequest creates a pending request", () => {
|
|
812
685
|
const request = createApprovalRequest({
|
|
813
686
|
runId: "run-1",
|
|
687
|
+
requestId: "req-1",
|
|
814
688
|
conversationId: "conv-1",
|
|
815
689
|
channel: "telegram",
|
|
816
690
|
requesterExternalUserId: "user-99",
|
|
@@ -825,6 +699,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
825
699
|
|
|
826
700
|
expect(request.id).toBeDefined();
|
|
827
701
|
expect(request.runId).toBe("run-1");
|
|
702
|
+
expect(request.requestId).toBe("req-1");
|
|
828
703
|
expect(request.status).toBe("pending");
|
|
829
704
|
expect(request.toolName).toBe("shell");
|
|
830
705
|
expect(request.riskLevel).toBe("high");
|
|
@@ -832,9 +707,10 @@ describe("guardian approval request CRUD", () => {
|
|
|
832
707
|
expect(request.decidedByExternalUserId).toBeNull();
|
|
833
708
|
});
|
|
834
709
|
|
|
835
|
-
test("
|
|
710
|
+
test("getPendingApprovalForRequest returns the pending request", () => {
|
|
836
711
|
createApprovalRequest({
|
|
837
712
|
runId: "run-1",
|
|
713
|
+
requestId: "req-1",
|
|
838
714
|
conversationId: "conv-1",
|
|
839
715
|
channel: "telegram",
|
|
840
716
|
requesterExternalUserId: "user-99",
|
|
@@ -845,20 +721,21 @@ describe("guardian approval request CRUD", () => {
|
|
|
845
721
|
expiresAt: Date.now() + 300_000,
|
|
846
722
|
});
|
|
847
723
|
|
|
848
|
-
const found =
|
|
724
|
+
const found = getPendingApprovalForRequest("req-1");
|
|
849
725
|
expect(found).not.toBeNull();
|
|
850
|
-
expect(found!.
|
|
726
|
+
expect(found!.requestId).toBe("req-1");
|
|
851
727
|
expect(found!.status).toBe("pending");
|
|
852
728
|
});
|
|
853
729
|
|
|
854
|
-
test("
|
|
855
|
-
const found =
|
|
730
|
+
test("getPendingApprovalForRequest returns null when no pending request exists", () => {
|
|
731
|
+
const found = getPendingApprovalForRequest("req-nonexistent");
|
|
856
732
|
expect(found).toBeNull();
|
|
857
733
|
});
|
|
858
734
|
|
|
859
735
|
test("getPendingApprovalByGuardianChat returns pending request for guardian chat", () => {
|
|
860
736
|
createApprovalRequest({
|
|
861
737
|
runId: "run-1",
|
|
738
|
+
requestId: "req-1",
|
|
862
739
|
conversationId: "conv-1",
|
|
863
740
|
channel: "telegram",
|
|
864
741
|
requesterExternalUserId: "user-99",
|
|
@@ -877,6 +754,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
877
754
|
test("getPendingApprovalByGuardianChat returns null for wrong channel", () => {
|
|
878
755
|
createApprovalRequest({
|
|
879
756
|
runId: "run-1",
|
|
757
|
+
requestId: "req-1",
|
|
880
758
|
conversationId: "conv-1",
|
|
881
759
|
channel: "telegram",
|
|
882
760
|
requesterExternalUserId: "user-99",
|
|
@@ -894,6 +772,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
894
772
|
test("updateApprovalDecision updates status to approved", () => {
|
|
895
773
|
const request = createApprovalRequest({
|
|
896
774
|
runId: "run-1",
|
|
775
|
+
requestId: "req-1",
|
|
897
776
|
conversationId: "conv-1",
|
|
898
777
|
channel: "telegram",
|
|
899
778
|
requesterExternalUserId: "user-99",
|
|
@@ -909,14 +788,15 @@ describe("guardian approval request CRUD", () => {
|
|
|
909
788
|
decidedByExternalUserId: "user-42",
|
|
910
789
|
});
|
|
911
790
|
|
|
912
|
-
// After approval,
|
|
913
|
-
const found =
|
|
791
|
+
// After approval, getPendingApprovalForRequest should return null
|
|
792
|
+
const found = getPendingApprovalForRequest("req-1");
|
|
914
793
|
expect(found).toBeNull();
|
|
915
794
|
});
|
|
916
795
|
|
|
917
796
|
test("updateApprovalDecision updates status to denied", () => {
|
|
918
797
|
const request = createApprovalRequest({
|
|
919
798
|
runId: "run-1",
|
|
799
|
+
requestId: "req-1",
|
|
920
800
|
conversationId: "conv-1",
|
|
921
801
|
channel: "telegram",
|
|
922
802
|
requesterExternalUserId: "user-99",
|
|
@@ -932,13 +812,14 @@ describe("guardian approval request CRUD", () => {
|
|
|
932
812
|
decidedByExternalUserId: "user-42",
|
|
933
813
|
});
|
|
934
814
|
|
|
935
|
-
const found =
|
|
815
|
+
const found = getPendingApprovalForRequest("req-1");
|
|
936
816
|
expect(found).toBeNull();
|
|
937
817
|
});
|
|
938
818
|
|
|
939
819
|
test("multiple approval requests for different runs are independent", () => {
|
|
940
820
|
createApprovalRequest({
|
|
941
821
|
runId: "run-1",
|
|
822
|
+
requestId: "req-1",
|
|
942
823
|
conversationId: "conv-1",
|
|
943
824
|
channel: "telegram",
|
|
944
825
|
requesterExternalUserId: "user-99",
|
|
@@ -951,6 +832,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
951
832
|
|
|
952
833
|
createApprovalRequest({
|
|
953
834
|
runId: "run-2",
|
|
835
|
+
requestId: "req-2",
|
|
954
836
|
conversationId: "conv-2",
|
|
955
837
|
channel: "telegram",
|
|
956
838
|
requesterExternalUserId: "user-88",
|
|
@@ -961,8 +843,8 @@ describe("guardian approval request CRUD", () => {
|
|
|
961
843
|
expiresAt: Date.now() + 300_000,
|
|
962
844
|
});
|
|
963
845
|
|
|
964
|
-
const found1 =
|
|
965
|
-
const found2 =
|
|
846
|
+
const found1 = getPendingApprovalForRequest("req-1");
|
|
847
|
+
const found2 = getPendingApprovalForRequest("req-2");
|
|
966
848
|
expect(found1).not.toBeNull();
|
|
967
849
|
expect(found2).not.toBeNull();
|
|
968
850
|
expect(found1!.toolName).toBe("shell");
|
|
@@ -972,6 +854,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
972
854
|
test("createApprovalRequest works for sms channel", () => {
|
|
973
855
|
const request = createApprovalRequest({
|
|
974
856
|
runId: "run-sms-1",
|
|
857
|
+
requestId: "req-sms-1",
|
|
975
858
|
conversationId: "conv-sms-1",
|
|
976
859
|
channel: "sms",
|
|
977
860
|
requesterExternalUserId: "phone-user-99",
|
|
@@ -984,10 +867,11 @@ describe("guardian approval request CRUD", () => {
|
|
|
984
867
|
|
|
985
868
|
expect(request.id).toBeDefined();
|
|
986
869
|
expect(request.runId).toBe("run-sms-1");
|
|
870
|
+
expect(request.requestId).toBe("req-sms-1");
|
|
987
871
|
expect(request.channel).toBe("sms");
|
|
988
872
|
expect(request.status).toBe("pending");
|
|
989
873
|
|
|
990
|
-
const found =
|
|
874
|
+
const found = getPendingApprovalForRequest("req-sms-1");
|
|
991
875
|
expect(found).not.toBeNull();
|
|
992
876
|
expect(found!.channel).toBe("sms");
|
|
993
877
|
});
|
|
@@ -995,6 +879,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
995
879
|
test("getPendingApprovalByGuardianChat works for sms channel", () => {
|
|
996
880
|
createApprovalRequest({
|
|
997
881
|
runId: "run-sms-2",
|
|
882
|
+
requestId: "req-sms-2",
|
|
998
883
|
conversationId: "conv-sms-2",
|
|
999
884
|
channel: "sms",
|
|
1000
885
|
requesterExternalUserId: "phone-user-99",
|
|
@@ -1020,6 +905,7 @@ describe("guardian approval request CRUD", () => {
|
|
|
1020
905
|
test("createApprovalRequest with optional fields omitted defaults to null", () => {
|
|
1021
906
|
const request = createApprovalRequest({
|
|
1022
907
|
runId: "run-1",
|
|
908
|
+
requestId: "req-1",
|
|
1023
909
|
conversationId: "conv-1",
|
|
1024
910
|
channel: "telegram",
|
|
1025
911
|
requesterExternalUserId: "user-99",
|
|
@@ -1345,134 +1231,130 @@ describe("guardian service rate limiting", () => {
|
|
|
1345
1231
|
});
|
|
1346
1232
|
|
|
1347
1233
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
1348
|
-
// 8.
|
|
1234
|
+
// 8. Channel-scoped guardian resolution
|
|
1349
1235
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
1350
1236
|
|
|
1351
|
-
describe("
|
|
1237
|
+
describe("channel-scoped guardian resolution", () => {
|
|
1352
1238
|
beforeEach(() => {
|
|
1353
1239
|
resetTables();
|
|
1354
1240
|
});
|
|
1355
1241
|
|
|
1356
|
-
test("isGuardian resolves independently per
|
|
1357
|
-
// Create guardian binding
|
|
1358
|
-
|
|
1359
|
-
assistantId: "
|
|
1242
|
+
test("isGuardian resolves independently per channel", () => {
|
|
1243
|
+
// Create guardian binding on telegram
|
|
1244
|
+
createGuardianBinding({
|
|
1245
|
+
assistantId: "self",
|
|
1360
1246
|
channel: "telegram",
|
|
1361
1247
|
guardianExternalUserId: "user-alpha",
|
|
1362
1248
|
guardianPrincipalId: "user-alpha",
|
|
1363
1249
|
guardianDeliveryChatId: "chat-alpha",
|
|
1364
1250
|
});
|
|
1365
|
-
// Create guardian binding
|
|
1366
|
-
|
|
1367
|
-
assistantId: "
|
|
1368
|
-
channel: "
|
|
1251
|
+
// Create guardian binding on sms with a different user
|
|
1252
|
+
createGuardianBinding({
|
|
1253
|
+
assistantId: "self",
|
|
1254
|
+
channel: "sms",
|
|
1369
1255
|
guardianExternalUserId: "user-beta",
|
|
1370
1256
|
guardianPrincipalId: "user-beta",
|
|
1371
1257
|
guardianDeliveryChatId: "chat-beta",
|
|
1372
1258
|
});
|
|
1373
1259
|
|
|
1374
|
-
// user-alpha is guardian for
|
|
1375
|
-
expect(isGuardian("
|
|
1376
|
-
expect(isGuardian("
|
|
1260
|
+
// user-alpha is guardian for telegram but not sms
|
|
1261
|
+
expect(isGuardian("self", "telegram", "user-alpha")).toBe(true);
|
|
1262
|
+
expect(isGuardian("self", "sms", "user-alpha")).toBe(false);
|
|
1377
1263
|
|
|
1378
|
-
// user-beta is guardian for
|
|
1379
|
-
expect(isGuardian("
|
|
1380
|
-
expect(isGuardian("
|
|
1264
|
+
// user-beta is guardian for sms but not telegram
|
|
1265
|
+
expect(isGuardian("self", "sms", "user-beta")).toBe(true);
|
|
1266
|
+
expect(isGuardian("self", "telegram", "user-beta")).toBe(false);
|
|
1381
1267
|
});
|
|
1382
1268
|
|
|
1383
|
-
test("getGuardianBinding returns different bindings for different
|
|
1384
|
-
|
|
1385
|
-
assistantId: "
|
|
1269
|
+
test("getGuardianBinding returns different bindings for different channels", () => {
|
|
1270
|
+
createGuardianBinding({
|
|
1271
|
+
assistantId: "self",
|
|
1386
1272
|
channel: "telegram",
|
|
1387
1273
|
guardianExternalUserId: "user-alpha",
|
|
1388
1274
|
guardianPrincipalId: "user-alpha",
|
|
1389
1275
|
guardianDeliveryChatId: "chat-alpha",
|
|
1390
1276
|
});
|
|
1391
|
-
|
|
1392
|
-
assistantId: "
|
|
1393
|
-
channel: "
|
|
1277
|
+
createGuardianBinding({
|
|
1278
|
+
assistantId: "self",
|
|
1279
|
+
channel: "sms",
|
|
1394
1280
|
guardianExternalUserId: "user-beta",
|
|
1395
1281
|
guardianPrincipalId: "user-beta",
|
|
1396
1282
|
guardianDeliveryChatId: "chat-beta",
|
|
1397
1283
|
});
|
|
1398
1284
|
|
|
1399
|
-
const
|
|
1400
|
-
const
|
|
1285
|
+
const bindingTelegram = getGuardianBinding("self", "telegram");
|
|
1286
|
+
const bindingSms = getGuardianBinding("self", "sms");
|
|
1401
1287
|
|
|
1402
|
-
expect(
|
|
1403
|
-
expect(
|
|
1404
|
-
expect(
|
|
1405
|
-
expect(
|
|
1288
|
+
expect(bindingTelegram).not.toBeNull();
|
|
1289
|
+
expect(bindingSms).not.toBeNull();
|
|
1290
|
+
expect(bindingTelegram!.guardianExternalUserId).toBe("user-alpha");
|
|
1291
|
+
expect(bindingSms!.guardianExternalUserId).toBe("user-beta");
|
|
1406
1292
|
});
|
|
1407
1293
|
|
|
1408
|
-
test("revoking binding for one
|
|
1409
|
-
|
|
1410
|
-
assistantId: "
|
|
1294
|
+
test("revoking binding for one channel does not affect another", () => {
|
|
1295
|
+
createGuardianBinding({
|
|
1296
|
+
assistantId: "self",
|
|
1411
1297
|
channel: "telegram",
|
|
1412
1298
|
guardianExternalUserId: "user-alpha",
|
|
1413
1299
|
guardianPrincipalId: "user-alpha",
|
|
1414
1300
|
guardianDeliveryChatId: "chat-alpha",
|
|
1415
1301
|
});
|
|
1416
|
-
|
|
1417
|
-
assistantId: "
|
|
1418
|
-
channel: "
|
|
1302
|
+
createGuardianBinding({
|
|
1303
|
+
assistantId: "self",
|
|
1304
|
+
channel: "sms",
|
|
1419
1305
|
guardianExternalUserId: "user-beta",
|
|
1420
1306
|
guardianPrincipalId: "user-beta",
|
|
1421
1307
|
guardianDeliveryChatId: "chat-beta",
|
|
1422
1308
|
});
|
|
1423
1309
|
|
|
1424
|
-
serviceRevokeBinding("
|
|
1310
|
+
serviceRevokeBinding("self", "telegram");
|
|
1425
1311
|
|
|
1426
|
-
expect(getGuardianBinding("
|
|
1427
|
-
expect(getGuardianBinding("
|
|
1312
|
+
expect(getGuardianBinding("self", "telegram")).toBeNull();
|
|
1313
|
+
expect(getGuardianBinding("self", "sms")).not.toBeNull();
|
|
1428
1314
|
});
|
|
1429
1315
|
|
|
1430
|
-
test("validateAndConsumeChallenge scoped to
|
|
1431
|
-
// Create challenge
|
|
1432
|
-
const { secret:
|
|
1433
|
-
"
|
|
1434
|
-
"telegram",
|
|
1435
|
-
);
|
|
1436
|
-
// Create challenge for asst-B
|
|
1437
|
-
const { secret: secretB } = createVerificationChallenge(
|
|
1438
|
-
"asst-B",
|
|
1316
|
+
test("validateAndConsumeChallenge scoped to channel", () => {
|
|
1317
|
+
// Create challenge on telegram
|
|
1318
|
+
const { secret: secretTelegram } = createVerificationChallenge(
|
|
1319
|
+
"self",
|
|
1439
1320
|
"telegram",
|
|
1440
1321
|
);
|
|
1322
|
+
// Create challenge on sms
|
|
1323
|
+
const { secret: secretSms } = createVerificationChallenge("self", "sms");
|
|
1441
1324
|
|
|
1442
|
-
// Attempting to consume
|
|
1325
|
+
// Attempting to consume telegram challenge on sms should fail
|
|
1443
1326
|
const crossResult = validateAndConsumeChallenge(
|
|
1444
|
-
"
|
|
1445
|
-
"
|
|
1446
|
-
|
|
1327
|
+
"self",
|
|
1328
|
+
"sms",
|
|
1329
|
+
secretTelegram,
|
|
1447
1330
|
"user-1",
|
|
1448
1331
|
"chat-1",
|
|
1449
1332
|
);
|
|
1450
1333
|
expect(crossResult.success).toBe(false);
|
|
1451
1334
|
|
|
1452
|
-
// Consuming with correct
|
|
1453
|
-
const
|
|
1454
|
-
"
|
|
1335
|
+
// Consuming with correct channel should succeed
|
|
1336
|
+
const resultTelegram = validateAndConsumeChallenge(
|
|
1337
|
+
"self",
|
|
1455
1338
|
"telegram",
|
|
1456
|
-
|
|
1339
|
+
secretTelegram,
|
|
1457
1340
|
"user-1",
|
|
1458
1341
|
"chat-1",
|
|
1459
1342
|
);
|
|
1460
|
-
expect(
|
|
1343
|
+
expect(resultTelegram.success).toBe(true);
|
|
1461
1344
|
|
|
1462
|
-
const
|
|
1463
|
-
"
|
|
1464
|
-
"
|
|
1465
|
-
|
|
1345
|
+
const resultSms = validateAndConsumeChallenge(
|
|
1346
|
+
"self",
|
|
1347
|
+
"sms",
|
|
1348
|
+
secretSms,
|
|
1466
1349
|
"user-2",
|
|
1467
1350
|
"chat-2",
|
|
1468
1351
|
);
|
|
1469
|
-
expect(
|
|
1352
|
+
expect(resultSms.success).toBe(true);
|
|
1470
1353
|
|
|
1471
|
-
|
|
1472
|
-
const
|
|
1473
|
-
|
|
1474
|
-
expect(
|
|
1475
|
-
expect(bindingB!.guardianExternalUserId).toBe("user-2");
|
|
1354
|
+
const bindingTelegram = getGuardianBinding("self", "telegram");
|
|
1355
|
+
const bindingSms = getGuardianBinding("self", "sms");
|
|
1356
|
+
expect(bindingTelegram).toBeNull();
|
|
1357
|
+
expect(bindingSms).toBeNull();
|
|
1476
1358
|
});
|
|
1477
1359
|
});
|
|
1478
1360
|
|
|
@@ -1488,6 +1370,7 @@ describe("assistant-scoped approval request lookups", () => {
|
|
|
1488
1370
|
test("createApprovalRequest stores assistantId and defaults to self", () => {
|
|
1489
1371
|
const reqWithoutId = createApprovalRequest({
|
|
1490
1372
|
runId: "run-1",
|
|
1373
|
+
requestId: "req-1",
|
|
1491
1374
|
conversationId: "conv-1",
|
|
1492
1375
|
channel: "telegram",
|
|
1493
1376
|
requesterExternalUserId: "user-99",
|
|
@@ -1501,6 +1384,7 @@ describe("assistant-scoped approval request lookups", () => {
|
|
|
1501
1384
|
|
|
1502
1385
|
const reqWithId = createApprovalRequest({
|
|
1503
1386
|
runId: "run-2",
|
|
1387
|
+
requestId: "req-2",
|
|
1504
1388
|
conversationId: "conv-2",
|
|
1505
1389
|
assistantId: "asst-A",
|
|
1506
1390
|
channel: "telegram",
|
|
@@ -1517,6 +1401,7 @@ describe("assistant-scoped approval request lookups", () => {
|
|
|
1517
1401
|
test("approval requests from different assistants are independent", () => {
|
|
1518
1402
|
createApprovalRequest({
|
|
1519
1403
|
runId: "run-A",
|
|
1404
|
+
requestId: "req-A",
|
|
1520
1405
|
conversationId: "conv-A",
|
|
1521
1406
|
assistantId: "asst-A",
|
|
1522
1407
|
channel: "telegram",
|
|
@@ -1529,6 +1414,7 @@ describe("assistant-scoped approval request lookups", () => {
|
|
|
1529
1414
|
});
|
|
1530
1415
|
createApprovalRequest({
|
|
1531
1416
|
runId: "run-B",
|
|
1417
|
+
requestId: "req-B",
|
|
1532
1418
|
conversationId: "conv-B",
|
|
1533
1419
|
assistantId: "asst-B",
|
|
1534
1420
|
channel: "telegram",
|
|
@@ -1540,8 +1426,8 @@ describe("assistant-scoped approval request lookups", () => {
|
|
|
1540
1426
|
expiresAt: Date.now() + 300_000,
|
|
1541
1427
|
});
|
|
1542
1428
|
|
|
1543
|
-
const foundA =
|
|
1544
|
-
const foundB =
|
|
1429
|
+
const foundA = getPendingApprovalForRequest("req-A");
|
|
1430
|
+
const foundB = getPendingApprovalForRequest("req-B");
|
|
1545
1431
|
expect(foundA).not.toBeNull();
|
|
1546
1432
|
expect(foundB).not.toBeNull();
|
|
1547
1433
|
expect(foundA!.assistantId).toBe("asst-A");
|
|
@@ -1634,7 +1520,7 @@ describe("IPC handler channel-aware guardian status", () => {
|
|
|
1634
1520
|
});
|
|
1635
1521
|
|
|
1636
1522
|
test("status action returns guardianDeliveryChatId when bound", () => {
|
|
1637
|
-
|
|
1523
|
+
createGuardianBinding({
|
|
1638
1524
|
assistantId: "self",
|
|
1639
1525
|
channel: "telegram",
|
|
1640
1526
|
guardianExternalUserId: "user-42",
|
|
@@ -1662,7 +1548,7 @@ describe("IPC handler channel-aware guardian status", () => {
|
|
|
1662
1548
|
});
|
|
1663
1549
|
|
|
1664
1550
|
test("status action returns guardian username/displayName from binding metadata", () => {
|
|
1665
|
-
|
|
1551
|
+
createGuardianBinding({
|
|
1666
1552
|
assistantId: "self",
|
|
1667
1553
|
channel: "telegram",
|
|
1668
1554
|
guardianExternalUserId: "user-43",
|
|
@@ -1674,6 +1560,27 @@ describe("IPC handler channel-aware guardian status", () => {
|
|
|
1674
1560
|
}),
|
|
1675
1561
|
});
|
|
1676
1562
|
|
|
1563
|
+
// The contacts table stores displayName but not username.
|
|
1564
|
+
// The handler falls back to externalConversationStore for username,
|
|
1565
|
+
// so populate it here to ensure identity data is fully surfaced.
|
|
1566
|
+
const now = Date.now();
|
|
1567
|
+
getDb()
|
|
1568
|
+
.insert(conversations)
|
|
1569
|
+
.values({
|
|
1570
|
+
id: "conv-guardian-43",
|
|
1571
|
+
createdAt: now,
|
|
1572
|
+
updatedAt: now,
|
|
1573
|
+
})
|
|
1574
|
+
.run();
|
|
1575
|
+
upsertExternalBinding({
|
|
1576
|
+
conversationId: "conv-guardian-43",
|
|
1577
|
+
sourceChannel: "telegram",
|
|
1578
|
+
externalChatId: "chat-43",
|
|
1579
|
+
externalUserId: "user-43",
|
|
1580
|
+
username: "guardian_handle",
|
|
1581
|
+
displayName: "Guardian Name",
|
|
1582
|
+
});
|
|
1583
|
+
|
|
1677
1584
|
const { ctx, lastResponse } = createMockCtx();
|
|
1678
1585
|
const msg: GuardianVerificationRequest = {
|
|
1679
1586
|
type: "guardian_verification",
|
|
@@ -1850,12 +1757,10 @@ describe("voice guardian challenge validation", () => {
|
|
|
1850
1757
|
);
|
|
1851
1758
|
|
|
1852
1759
|
expect(result.success).toBe(true);
|
|
1853
|
-
|
|
1854
|
-
expect(result.bindingId).toBeDefined();
|
|
1855
|
-
}
|
|
1760
|
+
expect(result.verificationType).toBe("guardian");
|
|
1856
1761
|
});
|
|
1857
1762
|
|
|
1858
|
-
test("validateAndConsumeChallenge
|
|
1763
|
+
test("validateAndConsumeChallenge does not create a guardian binding for voice (caller responsibility)", () => {
|
|
1859
1764
|
const { secret } = createVerificationChallenge("asst-1", "voice");
|
|
1860
1765
|
|
|
1861
1766
|
validateAndConsumeChallenge(
|
|
@@ -1866,12 +1771,8 @@ describe("voice guardian challenge validation", () => {
|
|
|
1866
1771
|
"voice-chat-1",
|
|
1867
1772
|
);
|
|
1868
1773
|
|
|
1869
|
-
const binding =
|
|
1870
|
-
expect(binding).
|
|
1871
|
-
expect(binding!.guardianExternalUserId).toBe("voice-user-1");
|
|
1872
|
-
expect(binding!.guardianDeliveryChatId).toBe("voice-chat-1");
|
|
1873
|
-
expect(binding!.channel).toBe("voice");
|
|
1874
|
-
expect(binding!.verifiedVia).toBe("challenge");
|
|
1774
|
+
const binding = getGuardianBinding("asst-1", "voice");
|
|
1775
|
+
expect(binding).toBeNull();
|
|
1875
1776
|
});
|
|
1876
1777
|
|
|
1877
1778
|
test("validateAndConsumeChallenge fails with wrong voice secret", () => {
|
|
@@ -1950,8 +1851,8 @@ describe("voice guardian challenge validation", () => {
|
|
|
1950
1851
|
expect(result2.success).toBe(false);
|
|
1951
1852
|
});
|
|
1952
1853
|
|
|
1953
|
-
test("validateAndConsumeChallenge
|
|
1954
|
-
|
|
1854
|
+
test("validateAndConsumeChallenge succeeds even with existing voice binding (conflict check is caller responsibility)", () => {
|
|
1855
|
+
createGuardianBinding({
|
|
1955
1856
|
assistantId: "asst-1",
|
|
1956
1857
|
channel: "voice",
|
|
1957
1858
|
guardianExternalUserId: "old-voice-user",
|
|
@@ -1959,11 +1860,10 @@ describe("voice guardian challenge validation", () => {
|
|
|
1959
1860
|
guardianDeliveryChatId: "old-voice-chat",
|
|
1960
1861
|
});
|
|
1961
1862
|
|
|
1962
|
-
const oldBinding =
|
|
1863
|
+
const oldBinding = getGuardianBinding("asst-1", "voice");
|
|
1963
1864
|
expect(oldBinding).not.toBeNull();
|
|
1964
1865
|
expect(oldBinding!.guardianExternalUserId).toBe("old-voice-user");
|
|
1965
1866
|
|
|
1966
|
-
// Attempt verification with a different user — should be rejected
|
|
1967
1867
|
const { secret } = createVerificationChallenge("asst-1", "voice");
|
|
1968
1868
|
const result = validateAndConsumeChallenge(
|
|
1969
1869
|
"asst-1",
|
|
@@ -1973,11 +1873,11 @@ describe("voice guardian challenge validation", () => {
|
|
|
1973
1873
|
"new-voice-chat",
|
|
1974
1874
|
);
|
|
1975
1875
|
|
|
1976
|
-
//
|
|
1977
|
-
expect(result.success).toBe(
|
|
1876
|
+
// Challenge validation succeeds
|
|
1877
|
+
expect(result.success).toBe(true);
|
|
1978
1878
|
|
|
1979
|
-
// The original binding
|
|
1980
|
-
const binding =
|
|
1879
|
+
// The original binding is untouched (no side effects)
|
|
1880
|
+
const binding = getGuardianBinding("asst-1", "voice");
|
|
1981
1881
|
expect(binding).not.toBeNull();
|
|
1982
1882
|
expect(binding!.guardianExternalUserId).toBe("old-voice-user");
|
|
1983
1883
|
});
|
|
@@ -1993,7 +1893,7 @@ describe("voice guardian identity and revocation", () => {
|
|
|
1993
1893
|
});
|
|
1994
1894
|
|
|
1995
1895
|
test("isGuardian works for voice channel", () => {
|
|
1996
|
-
|
|
1896
|
+
createGuardianBinding({
|
|
1997
1897
|
assistantId: "asst-1",
|
|
1998
1898
|
channel: "voice",
|
|
1999
1899
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -2008,7 +1908,7 @@ describe("voice guardian identity and revocation", () => {
|
|
|
2008
1908
|
});
|
|
2009
1909
|
|
|
2010
1910
|
test("getGuardianBinding returns voice binding", () => {
|
|
2011
|
-
|
|
1911
|
+
createGuardianBinding({
|
|
2012
1912
|
assistantId: "asst-1",
|
|
2013
1913
|
channel: "voice",
|
|
2014
1914
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -2023,7 +1923,7 @@ describe("voice guardian identity and revocation", () => {
|
|
|
2023
1923
|
});
|
|
2024
1924
|
|
|
2025
1925
|
test("revokeBinding clears active voice guardian binding", () => {
|
|
2026
|
-
|
|
1926
|
+
createGuardianBinding({
|
|
2027
1927
|
assistantId: "asst-1",
|
|
2028
1928
|
channel: "voice",
|
|
2029
1929
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -2037,14 +1937,14 @@ describe("voice guardian identity and revocation", () => {
|
|
|
2037
1937
|
});
|
|
2038
1938
|
|
|
2039
1939
|
test("revokeBinding for voice does not affect telegram binding", () => {
|
|
2040
|
-
|
|
1940
|
+
createGuardianBinding({
|
|
2041
1941
|
assistantId: "asst-1",
|
|
2042
1942
|
channel: "voice",
|
|
2043
1943
|
guardianExternalUserId: "voice-user-1",
|
|
2044
1944
|
guardianPrincipalId: "voice-user-1",
|
|
2045
1945
|
guardianDeliveryChatId: "voice-chat-1",
|
|
2046
1946
|
});
|
|
2047
|
-
|
|
1947
|
+
createGuardianBinding({
|
|
2048
1948
|
assistantId: "asst-1",
|
|
2049
1949
|
channel: "telegram",
|
|
2050
1950
|
guardianExternalUserId: "tg-user-1",
|
|
@@ -2272,7 +2172,7 @@ describe("IPC handler voice guardian verification", () => {
|
|
|
2272
2172
|
});
|
|
2273
2173
|
|
|
2274
2174
|
test("status for voice reflects bound state", () => {
|
|
2275
|
-
|
|
2175
|
+
createGuardianBinding({
|
|
2276
2176
|
assistantId: "self",
|
|
2277
2177
|
channel: "voice",
|
|
2278
2178
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -2299,7 +2199,7 @@ describe("IPC handler voice guardian verification", () => {
|
|
|
2299
2199
|
});
|
|
2300
2200
|
|
|
2301
2201
|
test("revoke for voice clears active binding", () => {
|
|
2302
|
-
|
|
2202
|
+
createGuardianBinding({
|
|
2303
2203
|
assistantId: "self",
|
|
2304
2204
|
channel: "voice",
|
|
2305
2205
|
guardianExternalUserId: "voice-user-1",
|
|
@@ -2326,14 +2226,14 @@ describe("IPC handler voice guardian verification", () => {
|
|
|
2326
2226
|
});
|
|
2327
2227
|
|
|
2328
2228
|
test("revoke for voice does not affect telegram binding", () => {
|
|
2329
|
-
|
|
2229
|
+
createGuardianBinding({
|
|
2330
2230
|
assistantId: "self",
|
|
2331
2231
|
channel: "voice",
|
|
2332
2232
|
guardianExternalUserId: "voice-user-1",
|
|
2333
2233
|
guardianPrincipalId: "voice-user-1",
|
|
2334
2234
|
guardianDeliveryChatId: "voice-chat-1",
|
|
2335
2235
|
});
|
|
2336
|
-
|
|
2236
|
+
createGuardianBinding({
|
|
2337
2237
|
assistantId: "self",
|
|
2338
2238
|
channel: "telegram",
|
|
2339
2239
|
guardianExternalUserId: "tg-user-1",
|
|
@@ -2592,9 +2492,7 @@ describe("outbound verification sessions", () => {
|
|
|
2592
2492
|
);
|
|
2593
2493
|
|
|
2594
2494
|
expect(result.success).toBe(true);
|
|
2595
|
-
|
|
2596
|
-
expect(result.bindingId).toBeDefined();
|
|
2597
|
-
}
|
|
2495
|
+
expect(result.verificationType).toBe("guardian");
|
|
2598
2496
|
});
|
|
2599
2497
|
|
|
2600
2498
|
// ── Session state transitions ──
|
|
@@ -2892,7 +2790,7 @@ describe("outbound SMS verification", () => {
|
|
|
2892
2790
|
|
|
2893
2791
|
test("start_outbound rejects when active binding exists (rebind=false)", () => {
|
|
2894
2792
|
// Create an existing guardian binding
|
|
2895
|
-
|
|
2793
|
+
createGuardianBinding({
|
|
2896
2794
|
assistantId: "self",
|
|
2897
2795
|
channel: "sms",
|
|
2898
2796
|
guardianExternalUserId: "+15551234567",
|
|
@@ -2919,7 +2817,7 @@ describe("outbound SMS verification", () => {
|
|
|
2919
2817
|
|
|
2920
2818
|
test("start_outbound allows rebind when rebind=true", () => {
|
|
2921
2819
|
// Create an existing guardian binding
|
|
2922
|
-
|
|
2820
|
+
createGuardianBinding({
|
|
2923
2821
|
assistantId: "self",
|
|
2924
2822
|
channel: "sms",
|
|
2925
2823
|
guardianExternalUserId: "+15551234567",
|
|
@@ -3124,14 +3022,7 @@ describe("outbound SMS verification", () => {
|
|
|
3124
3022
|
);
|
|
3125
3023
|
|
|
3126
3024
|
expect(result.success).toBe(true);
|
|
3127
|
-
|
|
3128
|
-
// Guardian outbound sessions (no verificationPurpose override) create
|
|
3129
|
-
// guardian bindings on success
|
|
3130
|
-
expect(result.verificationType).toBe("guardian");
|
|
3131
|
-
if (result.verificationType === "guardian") {
|
|
3132
|
-
expect(result.bindingId).toBeDefined();
|
|
3133
|
-
}
|
|
3134
|
-
}
|
|
3025
|
+
expect(result.verificationType).toBe("guardian");
|
|
3135
3026
|
});
|
|
3136
3027
|
|
|
3137
3028
|
test("inbound SMS from wrong identity + correct code is rejected", () => {
|
|
@@ -3432,7 +3323,7 @@ describe("outbound Telegram verification", () => {
|
|
|
3432
3323
|
});
|
|
3433
3324
|
|
|
3434
3325
|
test("start_outbound for telegram rejects when active binding exists (rebind=false)", () => {
|
|
3435
|
-
|
|
3326
|
+
createGuardianBinding({
|
|
3436
3327
|
assistantId: "self",
|
|
3437
3328
|
channel: "telegram",
|
|
3438
3329
|
guardianExternalUserId: "user-42",
|
|
@@ -3956,7 +3847,7 @@ describe("outbound voice verification", () => {
|
|
|
3956
3847
|
});
|
|
3957
3848
|
|
|
3958
3849
|
test("start_outbound for voice rejects when binding exists (rebind=false)", () => {
|
|
3959
|
-
|
|
3850
|
+
createGuardianBinding({
|
|
3960
3851
|
assistantId: "self",
|
|
3961
3852
|
channel: "voice",
|
|
3962
3853
|
guardianExternalUserId: "+15551234567",
|