@vellumai/assistant 0.6.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +273 -10
- package/Dockerfile +2 -3
- package/bun.lock +41 -49
- package/bunfig.toml +3 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/stt-provider-onboarding.md +120 -0
- package/knip.json +12 -2
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +3 -3
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
- package/openapi.yaml +1111 -86
- package/package.json +40 -42
- package/scripts/generate-openapi.ts +0 -2
- package/scripts/test.sh +73 -18
- package/src/__tests__/acp-session.test.ts +43 -0
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- package/src/__tests__/agent-loop.test.ts +123 -0
- package/src/__tests__/anthropic-provider.test.ts +263 -10
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +1 -0
- package/src/__tests__/app-source-watcher.test.ts +37 -11
- package/src/__tests__/approval-routes-http.test.ts +178 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +550 -0
- package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
- package/src/__tests__/browser-fill-credential.test.ts +240 -94
- package/src/__tests__/browser-manager.test.ts +40 -27
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/browser-skill-endstate.test.ts +31 -7
- package/src/__tests__/btw-routes.test.ts +7 -0
- package/src/__tests__/call-controller.test.ts +581 -20
- package/src/__tests__/catalog-files.test.ts +1000 -0
- package/src/__tests__/channel-approvals.test.ts +53 -0
- package/src/__tests__/channel-invite-transport.test.ts +2 -2
- package/src/__tests__/channel-readiness-routes.test.ts +16 -20
- package/src/__tests__/channel-readiness-service.test.ts +12 -7
- package/src/__tests__/checker.test.ts +157 -10
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- package/src/__tests__/config-analysis.test.ts +100 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
- package/src/__tests__/config-schema-cmd.test.ts +2 -2
- package/src/__tests__/config-schema.test.ts +1248 -224
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +43 -8
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
- package/src/__tests__/contact-store-user-file.test.ts +512 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-overflow-approval.test.ts +16 -1
- package/src/__tests__/context-window-manager.test.ts +88 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +99 -3
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -2
- package/src/__tests__/conversation-attachments.test.ts +80 -4
- package/src/__tests__/conversation-confirmation-signals.test.ts +290 -0
- package/src/__tests__/conversation-error.test.ts +70 -0
- package/src/__tests__/conversation-fork-crud.test.ts +17 -0
- package/src/__tests__/conversation-history-web-search.test.ts +12 -4
- package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
- package/src/__tests__/conversation-inject-context.test.ts +103 -0
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +946 -62
- package/src/__tests__/conversation-routes-disk-view.test.ts +275 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +324 -46
- package/src/__tests__/conversation-skill-tools.test.ts +7 -4
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +89 -18
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-starter-routes.test.ts +126 -0
- package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
- package/src/__tests__/conversation-store.test.ts +195 -0
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -1
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +6 -3
- package/src/__tests__/credential-vault-unit.test.ts +383 -7
- package/src/__tests__/credential-vault.test.ts +152 -13
- package/src/__tests__/credentials-cli.test.ts +42 -18
- package/src/__tests__/cross-provider-web-search.test.ts +146 -35
- package/src/__tests__/date-context.test.ts +4 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -0
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
- package/src/__tests__/email-html-renderer.test.ts +71 -0
- package/src/__tests__/email-invite-adapter.test.ts +36 -32
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
- package/src/__tests__/emit-event-signal.test.ts +71 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +222 -0
- package/src/__tests__/fixtures/mock-chrome-extension.ts +386 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +2 -0
- package/src/__tests__/gemini-provider.test.ts +66 -2
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
- package/src/__tests__/gmail-archive-gate.test.ts +246 -0
- package/src/__tests__/gmail-preferences.test.ts +117 -0
- package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
- package/src/__tests__/headless-browser-interactions.test.ts +738 -359
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +528 -49
- package/src/__tests__/headless-browser-read-tools.test.ts +274 -100
- package/src/__tests__/headless-browser-snapshot.test.ts +250 -77
- package/src/__tests__/heartbeat-service.test.ts +70 -17
- package/src/__tests__/home-state-routes.test.ts +162 -0
- package/src/__tests__/host-bash-proxy.test.ts +145 -1
- package/src/__tests__/host-browser-e2e-cloud.test.ts +596 -0
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
- package/src/__tests__/host-browser-event-routes.test.ts +350 -0
- package/src/__tests__/host-browser-proxy.test.ts +444 -0
- package/src/__tests__/host-browser-routes.test.ts +198 -0
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +423 -0
- package/src/__tests__/host-cu-proxy.test.ts +166 -1
- package/src/__tests__/host-file-proxy.test.ts +185 -1
- package/src/__tests__/host-file-read-tool.test.ts +52 -0
- package/src/__tests__/host-proxy-interface.test.ts +165 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -11
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/integration-status.test.ts +6 -7
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
- package/src/__tests__/llm-context-normalization.test.ts +488 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- package/src/__tests__/mcp-client-auth.test.ts +40 -4
- package/src/__tests__/mcp-health-check.test.ts +10 -3
- package/src/__tests__/media-stream-output.test.ts +555 -0
- package/src/__tests__/media-stream-parser.test.ts +374 -0
- package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
- package/src/__tests__/media-stream-stt-session.test.ts +588 -0
- package/src/__tests__/media-turn-detector.test.ts +440 -0
- package/src/__tests__/message-queue.test.ts +125 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +3 -1
- package/src/__tests__/migration-export-http.test.ts +67 -8
- package/src/__tests__/migration-export-streaming.test.ts +66 -0
- package/src/__tests__/migration-import-commit-http.test.ts +109 -7
- package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +151 -0
- package/src/__tests__/model-intents.test.ts +2 -2
- package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
- package/src/__tests__/oauth-apps-routes.test.ts +18 -12
- package/src/__tests__/oauth-cli.test.ts +709 -60
- package/src/__tests__/oauth-connect-orchestrator.test.ts +118 -24
- package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +147 -10
- package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
- package/src/__tests__/oauth-providers-routes.test.ts +52 -14
- package/src/__tests__/oauth-store.test.ts +1465 -176
- package/src/__tests__/oauth2-gateway-transport.test.ts +460 -26
- package/src/__tests__/onboarding-template-contract.test.ts +81 -70
- package/src/__tests__/openai-provider.test.ts +178 -2
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1105 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
- package/src/__tests__/outlook-categories.test.ts +1 -1
- package/src/__tests__/outlook-client-automation.test.ts +1 -1
- package/src/__tests__/outlook-compose-tools.test.ts +1 -1
- package/src/__tests__/outlook-email-watcher.test.ts +1 -1
- package/src/__tests__/outlook-follow-up.test.ts +1 -1
- package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
- package/src/__tests__/outlook-trash.test.ts +1 -1
- package/src/__tests__/outlook-unsubscribe.test.ts +32 -3
- package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
- package/src/__tests__/permission-mode.test.ts +28 -56
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
- package/src/__tests__/platform-callback-registration.test.ts +19 -0
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +343 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +174 -0
- package/src/__tests__/proxy-approval-callback.test.ts +18 -0
- package/src/__tests__/qdrant-manager.test.ts +29 -8
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
- package/src/__tests__/relationship-state-contract.test.ts +175 -0
- package/src/__tests__/relay-server.test.ts +423 -5
- package/src/__tests__/require-fresh-approval.test.ts +40 -1
- package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
- package/src/__tests__/schedule-routes.test.ts +162 -0
- package/src/__tests__/search-skills-unified.test.ts +118 -0
- package/src/__tests__/secret-detection-handler.test.ts +84 -0
- package/src/__tests__/secret-ingress-http.test.ts +1 -0
- package/src/__tests__/secret-scanner-executor.test.ts +4 -0
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +8 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +49 -0
- package/src/__tests__/set-permission-mode.test.ts +13 -250
- package/src/__tests__/settings-routes.test.ts +201 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +801 -0
- package/src/__tests__/skills-files-catalog-fallback.test.ts +738 -0
- package/src/__tests__/skills.test.ts +5 -2
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +576 -16
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/subagent-detail.test.ts +44 -2
- package/src/__tests__/subagent-disposal.test.ts +1 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
- package/src/__tests__/subagent-manager-notify.test.ts +1 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
- package/src/__tests__/subagent-tools.test.ts +1 -0
- package/src/__tests__/subagent-types.test.ts +1 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
- package/src/__tests__/system-prompt.test.ts +184 -27
- package/src/__tests__/task-scheduler.test.ts +32 -6
- package/src/__tests__/telegram-config.test.ts +10 -13
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +25 -5
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
- package/src/__tests__/tool-approval-handler.test.ts +73 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +33 -24
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
- package/src/__tests__/top-level-renderer.test.ts +73 -1
- package/src/__tests__/transport-hints-queue.test.ts +14 -29
- package/src/__tests__/trust-store.test.ts +7 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
- package/src/__tests__/tts-catalog-parity.test.ts +345 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
- package/src/__tests__/twilio-routes.test.ts +376 -0
- package/src/__tests__/unicode.test.ts +293 -0
- package/src/__tests__/update-bulletin-format.test.ts +59 -0
- package/src/__tests__/update-bulletin.test.ts +206 -5
- package/src/__tests__/usage-routes.test.ts +25 -4
- package/src/__tests__/user-reference.test.ts +46 -61
- package/src/__tests__/v2-consent-policy.test.ts +103 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -0
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- package/src/__tests__/workspace-heartbeat-service.test.ts +7 -0
- package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
- package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +368 -0
- package/src/__tests__/workspace-migration-meets.test.ts +244 -0
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
- package/src/__tests__/workspace-policy.test.ts +2 -0
- package/src/acp/client-handler.ts +30 -4
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +55 -9
- package/src/approvals/guardian-request-resolvers.ts +21 -15
- package/src/backup/__tests__/backup-key.test.ts +152 -0
- package/src/backup/__tests__/backup-worker.test.ts +767 -0
- package/src/backup/__tests__/list-snapshots.test.ts +87 -0
- package/src/backup/__tests__/local-writer.test.ts +218 -0
- package/src/backup/__tests__/offsite-writer.test.ts +641 -0
- package/src/backup/__tests__/paths.test.ts +300 -0
- package/src/backup/__tests__/restore.test.ts +498 -0
- package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
- package/src/backup/__tests__/stream-crypt.test.ts +228 -0
- package/src/backup/backup-key.ts +137 -0
- package/src/backup/backup-worker.ts +459 -0
- package/src/backup/list-snapshots.ts +147 -0
- package/src/backup/local-writer.ts +133 -0
- package/src/backup/offsite-writer.ts +222 -0
- package/src/backup/paths.ts +226 -0
- package/src/backup/restore.ts +322 -0
- package/src/backup/snapshot-lock.ts +431 -0
- package/src/backup/stream-crypt.ts +263 -0
- package/src/browser-session/__tests__/manager.test.ts +297 -0
- package/src/browser-session/backends/cdp-inspect.ts +30 -0
- package/src/browser-session/backends/extension.ts +26 -0
- package/src/browser-session/backends/local.ts +24 -0
- package/src/browser-session/events.ts +164 -0
- package/src/browser-session/index.ts +27 -0
- package/src/browser-session/manager.ts +159 -0
- package/src/browser-session/types.ts +28 -0
- package/src/bundler/package-resolver.ts +4 -0
- package/src/calls/audio-store.ts +11 -5
- package/src/calls/call-controller.ts +226 -71
- package/src/calls/call-domain.ts +9 -0
- package/src/calls/call-speech-output.ts +190 -0
- package/src/calls/call-transport.ts +77 -0
- package/src/calls/media-stream-audio-transcode.ts +173 -0
- package/src/calls/media-stream-output.ts +660 -0
- package/src/calls/media-stream-parser.ts +300 -0
- package/src/calls/media-stream-protocol.ts +166 -0
- package/src/calls/media-stream-server.ts +592 -0
- package/src/calls/media-stream-stt-session.ts +460 -0
- package/src/calls/media-turn-detector.ts +230 -0
- package/src/calls/relay-server.ts +90 -75
- package/src/calls/resolve-call-tts-provider.ts +136 -0
- package/src/calls/telephony-stt-routing.ts +145 -0
- package/src/calls/tts-call-strategy.ts +161 -0
- package/src/calls/tts-text-sanitizer.ts +32 -16
- package/src/calls/twilio-routes.ts +281 -17
- package/src/calls/voice-quality.ts +78 -35
- package/src/calls/voice-session-bridge.ts +8 -1
- package/src/channels/__tests__/types.test.ts +134 -0
- package/src/channels/types.ts +69 -3
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/backup.test.ts +1165 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +234 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
- package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
- package/src/cli/commands/__tests__/email-download.test.ts +16 -1
- package/src/cli/commands/__tests__/email-list.test.ts +22 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +37 -4
- package/src/cli/commands/__tests__/email-status.test.ts +5 -1
- package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
- package/src/cli/commands/backup.ts +993 -0
- package/src/cli/commands/conversations.ts +77 -0
- package/src/cli/commands/credentials.ts +3 -4
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +273 -16
- package/src/cli/commands/mcp.ts +16 -4
- package/src/cli/commands/oauth/__tests__/connect.test.ts +56 -44
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
- package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
- package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +32 -33
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +330 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +117 -12
- package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
- package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
- package/src/cli/commands/oauth/apps.ts +7 -4
- package/src/cli/commands/oauth/connect.ts +6 -3
- package/src/cli/commands/oauth/disconnect.ts +1 -1
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +215 -36
- package/src/cli/commands/oauth/shared.ts +7 -6
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +254 -0
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
- package/src/cli/commands/platform/index.ts +107 -10
- package/src/cli/commands/usage.ts +10 -9
- package/src/cli/lib/daemon-credential-client.ts +4 -0
- package/src/cli/program.ts +30 -4
- package/src/config/__tests__/backup-schema.test.ts +134 -0
- package/src/config/assistant-feature-flags.ts +61 -62
- package/src/config/bundled-skills/app-builder/SKILL.md +26 -249
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +141 -0
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
- package/src/config/bundled-skills/browser/SKILL.md +30 -5
- package/src/config/bundled-skills/browser/TOOLS.json +123 -0
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
- package/src/config/bundled-skills/contacts/SKILL.md +5 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -0
- package/src/config/bundled-skills/gmail/SKILL.md +54 -8
- package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
- package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
- package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
- package/src/config/bundled-skills/outlook/SKILL.md +9 -2
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -18
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
- package/src/config/bundled-skills/slack/SKILL.md +1 -0
- package/src/config/bundled-skills/subagent/SKILL.md +21 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
- package/src/config/bundled-skills/tasks/SKILL.md +5 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
- package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
- package/src/config/bundled-tool-registry.ts +8 -0
- package/src/config/env-registry.ts +38 -0
- package/src/config/env.ts +49 -4
- package/src/config/feature-flag-registry.json +85 -14
- package/src/config/loader.ts +82 -13
- package/src/config/sanitize-for-transfer.ts +47 -0
- package/src/config/schema.ts +81 -15
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +51 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -26
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +47 -7
- package/src/config/schemas/heartbeat.ts +27 -5
- package/src/config/schemas/host-browser.ts +112 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/memory-retrieval.ts +103 -0
- package/src/config/schemas/security.ts +0 -6
- package/src/config/schemas/services.ts +52 -0
- package/src/config/schemas/stt.ts +59 -0
- package/src/config/schemas/tts.ts +230 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/skills.ts +4 -0
- package/src/config/types.ts +4 -1
- package/src/contacts/contact-store.ts +56 -11
- package/src/contacts/contacts-write.ts +38 -1
- package/src/context/post-turn-tool-result-truncation.ts +177 -0
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +61 -10
- package/src/credential-execution/approval-bridge.ts +49 -15
- package/src/credential-execution/executable-discovery.ts +12 -2
- package/src/credential-execution/process-manager.ts +33 -2
- package/src/credential-health/credential-health-service.ts +366 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +195 -0
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- package/src/daemon/app-source-watcher.ts +35 -0
- package/src/daemon/config-watcher.ts +99 -5
- package/src/daemon/context-overflow-approval.ts +5 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +23 -2
- package/src/daemon/conversation-agent-loop.ts +153 -42
- package/src/daemon/conversation-attachments.ts +40 -0
- package/src/daemon/conversation-error.ts +11 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +59 -9
- package/src/daemon/conversation-messaging.ts +37 -3
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +622 -13
- package/src/daemon/conversation-queue-manager.ts +24 -0
- package/src/daemon/conversation-runtime-assembly.ts +128 -36
- package/src/daemon/conversation-slash.ts +36 -0
- package/src/daemon/conversation-surfaces.ts +131 -40
- package/src/daemon/conversation-tool-setup.ts +99 -8
- package/src/daemon/conversation-usage.ts +7 -4
- package/src/daemon/conversation-workspace.ts +12 -0
- package/src/daemon/conversation.ts +292 -16
- package/src/daemon/date-context.ts +10 -10
- package/src/daemon/first-greeting.ts +3 -2
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +13 -141
- package/src/daemon/handlers/shared.ts +80 -0
- package/src/daemon/handlers/skills.ts +483 -44
- package/src/daemon/host-bash-proxy.ts +48 -13
- package/src/daemon/host-browser-proxy.ts +192 -0
- package/src/daemon/host-cu-proxy.ts +36 -11
- package/src/daemon/host-file-proxy.ts +57 -9
- package/src/daemon/lifecycle.ts +179 -28
- package/src/daemon/message-protocol.ts +13 -0
- package/src/daemon/message-types/conversations.ts +89 -14
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/host-browser.ts +100 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +19 -5
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +26 -0
- package/src/daemon/message-types/subagents.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/server.ts +439 -14
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/transport-hints.ts +5 -24
- package/src/email/html-renderer.ts +76 -0
- package/src/heartbeat/heartbeat-service.ts +93 -7
- package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
- package/src/home/__tests__/emit-feed-event.test.ts +169 -0
- package/src/home/__tests__/feed-scheduler.test.ts +194 -0
- package/src/home/__tests__/feed-types.test.ts +275 -0
- package/src/home/__tests__/feed-writer.test.ts +688 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
- package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
- package/src/home/__tests__/progress-formula.test.ts +213 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
- package/src/home/__tests__/rollup-producer.test.ts +398 -0
- package/src/home/assistant-feed-authoring.ts +124 -0
- package/src/home/emit-feed-event.ts +158 -0
- package/src/home/feed-scheduler.ts +247 -0
- package/src/home/feed-types.ts +181 -0
- package/src/home/feed-writer.ts +469 -0
- package/src/home/platform-gmail-digest.ts +163 -0
- package/src/home/progress-formula.ts +86 -0
- package/src/home/relationship-state-writer.ts +824 -0
- package/src/home/relationship-state.ts +143 -0
- package/src/home/rollup-producer.ts +384 -0
- package/src/hooks/runner.ts +7 -0
- package/src/inbound/platform-callback-registration.ts +30 -20
- package/src/inbound/public-ingress-urls.ts +12 -0
- package/src/instrument.ts +1 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
- package/src/ipc/cli-client.ts +151 -0
- package/src/ipc/cli-server.ts +234 -0
- package/src/ipc/gateway-client.ts +180 -0
- package/src/ipc/routes/index.ts +5 -0
- package/src/ipc/routes/wake-conversation.ts +19 -0
- package/src/mcp/client.ts +59 -24
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
- package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +232 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
- package/src/memory/app-store.ts +31 -1
- package/src/memory/attachments-store.ts +70 -0
- package/src/memory/auto-analysis-enqueue.ts +127 -0
- package/src/memory/auto-analysis-guard.ts +27 -0
- package/src/memory/cleanup-schedule-state.ts +37 -0
- package/src/memory/conversation-analyze-job.ts +73 -0
- package/src/memory/conversation-crud.ts +122 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +34 -2
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/conversation-starters-cadence.ts +76 -0
- package/src/memory/conversation-title-service.ts +5 -2
- package/src/memory/db-init.ts +18 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/embedding-backend.test.ts +75 -0
- package/src/memory/embedding-backend.ts +131 -5
- package/src/memory/embedding-gemini.test.ts +54 -0
- package/src/memory/embedding-gemini.ts +20 -9
- package/src/memory/embedding-local.ts +176 -17
- package/src/memory/graph/consolidation.ts +10 -23
- package/src/memory/graph/conversation-graph-memory.ts +15 -0
- package/src/memory/graph/extraction-job.ts +15 -0
- package/src/memory/graph/extraction.test.ts +23 -0
- package/src/memory/graph/extraction.ts +8 -0
- package/src/memory/graph/retriever.ts +67 -40
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- package/src/memory/graph/store.test.ts +7 -3
- package/src/memory/graph/store.ts +47 -12
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/group-crud.ts +6 -1
- package/src/memory/indexer.ts +95 -16
- package/src/memory/job-handlers/cleanup.ts +11 -8
- package/src/memory/job-handlers/conversation-starters.ts +16 -10
- package/src/memory/jobs-store.ts +64 -4
- package/src/memory/jobs-worker.ts +22 -9
- package/src/memory/llm-usage-store.ts +137 -60
- package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
- package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
- package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
- package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
- package/src/memory/migrations/217-conversation-host-access.ts +40 -0
- package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
- package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
- package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
- package/src/memory/migrations/index.ts +12 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/oauth.ts +21 -13
- package/src/memory/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/client.ts +57 -6
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +143 -38
- package/src/messaging/providers/slack/client.ts +16 -0
- package/src/messaging/providers/slack/types.ts +4 -0
- package/src/notifications/decision-engine.ts +3 -3
- package/src/notifications/signal.ts +5 -0
- package/src/oauth/AGENTS.md +76 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +25 -19
- package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
- package/src/oauth/byo-connection.test.ts +26 -9
- package/src/oauth/byo-connection.ts +10 -8
- package/src/oauth/connect-orchestrator.ts +25 -21
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/connection-resolver.test.ts +17 -4
- package/src/oauth/connection-resolver.ts +22 -18
- package/src/oauth/connection.ts +3 -1
- package/src/oauth/manual-token-connection.ts +13 -13
- package/src/oauth/oauth-store.ts +223 -100
- package/src/oauth/platform-connection.test.ts +101 -3
- package/src/oauth/platform-connection.ts +56 -35
- package/src/oauth/provider-serializer.ts +31 -5
- package/src/oauth/revoke.ts +76 -0
- package/src/oauth/seed-providers.ts +133 -87
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +16 -6
- package/src/permissions/defaults.ts +49 -1
- package/src/permissions/permission-mode.ts +4 -11
- package/src/permissions/prompter.ts +13 -1
- package/src/permissions/trust-store.ts +3 -3
- package/src/permissions/v2-consent-policy.ts +87 -0
- package/src/permissions/workspace-policy.ts +3 -0
- package/src/platform/client.test.ts +10 -0
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +126 -2
- package/src/prompts/system-prompt.ts +76 -38
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
- package/src/prompts/templates/BOOTSTRAP.md +59 -105
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/prompts/templates/UPDATES.md +12 -0
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-format.ts +26 -9
- package/src/prompts/update-bulletin.ts +34 -23
- package/src/prompts/user-reference.ts +20 -17
- package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/anthropic/client.ts +157 -60
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +9 -1
- package/src/providers/model-catalog.ts +6 -0
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +474 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +502 -0
- package/src/providers/openrouter/client.ts +101 -4
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/retry.ts +14 -3
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
- package/src/providers/speech-to-text/deepgram.test.ts +332 -0
- package/src/providers/speech-to-text/deepgram.ts +115 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
- package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
- package/src/providers/speech-to-text/google-gemini.ts +101 -0
- package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
- package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
- package/src/providers/speech-to-text/openai-whisper.ts +63 -33
- package/src/providers/speech-to-text/provider-catalog.ts +306 -0
- package/src/providers/speech-to-text/resolve.ts +386 -6
- package/src/providers/types.ts +10 -1
- package/src/runtime/AGENTS.md +65 -0
- package/src/runtime/__tests__/agent-wake.test.ts +831 -0
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
- package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -0
- package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
- package/src/runtime/agent-wake.ts +512 -0
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
- package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
- package/src/runtime/auth/__tests__/route-policy.test.ts +48 -0
- package/src/runtime/auth/middleware.ts +98 -0
- package/src/runtime/auth/route-policy.ts +33 -9
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/capability-tokens.ts +414 -0
- package/src/runtime/channel-approvals.ts +18 -5
- package/src/runtime/channel-invite-transport.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +14 -6
- package/src/runtime/channel-readiness-service.ts +12 -22
- package/src/runtime/chrome-extension-registry.ts +368 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
- package/src/runtime/guardian-decision-types.ts +7 -0
- package/src/runtime/http-server.ts +815 -75
- package/src/runtime/http-types.ts +6 -2
- package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +198 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
- package/src/runtime/migrations/migration-transport.ts +7 -0
- package/src/runtime/migrations/migration-wizard.ts +23 -2
- package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
- package/src/runtime/migrations/vbundle-builder.ts +145 -38
- package/src/runtime/migrations/vbundle-import-analyzer.ts +96 -1
- package/src/runtime/migrations/vbundle-importer.ts +89 -5
- package/src/runtime/pending-interactions.ts +18 -13
- package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +507 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
- package/src/runtime/routes/app-management-routes.ts +12 -18
- package/src/runtime/routes/approval-routes.ts +90 -16
- package/src/runtime/routes/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- package/src/runtime/routes/backup-routes.ts +519 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +556 -0
- package/src/runtime/routes/btw-routes.ts +8 -6
- package/src/runtime/routes/contact-routes.test.ts +298 -0
- package/src/runtime/routes/contact-routes.ts +132 -5
- package/src/runtime/routes/conversation-analysis-routes.ts +22 -141
- package/src/runtime/routes/conversation-management-routes.ts +223 -0
- package/src/runtime/routes/conversation-routes.ts +598 -103
- package/src/runtime/routes/conversation-starter-routes.ts +78 -16
- package/src/runtime/routes/filing-routes.ts +93 -0
- package/src/runtime/routes/guardian-action-routes.ts +24 -13
- package/src/runtime/routes/home-feed-routes.ts +334 -0
- package/src/runtime/routes/home-state-routes.ts +138 -0
- package/src/runtime/routes/host-browser-routes.ts +268 -0
- package/src/runtime/routes/host-file-routes.ts +9 -1
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +262 -33
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +46 -39
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
- package/src/runtime/routes/integrations/slack/channel.ts +11 -3
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +303 -0
- package/src/runtime/routes/log-export-routes.ts +42 -22
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/memory-item-routes.ts +1 -7
- package/src/runtime/routes/migration-routes.ts +122 -2
- package/src/runtime/routes/oauth-apps.ts +15 -17
- package/src/runtime/routes/oauth-providers.ts +4 -0
- package/src/runtime/routes/schedule-routes.ts +24 -11
- package/src/runtime/routes/settings-routes.ts +31 -102
- package/src/runtime/routes/skills-routes.ts +128 -9
- package/src/runtime/routes/stt-routes.ts +233 -0
- package/src/runtime/routes/subagents-routes.ts +14 -10
- package/src/runtime/routes/surface-action-routes.ts +41 -2
- package/src/runtime/routes/tts-routes.ts +108 -24
- package/src/runtime/routes/usage-routes.ts +38 -9
- package/src/runtime/routes/user-route-dispatcher.ts +50 -5
- package/src/runtime/routes/user-routes.ts +13 -1
- package/src/runtime/routes/work-items-routes.ts +8 -1
- package/src/runtime/routes/workspace-routes.test.ts +22 -0
- package/src/runtime/routes/workspace-routes.ts +8 -1
- package/src/runtime/routes/workspace-utils.ts +2 -0
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -0
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
- package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
- package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
- package/src/runtime/services/analyze-conversation.ts +344 -0
- package/src/runtime/services/analyze-deps-singleton.ts +32 -0
- package/src/runtime/services/auto-analysis-prompt.ts +55 -0
- package/src/runtime/skill-route-registry.ts +49 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +57 -5
- package/src/security/ces-credential-client.ts +20 -0
- package/src/security/ces-rpc-credential-backend.ts +17 -0
- package/src/security/credential-backend.ts +5 -0
- package/src/security/oauth2.ts +68 -29
- package/src/security/secure-keys.ts +143 -27
- package/src/security/token-manager.ts +31 -10
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-files.ts +554 -0
- package/src/skills/category-inference.ts +122 -0
- package/src/skills/clawhub-files.ts +213 -0
- package/src/skills/clawhub.ts +84 -23
- package/src/skills/skill-file-provider.ts +40 -0
- package/src/skills/skillssh-files.ts +395 -0
- package/src/skills/skillssh-registry.ts +4 -4
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +392 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +195 -0
- package/src/stt/stt-stream-session.ts +499 -0
- package/src/stt/types.ts +330 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +169 -40
- package/src/subagent/types.ts +19 -0
- package/src/tools/apps/executors.ts +11 -2
- package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
- package/src/tools/browser/auth-detector.ts +43 -12
- package/src/tools/browser/browser-execution.ts +1787 -342
- package/src/tools/browser/browser-manager.ts +81 -12
- package/src/tools/browser/browser-mode-constants.ts +12 -0
- package/src/tools/browser/browser-mode.ts +92 -0
- package/src/tools/browser/browser-status-constants.ts +33 -0
- package/src/tools/browser/cdp-client/__tests__/accessibility-snapshot.test.ts +318 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1263 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +359 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1993 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
- package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
- package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +1007 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +744 -0
- package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +868 -0
- package/src/tools/browser/cdp-client/errors.ts +49 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +148 -0
- package/src/tools/browser/cdp-client/factory.ts +914 -0
- package/src/tools/browser/cdp-client/index.ts +28 -0
- package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
- package/src/tools/browser/cdp-client/types.ts +120 -0
- package/src/tools/credentials/vault.ts +35 -6
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +1 -1
- package/src/tools/host-filesystem/read.ts +12 -15
- package/src/tools/host-filesystem/write.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +21 -16
- package/src/tools/network/web-fetch.ts +5 -2
- package/src/tools/network/web-search.ts +5 -2
- package/src/tools/permission-checker.ts +77 -82
- package/src/tools/registry.ts +0 -2
- package/src/tools/secret-detection-handler.ts +34 -0
- package/src/tools/shared/filesystem/image-read.ts +61 -40
- package/src/tools/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +2 -0
- package/src/tools/skills/sandbox-runner.ts +3 -2
- package/src/tools/subagent/spawn.ts +47 -3
- package/src/tools/subagent/status.ts +2 -0
- package/src/tools/system/register.ts +2 -16
- package/src/tools/terminal/safe-env.ts +15 -0
- package/src/tools/terminal/shell.ts +36 -20
- package/src/tools/tool-approval-handler.ts +48 -2
- package/src/tools/tool-manifest.ts +21 -0
- package/src/tools/types.ts +19 -0
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tts/__tests__/provider-adapters.test.ts +834 -0
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
- package/src/tts/__tests__/provider-catalog.test.ts +183 -0
- package/src/tts/__tests__/provider-registry.test.ts +90 -0
- package/src/tts/provider-catalog.ts +201 -0
- package/src/tts/provider-registry.ts +73 -0
- package/src/tts/providers/deepgram-provider.ts +219 -0
- package/src/tts/providers/elevenlabs-provider.ts +211 -0
- package/src/tts/providers/fish-audio-provider.ts +183 -0
- package/src/tts/providers/index.ts +42 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +153 -0
- package/src/types/onboarding-context.ts +7 -0
- package/src/util/abort-reasons.ts +58 -0
- package/src/util/device-id.ts +32 -16
- package/src/util/errors.ts +9 -1
- package/src/util/platform.ts +63 -24
- package/src/util/pricing.ts +66 -3
- package/src/util/spawn.ts +1 -1
- package/src/util/truncate.ts +4 -2
- package/src/util/unicode.ts +201 -0
- package/src/version.ts +19 -24
- package/src/watcher/engine.ts +23 -0
- package/src/watcher/watcher-store.ts +31 -0
- package/src/workspace/migrations/003-seed-device-id.ts +9 -3
- package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
- package/src/workspace/migrations/029-seed-pkb.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +317 -0
- package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
- package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
- package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
- package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
- package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
- package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
- package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/top-level-renderer.ts +31 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/chrome-cdp.test.ts +0 -419
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- package/src/__tests__/permission-mode-sse.test.ts +0 -418
- package/src/__tests__/permission-mode-store.test.ts +0 -277
- package/src/browser-extension-relay/protocol.ts +0 -63
- package/src/browser-extension-relay/server.ts +0 -203
- package/src/cli/commands/browser-relay.ts +0 -536
- package/src/config/schemas/sandbox.ts +0 -14
- package/src/email/guardrails.ts +0 -221
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -361
- package/src/email/providers/index.ts +0 -65
- package/src/email/service.ts +0 -384
- package/src/email/types.ts +0 -126
- package/src/permissions/permission-mode-store.ts +0 -180
- package/src/prompts/templates/USER.md +0 -13
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/tools/browser/chrome-cdp.ts +0 -239
- package/src/tools/system/set-permission-mode.ts +0 -103
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared PCM16LE-to-WAV utility for STT streaming adapters.
|
|
3
|
+
*
|
|
4
|
+
* Wraps raw PCM16LE audio bytes in a valid 44-byte RIFF/WAVE header so that
|
|
5
|
+
* STT providers that require WAV input (e.g. OpenAI Whisper) can consume
|
|
6
|
+
* audio captured from streaming sessions.
|
|
7
|
+
*
|
|
8
|
+
* This helper is intentionally decoupled from any specific provider adapter
|
|
9
|
+
* so it can be reused across batch and streaming transcription paths.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Format options
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Audio format parameters for the PCM-to-WAV encoder.
|
|
18
|
+
*
|
|
19
|
+
* Adapters pass the hardware sample rate captured during the streaming
|
|
20
|
+
* handshake so the WAV header accurately describes the audio data.
|
|
21
|
+
*/
|
|
22
|
+
export interface WavFormatOptions {
|
|
23
|
+
/** Sample rate in Hz (e.g. 16000, 44100, 48000). Must be positive. */
|
|
24
|
+
sampleRate: number;
|
|
25
|
+
/** Number of audio channels (1 = mono, 2 = stereo). Must be positive. */
|
|
26
|
+
channels: number;
|
|
27
|
+
/**
|
|
28
|
+
* Bits per sample. Defaults to 16 (PCM16LE).
|
|
29
|
+
*
|
|
30
|
+
* Only 8, 16, 24, and 32 are supported — these are the standard PCM bit
|
|
31
|
+
* depths that fit evenly into whole bytes.
|
|
32
|
+
*/
|
|
33
|
+
bitsPerSample?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Validation
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
const SUPPORTED_BIT_DEPTHS = new Set([8, 16, 24, 32]);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Validate format options and throw descriptive errors for invalid
|
|
44
|
+
* configurations. Called internally before encoding.
|
|
45
|
+
*/
|
|
46
|
+
function validateFormatOptions(options: WavFormatOptions): void {
|
|
47
|
+
const { sampleRate, channels, bitsPerSample = 16 } = options;
|
|
48
|
+
|
|
49
|
+
if (!Number.isFinite(sampleRate) || sampleRate <= 0) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
`Invalid sampleRate: ${sampleRate}. Must be a positive finite number.`,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (
|
|
56
|
+
!Number.isFinite(channels) ||
|
|
57
|
+
channels <= 0 ||
|
|
58
|
+
!Number.isInteger(channels)
|
|
59
|
+
) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`Invalid channels: ${channels}. Must be a positive integer.`,
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (!SUPPORTED_BIT_DEPTHS.has(bitsPerSample)) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`Unsupported bitsPerSample: ${bitsPerSample}. ` +
|
|
68
|
+
`Supported values: ${[...SUPPORTED_BIT_DEPTHS].join(", ")}.`,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// WAV header constants
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
|
|
77
|
+
/** Total size of the RIFF/WAVE header for PCM data. */
|
|
78
|
+
const WAV_HEADER_SIZE = 44;
|
|
79
|
+
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Public API
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Wrap raw PCM audio bytes in a valid 44-byte RIFF/WAVE header.
|
|
86
|
+
*
|
|
87
|
+
* @param pcmData - Raw PCM audio data (e.g. PCM16LE samples).
|
|
88
|
+
* @param options - Audio format options describing the PCM data.
|
|
89
|
+
* @returns A `Buffer` containing a complete WAV file (header + PCM payload).
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const wav = encodePcm16LeToWav(rawPcmBuffer, {
|
|
94
|
+
* sampleRate: 16000,
|
|
95
|
+
* channels: 1,
|
|
96
|
+
* });
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export function encodePcm16LeToWav(
|
|
100
|
+
pcmData: Buffer,
|
|
101
|
+
options: WavFormatOptions,
|
|
102
|
+
): Buffer {
|
|
103
|
+
validateFormatOptions(options);
|
|
104
|
+
|
|
105
|
+
const { sampleRate, channels, bitsPerSample = 16 } = options;
|
|
106
|
+
|
|
107
|
+
const bytesPerSample = bitsPerSample / 8;
|
|
108
|
+
const blockAlign = channels * bytesPerSample;
|
|
109
|
+
const byteRate = sampleRate * blockAlign;
|
|
110
|
+
const dataSize = pcmData.length;
|
|
111
|
+
const fileSize = WAV_HEADER_SIZE + dataSize;
|
|
112
|
+
|
|
113
|
+
const buffer = Buffer.alloc(fileSize);
|
|
114
|
+
let offset = 0;
|
|
115
|
+
|
|
116
|
+
// ---- RIFF chunk descriptor ----
|
|
117
|
+
// ChunkID: "RIFF"
|
|
118
|
+
buffer.write("RIFF", offset, "ascii");
|
|
119
|
+
offset += 4;
|
|
120
|
+
|
|
121
|
+
// ChunkSize: file size minus 8 bytes (RIFF header)
|
|
122
|
+
buffer.writeUInt32LE(fileSize - 8, offset);
|
|
123
|
+
offset += 4;
|
|
124
|
+
|
|
125
|
+
// Format: "WAVE"
|
|
126
|
+
buffer.write("WAVE", offset, "ascii");
|
|
127
|
+
offset += 4;
|
|
128
|
+
|
|
129
|
+
// ---- fmt sub-chunk ----
|
|
130
|
+
// Subchunk1ID: "fmt "
|
|
131
|
+
buffer.write("fmt ", offset, "ascii");
|
|
132
|
+
offset += 4;
|
|
133
|
+
|
|
134
|
+
// Subchunk1Size: 16 for PCM
|
|
135
|
+
buffer.writeUInt32LE(16, offset);
|
|
136
|
+
offset += 4;
|
|
137
|
+
|
|
138
|
+
// AudioFormat: 1 = PCM (uncompressed)
|
|
139
|
+
buffer.writeUInt16LE(1, offset);
|
|
140
|
+
offset += 2;
|
|
141
|
+
|
|
142
|
+
// NumChannels
|
|
143
|
+
buffer.writeUInt16LE(channels, offset);
|
|
144
|
+
offset += 2;
|
|
145
|
+
|
|
146
|
+
// SampleRate
|
|
147
|
+
buffer.writeUInt32LE(sampleRate, offset);
|
|
148
|
+
offset += 4;
|
|
149
|
+
|
|
150
|
+
// ByteRate = SampleRate * NumChannels * BitsPerSample / 8
|
|
151
|
+
buffer.writeUInt32LE(byteRate, offset);
|
|
152
|
+
offset += 4;
|
|
153
|
+
|
|
154
|
+
// BlockAlign = NumChannels * BitsPerSample / 8
|
|
155
|
+
buffer.writeUInt16LE(blockAlign, offset);
|
|
156
|
+
offset += 2;
|
|
157
|
+
|
|
158
|
+
// BitsPerSample
|
|
159
|
+
buffer.writeUInt16LE(bitsPerSample, offset);
|
|
160
|
+
offset += 2;
|
|
161
|
+
|
|
162
|
+
// ---- data sub-chunk ----
|
|
163
|
+
// Subchunk2ID: "data"
|
|
164
|
+
buffer.write("data", offset, "ascii");
|
|
165
|
+
offset += 4;
|
|
166
|
+
|
|
167
|
+
// Subchunk2Size: size of the raw audio data
|
|
168
|
+
buffer.writeUInt32LE(dataSize, offset);
|
|
169
|
+
offset += 4;
|
|
170
|
+
|
|
171
|
+
// ---- PCM payload ----
|
|
172
|
+
pcmData.copy(buffer, offset);
|
|
173
|
+
|
|
174
|
+
return buffer;
|
|
175
|
+
}
|
package/src/subagent/manager.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
|
19
19
|
import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
|
|
20
20
|
import { RateLimitProvider } from "../providers/ratelimit.js";
|
|
21
21
|
import { getProvider } from "../providers/registry.js";
|
|
22
|
+
import { createAbortReason } from "../util/abort-reasons.js";
|
|
22
23
|
import { getLogger } from "../util/logger.js";
|
|
23
24
|
import { getSandboxWorkingDir } from "../util/platform.js";
|
|
24
25
|
import {
|
|
@@ -88,13 +89,19 @@ interface ManagedSubagent {
|
|
|
88
89
|
/** Epoch ms after which this terminal entry can be removed by the TTL sweep. */
|
|
89
90
|
retainedUntil?: number;
|
|
90
91
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
92
|
+
* Sticky monotonic flag: set to true when sendMessage enqueues a follow-up
|
|
93
|
+
* message while a run is in progress, and never cleared. Needed because the
|
|
94
|
+
* drain dispatch is racy against the observation window around runAgentLoop's
|
|
95
|
+
* `finally`: drainQueue is async — it awaits buildPassthroughBatch (which
|
|
96
|
+
* awaits resolveSlash) before shifting anything — and runAgentLoop fires it
|
|
97
|
+
* without awaiting. So between the moment `finally` schedules drainQueue and
|
|
98
|
+
* the moment a queued item is actually dispatched by drainBatch /
|
|
99
|
+
* drainSingleMessage, `hasQueuedMessages()` and `isProcessing()` can each
|
|
100
|
+
* flip in either direction (queue empties mid-await, or `processing` flips
|
|
101
|
+
* false while items are still pending). Checking this sticky flag lets the
|
|
102
|
+
* finally block in runSubagent reason about "any queued work existed for
|
|
103
|
+
* this subagent during the run" without racing drain dispatch, and defer
|
|
104
|
+
* the release to the TTL sweep rather than tearing down mid-drain.
|
|
98
105
|
*/
|
|
99
106
|
hadEnqueuedMessages?: boolean;
|
|
100
107
|
}
|
|
@@ -142,6 +149,14 @@ export class SubagentManager {
|
|
|
142
149
|
*/
|
|
143
150
|
broadcastToAllClients?: (msg: ServerMessage) => void;
|
|
144
151
|
|
|
152
|
+
/**
|
|
153
|
+
* Resolve a live parent Conversation by conversationId.
|
|
154
|
+
* Wired by DaemonServer at startup — follows the same pattern as
|
|
155
|
+
* `onSubagentFinished`. Used by fork spawn to resolve the parent's
|
|
156
|
+
* system prompt when `config.parentSystemPrompt` is not provided.
|
|
157
|
+
*/
|
|
158
|
+
resolveParentConversation?: (conversationId: string) => Conversation | undefined;
|
|
159
|
+
|
|
145
160
|
// ── Spawn ───────────────────────────────────────────────────────────
|
|
146
161
|
|
|
147
162
|
/**
|
|
@@ -165,7 +180,19 @@ export class SubagentManager {
|
|
|
165
180
|
}
|
|
166
181
|
|
|
167
182
|
// ── Resolve role ─────────────────────────────────────────────────
|
|
168
|
-
const
|
|
183
|
+
const isFork = config.fork === true;
|
|
184
|
+
let role: SubagentRole = (config.role as SubagentRole) ?? "general";
|
|
185
|
+
if (isFork && role !== "general") {
|
|
186
|
+
log.warn(
|
|
187
|
+
{
|
|
188
|
+
requestedRole: role,
|
|
189
|
+
parentConversationId: config.parentConversationId,
|
|
190
|
+
label: config.label,
|
|
191
|
+
},
|
|
192
|
+
"Fork requested with non-general role — forcing general to preserve KV cache alignment",
|
|
193
|
+
);
|
|
194
|
+
role = "general";
|
|
195
|
+
}
|
|
169
196
|
if (!SUBAGENT_ROLE_REGISTRY[role]) {
|
|
170
197
|
throw new Error(
|
|
171
198
|
`Invalid subagent role "${config.role}". Must be one of: ${Object.keys(SUBAGENT_ROLE_REGISTRY).join(", ")}`,
|
|
@@ -194,24 +221,58 @@ export class SubagentManager {
|
|
|
194
221
|
);
|
|
195
222
|
}
|
|
196
223
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
224
|
+
let systemPrompt: string;
|
|
225
|
+
if (isFork) {
|
|
226
|
+
// Forks use the parent's system prompt directly — no subagent preamble.
|
|
227
|
+
if (config.parentSystemPrompt) {
|
|
228
|
+
systemPrompt = config.parentSystemPrompt;
|
|
229
|
+
} else if (this.resolveParentConversation) {
|
|
230
|
+
const parentConv = this.resolveParentConversation(config.parentConversationId);
|
|
231
|
+
const resolved = parentConv?.getCurrentSystemPrompt();
|
|
232
|
+
if (!resolved) {
|
|
233
|
+
throw new Error(
|
|
234
|
+
"Fork spawn requires a parent system prompt but neither config.parentSystemPrompt " +
|
|
235
|
+
"nor resolveParentConversation yielded one.",
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
systemPrompt = resolved;
|
|
239
|
+
} else {
|
|
240
|
+
throw new Error(
|
|
241
|
+
"Fork spawn requires a parent system prompt but neither config.parentSystemPrompt " +
|
|
242
|
+
"is set nor resolveParentConversation callback is wired.",
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
systemPrompt =
|
|
247
|
+
config.systemPromptOverride ??
|
|
248
|
+
buildSubagentSystemPrompt({ ...config, id: subagentId }, role);
|
|
249
|
+
}
|
|
200
250
|
const maxTokens = appConfig.maxTokens;
|
|
201
251
|
const workingDir = getSandboxWorkingDir();
|
|
202
252
|
|
|
203
|
-
const memoryPolicy: ConversationMemoryPolicy =
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
253
|
+
const memoryPolicy: ConversationMemoryPolicy = isFork
|
|
254
|
+
? {
|
|
255
|
+
scopeId: "default",
|
|
256
|
+
includeDefaultFallback: false,
|
|
257
|
+
strictSideEffects: false,
|
|
258
|
+
}
|
|
259
|
+
: {
|
|
260
|
+
scopeId: `subagent:${subagentId}`,
|
|
261
|
+
includeDefaultFallback: true,
|
|
262
|
+
strictSideEffects: false,
|
|
263
|
+
};
|
|
208
264
|
|
|
209
265
|
// ── Initialise state ────────────────────────────────────────────
|
|
210
266
|
const now = Date.now();
|
|
267
|
+
// For forks, default sendResultToUser to false (silent) unless explicitly true.
|
|
268
|
+
const resolvedSendResultToUser = isFork
|
|
269
|
+
? (config.sendResultToUser === true ? true : false)
|
|
270
|
+
: config.sendResultToUser;
|
|
211
271
|
const state: SubagentState = {
|
|
212
|
-
config: { ...config, id: subagentId },
|
|
272
|
+
config: { ...config, id: subagentId, sendResultToUser: resolvedSendResultToUser },
|
|
213
273
|
status: "pending",
|
|
214
274
|
conversationId: conversationRecord.id,
|
|
275
|
+
isFork,
|
|
215
276
|
createdAt: now,
|
|
216
277
|
usage: { inputTokens: 0, outputTokens: 0, estimatedCost: 0 },
|
|
217
278
|
};
|
|
@@ -255,8 +316,16 @@ export class SubagentManager {
|
|
|
255
316
|
conversation.updateClient(wrappedSendToClient, true);
|
|
256
317
|
conversation.setIsSubagent(true);
|
|
257
318
|
|
|
319
|
+
if (isFork) {
|
|
320
|
+
// Force the fork to use the parent's system prompt as-is without dynamic rebuild.
|
|
321
|
+
// This ensures KV cache alignment with the parent conversation.
|
|
322
|
+
conversation.hasSystemPromptOverride = true;
|
|
323
|
+
}
|
|
324
|
+
|
|
258
325
|
// Apply role-based tool filter if the role defines one.
|
|
259
|
-
|
|
326
|
+
// Skip for forks — general role has allowedTools: undefined, and forks
|
|
327
|
+
// should have the same tool access as the parent.
|
|
328
|
+
if (!isFork && roleConfig.allowedTools) {
|
|
260
329
|
conversation.setSubagentAllowedTools(new Set(roleConfig.allowedTools));
|
|
261
330
|
}
|
|
262
331
|
|
|
@@ -298,6 +367,7 @@ export class SubagentManager {
|
|
|
298
367
|
parentConversationId: config.parentConversationId,
|
|
299
368
|
label: config.label,
|
|
300
369
|
objective: config.objective,
|
|
370
|
+
isFork: config.fork ?? false,
|
|
301
371
|
} as ServerMessage);
|
|
302
372
|
|
|
303
373
|
log.info(
|
|
@@ -339,9 +409,37 @@ export class SubagentManager {
|
|
|
339
409
|
const onEvent = conversation.sendToClient;
|
|
340
410
|
|
|
341
411
|
try {
|
|
412
|
+
// For forks, inject the parent's message history before the first message.
|
|
413
|
+
// This prepends the inherited context so the fork has full conversational
|
|
414
|
+
// awareness while the objective becomes the latest user turn.
|
|
415
|
+
if (managed.state.isFork && managed.state.config.parentMessages) {
|
|
416
|
+
conversation.injectInheritedContext(managed.state.config.parentMessages);
|
|
417
|
+
// Release the parent message arrays now that they've been injected — holding
|
|
418
|
+
// them in SubagentState.config would retain significant memory until the TTL
|
|
419
|
+
// sweep disposes this entry (up to 30 minutes for terminal subagents).
|
|
420
|
+
managed.state.config.parentMessages = undefined;
|
|
421
|
+
managed.state.config.parentSystemPrompt = undefined;
|
|
422
|
+
}
|
|
423
|
+
|
|
342
424
|
// Send the objective as the first user message and process it.
|
|
343
|
-
|
|
344
|
-
|
|
425
|
+
// For forks, wrap the objective in directive framing so it overrides
|
|
426
|
+
// conversational momentum from the inherited context. Without this,
|
|
427
|
+
// the fork tends to continue the parent conversation instead of
|
|
428
|
+
// pivoting to the task — the inherited context is louder than a bare
|
|
429
|
+
// objective buried after 100k+ tokens of chat history.
|
|
430
|
+
const message = managed.state.isFork
|
|
431
|
+
? [
|
|
432
|
+
"⎯⎯⎯ FORK TASK ⎯⎯⎯",
|
|
433
|
+
"You have been forked from the parent conversation to execute a specific task.",
|
|
434
|
+
"The conversation above is context — do NOT continue it. Do NOT spawn sub-agents.",
|
|
435
|
+
"Complete this task directly and return only your findings:",
|
|
436
|
+
"",
|
|
437
|
+
objective,
|
|
438
|
+
"⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯",
|
|
439
|
+
].join("\n")
|
|
440
|
+
: objective;
|
|
441
|
+
const messageId = await conversation.persistUserMessage(message, []);
|
|
442
|
+
await conversation.runAgentLoop(message, messageId, onEvent);
|
|
345
443
|
|
|
346
444
|
// Agent loop completed successfully.
|
|
347
445
|
// Copy usage stats from the conversation before sending status (which includes usage).
|
|
@@ -373,11 +471,16 @@ export class SubagentManager {
|
|
|
373
471
|
log.error({ subagentId, err }, "Subagent failed");
|
|
374
472
|
} finally {
|
|
375
473
|
// Release the heavyweight Conversation — output is already persisted in DB.
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
//
|
|
474
|
+
// drainQueue is async: it awaits buildPassthroughBatch (which awaits
|
|
475
|
+
// resolveSlash) before shifting anything, and runAgentLoop fires it
|
|
476
|
+
// without awaiting. That means by the time this finally runs, a drain
|
|
477
|
+
// may already be scheduled but not yet dispatched — so checking
|
|
478
|
+
// hasQueuedMessages() / isProcessing() here races the dispatch and can
|
|
479
|
+
// observe an empty queue (or `processing === false`) while queued work
|
|
480
|
+
// is still pending. The hadEnqueuedMessages flag (set in sendMessage)
|
|
481
|
+
// is a sticky monotonic marker that any queued work existed during this
|
|
482
|
+
// run, letting us defer the release to the TTL sweep rather than
|
|
483
|
+
// tearing down mid-drain.
|
|
381
484
|
if (managed.hadEnqueuedMessages) {
|
|
382
485
|
log.debug(
|
|
383
486
|
{ subagentId },
|
|
@@ -418,7 +521,13 @@ export class SubagentManager {
|
|
|
418
521
|
return false;
|
|
419
522
|
}
|
|
420
523
|
|
|
421
|
-
managed.conversation?.abort(
|
|
524
|
+
managed.conversation?.abort(
|
|
525
|
+
createAbortReason(
|
|
526
|
+
"subagent_aborted",
|
|
527
|
+
"SubagentManager.abort",
|
|
528
|
+
managed.conversation.conversationId,
|
|
529
|
+
),
|
|
530
|
+
);
|
|
422
531
|
managed.state.completedAt = Date.now();
|
|
423
532
|
if (parentSendToClient) {
|
|
424
533
|
// Route the status update through the stored parent sender so the
|
|
@@ -431,9 +540,10 @@ export class SubagentManager {
|
|
|
431
540
|
// Skip when the parent LLM itself called subagent_abort (it already has the tool result).
|
|
432
541
|
if (this.onSubagentFinished && !options?.suppressNotification) {
|
|
433
542
|
const label = managed.state.config.label;
|
|
543
|
+
const prefix = managed.state.isFork ? "Fork" : "Subagent";
|
|
434
544
|
const message =
|
|
435
|
-
`[
|
|
436
|
-
`This
|
|
545
|
+
`[${prefix} "${label}" was explicitly aborted]\n\n` +
|
|
546
|
+
`This ${prefix.toLowerCase()} was cancelled on purpose. Do NOT re-spawn or retry it.`;
|
|
437
547
|
try {
|
|
438
548
|
// Use the managed subagent's stored parentSendToClient so the
|
|
439
549
|
// notification routes to the parent conversation's socket, not the
|
|
@@ -612,7 +722,13 @@ export class SubagentManager {
|
|
|
612
722
|
|
|
613
723
|
if (managed.conversation) {
|
|
614
724
|
if (!TERMINAL_STATUSES.has(managed.state.status)) {
|
|
615
|
-
managed.conversation.abort(
|
|
725
|
+
managed.conversation.abort(
|
|
726
|
+
createAbortReason(
|
|
727
|
+
"subagent_aborted",
|
|
728
|
+
"SubagentManager.dispose",
|
|
729
|
+
managed.conversation.conversationId,
|
|
730
|
+
),
|
|
731
|
+
);
|
|
616
732
|
}
|
|
617
733
|
managed.conversation.dispose();
|
|
618
734
|
managed.conversation = null;
|
|
@@ -781,10 +897,11 @@ export class SubagentManager {
|
|
|
781
897
|
if (!managed || TERMINAL_STATUSES.has(managed.state.status)) return false;
|
|
782
898
|
if (!this.onSubagentFinished) return false;
|
|
783
899
|
|
|
784
|
-
|
|
900
|
+
const prefix = managed.state.isFork ? "Fork" : "Subagent";
|
|
901
|
+
let notificationString = `[${prefix} "${info.label}" — ${urgency}] ${message}`;
|
|
785
902
|
if (urgency === "blocked") {
|
|
786
903
|
notificationString +=
|
|
787
|
-
|
|
904
|
+
`\nUse subagent_message to send guidance to this ${prefix.toLowerCase()}.`;
|
|
788
905
|
}
|
|
789
906
|
|
|
790
907
|
try {
|
|
@@ -820,22 +937,34 @@ export class SubagentManager {
|
|
|
820
937
|
if (!this.onSubagentFinished) return;
|
|
821
938
|
|
|
822
939
|
const { config } = managed.state;
|
|
940
|
+
const isFork = managed.state.isFork;
|
|
823
941
|
let message: string;
|
|
824
942
|
|
|
825
943
|
if (outcome === "completed") {
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
944
|
+
if (isFork) {
|
|
945
|
+
const silent = config.sendResultToUser !== true;
|
|
946
|
+
message =
|
|
947
|
+
`[Fork "${config.label}" completed]\n\n` +
|
|
948
|
+
`Use subagent_read with subagent_id "${config.id}" and last_n: 1 to retrieve the final synthesis.\n` +
|
|
949
|
+
(silent
|
|
950
|
+
? `This fork was spawned for internal processing. Process the findings internally — do NOT share raw fork output with the user.`
|
|
951
|
+
: `Do NOT re-spawn this fork — just read and share the results.`);
|
|
952
|
+
} else {
|
|
953
|
+
const silent = config.sendResultToUser === false;
|
|
954
|
+
message =
|
|
955
|
+
`[Subagent "${config.label}" completed]\n\n` +
|
|
956
|
+
`Use subagent_read with subagent_id "${config.id}" to retrieve the full output.\n` +
|
|
957
|
+
(silent
|
|
958
|
+
? `This subagent was spawned for internal processing. Read the result for your own use but do NOT share it with the user.\nDo NOT re-spawn this subagent.`
|
|
959
|
+
: `Do NOT re-spawn this subagent — just read and share the results.`);
|
|
960
|
+
}
|
|
833
961
|
} else {
|
|
834
962
|
const error = managed.state.error ?? "Unknown error";
|
|
963
|
+
const prefix = isFork ? "Fork" : "Subagent";
|
|
835
964
|
message =
|
|
836
|
-
`[
|
|
965
|
+
`[${prefix} "${config.label}" failed]\n\n` +
|
|
837
966
|
`Error: ${error}\n` +
|
|
838
|
-
`Do NOT re-spawn or retry this
|
|
967
|
+
`Do NOT re-spawn or retry this ${prefix.toLowerCase()} unless the user explicitly asks.`;
|
|
839
968
|
}
|
|
840
969
|
|
|
841
970
|
const notification: SubagentNotificationInfo = {
|
package/src/subagent/types.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { UsageStats } from "../daemon/message-protocol.js";
|
|
10
|
+
import type { Message } from "../providers/types.js";
|
|
10
11
|
|
|
11
12
|
// ── Status ──────────────────────────────────────────────────────────────
|
|
12
13
|
|
|
@@ -43,6 +44,22 @@ export interface SubagentConfig {
|
|
|
43
44
|
sendResultToUser?: boolean;
|
|
44
45
|
/** Optional role for the subagent. Defaults handled by consumers. */
|
|
45
46
|
role?: SubagentRole;
|
|
47
|
+
/**
|
|
48
|
+
* When true, the sub-agent inherits the parent's full context instead of
|
|
49
|
+
* receiving only the objective + context fields.
|
|
50
|
+
*/
|
|
51
|
+
fork?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* The parent conversation's in-memory message history at fork time.
|
|
54
|
+
* Only set when `fork: true`.
|
|
55
|
+
*/
|
|
56
|
+
parentMessages?: Message[];
|
|
57
|
+
/**
|
|
58
|
+
* The parent's current resolved system prompt. Only set when `fork: true`.
|
|
59
|
+
* Distinct from `systemPromptOverride` which replaces the subagent-built prompt;
|
|
60
|
+
* for forks, this IS the system prompt (no subagent preamble is built).
|
|
61
|
+
*/
|
|
62
|
+
parentSystemPrompt?: string;
|
|
46
63
|
}
|
|
47
64
|
|
|
48
65
|
// ── State (runtime) ─────────────────────────────────────────────────────
|
|
@@ -52,6 +69,8 @@ export interface SubagentState {
|
|
|
52
69
|
status: SubagentStatus;
|
|
53
70
|
/** The subagent's own conversationId (different from parentConversationId). */
|
|
54
71
|
conversationId: string;
|
|
72
|
+
/** Whether this sub-agent is a fork (inherits parent context). Defaults to `false`. */
|
|
73
|
+
isFork: boolean;
|
|
55
74
|
/** Error message if status is 'failed'. */
|
|
56
75
|
error?: string;
|
|
57
76
|
/** Timestamps (epoch ms). */
|
|
@@ -32,6 +32,7 @@ export interface ExecutorResult {
|
|
|
32
32
|
export interface AppStoreReader {
|
|
33
33
|
getApp(id: string): AppDefinition | null;
|
|
34
34
|
listApps(): AppDefinition[];
|
|
35
|
+
appFileExists(appId: string, path: string): boolean;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
export interface AppStoreWriter {
|
|
@@ -183,8 +184,16 @@ function App() {
|
|
|
183
184
|
render(<App />, document.getElementById('app')!);
|
|
184
185
|
`;
|
|
185
186
|
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
// Only write scaffold files when they don't already exist on disk.
|
|
188
|
+
// The LLM may have written custom source files via file_write before
|
|
189
|
+
// calling app_create, and overwriting them would destroy the real app
|
|
190
|
+
// content, leaving only the scaffold placeholder.
|
|
191
|
+
if (!store.appFileExists(app.id, "src/index.html")) {
|
|
192
|
+
store.writeAppFile(app.id, "src/index.html", indexHtml);
|
|
193
|
+
}
|
|
194
|
+
if (!store.appFileExists(app.id, "src/main.tsx")) {
|
|
195
|
+
store.writeAppFile(app.id, "src/main.tsx", mainTsx);
|
|
196
|
+
}
|
|
188
197
|
|
|
189
198
|
// Compile src/ → dist/
|
|
190
199
|
const appDir = getAppDirPath(app.id);
|