@vellumai/assistant 0.6.4 → 0.6.5
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/.prettierignore +5 -0
- package/ARCHITECTURE.md +32 -36
- package/Dockerfile +12 -0
- package/README.md +3 -4
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/openapi.yaml +123 -11
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/approval-cascade.test.ts +31 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +428 -501
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +427 -114
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +530 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
- package/src/__tests__/conversation-agent-loop.test.ts +412 -82
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
- package/src/__tests__/conversation-queue.test.ts +41 -26
- package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +34 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +30 -16
- package/src/__tests__/conversation-speed-override.test.ts +30 -11
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +3 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
- package/src/__tests__/conversation-workspace-injection.test.ts +43 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +26 -7
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/model-intents.test.ts +9 -83
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/oauth-store.test.ts +10 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +50 -3
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +0 -1
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +160 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor.test.ts +60 -94
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -13
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +209 -17
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +14 -1
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +300 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +23 -4
- package/src/cli.ts +0 -37
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -175
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +30 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +53 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +2 -2
- package/src/context/__tests__/compact-prompt.test.ts +45 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/window-manager.ts +229 -25
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -1
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
- package/src/daemon/conversation-agent-loop.ts +462 -80
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-lifecycle.ts +30 -6
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-process.ts +10 -4
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +760 -29
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +10 -5
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +118 -30
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +54 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +2 -2
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +76 -14
- package/src/daemon/message-types/conversations.ts +14 -0
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +117 -9
- package/src/daemon/tool-side-effects.ts +0 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +76 -28
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +4 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +56 -2
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +73 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +4 -4
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +61 -0
- package/src/ipc/routes/browser.ts +96 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/index.ts +17 -1
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +103 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +2 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +173 -51
- package/src/memory/graph/graph-search.test.ts +92 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +230 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/pkb/pkb-index.test.ts +368 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +438 -0
- package/src/memory/pkb/pkb-search.ts +137 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.ts +122 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
- package/src/messaging/providers/slack/render-transcript.ts +443 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/oauth/oauth-store.ts +1 -0
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/seed-providers.ts +4 -2
- package/src/permissions/approval-policy.test.ts +948 -0
- package/src/permissions/approval-policy.ts +257 -0
- package/src/permissions/bash-risk-classifier.test.ts +1208 -0
- package/src/permissions/bash-risk-classifier.ts +707 -0
- package/src/permissions/checker.ts +217 -708
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +26 -78
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/risk-types.ts +205 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +23 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +1 -16
- package/src/platform/client.ts +19 -1
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +501 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +76 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
- package/src/providers/speech-to-text/xai-realtime.ts +796 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +52 -1
- package/src/runtime/http-types.ts +23 -1
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
- package/src/runtime/routes/approval-routes.ts +12 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +133 -27
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +912 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/migration-routes.ts +720 -124
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +28 -6
- package/src/schedule/scheduler.ts +8 -0
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
- package/src/tools/browser/browser-execution.ts +65 -38
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +4 -0
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +36 -15
- package/src/tools/policy-context.ts +25 -8
- package/src/tools/registry.ts +55 -3
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +12 -3
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +2 -2
- package/src/util/pricing.ts +15 -5
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
* These are extracted from `assistant/src/permissions/types.ts` and
|
|
5
5
|
* `assistant/src/permissions/trust-store.ts` so that both packages can
|
|
6
6
|
* reference a single canonical definition.
|
|
7
|
+
*
|
|
8
|
+
* Tools are grouped into "families" based on how their permission candidates
|
|
9
|
+
* are constructed and matched:
|
|
10
|
+
*
|
|
11
|
+
* - **Scoped**: tools whose candidates include a filesystem path and obey
|
|
12
|
+
* directory-boundary scope constraints (`file_read`, `file_write`,
|
|
13
|
+
* `file_edit`, `host_file_read`, `host_file_write`, `host_file_edit`,
|
|
14
|
+
* `bash`, `host_bash`).
|
|
15
|
+
* - **URL**: tools whose candidates include a URL (`web_fetch`,
|
|
16
|
+
* `network_request`).
|
|
17
|
+
* - **Managed skill**: tools that manage first-party skill packages
|
|
18
|
+
* (`scaffold_managed_skill`, `delete_managed_skill`).
|
|
19
|
+
* - **Skill load**: the `skill_load` tool, which uses a distinct candidate
|
|
20
|
+
* namespace (`skill_load:selector` or `skill_load_dynamic:selector`).
|
|
21
|
+
* - **Generic**: everything else (computer-use tools, UI surface tools,
|
|
22
|
+
* recall, skill_execute, etc.).
|
|
7
23
|
*/
|
|
8
24
|
|
|
9
25
|
// ---------------------------------------------------------------------------
|
|
@@ -14,19 +30,349 @@
|
|
|
14
30
|
export type TrustDecision = "allow" | "deny" | "ask";
|
|
15
31
|
|
|
16
32
|
// ---------------------------------------------------------------------------
|
|
17
|
-
//
|
|
33
|
+
// Tool family constants
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Tools whose permission candidates are scoped to a filesystem path and obey
|
|
38
|
+
* directory-boundary scope constraints.
|
|
39
|
+
*/
|
|
40
|
+
export const SCOPED_TOOLS = [
|
|
41
|
+
"file_read",
|
|
42
|
+
"file_write",
|
|
43
|
+
"file_edit",
|
|
44
|
+
"host_file_read",
|
|
45
|
+
"host_file_write",
|
|
46
|
+
"host_file_edit",
|
|
47
|
+
"bash",
|
|
48
|
+
"host_bash",
|
|
49
|
+
] as const;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Tools whose permission candidates include a URL.
|
|
53
|
+
*/
|
|
54
|
+
export const URL_TOOLS = ["web_fetch", "network_request"] as const;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Tools that manage first-party skill packages (scaffold/delete).
|
|
58
|
+
*/
|
|
59
|
+
export const MANAGED_SKILL_TOOLS = [
|
|
60
|
+
"scaffold_managed_skill",
|
|
61
|
+
"delete_managed_skill",
|
|
62
|
+
] as const;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The skill_load tool name. Separated from the array constants because
|
|
66
|
+
* skill_load is a singleton, not a family with multiple members.
|
|
67
|
+
*/
|
|
68
|
+
export const SKILL_LOAD_TOOL = "skill_load" as const;
|
|
69
|
+
|
|
70
|
+
/** Set for O(1) lookups when classifying tool names. */
|
|
71
|
+
const SCOPED_TOOLS_SET: ReadonlySet<string> = new Set(SCOPED_TOOLS);
|
|
72
|
+
const URL_TOOLS_SET: ReadonlySet<string> = new Set(URL_TOOLS);
|
|
73
|
+
const MANAGED_SKILL_TOOLS_SET: ReadonlySet<string> = new Set(
|
|
74
|
+
MANAGED_SKILL_TOOLS,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Trust rule — base and family-specific variants
|
|
18
79
|
// ---------------------------------------------------------------------------
|
|
19
80
|
|
|
20
|
-
|
|
81
|
+
/** Fields shared by all trust rule variants. */
|
|
82
|
+
export interface TrustRuleBase {
|
|
21
83
|
id: string;
|
|
22
84
|
tool: string;
|
|
23
85
|
pattern: string;
|
|
24
|
-
scope: string;
|
|
25
86
|
decision: TrustDecision;
|
|
26
87
|
priority: number;
|
|
27
88
|
createdAt: number;
|
|
89
|
+
/**
|
|
90
|
+
* Set when a user explicitly modifies a default trust rule.
|
|
91
|
+
* When present, `backfillDefaults()` will not overwrite the rule
|
|
92
|
+
* with updated template values on upgrade — preserving the user's
|
|
93
|
+
* customization.
|
|
94
|
+
*/
|
|
95
|
+
userModifiedAt?: number;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A trust rule for a scoped tool (filesystem-path-based candidates).
|
|
100
|
+
*
|
|
101
|
+
* Scoped rules may carry `executionTarget` to constrain matching to a
|
|
102
|
+
* specific execution environment.
|
|
103
|
+
*/
|
|
104
|
+
export interface ScopedTrustRule extends TrustRuleBase {
|
|
105
|
+
tool: (typeof SCOPED_TOOLS)[number];
|
|
106
|
+
scope: string;
|
|
28
107
|
executionTarget?: string;
|
|
29
|
-
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* A trust rule for a URL-based tool.
|
|
112
|
+
*
|
|
113
|
+
* URL rules do not use `executionTarget`.
|
|
114
|
+
*/
|
|
115
|
+
export interface UrlTrustRule extends TrustRuleBase {
|
|
116
|
+
tool: (typeof URL_TOOLS)[number];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* A trust rule for a managed-skill tool (scaffold/delete).
|
|
121
|
+
*/
|
|
122
|
+
export interface ManagedSkillTrustRule extends TrustRuleBase {
|
|
123
|
+
tool: (typeof MANAGED_SKILL_TOOLS)[number];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* A trust rule for the `skill_load` tool.
|
|
128
|
+
*/
|
|
129
|
+
export interface SkillLoadTrustRule extends TrustRuleBase {
|
|
130
|
+
tool: typeof SKILL_LOAD_TOOL;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* A trust rule for any tool that doesn't belong to a known family.
|
|
135
|
+
*
|
|
136
|
+
* Generic rules preserve `executionTarget` for backward compatibility —
|
|
137
|
+
* existing rules for unknown/new tools may carry this field.
|
|
138
|
+
* Scope is intentionally absent: new tools that need scope must be explicitly
|
|
139
|
+
* added to `SCOPED_TOOLS` and use `ScopedTrustRule`.
|
|
140
|
+
*/
|
|
141
|
+
export interface GenericTrustRule extends TrustRuleBase {
|
|
142
|
+
tool: string;
|
|
143
|
+
executionTarget?: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Discriminated union of all trust rule families.
|
|
148
|
+
*
|
|
149
|
+
* The union is discriminated on the `tool` field: known tool names narrow to
|
|
150
|
+
* the corresponding family variant, while unknown tool names fall through to
|
|
151
|
+
* `GenericTrustRule`.
|
|
152
|
+
*
|
|
153
|
+
* For backward compatibility, `TrustRule` remains the single type that all
|
|
154
|
+
* existing code uses. The family-specific interfaces exist so that new code
|
|
155
|
+
* can narrow the type when it knows the tool family.
|
|
156
|
+
*/
|
|
157
|
+
export type TrustRule =
|
|
158
|
+
| ScopedTrustRule
|
|
159
|
+
| UrlTrustRule
|
|
160
|
+
| ManagedSkillTrustRule
|
|
161
|
+
| SkillLoadTrustRule
|
|
162
|
+
| GenericTrustRule;
|
|
163
|
+
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// Type guards
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
|
|
168
|
+
/** Narrow a TrustRule to a ScopedTrustRule. */
|
|
169
|
+
export function isScopedRule(rule: TrustRule): rule is ScopedTrustRule {
|
|
170
|
+
return SCOPED_TOOLS_SET.has(rule.tool);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Narrow a TrustRule to a UrlTrustRule. */
|
|
174
|
+
export function isUrlRule(rule: TrustRule): rule is UrlTrustRule {
|
|
175
|
+
return URL_TOOLS_SET.has(rule.tool);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Narrow a TrustRule to a ManagedSkillTrustRule. */
|
|
179
|
+
export function isManagedSkillRule(
|
|
180
|
+
rule: TrustRule,
|
|
181
|
+
): rule is ManagedSkillTrustRule {
|
|
182
|
+
return MANAGED_SKILL_TOOLS_SET.has(rule.tool);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Narrow a TrustRule to a SkillLoadTrustRule. */
|
|
186
|
+
export function isSkillLoadRule(rule: TrustRule): rule is SkillLoadTrustRule {
|
|
187
|
+
return rule.tool === SKILL_LOAD_TOOL;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// Scope helper
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Return the effective scope for any trust rule. Only scoped rules carry a
|
|
196
|
+
* `scope` field; all other rule families return `"everywhere"`.
|
|
197
|
+
*/
|
|
198
|
+
export function ruleScope(rule: TrustRule): string {
|
|
199
|
+
if (isScopedRule(rule)) {
|
|
200
|
+
return rule.scope;
|
|
201
|
+
}
|
|
202
|
+
return "everywhere";
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Canonical parse / normalize
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Result of parsing a raw trust rule object. Includes the normalized rule
|
|
211
|
+
* and a flag indicating whether any normalization occurred (so callers can
|
|
212
|
+
* trigger a re-save of the trust file).
|
|
213
|
+
*/
|
|
214
|
+
export interface ParsedTrustRule {
|
|
215
|
+
rule: TrustRule;
|
|
216
|
+
/** True if any fields were stripped or modified during normalization. */
|
|
217
|
+
normalized: boolean;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Parse and normalize a raw trust rule object into a canonical `TrustRule`.
|
|
222
|
+
*
|
|
223
|
+
* Normalization strips fields that are invalid for the rule's tool family:
|
|
224
|
+
* - URL rules: `executionTarget` and `scope` are stripped.
|
|
225
|
+
* - Managed skill rules: `executionTarget` and `scope` are stripped.
|
|
226
|
+
* - Skill load rules: `executionTarget` and `scope` are stripped.
|
|
227
|
+
* - Scoped rules: `scope` is preserved (defaulting to `"everywhere"`),
|
|
228
|
+
* `executionTarget` is preserved when valid.
|
|
229
|
+
* - Generic (unknown) rules: `scope` is stripped (new tools that need scope
|
|
230
|
+
* must be added to `SCOPED_TOOLS`); `executionTarget` is preserved for
|
|
231
|
+
* forward compatibility.
|
|
232
|
+
* - All families: `allowHighRisk` is stripped (replaced by runtime
|
|
233
|
+
* determination in checker.ts). Old trust.json files with `allowHighRisk`
|
|
234
|
+
* are normalized on load.
|
|
235
|
+
*/
|
|
236
|
+
export function parseTrustRule(raw: Record<string, unknown>): ParsedTrustRule {
|
|
237
|
+
let normalized = false;
|
|
238
|
+
|
|
239
|
+
// Extract base fields with coercion for safety — mark normalized whenever
|
|
240
|
+
// a field is coerced to its default so callers know to re-save.
|
|
241
|
+
const id = typeof raw.id === "string" ? raw.id : ((normalized = true), "");
|
|
242
|
+
const tool =
|
|
243
|
+
typeof raw.tool === "string" ? raw.tool : ((normalized = true), "");
|
|
244
|
+
const pattern =
|
|
245
|
+
typeof raw.pattern === "string" ? raw.pattern : ((normalized = true), "");
|
|
246
|
+
const decision = isValidDecision(raw.decision)
|
|
247
|
+
? raw.decision
|
|
248
|
+
: ((normalized = true), "ask" as const);
|
|
249
|
+
const priority =
|
|
250
|
+
typeof raw.priority === "number" ? raw.priority : ((normalized = true), 100);
|
|
251
|
+
const createdAt =
|
|
252
|
+
typeof raw.createdAt === "number"
|
|
253
|
+
? raw.createdAt
|
|
254
|
+
: ((normalized = true), 0);
|
|
255
|
+
const userModifiedAt =
|
|
256
|
+
typeof raw.userModifiedAt === "number" ? raw.userModifiedAt : undefined;
|
|
257
|
+
|
|
258
|
+
// Build the base rule — scope is NOT included here; it is added only by
|
|
259
|
+
// the scoped and generic branches below.
|
|
260
|
+
const base: TrustRuleBase = {
|
|
261
|
+
id,
|
|
262
|
+
tool,
|
|
263
|
+
pattern,
|
|
264
|
+
decision,
|
|
265
|
+
priority,
|
|
266
|
+
createdAt,
|
|
267
|
+
...(userModifiedAt != null ? { userModifiedAt } : {}),
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// Determine the family and strip invalid fields
|
|
271
|
+
if (URL_TOOLS_SET.has(tool)) {
|
|
272
|
+
// URL rules must not carry executionTarget or scope.
|
|
273
|
+
if (raw.executionTarget !== undefined) {
|
|
274
|
+
normalized = true;
|
|
275
|
+
}
|
|
276
|
+
if (typeof raw.scope === "string" && raw.scope !== "everywhere") {
|
|
277
|
+
normalized = true;
|
|
278
|
+
}
|
|
279
|
+
// allowHighRisk is stripped (replaced by runtime determination).
|
|
280
|
+
if (raw.allowHighRisk !== undefined) {
|
|
281
|
+
normalized = true;
|
|
282
|
+
}
|
|
283
|
+
const rule: UrlTrustRule = { ...base, tool: tool as UrlTrustRule["tool"] };
|
|
284
|
+
return { rule, normalized };
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (MANAGED_SKILL_TOOLS_SET.has(tool)) {
|
|
288
|
+
// Managed skill rules must not carry executionTarget or scope.
|
|
289
|
+
if (raw.executionTarget !== undefined) {
|
|
290
|
+
normalized = true;
|
|
291
|
+
}
|
|
292
|
+
if (typeof raw.scope === "string" && raw.scope !== "everywhere") {
|
|
293
|
+
normalized = true;
|
|
294
|
+
}
|
|
295
|
+
// allowHighRisk is stripped (replaced by runtime determination).
|
|
296
|
+
if (raw.allowHighRisk !== undefined) {
|
|
297
|
+
normalized = true;
|
|
298
|
+
}
|
|
299
|
+
const rule: ManagedSkillTrustRule = {
|
|
300
|
+
...base,
|
|
301
|
+
tool: tool as ManagedSkillTrustRule["tool"],
|
|
302
|
+
};
|
|
303
|
+
return { rule, normalized };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (tool === SKILL_LOAD_TOOL) {
|
|
307
|
+
// Skill-load rules must not carry executionTarget or scope.
|
|
308
|
+
if (raw.executionTarget !== undefined) {
|
|
309
|
+
normalized = true;
|
|
310
|
+
}
|
|
311
|
+
if (typeof raw.scope === "string" && raw.scope !== "everywhere") {
|
|
312
|
+
normalized = true;
|
|
313
|
+
}
|
|
314
|
+
// allowHighRisk is stripped (replaced by runtime determination).
|
|
315
|
+
if (raw.allowHighRisk !== undefined) {
|
|
316
|
+
normalized = true;
|
|
317
|
+
}
|
|
318
|
+
const rule: SkillLoadTrustRule = { ...base, tool: SKILL_LOAD_TOOL };
|
|
319
|
+
return { rule, normalized };
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (SCOPED_TOOLS_SET.has(tool)) {
|
|
323
|
+
// Scoped rules include scope (defaulting to "everywhere") and preserve
|
|
324
|
+
// executionTarget.
|
|
325
|
+
const scope =
|
|
326
|
+
typeof raw.scope === "string"
|
|
327
|
+
? raw.scope
|
|
328
|
+
: ((normalized = true), "everywhere");
|
|
329
|
+
const rule: ScopedTrustRule = {
|
|
330
|
+
...base,
|
|
331
|
+
tool: tool as ScopedTrustRule["tool"],
|
|
332
|
+
scope,
|
|
333
|
+
};
|
|
334
|
+
if (
|
|
335
|
+
typeof raw.executionTarget === "string" &&
|
|
336
|
+
raw.executionTarget.length > 0
|
|
337
|
+
) {
|
|
338
|
+
rule.executionTarget = raw.executionTarget;
|
|
339
|
+
} else if (raw.executionTarget !== undefined && raw.executionTarget !== "") {
|
|
340
|
+
normalized = true;
|
|
341
|
+
}
|
|
342
|
+
// allowHighRisk is stripped (replaced by runtime determination).
|
|
343
|
+
if (raw.allowHighRisk !== undefined) {
|
|
344
|
+
normalized = true;
|
|
345
|
+
}
|
|
346
|
+
return { rule, normalized };
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Generic (unknown) tool — strip scope (new tools that need scope must be
|
|
350
|
+
// added to SCOPED_TOOLS explicitly), preserve executionTarget for forward compat.
|
|
351
|
+
const rule: GenericTrustRule = { ...base };
|
|
352
|
+
if (
|
|
353
|
+
typeof raw.scope === "string" &&
|
|
354
|
+
raw.scope !== "" &&
|
|
355
|
+
raw.scope !== "everywhere"
|
|
356
|
+
) {
|
|
357
|
+
normalized = true;
|
|
358
|
+
}
|
|
359
|
+
if (
|
|
360
|
+
typeof raw.executionTarget === "string" &&
|
|
361
|
+
raw.executionTarget.length > 0
|
|
362
|
+
) {
|
|
363
|
+
rule.executionTarget = raw.executionTarget;
|
|
364
|
+
} else if (raw.executionTarget !== undefined && raw.executionTarget !== "") {
|
|
365
|
+
normalized = true;
|
|
366
|
+
}
|
|
367
|
+
// allowHighRisk is stripped (replaced by runtime determination).
|
|
368
|
+
if (raw.allowHighRisk !== undefined) {
|
|
369
|
+
normalized = true;
|
|
370
|
+
}
|
|
371
|
+
return { rule, normalized };
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function isValidDecision(value: unknown): value is TrustDecision {
|
|
375
|
+
return value === "allow" || value === "deny" || value === "ask";
|
|
30
376
|
}
|
|
31
377
|
|
|
32
378
|
// ---------------------------------------------------------------------------
|
|
@@ -40,3 +386,51 @@ export interface TrustFileData {
|
|
|
40
386
|
/** Set to true when the user explicitly accepts the starter approval bundle. */
|
|
41
387
|
starterBundleAccepted?: boolean;
|
|
42
388
|
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Result of parsing a raw trust file. Includes the parsed data and a flag
|
|
392
|
+
* indicating whether any rules were normalized.
|
|
393
|
+
*/
|
|
394
|
+
export interface ParsedTrustFileData {
|
|
395
|
+
data: TrustFileData;
|
|
396
|
+
/** True if any rules were normalized during parsing. */
|
|
397
|
+
normalized: boolean;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Parse and normalize a raw trust file object.
|
|
402
|
+
*
|
|
403
|
+
* Each rule in the `rules` array is run through `parseTrustRule` for
|
|
404
|
+
* family-aware normalization. The `normalized` flag in the result is true
|
|
405
|
+
* if *any* rule was modified, signaling the caller that a re-save is warranted.
|
|
406
|
+
*/
|
|
407
|
+
export function parseTrustFileData(
|
|
408
|
+
raw: Record<string, unknown>,
|
|
409
|
+
): ParsedTrustFileData {
|
|
410
|
+
const version = typeof raw.version === "number" ? raw.version : 0;
|
|
411
|
+
const starterBundleAccepted =
|
|
412
|
+
raw.starterBundleAccepted === true ? true : undefined;
|
|
413
|
+
const rawRules = Array.isArray(raw.rules) ? raw.rules : [];
|
|
414
|
+
|
|
415
|
+
let anyNormalized = false;
|
|
416
|
+
const rules: TrustRule[] = [];
|
|
417
|
+
|
|
418
|
+
for (const rawRule of rawRules) {
|
|
419
|
+
if (rawRule == null || typeof rawRule !== "object" || Array.isArray(rawRule)) {
|
|
420
|
+
anyNormalized = true;
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
const { rule, normalized } = parseTrustRule(
|
|
424
|
+
rawRule as Record<string, unknown>,
|
|
425
|
+
);
|
|
426
|
+
if (normalized) anyNormalized = true;
|
|
427
|
+
rules.push(rule);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const data: TrustFileData = { version, rules };
|
|
431
|
+
if (starterBundleAccepted) {
|
|
432
|
+
data.starterBundleAccepted = true;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
return { data, normalized: anyNormalized };
|
|
436
|
+
}
|
|
@@ -89,6 +89,8 @@ export interface RefreshBreakerState {
|
|
|
89
89
|
consecutiveFailures: number;
|
|
90
90
|
openedAt: number;
|
|
91
91
|
cooldownMs: number;
|
|
92
|
+
/** Whether the breaker tripped due to a credential error (vs transient). */
|
|
93
|
+
isCredentialError: boolean;
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
/**
|
|
@@ -128,18 +130,34 @@ export class RefreshCircuitBreaker {
|
|
|
128
130
|
this.breakers.delete(key);
|
|
129
131
|
}
|
|
130
132
|
|
|
131
|
-
/**
|
|
132
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Record a failed refresh attempt, potentially opening the breaker.
|
|
135
|
+
*
|
|
136
|
+
* @param isCredential - When true, the failure is a credential error
|
|
137
|
+
* (revoked token, invalid client) that no amount of retrying will fix.
|
|
138
|
+
* Only credential errors count toward opening the circuit breaker.
|
|
139
|
+
* Transient errors (network timeouts, 5xx) are silently ignored here —
|
|
140
|
+
* they do not trip the breaker and are not recorded. Upstream retry logic
|
|
141
|
+
* in refreshOAuth2Token handles transient failures with exponential backoff.
|
|
142
|
+
*/
|
|
143
|
+
recordFailure(key: string, isCredential = true): void {
|
|
144
|
+
if (!isCredential) {
|
|
145
|
+
// Transient failures should not trip the breaker. The retry logic in
|
|
146
|
+
// refreshOAuth2Token handles transient errors with its own backoff.
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
133
149
|
const state = this.breakers.get(key);
|
|
134
150
|
if (!state) {
|
|
135
151
|
this.breakers.set(key, {
|
|
136
152
|
consecutiveFailures: 1,
|
|
137
153
|
openedAt: 0,
|
|
138
154
|
cooldownMs: INITIAL_COOLDOWN_MS,
|
|
155
|
+
isCredentialError: true,
|
|
139
156
|
});
|
|
140
157
|
return;
|
|
141
158
|
}
|
|
142
159
|
state.consecutiveFailures++;
|
|
160
|
+
state.isCredentialError = true;
|
|
143
161
|
if (state.consecutiveFailures >= REFRESH_FAILURE_THRESHOLD) {
|
|
144
162
|
// Only escalate cooldown on the exact failure that trips the breaker.
|
|
145
163
|
// Concurrent in-flight failures that arrive after the threshold is
|