@vellumai/assistant 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +5 -0
- package/AGENTS.md +9 -1
- package/ARCHITECTURE.md +43 -49
- package/Dockerfile +17 -3
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +283 -0
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +33 -59
- package/docs/architecture/memory.md +25 -30
- package/docs/architecture/security.md +19 -18
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/error-handling.md +111 -0
- package/docs/plugins.md +761 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/examples/plugins/echo/README.md +132 -0
- package/examples/plugins/echo/package.json +17 -0
- package/examples/plugins/echo/register.ts +187 -0
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/openapi.yaml +334 -78
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/app-compiler.test.ts +57 -0
- package/src/__tests__/approval-cascade.test.ts +36 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +1 -0
- package/src/__tests__/avatar-generator.test.ts +4 -2
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +96 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +870 -655
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-events.test.ts +501 -0
- package/src/__tests__/compaction-pipeline.test.ts +210 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +181 -0
- package/src/__tests__/compaction-timeout-recovery.test.ts +262 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-model-image-provider.test.ts +110 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +440 -114
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-tools.test.ts +26 -0
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +883 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +32 -15
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +86 -46
- package/src/__tests__/conversation-agent-loop.test.ts +435 -216
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +36 -10
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +7 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +34 -12
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pairing.test.ts +174 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +32 -15
- package/src/__tests__/conversation-process-callsite.test.ts +309 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +44 -21
- package/src/__tests__/conversation-queue.test.ts +68 -38
- package/src/__tests__/conversation-routes-disk-view.test.ts +36 -7
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2877 -152
- package/src/__tests__/conversation-runtime-workspace.test.ts +35 -50
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +39 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +53 -16
- package/src/__tests__/conversation-speed-override.test.ts +36 -12
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +118 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +41 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +4 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +33 -9
- package/src/__tests__/conversation-workspace-injection.test.ts +46 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +46 -15
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +5 -2
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/empty-response-pipeline.test.ts +305 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +29 -10
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/first-greeting.test.ts +247 -5
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/history-repair-pipeline.test.ts +399 -0
- package/src/__tests__/host-browser-e2e-cloud.test.ts +307 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +3 -3
- package/src/__tests__/host-proxy-interface.test.ts +36 -2
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/injector-chain.test.ts +526 -0
- package/src/__tests__/intent-routing.test.ts +1 -66
- package/src/__tests__/llm-call-pipeline.test.ts +285 -0
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/media-generate-image.test.ts +119 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +401 -0
- package/src/__tests__/memory-upsert-concurrency.test.ts +1 -0
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +621 -0
- package/src/__tests__/model-intents.test.ts +11 -83
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/notification-decision-strategy.test.ts +0 -11
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +108 -0
- package/src/__tests__/oauth-apps-routes.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +14 -12
- package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
- package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
- package/src/__tests__/oauth-provider-visibility.test.ts +3 -5
- package/src/__tests__/oauth-providers-routes.test.ts +3 -2
- package/src/__tests__/oauth-store.test.ts +46 -78
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/onboarding-template-contract.test.ts +16 -64
- package/src/__tests__/openai-image-service.test.ts +368 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +676 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -25
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +377 -0
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/platform.test.ts +5 -2
- package/src/__tests__/plugin-bootstrap.test.ts +483 -0
- package/src/__tests__/plugin-registry.test.ts +273 -0
- package/src/__tests__/plugin-route-contribution.test.ts +288 -0
- package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +286 -0
- package/src/__tests__/plugin-types.test.ts +320 -0
- package/src/__tests__/pricing.test.ts +93 -14
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +69 -9
- package/src/__tests__/reaction-persistence.test.ts +561 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +0 -2
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/schedule-routes.test.ts +131 -1
- package/src/__tests__/scheduler-recurrence.test.ts +14 -70
- package/src/__tests__/scheduler-reuse-conversation.test.ts +10 -50
- package/src/__tests__/secret-detection-handler.test.ts +0 -10
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-identity.test.ts +0 -134
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +259 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-memory-cleanup.test.ts +1 -0
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/task-scheduler.test.ts +3 -15
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-preload.ts +11 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/title-generate-pipeline.test.ts +224 -0
- package/src/__tests__/token-estimate-pipeline.test.ts +431 -0
- package/src/__tests__/tool-error-pipeline.test.ts +244 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +431 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -8
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor-shell-integration.test.ts +7 -10
- package/src/__tests__/tool-executor.test.ts +201 -94
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +356 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -110
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/user-plugin-loader.test.ts +191 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-046-seed-conversation-starters-callsite.test.ts +185 -0
- package/src/__tests__/workspace-migration-049-release-notes-default-sonnet.test.ts +100 -0
- package/src/__tests__/workspace-migration-050-seed-main-agent-opus-callsite.test.ts +171 -0
- package/src/__tests__/workspace-migration-051-seed-conversation-summarization-callsite.test.ts +252 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +22 -16
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +545 -115
- package/src/approvals/__tests__/guardian-feed-event.test.ts +304 -0
- package/src/approvals/guardian-request-resolvers.ts +80 -0
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/backup/__tests__/backup-worker.test.ts +2 -13
- package/src/backup/backup-worker.ts +3 -15
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/bundler/app-compiler.ts +84 -1
- package/src/calls/call-state.ts +2 -2
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/channels/__tests__/types.test.ts +3 -3
- package/src/channels/types.ts +6 -4
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/__tests__/notifications.test.ts +87 -211
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/backup.test.ts +1 -1
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +886 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +463 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +606 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/backup.ts +2 -2
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/clients.ts +138 -0
- package/src/cli/commands/completions.ts +2 -12
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +69 -8
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +299 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/notifications.ts +68 -103
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +2 -2
- package/src/cli/commands/oauth/providers.ts +176 -8
- package/src/cli/commands/oauth/status.ts +46 -36
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/skills.ts +3 -4
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +39 -24
- package/src/cli.ts +0 -37
- package/src/config/__tests__/backup-schema.test.ts +7 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +10 -10
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +66 -87
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +28 -51
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +22 -40
- package/src/config/bundled-skills/image-studio/SKILL.md +2 -1
- package/src/config/bundled-skills/image-studio/TOOLS.json +2 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +23 -39
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +20 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +69 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/schedule/SKILL.md +8 -3
- package/src/config/bundled-skills/schedule/TOOLS.json +15 -7
- package/src/config/bundled-skills/schedule/references/SCRIPT_MODE_PATTERNS.md +59 -0
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -190
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +42 -10
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +49 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/conversations.ts +16 -0
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +317 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +64 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +96 -7
- package/src/context/__tests__/compact-prompt.test.ts +63 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +26 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/tool-result-truncation.ts +3 -63
- package/src/context/window-manager.ts +417 -39
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/credential-health/credential-health-service.ts +19 -6
- package/src/daemon/__tests__/conversation-feed-event.test.ts +317 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -3
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +162 -34
- package/src/daemon/conversation-agent-loop.ts +1282 -599
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-history.ts +10 -19
- package/src/daemon/conversation-lifecycle.ts +59 -17
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-notifiers.ts +2 -110
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +1063 -211
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +51 -9
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +197 -64
- package/src/daemon/external-plugins-bootstrap.ts +478 -0
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/first-greeting.ts +191 -14
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +65 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +7 -3
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +109 -82
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +63 -0
- package/src/daemon/message-types/messages.ts +21 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +122 -12
- package/src/daemon/shutdown-handlers.ts +2 -12
- package/src/daemon/tool-side-effects.ts +14 -65
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +160 -0
- package/src/heartbeat/heartbeat-service.ts +99 -28
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +11 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +97 -4
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rewrite-command-preview.ts +66 -0
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +34 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +6 -3
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +63 -0
- package/src/ipc/routes/browser.ts +97 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/get-contact.ts +16 -0
- package/src/ipc/routes/index.ts +31 -1
- package/src/ipc/routes/list-clients.ts +31 -0
- package/src/ipc/routes/merge-contacts.ts +17 -0
- package/src/ipc/routes/notification.ts +133 -0
- package/src/ipc/routes/rename-conversation.ts +59 -0
- package/src/ipc/routes/search-contacts.ts +19 -0
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/upsert-contact.ts +25 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +76 -0
- package/src/media/app-icon-generator.ts +23 -46
- package/src/media/avatar-router.ts +26 -41
- package/src/media/gemini-image-service.ts +8 -41
- package/src/media/image-credentials.ts +73 -0
- package/src/media/image-service.ts +85 -0
- package/src/media/openai-image-service.ts +131 -0
- package/src/media/types.ts +46 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +133 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-queries.ts +57 -4
- package/src/memory/conversation-title-service.ts +32 -4
- package/src/memory/db-init.ts +10 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +41 -2
- package/src/memory/embedding-gemini.ts +6 -1
- package/src/memory/graph/bootstrap.test.ts +282 -0
- package/src/memory/graph/bootstrap.ts +8 -5
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +183 -53
- package/src/memory/graph/graph-search.test.ts +93 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/inspect.ts +2 -2
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +237 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/149-oauth-tables.ts +1 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/223-schedule-script-column.ts +11 -0
- package/src/memory/migrations/224-oauth-providers-managed-service-is-paid.ts +24 -0
- package/src/memory/migrations/225-oauth-providers-available-scopes.ts +13 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/pkb/pkb-index.test.ts +369 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +252 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +499 -0
- package/src/memory/pkb/pkb-search.ts +159 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +147 -1
- package/src/memory/schema/infrastructure.ts +1 -0
- package/src/memory/schema/oauth.ts +4 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1421 -0
- package/src/messaging/providers/slack/render-transcript.ts +501 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/copy-composer.ts +0 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/notifications/signal.ts +1 -2
- package/src/oauth/AGENTS.md +1 -1
- package/src/oauth/__tests__/identity-verifier.test.ts +2 -1
- package/src/oauth/connect-orchestrator.ts +8 -34
- package/src/oauth/connect-types.ts +6 -10
- package/src/oauth/manual-token-connection.ts +23 -0
- package/src/oauth/oauth-store.ts +31 -14
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -106
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/permissions/approval-policy.test.ts +1223 -0
- package/src/permissions/approval-policy.ts +309 -0
- package/src/permissions/arg-parser.test.ts +161 -0
- package/src/permissions/arg-parser.ts +141 -0
- package/src/permissions/bash-risk-classifier.test.ts +1620 -0
- package/src/permissions/bash-risk-classifier.ts +950 -0
- package/src/permissions/checker.ts +348 -711
- package/src/permissions/command-registry.test.ts +774 -0
- package/src/permissions/command-registry.ts +1005 -0
- package/src/permissions/defaults.ts +28 -79
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/gateway-threshold-reader.ts +196 -0
- package/src/permissions/prompter.ts +4 -0
- package/src/permissions/risk-types.ts +262 -0
- package/src/permissions/schedule-risk-classifier.test.ts +129 -0
- package/src/permissions/schedule-risk-classifier.ts +85 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/shell-identity.ts +2 -42
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +25 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +9 -19
- package/src/platform/client.ts +19 -1
- package/src/plugins/defaults/circuit-breaker.ts +146 -0
- package/src/plugins/defaults/compaction.ts +145 -0
- package/src/plugins/defaults/empty-response.ts +126 -0
- package/src/plugins/defaults/history-repair.ts +85 -0
- package/src/plugins/defaults/index.ts +116 -0
- package/src/plugins/defaults/injectors.ts +491 -0
- package/src/plugins/defaults/llm-call.ts +82 -0
- package/src/plugins/defaults/memory-retrieval.ts +226 -0
- package/src/plugins/defaults/overflow-reduce.ts +181 -0
- package/src/plugins/defaults/persistence.ts +129 -0
- package/src/plugins/defaults/title-generate.ts +95 -0
- package/src/plugins/defaults/token-estimate.ts +104 -0
- package/src/plugins/defaults/tool-error.ts +126 -0
- package/src/plugins/defaults/tool-execute.ts +89 -0
- package/src/plugins/defaults/tool-result-truncate.ts +88 -0
- package/src/plugins/pipeline.ts +316 -0
- package/src/plugins/plugin-skill-contributions.ts +292 -0
- package/src/plugins/registry.ts +241 -0
- package/src/plugins/types.ts +1134 -0
- package/src/plugins/user-loader.ts +177 -0
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +524 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +80 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +61 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +57 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +646 -0
- package/src/providers/speech-to-text/xai-realtime.ts +821 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +27 -18
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +3 -3
- package/src/runtime/__tests__/client-registry.test.ts +293 -0
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/client-registry.ts +261 -0
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +129 -9
- package/src/runtime/http-types.ts +23 -3
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-builder.ts +1 -22
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +78 -0
- package/src/runtime/routes/approval-routes.ts +29 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/browser-extension-pair-routes.ts +27 -8
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +351 -138
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +987 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/memory-item-routes.test.ts +1 -0
- package/src/runtime/routes/migration-routes.ts +720 -127
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +284 -0
- package/src/runtime/routes/playground/__tests__/guard.test.ts +80 -0
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +294 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +271 -0
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +202 -0
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +309 -0
- package/src/runtime/routes/playground/__tests__/state.test.ts +224 -0
- package/src/runtime/routes/playground/conversation-not-found.ts +29 -0
- package/src/runtime/routes/playground/deps.ts +56 -0
- package/src/runtime/routes/playground/force-compact.ts +73 -0
- package/src/runtime/routes/playground/guard.ts +37 -0
- package/src/runtime/routes/playground/index.ts +28 -0
- package/src/runtime/routes/playground/inject-failures.ts +159 -0
- package/src/runtime/routes/playground/reset-circuit.ts +115 -0
- package/src/runtime/routes/playground/seed-conversation.ts +139 -0
- package/src/runtime/routes/playground/seeded-conversations.ts +78 -0
- package/src/runtime/routes/playground/state.ts +78 -0
- package/src/runtime/routes/schedule-routes.ts +89 -8
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +97 -15
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +7 -1
- package/src/schedule/scheduler.ts +56 -8
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +35 -9
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +234 -2
- package/src/tools/browser/browser-execution.ts +150 -54
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +230 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +146 -3
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +54 -3
- package/src/tools/browser/cdp-client/factory.ts +15 -4
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +129 -73
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/script-proxy/session-manager.ts +37 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +116 -46
- package/src/tools/policy-context.ts +29 -8
- package/src/tools/registry.ts +195 -6
- package/src/tools/schedule/create.ts +23 -8
- package/src/tools/schedule/update.ts +3 -1
- package/src/tools/secret-detection-handler.ts +0 -51
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/system/avatar-generator.ts +6 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +40 -5
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +9 -4
- package/src/util/pricing.ts +41 -8
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/006-services-config.ts +2 -4
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +56 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +108 -0
- package/src/workspace/migrations/047-remove-watch-callsites.ts +54 -0
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +81 -0
- package/src/workspace/migrations/049-release-notes-default-sonnet.ts +80 -0
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +86 -0
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +128 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +28 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/tsconfig.json +1 -1
- package/hook-templates/debug-prompt-logger/hook.json +0 -7
- package/hook-templates/debug-prompt-logger/run.sh +0 -66
- package/src/__tests__/context-overflow-approval.test.ts +0 -156
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/hooks-blocking.test.ts +0 -178
- package/src/__tests__/hooks-cli.test.ts +0 -182
- package/src/__tests__/hooks-config.test.ts +0 -108
- package/src/__tests__/hooks-discovery.test.ts +0 -211
- package/src/__tests__/hooks-integration.test.ts +0 -196
- package/src/__tests__/hooks-manager.test.ts +0 -226
- package/src/__tests__/hooks-runner.test.ts +0 -175
- package/src/__tests__/hooks-settings.test.ts +0 -160
- package/src/__tests__/hooks-templates.test.ts +0 -169
- package/src/__tests__/hooks-ts-runner.test.ts +0 -170
- package/src/__tests__/hooks-watch.test.ts +0 -112
- package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
- package/src/__tests__/oauth-scope-policy.test.ts +0 -180
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/send-notification-tool.test.ts +0 -83
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/cli/commands/shotgun.ts +0 -266
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/conversations/SKILL.md +0 -20
- package/src/config/bundled-skills/conversations/TOOLS.json +0 -23
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +0 -66
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/heartbeat/SKILL.md +0 -43
- package/src/config/bundled-skills/notifications/SKILL.md +0 -40
- package/src/config/bundled-skills/notifications/TOOLS.json +0 -80
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -152
- package/src/config/bundled-skills/notifications/tools/shared.ts +0 -13
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/screen-watch/SKILL.md +0 -27
- package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
- package/src/config/bundled-skills/screen-watch/tools/start-screen-watch.ts +0 -12
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/daemon/context-overflow-approval.ts +0 -52
- package/src/daemon/watch-handler.ts +0 -399
- package/src/hooks/cli.ts +0 -253
- package/src/hooks/config.ts +0 -100
- package/src/hooks/discovery.ts +0 -135
- package/src/hooks/manager.ts +0 -179
- package/src/hooks/runner.ts +0 -117
- package/src/hooks/templates.ts +0 -77
- package/src/hooks/types.ts +0 -75
- package/src/oauth/scope-policy.ts +0 -89
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/signals/shotgun.ts +0 -203
- package/src/tools/watch/screen-watch.ts +0 -144
- package/src/tools/watch/watch-state.ts +0 -142
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `memoryRetrieval` plugin.
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates the three retrievals the agent loop performs before building
|
|
5
|
+
* the runtime-injection block for a turn:
|
|
6
|
+
*
|
|
7
|
+
* 1. **PKB context** via {@link readPkbContext} — always-loaded workspace
|
|
8
|
+
* notes (INDEX.md, essentials.md, …) that precede the user's message.
|
|
9
|
+
* 2. **NOW.md scratchpad** via {@link readNowScratchpad} — the short
|
|
10
|
+
* user-maintained note the assistant keeps up to date.
|
|
11
|
+
* 3. **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
|
|
12
|
+
* dispatches to context-load or per-turn retrieval depending on
|
|
13
|
+
* initialization state; gated on the actor being trusted (guardian).
|
|
14
|
+
*
|
|
15
|
+
* The default plugin registers a pass-through middleware so the pipeline
|
|
16
|
+
* runner always has at least one entry and downstream telemetry observes a
|
|
17
|
+
* deterministic chain. The actual retrieval runs in the terminal supplied
|
|
18
|
+
* by the agent loop; centralizing the helper here (as
|
|
19
|
+
* {@link runDefaultMemoryRetrieval}) makes it trivial for a plugin to
|
|
20
|
+
* fall back to the default behavior by calling this helper from its own
|
|
21
|
+
* middleware.
|
|
22
|
+
*
|
|
23
|
+
* See `.private/plans/agent-plugin-system.md` PR 20 for the containing
|
|
24
|
+
* milestone.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { AssistantConfig } from "../../config/schema.js";
|
|
28
|
+
import {
|
|
29
|
+
readNowScratchpad,
|
|
30
|
+
readPkbContext,
|
|
31
|
+
} from "../../daemon/conversation-runtime-assembly.js";
|
|
32
|
+
import type { ServerMessage } from "../../daemon/message-protocol.js";
|
|
33
|
+
import type { ConversationGraphMemory } from "../../memory/graph/conversation-graph-memory.js";
|
|
34
|
+
import type { Message } from "../../providers/types.js";
|
|
35
|
+
import { registerPlugin } from "../registry.js";
|
|
36
|
+
import {
|
|
37
|
+
type MemoryArgs,
|
|
38
|
+
type MemoryResult,
|
|
39
|
+
type Middleware,
|
|
40
|
+
type Plugin,
|
|
41
|
+
PluginExecutionError,
|
|
42
|
+
} from "../types.js";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Discriminator the agent loop uses to narrow `MemoryResult.memoryGraphBlocks`
|
|
46
|
+
* back into the full {@link GraphMemoryPayload} shape. Plugins that substitute
|
|
47
|
+
* their own memory blocks without setting this marker will fall through the
|
|
48
|
+
* agent loop's graph-result consumption path — which is the intended escape
|
|
49
|
+
* hatch for custom retrievers.
|
|
50
|
+
*/
|
|
51
|
+
export const DEFAULT_MEMORY_GRAPH_KIND = "default.graph" as const;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Shape of the single block the default memory-graph retriever emits.
|
|
55
|
+
*
|
|
56
|
+
* Mirrors the object returned by
|
|
57
|
+
* {@link ConversationGraphMemory.prepareMemory} — the agent loop consumes
|
|
58
|
+
* every field downstream (PKB query vectors, metrics persistence, memory
|
|
59
|
+
* event emission). Kept as a concrete type here so both the terminal and the
|
|
60
|
+
* agent loop can share one import.
|
|
61
|
+
*/
|
|
62
|
+
export interface GraphMemoryPayload {
|
|
63
|
+
readonly kind: typeof DEFAULT_MEMORY_GRAPH_KIND;
|
|
64
|
+
readonly result: Awaited<
|
|
65
|
+
ReturnType<ConversationGraphMemory["prepareMemory"]>
|
|
66
|
+
>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* External state the default retriever needs but the pipeline args cannot
|
|
71
|
+
* carry (conversation-scoped graph handle, event sink, live message list).
|
|
72
|
+
* Passed as a second argument to {@link runDefaultMemoryRetrieval} rather
|
|
73
|
+
* than threaded through {@link MemoryArgs} to keep the plugin-facing
|
|
74
|
+
* pipeline surface minimal.
|
|
75
|
+
*
|
|
76
|
+
* The per-turn abort signal lives on {@link MemoryArgs.signal} instead of
|
|
77
|
+
* here so the pipeline runner's `linkAbortSignal` can swap it for an
|
|
78
|
+
* internally-linked signal — that way a plugin timeout actually cancels
|
|
79
|
+
* the underlying `prepareMemory` work instead of letting it run after
|
|
80
|
+
* `Promise.race` has already rejected.
|
|
81
|
+
*/
|
|
82
|
+
export interface DefaultMemoryRetrievalDeps {
|
|
83
|
+
/** Live message list for this turn (pre-injection). */
|
|
84
|
+
readonly messages: Message[];
|
|
85
|
+
/** Per-conversation memory graph handle. */
|
|
86
|
+
readonly graphMemory: ConversationGraphMemory;
|
|
87
|
+
/** Assistant config snapshot. */
|
|
88
|
+
readonly config: AssistantConfig;
|
|
89
|
+
/** Event sink used by the graph retriever (memory_status events). */
|
|
90
|
+
readonly onEvent: (msg: ServerMessage) => void;
|
|
91
|
+
/** True when the actor for this turn is trusted (guardian-class). */
|
|
92
|
+
readonly isTrustedActor: boolean;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Run the default retrieval. Always returns a {@link MemoryResult}; skips
|
|
97
|
+
* the memory-graph call entirely when the actor is not trusted (matches the
|
|
98
|
+
* prior agent-loop gate).
|
|
99
|
+
*
|
|
100
|
+
* The returned `memoryGraphBlocks` is either empty (when the actor is not
|
|
101
|
+
* trusted) or a single {@link GraphMemoryPayload} wrapping the graph
|
|
102
|
+
* retriever's full output. The agent loop narrows via
|
|
103
|
+
* {@link DEFAULT_MEMORY_GRAPH_KIND} to consume it.
|
|
104
|
+
*/
|
|
105
|
+
export async function runDefaultMemoryRetrieval(
|
|
106
|
+
args: MemoryArgs,
|
|
107
|
+
deps: DefaultMemoryRetrievalDeps,
|
|
108
|
+
): Promise<MemoryResult> {
|
|
109
|
+
// NOW.md and PKB are read unconditionally — the agent loop decides
|
|
110
|
+
// whether to inject them based on first-turn / post-compaction gating.
|
|
111
|
+
const pkbContent = readPkbContext();
|
|
112
|
+
const nowContent = readNowScratchpad();
|
|
113
|
+
|
|
114
|
+
if (!deps.isTrustedActor) {
|
|
115
|
+
// Untrusted actors skip memory-graph retrieval entirely — preserves the
|
|
116
|
+
// pre-plugin gate that lived inline in `conversation-agent-loop.ts`.
|
|
117
|
+
return {
|
|
118
|
+
pkbContent,
|
|
119
|
+
nowContent,
|
|
120
|
+
memoryGraphBlocks: [],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// `prepareMemory` requires a non-optional signal. In production the agent
|
|
125
|
+
// loop always threads one via `args.signal`; the fallback `AbortController`
|
|
126
|
+
// keeps direct callers (e.g. tests that skip the pipeline) working without
|
|
127
|
+
// forcing every call site to synthesize a dummy signal.
|
|
128
|
+
const abortSignal = args.signal ?? new AbortController().signal;
|
|
129
|
+
const graphResult = await deps.graphMemory.prepareMemory(
|
|
130
|
+
deps.messages,
|
|
131
|
+
deps.config,
|
|
132
|
+
abortSignal,
|
|
133
|
+
deps.onEvent,
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const payload: GraphMemoryPayload = {
|
|
137
|
+
kind: DEFAULT_MEMORY_GRAPH_KIND,
|
|
138
|
+
result: graphResult,
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
pkbContent,
|
|
143
|
+
nowContent,
|
|
144
|
+
memoryGraphBlocks: [payload],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Narrow a {@link MemoryResult} memory-graph block back into the full
|
|
150
|
+
* {@link GraphMemoryPayload} the default retriever emits. Returns `null` when
|
|
151
|
+
* the pipeline output came from a custom retriever (no blocks, or a block
|
|
152
|
+
* without the {@link DEFAULT_MEMORY_GRAPH_KIND} discriminator).
|
|
153
|
+
*
|
|
154
|
+
* The agent loop uses this helper to decide whether to run its downstream
|
|
155
|
+
* graph-result consumption path (query-vector propagation, metric
|
|
156
|
+
* persistence, memory-event emission). Custom retrievers that skip that
|
|
157
|
+
* path are expected to handle their own side effects inside their
|
|
158
|
+
* middleware.
|
|
159
|
+
*/
|
|
160
|
+
export function asDefaultGraphPayload(
|
|
161
|
+
blocks: ReadonlyArray<unknown>,
|
|
162
|
+
): GraphMemoryPayload | null {
|
|
163
|
+
const first = blocks[0];
|
|
164
|
+
if (
|
|
165
|
+
first != null &&
|
|
166
|
+
typeof first === "object" &&
|
|
167
|
+
"kind" in first &&
|
|
168
|
+
(first as { kind?: unknown }).kind === DEFAULT_MEMORY_GRAPH_KIND
|
|
169
|
+
) {
|
|
170
|
+
return first as GraphMemoryPayload;
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Default `memoryRetrieval` middleware — a pure pass-through.
|
|
177
|
+
*
|
|
178
|
+
* Keeping a real middleware registered (rather than an empty list) makes
|
|
179
|
+
* the pipeline observable in `plugin.pipeline` logs with a non-empty
|
|
180
|
+
* `chain` field and lets third-party plugins rely on the default slot
|
|
181
|
+
* being present even when nothing is overriding it. The work happens in
|
|
182
|
+
* the terminal supplied by the agent loop, which calls
|
|
183
|
+
* {@link runDefaultMemoryRetrieval}.
|
|
184
|
+
*/
|
|
185
|
+
const defaultMemoryRetrievalMiddleware: Middleware<MemoryArgs, MemoryResult> =
|
|
186
|
+
async function defaultMemoryRetrieval(args, next) {
|
|
187
|
+
return next(args);
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Default plugin exposing the `memoryRetrieval` pipeline slot. Registered
|
|
192
|
+
* by {@link registerDefaultMemoryRetrievalPlugin} from the plugin
|
|
193
|
+
* bootstrap wiring so ordering is deterministic across boots.
|
|
194
|
+
*/
|
|
195
|
+
export const defaultMemoryRetrievalPlugin: Plugin = {
|
|
196
|
+
manifest: {
|
|
197
|
+
name: "default-memory-retrieval",
|
|
198
|
+
version: "0.0.1",
|
|
199
|
+
requires: { pluginRuntime: "v1", memoryApi: "v1" },
|
|
200
|
+
},
|
|
201
|
+
middleware: {
|
|
202
|
+
memoryRetrieval: defaultMemoryRetrievalMiddleware,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// Module-load side effect: register this default at import time so
|
|
207
|
+
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
208
|
+
// observe a populated registry by default. Idempotent via the swallowed
|
|
209
|
+
// duplicate-name check. Kept local to this module (rather than iterating
|
|
210
|
+
// an array in `defaults/index.ts`) so the registration only references
|
|
211
|
+
// the already-initialized `defaultMemoryRetrievalPlugin` identifier —
|
|
212
|
+
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
213
|
+
// other default plugin and directly import this file.
|
|
214
|
+
try {
|
|
215
|
+
registerPlugin(defaultMemoryRetrievalPlugin);
|
|
216
|
+
} catch (err) {
|
|
217
|
+
if (
|
|
218
|
+
err instanceof PluginExecutionError &&
|
|
219
|
+
err.message.includes("already registered")
|
|
220
|
+
) {
|
|
221
|
+
// already registered — expected when both index.ts and the direct
|
|
222
|
+
// file are imported in the same process
|
|
223
|
+
} else {
|
|
224
|
+
throw err;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `overflowReduce` plugin — extracted verbatim from the inline
|
|
3
|
+
* preflight reducer loop that previously lived in
|
|
4
|
+
* `daemon/conversation-agent-loop.ts` (the `while (preflightAttempts < …)`
|
|
5
|
+
* block around lines 1045–1156 before PR 23).
|
|
6
|
+
*
|
|
7
|
+
* The plugin owns the reducer tier-loop (forced compaction, tool-result
|
|
8
|
+
* truncation, media stubbing, injection downgrade) and the post-step
|
|
9
|
+
* re-injection / re-estimation dance. Orchestrator-specific coupling
|
|
10
|
+
* (activity emission, circuit-breaker tracking, compaction-result
|
|
11
|
+
* application, runtime injection reassembly) is threaded in through the
|
|
12
|
+
* callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
|
|
13
|
+
* access to the agent-loop context object.
|
|
14
|
+
*
|
|
15
|
+
* Internal calls to `ContextWindowManager` remain direct — pipeline layering
|
|
16
|
+
* ends at the top of the reducer, not within the forced-compaction tier.
|
|
17
|
+
* The supplied `compactFn` delegates straight into the context window
|
|
18
|
+
* manager, so only the tier-loop orchestration goes through the pipeline
|
|
19
|
+
* runner.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { ContextWindowCompactOptions } from "../../context/window-manager.js";
|
|
23
|
+
import {
|
|
24
|
+
createInitialReducerState,
|
|
25
|
+
reduceContextOverflow,
|
|
26
|
+
type ReducerState,
|
|
27
|
+
} from "../../daemon/context-overflow-reducer.js";
|
|
28
|
+
import { registerPlugin } from "../registry.js";
|
|
29
|
+
import {
|
|
30
|
+
type Middleware,
|
|
31
|
+
type OverflowReduceArgs,
|
|
32
|
+
type OverflowReduceResult,
|
|
33
|
+
type Plugin,
|
|
34
|
+
PluginExecutionError,
|
|
35
|
+
} from "../types.js";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Default middleware — implements the historical tier-loop semantics.
|
|
39
|
+
*
|
|
40
|
+
* The middleware intentionally ignores `next`. Overflow reduction is a
|
|
41
|
+
* *terminal* behavior: there is no downstream implementation to defer to
|
|
42
|
+
* when a user-supplied middleware short-circuits. Later plugins may still
|
|
43
|
+
* wrap this one (outer middleware can observe each reduction iteration via
|
|
44
|
+
* their own `next` callback) but the default never delegates to a
|
|
45
|
+
* hypothetical base handler — the inline loop was the base.
|
|
46
|
+
*/
|
|
47
|
+
export const defaultOverflowReduceMiddleware: Middleware<
|
|
48
|
+
OverflowReduceArgs,
|
|
49
|
+
OverflowReduceResult
|
|
50
|
+
> = async function defaultOverflowReduceMiddleware(args, _next, _ctx) {
|
|
51
|
+
let messages = args.messages;
|
|
52
|
+
let runMessages = args.runMessages;
|
|
53
|
+
let injectionMode: "full" | "minimal" = "full";
|
|
54
|
+
let reducerState: ReducerState = createInitialReducerState();
|
|
55
|
+
let reducerCompacted = false;
|
|
56
|
+
let attempts = 0;
|
|
57
|
+
|
|
58
|
+
while (attempts < args.maxAttempts && !reducerState.exhausted) {
|
|
59
|
+
// Abort check at the top of every iteration. When the pipeline runner
|
|
60
|
+
// arms a timeout (or the caller aborts externally), `args.abortSignal`
|
|
61
|
+
// is linked to that trigger via `linkAbortSignal`, so this check lets
|
|
62
|
+
// us bail out BETWEEN iterations rather than letting another round of
|
|
63
|
+
// compaction / re-injection mutate `ctx.messages` after the turn has
|
|
64
|
+
// already failed. Individual `reduceContextOverflow` calls also honor
|
|
65
|
+
// the signal, but without this gate a fresh iteration could still
|
|
66
|
+
// start after the signal fires, since the previous one returned
|
|
67
|
+
// normally before the abort propagated.
|
|
68
|
+
args.abortSignal?.throwIfAborted();
|
|
69
|
+
|
|
70
|
+
attempts++;
|
|
71
|
+
args.emitActivityState();
|
|
72
|
+
|
|
73
|
+
const step = await reduceContextOverflow(
|
|
74
|
+
messages,
|
|
75
|
+
{
|
|
76
|
+
providerName: args.providerName,
|
|
77
|
+
systemPrompt: args.systemPrompt,
|
|
78
|
+
contextWindow: args.contextWindow,
|
|
79
|
+
targetTokens: args.preflightBudget,
|
|
80
|
+
toolTokenBudget: args.toolTokenBudget,
|
|
81
|
+
},
|
|
82
|
+
reducerState,
|
|
83
|
+
(msgs, signal, opts: ContextWindowCompactOptions) =>
|
|
84
|
+
args.compactFn(msgs, signal, opts),
|
|
85
|
+
args.abortSignal,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
reducerState = step.state;
|
|
89
|
+
messages = step.messages;
|
|
90
|
+
injectionMode = step.state.injectionMode;
|
|
91
|
+
|
|
92
|
+
// Per-iteration compaction flag: whether THIS step just produced a
|
|
93
|
+
// fresh compaction. PKB / NOW re-injection is gated on this — see the
|
|
94
|
+
// reinjectForMode JSDoc for why the two signals differ.
|
|
95
|
+
const stepCompacted = step.compactionResult?.compacted === true;
|
|
96
|
+
|
|
97
|
+
// Let the orchestrator apply compaction side effects (circuit-breaker
|
|
98
|
+
// tracking, event emission, ctx mutation) before we re-inject.
|
|
99
|
+
if (step.compactionResult) {
|
|
100
|
+
await args.onCompactionResult(step.compactionResult);
|
|
101
|
+
if (stepCompacted) {
|
|
102
|
+
reducerCompacted = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Second abort gate — if the side effects or the step itself took us
|
|
107
|
+
// past the deadline, don't rebuild runMessages or iterate again.
|
|
108
|
+
args.abortSignal?.throwIfAborted();
|
|
109
|
+
|
|
110
|
+
// Rebuild runMessages via the orchestrator-supplied helper (which
|
|
111
|
+
// re-runs `applyRuntimeInjections` with potentially downgraded mode
|
|
112
|
+
// and freshly re-hydrated PKB/NOW blocks after compaction). We pass
|
|
113
|
+
// the current reduced `messages` explicitly so the orchestrator never
|
|
114
|
+
// has to read from mutable shared state to rebuild runMessages — a
|
|
115
|
+
// tier that doesn't trigger compaction (tool-result truncation, media
|
|
116
|
+
// stubbing) won't update `ctx.messages` on its own.
|
|
117
|
+
//
|
|
118
|
+
// `stepCompacted` and `reducerCompacted` are both passed so the
|
|
119
|
+
// orchestrator can gate PKB / NOW re-injection per-iteration while
|
|
120
|
+
// keeping `slackChronologicalMessages` suppressed once any iteration
|
|
121
|
+
// has compacted.
|
|
122
|
+
runMessages = await args.reinjectForMode(
|
|
123
|
+
messages,
|
|
124
|
+
injectionMode,
|
|
125
|
+
stepCompacted,
|
|
126
|
+
reducerCompacted,
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
// Re-estimate with injections included — `step.estimatedTokens` was
|
|
130
|
+
// computed on bare history and doesn't account for tokens added by
|
|
131
|
+
// runtime injections.
|
|
132
|
+
const postInjectionTokens = args.estimatePostInjection(runMessages);
|
|
133
|
+
if (postInjectionTokens <= args.preflightBudget) break;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
messages,
|
|
138
|
+
runMessages,
|
|
139
|
+
injectionMode,
|
|
140
|
+
reducerState,
|
|
141
|
+
reducerCompacted,
|
|
142
|
+
attempts,
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* The default plugin registered at bootstrap. No `init`/`onShutdown` —
|
|
148
|
+
* registering the middleware is the only behavior.
|
|
149
|
+
*/
|
|
150
|
+
export const defaultOverflowReducePlugin: Plugin = {
|
|
151
|
+
manifest: {
|
|
152
|
+
name: "default-overflow-reduce",
|
|
153
|
+
version: "1.0.0",
|
|
154
|
+
requires: { pluginRuntime: "v1", overflowReduceApi: "v1" },
|
|
155
|
+
},
|
|
156
|
+
middleware: {
|
|
157
|
+
overflowReduce: defaultOverflowReduceMiddleware,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// Module-load side effect: register this default at import time so
|
|
162
|
+
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
163
|
+
// observe a populated registry by default. Idempotent via the swallowed
|
|
164
|
+
// duplicate-name check. Kept local to this module (rather than iterating
|
|
165
|
+
// an array in `defaults/index.ts`) so the registration only references
|
|
166
|
+
// the already-initialized `defaultOverflowReducePlugin` identifier —
|
|
167
|
+
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
168
|
+
// other default plugin and directly import this file.
|
|
169
|
+
try {
|
|
170
|
+
registerPlugin(defaultOverflowReducePlugin);
|
|
171
|
+
} catch (err) {
|
|
172
|
+
if (
|
|
173
|
+
err instanceof PluginExecutionError &&
|
|
174
|
+
err.message.includes("already registered")
|
|
175
|
+
) {
|
|
176
|
+
// already registered — expected when both index.ts and the direct
|
|
177
|
+
// file are imported in the same process
|
|
178
|
+
} else {
|
|
179
|
+
throw err;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `persistence` plugin.
|
|
3
|
+
*
|
|
4
|
+
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
+
* the result unchanged. The actual dispatch lives in
|
|
6
|
+
* {@link defaultPersistenceTerminal}, which is wired in as the pipeline's
|
|
7
|
+
* `terminal` argument by `runPipeline` call sites in
|
|
8
|
+
* `daemon/conversation-agent-loop.ts` and
|
|
9
|
+
* `daemon/conversation-agent-loop-handlers.ts`. This separation matters: the
|
|
10
|
+
* default plugin is registered before any user plugin (defaults load first in
|
|
11
|
+
* `bootstrapPlugins()`), which puts it at the OUTERMOST position of the onion
|
|
12
|
+
* chain. If the default middleware were to invoke the terminal directly
|
|
13
|
+
* without calling `next`, it would shadow every later-registered plugin.
|
|
14
|
+
* Routing through `next(args)` lets user middleware participate normally.
|
|
15
|
+
*
|
|
16
|
+
* The terminal dispatches on the discriminated {@link PersistArgs.op} field:
|
|
17
|
+
*
|
|
18
|
+
* - `add` → {@link addMessage}, optionally followed by
|
|
19
|
+
* {@link syncMessageToDisk} when `args.syncToDisk` is true.
|
|
20
|
+
* - `update` → {@link updateMessageMetadata} (returns `void`, wrapped as
|
|
21
|
+
* `{ op: "update" }`).
|
|
22
|
+
* - `delete` → {@link deleteMessageById} (returns the segment/summary IDs
|
|
23
|
+
* the caller must clean up out-of-band).
|
|
24
|
+
*
|
|
25
|
+
* Manifest declares `provides.persistence: "v1"` so other plugins can
|
|
26
|
+
* negotiate against the pipeline surface and `requires.pluginRuntime: "v1"`
|
|
27
|
+
* to satisfy the registry's mandatory capability check.
|
|
28
|
+
*
|
|
29
|
+
* Registered from `daemon/external-plugins-bootstrap.ts` via a side-effect
|
|
30
|
+
* import so the plugin is present in the registry before
|
|
31
|
+
* {@link bootstrapPlugins} walks it.
|
|
32
|
+
*
|
|
33
|
+
* Design doc: `.private/plans/agent-plugin-system.md` (PR 27).
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import {
|
|
37
|
+
addMessage,
|
|
38
|
+
deleteMessageById,
|
|
39
|
+
updateMessageMetadata,
|
|
40
|
+
} from "../../memory/conversation-crud.js";
|
|
41
|
+
import { syncMessageToDisk } from "../../memory/conversation-disk-view.js";
|
|
42
|
+
import { registerPlugin } from "../registry.js";
|
|
43
|
+
import {
|
|
44
|
+
type Middleware,
|
|
45
|
+
type PersistArgs,
|
|
46
|
+
type PersistResult,
|
|
47
|
+
type Plugin,
|
|
48
|
+
PluginExecutionError,
|
|
49
|
+
} from "../types.js";
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Terminal handler for the `persistence` pipeline. Exported so tests can
|
|
53
|
+
* verify default behavior directly without going through `runPipeline`, and
|
|
54
|
+
* so the `daemon/conversation-agent-loop*.ts` call sites can pass it as the
|
|
55
|
+
* `terminal` argument to `runPipeline`.
|
|
56
|
+
*/
|
|
57
|
+
export async function defaultPersistenceTerminal(
|
|
58
|
+
args: PersistArgs,
|
|
59
|
+
): Promise<PersistResult> {
|
|
60
|
+
switch (args.op) {
|
|
61
|
+
case "add": {
|
|
62
|
+
const message = await addMessage(
|
|
63
|
+
args.conversationId,
|
|
64
|
+
args.role,
|
|
65
|
+
args.content,
|
|
66
|
+
args.metadata,
|
|
67
|
+
args.addOptions,
|
|
68
|
+
);
|
|
69
|
+
// Sync the just-persisted row to the JSONL disk view when the caller
|
|
70
|
+
// opted in. The handler that emits tool-result rows sets
|
|
71
|
+
// `syncToDisk: true` so the disk view stays in lockstep with the DB.
|
|
72
|
+
if (args.syncToDisk && args.createdAtMs !== undefined) {
|
|
73
|
+
syncMessageToDisk(args.conversationId, message.id, args.createdAtMs);
|
|
74
|
+
}
|
|
75
|
+
return { op: "add", message };
|
|
76
|
+
}
|
|
77
|
+
case "update": {
|
|
78
|
+
updateMessageMetadata(args.messageId, args.updates);
|
|
79
|
+
return { op: "update" };
|
|
80
|
+
}
|
|
81
|
+
case "delete": {
|
|
82
|
+
const deleted = deleteMessageById(args.messageId);
|
|
83
|
+
return {
|
|
84
|
+
op: "delete",
|
|
85
|
+
segmentIds: deleted.segmentIds,
|
|
86
|
+
deletedSummaryIds: deleted.deletedSummaryIds,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const passthrough: Middleware<PersistArgs, PersistResult> = async (
|
|
93
|
+
args,
|
|
94
|
+
next,
|
|
95
|
+
) => next(args);
|
|
96
|
+
|
|
97
|
+
export const defaultPersistencePlugin: Plugin = {
|
|
98
|
+
manifest: {
|
|
99
|
+
name: "default-persistence",
|
|
100
|
+
version: "1.0.0",
|
|
101
|
+
provides: { persistence: "v1" },
|
|
102
|
+
requires: { pluginRuntime: "v1" },
|
|
103
|
+
},
|
|
104
|
+
middleware: {
|
|
105
|
+
persistence: passthrough,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Module-load side effect: register this default at import time so
|
|
110
|
+
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
111
|
+
// observe a populated registry by default. Idempotent via the swallowed
|
|
112
|
+
// duplicate-name check. Kept local to this module (rather than iterating
|
|
113
|
+
// an array in `defaults/index.ts`) so the registration only references
|
|
114
|
+
// the already-initialized `defaultPersistencePlugin` identifier —
|
|
115
|
+
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
116
|
+
// other default plugin and directly import this file.
|
|
117
|
+
try {
|
|
118
|
+
registerPlugin(defaultPersistencePlugin);
|
|
119
|
+
} catch (err) {
|
|
120
|
+
if (
|
|
121
|
+
err instanceof PluginExecutionError &&
|
|
122
|
+
err.message.includes("already registered")
|
|
123
|
+
) {
|
|
124
|
+
// already registered — expected when both index.ts and the direct
|
|
125
|
+
// file are imported in the same process
|
|
126
|
+
} else {
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `titleGenerate` pipeline plugin.
|
|
3
|
+
*
|
|
4
|
+
* The terminal for the `titleGenerate` pipeline. Delegates to
|
|
5
|
+
* {@link queueGenerateConversationTitle}, which schedules title generation
|
|
6
|
+
* as fire-and-forget background work and falls back to a deterministic
|
|
7
|
+
* placeholder on failure.
|
|
8
|
+
*
|
|
9
|
+
* Custom plugins may install middleware that short-circuits this terminal
|
|
10
|
+
* (e.g. a deterministic generator for tests, or an alternative LLM routing
|
|
11
|
+
* policy). When no middleware is installed the pipeline calls this
|
|
12
|
+
* terminal directly and behavior is bit-identical to the pre-plugin code
|
|
13
|
+
* path.
|
|
14
|
+
*
|
|
15
|
+
* Registered via a side-effect import from
|
|
16
|
+
* `daemon/external-plugins-bootstrap.ts` so it is present in the registry
|
|
17
|
+
* by the time {@link bootstrapPlugins} runs.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { queueGenerateConversationTitle } from "../../memory/conversation-title-service.js";
|
|
21
|
+
import { registerPlugin } from "../registry.js";
|
|
22
|
+
import {
|
|
23
|
+
type Plugin,
|
|
24
|
+
PluginExecutionError,
|
|
25
|
+
type TitleArgs,
|
|
26
|
+
type TitleResult,
|
|
27
|
+
} from "../types.js";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Invoke the title-generation service with the provided arguments. Used as
|
|
31
|
+
* the terminal handler for the `titleGenerate` pipeline in
|
|
32
|
+
* `conversation-agent-loop.ts`, and re-exported for tests that want to
|
|
33
|
+
* exercise the default directly.
|
|
34
|
+
*
|
|
35
|
+
* Returns an empty result — the service is fire-and-forget and surfaces its
|
|
36
|
+
* output through `onTitleUpdated`.
|
|
37
|
+
*/
|
|
38
|
+
export async function defaultTitleGenerateTerminal(
|
|
39
|
+
args: TitleArgs,
|
|
40
|
+
): Promise<TitleResult> {
|
|
41
|
+
queueGenerateConversationTitle({
|
|
42
|
+
conversationId: args.conversationId,
|
|
43
|
+
provider: args.provider,
|
|
44
|
+
userMessage: args.userMessage,
|
|
45
|
+
onTitleUpdated: args.onTitleUpdated,
|
|
46
|
+
});
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Default titleGenerate plugin. Declares no middleware — it exists purely
|
|
52
|
+
* to negotiate the `titleGenerateApi` capability so bootstrap has a record
|
|
53
|
+
* that the assistant runtime exposes this pipeline.
|
|
54
|
+
*
|
|
55
|
+
* The terminal is supplied at the call site in
|
|
56
|
+
* `conversation-agent-loop.ts` (see {@link defaultTitleGenerateTerminal})
|
|
57
|
+
* rather than through `middleware.titleGenerate`, because a default
|
|
58
|
+
* middleware would short-circuit user-registered middleware by always
|
|
59
|
+
* running first in onion order. Keeping the terminal outside the
|
|
60
|
+
* middleware chain lets user plugins observe/transform/short-circuit the
|
|
61
|
+
* call without competing with an assistant-owned default middleware.
|
|
62
|
+
*/
|
|
63
|
+
export const defaultTitleGeneratePlugin: Plugin = {
|
|
64
|
+
manifest: {
|
|
65
|
+
name: "default-title-generate",
|
|
66
|
+
version: "1.0.0",
|
|
67
|
+
provides: { titleGenerate: "v1" },
|
|
68
|
+
requires: {
|
|
69
|
+
pluginRuntime: "v1",
|
|
70
|
+
titleGenerateApi: "v1",
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Module-load side effect: register this default at import time so
|
|
76
|
+
// downstream consumers (including tests that skip `bootstrapPlugins()`)
|
|
77
|
+
// observe a populated registry by default. Idempotent via the swallowed
|
|
78
|
+
// duplicate-name check. Kept local to this module (rather than iterating
|
|
79
|
+
// an array in `defaults/index.ts`) so the registration only references
|
|
80
|
+
// the already-initialized `defaultTitleGeneratePlugin` identifier —
|
|
81
|
+
// avoiding a TDZ crash when tests `mock.module(...)` a dependency of any
|
|
82
|
+
// other default plugin and directly import this file.
|
|
83
|
+
try {
|
|
84
|
+
registerPlugin(defaultTitleGeneratePlugin);
|
|
85
|
+
} catch (err) {
|
|
86
|
+
if (
|
|
87
|
+
err instanceof PluginExecutionError &&
|
|
88
|
+
err.message.includes("already registered")
|
|
89
|
+
) {
|
|
90
|
+
// already registered — expected when both index.ts and the direct
|
|
91
|
+
// file are imported in the same process
|
|
92
|
+
} else {
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
}
|