@vellumai/assistant 0.6.4 → 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/.prettierignore +5 -0
- package/AGENTS.md +9 -1
- package/ARCHITECTURE.md +43 -49
- package/Dockerfile +17 -3
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +33 -59
- package/docs/architecture/memory.md +25 -30
- package/docs/architecture/security.md +19 -18
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/error-handling.md +111 -0
- package/docs/plugins.md +761 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- 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/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/openapi.yaml +334 -78
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/app-compiler.test.ts +57 -0
- package/src/__tests__/approval-cascade.test.ts +36 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +1 -0
- package/src/__tests__/avatar-generator.test.ts +4 -2
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +96 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +870 -655
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- 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__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-model-image-provider.test.ts +110 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +440 -114
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-tools.test.ts +26 -0
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +883 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +32 -15
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +86 -46
- package/src/__tests__/conversation-agent-loop.test.ts +435 -216
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +36 -10
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +7 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +34 -12
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pairing.test.ts +174 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +32 -15
- package/src/__tests__/conversation-process-callsite.test.ts +309 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +44 -21
- package/src/__tests__/conversation-queue.test.ts +68 -38
- package/src/__tests__/conversation-routes-disk-view.test.ts +36 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2877 -152
- package/src/__tests__/conversation-runtime-workspace.test.ts +35 -50
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +39 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +53 -16
- package/src/__tests__/conversation-speed-override.test.ts +36 -12
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +118 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +4 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +33 -9
- package/src/__tests__/conversation-workspace-injection.test.ts +46 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +46 -15
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +5 -2
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/empty-response-pipeline.test.ts +305 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +29 -10
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/first-greeting.test.ts +247 -5
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- 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__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/injector-chain.test.ts +526 -0
- package/src/__tests__/intent-routing.test.ts +1 -66
- package/src/__tests__/llm-call-pipeline.test.ts +285 -0
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/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__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +621 -0
- package/src/__tests__/model-intents.test.ts +11 -83
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/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 +46 -78
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/onboarding-template-contract.test.ts +16 -64
- package/src/__tests__/openai-image-service.test.ts +368 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +676 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -25
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +377 -0
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- 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 +93 -14
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +69 -9
- package/src/__tests__/reaction-persistence.test.ts +561 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +0 -2
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/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__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-identity.test.ts +0 -134
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +259 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-memory-cleanup.test.ts +1 -0
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/task-scheduler.test.ts +3 -15
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-preload.ts +11 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -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 +2 -8
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
- package/src/__tests__/tool-executor.test.ts +201 -94
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -110
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/user-plugin-loader.test.ts +191 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-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-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +22 -16
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +545 -115
- package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
- package/src/approvals/guardian-request-resolvers.ts +80 -0
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/backup/__tests__/backup-worker.test.ts +2 -13
- package/src/backup/backup-worker.ts +3 -15
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/bundler/app-compiler.ts +84 -1
- package/src/calls/call-state.ts +2 -2
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/channels/__tests__/types.test.ts +3 -3
- package/src/channels/types.ts +6 -4
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/__tests__/notifications.test.ts +87 -211
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/backup.test.ts +1 -1
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +886 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +463 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +606 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/backup.ts +2 -2
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/clients.ts +138 -0
- package/src/cli/commands/completions.ts +2 -12
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +69 -8
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +299 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- 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/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/skills.ts +3 -4
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +39 -24
- package/src/cli.ts +0 -37
- 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/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- 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 +20 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +69 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- 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-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -190
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +42 -10
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +49 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/conversations.ts +16 -0
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +317 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +64 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +96 -7
- package/src/context/__tests__/compact-prompt.test.ts +63 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +26 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/tool-result-truncation.ts +3 -63
- package/src/context/window-manager.ts +417 -39
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/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/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -3
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +162 -34
- package/src/daemon/conversation-agent-loop.ts +1282 -599
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-history.ts +10 -19
- package/src/daemon/conversation-lifecycle.ts +59 -17
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-notifiers.ts +2 -110
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +1063 -211
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +51 -9
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +197 -64
- package/src/daemon/external-plugins-bootstrap.ts +478 -0
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/first-greeting.ts +191 -14
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +65 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +7 -3
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +109 -82
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +63 -0
- package/src/daemon/message-types/messages.ts +21 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +122 -12
- package/src/daemon/shutdown-handlers.ts +2 -12
- package/src/daemon/tool-side-effects.ts +14 -65
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +160 -0
- package/src/heartbeat/heartbeat-service.ts +99 -28
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +11 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +97 -4
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rewrite-command-preview.ts +66 -0
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +34 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +6 -3
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +63 -0
- package/src/ipc/routes/browser.ts +97 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/get-contact.ts +16 -0
- package/src/ipc/routes/index.ts +31 -1
- 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/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/upsert-contact.ts +25 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +76 -0
- 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/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +133 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-queries.ts +57 -4
- package/src/memory/conversation-title-service.ts +32 -4
- package/src/memory/db-init.ts +10 -0
- package/src/memory/embedding-backend.ts +1 -1
- 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/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +183 -53
- package/src/memory/graph/graph-search.test.ts +93 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/inspect.ts +2 -2
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +237 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/149-oauth-tables.ts +1 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/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 +5 -0
- package/src/memory/pkb/pkb-index.test.ts +369 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +252 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +499 -0
- package/src/memory/pkb/pkb-search.ts +159 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +147 -1
- package/src/memory/schema/infrastructure.ts +1 -0
- package/src/memory/schema/oauth.ts +4 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1421 -0
- package/src/messaging/providers/slack/render-transcript.ts +501 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/preference-extractor.ts +2 -6
- 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 +31 -14
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -106
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/permissions/approval-policy.test.ts +1223 -0
- package/src/permissions/approval-policy.ts +309 -0
- 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 +1620 -0
- package/src/permissions/bash-risk-classifier.ts +950 -0
- package/src/permissions/checker.ts +348 -711
- package/src/permissions/command-registry.test.ts +774 -0
- package/src/permissions/command-registry.ts +1005 -0
- package/src/permissions/defaults.ts +28 -79
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/gateway-threshold-reader.ts +196 -0
- package/src/permissions/prompter.ts +4 -0
- package/src/permissions/risk-types.ts +262 -0
- package/src/permissions/schedule-risk-classifier.test.ts +129 -0
- package/src/permissions/schedule-risk-classifier.ts +85 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/shell-identity.ts +2 -42
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +25 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +9 -19
- package/src/platform/client.ts +19 -1
- 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/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +524 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +80 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +646 -0
- package/src/providers/speech-to-text/xai-realtime.ts +821 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +27 -18
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- 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/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/client-registry.ts +261 -0
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +129 -9
- package/src/runtime/http-types.ts +23 -3
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-builder.ts +1 -22
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +78 -0
- package/src/runtime/routes/approval-routes.ts +29 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/browser-extension-pair-routes.ts +27 -8
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +351 -138
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +987 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/memory-item-routes.test.ts +1 -0
- package/src/runtime/routes/migration-routes.ts +720 -127
- 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/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +97 -15
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +7 -1
- package/src/schedule/scheduler.ts +56 -8
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +35 -9
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +234 -2
- package/src/tools/browser/browser-execution.ts +150 -54
- 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/cdp-inspect/discovery.ts +22 -0
- 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/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +129 -73
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/script-proxy/session-manager.ts +37 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +116 -46
- package/src/tools/policy-context.ts +29 -8
- package/src/tools/registry.ts +195 -6
- 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/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/system/avatar-generator.ts +6 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +40 -5
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +9 -4
- package/src/util/pricing.ts +41 -8
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/006-services-config.ts +2 -4
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +56 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/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/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +28 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- 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__/context-overflow-approval.test.ts +0 -156
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/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__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/send-notification-tool.test.ts +0 -83
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/cli/commands/shotgun.ts +0 -266
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/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 -66
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/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/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/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/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/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/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/shared/provider-env-vars.ts +0 -19
- 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
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
import { execSync } from "node:child_process";
|
|
2
|
-
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
3
|
-
|
|
4
|
-
import type { Command } from "commander";
|
|
5
|
-
|
|
6
|
-
import { getRuntimeHttpPort } from "../../config/env.js";
|
|
7
|
-
import { loadRawConfig } from "../../config/loader.js";
|
|
8
|
-
import { shouldAutoStartDaemon } from "../../daemon/connection-policy.js";
|
|
9
|
-
import { isHttpHealthy } from "../../daemon/daemon-control.js";
|
|
10
|
-
import {
|
|
11
|
-
getDataDir,
|
|
12
|
-
getDbPath,
|
|
13
|
-
getLogPath,
|
|
14
|
-
getProtectedDir,
|
|
15
|
-
getWorkspaceDir,
|
|
16
|
-
getWorkspaceHooksDir,
|
|
17
|
-
getWorkspaceSkillsDir,
|
|
18
|
-
} from "../../util/platform.js";
|
|
19
|
-
import { getProviderKeyViaDaemon } from "../lib/daemon-credential-client.js";
|
|
20
|
-
import { log } from "../logger.js";
|
|
21
|
-
|
|
22
|
-
export function registerDoctorCommand(program: Command): void {
|
|
23
|
-
program
|
|
24
|
-
.command("doctor")
|
|
25
|
-
.description("Run diagnostic checks")
|
|
26
|
-
.addHelpText(
|
|
27
|
-
"after",
|
|
28
|
-
`
|
|
29
|
-
Runs a series of diagnostic checks against the local assistant environment
|
|
30
|
-
and prints pass/fail results. Use this to verify that the assistant is
|
|
31
|
-
correctly installed and configured before starting a session.
|
|
32
|
-
|
|
33
|
-
Output symbols:
|
|
34
|
-
✓ Check passed
|
|
35
|
-
✗ Check failed (detail message follows the label)
|
|
36
|
-
|
|
37
|
-
Diagnostic checks performed:
|
|
38
|
-
1. Bun is installed Verifies bun is available in PATH
|
|
39
|
-
2. API key configured Checks for a valid provider API key in secure storage
|
|
40
|
-
3. Assistant reachable HTTP health check against the assistant server
|
|
41
|
-
4. Database exists/readable Opens the SQLite database and runs a test query
|
|
42
|
-
5. Directory structure Verifies required workspace directories exist
|
|
43
|
-
6. Disk space Ensures at least 100MB free on the data partition
|
|
44
|
-
7. Log file size Warns if the log file exceeds 50MB
|
|
45
|
-
8. Database integrity Runs SQLite PRAGMA integrity_check
|
|
46
|
-
9. Trust rule syntax Validates trust.json structure and rule fields
|
|
47
|
-
10. WASM files Checks that tree-sitter WASM binaries are present
|
|
48
|
-
11. Browser runtime Verifies Playwright and Chromium availability
|
|
49
|
-
12. Sandbox diagnostics Reports sandbox backend status and configuration
|
|
50
|
-
|
|
51
|
-
Examples:
|
|
52
|
-
$ assistant doctor`,
|
|
53
|
-
)
|
|
54
|
-
.action(async () => {
|
|
55
|
-
const pass = (label: string) => log.info(` \u2713 ${label}`);
|
|
56
|
-
const fail = (label: string, detail?: string) =>
|
|
57
|
-
log.info(` \u2717 ${label}${detail ? ` — ${detail}` : ""}`);
|
|
58
|
-
|
|
59
|
-
log.info("Vellum Doctor\n");
|
|
60
|
-
|
|
61
|
-
// 0. Connection policy info
|
|
62
|
-
const httpUrl = `http://127.0.0.1:${getRuntimeHttpPort()}`;
|
|
63
|
-
const autostart = shouldAutoStartDaemon();
|
|
64
|
-
log.info(` HTTP: ${httpUrl}`);
|
|
65
|
-
log.info(` Autostart: ${autostart ? "enabled" : "disabled"}\n`);
|
|
66
|
-
|
|
67
|
-
// 1. Bun installed
|
|
68
|
-
try {
|
|
69
|
-
execSync("bun --version", { stdio: "pipe" });
|
|
70
|
-
pass("Bun is installed");
|
|
71
|
-
} catch {
|
|
72
|
-
fail("Bun is installed", "bun not found in PATH");
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// 2. Provider/API key configured
|
|
76
|
-
const raw = loadRawConfig();
|
|
77
|
-
const rawServices = raw.services as
|
|
78
|
-
| Record<string, Record<string, unknown>>
|
|
79
|
-
| undefined;
|
|
80
|
-
const rawInferenceProvider = rawServices?.inference?.provider;
|
|
81
|
-
const provider =
|
|
82
|
-
typeof rawInferenceProvider === "string"
|
|
83
|
-
? rawInferenceProvider
|
|
84
|
-
: "anthropic";
|
|
85
|
-
const configKey = await getProviderKeyViaDaemon(provider);
|
|
86
|
-
|
|
87
|
-
if (provider === "ollama") {
|
|
88
|
-
pass("Provider configured (Ollama; API key optional)");
|
|
89
|
-
} else if (configKey) {
|
|
90
|
-
pass("API key configured");
|
|
91
|
-
} else {
|
|
92
|
-
fail("API key configured", `run: assistant keys set ${provider} <key>`);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// 3. Daemon reachable (HTTP health check)
|
|
96
|
-
try {
|
|
97
|
-
const healthy = await isHttpHealthy();
|
|
98
|
-
if (healthy) {
|
|
99
|
-
pass("Assistant reachable");
|
|
100
|
-
} else {
|
|
101
|
-
fail(
|
|
102
|
-
"Assistant reachable",
|
|
103
|
-
"HTTP health check failed (is the assistant running?)",
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
} catch {
|
|
107
|
-
fail(
|
|
108
|
-
"Assistant reachable",
|
|
109
|
-
"could not connect to assistant HTTP server",
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// 4. DB exists and readable
|
|
114
|
-
const dbPath = getDbPath();
|
|
115
|
-
if (existsSync(dbPath)) {
|
|
116
|
-
try {
|
|
117
|
-
const { Database } = await import("bun:sqlite");
|
|
118
|
-
const db = new Database(dbPath, { readonly: true });
|
|
119
|
-
db.query("SELECT 1").get();
|
|
120
|
-
db.close();
|
|
121
|
-
pass("Database exists and readable");
|
|
122
|
-
} catch {
|
|
123
|
-
fail(
|
|
124
|
-
"Database exists and readable",
|
|
125
|
-
"file exists but cannot be read",
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
} else {
|
|
129
|
-
fail("Database exists and readable", `not found at ${dbPath}`);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// 5. Workspace directory structure
|
|
133
|
-
const protectedDir = getProtectedDir();
|
|
134
|
-
const dataDir = getDataDir();
|
|
135
|
-
const workspaceDir = getWorkspaceDir();
|
|
136
|
-
const requiredDirs = [
|
|
137
|
-
workspaceDir,
|
|
138
|
-
dataDir,
|
|
139
|
-
`${dataDir}/db`,
|
|
140
|
-
`${dataDir}/logs`,
|
|
141
|
-
getWorkspaceSkillsDir(),
|
|
142
|
-
getWorkspaceHooksDir(),
|
|
143
|
-
protectedDir,
|
|
144
|
-
];
|
|
145
|
-
const missing = requiredDirs.filter((d) => !existsSync(d));
|
|
146
|
-
if (missing.length === 0) {
|
|
147
|
-
pass("Directory structure exists");
|
|
148
|
-
} else {
|
|
149
|
-
fail("Directory structure exists", `missing: ${missing.join(", ")}`);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// 6. Disk space
|
|
153
|
-
try {
|
|
154
|
-
const output = execSync(`df -k "${workspaceDir}"`, {
|
|
155
|
-
stdio: "pipe",
|
|
156
|
-
encoding: "utf-8",
|
|
157
|
-
});
|
|
158
|
-
const lines = output.trim().split("\n");
|
|
159
|
-
if (lines.length >= 2) {
|
|
160
|
-
const cols = lines[1].trim().split(/\s+/);
|
|
161
|
-
const availKB = parseInt(cols[3], 10);
|
|
162
|
-
if (isNaN(availKB)) {
|
|
163
|
-
fail("Disk space", "could not parse available space");
|
|
164
|
-
} else if (availKB < 100 * 1024) {
|
|
165
|
-
fail(
|
|
166
|
-
"Disk space",
|
|
167
|
-
`only ${Math.round(availKB / 1024)}MB free (< 100MB)`,
|
|
168
|
-
);
|
|
169
|
-
} else {
|
|
170
|
-
pass(`Disk space (${Math.round(availKB / 1024)}MB free)`);
|
|
171
|
-
}
|
|
172
|
-
} else {
|
|
173
|
-
fail("Disk space", "unexpected df output");
|
|
174
|
-
}
|
|
175
|
-
} catch {
|
|
176
|
-
fail("Disk space", "could not check disk space");
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// 7. Log file size
|
|
180
|
-
const logPath = getLogPath();
|
|
181
|
-
if (existsSync(logPath)) {
|
|
182
|
-
try {
|
|
183
|
-
const logStat = statSync(logPath);
|
|
184
|
-
const logSizeMB = logStat.size / (1024 * 1024);
|
|
185
|
-
if (logSizeMB > 50) {
|
|
186
|
-
fail("Log file size", `${logSizeMB.toFixed(1)}MB (> 50MB)`);
|
|
187
|
-
} else {
|
|
188
|
-
pass(`Log file size (${logSizeMB.toFixed(1)}MB)`);
|
|
189
|
-
}
|
|
190
|
-
} catch {
|
|
191
|
-
fail("Log file size", "could not stat log file");
|
|
192
|
-
}
|
|
193
|
-
} else {
|
|
194
|
-
pass("Log file size (no log file yet)");
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// 8. DB integrity check
|
|
198
|
-
if (existsSync(dbPath)) {
|
|
199
|
-
try {
|
|
200
|
-
const { Database } = await import("bun:sqlite");
|
|
201
|
-
const db = new Database(dbPath, { readonly: true });
|
|
202
|
-
const result = db.query("PRAGMA integrity_check").get() as {
|
|
203
|
-
integrity_check: string;
|
|
204
|
-
} | null;
|
|
205
|
-
db.close();
|
|
206
|
-
if (result?.integrity_check === "ok") {
|
|
207
|
-
pass("Database integrity check");
|
|
208
|
-
} else {
|
|
209
|
-
fail(
|
|
210
|
-
"Database integrity check",
|
|
211
|
-
result?.integrity_check ?? "unknown result",
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
} catch (err) {
|
|
215
|
-
fail(
|
|
216
|
-
"Database integrity check",
|
|
217
|
-
err instanceof Error ? err.message : "unknown error",
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
} else {
|
|
221
|
-
fail("Database integrity check", "database file not found");
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// 9. Trust rule syntax
|
|
225
|
-
const trustPath = `${protectedDir}/trust.json`;
|
|
226
|
-
if (existsSync(trustPath)) {
|
|
227
|
-
try {
|
|
228
|
-
const rawTrust = readFileSync(trustPath, "utf-8");
|
|
229
|
-
const data = JSON.parse(rawTrust);
|
|
230
|
-
if (typeof data !== "object" || data == null) {
|
|
231
|
-
fail("Trust rule syntax", "trust.json is not a JSON object");
|
|
232
|
-
} else if (typeof data.version !== "number") {
|
|
233
|
-
fail("Trust rule syntax", 'missing or invalid "version" field');
|
|
234
|
-
} else if (!Array.isArray(data.rules)) {
|
|
235
|
-
fail("Trust rule syntax", 'missing or invalid "rules" array');
|
|
236
|
-
} else {
|
|
237
|
-
const invalid = data.rules.filter(
|
|
238
|
-
(r: unknown) =>
|
|
239
|
-
typeof r !== "object" ||
|
|
240
|
-
r == null ||
|
|
241
|
-
typeof (r as Record<string, unknown>).tool !== "string" ||
|
|
242
|
-
typeof (r as Record<string, unknown>).pattern !== "string" ||
|
|
243
|
-
typeof (r as Record<string, unknown>).scope !== "string",
|
|
244
|
-
);
|
|
245
|
-
if (invalid.length > 0) {
|
|
246
|
-
fail(
|
|
247
|
-
"Trust rule syntax",
|
|
248
|
-
`${invalid.length} rule(s) have invalid structure`,
|
|
249
|
-
);
|
|
250
|
-
} else {
|
|
251
|
-
pass(`Trust rule syntax (${data.rules.length} rule(s))`);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
} catch (err) {
|
|
255
|
-
fail(
|
|
256
|
-
"Trust rule syntax",
|
|
257
|
-
err instanceof Error ? err.message : "could not parse",
|
|
258
|
-
);
|
|
259
|
-
}
|
|
260
|
-
} else {
|
|
261
|
-
pass("Trust rule syntax (no trust.json yet)");
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// 10. WASM files
|
|
265
|
-
const wasmFiles = [
|
|
266
|
-
{ pkg: "web-tree-sitter", file: "web-tree-sitter.wasm" },
|
|
267
|
-
{ pkg: "tree-sitter-bash", file: "tree-sitter-bash.wasm" },
|
|
268
|
-
];
|
|
269
|
-
let wasmOk = true;
|
|
270
|
-
const missingWasm: string[] = [];
|
|
271
|
-
for (const wasm of wasmFiles) {
|
|
272
|
-
const dir = import.meta.dirname ?? __dirname;
|
|
273
|
-
let fullPath = `${dir}/../../../node_modules/${wasm.pkg}/${wasm.file}`;
|
|
274
|
-
// In compiled binaries, fall back to Resources/ or next to the binary
|
|
275
|
-
if (!existsSync(fullPath) && dir.startsWith("/$bunfs/")) {
|
|
276
|
-
const { dirname: pathDirname, join: pathJoin } =
|
|
277
|
-
await import("node:path");
|
|
278
|
-
const execDir = pathDirname(process.execPath);
|
|
279
|
-
const resourcesPath = pathJoin(execDir, "..", "Resources", wasm.file);
|
|
280
|
-
fullPath = existsSync(resourcesPath)
|
|
281
|
-
? resourcesPath
|
|
282
|
-
: pathJoin(execDir, wasm.file);
|
|
283
|
-
}
|
|
284
|
-
if (!existsSync(fullPath)) {
|
|
285
|
-
missingWasm.push(wasm.file);
|
|
286
|
-
wasmOk = false;
|
|
287
|
-
} else {
|
|
288
|
-
try {
|
|
289
|
-
const wasmStat = statSync(fullPath);
|
|
290
|
-
if (wasmStat.size === 0) {
|
|
291
|
-
missingWasm.push(`${wasm.file} (empty)`);
|
|
292
|
-
wasmOk = false;
|
|
293
|
-
}
|
|
294
|
-
} catch {
|
|
295
|
-
missingWasm.push(`${wasm.file} (unreadable)`);
|
|
296
|
-
wasmOk = false;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
if (wasmOk) {
|
|
301
|
-
pass("WASM files present and non-empty");
|
|
302
|
-
} else {
|
|
303
|
-
fail("WASM files", missingWasm.join(", "));
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// 11. Browser runtime (Playwright + Chromium)
|
|
307
|
-
const { checkBrowserRuntime } =
|
|
308
|
-
await import("../../tools/browser/runtime-check.js");
|
|
309
|
-
const browserStatus = await checkBrowserRuntime();
|
|
310
|
-
if (
|
|
311
|
-
browserStatus.playwrightAvailable &&
|
|
312
|
-
browserStatus.chromiumInstalled
|
|
313
|
-
) {
|
|
314
|
-
pass("Browser runtime (Playwright + Chromium)");
|
|
315
|
-
} else if (!browserStatus.playwrightAvailable) {
|
|
316
|
-
fail("Browser runtime", "playwright not available");
|
|
317
|
-
} else {
|
|
318
|
-
fail(
|
|
319
|
-
"Browser runtime",
|
|
320
|
-
browserStatus.error ?? "Chromium not installed",
|
|
321
|
-
);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// 12. Sandbox backend diagnostics
|
|
325
|
-
const { runSandboxDiagnostics } =
|
|
326
|
-
await import("../../tools/terminal/sandbox-diagnostics.js");
|
|
327
|
-
const sandbox = runSandboxDiagnostics();
|
|
328
|
-
log.info(
|
|
329
|
-
`\n Sandbox: ${sandbox.config.enabled ? "enabled" : "disabled"}`,
|
|
330
|
-
);
|
|
331
|
-
log.info(` Reason: ${sandbox.activeBackendReason}`);
|
|
332
|
-
log.info("");
|
|
333
|
-
for (const check of sandbox.checks) {
|
|
334
|
-
if (check.ok) {
|
|
335
|
-
pass(check.label);
|
|
336
|
-
} else {
|
|
337
|
-
fail(check.label, check.detail);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
}
|
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
existsSync,
|
|
4
|
-
mkdirSync,
|
|
5
|
-
readFileSync,
|
|
6
|
-
unlinkSync,
|
|
7
|
-
writeFileSync,
|
|
8
|
-
} from "node:fs";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
|
|
11
|
-
import type { Command } from "commander";
|
|
12
|
-
|
|
13
|
-
import { getSignalsDir } from "../../util/platform.js";
|
|
14
|
-
import { log } from "../logger.js";
|
|
15
|
-
|
|
16
|
-
const POLL_INTERVAL_MS = 100;
|
|
17
|
-
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
18
|
-
|
|
19
|
-
interface ShotgunResult {
|
|
20
|
-
requestId: string;
|
|
21
|
-
ok: boolean;
|
|
22
|
-
error?: string;
|
|
23
|
-
watchId?: string;
|
|
24
|
-
conversationId?: string;
|
|
25
|
-
status?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function writeShotgunSignal(
|
|
29
|
-
requestId: string,
|
|
30
|
-
payload: Record<string, unknown>,
|
|
31
|
-
): { signalPath: string; resultPath: string } | null {
|
|
32
|
-
const signalsDir = getSignalsDir();
|
|
33
|
-
try {
|
|
34
|
-
mkdirSync(signalsDir, { recursive: true });
|
|
35
|
-
} catch {
|
|
36
|
-
log.error("Failed to create signals directory.");
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const signalPath = join(signalsDir, `shotgun.${requestId}`);
|
|
41
|
-
const resultPath = join(signalsDir, `shotgun.${requestId}.result`);
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
writeFileSync(signalPath, JSON.stringify({ requestId, ...payload }));
|
|
45
|
-
} catch {
|
|
46
|
-
log.error("Failed to write shotgun signal file.");
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return { signalPath, resultPath };
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function pollForResult(
|
|
54
|
-
requestId: string,
|
|
55
|
-
resultPath: string,
|
|
56
|
-
signalPath: string,
|
|
57
|
-
timeoutMs: number,
|
|
58
|
-
callback: (result: ShotgunResult) => void,
|
|
59
|
-
): void {
|
|
60
|
-
const deadline = Date.now() + timeoutMs + 5_000;
|
|
61
|
-
|
|
62
|
-
const poll = setInterval(() => {
|
|
63
|
-
if (Date.now() > deadline) {
|
|
64
|
-
clearInterval(poll);
|
|
65
|
-
cleanup(signalPath, resultPath);
|
|
66
|
-
log.error("Timed out waiting for response. Is the assistant running?");
|
|
67
|
-
process.exitCode = 1;
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (!existsSync(resultPath)) return;
|
|
72
|
-
|
|
73
|
-
let result: ShotgunResult;
|
|
74
|
-
try {
|
|
75
|
-
const content = readFileSync(resultPath, "utf-8");
|
|
76
|
-
result = JSON.parse(content) as ShotgunResult;
|
|
77
|
-
} catch {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (result.requestId !== requestId) return;
|
|
82
|
-
|
|
83
|
-
clearInterval(poll);
|
|
84
|
-
cleanup(signalPath, resultPath);
|
|
85
|
-
callback(result);
|
|
86
|
-
}, POLL_INTERVAL_MS);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function cleanup(...paths: string[]): void {
|
|
90
|
-
for (const p of paths) {
|
|
91
|
-
try {
|
|
92
|
-
unlinkSync(p);
|
|
93
|
-
} catch {
|
|
94
|
-
// Best-effort cleanup.
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export function registerShotgunCommand(program: Command): void {
|
|
100
|
-
const shotgun = program
|
|
101
|
-
.command("shotgun")
|
|
102
|
-
.description("Start and monitor screen-watch (shotgun) sessions via IPC");
|
|
103
|
-
|
|
104
|
-
shotgun.addHelpText(
|
|
105
|
-
"after",
|
|
106
|
-
`
|
|
107
|
-
Screen-watch sessions capture periodic screenshots and feed them to the
|
|
108
|
-
assistant for observation. The CLI communicates with the running assistant
|
|
109
|
-
via IPC signal files — the assistant must be running for these commands
|
|
110
|
-
to work.
|
|
111
|
-
|
|
112
|
-
Examples:
|
|
113
|
-
$ assistant shotgun start --duration 600 --focus "browsing workflow"
|
|
114
|
-
$ assistant shotgun status <watchId>`,
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
shotgun
|
|
118
|
-
.command("start")
|
|
119
|
-
.description("Start a new screen-watch session")
|
|
120
|
-
.option(
|
|
121
|
-
"-d, --duration <seconds>",
|
|
122
|
-
"Duration in seconds for the watch session",
|
|
123
|
-
"300",
|
|
124
|
-
)
|
|
125
|
-
.option("-i, --interval <seconds>", "Seconds between screen captures", "5")
|
|
126
|
-
.option(
|
|
127
|
-
"-f, --focus <area>",
|
|
128
|
-
"What to focus on observing",
|
|
129
|
-
"general observation",
|
|
130
|
-
)
|
|
131
|
-
.option(
|
|
132
|
-
"-t, --timeout <ms>",
|
|
133
|
-
"Timeout in milliseconds waiting for the assistant to respond",
|
|
134
|
-
String(DEFAULT_TIMEOUT_MS),
|
|
135
|
-
)
|
|
136
|
-
.addHelpText(
|
|
137
|
-
"after",
|
|
138
|
-
`
|
|
139
|
-
Starts a screen-watch session via IPC signal files. The assistant
|
|
140
|
-
creates a watch session and begins accepting screen observations from the
|
|
141
|
-
desktop client.
|
|
142
|
-
|
|
143
|
-
The CLI writes the request to signals/shotgun.<requestId> and polls
|
|
144
|
-
signals/shotgun.<requestId>.result for the response. The assistant must
|
|
145
|
-
be running for this to work.
|
|
146
|
-
|
|
147
|
-
Output (JSON): { ok, watchId, conversationId }
|
|
148
|
-
|
|
149
|
-
Examples:
|
|
150
|
-
$ assistant shotgun start
|
|
151
|
-
$ assistant shotgun start --duration 600 --interval 10 --focus "doordash.com"
|
|
152
|
-
$ assistant shotgun start -d 300 -i 5 -f "browsing workflow"`,
|
|
153
|
-
)
|
|
154
|
-
.action(
|
|
155
|
-
(opts: {
|
|
156
|
-
duration: string;
|
|
157
|
-
interval: string;
|
|
158
|
-
focus: string;
|
|
159
|
-
timeout: string;
|
|
160
|
-
}) => {
|
|
161
|
-
const durationSeconds = parseInt(opts.duration, 10);
|
|
162
|
-
if (!Number.isFinite(durationSeconds) || durationSeconds < 1) {
|
|
163
|
-
log.error("Invalid duration. Must be a positive integer.");
|
|
164
|
-
process.exitCode = 1;
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
const intervalSeconds = parseInt(opts.interval, 10);
|
|
169
|
-
if (!Number.isFinite(intervalSeconds) || intervalSeconds < 1) {
|
|
170
|
-
log.error("Invalid interval. Must be a positive integer.");
|
|
171
|
-
process.exitCode = 1;
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const timeoutMs = parseInt(opts.timeout, 10);
|
|
176
|
-
if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
|
|
177
|
-
log.error("Invalid timeout. Must be a positive integer.");
|
|
178
|
-
process.exitCode = 1;
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const requestId = randomUUID();
|
|
183
|
-
const paths = writeShotgunSignal(requestId, {
|
|
184
|
-
action: "start",
|
|
185
|
-
durationSeconds,
|
|
186
|
-
intervalSeconds,
|
|
187
|
-
focusArea: opts.focus,
|
|
188
|
-
});
|
|
189
|
-
if (!paths) {
|
|
190
|
-
process.exitCode = 1;
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
pollForResult(
|
|
195
|
-
requestId,
|
|
196
|
-
paths.resultPath,
|
|
197
|
-
paths.signalPath,
|
|
198
|
-
timeoutMs,
|
|
199
|
-
(result) => {
|
|
200
|
-
if (!result.ok) {
|
|
201
|
-
process.stdout.write(JSON.stringify(result) + "\n");
|
|
202
|
-
process.exitCode = 1;
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
process.stdout.write(JSON.stringify(result) + "\n");
|
|
206
|
-
},
|
|
207
|
-
);
|
|
208
|
-
},
|
|
209
|
-
);
|
|
210
|
-
|
|
211
|
-
shotgun
|
|
212
|
-
.command("status <watchId>")
|
|
213
|
-
.description("Check the status of an active screen-watch session")
|
|
214
|
-
.option(
|
|
215
|
-
"-t, --timeout <ms>",
|
|
216
|
-
"Timeout in milliseconds waiting for the assistant to respond",
|
|
217
|
-
String(DEFAULT_TIMEOUT_MS),
|
|
218
|
-
)
|
|
219
|
-
.addHelpText(
|
|
220
|
-
"after",
|
|
221
|
-
`
|
|
222
|
-
Arguments:
|
|
223
|
-
watchId The watch session ID returned by 'assistant shotgun start'.
|
|
224
|
-
|
|
225
|
-
Queries the status of an existing screen-watch session by watchId.
|
|
226
|
-
|
|
227
|
-
Output (JSON): { ok, watchId, conversationId, status }
|
|
228
|
-
|
|
229
|
-
The status field is one of: "active", "completing", "completed", "cancelled".
|
|
230
|
-
|
|
231
|
-
Examples:
|
|
232
|
-
$ assistant shotgun status abc12345
|
|
233
|
-
$ assistant shotgun status abc12345 --timeout 5000`,
|
|
234
|
-
)
|
|
235
|
-
.action((watchId: string, opts: { timeout: string }) => {
|
|
236
|
-
const timeoutMs = parseInt(opts.timeout, 10);
|
|
237
|
-
if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
|
|
238
|
-
log.error("Invalid timeout. Must be a positive integer.");
|
|
239
|
-
process.exitCode = 1;
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const requestId = randomUUID();
|
|
244
|
-
const paths = writeShotgunSignal(requestId, {
|
|
245
|
-
action: "status",
|
|
246
|
-
watchId,
|
|
247
|
-
});
|
|
248
|
-
if (!paths) {
|
|
249
|
-
process.exitCode = 1;
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
pollForResult(
|
|
254
|
-
requestId,
|
|
255
|
-
paths.resultPath,
|
|
256
|
-
paths.signalPath,
|
|
257
|
-
timeoutMs,
|
|
258
|
-
(result) => {
|
|
259
|
-
process.stdout.write(JSON.stringify(result) + "\n");
|
|
260
|
-
if (!result.ok) {
|
|
261
|
-
process.exitCode = 1;
|
|
262
|
-
}
|
|
263
|
-
},
|
|
264
|
-
);
|
|
265
|
-
});
|
|
266
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: browser
|
|
3
|
-
description: Navigate and interact with web pages using a headless browser
|
|
4
|
-
compatibility: "Designed for Vellum personal assistants"
|
|
5
|
-
metadata:
|
|
6
|
-
emoji: "🌐"
|
|
7
|
-
vellum:
|
|
8
|
-
display-name: "Browser"
|
|
9
|
-
feature-flag: "browser"
|
|
10
|
-
activation-hints:
|
|
11
|
-
- "Load first if you need browser_* tools (navigating, clicking, extracting web content)"
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
Use this skill to browse the web. After loading this skill, the following browser tools become available:
|
|
15
|
-
|
|
16
|
-
- `browser_attach` - Attach the Chrome debugger to the active tab
|
|
17
|
-
- `browser_navigate` - Navigate to a URL
|
|
18
|
-
- `browser_snapshot` - List interactive elements on the current page
|
|
19
|
-
- `browser_screenshot` - Take a visual screenshot
|
|
20
|
-
- `browser_close` - Close the browser page
|
|
21
|
-
- `browser_detach` - Detach the Chrome debugger from the active tab
|
|
22
|
-
- `browser_click` - Click an element
|
|
23
|
-
- `browser_type` - Type text into an input
|
|
24
|
-
- `browser_press_key` - Press a keyboard key
|
|
25
|
-
- `browser_scroll` - Scroll the page or a specific element
|
|
26
|
-
- `browser_select_option` - Select an option from a native `<select>` element
|
|
27
|
-
- `browser_hover` - Hover over an element to reveal menus/tooltips
|
|
28
|
-
- `browser_wait_for` - Wait for a condition
|
|
29
|
-
- `browser_extract` - Extract page text content
|
|
30
|
-
- `browser_wait_for_download` - Wait for a file download to complete
|
|
31
|
-
- `browser_fill_credential` - Fill a stored credential into a form field
|
|
32
|
-
- `browser_status` - Diagnose browser backend readiness and setup steps
|
|
33
|
-
|
|
34
|
-
## Capabilities
|
|
35
|
-
|
|
36
|
-
This browser runs **full Chromium with JavaScript enabled**. It can handle SPAs, React/Vue/Angular apps, dynamic content, date pickers, booking systems, reservation flows, and any JavaScript-heavy interactive site. Never tell the user you "can't handle interactive JavaScript" - you can.
|
|
37
|
-
|
|
38
|
-
## Browser Mode
|
|
39
|
-
|
|
40
|
-
Every browser tool accepts an optional `browser_mode` parameter that controls which backend executes the command:
|
|
41
|
-
|
|
42
|
-
| Value | Backend | Description |
|
|
43
|
-
|---|---|---|
|
|
44
|
-
| `auto` | Automatic | Default. The assistant picks the best available backend based on context (extension > cdp-inspect > local). |
|
|
45
|
-
| `extension` | Chrome extension | Routes through the user's Chrome browser via the extension debugger. |
|
|
46
|
-
| `cdp-inspect` | CDP inspect | Connects to an already-running Chrome instance via the DevTools protocol. Alias: `cdp-debugger`. |
|
|
47
|
-
| `local` | Playwright | Drives a dedicated Playwright-managed Chromium instance. Alias: `playwright`. |
|
|
48
|
-
|
|
49
|
-
**When to use `auto`**: Prefer `auto` (or omit `browser_mode` entirely) unless you have a specific reason to pin. The automatic backend selection handles extension availability, fallback, and session reuse.
|
|
50
|
-
|
|
51
|
-
**When to pin a mode**: Pin explicitly when:
|
|
52
|
-
- The user requests interaction with their own browser (use `extension` or `cdp-inspect`).
|
|
53
|
-
- A tool only works on a specific backend (e.g. `browser_wait_for_download` requires `local`).
|
|
54
|
-
- You want to avoid fallback behavior for diagnostic clarity.
|
|
55
|
-
|
|
56
|
-
**Unsupported mode errors**: Some tools restrict which modes they support. For example, `browser_wait_for_download` only supports `auto` and `local` because file downloads require the Playwright backend. Passing an unsupported mode returns a clear error with the accepted alternatives.
|
|
57
|
-
|
|
58
|
-
## Typical Workflow
|
|
59
|
-
|
|
60
|
-
1. (Optional) `browser_status` to diagnose backend availability and remediation when setup is unclear
|
|
61
|
-
2. `browser_attach` to establish the debugger session (extension path; optional on other backends)
|
|
62
|
-
3. `browser_navigate` to load a page
|
|
63
|
-
4. `browser_snapshot` to discover interactive elements
|
|
64
|
-
5. Use `browser_click`, `browser_type`, `browser_press_key`, `browser_scroll`, `browser_select_option`, or `browser_hover` to interact
|
|
65
|
-
6. `browser_extract` or `browser_screenshot` to capture results
|
|
66
|
-
7. `browser_detach` to end the debugger session, or `browser_close` to close the page entirely
|
|
67
|
-
|
|
68
|
-
## Interaction Strategies
|
|
69
|
-
|
|
70
|
-
**Date pickers / calendars:** Click the date input to open the picker, re-snapshot to see calendar controls, click month navigation arrows to reach the target month, then click the target date. For `<input type="date">`, use `browser_type` with `YYYY-MM-DD` format.
|
|
71
|
-
|
|
72
|
-
**Native `<select>` elements:** Use `browser_select_option` with `value`, `label`, or `index`. Do not try to click individual `<option>` elements.
|
|
73
|
-
|
|
74
|
-
**ARIA / custom dropdowns:** Click to open, take a new `browser_snapshot`, then click the desired option by `element_id`.
|
|
75
|
-
|
|
76
|
-
**Autocomplete inputs:** Type the search text, wait 500–1000ms (`browser_wait_for` with duration), re-snapshot for suggestions, then click the suggestion or use ArrowDown + Enter.
|
|
77
|
-
|
|
78
|
-
**Multi-step forms:** Complete each step, wait for the next section to load, re-snapshot to discover new elements, then proceed.
|
|
79
|
-
|
|
80
|
-
**Dynamic content:** After interactions that change the page, use `browser_wait_for` (selector or text) or re-snapshot to see updated elements before continuing.
|
|
81
|
-
|
|
82
|
-
**Scrolling:** Use `browser_scroll` to reveal below-the-fold content before snapshotting. Long pages may require multiple scrolls.
|
|
83
|
-
|
|
84
|
-
**Hover menus / tooltips:** Use `browser_hover` to reveal hidden menus or tooltips, then re-snapshot to see newly revealed elements.
|
|
85
|
-
|
|
86
|
-
## Verification
|
|
87
|
-
|
|
88
|
-
Use `browser_screenshot` after critical actions (form submission, booking confirmation, checkout) to visually verify results before reporting success to the user.
|