@vellumai/assistant 0.6.5 → 0.6.6
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/AGENTS.md +9 -1
- package/ARCHITECTURE.md +15 -17
- package/Dockerfile +6 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
- package/docs/architecture/integrations.md +32 -39
- package/docs/architecture/memory.md +25 -30
- package/docs/architecture/security.md +7 -6
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/plugins.md +761 -0
- package/examples/plugins/echo/README.md +132 -0
- package/examples/plugins/echo/package.json +17 -0
- package/examples/plugins/echo/register.ts +187 -0
- package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/openapi.yaml +212 -68
- package/package.json +1 -1
- package/src/__tests__/app-compiler.test.ts +57 -0
- package/src/__tests__/approval-cascade.test.ts +7 -2
- package/src/__tests__/auto-analysis-end-to-end.test.ts +1 -0
- package/src/__tests__/avatar-generator.test.ts +4 -2
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/catalog-cache.test.ts +69 -0
- package/src/__tests__/checker.test.ts +459 -171
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/compaction-events.test.ts +501 -0
- package/src/__tests__/compaction-pipeline.test.ts +210 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
- package/src/__tests__/compaction-timeout-recovery.test.ts +262 -0
- package/src/__tests__/config-model-image-provider.test.ts +110 -0
- package/src/__tests__/config-schema.test.ts +22 -9
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/contacts-tools.test.ts +26 -0
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-window-manager.test.ts +355 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +26 -30
- package/src/__tests__/conversation-agent-loop.test.ts +30 -141
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -1
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +2 -16
- package/src/__tests__/conversation-pairing.test.ts +174 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +4 -1
- package/src/__tests__/conversation-process-callsite.test.ts +3 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +16 -7
- package/src/__tests__/conversation-queue.test.ts +29 -14
- package/src/__tests__/conversation-routes-disk-view.test.ts +7 -6
- package/src/__tests__/conversation-runtime-assembly.test.ts +155 -110
- package/src/__tests__/conversation-runtime-workspace.test.ts +23 -38
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-slash-queue.test.ts +7 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +25 -2
- package/src/__tests__/conversation-speed-override.test.ts +6 -1
- package/src/__tests__/conversation-title-service.test.ts +116 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -2
- package/src/__tests__/conversation-usage.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +3 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -1
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +2 -2
- package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
- package/src/__tests__/empty-response-pipeline.test.ts +305 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +3 -3
- package/src/__tests__/first-greeting.test.ts +247 -5
- package/src/__tests__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/history-repair-pipeline.test.ts +399 -0
- package/src/__tests__/host-browser-e2e-cloud.test.ts +307 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +3 -3
- package/src/__tests__/host-proxy-interface.test.ts +36 -2
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/injector-chain.test.ts +526 -0
- package/src/__tests__/intent-routing.test.ts +0 -26
- package/src/__tests__/llm-call-pipeline.test.ts +285 -0
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/media-generate-image.test.ts +119 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +401 -0
- package/src/__tests__/memory-upsert-concurrency.test.ts +1 -0
- package/src/__tests__/migration-import-from-url.test.ts +5 -68
- package/src/__tests__/model-intents.test.ts +4 -2
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- package/src/__tests__/notification-decision-strategy.test.ts +0 -11
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +108 -0
- package/src/__tests__/oauth-apps-routes.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +14 -12
- package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
- package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
- package/src/__tests__/oauth-provider-visibility.test.ts +3 -5
- package/src/__tests__/oauth-providers-routes.test.ts +3 -2
- package/src/__tests__/oauth-store.test.ts +41 -76
- package/src/__tests__/onboarding-template-contract.test.ts +16 -64
- package/src/__tests__/openai-image-service.test.ts +368 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +676 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +0 -24
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +377 -0
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/platform.test.ts +5 -2
- package/src/__tests__/plugin-bootstrap.test.ts +483 -0
- package/src/__tests__/plugin-registry.test.ts +273 -0
- package/src/__tests__/plugin-route-contribution.test.ts +288 -0
- package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +286 -0
- package/src/__tests__/plugin-types.test.ts +320 -0
- package/src/__tests__/pricing.test.ts +44 -12
- package/src/__tests__/proxy-approval-callback.test.ts +69 -8
- package/src/__tests__/reaction-persistence.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +0 -2
- package/src/__tests__/schedule-routes.test.ts +131 -1
- package/src/__tests__/scheduler-recurrence.test.ts +14 -70
- package/src/__tests__/scheduler-reuse-conversation.test.ts +10 -50
- package/src/__tests__/secret-detection-handler.test.ts +0 -10
- package/src/__tests__/shell-identity.test.ts +0 -134
- package/src/__tests__/suggestion-routes.test.ts +103 -4
- package/src/__tests__/task-memory-cleanup.test.ts +1 -0
- package/src/__tests__/task-scheduler.test.ts +3 -15
- package/src/__tests__/test-preload.ts +11 -0
- package/src/__tests__/title-generate-pipeline.test.ts +224 -0
- package/src/__tests__/token-estimate-pipeline.test.ts +431 -0
- package/src/__tests__/tool-error-pipeline.test.ts +244 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +431 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -6
- package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
- package/src/__tests__/tool-executor.test.ts +141 -0
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -110
- package/src/__tests__/user-plugin-loader.test.ts +191 -0
- package/src/__tests__/workspace-migration-046-seed-conversation-starters-callsite.test.ts +185 -0
- package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
- package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
- package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-policy.test.ts +21 -3
- package/src/agent/loop.ts +340 -102
- package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
- package/src/approvals/guardian-request-resolvers.ts +80 -0
- package/src/backup/__tests__/backup-worker.test.ts +2 -13
- package/src/backup/backup-worker.ts +3 -15
- package/src/bundler/app-compiler.ts +84 -1
- package/src/calls/call-state.ts +2 -2
- package/src/channels/__tests__/types.test.ts +3 -3
- package/src/channels/types.ts +6 -4
- package/src/cli/__tests__/notifications.test.ts +87 -211
- package/src/cli/commands/__tests__/backup.test.ts +1 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +255 -35
- package/src/cli/commands/__tests__/inference-send.test.ts +12 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +12 -0
- package/src/cli/commands/backup.ts +2 -2
- package/src/cli/commands/clients.ts +138 -0
- package/src/cli/commands/completions.ts +2 -9
- package/src/cli/commands/conversations.ts +55 -7
- package/src/cli/commands/image-generation.ts +33 -34
- package/src/cli/commands/notifications.ts +68 -103
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +2 -2
- package/src/cli/commands/oauth/providers.ts +176 -8
- package/src/cli/commands/oauth/status.ts +46 -36
- package/src/cli/commands/skills.ts +3 -4
- package/src/cli/program.ts +25 -29
- package/src/config/__tests__/backup-schema.test.ts +7 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +28 -51
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +22 -40
- package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +58 -0
- package/src/config/bundled-skills/schedule/SKILL.md +8 -3
- package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
- package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
- package/src/config/bundled-tool-registry.ts +0 -15
- package/src/config/feature-flag-registry.json +17 -1
- package/src/config/schema.ts +19 -0
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/conversations.ts +16 -0
- package/src/config/schemas/llm.ts +2 -3
- package/src/config/schemas/security.ts +6 -6
- package/src/config/schemas/tts.ts +11 -0
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +94 -5
- package/src/context/__tests__/compact-prompt.test.ts +27 -9
- package/src/context/prompts/compact.md +26 -12
- package/src/context/tool-result-truncation.ts +3 -63
- package/src/context/window-manager.ts +190 -16
- package/src/credential-health/credential-health-service.ts +19 -6
- package/src/daemon/__tests__/conversation-feed-event.test.ts +317 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
- package/src/daemon/config-watcher.ts +0 -2
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/conversation-agent-loop-handlers.ts +83 -22
- package/src/daemon/conversation-agent-loop.ts +984 -683
- package/src/daemon/conversation-history.ts +10 -19
- package/src/daemon/conversation-lifecycle.ts +37 -19
- package/src/daemon/conversation-notifiers.ts +2 -110
- package/src/daemon/conversation-process.ts +14 -7
- package/src/daemon/conversation-runtime-assembly.ts +532 -411
- package/src/daemon/conversation-tool-setup.ts +41 -4
- package/src/daemon/conversation.ts +80 -35
- package/src/daemon/external-plugins-bootstrap.ts +478 -0
- package/src/daemon/first-greeting.ts +191 -14
- package/src/daemon/handlers/config-model.ts +11 -0
- package/src/daemon/handlers/skills.ts +5 -1
- package/src/daemon/lifecycle.ts +33 -68
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +49 -0
- package/src/daemon/message-types/messages.ts +12 -0
- package/src/daemon/server.ts +5 -3
- package/src/daemon/shutdown-handlers.ts +2 -12
- package/src/daemon/tool-side-effects.ts +14 -56
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +160 -0
- package/src/heartbeat/heartbeat-service.ts +24 -1
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- package/src/home/emit-feed-event.ts +7 -0
- package/src/home/feed-types.ts +41 -2
- package/src/home/rewrite-command-preview.ts +66 -0
- package/src/ipc/__tests__/socket-path.test.ts +11 -50
- package/src/ipc/cli-client.ts +1 -1
- package/src/ipc/cli-server.ts +3 -3
- package/src/ipc/gateway-client.ts +4 -1
- package/src/ipc/routes/browser-context.ts +2 -0
- package/src/ipc/routes/browser.ts +1 -0
- package/src/ipc/routes/get-contact.ts +16 -0
- package/src/ipc/routes/index.ts +14 -0
- package/src/ipc/routes/list-clients.ts +31 -0
- package/src/ipc/routes/merge-contacts.ts +17 -0
- package/src/ipc/routes/notification.ts +133 -0
- package/src/ipc/routes/rename-conversation.ts +59 -0
- package/src/ipc/routes/search-contacts.ts +19 -0
- package/src/ipc/routes/upsert-contact.ts +25 -0
- package/src/ipc/socket-path.ts +14 -38
- package/src/media/app-icon-generator.ts +23 -46
- package/src/media/avatar-router.ts +26 -41
- package/src/media/gemini-image-service.ts +8 -41
- package/src/media/image-credentials.ts +73 -0
- package/src/media/image-service.ts +85 -0
- package/src/media/openai-image-service.ts +131 -0
- package/src/media/types.ts +46 -0
- package/src/memory/conversation-crud.ts +48 -18
- package/src/memory/conversation-queries.ts +57 -4
- package/src/memory/conversation-title-service.ts +25 -0
- package/src/memory/db-init.ts +8 -0
- package/src/memory/embedding-gemini.test.ts +41 -2
- package/src/memory/embedding-gemini.ts +6 -1
- package/src/memory/graph/bootstrap.test.ts +282 -0
- package/src/memory/graph/bootstrap.ts +8 -5
- package/src/memory/graph/extraction.ts +10 -2
- package/src/memory/graph/graph-search.test.ts +1 -0
- package/src/memory/graph/inspect.ts +2 -2
- package/src/memory/graph/retriever.ts +10 -3
- package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/149-oauth-tables.ts +1 -0
- package/src/memory/migrations/223-schedule-script-column.ts +11 -0
- package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
- package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/pkb/pkb-index.test.ts +1 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +1 -0
- package/src/memory/pkb/pkb-search.test.ts +65 -4
- package/src/memory/pkb/pkb-search.ts +40 -18
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +25 -0
- package/src/memory/schema/infrastructure.ts +1 -0
- package/src/memory/schema/oauth.ts +4 -1
- package/src/messaging/providers/slack/render-transcript.test.ts +77 -29
- package/src/messaging/providers/slack/render-transcript.ts +58 -0
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/signal.ts +1 -2
- package/src/oauth/AGENTS.md +1 -1
- package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
- package/src/oauth/connect-orchestrator.ts +8 -34
- package/src/oauth/connect-types.ts +6 -10
- package/src/oauth/manual-token-connection.ts +23 -0
- package/src/oauth/oauth-store.ts +30 -14
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -108
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/permissions/approval-policy.test.ts +293 -18
- package/src/permissions/approval-policy.ts +110 -58
- package/src/permissions/arg-parser.test.ts +161 -0
- package/src/permissions/arg-parser.ts +141 -0
- package/src/permissions/bash-risk-classifier.test.ts +414 -2
- package/src/permissions/bash-risk-classifier.ts +303 -60
- package/src/permissions/checker.ts +157 -29
- package/src/permissions/command-registry.test.ts +239 -0
- package/src/permissions/command-registry.ts +234 -54
- package/src/permissions/defaults.ts +5 -4
- package/src/permissions/gateway-threshold-reader.ts +196 -0
- package/src/permissions/prompter.ts +4 -0
- package/src/permissions/risk-types.ts +61 -4
- package/src/permissions/schedule-risk-classifier.test.ts +129 -0
- package/src/permissions/schedule-risk-classifier.ts +85 -0
- package/src/permissions/shell-identity.ts +2 -42
- package/src/permissions/types.ts +2 -0
- package/src/permissions/workspace-policy.ts +8 -3
- package/src/plugins/defaults/circuit-breaker.ts +146 -0
- package/src/plugins/defaults/compaction.ts +145 -0
- package/src/plugins/defaults/empty-response.ts +126 -0
- package/src/plugins/defaults/history-repair.ts +85 -0
- package/src/plugins/defaults/index.ts +116 -0
- package/src/plugins/defaults/injectors.ts +491 -0
- package/src/plugins/defaults/llm-call.ts +82 -0
- package/src/plugins/defaults/memory-retrieval.ts +226 -0
- package/src/plugins/defaults/overflow-reduce.ts +181 -0
- package/src/plugins/defaults/persistence.ts +129 -0
- package/src/plugins/defaults/title-generate.ts +95 -0
- package/src/plugins/defaults/token-estimate.ts +104 -0
- package/src/plugins/defaults/tool-error.ts +126 -0
- package/src/plugins/defaults/tool-execute.ts +89 -0
- package/src/plugins/defaults/tool-result-truncate.ts +88 -0
- package/src/plugins/pipeline.ts +316 -0
- package/src/plugins/plugin-skill-contributions.ts +292 -0
- package/src/plugins/registry.ts +241 -0
- package/src/plugins/types.ts +1134 -0
- package/src/plugins/user-loader.ts +177 -0
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- package/src/providers/model-catalog.ts +52 -29
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openrouter/client.ts +5 -1
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +72 -4
- package/src/providers/speech-to-text/xai-realtime.ts +39 -14
- package/src/runtime/AGENTS.md +25 -16
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +3 -3
- package/src/runtime/__tests__/client-registry.test.ts +293 -0
- package/src/runtime/client-registry.ts +261 -0
- package/src/runtime/http-server.ts +77 -8
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +1 -22
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +51 -31
- package/src/runtime/routes/approval-routes.ts +17 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +27 -8
- package/src/runtime/routes/conversation-routes.ts +223 -116
- package/src/runtime/routes/inbound-message-handler.ts +88 -13
- package/src/runtime/routes/memory-item-routes.test.ts +1 -0
- package/src/runtime/routes/migration-routes.ts +0 -3
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +284 -0
- package/src/runtime/routes/playground/__tests__/guard.test.ts +80 -0
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +294 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +271 -0
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +202 -0
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +309 -0
- package/src/runtime/routes/playground/__tests__/state.test.ts +224 -0
- package/src/runtime/routes/playground/conversation-not-found.ts +29 -0
- package/src/runtime/routes/playground/deps.ts +56 -0
- package/src/runtime/routes/playground/force-compact.ts +73 -0
- package/src/runtime/routes/playground/guard.ts +37 -0
- package/src/runtime/routes/playground/index.ts +28 -0
- package/src/runtime/routes/playground/inject-failures.ts +159 -0
- package/src/runtime/routes/playground/reset-circuit.ts +115 -0
- package/src/runtime/routes/playground/seed-conversation.ts +139 -0
- package/src/runtime/routes/playground/seeded-conversations.ts +78 -0
- package/src/runtime/routes/playground/state.ts +78 -0
- package/src/runtime/routes/schedule-routes.ts +89 -8
- package/src/runtime/skill-route-registry.ts +75 -15
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +7 -1
- package/src/schedule/scheduler.ts +48 -8
- package/src/skills/catalog-cache.ts +12 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +189 -0
- package/src/tools/browser/browser-execution.ts +88 -19
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
- package/src/tools/browser/cdp-client/factory.ts +15 -4
- package/src/tools/executor.ts +126 -74
- package/src/tools/network/script-proxy/session-manager.ts +37 -1
- package/src/tools/permission-checker.ts +98 -49
- package/src/tools/policy-context.ts +4 -0
- package/src/tools/registry.ts +140 -3
- package/src/tools/schedule/create.ts +23 -8
- package/src/tools/schedule/update.ts +3 -1
- package/src/tools/secret-detection-handler.ts +0 -51
- package/src/tools/system/avatar-generator.ts +6 -2
- package/src/tools/types.ts +28 -2
- package/src/util/platform.ts +7 -2
- package/src/util/pricing.ts +26 -3
- package/src/workspace/migrations/006-services-config.ts +2 -4
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +3 -4
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +108 -0
- package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
- package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
- package/src/workspace/migrations/registry.ts +12 -0
- package/tsconfig.json +1 -1
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -66
- package/src/__tests__/compaction-circuit-breaker.test.ts +0 -336
- package/src/__tests__/context-overflow-approval.test.ts +0 -156
- package/src/__tests__/hooks-blocking.test.ts +0 -178
- package/src/__tests__/hooks-cli.test.ts +0 -182
- package/src/__tests__/hooks-config.test.ts +0 -108
- package/src/__tests__/hooks-discovery.test.ts +0 -211
- package/src/__tests__/hooks-integration.test.ts +0 -196
- package/src/__tests__/hooks-manager.test.ts +0 -226
- package/src/__tests__/hooks-runner.test.ts +0 -175
- package/src/__tests__/hooks-settings.test.ts +0 -160
- package/src/__tests__/hooks-templates.test.ts +0 -169
- package/src/__tests__/hooks-ts-runner.test.ts +0 -170
- package/src/__tests__/hooks-watch.test.ts +0 -112
- package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
- package/src/__tests__/oauth-scope-policy.test.ts +0 -180
- package/src/__tests__/send-notification-tool.test.ts +0 -83
- package/src/cli/commands/shotgun.ts +0 -266
- package/src/config/bundled-skills/conversations/SKILL.md +0 -20
- package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -88
- package/src/config/bundled-skills/heartbeat/SKILL.md +0 -43
- package/src/config/bundled-skills/notifications/SKILL.md +0 -40
- package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
- package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
- package/src/config/bundled-skills/screen-watch/SKILL.md +0 -27
- package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
- package/src/config/bundled-skills/screen-watch/tools/start-screen-watch.ts +0 -12
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
- package/src/daemon/context-overflow-approval.ts +0 -52
- package/src/daemon/watch-handler.ts +0 -399
- package/src/hooks/cli.ts +0 -253
- package/src/hooks/config.ts +0 -100
- package/src/hooks/discovery.ts +0 -135
- package/src/hooks/manager.ts +0 -179
- package/src/hooks/runner.ts +0 -117
- package/src/hooks/templates.ts +0 -77
- package/src/hooks/types.ts +0 -75
- package/src/oauth/scope-policy.ts +0 -89
- package/src/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/signals/shotgun.ts +0 -203
- package/src/tools/watch/screen-watch.ts +0 -144
- package/src/tools/watch/watch-state.ts +0 -142
|
@@ -30,7 +30,7 @@ mock.module("../providers/registry.js", () => ({
|
|
|
30
30
|
mock.module("../config/loader.js", () => ({
|
|
31
31
|
getConfig: () => ({
|
|
32
32
|
ui: {},
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
llm: {
|
|
35
35
|
default: {
|
|
36
36
|
provider: "mock-provider",
|
|
@@ -206,6 +206,24 @@ mock.module("../config/skill-state.js", () => ({
|
|
|
206
206
|
})),
|
|
207
207
|
}));
|
|
208
208
|
|
|
209
|
+
// Avoid real workspace-git initialization on /tmp — on CI runners,
|
|
210
|
+
// `git add -A` under /tmp hits permission errors on systemd-private dirs,
|
|
211
|
+
// which blocks `runAgentLoopImpl` for long enough to trip the test's
|
|
212
|
+
// 5s timeout before `AgentLoop.run` is invoked.
|
|
213
|
+
mock.module("../workspace/git-service.js", () => ({
|
|
214
|
+
getWorkspaceGitService: () => ({
|
|
215
|
+
ensureInitialized: async () => {},
|
|
216
|
+
}),
|
|
217
|
+
}));
|
|
218
|
+
|
|
219
|
+
mock.module("../workspace/turn-commit.js", () => ({
|
|
220
|
+
commitTurnChanges: async () => {},
|
|
221
|
+
}));
|
|
222
|
+
|
|
223
|
+
mock.module("../memory/app-git-service.js", () => ({
|
|
224
|
+
commitAppTurnChanges: async () => {},
|
|
225
|
+
}));
|
|
226
|
+
|
|
209
227
|
// ---------------------------------------------------------------------------
|
|
210
228
|
// AgentLoop mock — tracks whether run() was called
|
|
211
229
|
// ---------------------------------------------------------------------------
|
|
@@ -218,6 +236,9 @@ mock.module("../agent/loop.js", () => ({
|
|
|
218
236
|
getToolTokenBudget() {
|
|
219
237
|
return 0;
|
|
220
238
|
}
|
|
239
|
+
getResolvedTools() {
|
|
240
|
+
return [];
|
|
241
|
+
}
|
|
221
242
|
getActiveModel() {
|
|
222
243
|
return undefined;
|
|
223
244
|
}
|
|
@@ -226,7 +247,9 @@ mock.module("../agent/loop.js", () => ({
|
|
|
226
247
|
onEvent: (event: AgentEvent) => void,
|
|
227
248
|
_signal?: AbortSignal,
|
|
228
249
|
_requestId?: string,
|
|
229
|
-
_onCheckpoint?: (
|
|
250
|
+
_onCheckpoint?: (
|
|
251
|
+
checkpoint: CheckpointInfo,
|
|
252
|
+
) => CheckpointDecision | Promise<CheckpointDecision>,
|
|
230
253
|
): Promise<Message[]> {
|
|
231
254
|
agentLoopRunCalled = true;
|
|
232
255
|
const assistantMsg: Message = {
|
|
@@ -211,6 +211,9 @@ mock.module("../agent/loop.js", () => ({
|
|
|
211
211
|
getToolTokenBudget() {
|
|
212
212
|
return 0;
|
|
213
213
|
}
|
|
214
|
+
getResolvedTools() {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
214
217
|
getActiveModel() {
|
|
215
218
|
return undefined;
|
|
216
219
|
}
|
|
@@ -219,7 +222,9 @@ mock.module("../agent/loop.js", () => ({
|
|
|
219
222
|
_onEvent: (event: AgentEvent) => void,
|
|
220
223
|
_signal?: AbortSignal,
|
|
221
224
|
_requestId?: string,
|
|
222
|
-
_onCheckpoint?: (
|
|
225
|
+
_onCheckpoint?: (
|
|
226
|
+
checkpoint: CheckpointInfo,
|
|
227
|
+
) => CheckpointDecision | Promise<CheckpointDecision>,
|
|
223
228
|
): Promise<Message[]> {
|
|
224
229
|
return [];
|
|
225
230
|
}
|
|
@@ -214,6 +214,122 @@ describe("conversation-title-service", () => {
|
|
|
214
214
|
);
|
|
215
215
|
});
|
|
216
216
|
|
|
217
|
+
test("rejects meta-failure outputs like 'Missing Context' and uses fallback", async () => {
|
|
218
|
+
mockRunBtwSidechain.mockImplementationOnce(async () => ({
|
|
219
|
+
text: "Missing Context",
|
|
220
|
+
hadTextDeltas: true,
|
|
221
|
+
response: {
|
|
222
|
+
content: [{ type: "text", text: "Missing Context" }],
|
|
223
|
+
model: "test-model",
|
|
224
|
+
usage: { inputTokens: 10, outputTokens: 5 },
|
|
225
|
+
stopReason: "end_turn",
|
|
226
|
+
},
|
|
227
|
+
}));
|
|
228
|
+
|
|
229
|
+
const provider = {
|
|
230
|
+
name: "test-provider",
|
|
231
|
+
sendMessage: mock(async () => {
|
|
232
|
+
throw new Error("should not call directly");
|
|
233
|
+
}),
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const result = await generateAndPersistConversationTitle({
|
|
237
|
+
conversationId: "conv-1",
|
|
238
|
+
provider,
|
|
239
|
+
userMessage: "so about that t-shirt...",
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
expect(result.title).toBe("Untitled Conversation");
|
|
243
|
+
expect(mockUpdateConversationTitle).toHaveBeenCalledWith(
|
|
244
|
+
"conv-1",
|
|
245
|
+
"Untitled Conversation",
|
|
246
|
+
1,
|
|
247
|
+
);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test.each([
|
|
251
|
+
"missing context",
|
|
252
|
+
"No Context",
|
|
253
|
+
"Insufficient Context",
|
|
254
|
+
"Unclear Request",
|
|
255
|
+
"No Topic",
|
|
256
|
+
"Empty Conversation",
|
|
257
|
+
])("rejects meta-failure variant: %s", async (bad) => {
|
|
258
|
+
mockRunBtwSidechain.mockImplementationOnce(async () => ({
|
|
259
|
+
text: bad,
|
|
260
|
+
hadTextDeltas: true,
|
|
261
|
+
response: {
|
|
262
|
+
content: [{ type: "text", text: bad }],
|
|
263
|
+
model: "test-model",
|
|
264
|
+
usage: { inputTokens: 10, outputTokens: 5 },
|
|
265
|
+
stopReason: "end_turn",
|
|
266
|
+
},
|
|
267
|
+
}));
|
|
268
|
+
|
|
269
|
+
const provider = {
|
|
270
|
+
name: "test-provider",
|
|
271
|
+
sendMessage: mock(async () => {
|
|
272
|
+
throw new Error("should not call directly");
|
|
273
|
+
}),
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
const result = await generateAndPersistConversationTitle({
|
|
277
|
+
conversationId: "conv-1",
|
|
278
|
+
provider,
|
|
279
|
+
userMessage: "something",
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
expect(result.title).toBe("Untitled Conversation");
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test("regeneration skips LLM call when recent messages have no extractable text", async () => {
|
|
286
|
+
mockGetMessages.mockReturnValueOnce([
|
|
287
|
+
{
|
|
288
|
+
role: "assistant",
|
|
289
|
+
content: JSON.stringify([
|
|
290
|
+
{ type: "tool_use", id: "toolu_1", name: "bash", input: {} },
|
|
291
|
+
]),
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
role: "user",
|
|
295
|
+
content: JSON.stringify([
|
|
296
|
+
{
|
|
297
|
+
type: "tool_result",
|
|
298
|
+
tool_use_id: "toolu_1",
|
|
299
|
+
content: [{ type: "image", source: {} }],
|
|
300
|
+
},
|
|
301
|
+
]),
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
role: "assistant",
|
|
305
|
+
content: JSON.stringify([
|
|
306
|
+
{ type: "tool_use", id: "toolu_2", name: "bash", input: {} },
|
|
307
|
+
]),
|
|
308
|
+
},
|
|
309
|
+
]);
|
|
310
|
+
|
|
311
|
+
mockGetConversation.mockReturnValueOnce({
|
|
312
|
+
title: "Existing Title",
|
|
313
|
+
isAutoTitle: 1,
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
const provider = {
|
|
317
|
+
name: "test-provider",
|
|
318
|
+
sendMessage: mock(async () => {
|
|
319
|
+
throw new Error("should not call directly");
|
|
320
|
+
}),
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
const result = await regenerateConversationTitle({
|
|
324
|
+
conversationId: "conv-1",
|
|
325
|
+
provider,
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
expect(mockRunBtwSidechain).not.toHaveBeenCalled();
|
|
329
|
+
expect(mockUpdateConversationTitle).not.toHaveBeenCalled();
|
|
330
|
+
expect(result).toEqual({ title: "Existing Title", updated: false });
|
|
331
|
+
});
|
|
332
|
+
|
|
217
333
|
test("title prompt content does not contain generation instructions", async () => {
|
|
218
334
|
const provider = {
|
|
219
335
|
name: "test-provider",
|
|
@@ -44,7 +44,9 @@ mock.module("../tools/browser/browser-screencast.js", () => ({
|
|
|
44
44
|
registerConversationSender: mock(() => {}),
|
|
45
45
|
}));
|
|
46
46
|
|
|
47
|
-
//
|
|
47
|
+
// Stub app-store functions used by other modules (e.g. app-source-watcher,
|
|
48
|
+
// conversation-surfaces) so tool-side-effects' hooks can run without touching
|
|
49
|
+
// the real app store during tests.
|
|
48
50
|
mock.module("../memory/app-store.js", () => ({
|
|
49
51
|
getApp: mock(() => null),
|
|
50
52
|
getAppDirPath: mock(() => "/tmp/test-apps/dummy"),
|
|
@@ -286,6 +288,44 @@ describe("session-tool-setup app refresh side effects", () => {
|
|
|
286
288
|
|
|
287
289
|
expect(broadcastSpy).not.toHaveBeenCalled();
|
|
288
290
|
});
|
|
291
|
+
|
|
292
|
+
test("fires notify side effects regardless of compile outcome reported in payload", async () => {
|
|
293
|
+
// The hook observes the tool result but does not branch on compile
|
|
294
|
+
// status fields inside it. Whether the executor reports a successful
|
|
295
|
+
// compile or returns compile_errors, the hook still refreshes
|
|
296
|
+
// surfaces and broadcasts — compile retries are the LLM's
|
|
297
|
+
// responsibility via a follow-up tool call, not the hook's.
|
|
298
|
+
const ctx = makeCtx();
|
|
299
|
+
const executor = makeFakeExecutor({
|
|
300
|
+
content: JSON.stringify({
|
|
301
|
+
id: "new-app-err",
|
|
302
|
+
name: "Busted",
|
|
303
|
+
compiled: false,
|
|
304
|
+
compile_errors: [{ text: "syntax error" }],
|
|
305
|
+
}),
|
|
306
|
+
isError: false,
|
|
307
|
+
});
|
|
308
|
+
const broadcastSpy = mock(() => {});
|
|
309
|
+
|
|
310
|
+
const toolFn = createToolExecutor(
|
|
311
|
+
executor as unknown as ToolExecutor,
|
|
312
|
+
noopPrompter,
|
|
313
|
+
noopSecretPrompter,
|
|
314
|
+
ctx,
|
|
315
|
+
noopLifecycleHandler,
|
|
316
|
+
broadcastSpy,
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
await toolFn("app_create", { name: "Busted", html: "" });
|
|
320
|
+
|
|
321
|
+
expect(refreshSpy).toHaveBeenCalledTimes(1);
|
|
322
|
+
expect(broadcastSpy.mock.calls.length).toBeGreaterThanOrEqual(1);
|
|
323
|
+
expect((broadcastSpy.mock.calls as unknown[][])[0][0]).toEqual({
|
|
324
|
+
type: "app_files_changed",
|
|
325
|
+
appId: "new-app-err",
|
|
326
|
+
});
|
|
327
|
+
expect(updatePublishedSpy).toHaveBeenCalledTimes(1);
|
|
328
|
+
});
|
|
289
329
|
});
|
|
290
330
|
|
|
291
331
|
// ── app_delete side effects ────────────────────────────────────────
|
|
@@ -435,5 +475,4 @@ describe("session-tool-setup app refresh side effects", () => {
|
|
|
435
475
|
expect(updatePublishedSpy).toHaveBeenCalledTimes(1);
|
|
436
476
|
});
|
|
437
477
|
});
|
|
438
|
-
|
|
439
478
|
});
|
|
@@ -105,7 +105,7 @@ describe("recordUsage", () => {
|
|
|
105
105
|
expect(events[0].estimatedCostUsd).toBe(
|
|
106
106
|
expectedPricing.estimatedCostUsd ?? null,
|
|
107
107
|
);
|
|
108
|
-
// Sanity: fast should be 6x standard ($30 * 6 = $180)
|
|
108
|
+
// Sanity: fast should be 6x standard (claude-opus-4-6 at $5/$25 → $30 * 6 = $180)
|
|
109
109
|
expect(expectedPricing.estimatedCostUsd).toBe(180);
|
|
110
110
|
});
|
|
111
111
|
|
|
@@ -24,7 +24,7 @@ mock.module("../providers/registry.js", () => ({
|
|
|
24
24
|
mock.module("../config/loader.js", () => ({
|
|
25
25
|
getConfig: () => ({
|
|
26
26
|
ui: {},
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
llm: {
|
|
29
29
|
default: {
|
|
30
30
|
provider: "mock-provider",
|
|
@@ -167,6 +167,9 @@ mock.module("../agent/loop.js", () => ({
|
|
|
167
167
|
getToolTokenBudget() {
|
|
168
168
|
return 0;
|
|
169
169
|
}
|
|
170
|
+
getResolvedTools() {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
170
173
|
getActiveModel() {
|
|
171
174
|
return undefined;
|
|
172
175
|
}
|
|
@@ -31,7 +31,7 @@ mock.module("../providers/registry.js", () => ({
|
|
|
31
31
|
mock.module("../config/loader.js", () => ({
|
|
32
32
|
getConfig: () => ({
|
|
33
33
|
ui: {},
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
llm: {
|
|
36
36
|
default: {
|
|
37
37
|
provider: "mock-provider",
|
|
@@ -211,6 +211,9 @@ mock.module("../agent/loop.js", () => ({
|
|
|
211
211
|
getToolTokenBudget() {
|
|
212
212
|
return 0;
|
|
213
213
|
}
|
|
214
|
+
getResolvedTools() {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
214
217
|
getActiveModel() {
|
|
215
218
|
return undefined;
|
|
216
219
|
}
|
|
@@ -50,6 +50,21 @@ mock.module("../oauth/oauth-store.js", () => ({
|
|
|
50
50
|
getProvider: (provider: string) =>
|
|
51
51
|
mockProviders.find((p) => p.provider === provider),
|
|
52
52
|
isProviderConnected: () => false,
|
|
53
|
+
// Needed by manual-token-connection.ts at import time — these aren't
|
|
54
|
+
// invoked in this test suite but must resolve so the module loads.
|
|
55
|
+
createConnection: () => {
|
|
56
|
+
throw new Error("createConnection not mocked");
|
|
57
|
+
},
|
|
58
|
+
deleteConnection: () => {
|
|
59
|
+
throw new Error("deleteConnection not mocked");
|
|
60
|
+
},
|
|
61
|
+
getConnectionByProvider: () => undefined,
|
|
62
|
+
updateConnection: () => {
|
|
63
|
+
throw new Error("updateConnection not mocked");
|
|
64
|
+
},
|
|
65
|
+
upsertApp: async () => {
|
|
66
|
+
throw new Error("upsertApp not mocked");
|
|
67
|
+
},
|
|
53
68
|
}));
|
|
54
69
|
|
|
55
70
|
mock.module("../util/logger.js", () => ({
|
|
@@ -63,11 +78,8 @@ mock.module("../util/logger.js", () => ({
|
|
|
63
78
|
|
|
64
79
|
// ── Import under test ────────────────────────────────────────────────
|
|
65
80
|
|
|
66
|
-
const {
|
|
67
|
-
|
|
68
|
-
checkCredentialForProvider,
|
|
69
|
-
_setFetchFn,
|
|
70
|
-
} = await import("../credential-health/credential-health-service.js");
|
|
81
|
+
const { checkAllCredentials, checkCredentialForProvider, _setFetchFn } =
|
|
82
|
+
await import("../credential-health/credential-health-service.js");
|
|
71
83
|
|
|
72
84
|
// Inject mock fetch via the test helper (Bun's global fetch can't be
|
|
73
85
|
// overridden via globalThis assignment).
|
|
@@ -125,10 +137,7 @@ function addConnection(
|
|
|
125
137
|
}
|
|
126
138
|
|
|
127
139
|
function setToken(connectionId: string, token = "mock-token") {
|
|
128
|
-
secureKeyValues.set(
|
|
129
|
-
`oauth_connection/${connectionId}/access_token`,
|
|
130
|
-
token,
|
|
131
|
-
);
|
|
140
|
+
secureKeyValues.set(`oauth_connection/${connectionId}/access_token`, token);
|
|
132
141
|
}
|
|
133
142
|
|
|
134
143
|
// ── Tests ────────────────────────────────────────────────────────────
|
|
@@ -322,6 +331,66 @@ describe("credential-health-service", () => {
|
|
|
322
331
|
expect(slack!.status).toBe("healthy");
|
|
323
332
|
});
|
|
324
333
|
|
|
334
|
+
describe("manual-token providers", () => {
|
|
335
|
+
// slack_channel and telegram store their primary access token at
|
|
336
|
+
// credential/<provider>/bot_token rather than at
|
|
337
|
+
// oauth_connection/<id>/access_token. The health check must resolve the
|
|
338
|
+
// provider-specific path via manualTokenAccessCredentialKey — otherwise
|
|
339
|
+
// every manual-token connection gets flagged as missing_token and ends
|
|
340
|
+
// up in the heartbeat <credential-status> block even when credentials
|
|
341
|
+
// are valid.
|
|
342
|
+
|
|
343
|
+
test("slack_channel is healthy when bot_token is present and ping succeeds", async () => {
|
|
344
|
+
addProvider("slack_channel", {
|
|
345
|
+
pingUrl: "https://slack.com/api/auth.test",
|
|
346
|
+
});
|
|
347
|
+
addConnection("slack_channel", "conn-slack", {
|
|
348
|
+
expiresAt: null,
|
|
349
|
+
hasRefreshToken: false,
|
|
350
|
+
grantedScopes: [],
|
|
351
|
+
});
|
|
352
|
+
secureKeyValues.set("credential/slack_channel/bot_token", "xoxb-valid");
|
|
353
|
+
|
|
354
|
+
const report = await checkAllCredentials();
|
|
355
|
+
expect(report.results).toHaveLength(1);
|
|
356
|
+
expect(report.results[0]!.status).toBe("healthy");
|
|
357
|
+
expect(report.unhealthy).toHaveLength(0);
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
test("slack_channel is missing_token when bot_token is absent, even if OAuth access-token path is populated", async () => {
|
|
361
|
+
addProvider("slack_channel", {
|
|
362
|
+
pingUrl: "https://slack.com/api/auth.test",
|
|
363
|
+
});
|
|
364
|
+
addConnection("slack_channel", "conn-slack", {
|
|
365
|
+
expiresAt: null,
|
|
366
|
+
hasRefreshToken: false,
|
|
367
|
+
grantedScopes: [],
|
|
368
|
+
});
|
|
369
|
+
// Write to the OAuth access-token path — this must be IGNORED for
|
|
370
|
+
// manual-token providers, otherwise the fix isn't routing correctly.
|
|
371
|
+
secureKeyValues.set(
|
|
372
|
+
"oauth_connection/conn-slack/access_token",
|
|
373
|
+
"should-be-ignored",
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
const report = await checkAllCredentials();
|
|
377
|
+
expect(report.results[0]!.status).toBe("missing_token");
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
test("telegram resolves to credential/telegram/bot_token", async () => {
|
|
381
|
+
addProvider("telegram");
|
|
382
|
+
addConnection("telegram", "conn-tg", {
|
|
383
|
+
expiresAt: null,
|
|
384
|
+
hasRefreshToken: false,
|
|
385
|
+
grantedScopes: [],
|
|
386
|
+
});
|
|
387
|
+
secureKeyValues.set("credential/telegram/bot_token", "telegram-token");
|
|
388
|
+
|
|
389
|
+
const report = await checkAllCredentials();
|
|
390
|
+
expect(report.results[0]!.status).toBe("healthy");
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
|
|
325
394
|
describe("checkCredentialForProvider", () => {
|
|
326
395
|
test("returns null when no connections exist", async () => {
|
|
327
396
|
const result = await checkCredentialForProvider("google");
|
|
@@ -206,8 +206,7 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
|
|
|
206
206
|
"config/bundled-skills/media-processing/tools/analyze-keyframes.ts", // keyframe analysis tool API key lookup
|
|
207
207
|
"providers/registry.ts", // provider registry API key lookup for initialization
|
|
208
208
|
"providers/provider-availability.ts", // provider availability API key check
|
|
209
|
-
"media/
|
|
210
|
-
"media/avatar-router.ts", // avatar generation API key lookup
|
|
209
|
+
"media/image-credentials.ts", // shared image-gen credential resolver (provider API key lookup)
|
|
211
210
|
"memory/embedding-backend.ts", // embedding backend API key lookup
|
|
212
211
|
"daemon/providers-setup.ts", // provider initialization API key lookup
|
|
213
212
|
"workspace/migrations/006-services-config.ts", // services config migration reads provider API keys
|
|
@@ -216,6 +215,7 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
|
|
|
216
215
|
"daemon/handlers/config-model.ts", // masked provider key display
|
|
217
216
|
"providers/speech-to-text/resolve.ts", // STT provider API key lookup
|
|
218
217
|
"daemon/lifecycle.ts", // CES client injection into secure-keys at startup
|
|
218
|
+
"daemon/external-plugins-bootstrap.ts", // reads credentials at plugin init (manifest.requiresCredential) via the CES-mediated getSecureKeyAsync path
|
|
219
219
|
"inbound/platform-callback-registration.ts", // managed credential lookup for platform base URL, assistant ID, and API key
|
|
220
220
|
"tts/providers/elevenlabs-provider.ts", // ElevenLabs TTS API key lookup
|
|
221
221
|
"tts/providers/deepgram-provider.ts", // Deepgram TTS API key lookup
|
|
@@ -43,6 +43,7 @@ describe("schedule_syntax column migration", () => {
|
|
|
43
43
|
status TEXT NOT NULL DEFAULT 'active',
|
|
44
44
|
quiet INTEGER NOT NULL DEFAULT 0,
|
|
45
45
|
reuse_conversation INTEGER NOT NULL DEFAULT 0,
|
|
46
|
+
script TEXT,
|
|
46
47
|
created_at INTEGER NOT NULL,
|
|
47
48
|
updated_at INTEGER NOT NULL
|
|
48
49
|
)
|