@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
|
@@ -121,6 +121,17 @@ export interface ToolSetupContext extends SurfaceConversationContext {
|
|
|
121
121
|
cesClient?: CesClient;
|
|
122
122
|
/** The interface ID of the connected client driving the current turn (e.g. "macos", "chrome-extension"). Propagated into ToolContext for browser backend selection. */
|
|
123
123
|
readonly transportInterface?: InterfaceId;
|
|
124
|
+
/**
|
|
125
|
+
* Registry-routed sender override for the host browser proxy. When set
|
|
126
|
+
* (non-undefined), indicates the browser proxy sender was replaced by a
|
|
127
|
+
* ChromeExtensionRegistry WebSocket sender — i.e., an extension connection
|
|
128
|
+
* was actively wired at turn-start. Propagated into ToolContext as
|
|
129
|
+
* `hostBrowserRegistryRouted` (boolean) so the CDP factory can distinguish
|
|
130
|
+
* SSE-backed proxies from extension-backed proxies.
|
|
131
|
+
*/
|
|
132
|
+
hostBrowserSenderOverride?: (
|
|
133
|
+
msg: import("./message-protocol.js").ServerMessage,
|
|
134
|
+
) => void;
|
|
124
135
|
/** Turn-scoped flag: true when any tool call in the current turn received explicit user approval via interactive prompt. Cleared at turn end. */
|
|
125
136
|
approvedViaPromptThisTurn?: boolean;
|
|
126
137
|
}
|
|
@@ -159,6 +170,7 @@ export function createToolExecutor(
|
|
|
159
170
|
input: Record<string, unknown>,
|
|
160
171
|
onOutput?: (chunk: string) => void,
|
|
161
172
|
toolUseId?: string,
|
|
173
|
+
turnContext?: import("../plugins/types.js").TurnContext,
|
|
162
174
|
) => Promise<ToolExecutionResult> {
|
|
163
175
|
// Register the conversation's sendToClient for browser screencast surface messages
|
|
164
176
|
registerConversationSender(ctx.conversationId, (msg) =>
|
|
@@ -170,6 +182,7 @@ export function createToolExecutor(
|
|
|
170
182
|
input: Record<string, unknown>,
|
|
171
183
|
onOutput?: (chunk: string) => void,
|
|
172
184
|
toolUseId?: string,
|
|
185
|
+
turnContext?: import("../plugins/types.js").TurnContext,
|
|
173
186
|
) => {
|
|
174
187
|
if (isDoordashCommand(name, input)) {
|
|
175
188
|
markDoordashStepInProgress(ctx, input);
|
|
@@ -229,6 +242,7 @@ export function createToolExecutor(
|
|
|
229
242
|
isPlatformHosted: getIsPlatform(),
|
|
230
243
|
cesClient: ctx.cesClient,
|
|
231
244
|
transportInterface: ctx.transportInterface,
|
|
245
|
+
hostBrowserRegistryRouted: !!ctx.hostBrowserSenderOverride,
|
|
232
246
|
onToolLifecycleEvent: handleToolLifecycleEvent,
|
|
233
247
|
sendToClient: (msg) => {
|
|
234
248
|
// Tool context's sendToClient uses a loose { type: string; [key: string]: unknown }
|
|
@@ -306,7 +320,12 @@ export function createToolExecutor(
|
|
|
306
320
|
};
|
|
307
321
|
}
|
|
308
322
|
|
|
309
|
-
const result = await executor.execute(
|
|
323
|
+
const result = await executor.execute(
|
|
324
|
+
toolName,
|
|
325
|
+
toolInput,
|
|
326
|
+
toolContext,
|
|
327
|
+
turnContext,
|
|
328
|
+
);
|
|
310
329
|
if (toolContext.approvedViaPrompt) {
|
|
311
330
|
ctx.approvedViaPromptThisTurn = true;
|
|
312
331
|
}
|
|
@@ -319,7 +338,12 @@ export function createToolExecutor(
|
|
|
319
338
|
return result;
|
|
320
339
|
}
|
|
321
340
|
|
|
322
|
-
const result = await executor.execute(
|
|
341
|
+
const result = await executor.execute(
|
|
342
|
+
name,
|
|
343
|
+
input,
|
|
344
|
+
toolContext,
|
|
345
|
+
turnContext,
|
|
346
|
+
);
|
|
323
347
|
if (toolContext.approvedViaPrompt) {
|
|
324
348
|
ctx.approvedViaPromptThisTurn = true;
|
|
325
349
|
}
|
|
@@ -364,10 +388,23 @@ export function createProxyApprovalCallback(
|
|
|
364
388
|
|
|
365
389
|
const input: Record<string, unknown> = {
|
|
366
390
|
url,
|
|
367
|
-
|
|
391
|
+
scheme,
|
|
368
392
|
};
|
|
393
|
+
if (request.method) {
|
|
394
|
+
input.method = request.method;
|
|
395
|
+
}
|
|
396
|
+
if (request.requestHeaders && Object.keys(request.requestHeaders).length) {
|
|
397
|
+
input.request_headers = request.requestHeaders;
|
|
398
|
+
}
|
|
399
|
+
input.reason =
|
|
400
|
+
decision.kind === "ask_missing_credential"
|
|
401
|
+
? "A known credential template matches this host, but no credential is bound to this session. Approving will forward the request as-is — the assistant won't inject a credential, but any caller-supplied auth headers will still be sent."
|
|
402
|
+
: "This host isn't covered by any known credential template. Approving will forward the request as-is, including any caller-supplied auth headers.";
|
|
369
403
|
if (decision.kind === "ask_missing_credential") {
|
|
370
|
-
input.
|
|
404
|
+
input.known_credential_patterns = decision.matchingPatterns;
|
|
405
|
+
}
|
|
406
|
+
if (!request.method) {
|
|
407
|
+
input.connection_detail_available = "no";
|
|
371
408
|
}
|
|
372
409
|
|
|
373
410
|
const riskLevel: string = "medium";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - conversation-lifecycle.ts — loadFromDb, abort, dispose
|
|
6
6
|
* - conversation-messaging.ts — enqueueMessage, persistUserMessage, redirectToSecurePrompt
|
|
7
7
|
* - conversation-agent-loop.ts — runAgentLoop, generateTitle
|
|
8
|
-
* - conversation-notifiers.ts —
|
|
8
|
+
* - conversation-notifiers.ts — call notifier registration
|
|
9
9
|
* - conversation-tool-setup.ts — tool definitions, executor, resolveTools callback
|
|
10
10
|
* - conversation-media-retry.ts — media trimming + raceWithTimeout
|
|
11
11
|
* - conversation-process.ts — drainQueue, processMessage
|
|
@@ -43,12 +43,9 @@ import {
|
|
|
43
43
|
ToolProfiler,
|
|
44
44
|
} from "../events/tool-profiling-listener.js";
|
|
45
45
|
import { registerToolTraceListener } from "../events/tool-trace-listener.js";
|
|
46
|
-
import { getHookManager } from "../hooks/manager.js";
|
|
47
|
-
import { enqueueAutoAnalysisOnCompaction } from "../memory/auto-analysis-enqueue.js";
|
|
48
46
|
import { resolveCanonicalGuardianRequest } from "../memory/canonical-guardian-store.js";
|
|
49
47
|
import {
|
|
50
48
|
getConversationOriginChannel,
|
|
51
|
-
updateConversationContextWindow,
|
|
52
49
|
updateConversationHostAccess,
|
|
53
50
|
} from "../memory/conversation-crud.js";
|
|
54
51
|
import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
|
|
@@ -76,6 +73,7 @@ import type { AbortReason } from "../util/abort-reasons.js";
|
|
|
76
73
|
import { getLogger } from "../util/logger.js";
|
|
77
74
|
import type { AssistantAttachmentDraft } from "./assistant-attachments.js";
|
|
78
75
|
import {
|
|
76
|
+
applyCompactionResult,
|
|
79
77
|
runAgentLoopImpl,
|
|
80
78
|
trackCompactionOutcome,
|
|
81
79
|
} from "./conversation-agent-loop.js";
|
|
@@ -365,6 +363,7 @@ export class Conversation {
|
|
|
365
363
|
toolName?: string,
|
|
366
364
|
toolUseId?: string,
|
|
367
365
|
) => void;
|
|
366
|
+
private cacheWarmAbort?: AbortController;
|
|
368
367
|
|
|
369
368
|
constructor(
|
|
370
369
|
conversationId: string,
|
|
@@ -430,7 +429,7 @@ export class Conversation {
|
|
|
430
429
|
broadcastToAllClients,
|
|
431
430
|
);
|
|
432
431
|
|
|
433
|
-
// Register
|
|
432
|
+
// Register call notifiers (reads ctx properties lazily)
|
|
434
433
|
registerConversationNotifiers(conversationId, this);
|
|
435
434
|
|
|
436
435
|
// Tool infrastructure
|
|
@@ -543,11 +542,6 @@ export class Conversation {
|
|
|
543
542
|
config: llmDefault.contextWindow,
|
|
544
543
|
toolTokenBudget: this.agentLoop.getToolTokenBudget(),
|
|
545
544
|
});
|
|
546
|
-
|
|
547
|
-
void getHookManager().trigger("conversation-start", {
|
|
548
|
-
conversationId: this.conversationId,
|
|
549
|
-
workingDir: this.workingDir,
|
|
550
|
-
});
|
|
551
545
|
}
|
|
552
546
|
|
|
553
547
|
// ── Onboarding context ───────────────────────────────────────────
|
|
@@ -560,6 +554,61 @@ export class Conversation {
|
|
|
560
554
|
return this.onboardingContext;
|
|
561
555
|
}
|
|
562
556
|
|
|
557
|
+
// ── Prompt Cache Warming ─────────────────────────────────────────
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Fire-and-forget LLM call with max_tokens=1 to populate the provider's
|
|
561
|
+
* prompt cache (system prompt + tools). Called after the canned first
|
|
562
|
+
* greeting so the user's next real message gets a cache hit.
|
|
563
|
+
*/
|
|
564
|
+
warmPromptCache(): void {
|
|
565
|
+
this.cacheWarmAbort?.abort();
|
|
566
|
+
const abort = new AbortController();
|
|
567
|
+
this.cacheWarmAbort = abort;
|
|
568
|
+
|
|
569
|
+
const systemPrompt = this.hasSystemPromptOverride
|
|
570
|
+
? this.systemPrompt
|
|
571
|
+
: (() => {
|
|
572
|
+
const persona = resolvePersonaContext(
|
|
573
|
+
this.currentTurnTrustContext,
|
|
574
|
+
this.currentTurnChannelCapabilities,
|
|
575
|
+
);
|
|
576
|
+
return buildSystemPrompt({
|
|
577
|
+
hasNoClient: this.hasNoClient,
|
|
578
|
+
userPersona: persona.userPersona,
|
|
579
|
+
channelPersona: persona.channelPersona,
|
|
580
|
+
userSlug: persona.userSlug,
|
|
581
|
+
onboardingContext: this.getOnboardingContext(),
|
|
582
|
+
});
|
|
583
|
+
})();
|
|
584
|
+
const tools = buildToolDefinitions();
|
|
585
|
+
const provider = this.provider;
|
|
586
|
+
|
|
587
|
+
const warmMessage: Message = {
|
|
588
|
+
role: "user",
|
|
589
|
+
content: [{ type: "text", text: "hi" }],
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
provider
|
|
593
|
+
.sendMessage([warmMessage], tools, systemPrompt, {
|
|
594
|
+
config: { max_tokens: 1, callSite: "mainAgent" },
|
|
595
|
+
signal: abort.signal,
|
|
596
|
+
})
|
|
597
|
+
.then(() => {
|
|
598
|
+
log.info("Prompt cache warmed successfully");
|
|
599
|
+
})
|
|
600
|
+
.catch((err) => {
|
|
601
|
+
if (!abort.signal.aborted) {
|
|
602
|
+
log.warn({ err }, "Prompt cache warming failed (non-fatal)");
|
|
603
|
+
}
|
|
604
|
+
})
|
|
605
|
+
.finally(() => {
|
|
606
|
+
if (this.cacheWarmAbort === abort) {
|
|
607
|
+
this.cacheWarmAbort = undefined;
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
|
|
563
612
|
// ── Lifecycle ────────────────────────────────────────────────────
|
|
564
613
|
|
|
565
614
|
async loadFromDb(): Promise<void> {
|
|
@@ -671,13 +720,16 @@ export class Conversation {
|
|
|
671
720
|
}
|
|
672
721
|
|
|
673
722
|
/**
|
|
674
|
-
* Restore host browser proxy availability only. Used
|
|
675
|
-
*
|
|
676
|
-
*
|
|
677
|
-
*
|
|
678
|
-
*
|
|
679
|
-
*
|
|
680
|
-
* registry
|
|
723
|
+
* Restore host browser proxy availability only. Used in two scenarios:
|
|
724
|
+
*
|
|
725
|
+
* 1. **Chrome-extension turns** — only support host_browser (not the full
|
|
726
|
+
* desktop proxy set), so calling restoreProxyAvailability() would
|
|
727
|
+
* incorrectly re-enable bash/file/CU proxies.
|
|
728
|
+
* 2. **macOS turns** — when called from queue-drain, the browser proxy
|
|
729
|
+
* sender needs to be either the registry-routed sender (when an
|
|
730
|
+
* extension connection is present) or the SSE hub sender (when no
|
|
731
|
+
* extension is connected). This helper resolves the correct sender
|
|
732
|
+
* via `hostBrowserSenderOverride ?? sendToClient`.
|
|
681
733
|
*
|
|
682
734
|
* Unlike `restoreProxyAvailability()`, this helper does NOT gate on
|
|
683
735
|
* `hasNoClient`. The chrome-extension interface is non-interactive (so
|
|
@@ -693,7 +745,9 @@ export class Conversation {
|
|
|
693
745
|
* WebSocket rather than the SSE hub: if the queue-drain path called this
|
|
694
746
|
* helper with `sendToClient`, the registry-routed sender established at
|
|
695
747
|
* turn-start would be clobbered by the SSE hub emitter and
|
|
696
|
-
* host_browser_request frames would stop reaching the extension.
|
|
748
|
+
* host_browser_request frames would stop reaching the extension. When
|
|
749
|
+
* no override is set (macOS without extension), `sendToClient` is used
|
|
750
|
+
* so frames reach the desktop client via SSE.
|
|
697
751
|
*
|
|
698
752
|
* Callers must only invoke this when they know the current interface
|
|
699
753
|
* supports host_browser (see `supportsHostProxy(id, "host_browser")`)
|
|
@@ -1249,24 +1303,14 @@ export class Conversation {
|
|
|
1249
1303
|
// is `undefined` on early-return paths (no eligible messages, disabled,
|
|
1250
1304
|
// etc.) — skip those so they don't silently reset the counter.
|
|
1251
1305
|
if (result.summaryFailed !== undefined) {
|
|
1252
|
-
trackCompactionOutcome(
|
|
1306
|
+
await trackCompactionOutcome(
|
|
1307
|
+
this,
|
|
1308
|
+
result.summaryFailed,
|
|
1309
|
+
this.sendToClient,
|
|
1310
|
+
);
|
|
1253
1311
|
}
|
|
1254
1312
|
if (result.compacted) {
|
|
1255
|
-
this
|
|
1256
|
-
this.contextCompactedMessageCount += result.compactedPersistedMessages;
|
|
1257
|
-
this.contextCompactedAt = Date.now();
|
|
1258
|
-
updateConversationContextWindow(
|
|
1259
|
-
this.conversationId,
|
|
1260
|
-
result.summaryText,
|
|
1261
|
-
this.contextCompactedMessageCount,
|
|
1262
|
-
);
|
|
1263
|
-
// Fire auto-analysis on compaction so the reflective agent can
|
|
1264
|
-
// crystallize anything worth remembering before the context window
|
|
1265
|
-
// narrows further.
|
|
1266
|
-
enqueueAutoAnalysisOnCompaction(
|
|
1267
|
-
this.conversationId,
|
|
1268
|
-
this.trustContext?.trustClass,
|
|
1269
|
-
);
|
|
1313
|
+
applyCompactionResult(this, result, this.sendToClient, null);
|
|
1270
1314
|
}
|
|
1271
1315
|
return result;
|
|
1272
1316
|
}
|
|
@@ -1416,7 +1460,6 @@ export class Conversation {
|
|
|
1416
1460
|
userMessageId: string,
|
|
1417
1461
|
onEvent: (msg: ServerMessage) => void,
|
|
1418
1462
|
options?: {
|
|
1419
|
-
skipPreMessageRollback?: boolean;
|
|
1420
1463
|
isInteractive?: boolean;
|
|
1421
1464
|
isUserMessage?: boolean;
|
|
1422
1465
|
titleText?: string;
|
|
@@ -1440,6 +1483,8 @@ export class Conversation {
|
|
|
1440
1483
|
options?: { isInteractive?: boolean; callSite?: LLMCallSite },
|
|
1441
1484
|
displayContent?: string,
|
|
1442
1485
|
): Promise<string> {
|
|
1486
|
+
this.cacheWarmAbort?.abort();
|
|
1487
|
+
this.cacheWarmAbort = undefined;
|
|
1443
1488
|
return processMessageImpl(
|
|
1444
1489
|
this as ProcessConversationContext,
|
|
1445
1490
|
content,
|