@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
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs an OAuth2 loopback flow to install the user's Slack app and capture
|
|
3
|
+
* bot + user tokens in a single exchange.
|
|
4
|
+
*
|
|
5
|
+
* Prerequisites: client_id, client_secret, and app_token must already be
|
|
6
|
+
* stored in the credential vault (service: slack_channel).
|
|
7
|
+
*
|
|
8
|
+
* The handler reads client credentials from secure storage, starts a
|
|
9
|
+
* loopback OAuth server on port 17322, opens the browser to Slack's
|
|
10
|
+
* authorize URL, and waits for the user to click "Allow". Slack's
|
|
11
|
+
* oauth.v2.access response contains both the bot token (access_token)
|
|
12
|
+
* and user token (authed_user.access_token). Both are stored via
|
|
13
|
+
* setSlackChannelConfig.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { credentialKey } from "../../security/credential-key.js";
|
|
17
|
+
import { startOAuth2Flow } from "../../security/oauth2.js";
|
|
18
|
+
import { getSecureKeyAsync } from "../../security/secure-keys.js";
|
|
19
|
+
import { openInHostBrowser } from "../../util/browser.js";
|
|
20
|
+
import { getLogger } from "../../util/logger.js";
|
|
21
|
+
import { setSlackChannelConfig } from "./config-slack-channel.js";
|
|
22
|
+
|
|
23
|
+
const log = getLogger("slack-channel-oauth-install");
|
|
24
|
+
|
|
25
|
+
/** Port pre-registered for Slack in seed-providers.ts. */
|
|
26
|
+
const SLACK_LOOPBACK_PORT = 17322;
|
|
27
|
+
|
|
28
|
+
/** Bot scopes matching the manifest in SKILL.md. */
|
|
29
|
+
const BOT_SCOPES = [
|
|
30
|
+
"app_mentions:read",
|
|
31
|
+
"assistant:write",
|
|
32
|
+
"channels:history",
|
|
33
|
+
"channels:join",
|
|
34
|
+
"channels:read",
|
|
35
|
+
"chat:write",
|
|
36
|
+
"files:read",
|
|
37
|
+
"files:write",
|
|
38
|
+
"groups:history",
|
|
39
|
+
"groups:read",
|
|
40
|
+
"im:history",
|
|
41
|
+
"im:read",
|
|
42
|
+
"im:write",
|
|
43
|
+
"mpim:history",
|
|
44
|
+
"mpim:read",
|
|
45
|
+
"reactions:read",
|
|
46
|
+
"reactions:write",
|
|
47
|
+
"users:read",
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
/** User scopes matching the manifest in SKILL.md. */
|
|
51
|
+
const USER_SCOPES = [
|
|
52
|
+
"channels:history",
|
|
53
|
+
"channels:read",
|
|
54
|
+
"groups:history",
|
|
55
|
+
"groups:read",
|
|
56
|
+
"im:history",
|
|
57
|
+
"im:read",
|
|
58
|
+
"mpim:history",
|
|
59
|
+
"mpim:read",
|
|
60
|
+
"users:read",
|
|
61
|
+
"search:read",
|
|
62
|
+
"reactions:read",
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
export interface SlackOAuthInstallResult {
|
|
66
|
+
success: boolean;
|
|
67
|
+
hasBotToken: boolean;
|
|
68
|
+
hasUserToken: boolean;
|
|
69
|
+
error?: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export async function runSlackChannelOAuthInstall(): Promise<SlackOAuthInstallResult> {
|
|
73
|
+
// Read client credentials from secure storage
|
|
74
|
+
const clientId = await getSecureKeyAsync(
|
|
75
|
+
credentialKey("slack_channel", "client_id"),
|
|
76
|
+
);
|
|
77
|
+
if (!clientId) {
|
|
78
|
+
return {
|
|
79
|
+
success: false,
|
|
80
|
+
hasBotToken: false,
|
|
81
|
+
hasUserToken: false,
|
|
82
|
+
error:
|
|
83
|
+
"Client ID not found in credential store. Store it first via credential_store prompt (service: slack_channel, field: client_id).",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const clientSecret = await getSecureKeyAsync(
|
|
88
|
+
credentialKey("slack_channel", "client_secret"),
|
|
89
|
+
);
|
|
90
|
+
if (!clientSecret) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
hasBotToken: false,
|
|
94
|
+
hasUserToken: false,
|
|
95
|
+
error:
|
|
96
|
+
"Client Secret not found in credential store. Store it first via credential_store prompt (service: slack_channel, field: client_secret).",
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const appToken = await getSecureKeyAsync(
|
|
101
|
+
credentialKey("slack_channel", "app_token"),
|
|
102
|
+
);
|
|
103
|
+
if (!appToken) {
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
hasBotToken: false,
|
|
107
|
+
hasUserToken: false,
|
|
108
|
+
error:
|
|
109
|
+
"App Token not found in credential store. Store it first via credential_store prompt (service: slack_channel, field: app_token).",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
log.info("Starting Slack OAuth install flow via loopback");
|
|
114
|
+
|
|
115
|
+
let result;
|
|
116
|
+
try {
|
|
117
|
+
result = await startOAuth2Flow(
|
|
118
|
+
{
|
|
119
|
+
authorizeUrl: "https://slack.com/oauth/v2/authorize",
|
|
120
|
+
tokenExchangeUrl: "https://slack.com/api/oauth.v2.access",
|
|
121
|
+
scopes: BOT_SCOPES,
|
|
122
|
+
clientId,
|
|
123
|
+
clientSecret,
|
|
124
|
+
scopeSeparator: ",",
|
|
125
|
+
authorizeParams: {
|
|
126
|
+
user_scope: USER_SCOPES.join(","),
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
openUrl: (url) => openInHostBrowser(url),
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
callbackTransport: "loopback",
|
|
134
|
+
loopbackPort: SLACK_LOOPBACK_PORT,
|
|
135
|
+
},
|
|
136
|
+
);
|
|
137
|
+
} catch (err) {
|
|
138
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
139
|
+
log.error({ err: msg }, "Slack OAuth install flow failed");
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
hasBotToken: false,
|
|
143
|
+
hasUserToken: false,
|
|
144
|
+
error: `OAuth flow failed: ${msg}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Slack's oauth.v2.access returns:
|
|
149
|
+
// access_token: "xoxb-..." (bot token)
|
|
150
|
+
// authed_user: { access_token: "xoxp-..." } (user token)
|
|
151
|
+
const raw = result.rawTokenResponse;
|
|
152
|
+
const botToken = raw.access_token as string | undefined;
|
|
153
|
+
const authedUser = raw.authed_user as { access_token?: string } | undefined;
|
|
154
|
+
const userToken = authedUser?.access_token as string | undefined;
|
|
155
|
+
|
|
156
|
+
if (!botToken) {
|
|
157
|
+
log.error(
|
|
158
|
+
{ rawKeys: Object.keys(raw) },
|
|
159
|
+
"Slack OAuth response missing bot access_token",
|
|
160
|
+
);
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
hasBotToken: false,
|
|
164
|
+
hasUserToken: false,
|
|
165
|
+
error:
|
|
166
|
+
"Slack OAuth response did not include a bot token (access_token). The app may not have bot scopes configured.",
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
log.info(
|
|
171
|
+
{ hasBotToken: true, hasUserToken: !!userToken },
|
|
172
|
+
"Slack OAuth tokens received, storing via setSlackChannelConfig",
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
// Store bot token (and user token if present) via the Slack channel handler,
|
|
176
|
+
// which validates tokens and persists workspace metadata.
|
|
177
|
+
const configResult = await setSlackChannelConfig(
|
|
178
|
+
botToken,
|
|
179
|
+
appToken,
|
|
180
|
+
userToken,
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
if (!configResult.success) {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
hasBotToken: false,
|
|
187
|
+
hasUserToken: false,
|
|
188
|
+
error: configResult.error ?? "Failed to store Slack tokens",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
success: true,
|
|
194
|
+
hasBotToken: true,
|
|
195
|
+
hasUserToken: !!userToken,
|
|
196
|
+
};
|
|
197
|
+
}
|
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
|
|
1
3
|
import { config as dotenvConfig } from "dotenv";
|
|
2
4
|
|
|
3
5
|
import type { BackupWorkerHandle } from "../backup/backup-worker.js";
|
|
@@ -10,8 +12,6 @@ import { setVoiceBridgeDeps } from "../calls/voice-session-bridge.js";
|
|
|
10
12
|
import { initFeatureFlagOverrides } from "../config/assistant-feature-flags.js";
|
|
11
13
|
import {
|
|
12
14
|
getPlatformAssistantId,
|
|
13
|
-
getQdrantHttpPortEnv,
|
|
14
|
-
getQdrantUrlEnv,
|
|
15
15
|
getRuntimeHttpHost,
|
|
16
16
|
getRuntimeHttpPort,
|
|
17
17
|
setIngressPublicBaseUrl,
|
|
@@ -41,8 +41,6 @@ import {
|
|
|
41
41
|
startFeedScheduler,
|
|
42
42
|
} from "../home/feed-scheduler.js";
|
|
43
43
|
import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
|
|
44
|
-
import { getHookManager } from "../hooks/manager.js";
|
|
45
|
-
import { installTemplates } from "../hooks/templates.js";
|
|
46
44
|
import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
|
|
47
45
|
import { getMcpServerManager } from "../mcp/manager.js";
|
|
48
46
|
import * as attachmentsStore from "../memory/attachments-store.js";
|
|
@@ -61,7 +59,7 @@ import {
|
|
|
61
59
|
} from "../memory/embedding-backend.js";
|
|
62
60
|
import { enqueueMemoryJob } from "../memory/jobs-store.js";
|
|
63
61
|
import { startMemoryJobsWorker } from "../memory/jobs-worker.js";
|
|
64
|
-
import { initQdrantClient } from "../memory/qdrant-client.js";
|
|
62
|
+
import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
|
|
65
63
|
import { QdrantManager } from "../memory/qdrant-manager.js";
|
|
66
64
|
import { rotateToolInvocations } from "../memory/tool-usage-store.js";
|
|
67
65
|
import { deleteOldTraceEvents } from "../memory/trace-event-store.js";
|
|
@@ -71,8 +69,8 @@ import {
|
|
|
71
69
|
} from "../notifications/emit-signal.js";
|
|
72
70
|
import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
|
|
73
71
|
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
72
|
+
import { loadUserPlugins } from "../plugins/user-loader.js";
|
|
74
73
|
import { ensurePromptFiles } from "../prompts/system-prompt.js";
|
|
75
|
-
import { syncUpdateBulletinOnStartup } from "../prompts/update-bulletin.js";
|
|
76
74
|
import { resolveManagedProxyContext } from "../providers/managed-proxy/context.js";
|
|
77
75
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
78
76
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
@@ -89,6 +87,7 @@ import {
|
|
|
89
87
|
} from "../runtime/capability-tokens.js";
|
|
90
88
|
import { ensureVellumGuardianBinding } from "../runtime/guardian-vellum-migration.js";
|
|
91
89
|
import { RuntimeHttpServer } from "../runtime/http-server.js";
|
|
90
|
+
import { recoverInterruptedImport } from "../runtime/migrations/vbundle-streaming-importer.js";
|
|
92
91
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
93
92
|
import {
|
|
94
93
|
onCesClientChanged,
|
|
@@ -105,6 +104,7 @@ import {
|
|
|
105
104
|
getInterfacesDir,
|
|
106
105
|
getWorkspaceDir,
|
|
107
106
|
} from "../util/platform.js";
|
|
107
|
+
import { APP_VERSION } from "../version.js";
|
|
108
108
|
import {
|
|
109
109
|
listWorkItems,
|
|
110
110
|
updateWorkItem,
|
|
@@ -122,6 +122,7 @@ import {
|
|
|
122
122
|
cleanupPidFileIfOwner,
|
|
123
123
|
writePid,
|
|
124
124
|
} from "./daemon-control.js";
|
|
125
|
+
import { bootstrapPlugins } from "./external-plugins-bootstrap.js";
|
|
125
126
|
import {
|
|
126
127
|
createGuardianActionCopyGenerator,
|
|
127
128
|
createGuardianFollowUpConversationGenerator,
|
|
@@ -146,7 +147,6 @@ import {
|
|
|
146
147
|
import { seedInterfaceFiles } from "./seed-files.js";
|
|
147
148
|
import { DaemonServer } from "./server.js";
|
|
148
149
|
import { installShutdownHandlers } from "./shutdown-handlers.js";
|
|
149
|
-
import { handleWatchObservation } from "./watch-handler.js";
|
|
150
150
|
|
|
151
151
|
// Re-export public API so existing consumers don't need to change imports
|
|
152
152
|
export type { StopResult } from "./daemon-control.js";
|
|
@@ -278,6 +278,36 @@ export async function runDaemon(): Promise<void> {
|
|
|
278
278
|
|
|
279
279
|
ensureDataDir();
|
|
280
280
|
|
|
281
|
+
// Recover from any streaming `.vbundle` import that was interrupted by a
|
|
282
|
+
// crash or SIGKILL. If the previous process died between
|
|
283
|
+
// `carryOverPreservedPaths` and the atomic workspace swap, the live
|
|
284
|
+
// workspace may be missing `data/db` / `data/qdrant` / etc. The marker
|
|
285
|
+
// at `<workspaceDir>.import-marker.json` (persisted before any rename
|
|
286
|
+
// runs) tells us where the orphaned preserved paths landed; the
|
|
287
|
+
// recovery helper moves them back into the live workspace and cleans
|
|
288
|
+
// up the temp tree. Running this BEFORE `initializeDb()` ensures the
|
|
289
|
+
// DB singleton opens against the fully-restored `assistant.db`.
|
|
290
|
+
try {
|
|
291
|
+
const recoveryResult = await recoverInterruptedImport(getWorkspaceDir());
|
|
292
|
+
if (!recoveryResult.ok) {
|
|
293
|
+
// Rollback is intentionally unresolved — backup/temp/marker are
|
|
294
|
+
// preserved on disk so an operator (or a later retry) can finish
|
|
295
|
+
// the recovery. Log loudly so ops sees it, but don't block start-up:
|
|
296
|
+
// the daemon still needs to come up for diagnostics. The next
|
|
297
|
+
// `streamCommitImport` will refuse to start a new import until the
|
|
298
|
+
// marker is resolved.
|
|
299
|
+
log.error(
|
|
300
|
+
{ failedCount: recoveryResult.failedCount },
|
|
301
|
+
"Interrupted-import recovery is INCOMPLETE; leftover .pre-import-* / .import-* scratch dirs remain in the workspace. Manual intervention may be required before the next import can run.",
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
} catch (err) {
|
|
305
|
+
log.warn(
|
|
306
|
+
{ err },
|
|
307
|
+
"recoverInterruptedImport threw during daemon startup; continuing",
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
|
|
281
311
|
// Load (or generate + persist) the auth signing key so tokens survive
|
|
282
312
|
// daemon restarts.
|
|
283
313
|
const signingKey = resolveSigningKey();
|
|
@@ -308,8 +338,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
308
338
|
|
|
309
339
|
seedInterfaceFiles();
|
|
310
340
|
|
|
311
|
-
log.info("Daemon startup:
|
|
312
|
-
installTemplates();
|
|
341
|
+
log.info("Daemon startup: initializing DB");
|
|
313
342
|
ensurePromptFiles();
|
|
314
343
|
|
|
315
344
|
// DB must be initialized before workspace migrations because some
|
|
@@ -543,18 +572,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
543
572
|
log.info("Daemon startup: loading config");
|
|
544
573
|
const config = loadConfig();
|
|
545
574
|
|
|
546
|
-
// Run bulletin sync AFTER the config merge + load so that getConfig()
|
|
547
|
-
// inside syncUpdateBulletinOnStartup() observes the fully merged config.
|
|
548
|
-
// Running it earlier would populate the config cache with pre-merge
|
|
549
|
-
// values, poisoning every downstream getConfig() consumer.
|
|
550
|
-
if (dbReady) {
|
|
551
|
-
try {
|
|
552
|
-
syncUpdateBulletinOnStartup();
|
|
553
|
-
} catch (err) {
|
|
554
|
-
log.warn({ err }, "Bulletin sync failed — continuing startup");
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
|
|
558
575
|
// Seed module-level ingress state from the workspace config so that
|
|
559
576
|
// getIngressPublicBaseUrl() returns the correct value immediately after
|
|
560
577
|
// startup (before any handleIngressConfig("set") call). Without this,
|
|
@@ -655,7 +672,9 @@ export async function runDaemon(): Promise<void> {
|
|
|
655
672
|
...(startupProxyCtx.assistantApiKey
|
|
656
673
|
? { assistantApiKey: startupProxyCtx.assistantApiKey }
|
|
657
674
|
: {}),
|
|
658
|
-
...(startupAssistantId
|
|
675
|
+
...(startupAssistantId
|
|
676
|
+
? { assistantId: startupAssistantId }
|
|
677
|
+
: {}),
|
|
659
678
|
});
|
|
660
679
|
if (accepted) {
|
|
661
680
|
log.info("CES reconnection handshake accepted");
|
|
@@ -677,6 +696,33 @@ export async function runDaemon(): Promise<void> {
|
|
|
677
696
|
}
|
|
678
697
|
}
|
|
679
698
|
|
|
699
|
+
// Populate the registry with user plugins from `~/.vellum/plugins/*`
|
|
700
|
+
// AFTER first-party plugins have already registered via their static
|
|
701
|
+
// side-effect imports. User plugins may fail to load individually; a
|
|
702
|
+
// failing user plugin is logged and skipped so one bad install can't
|
|
703
|
+
// prevent the daemon from starting. Ordering is load-bearing:
|
|
704
|
+
// first-party registrations → user registrations → bootstrap (init).
|
|
705
|
+
// Both groups are fully registered before any `init()` runs so plugins
|
|
706
|
+
// that depend on each other's registration observably see a stable
|
|
707
|
+
// registry at init time.
|
|
708
|
+
await loadUserPlugins();
|
|
709
|
+
|
|
710
|
+
// Bootstrap registered plugins. Runs after the plugin registry is
|
|
711
|
+
// populated (first-party static side-effect imports + user plugins
|
|
712
|
+
// loaded above) and before the DaemonServer starts handling
|
|
713
|
+
// conversations. Credential resolution + per-plugin storage directory
|
|
714
|
+
// creation happen here. Wrapped in try/catch so a failing plugin can't
|
|
715
|
+
// block daemon startup — bootstrapPlugins internally tears down any
|
|
716
|
+
// partially-initialized plugins before throwing.
|
|
717
|
+
try {
|
|
718
|
+
await bootstrapPlugins({ config, assistantVersion: APP_VERSION });
|
|
719
|
+
} catch (err) {
|
|
720
|
+
log.warn(
|
|
721
|
+
{ err },
|
|
722
|
+
"Plugin bootstrap failed — continuing startup with degraded plugin functionality",
|
|
723
|
+
);
|
|
724
|
+
}
|
|
725
|
+
|
|
680
726
|
// Start the DaemonServer (conversation manager) before Qdrant so HTTP
|
|
681
727
|
// routes can begin accepting requests while Qdrant initializes.
|
|
682
728
|
log.info("Daemon startup: starting DaemonServer");
|
|
@@ -690,6 +736,24 @@ export async function runDaemon(): Promise<void> {
|
|
|
690
736
|
await server.start();
|
|
691
737
|
log.info("Daemon startup: DaemonServer started");
|
|
692
738
|
|
|
739
|
+
// Kick off the update bulletin background job AFTER `server.start()`
|
|
740
|
+
// resolves. `server.start()` installs the default wake resolver (via
|
|
741
|
+
// `registerDefaultWakeResolver()`), which the job depends on to actually
|
|
742
|
+
// invoke the agent. Dispatching before that point races the resolver
|
|
743
|
+
// registration and causes `wakeAgentForOpportunity()` to silently return
|
|
744
|
+
// `{invoked: false}`, leaving an orphan background conversation and a
|
|
745
|
+
// wasted LLM title-generation call every startup.
|
|
746
|
+
//
|
|
747
|
+
// Kept fire-and-forget (`void import(...).then(...).catch(...)`) so the
|
|
748
|
+
// daemon never blocks startup on it.
|
|
749
|
+
if (dbReady) {
|
|
750
|
+
void import("../prompts/update-bulletin-job.js")
|
|
751
|
+
.then((m) => m.runUpdateBulletinJobIfNeeded())
|
|
752
|
+
.catch((err) =>
|
|
753
|
+
log.warn({ err }, "Update bulletin job failed — continuing startup"),
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
|
|
693
757
|
// Mutable refs for Qdrant, memory worker, and backup worker so background
|
|
694
758
|
// init can assign them and the shutdown handler always sees the latest value.
|
|
695
759
|
const bgRefs: {
|
|
@@ -701,13 +765,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
701
765
|
// Initialize Qdrant vector store and memory worker in the background so the
|
|
702
766
|
// RuntimeHttpServer can start accepting requests without waiting for Qdrant.
|
|
703
767
|
async function initializeQdrantAndMemory(): Promise<void> {
|
|
704
|
-
|
|
705
|
-
// QDRANT_URL (external Qdrant instance) so the CLI can set the port without
|
|
706
|
-
// triggering QdrantManager's external mode which skips local process spawn.
|
|
707
|
-
const qdrantHttpPort = getQdrantHttpPortEnv();
|
|
708
|
-
const qdrantUrl = qdrantHttpPort
|
|
709
|
-
? `http://127.0.0.1:${qdrantHttpPort}`
|
|
710
|
-
: getQdrantUrlEnv() || config.memory.qdrant.url;
|
|
768
|
+
const qdrantUrl = resolveQdrantUrl(config);
|
|
711
769
|
log.info({ qdrantUrl }, "Daemon startup: initializing Qdrant");
|
|
712
770
|
const manager = new QdrantManager({ url: qdrantUrl });
|
|
713
771
|
bgRefs.qdrantManager = manager;
|
|
@@ -774,6 +832,28 @@ export async function runDaemon(): Promise<void> {
|
|
|
774
832
|
"Qdrant client initialization failed — memory features will be degraded",
|
|
775
833
|
);
|
|
776
834
|
}
|
|
835
|
+
|
|
836
|
+
// Reconcile the PKB Qdrant index against the on-disk tree. Kept
|
|
837
|
+
// inside the `qdrantStarted` guard so we don't call
|
|
838
|
+
// `getQdrantClient()` (which throws "not initialized") on every
|
|
839
|
+
// startup when Qdrant is unavailable. Fire-and-forget so enqueued
|
|
840
|
+
// re-index jobs drain in the background and first-turn latency
|
|
841
|
+
// stays unaffected.
|
|
842
|
+
void (async () => {
|
|
843
|
+
try {
|
|
844
|
+
const { reconcilePkbIndex } =
|
|
845
|
+
await import("../memory/pkb/pkb-reconcile.js");
|
|
846
|
+
const { PKB_WORKSPACE_SCOPE } =
|
|
847
|
+
await import("../memory/pkb/types.js");
|
|
848
|
+
const pkbRoot = join(getWorkspaceDir(), "pkb");
|
|
849
|
+
await reconcilePkbIndex(pkbRoot, PKB_WORKSPACE_SCOPE);
|
|
850
|
+
} catch (err) {
|
|
851
|
+
log.warn(
|
|
852
|
+
{ err },
|
|
853
|
+
"PKB index reconciliation failed — continuing startup",
|
|
854
|
+
);
|
|
855
|
+
}
|
|
856
|
+
})();
|
|
777
857
|
}
|
|
778
858
|
|
|
779
859
|
log.info("Daemon startup: starting memory worker");
|
|
@@ -879,29 +959,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
879
959
|
throwOnError: true,
|
|
880
960
|
});
|
|
881
961
|
},
|
|
882
|
-
(schedule) => {
|
|
883
|
-
void emitNotificationSignal({
|
|
884
|
-
sourceEventName: "schedule.complete",
|
|
885
|
-
sourceChannel: "scheduler",
|
|
886
|
-
sourceContextId: schedule.id,
|
|
887
|
-
attentionHints: {
|
|
888
|
-
requiresAction: false,
|
|
889
|
-
urgency: "medium",
|
|
890
|
-
isAsyncBackground: true,
|
|
891
|
-
visibleInSourceNow: false,
|
|
892
|
-
},
|
|
893
|
-
contextPayload: {
|
|
894
|
-
scheduleId: schedule.id,
|
|
895
|
-
name: schedule.name,
|
|
896
|
-
},
|
|
897
|
-
conversationMetadata: {
|
|
898
|
-
groupId: "system:scheduled",
|
|
899
|
-
scheduleJobId: schedule.id,
|
|
900
|
-
source: "schedule",
|
|
901
|
-
},
|
|
902
|
-
dedupeKey: `schedule:complete:${schedule.id}:${Date.now()}`,
|
|
903
|
-
});
|
|
904
|
-
},
|
|
905
962
|
(notification) => {
|
|
906
963
|
void emitNotificationSignal({
|
|
907
964
|
sourceEventName: "watcher.notification",
|
|
@@ -1070,28 +1127,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
1070
1127
|
);
|
|
1071
1128
|
},
|
|
1072
1129
|
},
|
|
1073
|
-
getWatchDeps: () => {
|
|
1074
|
-
const ctx = server.getHandlerContext();
|
|
1075
|
-
return {
|
|
1076
|
-
handleWatchObservation: async (params) => {
|
|
1077
|
-
await handleWatchObservation(
|
|
1078
|
-
{
|
|
1079
|
-
type: "watch_observation",
|
|
1080
|
-
watchId: params.watchId,
|
|
1081
|
-
conversationId: params.conversationId,
|
|
1082
|
-
ocrText: params.ocrText,
|
|
1083
|
-
appName: params.appName,
|
|
1084
|
-
windowTitle: params.windowTitle,
|
|
1085
|
-
bundleIdentifier: params.bundleIdentifier,
|
|
1086
|
-
timestamp: params.timestamp,
|
|
1087
|
-
captureIndex: params.captureIndex,
|
|
1088
|
-
totalExpected: params.totalExpected,
|
|
1089
|
-
},
|
|
1090
|
-
ctx,
|
|
1091
|
-
);
|
|
1092
|
-
},
|
|
1093
|
-
};
|
|
1094
|
-
},
|
|
1095
1130
|
getRecordingDeps: () => ({
|
|
1096
1131
|
getHandlerContext: () => server.getHandlerContext(),
|
|
1097
1132
|
}),
|
|
@@ -1328,13 +1363,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
1328
1363
|
log.warn({ err }, "Assistant symlink installation failed — continuing");
|
|
1329
1364
|
}
|
|
1330
1365
|
|
|
1331
|
-
const hookManager = getHookManager();
|
|
1332
|
-
hookManager.watch();
|
|
1333
|
-
|
|
1334
|
-
void hookManager.trigger("daemon-start", {
|
|
1335
|
-
pid: process.pid,
|
|
1336
|
-
});
|
|
1337
|
-
|
|
1338
1366
|
// Download embedding runtime in background (non-blocking).
|
|
1339
1367
|
// If download fails, local embeddings gracefully fall back to cloud backends.
|
|
1340
1368
|
void (async () => {
|
|
@@ -1448,7 +1476,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
1448
1476
|
workspaceHeartbeat,
|
|
1449
1477
|
heartbeat,
|
|
1450
1478
|
filing,
|
|
1451
|
-
hookManager,
|
|
1452
1479
|
runtimeHttp,
|
|
1453
1480
|
scheduler,
|
|
1454
1481
|
feedScheduler,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Computer use and
|
|
1
|
+
// Computer use and recording types.
|
|
2
2
|
|
|
3
3
|
import type { CommandIntent, UserMessageAttachment } from "./shared.js";
|
|
4
4
|
|
|
@@ -15,19 +15,6 @@ export interface TaskSubmit {
|
|
|
15
15
|
commandIntent?: CommandIntent;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export interface WatchObservation {
|
|
19
|
-
type: "watch_observation";
|
|
20
|
-
watchId: string;
|
|
21
|
-
conversationId: string;
|
|
22
|
-
ocrText: string;
|
|
23
|
-
appName?: string;
|
|
24
|
-
windowTitle?: string;
|
|
25
|
-
bundleIdentifier?: string;
|
|
26
|
-
timestamp: number;
|
|
27
|
-
captureIndex: number;
|
|
28
|
-
totalExpected: number;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
18
|
// === Recording ===
|
|
32
19
|
|
|
33
20
|
/** Recording options shared across standalone and CU recording flows. */
|
|
@@ -89,30 +76,11 @@ export interface RecordingResume {
|
|
|
89
76
|
recordingId: string;
|
|
90
77
|
}
|
|
91
78
|
|
|
92
|
-
export interface WatchStarted {
|
|
93
|
-
type: "watch_started";
|
|
94
|
-
conversationId: string;
|
|
95
|
-
watchId: string;
|
|
96
|
-
durationSeconds: number;
|
|
97
|
-
intervalSeconds: number;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export interface WatchCompleteRequest {
|
|
101
|
-
type: "watch_complete_request";
|
|
102
|
-
conversationId: string;
|
|
103
|
-
watchId: string;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
79
|
// --- Domain-level union aliases (consumed by the barrel file) ---
|
|
107
80
|
|
|
108
|
-
export type _ComputerUseClientMessages =
|
|
109
|
-
| TaskSubmit
|
|
110
|
-
| WatchObservation
|
|
111
|
-
| RecordingStatus;
|
|
81
|
+
export type _ComputerUseClientMessages = TaskSubmit | RecordingStatus;
|
|
112
82
|
|
|
113
83
|
export type _ComputerUseServerMessages =
|
|
114
|
-
| WatchStarted
|
|
115
|
-
| WatchCompleteRequest
|
|
116
84
|
| RecordingStart
|
|
117
85
|
| RecordingStop
|
|
118
86
|
| RecordingPause
|
|
@@ -421,8 +421,16 @@ export interface UsageResponse {
|
|
|
421
421
|
model: string;
|
|
422
422
|
}
|
|
423
423
|
|
|
424
|
+
/**
|
|
425
|
+
* Emitted after a compaction turn completes (both auto-compaction and
|
|
426
|
+
* `/compact`). Carries the fresh `estimatedInputTokens` so clients can refresh
|
|
427
|
+
* the context-window indicator without waiting for the next `usage_update`.
|
|
428
|
+
*
|
|
429
|
+
* Scoped per-conversation — see `CompactionCircuitOpen` doc for why.
|
|
430
|
+
*/
|
|
424
431
|
export interface ContextCompacted {
|
|
425
432
|
type: "context_compacted";
|
|
433
|
+
conversationId: string;
|
|
426
434
|
previousEstimatedInputTokens: number;
|
|
427
435
|
estimatedInputTokens: number;
|
|
428
436
|
maxInputTokens: number;
|
|
@@ -432,6 +440,59 @@ export interface ContextCompacted {
|
|
|
432
440
|
summaryInputTokens: number;
|
|
433
441
|
summaryOutputTokens: number;
|
|
434
442
|
summaryModel: string;
|
|
443
|
+
/**
|
|
444
|
+
* Quality signals for the generated summary. Emitted for every
|
|
445
|
+
* compaction (including truncation-only paths where the summary text
|
|
446
|
+
* is unchanged from the prior pass). Consumers can use these to detect
|
|
447
|
+
* regressions without needing to read the summary text itself.
|
|
448
|
+
*
|
|
449
|
+
* - `summaryCharCount`: length of the produced summary text.
|
|
450
|
+
* - `summaryHeaderCount`: number of `## ` section headers in the summary.
|
|
451
|
+
* - `summaryHadMemoryEcho`: `true` if the summary contains any runtime
|
|
452
|
+
* injection tag (e.g. `<memory`, `<turn_context>`, `<workspace>`).
|
|
453
|
+
* Should always be `false` — `true` indicates the compaction strip
|
|
454
|
+
* logic failed to remove an injected block from the summarizer input.
|
|
455
|
+
*/
|
|
456
|
+
summaryCharCount?: number;
|
|
457
|
+
summaryHeaderCount?: number;
|
|
458
|
+
summaryHadMemoryEcho?: boolean;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Emitted when the compaction circuit breaker trips. After three consecutive
|
|
463
|
+
* summary-LLM failures (with local fallback covering each), auto-compaction is
|
|
464
|
+
* suspended until `openUntil` to avoid repeatedly hammering a broken provider.
|
|
465
|
+
* User-initiated compaction (`/compact`, `force: true`) bypasses the breaker.
|
|
466
|
+
*
|
|
467
|
+
* `conversationId` scopes the event so clients can ignore breaker trips from
|
|
468
|
+
* other conversations — `EventStreamClient` broadcasts every parsed server
|
|
469
|
+
* message to all subscribers, so without this field a breaker trip in one
|
|
470
|
+
* conversation would set the "auto-compaction paused" banner on every open
|
|
471
|
+
* `ChatViewModel`.
|
|
472
|
+
*/
|
|
473
|
+
export interface CompactionCircuitOpen {
|
|
474
|
+
type: "compaction_circuit_open";
|
|
475
|
+
conversationId: string;
|
|
476
|
+
reason: "3_consecutive_failures";
|
|
477
|
+
/** Timestamp (ms since epoch) when the breaker will allow auto-compaction again. */
|
|
478
|
+
openUntil: number;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Emitted when the compaction circuit breaker transitions from open → closed
|
|
483
|
+
* because a successful compaction reset
|
|
484
|
+
* `ctx.compactionCircuitOpenUntil`. The Swift client clears its banner state
|
|
485
|
+
* on receipt so the "auto-compaction paused" indicator dismisses immediately
|
|
486
|
+
* instead of lingering until the original `openUntil` deadline (up to 1h).
|
|
487
|
+
*
|
|
488
|
+
* Only fires on the open→closed transition — successful compactions while
|
|
489
|
+
* the breaker was already closed would be noise.
|
|
490
|
+
*
|
|
491
|
+
* Scoped per-conversation — see `CompactionCircuitOpen` doc for why.
|
|
492
|
+
*/
|
|
493
|
+
export interface CompactionCircuitClosed {
|
|
494
|
+
type: "compaction_circuit_closed";
|
|
495
|
+
conversationId: string;
|
|
435
496
|
}
|
|
436
497
|
|
|
437
498
|
export type ConversationErrorCode =
|
|
@@ -531,6 +592,8 @@ export type _ConversationsServerMessages =
|
|
|
531
592
|
| UsageUpdate
|
|
532
593
|
| UsageResponse
|
|
533
594
|
| ContextCompacted
|
|
595
|
+
| CompactionCircuitOpen
|
|
596
|
+
| CompactionCircuitClosed
|
|
534
597
|
| ConversationErrorMessage
|
|
535
598
|
| ConversationInfo
|
|
536
599
|
| ConversationTitleUpdated
|