@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
package/src/daemon/server.ts
CHANGED
|
@@ -27,6 +27,7 @@ import type { CesProcessManager } from "../credential-execution/process-manager.
|
|
|
27
27
|
import type { FilingService } from "../filing/filing-service.js";
|
|
28
28
|
import type { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
29
29
|
import { CliIpcServer } from "../ipc/cli-server.js";
|
|
30
|
+
import { registerBrowserIpcContextResolver } from "../ipc/routes/browser-context.js";
|
|
30
31
|
import { getApp, getAppDirPath, isMultifileApp } from "../memory/app-store.js";
|
|
31
32
|
import * as attachmentsStore from "../memory/attachments-store.js";
|
|
32
33
|
import {
|
|
@@ -49,6 +50,7 @@ import {
|
|
|
49
50
|
import { getOrCreateConversation } from "../memory/conversation-key-store.js";
|
|
50
51
|
import { syncIdentityNameToPlatform } from "../platform/sync-identity.js";
|
|
51
52
|
import { buildSystemPrompt } from "../prompts/system-prompt.js";
|
|
53
|
+
import { CallSiteRoutingProvider } from "../providers/call-site-routing.js";
|
|
52
54
|
import { RateLimitProvider } from "../providers/ratelimit.js";
|
|
53
55
|
import { getProvider, initializeProviders } from "../providers/registry.js";
|
|
54
56
|
import {
|
|
@@ -60,6 +62,7 @@ import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
|
60
62
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
61
63
|
import { getSigningKeyFingerprint } from "../runtime/auth/token-service.js";
|
|
62
64
|
import { bridgeConfirmationRequestToGuardian } from "../runtime/confirmation-request-guardian-bridge.js";
|
|
65
|
+
import { registerInteractiveUiResolver } from "../runtime/interactive-ui.js";
|
|
63
66
|
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
64
67
|
import { checkIngressForSecrets } from "../security/secret-ingress.js";
|
|
65
68
|
import { redactSecrets } from "../security/secret-scanner.js";
|
|
@@ -90,10 +93,14 @@ import {
|
|
|
90
93
|
} from "./conversation.js";
|
|
91
94
|
import { ConversationEvictor } from "./conversation-evictor.js";
|
|
92
95
|
import { registerLaunchConversationDeps } from "./conversation-launch.js";
|
|
96
|
+
import { buildSlackMetaForPersistence } from "./conversation-messaging.js";
|
|
93
97
|
import { formatCompactResult } from "./conversation-process.js";
|
|
94
98
|
import { resolveChannelCapabilities } from "./conversation-runtime-assembly.js";
|
|
95
99
|
import { resolveSlash, type SlashContext } from "./conversation-slash.js";
|
|
96
|
-
import {
|
|
100
|
+
import {
|
|
101
|
+
refreshSurfacesForApp,
|
|
102
|
+
showStandaloneSurface,
|
|
103
|
+
} from "./conversation-surfaces.js";
|
|
97
104
|
import { undoLastMessage } from "./handlers/conversations.js";
|
|
98
105
|
import { parseIdentityFields } from "./handlers/identity.js";
|
|
99
106
|
import type {
|
|
@@ -813,6 +820,11 @@ export class DaemonServer {
|
|
|
813
820
|
// DB, exposing only the narrow surface the wake helper needs.
|
|
814
821
|
registerDefaultWakeResolver(async (conversationId) => {
|
|
815
822
|
try {
|
|
823
|
+
// Only resolve existing conversations — don't create ghost
|
|
824
|
+
// conversations for stale targets (e.g. meetings that ended
|
|
825
|
+
// but a delayed opportunity callback still fires).
|
|
826
|
+
const existing = getConversation(conversationId);
|
|
827
|
+
if (!existing) return null;
|
|
816
828
|
const conversation = await this.getOrCreateConversation(conversationId);
|
|
817
829
|
return conversationToWakeTarget(conversation);
|
|
818
830
|
} catch (err) {
|
|
@@ -824,6 +836,60 @@ export class DaemonServer {
|
|
|
824
836
|
}
|
|
825
837
|
});
|
|
826
838
|
|
|
839
|
+
// Install the interactive UI resolver so skills and IPC handlers can
|
|
840
|
+
// present ad-hoc UI surfaces (confirmations, forms) to the user via
|
|
841
|
+
// `requestInteractiveUi()`. Interactive UI requires a client to be
|
|
842
|
+
// actively connected to the conversation (via SSE), which means the
|
|
843
|
+
// conversation must be in the in-memory map. If the conversation was
|
|
844
|
+
// evicted from memory the client is definitely disconnected, so
|
|
845
|
+
// hydration from persistent storage is pointless — the hydrated
|
|
846
|
+
// conversation would have hasNoClient=true, causing
|
|
847
|
+
// canShowInteractiveUi() to return false and the surface to be
|
|
848
|
+
// cancelled with no_interactive_surface. We skip that wasted work
|
|
849
|
+
// and return conversation_not_found directly.
|
|
850
|
+
registerInteractiveUiResolver(async (request) => {
|
|
851
|
+
const conversation = this.conversations.get(request.conversationId);
|
|
852
|
+
|
|
853
|
+
if (!conversation) {
|
|
854
|
+
log.warn(
|
|
855
|
+
{
|
|
856
|
+
conversationId: request.conversationId,
|
|
857
|
+
surfaceType: request.surfaceType,
|
|
858
|
+
},
|
|
859
|
+
"interactive-ui resolver: conversation not in memory (client not connected); failing closed",
|
|
860
|
+
);
|
|
861
|
+
return {
|
|
862
|
+
status: "cancelled" as const,
|
|
863
|
+
surfaceId: `ui-resolver-${Date.now()}`,
|
|
864
|
+
cancellationReason: "conversation_not_found" as const,
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
// Generate a unique surface ID and delegate to the conversation's
|
|
869
|
+
// standalone surface lifecycle. The returned Promise blocks until
|
|
870
|
+
// the user submits, cancels, or the timeout elapses.
|
|
871
|
+
const surfaceId = `ui-standalone-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
872
|
+
return showStandaloneSurface(conversation, request, surfaceId);
|
|
873
|
+
});
|
|
874
|
+
|
|
875
|
+
// Allow `browser_execute` IPC calls to reuse live conversation browser
|
|
876
|
+
// proxy wiring (when a caller passes a conversationId from
|
|
877
|
+
// __CONVERSATION_ID / __SKILL_CONTEXT_JSON). This keeps nested
|
|
878
|
+
// `assistant browser status` checks consistent with the parent turn's
|
|
879
|
+
// extension connectivity instead of always falling back to a synthetic
|
|
880
|
+
// browser-cli session that has no hostBrowserProxy.
|
|
881
|
+
registerBrowserIpcContextResolver((conversationId) => {
|
|
882
|
+
const conversation = this.conversations.get(conversationId);
|
|
883
|
+
if (!conversation) return null;
|
|
884
|
+
return {
|
|
885
|
+
conversationId,
|
|
886
|
+
trustClass: conversation.trustContext?.trustClass ?? "guardian",
|
|
887
|
+
hostBrowserProxy: conversation.hostBrowserProxy,
|
|
888
|
+
transportInterface: conversation.transportInterface,
|
|
889
|
+
hostBrowserRegistryRouted: !!conversation.hostBrowserSenderOverride,
|
|
890
|
+
};
|
|
891
|
+
});
|
|
892
|
+
|
|
827
893
|
// Start the CLI IPC server. Built-in methods (wake_conversation) are
|
|
828
894
|
// registered by the constructor; CLI commands connect to this socket to
|
|
829
895
|
// invoke daemon-side operations that require in-process state.
|
|
@@ -1033,7 +1099,19 @@ export class DaemonServer {
|
|
|
1033
1099
|
|
|
1034
1100
|
const createPromise = (async () => {
|
|
1035
1101
|
const config = getConfig();
|
|
1036
|
-
let provider = getProvider(config.
|
|
1102
|
+
let provider = getProvider(config.llm.default.provider);
|
|
1103
|
+
// Per-call `options.config.callSite` can resolve to a provider name
|
|
1104
|
+
// that differs from `llm.default.provider`. Wrap the default
|
|
1105
|
+
// provider so the actual transport routes correctly per call,
|
|
1106
|
+
// rather than only forwarding metadata to the default's HTTP
|
|
1107
|
+
// client. See `providers/call-site-routing.ts`.
|
|
1108
|
+
provider = new CallSiteRoutingProvider(provider, (name) => {
|
|
1109
|
+
try {
|
|
1110
|
+
return getProvider(name);
|
|
1111
|
+
} catch {
|
|
1112
|
+
return undefined;
|
|
1113
|
+
}
|
|
1114
|
+
});
|
|
1037
1115
|
const { rateLimit } = config;
|
|
1038
1116
|
if (rateLimit.maxRequestsPerMinute > 0) {
|
|
1039
1117
|
provider = new RateLimitProvider(
|
|
@@ -1046,7 +1124,8 @@ export class DaemonServer {
|
|
|
1046
1124
|
|
|
1047
1125
|
const systemPrompt =
|
|
1048
1126
|
storedOptions?.systemPromptOverride ?? buildSystemPrompt();
|
|
1049
|
-
const maxTokens =
|
|
1127
|
+
const maxTokens =
|
|
1128
|
+
storedOptions?.maxResponseTokens ?? config.llm.default.maxTokens;
|
|
1050
1129
|
|
|
1051
1130
|
const memoryPolicy = this.deriveMemoryPolicy(conversationId);
|
|
1052
1131
|
// Resolve the shared CES client (may still be initializing).
|
|
@@ -1065,7 +1144,6 @@ export class DaemonServer {
|
|
|
1065
1144
|
sharedCesClient,
|
|
1066
1145
|
storedOptions?.speed,
|
|
1067
1146
|
undefined,
|
|
1068
|
-
storedOptions?.modelIntent,
|
|
1069
1147
|
storedOptions?.modelOverride,
|
|
1070
1148
|
);
|
|
1071
1149
|
newConversation.updateClient(sendToClient, true);
|
|
@@ -1225,9 +1303,10 @@ export class DaemonServer {
|
|
|
1225
1303
|
// Chrome-extension host_browser wiring is intentionally not supported
|
|
1226
1304
|
// through this entry point. `prepareConversationForMessage` constructs
|
|
1227
1305
|
// host_browser proxies that capture `conversation.getCurrentSender()`
|
|
1228
|
-
// directly, which
|
|
1229
|
-
//
|
|
1230
|
-
//
|
|
1306
|
+
// directly, which routes browser frames through the daemon SSE channel.
|
|
1307
|
+
// This is correct for macOS (SSE-based host proxy), but chrome-extension
|
|
1308
|
+
// requires the `ChromeExtensionRegistry` WebSocket transport instead.
|
|
1309
|
+
// Chrome-extension flows reach host_browser exclusively through the
|
|
1231
1310
|
// `/v1/messages` flow in `conversation-routes.ts`, which wires a
|
|
1232
1311
|
// registry-aware sender and sets `hostBrowserSenderOverride`.
|
|
1233
1312
|
//
|
|
@@ -1397,6 +1476,7 @@ export class DaemonServer {
|
|
|
1397
1476
|
.runAgentLoop(content, messageId, onEvent, {
|
|
1398
1477
|
isInteractive: options?.isInteractive ?? false,
|
|
1399
1478
|
isUserMessage: true,
|
|
1479
|
+
...(options?.callSite ? { callSite: options.callSite } : {}),
|
|
1400
1480
|
})
|
|
1401
1481
|
.finally(() => {
|
|
1402
1482
|
if (
|
|
@@ -1437,14 +1517,26 @@ export class DaemonServer {
|
|
|
1437
1517
|
messageCount: conversation.getMessages().length,
|
|
1438
1518
|
inputTokens: conversation.usageStats.inputTokens,
|
|
1439
1519
|
outputTokens: conversation.usageStats.outputTokens,
|
|
1440
|
-
maxInputTokens: config.contextWindow.maxInputTokens,
|
|
1441
|
-
model: config.
|
|
1442
|
-
provider: config.
|
|
1520
|
+
maxInputTokens: config.llm.default.contextWindow.maxInputTokens,
|
|
1521
|
+
model: config.llm.default.model,
|
|
1522
|
+
provider: config.llm.default.provider,
|
|
1443
1523
|
estimatedCost: conversation.usageStats.estimatedCost,
|
|
1444
1524
|
userMessageInterface: serverInterfaceCtx?.userMessageInterface,
|
|
1445
1525
|
};
|
|
1446
1526
|
const slashResult = await resolveSlash(content, slashContext);
|
|
1447
1527
|
|
|
1528
|
+
// Slack inbound metadata is materialized once here for the slash-command
|
|
1529
|
+
// bypass paths (unknown-slash and /compact), which persist the user row
|
|
1530
|
+
// directly via `addMessage` and would otherwise drop the envelope. The
|
|
1531
|
+
// agent-loop path does not consume this variable — it forwards
|
|
1532
|
+
// `options.slackInbound` through `persistMetadata` and the envelope is
|
|
1533
|
+
// built internally by `buildSlackMetaForPersistence` inside
|
|
1534
|
+
// `persistQueuedMessageBody`.
|
|
1535
|
+
const slackMeta = buildSlackMetaForPersistence({
|
|
1536
|
+
slackInbound: options?.slackInbound,
|
|
1537
|
+
turnChannel: conversation.getTurnChannelContext()?.userMessageChannel,
|
|
1538
|
+
});
|
|
1539
|
+
|
|
1448
1540
|
if (slashResult.kind === "unknown") {
|
|
1449
1541
|
const serverTurnCtx = conversation.getTurnChannelContext();
|
|
1450
1542
|
const serverProvenance = provenanceFromTrustContext(
|
|
@@ -1476,13 +1568,20 @@ export class DaemonServer {
|
|
|
1476
1568
|
? { imageSourcePaths }
|
|
1477
1569
|
: {}),
|
|
1478
1570
|
};
|
|
1571
|
+
// slackMeta encodes the inbound user message's ts/thread — it attaches
|
|
1572
|
+
// to the user row only. The assistant's slash-command response does not
|
|
1573
|
+
// originate from Slack and must not inherit the user's channelTs, which
|
|
1574
|
+
// would break ordering in the chronological renderer.
|
|
1575
|
+
const userMetaWithSlack = slackMeta
|
|
1576
|
+
? { ...serverChannelMeta, slackMeta }
|
|
1577
|
+
: serverChannelMeta;
|
|
1479
1578
|
const cleanMsg = createUserMessage(content, attachments);
|
|
1480
1579
|
const llmMsg = enrichMessageWithSourcePaths(cleanMsg, attachments);
|
|
1481
1580
|
const persisted = await addMessage(
|
|
1482
1581
|
conversationId,
|
|
1483
1582
|
"user",
|
|
1484
1583
|
JSON.stringify(cleanMsg.content),
|
|
1485
|
-
|
|
1584
|
+
userMetaWithSlack,
|
|
1486
1585
|
);
|
|
1487
1586
|
conversation.getMessages().push(llmMsg);
|
|
1488
1587
|
|
|
@@ -1560,12 +1659,15 @@ export class DaemonServer {
|
|
|
1560
1659
|
}
|
|
1561
1660
|
: {}),
|
|
1562
1661
|
};
|
|
1662
|
+
const compactUserMeta = slackMeta
|
|
1663
|
+
? { ...compactChannelMeta, slackMeta }
|
|
1664
|
+
: compactChannelMeta;
|
|
1563
1665
|
const cleanMsg = createUserMessage(content, attachments);
|
|
1564
1666
|
const persisted = await addMessage(
|
|
1565
1667
|
conversationId,
|
|
1566
1668
|
"user",
|
|
1567
1669
|
JSON.stringify(cleanMsg.content),
|
|
1568
|
-
|
|
1670
|
+
compactUserMeta,
|
|
1569
1671
|
);
|
|
1570
1672
|
conversation.getMessages().push(cleanMsg);
|
|
1571
1673
|
|
|
@@ -1590,10 +1692,17 @@ export class DaemonServer {
|
|
|
1590
1692
|
const resolvedContent = slashResult.content;
|
|
1591
1693
|
|
|
1592
1694
|
const requestId = crypto.randomUUID();
|
|
1695
|
+
// Slack inbound metadata captured at the channel ingress boundary is
|
|
1696
|
+
// forwarded into the persistence call so `persistQueuedMessageBody` can
|
|
1697
|
+
// emit a `slackMeta` envelope on the row's metadata column.
|
|
1698
|
+
const persistMetadata = options?.slackInbound
|
|
1699
|
+
? { slackInbound: options.slackInbound }
|
|
1700
|
+
: undefined;
|
|
1593
1701
|
const messageId = await conversation.persistUserMessage(
|
|
1594
1702
|
resolvedContent,
|
|
1595
1703
|
attachments,
|
|
1596
1704
|
requestId,
|
|
1705
|
+
persistMetadata,
|
|
1597
1706
|
);
|
|
1598
1707
|
|
|
1599
1708
|
// Register pending interactions so channel approval interception can
|
|
@@ -1623,6 +1732,7 @@ export class DaemonServer {
|
|
|
1623
1732
|
await conversation.runAgentLoop(resolvedContent, messageId, onEvent, {
|
|
1624
1733
|
isInteractive: options?.isInteractive ?? false,
|
|
1625
1734
|
isUserMessage: true,
|
|
1735
|
+
...(options?.callSite ? { callSite: options.callSite } : {}),
|
|
1626
1736
|
});
|
|
1627
1737
|
} finally {
|
|
1628
1738
|
if (
|
|
@@ -3,7 +3,6 @@ import * as Sentry from "@sentry/node";
|
|
|
3
3
|
import type { BackupWorkerHandle } from "../backup/backup-worker.js";
|
|
4
4
|
import type { FilingService } from "../filing/filing-service.js";
|
|
5
5
|
import type { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
6
|
-
import type { HookManager } from "../hooks/manager.js";
|
|
7
6
|
import type { McpServerManager } from "../mcp/manager.js";
|
|
8
7
|
import { getSqlite, resetDb } from "../memory/db.js";
|
|
9
8
|
import type { QdrantManager } from "../memory/qdrant-manager.js";
|
|
@@ -23,7 +22,6 @@ export interface ShutdownDeps {
|
|
|
23
22
|
workspaceHeartbeat: WorkspaceHeartbeatService;
|
|
24
23
|
heartbeat: HeartbeatService;
|
|
25
24
|
filing: FilingService;
|
|
26
|
-
hookManager: HookManager;
|
|
27
25
|
runtimeHttp: RuntimeHttpServer | null;
|
|
28
26
|
scheduler: { stop(): void };
|
|
29
27
|
feedScheduler: { stop(): void } | null;
|
|
@@ -44,11 +42,9 @@ export function installShutdownHandlers(deps: ShutdownDeps): void {
|
|
|
44
42
|
shuttingDown = true;
|
|
45
43
|
log.info("Shutting down daemon...");
|
|
46
44
|
|
|
47
|
-
deps.hookManager.stopWatching();
|
|
48
|
-
|
|
49
45
|
// Force exit if graceful shutdown takes too long.
|
|
50
|
-
// Set this BEFORE awaiting heartbeat stop
|
|
51
|
-
//
|
|
46
|
+
// Set this BEFORE awaiting heartbeat stop so it covers all
|
|
47
|
+
// potentially-blocking async shutdown work.
|
|
52
48
|
//
|
|
53
49
|
// 20s budget: 15s reserved for Meet session teardown
|
|
54
50
|
// (`MeetSessionManager.shutdownAll`), plus ~5s for the remaining
|
|
@@ -67,12 +63,6 @@ export function installShutdownHandlers(deps: ShutdownDeps): void {
|
|
|
67
63
|
await deps.heartbeat.stop();
|
|
68
64
|
await deps.filing.stop();
|
|
69
65
|
|
|
70
|
-
try {
|
|
71
|
-
await deps.hookManager.trigger("daemon-stop", { pid: process.pid });
|
|
72
|
-
} catch {
|
|
73
|
-
// Don't let hook failures block shutdown
|
|
74
|
-
}
|
|
75
|
-
|
|
76
66
|
// Run registered skill shutdown hooks (e.g. meet-join session teardown)
|
|
77
67
|
// before stopping the server so any HTTP round-trips and SSE emissions
|
|
78
68
|
// still have live transports.
|
|
@@ -7,9 +7,7 @@
|
|
|
7
7
|
* registry entry instead of another if/else branch.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { compileApp } from "../bundler/app-compiler.js";
|
|
11
10
|
import { generateAppIcon } from "../media/app-icon-generator.js";
|
|
12
|
-
import { getApp, getAppDirPath, isMultifileApp } from "../memory/app-store.js";
|
|
13
11
|
import { findActiveSession } from "../runtime/channel-verification-service.js";
|
|
14
12
|
import { deliverVerificationSlack } from "../runtime/verification-outbound-actions.js";
|
|
15
13
|
import { updatePublishedAppDeployment } from "../services/published-app-updater.js";
|
|
@@ -39,41 +37,22 @@ export type PostExecutionHook = (
|
|
|
39
37
|
|
|
40
38
|
// ── Helpers ──────────────────────────────────────────────────────────
|
|
41
39
|
|
|
42
|
-
/**
|
|
43
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Propagate an app change to connected clients and the publish pipeline.
|
|
42
|
+
*
|
|
43
|
+
* Compilation is the responsibility of the tool executor (see
|
|
44
|
+
* `executeAppCreate`, `executeAppRefresh`): executors own the source→dist
|
|
45
|
+
* transform and surface `compile_errors` in their result when it fails.
|
|
46
|
+
* Post-execution hooks only observe the outcome and notify — they must
|
|
47
|
+
* not re-run a compile because `compileApp()` begins with `rm -rf dist/`
|
|
48
|
+
* and would race with the executor's own output (LUM-1153).
|
|
49
|
+
*/
|
|
50
|
+
function notifyAppChanged(
|
|
44
51
|
ctx: ToolSetupContext,
|
|
45
52
|
appId: string,
|
|
46
53
|
broadcastToAllClients: ((msg: ServerMessage) => void) | undefined,
|
|
47
54
|
opts?: { fileChange?: boolean; status?: string },
|
|
48
55
|
): void {
|
|
49
|
-
const app = getApp(appId);
|
|
50
|
-
|
|
51
|
-
// Multifile apps need a recompile before refreshing surfaces so the
|
|
52
|
-
// WebView picks up the latest compiled output.
|
|
53
|
-
if (app && isMultifileApp(app)) {
|
|
54
|
-
const appDir = getAppDirPath(appId);
|
|
55
|
-
void compileApp(appDir)
|
|
56
|
-
.then((result) => {
|
|
57
|
-
if (!result.ok) {
|
|
58
|
-
log.warn(
|
|
59
|
-
{ appId, errors: result.errors },
|
|
60
|
-
"Recompile failed on app change, serving stale dist/",
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
refreshSurfacesForApp(ctx, appId, opts);
|
|
64
|
-
broadcastToAllClients?.({ type: "app_files_changed", appId });
|
|
65
|
-
void updatePublishedAppDeployment(appId);
|
|
66
|
-
})
|
|
67
|
-
.catch((err) => {
|
|
68
|
-
log.warn({ appId, err }, "Recompile threw on app change");
|
|
69
|
-
// Still refresh surfaces with stale output
|
|
70
|
-
refreshSurfacesForApp(ctx, appId, opts);
|
|
71
|
-
broadcastToAllClients?.({ type: "app_files_changed", appId });
|
|
72
|
-
void updatePublishedAppDeployment(appId);
|
|
73
|
-
});
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
56
|
refreshSurfacesForApp(ctx, appId, opts);
|
|
78
57
|
broadcastToAllClients?.({ type: "app_files_changed", appId });
|
|
79
58
|
void updatePublishedAppDeployment(appId);
|
|
@@ -115,7 +94,7 @@ registerHook(
|
|
|
115
94
|
// trigger live reload.
|
|
116
95
|
ensureAppSourceWatcher();
|
|
117
96
|
|
|
118
|
-
|
|
97
|
+
notifyAppChanged(ctx, parsed.id, broadcastToAllClients);
|
|
119
98
|
|
|
120
99
|
// Fire-and-forget: generate an app icon in the background.
|
|
121
100
|
// When complete, broadcast again so clients pick up the new icon.
|
|
@@ -165,42 +144,12 @@ registerHook(
|
|
|
165
144
|
);
|
|
166
145
|
|
|
167
146
|
// Trigger surface refresh + broadcast when an app is refreshed.
|
|
168
|
-
// If the executor already compiled (multifile path), skip the redundant
|
|
169
|
-
// recompile and just refresh surfaces / broadcast / deploy directly.
|
|
170
147
|
registerHook(
|
|
171
148
|
"app_refresh",
|
|
172
|
-
(_name, input,
|
|
149
|
+
(_name, input, _result, { ctx, broadcastToAllClients }) => {
|
|
173
150
|
const appId = input.app_id as string | undefined;
|
|
174
151
|
if (!appId) return;
|
|
175
|
-
|
|
176
|
-
// executeAppRefresh already compiled multifile apps and included a
|
|
177
|
-
// "compiled" field in the result. Skip the expensive recompile and
|
|
178
|
-
// go straight to surface refresh + broadcast + deploy.
|
|
179
|
-
let alreadyCompiled = false;
|
|
180
|
-
try {
|
|
181
|
-
const parsed = JSON.parse(result.content) as { compiled?: boolean };
|
|
182
|
-
alreadyCompiled = parsed.compiled !== undefined;
|
|
183
|
-
} catch {
|
|
184
|
-
// Result wasn't valid JSON — fall through to handleAppChange.
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (alreadyCompiled) {
|
|
188
|
-
const opts = { fileChange: true };
|
|
189
|
-
refreshSurfacesForApp(ctx, appId, opts);
|
|
190
|
-
broadcastToAllClients?.({ type: "app_files_changed", appId });
|
|
191
|
-
void updatePublishedAppDeployment(appId);
|
|
192
|
-
} else {
|
|
193
|
-
handleAppChange(ctx, appId, broadcastToAllClients, { fileChange: true });
|
|
194
|
-
}
|
|
195
|
-
},
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
// Broadcast tasks_changed so connected clients (e.g. macOS Tasks window)
|
|
199
|
-
// auto-refresh when the LLM mutates the task queue via tools
|
|
200
|
-
registerHook(
|
|
201
|
-
["task_list_add", "task_list_update", "task_list_remove", "task_queue_run"],
|
|
202
|
-
(_name, _input, _result, { broadcastToAllClients }) => {
|
|
203
|
-
broadcastToAllClients?.({ type: "tasks_changed" });
|
|
152
|
+
notifyAppChanged(ctx, appId, broadcastToAllClients, { fileChange: true });
|
|
204
153
|
},
|
|
205
154
|
);
|
|
206
155
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ContentBlock,
|
|
3
|
+
Message,
|
|
4
|
+
ServerToolUseContent,
|
|
5
|
+
TextContent,
|
|
6
|
+
WebSearchToolResultContent,
|
|
7
|
+
} from "../providers/types.js";
|
|
8
|
+
|
|
9
|
+
export interface StripStats {
|
|
10
|
+
blocksStripped: number;
|
|
11
|
+
serverToolUsesDropped: number;
|
|
12
|
+
messagesModified: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface StripResult {
|
|
16
|
+
messages: Message[];
|
|
17
|
+
stats: StripStats;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Replaces every `web_search_tool_result` block in the message list with a
|
|
22
|
+
* plain `text` summary of its results, and drops the paired `server_tool_use`
|
|
23
|
+
* that produced it.
|
|
24
|
+
*
|
|
25
|
+
* Anthropic's `encrypted_content` tokens attached to each `web_search_result`
|
|
26
|
+
* are opaque server tokens with bounded validity (they expire and/or are
|
|
27
|
+
* route-scoped). Replaying a stale token produces
|
|
28
|
+
* `messages.N.content.M: Invalid encrypted_content in search_result block`.
|
|
29
|
+
* For historical turns the model does not need the opaque token to re-read
|
|
30
|
+
* the body — a title+url summary is sufficient to preserve context.
|
|
31
|
+
*
|
|
32
|
+
* Intended to run on `runMessages` immediately before the agent loop starts a
|
|
33
|
+
* new turn, at which point every `web_search_tool_result` in the list is by
|
|
34
|
+
* definition from a prior turn.
|
|
35
|
+
*/
|
|
36
|
+
export function stripHistoricalWebSearchResults(
|
|
37
|
+
messages: Message[],
|
|
38
|
+
): StripResult {
|
|
39
|
+
const stats: StripStats = {
|
|
40
|
+
blocksStripped: 0,
|
|
41
|
+
serverToolUsesDropped: 0,
|
|
42
|
+
messagesModified: 0,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const next: Message[] = messages.map((msg) => {
|
|
46
|
+
const droppedServerToolUseIds = new Set<string>();
|
|
47
|
+
const transformed: ContentBlock[] = [];
|
|
48
|
+
|
|
49
|
+
for (const block of msg.content) {
|
|
50
|
+
if (block.type !== "web_search_tool_result") continue;
|
|
51
|
+
const wsr = block as WebSearchToolResultContent;
|
|
52
|
+
const query = findQueryForToolUseId(msg.content, wsr.tool_use_id);
|
|
53
|
+
transformed.push(formatAsText(wsr, query));
|
|
54
|
+
droppedServerToolUseIds.add(wsr.tool_use_id);
|
|
55
|
+
stats.blocksStripped++;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (droppedServerToolUseIds.size === 0) return msg;
|
|
59
|
+
|
|
60
|
+
const rewritten: ContentBlock[] = [];
|
|
61
|
+
let wsrIndex = 0;
|
|
62
|
+
for (const block of msg.content) {
|
|
63
|
+
if (block.type === "server_tool_use") {
|
|
64
|
+
const stu = block as ServerToolUseContent;
|
|
65
|
+
if (droppedServerToolUseIds.has(stu.id)) {
|
|
66
|
+
stats.serverToolUsesDropped++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
rewritten.push(block);
|
|
70
|
+
} else if (block.type === "web_search_tool_result") {
|
|
71
|
+
rewritten.push(transformed[wsrIndex++]);
|
|
72
|
+
} else {
|
|
73
|
+
rewritten.push(block);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
stats.messagesModified++;
|
|
78
|
+
return { ...msg, content: rewritten };
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return { messages: next, stats };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function findQueryForToolUseId(
|
|
85
|
+
blocks: ContentBlock[],
|
|
86
|
+
toolUseId: string,
|
|
87
|
+
): string | null {
|
|
88
|
+
for (const b of blocks) {
|
|
89
|
+
if (b.type !== "server_tool_use") continue;
|
|
90
|
+
const stu = b as ServerToolUseContent;
|
|
91
|
+
if (stu.id !== toolUseId) continue;
|
|
92
|
+
const q = stu.input?.query;
|
|
93
|
+
return typeof q === "string" ? q : null;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function formatAsText(
|
|
99
|
+
block: WebSearchToolResultContent,
|
|
100
|
+
query: string | null,
|
|
101
|
+
): TextContent {
|
|
102
|
+
const header = query
|
|
103
|
+
? `[Prior web_search results for "${query}":`
|
|
104
|
+
: "[Prior web_search results:";
|
|
105
|
+
|
|
106
|
+
const content = block.content;
|
|
107
|
+
if (!Array.isArray(content)) {
|
|
108
|
+
return { type: "text", text: `${header} (results unavailable)]` };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const entries = content
|
|
112
|
+
.filter(
|
|
113
|
+
(r): r is { type: string; title?: unknown; url?: unknown } =>
|
|
114
|
+
typeof r === "object" &&
|
|
115
|
+
r != null &&
|
|
116
|
+
(r as { type?: string }).type === "web_search_result",
|
|
117
|
+
)
|
|
118
|
+
.map((r, i) => {
|
|
119
|
+
const title = typeof r.title === "string" ? r.title : "(untitled)";
|
|
120
|
+
const url = typeof r.url === "string" ? r.url : "";
|
|
121
|
+
return url ? `${i + 1}. ${title}\n ${url}` : `${i + 1}. ${title}`;
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const body = entries.length > 0 ? entries.join("\n") : "(no results)";
|
|
125
|
+
return { type: "text", text: `${header}\n${body}]` };
|
|
126
|
+
}
|
|
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
|
|
4
4
|
import { getConfig } from "../config/loader.js";
|
|
5
|
-
import type {
|
|
5
|
+
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
6
6
|
import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
|
|
7
7
|
import { getLogger } from "../util/logger.js";
|
|
8
8
|
import { getWorkspaceDir } from "../util/platform.js";
|
|
@@ -17,23 +17,24 @@ const FILING_PROMPT_TEMPLATE = `You are running a periodic knowledge base filing
|
|
|
17
17
|
## Part 1: File the buffer
|
|
18
18
|
|
|
19
19
|
Read \`pkb/buffer.md\`. For each item in the buffer:
|
|
20
|
-
1. Determine which topic file it belongs in. Check \`pkb/INDEX.md\` to see what topic files exist.
|
|
21
|
-
2. Read the target topic file, then
|
|
20
|
+
1. Determine which topic file(s) it belongs in. Check \`pkb/INDEX.md\` to see what topic files exist.
|
|
21
|
+
2. Read the target topic file(s), then integrate the new fact.
|
|
22
22
|
3. If the fact is important enough to always be in context, add it to \`pkb/essentials.md\` instead.
|
|
23
23
|
4. If the fact is a commitment, follow-up, or active project, add it to \`pkb/threads.md\`.
|
|
24
24
|
5. If no existing topic file fits, create a new one and update \`pkb/INDEX.md\`.
|
|
25
|
+
6. If the topic file is getting too long (>1500 tokens), compress it or split it into multiple topic files.
|
|
25
26
|
|
|
26
27
|
After all items are filed, clear the processed items from \`pkb/buffer.md\` (leave the file empty, don't delete it).
|
|
27
28
|
|
|
28
|
-
## Part 2:
|
|
29
|
+
## Part 2: Review
|
|
29
30
|
|
|
30
|
-
Pick
|
|
31
|
+
Pick 3 random topic files from your knowledge base and review them:
|
|
31
32
|
- Is the information still accurate and up to date?
|
|
32
33
|
- Are there duplicates that should be consolidated?
|
|
33
34
|
- Is anything important enough to promote to \`pkb/essentials.md\`?
|
|
34
35
|
- Is anything in \`pkb/essentials.md\` that's no longer essential? Demote it to a topic file.
|
|
35
36
|
- Are any threads in \`pkb/threads.md\` completed or stale? Remove them.
|
|
36
|
-
- Is any file getting too long?
|
|
37
|
+
- Is any file getting too long (>1500 tokens)? Strongly consider compressing it or splitting it into multiple topic files.
|
|
37
38
|
- Should any topic file be restructured for clarity?
|
|
38
39
|
|
|
39
40
|
Make improvements as you see fit. This is your knowledge base — keep it sharp.`;
|
|
@@ -42,7 +43,7 @@ export interface FilingDeps {
|
|
|
42
43
|
processMessage: (
|
|
43
44
|
conversationId: string,
|
|
44
45
|
content: string,
|
|
45
|
-
options?: {
|
|
46
|
+
options?: { callSite?: LLMCallSite },
|
|
46
47
|
) => Promise<{ messageId: string }>;
|
|
47
48
|
onConversationCreated?: (info: {
|
|
48
49
|
conversationId: string;
|
|
@@ -190,8 +191,6 @@ export class FilingService {
|
|
|
190
191
|
log.info("Running filing job");
|
|
191
192
|
|
|
192
193
|
try {
|
|
193
|
-
const config = getConfig().filing;
|
|
194
|
-
|
|
195
194
|
const conversation = bootstrapConversation({
|
|
196
195
|
conversationType: "background",
|
|
197
196
|
source: "filing",
|
|
@@ -206,7 +205,7 @@ export class FilingService {
|
|
|
206
205
|
});
|
|
207
206
|
|
|
208
207
|
await this.deps.processMessage(conversation.id, FILING_PROMPT_TEMPLATE, {
|
|
209
|
-
|
|
208
|
+
callSite: "filingAgent",
|
|
210
209
|
});
|
|
211
210
|
|
|
212
211
|
log.info({ conversationId: conversation.id }, "Filing job completed");
|