@vellumai/assistant 0.6.2 → 0.6.4
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/ARCHITECTURE.md +273 -10
- package/Dockerfile +2 -3
- package/bun.lock +41 -49
- package/bunfig.toml +3 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/stt-provider-onboarding.md +120 -0
- package/knip.json +12 -2
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +3 -3
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
- package/openapi.yaml +1111 -86
- package/package.json +40 -42
- package/scripts/generate-openapi.ts +0 -2
- package/scripts/test.sh +73 -18
- package/src/__tests__/acp-session.test.ts +43 -0
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- package/src/__tests__/agent-loop.test.ts +123 -0
- package/src/__tests__/anthropic-provider.test.ts +263 -10
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +1 -0
- package/src/__tests__/app-source-watcher.test.ts +37 -11
- package/src/__tests__/approval-routes-http.test.ts +178 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +550 -0
- package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
- package/src/__tests__/browser-fill-credential.test.ts +240 -94
- package/src/__tests__/browser-manager.test.ts +40 -27
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/browser-skill-endstate.test.ts +31 -7
- package/src/__tests__/btw-routes.test.ts +7 -0
- package/src/__tests__/call-controller.test.ts +581 -20
- package/src/__tests__/catalog-files.test.ts +1000 -0
- package/src/__tests__/channel-approvals.test.ts +53 -0
- package/src/__tests__/channel-invite-transport.test.ts +2 -2
- package/src/__tests__/channel-readiness-routes.test.ts +16 -20
- package/src/__tests__/channel-readiness-service.test.ts +12 -7
- package/src/__tests__/checker.test.ts +157 -10
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- package/src/__tests__/config-analysis.test.ts +100 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
- package/src/__tests__/config-schema-cmd.test.ts +2 -2
- package/src/__tests__/config-schema.test.ts +1248 -224
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +43 -8
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
- package/src/__tests__/contact-store-user-file.test.ts +512 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-overflow-approval.test.ts +16 -1
- package/src/__tests__/context-window-manager.test.ts +88 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +99 -3
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -2
- package/src/__tests__/conversation-attachments.test.ts +80 -4
- package/src/__tests__/conversation-confirmation-signals.test.ts +290 -0
- package/src/__tests__/conversation-error.test.ts +70 -0
- package/src/__tests__/conversation-fork-crud.test.ts +17 -0
- package/src/__tests__/conversation-history-web-search.test.ts +12 -4
- package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
- package/src/__tests__/conversation-inject-context.test.ts +103 -0
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +946 -62
- package/src/__tests__/conversation-routes-disk-view.test.ts +275 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +324 -46
- package/src/__tests__/conversation-skill-tools.test.ts +7 -4
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +89 -18
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-starter-routes.test.ts +126 -0
- package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
- package/src/__tests__/conversation-store.test.ts +195 -0
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -1
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +6 -3
- package/src/__tests__/credential-vault-unit.test.ts +383 -7
- package/src/__tests__/credential-vault.test.ts +152 -13
- package/src/__tests__/credentials-cli.test.ts +42 -18
- package/src/__tests__/cross-provider-web-search.test.ts +146 -35
- package/src/__tests__/date-context.test.ts +4 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -0
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
- package/src/__tests__/email-html-renderer.test.ts +71 -0
- package/src/__tests__/email-invite-adapter.test.ts +36 -32
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
- package/src/__tests__/emit-event-signal.test.ts +71 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +222 -0
- package/src/__tests__/fixtures/mock-chrome-extension.ts +386 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +2 -0
- package/src/__tests__/gemini-provider.test.ts +66 -2
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
- package/src/__tests__/gmail-archive-gate.test.ts +246 -0
- package/src/__tests__/gmail-preferences.test.ts +117 -0
- package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
- package/src/__tests__/headless-browser-interactions.test.ts +738 -359
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +528 -49
- package/src/__tests__/headless-browser-read-tools.test.ts +274 -100
- package/src/__tests__/headless-browser-snapshot.test.ts +250 -77
- package/src/__tests__/heartbeat-service.test.ts +70 -17
- package/src/__tests__/home-state-routes.test.ts +162 -0
- package/src/__tests__/host-bash-proxy.test.ts +145 -1
- package/src/__tests__/host-browser-e2e-cloud.test.ts +596 -0
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
- package/src/__tests__/host-browser-event-routes.test.ts +350 -0
- package/src/__tests__/host-browser-proxy.test.ts +444 -0
- package/src/__tests__/host-browser-routes.test.ts +198 -0
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +423 -0
- package/src/__tests__/host-cu-proxy.test.ts +166 -1
- package/src/__tests__/host-file-proxy.test.ts +185 -1
- package/src/__tests__/host-file-read-tool.test.ts +52 -0
- package/src/__tests__/host-proxy-interface.test.ts +165 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -11
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/integration-status.test.ts +6 -7
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
- package/src/__tests__/llm-context-normalization.test.ts +488 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- package/src/__tests__/mcp-client-auth.test.ts +40 -4
- package/src/__tests__/mcp-health-check.test.ts +10 -3
- package/src/__tests__/media-stream-output.test.ts +555 -0
- package/src/__tests__/media-stream-parser.test.ts +374 -0
- package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
- package/src/__tests__/media-stream-stt-session.test.ts +588 -0
- package/src/__tests__/media-turn-detector.test.ts +440 -0
- package/src/__tests__/message-queue.test.ts +125 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +3 -1
- package/src/__tests__/migration-export-http.test.ts +67 -8
- package/src/__tests__/migration-export-streaming.test.ts +66 -0
- package/src/__tests__/migration-import-commit-http.test.ts +109 -7
- package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +151 -0
- package/src/__tests__/model-intents.test.ts +2 -2
- package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
- package/src/__tests__/oauth-apps-routes.test.ts +18 -12
- package/src/__tests__/oauth-cli.test.ts +709 -60
- package/src/__tests__/oauth-connect-orchestrator.test.ts +118 -24
- package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +147 -10
- package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
- package/src/__tests__/oauth-providers-routes.test.ts +52 -14
- package/src/__tests__/oauth-store.test.ts +1465 -176
- package/src/__tests__/oauth2-gateway-transport.test.ts +460 -26
- package/src/__tests__/onboarding-template-contract.test.ts +81 -70
- package/src/__tests__/openai-provider.test.ts +178 -2
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1105 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
- package/src/__tests__/outlook-categories.test.ts +1 -1
- package/src/__tests__/outlook-client-automation.test.ts +1 -1
- package/src/__tests__/outlook-compose-tools.test.ts +1 -1
- package/src/__tests__/outlook-email-watcher.test.ts +1 -1
- package/src/__tests__/outlook-follow-up.test.ts +1 -1
- package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
- package/src/__tests__/outlook-trash.test.ts +1 -1
- package/src/__tests__/outlook-unsubscribe.test.ts +32 -3
- package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
- package/src/__tests__/permission-mode.test.ts +28 -56
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
- package/src/__tests__/platform-callback-registration.test.ts +19 -0
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +343 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +174 -0
- package/src/__tests__/proxy-approval-callback.test.ts +18 -0
- package/src/__tests__/qdrant-manager.test.ts +29 -8
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
- package/src/__tests__/relationship-state-contract.test.ts +175 -0
- package/src/__tests__/relay-server.test.ts +423 -5
- package/src/__tests__/require-fresh-approval.test.ts +40 -1
- package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
- package/src/__tests__/schedule-routes.test.ts +162 -0
- package/src/__tests__/search-skills-unified.test.ts +118 -0
- package/src/__tests__/secret-detection-handler.test.ts +84 -0
- package/src/__tests__/secret-ingress-http.test.ts +1 -0
- package/src/__tests__/secret-scanner-executor.test.ts +4 -0
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +8 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +49 -0
- package/src/__tests__/set-permission-mode.test.ts +13 -250
- package/src/__tests__/settings-routes.test.ts +201 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +801 -0
- package/src/__tests__/skills-files-catalog-fallback.test.ts +738 -0
- package/src/__tests__/skills.test.ts +5 -2
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +576 -16
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/subagent-detail.test.ts +44 -2
- package/src/__tests__/subagent-disposal.test.ts +1 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
- package/src/__tests__/subagent-manager-notify.test.ts +1 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
- package/src/__tests__/subagent-tools.test.ts +1 -0
- package/src/__tests__/subagent-types.test.ts +1 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
- package/src/__tests__/system-prompt.test.ts +184 -27
- package/src/__tests__/task-scheduler.test.ts +32 -6
- package/src/__tests__/telegram-config.test.ts +10 -13
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +25 -5
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
- package/src/__tests__/tool-approval-handler.test.ts +73 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +33 -24
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
- package/src/__tests__/top-level-renderer.test.ts +73 -1
- package/src/__tests__/transport-hints-queue.test.ts +14 -29
- package/src/__tests__/trust-store.test.ts +7 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
- package/src/__tests__/tts-catalog-parity.test.ts +345 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
- package/src/__tests__/twilio-routes.test.ts +376 -0
- package/src/__tests__/unicode.test.ts +293 -0
- package/src/__tests__/update-bulletin-format.test.ts +59 -0
- package/src/__tests__/update-bulletin.test.ts +206 -5
- package/src/__tests__/usage-routes.test.ts +25 -4
- package/src/__tests__/user-reference.test.ts +46 -61
- package/src/__tests__/v2-consent-policy.test.ts +103 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -0
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- package/src/__tests__/workspace-heartbeat-service.test.ts +7 -0
- package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
- package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +368 -0
- package/src/__tests__/workspace-migration-meets.test.ts +244 -0
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
- package/src/__tests__/workspace-policy.test.ts +2 -0
- package/src/acp/client-handler.ts +30 -4
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +55 -9
- package/src/approvals/guardian-request-resolvers.ts +21 -15
- package/src/backup/__tests__/backup-key.test.ts +152 -0
- package/src/backup/__tests__/backup-worker.test.ts +767 -0
- package/src/backup/__tests__/list-snapshots.test.ts +87 -0
- package/src/backup/__tests__/local-writer.test.ts +218 -0
- package/src/backup/__tests__/offsite-writer.test.ts +641 -0
- package/src/backup/__tests__/paths.test.ts +300 -0
- package/src/backup/__tests__/restore.test.ts +498 -0
- package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
- package/src/backup/__tests__/stream-crypt.test.ts +228 -0
- package/src/backup/backup-key.ts +137 -0
- package/src/backup/backup-worker.ts +459 -0
- package/src/backup/list-snapshots.ts +147 -0
- package/src/backup/local-writer.ts +133 -0
- package/src/backup/offsite-writer.ts +222 -0
- package/src/backup/paths.ts +226 -0
- package/src/backup/restore.ts +322 -0
- package/src/backup/snapshot-lock.ts +431 -0
- package/src/backup/stream-crypt.ts +263 -0
- package/src/browser-session/__tests__/manager.test.ts +297 -0
- package/src/browser-session/backends/cdp-inspect.ts +30 -0
- package/src/browser-session/backends/extension.ts +26 -0
- package/src/browser-session/backends/local.ts +24 -0
- package/src/browser-session/events.ts +164 -0
- package/src/browser-session/index.ts +27 -0
- package/src/browser-session/manager.ts +159 -0
- package/src/browser-session/types.ts +28 -0
- package/src/bundler/package-resolver.ts +4 -0
- package/src/calls/audio-store.ts +11 -5
- package/src/calls/call-controller.ts +226 -71
- package/src/calls/call-domain.ts +9 -0
- package/src/calls/call-speech-output.ts +190 -0
- package/src/calls/call-transport.ts +77 -0
- package/src/calls/media-stream-audio-transcode.ts +173 -0
- package/src/calls/media-stream-output.ts +660 -0
- package/src/calls/media-stream-parser.ts +300 -0
- package/src/calls/media-stream-protocol.ts +166 -0
- package/src/calls/media-stream-server.ts +592 -0
- package/src/calls/media-stream-stt-session.ts +460 -0
- package/src/calls/media-turn-detector.ts +230 -0
- package/src/calls/relay-server.ts +90 -75
- package/src/calls/resolve-call-tts-provider.ts +136 -0
- package/src/calls/telephony-stt-routing.ts +145 -0
- package/src/calls/tts-call-strategy.ts +161 -0
- package/src/calls/tts-text-sanitizer.ts +32 -16
- package/src/calls/twilio-routes.ts +281 -17
- package/src/calls/voice-quality.ts +78 -35
- package/src/calls/voice-session-bridge.ts +8 -1
- package/src/channels/__tests__/types.test.ts +134 -0
- package/src/channels/types.ts +69 -3
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/backup.test.ts +1165 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +234 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
- package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
- package/src/cli/commands/__tests__/email-download.test.ts +16 -1
- package/src/cli/commands/__tests__/email-list.test.ts +22 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +37 -4
- package/src/cli/commands/__tests__/email-status.test.ts +5 -1
- package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
- package/src/cli/commands/backup.ts +993 -0
- package/src/cli/commands/conversations.ts +77 -0
- package/src/cli/commands/credentials.ts +3 -4
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +273 -16
- package/src/cli/commands/mcp.ts +16 -4
- package/src/cli/commands/oauth/__tests__/connect.test.ts +56 -44
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
- package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
- package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +32 -33
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +330 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +117 -12
- package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
- package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
- package/src/cli/commands/oauth/apps.ts +7 -4
- package/src/cli/commands/oauth/connect.ts +6 -3
- package/src/cli/commands/oauth/disconnect.ts +1 -1
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +215 -36
- package/src/cli/commands/oauth/shared.ts +7 -6
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +254 -0
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
- package/src/cli/commands/platform/index.ts +107 -10
- package/src/cli/commands/usage.ts +10 -9
- package/src/cli/lib/daemon-credential-client.ts +4 -0
- package/src/cli/program.ts +30 -4
- package/src/config/__tests__/backup-schema.test.ts +134 -0
- package/src/config/assistant-feature-flags.ts +61 -62
- package/src/config/bundled-skills/app-builder/SKILL.md +26 -249
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +141 -0
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
- package/src/config/bundled-skills/browser/SKILL.md +30 -5
- package/src/config/bundled-skills/browser/TOOLS.json +123 -0
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
- package/src/config/bundled-skills/contacts/SKILL.md +5 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -0
- package/src/config/bundled-skills/gmail/SKILL.md +54 -8
- package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
- package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
- package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
- package/src/config/bundled-skills/outlook/SKILL.md +9 -2
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -18
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
- package/src/config/bundled-skills/slack/SKILL.md +1 -0
- package/src/config/bundled-skills/subagent/SKILL.md +21 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
- package/src/config/bundled-skills/tasks/SKILL.md +5 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
- package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
- package/src/config/bundled-tool-registry.ts +8 -0
- package/src/config/env-registry.ts +38 -0
- package/src/config/env.ts +49 -4
- package/src/config/feature-flag-registry.json +85 -14
- package/src/config/loader.ts +82 -13
- package/src/config/sanitize-for-transfer.ts +47 -0
- package/src/config/schema.ts +81 -15
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +51 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -26
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +47 -7
- package/src/config/schemas/heartbeat.ts +27 -5
- package/src/config/schemas/host-browser.ts +112 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/memory-retrieval.ts +103 -0
- package/src/config/schemas/security.ts +0 -6
- package/src/config/schemas/services.ts +52 -0
- package/src/config/schemas/stt.ts +59 -0
- package/src/config/schemas/tts.ts +230 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/skills.ts +4 -0
- package/src/config/types.ts +4 -1
- package/src/contacts/contact-store.ts +56 -11
- package/src/contacts/contacts-write.ts +38 -1
- package/src/context/post-turn-tool-result-truncation.ts +177 -0
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +61 -10
- package/src/credential-execution/approval-bridge.ts +49 -15
- package/src/credential-execution/executable-discovery.ts +12 -2
- package/src/credential-execution/process-manager.ts +33 -2
- package/src/credential-health/credential-health-service.ts +366 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +195 -0
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- package/src/daemon/app-source-watcher.ts +35 -0
- package/src/daemon/config-watcher.ts +99 -5
- package/src/daemon/context-overflow-approval.ts +5 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +23 -2
- package/src/daemon/conversation-agent-loop.ts +153 -42
- package/src/daemon/conversation-attachments.ts +40 -0
- package/src/daemon/conversation-error.ts +11 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +59 -9
- package/src/daemon/conversation-messaging.ts +37 -3
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +622 -13
- package/src/daemon/conversation-queue-manager.ts +24 -0
- package/src/daemon/conversation-runtime-assembly.ts +128 -36
- package/src/daemon/conversation-slash.ts +36 -0
- package/src/daemon/conversation-surfaces.ts +131 -40
- package/src/daemon/conversation-tool-setup.ts +99 -8
- package/src/daemon/conversation-usage.ts +7 -4
- package/src/daemon/conversation-workspace.ts +12 -0
- package/src/daemon/conversation.ts +292 -16
- package/src/daemon/date-context.ts +10 -10
- package/src/daemon/first-greeting.ts +3 -2
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +13 -141
- package/src/daemon/handlers/shared.ts +80 -0
- package/src/daemon/handlers/skills.ts +483 -44
- package/src/daemon/host-bash-proxy.ts +48 -13
- package/src/daemon/host-browser-proxy.ts +192 -0
- package/src/daemon/host-cu-proxy.ts +36 -11
- package/src/daemon/host-file-proxy.ts +57 -9
- package/src/daemon/lifecycle.ts +179 -28
- package/src/daemon/message-protocol.ts +13 -0
- package/src/daemon/message-types/conversations.ts +89 -14
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/host-browser.ts +100 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +19 -5
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +26 -0
- package/src/daemon/message-types/subagents.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/server.ts +439 -14
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/transport-hints.ts +5 -24
- package/src/email/html-renderer.ts +76 -0
- package/src/heartbeat/heartbeat-service.ts +93 -7
- package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
- package/src/home/__tests__/emit-feed-event.test.ts +169 -0
- package/src/home/__tests__/feed-scheduler.test.ts +194 -0
- package/src/home/__tests__/feed-types.test.ts +275 -0
- package/src/home/__tests__/feed-writer.test.ts +688 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
- package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
- package/src/home/__tests__/progress-formula.test.ts +213 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
- package/src/home/__tests__/rollup-producer.test.ts +398 -0
- package/src/home/assistant-feed-authoring.ts +124 -0
- package/src/home/emit-feed-event.ts +158 -0
- package/src/home/feed-scheduler.ts +247 -0
- package/src/home/feed-types.ts +181 -0
- package/src/home/feed-writer.ts +469 -0
- package/src/home/platform-gmail-digest.ts +163 -0
- package/src/home/progress-formula.ts +86 -0
- package/src/home/relationship-state-writer.ts +824 -0
- package/src/home/relationship-state.ts +143 -0
- package/src/home/rollup-producer.ts +384 -0
- package/src/hooks/runner.ts +7 -0
- package/src/inbound/platform-callback-registration.ts +30 -20
- package/src/inbound/public-ingress-urls.ts +12 -0
- package/src/instrument.ts +1 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
- package/src/ipc/cli-client.ts +151 -0
- package/src/ipc/cli-server.ts +234 -0
- package/src/ipc/gateway-client.ts +180 -0
- package/src/ipc/routes/index.ts +5 -0
- package/src/ipc/routes/wake-conversation.ts +19 -0
- package/src/mcp/client.ts +59 -24
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
- package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +232 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
- package/src/memory/app-store.ts +31 -1
- package/src/memory/attachments-store.ts +70 -0
- package/src/memory/auto-analysis-enqueue.ts +127 -0
- package/src/memory/auto-analysis-guard.ts +27 -0
- package/src/memory/cleanup-schedule-state.ts +37 -0
- package/src/memory/conversation-analyze-job.ts +73 -0
- package/src/memory/conversation-crud.ts +122 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +34 -2
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/conversation-starters-cadence.ts +76 -0
- package/src/memory/conversation-title-service.ts +5 -2
- package/src/memory/db-init.ts +18 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/embedding-backend.test.ts +75 -0
- package/src/memory/embedding-backend.ts +131 -5
- package/src/memory/embedding-gemini.test.ts +54 -0
- package/src/memory/embedding-gemini.ts +20 -9
- package/src/memory/embedding-local.ts +176 -17
- package/src/memory/graph/consolidation.ts +10 -23
- package/src/memory/graph/conversation-graph-memory.ts +15 -0
- package/src/memory/graph/extraction-job.ts +15 -0
- package/src/memory/graph/extraction.test.ts +23 -0
- package/src/memory/graph/extraction.ts +8 -0
- package/src/memory/graph/retriever.ts +67 -40
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- package/src/memory/graph/store.test.ts +7 -3
- package/src/memory/graph/store.ts +47 -12
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/group-crud.ts +6 -1
- package/src/memory/indexer.ts +95 -16
- package/src/memory/job-handlers/cleanup.ts +11 -8
- package/src/memory/job-handlers/conversation-starters.ts +16 -10
- package/src/memory/jobs-store.ts +64 -4
- package/src/memory/jobs-worker.ts +22 -9
- package/src/memory/llm-usage-store.ts +137 -60
- package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
- package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
- package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
- package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
- package/src/memory/migrations/217-conversation-host-access.ts +40 -0
- package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
- package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
- package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
- package/src/memory/migrations/index.ts +12 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/oauth.ts +21 -13
- package/src/memory/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/client.ts +57 -6
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +143 -38
- package/src/messaging/providers/slack/client.ts +16 -0
- package/src/messaging/providers/slack/types.ts +4 -0
- package/src/notifications/decision-engine.ts +3 -3
- package/src/notifications/signal.ts +5 -0
- package/src/oauth/AGENTS.md +76 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +25 -19
- package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
- package/src/oauth/byo-connection.test.ts +26 -9
- package/src/oauth/byo-connection.ts +10 -8
- package/src/oauth/connect-orchestrator.ts +25 -21
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/connection-resolver.test.ts +17 -4
- package/src/oauth/connection-resolver.ts +22 -18
- package/src/oauth/connection.ts +3 -1
- package/src/oauth/manual-token-connection.ts +13 -13
- package/src/oauth/oauth-store.ts +223 -100
- package/src/oauth/platform-connection.test.ts +101 -3
- package/src/oauth/platform-connection.ts +56 -35
- package/src/oauth/provider-serializer.ts +31 -5
- package/src/oauth/revoke.ts +76 -0
- package/src/oauth/seed-providers.ts +133 -87
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +16 -6
- package/src/permissions/defaults.ts +49 -1
- package/src/permissions/permission-mode.ts +4 -11
- package/src/permissions/prompter.ts +13 -1
- package/src/permissions/trust-store.ts +3 -3
- package/src/permissions/v2-consent-policy.ts +87 -0
- package/src/permissions/workspace-policy.ts +3 -0
- package/src/platform/client.test.ts +10 -0
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +126 -2
- package/src/prompts/system-prompt.ts +76 -38
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
- package/src/prompts/templates/BOOTSTRAP.md +59 -105
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/prompts/templates/UPDATES.md +12 -0
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-format.ts +26 -9
- package/src/prompts/update-bulletin.ts +34 -23
- package/src/prompts/user-reference.ts +20 -17
- package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/anthropic/client.ts +157 -60
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +9 -1
- package/src/providers/model-catalog.ts +6 -0
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +474 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +502 -0
- package/src/providers/openrouter/client.ts +101 -4
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/retry.ts +14 -3
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
- package/src/providers/speech-to-text/deepgram.test.ts +332 -0
- package/src/providers/speech-to-text/deepgram.ts +115 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
- package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
- package/src/providers/speech-to-text/google-gemini.ts +101 -0
- package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
- package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
- package/src/providers/speech-to-text/openai-whisper.ts +63 -33
- package/src/providers/speech-to-text/provider-catalog.ts +306 -0
- package/src/providers/speech-to-text/resolve.ts +386 -6
- package/src/providers/types.ts +10 -1
- package/src/runtime/AGENTS.md +65 -0
- package/src/runtime/__tests__/agent-wake.test.ts +831 -0
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
- package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -0
- package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
- package/src/runtime/agent-wake.ts +512 -0
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
- package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
- package/src/runtime/auth/__tests__/route-policy.test.ts +48 -0
- package/src/runtime/auth/middleware.ts +98 -0
- package/src/runtime/auth/route-policy.ts +33 -9
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/capability-tokens.ts +414 -0
- package/src/runtime/channel-approvals.ts +18 -5
- package/src/runtime/channel-invite-transport.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +14 -6
- package/src/runtime/channel-readiness-service.ts +12 -22
- package/src/runtime/chrome-extension-registry.ts +368 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
- package/src/runtime/guardian-decision-types.ts +7 -0
- package/src/runtime/http-server.ts +815 -75
- package/src/runtime/http-types.ts +6 -2
- package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +198 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
- package/src/runtime/migrations/migration-transport.ts +7 -0
- package/src/runtime/migrations/migration-wizard.ts +23 -2
- package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
- package/src/runtime/migrations/vbundle-builder.ts +145 -38
- package/src/runtime/migrations/vbundle-import-analyzer.ts +96 -1
- package/src/runtime/migrations/vbundle-importer.ts +89 -5
- package/src/runtime/pending-interactions.ts +18 -13
- package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +507 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
- package/src/runtime/routes/app-management-routes.ts +12 -18
- package/src/runtime/routes/approval-routes.ts +90 -16
- package/src/runtime/routes/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- package/src/runtime/routes/backup-routes.ts +519 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +556 -0
- package/src/runtime/routes/btw-routes.ts +8 -6
- package/src/runtime/routes/contact-routes.test.ts +298 -0
- package/src/runtime/routes/contact-routes.ts +132 -5
- package/src/runtime/routes/conversation-analysis-routes.ts +22 -141
- package/src/runtime/routes/conversation-management-routes.ts +223 -0
- package/src/runtime/routes/conversation-routes.ts +598 -103
- package/src/runtime/routes/conversation-starter-routes.ts +78 -16
- package/src/runtime/routes/filing-routes.ts +93 -0
- package/src/runtime/routes/guardian-action-routes.ts +24 -13
- package/src/runtime/routes/home-feed-routes.ts +334 -0
- package/src/runtime/routes/home-state-routes.ts +138 -0
- package/src/runtime/routes/host-browser-routes.ts +268 -0
- package/src/runtime/routes/host-file-routes.ts +9 -1
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +262 -33
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +46 -39
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
- package/src/runtime/routes/integrations/slack/channel.ts +11 -3
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +303 -0
- package/src/runtime/routes/log-export-routes.ts +42 -22
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/memory-item-routes.ts +1 -7
- package/src/runtime/routes/migration-routes.ts +122 -2
- package/src/runtime/routes/oauth-apps.ts +15 -17
- package/src/runtime/routes/oauth-providers.ts +4 -0
- package/src/runtime/routes/schedule-routes.ts +24 -11
- package/src/runtime/routes/settings-routes.ts +31 -102
- package/src/runtime/routes/skills-routes.ts +128 -9
- package/src/runtime/routes/stt-routes.ts +233 -0
- package/src/runtime/routes/subagents-routes.ts +14 -10
- package/src/runtime/routes/surface-action-routes.ts +41 -2
- package/src/runtime/routes/tts-routes.ts +108 -24
- package/src/runtime/routes/usage-routes.ts +38 -9
- package/src/runtime/routes/user-route-dispatcher.ts +50 -5
- package/src/runtime/routes/user-routes.ts +13 -1
- package/src/runtime/routes/work-items-routes.ts +8 -1
- package/src/runtime/routes/workspace-routes.test.ts +22 -0
- package/src/runtime/routes/workspace-routes.ts +8 -1
- package/src/runtime/routes/workspace-utils.ts +2 -0
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -0
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
- package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
- package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
- package/src/runtime/services/analyze-conversation.ts +344 -0
- package/src/runtime/services/analyze-deps-singleton.ts +32 -0
- package/src/runtime/services/auto-analysis-prompt.ts +55 -0
- package/src/runtime/skill-route-registry.ts +49 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +57 -5
- package/src/security/ces-credential-client.ts +20 -0
- package/src/security/ces-rpc-credential-backend.ts +17 -0
- package/src/security/credential-backend.ts +5 -0
- package/src/security/oauth2.ts +68 -29
- package/src/security/secure-keys.ts +143 -27
- package/src/security/token-manager.ts +31 -10
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-files.ts +554 -0
- package/src/skills/category-inference.ts +122 -0
- package/src/skills/clawhub-files.ts +213 -0
- package/src/skills/clawhub.ts +84 -23
- package/src/skills/skill-file-provider.ts +40 -0
- package/src/skills/skillssh-files.ts +395 -0
- package/src/skills/skillssh-registry.ts +4 -4
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +392 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +195 -0
- package/src/stt/stt-stream-session.ts +499 -0
- package/src/stt/types.ts +330 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +169 -40
- package/src/subagent/types.ts +19 -0
- package/src/tools/apps/executors.ts +11 -2
- package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
- package/src/tools/browser/auth-detector.ts +43 -12
- package/src/tools/browser/browser-execution.ts +1787 -342
- package/src/tools/browser/browser-manager.ts +81 -12
- package/src/tools/browser/browser-mode-constants.ts +12 -0
- package/src/tools/browser/browser-mode.ts +92 -0
- package/src/tools/browser/browser-status-constants.ts +33 -0
- package/src/tools/browser/cdp-client/__tests__/accessibility-snapshot.test.ts +318 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1263 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +359 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1993 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
- package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
- package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +1007 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +744 -0
- package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +868 -0
- package/src/tools/browser/cdp-client/errors.ts +49 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +148 -0
- package/src/tools/browser/cdp-client/factory.ts +914 -0
- package/src/tools/browser/cdp-client/index.ts +28 -0
- package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
- package/src/tools/browser/cdp-client/types.ts +120 -0
- package/src/tools/credentials/vault.ts +35 -6
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +1 -1
- package/src/tools/host-filesystem/read.ts +12 -15
- package/src/tools/host-filesystem/write.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +21 -16
- package/src/tools/network/web-fetch.ts +5 -2
- package/src/tools/network/web-search.ts +5 -2
- package/src/tools/permission-checker.ts +77 -82
- package/src/tools/registry.ts +0 -2
- package/src/tools/secret-detection-handler.ts +34 -0
- package/src/tools/shared/filesystem/image-read.ts +61 -40
- package/src/tools/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +2 -0
- package/src/tools/skills/sandbox-runner.ts +3 -2
- package/src/tools/subagent/spawn.ts +47 -3
- package/src/tools/subagent/status.ts +2 -0
- package/src/tools/system/register.ts +2 -16
- package/src/tools/terminal/safe-env.ts +15 -0
- package/src/tools/terminal/shell.ts +36 -20
- package/src/tools/tool-approval-handler.ts +48 -2
- package/src/tools/tool-manifest.ts +21 -0
- package/src/tools/types.ts +19 -0
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tts/__tests__/provider-adapters.test.ts +834 -0
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
- package/src/tts/__tests__/provider-catalog.test.ts +183 -0
- package/src/tts/__tests__/provider-registry.test.ts +90 -0
- package/src/tts/provider-catalog.ts +201 -0
- package/src/tts/provider-registry.ts +73 -0
- package/src/tts/providers/deepgram-provider.ts +219 -0
- package/src/tts/providers/elevenlabs-provider.ts +211 -0
- package/src/tts/providers/fish-audio-provider.ts +183 -0
- package/src/tts/providers/index.ts +42 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +153 -0
- package/src/types/onboarding-context.ts +7 -0
- package/src/util/abort-reasons.ts +58 -0
- package/src/util/device-id.ts +32 -16
- package/src/util/errors.ts +9 -1
- package/src/util/platform.ts +63 -24
- package/src/util/pricing.ts +66 -3
- package/src/util/spawn.ts +1 -1
- package/src/util/truncate.ts +4 -2
- package/src/util/unicode.ts +201 -0
- package/src/version.ts +19 -24
- package/src/watcher/engine.ts +23 -0
- package/src/watcher/watcher-store.ts +31 -0
- package/src/workspace/migrations/003-seed-device-id.ts +9 -3
- package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
- package/src/workspace/migrations/029-seed-pkb.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +317 -0
- package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
- package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
- package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
- package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
- package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
- package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
- package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/top-level-renderer.ts +31 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/chrome-cdp.test.ts +0 -419
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- package/src/__tests__/permission-mode-sse.test.ts +0 -418
- package/src/__tests__/permission-mode-store.test.ts +0 -277
- package/src/browser-extension-relay/protocol.ts +0 -63
- package/src/browser-extension-relay/server.ts +0 -203
- package/src/cli/commands/browser-relay.ts +0 -536
- package/src/config/schemas/sandbox.ts +0 -14
- package/src/email/guardrails.ts +0 -221
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -361
- package/src/email/providers/index.ts +0 -65
- package/src/email/service.ts +0 -384
- package/src/email/types.ts +0 -126
- package/src/permissions/permission-mode-store.ts +0 -180
- package/src/prompts/templates/USER.md +0 -13
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/tools/browser/chrome-cdp.ts +0 -239
- package/src/tools/system/set-permission-mode.ts +0 -103
|
@@ -339,7 +339,7 @@ Examples:
|
|
|
339
339
|
// Manual-token providers (slack_channel, telegram) don't use
|
|
340
340
|
// OAuth2 browser flows — credentials are configured via
|
|
341
341
|
// `assistant credentials` or chat setup instead.
|
|
342
|
-
if (providerRow.
|
|
342
|
+
if (providerRow.authorizeUrl === "urn:manual-token") {
|
|
343
343
|
writeError(
|
|
344
344
|
`"${provider}" uses manual token configuration, not an OAuth browser flow. ` +
|
|
345
345
|
`Set the token with: assistant credentials set <token_value> --service ${provider} --field <field_name>`,
|
|
@@ -414,12 +414,15 @@ Examples:
|
|
|
414
414
|
writeOutput(cmd, {
|
|
415
415
|
ok: true,
|
|
416
416
|
deferred: true,
|
|
417
|
-
authUrl
|
|
417
|
+
// Wire key stays `authUrl` for backward compatibility with
|
|
418
|
+
// existing CLI script consumers; the internal field on
|
|
419
|
+
// `result` is `authorizeUrl`.
|
|
420
|
+
authUrl: result.authorizeUrl,
|
|
418
421
|
service: result.service,
|
|
419
422
|
});
|
|
420
423
|
} else {
|
|
421
424
|
process.stdout.write(
|
|
422
|
-
`\nAuthorize with ${provider}:\n\n${result.
|
|
425
|
+
`\nAuthorize with ${provider}:\n\n${result.authorizeUrl}\n\nThe connection will complete automatically once you authorize.\n`,
|
|
423
426
|
);
|
|
424
427
|
}
|
|
425
428
|
return;
|
|
@@ -212,7 +212,7 @@ Examples:
|
|
|
212
212
|
accountLabel = conn.accountInfo ?? undefined;
|
|
213
213
|
} else if (opts.connectionId) {
|
|
214
214
|
const conn = getConnection(opts.connectionId);
|
|
215
|
-
if (!conn || conn.
|
|
215
|
+
if (!conn || conn.provider !== provider) {
|
|
216
216
|
writeError(
|
|
217
217
|
`Connection "${opts.connectionId}" is not an active ${provider} connection.\n\n` +
|
|
218
218
|
`Run 'assistant oauth status ${provider}' to see active connections.`,
|
|
@@ -6,7 +6,10 @@ import {
|
|
|
6
6
|
saveRawConfig,
|
|
7
7
|
setNestedValue,
|
|
8
8
|
} from "../../../config/loader.js";
|
|
9
|
-
import
|
|
9
|
+
import {
|
|
10
|
+
getServiceMode,
|
|
11
|
+
type Services,
|
|
12
|
+
} from "../../../config/schemas/services.js";
|
|
10
13
|
import {
|
|
11
14
|
getProvider,
|
|
12
15
|
listActiveConnectionsByProvider,
|
|
@@ -120,7 +123,10 @@ Examples:
|
|
|
120
123
|
|
|
121
124
|
// Provider supports managed mode — read current config value
|
|
122
125
|
const services: Services = getConfig().services;
|
|
123
|
-
const currentMode =
|
|
126
|
+
const currentMode = getServiceMode(
|
|
127
|
+
services,
|
|
128
|
+
managedKey as keyof Services,
|
|
129
|
+
);
|
|
124
130
|
|
|
125
131
|
if (shouldOutputJson(cmd)) {
|
|
126
132
|
writeOutput(cmd, {
|
|
@@ -189,7 +195,10 @@ Examples:
|
|
|
189
195
|
|
|
190
196
|
// Read current mode
|
|
191
197
|
const services: Services = getConfig().services;
|
|
192
|
-
const currentMode =
|
|
198
|
+
const currentMode = getServiceMode(
|
|
199
|
+
services,
|
|
200
|
+
managedKey as keyof Services,
|
|
201
|
+
);
|
|
193
202
|
|
|
194
203
|
// Same mode — no-op
|
|
195
204
|
if (currentMode === newMode) {
|
|
@@ -23,6 +23,41 @@ const log = getCliLogger("cli");
|
|
|
23
23
|
|
|
24
24
|
const LOOPBACK_CALLBACK_PATH = "/oauth/callback";
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a logo URL from CLI flags, enforcing mutual exclusion between
|
|
28
|
+
* --logo-url and --logo-simpleicons-slug. Returns:
|
|
29
|
+
* - `undefined` when neither flag is set (caller should leave the field unchanged)
|
|
30
|
+
* - `null` when `--logo-url ""` is passed (clear the stored value)
|
|
31
|
+
* - a non-empty string URL otherwise
|
|
32
|
+
* Throws when both flags are set simultaneously.
|
|
33
|
+
*/
|
|
34
|
+
function resolveLogoUrlFromFlags(opts: {
|
|
35
|
+
logoUrl?: string;
|
|
36
|
+
logoSimpleiconsSlug?: string;
|
|
37
|
+
}): string | null | undefined {
|
|
38
|
+
if (opts.logoUrl !== undefined && opts.logoSimpleiconsSlug !== undefined) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
"--logo-url and --logo-simpleicons-slug are mutually exclusive. Provide at most one.",
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
if (opts.logoSimpleiconsSlug !== undefined) {
|
|
44
|
+
const slug = opts.logoSimpleiconsSlug.trim();
|
|
45
|
+
if (!slug) {
|
|
46
|
+
throw new Error("--logo-simpleicons-slug cannot be empty.");
|
|
47
|
+
}
|
|
48
|
+
return `https://cdn.simpleicons.org/${encodeURIComponent(slug)}`;
|
|
49
|
+
}
|
|
50
|
+
if (opts.logoUrl !== undefined) {
|
|
51
|
+
// Trim whitespace so copy-paste-padded URLs don't fail to parse on the
|
|
52
|
+
// client. Empty string (after trimming) clears the stored value
|
|
53
|
+
// (matches --revoke-url semantics documented in the `update` command
|
|
54
|
+
// help text).
|
|
55
|
+
const trimmed = opts.logoUrl.trim();
|
|
56
|
+
return trimmed === "" ? null : trimmed;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
26
61
|
/**
|
|
27
62
|
* Resolve the redirect URI for a provider based on its loopback port.
|
|
28
63
|
*
|
|
@@ -171,14 +206,14 @@ Examples:
|
|
|
171
206
|
$ assistant oauth providers get google
|
|
172
207
|
$ assistant oauth providers get twitter --json`,
|
|
173
208
|
)
|
|
174
|
-
.action((
|
|
209
|
+
.action((provider: string, _opts: unknown, cmd: Command) => {
|
|
175
210
|
try {
|
|
176
|
-
const row = getProvider(
|
|
211
|
+
const row = getProvider(provider);
|
|
177
212
|
|
|
178
213
|
if (!row) {
|
|
179
214
|
writeOutput(cmd, {
|
|
180
215
|
ok: false,
|
|
181
|
-
error: `Provider not found: "${
|
|
216
|
+
error: `Provider not found: "${provider}". Run 'assistant oauth providers list' to see all registered providers. To register a custom provider, run 'assistant oauth providers register --help'.`,
|
|
182
217
|
});
|
|
183
218
|
process.exitCode = 1;
|
|
184
219
|
return;
|
|
@@ -187,7 +222,7 @@ Examples:
|
|
|
187
222
|
if (!isProviderVisible(row, loadConfig())) {
|
|
188
223
|
writeOutput(cmd, {
|
|
189
224
|
ok: false,
|
|
190
|
-
error: `Provider not found: "${
|
|
225
|
+
error: `Provider not found: "${provider}". Run 'assistant oauth providers list' to see all registered providers. To register a custom provider, run 'assistant oauth providers register --help'.`,
|
|
191
226
|
});
|
|
192
227
|
process.exitCode = 1;
|
|
193
228
|
return;
|
|
@@ -220,16 +255,29 @@ Examples:
|
|
|
220
255
|
"--token-url <url>",
|
|
221
256
|
"OAuth token endpoint URL (e.g. https://oauth2.example.com/token)",
|
|
222
257
|
)
|
|
258
|
+
.option(
|
|
259
|
+
"--refresh-url <url>",
|
|
260
|
+
"OAuth token refresh endpoint URL. Defaults to --token-url when omitted. Set this when the provider uses a different endpoint for the refresh_token grant than for the authorization_code grant.",
|
|
261
|
+
)
|
|
223
262
|
.option("--base-url <url>", "API base URL for the service")
|
|
224
263
|
.option("--userinfo-url <url>", "OpenID Connect userinfo endpoint URL")
|
|
225
264
|
.option(
|
|
226
265
|
"--scopes <scopes>",
|
|
227
266
|
'Comma-separated default scopes (e.g. "read,write,profile")',
|
|
228
267
|
)
|
|
268
|
+
.option(
|
|
269
|
+
"--scope-separator <sep>",
|
|
270
|
+
'Separator used to join scopes in the authorize URL (default: " "). Use "," for providers like Linear that expect comma-separated scopes.',
|
|
271
|
+
)
|
|
229
272
|
.option(
|
|
230
273
|
"--token-auth-method <method>",
|
|
231
274
|
'How the client authenticates at the token endpoint: "client_secret_post" or "client_secret_basic"',
|
|
232
275
|
)
|
|
276
|
+
.option(
|
|
277
|
+
"--token-exchange-body-format <format>",
|
|
278
|
+
'Body encoding for the token exchange request: "form" (application/x-www-form-urlencoded, default) or "json" (application/json)',
|
|
279
|
+
"form",
|
|
280
|
+
)
|
|
233
281
|
.option(
|
|
234
282
|
"--ping-url <url>",
|
|
235
283
|
'Health-check endpoint URL for token validation (e.g. "https://api.example.com/user"). Used by "assistant oauth ping" to verify a stored token.',
|
|
@@ -246,6 +294,14 @@ Examples:
|
|
|
246
294
|
"--ping-body <json>",
|
|
247
295
|
'JSON body to send with the ping request (e.g. \'{"query":"{ viewer { id } }"}\')',
|
|
248
296
|
)
|
|
297
|
+
.option(
|
|
298
|
+
"--revoke-url <url>",
|
|
299
|
+
'OAuth token revocation endpoint URL. Called best-effort during disconnect to invalidate the access token upstream (e.g. "https://oauth2.googleapis.com/revoke"). When omitted, disconnect is local-only — the upstream token is left valid until it naturally expires.',
|
|
300
|
+
)
|
|
301
|
+
.option(
|
|
302
|
+
"--revoke-body-template <json>",
|
|
303
|
+
'JSON object body template for the revoke request, supporting {access_token} and {client_id} substitution (e.g. \'{"token":"{access_token}","client_id":"{client_id}"}\'). The body is form-encoded and POSTed to --revoke-url.',
|
|
304
|
+
)
|
|
249
305
|
.option(
|
|
250
306
|
"--display-name <name>",
|
|
251
307
|
"Human-readable display name for the provider",
|
|
@@ -255,6 +311,14 @@ Examples:
|
|
|
255
311
|
"--dashboard-url <url>",
|
|
256
312
|
"URL to the provider's developer console / dashboard",
|
|
257
313
|
)
|
|
314
|
+
.option(
|
|
315
|
+
"--logo-url <url>",
|
|
316
|
+
"URL to the provider's logo image (SVG or PNG). Mutually exclusive with --logo-simpleicons-slug.",
|
|
317
|
+
)
|
|
318
|
+
.option(
|
|
319
|
+
"--logo-simpleicons-slug <slug>",
|
|
320
|
+
'Simple Icons slug (e.g. "notion", "linear"). Resolves to https://cdn.simpleicons.org/<slug>. Mutually exclusive with --logo-url.',
|
|
321
|
+
)
|
|
258
322
|
.option(
|
|
259
323
|
"--client-id-placeholder <text>",
|
|
260
324
|
"Placeholder text shown in the client ID input field",
|
|
@@ -340,6 +404,17 @@ Examples:
|
|
|
340
404
|
--ping-url https://example.com/graphql \\
|
|
341
405
|
--ping-method POST \\
|
|
342
406
|
--ping-body '{"query":"{ viewer { id } }"}'
|
|
407
|
+
$ assistant oauth providers register \\
|
|
408
|
+
--provider-key linear-custom \\
|
|
409
|
+
--auth-url https://linear.app/oauth/authorize \\
|
|
410
|
+
--token-url https://api.linear.app/oauth/token \\
|
|
411
|
+
--scopes read,write \\
|
|
412
|
+
--scope-separator ","
|
|
413
|
+
$ assistant oauth providers register \\
|
|
414
|
+
--provider-key split-grants \\
|
|
415
|
+
--auth-url https://example.com/oauth/authorize \\
|
|
416
|
+
--token-url https://example.com/oauth/token \\
|
|
417
|
+
--refresh-url https://example.com/oauth/refresh
|
|
343
418
|
$ assistant oauth providers register \\
|
|
344
419
|
--provider-key my-api \\
|
|
345
420
|
--auth-url https://example.com/auth \\
|
|
@@ -347,7 +422,19 @@ Examples:
|
|
|
347
422
|
--loopback-port 17400 \\
|
|
348
423
|
--injection-templates '[{"hostPattern":"api.example.com","injectionType":"header","headerName":"Authorization","valuePrefix":"Bearer "}]' \\
|
|
349
424
|
--identity-url https://api.example.com/me \\
|
|
350
|
-
--identity-response-paths email,name
|
|
425
|
+
--identity-response-paths email,name
|
|
426
|
+
$ assistant oauth providers register \\
|
|
427
|
+
--provider-key custom-revokable \\
|
|
428
|
+
--auth-url https://example.com/oauth/authorize \\
|
|
429
|
+
--token-url https://example.com/oauth/token \\
|
|
430
|
+
--revoke-url https://example.com/oauth/revoke \\
|
|
431
|
+
--revoke-body-template '{"token":"{access_token}","client_id":"{client_id}"}'
|
|
432
|
+
$ assistant oauth providers register \\
|
|
433
|
+
--provider-key notion-custom \\
|
|
434
|
+
--auth-url https://api.notion.com/v1/oauth/authorize \\
|
|
435
|
+
--token-url https://api.notion.com/v1/oauth/token \\
|
|
436
|
+
--token-exchange-body-format json \\
|
|
437
|
+
--logo-simpleicons-slug notion`,
|
|
351
438
|
)
|
|
352
439
|
.action(
|
|
353
440
|
(
|
|
@@ -355,17 +442,24 @@ Examples:
|
|
|
355
442
|
providerKey: string;
|
|
356
443
|
authUrl: string;
|
|
357
444
|
tokenUrl: string;
|
|
445
|
+
refreshUrl?: string;
|
|
358
446
|
baseUrl?: string;
|
|
359
447
|
userinfoUrl?: string;
|
|
360
448
|
scopes?: string;
|
|
449
|
+
scopeSeparator?: string;
|
|
361
450
|
tokenAuthMethod?: string;
|
|
451
|
+
tokenExchangeBodyFormat?: string;
|
|
362
452
|
pingUrl?: string;
|
|
363
453
|
pingMethod?: string;
|
|
364
454
|
pingHeaders?: string;
|
|
365
455
|
pingBody?: string;
|
|
456
|
+
revokeUrl?: string;
|
|
457
|
+
revokeBodyTemplate?: string;
|
|
366
458
|
displayName?: string;
|
|
367
459
|
description?: string;
|
|
368
460
|
dashboardUrl?: string;
|
|
461
|
+
logoUrl?: string;
|
|
462
|
+
logoSimpleiconsSlug?: string;
|
|
369
463
|
clientIdPlaceholder?: string;
|
|
370
464
|
clientSecret: boolean;
|
|
371
465
|
loopbackPort?: string;
|
|
@@ -383,24 +477,39 @@ Examples:
|
|
|
383
477
|
cmd: Command,
|
|
384
478
|
) => {
|
|
385
479
|
try {
|
|
480
|
+
const resolvedLogoUrl = resolveLogoUrlFromFlags(opts);
|
|
481
|
+
if (resolvedLogoUrl === null) {
|
|
482
|
+
throw new Error(
|
|
483
|
+
"Cannot clear logo_url with empty --logo-url during registration. Omit the flag instead.",
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
|
|
386
487
|
const row = registerProvider({
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
488
|
+
provider: opts.providerKey,
|
|
489
|
+
authorizeUrl: opts.authUrl,
|
|
490
|
+
tokenExchangeUrl: opts.tokenUrl,
|
|
491
|
+
refreshUrl: opts.refreshUrl,
|
|
390
492
|
baseUrl: opts.baseUrl,
|
|
391
493
|
userinfoUrl: opts.userinfoUrl,
|
|
392
494
|
defaultScopes: opts.scopes ? opts.scopes.split(",") : [],
|
|
393
495
|
scopePolicy: {},
|
|
496
|
+
scopeSeparator: opts.scopeSeparator,
|
|
394
497
|
tokenEndpointAuthMethod: opts.tokenAuthMethod,
|
|
498
|
+
tokenExchangeBodyFormat: opts.tokenExchangeBodyFormat,
|
|
395
499
|
pingUrl: opts.pingUrl,
|
|
396
500
|
pingMethod: opts.pingMethod,
|
|
397
501
|
pingHeaders: opts.pingHeaders
|
|
398
502
|
? JSON.parse(opts.pingHeaders)
|
|
399
503
|
: undefined,
|
|
400
504
|
pingBody: opts.pingBody ? JSON.parse(opts.pingBody) : undefined,
|
|
401
|
-
|
|
505
|
+
revokeUrl: opts.revokeUrl,
|
|
506
|
+
revokeBodyTemplate: opts.revokeBodyTemplate
|
|
507
|
+
? JSON.parse(opts.revokeBodyTemplate)
|
|
508
|
+
: undefined,
|
|
509
|
+
displayLabel: opts.displayName,
|
|
402
510
|
description: opts.description,
|
|
403
511
|
dashboardUrl: opts.dashboardUrl,
|
|
512
|
+
logoUrl: resolvedLogoUrl,
|
|
404
513
|
clientIdPlaceholder: opts.clientIdPlaceholder,
|
|
405
514
|
requiresClientSecret: opts.clientSecret ? 1 : 0,
|
|
406
515
|
loopbackPort: opts.loopbackPort
|
|
@@ -455,16 +564,28 @@ Examples:
|
|
|
455
564
|
"--token-url <url>",
|
|
456
565
|
"OAuth token endpoint URL (e.g. https://oauth2.example.com/token)",
|
|
457
566
|
)
|
|
567
|
+
.option(
|
|
568
|
+
"--refresh-url <url>",
|
|
569
|
+
"OAuth token refresh endpoint URL. Defaults to --token-url when omitted. Set this when the provider uses a different endpoint for the refresh_token grant than for the authorization_code grant.",
|
|
570
|
+
)
|
|
458
571
|
.option("--base-url <url>", "API base URL for the service")
|
|
459
572
|
.option("--userinfo-url <url>", "OpenID Connect userinfo endpoint URL")
|
|
460
573
|
.option(
|
|
461
574
|
"--scopes <scopes>",
|
|
462
575
|
'Comma-separated default scopes (e.g. "read,write,profile")',
|
|
463
576
|
)
|
|
577
|
+
.option(
|
|
578
|
+
"--scope-separator <sep>",
|
|
579
|
+
'Separator used to join scopes in the authorize URL (default: " "). Use "," for providers like Linear that expect comma-separated scopes.',
|
|
580
|
+
)
|
|
464
581
|
.option(
|
|
465
582
|
"--token-auth-method <method>",
|
|
466
583
|
'How the client authenticates at the token endpoint: "client_secret_post" or "client_secret_basic"',
|
|
467
584
|
)
|
|
585
|
+
.option(
|
|
586
|
+
"--token-exchange-body-format <format>",
|
|
587
|
+
'Body encoding for the token exchange request: "form" (application/x-www-form-urlencoded, default) or "json" (application/json)',
|
|
588
|
+
)
|
|
468
589
|
.option(
|
|
469
590
|
"--ping-url <url>",
|
|
470
591
|
'Health-check endpoint URL for token validation (e.g. "https://api.example.com/user"). Used by "assistant oauth ping" to verify a stored token.',
|
|
@@ -481,6 +602,14 @@ Examples:
|
|
|
481
602
|
"--ping-body <json>",
|
|
482
603
|
'JSON body to send with the ping request (e.g. \'{"query":"{ viewer { id } }"}\')',
|
|
483
604
|
)
|
|
605
|
+
.option(
|
|
606
|
+
"--revoke-url <url>",
|
|
607
|
+
"OAuth token revocation endpoint URL. Called best-effort during disconnect to invalidate the access token upstream. Pass an empty string to clear.",
|
|
608
|
+
)
|
|
609
|
+
.option(
|
|
610
|
+
"--revoke-body-template <json>",
|
|
611
|
+
"JSON object body template for the revoke request, supporting {access_token} and {client_id} substitution. Pass an empty string to clear.",
|
|
612
|
+
)
|
|
484
613
|
.option(
|
|
485
614
|
"--display-name <name>",
|
|
486
615
|
"Human-readable display name for the provider",
|
|
@@ -490,6 +619,14 @@ Examples:
|
|
|
490
619
|
"--dashboard-url <url>",
|
|
491
620
|
"URL to the provider's developer console / dashboard",
|
|
492
621
|
)
|
|
622
|
+
.option(
|
|
623
|
+
"--logo-url <url>",
|
|
624
|
+
"URL to the provider's logo image (SVG or PNG). Mutually exclusive with --logo-simpleicons-slug.",
|
|
625
|
+
)
|
|
626
|
+
.option(
|
|
627
|
+
"--logo-simpleicons-slug <slug>",
|
|
628
|
+
'Simple Icons slug (e.g. "notion", "linear"). Resolves to https://cdn.simpleicons.org/<slug>. Mutually exclusive with --logo-url.',
|
|
629
|
+
)
|
|
493
630
|
.option(
|
|
494
631
|
"--client-id-placeholder <text>",
|
|
495
632
|
"Placeholder text shown in the client ID input field",
|
|
@@ -562,29 +699,43 @@ Examples:
|
|
|
562
699
|
$ assistant oauth providers update custom-api --display-name "My Custom API"
|
|
563
700
|
$ assistant oauth providers update custom-api --scopes read,write --auth-url https://new.example.com/auth
|
|
564
701
|
$ assistant oauth providers update custom-api --ping-url https://api.example.com/me --json
|
|
702
|
+
$ assistant oauth providers update custom-api --scope-separator ","
|
|
703
|
+
$ assistant oauth providers update custom-api --refresh-url https://example.com/oauth/refresh
|
|
565
704
|
$ assistant oauth providers update custom-api \\
|
|
566
705
|
--identity-url https://api.example.com/me \\
|
|
567
706
|
--identity-response-paths email,name
|
|
568
707
|
$ assistant oauth providers update custom-api \\
|
|
569
|
-
--injection-templates '[{"hostPattern":"api.example.com","injectionType":"header","headerName":"Authorization","valuePrefix":"Bearer "}]'
|
|
708
|
+
--injection-templates '[{"hostPattern":"api.example.com","injectionType":"header","headerName":"Authorization","valuePrefix":"Bearer "}]'
|
|
709
|
+
$ assistant oauth providers update custom-api \\
|
|
710
|
+
--revoke-url https://api.example.com/oauth/revoke \\
|
|
711
|
+
--revoke-body-template '{"token":"{access_token}"}'
|
|
712
|
+
$ assistant oauth providers update custom-api --logo-simpleicons-slug notion
|
|
713
|
+
$ assistant oauth providers update custom-api --logo-url ""`,
|
|
570
714
|
)
|
|
571
715
|
.action(
|
|
572
716
|
(
|
|
573
|
-
|
|
717
|
+
provider: string,
|
|
574
718
|
opts: {
|
|
575
719
|
authUrl?: string;
|
|
576
720
|
tokenUrl?: string;
|
|
721
|
+
refreshUrl?: string;
|
|
577
722
|
baseUrl?: string;
|
|
578
723
|
userinfoUrl?: string;
|
|
579
724
|
scopes?: string;
|
|
725
|
+
scopeSeparator?: string;
|
|
580
726
|
tokenAuthMethod?: string;
|
|
727
|
+
tokenExchangeBodyFormat?: string;
|
|
581
728
|
pingUrl?: string;
|
|
582
729
|
pingMethod?: string;
|
|
583
730
|
pingHeaders?: string;
|
|
584
731
|
pingBody?: string;
|
|
732
|
+
revokeUrl?: string;
|
|
733
|
+
revokeBodyTemplate?: string;
|
|
585
734
|
displayName?: string;
|
|
586
735
|
description?: string;
|
|
587
736
|
dashboardUrl?: string;
|
|
737
|
+
logoUrl?: string;
|
|
738
|
+
logoSimpleiconsSlug?: string;
|
|
588
739
|
clientIdPlaceholder?: string;
|
|
589
740
|
clientSecret: boolean;
|
|
590
741
|
loopbackPort?: string;
|
|
@@ -603,11 +754,11 @@ Examples:
|
|
|
603
754
|
) => {
|
|
604
755
|
try {
|
|
605
756
|
// Verify provider exists
|
|
606
|
-
const existing = getProvider(
|
|
757
|
+
const existing = getProvider(provider);
|
|
607
758
|
if (!existing) {
|
|
608
759
|
writeOutput(cmd, {
|
|
609
760
|
ok: false,
|
|
610
|
-
error: `Provider "${
|
|
761
|
+
error: `Provider "${provider}" not found. Run 'assistant oauth providers list' to see all registered providers.`,
|
|
611
762
|
});
|
|
612
763
|
process.exitCode = 1;
|
|
613
764
|
return;
|
|
@@ -616,17 +767,17 @@ Examples:
|
|
|
616
767
|
if (!isProviderVisible(existing, loadConfig())) {
|
|
617
768
|
writeOutput(cmd, {
|
|
618
769
|
ok: false,
|
|
619
|
-
error: `Provider "${
|
|
770
|
+
error: `Provider "${provider}" not found. Run 'assistant oauth providers list' to see all registered providers.`,
|
|
620
771
|
});
|
|
621
772
|
process.exitCode = 1;
|
|
622
773
|
return;
|
|
623
774
|
}
|
|
624
775
|
|
|
625
776
|
// Block updates to built-in providers
|
|
626
|
-
if (SEEDED_PROVIDER_KEYS.has(
|
|
777
|
+
if (SEEDED_PROVIDER_KEYS.has(provider)) {
|
|
627
778
|
writeOutput(cmd, {
|
|
628
779
|
ok: false,
|
|
629
|
-
error: `Cannot update built-in provider "${
|
|
780
|
+
error: `Cannot update built-in provider "${provider}". Built-in providers are managed by the system and reset on startup. To create a custom provider with different settings, use 'assistant oauth providers register --provider-key <your-custom-key> ...'`,
|
|
630
781
|
});
|
|
631
782
|
process.exitCode = 1;
|
|
632
783
|
return;
|
|
@@ -635,15 +786,22 @@ Examples:
|
|
|
635
786
|
// Build params object from provided options, omitting undefined values
|
|
636
787
|
const params: Record<string, unknown> = {};
|
|
637
788
|
|
|
638
|
-
if (opts.authUrl !== undefined) params.
|
|
639
|
-
if (opts.tokenUrl !== undefined)
|
|
789
|
+
if (opts.authUrl !== undefined) params.authorizeUrl = opts.authUrl;
|
|
790
|
+
if (opts.tokenUrl !== undefined)
|
|
791
|
+
params.tokenExchangeUrl = opts.tokenUrl;
|
|
792
|
+
if (opts.refreshUrl !== undefined)
|
|
793
|
+
params.refreshUrl = opts.refreshUrl;
|
|
640
794
|
if (opts.baseUrl !== undefined) params.baseUrl = opts.baseUrl;
|
|
641
795
|
if (opts.userinfoUrl !== undefined)
|
|
642
796
|
params.userinfoUrl = opts.userinfoUrl;
|
|
643
797
|
if (opts.scopes !== undefined)
|
|
644
798
|
params.defaultScopes = opts.scopes.split(",");
|
|
799
|
+
if (opts.scopeSeparator !== undefined)
|
|
800
|
+
params.scopeSeparator = opts.scopeSeparator;
|
|
645
801
|
if (opts.tokenAuthMethod !== undefined)
|
|
646
802
|
params.tokenEndpointAuthMethod = opts.tokenAuthMethod;
|
|
803
|
+
if (opts.tokenExchangeBodyFormat !== undefined)
|
|
804
|
+
params.tokenExchangeBodyFormat = opts.tokenExchangeBodyFormat;
|
|
647
805
|
if (opts.pingUrl !== undefined) params.pingUrl = opts.pingUrl;
|
|
648
806
|
if (opts.pingMethod !== undefined)
|
|
649
807
|
params.pingMethod = opts.pingMethod;
|
|
@@ -651,8 +809,24 @@ Examples:
|
|
|
651
809
|
params.pingHeaders = JSON.parse(opts.pingHeaders);
|
|
652
810
|
if (opts.pingBody !== undefined)
|
|
653
811
|
params.pingBody = JSON.parse(opts.pingBody);
|
|
812
|
+
if (opts.revokeUrl !== undefined) {
|
|
813
|
+
// Empty string means "clear" — normalize to null so the stored
|
|
814
|
+
// value matches the "disabled" semantics documented in the help
|
|
815
|
+
// text. `updateProvider`'s Partial type accepts `string | null`
|
|
816
|
+
// for this field so drizzle writes `null` to clear the column.
|
|
817
|
+
params.revokeUrl = opts.revokeUrl === "" ? null : opts.revokeUrl;
|
|
818
|
+
}
|
|
819
|
+
if (opts.revokeBodyTemplate !== undefined) {
|
|
820
|
+
// Empty string means "clear" — normalize to null to match --revoke-url's
|
|
821
|
+
// empty-string-clear semantics documented in the help text. The
|
|
822
|
+
// updateProvider type accepts `Record<string, string> | null` for this.
|
|
823
|
+
params.revokeBodyTemplate =
|
|
824
|
+
opts.revokeBodyTemplate === ""
|
|
825
|
+
? null
|
|
826
|
+
: JSON.parse(opts.revokeBodyTemplate);
|
|
827
|
+
}
|
|
654
828
|
if (opts.displayName !== undefined)
|
|
655
|
-
params.
|
|
829
|
+
params.displayLabel = opts.displayName;
|
|
656
830
|
if (opts.description !== undefined)
|
|
657
831
|
params.description = opts.description;
|
|
658
832
|
if (opts.dashboardUrl !== undefined)
|
|
@@ -660,6 +834,11 @@ Examples:
|
|
|
660
834
|
if (opts.clientIdPlaceholder !== undefined)
|
|
661
835
|
params.clientIdPlaceholder = opts.clientIdPlaceholder;
|
|
662
836
|
|
|
837
|
+
const resolvedLogoUrl = resolveLogoUrlFromFlags(opts);
|
|
838
|
+
if (resolvedLogoUrl !== undefined) {
|
|
839
|
+
params.logoUrl = resolvedLogoUrl;
|
|
840
|
+
}
|
|
841
|
+
|
|
663
842
|
// Handle the negated --no-client-* flag: Commander defaults
|
|
664
843
|
// opts.clientSecret to true; the negated form sets it to false.
|
|
665
844
|
// Use getOptionValueSource to detect explicit user intent.
|
|
@@ -701,7 +880,7 @@ Examples:
|
|
|
701
880
|
return;
|
|
702
881
|
}
|
|
703
882
|
|
|
704
|
-
const row = updateProvider(
|
|
883
|
+
const row = updateProvider(provider, params);
|
|
705
884
|
|
|
706
885
|
writeOutput(cmd, parseProviderRow(row));
|
|
707
886
|
} catch (err) {
|
|
@@ -747,53 +926,53 @@ Examples:
|
|
|
747
926
|
$ assistant oauth providers delete custom-api --force --json`,
|
|
748
927
|
)
|
|
749
928
|
.action(
|
|
750
|
-
async (
|
|
929
|
+
async (provider: string, opts: { force?: boolean }, cmd: Command) => {
|
|
751
930
|
try {
|
|
752
|
-
const
|
|
753
|
-
if (!
|
|
931
|
+
const providerRow = getProvider(provider);
|
|
932
|
+
if (!providerRow) {
|
|
754
933
|
writeOutput(cmd, {
|
|
755
934
|
ok: false,
|
|
756
|
-
error: `Provider not found: "${
|
|
935
|
+
error: `Provider not found: "${provider}". Run 'assistant oauth providers list' to see all registered providers.`,
|
|
757
936
|
});
|
|
758
937
|
process.exitCode = 1;
|
|
759
938
|
return;
|
|
760
939
|
}
|
|
761
940
|
|
|
762
|
-
if (!isProviderVisible(
|
|
941
|
+
if (!isProviderVisible(providerRow, loadConfig())) {
|
|
763
942
|
writeOutput(cmd, {
|
|
764
943
|
ok: false,
|
|
765
|
-
error: `Provider not found: "${
|
|
944
|
+
error: `Provider not found: "${provider}". Run 'assistant oauth providers list' to see all registered providers.`,
|
|
766
945
|
});
|
|
767
946
|
process.exitCode = 1;
|
|
768
947
|
return;
|
|
769
948
|
}
|
|
770
949
|
|
|
771
|
-
if (SEEDED_PROVIDER_KEYS.has(
|
|
950
|
+
if (SEEDED_PROVIDER_KEYS.has(provider) && !opts.force) {
|
|
772
951
|
log.info(
|
|
773
|
-
`Note: "${
|
|
952
|
+
`Note: "${provider}" is a built-in provider and will be re-created on next startup.`,
|
|
774
953
|
);
|
|
775
954
|
}
|
|
776
955
|
|
|
777
956
|
const dependentApps = listApps().filter(
|
|
778
|
-
(a) => a.
|
|
957
|
+
(a) => a.provider === provider,
|
|
779
958
|
);
|
|
780
|
-
const dependentConnections = listConnections(
|
|
959
|
+
const dependentConnections = listConnections(provider);
|
|
781
960
|
const appCount = dependentApps.length;
|
|
782
961
|
const connCount = dependentConnections.length;
|
|
783
962
|
|
|
784
963
|
if ((appCount > 0 || connCount > 0) && !opts.force) {
|
|
785
964
|
writeOutput(cmd, {
|
|
786
965
|
ok: false,
|
|
787
|
-
error: `Cannot delete provider "${
|
|
966
|
+
error: `Cannot delete provider "${provider}": ${appCount} app(s) and ${connCount} connection(s) depend on it. Use --force to cascade-delete all dependent apps and connections, or remove them manually first with 'assistant oauth apps delete' and 'assistant oauth disconnect'.`,
|
|
788
967
|
});
|
|
789
968
|
process.exitCode = 1;
|
|
790
969
|
return;
|
|
791
970
|
}
|
|
792
971
|
|
|
793
972
|
// Warn about built-in providers when --force is used
|
|
794
|
-
if (SEEDED_PROVIDER_KEYS.has(
|
|
973
|
+
if (SEEDED_PROVIDER_KEYS.has(provider) && opts.force) {
|
|
795
974
|
log.info(
|
|
796
|
-
`Note: "${
|
|
975
|
+
`Note: "${provider}" is a built-in provider and will be re-created on next startup.`,
|
|
797
976
|
);
|
|
798
977
|
}
|
|
799
978
|
|
|
@@ -802,7 +981,7 @@ Examples:
|
|
|
802
981
|
// storage in addition to deleting the connection DB row.
|
|
803
982
|
for (const conn of dependentConnections) {
|
|
804
983
|
const result = await disconnectOAuthProvider(
|
|
805
|
-
|
|
984
|
+
provider,
|
|
806
985
|
undefined,
|
|
807
986
|
conn.id as string,
|
|
808
987
|
);
|
|
@@ -816,10 +995,10 @@ Examples:
|
|
|
816
995
|
for (const app of dependentApps) {
|
|
817
996
|
await deleteApp(app.id);
|
|
818
997
|
}
|
|
819
|
-
deleteProvider(
|
|
998
|
+
deleteProvider(provider);
|
|
820
999
|
|
|
821
1000
|
if (!shouldOutputJson(cmd)) {
|
|
822
|
-
log.info(`Deleted provider: ${
|
|
1001
|
+
log.info(`Deleted provider: ${provider}`);
|
|
823
1002
|
}
|
|
824
1003
|
|
|
825
1004
|
writeOutput(cmd, {
|
|
@@ -2,6 +2,7 @@ import type { Command } from "commander";
|
|
|
2
2
|
|
|
3
3
|
import { getConfig } from "../../../config/loader.js";
|
|
4
4
|
import {
|
|
5
|
+
getServiceMode,
|
|
5
6
|
type Services,
|
|
6
7
|
ServicesSchema,
|
|
7
8
|
} from "../../../config/schemas/services.js";
|
|
@@ -30,9 +31,9 @@ export interface PlatformConnectionEntry {
|
|
|
30
31
|
* lookup so that callers (e.g. `isManagedMode`, `mode.ts`) don't duplicate the
|
|
31
32
|
* validation.
|
|
32
33
|
*/
|
|
33
|
-
export function getManagedServiceConfigKey(
|
|
34
|
-
const
|
|
35
|
-
const managedKey =
|
|
34
|
+
export function getManagedServiceConfigKey(provider: string): string | null {
|
|
35
|
+
const providerRow = getProvider(provider);
|
|
36
|
+
const managedKey = providerRow?.managedServiceConfigKey;
|
|
36
37
|
if (!managedKey || !(managedKey in ServicesSchema.shape)) return null;
|
|
37
38
|
return managedKey;
|
|
38
39
|
}
|
|
@@ -41,12 +42,12 @@ export function getManagedServiceConfigKey(providerKey: string): string | null {
|
|
|
41
42
|
* Determine whether a provider is running in platform-managed mode.
|
|
42
43
|
* Returns false if config is unavailable (e.g. in test environments).
|
|
43
44
|
*/
|
|
44
|
-
export function isManagedMode(
|
|
45
|
-
const managedKey = getManagedServiceConfigKey(
|
|
45
|
+
export function isManagedMode(provider: string): boolean {
|
|
46
|
+
const managedKey = getManagedServiceConfigKey(provider);
|
|
46
47
|
if (!managedKey) return false;
|
|
47
48
|
try {
|
|
48
49
|
const services: Services = getConfig().services;
|
|
49
|
-
return services
|
|
50
|
+
return getServiceMode(services, managedKey as keyof Services) === "managed";
|
|
50
51
|
} catch {
|
|
51
52
|
return false;
|
|
52
53
|
}
|