vellum 0.2.13 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/vellum.js +2 -0
- package/package.json +6 -65
- package/.dockerignore +0 -27
- package/.env.example +0 -22
- package/Dockerfile +0 -99
- package/Dockerfile.sandbox +0 -5
- package/README.md +0 -169
- package/bun.lock +0 -1743
- package/bunfig.toml +0 -2
- package/docs/skills.md +0 -158
- package/drizzle/0000_dizzy_maggott.sql +0 -301
- package/drizzle/meta/0000_snapshot.json +0 -1999
- package/drizzle/meta/_journal.json +0 -13
- package/drizzle.config.ts +0 -7
- package/eslint.config.mjs +0 -17
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -68
- package/knip.json +0 -9
- package/scripts/capture-x-graphql.ts +0 -545
- package/scripts/ipc/check-contract-inventory.ts +0 -104
- package/scripts/ipc/check-swift-decoder-drift.ts +0 -164
- package/scripts/ipc/generate-swift.ts +0 -492
- package/scripts/test-filesystem-tools.sh +0 -48
- package/scripts/test.sh +0 -127
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -2316
- package/src/__tests__/account-registry.test.ts +0 -245
- package/src/__tests__/active-skill-tools.test.ts +0 -378
- package/src/__tests__/agent-heartbeat-service.test.ts +0 -250
- package/src/__tests__/agent-loop-thinking.test.ts +0 -81
- package/src/__tests__/agent-loop.test.ts +0 -1135
- package/src/__tests__/anthropic-provider.test.ts +0 -778
- package/src/__tests__/app-builder-tool-scripts.test.ts +0 -290
- package/src/__tests__/app-bundler.test.ts +0 -292
- package/src/__tests__/app-executors.test.ts +0 -613
- package/src/__tests__/app-open-proxy.test.ts +0 -62
- package/src/__tests__/asset-materialize-tool.test.ts +0 -452
- package/src/__tests__/asset-search-tool.test.ts +0 -477
- package/src/__tests__/assistant-attachment-directive.test.ts +0 -401
- package/src/__tests__/assistant-attachments.test.ts +0 -437
- package/src/__tests__/assistant-event-hub.test.ts +0 -226
- package/src/__tests__/assistant-event.test.ts +0 -123
- package/src/__tests__/attachments-store.test.ts +0 -476
- package/src/__tests__/attachments.test.ts +0 -134
- package/src/__tests__/audit-log-rotation.test.ts +0 -154
- package/src/__tests__/browser-fill-credential.test.ts +0 -309
- package/src/__tests__/browser-manager.test.ts +0 -203
- package/src/__tests__/browser-runtime-check.test.ts +0 -55
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +0 -68
- package/src/__tests__/browser-skill-endstate.test.ts +0 -195
- package/src/__tests__/bundle-scanner.test.ts +0 -313
- package/src/__tests__/call-bridge.test.ts +0 -425
- package/src/__tests__/call-constants.test.ts +0 -40
- package/src/__tests__/call-orchestrator.test.ts +0 -512
- package/src/__tests__/call-recovery.test.ts +0 -518
- package/src/__tests__/call-routes-http.test.ts +0 -459
- package/src/__tests__/call-state-machine.test.ts +0 -143
- package/src/__tests__/call-state.test.ts +0 -174
- package/src/__tests__/call-store.test.ts +0 -691
- package/src/__tests__/checker.test.ts +0 -3960
- package/src/__tests__/clarification-resolver.test.ts +0 -159
- package/src/__tests__/classifier.test.ts +0 -67
- package/src/__tests__/claude-code-skill-regression.test.ts +0 -127
- package/src/__tests__/claude-code-tool-profiles.test.ts +0 -88
- package/src/__tests__/cli-discover.test.ts +0 -85
- package/src/__tests__/cli.test.ts +0 -81
- package/src/__tests__/clipboard.test.ts +0 -80
- package/src/__tests__/commit-guarantee.test.ts +0 -335
- package/src/__tests__/commit-message-enrichment-service.test.ts +0 -550
- package/src/__tests__/compaction.benchmark.test.ts +0 -176
- package/src/__tests__/computer-use-session-compaction.test.ts +0 -132
- package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -293
- package/src/__tests__/computer-use-session-working-dir.test.ts +0 -117
- package/src/__tests__/computer-use-skill-baseline.test.ts +0 -74
- package/src/__tests__/computer-use-skill-endstate.test.ts +0 -89
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -217
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +0 -107
- package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +0 -54
- package/src/__tests__/computer-use-tools.test.ts +0 -250
- package/src/__tests__/config-schema.test.ts +0 -1343
- package/src/__tests__/conflict-store.test.ts +0 -330
- package/src/__tests__/connection-policy.test.ts +0 -102
- package/src/__tests__/contacts-tools.test.ts +0 -331
- package/src/__tests__/context-memory-e2e.test.ts +0 -434
- package/src/__tests__/context-token-estimator.test.ts +0 -135
- package/src/__tests__/context-window-manager.test.ts +0 -376
- package/src/__tests__/contradiction-checker.test.ts +0 -216
- package/src/__tests__/conversation-store.test.ts +0 -612
- package/src/__tests__/credential-broker-browser-fill.test.ts +0 -517
- package/src/__tests__/credential-broker-server-use.test.ts +0 -554
- package/src/__tests__/credential-broker.test.ts +0 -167
- package/src/__tests__/credential-host-pattern-match.test.ts +0 -104
- package/src/__tests__/credential-metadata-store.test.ts +0 -779
- package/src/__tests__/credential-policy-validate.test.ts +0 -121
- package/src/__tests__/credential-resolve.test.ts +0 -328
- package/src/__tests__/credential-security-e2e.test.ts +0 -352
- package/src/__tests__/credential-security-invariants.test.ts +0 -567
- package/src/__tests__/credential-selection.test.ts +0 -354
- package/src/__tests__/credential-vault.test.ts +0 -852
- package/src/__tests__/daemon-assistant-events.test.ts +0 -164
- package/src/__tests__/daemon-server-session-init.test.ts +0 -522
- package/src/__tests__/date-context.test.ts +0 -373
- package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -129
- package/src/__tests__/delete-managed-skill-tool.test.ts +0 -97
- package/src/__tests__/diff.test.ts +0 -121
- package/src/__tests__/domain-normalize.test.ts +0 -112
- package/src/__tests__/domain-policy.test.ts +0 -124
- package/src/__tests__/doordash-client.test.ts +0 -186
- package/src/__tests__/doordash-session.test.ts +0 -152
- package/src/__tests__/dynamic-page-surface.test.ts +0 -91
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -132
- package/src/__tests__/edit-engine.test.ts +0 -180
- package/src/__tests__/elevenlabs-client.test.ts +0 -209
- package/src/__tests__/email-cli.test.ts +0 -283
- package/src/__tests__/encrypted-store.test.ts +0 -332
- package/src/__tests__/entity-extractor.test.ts +0 -190
- package/src/__tests__/ephemeral-permissions.test.ts +0 -312
- package/src/__tests__/evaluate-typescript-tool.test.ts +0 -286
- package/src/__tests__/event-bus.test.ts +0 -222
- package/src/__tests__/file-edit-tool.test.ts +0 -122
- package/src/__tests__/file-ops-service.test.ts +0 -330
- package/src/__tests__/file-read-tool.test.ts +0 -75
- package/src/__tests__/file-write-tool.test.ts +0 -113
- package/src/__tests__/fixtures/credential-security-fixtures.ts +0 -181
- package/src/__tests__/fixtures/media-reuse-fixtures.ts +0 -126
- package/src/__tests__/fixtures/mock-signup-server.ts +0 -387
- package/src/__tests__/fixtures/proxy-fixtures.ts +0 -147
- package/src/__tests__/followup-tools.test.ts +0 -303
- package/src/__tests__/forbidden-legacy-symbols.test.ts +0 -71
- package/src/__tests__/fuzzy-match-property.test.ts +0 -216
- package/src/__tests__/fuzzy-match.test.ts +0 -138
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -436
- package/src/__tests__/gemini-image-service.test.ts +0 -261
- package/src/__tests__/gemini-provider.test.ts +0 -651
- package/src/__tests__/get-weather.test.ts +0 -318
- package/src/__tests__/gmail-integration.test.ts +0 -73
- package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -351
- package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -190
- package/src/__tests__/handlers-slack-config.test.ts +0 -199
- package/src/__tests__/handlers-task-submit-slash.test.ts +0 -38
- package/src/__tests__/handlers-twitter-config.test.ts +0 -718
- package/src/__tests__/headless-browser-interactions.test.ts +0 -536
- package/src/__tests__/headless-browser-navigate.test.ts +0 -211
- package/src/__tests__/headless-browser-read-tools.test.ts +0 -261
- package/src/__tests__/headless-browser-snapshot.test.ts +0 -185
- package/src/__tests__/history-repair-observability.test.ts +0 -56
- package/src/__tests__/history-repair.test.ts +0 -510
- package/src/__tests__/home-base-bootstrap.test.ts +0 -82
- package/src/__tests__/hooks-blocking.test.ts +0 -128
- package/src/__tests__/hooks-cli.test.ts +0 -144
- package/src/__tests__/hooks-config.test.ts +0 -93
- package/src/__tests__/hooks-discovery.test.ts +0 -199
- package/src/__tests__/hooks-integration.test.ts +0 -189
- package/src/__tests__/hooks-manager.test.ts +0 -187
- package/src/__tests__/hooks-runner.test.ts +0 -178
- package/src/__tests__/hooks-settings.test.ts +0 -154
- package/src/__tests__/hooks-templates.test.ts +0 -137
- package/src/__tests__/hooks-ts-runner.test.ts +0 -125
- package/src/__tests__/hooks-watch.test.ts +0 -100
- package/src/__tests__/host-file-edit-tool.test.ts +0 -104
- package/src/__tests__/host-file-read-tool.test.ts +0 -61
- package/src/__tests__/host-file-write-tool.test.ts +0 -77
- package/src/__tests__/host-shell-tool.test.ts +0 -311
- package/src/__tests__/ingress-url-consistency.test.ts +0 -214
- package/src/__tests__/intent-routing.test.ts +0 -259
- package/src/__tests__/ipc-blob-store.test.ts +0 -315
- package/src/__tests__/ipc-contract-inventory.test.ts +0 -54
- package/src/__tests__/ipc-contract.test.ts +0 -74
- package/src/__tests__/ipc-protocol.test.ts +0 -113
- package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -237
- package/src/__tests__/ipc-snapshot.test.ts +0 -1698
- package/src/__tests__/ipc-validate.test.ts +0 -357
- package/src/__tests__/key-migration.test.ts +0 -183
- package/src/__tests__/keychain.test.ts +0 -258
- package/src/__tests__/llm-usage-store.test.ts +0 -221
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -257
- package/src/__tests__/managed-store.test.ts +0 -608
- package/src/__tests__/media-generate-image.test.ts +0 -238
- package/src/__tests__/media-reuse-story.e2e.test.ts +0 -676
- package/src/__tests__/media-visibility-policy.test.ts +0 -141
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -235
- package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -481
- package/src/__tests__/memory-query-builder.test.ts +0 -59
- package/src/__tests__/memory-recall-quality.test.ts +0 -846
- package/src/__tests__/memory-regressions.experimental.test.ts +0 -538
- package/src/__tests__/memory-regressions.test.ts +0 -4336
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -430
- package/src/__tests__/migration-cli-flows.test.ts +0 -169
- package/src/__tests__/migration-ordering.test.ts +0 -249
- package/src/__tests__/mock-signup-server.test.ts +0 -528
- package/src/__tests__/oauth-callback-registry.test.ts +0 -85
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -285
- package/src/__tests__/onboarding-starter-tasks.test.ts +0 -176
- package/src/__tests__/onboarding-template-contract.test.ts +0 -58
- package/src/__tests__/openai-provider.test.ts +0 -753
- package/src/__tests__/parallel-tool.benchmark.test.ts +0 -294
- package/src/__tests__/parser.test.ts +0 -472
- package/src/__tests__/path-classifier.test.ts +0 -73
- package/src/__tests__/path-policy.test.ts +0 -435
- package/src/__tests__/platform-move-helper.test.ts +0 -99
- package/src/__tests__/platform-socket-path.test.ts +0 -52
- package/src/__tests__/platform-workspace-migration.test.ts +0 -1000
- package/src/__tests__/platform.test.ts +0 -131
- package/src/__tests__/playbook-tools.test.ts +0 -342
- package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -75
- package/src/__tests__/pricing.test.ts +0 -256
- package/src/__tests__/profile-compiler.test.ts +0 -374
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -342
- package/src/__tests__/provider-registry-ollama.test.ts +0 -16
- package/src/__tests__/provider-streaming.benchmark.test.ts +0 -773
- package/src/__tests__/proxy-approval-callback.test.ts +0 -601
- package/src/__tests__/public-ingress-urls.test.ts +0 -222
- package/src/__tests__/ratelimit.test.ts +0 -297
- package/src/__tests__/recurrence-engine-rruleset.test.ts +0 -78
- package/src/__tests__/recurrence-engine.test.ts +0 -69
- package/src/__tests__/recurrence-types.test.ts +0 -71
- package/src/__tests__/registry.test.ts +0 -494
- package/src/__tests__/relay-server.test.ts +0 -688
- package/src/__tests__/reminder-store.test.ts +0 -223
- package/src/__tests__/reminder.test.ts +0 -229
- package/src/__tests__/request-file-tool.test.ts +0 -158
- package/src/__tests__/run-orchestrator-assistant-events.test.ts +0 -222
- package/src/__tests__/run-orchestrator.test.ts +0 -200
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -189
- package/src/__tests__/runtime-events-sse-parity.test.ts +0 -343
- package/src/__tests__/runtime-events-sse.test.ts +0 -162
- package/src/__tests__/runtime-runs-http.test.ts +0 -433
- package/src/__tests__/runtime-runs.test.ts +0 -273
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -408
- package/src/__tests__/sandbox-host-parity.test.ts +0 -950
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -253
- package/src/__tests__/schedule-store.test.ts +0 -482
- package/src/__tests__/schedule-tools.test.ts +0 -700
- package/src/__tests__/scheduler-recurrence.test.ts +0 -329
- package/src/__tests__/script-proxy-certs.test.ts +0 -90
- package/src/__tests__/script-proxy-connect-tunnel.test.ts +0 -177
- package/src/__tests__/script-proxy-decision-trace.test.ts +0 -156
- package/src/__tests__/script-proxy-http-forwarder.test.ts +0 -281
- package/src/__tests__/script-proxy-injection-runtime.test.ts +0 -401
- package/src/__tests__/script-proxy-mitm-handler.test.ts +0 -407
- package/src/__tests__/script-proxy-policy-runtime.test.ts +0 -287
- package/src/__tests__/script-proxy-policy.test.ts +0 -310
- package/src/__tests__/script-proxy-rewrite-specificity.test.ts +0 -135
- package/src/__tests__/script-proxy-router.test.ts +0 -180
- package/src/__tests__/script-proxy-session-manager.test.ts +0 -382
- package/src/__tests__/script-proxy-session-runtime.test.ts +0 -113
- package/src/__tests__/secret-allowlist.test.ts +0 -229
- package/src/__tests__/secret-ingress-handler.test.ts +0 -99
- package/src/__tests__/secret-onetime-send.test.ts +0 -130
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +0 -106
- package/src/__tests__/secret-response-routing.test.ts +0 -93
- package/src/__tests__/secret-scanner-executor.test.ts +0 -348
- package/src/__tests__/secret-scanner.test.ts +0 -857
- package/src/__tests__/secure-keys.test.ts +0 -323
- package/src/__tests__/server-history-render.test.ts +0 -431
- package/src/__tests__/session-abort-tool-results.test.ts +0 -240
- package/src/__tests__/session-conflict-gate.test.ts +0 -700
- package/src/__tests__/session-error.test.ts +0 -369
- package/src/__tests__/session-evictor.test.ts +0 -188
- package/src/__tests__/session-init.benchmark.test.ts +0 -462
- package/src/__tests__/session-load-history-repair.test.ts +0 -222
- package/src/__tests__/session-pre-run-repair.test.ts +0 -213
- package/src/__tests__/session-profile-injection.test.ts +0 -444
- package/src/__tests__/session-provider-retry-repair.test.ts +0 -306
- package/src/__tests__/session-queue.test.ts +0 -1535
- package/src/__tests__/session-runtime-assembly.test.ts +0 -476
- package/src/__tests__/session-runtime-workspace.test.ts +0 -183
- package/src/__tests__/session-skill-tools.test.ts +0 -2431
- package/src/__tests__/session-slash-known.test.ts +0 -368
- package/src/__tests__/session-slash-queue.test.ts +0 -288
- package/src/__tests__/session-slash-unknown.test.ts +0 -271
- package/src/__tests__/session-surfaces-task-progress.test.ts +0 -104
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +0 -473
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +0 -140
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +0 -140
- package/src/__tests__/session-undo.test.ts +0 -75
- package/src/__tests__/session-workspace-cache-state.test.ts +0 -246
- package/src/__tests__/session-workspace-injection.test.ts +0 -327
- package/src/__tests__/session-workspace-tool-tracking.test.ts +0 -240
- package/src/__tests__/shared-filesystem-errors.test.ts +0 -78
- package/src/__tests__/shell-credential-ref.test.ts +0 -187
- package/src/__tests__/shell-parser-fuzz.test.ts +0 -544
- package/src/__tests__/shell-parser-property.test.ts +0 -433
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -272
- package/src/__tests__/signup-e2e.test.ts +0 -353
- package/src/__tests__/size-guard.test.ts +0 -117
- package/src/__tests__/skill-include-graph.test.ts +0 -303
- package/src/__tests__/skill-load-tool.test.ts +0 -409
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -328
- package/src/__tests__/skill-script-runner-host.test.ts +0 -489
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -349
- package/src/__tests__/skill-script-runner.test.ts +0 -159
- package/src/__tests__/skill-tool-factory.test.ts +0 -252
- package/src/__tests__/skill-tool-manifest.test.ts +0 -658
- package/src/__tests__/skill-version-hash.test.ts +0 -182
- package/src/__tests__/skills.test.ts +0 -680
- package/src/__tests__/slash-commands-catalog.test.ts +0 -86
- package/src/__tests__/slash-commands-parser.test.ts +0 -119
- package/src/__tests__/slash-commands-resolver.test.ts +0 -193
- package/src/__tests__/slash-commands-rewrite.test.ts +0 -39
- package/src/__tests__/speaker-identification.test.ts +0 -52
- package/src/__tests__/starter-bundle.test.ts +0 -136
- package/src/__tests__/starter-task-flow.test.ts +0 -143
- package/src/__tests__/subagent-manager-notify.test.ts +0 -404
- package/src/__tests__/subagent-tools.test.ts +0 -218
- package/src/__tests__/subagent-types.test.ts +0 -78
- package/src/__tests__/swarm-orchestrator.test.ts +0 -428
- package/src/__tests__/swarm-plan-validator.test.ts +0 -330
- package/src/__tests__/swarm-recursion.test.ts +0 -165
- package/src/__tests__/swarm-router-planner.test.ts +0 -208
- package/src/__tests__/swarm-session-integration.test.ts +0 -274
- package/src/__tests__/swarm-tool.test.ts +0 -145
- package/src/__tests__/swarm-worker-backend.test.ts +0 -129
- package/src/__tests__/swarm-worker-runner.test.ts +0 -272
- package/src/__tests__/system-prompt.test.ts +0 -439
- package/src/__tests__/task-compiler.test.ts +0 -284
- package/src/__tests__/task-runner.test.ts +0 -216
- package/src/__tests__/task-scheduler.test.ts +0 -217
- package/src/__tests__/task-tools.test.ts +0 -595
- package/src/__tests__/terminal-sandbox-docker.test.ts +0 -1064
- package/src/__tests__/terminal-sandbox.integration.test.ts +0 -178
- package/src/__tests__/terminal-sandbox.test.ts +0 -202
- package/src/__tests__/test-support/browser-skill-harness.ts +0 -90
- package/src/__tests__/test-support/computer-use-skill-harness.ts +0 -45
- package/src/__tests__/tool-audit-listener.test.ts +0 -113
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -253
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -500
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -516
- package/src/__tests__/tool-executor-redaction.test.ts +0 -289
- package/src/__tests__/tool-executor.test.ts +0 -2055
- package/src/__tests__/tool-metrics-listener.test.ts +0 -225
- package/src/__tests__/tool-notification-listener.test.ts +0 -49
- package/src/__tests__/tool-policy.test.ts +0 -54
- package/src/__tests__/tool-profiling-listener.test.ts +0 -268
- package/src/__tests__/tool-result-truncation.test.ts +0 -217
- package/src/__tests__/tool-trace-listener.test.ts +0 -226
- package/src/__tests__/top-level-renderer.test.ts +0 -121
- package/src/__tests__/top-level-scanner.test.ts +0 -141
- package/src/__tests__/trace-emitter.test.ts +0 -173
- package/src/__tests__/trust-store.test.ts +0 -2031
- package/src/__tests__/turn-commit.test.ts +0 -554
- package/src/__tests__/twilio-provider.test.ts +0 -179
- package/src/__tests__/twilio-routes-twiml.test.ts +0 -127
- package/src/__tests__/twilio-routes.test.ts +0 -822
- package/src/__tests__/twitter-auth-handler.test.ts +0 -666
- package/src/__tests__/url-safety.test.ts +0 -418
- package/src/__tests__/view-image-tool.test.ts +0 -217
- package/src/__tests__/weather-skill-regression.test.ts +0 -225
- package/src/__tests__/web-fetch.test.ts +0 -869
- package/src/__tests__/web-search.test.ts +0 -584
- package/src/__tests__/workspace-git-service.test.ts +0 -1153
- package/src/__tests__/workspace-heartbeat-service.test.ts +0 -486
- package/src/__tests__/workspace-lifecycle.test.ts +0 -292
- package/src/agent/attachments.ts +0 -35
- package/src/agent/loop.ts +0 -500
- package/src/agent/message-types.ts +0 -17
- package/src/agent-heartbeat/agent-heartbeat-service.ts +0 -155
- package/src/autonomy/autonomy-resolver.ts +0 -60
- package/src/autonomy/autonomy-store.ts +0 -122
- package/src/autonomy/disposition-mapper.ts +0 -31
- package/src/autonomy/index.ts +0 -11
- package/src/autonomy/types.ts +0 -39
- package/src/bundler/app-bundler.ts +0 -295
- package/src/bundler/bundle-scanner.ts +0 -535
- package/src/bundler/bundle-signer.ts +0 -124
- package/src/bundler/manifest.ts +0 -21
- package/src/bundler/signature-verifier.ts +0 -184
- package/src/calls/call-bridge.ts +0 -95
- package/src/calls/call-constants.ts +0 -48
- package/src/calls/call-domain.ts +0 -278
- package/src/calls/call-orchestrator.ts +0 -412
- package/src/calls/call-recovery.ts +0 -207
- package/src/calls/call-state-machine.ts +0 -68
- package/src/calls/call-state.ts +0 -87
- package/src/calls/call-store.ts +0 -416
- package/src/calls/elevenlabs-client.ts +0 -89
- package/src/calls/elevenlabs-config.ts +0 -29
- package/src/calls/relay-server.ts +0 -390
- package/src/calls/speaker-identification.ts +0 -213
- package/src/calls/twilio-config.ts +0 -45
- package/src/calls/twilio-provider.ts +0 -178
- package/src/calls/twilio-routes.ts +0 -316
- package/src/calls/types.ts +0 -37
- package/src/calls/voice-provider.ts +0 -14
- package/src/calls/voice-quality.ts +0 -92
- package/src/cli/autonomy.ts +0 -188
- package/src/cli/config-commands.ts +0 -334
- package/src/cli/contacts.ts +0 -149
- package/src/cli/core-commands.ts +0 -784
- package/src/cli/doordash.ts +0 -1055
- package/src/cli/email-guardrails.ts +0 -200
- package/src/cli/email.ts +0 -405
- package/src/cli/ipc-client.ts +0 -82
- package/src/cli/main-screen.tsx +0 -53
- package/src/cli/map.ts +0 -270
- package/src/cli/twitter.ts +0 -575
- package/src/cli.ts +0 -937
- package/src/commands/__tests__/cc-command-registry.test.ts +0 -319
- package/src/commands/cc-command-registry.ts +0 -209
- package/src/config/bundled-skills/.gitkeep +0 -0
- package/src/config/bundled-skills/agentmail/SKILL.md +0 -128
- package/src/config/bundled-skills/agentmail/icon.svg +0 -21
- package/src/config/bundled-skills/app-builder/SKILL.md +0 -1404
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -279
- package/src/config/bundled-skills/app-builder/icon.svg +0 -9
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +0 -15
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +0 -11
- package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +0 -18
- package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +0 -11
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-query.ts +0 -10
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +0 -20
- package/src/config/bundled-skills/browser/SKILL.md +0 -28
- package/src/config/bundled-skills/browser/TOOLS.json +0 -234
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -9
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -9
- package/src/config/bundled-skills/claude-code/SKILL.md +0 -50
- package/src/config/bundled-skills/claude-code/TOOLS.json +0 -40
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -9
- package/src/config/bundled-skills/computer-use/SKILL.md +0 -17
- package/src/config/bundled-skills/computer-use/TOOLS.json +0 -326
- package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +0 -9
- package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +0 -9
- package/src/config/bundled-skills/contacts/SKILL.md +0 -39
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -122
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +0 -9
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -9
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -9
- package/src/config/bundled-skills/document/SKILL.md +0 -26
- package/src/config/bundled-skills/document/TOOLS.json +0 -53
- package/src/config/bundled-skills/document/tools/document-create.ts +0 -9
- package/src/config/bundled-skills/document/tools/document-update.ts +0 -9
- package/src/config/bundled-skills/doordash/SKILL.md +0 -163
- package/src/config/bundled-skills/followups/SKILL.md +0 -32
- package/src/config/bundled-skills/followups/TOOLS.json +0 -100
- package/src/config/bundled-skills/followups/icon.svg +0 -24
- package/src/config/bundled-skills/followups/tools/followup-create.ts +0 -9
- package/src/config/bundled-skills/followups/tools/followup-list.ts +0 -9
- package/src/config/bundled-skills/followups/tools/followup-resolve.ts +0 -9
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -108
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -165
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -21
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -42
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -13
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -30
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -41
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -18
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/image-studio/SKILL.md +0 -32
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -42
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +0 -115
- package/src/config/bundled-skills/macos-automation/SKILL.md +0 -66
- package/src/config/bundled-skills/messaging/SKILL.md +0 -130
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -357
- package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -23
- package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -23
- package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +0 -26
- package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +0 -23
- package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +0 -84
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -18
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +0 -125
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +0 -16
- package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +0 -49
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +0 -21
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +0 -28
- package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -29
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +0 -22
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -27
- package/src/config/bundled-skills/messaging/tools/shared.ts +0 -71
- package/src/config/bundled-skills/messaging/tools/slack-add-reaction.ts +0 -25
- package/src/config/bundled-skills/messaging/tools/slack-leave-channel.ts +0 -23
- package/src/config/bundled-skills/phone-calls/SKILL.md +0 -414
- package/src/config/bundled-skills/playbooks/SKILL.md +0 -31
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -126
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +0 -9
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +0 -9
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +0 -9
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +0 -9
- package/src/config/bundled-skills/public-ingress/SKILL.md +0 -183
- package/src/config/bundled-skills/reminder/SKILL.md +0 -20
- package/src/config/bundled-skills/reminder/TOOLS.json +0 -67
- package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +0 -9
- package/src/config/bundled-skills/reminder/tools/reminder-create.ts +0 -9
- package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -9
- package/src/config/bundled-skills/schedule/SKILL.md +0 -74
- package/src/config/bundled-skills/schedule/TOOLS.json +0 -135
- package/src/config/bundled-skills/schedule/tools/schedule-create.ts +0 -9
- package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +0 -9
- package/src/config/bundled-skills/schedule/tools/schedule-list.ts +0 -9
- package/src/config/bundled-skills/schedule/tools/schedule-update.ts +0 -9
- package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -68
- package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
- package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
- package/src/config/bundled-skills/subagent/SKILL.md +0 -25
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -107
- package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-message.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-read.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +0 -9
- package/src/config/bundled-skills/subagent/tools/subagent-status.ts +0 -9
- package/src/config/bundled-skills/tasks/SKILL.md +0 -28
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -281
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -9
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -9
- package/src/config/bundled-skills/transcribe/SKILL.md +0 -25
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -32
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +0 -370
- package/src/config/bundled-skills/twitter/SKILL.md +0 -134
- package/src/config/bundled-skills/watcher/SKILL.md +0 -27
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -147
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -9
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -9
- package/src/config/bundled-skills/weather/SKILL.md +0 -37
- package/src/config/bundled-skills/weather/TOOLS.json +0 -32
- package/src/config/bundled-skills/weather/icon.svg +0 -24
- package/src/config/bundled-skills/weather/tools/get-weather.ts +0 -9
- package/src/config/computer-use-prompt.ts +0 -97
- package/src/config/defaults.ts +0 -252
- package/src/config/loader.ts +0 -339
- package/src/config/schema.ts +0 -1356
- package/src/config/skill-state.ts +0 -95
- package/src/config/skills.ts +0 -972
- package/src/config/system-prompt.ts +0 -675
- package/src/config/templates/BOOTSTRAP.md +0 -70
- package/src/config/templates/IDENTITY.md +0 -25
- package/src/config/templates/LOOKS.md +0 -25
- package/src/config/templates/SOUL.md +0 -37
- package/src/config/templates/USER.md +0 -19
- package/src/config/types.ts +0 -40
- package/src/config/vellum-skills/deploy-fullstack-vercel/SKILL.md +0 -179
- package/src/config/vellum-skills/document-writer/SKILL.md +0 -195
- package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
- package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +0 -153
- package/src/config/vellum-skills/telegram-setup/SKILL.md +0 -102
- package/src/contacts/contact-store.ts +0 -410
- package/src/contacts/index.ts +0 -11
- package/src/contacts/types.ts +0 -28
- package/src/context/token-estimator.ts +0 -108
- package/src/context/tool-result-truncation.ts +0 -128
- package/src/context/window-manager.ts +0 -531
- package/src/daemon/assistant-attachments.ts +0 -689
- package/src/daemon/classifier.ts +0 -110
- package/src/daemon/computer-use-session.ts +0 -903
- package/src/daemon/connection-policy.ts +0 -41
- package/src/daemon/date-context.ts +0 -136
- package/src/daemon/handlers/apps.ts +0 -461
- package/src/daemon/handlers/browser.ts +0 -54
- package/src/daemon/handlers/computer-use.ts +0 -187
- package/src/daemon/handlers/config.ts +0 -707
- package/src/daemon/handlers/diagnostics.ts +0 -338
- package/src/daemon/handlers/documents.ts +0 -173
- package/src/daemon/handlers/home-base.ts +0 -78
- package/src/daemon/handlers/identity.ts +0 -127
- package/src/daemon/handlers/index.ts +0 -128
- package/src/daemon/handlers/misc.ts +0 -331
- package/src/daemon/handlers/open-bundle-handler.ts +0 -80
- package/src/daemon/handlers/publish.ts +0 -187
- package/src/daemon/handlers/sessions.ts +0 -539
- package/src/daemon/handlers/shared.ts +0 -569
- package/src/daemon/handlers/signing.ts +0 -37
- package/src/daemon/handlers/skills.ts +0 -501
- package/src/daemon/handlers/subagents.ts +0 -210
- package/src/daemon/handlers/twitter-auth.ts +0 -198
- package/src/daemon/handlers/work-items.ts +0 -632
- package/src/daemon/handlers/workspace-files.ts +0 -75
- package/src/daemon/handlers.ts +0 -17
- package/src/daemon/history-repair.ts +0 -214
- package/src/daemon/ipc-blob-store.ts +0 -231
- package/src/daemon/ipc-contract-inventory.json +0 -463
- package/src/daemon/ipc-contract-inventory.ts +0 -126
- package/src/daemon/ipc-contract.ts +0 -2352
- package/src/daemon/ipc-protocol.ts +0 -75
- package/src/daemon/ipc-validate.ts +0 -171
- package/src/daemon/lifecycle.ts +0 -580
- package/src/daemon/main.ts +0 -21
- package/src/daemon/media-visibility-policy.ts +0 -57
- package/src/daemon/ride-shotgun-handler.ts +0 -309
- package/src/daemon/server.ts +0 -1207
- package/src/daemon/session-agent-loop.ts +0 -922
- package/src/daemon/session-attachments.ts +0 -196
- package/src/daemon/session-conflict-gate.ts +0 -128
- package/src/daemon/session-dynamic-profile.ts +0 -63
- package/src/daemon/session-error.ts +0 -290
- package/src/daemon/session-evictor.ts +0 -196
- package/src/daemon/session-history.ts +0 -437
- package/src/daemon/session-lifecycle.ts +0 -147
- package/src/daemon/session-media-retry.ts +0 -147
- package/src/daemon/session-memory.ts +0 -212
- package/src/daemon/session-messaging.ts +0 -145
- package/src/daemon/session-notifiers.ts +0 -193
- package/src/daemon/session-process.ts +0 -264
- package/src/daemon/session-queue-manager.ts +0 -82
- package/src/daemon/session-runtime-assembly.ts +0 -447
- package/src/daemon/session-skill-tools.ts +0 -356
- package/src/daemon/session-slash.ts +0 -305
- package/src/daemon/session-surfaces.ts +0 -702
- package/src/daemon/session-tool-setup.ts +0 -524
- package/src/daemon/session-usage.ts +0 -72
- package/src/daemon/session-workspace.ts +0 -19
- package/src/daemon/session.ts +0 -400
- package/src/daemon/trace-emitter.ts +0 -82
- package/src/daemon/video-thumbnail.ts +0 -60
- package/src/daemon/watch-handler.ts +0 -274
- package/src/doordash/client.ts +0 -999
- package/src/doordash/queries.ts +0 -1311
- package/src/doordash/query-extractor.ts +0 -93
- package/src/doordash/session.ts +0 -82
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -317
- package/src/email/providers/index.ts +0 -58
- package/src/email/service.ts +0 -303
- package/src/email/types.ts +0 -126
- package/src/events/bus.ts +0 -157
- package/src/events/domain-events.ts +0 -83
- package/src/events/index.ts +0 -18
- package/src/events/tool-audit-listener.ts +0 -80
- package/src/events/tool-domain-event-publisher.ts +0 -111
- package/src/events/tool-metrics-listener.ts +0 -159
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/events/tool-profiling-listener.ts +0 -158
- package/src/events/tool-trace-listener.ts +0 -75
- package/src/export/formatter.ts +0 -98
- package/src/followups/followup-store.ts +0 -168
- package/src/followups/index.ts +0 -10
- package/src/followups/types.ts +0 -29
- package/src/gallery/default-gallery.ts +0 -795
- package/src/gallery/gallery-manifest.ts +0 -24
- package/src/home-base/app-link-store.ts +0 -82
- package/src/home-base/bootstrap.ts +0 -68
- package/src/home-base/prebuilt/index.html +0 -662
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -112
- package/src/home-base/prebuilt-home-base-updater.ts +0 -30
- package/src/hooks/cli.ts +0 -163
- package/src/hooks/config.ts +0 -88
- package/src/hooks/discovery.ts +0 -110
- package/src/hooks/manager.ts +0 -128
- package/src/hooks/runner.ts +0 -123
- package/src/hooks/templates.ts +0 -52
- package/src/hooks/types.ts +0 -72
- package/src/inbound/public-ingress-urls.ts +0 -123
- package/src/index.ts +0 -75
- package/src/instrument.ts +0 -60
- package/src/logfire.ts +0 -99
- package/src/media/gemini-image-service.ts +0 -136
- package/src/memory/account-store.ts +0 -108
- package/src/memory/admin.ts +0 -211
- package/src/memory/app-store.ts +0 -556
- package/src/memory/attachments-store.ts +0 -397
- package/src/memory/channel-delivery-store.ts +0 -353
- package/src/memory/checkpoints.ts +0 -52
- package/src/memory/clarification-resolver.ts +0 -298
- package/src/memory/conflict-intent.ts +0 -114
- package/src/memory/conflict-store.ts +0 -342
- package/src/memory/contradiction-checker.ts +0 -330
- package/src/memory/conversation-key-store.ts +0 -107
- package/src/memory/conversation-store.ts +0 -470
- package/src/memory/db.ts +0 -1825
- package/src/memory/embedding-backend.ts +0 -229
- package/src/memory/embedding-gemini.ts +0 -52
- package/src/memory/embedding-local.ts +0 -75
- package/src/memory/embedding-ollama.ts +0 -55
- package/src/memory/embedding-openai.ts +0 -25
- package/src/memory/entity-extractor.ts +0 -474
- package/src/memory/fingerprint.ts +0 -20
- package/src/memory/indexer.ts +0 -156
- package/src/memory/items-extractor.ts +0 -461
- package/src/memory/job-handlers/backfill.ts +0 -139
- package/src/memory/job-handlers/cleanup.ts +0 -58
- package/src/memory/job-handlers/conflict.ts +0 -121
- package/src/memory/job-handlers/embedding.ts +0 -61
- package/src/memory/job-handlers/extraction.ts +0 -123
- package/src/memory/job-handlers/index-maintenance.ts +0 -54
- package/src/memory/job-handlers/summarization.ts +0 -286
- package/src/memory/job-utils.ts +0 -170
- package/src/memory/jobs-store.ts +0 -401
- package/src/memory/jobs-worker.ts +0 -274
- package/src/memory/llm-request-log-store.ts +0 -45
- package/src/memory/llm-usage-store.ts +0 -60
- package/src/memory/message-content.ts +0 -54
- package/src/memory/profile-compiler.ts +0 -160
- package/src/memory/published-pages-store.ts +0 -137
- package/src/memory/qdrant-client.ts +0 -366
- package/src/memory/qdrant-manager.ts +0 -242
- package/src/memory/query-builder.ts +0 -45
- package/src/memory/retrieval-budget.ts +0 -30
- package/src/memory/retriever.ts +0 -653
- package/src/memory/runs-store.ts +0 -255
- package/src/memory/schema.ts +0 -588
- package/src/memory/search/entity.ts +0 -298
- package/src/memory/search/formatting.ts +0 -207
- package/src/memory/search/lexical.ts +0 -227
- package/src/memory/search/ranking.ts +0 -401
- package/src/memory/search/semantic.ts +0 -121
- package/src/memory/search/types.ts +0 -137
- package/src/memory/segmenter.ts +0 -68
- package/src/memory/shared-app-links-store.ts +0 -138
- package/src/memory/tool-usage-store.ts +0 -62
- package/src/messaging/activity-analyzer.ts +0 -76
- package/src/messaging/draft-store.ts +0 -88
- package/src/messaging/index.ts +0 -3
- package/src/messaging/provider-types.ts +0 -80
- package/src/messaging/provider.ts +0 -43
- package/src/messaging/providers/gmail/adapter.ts +0 -193
- package/src/messaging/providers/gmail/client.ts +0 -204
- package/src/messaging/providers/gmail/types.ts +0 -90
- package/src/messaging/providers/slack/adapter.ts +0 -202
- package/src/messaging/providers/slack/client.ts +0 -198
- package/src/messaging/providers/slack/types.ts +0 -119
- package/src/messaging/registry.ts +0 -34
- package/src/messaging/style-analyzer.ts +0 -159
- package/src/messaging/thread-summarizer.ts +0 -306
- package/src/messaging/triage-engine.ts +0 -323
- package/src/messaging/types.ts +0 -55
- package/src/permissions/checker.ts +0 -636
- package/src/permissions/defaults.ts +0 -254
- package/src/permissions/prompter.ts +0 -102
- package/src/permissions/secret-prompter.ts +0 -114
- package/src/permissions/trust-store.ts +0 -584
- package/src/permissions/types.ts +0 -62
- package/src/playbooks/index.ts +0 -2
- package/src/playbooks/playbook-compiler.ts +0 -90
- package/src/playbooks/types.ts +0 -55
- package/src/providers/anthropic/client.ts +0 -751
- package/src/providers/failover.ts +0 -129
- package/src/providers/fireworks/client.ts +0 -20
- package/src/providers/gemini/client.ts +0 -285
- package/src/providers/ollama/client.ts +0 -30
- package/src/providers/openai/client.ts +0 -337
- package/src/providers/openrouter/client.ts +0 -20
- package/src/providers/ratelimit.ts +0 -93
- package/src/providers/registry.ts +0 -146
- package/src/providers/retry.ts +0 -106
- package/src/providers/stream-timeout.ts +0 -38
- package/src/providers/types.ts +0 -109
- package/src/runtime/assistant-event-hub.ts +0 -120
- package/src/runtime/assistant-event.ts +0 -82
- package/src/runtime/gateway-client.ts +0 -42
- package/src/runtime/http-server.ts +0 -1056
- package/src/runtime/http-types.ts +0 -66
- package/src/runtime/routes/app-routes.ts +0 -174
- package/src/runtime/routes/attachment-routes.ts +0 -133
- package/src/runtime/routes/call-routes.ts +0 -140
- package/src/runtime/routes/channel-routes.ts +0 -382
- package/src/runtime/routes/conversation-routes.ts +0 -352
- package/src/runtime/routes/events-routes.ts +0 -79
- package/src/runtime/routes/run-routes.ts +0 -262
- package/src/runtime/routes/secret-routes.ts +0 -76
- package/src/runtime/run-orchestrator.ts +0 -296
- package/src/schedule/recurrence-engine.ts +0 -138
- package/src/schedule/recurrence-types.ts +0 -67
- package/src/schedule/schedule-store.ts +0 -497
- package/src/schedule/scheduler.ts +0 -171
- package/src/security/encrypted-store.ts +0 -238
- package/src/security/keychain.ts +0 -252
- package/src/security/oauth-callback-registry.ts +0 -66
- package/src/security/oauth2.ts +0 -274
- package/src/security/redaction.ts +0 -89
- package/src/security/secret-allowlist.ts +0 -164
- package/src/security/secret-ingress.ts +0 -57
- package/src/security/secret-scanner.ts +0 -543
- package/src/security/secure-keys.ts +0 -180
- package/src/security/token-manager.ts +0 -141
- package/src/services/published-app-updater.ts +0 -69
- package/src/services/vercel-deploy.ts +0 -73
- package/src/skills/active-skill-tools.ts +0 -81
- package/src/skills/clawhub.ts +0 -414
- package/src/skills/include-graph.ts +0 -146
- package/src/skills/managed-store.ts +0 -233
- package/src/skills/path-classifier.ts +0 -128
- package/src/skills/slash-commands.ts +0 -174
- package/src/skills/tool-manifest.ts +0 -165
- package/src/skills/version-hash.ts +0 -110
- package/src/slack/slack-webhook.ts +0 -61
- package/src/subagent/index.ts +0 -19
- package/src/subagent/manager.ts +0 -511
- package/src/subagent/types.ts +0 -69
- package/src/swarm/backend-claude-code.ts +0 -145
- package/src/swarm/index.ts +0 -44
- package/src/swarm/limits.ts +0 -37
- package/src/swarm/orchestrator.ts +0 -279
- package/src/swarm/plan-validator.ts +0 -151
- package/src/swarm/router-planner.ts +0 -100
- package/src/swarm/router-prompts.ts +0 -36
- package/src/swarm/synthesizer.ts +0 -62
- package/src/swarm/types.ts +0 -62
- package/src/swarm/worker-backend.ts +0 -121
- package/src/swarm/worker-prompts.ts +0 -79
- package/src/swarm/worker-runner.ts +0 -164
- package/src/tasks/SPEC.md +0 -139
- package/src/tasks/candidate-store.ts +0 -86
- package/src/tasks/ephemeral-permissions.ts +0 -50
- package/src/tasks/task-compiler.ts +0 -199
- package/src/tasks/task-runner.ts +0 -90
- package/src/tasks/task-scheduler.ts +0 -20
- package/src/tasks/task-store.ts +0 -127
- package/src/tasks/tool-sanitizer.ts +0 -36
- package/src/tools/apps/definitions.ts +0 -59
- package/src/tools/apps/executors.ts +0 -313
- package/src/tools/apps/open-proxy.ts +0 -43
- package/src/tools/apps/registry.ts +0 -16
- package/src/tools/assets/materialize.ts +0 -218
- package/src/tools/assets/search.ts +0 -361
- package/src/tools/browser/__tests__/auth-cache.test.ts +0 -219
- package/src/tools/browser/__tests__/auth-detector.test.ts +0 -362
- package/src/tools/browser/__tests__/jit-auth.test.ts +0 -189
- package/src/tools/browser/api-map.ts +0 -293
- package/src/tools/browser/auth-cache.ts +0 -149
- package/src/tools/browser/auth-detector.ts +0 -347
- package/src/tools/browser/auto-navigate.ts +0 -270
- package/src/tools/browser/browser-execution.ts +0 -980
- package/src/tools/browser/browser-handoff.ts +0 -79
- package/src/tools/browser/browser-manager.ts +0 -715
- package/src/tools/browser/browser-screencast.ts +0 -217
- package/src/tools/browser/headless-browser.ts +0 -450
- package/src/tools/browser/jit-auth.ts +0 -51
- package/src/tools/browser/network-recorder.ts +0 -349
- package/src/tools/browser/network-recording-types.ts +0 -49
- package/src/tools/browser/recording-store.ts +0 -49
- package/src/tools/browser/runtime-check.ts +0 -43
- package/src/tools/browser/x-auto-navigate.ts +0 -207
- package/src/tools/calls/call-end.ts +0 -67
- package/src/tools/calls/call-start.ts +0 -73
- package/src/tools/calls/call-status.ts +0 -81
- package/src/tools/claude-code/claude-code.ts +0 -428
- package/src/tools/computer-use/definitions.ts +0 -443
- package/src/tools/computer-use/registry.ts +0 -22
- package/src/tools/computer-use/request-computer-control.ts +0 -53
- package/src/tools/computer-use/skill-proxy-bridge.ts +0 -28
- package/src/tools/contacts/contact-merge.ts +0 -55
- package/src/tools/contacts/contact-search.ts +0 -58
- package/src/tools/contacts/contact-upsert.ts +0 -64
- package/src/tools/credentials/account-registry.ts +0 -127
- package/src/tools/credentials/broker-types.ts +0 -107
- package/src/tools/credentials/broker.ts +0 -372
- package/src/tools/credentials/domain-policy.ts +0 -51
- package/src/tools/credentials/host-pattern-match.ts +0 -60
- package/src/tools/credentials/metadata-store.ts +0 -335
- package/src/tools/credentials/policy-types.ts +0 -52
- package/src/tools/credentials/policy-validate.ts +0 -80
- package/src/tools/credentials/resolve.ts +0 -122
- package/src/tools/credentials/selection.ts +0 -159
- package/src/tools/credentials/tool-policy.ts +0 -25
- package/src/tools/credentials/vault.ts +0 -657
- package/src/tools/document/document-tool.ts +0 -92
- package/src/tools/document/editor-template.ts +0 -237
- package/src/tools/executor.ts +0 -944
- package/src/tools/filesystem/edit.ts +0 -127
- package/src/tools/filesystem/fuzzy-match.ts +0 -202
- package/src/tools/filesystem/read.ts +0 -71
- package/src/tools/filesystem/view-image.ts +0 -199
- package/src/tools/filesystem/write.ts +0 -79
- package/src/tools/followups/followup_create.ts +0 -76
- package/src/tools/followups/followup_list.ts +0 -60
- package/src/tools/followups/followup_resolve.ts +0 -56
- package/src/tools/host-filesystem/edit.ts +0 -125
- package/src/tools/host-filesystem/read.ts +0 -80
- package/src/tools/host-filesystem/write.ts +0 -76
- package/src/tools/host-terminal/cli-discover.ts +0 -180
- package/src/tools/host-terminal/host-shell.ts +0 -191
- package/src/tools/memory/definitions.ts +0 -69
- package/src/tools/memory/handlers.ts +0 -246
- package/src/tools/memory/register.ts +0 -66
- package/src/tools/network/__tests__/web-search.test.ts +0 -427
- package/src/tools/network/domain-normalize.ts +0 -85
- package/src/tools/network/script-proxy/__tests__/logging.test.ts +0 -248
- package/src/tools/network/script-proxy/__tests__/policy.test.ts +0 -234
- package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -76
- package/src/tools/network/script-proxy/certs.ts +0 -237
- package/src/tools/network/script-proxy/connect-tunnel.ts +0 -82
- package/src/tools/network/script-proxy/http-forwarder.ts +0 -151
- package/src/tools/network/script-proxy/index.ts +0 -28
- package/src/tools/network/script-proxy/logging.ts +0 -196
- package/src/tools/network/script-proxy/mitm-handler.ts +0 -269
- package/src/tools/network/script-proxy/policy.ts +0 -152
- package/src/tools/network/script-proxy/router.ts +0 -60
- package/src/tools/network/script-proxy/server.ts +0 -136
- package/src/tools/network/script-proxy/session-manager.ts +0 -534
- package/src/tools/network/script-proxy/types.ts +0 -125
- package/src/tools/network/url-safety.ts +0 -227
- package/src/tools/network/web-fetch.ts +0 -713
- package/src/tools/network/web-search.ts +0 -319
- package/src/tools/playbooks/index.ts +0 -4
- package/src/tools/playbooks/playbook-create.ts +0 -96
- package/src/tools/playbooks/playbook-delete.ts +0 -52
- package/src/tools/playbooks/playbook-list.ts +0 -74
- package/src/tools/playbooks/playbook-update.ts +0 -111
- package/src/tools/registry.ts +0 -295
- package/src/tools/reminder/reminder-store.ts +0 -148
- package/src/tools/reminder/reminder.ts +0 -80
- package/src/tools/schedule/create.ts +0 -81
- package/src/tools/schedule/delete.ts +0 -28
- package/src/tools/schedule/list.ts +0 -69
- package/src/tools/schedule/update.ts +0 -90
- package/src/tools/shared/filesystem/edit-engine.ts +0 -56
- package/src/tools/shared/filesystem/errors.ts +0 -85
- package/src/tools/shared/filesystem/file-ops-service.ts +0 -215
- package/src/tools/shared/filesystem/format-diff.ts +0 -35
- package/src/tools/shared/filesystem/path-policy.ts +0 -125
- package/src/tools/shared/filesystem/size-guard.ts +0 -41
- package/src/tools/shared/filesystem/types.ts +0 -80
- package/src/tools/shared/shell-output.ts +0 -52
- package/src/tools/skills/delete-managed.ts +0 -60
- package/src/tools/skills/load.ts +0 -139
- package/src/tools/skills/sandbox-runner.ts +0 -279
- package/src/tools/skills/scaffold-managed.ts +0 -150
- package/src/tools/skills/script-contract.ts +0 -6
- package/src/tools/skills/skill-script-runner.ts +0 -86
- package/src/tools/skills/skill-tool-factory.ts +0 -64
- package/src/tools/skills/vellum-catalog.ts +0 -217
- package/src/tools/subagent/abort.ts +0 -33
- package/src/tools/subagent/message.ts +0 -39
- package/src/tools/subagent/read.ts +0 -67
- package/src/tools/subagent/spawn.ts +0 -46
- package/src/tools/subagent/status.ts +0 -45
- package/src/tools/swarm/delegate.ts +0 -183
- package/src/tools/system/request-permission.ts +0 -98
- package/src/tools/system/version.ts +0 -43
- package/src/tools/tasks/index.ts +0 -27
- package/src/tools/tasks/task-delete.ts +0 -82
- package/src/tools/tasks/task-list.ts +0 -44
- package/src/tools/tasks/task-run.ts +0 -97
- package/src/tools/tasks/task-save.ts +0 -47
- package/src/tools/tasks/work-item-enqueue.ts +0 -234
- package/src/tools/tasks/work-item-list.ts +0 -55
- package/src/tools/tasks/work-item-remove.ts +0 -60
- package/src/tools/tasks/work-item-run.ts +0 -78
- package/src/tools/tasks/work-item-update.ts +0 -114
- package/src/tools/terminal/backends/docker.ts +0 -372
- package/src/tools/terminal/backends/native.ts +0 -190
- package/src/tools/terminal/backends/types.ts +0 -26
- package/src/tools/terminal/evaluate-typescript.ts +0 -275
- package/src/tools/terminal/parser.ts +0 -415
- package/src/tools/terminal/safe-env.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -149
- package/src/tools/terminal/sandbox.ts +0 -44
- package/src/tools/terminal/shell.ts +0 -257
- package/src/tools/tool-manifest.ts +0 -198
- package/src/tools/types.ts +0 -183
- package/src/tools/ui-surface/definitions.ts +0 -244
- package/src/tools/ui-surface/registry.ts +0 -14
- package/src/tools/watch/screen-watch.ts +0 -130
- package/src/tools/watch/watch-state.ts +0 -119
- package/src/tools/watcher/create.ts +0 -64
- package/src/tools/watcher/delete.ts +0 -27
- package/src/tools/watcher/digest.ts +0 -50
- package/src/tools/watcher/list.ts +0 -60
- package/src/tools/watcher/update.ts +0 -56
- package/src/tools/weather/service.ts +0 -551
- package/src/twitter/client.ts +0 -690
- package/src/twitter/session.ts +0 -91
- package/src/usage/actors.ts +0 -24
- package/src/usage/types.ts +0 -37
- package/src/util/clipboard.ts +0 -33
- package/src/util/content-id.ts +0 -16
- package/src/util/diff.ts +0 -181
- package/src/util/errors.ts +0 -129
- package/src/util/logger.ts +0 -243
- package/src/util/platform.ts +0 -607
- package/src/util/pricing.ts +0 -150
- package/src/util/spinner.ts +0 -51
- package/src/util/time.ts +0 -16
- package/src/util/truncate.ts +0 -6
- package/src/util/xml.ts +0 -4
- package/src/version.ts +0 -3
- package/src/watcher/constants.ts +0 -11
- package/src/watcher/engine.ts +0 -199
- package/src/watcher/provider-registry.ts +0 -15
- package/src/watcher/provider-types.ts +0 -48
- package/src/watcher/providers/gmail.ts +0 -198
- package/src/watcher/providers/google-calendar.ts +0 -228
- package/src/watcher/providers/slack.ts +0 -129
- package/src/watcher/watcher-store.ts +0 -419
- package/src/work-items/work-item-runner.ts +0 -171
- package/src/work-items/work-item-store.ts +0 -325
- package/src/workspace/commit-message-enrichment-service.ts +0 -284
- package/src/workspace/commit-message-provider.ts +0 -95
- package/src/workspace/git-service.ts +0 -840
- package/src/workspace/heartbeat-service.ts +0 -345
- package/src/workspace/provider-commit-message-generator.ts +0 -285
- package/src/workspace/top-level-renderer.ts +0 -19
- package/src/workspace/top-level-scanner.ts +0 -41
- package/src/workspace/turn-commit.ts +0 -175
- package/tsconfig.json +0 -21
|
@@ -1,657 +0,0 @@
|
|
|
1
|
-
import { RiskLevel } from '../../permissions/types.js';
|
|
2
|
-
import type { Tool, ToolContext, ToolExecutionResult } from '../types.js';
|
|
3
|
-
import type { ToolDefinition } from '../../providers/types.js';
|
|
4
|
-
import {
|
|
5
|
-
getSecureKey,
|
|
6
|
-
setSecureKey,
|
|
7
|
-
deleteSecureKey,
|
|
8
|
-
getBackendType,
|
|
9
|
-
listSecureKeys,
|
|
10
|
-
isDowngradedFromKeychain,
|
|
11
|
-
} from '../../security/secure-keys.js';
|
|
12
|
-
import { upsertCredentialMetadata, deleteCredentialMetadata, getCredentialMetadata, listCredentialMetadata, assertMetadataWritable } from './metadata-store.js';
|
|
13
|
-
import { validatePolicyInput, toPolicyFromInput } from './policy-validate.js';
|
|
14
|
-
import type { CredentialPolicyInput, CredentialInjectionTemplate } from './policy-types.js';
|
|
15
|
-
import { credentialBroker } from './broker.js';
|
|
16
|
-
import { startOAuth2Flow } from '../../security/oauth2.js';
|
|
17
|
-
import { authTest, conversationsOpen, postMessage } from '../../messaging/providers/slack/client.js';
|
|
18
|
-
import { getConfig } from '../../config/loader.js';
|
|
19
|
-
import { getLogger } from '../../util/logger.js';
|
|
20
|
-
|
|
21
|
-
const log = getLogger('credential-vault');
|
|
22
|
-
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
// Well-known OAuth configurations for auto-connect.
|
|
25
|
-
// When oauth2_connect is called with just a service name, missing parameters
|
|
26
|
-
// (auth_url, token_url, scopes, etc.) are filled from this registry.
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
|
|
29
|
-
interface WellKnownOAuthConfig {
|
|
30
|
-
authUrl: string;
|
|
31
|
-
tokenUrl: string;
|
|
32
|
-
scopes: string[];
|
|
33
|
-
userinfoUrl?: string;
|
|
34
|
-
extraParams?: Record<string, string>;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const WELL_KNOWN_OAUTH: Record<string, WellKnownOAuthConfig> = {
|
|
38
|
-
'integration:gmail': {
|
|
39
|
-
authUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
40
|
-
tokenUrl: 'https://oauth2.googleapis.com/token',
|
|
41
|
-
scopes: [
|
|
42
|
-
'https://www.googleapis.com/auth/gmail.readonly',
|
|
43
|
-
'https://www.googleapis.com/auth/gmail.modify',
|
|
44
|
-
'https://www.googleapis.com/auth/gmail.send',
|
|
45
|
-
'https://www.googleapis.com/auth/calendar.readonly',
|
|
46
|
-
'https://www.googleapis.com/auth/calendar.events',
|
|
47
|
-
'https://www.googleapis.com/auth/userinfo.email',
|
|
48
|
-
],
|
|
49
|
-
userinfoUrl: 'https://www.googleapis.com/oauth2/v2/userinfo',
|
|
50
|
-
extraParams: { access_type: 'offline', prompt: 'consent' },
|
|
51
|
-
},
|
|
52
|
-
'integration:slack': {
|
|
53
|
-
authUrl: 'https://slack.com/oauth/v2/authorize',
|
|
54
|
-
tokenUrl: 'https://slack.com/api/oauth.v2.access',
|
|
55
|
-
scopes: [
|
|
56
|
-
'channels:read', 'channels:history',
|
|
57
|
-
'groups:read', 'groups:history',
|
|
58
|
-
'im:read', 'im:history', 'im:write',
|
|
59
|
-
'mpim:read', 'mpim:history',
|
|
60
|
-
'users:read', 'chat:write',
|
|
61
|
-
'search:read', 'reactions:write',
|
|
62
|
-
],
|
|
63
|
-
extraParams: {
|
|
64
|
-
user_scope: 'channels:read,channels:history,groups:read,groups:history,im:read,im:history,mpim:read,mpim:history,users:read,chat:write,search:read,reactions:write',
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
/** Map shorthand aliases to canonical service names. */
|
|
70
|
-
const SERVICE_ALIASES: Record<string, string> = {
|
|
71
|
-
gmail: 'integration:gmail',
|
|
72
|
-
slack: 'integration:slack',
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
/** Resolve a service name through aliases. */
|
|
76
|
-
function resolveService(service: string): string {
|
|
77
|
-
return SERVICE_ALIASES[service] ?? service;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Look up a stored client_id or client_secret for a service.
|
|
82
|
-
* Checks common field names across both the canonical and alias service names.
|
|
83
|
-
*/
|
|
84
|
-
function findStoredOAuthField(service: string, fieldNames: string[]): string | undefined {
|
|
85
|
-
const servicesToCheck = [service];
|
|
86
|
-
// Also check the alias if the input is the canonical name, or vice versa
|
|
87
|
-
for (const [alias, canonical] of Object.entries(SERVICE_ALIASES)) {
|
|
88
|
-
if (canonical === service) servicesToCheck.push(alias);
|
|
89
|
-
if (alias === service) servicesToCheck.push(canonical);
|
|
90
|
-
}
|
|
91
|
-
for (const svc of servicesToCheck) {
|
|
92
|
-
for (const field of fieldNames) {
|
|
93
|
-
const value = getSecureKey(`credential:${svc}:${field}`);
|
|
94
|
-
if (value) return value;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Legacy fallback: check credential metadata on the access_token record.
|
|
99
|
-
// Older OAuth2 flows stored client_id/client_secret only in metadata JSON.
|
|
100
|
-
// New flows persist them in the keychain (checked above) for defense in depth.
|
|
101
|
-
const metadataKey = fieldNames.some((f) => f.includes('client_id'))
|
|
102
|
-
? 'oauth2ClientId' as const
|
|
103
|
-
: 'oauth2ClientSecret' as const;
|
|
104
|
-
for (const svc of servicesToCheck) {
|
|
105
|
-
const meta = getCredentialMetadata(svc, 'access_token');
|
|
106
|
-
const value = meta?.[metadataKey];
|
|
107
|
-
if (value) {
|
|
108
|
-
log.debug({ service: svc, field: metadataKey }, 'OAuth client credential resolved from metadata (legacy fallback)');
|
|
109
|
-
return value;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
class CredentialStoreTool implements Tool {
|
|
117
|
-
name = 'credential_store';
|
|
118
|
-
description = 'Store, list, delete, or prompt for credentials in the secure vault';
|
|
119
|
-
category = 'credentials';
|
|
120
|
-
defaultRiskLevel = RiskLevel.Low;
|
|
121
|
-
|
|
122
|
-
getDefinition(): ToolDefinition {
|
|
123
|
-
return {
|
|
124
|
-
name: this.name,
|
|
125
|
-
description: this.description,
|
|
126
|
-
input_schema: {
|
|
127
|
-
type: 'object',
|
|
128
|
-
properties: {
|
|
129
|
-
action: {
|
|
130
|
-
type: 'string',
|
|
131
|
-
enum: ['store', 'list', 'delete', 'prompt', 'oauth2_connect'],
|
|
132
|
-
description: '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. For well-known services (gmail, slack), only the service name is required — endpoints, scopes, and stored client credentials are resolved automatically.',
|
|
133
|
-
},
|
|
134
|
-
service: {
|
|
135
|
-
type: 'string',
|
|
136
|
-
description: 'Service name, e.g. gmail, github',
|
|
137
|
-
},
|
|
138
|
-
field: {
|
|
139
|
-
type: 'string',
|
|
140
|
-
description: 'Field name, e.g. password, username, recovery_email',
|
|
141
|
-
},
|
|
142
|
-
value: {
|
|
143
|
-
type: 'string',
|
|
144
|
-
description: 'The credential value (only for store action)',
|
|
145
|
-
},
|
|
146
|
-
label: {
|
|
147
|
-
type: 'string',
|
|
148
|
-
description: 'Display label for the prompt UI (only for prompt action), e.g. "GitHub Personal Access Token"',
|
|
149
|
-
},
|
|
150
|
-
description: {
|
|
151
|
-
type: 'string',
|
|
152
|
-
description: 'Optional context shown in the prompt UI (only for prompt action), e.g. "Needed to push changes"',
|
|
153
|
-
},
|
|
154
|
-
placeholder: {
|
|
155
|
-
type: 'string',
|
|
156
|
-
description: 'Placeholder text for the input field (only for prompt action), e.g. "ghp_xxxxxxxxxxxx"',
|
|
157
|
-
},
|
|
158
|
-
allowed_tools: {
|
|
159
|
-
type: 'array',
|
|
160
|
-
items: { type: 'string' },
|
|
161
|
-
description: 'Tools allowed to use this credential (for store/prompt actions), e.g. ["browser_fill_credential"]. Empty = deny all.',
|
|
162
|
-
},
|
|
163
|
-
allowed_domains: {
|
|
164
|
-
type: 'array',
|
|
165
|
-
items: { type: 'string' },
|
|
166
|
-
description: 'Domains where this credential may be used (for store/prompt actions), e.g. ["github.com"]. Empty = deny all.',
|
|
167
|
-
},
|
|
168
|
-
usage_description: {
|
|
169
|
-
type: 'string',
|
|
170
|
-
description: 'Human-readable description of intended usage (for store/prompt actions), e.g. "GitHub login for pushing changes"',
|
|
171
|
-
},
|
|
172
|
-
auth_url: {
|
|
173
|
-
type: 'string',
|
|
174
|
-
description: 'OAuth2 authorization endpoint (only for oauth2_connect action). Auto-filled for well-known services (gmail, slack).',
|
|
175
|
-
},
|
|
176
|
-
token_url: {
|
|
177
|
-
type: 'string',
|
|
178
|
-
description: 'OAuth2 token endpoint (only for oauth2_connect action). Auto-filled for well-known services (gmail, slack).',
|
|
179
|
-
},
|
|
180
|
-
scopes: {
|
|
181
|
-
type: 'array',
|
|
182
|
-
items: { type: 'string' },
|
|
183
|
-
description: 'OAuth2 scopes to request (only for oauth2_connect action). Auto-filled for well-known services (gmail, slack).',
|
|
184
|
-
},
|
|
185
|
-
client_id: {
|
|
186
|
-
type: 'string',
|
|
187
|
-
description: 'OAuth2 client ID (only for oauth2_connect action). If omitted, looked up from previously stored credentials.',
|
|
188
|
-
},
|
|
189
|
-
extra_params: {
|
|
190
|
-
type: 'object',
|
|
191
|
-
description: 'Extra query params for OAuth2 auth URL (only for oauth2_connect action)',
|
|
192
|
-
},
|
|
193
|
-
userinfo_url: {
|
|
194
|
-
type: 'string',
|
|
195
|
-
description: 'Endpoint to fetch account info after OAuth2 auth (only for oauth2_connect action)',
|
|
196
|
-
},
|
|
197
|
-
client_secret: {
|
|
198
|
-
type: 'string',
|
|
199
|
-
description: '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)',
|
|
200
|
-
},
|
|
201
|
-
alias: {
|
|
202
|
-
type: 'string',
|
|
203
|
-
description: 'Human-friendly name for this credential (only for store action), e.g. "fal-primary"',
|
|
204
|
-
},
|
|
205
|
-
injection_templates: {
|
|
206
|
-
type: 'array',
|
|
207
|
-
items: {
|
|
208
|
-
type: 'object',
|
|
209
|
-
properties: {
|
|
210
|
-
hostPattern: { type: 'string', description: 'Glob pattern for matching request hosts, e.g. "*.fal.ai"' },
|
|
211
|
-
injectionType: { type: 'string', enum: ['header', 'query'], description: 'Where to inject the credential value' },
|
|
212
|
-
headerName: { type: 'string', description: 'Header name when injectionType is "header"' },
|
|
213
|
-
valuePrefix: { type: 'string', description: 'Prefix prepended to the secret value, e.g. "Key ", "Bearer "' },
|
|
214
|
-
queryParamName: { type: 'string', description: 'Query parameter name when injectionType is "query"' },
|
|
215
|
-
},
|
|
216
|
-
required: ['hostPattern', 'injectionType'],
|
|
217
|
-
},
|
|
218
|
-
description: 'Templates describing how to inject this credential into proxied requests (only for store action)',
|
|
219
|
-
},
|
|
220
|
-
},
|
|
221
|
-
required: ['action'],
|
|
222
|
-
},
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
async execute(input: Record<string, unknown>, context: ToolContext): Promise<ToolExecutionResult> {
|
|
227
|
-
const action = input.action as string;
|
|
228
|
-
|
|
229
|
-
switch (action) {
|
|
230
|
-
case 'store': {
|
|
231
|
-
const service = input.service as string | undefined;
|
|
232
|
-
const field = input.field as string | undefined;
|
|
233
|
-
const value = input.value as string | undefined;
|
|
234
|
-
|
|
235
|
-
if (!service || typeof service !== 'string') {
|
|
236
|
-
return { content: 'Error: service is required for store action', isError: true };
|
|
237
|
-
}
|
|
238
|
-
if (!field || typeof field !== 'string') {
|
|
239
|
-
return { content: 'Error: field is required for store action', isError: true };
|
|
240
|
-
}
|
|
241
|
-
if (!value || typeof value !== 'string') {
|
|
242
|
-
return { content: 'Error: value is required for store action', isError: true };
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
const policyInput: CredentialPolicyInput = {
|
|
246
|
-
allowed_tools: input.allowed_tools as string[] | undefined,
|
|
247
|
-
allowed_domains: input.allowed_domains as string[] | undefined,
|
|
248
|
-
usage_description: input.usage_description as string | undefined,
|
|
249
|
-
};
|
|
250
|
-
const policyResult = validatePolicyInput(policyInput);
|
|
251
|
-
if (!policyResult.valid) {
|
|
252
|
-
return { content: `Error: ${policyResult.errors.join('; ')}`, isError: true };
|
|
253
|
-
}
|
|
254
|
-
const policy = toPolicyFromInput(policyInput);
|
|
255
|
-
|
|
256
|
-
const alias = input.alias;
|
|
257
|
-
if (alias !== undefined && typeof alias !== 'string') {
|
|
258
|
-
return { content: 'Error: alias must be a string', isError: true };
|
|
259
|
-
}
|
|
260
|
-
const rawTemplates = input.injection_templates as unknown[] | undefined;
|
|
261
|
-
|
|
262
|
-
// Validate injection templates
|
|
263
|
-
let injectionTemplates: CredentialInjectionTemplate[] | undefined;
|
|
264
|
-
if (rawTemplates !== undefined) {
|
|
265
|
-
if (!Array.isArray(rawTemplates)) {
|
|
266
|
-
return { content: 'Error: injection_templates must be an array', isError: true };
|
|
267
|
-
}
|
|
268
|
-
const templateErrors: string[] = [];
|
|
269
|
-
injectionTemplates = [];
|
|
270
|
-
for (let i = 0; i < rawTemplates.length; i++) {
|
|
271
|
-
const t = rawTemplates[i] as Record<string, unknown>;
|
|
272
|
-
if (typeof t !== 'object' || t === null) {
|
|
273
|
-
templateErrors.push(`injection_templates[${i}] must be an object`);
|
|
274
|
-
continue;
|
|
275
|
-
}
|
|
276
|
-
if (typeof t.hostPattern !== 'string' || t.hostPattern.trim().length === 0) {
|
|
277
|
-
templateErrors.push(`injection_templates[${i}].hostPattern must be a non-empty string`);
|
|
278
|
-
}
|
|
279
|
-
if (t.injectionType !== 'header' && t.injectionType !== 'query') {
|
|
280
|
-
templateErrors.push(`injection_templates[${i}].injectionType must be 'header' or 'query'`);
|
|
281
|
-
} else if (t.injectionType === 'header') {
|
|
282
|
-
if (typeof t.headerName !== 'string' || t.headerName.trim().length === 0) {
|
|
283
|
-
templateErrors.push(`injection_templates[${i}].headerName is required when injectionType is 'header'`);
|
|
284
|
-
}
|
|
285
|
-
} else if (t.injectionType === 'query') {
|
|
286
|
-
if (typeof t.queryParamName !== 'string' || t.queryParamName.trim().length === 0) {
|
|
287
|
-
templateErrors.push(`injection_templates[${i}].queryParamName is required when injectionType is 'query'`);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
if (t.valuePrefix !== undefined && typeof t.valuePrefix !== 'string') {
|
|
291
|
-
templateErrors.push(`injection_templates[${i}].valuePrefix must be a string`);
|
|
292
|
-
}
|
|
293
|
-
if (templateErrors.length === 0) {
|
|
294
|
-
injectionTemplates.push({
|
|
295
|
-
hostPattern: t.hostPattern as string,
|
|
296
|
-
injectionType: t.injectionType as 'header' | 'query',
|
|
297
|
-
headerName: typeof t.headerName === 'string' ? t.headerName : undefined,
|
|
298
|
-
valuePrefix: typeof t.valuePrefix === 'string' ? t.valuePrefix : undefined,
|
|
299
|
-
queryParamName: typeof t.queryParamName === 'string' ? t.queryParamName : undefined,
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
if (templateErrors.length > 0) {
|
|
304
|
-
return { content: `Error: ${templateErrors.join('; ')}`, isError: true };
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
try {
|
|
309
|
-
assertMetadataWritable();
|
|
310
|
-
} catch {
|
|
311
|
-
return { content: 'Error: credential metadata file has an unrecognized version; cannot store credentials', isError: true };
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
const key = `credential:${service}:${field}`;
|
|
315
|
-
const ok = setSecureKey(key, value);
|
|
316
|
-
if (!ok) {
|
|
317
|
-
return { content: 'Error: failed to store credential', isError: true };
|
|
318
|
-
}
|
|
319
|
-
try {
|
|
320
|
-
upsertCredentialMetadata(service, field, {
|
|
321
|
-
allowedTools: policy.allowedTools,
|
|
322
|
-
allowedDomains: policy.allowedDomains,
|
|
323
|
-
usageDescription: policy.usageDescription,
|
|
324
|
-
alias,
|
|
325
|
-
injectionTemplates,
|
|
326
|
-
});
|
|
327
|
-
} catch (err) {
|
|
328
|
-
log.warn({ service, field, err }, 'metadata write failed after storing credential');
|
|
329
|
-
}
|
|
330
|
-
const metadata = getCredentialMetadata(service, field);
|
|
331
|
-
const credIdSuffix = metadata ? ` (credential_id: ${metadata.credentialId})` : '';
|
|
332
|
-
return { content: `Stored credential for ${service}/${field}.${credIdSuffix}`, isError: false };
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
case 'list': {
|
|
336
|
-
try {
|
|
337
|
-
assertMetadataWritable();
|
|
338
|
-
} catch {
|
|
339
|
-
return { content: 'Error: credential metadata file has an unrecognized version; cannot list credentials', isError: true };
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
const allMetadata = listCredentialMetadata();
|
|
343
|
-
// On the encrypted backend we can verify secrets still exist by reading
|
|
344
|
-
// all key names once (instead of per-entry getSecureKey calls that each
|
|
345
|
-
// re-read/re-derive the store). On keychain we trust metadata since the
|
|
346
|
-
// OS keychain has no batch list API.
|
|
347
|
-
// In downgraded mode (keychain failed, switched to encrypted), skip
|
|
348
|
-
// batch verification because listSecureKeys() only returns keys from
|
|
349
|
-
// the encrypted store — keychain-only credentials would be hidden.
|
|
350
|
-
const downgraded = isDowngradedFromKeychain();
|
|
351
|
-
const verifySecrets = getBackendType() === 'encrypted' && !downgraded;
|
|
352
|
-
let secureKeySet: Set<string> | undefined;
|
|
353
|
-
if (verifySecrets) {
|
|
354
|
-
try {
|
|
355
|
-
secureKeySet = new Set(listSecureKeys());
|
|
356
|
-
} catch (err) {
|
|
357
|
-
log.error({ err }, 'Failed to read secure store while listing credentials');
|
|
358
|
-
return { content: 'Error: failed to read secure storage; cannot list credentials', isError: true };
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
const entries = allMetadata
|
|
362
|
-
.filter((m) => {
|
|
363
|
-
if (secureKeySet) return secureKeySet.has(`credential:${m.service}:${m.field}`);
|
|
364
|
-
return true;
|
|
365
|
-
})
|
|
366
|
-
.map((m) => {
|
|
367
|
-
const entry: Record<string, unknown> = {
|
|
368
|
-
credential_id: m.credentialId,
|
|
369
|
-
service: m.service,
|
|
370
|
-
field: m.field,
|
|
371
|
-
};
|
|
372
|
-
if (m.alias) {
|
|
373
|
-
entry.alias = m.alias;
|
|
374
|
-
}
|
|
375
|
-
if (m.injectionTemplates && m.injectionTemplates.length > 0) {
|
|
376
|
-
entry.injection_templates = {
|
|
377
|
-
count: m.injectionTemplates.length,
|
|
378
|
-
host_patterns: m.injectionTemplates.map((t) => t.hostPattern),
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
return entry;
|
|
382
|
-
});
|
|
383
|
-
return { content: JSON.stringify(entries, null, 2), isError: false };
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
case 'delete': {
|
|
387
|
-
const service = input.service as string | undefined;
|
|
388
|
-
const field = input.field as string | undefined;
|
|
389
|
-
|
|
390
|
-
if (!service || typeof service !== 'string') {
|
|
391
|
-
return { content: 'Error: service is required for delete action', isError: true };
|
|
392
|
-
}
|
|
393
|
-
if (!field || typeof field !== 'string') {
|
|
394
|
-
return { content: 'Error: field is required for delete action', isError: true };
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
try {
|
|
398
|
-
assertMetadataWritable();
|
|
399
|
-
} catch {
|
|
400
|
-
return { content: 'Error: credential metadata file has an unrecognized version; cannot delete credentials', isError: true };
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
const key = `credential:${service}:${field}`;
|
|
404
|
-
const ok = deleteSecureKey(key);
|
|
405
|
-
if (!ok) {
|
|
406
|
-
return { content: `Error: credential ${service}/${field} not found`, isError: true };
|
|
407
|
-
}
|
|
408
|
-
try {
|
|
409
|
-
deleteCredentialMetadata(service, field);
|
|
410
|
-
} catch (err) {
|
|
411
|
-
log.warn({ service, field, err }, 'metadata delete failed after removing credential');
|
|
412
|
-
}
|
|
413
|
-
return { content: `Deleted credential for ${service}/${field}.`, isError: false };
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
case 'prompt': {
|
|
417
|
-
const service = input.service as string | undefined;
|
|
418
|
-
const field = input.field as string | undefined;
|
|
419
|
-
|
|
420
|
-
if (!service || typeof service !== 'string') {
|
|
421
|
-
return { content: 'Error: service is required for prompt action', isError: true };
|
|
422
|
-
}
|
|
423
|
-
if (!field || typeof field !== 'string') {
|
|
424
|
-
return { content: 'Error: field is required for prompt action', isError: true };
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
if (!context.requestSecret) {
|
|
428
|
-
return { content: 'Error: secret prompting not available in this context', isError: true };
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
const label = (input.label as string) || `${service} ${field}`;
|
|
432
|
-
const description = input.description as string | undefined;
|
|
433
|
-
const placeholder = input.placeholder as string | undefined;
|
|
434
|
-
|
|
435
|
-
const promptPolicyInput: CredentialPolicyInput = {
|
|
436
|
-
allowed_tools: input.allowed_tools as string[] | undefined,
|
|
437
|
-
allowed_domains: input.allowed_domains as string[] | undefined,
|
|
438
|
-
usage_description: input.usage_description as string | undefined,
|
|
439
|
-
};
|
|
440
|
-
const promptPolicyResult = validatePolicyInput(promptPolicyInput);
|
|
441
|
-
if (!promptPolicyResult.valid) {
|
|
442
|
-
return { content: `Error: ${promptPolicyResult.errors.join('; ')}`, isError: true };
|
|
443
|
-
}
|
|
444
|
-
const promptPolicy = toPolicyFromInput(promptPolicyInput);
|
|
445
|
-
|
|
446
|
-
try {
|
|
447
|
-
assertMetadataWritable();
|
|
448
|
-
} catch {
|
|
449
|
-
return { content: 'Error: credential metadata file has an unrecognized version; cannot store credentials', isError: true };
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
const result = await context.requestSecret({
|
|
453
|
-
service, field, label, description, placeholder,
|
|
454
|
-
purpose: promptPolicy.usageDescription,
|
|
455
|
-
allowedTools: promptPolicy.allowedTools.length > 0 ? promptPolicy.allowedTools : undefined,
|
|
456
|
-
allowedDomains: promptPolicy.allowedDomains.length > 0 ? promptPolicy.allowedDomains : undefined,
|
|
457
|
-
});
|
|
458
|
-
if (!result.value) {
|
|
459
|
-
return { content: 'User cancelled the credential prompt.', isError: false };
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// Handle one-time send delivery: inject into context without persisting
|
|
463
|
-
if (result.delivery === 'transient_send') {
|
|
464
|
-
const config = getConfig();
|
|
465
|
-
if (!config.secretDetection.allowOneTimeSend) {
|
|
466
|
-
log.warn({ service, field }, 'One-time send requested but not enabled in config');
|
|
467
|
-
return {
|
|
468
|
-
content: 'Error: one-time send is not enabled. Set secretDetection.allowOneTimeSend to true in config.',
|
|
469
|
-
isError: true,
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
// Ensure metadata exists so broker policy checks work, but don't
|
|
473
|
-
// overwrite an existing record — a stored credential's policy should
|
|
474
|
-
// not be silently replaced by the transient prompt's policy.
|
|
475
|
-
// Metadata must be written before injecting the transient value so
|
|
476
|
-
// we never leave a dangling value that fails policy checks.
|
|
477
|
-
if (!getCredentialMetadata(service, field)) {
|
|
478
|
-
try {
|
|
479
|
-
upsertCredentialMetadata(service, field, {
|
|
480
|
-
allowedTools: promptPolicy.allowedTools,
|
|
481
|
-
allowedDomains: promptPolicy.allowedDomains,
|
|
482
|
-
usageDescription: promptPolicy.usageDescription,
|
|
483
|
-
});
|
|
484
|
-
} catch (err) {
|
|
485
|
-
// Without metadata the broker's policy checks will reject usage,
|
|
486
|
-
// so the transient value would be silently unusable. Fail loudly.
|
|
487
|
-
log.error({ service, field, err }, 'metadata write failed for transient credential');
|
|
488
|
-
return {
|
|
489
|
-
content: `Error: failed to write credential metadata for ${service}/${field}; the one-time value was discarded.`,
|
|
490
|
-
isError: true,
|
|
491
|
-
};
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
// Inject into broker for one-time use by the next tool call, then discard
|
|
495
|
-
credentialBroker.injectTransient(service, field, result.value);
|
|
496
|
-
log.info({ service, field, delivery: 'transient_send' }, 'One-time secret delivery used');
|
|
497
|
-
return {
|
|
498
|
-
content: `One-time credential provided for ${service}/${field}. The value was NOT saved to the vault and will be consumed by the next operation.`,
|
|
499
|
-
isError: false,
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
// Default: persist to keychain
|
|
504
|
-
const key = `credential:${service}:${field}`;
|
|
505
|
-
const ok = setSecureKey(key, result.value);
|
|
506
|
-
if (!ok) {
|
|
507
|
-
return { content: 'Error: failed to store credential', isError: true };
|
|
508
|
-
}
|
|
509
|
-
try {
|
|
510
|
-
upsertCredentialMetadata(service, field, {
|
|
511
|
-
allowedTools: promptPolicy.allowedTools,
|
|
512
|
-
allowedDomains: promptPolicy.allowedDomains,
|
|
513
|
-
usageDescription: promptPolicy.usageDescription,
|
|
514
|
-
});
|
|
515
|
-
} catch (err) {
|
|
516
|
-
log.warn({ service, field, err }, 'metadata write failed after storing credential');
|
|
517
|
-
}
|
|
518
|
-
const promptMeta = getCredentialMetadata(service, field);
|
|
519
|
-
const promptCredIdSuffix = promptMeta ? ` (credential_id: ${promptMeta.credentialId})` : '';
|
|
520
|
-
return { content: `Credential stored for ${service}/${field}.${promptCredIdSuffix}`, isError: false };
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
case 'oauth2_connect': {
|
|
524
|
-
const rawService = input.service as string | undefined;
|
|
525
|
-
if (!rawService) return { content: 'Error: service is required for oauth2_connect action', isError: true };
|
|
526
|
-
|
|
527
|
-
// Resolve aliases (e.g. "gmail" → "integration:gmail")
|
|
528
|
-
const service = resolveService(rawService);
|
|
529
|
-
|
|
530
|
-
// Fill missing params from well-known config
|
|
531
|
-
const wellKnown = WELL_KNOWN_OAUTH[service];
|
|
532
|
-
const authUrl = (input.auth_url as string | undefined) ?? wellKnown?.authUrl;
|
|
533
|
-
const tokenUrl = (input.token_url as string | undefined) ?? wellKnown?.tokenUrl;
|
|
534
|
-
const scopes = (input.scopes as string[] | undefined) ?? wellKnown?.scopes;
|
|
535
|
-
const extraParams = (input.extra_params as Record<string, string> | undefined) ?? wellKnown?.extraParams;
|
|
536
|
-
const userinfoUrl = (input.userinfo_url as string | undefined) ?? wellKnown?.userinfoUrl;
|
|
537
|
-
|
|
538
|
-
// Look up client_id/client_secret from stored credentials if not provided
|
|
539
|
-
const clientId = (input.client_id as string | undefined)
|
|
540
|
-
?? findStoredOAuthField(service, ['client_id', 'oauth_client_id']);
|
|
541
|
-
const clientSecret = (input.client_secret as string | undefined)
|
|
542
|
-
?? findStoredOAuthField(service, ['client_secret', 'oauth_client_secret']);
|
|
543
|
-
|
|
544
|
-
if (!authUrl) return { content: 'Error: auth_url is required for oauth2_connect action (no well-known config for this service)', isError: true };
|
|
545
|
-
if (!tokenUrl) return { content: 'Error: token_url is required for oauth2_connect action (no well-known config for this service)', isError: true };
|
|
546
|
-
if (!scopes || scopes.length === 0) return { content: 'Error: scopes is required for oauth2_connect action (no well-known config for this service)', isError: true };
|
|
547
|
-
if (!clientId) return { content: 'Error: client_id is required for oauth2_connect action. Provide it directly or store it first with credential_store.', isError: true };
|
|
548
|
-
|
|
549
|
-
if (!context.isInteractive) {
|
|
550
|
-
return { content: 'Error: oauth2_connect action requires an interactive client session', isError: true };
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
try {
|
|
554
|
-
assertMetadataWritable();
|
|
555
|
-
} catch {
|
|
556
|
-
return { content: 'Error: credential metadata file has an unrecognized version; cannot store credentials', isError: true };
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
try {
|
|
560
|
-
const allowedTools = input.allowed_tools as string[] | undefined;
|
|
561
|
-
|
|
562
|
-
const { tokens, grantedScopes, rawTokenResponse } = await startOAuth2Flow(
|
|
563
|
-
{ authUrl, tokenUrl, scopes, clientId, clientSecret, extraParams, userinfoUrl },
|
|
564
|
-
{
|
|
565
|
-
openUrl: (url) => {
|
|
566
|
-
context.sendToClient?.({ type: 'open_url', url, title: `Connect ${service}` });
|
|
567
|
-
},
|
|
568
|
-
},
|
|
569
|
-
);
|
|
570
|
-
|
|
571
|
-
const tokenStored = setSecureKey(`credential:${service}:access_token`, tokens.accessToken);
|
|
572
|
-
if (!tokenStored) {
|
|
573
|
-
return { content: 'Error: failed to store access token in secure storage', isError: true };
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
const expiresAt = tokens.expiresIn ? Date.now() + tokens.expiresIn * 1000 : null;
|
|
577
|
-
|
|
578
|
-
let accountInfo: string | undefined;
|
|
579
|
-
if (userinfoUrl && grantedScopes.some((s) => s.includes('userinfo'))) {
|
|
580
|
-
try {
|
|
581
|
-
const resp = await fetch(userinfoUrl, {
|
|
582
|
-
headers: { Authorization: `Bearer ${tokens.accessToken}` },
|
|
583
|
-
});
|
|
584
|
-
if (resp.ok) {
|
|
585
|
-
const info = await resp.json() as { email?: string };
|
|
586
|
-
accountInfo = info.email;
|
|
587
|
-
}
|
|
588
|
-
} catch {
|
|
589
|
-
// Non-fatal
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
// Persist client credentials in keychain for defense in depth
|
|
594
|
-
const clientIdStored = setSecureKey(`credential:${service}:client_id`, clientId);
|
|
595
|
-
if (!clientIdStored) {
|
|
596
|
-
return { content: 'Error: failed to store client_id in secure storage', isError: true };
|
|
597
|
-
}
|
|
598
|
-
if (clientSecret) {
|
|
599
|
-
const clientSecretStored = setSecureKey(`credential:${service}:client_secret`, clientSecret);
|
|
600
|
-
if (!clientSecretStored) {
|
|
601
|
-
return { content: 'Error: failed to store client_secret in secure storage', isError: true };
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
upsertCredentialMetadata(service, 'access_token', {
|
|
606
|
-
allowedTools: allowedTools ?? [],
|
|
607
|
-
expiresAt,
|
|
608
|
-
grantedScopes,
|
|
609
|
-
accountInfo: accountInfo ?? null,
|
|
610
|
-
oauth2TokenUrl: tokenUrl,
|
|
611
|
-
oauth2ClientId: clientId,
|
|
612
|
-
...(clientSecret ? { oauth2ClientSecret: clientSecret } : {}),
|
|
613
|
-
});
|
|
614
|
-
|
|
615
|
-
if (tokens.refreshToken) {
|
|
616
|
-
const refreshStored = setSecureKey(`credential:${service}:refresh_token`, tokens.refreshToken);
|
|
617
|
-
if (refreshStored) {
|
|
618
|
-
upsertCredentialMetadata(service, 'refresh_token', {});
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
// Send a welcome DM for Slack connections
|
|
623
|
-
if (service === 'integration:slack') {
|
|
624
|
-
try {
|
|
625
|
-
const botToken = rawTokenResponse.access_token as string | undefined;
|
|
626
|
-
const authedUser = rawTokenResponse.authed_user as Record<string, unknown> | undefined;
|
|
627
|
-
const installingUserId = authedUser?.id as string | undefined;
|
|
628
|
-
if (botToken && installingUserId) {
|
|
629
|
-
const identity = await authTest(botToken);
|
|
630
|
-
const dmChannel = await conversationsOpen(botToken, installingUserId);
|
|
631
|
-
const welcomeMsg =
|
|
632
|
-
`You have installed ${identity.user}, an AI Assistant, on ${identity.team}. ` +
|
|
633
|
-
`Manage the assistant experience for this workspace in the workspace settings page.`;
|
|
634
|
-
await postMessage(botToken, dmChannel.channel.id, welcomeMsg);
|
|
635
|
-
}
|
|
636
|
-
} catch (err) {
|
|
637
|
-
log.warn({ err }, 'Failed to send Slack welcome DM (non-fatal)');
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
return {
|
|
642
|
-
content: `Successfully connected "${service}"${accountInfo ? ` as ${accountInfo}` : ''}. The service is now ready to use.`,
|
|
643
|
-
isError: false,
|
|
644
|
-
};
|
|
645
|
-
} catch (err: unknown) {
|
|
646
|
-
const message = err instanceof Error ? err.message : 'Unknown error during OAuth flow';
|
|
647
|
-
return { content: `Error connecting "${service}": ${message}`, isError: true };
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
default:
|
|
652
|
-
return { content: `Error: unknown action "${action}"`, isError: true };
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
export const credentialStoreTool = new CredentialStoreTool();
|