@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
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { getConfig } from
|
|
2
|
-
import { orchestrateOAuthConnect } from
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { getConfig } from "../../config/loader.js";
|
|
2
|
+
import { orchestrateOAuthConnect } from "../../oauth/connect-orchestrator.js";
|
|
3
|
+
import {
|
|
4
|
+
getProviderProfile,
|
|
5
|
+
resolveService,
|
|
6
|
+
SERVICE_ALIASES,
|
|
7
|
+
} from "../../oauth/provider-profiles.js";
|
|
8
|
+
import { RiskLevel } from "../../permissions/types.js";
|
|
9
|
+
import type { ToolDefinition } from "../../providers/types.js";
|
|
10
|
+
import type { TokenEndpointAuthMethod } from "../../security/oauth2.js";
|
|
7
11
|
import {
|
|
8
12
|
deleteSecureKey,
|
|
9
13
|
getBackendType,
|
|
@@ -11,21 +15,33 @@ import {
|
|
|
11
15
|
isDowngradedFromKeychain,
|
|
12
16
|
listSecureKeys,
|
|
13
17
|
setSecureKey,
|
|
14
|
-
} from
|
|
15
|
-
import { getLogger } from
|
|
16
|
-
import type { Tool, ToolContext, ToolExecutionResult } from
|
|
17
|
-
import { credentialBroker } from
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
} from "../../security/secure-keys.js";
|
|
19
|
+
import { getLogger } from "../../util/logger.js";
|
|
20
|
+
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
21
|
+
import { credentialBroker } from "./broker.js";
|
|
22
|
+
import {
|
|
23
|
+
assertMetadataWritable,
|
|
24
|
+
deleteCredentialMetadata,
|
|
25
|
+
getCredentialMetadata,
|
|
26
|
+
listCredentialMetadata,
|
|
27
|
+
upsertCredentialMetadata,
|
|
28
|
+
} from "./metadata-store.js";
|
|
29
|
+
import type {
|
|
30
|
+
CredentialInjectionTemplate,
|
|
31
|
+
CredentialPolicyInput,
|
|
32
|
+
} from "./policy-types.js";
|
|
33
|
+
import { toPolicyFromInput, validatePolicyInput } from "./policy-validate.js";
|
|
34
|
+
|
|
35
|
+
const log = getLogger("credential-vault");
|
|
23
36
|
|
|
24
37
|
/**
|
|
25
38
|
* Look up a stored client_id or client_secret for a service.
|
|
26
39
|
* Checks common field names across both the canonical and alias service names.
|
|
27
40
|
*/
|
|
28
|
-
function findStoredOAuthField(
|
|
41
|
+
function findStoredOAuthField(
|
|
42
|
+
service: string,
|
|
43
|
+
fieldNames: string[],
|
|
44
|
+
): string | undefined {
|
|
29
45
|
const servicesToCheck = [service];
|
|
30
46
|
// Also check the alias if the input is the canonical name, or vice versa
|
|
31
47
|
for (const [alias, canonical] of Object.entries(SERVICE_ALIASES)) {
|
|
@@ -42,14 +58,17 @@ function findStoredOAuthField(service: string, fieldNames: string[]): string | u
|
|
|
42
58
|
// Legacy fallback: check credential metadata on the access_token record.
|
|
43
59
|
// Older OAuth2 flows stored client_id/client_secret only in metadata JSON.
|
|
44
60
|
// New flows persist them in the keychain (checked above) for defense in depth.
|
|
45
|
-
const metadataKey = fieldNames.some((f) => f.includes(
|
|
46
|
-
?
|
|
47
|
-
:
|
|
61
|
+
const metadataKey = fieldNames.some((f) => f.includes("client_id"))
|
|
62
|
+
? ("oauth2ClientId" as const)
|
|
63
|
+
: ("oauth2ClientSecret" as const);
|
|
48
64
|
for (const svc of servicesToCheck) {
|
|
49
|
-
const meta = getCredentialMetadata(svc,
|
|
65
|
+
const meta = getCredentialMetadata(svc, "access_token");
|
|
50
66
|
const value = meta?.[metadataKey];
|
|
51
67
|
if (value) {
|
|
52
|
-
log.debug(
|
|
68
|
+
log.debug(
|
|
69
|
+
{ service: svc, field: metadataKey },
|
|
70
|
+
"OAuth client credential resolved from metadata (legacy fallback)",
|
|
71
|
+
);
|
|
53
72
|
return value;
|
|
54
73
|
}
|
|
55
74
|
}
|
|
@@ -58,9 +77,10 @@ function findStoredOAuthField(service: string, fieldNames: string[]): string | u
|
|
|
58
77
|
}
|
|
59
78
|
|
|
60
79
|
class CredentialStoreTool implements Tool {
|
|
61
|
-
name =
|
|
62
|
-
description =
|
|
63
|
-
|
|
80
|
+
name = "credential_store";
|
|
81
|
+
description =
|
|
82
|
+
"Store, list, delete, or prompt for credentials in the secure vault";
|
|
83
|
+
category = "credentials";
|
|
64
84
|
defaultRiskLevel = RiskLevel.Low;
|
|
65
85
|
|
|
66
86
|
getDefinition(): ToolDefinition {
|
|
@@ -68,127 +88,187 @@ class CredentialStoreTool implements Tool {
|
|
|
68
88
|
name: this.name,
|
|
69
89
|
description: this.description,
|
|
70
90
|
input_schema: {
|
|
71
|
-
type:
|
|
91
|
+
type: "object",
|
|
72
92
|
properties: {
|
|
73
93
|
action: {
|
|
74
|
-
type:
|
|
75
|
-
enum: [
|
|
76
|
-
|
|
94
|
+
type: "string",
|
|
95
|
+
enum: [
|
|
96
|
+
"store",
|
|
97
|
+
"list",
|
|
98
|
+
"delete",
|
|
99
|
+
"prompt",
|
|
100
|
+
"oauth2_connect",
|
|
101
|
+
"describe",
|
|
102
|
+
],
|
|
103
|
+
description:
|
|
104
|
+
'The operation to perform. Use "prompt" to ask the user for a secret via secure UI — the value never enters the conversation. Use "oauth2_connect" to connect an OAuth2 service via browser authorization. Use "describe" to get setup metadata for a well-known OAuth service (dashboard URL, scopes, redirect URI, etc.). For well-known services (gmail, slack), only the service name is required — endpoints, scopes, and stored client credentials are resolved automatically.',
|
|
77
105
|
},
|
|
78
106
|
service: {
|
|
79
|
-
type:
|
|
80
|
-
description:
|
|
107
|
+
type: "string",
|
|
108
|
+
description: "Service name, e.g. gmail, github",
|
|
81
109
|
},
|
|
82
110
|
field: {
|
|
83
|
-
type:
|
|
84
|
-
description:
|
|
111
|
+
type: "string",
|
|
112
|
+
description: "Field name, e.g. password, username, recovery_email",
|
|
85
113
|
},
|
|
86
114
|
value: {
|
|
87
|
-
type:
|
|
88
|
-
description:
|
|
115
|
+
type: "string",
|
|
116
|
+
description: "The credential value (only for store action)",
|
|
89
117
|
},
|
|
90
118
|
label: {
|
|
91
|
-
type:
|
|
92
|
-
description:
|
|
119
|
+
type: "string",
|
|
120
|
+
description:
|
|
121
|
+
'Display label for the prompt UI (only for prompt action), e.g. "GitHub Personal Access Token"',
|
|
93
122
|
},
|
|
94
123
|
description: {
|
|
95
|
-
type:
|
|
96
|
-
description:
|
|
124
|
+
type: "string",
|
|
125
|
+
description:
|
|
126
|
+
'Optional context shown in the prompt UI (only for prompt action), e.g. "Needed to push changes"',
|
|
97
127
|
},
|
|
98
128
|
placeholder: {
|
|
99
|
-
type:
|
|
100
|
-
description:
|
|
129
|
+
type: "string",
|
|
130
|
+
description:
|
|
131
|
+
'Placeholder text for the input field (only for prompt action), e.g. "ghp_xxxxxxxxxxxx"',
|
|
101
132
|
},
|
|
102
133
|
allowed_tools: {
|
|
103
|
-
type:
|
|
104
|
-
items: { type:
|
|
105
|
-
description:
|
|
134
|
+
type: "array",
|
|
135
|
+
items: { type: "string" },
|
|
136
|
+
description:
|
|
137
|
+
'Tools allowed to use this credential (for store/prompt actions), e.g. ["browser_fill_credential"]. Empty = deny all.',
|
|
106
138
|
},
|
|
107
139
|
allowed_domains: {
|
|
108
|
-
type:
|
|
109
|
-
items: { type:
|
|
110
|
-
description:
|
|
140
|
+
type: "array",
|
|
141
|
+
items: { type: "string" },
|
|
142
|
+
description:
|
|
143
|
+
'Domains where this credential may be used (for store/prompt actions), e.g. ["github.com"]. Empty = deny all.',
|
|
111
144
|
},
|
|
112
145
|
usage_description: {
|
|
113
|
-
type:
|
|
114
|
-
description:
|
|
146
|
+
type: "string",
|
|
147
|
+
description:
|
|
148
|
+
'Human-readable description of intended usage (for store/prompt actions), e.g. "GitHub login for pushing changes"',
|
|
115
149
|
},
|
|
116
150
|
auth_url: {
|
|
117
|
-
type:
|
|
118
|
-
description:
|
|
151
|
+
type: "string",
|
|
152
|
+
description:
|
|
153
|
+
"OAuth2 authorization endpoint (only for oauth2_connect action). Auto-filled for well-known services (gmail, slack).",
|
|
119
154
|
},
|
|
120
155
|
token_url: {
|
|
121
|
-
type:
|
|
122
|
-
description:
|
|
156
|
+
type: "string",
|
|
157
|
+
description:
|
|
158
|
+
"OAuth2 token endpoint (only for oauth2_connect action). Auto-filled for well-known services (gmail, slack).",
|
|
123
159
|
},
|
|
124
160
|
scopes: {
|
|
125
|
-
type:
|
|
126
|
-
items: { type:
|
|
127
|
-
description:
|
|
161
|
+
type: "array",
|
|
162
|
+
items: { type: "string" },
|
|
163
|
+
description:
|
|
164
|
+
"OAuth2 scopes to request (only for oauth2_connect action). Auto-filled for well-known services (gmail, slack).",
|
|
128
165
|
},
|
|
129
166
|
client_id: {
|
|
130
|
-
type:
|
|
131
|
-
description:
|
|
167
|
+
type: "string",
|
|
168
|
+
description:
|
|
169
|
+
"OAuth2 client ID (only for oauth2_connect action). If omitted, looked up from previously stored credentials.",
|
|
132
170
|
},
|
|
133
171
|
extra_params: {
|
|
134
|
-
type:
|
|
135
|
-
description:
|
|
172
|
+
type: "object",
|
|
173
|
+
description:
|
|
174
|
+
"Extra query params for OAuth2 auth URL (only for oauth2_connect action)",
|
|
136
175
|
},
|
|
137
176
|
userinfo_url: {
|
|
138
|
-
type:
|
|
139
|
-
description:
|
|
177
|
+
type: "string",
|
|
178
|
+
description:
|
|
179
|
+
"Endpoint to fetch account info after OAuth2 auth (only for oauth2_connect action)",
|
|
140
180
|
},
|
|
141
181
|
client_secret: {
|
|
142
|
-
type:
|
|
143
|
-
description:
|
|
182
|
+
type: "string",
|
|
183
|
+
description:
|
|
184
|
+
"OAuth2 client secret for providers that require it (e.g. Google, Slack). If omitted, looked up from previously stored credentials; if still absent, PKCE-only is used (only for oauth2_connect action)",
|
|
144
185
|
},
|
|
145
186
|
token_endpoint_auth_method: {
|
|
146
|
-
type:
|
|
147
|
-
enum: [
|
|
148
|
-
description:
|
|
187
|
+
type: "string",
|
|
188
|
+
enum: ["client_secret_basic", "client_secret_post"],
|
|
189
|
+
description:
|
|
190
|
+
'How to send client credentials at the token endpoint: "client_secret_post" (default, in POST body) or "client_secret_basic" (HTTP Basic Auth header). Only for oauth2_connect action.',
|
|
149
191
|
},
|
|
150
192
|
alias: {
|
|
151
|
-
type:
|
|
152
|
-
description:
|
|
193
|
+
type: "string",
|
|
194
|
+
description:
|
|
195
|
+
'Human-friendly name for this credential (only for store action), e.g. "fal-primary"',
|
|
153
196
|
},
|
|
154
197
|
injection_templates: {
|
|
155
|
-
type:
|
|
198
|
+
type: "array",
|
|
156
199
|
items: {
|
|
157
|
-
type:
|
|
200
|
+
type: "object",
|
|
158
201
|
properties: {
|
|
159
|
-
hostPattern: {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
202
|
+
hostPattern: {
|
|
203
|
+
type: "string",
|
|
204
|
+
description:
|
|
205
|
+
'Glob pattern for matching request hosts, e.g. "*.fal.ai"',
|
|
206
|
+
},
|
|
207
|
+
injectionType: {
|
|
208
|
+
type: "string",
|
|
209
|
+
enum: ["header", "query"],
|
|
210
|
+
description: "Where to inject the credential value",
|
|
211
|
+
},
|
|
212
|
+
headerName: {
|
|
213
|
+
type: "string",
|
|
214
|
+
description: 'Header name when injectionType is "header"',
|
|
215
|
+
},
|
|
216
|
+
valuePrefix: {
|
|
217
|
+
type: "string",
|
|
218
|
+
description:
|
|
219
|
+
'Prefix prepended to the secret value, e.g. "Key ", "Bearer "',
|
|
220
|
+
},
|
|
221
|
+
queryParamName: {
|
|
222
|
+
type: "string",
|
|
223
|
+
description:
|
|
224
|
+
'Query parameter name when injectionType is "query"',
|
|
225
|
+
},
|
|
164
226
|
},
|
|
165
|
-
required: [
|
|
227
|
+
required: ["hostPattern", "injectionType"],
|
|
166
228
|
},
|
|
167
|
-
description:
|
|
229
|
+
description:
|
|
230
|
+
"Templates describing how to inject this credential into proxied requests (only for store action)",
|
|
231
|
+
},
|
|
232
|
+
reason: {
|
|
233
|
+
type: "string",
|
|
234
|
+
description:
|
|
235
|
+
"Brief non-technical explanation of what you are doing and why, shown to the user as a status update. Use simple language a non-technical person would understand.",
|
|
168
236
|
},
|
|
169
237
|
},
|
|
170
|
-
required: [
|
|
238
|
+
required: ["action"],
|
|
171
239
|
},
|
|
172
240
|
};
|
|
173
241
|
}
|
|
174
242
|
|
|
175
|
-
async execute(
|
|
243
|
+
async execute(
|
|
244
|
+
input: Record<string, unknown>,
|
|
245
|
+
context: ToolContext,
|
|
246
|
+
): Promise<ToolExecutionResult> {
|
|
176
247
|
const action = input.action as string;
|
|
177
248
|
|
|
178
249
|
switch (action) {
|
|
179
|
-
case
|
|
250
|
+
case "store": {
|
|
180
251
|
const service = input.service as string | undefined;
|
|
181
252
|
const field = input.field as string | undefined;
|
|
182
253
|
const value = input.value as string | undefined;
|
|
183
254
|
|
|
184
|
-
if (!service || typeof service !==
|
|
185
|
-
return {
|
|
255
|
+
if (!service || typeof service !== "string") {
|
|
256
|
+
return {
|
|
257
|
+
content: "Error: service is required for store action",
|
|
258
|
+
isError: true,
|
|
259
|
+
};
|
|
186
260
|
}
|
|
187
|
-
if (!field || typeof field !==
|
|
188
|
-
return {
|
|
261
|
+
if (!field || typeof field !== "string") {
|
|
262
|
+
return {
|
|
263
|
+
content: "Error: field is required for store action",
|
|
264
|
+
isError: true,
|
|
265
|
+
};
|
|
189
266
|
}
|
|
190
|
-
if (!value || typeof value !==
|
|
191
|
-
return {
|
|
267
|
+
if (!value || typeof value !== "string") {
|
|
268
|
+
return {
|
|
269
|
+
content: "Error: value is required for store action",
|
|
270
|
+
isError: true,
|
|
271
|
+
};
|
|
192
272
|
}
|
|
193
273
|
|
|
194
274
|
const policyInput: CredentialPolicyInput = {
|
|
@@ -198,13 +278,16 @@ class CredentialStoreTool implements Tool {
|
|
|
198
278
|
};
|
|
199
279
|
const policyResult = validatePolicyInput(policyInput);
|
|
200
280
|
if (!policyResult.valid) {
|
|
201
|
-
return {
|
|
281
|
+
return {
|
|
282
|
+
content: `Error: ${policyResult.errors.join("; ")}`,
|
|
283
|
+
isError: true,
|
|
284
|
+
};
|
|
202
285
|
}
|
|
203
286
|
const policy = toPolicyFromInput(policyInput);
|
|
204
287
|
|
|
205
288
|
const alias = input.alias;
|
|
206
|
-
if (alias !== undefined && typeof alias !==
|
|
207
|
-
return { content:
|
|
289
|
+
if (alias !== undefined && typeof alias !== "string") {
|
|
290
|
+
return { content: "Error: alias must be a string", isError: true };
|
|
208
291
|
}
|
|
209
292
|
const rawTemplates = input.injection_templates as unknown[] | undefined;
|
|
210
293
|
|
|
@@ -212,58 +295,100 @@ class CredentialStoreTool implements Tool {
|
|
|
212
295
|
let injectionTemplates: CredentialInjectionTemplate[] | undefined;
|
|
213
296
|
if (rawTemplates !== undefined) {
|
|
214
297
|
if (!Array.isArray(rawTemplates)) {
|
|
215
|
-
return {
|
|
298
|
+
return {
|
|
299
|
+
content: "Error: injection_templates must be an array",
|
|
300
|
+
isError: true,
|
|
301
|
+
};
|
|
216
302
|
}
|
|
217
303
|
const templateErrors: string[] = [];
|
|
218
304
|
injectionTemplates = [];
|
|
219
305
|
for (let i = 0; i < rawTemplates.length; i++) {
|
|
220
306
|
const t = rawTemplates[i] as Record<string, unknown>;
|
|
221
|
-
if (typeof t !==
|
|
222
|
-
templateErrors.push(
|
|
307
|
+
if (typeof t !== "object" || t == null) {
|
|
308
|
+
templateErrors.push(
|
|
309
|
+
`injection_templates[${i}] must be an object`,
|
|
310
|
+
);
|
|
223
311
|
continue;
|
|
224
312
|
}
|
|
225
|
-
if (
|
|
226
|
-
|
|
313
|
+
if (
|
|
314
|
+
typeof t.hostPattern !== "string" ||
|
|
315
|
+
t.hostPattern.trim().length === 0
|
|
316
|
+
) {
|
|
317
|
+
templateErrors.push(
|
|
318
|
+
`injection_templates[${i}].hostPattern must be a non-empty string`,
|
|
319
|
+
);
|
|
227
320
|
}
|
|
228
|
-
if (t.injectionType !==
|
|
229
|
-
templateErrors.push(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
321
|
+
if (t.injectionType !== "header" && t.injectionType !== "query") {
|
|
322
|
+
templateErrors.push(
|
|
323
|
+
`injection_templates[${i}].injectionType must be 'header' or 'query'`,
|
|
324
|
+
);
|
|
325
|
+
} else if (t.injectionType === "header") {
|
|
326
|
+
if (
|
|
327
|
+
typeof t.headerName !== "string" ||
|
|
328
|
+
t.headerName.trim().length === 0
|
|
329
|
+
) {
|
|
330
|
+
templateErrors.push(
|
|
331
|
+
`injection_templates[${i}].headerName is required when injectionType is 'header'`,
|
|
332
|
+
);
|
|
233
333
|
}
|
|
234
|
-
} else if (t.injectionType ===
|
|
235
|
-
if (
|
|
236
|
-
|
|
334
|
+
} else if (t.injectionType === "query") {
|
|
335
|
+
if (
|
|
336
|
+
typeof t.queryParamName !== "string" ||
|
|
337
|
+
t.queryParamName.trim().length === 0
|
|
338
|
+
) {
|
|
339
|
+
templateErrors.push(
|
|
340
|
+
`injection_templates[${i}].queryParamName is required when injectionType is 'query'`,
|
|
341
|
+
);
|
|
237
342
|
}
|
|
238
343
|
}
|
|
239
|
-
if (
|
|
240
|
-
|
|
344
|
+
if (
|
|
345
|
+
t.valuePrefix !== undefined &&
|
|
346
|
+
typeof t.valuePrefix !== "string"
|
|
347
|
+
) {
|
|
348
|
+
templateErrors.push(
|
|
349
|
+
`injection_templates[${i}].valuePrefix must be a string`,
|
|
350
|
+
);
|
|
241
351
|
}
|
|
242
352
|
if (templateErrors.length === 0) {
|
|
243
353
|
injectionTemplates.push({
|
|
244
354
|
hostPattern: t.hostPattern as string,
|
|
245
|
-
injectionType: t.injectionType as
|
|
246
|
-
headerName:
|
|
247
|
-
|
|
248
|
-
|
|
355
|
+
injectionType: t.injectionType as "header" | "query",
|
|
356
|
+
headerName:
|
|
357
|
+
typeof t.headerName === "string" ? t.headerName : undefined,
|
|
358
|
+
valuePrefix:
|
|
359
|
+
typeof t.valuePrefix === "string" ? t.valuePrefix : undefined,
|
|
360
|
+
queryParamName:
|
|
361
|
+
typeof t.queryParamName === "string"
|
|
362
|
+
? t.queryParamName
|
|
363
|
+
: undefined,
|
|
249
364
|
});
|
|
250
365
|
}
|
|
251
366
|
}
|
|
252
367
|
if (templateErrors.length > 0) {
|
|
253
|
-
return {
|
|
368
|
+
return {
|
|
369
|
+
content: `Error: ${templateErrors.join("; ")}`,
|
|
370
|
+
isError: true,
|
|
371
|
+
};
|
|
254
372
|
}
|
|
255
373
|
}
|
|
256
374
|
|
|
257
375
|
try {
|
|
258
376
|
assertMetadataWritable();
|
|
259
377
|
} catch {
|
|
260
|
-
return {
|
|
378
|
+
return {
|
|
379
|
+
content:
|
|
380
|
+
"Error: credential metadata file has an unrecognized version; cannot store credentials",
|
|
381
|
+
isError: true,
|
|
382
|
+
};
|
|
261
383
|
}
|
|
262
384
|
|
|
263
385
|
const key = `credential:${service}:${field}`;
|
|
264
386
|
const ok = setSecureKey(key, value);
|
|
265
387
|
if (!ok) {
|
|
266
|
-
return {
|
|
388
|
+
return {
|
|
389
|
+
content: "Error: failed to store credential",
|
|
390
|
+
isError: true,
|
|
391
|
+
};
|
|
267
392
|
}
|
|
268
393
|
try {
|
|
269
394
|
upsertCredentialMetadata(service, field, {
|
|
@@ -274,18 +399,30 @@ class CredentialStoreTool implements Tool {
|
|
|
274
399
|
injectionTemplates,
|
|
275
400
|
});
|
|
276
401
|
} catch (err) {
|
|
277
|
-
log.warn(
|
|
402
|
+
log.warn(
|
|
403
|
+
{ service, field, err },
|
|
404
|
+
"metadata write failed after storing credential",
|
|
405
|
+
);
|
|
278
406
|
}
|
|
279
407
|
const metadata = getCredentialMetadata(service, field);
|
|
280
|
-
const credIdSuffix = metadata
|
|
281
|
-
|
|
408
|
+
const credIdSuffix = metadata
|
|
409
|
+
? ` (credential_id: ${metadata.credentialId})`
|
|
410
|
+
: "";
|
|
411
|
+
return {
|
|
412
|
+
content: `Stored credential for ${service}/${field}.${credIdSuffix}`,
|
|
413
|
+
isError: false,
|
|
414
|
+
};
|
|
282
415
|
}
|
|
283
416
|
|
|
284
|
-
case
|
|
417
|
+
case "list": {
|
|
285
418
|
try {
|
|
286
419
|
assertMetadataWritable();
|
|
287
420
|
} catch {
|
|
288
|
-
return {
|
|
421
|
+
return {
|
|
422
|
+
content:
|
|
423
|
+
"Error: credential metadata file has an unrecognized version; cannot list credentials",
|
|
424
|
+
isError: true,
|
|
425
|
+
};
|
|
289
426
|
}
|
|
290
427
|
|
|
291
428
|
const allMetadata = listCredentialMetadata();
|
|
@@ -297,19 +434,27 @@ class CredentialStoreTool implements Tool {
|
|
|
297
434
|
// batch verification because listSecureKeys() only returns keys from
|
|
298
435
|
// the encrypted store — keychain-only credentials would be hidden.
|
|
299
436
|
const downgraded = isDowngradedFromKeychain();
|
|
300
|
-
const verifySecrets = getBackendType() ===
|
|
437
|
+
const verifySecrets = getBackendType() === "encrypted" && !downgraded;
|
|
301
438
|
let secureKeySet: Set<string> | undefined;
|
|
302
439
|
if (verifySecrets) {
|
|
303
440
|
try {
|
|
304
441
|
secureKeySet = new Set(listSecureKeys());
|
|
305
442
|
} catch (err) {
|
|
306
|
-
log.error(
|
|
307
|
-
|
|
443
|
+
log.error(
|
|
444
|
+
{ err },
|
|
445
|
+
"Failed to read secure store while listing credentials",
|
|
446
|
+
);
|
|
447
|
+
return {
|
|
448
|
+
content:
|
|
449
|
+
"Error: failed to read secure storage; cannot list credentials",
|
|
450
|
+
isError: true,
|
|
451
|
+
};
|
|
308
452
|
}
|
|
309
453
|
}
|
|
310
454
|
const entries = allMetadata
|
|
311
455
|
.filter((m) => {
|
|
312
|
-
if (secureKeySet)
|
|
456
|
+
if (secureKeySet)
|
|
457
|
+
return secureKeySet.has(`credential:${m.service}:${m.field}`);
|
|
313
458
|
return true;
|
|
314
459
|
})
|
|
315
460
|
.map((m) => {
|
|
@@ -332,49 +477,77 @@ class CredentialStoreTool implements Tool {
|
|
|
332
477
|
return { content: JSON.stringify(entries, null, 2), isError: false };
|
|
333
478
|
}
|
|
334
479
|
|
|
335
|
-
case
|
|
480
|
+
case "delete": {
|
|
336
481
|
const service = input.service as string | undefined;
|
|
337
482
|
const field = input.field as string | undefined;
|
|
338
483
|
|
|
339
|
-
if (!service || typeof service !==
|
|
340
|
-
return {
|
|
484
|
+
if (!service || typeof service !== "string") {
|
|
485
|
+
return {
|
|
486
|
+
content: "Error: service is required for delete action",
|
|
487
|
+
isError: true,
|
|
488
|
+
};
|
|
341
489
|
}
|
|
342
|
-
if (!field || typeof field !==
|
|
343
|
-
return {
|
|
490
|
+
if (!field || typeof field !== "string") {
|
|
491
|
+
return {
|
|
492
|
+
content: "Error: field is required for delete action",
|
|
493
|
+
isError: true,
|
|
494
|
+
};
|
|
344
495
|
}
|
|
345
496
|
|
|
346
497
|
try {
|
|
347
498
|
assertMetadataWritable();
|
|
348
499
|
} catch {
|
|
349
|
-
return {
|
|
500
|
+
return {
|
|
501
|
+
content:
|
|
502
|
+
"Error: credential metadata file has an unrecognized version; cannot delete credentials",
|
|
503
|
+
isError: true,
|
|
504
|
+
};
|
|
350
505
|
}
|
|
351
506
|
|
|
352
507
|
const key = `credential:${service}:${field}`;
|
|
353
508
|
const ok = deleteSecureKey(key);
|
|
354
509
|
if (!ok) {
|
|
355
|
-
return {
|
|
510
|
+
return {
|
|
511
|
+
content: `Error: credential ${service}/${field} not found`,
|
|
512
|
+
isError: true,
|
|
513
|
+
};
|
|
356
514
|
}
|
|
357
515
|
try {
|
|
358
516
|
deleteCredentialMetadata(service, field);
|
|
359
517
|
} catch (err) {
|
|
360
|
-
log.warn(
|
|
518
|
+
log.warn(
|
|
519
|
+
{ service, field, err },
|
|
520
|
+
"metadata delete failed after removing credential",
|
|
521
|
+
);
|
|
361
522
|
}
|
|
362
|
-
return {
|
|
523
|
+
return {
|
|
524
|
+
content: `Deleted credential for ${service}/${field}.`,
|
|
525
|
+
isError: false,
|
|
526
|
+
};
|
|
363
527
|
}
|
|
364
528
|
|
|
365
|
-
case
|
|
529
|
+
case "prompt": {
|
|
366
530
|
const service = input.service as string | undefined;
|
|
367
531
|
const field = input.field as string | undefined;
|
|
368
532
|
|
|
369
|
-
if (!service || typeof service !==
|
|
370
|
-
return {
|
|
533
|
+
if (!service || typeof service !== "string") {
|
|
534
|
+
return {
|
|
535
|
+
content: "Error: service is required for prompt action",
|
|
536
|
+
isError: true,
|
|
537
|
+
};
|
|
371
538
|
}
|
|
372
|
-
if (!field || typeof field !==
|
|
373
|
-
return {
|
|
539
|
+
if (!field || typeof field !== "string") {
|
|
540
|
+
return {
|
|
541
|
+
content: "Error: field is required for prompt action",
|
|
542
|
+
isError: true,
|
|
543
|
+
};
|
|
374
544
|
}
|
|
375
545
|
|
|
376
546
|
if (!context.requestSecret) {
|
|
377
|
-
return {
|
|
547
|
+
return {
|
|
548
|
+
content: "Error: secret prompting not available in this context",
|
|
549
|
+
isError: true,
|
|
550
|
+
};
|
|
378
551
|
}
|
|
379
552
|
|
|
380
553
|
const label = (input.label as string) || `${service} ${field}`;
|
|
@@ -388,33 +561,57 @@ class CredentialStoreTool implements Tool {
|
|
|
388
561
|
};
|
|
389
562
|
const promptPolicyResult = validatePolicyInput(promptPolicyInput);
|
|
390
563
|
if (!promptPolicyResult.valid) {
|
|
391
|
-
return {
|
|
564
|
+
return {
|
|
565
|
+
content: `Error: ${promptPolicyResult.errors.join("; ")}`,
|
|
566
|
+
isError: true,
|
|
567
|
+
};
|
|
392
568
|
}
|
|
393
569
|
const promptPolicy = toPolicyFromInput(promptPolicyInput);
|
|
394
570
|
|
|
395
571
|
try {
|
|
396
572
|
assertMetadataWritable();
|
|
397
573
|
} catch {
|
|
398
|
-
return {
|
|
574
|
+
return {
|
|
575
|
+
content:
|
|
576
|
+
"Error: credential metadata file has an unrecognized version; cannot store credentials",
|
|
577
|
+
isError: true,
|
|
578
|
+
};
|
|
399
579
|
}
|
|
400
580
|
|
|
401
581
|
const result = await context.requestSecret({
|
|
402
|
-
service,
|
|
582
|
+
service,
|
|
583
|
+
field,
|
|
584
|
+
label,
|
|
585
|
+
description,
|
|
586
|
+
placeholder,
|
|
403
587
|
purpose: promptPolicy.usageDescription,
|
|
404
|
-
allowedTools:
|
|
405
|
-
|
|
588
|
+
allowedTools:
|
|
589
|
+
promptPolicy.allowedTools.length > 0
|
|
590
|
+
? promptPolicy.allowedTools
|
|
591
|
+
: undefined,
|
|
592
|
+
allowedDomains:
|
|
593
|
+
promptPolicy.allowedDomains.length > 0
|
|
594
|
+
? promptPolicy.allowedDomains
|
|
595
|
+
: undefined,
|
|
406
596
|
});
|
|
407
597
|
if (!result.value) {
|
|
408
|
-
return {
|
|
598
|
+
return {
|
|
599
|
+
content: "User cancelled the credential prompt.",
|
|
600
|
+
isError: false,
|
|
601
|
+
};
|
|
409
602
|
}
|
|
410
603
|
|
|
411
604
|
// Handle one-time send delivery: inject into context without persisting
|
|
412
|
-
if (result.delivery ===
|
|
605
|
+
if (result.delivery === "transient_send") {
|
|
413
606
|
const config = getConfig();
|
|
414
607
|
if (!config.secretDetection.allowOneTimeSend) {
|
|
415
|
-
log.warn(
|
|
608
|
+
log.warn(
|
|
609
|
+
{ service, field },
|
|
610
|
+
"One-time send requested but not enabled in config",
|
|
611
|
+
);
|
|
416
612
|
return {
|
|
417
|
-
content:
|
|
613
|
+
content:
|
|
614
|
+
"Error: one-time send is not enabled. Set secretDetection.allowOneTimeSend to true in config.",
|
|
418
615
|
isError: true,
|
|
419
616
|
};
|
|
420
617
|
}
|
|
@@ -433,7 +630,10 @@ class CredentialStoreTool implements Tool {
|
|
|
433
630
|
} catch (err) {
|
|
434
631
|
// Without metadata the broker's policy checks will reject usage,
|
|
435
632
|
// so the transient value would be silently unusable. Fail loudly.
|
|
436
|
-
log.error(
|
|
633
|
+
log.error(
|
|
634
|
+
{ service, field, err },
|
|
635
|
+
"metadata write failed for transient credential",
|
|
636
|
+
);
|
|
437
637
|
return {
|
|
438
638
|
content: `Error: failed to write credential metadata for ${service}/${field}; the one-time value was discarded.`,
|
|
439
639
|
isError: true,
|
|
@@ -442,7 +642,10 @@ class CredentialStoreTool implements Tool {
|
|
|
442
642
|
}
|
|
443
643
|
// Inject into broker for one-time use by the next tool call, then discard
|
|
444
644
|
credentialBroker.injectTransient(service, field, result.value);
|
|
445
|
-
log.info(
|
|
645
|
+
log.info(
|
|
646
|
+
{ service, field, delivery: "transient_send" },
|
|
647
|
+
"One-time secret delivery used",
|
|
648
|
+
);
|
|
446
649
|
return {
|
|
447
650
|
content: `One-time credential provided for ${service}/${field}. The value was NOT saved to the vault and will be consumed by the next operation.`,
|
|
448
651
|
isError: false,
|
|
@@ -453,7 +656,10 @@ class CredentialStoreTool implements Tool {
|
|
|
453
656
|
const key = `credential:${service}:${field}`;
|
|
454
657
|
const ok = setSecureKey(key, result.value);
|
|
455
658
|
if (!ok) {
|
|
456
|
-
return {
|
|
659
|
+
return {
|
|
660
|
+
content: "Error: failed to store credential",
|
|
661
|
+
isError: true,
|
|
662
|
+
};
|
|
457
663
|
}
|
|
458
664
|
try {
|
|
459
665
|
upsertCredentialMetadata(service, field, {
|
|
@@ -462,16 +668,28 @@ class CredentialStoreTool implements Tool {
|
|
|
462
668
|
usageDescription: promptPolicy.usageDescription,
|
|
463
669
|
});
|
|
464
670
|
} catch (err) {
|
|
465
|
-
log.warn(
|
|
671
|
+
log.warn(
|
|
672
|
+
{ service, field, err },
|
|
673
|
+
"metadata write failed after storing credential",
|
|
674
|
+
);
|
|
466
675
|
}
|
|
467
676
|
const promptMeta = getCredentialMetadata(service, field);
|
|
468
|
-
const promptCredIdSuffix = promptMeta
|
|
469
|
-
|
|
677
|
+
const promptCredIdSuffix = promptMeta
|
|
678
|
+
? ` (credential_id: ${promptMeta.credentialId})`
|
|
679
|
+
: "";
|
|
680
|
+
return {
|
|
681
|
+
content: `Credential stored for ${service}/${field}.${promptCredIdSuffix}`,
|
|
682
|
+
isError: false,
|
|
683
|
+
};
|
|
470
684
|
}
|
|
471
685
|
|
|
472
|
-
case
|
|
686
|
+
case "oauth2_connect": {
|
|
473
687
|
const rawService = input.service as string | undefined;
|
|
474
|
-
if (!rawService)
|
|
688
|
+
if (!rawService)
|
|
689
|
+
return {
|
|
690
|
+
content: "Error: service is required for oauth2_connect action",
|
|
691
|
+
isError: true,
|
|
692
|
+
};
|
|
475
693
|
|
|
476
694
|
// Resolve aliases (e.g. "gmail" → "integration:gmail")
|
|
477
695
|
const service = resolveService(rawService);
|
|
@@ -480,10 +698,15 @@ class CredentialStoreTool implements Tool {
|
|
|
480
698
|
const profile = getProviderProfile(service);
|
|
481
699
|
|
|
482
700
|
// Look up client_id/client_secret from stored credentials if not provided
|
|
483
|
-
const clientId =
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
701
|
+
const clientId =
|
|
702
|
+
(input.client_id as string | undefined) ??
|
|
703
|
+
findStoredOAuthField(service, ["client_id", "oauth_client_id"]);
|
|
704
|
+
const clientSecret =
|
|
705
|
+
(input.client_secret as string | undefined) ??
|
|
706
|
+
findStoredOAuthField(service, [
|
|
707
|
+
"client_secret",
|
|
708
|
+
"oauth_client_secret",
|
|
709
|
+
]);
|
|
487
710
|
|
|
488
711
|
// Early guardrails that stay in vault.ts (credential resolution is vault-specific)
|
|
489
712
|
const inputScopes = input.scopes as string[] | undefined;
|
|
@@ -495,20 +718,43 @@ class CredentialStoreTool implements Tool {
|
|
|
495
718
|
// If no scopes provided, pass neither — let the orchestrator use profile defaults via scope policy.
|
|
496
719
|
} else {
|
|
497
720
|
// Custom/unknown provider: require authUrl, tokenUrl, scopes from input
|
|
498
|
-
if (!input.auth_url)
|
|
499
|
-
|
|
500
|
-
|
|
721
|
+
if (!input.auth_url)
|
|
722
|
+
return {
|
|
723
|
+
content:
|
|
724
|
+
"Error: auth_url is required for oauth2_connect action (no well-known config for this service)",
|
|
725
|
+
isError: true,
|
|
726
|
+
};
|
|
727
|
+
if (!input.token_url)
|
|
728
|
+
return {
|
|
729
|
+
content:
|
|
730
|
+
"Error: token_url is required for oauth2_connect action (no well-known config for this service)",
|
|
731
|
+
isError: true,
|
|
732
|
+
};
|
|
733
|
+
if (!inputScopes)
|
|
734
|
+
return {
|
|
735
|
+
content:
|
|
736
|
+
"Error: scopes is required for oauth2_connect action (no well-known config for this service)",
|
|
737
|
+
isError: true,
|
|
738
|
+
};
|
|
501
739
|
}
|
|
502
740
|
|
|
503
|
-
const authUrl =
|
|
504
|
-
|
|
505
|
-
|
|
741
|
+
const authUrl =
|
|
742
|
+
(input.auth_url as string | undefined) ?? profile?.authUrl;
|
|
743
|
+
const tokenUrl =
|
|
744
|
+
(input.token_url as string | undefined) ?? profile?.tokenUrl;
|
|
745
|
+
if (!clientId)
|
|
746
|
+
return {
|
|
747
|
+
content:
|
|
748
|
+
"Error: client_id is required for oauth2_connect action. Provide it directly or store it first with credential_store.",
|
|
749
|
+
isError: true,
|
|
750
|
+
};
|
|
506
751
|
|
|
507
752
|
// Fail early when client_secret is required but missing — guide the
|
|
508
753
|
// agent to collect it from the user rather than letting it improvise
|
|
509
754
|
// browser-automation workarounds that inevitably fail.
|
|
510
|
-
const requiresSecret =
|
|
511
|
-
|
|
755
|
+
const requiresSecret =
|
|
756
|
+
profile?.setup?.requiresClientSecret ??
|
|
757
|
+
!!(profile?.tokenEndpointAuthMethod || profile?.extraParams);
|
|
512
758
|
if (requiresSecret && !clientSecret) {
|
|
513
759
|
const skillId = profile?.setupSkillId;
|
|
514
760
|
const skillHint = skillId
|
|
@@ -523,11 +769,17 @@ class CredentialStoreTool implements Tool {
|
|
|
523
769
|
try {
|
|
524
770
|
assertMetadataWritable();
|
|
525
771
|
} catch {
|
|
526
|
-
return {
|
|
772
|
+
return {
|
|
773
|
+
content:
|
|
774
|
+
"Error: credential metadata file has an unrecognized version; cannot store credentials",
|
|
775
|
+
isError: true,
|
|
776
|
+
};
|
|
527
777
|
}
|
|
528
778
|
|
|
529
|
-
const tokenEndpointAuthMethod =
|
|
530
|
-
|
|
779
|
+
const tokenEndpointAuthMethod =
|
|
780
|
+
(input.token_endpoint_auth_method as
|
|
781
|
+
| TokenEndpointAuthMethod
|
|
782
|
+
| undefined) ?? profile?.tokenEndpointAuthMethod;
|
|
531
783
|
|
|
532
784
|
// Delegate to the shared orchestrator.
|
|
533
785
|
// For profile-based providers, pass user scopes as requestedScopes so the
|
|
@@ -552,8 +804,11 @@ class CredentialStoreTool implements Tool {
|
|
|
552
804
|
// Custom provider: explicit scopes override (bypasses policy engine)
|
|
553
805
|
scopes: inputScopes,
|
|
554
806
|
}),
|
|
555
|
-
extraParams:
|
|
556
|
-
|
|
807
|
+
extraParams:
|
|
808
|
+
(input.extra_params as Record<string, string> | undefined) ??
|
|
809
|
+
profile?.extraParams,
|
|
810
|
+
userinfoUrl:
|
|
811
|
+
(input.userinfo_url as string | undefined) ?? profile?.userinfoUrl,
|
|
557
812
|
tokenEndpointAuthMethod,
|
|
558
813
|
});
|
|
559
814
|
|
|
@@ -569,44 +824,58 @@ class CredentialStoreTool implements Tool {
|
|
|
569
824
|
}
|
|
570
825
|
|
|
571
826
|
return {
|
|
572
|
-
content: `Successfully connected "${service}"${
|
|
827
|
+
content: `Successfully connected "${service}"${
|
|
828
|
+
result.accountInfo ? ` as ${result.accountInfo}` : ""
|
|
829
|
+
}. The service is now ready to use.`,
|
|
573
830
|
isError: false,
|
|
574
831
|
};
|
|
575
832
|
}
|
|
576
833
|
|
|
577
|
-
case
|
|
578
|
-
const rawService = (input.service as string | undefined) ??
|
|
834
|
+
case "describe": {
|
|
835
|
+
const rawService = (input.service as string | undefined) ?? "";
|
|
579
836
|
if (!rawService) {
|
|
580
|
-
return {
|
|
837
|
+
return {
|
|
838
|
+
content: "Error: service is required for describe action",
|
|
839
|
+
isError: true,
|
|
840
|
+
};
|
|
581
841
|
}
|
|
582
842
|
const resolvedService = resolveService(rawService);
|
|
583
843
|
const profile = getProviderProfile(resolvedService);
|
|
584
844
|
if (!profile) {
|
|
585
|
-
return {
|
|
845
|
+
return {
|
|
846
|
+
content: `No well-known OAuth config found for "${rawService}". Available services: ${Object.keys(
|
|
847
|
+
SERVICE_ALIASES,
|
|
848
|
+
).join(", ")}`,
|
|
849
|
+
isError: false,
|
|
850
|
+
};
|
|
586
851
|
}
|
|
587
852
|
|
|
588
853
|
// Compute the redirect URI based on callback transport
|
|
589
854
|
let redirectUri: string;
|
|
590
|
-
const transport = profile.callbackTransport ??
|
|
591
|
-
if (transport ===
|
|
855
|
+
const transport = profile.callbackTransport ?? "gateway";
|
|
856
|
+
if (transport === "loopback" && profile.loopbackPort) {
|
|
592
857
|
redirectUri = `http://127.0.0.1:${profile.loopbackPort}/oauth/callback`;
|
|
593
|
-
} else if (transport ===
|
|
594
|
-
redirectUri =
|
|
858
|
+
} else if (transport === "loopback") {
|
|
859
|
+
redirectUri =
|
|
860
|
+
"(automatic — no redirect URI needed, uses random localhost port)";
|
|
595
861
|
} else {
|
|
596
862
|
// Try to compute the actual URL from config/env
|
|
597
863
|
try {
|
|
598
|
-
const { loadConfig } = await import(
|
|
599
|
-
const { getPublicBaseUrl } =
|
|
864
|
+
const { loadConfig } = await import("../../config/loader.js");
|
|
865
|
+
const { getPublicBaseUrl } =
|
|
866
|
+
await import("../../inbound/public-ingress-urls.js");
|
|
600
867
|
const baseUrl = getPublicBaseUrl(loadConfig());
|
|
601
868
|
redirectUri = `${baseUrl}/webhooks/oauth/callback`;
|
|
602
869
|
} catch {
|
|
603
|
-
redirectUri =
|
|
870
|
+
redirectUri =
|
|
871
|
+
"(requires INGRESS_PUBLIC_BASE_URL — not currently configured)";
|
|
604
872
|
}
|
|
605
873
|
}
|
|
606
874
|
|
|
607
875
|
// Prefer explicit setup metadata, fall back to heuristic
|
|
608
|
-
const requiresClientSecret =
|
|
609
|
-
|
|
876
|
+
const requiresClientSecret =
|
|
877
|
+
profile.setup?.requiresClientSecret ??
|
|
878
|
+
!!(profile.tokenEndpointAuthMethod || profile.extraParams);
|
|
610
879
|
|
|
611
880
|
const info: Record<string, unknown> = {
|
|
612
881
|
service: resolvedService,
|