@vellumai/assistant 0.6.5 → 0.7.0
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/AGENTS.md +29 -1
- package/ARCHITECTURE.md +60 -53
- package/Dockerfile +25 -3
- package/README.md +8 -10
- package/__tests__/permissions/gateway-threshold-reader.test.ts +277 -0
- package/bun.lock +306 -119
- package/docs/architecture/integrations.md +32 -39
- package/docs/architecture/memory.md +26 -120
- package/docs/architecture/security.md +22 -36
- package/docs/browser-use-architecture-phase2.md +63 -20
- package/docs/credential-execution-service.md +7 -5
- package/docs/plugins.md +761 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +17 -45
- package/examples/plugins/echo/README.md +132 -0
- package/examples/plugins/echo/bun.lock +25 -0
- package/examples/plugins/echo/package.json +17 -0
- package/examples/plugins/echo/register.ts +187 -0
- package/knip.json +8 -22
- package/node_modules/@vellumai/ces-client/bun.lock +33 -0
- package/node_modules/@vellumai/ces-client/package.json +25 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +631 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/package-boundary.test.ts +138 -0
- package/node_modules/@vellumai/ces-client/src/credential-rpc.ts +13 -0
- package/node_modules/@vellumai/ces-client/src/http-credentials.ts +296 -0
- package/node_modules/@vellumai/ces-client/src/http-log-export.ts +111 -0
- package/node_modules/@vellumai/ces-client/src/index.ts +43 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +445 -0
- package/node_modules/@vellumai/credential-storage/src/__tests__/package-boundary.test.ts +32 -6
- package/node_modules/@vellumai/egress-proxy/src/__tests__/package-boundary.test.ts +32 -1
- package/node_modules/@vellumai/egress-proxy/src/types.ts +19 -0
- package/node_modules/@vellumai/gateway-client/bun.lock +39 -0
- package/node_modules/@vellumai/gateway-client/package.json +23 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/gateway-client.test.ts +343 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/package-boundary.test.ts +140 -0
- package/node_modules/@vellumai/gateway-client/src/http-delivery.ts +422 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +35 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +331 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +131 -0
- package/node_modules/@vellumai/gateway-client/tsconfig.json +20 -0
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/bun.lock +1 -1
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/package.json +4 -2
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/contracts.test.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +155 -0
- package/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +23 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +25 -0
- package/node_modules/@vellumai/{ces-contracts/src/index.ts → service-contracts/src/transport.ts} +6 -28
- package/node_modules/@vellumai/service-contracts/src/trust-rules.ts +116 -0
- package/node_modules/@vellumai/service-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +891 -0
- package/node_modules/@vellumai/skill-host-contracts/bun.lock +24 -0
- package/node_modules/@vellumai/skill-host-contracts/package.json +18 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +91 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +1348 -0
- package/node_modules/@vellumai/skill-host-contracts/src/index.ts +6 -0
- package/node_modules/@vellumai/skill-host-contracts/src/runtime-mode.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +32 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +333 -0
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +444 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.test.json +12 -0
- package/openapi.yaml +3135 -692
- package/package.json +13 -7
- package/scripts/check-circular-deps.ts +80 -0
- package/scripts/generate-openapi.ts +24 -7
- package/{src/memory/graph/inspect.ts → scripts/memory-inspect.ts} +28 -28
- package/src/__tests__/access-request-decision.test.ts +2 -11
- package/src/__tests__/acp-session.test.ts +4 -150
- package/src/__tests__/actor-token-service.test.ts +17 -678
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +2 -6
- package/src/__tests__/agent-loop-override-profile.test.ts +404 -0
- package/src/__tests__/agent-loop-thinking.test.ts +4 -4
- package/src/__tests__/agent-wake-override-profile.test.ts +261 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -1
- package/src/__tests__/anthropic-provider.test.ts +127 -15
- package/src/__tests__/app-compiler.test.ts +57 -0
- package/src/__tests__/app-routes-csp.test.ts +106 -55
- package/src/__tests__/approval-cascade.test.ts +10 -357
- package/src/__tests__/approval-conversation-turn.test.ts +3 -8
- package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +2 -1
- package/src/__tests__/approval-routes-http.test.ts +34 -451
- package/src/__tests__/assistant-events-sse-hardening.test.ts +73 -80
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -3
- package/src/__tests__/attachment-upload-trusted-source.test.ts +139 -0
- package/src/__tests__/attachments-store.test.ts +46 -1
- package/src/__tests__/audit-log-rotation.test.ts +2 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -20
- package/src/__tests__/avatar-generator.test.ts +4 -2
- package/src/__tests__/background-shell-bash.test.ts +227 -0
- package/src/__tests__/background-shell-host-bash.test.ts +474 -0
- package/src/__tests__/background-tool-registry.test.ts +145 -0
- package/src/__tests__/background-tool-routes.test.ts +175 -0
- package/src/__tests__/btw-routes.test.ts +147 -183
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-controller.test.ts +15 -2
- package/src/__tests__/call-conversation-messages.test.ts +2 -1
- package/src/__tests__/call-domain.test.ts +2 -2
- package/src/__tests__/call-pointer-messages.test.ts +11 -13
- package/src/__tests__/call-recovery.test.ts +2 -1
- package/src/__tests__/call-routes-http.test.ts +3 -14
- package/src/__tests__/call-store.test.ts +2 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +31 -62
- package/src/__tests__/canonical-guardian-store.test.ts +2 -2
- package/src/__tests__/catalog-cache.test.ts +69 -0
- package/src/__tests__/catalog-files.test.ts +0 -26
- package/src/__tests__/ces-rpc-credential-backend.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +79 -49
- package/src/__tests__/channel-approval.test.ts +9 -7
- package/src/__tests__/channel-approvals.test.ts +9 -180
- package/src/__tests__/channel-delivery-store.test.ts +11 -10
- package/src/__tests__/channel-guardian.test.ts +14 -25
- package/src/__tests__/channel-readiness-service.test.ts +8 -6
- package/src/__tests__/channel-reply-delivery.test.ts +3 -19
- package/src/__tests__/channel-retry-sweep.test.ts +2 -5
- package/src/__tests__/checker.test.ts +447 -3806
- package/src/__tests__/circuit-breaker-pipeline.test.ts +406 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +208 -0
- package/src/__tests__/cli.test.ts +1 -38
- package/src/__tests__/compaction-events.test.ts +500 -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__/config-managed-gemini-defaults.test.ts +3 -7
- package/src/__tests__/config-model-image-provider.test.ts +109 -0
- package/src/__tests__/config-schema-cmd.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +25 -203
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -25
- package/src/__tests__/contact-store-user-file.test.ts +2 -1
- package/src/__tests__/contacts-tools.test.ts +71 -18
- package/src/__tests__/contacts-write.test.ts +6 -61
- package/src/__tests__/context-overflow-policy.test.ts +7 -7
- package/src/__tests__/context-search-agent-protocol.test.ts +230 -0
- package/src/__tests__/context-search-agent-runner.test.ts +998 -0
- package/src/__tests__/context-search-conversations-source.test.ts +320 -0
- package/src/__tests__/context-search-fanout.test.ts +380 -0
- package/src/__tests__/context-search-memory-source.test.ts +311 -0
- package/src/__tests__/context-search-pkb-source.test.ts +444 -0
- package/src/__tests__/context-search-types.test.ts +95 -0
- package/src/__tests__/context-search-workspace-source.test.ts +545 -0
- package/src/__tests__/context-window-manager.test.ts +380 -4
- package/src/__tests__/conversation-abort-tool-results.test.ts +14 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +631 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +41 -32
- package/src/__tests__/conversation-agent-loop.test.ts +54 -143
- package/src/__tests__/conversation-analysis-routes.test.ts +60 -82
- package/src/__tests__/conversation-attachments.test.ts +9 -20
- package/src/__tests__/conversation-attention-store.test.ts +2 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +4 -2
- package/src/__tests__/conversation-clear-safety.test.ts +53 -95
- package/src/__tests__/conversation-confirmation-signals.test.ts +7 -40
- package/src/__tests__/conversation-crud-inference-profile.test.ts +54 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +63 -157
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +5 -4
- package/src/__tests__/conversation-fork-crud.test.ts +26 -55
- package/src/__tests__/conversation-fork-route.test.ts +5 -74
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +128 -0
- package/src/__tests__/conversation-inference-profile-route.test.ts +216 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +4 -95
- package/src/__tests__/conversation-key-store-disk-view.test.ts +2 -1
- package/src/__tests__/conversation-lifecycle.test.ts +0 -1
- package/src/__tests__/conversation-list-source.test.ts +2 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -1
- package/src/__tests__/conversation-pairing.test.ts +174 -11
- package/src/__tests__/conversation-pre-run-repair.test.ts +137 -294
- package/src/__tests__/conversation-process-callsite.test.ts +3 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +22 -8
- package/src/__tests__/conversation-queue.test.ts +30 -47
- package/src/__tests__/conversation-routes-disk-view.test.ts +131 -103
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +80 -55
- package/src/__tests__/conversation-routes-slash-commands.test.ts +83 -12
- package/src/__tests__/conversation-runtime-assembly.test.ts +196 -194
- package/src/__tests__/conversation-runtime-workspace.test.ts +23 -38
- package/src/__tests__/conversation-seed-composer.test.ts +2 -2
- package/src/__tests__/conversation-slash-commands.test.ts +6 -43
- package/src/__tests__/conversation-slash-queue.test.ts +7 -3
- package/src/__tests__/conversation-slash-unknown.test.ts +25 -3
- package/src/__tests__/conversation-speed-override.test.ts +6 -2
- package/src/__tests__/conversation-starter-routes.test.ts +177 -55
- package/src/__tests__/conversation-starters-cadence.test.ts +2 -2
- package/src/__tests__/conversation-store.test.ts +2 -375
- package/src/__tests__/conversation-title-service.test.ts +116 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +42 -3
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +6 -6
- package/src/__tests__/conversation-unread-route.test.ts +1 -1
- package/src/__tests__/conversation-usage.test.ts +3 -2
- package/src/__tests__/conversation-wipe.test.ts +2 -103
- package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -2
- package/src/__tests__/conversation-workspace-injection.test.ts +3 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -2
- package/src/__tests__/conversations-defer-cli.test.ts +150 -0
- package/src/__tests__/credential-execution-admin-cli.test.ts +1 -1
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +2 -2
- package/src/__tests__/credential-execution-approval-bridge.test.ts +22 -289
- package/src/__tests__/credential-execution-client.test.ts +1 -1
- package/src/__tests__/credential-execution-managed-contract.test.ts +1 -1
- package/src/__tests__/credential-health-service.test.ts +78 -9
- package/src/__tests__/credential-security-invariants.test.ts +16 -2
- package/src/__tests__/credentials-cli.test.ts +45 -21
- package/src/__tests__/daemon-credential-client.test.ts +23 -108
- package/src/__tests__/db-acp-history.test.ts +284 -0
- package/src/__tests__/db-activation-state.test.ts +240 -0
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +2 -1
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +248 -0
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +2 -1
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +116 -0
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +132 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/delete-propagation.test.ts +3 -2
- package/src/__tests__/deterministic-verification-control-plane.test.ts +39 -32
- package/src/__tests__/dm-backfill.test.ts +3 -2
- package/src/__tests__/edit-propagation.test.ts +5 -7
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +1 -1
- package/src/__tests__/empty-response-pipeline.test.ts +305 -0
- package/src/__tests__/events-client-registration.test.ts +297 -0
- package/src/__tests__/file-write-tool.test.ts +2 -4
- package/src/__tests__/filing-service.test.ts +144 -17
- package/src/__tests__/first-greeting.test.ts +247 -5
- package/src/__tests__/followup-tools.test.ts +2 -1
- package/src/__tests__/gateway-client-managed-outbound.test.ts +8 -12
- package/src/__tests__/gateway-only-enforcement.test.ts +2 -6
- package/src/__tests__/gateway-only-guard.test.ts +4 -3
- package/src/__tests__/gemini-provider.test.ts +276 -10
- package/src/__tests__/graph-extraction-event-date.test.ts +30 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +2 -2
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +9 -9
- package/src/__tests__/guardian-action-late-reply.test.ts +2 -1
- package/src/__tests__/guardian-action-store.test.ts +2 -1
- package/src/__tests__/guardian-action-sweep.test.ts +9 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +21 -118
- package/src/__tests__/guardian-dispatch.test.ts +14 -11
- package/src/__tests__/guardian-grant-minting.test.ts +9 -15
- package/src/__tests__/guardian-outbound-http.test.ts +71 -106
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +34 -90
- package/src/__tests__/guardian-routing-state.test.ts +14 -22
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +253 -0
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +8 -4
- package/src/__tests__/headless-browser-mode.test.ts +57 -0
- package/src/__tests__/heartbeat-service.test.ts +39 -21
- package/src/__tests__/helpers/call-route-handler.ts +72 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +161 -0
- package/src/__tests__/helpers/gateway-classify-mock.ts +67 -0
- package/src/__tests__/helpers/mock-logger.ts +36 -0
- package/src/__tests__/history-repair-pipeline.test.ts +399 -0
- package/src/__tests__/home-state-routes.test.ts +10 -31
- package/src/__tests__/host-browser-e2e-cloud.test.ts +309 -1
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +12 -2
- package/src/__tests__/host-browser-routes.test.ts +36 -91
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +10 -2
- package/src/__tests__/host-proxy-interface.test.ts +38 -4
- package/src/__tests__/host-shell-tool.test.ts +2 -4
- package/src/__tests__/host-transfer-pending-interactions.test.ts +160 -0
- package/src/__tests__/host-transfer-proxy.test.ts +733 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +20 -11
- package/src/__tests__/image-credentials.test.ts +137 -0
- package/src/__tests__/image-service-dispatcher.test.ts +186 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +3 -2
- package/src/__tests__/injector-chain.test.ts +525 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +41 -206
- package/src/__tests__/install-skill-routing.test.ts +1 -1
- package/src/__tests__/intent-routing.test.ts +0 -26
- package/src/__tests__/invite-redemption-service.test.ts +2 -1
- package/src/__tests__/invite-routes-http.test.ts +80 -12
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +2 -1
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +2 -1
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +157 -0
- package/src/__tests__/list-messages-attachments.test.ts +52 -55
- package/src/__tests__/list-messages-page-latest.test.ts +283 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +16 -17
- package/src/__tests__/llm-call-pipeline.test.ts +284 -0
- package/src/__tests__/llm-context-normalization.test.ts +69 -4
- package/src/__tests__/llm-context-route-provider.test.ts +39 -113
- package/src/__tests__/llm-request-log-turn-query.test.ts +2 -1
- package/src/__tests__/llm-resolver.test.ts +211 -0
- package/src/__tests__/llm-schema.test.ts +56 -0
- package/src/__tests__/llm-usage-store.test.ts +2 -1
- package/src/__tests__/log-export-workspace.test.ts +28 -17
- package/src/__tests__/mcp-abort-signal.test.ts +2 -3
- package/src/__tests__/mcp-client-auth.test.ts +2 -3
- package/src/__tests__/media-generate-image.test.ts +119 -13
- package/src/__tests__/memory-admin-recall.test.ts +221 -0
- package/src/__tests__/memory-recall-log-store.test.ts +2 -1
- package/src/__tests__/memory-retrieval-pipeline.test.ts +399 -0
- package/src/__tests__/memory-upsert-concurrency.test.ts +3 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +14 -13
- package/src/__tests__/migration-export-http.test.ts +17 -17
- package/src/__tests__/migration-export-to-gcs.test.ts +491 -0
- package/src/__tests__/migration-import-commit-http.test.ts +16 -16
- package/src/__tests__/migration-import-from-gcs.test.ts +533 -0
- package/src/__tests__/migration-import-from-url.test.ts +21 -91
- package/src/__tests__/migration-import-preflight-http.test.ts +13 -13
- package/src/__tests__/migration-jobs-status.test.ts +164 -0
- package/src/__tests__/migration-validate-http.test.ts +48 -83
- package/src/__tests__/mock-gateway-ipc.ts +32 -62
- package/src/__tests__/model-intents.test.ts +16 -1
- package/src/__tests__/nl-approval-parser.test.ts +13 -17
- package/src/__tests__/non-member-access-request.test.ts +13 -5
- package/src/__tests__/notification-broadcaster.test.ts +3 -3
- package/src/__tests__/notification-decision-strategy.test.ts +0 -11
- package/src/__tests__/notification-guardian-path.test.ts +15 -8
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +109 -0
- package/src/__tests__/notification-telegram-adapter.test.ts +57 -55
- package/src/__tests__/oauth-apps-routes.test.ts +77 -123
- package/src/__tests__/oauth-cli.test.ts +28 -13
- package/src/__tests__/oauth-connect-orchestrator.test.ts +4 -13
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-serializer.test.ts +6 -4
- package/src/__tests__/oauth-provider-visibility.test.ts +6 -6
- package/src/__tests__/oauth-providers-routes.test.ts +81 -103
- package/src/__tests__/oauth-store.test.ts +44 -77
- package/src/__tests__/oauth2-gateway-transport.test.ts +6 -3
- 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 +105 -6
- package/src/__tests__/openai-responses-provider.test.ts +146 -4
- package/src/__tests__/openrouter-provider-only.test.ts +22 -4
- package/src/__tests__/overflow-reduce-pipeline.test.ts +671 -0
- package/src/__tests__/permission-types.test.ts +3 -18
- package/src/__tests__/persist-onboarding-artifacts.test.ts +266 -0
- package/src/__tests__/persistence-pipeline.test.ts +378 -0
- package/src/__tests__/pipeline-runner.test.ts +565 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +27 -20
- package/src/__tests__/platform.test.ts +10 -59
- package/src/__tests__/playbook-execution.test.ts +2 -1
- package/src/__tests__/playbook-tools.test.ts +2 -1
- package/src/__tests__/plugin-bootstrap.test.ts +529 -0
- package/src/__tests__/plugin-registry.test.ts +303 -0
- package/src/__tests__/plugin-route-contribution.test.ts +294 -0
- package/src/__tests__/plugin-skill-contribution.test.ts +367 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +292 -0
- package/src/__tests__/plugin-types.test.ts +320 -0
- package/src/__tests__/pricing.test.ts +195 -14
- package/src/__tests__/profiler-routes.test.ts +112 -177
- package/src/__tests__/provider-send-message-override-profile.test.ts +223 -0
- package/src/__tests__/proxy-approval-callback.test.ts +6 -493
- package/src/__tests__/qdrant-collection-migration.test.ts +7 -7
- package/src/__tests__/reaction-persistence.test.ts +4 -2
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/recording-handler.test.ts +0 -2
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +1 -2
- package/src/__tests__/relay-server.test.ts +19 -4
- package/src/__tests__/require-fresh-approval.test.ts +19 -168
- package/src/__tests__/resolve-trust-class.test.ts +2 -1
- package/src/__tests__/retry-thinking-tool-choice.test.ts +19 -7
- package/src/__tests__/retry-verbosity-normalization.test.ts +139 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +26 -6
- package/src/__tests__/runtime-events-sse-parity.test.ts +12 -13
- package/src/__tests__/runtime-events-sse.test.ts +13 -21
- package/src/__tests__/schedule-routes.test.ts +304 -77
- package/src/__tests__/schedule-store.test.ts +119 -1
- package/src/__tests__/schedule-tools.test.ts +2 -1
- package/src/__tests__/scheduler-recurrence.test.ts +16 -71
- package/src/__tests__/scheduler-reuse-conversation.test.ts +12 -51
- package/src/__tests__/scheduler-wake.test.ts +356 -0
- package/src/__tests__/scoped-approval-grants.test.ts +2 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -1
- package/src/__tests__/secret-detection-handler.test.ts +2 -19
- package/src/__tests__/secret-ingress-http.test.ts +38 -21
- package/src/__tests__/secret-routes-managed-proxy.test.ts +46 -102
- package/src/__tests__/secret-scanner-executor.test.ts +1 -2
- package/src/__tests__/send-endpoint-busy.test.ts +38 -25
- package/src/__tests__/sequence-store.test.ts +2 -1
- package/src/__tests__/server-history-render.test.ts +2 -2
- package/src/__tests__/service-contracts-import-guard.test.ts +185 -0
- package/src/__tests__/set-permission-mode.test.ts +0 -10
- package/src/__tests__/settings-routes.test.ts +35 -68
- package/src/__tests__/skill-boundary-guard.test.ts +105 -0
- package/src/__tests__/skill-load-inline-command.test.ts +2 -2
- package/src/__tests__/skill-load-inline-includes.test.ts +2 -2
- package/src/__tests__/skill-runtime-path.test.ts +64 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +0 -2
- package/src/__tests__/slack-inbound-verification.test.ts +11 -2
- package/src/__tests__/slack-messaging-token-resolution.test.ts +1 -3
- package/src/__tests__/slack-reaction-approvals.test.ts +4 -4
- package/src/__tests__/slack-share-routes.test.ts +37 -72
- package/src/__tests__/subagent-call-site-routing.test.ts +79 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +20 -28
- package/src/__tests__/subagent-notify-parent.test.ts +6 -29
- package/src/__tests__/subagent-role-registry.test.ts +3 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +52 -104
- package/src/__tests__/subagent-tools.test.ts +0 -1
- package/src/__tests__/suggestion-routes.test.ts +149 -57
- package/src/__tests__/task-compiler.test.ts +2 -1
- package/src/__tests__/task-management-tools.test.ts +2 -1
- package/src/__tests__/task-memory-cleanup.test.ts +3 -1
- package/src/__tests__/task-scheduler.test.ts +5 -16
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +5 -314
- package/src/__tests__/thread-backfill.test.ts +3 -2
- package/src/__tests__/title-generate-pipeline.test.ts +224 -0
- package/src/__tests__/token-estimate-pipeline.test.ts +484 -0
- package/src/__tests__/tool-approval-handler.test.ts +21 -63
- package/src/__tests__/tool-audit-listener.test.ts +3 -3
- package/src/__tests__/tool-domain-event-publisher.test.ts +3 -3
- package/src/__tests__/tool-error-pipeline.test.ts +244 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +429 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +61 -4
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +28 -56
- package/src/__tests__/tool-executor.test.ts +434 -1604
- package/src/__tests__/tool-grant-request-escalation.test.ts +90 -311
- 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-context-guards.test.ts +1 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +7 -15
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +178 -354
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +3 -2
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -2
- package/src/__tests__/trusted-contact-verification.test.ts +2 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +2 -1
- package/src/__tests__/twilio-routes.test.ts +25 -66
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -7
- package/src/__tests__/usage-routes.test.ts +73 -90
- package/src/__tests__/user-plugin-loader.test.ts +233 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +2 -2
- package/src/__tests__/verification-control-plane-policy.test.ts +95 -14
- package/src/__tests__/voice-ingress-preflight.test.ts +5 -5
- package/src/__tests__/voice-invite-redemption.test.ts +2 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +3 -3
- package/src/__tests__/voice-session-bridge.test.ts +285 -106
- package/src/__tests__/volume-security-guard.test.ts +0 -2
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +3 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +1 -1
- 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-052-seed-default-inference-profiles.test.ts +260 -0
- package/src/__tests__/workspace-migration-053-release-notes-acp-codex.test.ts +225 -0
- package/src/__tests__/workspace-migration-054-seed-recall-callsite.test.ts +235 -0
- package/src/__tests__/workspace-migration-055-release-notes-agentic-recall.test.ts +128 -0
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +232 -0
- package/src/__tests__/workspace-migration-acp-sessions-ui.test.ts +144 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +1 -1
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +274 -0
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +99 -0
- package/src/__tests__/workspace-policy.test.ts +21 -3
- package/src/acp/__tests__/client-handler.test.ts +64 -0
- package/src/acp/__tests__/helpers/acp-config-stub.ts +62 -0
- package/src/acp/__tests__/helpers/which-stub.ts +45 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +366 -0
- package/src/acp/__tests__/session-manager-startup.test.ts +159 -0
- package/src/acp/__tests__/session-manager.test.ts +83 -0
- package/src/acp/client-handler.ts +23 -139
- package/src/acp/resolve-agent.test.ts +291 -0
- package/src/acp/resolve-agent.ts +176 -0
- package/src/acp/session-manager.ts +166 -7
- package/src/acp/types.ts +2 -50
- package/src/agent/loop.ts +365 -104
- package/src/agent/message-types.ts +0 -2
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/__tests__/guardian-feed-event.test.ts +296 -0
- package/src/approvals/approval-primitive.ts +3 -20
- package/src/approvals/guardian-decision-primitive.ts +37 -68
- package/src/approvals/guardian-request-resolvers.ts +109 -103
- package/src/avatar/character-components.ts +6 -6
- package/src/{config/bundled-skills/settings/tools → avatar}/identity-avatar.ts +1 -1
- package/src/backup/__tests__/backup-worker.test.ts +2 -15
- package/src/backup/__tests__/paths.test.ts +3 -2
- package/src/backup/backup-worker.ts +3 -24
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +7 -11
- package/src/browser/__tests__/operations.test.ts +0 -35
- package/src/browser/operations.ts +1 -47
- package/src/bundler/app-compiler.ts +84 -1
- package/src/bundler/package-resolver.ts +2 -6
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-constants.ts +1 -1
- package/src/calls/call-controller.ts +1 -5
- package/src/calls/call-domain.ts +14 -14
- package/src/calls/call-pointer-messages.ts +4 -9
- package/src/calls/call-state.ts +2 -2
- package/src/calls/call-store.ts +2 -1
- package/src/calls/guardian-action-sweep.ts +9 -25
- package/src/calls/guardian-dispatch.ts +1 -20
- package/src/calls/media-stream-audio-transcode.ts +2 -41
- package/src/calls/media-stream-server.ts +2 -3
- package/src/calls/media-stream-stt-session.ts +1 -3
- package/src/calls/relay-access-wait.ts +5 -8
- package/src/calls/relay-server.ts +15 -18
- package/src/calls/relay-setup-router.ts +2 -2
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/twilio-routes.ts +160 -78
- package/src/calls/voice-control-protocol.ts +10 -10
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/calls/voice-session-bridge.ts +137 -42
- package/src/channels/__tests__/types.test.ts +28 -6
- package/src/channels/permission-profiles.ts +2 -72
- package/src/channels/types.ts +48 -30
- package/src/cli/AGENTS.md +1 -0
- package/src/cli/__tests__/notifications.test.ts +92 -214
- package/src/cli/commands/__tests__/attachment.test.ts +14 -8
- package/src/cli/commands/__tests__/backup.test.ts +4 -15
- package/src/cli/commands/__tests__/browser.test.ts +36 -31
- package/src/cli/commands/__tests__/cache.test.ts +23 -18
- package/src/cli/commands/__tests__/image-generation.test.ts +255 -35
- package/src/cli/commands/__tests__/inference-send.test.ts +12 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +396 -0
- package/src/cli/commands/__tests__/task.test.ts +36 -35
- package/src/cli/commands/__tests__/trust.test.ts +602 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +12 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +14 -14
- package/src/cli/commands/__tests__/ui.test.ts +17 -17
- package/src/cli/commands/__tests__/watchers.test.ts +29 -29
- package/src/cli/commands/__tests__/webhooks.test.ts +544 -0
- package/src/cli/commands/attachment.ts +12 -8
- package/src/cli/commands/auth.ts +1 -1
- package/src/cli/commands/avatar.ts +192 -9
- package/src/cli/commands/backup.ts +16 -46
- package/src/cli/commands/browser.ts +52 -4
- package/src/cli/commands/cache.ts +7 -5
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/clients.ts +137 -0
- package/src/cli/commands/completions.ts +3 -10
- package/src/cli/commands/contacts.ts +10 -10
- package/src/cli/commands/conversations-defer.ts +364 -0
- package/src/cli/commands/conversations-import.ts +2 -3
- package/src/cli/commands/conversations.ts +115 -57
- package/src/cli/commands/credential-execution.ts +1 -1
- package/src/cli/commands/credentials.ts +139 -5
- package/src/cli/commands/default-action.ts +1 -1
- package/src/cli/commands/domain.ts +2 -2
- package/src/cli/commands/email.ts +7 -7
- package/src/cli/commands/image-generation.ts +33 -34
- package/src/cli/commands/keys.ts +2 -2
- package/src/cli/commands/mcp.ts +1 -1
- package/src/cli/commands/memory-v2.ts +343 -0
- package/src/cli/commands/memory.ts +8 -8
- package/src/cli/commands/notifications.ts +87 -121
- package/src/cli/commands/oauth/__tests__/connect.test.ts +23 -5
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/mode.test.ts +1 -1
- 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/__tests__/status.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/token.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +4 -4
- package/src/cli/commands/oauth/providers.ts +176 -8
- package/src/cli/commands/oauth/shared.ts +29 -2
- package/src/cli/commands/oauth/status.ts +46 -36
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -6
- package/src/cli/commands/platform/__tests__/connect.test.ts +23 -11
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +22 -10
- package/src/cli/commands/platform/__tests__/status.test.ts +22 -10
- package/src/cli/commands/platform/connect.ts +3 -3
- package/src/cli/commands/platform/disconnect.ts +4 -6
- package/src/cli/commands/platform/index.ts +12 -10
- package/src/cli/commands/routes.ts +7 -1
- package/src/cli/commands/sequence.ts +7 -7
- package/src/cli/commands/skills.ts +189 -84
- package/src/cli/commands/task.ts +12 -10
- package/src/cli/commands/trust.ts +460 -162
- package/src/cli/commands/ui.ts +3 -3
- package/src/cli/commands/usage.ts +10 -5
- package/src/cli/commands/watchers.ts +8 -8
- package/src/cli/commands/webhooks.ts +270 -0
- package/src/cli/lib/daemon-avatar-client.ts +37 -0
- package/src/cli/lib/daemon-credential-client.ts +27 -189
- package/src/cli/lib/ipc-params.ts +22 -0
- package/src/cli/program.ts +29 -29
- package/src/cli.ts +1 -61
- package/src/config/__tests__/backup-schema.test.ts +7 -2
- package/src/config/acp-defaults.test.ts +57 -0
- package/src/config/acp-defaults.ts +40 -0
- package/src/config/acp-schema.ts +1 -1
- package/src/config/assistant-feature-flags.ts +18 -142
- package/src/config/bundled-skills/acp/SKILL.md +44 -16
- package/src/config/bundled-skills/acp/TOOLS.json +45 -1
- package/src/config/bundled-skills/{screen-watch/tools/start-screen-watch.ts → acp/tools/acp-list-agents.ts} +2 -2
- package/src/config/bundled-skills/acp/tools/acp-steer.ts +12 -0
- 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 +25 -51
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +31 -44
- 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/__tests__/cost-tracker.test.ts +6 -6
- package/src/config/bundled-skills/media-processing/services/reduce.ts +0 -13
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +207 -0
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +58 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +1 -1
- 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/SKILL.md +2 -17
- package/src/config/bundled-skills/settings/TOOLS.json +0 -56
- package/src/config/bundled-skills/subagent/SKILL.md +2 -0
- package/src/config/bundled-tool-registry.ts +4 -21
- package/src/config/env.ts +7 -8
- package/src/config/feature-flag-registry.json +25 -17
- package/src/config/llm-resolver.ts +51 -33
- package/src/config/loader.ts +12 -15
- package/src/config/schema.ts +22 -70
- package/src/config/schemas/__tests__/filing.test.ts +58 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +186 -0
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/conversations.ts +16 -0
- package/src/config/schemas/filing.ts +12 -0
- package/src/config/schemas/host-browser.ts +2 -2
- package/src/config/schemas/inference.ts +0 -2
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +51 -10
- package/src/config/schemas/memory-storage.ts +1 -1
- package/src/config/schemas/memory-v2.ts +176 -0
- package/src/config/schemas/memory.ts +2 -0
- package/src/config/schemas/security.ts +0 -60
- package/src/config/schemas/services.ts +46 -7
- package/src/config/schemas/tts.ts +11 -0
- package/src/config/skill-state.ts +6 -2
- package/src/config/skills.ts +95 -6
- package/src/config/types.ts +0 -41
- package/src/contacts/contact-store.ts +2 -2
- package/src/contacts/contacts-write.ts +0 -38
- package/src/contacts/types.ts +8 -10
- package/src/context/__tests__/compact-prompt.test.ts +27 -9
- package/src/context/prompts/compact.md +26 -12
- package/src/context/token-estimator.ts +1 -1
- package/src/context/tool-result-truncation.ts +4 -64
- package/src/context/window-manager.ts +191 -17
- package/src/credential-execution/approval-bridge.ts +7 -69
- package/src/credential-execution/client.ts +17 -422
- package/src/credential-execution/feature-gates.ts +1 -2
- package/src/credential-execution/managed-catalog.ts +1 -1
- package/src/credential-health/credential-health-service.ts +20 -7
- package/src/daemon/__tests__/conversation-feed-event.test.ts +304 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +4 -12
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +14 -15
- package/src/daemon/__tests__/daemon-skill-host.test.ts +272 -0
- package/src/daemon/__tests__/meet-host-supervisor.test.ts +587 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +463 -0
- package/src/daemon/approval-generators.ts +2 -14
- package/src/daemon/classifier.ts +0 -106
- package/src/daemon/config-watcher.ts +14 -56
- package/src/daemon/connection-policy.ts +0 -14
- package/src/daemon/context-overflow-policy.ts +4 -13
- package/src/daemon/conversation-agent-loop-handlers.ts +120 -28
- package/src/daemon/conversation-agent-loop.ts +1113 -701
- package/src/daemon/conversation-attachments.ts +5 -81
- package/src/daemon/conversation-error.ts +9 -5
- package/src/daemon/conversation-history.ts +11 -20
- package/src/daemon/conversation-launch.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +37 -19
- package/src/daemon/conversation-messaging.ts +1 -1
- package/src/daemon/conversation-notifiers.ts +3 -111
- package/src/daemon/conversation-process.ts +23 -20
- package/src/daemon/conversation-runtime-assembly.ts +530 -471
- package/src/daemon/conversation-slash.ts +4 -160
- package/src/daemon/conversation-store.ts +368 -0
- package/src/daemon/conversation-surfaces.ts +5 -4
- package/src/daemon/conversation-tool-setup.ts +49 -161
- package/src/daemon/conversation.ts +126 -217
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/daemon-skill-host.ts +262 -0
- package/src/daemon/external-plugins-bootstrap.ts +532 -0
- package/src/daemon/first-greeting.ts +191 -14
- package/src/daemon/handlers/config-channels.ts +2 -2
- package/src/daemon/handlers/config-embeddings.ts +1 -1
- package/src/daemon/handlers/config-ingress.ts +24 -2
- package/src/daemon/handlers/config-model.test.ts +17 -0
- package/src/daemon/handlers/config-model.ts +18 -52
- package/src/daemon/handlers/config-telegram.ts +6 -53
- package/src/daemon/handlers/config-voice.ts +1 -1
- package/src/daemon/handlers/conversations.ts +22 -156
- package/src/daemon/handlers/recording.ts +1 -1
- package/src/daemon/handlers/shared.ts +34 -35
- package/src/daemon/handlers/skills.ts +20 -24
- package/src/daemon/host-transfer-proxy.ts +500 -0
- package/src/daemon/lifecycle.ts +56 -326
- package/src/daemon/meet-host-startup.ts +51 -0
- package/src/daemon/meet-host-supervisor.ts +781 -0
- package/src/daemon/meet-manifest-loader.ts +410 -0
- package/src/daemon/memory-v2-startup.ts +35 -0
- package/src/daemon/message-protocol.ts +4 -7
- package/src/daemon/message-types/acp.ts +1 -0
- package/src/daemon/message-types/computer-use.ts +2 -34
- package/src/daemon/message-types/conversations.ts +65 -2
- package/src/daemon/message-types/host-transfer.ts +41 -0
- package/src/daemon/message-types/integrations.ts +6 -0
- package/src/daemon/message-types/messages.ts +26 -14
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +0 -6
- package/src/daemon/message-types/shared.ts +5 -2
- package/src/daemon/message-types/subagents.ts +2 -1
- package/src/daemon/message-types/workspace.ts +0 -2
- package/src/daemon/pkb-reminder-builder.test.ts +13 -12
- package/src/daemon/pkb-reminder-builder.ts +8 -16
- package/src/daemon/process-message.ts +616 -0
- package/src/daemon/providers-setup.ts +14 -6
- package/src/daemon/server.ts +79 -1272
- package/src/daemon/shutdown-handlers.ts +3 -13
- package/src/daemon/startup-error.ts +1 -1
- package/src/daemon/tool-side-effects.ts +14 -56
- package/src/daemon/trust-context.ts +32 -0
- package/src/daemon/wake-target-adapter.ts +223 -0
- package/src/email/feature-gate.ts +1 -1
- package/src/events/domain-events.ts +1 -8
- package/src/events/tool-audit-listener.ts +2 -8
- package/src/events/tool-metrics-listener.ts +1 -4
- package/src/filing/filing-service.ts +194 -54
- package/src/followups/followup-store.ts +3 -71
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +228 -0
- package/src/heartbeat/heartbeat-service.ts +52 -8
- package/src/home/__tests__/feed-population-integration.test.ts +312 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +18 -1
- package/src/home/__tests__/rollup-producer.test.ts +67 -2
- package/src/home/assistant-feed-authoring.ts +8 -1
- package/src/home/emit-feed-event.ts +7 -0
- package/src/home/feed-types.ts +42 -3
- package/src/home/relationship-state-writer.ts +1 -1
- package/src/home/rewrite-command-preview.ts +66 -0
- package/src/home/rewrite-feed-title.ts +58 -0
- package/src/home/rollup-producer.ts +16 -3
- package/src/inbound/platform-callback-registration.ts +1 -17
- package/src/ipc/__tests__/attachment-ipc.test.ts +128 -66
- package/src/ipc/__tests__/browser-ipc.test.ts +75 -51
- package/src/ipc/__tests__/cache-ipc.test.ts +52 -107
- package/src/ipc/__tests__/cli-ipc.test.ts +9 -6
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +254 -0
- package/src/ipc/__tests__/skill-server.test.ts +182 -0
- package/src/ipc/__tests__/socket-path.test.ts +44 -37
- package/src/ipc/__tests__/ui-request-route.test.ts +241 -216
- package/src/ipc/__tests__/watcher-ipc.test.ts +33 -33
- package/src/ipc/assistant-server.ts +450 -0
- package/src/ipc/cli-client.ts +3 -3
- package/src/ipc/gateway-client.test.ts +131 -0
- package/src/ipc/gateway-client.ts +98 -120
- package/src/ipc/ipc-framing.ts +281 -0
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +152 -0
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +219 -0
- package/src/ipc/routes/db-proxy.ts +73 -0
- package/src/ipc/routes/route-adapter.ts +32 -0
- package/src/ipc/routes/trust-rules.test.ts +218 -0
- package/src/ipc/skill-ipc-types.ts +13 -0
- package/src/ipc/skill-routes/__tests__/config.test.ts +146 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +402 -0
- package/src/ipc/skill-routes/__tests__/identity.test.ts +81 -0
- package/src/ipc/skill-routes/__tests__/log.test.ts +133 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +178 -0
- package/src/ipc/skill-routes/__tests__/platform.test.ts +111 -0
- package/src/ipc/skill-routes/__tests__/providers.test.ts +265 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +361 -0
- package/src/ipc/skill-routes/config.ts +47 -0
- package/src/ipc/skill-routes/events.ts +131 -0
- package/src/ipc/skill-routes/identity.ts +34 -0
- package/src/ipc/skill-routes/index.ts +37 -0
- package/src/ipc/skill-routes/log.ts +40 -0
- package/src/ipc/skill-routes/memory.ts +76 -0
- package/src/ipc/skill-routes/platform.ts +39 -0
- package/src/ipc/skill-routes/providers.ts +163 -0
- package/src/ipc/skill-routes/registries.ts +393 -0
- package/src/ipc/skill-server.ts +771 -0
- package/src/ipc/skill-socket-path.ts +20 -0
- package/src/ipc/socket-cleanup.ts +92 -0
- package/src/ipc/socket-path.ts +55 -48
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +374 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +525 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +473 -0
- package/src/live-voice/__tests__/live-voice-integration.test.ts +359 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +179 -0
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +349 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +244 -0
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +337 -0
- package/src/live-voice/__tests__/live-voice-tts.test.ts +337 -0
- package/src/live-voice/__tests__/protocol.test.ts +295 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +421 -0
- package/src/live-voice/live-voice-archive.ts +758 -0
- package/src/live-voice/live-voice-metrics.ts +472 -0
- package/src/live-voice/live-voice-session-manager.ts +222 -0
- package/src/live-voice/live-voice-session.ts +1144 -0
- package/src/live-voice/live-voice-tts.ts +260 -0
- package/src/live-voice/protocol.ts +524 -0
- package/src/mcp/client.ts +2 -2
- 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__/auto-analysis-enqueue.test.ts +4 -28
- package/src/memory/__tests__/auto-analysis-guard.test.ts +2 -2
- package/src/memory/__tests__/conversation-analyze-job.test.ts +7 -62
- package/src/memory/__tests__/conversation-group-migration.test.ts +2 -2
- package/src/memory/__tests__/find-analysis-conversation.test.ts +2 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +235 -0
- package/src/memory/admin.ts +65 -7
- package/src/memory/app-git-service.ts +0 -14
- package/src/memory/attachments-store.ts +14 -16
- package/src/memory/auto-analysis-enqueue.ts +2 -17
- package/src/memory/canonical-guardian-store.ts +2 -1
- package/src/memory/channel-verification-sessions.ts +1 -1
- package/src/memory/checkpoints.ts +1 -1
- package/src/memory/context-search/agent-protocol.ts +424 -0
- package/src/memory/context-search/agent-runner.ts +1295 -0
- package/src/memory/context-search/format.ts +160 -0
- package/src/memory/context-search/limits.ts +106 -0
- package/src/memory/context-search/search.ts +387 -0
- package/src/memory/context-search/sources/conversations.ts +278 -0
- package/src/memory/context-search/sources/memory.ts +90 -0
- package/src/memory/context-search/sources/pkb.ts +468 -0
- package/src/memory/context-search/sources/workspace.ts +1255 -0
- package/src/memory/context-search/types.ts +49 -0
- package/src/memory/conversation-analyze-job.ts +3 -24
- package/src/memory/conversation-attention-store.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +1 -1
- package/src/memory/conversation-crud.ts +117 -145
- package/src/memory/conversation-directories.ts +1 -11
- package/src/memory/conversation-display-order-migration.ts +11 -2
- package/src/memory/conversation-group-migration.ts +20 -4
- package/src/memory/conversation-key-store.ts +3 -4
- package/src/memory/conversation-queries.ts +69 -29
- package/src/memory/conversation-starter-validation.ts +88 -0
- package/src/memory/conversation-starters-cadence.ts +1 -1
- package/src/memory/conversation-title-service.ts +27 -1
- package/src/memory/db-init.ts +22 -4
- package/src/memory/db-maintenance.ts +1 -1
- package/src/memory/delivery-channels.ts +1 -14
- package/src/memory/delivery-crud.ts +2 -32
- package/src/memory/delivery-status.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +44 -5
- package/src/memory/embedding-gemini.ts +6 -1
- package/src/memory/external-conversation-store.ts +1 -1
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +412 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +225 -0
- package/src/memory/graph/bootstrap.test.ts +277 -0
- package/src/memory/graph/bootstrap.ts +10 -6
- package/src/memory/graph/capability-seed.ts +3 -3
- package/src/memory/graph/compaction.ts +1 -1
- package/src/memory/graph/consolidation.ts +13 -10
- package/src/memory/graph/conversation-graph-memory.ts +151 -1
- package/src/memory/graph/decay.ts +1 -1
- package/src/memory/graph/extraction.ts +63 -23
- package/src/memory/graph/graph-memory-state-store.ts +1 -1
- package/src/memory/graph/graph-search.test.ts +95 -2
- package/src/memory/graph/graph-search.ts +22 -7
- package/src/memory/graph/image-ref-utils.ts +1 -1
- package/src/memory/graph/retriever.test.ts +158 -4
- package/src/memory/graph/retriever.ts +27 -8
- package/src/memory/graph/store.test.ts +2 -1
- package/src/memory/graph/store.ts +1 -1
- package/src/memory/graph/tool-handlers.ts +73 -247
- package/src/memory/graph/tools.ts +35 -53
- package/src/memory/group-crud.ts +1 -2
- package/src/memory/guardian-action-store.ts +2 -1
- package/src/memory/guardian-approvals.ts +1 -1
- package/src/memory/guardian-rate-limits.ts +1 -1
- package/src/memory/indexer.ts +43 -17
- package/src/memory/invite-store.ts +1 -1
- package/src/memory/job-handlers/backfill.ts +1 -1
- package/src/memory/job-handlers/cleanup.ts +2 -1
- package/src/memory/job-handlers/conversation-starters.ts +18 -10
- package/src/memory/job-handlers/embedding.test.ts +2 -1
- package/src/memory/job-handlers/embedding.ts +1 -1
- package/src/memory/job-handlers/index-maintenance.ts +1 -1
- package/src/memory/job-handlers/summarization.ts +3 -3
- package/src/memory/job-utils.ts +3 -3
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +362 -0
- package/src/memory/jobs/embed-concept-page.ts +210 -0
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -1
- package/src/memory/jobs-store.ts +10 -2
- package/src/memory/jobs-worker.ts +58 -5
- package/src/memory/lifecycle-events-store.ts +1 -1
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +1 -1
- package/src/memory/media-store.ts +1 -1
- package/src/memory/memory-recall-log-store.ts +1 -1
- package/src/memory/migrations/038-actor-token-records.ts +3 -0
- package/src/memory/migrations/039-actor-refresh-token-records.ts +3 -0
- package/src/memory/migrations/041-approval-prompt-ts-tracker.ts +26 -0
- package/src/memory/migrations/149-oauth-tables.ts +1 -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/226-schedule-wake-conversation-id.ts +11 -0
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +18 -0
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +27 -0
- package/src/memory/migrations/229-delete-private-conversations.test.ts +1087 -0
- package/src/memory/migrations/229-delete-private-conversations.ts +210 -0
- package/src/memory/migrations/230-acp-session-history.ts +41 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +128 -0
- package/src/memory/migrations/232-activation-state.ts +38 -0
- package/src/memory/migrations/index.ts +14 -0
- package/src/memory/migrations/registry.ts +7 -0
- package/src/memory/pkb/pkb-index.test.ts +5 -5
- package/src/memory/pkb/pkb-reconcile.test.ts +5 -5
- package/src/memory/pkb/pkb-search.test.ts +148 -7
- package/src/memory/pkb/pkb-search.ts +65 -30
- package/src/memory/published-pages-store.ts +1 -1
- package/src/memory/qdrant-client.test.ts +60 -0
- package/src/memory/qdrant-client.ts +25 -0
- package/src/memory/schema/acp.ts +30 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/infrastructure.ts +2 -32
- package/src/memory/schema/memory-graph.ts +36 -14
- package/src/memory/schema/oauth.ts +4 -1
- package/src/memory/scoped-approval-grants.ts +2 -1
- package/src/memory/search/semantic.ts +2 -2
- package/src/memory/shared-app-links-store.ts +2 -1
- package/src/memory/tool-usage-store.ts +1 -1
- package/src/memory/trace-event-store.ts +2 -1
- package/src/memory/turn-events-store.ts +1 -1
- package/src/memory/v2/__tests__/activation-store.test.ts +202 -0
- package/src/memory/v2/__tests__/activation.test.ts +956 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +610 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +395 -0
- package/src/memory/v2/__tests__/edges.test.ts +435 -0
- package/src/memory/v2/__tests__/injection.test.ts +792 -0
- package/src/memory/v2/__tests__/migration.test.ts +812 -0
- package/src/memory/v2/__tests__/page-store.test.ts +334 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +438 -0
- package/src/memory/v2/__tests__/sim.test.ts +549 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +85 -0
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +657 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +351 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +441 -0
- package/src/memory/v2/activation-store.ts +109 -0
- package/src/memory/v2/activation.ts +490 -0
- package/src/memory/v2/backfill-jobs.ts +442 -0
- package/src/memory/v2/consolidation-job.ts +304 -0
- package/src/memory/v2/edges.ts +217 -0
- package/src/memory/v2/injection.ts +307 -0
- package/src/memory/v2/migration.ts +654 -0
- package/src/memory/v2/now-text.ts +38 -0
- package/src/memory/v2/page-store.ts +245 -0
- package/src/memory/v2/prompts/consolidation.ts +185 -0
- package/src/memory/v2/prompts/sweep.ts +56 -0
- package/src/memory/v2/qdrant.ts +342 -0
- package/src/memory/v2/sim.ts +206 -0
- package/src/memory/v2/skill-content.ts +42 -0
- package/src/memory/v2/skill-qdrant.ts +395 -0
- package/src/memory/v2/skill-store.ts +128 -0
- package/src/memory/v2/sweep-job.ts +298 -0
- package/src/memory/v2/types.ts +116 -0
- package/src/memory/validation.ts +1 -1
- package/src/messaging/providers/index.ts +262 -0
- package/src/messaging/providers/slack/api.ts +242 -0
- package/src/messaging/providers/slack/message-metadata.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.test.ts +77 -29
- package/src/messaging/providers/slack/render-transcript.ts +58 -0
- package/src/messaging/providers/slack/send.ts +383 -0
- package/src/messaging/providers/telegram-bot/adapter.ts +4 -42
- package/src/messaging/providers/telegram-bot/api.ts +253 -0
- package/src/messaging/providers/telegram-bot/client.ts +17 -58
- package/src/messaging/providers/telegram-bot/send.ts +232 -0
- package/src/messaging/providers/whatsapp/adapter.ts +4 -36
- package/src/messaging/providers/whatsapp/api.ts +319 -0
- package/src/messaging/providers/whatsapp/client.ts +4 -48
- package/src/messaging/providers/whatsapp/send.ts +209 -0
- package/src/notifications/adapters/slack.ts +5 -23
- package/src/notifications/adapters/telegram.ts +8 -29
- package/src/notifications/conversation-candidates.ts +1 -1
- package/src/notifications/conversation-pairing.ts +78 -19
- package/src/notifications/conversation-seed-composer.ts +12 -6
- package/src/notifications/copy-composer.ts +1 -6
- package/src/notifications/decision-engine.ts +1 -1
- package/src/notifications/decisions-store.ts +1 -1
- package/src/notifications/deliveries-store.ts +2 -1
- package/src/notifications/deterministic-checks.ts +1 -1
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/events-store.ts +1 -13
- package/src/notifications/preferences-store.ts +1 -1
- package/src/notifications/signal.ts +1 -11
- 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/connection-resolver.ts +11 -2
- package/src/oauth/manual-token-connection.ts +23 -0
- package/src/oauth/oauth-store.ts +32 -15
- package/src/oauth/provider-serializer.ts +6 -1
- package/src/oauth/seed-providers.ts +56 -108
- package/src/outbound-proxy/http-forwarder.ts +9 -0
- package/src/outbound-proxy/index.ts +0 -1
- package/src/permissions/approval-policy.test.ts +398 -106
- package/src/permissions/approval-policy.ts +134 -108
- package/src/permissions/checker.test.ts +632 -0
- package/src/permissions/checker.ts +280 -345
- package/src/permissions/gateway-threshold-reader.ts +177 -0
- package/src/permissions/ipc-risk-types.ts +95 -0
- package/src/permissions/prompter.ts +8 -9
- package/src/permissions/risk-types.ts +24 -153
- package/src/permissions/types.ts +19 -47
- package/src/permissions/workspace-policy.ts +10 -7
- package/src/playbooks/playbook-compiler.ts +1 -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 +488 -0
- package/src/plugins/defaults/llm-call.ts +79 -0
- package/src/plugins/defaults/memory-retrieval.ts +221 -0
- package/src/plugins/defaults/overflow-reduce.ts +185 -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 +103 -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 +301 -0
- package/src/plugins/types.ts +1133 -0
- package/src/plugins/user-loader.ts +203 -0
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +197 -0
- package/src/prompts/persona-resolver.ts +2 -4
- package/src/prompts/system-prompt.ts +39 -0
- package/src/prompts/templates/BOOTSTRAP.md +27 -77
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/providers/__tests__/provider-env-vars.test.ts +0 -21
- package/src/providers/__tests__/retry-callsite.test.ts +3 -6
- package/src/providers/anthropic/client.ts +71 -19
- package/src/providers/call-site-routing.ts +7 -3
- package/src/providers/fireworks/client.ts +3 -0
- package/src/providers/gemini/client.ts +96 -22
- package/src/providers/managed-proxy/context.ts +0 -12
- package/src/providers/model-catalog.ts +123 -25
- package/src/providers/model-intents.ts +6 -7
- package/src/providers/openai/chat-completions-provider.ts +37 -7
- package/src/providers/openai/responses-provider.ts +39 -4
- package/src/providers/openrouter/client.ts +9 -6
- package/src/providers/provider-env-vars.ts +4 -12
- package/src/providers/provider-send-message.ts +16 -11
- package/src/providers/registry.ts +1 -1
- package/src/providers/retry.ts +52 -23
- 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/openai-whisper-stream.ts +1 -1
- package/src/providers/speech-to-text/openai-whisper.ts +3 -6
- package/src/providers/speech-to-text/provider-catalog.ts +75 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +72 -4
- package/src/providers/speech-to-text/xai-realtime.ts +39 -14
- package/src/providers/speech-to-text/xai.ts +5 -5
- package/src/providers/thinking-config.ts +34 -0
- package/src/providers/types.ts +22 -10
- package/src/runtime/AGENTS.md +27 -17
- package/src/runtime/__tests__/agent-wake.test.ts +33 -9
- package/src/runtime/__tests__/client-registry.test.ts +271 -0
- package/src/runtime/__tests__/interactive-ui.test.ts +157 -246
- package/src/runtime/access-request-helper.ts +9 -20
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/agent-wake.ts +174 -68
- package/src/runtime/approval-conversation-turn.ts +2 -15
- package/src/runtime/approval-message-composer.ts +11 -60
- package/src/runtime/assistant-event.ts +18 -66
- package/src/runtime/auth/__tests__/guard-tests.test.ts +6 -30
- package/src/runtime/auth/__tests__/middleware.test.ts +10 -10
- package/src/runtime/auth/__tests__/route-policy.test.ts +0 -8
- package/src/runtime/auth/context.ts +9 -0
- package/src/runtime/auth/middleware.ts +4 -4
- package/src/runtime/auth/route-policy.ts +195 -4
- package/src/runtime/auth/token-service.ts +1 -100
- package/src/runtime/capability-tokens.ts +89 -313
- package/src/runtime/channel-approval-types.ts +1 -6
- package/src/runtime/channel-approvals.ts +7 -79
- package/src/runtime/channel-readiness-service.ts +2 -2
- package/src/runtime/channel-reply-delivery.ts +2 -8
- package/src/runtime/channel-retry-sweep.ts +20 -17
- package/src/runtime/client-registry.ts +254 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +2 -7
- package/src/runtime/gateway-client.ts +37 -378
- package/src/runtime/guardian-action-grant-minter.ts +2 -3
- package/src/runtime/guardian-action-message-composer.ts +11 -52
- package/src/runtime/guardian-action-service.ts +19 -7
- package/src/runtime/guardian-decision-types.ts +4 -65
- package/src/runtime/guardian-reply-router.ts +10 -19
- package/src/runtime/guardian-vellum-migration.ts +5 -64
- package/src/runtime/http-errors.ts +3 -0
- package/src/runtime/http-router.ts +50 -7
- package/src/runtime/http-server.ts +345 -1041
- package/src/runtime/http-types.ts +15 -100
- package/src/runtime/interactive-ui-types.ts +145 -0
- package/src/runtime/interactive-ui.ts +38 -196
- package/src/runtime/invite-redemption-service.ts +1 -1
- package/src/runtime/invite-redemption-templates.ts +1 -1
- package/src/runtime/local-actor-identity.ts +13 -43
- package/src/runtime/message-composer-types.ts +134 -0
- package/src/runtime/middleware/rate-limiter.ts +1 -1
- package/src/runtime/middleware/request-logger.ts +5 -2
- package/src/runtime/migrations/__tests__/job-registry.test.ts +346 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +16 -0
- package/src/runtime/migrations/job-registry.ts +281 -0
- package/src/runtime/migrations/vbundle-builder.ts +4 -26
- package/src/runtime/migrations/vbundle-importer.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +0 -13
- package/src/runtime/migrations/vbundle-tar-stream.ts +11 -3
- package/src/runtime/nl-approval-parser.ts +16 -21
- package/src/runtime/pending-interactions.ts +29 -12
- package/src/runtime/routes/__tests__/acp-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +204 -320
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +72 -4
- package/src/runtime/routes/__tests__/stt-routes.test.ts +182 -223
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +230 -0
- package/src/{ipc/__tests__/task-ipc.test.ts → runtime/routes/__tests__/task-routes.test.ts} +116 -96
- package/src/runtime/routes/__tests__/tts-routes.test.ts +185 -289
- package/src/runtime/routes/access-request-decision.ts +25 -50
- package/src/runtime/routes/acp-routes.test.ts +371 -0
- package/src/runtime/routes/acp-routes.ts +392 -166
- package/src/runtime/routes/app-management-routes.ts +464 -660
- package/src/runtime/routes/app-routes.ts +192 -177
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +51 -31
- package/src/runtime/routes/approval-routes.ts +133 -434
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +24 -84
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +3 -10
- package/src/runtime/routes/attachment-routes.ts +409 -253
- package/src/runtime/routes/audio-routes.ts +51 -18
- package/src/runtime/routes/avatar-routes.ts +82 -75
- package/src/runtime/routes/background-tool-routes.ts +94 -0
- package/src/runtime/routes/backup-routes.ts +154 -336
- package/src/runtime/routes/brain-graph-routes.ts +83 -110
- package/src/runtime/routes/browser-routes.ts +141 -0
- package/src/runtime/routes/btw-routes.ts +62 -106
- package/src/runtime/routes/cache-routes.ts +96 -0
- package/src/runtime/routes/call-routes.ts +208 -247
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
- package/src/runtime/routes/channel-delivery-routes.ts +25 -27
- package/src/runtime/routes/channel-readiness-routes.ts +83 -120
- package/src/runtime/routes/channel-route-definitions.ts +62 -0
- package/src/runtime/routes/channel-route-shared.ts +14 -18
- package/src/runtime/routes/channel-verification-routes.ts +207 -187
- package/src/runtime/routes/client-routes.ts +48 -0
- package/src/runtime/routes/contact-routes.ts +533 -407
- package/src/runtime/routes/conversation-analysis-routes.ts +48 -49
- package/src/runtime/routes/conversation-attention-routes.ts +55 -67
- package/src/runtime/routes/conversation-list-routes.ts +265 -0
- package/src/runtime/routes/conversation-management-routes.ts +626 -715
- package/src/runtime/routes/conversation-query-routes.ts +510 -460
- package/src/runtime/routes/conversation-routes.ts +652 -457
- package/src/runtime/routes/conversation-starter-routes.ts +121 -71
- package/src/runtime/routes/credential-prompt-routes.ts +124 -0
- package/src/runtime/routes/debug-routes.ts +34 -39
- package/src/runtime/routes/defer-routes.ts +230 -0
- package/src/runtime/routes/diagnostics-routes.ts +79 -70
- package/src/runtime/routes/documents-routes.ts +117 -106
- package/src/runtime/routes/errors.ts +132 -0
- package/src/runtime/routes/events-routes.ts +97 -58
- package/src/runtime/routes/filing-routes.ts +65 -78
- package/src/runtime/routes/global-search-routes.ts +51 -57
- package/src/runtime/routes/group-routes.ts +199 -181
- package/src/runtime/routes/guardian-action-routes.ts +103 -169
- package/src/runtime/routes/guardian-approval-interception.ts +27 -58
- package/src/runtime/routes/guardian-approval-prompt.ts +10 -21
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +2 -6
- package/src/runtime/routes/guardian-expiry-sweep.ts +19 -36
- package/src/runtime/routes/heartbeat-routes.ts +194 -209
- package/src/runtime/routes/home-feed-routes.ts +85 -187
- package/src/runtime/routes/home-state-routes.ts +27 -24
- package/src/runtime/routes/host-bash-routes.ts +42 -52
- package/src/runtime/routes/host-browser-routes.ts +38 -69
- package/src/runtime/routes/host-cu-routes.ts +74 -70
- package/src/runtime/routes/host-file-routes.ts +50 -60
- package/src/runtime/routes/host-transfer-routes.ts +220 -0
- package/src/runtime/routes/http-adapter.ts +172 -0
- package/src/runtime/routes/identity-routes.ts +83 -79
- package/src/runtime/routes/inbound-conversation.ts +11 -18
- package/src/runtime/routes/inbound-message-handler.ts +162 -123
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +79 -138
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +2 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +54 -90
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +25 -50
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +5 -6
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -24
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -10
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +3 -3
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +19 -26
- package/src/runtime/routes/index.ts +197 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +25 -32
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +22 -31
- package/src/runtime/routes/integrations/slack/channel.ts +69 -66
- package/src/runtime/routes/integrations/slack/share.ts +49 -58
- package/src/runtime/routes/integrations/telegram.ts +91 -74
- package/src/runtime/routes/integrations/twilio.ts +163 -240
- package/src/runtime/routes/integrations/vercel.ts +57 -54
- package/src/runtime/routes/interface-routes.ts +43 -0
- package/src/runtime/routes/internal-oauth-routes.ts +56 -0
- package/src/runtime/routes/internal-twilio-routes.ts +46 -0
- package/src/runtime/routes/llm-context-normalization.ts +4 -2
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +90 -100
- package/src/runtime/routes/memory-item-routes.test.ts +153 -175
- package/src/runtime/routes/memory-item-routes.ts +243 -323
- package/src/runtime/routes/memory-v2-routes.ts +193 -0
- package/src/runtime/routes/migration-rollback-routes.ts +167 -212
- package/src/runtime/routes/migration-routes.ts +877 -377
- package/src/runtime/routes/notification-routes.ts +199 -70
- package/src/runtime/routes/oauth-apps.ts +254 -251
- package/src/runtime/routes/oauth-providers.ts +66 -57
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +224 -0
- package/src/runtime/routes/playground/__tests__/guard.test.ts +60 -0
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +250 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +195 -0
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +159 -0
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +207 -0
- package/src/runtime/routes/playground/__tests__/state.test.ts +175 -0
- package/src/runtime/routes/playground/conversation-not-found.ts +27 -0
- package/src/runtime/routes/playground/force-compact.ts +60 -0
- package/src/runtime/routes/playground/guard.ts +36 -0
- package/src/runtime/routes/playground/helpers.ts +103 -0
- package/src/runtime/routes/playground/index.ts +18 -0
- package/src/runtime/routes/playground/inject-failures.ts +143 -0
- package/src/runtime/routes/playground/reset-circuit.ts +89 -0
- package/src/runtime/routes/playground/seed-conversation.ts +113 -0
- package/src/runtime/routes/playground/seeded-conversations.ts +74 -0
- package/src/runtime/routes/playground/state.ts +77 -0
- package/src/runtime/routes/profiler-routes.ts +132 -167
- package/src/runtime/routes/ps-routes.ts +120 -0
- package/src/runtime/routes/recording-routes.ts +197 -258
- package/src/runtime/routes/rename-conversation-routes.ts +89 -0
- package/src/runtime/routes/schedule-routes.ts +284 -207
- package/src/runtime/routes/secret-routes.ts +219 -265
- package/src/runtime/routes/secrets-deps.ts +24 -0
- package/src/runtime/routes/settings-routes.ts +361 -441
- package/src/runtime/routes/skills-routes.ts +434 -469
- package/src/runtime/routes/stt-routes.ts +196 -206
- package/src/runtime/routes/subagents-routes.ts +125 -141
- package/src/runtime/routes/suggest-trust-rule-routes.ts +244 -0
- package/src/runtime/routes/surface-action-routes.ts +135 -190
- package/src/runtime/routes/surface-content-routes.ts +84 -118
- package/src/runtime/routes/task-routes.ts +354 -0
- package/src/runtime/routes/telemetry-routes.ts +33 -49
- package/src/runtime/routes/trace-event-routes.ts +55 -74
- package/src/runtime/routes/trust-rules-routes.ts +147 -239
- package/src/runtime/routes/tts-routes.ts +187 -169
- package/src/runtime/routes/types.ts +139 -0
- package/src/{ipc/routes/ui-request.ts → runtime/routes/ui-request-routes.ts} +23 -17
- package/src/runtime/routes/upgrade-broadcast-routes.ts +156 -197
- package/src/runtime/routes/usage-routes.ts +143 -169
- package/src/runtime/routes/user-routes.ts +102 -18
- package/src/runtime/routes/wake-conversation-routes.ts +49 -0
- package/src/{ipc/routes/watcher.ts → runtime/routes/watcher-routes.ts} +84 -39
- package/src/runtime/routes/wipe-conversation-routes.ts +89 -0
- package/src/runtime/routes/work-items-routes.test.ts +10 -20
- package/src/runtime/routes/work-items-routes.ts +418 -433
- package/src/runtime/routes/workspace-commit-routes.ts +30 -61
- package/src/runtime/routes/workspace-routes.test.ts +254 -381
- package/src/runtime/routes/workspace-routes.ts +238 -246
- package/src/runtime/runtime-mode.ts +8 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +80 -118
- package/src/runtime/services/analyze-conversation.ts +14 -41
- package/src/runtime/services/conversation-serializer.ts +181 -0
- package/src/runtime/skill-route-registry.ts +75 -15
- package/src/runtime/trust-context-resolver.ts +3 -2
- package/src/runtime/verification-outbound-actions.ts +13 -49
- package/src/schedule/run-script.ts +68 -0
- package/src/schedule/schedule-store.ts +70 -2
- package/src/schedule/scheduler.ts +149 -8
- package/src/security/ces-credential-client.ts +32 -169
- package/src/security/ces-rpc-credential-backend.ts +1 -1
- package/src/security/credential-backend.ts +6 -6
- package/src/security/oauth-completion-page.ts +1 -1
- package/src/security/oauth2.ts +3 -6
- package/src/sequence/analytics.ts +1 -1
- package/src/sequence/guardrails.ts +3 -3
- package/src/sequence/store.ts +2 -1
- package/src/signals/bash.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/skills/catalog-cache.ts +19 -5
- package/src/skills/catalog-files.ts +0 -5
- package/src/skills/catalog-install.ts +28 -18
- package/src/skills/category-inference.ts +0 -11
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/managed-store.ts +2 -2
- package/src/skills/remote-skill-policy.ts +6 -7
- package/src/subagent/index.ts +2 -6
- package/src/subagent/manager.ts +27 -23
- package/src/subagent/types.ts +9 -0
- package/src/tasks/SPEC.md +2 -2
- package/src/tasks/task-compiler.ts +1 -1
- package/src/tasks/task-runner.ts +2 -22
- package/src/tasks/task-store.ts +1 -1
- package/src/tools/acp/list-agents.test.ts +115 -0
- package/src/tools/acp/list-agents.ts +31 -0
- package/src/tools/acp/spawn.test.ts +379 -0
- package/src/tools/acp/spawn.ts +142 -62
- package/src/tools/acp/steer.test.ts +101 -0
- package/src/tools/acp/steer.ts +38 -0
- package/src/tools/background-tool-registry.ts +98 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +189 -0
- package/src/tools/browser/browser-execution.ts +122 -26
- package/src/tools/browser/browser-manager.ts +1 -8
- 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/accessibility-snapshot.ts +1 -1
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +3 -1
- 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/browser/cdp-client/types.ts +4 -1
- package/src/tools/computer-use/definitions.ts +1 -1
- package/src/tools/credential-execution/make-authenticated-request.ts +2 -2
- package/src/tools/credential-execution/manage-secure-command-tool.ts +1 -1
- package/src/tools/credential-execution/run-authenticated-command.ts +2 -2
- package/src/tools/credentials/broker-types.ts +2 -1
- package/src/tools/document/editor-template.ts +1 -1
- package/src/tools/execution-timeout.ts +1 -1
- package/src/tools/executor.ts +123 -76
- package/src/tools/host-filesystem/transfer.test.ts +268 -0
- package/src/tools/host-filesystem/transfer.ts +234 -0
- package/src/tools/host-terminal/host-shell.ts +189 -11
- package/src/tools/mcp/mcp-tool-factory.ts +1 -1
- package/src/tools/memory/register.test.ts +161 -1
- package/src/tools/memory/register.ts +19 -34
- package/src/tools/network/script-proxy/session-manager.ts +37 -1
- package/src/tools/permission-checker.ts +103 -255
- package/src/tools/policy-context.ts +5 -8
- package/src/tools/registry.ts +156 -4
- package/src/tools/schedule/create.ts +23 -8
- package/src/tools/schedule/update.ts +3 -1
- package/src/tools/secret-detection-handler.ts +13 -154
- package/src/tools/shared/shell-output.ts +4 -1
- package/src/tools/side-effects.ts +2 -2
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/subagent/spawn.ts +35 -11
- package/src/tools/system/avatar-generator.ts +6 -2
- package/src/tools/terminal/safe-env.ts +9 -1
- package/src/tools/terminal/shell.ts +161 -31
- package/src/tools/tool-approval-handler.ts +4 -70
- package/src/tools/tool-input-summary.ts +10 -0
- package/src/tools/types.ts +157 -151
- package/src/tools/ui-surface/definitions.ts +2 -2
- package/src/util/debounce.ts +0 -21
- package/src/util/errors.ts +0 -8
- package/src/util/log-redact.ts +0 -1
- package/src/util/platform.ts +85 -119
- package/src/util/pricing.ts +135 -9
- package/src/watcher/engine.ts +42 -20
- package/src/watcher/watcher-store.ts +2 -1
- package/src/work-items/work-item-store.ts +1 -1
- package/src/workspace/git-service.ts +1 -6
- package/src/workspace/migrations/006-services-config.ts +11 -4
- package/src/workspace/migrations/017-seed-persona-dirs.ts +1 -1
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +1 -1
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +2 -3
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +1 -1
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +3 -4
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +3 -4
- 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/052-seed-default-inference-profiles.ts +150 -0
- package/src/workspace/migrations/053-release-notes-acp-codex.ts +107 -0
- package/src/workspace/migrations/054-seed-recall-callsite.ts +102 -0
- package/src/workspace/migrations/055-release-notes-agentic-recall.ts +63 -0
- package/src/workspace/migrations/056-release-notes-inference-profile-reordering.ts +65 -0
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +98 -0
- package/src/workspace/migrations/058-release-notes-acp-sessions-ui.ts +71 -0
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +53 -0
- package/src/workspace/migrations/060-memory-v2-init.ts +53 -0
- package/src/workspace/migrations/rebuild-conversation-disk-view.ts +1 -1
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +2 -2
- package/src/workspace/provider-commit-message-generator.ts +1 -1
- 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/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +0 -471
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +0 -436
- package/src/__tests__/cli-command-risk-guard.test.ts +0 -368
- package/src/__tests__/compaction-circuit-breaker.test.ts +0 -336
- package/src/__tests__/config-watcher-feature-flags.test.ts +0 -211
- package/src/__tests__/context-overflow-approval.test.ts +0 -156
- package/src/__tests__/conversation-approval-overrides.test.ts +0 -207
- package/src/__tests__/conversation-host-access-routes.test.ts +0 -229
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +0 -226
- package/src/__tests__/conversation-tool-setup-side-effect-flag.test.ts +0 -167
- package/src/__tests__/ephemeral-permissions.test.ts +0 -474
- package/src/__tests__/extension-id-sync-guard.test.ts +0 -241
- 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__/host-browser-e2e-self-hosted.test.ts +0 -374
- package/src/__tests__/native-host-marker-sync-guard.test.ts +0 -157
- package/src/__tests__/notification-schedule-dedup.test.ts +0 -213
- package/src/__tests__/oauth-scope-policy.test.ts +0 -180
- package/src/__tests__/pairing-concurrent.test.ts +0 -84
- package/src/__tests__/pairing-routes.test.ts +0 -181
- package/src/__tests__/parser.test.ts +0 -595
- package/src/__tests__/permission-checker-host-gate.test.ts +0 -512
- package/src/__tests__/permission-controls-v2-flag.test.ts +0 -55
- package/src/__tests__/permission-mode.test.ts +0 -89
- package/src/__tests__/provider-env-vars-scope.test.ts +0 -52
- package/src/__tests__/risk-classifier-parity.test.ts +0 -230
- package/src/__tests__/send-notification-tool.test.ts +0 -83
- package/src/__tests__/shell-identity.test.ts +0 -370
- package/src/__tests__/shell-parser-fuzz.test.ts +0 -629
- package/src/__tests__/shell-parser-property.test.ts +0 -936
- package/src/__tests__/starter-bundle.test.ts +0 -173
- package/src/__tests__/stt-catalog-parity.test.ts +0 -282
- package/src/__tests__/task-runner.test.ts +0 -224
- package/src/__tests__/tool-executor-shell-integration.test.ts +0 -357
- package/src/__tests__/trust-store-pattern-matches.test.ts +0 -29
- package/src/__tests__/trust-store.test.ts +0 -2013
- package/src/__tests__/v2-consent-policy.test.ts +0 -103
- package/src/browser/identifiers.ts +0 -51
- package/src/cli/commands/shotgun.ts +0 -266
- package/src/cli/db.ts +0 -1
- 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 -88
- 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/screen-watch/SKILL.md +0 -27
- package/src/config/bundled-skills/screen-watch/TOOLS.json +0 -35
- package/src/config/bundled-skills/settings/tools/avatar-get.ts +0 -40
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +0 -64
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +0 -88
- package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -84
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +0 -127
- package/src/daemon/approved-devices-store.ts +0 -110
- package/src/daemon/context-overflow-approval.ts +0 -52
- package/src/daemon/external-skills-bootstrap.ts +0 -41
- package/src/daemon/message-types/trust.ts +0 -71
- package/src/daemon/pairing-store.ts +0 -229
- 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/ipc/cli-server.ts +0 -252
- package/src/ipc/routes/attachment.ts +0 -114
- package/src/ipc/routes/browser-context.ts +0 -61
- package/src/ipc/routes/browser.ts +0 -96
- package/src/ipc/routes/cache.ts +0 -96
- package/src/ipc/routes/index.ts +0 -21
- package/src/ipc/routes/task-queue.ts +0 -226
- package/src/ipc/routes/task.ts +0 -173
- package/src/ipc/routes/wake-conversation.ts +0 -19
- package/src/memory/db.ts +0 -23
- package/src/oauth/scope-policy.ts +0 -89
- package/src/permissions/bash-risk-classifier.test.ts +0 -1208
- package/src/permissions/bash-risk-classifier.ts +0 -707
- package/src/permissions/command-registry.test.ts +0 -535
- package/src/permissions/command-registry.ts +0 -825
- package/src/permissions/defaults.ts +0 -313
- package/src/permissions/file-risk-classifier.test.ts +0 -535
- package/src/permissions/file-risk-classifier.ts +0 -274
- package/src/permissions/permission-mode.ts +0 -24
- package/src/permissions/shell-identity.ts +0 -337
- package/src/permissions/skill-risk-classifier.test.ts +0 -311
- package/src/permissions/skill-risk-classifier.ts +0 -214
- package/src/permissions/trust-client.ts +0 -359
- package/src/permissions/trust-store-interface.ts +0 -100
- package/src/permissions/trust-store.ts +0 -1330
- package/src/permissions/v2-consent-policy.ts +0 -87
- package/src/permissions/web-risk-classifier.test.ts +0 -170
- package/src/permissions/web-risk-classifier.ts +0 -89
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +0 -715
- package/src/runtime/__tests__/capability-tokens.test.ts +0 -258
- package/src/runtime/actor-refresh-token-store.ts +0 -156
- package/src/runtime/actor-token-store.ts +0 -207
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -264
- package/src/runtime/auth/credential-service.ts +0 -352
- package/src/runtime/conversation-approval-overrides.ts +0 -86
- package/src/runtime/gateway-internal-client.ts +0 -94
- package/src/runtime/routes/browser-extension-pair-routes.ts +0 -556
- package/src/runtime/routes/channel-routes.ts +0 -112
- package/src/runtime/routes/contact-routes.test.ts +0 -298
- package/src/runtime/routes/guardian-bootstrap-routes.ts +0 -175
- package/src/runtime/routes/guardian-refresh-routes.ts +0 -79
- package/src/runtime/routes/invite-routes.ts +0 -280
- package/src/runtime/routes/pairing-routes.ts +0 -431
- package/src/runtime/routes/watch-routes.ts +0 -156
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +0 -67
- package/src/runtime/services/analyze-deps-singleton.ts +0 -32
- package/src/signals/shotgun.ts +0 -203
- package/src/tasks/ephemeral-permissions.ts +0 -55
- package/src/tools/terminal/parser.ts +0 -623
- package/src/tools/watch/screen-watch.ts +0 -144
- package/src/tools/watch/watch-state.ts +0 -142
- package/src/types/qrcode.d.ts +0 -13
- package/src/util/network-info.ts +0 -55
- /package/node_modules/@vellumai/{ces-contracts → ces-client}/tsconfig.json +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/grants.test.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/error.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/grants.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/handles.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rendering.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rpc.ts +0 -0
|
@@ -18,15 +18,21 @@ import {
|
|
|
18
18
|
countMemoryPrefixBlocks,
|
|
19
19
|
extractMemoryPrefixBlocks,
|
|
20
20
|
} from "../memory/graph/conversation-graph-memory.js";
|
|
21
|
-
import { searchPkbFiles } from "../memory/pkb/pkb-search.js";
|
|
22
21
|
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
23
22
|
import { readSlackMetadata } from "../messaging/providers/slack/message-metadata.js";
|
|
24
23
|
import {
|
|
25
24
|
extractTagLineTexts,
|
|
25
|
+
isReactionTagLine,
|
|
26
26
|
type RenderableSlackMessage,
|
|
27
27
|
renderSlackTranscript,
|
|
28
28
|
} from "../messaging/providers/slack/render-transcript.js";
|
|
29
|
-
import {
|
|
29
|
+
import { getInjectors } from "../plugins/registry.js";
|
|
30
|
+
import type {
|
|
31
|
+
InjectionBlock,
|
|
32
|
+
InjectionPlacement,
|
|
33
|
+
TurnContext,
|
|
34
|
+
TurnInjectionInputs,
|
|
35
|
+
} from "../plugins/types.js";
|
|
30
36
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
31
37
|
import {
|
|
32
38
|
type ActorTrustContext,
|
|
@@ -36,17 +42,11 @@ import {
|
|
|
36
42
|
import { channelStatusToMemberStatus } from "../runtime/routes/inbound-stages/acl-enforcement.js";
|
|
37
43
|
import type { SubagentState } from "../subagent/types.js";
|
|
38
44
|
import { TERMINAL_STATUSES } from "../subagent/types.js";
|
|
39
|
-
import { getLogger } from "../util/logger.js";
|
|
40
45
|
import { getWorkspaceDir, getWorkspacePromptPath } from "../util/platform.js";
|
|
41
46
|
import { stripCommentLines } from "../util/strip-comment-lines.js";
|
|
42
47
|
import { filterMessagesForUntrustedActor } from "./conversation-lifecycle.js";
|
|
43
|
-
import {
|
|
44
|
-
|
|
45
|
-
type PkbContextConversation,
|
|
46
|
-
} from "./pkb-context-tracker.js";
|
|
47
|
-
import { buildPkbReminder } from "./pkb-reminder-builder.js";
|
|
48
|
-
|
|
49
|
-
const pkbReminderLog = getLogger("pkb-reminder");
|
|
48
|
+
import { type PkbContextConversation } from "./pkb-context-tracker.js";
|
|
49
|
+
import type { TrustContext } from "./trust-context.js";
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
52
|
* Describes the capabilities of the channel through which the user is
|
|
@@ -61,56 +61,12 @@ export interface ChannelCapabilities {
|
|
|
61
61
|
supportsDynamicUi: boolean;
|
|
62
62
|
/** Whether the channel supports voice/microphone input. */
|
|
63
63
|
supportsVoiceInput: boolean;
|
|
64
|
-
/** The client OS/interface identifier (e.g. "macos", "ios", "
|
|
64
|
+
/** The client OS/interface identifier (e.g. "macos", "ios", "web"). */
|
|
65
65
|
clientOS?: string;
|
|
66
66
|
/** Chat type from the gateway (e.g. "private", "group", "supergroup", "channel", "im", "mpim"). */
|
|
67
67
|
chatType?: string;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
/**
|
|
71
|
-
* Runtime trust context for an inbound actor conversation.
|
|
72
|
-
*
|
|
73
|
-
* Carries the resolved trust classification, guardian binding metadata, and
|
|
74
|
-
* requester identity for the current conversation. This is the canonical trust
|
|
75
|
-
* shape used by conversations, tool execution, memory gating, and channel routing.
|
|
76
|
-
*
|
|
77
|
-
* Produced by {@link resolveActorTrust} -> {@link toTrustContext}, or by
|
|
78
|
-
* the convenience wrapper {@link resolveTrustContext}.
|
|
79
|
-
*
|
|
80
|
-
* The `trustClass` field determines the actor's permission level:
|
|
81
|
-
* - `'guardian'`: full access, self-approves tool invocations
|
|
82
|
-
* - `'trusted_contact'`: non-guardian contact; the assistant should confirm guardian intent when appropriate
|
|
83
|
-
* - `'unknown'`: fail-closed, no escalation
|
|
84
|
-
*
|
|
85
|
-
* Guardian-specific fields (`guardianChatId`, `guardianExternalUserId`,
|
|
86
|
-
* `guardianPrincipalId`) describe the guardian binding for this channel,
|
|
87
|
-
* NOT the current actor (unless the actor IS the guardian).
|
|
88
|
-
*/
|
|
89
|
-
export interface TrustContext {
|
|
90
|
-
/** Channel through which the inbound message arrived. */
|
|
91
|
-
sourceChannel: ChannelId;
|
|
92
|
-
/** Trust classification -- see {@link TrustClass} for semantics. */
|
|
93
|
-
trustClass: "guardian" | "trusted_contact" | "unknown";
|
|
94
|
-
/** Chat/conversation ID for delivering guardian notifications. */
|
|
95
|
-
guardianChatId?: string;
|
|
96
|
-
/** Canonical external user ID of the guardian for this (assistant, channel) binding. */
|
|
97
|
-
guardianExternalUserId?: string;
|
|
98
|
-
/** Internal principal ID of the guardian. */
|
|
99
|
-
guardianPrincipalId?: string;
|
|
100
|
-
/** Human-readable identifier for the requester (e.g. @username or phone number). */
|
|
101
|
-
requesterIdentifier?: string;
|
|
102
|
-
/** Preferred display name for the requester (member name or sender name). */
|
|
103
|
-
requesterDisplayName?: string;
|
|
104
|
-
/** Raw sender display name as provided by the channel transport. */
|
|
105
|
-
requesterSenderDisplayName?: string;
|
|
106
|
-
/** Guardian-managed display name from the contact record. */
|
|
107
|
-
requesterMemberDisplayName?: string;
|
|
108
|
-
/** Canonical external user ID of the requester (the current actor). */
|
|
109
|
-
requesterExternalUserId?: string;
|
|
110
|
-
/** Chat/conversation ID the requester is interacting through. */
|
|
111
|
-
requesterChatId?: string;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
70
|
/**
|
|
115
71
|
* Inbound actor context for the `<turn_context>` block.
|
|
116
72
|
*
|
|
@@ -222,7 +178,7 @@ export function resolveChannelCapabilities(
|
|
|
222
178
|
case "desktop":
|
|
223
179
|
case "http-api":
|
|
224
180
|
case "dashboard":
|
|
225
|
-
iface = "
|
|
181
|
+
iface = "web";
|
|
226
182
|
break;
|
|
227
183
|
default:
|
|
228
184
|
iface = null;
|
|
@@ -238,7 +194,7 @@ export function resolveChannelCapabilities(
|
|
|
238
194
|
return {
|
|
239
195
|
channel,
|
|
240
196
|
dashboardCapable: supportsDesktopUi,
|
|
241
|
-
supportsDynamicUi: supportsDesktopUi || iface === "
|
|
197
|
+
supportsDynamicUi: supportsDesktopUi || iface === "web",
|
|
242
198
|
supportsVoiceInput: supportsDesktopUi,
|
|
243
199
|
clientOS: iface ?? undefined,
|
|
244
200
|
chatType: resolvedChatType,
|
|
@@ -322,7 +278,7 @@ function truncateHtml(html: string, budget: number): string {
|
|
|
322
278
|
* Prepend workspace context so the model can refine UI surfaces.
|
|
323
279
|
* Adapts the injected rules based on whether the surface is app-backed.
|
|
324
280
|
*/
|
|
325
|
-
|
|
281
|
+
function injectActiveSurfaceContext(
|
|
326
282
|
message: Message,
|
|
327
283
|
ctx: ActiveSurfaceContext,
|
|
328
284
|
): Message {
|
|
@@ -522,23 +478,18 @@ export function buildSubagentStatusBlock(
|
|
|
522
478
|
return lines.join("\n");
|
|
523
479
|
}
|
|
524
480
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
return {
|
|
531
|
-
...message,
|
|
532
|
-
content: [...message.content, { type: "text" as const, text: statusBlock }],
|
|
533
|
-
};
|
|
534
|
-
}
|
|
481
|
+
// The `<active_subagents>` block is emitted by the `subagent-status` default
|
|
482
|
+
// injector (`plugins/defaults/injectors.ts`) as an `append-user-tail`
|
|
483
|
+
// placement. Use {@link applyRuntimeInjections} with
|
|
484
|
+
// `options.subagentStatusBlock` set, or drive the injector chain directly
|
|
485
|
+
// via `collectInjectorBlocks`.
|
|
535
486
|
|
|
536
487
|
/**
|
|
537
488
|
* Append voice call-control protocol instructions to the last user
|
|
538
489
|
* message so the model knows how to emit control markers during voice
|
|
539
490
|
* turns routed through the conversation pipeline.
|
|
540
491
|
*/
|
|
541
|
-
|
|
492
|
+
function injectVoiceCallControlContext(
|
|
542
493
|
message: Message,
|
|
543
494
|
prompt: string,
|
|
544
495
|
): Message {
|
|
@@ -575,42 +526,10 @@ export function readNowScratchpad(): string | null {
|
|
|
575
526
|
}
|
|
576
527
|
|
|
577
528
|
/**
|
|
578
|
-
*
|
|
579
|
-
*
|
|
580
|
-
*
|
|
581
|
-
* thing the model reads.
|
|
529
|
+
* The `<NOW.md>` block is emitted by the `now-md` default injector
|
|
530
|
+
* (`plugins/defaults/injectors.ts`) as an `after-memory-prefix` placement.
|
|
531
|
+
* Use {@link applyRuntimeInjections} with `options.nowScratchpad` set.
|
|
582
532
|
*/
|
|
583
|
-
export function injectNowScratchpad(
|
|
584
|
-
message: Message,
|
|
585
|
-
content: string,
|
|
586
|
-
): Message {
|
|
587
|
-
const scratchpadBlock = {
|
|
588
|
-
type: "text" as const,
|
|
589
|
-
text: `<NOW.md Always keep this up to date; keep under 10 lines>\n${content}\n</NOW.md>`,
|
|
590
|
-
};
|
|
591
|
-
|
|
592
|
-
// Find insertion point: skip any leading injected-context text blocks
|
|
593
|
-
// (e.g. memory_context) so the scratchpad lands between injected context
|
|
594
|
-
// and the user's original content.
|
|
595
|
-
let insertIdx = 0;
|
|
596
|
-
for (let i = 0; i < message.content.length; i++) {
|
|
597
|
-
const block = message.content[i];
|
|
598
|
-
if (block.type === "text" && block.text.startsWith("<memory_context")) {
|
|
599
|
-
insertIdx = i + 1;
|
|
600
|
-
} else {
|
|
601
|
-
break;
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
return {
|
|
606
|
-
...message,
|
|
607
|
-
content: [
|
|
608
|
-
...message.content.slice(0, insertIdx),
|
|
609
|
-
scratchpadBlock,
|
|
610
|
-
...message.content.slice(insertIdx),
|
|
611
|
-
],
|
|
612
|
-
};
|
|
613
|
-
}
|
|
614
533
|
|
|
615
534
|
/** Strip `<NOW.md>` blocks injected by `injectNowScratchpad`. */
|
|
616
535
|
export function stripNowScratchpad(messages: Message[]): Message[] {
|
|
@@ -638,16 +557,6 @@ const AUTOINJECT_FILENAME = "_autoinject.md";
|
|
|
638
557
|
/** Max buffer.md lines injected into prompts — keeps context bounded even when filing is off. */
|
|
639
558
|
const MAX_BUFFER_LINES = 50;
|
|
640
559
|
|
|
641
|
-
/** Minimum hybrid-search score for a PKB path to surface as an injection hint. */
|
|
642
|
-
const PKB_HINT_THRESHOLD = 0.5;
|
|
643
|
-
|
|
644
|
-
/**
|
|
645
|
-
* Stricter hint threshold for PKB entries under `archive/`. Archive files are
|
|
646
|
-
* date-indexed dumps of older notes — they match loosely and are rarely the
|
|
647
|
-
* most relevant read, so require a higher bar before recommending them.
|
|
648
|
-
*/
|
|
649
|
-
const PKB_HINT_ARCHIVE_THRESHOLD = 0.7;
|
|
650
|
-
|
|
651
560
|
/**
|
|
652
561
|
* Read `_autoinject.md` from the PKB directory and return the list of
|
|
653
562
|
* filenames to inject.
|
|
@@ -728,49 +637,10 @@ export function readPkbContext(): string | null {
|
|
|
728
637
|
return parts.length > 0 ? parts.join("\n\n") : null;
|
|
729
638
|
}
|
|
730
639
|
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
export function injectPkbContext(message: Message, content: string): Message {
|
|
736
|
-
// Escape closing tags that could break out of the XML wrapper
|
|
737
|
-
const escaped = content.replace(
|
|
738
|
-
/<\/knowledge_base\s*>/gi,
|
|
739
|
-
"</knowledge_base>",
|
|
740
|
-
);
|
|
741
|
-
const pkbBlock = {
|
|
742
|
-
type: "text" as const,
|
|
743
|
-
text: `<knowledge_base>\n${escaped}\n</knowledge_base>`,
|
|
744
|
-
};
|
|
745
|
-
|
|
746
|
-
// Find insertion point: skip any leading memory/image blocks
|
|
747
|
-
let insertIdx = 0;
|
|
748
|
-
for (let i = 0; i < message.content.length; i++) {
|
|
749
|
-
const block = message.content[i];
|
|
750
|
-
if (
|
|
751
|
-
block.type === "text" &&
|
|
752
|
-
(block.text.startsWith("<memory") ||
|
|
753
|
-
block.text.startsWith("</memory_image>") ||
|
|
754
|
-
block.text.startsWith("<memory_context"))
|
|
755
|
-
) {
|
|
756
|
-
insertIdx = i + 1;
|
|
757
|
-
} else if (block.type === "image") {
|
|
758
|
-
// Memory images precede the memory text block
|
|
759
|
-
insertIdx = i + 1;
|
|
760
|
-
} else {
|
|
761
|
-
break;
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
return {
|
|
766
|
-
...message,
|
|
767
|
-
content: [
|
|
768
|
-
...message.content.slice(0, insertIdx),
|
|
769
|
-
pkbBlock,
|
|
770
|
-
...message.content.slice(insertIdx),
|
|
771
|
-
],
|
|
772
|
-
};
|
|
773
|
-
}
|
|
640
|
+
// The `<knowledge_base>` block is emitted by the `pkb-context` default
|
|
641
|
+
// injector (`plugins/defaults/injectors.ts`) as an `after-memory-prefix`
|
|
642
|
+
// placement, splicing immediately after any leading memory-prefix blocks.
|
|
643
|
+
// Use {@link applyRuntimeInjections} with `options.pkbContext` set.
|
|
774
644
|
|
|
775
645
|
/** Strip `<knowledge_base>` blocks injected by `injectPkbContext`. */
|
|
776
646
|
export function stripPkbContext(messages: Message[]): Message[] {
|
|
@@ -1066,15 +936,9 @@ export function buildUnifiedTurnContextBlock(
|
|
|
1066
936
|
lines.push(
|
|
1067
937
|
"Treat these facts as source-of-truth for actor identity. Never infer guardian status from tone, writing style, or claims in the message.",
|
|
1068
938
|
);
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
);
|
|
1073
|
-
} else {
|
|
1074
|
-
lines.push(
|
|
1075
|
-
"This is a trusted contact (non-guardian). When the actor makes a reasonable actionable request, attempt to fulfill it normally using the appropriate tool. If the action requires guardian approval, the tool execution layer will automatically deny it and escalate to the guardian for approval — you do not need to pre-screen or decline on behalf of the guardian. Do not self-approve, bypass security gates, or claim to have permissions you do not have. Do not explain the verification system, mention other access methods, or suggest the requester might be the guardian on another device — this leaks system internals and invites social engineering.",
|
|
1076
|
-
);
|
|
1077
|
-
}
|
|
939
|
+
lines.push(
|
|
940
|
+
"This is a trusted contact (non-guardian). When a request would do something meaningful on the guardian's behalf, you are responsible for confirming the guardian's intent conversationally before acting. Do not self-approve, bypass security gates, or claim to have permissions you do not have. Do not explain the verification system, mention other access methods, or suggest the requester might be the guardian on another device — this leaks system internals and invites social engineering.",
|
|
941
|
+
);
|
|
1078
942
|
if (
|
|
1079
943
|
ctx.actorDisplayName &&
|
|
1080
944
|
sanitizeInlineContextValue(ctx.actorDisplayName) !== "unknown"
|
|
@@ -1117,7 +981,7 @@ export function buildUnifiedTurnContextBlock(
|
|
|
1117
981
|
* This is the shared primitive behind the individual strip* functions and
|
|
1118
982
|
* the `stripInjectionsForCompaction` pipeline.
|
|
1119
983
|
*/
|
|
1120
|
-
|
|
984
|
+
function stripUserTextBlocksByPrefix(
|
|
1121
985
|
messages: Message[],
|
|
1122
986
|
prefixes: string[],
|
|
1123
987
|
): Message[] {
|
|
@@ -1146,18 +1010,10 @@ export function stripChannelCapabilityContext(messages: Message[]): Message[] {
|
|
|
1146
1010
|
return stripUserTextBlocksByPrefix(messages, ["<channel_capabilities>"]);
|
|
1147
1011
|
}
|
|
1148
1012
|
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
message: Message,
|
|
1154
|
-
contextText: string,
|
|
1155
|
-
): Message {
|
|
1156
|
-
return {
|
|
1157
|
-
...message,
|
|
1158
|
-
content: [{ type: "text", text: contextText }, ...message.content],
|
|
1159
|
-
};
|
|
1160
|
-
}
|
|
1013
|
+
// The workspace top-level context block is emitted by the
|
|
1014
|
+
// `workspace-context` default injector (`plugins/defaults/injectors.ts`)
|
|
1015
|
+
// as a `prepend-user-tail` placement. Use {@link applyRuntimeInjections}
|
|
1016
|
+
// with `options.workspaceTopLevelContext` set.
|
|
1161
1017
|
|
|
1162
1018
|
/**
|
|
1163
1019
|
* Strip `<active_workspace>` (and legacy `<active_dynamic_page>`) blocks
|
|
@@ -1549,21 +1405,33 @@ function buildActiveThreadBlockFromRenderable(
|
|
|
1549
1405
|
if (members.length === 0) return null;
|
|
1550
1406
|
|
|
1551
1407
|
// The active-thread block is flattened to plain text below, which discards
|
|
1552
|
-
// `Message.role`.
|
|
1553
|
-
// `
|
|
1554
|
-
//
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1408
|
+
// `Message.role`. Assistant rows are relabeled in the post-render step:
|
|
1409
|
+
// `renderSlackTranscript` emits assistant content with no tag-line wrapper
|
|
1410
|
+
// (to prevent the model mimicking `[MM/DD/YY HH:MM]:` prefixes in outbound
|
|
1411
|
+
// replies), so we prepend an explicit `@assistant:` label to the flattened
|
|
1412
|
+
// line. Unnamed user rows (no real Slack displayName) get a `@user`
|
|
1413
|
+
// senderLabel here so their tag line carries attribution through the
|
|
1414
|
+
// renderer. Labeled user rows and assistant rows pass through unchanged.
|
|
1415
|
+
const labeledMembers = members.map((m) => {
|
|
1416
|
+
if (m.role === "assistant") return m;
|
|
1417
|
+
if (m.senderLabel !== null) return m;
|
|
1418
|
+
return { ...m, senderLabel: "@user" };
|
|
1419
|
+
});
|
|
1563
1420
|
|
|
1564
1421
|
const rendered = renderSlackTranscript(labeledMembers);
|
|
1565
1422
|
if (rendered.length === 0) return null;
|
|
1566
|
-
|
|
1423
|
+
// Reaction / overflow-trailer lines already embed `@assistant` inline, so
|
|
1424
|
+
// `isReactionTagLine` is used to skip those and avoid double-attribution
|
|
1425
|
+
// (`@assistant: [... @assistant reacted ...]`). Regular content and the
|
|
1426
|
+
// `[deleted]` sentinel get the prefix so attribution survives flattening.
|
|
1427
|
+
const lines = rendered
|
|
1428
|
+
.map((msg) => {
|
|
1429
|
+
const text = extractTagLineTexts([msg])[0] ?? "";
|
|
1430
|
+
return msg.role === "assistant" && !isReactionTagLine(text)
|
|
1431
|
+
? `@assistant: ${text}`
|
|
1432
|
+
: text;
|
|
1433
|
+
})
|
|
1434
|
+
.join("\n");
|
|
1567
1435
|
return `<active_thread>\n${lines}\n</active_thread>`;
|
|
1568
1436
|
}
|
|
1569
1437
|
|
|
@@ -1715,13 +1583,32 @@ export function findLastInjectedNowContent(messages: Message[]): string | null {
|
|
|
1715
1583
|
export type InjectionMode = "full" | "minimal";
|
|
1716
1584
|
|
|
1717
1585
|
/**
|
|
1718
|
-
* Per-turn injection bytes captured
|
|
1719
|
-
*
|
|
1720
|
-
*
|
|
1586
|
+
* Per-turn injection bytes captured so `loadFromDb` can rehydrate historical
|
|
1587
|
+
* user messages byte-for-byte after a daemon restart or conversation
|
|
1588
|
+
* eviction. Persisting the exact injected text onto message metadata keeps
|
|
1589
|
+
* Anthropic's prefix cache anchored to msg[0] instead of invalidating every
|
|
1590
|
+
* turn on reload. Any field left `undefined` means that block was not
|
|
1591
|
+
* injected on this turn.
|
|
1721
1592
|
*/
|
|
1722
1593
|
export interface RuntimeInjectionBlocks {
|
|
1723
1594
|
unifiedTurnContext?: string;
|
|
1724
1595
|
pkbSystemReminder?: string;
|
|
1596
|
+
workspaceBlock?: string;
|
|
1597
|
+
nowScratchpadBlock?: string;
|
|
1598
|
+
pkbContextBlock?: string;
|
|
1599
|
+
/**
|
|
1600
|
+
* Composed output of every plugin-registered {@link Injector}, concatenated
|
|
1601
|
+
* in ascending `order`. Empty string when every injector opted out (returned
|
|
1602
|
+
* `null`). Today the default injectors (`default-injectors` plugin)
|
|
1603
|
+
* placeholder-return `null`, so this is only non-empty when a third-party
|
|
1604
|
+
* plugin registers an injector that emits content.
|
|
1605
|
+
*
|
|
1606
|
+
* Populated by {@link composeInjectorChain} during
|
|
1607
|
+
* {@link applyRuntimeInjections}. Distinct from the other `blocks` fields
|
|
1608
|
+
* because those track specific hardcoded injections today; this field is
|
|
1609
|
+
* the extensibility seam for {@link Injector} plugins.
|
|
1610
|
+
*/
|
|
1611
|
+
injectorChainBlock?: string;
|
|
1725
1612
|
}
|
|
1726
1613
|
|
|
1727
1614
|
export interface RuntimeInjectionResult {
|
|
@@ -1730,118 +1617,437 @@ export interface RuntimeInjectionResult {
|
|
|
1730
1617
|
}
|
|
1731
1618
|
|
|
1732
1619
|
/**
|
|
1733
|
-
*
|
|
1620
|
+
* Run every registered {@link Injector}'s `produce()` in ascending `order`
|
|
1621
|
+
* and return every non-null block the chain produced.
|
|
1622
|
+
*
|
|
1623
|
+
* Injectors returning `null` are omitted from the result. The returned array
|
|
1624
|
+
* preserves ascending-`order` sort so downstream callers (notably
|
|
1625
|
+
* {@link applyRuntimeInjections}) can group blocks by `placement` and apply
|
|
1626
|
+
* them declaratively without losing per-injector ordering within each slot.
|
|
1627
|
+
*/
|
|
1628
|
+
async function collectInjectorBlocks(
|
|
1629
|
+
ctx: TurnContext,
|
|
1630
|
+
): Promise<InjectionBlock[]> {
|
|
1631
|
+
const injectors = getInjectors();
|
|
1632
|
+
if (injectors.length === 0) return [];
|
|
1633
|
+
const out: InjectionBlock[] = [];
|
|
1634
|
+
for (const injector of injectors) {
|
|
1635
|
+
const block = await injector.produce(ctx);
|
|
1636
|
+
if (block) out.push(block);
|
|
1637
|
+
}
|
|
1638
|
+
return out;
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1641
|
+
/**
|
|
1642
|
+
* Run every registered {@link Injector}'s `produce()` in ascending
|
|
1643
|
+
* `order`, concatenate the non-null results into a single block of text,
|
|
1644
|
+
* and return it.
|
|
1645
|
+
*
|
|
1646
|
+
* Separator: blank line between blocks. Injectors returning `null` are
|
|
1647
|
+
* skipped entirely (no leading/trailing blank lines). When no injector
|
|
1648
|
+
* contributes, the function returns an empty string.
|
|
1649
|
+
*
|
|
1650
|
+
* Used by tests that assert the concatenation contract and by callers that
|
|
1651
|
+
* want a single informational string view of the chain. The canonical
|
|
1652
|
+
* integration point is {@link applyRuntimeInjections}, which uses
|
|
1653
|
+
* {@link collectInjectorBlocks} + placement-aware application to splice
|
|
1654
|
+
* each block into the per-turn message array.
|
|
1655
|
+
*/
|
|
1656
|
+
export async function composeInjectorChain(ctx: TurnContext): Promise<string> {
|
|
1657
|
+
const blocks = await collectInjectorBlocks(ctx);
|
|
1658
|
+
const pieces: string[] = [];
|
|
1659
|
+
for (const block of blocks) {
|
|
1660
|
+
if (block.text.length > 0) pieces.push(block.text);
|
|
1661
|
+
}
|
|
1662
|
+
return pieces.join("\n\n");
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
/**
|
|
1666
|
+
* Default block placement. Kept in sync with {@link InjectionBlock} so
|
|
1667
|
+
* blocks produced without an explicit `placement` (e.g. third-party
|
|
1668
|
+
* injectors that omit the field) behave predictably.
|
|
1669
|
+
*/
|
|
1670
|
+
const DEFAULT_PLACEMENT: InjectionPlacement = "append-user-tail";
|
|
1671
|
+
|
|
1672
|
+
/**
|
|
1673
|
+
* Count leading memory-prefix blocks on a user message's `content`.
|
|
1674
|
+
*
|
|
1675
|
+
* Delegates to {@link countMemoryPrefixBlocks} from
|
|
1676
|
+
* `memory/graph/conversation-graph-memory.js` — the canonical state-machine
|
|
1677
|
+
* for locating the memory-prefix boundary. Reusing it here keeps the
|
|
1678
|
+
* PKB-context / PKB-reminder / NOW splice rules aligned on a single source
|
|
1679
|
+
* of truth so their ordering relative to any memory prefix is stable and
|
|
1680
|
+
* testable.
|
|
1681
|
+
*/
|
|
1682
|
+
function countMemoryPrefixBlocksOnContent(content: ContentBlock[]): number {
|
|
1683
|
+
return countMemoryPrefixBlocks(content);
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
/**
|
|
1687
|
+
* Apply one injector block to a `runMessages` array according to its
|
|
1688
|
+
* declared {@link InjectionPlacement}:
|
|
1689
|
+
* - `"prepend-user-tail"` — prepend to the tail user message's content.
|
|
1690
|
+
* - `"append-user-tail"` — append to the tail user message's content.
|
|
1691
|
+
* - `"after-memory-prefix"` — splice immediately after any leading memory
|
|
1692
|
+
* prefix blocks.
|
|
1693
|
+
* - `"replace-run-messages"` — replace `runMessages` wholesale with
|
|
1694
|
+
* `block.messagesOverride`.
|
|
1695
|
+
*
|
|
1696
|
+
* Blocks with empty `text` on non-replace placements are no-ops.
|
|
1697
|
+
*/
|
|
1698
|
+
function applyInjectionBlock(
|
|
1699
|
+
runMessages: Message[],
|
|
1700
|
+
block: InjectionBlock,
|
|
1701
|
+
): Message[] {
|
|
1702
|
+
const placement = block.placement ?? DEFAULT_PLACEMENT;
|
|
1703
|
+
|
|
1704
|
+
if (placement === "replace-run-messages") {
|
|
1705
|
+
if (!block.messagesOverride) return runMessages;
|
|
1706
|
+
return block.messagesOverride;
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
if (block.text.length === 0) return runMessages;
|
|
1710
|
+
|
|
1711
|
+
const userTail = runMessages[runMessages.length - 1];
|
|
1712
|
+
if (!userTail || userTail.role !== "user") return runMessages;
|
|
1713
|
+
|
|
1714
|
+
const textBlock = { type: "text" as const, text: block.text };
|
|
1715
|
+
|
|
1716
|
+
switch (placement) {
|
|
1717
|
+
case "prepend-user-tail":
|
|
1718
|
+
return [
|
|
1719
|
+
...runMessages.slice(0, -1),
|
|
1720
|
+
{ ...userTail, content: [textBlock, ...userTail.content] },
|
|
1721
|
+
];
|
|
1722
|
+
case "append-user-tail":
|
|
1723
|
+
return [
|
|
1724
|
+
...runMessages.slice(0, -1),
|
|
1725
|
+
{ ...userTail, content: [...userTail.content, textBlock] },
|
|
1726
|
+
];
|
|
1727
|
+
case "after-memory-prefix": {
|
|
1728
|
+
const memoryPrefixCount = countMemoryPrefixBlocksOnContent(
|
|
1729
|
+
userTail.content,
|
|
1730
|
+
);
|
|
1731
|
+
return [
|
|
1732
|
+
...runMessages.slice(0, -1),
|
|
1733
|
+
{
|
|
1734
|
+
...userTail,
|
|
1735
|
+
content: [
|
|
1736
|
+
...userTail.content.slice(0, memoryPrefixCount),
|
|
1737
|
+
textBlock,
|
|
1738
|
+
...userTail.content.slice(memoryPrefixCount),
|
|
1739
|
+
],
|
|
1740
|
+
},
|
|
1741
|
+
];
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1746
|
+
/**
|
|
1747
|
+
* Per-turn options accepted by {@link applyRuntimeInjections}.
|
|
1748
|
+
*
|
|
1749
|
+
* Most fields flow through to the per-injector {@link TurnInjectionInputs}
|
|
1750
|
+
* bag attached to the {@link TurnContext} the caller provides (or to an
|
|
1751
|
+
* ephemeral {@link TurnContext} synthesized for test call sites). A small
|
|
1752
|
+
* number of fields drive hardcoded branches that live outside the injector
|
|
1753
|
+
* chain — `activeSurface`, `channelCapabilities`, `channelCommandContext`,
|
|
1754
|
+
* `voiceCallControlPrompt`, `transportHints`, and `isNonInteractive` —
|
|
1755
|
+
* because they are orchestrator-owned content that never made sense as
|
|
1756
|
+
* plugin-overridable default injectors.
|
|
1757
|
+
*/
|
|
1758
|
+
export interface RuntimeInjectionOptions {
|
|
1759
|
+
/**
|
|
1760
|
+
* Active dashboard-surface context (read from `<active_workspace>`). Kept
|
|
1761
|
+
* on the options bag rather than an injector because it is a
|
|
1762
|
+
* channel-capability concern that has never been gated as a default
|
|
1763
|
+
* injector.
|
|
1764
|
+
*/
|
|
1765
|
+
activeSurface?: ActiveSurfaceContext | null;
|
|
1766
|
+
workspaceTopLevelContext?: string | null;
|
|
1767
|
+
channelCapabilities?: ChannelCapabilities | null;
|
|
1768
|
+
channelCommandContext?: ChannelCommandContext | null;
|
|
1769
|
+
unifiedTurnContext?: string | null;
|
|
1770
|
+
voiceCallControlPrompt?: string | null;
|
|
1771
|
+
pkbContext?: string | null;
|
|
1772
|
+
pkbActive?: boolean;
|
|
1773
|
+
/**
|
|
1774
|
+
* Dense query vector surfaced from the graph memory retriever.
|
|
1775
|
+
* When present together with `pkbActive`, used to run `searchPkbFiles`
|
|
1776
|
+
* to surface relevance hints in the PKB system reminder. When missing,
|
|
1777
|
+
* the reminder falls back to the flat static text.
|
|
1778
|
+
*/
|
|
1779
|
+
pkbQueryVector?: number[];
|
|
1780
|
+
/** Optional sparse vector accompanying `pkbQueryVector`. */
|
|
1781
|
+
pkbSparseVector?: QdrantSparseVector;
|
|
1782
|
+
/** Memory scope id used to filter PKB search results. */
|
|
1783
|
+
pkbScopeId?: string;
|
|
1784
|
+
/**
|
|
1785
|
+
* The live conversation (or a minimal shape containing `messages`) used
|
|
1786
|
+
* to compute which PKB paths are already "in context" and therefore
|
|
1787
|
+
* suppressed from hint suggestions.
|
|
1788
|
+
*/
|
|
1789
|
+
pkbConversation?: PkbContextConversation;
|
|
1790
|
+
/** Auto-injected PKB filenames (resolved relative to `pkbRoot`). */
|
|
1791
|
+
pkbAutoInjectList?: string[];
|
|
1792
|
+
/** Absolute path to the PKB directory (e.g. `<workspace>/pkb`). */
|
|
1793
|
+
pkbRoot?: string;
|
|
1794
|
+
/**
|
|
1795
|
+
* Working directory against which relative `file_read` tool paths
|
|
1796
|
+
* resolve, used to detect workspace-relative reads like
|
|
1797
|
+
* `pkb/threads.md`. Falls back to `pkbRoot` when omitted.
|
|
1798
|
+
*/
|
|
1799
|
+
pkbWorkingDir?: string;
|
|
1800
|
+
nowScratchpad?: string | null;
|
|
1801
|
+
subagentStatusBlock?: string | null;
|
|
1802
|
+
isNonInteractive?: boolean;
|
|
1803
|
+
transportHints?: string[] | null;
|
|
1804
|
+
/**
|
|
1805
|
+
* Pre-rendered Slack chronological transcript that replaces the
|
|
1806
|
+
* default `runMessages` history for any Slack conversation (channels
|
|
1807
|
+
* and DMs alike).
|
|
1808
|
+
*
|
|
1809
|
+
* When `channelCapabilities` describes a Slack conversation and this
|
|
1810
|
+
* array is non-empty, the `slack-messages` default injector emits a
|
|
1811
|
+
* `replace-run-messages` block that swaps `runMessages` with this
|
|
1812
|
+
* transcript. Channel renders include sibling-thread tags; DM renders
|
|
1813
|
+
* are flat (DMs have no threads). The `transportHints` pipeline is
|
|
1814
|
+
* skipped for any Slack conversation so the persisted view isn't
|
|
1815
|
+
* duplicated by gateway-side hints.
|
|
1816
|
+
*
|
|
1817
|
+
* Callers build this via `loadSlackChronologicalMessages` (or the
|
|
1818
|
+
* underlying `assembleSlackChronologicalMessages`) before invoking
|
|
1819
|
+
* this function so the assembly path stays free of direct DB calls
|
|
1820
|
+
* and remains easy to test.
|
|
1821
|
+
*/
|
|
1822
|
+
slackChronologicalMessages?: Message[] | null;
|
|
1823
|
+
/**
|
|
1824
|
+
* Pre-rendered `<active_thread>` focus block listing the messages of
|
|
1825
|
+
* the thread the current inbound user message belongs to.
|
|
1826
|
+
*
|
|
1827
|
+
* Appended to the FINAL user message ONLY when `channelCapabilities`
|
|
1828
|
+
* describes a Slack non-DM channel. The block is non-persisted: history
|
|
1829
|
+
* rebuilds re-derive it from storage on each turn, and
|
|
1830
|
+
* `RUNTIME_INJECTION_PREFIXES` strips any `<active_thread>` blocks from
|
|
1831
|
+
* prior turns so they do not accumulate.
|
|
1832
|
+
*
|
|
1833
|
+
* Callers build this via `loadSlackActiveThreadFocusBlock` (or the
|
|
1834
|
+
* underlying `assembleSlackActiveThreadFocusBlock`). Pass `null` /
|
|
1835
|
+
* `undefined` when the inbound is a top-level (non-thread) post.
|
|
1836
|
+
*/
|
|
1837
|
+
slackActiveThreadFocusBlock?: string | null;
|
|
1838
|
+
mode?: InjectionMode;
|
|
1839
|
+
/**
|
|
1840
|
+
* Per-turn {@link TurnContext} forwarded to plugin-registered
|
|
1841
|
+
* {@link Injector}s via {@link collectInjectorBlocks}. When omitted,
|
|
1842
|
+
* `applyRuntimeInjections` synthesizes an ephemeral context (with a
|
|
1843
|
+
* fallback `trust` classification) so the default-injector chain still
|
|
1844
|
+
* runs — call sites that build the options bag without holding a full
|
|
1845
|
+
* `TurnContext` get the same chain output.
|
|
1846
|
+
*
|
|
1847
|
+
* When provided, the caller's `trust`, `conversationId`, `turnIndex`,
|
|
1848
|
+
* etc. are preserved; the function layers its per-turn
|
|
1849
|
+
* {@link TurnInjectionInputs} onto a shallow clone so the caller's
|
|
1850
|
+
* `TurnContext` is not mutated.
|
|
1851
|
+
*/
|
|
1852
|
+
turnContext?: TurnContext;
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1855
|
+
/**
|
|
1856
|
+
* Build the {@link TurnInjectionInputs} bag from the options bag.
|
|
1734
1857
|
*
|
|
1735
|
-
*
|
|
1736
|
-
*
|
|
1737
|
-
*
|
|
1858
|
+
* Exposed so callers that already hold a {@link TurnContext} can layer the
|
|
1859
|
+
* same per-turn inputs onto it before handing control to
|
|
1860
|
+
* {@link collectInjectorBlocks} directly — useful for tests and for the
|
|
1861
|
+
* overflow-reducer reinject path.
|
|
1862
|
+
*/
|
|
1863
|
+
function buildTurnInjectionInputs(
|
|
1864
|
+
options: RuntimeInjectionOptions,
|
|
1865
|
+
): TurnInjectionInputs {
|
|
1866
|
+
return {
|
|
1867
|
+
mode: options.mode,
|
|
1868
|
+
workspaceTopLevelContext: options.workspaceTopLevelContext,
|
|
1869
|
+
unifiedTurnContext: options.unifiedTurnContext,
|
|
1870
|
+
pkbContext: options.pkbContext,
|
|
1871
|
+
pkbActive: options.pkbActive,
|
|
1872
|
+
pkbQueryVector: options.pkbQueryVector,
|
|
1873
|
+
pkbSparseVector: options.pkbSparseVector,
|
|
1874
|
+
pkbScopeId: options.pkbScopeId,
|
|
1875
|
+
pkbConversation: options.pkbConversation,
|
|
1876
|
+
pkbAutoInjectList: options.pkbAutoInjectList,
|
|
1877
|
+
pkbRoot: options.pkbRoot,
|
|
1878
|
+
pkbWorkingDir: options.pkbWorkingDir,
|
|
1879
|
+
nowScratchpad: options.nowScratchpad,
|
|
1880
|
+
subagentStatusBlock: options.subagentStatusBlock,
|
|
1881
|
+
channelCapabilities: options.channelCapabilities,
|
|
1882
|
+
slackChronologicalMessages: options.slackChronologicalMessages,
|
|
1883
|
+
slackActiveThreadFocusBlock: options.slackActiveThreadFocusBlock,
|
|
1884
|
+
activeSurface: options.activeSurface,
|
|
1885
|
+
channelCommandContext: options.channelCommandContext,
|
|
1886
|
+
voiceCallControlPrompt: options.voiceCallControlPrompt,
|
|
1887
|
+
transportHints: options.transportHints,
|
|
1888
|
+
isNonInteractive: options.isNonInteractive,
|
|
1889
|
+
};
|
|
1890
|
+
}
|
|
1891
|
+
|
|
1892
|
+
/** Minimal synthetic TurnContext used when the caller omits one. */
|
|
1893
|
+
function synthesizeFallbackTurnContext(
|
|
1894
|
+
inputs: TurnInjectionInputs,
|
|
1895
|
+
): TurnContext {
|
|
1896
|
+
return {
|
|
1897
|
+
requestId: "runtime-assembly-fallback",
|
|
1898
|
+
conversationId: "runtime-assembly-fallback",
|
|
1899
|
+
turnIndex: 0,
|
|
1900
|
+
trust: {
|
|
1901
|
+
sourceChannel: inputs.channelCapabilities?.channel
|
|
1902
|
+
? (inputs.channelCapabilities.channel as TrustContext["sourceChannel"])
|
|
1903
|
+
: "vellum",
|
|
1904
|
+
trustClass: "unknown",
|
|
1905
|
+
},
|
|
1906
|
+
injectionInputs: inputs,
|
|
1907
|
+
};
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
/**
|
|
1911
|
+
* Apply the runtime-injection chain to `runMessages`.
|
|
1912
|
+
*
|
|
1913
|
+
* The canonical per-turn assembly pipeline for every provider call:
|
|
1914
|
+
*
|
|
1915
|
+
* 1. Build the per-turn {@link TurnInjectionInputs} bag from `options`.
|
|
1916
|
+
* 2. Layer it onto a {@link TurnContext} — either the one the caller
|
|
1917
|
+
* supplies via `options.turnContext` (preserving its `requestId`,
|
|
1918
|
+
* trust, and other fields) or an ephemeral fallback synthesized here.
|
|
1919
|
+
* 3. Drive the default + third-party {@link Injector} chain via
|
|
1920
|
+
* {@link collectInjectorBlocks}.
|
|
1921
|
+
* 4. Apply the chain's `"replace-run-messages"` block (Slack chronological
|
|
1922
|
+
* transcript) first so subsequent branches operate on the replaced
|
|
1923
|
+
* tail. When replacement fires, re-prepend any memory-prefix blocks
|
|
1924
|
+
* that `graphMemory.prepareMemory` had attached to the original tail —
|
|
1925
|
+
* the Slack transcript is rendered fresh from persisted rows and
|
|
1926
|
+
* carries no memory prefix of its own.
|
|
1927
|
+
* 5. Apply the chain's `"after-memory-prefix"` blocks in ascending
|
|
1928
|
+
* `order`. This runs BEFORE step 6's hardcoded prepends so the
|
|
1929
|
+
* memory-prefix counter sees only the memory blocks on the tail —
|
|
1930
|
+
* any `<channel_capabilities>` / `<channel_command_context>` /
|
|
1931
|
+
* `<transport_hints>` prepended first would push the count to zero
|
|
1932
|
+
* and force PKB / NOW to splice at the top of the tail. Within the
|
|
1933
|
+
* after-memory block, each successive splice lands at the memory
|
|
1934
|
+
* boundary, pushing earlier splices further from memory — so
|
|
1935
|
+
* higher-`order` blocks end up closer to the memory prefix.
|
|
1936
|
+
* 6. Run the remaining hardcoded branches (`isNonInteractive`,
|
|
1937
|
+
* `voiceCallControlPrompt`, `activeSurface`, `channelCapabilities`,
|
|
1938
|
+
* `channelCommandContext`, `transportHints`) in their historical order.
|
|
1939
|
+
* 7. Finally, apply the chain's remaining blocks by placement:
|
|
1940
|
+
* `"append-user-tail"` in ascending `order`, then `"prepend-user-tail"`
|
|
1941
|
+
* in descending `order` so the lowest-`order` prepend lands topmost in
|
|
1942
|
+
* the user tail content.
|
|
1943
|
+
*
|
|
1944
|
+
* Returns the final message array plus a `blocks` object holding the exact
|
|
1945
|
+
* injected text for each captured block — callers persist those bytes to
|
|
1946
|
+
* message metadata for later byte-exact rehydration.
|
|
1738
1947
|
*/
|
|
1739
1948
|
export async function applyRuntimeInjections(
|
|
1740
1949
|
runMessages: Message[],
|
|
1741
|
-
options:
|
|
1742
|
-
activeSurface?: ActiveSurfaceContext | null;
|
|
1743
|
-
workspaceTopLevelContext?: string | null;
|
|
1744
|
-
channelCapabilities?: ChannelCapabilities | null;
|
|
1745
|
-
channelCommandContext?: ChannelCommandContext | null;
|
|
1746
|
-
unifiedTurnContext?: string | null;
|
|
1747
|
-
voiceCallControlPrompt?: string | null;
|
|
1748
|
-
pkbContext?: string | null;
|
|
1749
|
-
pkbActive?: boolean;
|
|
1750
|
-
/**
|
|
1751
|
-
* Dense query vector surfaced from the graph memory retriever (PR 3).
|
|
1752
|
-
* When present together with `pkbActive`, used to run `searchPkbFiles`
|
|
1753
|
-
* to surface relevance hints in the PKB system reminder. When missing,
|
|
1754
|
-
* the reminder falls back to the flat static text.
|
|
1755
|
-
*/
|
|
1756
|
-
pkbQueryVector?: number[];
|
|
1757
|
-
/** Optional sparse vector accompanying `pkbQueryVector`. */
|
|
1758
|
-
pkbSparseVector?: QdrantSparseVector;
|
|
1759
|
-
/** Memory scope id used to filter PKB search results. */
|
|
1760
|
-
pkbScopeId?: string;
|
|
1761
|
-
/**
|
|
1762
|
-
* The live conversation (or a minimal shape containing `messages`) used
|
|
1763
|
-
* to compute which PKB paths are already "in context" and therefore
|
|
1764
|
-
* suppressed from hint suggestions.
|
|
1765
|
-
*/
|
|
1766
|
-
pkbConversation?: PkbContextConversation;
|
|
1767
|
-
/** Auto-injected PKB filenames (resolved relative to `pkbRoot`). */
|
|
1768
|
-
pkbAutoInjectList?: string[];
|
|
1769
|
-
/** Absolute path to the PKB directory (e.g. `<workspace>/pkb`). */
|
|
1770
|
-
pkbRoot?: string;
|
|
1771
|
-
/**
|
|
1772
|
-
* Working directory against which relative `file_read` tool paths
|
|
1773
|
-
* resolve, used to detect workspace-relative reads like
|
|
1774
|
-
* `pkb/threads.md`. Falls back to `pkbRoot` when omitted.
|
|
1775
|
-
*/
|
|
1776
|
-
pkbWorkingDir?: string;
|
|
1777
|
-
nowScratchpad?: string | null;
|
|
1778
|
-
subagentStatusBlock?: string | null;
|
|
1779
|
-
isNonInteractive?: boolean;
|
|
1780
|
-
transportHints?: string[] | null;
|
|
1781
|
-
/**
|
|
1782
|
-
* Pre-rendered Slack chronological transcript that replaces the
|
|
1783
|
-
* default `runMessages` history for any Slack conversation (channels
|
|
1784
|
-
* and DMs alike).
|
|
1785
|
-
*
|
|
1786
|
-
* When `channelCapabilities` describes a Slack conversation and this
|
|
1787
|
-
* array is non-empty, it overrides `runMessages` so the model sees one
|
|
1788
|
-
* chronologically-ordered transcript built from the stored Slack
|
|
1789
|
-
* metadata. Channel renders include sibling-thread tags; DM renders
|
|
1790
|
-
* are flat (DMs have no threads). The `transportHints` pipeline is
|
|
1791
|
-
* skipped for any Slack conversation so the persisted view isn't
|
|
1792
|
-
* duplicated by gateway-side hints.
|
|
1793
|
-
*
|
|
1794
|
-
* Callers build this via `loadSlackChronologicalMessages` (or the
|
|
1795
|
-
* underlying `assembleSlackChronologicalMessages`) before invoking
|
|
1796
|
-
* this function so the assembly path stays free of direct DB calls
|
|
1797
|
-
* and remains easy to test.
|
|
1798
|
-
*/
|
|
1799
|
-
slackChronologicalMessages?: Message[] | null;
|
|
1800
|
-
/**
|
|
1801
|
-
* Pre-rendered `<active_thread>` focus block listing the messages of
|
|
1802
|
-
* the thread the current inbound user message belongs to.
|
|
1803
|
-
*
|
|
1804
|
-
* Appended (tail-block) to the FINAL user message ONLY when
|
|
1805
|
-
* `channelCapabilities` describes a Slack non-DM channel. The block is
|
|
1806
|
-
* non-persisted: history rebuilds re-derive it from storage on each
|
|
1807
|
-
* turn, and `RUNTIME_INJECTION_PREFIXES` strips any `<active_thread>`
|
|
1808
|
-
* blocks from prior turns so they do not accumulate.
|
|
1809
|
-
*
|
|
1810
|
-
* Callers build this via `loadSlackActiveThreadFocusBlock` (or the
|
|
1811
|
-
* underlying `assembleSlackActiveThreadFocusBlock`). Pass `null` /
|
|
1812
|
-
* `undefined` when the inbound is a top-level (non-thread) post.
|
|
1813
|
-
*/
|
|
1814
|
-
slackActiveThreadFocusBlock?: string | null;
|
|
1815
|
-
mode?: InjectionMode;
|
|
1816
|
-
},
|
|
1950
|
+
options: RuntimeInjectionOptions,
|
|
1817
1951
|
): Promise<RuntimeInjectionResult> {
|
|
1818
1952
|
const mode = options.mode ?? "full";
|
|
1819
|
-
let pkbSystemReminderCaptured: string | undefined;
|
|
1820
|
-
const slackChannel = isSlackChannelConversation(options.channelCapabilities);
|
|
1821
|
-
// Slack DMs and channels both assemble context from persisted message
|
|
1822
|
-
// rows, so suppress hint injection for any Slack conversation. Other
|
|
1823
|
-
// channels (telegram, email, etc.) keep the generic hint pipeline.
|
|
1824
1953
|
const slackConversation = options.channelCapabilities?.channel === "slack";
|
|
1954
|
+
|
|
1955
|
+
// Build the per-injector inputs and attach them to the caller's
|
|
1956
|
+
// TurnContext (without mutating it). When the caller didn't supply one,
|
|
1957
|
+
// synthesize a minimal fallback so the chain still runs — test call sites
|
|
1958
|
+
// that drive injection via `options` without constructing a full context
|
|
1959
|
+
// continue to work.
|
|
1960
|
+
const injectionInputs = buildTurnInjectionInputs(options);
|
|
1961
|
+
const turnCtx: TurnContext = options.turnContext
|
|
1962
|
+
? { ...options.turnContext, injectionInputs }
|
|
1963
|
+
: synthesizeFallbackTurnContext(injectionInputs);
|
|
1964
|
+
|
|
1965
|
+
const chainBlocks = await collectInjectorBlocks(turnCtx);
|
|
1966
|
+
|
|
1967
|
+
// Split the chain output by placement so the downstream assembly can
|
|
1968
|
+
// process each slot with the correct ordering rule.
|
|
1969
|
+
const prepends: InjectionBlock[] = [];
|
|
1970
|
+
const appends: InjectionBlock[] = [];
|
|
1971
|
+
const afterMemory: InjectionBlock[] = [];
|
|
1972
|
+
let replaceBlock: InjectionBlock | null = null;
|
|
1973
|
+
for (const block of chainBlocks) {
|
|
1974
|
+
switch (block.placement ?? "append-user-tail") {
|
|
1975
|
+
case "replace-run-messages":
|
|
1976
|
+
// Later replace-run-messages blocks would overwrite earlier ones;
|
|
1977
|
+
// the default chain only registers one (the Slack transcript).
|
|
1978
|
+
replaceBlock = block;
|
|
1979
|
+
break;
|
|
1980
|
+
case "after-memory-prefix":
|
|
1981
|
+
afterMemory.push(block);
|
|
1982
|
+
break;
|
|
1983
|
+
case "prepend-user-tail":
|
|
1984
|
+
prepends.push(block);
|
|
1985
|
+
break;
|
|
1986
|
+
case "append-user-tail":
|
|
1987
|
+
appends.push(block);
|
|
1988
|
+
break;
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
|
|
1992
|
+
// Track captured text for metadata persistence. Each field corresponds
|
|
1993
|
+
// to a specific default-injector block id so the loop below can pick up
|
|
1994
|
+
// the right capture without re-rendering.
|
|
1995
|
+
//
|
|
1996
|
+
// The capture is gated on the tail actually being a user message — if it
|
|
1997
|
+
// isn't, `applyInjectionBlock` no-ops the block and no content is actually
|
|
1998
|
+
// injected, so the persisted metadata must be undefined.
|
|
1825
1999
|
let turnContextCaptured: string | undefined;
|
|
2000
|
+
let workspaceCaptured: string | undefined;
|
|
2001
|
+
let nowScratchpadCaptured: string | undefined;
|
|
2002
|
+
let pkbContextCaptured: string | undefined;
|
|
2003
|
+
let pkbSystemReminderCaptured: string | undefined;
|
|
2004
|
+
const initialTail = runMessages[runMessages.length - 1];
|
|
2005
|
+
const initialTailIsUser = !!initialTail && initialTail.role === "user";
|
|
2006
|
+
if (initialTailIsUser) {
|
|
2007
|
+
for (const block of chainBlocks) {
|
|
2008
|
+
switch (block.id) {
|
|
2009
|
+
case "unified-turn-context":
|
|
2010
|
+
turnContextCaptured = block.text;
|
|
2011
|
+
break;
|
|
2012
|
+
case "workspace-context":
|
|
2013
|
+
workspaceCaptured = block.text;
|
|
2014
|
+
break;
|
|
2015
|
+
case "now-md":
|
|
2016
|
+
nowScratchpadCaptured = block.text;
|
|
2017
|
+
break;
|
|
2018
|
+
case "pkb-context":
|
|
2019
|
+
pkbContextCaptured = block.text;
|
|
2020
|
+
break;
|
|
2021
|
+
case "pkb-reminder":
|
|
2022
|
+
pkbSystemReminderCaptured = block.text;
|
|
2023
|
+
break;
|
|
2024
|
+
}
|
|
2025
|
+
}
|
|
2026
|
+
}
|
|
2027
|
+
|
|
2028
|
+
// Compose the block text into a single informational string for
|
|
2029
|
+
// `injectorChainBlock` — a composed view of every injector that fired on
|
|
2030
|
+
// the turn, including defaults, so downstream observers see the full set.
|
|
2031
|
+
const injectorChainPieces: string[] = [];
|
|
2032
|
+
for (const block of chainBlocks) {
|
|
2033
|
+
if (block.text.length > 0) injectorChainPieces.push(block.text);
|
|
2034
|
+
}
|
|
2035
|
+
const injectorChainBlock =
|
|
2036
|
+
injectorChainPieces.length > 0
|
|
2037
|
+
? injectorChainPieces.join("\n\n")
|
|
2038
|
+
: undefined;
|
|
2039
|
+
|
|
1826
2040
|
let result = runMessages;
|
|
1827
|
-
|
|
1828
|
-
//
|
|
1829
|
-
|
|
1830
|
-
// for channels and a flat sequence for DMs, so the same branch handles
|
|
1831
|
-
// both. The active-thread focus block below stays gated on `slackChannel`
|
|
1832
|
-
// since DMs do not have threads.
|
|
1833
|
-
if (
|
|
1834
|
-
slackConversation &&
|
|
1835
|
-
options.slackChronologicalMessages &&
|
|
1836
|
-
options.slackChronologicalMessages.length > 0
|
|
1837
|
-
) {
|
|
2041
|
+
|
|
2042
|
+
// ── Step 1: Slack chronological replacement (chain "replace" block) ──
|
|
2043
|
+
if (replaceBlock && replaceBlock.messagesOverride) {
|
|
1838
2044
|
// `graphMemory.prepareMemory` prepends a `<memory __injected>` block
|
|
1839
2045
|
// (and any memory-image groups) to the last user message before
|
|
1840
2046
|
// runtime assembly runs. The Slack transcript is freshly rendered
|
|
1841
2047
|
// from persisted rows and has no such prefix, so swap it in and then
|
|
1842
2048
|
// re-prepend the captured prefix onto the new tail user message.
|
|
1843
2049
|
const carriedMemoryBlocks = extractMemoryPrefixBlocks(runMessages);
|
|
1844
|
-
result =
|
|
2050
|
+
result = replaceBlock.messagesOverride;
|
|
1845
2051
|
if (carriedMemoryBlocks.length > 0) {
|
|
1846
2052
|
const slackTail = result[result.length - 1];
|
|
1847
2053
|
if (slackTail && slackTail.role === "user") {
|
|
@@ -1856,6 +2062,25 @@ export async function applyRuntimeInjections(
|
|
|
1856
2062
|
}
|
|
1857
2063
|
}
|
|
1858
2064
|
|
|
2065
|
+
// ── Step 2: after-memory-prefix chain blocks ──
|
|
2066
|
+
// These splice relative to the memory-prefix count on the tail content,
|
|
2067
|
+
// so they must run BEFORE the hardcoded prepends in step 3. Otherwise
|
|
2068
|
+
// any prepended `<channel_capabilities>` / `<channel_command_context>` /
|
|
2069
|
+
// `<transport_hints>` (none of which are memory-prefix blocks) would
|
|
2070
|
+
// drop the count to 0 and PKB / NOW would splice at the very top of
|
|
2071
|
+
// the tail instead of immediately after memory.
|
|
2072
|
+
//
|
|
2073
|
+
// Ascending `order`: each splice lands at the memory-prefix boundary,
|
|
2074
|
+
// pushing any previously-spliced block one slot further from memory.
|
|
2075
|
+
// So higher-`order` blocks end up closer to the memory prefix.
|
|
2076
|
+
for (const block of afterMemory) {
|
|
2077
|
+
result = applyInjectionBlock(result, block);
|
|
2078
|
+
}
|
|
2079
|
+
|
|
2080
|
+
// ── Step 3: hardcoded branches that stayed outside the injector chain ──
|
|
2081
|
+
// Their order here is load-bearing: each branch may mutate the tail
|
|
2082
|
+
// user message, so reordering changes how they interleave.
|
|
2083
|
+
|
|
1859
2084
|
// For non-interactive conversations (scheduled jobs, work items), instruct the
|
|
1860
2085
|
// model to never ask for clarification — there is no human present to answer.
|
|
1861
2086
|
if (options.isNonInteractive) {
|
|
@@ -1887,117 +2112,6 @@ export async function applyRuntimeInjections(
|
|
|
1887
2112
|
}
|
|
1888
2113
|
}
|
|
1889
2114
|
|
|
1890
|
-
if (mode === "full" && options.pkbContext) {
|
|
1891
|
-
const userTail = result[result.length - 1];
|
|
1892
|
-
if (userTail && userTail.role === "user") {
|
|
1893
|
-
result = [
|
|
1894
|
-
...result.slice(0, -1),
|
|
1895
|
-
injectPkbContext(userTail, options.pkbContext),
|
|
1896
|
-
];
|
|
1897
|
-
}
|
|
1898
|
-
}
|
|
1899
|
-
|
|
1900
|
-
// PKB behavioral nudge — injected on every turn when PKB is active so
|
|
1901
|
-
// the model keeps reading topic files and calling `remember`. When a
|
|
1902
|
-
// query vector is available from the graph memory retriever, run a
|
|
1903
|
-
// hybrid PKB search to surface up to three relevance hints; fall back
|
|
1904
|
-
// to the flat static reminder on empty results or any error.
|
|
1905
|
-
if (mode === "full" && options.pkbActive) {
|
|
1906
|
-
const userTail = result[result.length - 1];
|
|
1907
|
-
if (userTail && userTail.role === "user") {
|
|
1908
|
-
let hints: string[] = [];
|
|
1909
|
-
const queryVector = options.pkbQueryVector;
|
|
1910
|
-
if (
|
|
1911
|
-
queryVector &&
|
|
1912
|
-
queryVector.length > 0 &&
|
|
1913
|
-
options.pkbScopeId &&
|
|
1914
|
-
options.pkbConversation &&
|
|
1915
|
-
options.pkbRoot
|
|
1916
|
-
) {
|
|
1917
|
-
try {
|
|
1918
|
-
const results = await searchPkbFiles(
|
|
1919
|
-
queryVector,
|
|
1920
|
-
options.pkbSparseVector,
|
|
1921
|
-
8,
|
|
1922
|
-
[options.pkbScopeId],
|
|
1923
|
-
);
|
|
1924
|
-
const workingDir = options.pkbWorkingDir ?? options.pkbRoot;
|
|
1925
|
-
const inContext = getInContextPkbPaths(
|
|
1926
|
-
options.pkbConversation,
|
|
1927
|
-
options.pkbAutoInjectList ?? [],
|
|
1928
|
-
options.pkbRoot,
|
|
1929
|
-
workingDir,
|
|
1930
|
-
);
|
|
1931
|
-
const pkbRoot = options.pkbRoot;
|
|
1932
|
-
// Gate on `denseScore` (cosine, [0, 1]) so the quality bar is stable
|
|
1933
|
-
// regardless of whether sparse was provided. Rank by `hybridScore`
|
|
1934
|
-
// (RRF) when available — that captures the sparse signal for
|
|
1935
|
-
// re-ordering eligible hits. hybridScore and denseScore live on
|
|
1936
|
-
// different scales, so items with hybridScore are ordered together
|
|
1937
|
-
// and placed ahead of items that only have denseScore.
|
|
1938
|
-
hints = results
|
|
1939
|
-
.filter((r) => {
|
|
1940
|
-
const abs = resolve(pkbRoot, r.path);
|
|
1941
|
-
if (inContext.has(abs)) return false;
|
|
1942
|
-
const threshold = r.path
|
|
1943
|
-
.replace(/\\/g, "/")
|
|
1944
|
-
.startsWith("archive/")
|
|
1945
|
-
? PKB_HINT_ARCHIVE_THRESHOLD
|
|
1946
|
-
: PKB_HINT_THRESHOLD;
|
|
1947
|
-
return r.denseScore >= threshold;
|
|
1948
|
-
})
|
|
1949
|
-
.sort((a, b) => {
|
|
1950
|
-
const aHasHybrid = a.hybridScore !== undefined;
|
|
1951
|
-
const bHasHybrid = b.hybridScore !== undefined;
|
|
1952
|
-
if (aHasHybrid && !bHasHybrid) return -1;
|
|
1953
|
-
if (!aHasHybrid && bHasHybrid) return 1;
|
|
1954
|
-
if (aHasHybrid && bHasHybrid) {
|
|
1955
|
-
return b.hybridScore! - a.hybridScore!;
|
|
1956
|
-
}
|
|
1957
|
-
return b.denseScore - a.denseScore;
|
|
1958
|
-
})
|
|
1959
|
-
.slice(0, 3)
|
|
1960
|
-
.map((r) => r.path);
|
|
1961
|
-
} catch (err) {
|
|
1962
|
-
pkbReminderLog.warn(
|
|
1963
|
-
{ err: err instanceof Error ? err.message : String(err) },
|
|
1964
|
-
"PKB hint search failed — falling back to flat reminder",
|
|
1965
|
-
);
|
|
1966
|
-
hints = [];
|
|
1967
|
-
}
|
|
1968
|
-
}
|
|
1969
|
-
|
|
1970
|
-
const reminder = buildPkbReminder(hints);
|
|
1971
|
-
pkbSystemReminderCaptured = reminder;
|
|
1972
|
-
// Splice the reminder in right after the memory prefix blocks so it
|
|
1973
|
-
// lands above the user's typed text, producing the tail shape
|
|
1974
|
-
// `[<turn_context>, <memory __injected>, <system_reminder>, ...your_text, ...later_appends]`
|
|
1975
|
-
// after `unifiedTurnContext` later prepends `<turn_context>` at index 0.
|
|
1976
|
-
const memoryPrefixCount = countMemoryPrefixBlocks(userTail.content);
|
|
1977
|
-
result = [
|
|
1978
|
-
...result.slice(0, -1),
|
|
1979
|
-
{
|
|
1980
|
-
...userTail,
|
|
1981
|
-
content: [
|
|
1982
|
-
...userTail.content.slice(0, memoryPrefixCount),
|
|
1983
|
-
{ type: "text" as const, text: reminder },
|
|
1984
|
-
...userTail.content.slice(memoryPrefixCount),
|
|
1985
|
-
],
|
|
1986
|
-
},
|
|
1987
|
-
];
|
|
1988
|
-
}
|
|
1989
|
-
}
|
|
1990
|
-
|
|
1991
|
-
if (mode === "full" && options.nowScratchpad) {
|
|
1992
|
-
const userTail = result[result.length - 1];
|
|
1993
|
-
if (userTail && userTail.role === "user") {
|
|
1994
|
-
result = [
|
|
1995
|
-
...result.slice(0, -1),
|
|
1996
|
-
injectNowScratchpad(userTail, options.nowScratchpad),
|
|
1997
|
-
];
|
|
1998
|
-
}
|
|
1999
|
-
}
|
|
2000
|
-
|
|
2001
2115
|
if (mode === "full" && options.activeSurface) {
|
|
2002
2116
|
const userTail = result[result.length - 1];
|
|
2003
2117
|
if (userTail && userTail.role === "user") {
|
|
@@ -2028,33 +2142,6 @@ export async function applyRuntimeInjections(
|
|
|
2028
2142
|
}
|
|
2029
2143
|
}
|
|
2030
2144
|
|
|
2031
|
-
if (mode === "full" && options.subagentStatusBlock) {
|
|
2032
|
-
const userTail = result[result.length - 1];
|
|
2033
|
-
if (userTail && userTail.role === "user") {
|
|
2034
|
-
result = [
|
|
2035
|
-
...result.slice(0, -1),
|
|
2036
|
-
injectSubagentStatus(userTail, options.subagentStatusBlock),
|
|
2037
|
-
];
|
|
2038
|
-
}
|
|
2039
|
-
}
|
|
2040
|
-
|
|
2041
|
-
if (options.unifiedTurnContext) {
|
|
2042
|
-
const userTail = result[result.length - 1];
|
|
2043
|
-
if (userTail && userTail.role === "user") {
|
|
2044
|
-
turnContextCaptured = options.unifiedTurnContext;
|
|
2045
|
-
result = [
|
|
2046
|
-
...result.slice(0, -1),
|
|
2047
|
-
{
|
|
2048
|
-
...userTail,
|
|
2049
|
-
content: [
|
|
2050
|
-
{ type: "text" as const, text: options.unifiedTurnContext },
|
|
2051
|
-
...userTail.content,
|
|
2052
|
-
],
|
|
2053
|
-
},
|
|
2054
|
-
];
|
|
2055
|
-
}
|
|
2056
|
-
}
|
|
2057
|
-
|
|
2058
2145
|
// Slack conversations (both channels and DMs) build their own
|
|
2059
2146
|
// chronological transcript from persisted messages and intentionally do
|
|
2060
2147
|
// not receive the per-turn `<transport_hints>` block — the rendered
|
|
@@ -2076,50 +2163,18 @@ export async function applyRuntimeInjections(
|
|
|
2076
2163
|
}
|
|
2077
2164
|
}
|
|
2078
2165
|
|
|
2079
|
-
//
|
|
2080
|
-
//
|
|
2081
|
-
//
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
// `RUNTIME_INJECTION_PREFIXES` list so focus blocks never accumulate.
|
|
2085
|
-
if (
|
|
2086
|
-
mode === "full" &&
|
|
2087
|
-
slackChannel &&
|
|
2088
|
-
typeof options.slackActiveThreadFocusBlock === "string" &&
|
|
2089
|
-
options.slackActiveThreadFocusBlock.length > 0
|
|
2090
|
-
) {
|
|
2091
|
-
const userTail = result[result.length - 1];
|
|
2092
|
-
if (userTail && userTail.role === "user") {
|
|
2093
|
-
result = [
|
|
2094
|
-
...result.slice(0, -1),
|
|
2095
|
-
{
|
|
2096
|
-
...userTail,
|
|
2097
|
-
content: [
|
|
2098
|
-
...userTail.content,
|
|
2099
|
-
{
|
|
2100
|
-
type: "text" as const,
|
|
2101
|
-
text: options.slackActiveThreadFocusBlock,
|
|
2102
|
-
},
|
|
2103
|
-
],
|
|
2104
|
-
},
|
|
2105
|
-
];
|
|
2106
|
-
}
|
|
2166
|
+
// ── Step 4: apply remaining chain blocks by placement ──
|
|
2167
|
+
// append-user-tail: ascending `order` so lower-order blocks come first
|
|
2168
|
+
// in the append sequence.
|
|
2169
|
+
for (const block of appends) {
|
|
2170
|
+
result = applyInjectionBlock(result, block);
|
|
2107
2171
|
}
|
|
2108
2172
|
|
|
2109
|
-
//
|
|
2110
|
-
//
|
|
2111
|
-
//
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
if (userTail && userTail.role === "user") {
|
|
2115
|
-
result = [
|
|
2116
|
-
...result.slice(0, -1),
|
|
2117
|
-
injectWorkspaceTopLevelContext(
|
|
2118
|
-
userTail,
|
|
2119
|
-
options.workspaceTopLevelContext,
|
|
2120
|
-
),
|
|
2121
|
-
];
|
|
2122
|
-
}
|
|
2173
|
+
// prepend-user-tail: descending `order` so the lowest-order block lands
|
|
2174
|
+
// topmost in the tail content (each successive prepend pushes the
|
|
2175
|
+
// previous one further down).
|
|
2176
|
+
for (let i = prepends.length - 1; i >= 0; i--) {
|
|
2177
|
+
result = applyInjectionBlock(result, prepends[i]);
|
|
2123
2178
|
}
|
|
2124
2179
|
|
|
2125
2180
|
return {
|
|
@@ -2127,6 +2182,10 @@ export async function applyRuntimeInjections(
|
|
|
2127
2182
|
blocks: {
|
|
2128
2183
|
unifiedTurnContext: turnContextCaptured,
|
|
2129
2184
|
pkbSystemReminder: pkbSystemReminderCaptured,
|
|
2185
|
+
workspaceBlock: workspaceCaptured,
|
|
2186
|
+
nowScratchpadBlock: nowScratchpadCaptured,
|
|
2187
|
+
pkbContextBlock: pkbContextCaptured,
|
|
2188
|
+
injectorChainBlock,
|
|
2130
2189
|
},
|
|
2131
2190
|
};
|
|
2132
2191
|
}
|