@vellumai/assistant 0.8.6 → 0.8.7-dev.202606052118.34cd356
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 +4 -4
- package/Dockerfile +21 -4
- package/bun.lock +13 -4
- package/docker-entrypoint.sh +12 -8
- package/docker-init-apt-root.sh +3 -1
- package/docker-kata-apt-env.sh +3 -1
- package/docker-kata-runtime-family.sh +12 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/plugins.md +110 -83
- package/examples/plugins/echo/README.md +13 -12
- package/examples/plugins/echo/register.ts +0 -54
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +13 -8
- package/openapi.yaml +6964 -539
- package/package.json +8 -4
- package/scripts/generate-openapi.ts +88 -54
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +188 -45
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +7 -5
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +238 -422
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +6 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
- package/src/__tests__/annotate-risk-options.test.ts +2 -3
- package/src/__tests__/anthropic-provider.test.ts +296 -57
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +6 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +8 -3
- package/src/__tests__/assistant-event-hub.test.ts +25 -0
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/assistant-stream-state.test.ts +645 -0
- package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
- package/src/__tests__/btw-routes.test.ts +69 -15
- package/src/__tests__/build-persisted-content.test.ts +184 -0
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +49 -21
- package/src/__tests__/channel-approvals.test.ts +4 -2
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
- package/src/__tests__/channel-retry-sweep.test.ts +71 -79
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +132 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- package/src/__tests__/compaction.benchmark.test.ts +0 -30
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/computer-use-tools.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +34 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +70 -25
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +9 -7
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -34
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +476 -963
- package/src/__tests__/conversation-agent-loop.test.ts +823 -1321
- package/src/__tests__/conversation-analysis-routes.test.ts +7 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-fork-crud.test.ts +86 -172
- package/src/__tests__/conversation-fork-route.test.ts +16 -14
- package/src/__tests__/conversation-history-web-search.test.ts +11 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +10 -7
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +80 -51
- package/src/__tests__/conversation-queue.test.ts +272 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +8 -7
- package/src/__tests__/conversation-runtime-assembly.test.ts +317 -313
- package/src/__tests__/conversation-runtime-workspace.test.ts +114 -36
- package/src/__tests__/conversation-slash-commands.test.ts +8 -42
- package/src/__tests__/conversation-slash-queue.test.ts +42 -31
- package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
- package/src/__tests__/conversation-speed-override.test.ts +8 -22
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +90 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
- package/src/__tests__/conversation-sync-tags.test.ts +27 -15
- package/src/__tests__/conversation-title-service.test.ts +135 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +20 -17
- package/src/__tests__/conversation-workspace-injection.test.ts +114 -23
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +34 -13
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/cross-provider-web-search.test.ts +220 -3
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -0
- package/src/__tests__/disk-pressure-guard.test.ts +66 -0
- package/src/__tests__/disk-pressure-routes.test.ts +9 -2
- package/src/__tests__/dm-persistence.test.ts +12 -3
- package/src/__tests__/dynamic-page-surface.test.ts +99 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-hook.test.ts +304 -0
- package/src/__tests__/feature-flag-test-helpers.ts +2 -2
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-image-service.test.ts +13 -0
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -8
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +3 -1
- package/src/__tests__/helpers/mock-provider.ts +110 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
- package/src/__tests__/history-repair-hook.test.ts +162 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +9 -4
- package/src/__tests__/http-user-message-parity.test.ts +2 -2
- package/src/__tests__/identity-intro-cache.test.ts +47 -114
- package/src/__tests__/identity-routes.test.ts +248 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +12 -3
- package/src/__tests__/injector-background-turn.test.ts +3 -9
- package/src/__tests__/injector-chain.test.ts +139 -275
- package/src/__tests__/injector-disk-pressure.test.ts +75 -41
- package/src/__tests__/injector-document-comments.test.ts +3 -3
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
- package/src/__tests__/injector-v3-suppression.test.ts +214 -0
- package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +55 -15
- package/src/__tests__/list-messages-page-latest.test.ts +60 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +56 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +23 -47
- package/src/__tests__/llm-usage-store.test.ts +268 -1
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
- package/src/__tests__/messaging-send-tool.test.ts +8 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +205 -20
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/oauth-commands-routes.test.ts +1 -1
- package/src/__tests__/onboarding-template-contract.test.ts +12 -0
- package/src/__tests__/openai-image-service.test.ts +17 -0
- package/src/__tests__/openai-provider.test.ts +97 -71
- package/src/__tests__/openai-responses-provider.test.ts +21 -77
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
- package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -286
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persist-unsendable-image.test.ts +215 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +3 -1
- package/src/__tests__/pipeline-runner.test.ts +31 -43
- package/src/__tests__/pkb-autoinject.test.ts +2 -5
- package/src/__tests__/plugin-bootstrap.test.ts +62 -51
- package/src/__tests__/plugin-registry.test.ts +0 -27
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
- package/src/__tests__/plugin-types.test.ts +8 -173
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +17 -16
- package/src/__tests__/process-message-display-content.test.ts +36 -44
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
- package/src/__tests__/relay-server.test.ts +20 -13
- package/src/__tests__/resolve-trust-class.test.ts +4 -4
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +390 -0
- package/src/__tests__/schedule-routes.test.ts +683 -12
- package/src/__tests__/schedule-store.test.ts +108 -0
- package/src/__tests__/schedule-tools.test.ts +160 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/send-endpoint-busy.test.ts +6 -2
- package/src/__tests__/server-history-render.test.ts +314 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +44 -11
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +3 -3
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -3
- package/src/__tests__/subagent-notify-parent.test.ts +1 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +74 -0
- package/src/__tests__/task-scheduler.test.ts +162 -1
- package/src/__tests__/terminal-tools.test.ts +9 -25
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-hook.test.ts +319 -0
- package/src/__tests__/tool-error-hook.test.ts +278 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +481 -16
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
- package/src/__tests__/tool-result-truncation.test.ts +1 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
- package/src/__tests__/ui-work-result-surface.test.ts +159 -0
- package/src/__tests__/usage-routes.test.ts +285 -1
- package/src/__tests__/user-plugin-loader.test.ts +2 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +19 -10
- package/src/__tests__/web-search-backend-failure.test.ts +166 -0
- package/src/acp/__tests__/agent-process.test.ts +161 -0
- package/src/acp/__tests__/client-handler.test.ts +40 -0
- package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +695 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +125 -0
- package/src/acp/auto-install.ts +174 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/feature-gate.test.ts +48 -0
- package/src/acp/feature-gate.ts +34 -0
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/acp/resolve-agent.test.ts +147 -6
- package/src/acp/resolve-agent.ts +81 -7
- package/src/acp/resume-hint.ts +22 -0
- package/src/acp/session-manager.ts +487 -71
- package/src/agent/compaction-circuit.ts +98 -0
- package/src/agent/loop.ts +651 -450
- package/src/api/README.md +19 -17
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +25 -27
- package/src/api/events/assistant-text-delta.ts +6 -8
- package/src/api/events/assistant-thinking-delta.ts +33 -0
- package/src/api/events/assistant-turn-start.ts +5 -7
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +24 -28
- package/src/api/events/document-comment-deleted.ts +6 -8
- package/src/api/events/document-comment-reopened.ts +6 -8
- package/src/api/events/document-comment-resolved.ts +8 -10
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +4 -6
- package/src/api/events/generation-handoff.ts +13 -15
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +10 -12
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +6 -8
- package/src/api/events/question-request.ts +67 -0
- package/src/api/events/relationship-state-updated.ts +4 -6
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-output-chunk.ts +45 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-preview-start.ts +32 -0
- package/src/api/events/tool-use-start.ts +8 -10
- package/src/api/events/trace-event.ts +69 -0
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +389 -0
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/conversation-message.ts +374 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +2 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +7 -10
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +198 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +5 -1
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +13 -27
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/__tests__/notifications.test.ts +58 -14
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +159 -445
- package/src/cli/commands/notifications.ts +112 -60
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +4 -4
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +6 -0
- package/src/config/assistant-feature-flags.ts +24 -13
- package/src/config/bundled-skills/acp/SKILL.md +64 -30
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -387
- package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
- package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
- package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
- package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/SKILL.md +0 -7
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-cache.ts +3 -3
- package/src/config/feature-flag-registry.json +68 -12
- package/src/config/schemas/__tests__/memory-v2.test.ts +2 -226
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +3 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +8 -253
- package/src/config/schemas/memory-v3.ts +47 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills.ts +13 -0
- package/src/context/compactor.ts +55 -32
- package/src/context/strip-injections.ts +128 -0
- package/src/context/token-estimator.ts +42 -0
- package/src/context/tool-result-truncation.ts +1 -66
- package/src/context/window-manager.ts +141 -26
- package/src/credential-execution/executable-discovery.ts +16 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/context-overflow-reducer.ts +0 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +793 -215
- package/src/daemon/conversation-agent-loop.ts +487 -1478
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +27 -10
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +13 -42
- package/src/daemon/conversation-messaging.ts +8 -9
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +109 -93
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +209 -382
- package/src/daemon/conversation-slash.ts +6 -25
- package/src/daemon/conversation-store.ts +15 -95
- package/src/daemon/conversation-surfaces.ts +277 -73
- package/src/daemon/conversation-tool-setup.ts +5 -29
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +123 -146
- package/src/daemon/daemon-skill-host.ts +2 -6
- package/src/daemon/disk-pressure-guard.ts +35 -29
- package/src/daemon/external-plugins-bootstrap.ts +53 -32
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/config-a2a.ts +51 -36
- package/src/daemon/handlers/config-slack-channel.ts +20 -14
- package/src/daemon/handlers/config-telegram.ts +16 -2
- package/src/daemon/handlers/conversations.ts +9 -23
- package/src/daemon/handlers/shared.ts +158 -82
- package/src/daemon/handlers/skills.ts +53 -20
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +53 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/apps.ts +1 -29
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +13 -111
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +4 -17
- package/src/daemon/message-types/integrations.ts +2 -6
- package/src/daemon/message-types/messages.ts +37 -400
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +4 -0
- package/src/daemon/message-types/surfaces.ts +138 -3
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/now-scratchpad.ts +21 -0
- package/src/daemon/orphan-reaper.test.ts +210 -0
- package/src/daemon/orphan-reaper.ts +240 -0
- package/src/daemon/overflow-reduction-loop.ts +230 -0
- package/src/daemon/persist-unsendable-image.ts +117 -0
- package/src/daemon/process-message.ts +50 -49
- package/src/daemon/server.ts +14 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trace-emitter.ts +6 -4
- package/src/daemon/trust-context.ts +32 -0
- package/src/daemon/wake-target-adapter.ts +14 -2
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -1
- package/src/heartbeat/heartbeat-run-store.ts +54 -1
- package/src/heartbeat/heartbeat-service.ts +42 -0
- package/src/home/feed-types.ts +36 -221
- package/src/home/home-greeting-cache.ts +24 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/gateway-client.test.ts +2 -2
- package/src/ipc/gateway-client.ts +3 -3
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +33 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
- package/src/ipc/skill-routes/memory.ts +29 -14
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +13 -61
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/media/gemini-image-service.ts +15 -0
- package/src/media/openai-image-service.ts +14 -0
- package/src/media/types.ts +34 -0
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/auth-fallback-events-store.ts +94 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-crud.ts +39 -8
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/conversation-title-service.ts +65 -41
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +106 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +45 -34
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +36 -1
- package/src/memory/jobs-worker.ts +82 -43
- package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
- package/src/memory/llm-request-log-source-local.ts +0 -11
- package/src/memory/llm-request-log-source.ts +9 -25
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +234 -50
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +1 -83
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
- package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/pkb/autoinject.ts +61 -0
- package/src/memory/pkb/context.ts +50 -0
- package/src/memory/pkb/types.ts +14 -0
- package/src/memory/schedule-attribution-sql.ts +104 -0
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +27 -0
- package/src/memory/usage-grouped-buckets.ts +6 -1
- package/src/memory/v2/__tests__/consolidation-job.test.ts +125 -1
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +99 -10
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/conversation-pairing.ts +8 -13
- package/src/notifications/decision-engine.ts +16 -16
- package/src/notifications/home-feed-side-effect.ts +12 -1
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +46 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +10 -1
- package/src/plugin-api/types.ts +176 -4
- package/src/plugins/defaults/compaction/compact.ts +59 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +24 -0
- package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +23 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +22 -49
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
- package/src/plugins/defaults/{injectors.ts → memory-retrieval/injectors.ts} +295 -112
- package/src/plugins/defaults/memory-v3-shadow/__tests__/assign.test.ts +242 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +118 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/core.test.ts +39 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +36 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +37 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/health.test.ts +219 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +330 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +288 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/needle.test.ts +107 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +436 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/reconcile.test.ts +274 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +61 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/router.test.ts +332 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +179 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selector.test.ts +470 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +432 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/snapshot.test.ts +168 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/tree.test.ts +192 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +54 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +106 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/plugins/defaults/memory-v3-shadow/assign.ts +268 -0
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +124 -0
- package/src/plugins/defaults/memory-v3-shadow/core.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/data/README.md +84 -0
- package/src/plugins/defaults/memory-v3-shadow/data/assignments.json +5 -0
- package/src/plugins/defaults/memory-v3-shadow/data/core.json +1 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-x.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-y.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-b/topic-z.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/health.ts +0 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
- package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +314 -0
- package/src/plugins/defaults/memory-v3-shadow/needle.ts +115 -0
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +126 -0
- package/src/plugins/defaults/memory-v3-shadow/package.json +15 -0
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +34 -0
- package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/reconcile.ts +523 -0
- package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +32 -0
- package/src/plugins/defaults/memory-v3-shadow/router.ts +190 -0
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +84 -0
- package/src/plugins/defaults/memory-v3-shadow/selector.ts +226 -0
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +349 -0
- package/src/plugins/defaults/memory-v3-shadow/snapshot.ts +209 -0
- package/src/plugins/defaults/memory-v3-shadow/tree.ts +174 -0
- package/src/plugins/defaults/memory-v3-shadow/types.ts +59 -0
- package/src/plugins/defaults/memory-v3-shadow/working-set.ts +88 -0
- package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +24 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +132 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +8 -35
- package/src/plugins/registry.ts +8 -25
- package/src/plugins/types.ts +62 -721
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +4 -5
- package/src/proactive-artifact/job.test.ts +28 -21
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/__tests__/system-prompt.test.ts +42 -0
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +7 -3
- package/src/prompts/templates/system-sections.ts +21 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +61 -34
- package/src/providers/call-site-routing.ts +1 -9
- package/src/providers/gemini/client.ts +152 -34
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -2
- package/src/providers/openai/chat-completions-provider.ts +45 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +2 -6
- package/src/providers/placeholder-sentinels.ts +35 -0
- package/src/providers/provider-send-message.ts +6 -6
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/retry.ts +0 -5
- package/src/providers/types.ts +11 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +141 -32
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +95 -23
- package/src/runtime/assistant-event-hub.ts +38 -8
- package/src/runtime/assistant-stream-state.ts +368 -0
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1079
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +4 -15
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +2 -5
- package/src/runtime/channel-retry-sweep.ts +12 -16
- package/src/runtime/http-router.ts +35 -43
- package/src/runtime/http-types.ts +23 -71
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +3 -2
- package/src/runtime/routes/__tests__/acp-routes.test.ts +253 -55
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
- package/src/runtime/routes/__tests__/tts-routes.test.ts +9 -5
- package/src/runtime/routes/acp-routes.test.ts +186 -100
- package/src/runtime/routes/acp-routes.ts +110 -35
- package/src/runtime/routes/app-management-routes.ts +93 -131
- package/src/runtime/routes/app-routes.ts +38 -20
- package/src/runtime/routes/approval-routes.ts +17 -5
- package/src/runtime/routes/attachment-routes.ts +51 -16
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +264 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +13 -3
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +6 -1
- package/src/runtime/routes/browser-tabs-routes.ts +11 -10
- package/src/runtime/routes/btw-routes.ts +34 -24
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +133 -25
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
- package/src/runtime/routes/conversation-list-routes.ts +81 -12
- package/src/runtime/routes/conversation-management-routes.ts +57 -14
- package/src/runtime/routes/conversation-query-routes.ts +90 -41
- package/src/runtime/routes/conversation-routes.ts +446 -204
- package/src/runtime/routes/conversation-starter-routes.ts +35 -20
- package/src/runtime/routes/conversations-import-routes.ts +30 -8
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +25 -10
- package/src/runtime/routes/domain-routes.ts +98 -51
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/epoch-millis-range.ts +34 -0
- package/src/runtime/routes/events-routes.ts +107 -8
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +31 -4
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +21 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +57 -21
- package/src/runtime/routes/home-feed-routes.ts +23 -19
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +6 -1
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +6 -1
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +28 -40
- package/src/runtime/routes/identity-routes.ts +236 -20
- package/src/runtime/routes/image-generation-routes.ts +45 -2
- package/src/runtime/routes/inbound-message-handler.ts +16 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +32 -7
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
- package/src/runtime/routes/integrations/slack/channel.ts +23 -3
- package/src/runtime/routes/integrations/slack/share.ts +36 -8
- package/src/runtime/routes/integrations/telegram.ts +34 -9
- package/src/runtime/routes/integrations/twilio.ts +77 -7
- package/src/runtime/routes/integrations/vercel.ts +3 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +36 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +105 -44
- package/src/runtime/routes/memory-v3-routes.ts +306 -408
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +29 -0
- package/src/runtime/routes/notification-routes.ts +17 -1
- package/src/runtime/routes/oauth-apps.ts +99 -23
- package/src/runtime/routes/oauth-commands-routes.ts +37 -14
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +79 -15
- package/src/runtime/routes/platform-routes.ts +102 -5
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +9 -6
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +2 -2
- package/src/runtime/routes/playground/helpers.ts +1 -2
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +10 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +288 -88
- package/src/runtime/routes/secret-routes.ts +31 -6
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +166 -73
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +9 -0
- package/src/runtime/routes/surface-content-routes.ts +10 -2
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
- package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +31 -2
- package/src/runtime/routes/tts-routes.ts +48 -6
- package/src/runtime/routes/types.ts +83 -16
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +118 -42
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +50 -2
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +49 -23
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +124 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +8 -4
- package/src/runtime/services/analyze-conversation.ts +5 -8
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/sync/resource-sync-events.ts +16 -2
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +28 -1
- package/src/schedule/schedule-usage-store.ts +83 -0
- package/src/schedule/scheduler.ts +15 -6
- package/src/signals/cancel.ts +2 -4
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/catalog-install.ts +3 -0
- package/src/skills/categories-cache.ts +118 -0
- package/src/skills/clawhub-files.ts +1 -0
- package/src/skills/skillssh-files.ts +1 -0
- package/src/subagent/manager.ts +20 -11
- package/src/telemetry/types.ts +55 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +250 -4
- package/src/telemetry/usage-telemetry-reporter.ts +88 -2
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +7 -1
- package/src/tools/acp/spawn.test.ts +198 -93
- package/src/tools/acp/spawn.ts +32 -70
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/definitions.ts +8 -4
- package/src/tools/apps/executors.ts +13 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/computer-use/definitions.ts +28 -24
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/execution-target.ts +1 -1
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/executor.ts +1 -53
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +69 -32
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
- package/src/tools/network/__tests__/web-search.test.ts +11 -3
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search-error.test.ts +248 -0
- package/src/tools/network/web-search-error.ts +267 -0
- package/src/tools/network/web-search.ts +223 -61
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +13 -0
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/safe-env.ts +10 -1
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/types.ts +74 -23
- package/src/tools/ui-surface/definitions.ts +99 -10
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
- package/src/tts/provider-catalog.ts +76 -1
- package/src/usage/types.ts +10 -0
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/mutex.ts +47 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/git-service.ts +1 -42
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
- package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +117 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +12 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
- package/src/__tests__/compaction-pipeline.test.ts +0 -210
- package/src/__tests__/compaction-timeout-recovery.test.ts +0 -262
- package/src/__tests__/empty-response-pipeline.test.ts +0 -301
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/__tests__/llm-call-pipeline.test.ts +0 -281
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
- package/src/__tests__/persistence-pipeline.test.ts +0 -514
- package/src/__tests__/title-generate-pipeline.test.ts +0 -211
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -481
- package/src/__tests__/tool-error-pipeline.test.ts +0 -241
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -344
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -491
- package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/gallery/default-gallery.ts +0 -1359
- package/src/gallery/gallery-manifest.ts +0 -28
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -706
- package/src/memory/v3/__tests__/filter.test.ts +0 -560
- package/src/memory/v3/__tests__/gate.test.ts +0 -637
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
- package/src/memory/v3/__tests__/loop.test.ts +0 -775
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -489
- package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -508
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
- package/src/memory/v3/__tests__/validate.test.ts +0 -277
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/coretrieval-seed.ts +0 -240
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -286
- package/src/memory/v3/filter.ts +0 -286
- package/src/memory/v3/gate.ts +0 -349
- package/src/memory/v3/index-composition.ts +0 -126
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -430
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -431
- package/src/memory/v3/shadow-diff.ts +0 -287
- package/src/memory/v3/shadow-middleware.ts +0 -347
- package/src/memory/v3/traversal.ts +0 -211
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -356
- package/src/memory/v3/types.ts +0 -65
- package/src/memory/v3/validate.ts +0 -323
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/llm-call.ts +0 -77
- package/src/plugins/defaults/memory-retrieval.ts +0 -219
- package/src/plugins/defaults/overflow-reduce.ts +0 -185
- package/src/plugins/defaults/persistence.ts +0 -146
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-execute.ts +0 -87
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
- package/src/skills/category-inference.ts +0 -111
|
@@ -5,13 +5,21 @@
|
|
|
5
5
|
* before it is sent to the provider. They are pure (no side effects).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
import { join
|
|
8
|
+
import { statSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
10
|
|
|
11
11
|
import { type ChannelId, parseInterfaceId } from "../channels/types.js";
|
|
12
|
+
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
12
13
|
import { getConfig } from "../config/loader.js";
|
|
14
|
+
import { stripUserTextBlocksByPrefix } from "../context/strip-injections.js";
|
|
13
15
|
import { createContextSummaryMessage } from "../context/window-manager.js";
|
|
14
|
-
import {
|
|
16
|
+
import { getDocumentsForConversation } from "../documents/document-store.js";
|
|
17
|
+
import {
|
|
18
|
+
getApp,
|
|
19
|
+
getAppDirPath,
|
|
20
|
+
listAppFiles,
|
|
21
|
+
resolveAppDir,
|
|
22
|
+
} from "../memory/app-store.js";
|
|
15
23
|
import {
|
|
16
24
|
getMessages as defaultGetMessages,
|
|
17
25
|
type MessageRow,
|
|
@@ -19,8 +27,8 @@ import {
|
|
|
19
27
|
import {
|
|
20
28
|
countMemoryPrefixBlocks,
|
|
21
29
|
extractMemoryPrefixBlocks,
|
|
30
|
+
stripAllMemoryInjections,
|
|
22
31
|
} from "../memory/graph/conversation-graph-memory.js";
|
|
23
|
-
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
24
32
|
import {
|
|
25
33
|
readSlackMetadata,
|
|
26
34
|
readSlackMetadataFromMessageMetadata,
|
|
@@ -33,9 +41,9 @@ import {
|
|
|
33
41
|
type RenderedSlackTranscriptMessage,
|
|
34
42
|
renderSlackTranscriptWithProvenance,
|
|
35
43
|
} from "../messaging/providers/slack/render-transcript.js";
|
|
36
|
-
import {
|
|
44
|
+
import { getInjectorChain } from "../plugins/defaults/memory-retrieval/injector-chain.js";
|
|
45
|
+
import { MEMORY_V3_BLOCK_ID } from "../plugins/defaults/memory-v3-shadow/types.js";
|
|
37
46
|
import type {
|
|
38
|
-
DiskPressureInjectionContext,
|
|
39
47
|
InjectionBlock,
|
|
40
48
|
InjectionPlacement,
|
|
41
49
|
TurnContext,
|
|
@@ -51,12 +59,19 @@ import { channelStatusToMemberStatus } from "../runtime/routes/inbound-stages/ac
|
|
|
51
59
|
import type { SubagentState } from "../subagent/types.js";
|
|
52
60
|
import { TERMINAL_STATUSES } from "../subagent/types.js";
|
|
53
61
|
import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
|
|
54
|
-
import {
|
|
55
|
-
import {
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
import { findConversationOrSubagent } from "./conversation-registry.js";
|
|
63
|
+
import type {
|
|
64
|
+
DynamicPageSurfaceData,
|
|
65
|
+
SurfaceData,
|
|
66
|
+
SurfaceType,
|
|
67
|
+
} from "./message-protocol.js";
|
|
68
|
+
import { filterMessagesForUntrustedActor } from "./message-provenance.js";
|
|
58
69
|
import type { TrustContext } from "./trust-context.js";
|
|
59
70
|
|
|
71
|
+
// The compaction strip lives in the compaction layer (`context/`) so the agent
|
|
72
|
+
// loop can own it; re-exported here for this module's existing consumers.
|
|
73
|
+
export { stripInjectionsForCompaction } from "../context/strip-injections.js";
|
|
74
|
+
|
|
60
75
|
/**
|
|
61
76
|
* Describes the capabilities of the channel through which the user is
|
|
62
77
|
* interacting. Used to gate UI-specific references and permission asks.
|
|
@@ -255,8 +270,8 @@ export function isGroupChatType(chatType?: string): boolean {
|
|
|
255
270
|
}
|
|
256
271
|
}
|
|
257
272
|
|
|
258
|
-
/** Context about the active workspace surface,
|
|
259
|
-
|
|
273
|
+
/** Context about the active workspace surface, rendered into the `<active_workspace>` block. */
|
|
274
|
+
interface ActiveSurfaceContext {
|
|
260
275
|
surfaceId: string;
|
|
261
276
|
html: string;
|
|
262
277
|
/** When set, the surface is backed by a persisted app. */
|
|
@@ -269,8 +284,72 @@ export interface ActiveSurfaceContext {
|
|
|
269
284
|
appPages?: Record<string, string>;
|
|
270
285
|
/** The page currently displayed in the WebView (e.g. "settings.html"). */
|
|
271
286
|
currentPage?: string;
|
|
272
|
-
|
|
273
|
-
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Resolve the conversation's active workspace surface into the context block
|
|
291
|
+
* consumed by {@link applyRuntimeInjections}, or `null` when no dynamic-page
|
|
292
|
+
* surface is active. App-backed surfaces are enriched with their persisted app
|
|
293
|
+
* metadata; the file tree is listed on demand by the injector.
|
|
294
|
+
*/
|
|
295
|
+
export function buildActiveSurfaceContext(params: {
|
|
296
|
+
currentActiveSurfaceId: string | undefined;
|
|
297
|
+
currentPage: string | undefined;
|
|
298
|
+
surfaceState: ReadonlyMap<
|
|
299
|
+
string,
|
|
300
|
+
{ surfaceType: SurfaceType; data: SurfaceData }
|
|
301
|
+
>;
|
|
302
|
+
}): ActiveSurfaceContext | null {
|
|
303
|
+
const { currentActiveSurfaceId, currentPage, surfaceState } = params;
|
|
304
|
+
if (!currentActiveSurfaceId) return null;
|
|
305
|
+
|
|
306
|
+
const stored = surfaceState.get(currentActiveSurfaceId);
|
|
307
|
+
if (!stored || stored.surfaceType !== "dynamic_page") return null;
|
|
308
|
+
|
|
309
|
+
const data = stored.data as DynamicPageSurfaceData;
|
|
310
|
+
const activeSurface: ActiveSurfaceContext = {
|
|
311
|
+
surfaceId: currentActiveSurfaceId,
|
|
312
|
+
html: data.html,
|
|
313
|
+
currentPage,
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
if (data.appId) {
|
|
317
|
+
const app = getApp(data.appId);
|
|
318
|
+
if (app) {
|
|
319
|
+
activeSurface.appId = app.id;
|
|
320
|
+
activeSurface.appName = app.name;
|
|
321
|
+
activeSurface.appDirName = resolveAppDir(app.id).dirName;
|
|
322
|
+
activeSurface.appSchemaJson = app.schemaJson;
|
|
323
|
+
if (app.pages && Object.keys(app.pages).length > 0) {
|
|
324
|
+
activeSurface.appPages = app.pages;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return activeSurface;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Lists the conversation's active documents as the lightweight summaries the
|
|
334
|
+
* `active-documents` injector surfaces to the assistant — letting it target
|
|
335
|
+
* existing documents with `document_update` instead of issuing duplicate
|
|
336
|
+
* `document_create` calls. Returns `null` when the conversation has none.
|
|
337
|
+
*/
|
|
338
|
+
export function buildActiveDocuments(conversationId: string): Array<{
|
|
339
|
+
surfaceId: string;
|
|
340
|
+
title: string;
|
|
341
|
+
wordCount: number;
|
|
342
|
+
updatedAt: number;
|
|
343
|
+
}> | null {
|
|
344
|
+
const conversationDocs = getDocumentsForConversation(conversationId);
|
|
345
|
+
return conversationDocs.length > 0
|
|
346
|
+
? conversationDocs.map((d) => ({
|
|
347
|
+
surfaceId: d.surfaceId,
|
|
348
|
+
title: d.title,
|
|
349
|
+
wordCount: d.wordCount,
|
|
350
|
+
updatedAt: d.updatedAt,
|
|
351
|
+
}))
|
|
352
|
+
: null;
|
|
274
353
|
}
|
|
275
354
|
|
|
276
355
|
const MAX_CONTEXT_LENGTH = 100_000;
|
|
@@ -299,7 +378,7 @@ function injectActiveSurfaceContext(
|
|
|
299
378
|
lines.push(
|
|
300
379
|
`The user is viewing app "${ctx.appName ?? "Untitled"}" (app_id: "${ctx.appId}", slug: "${slug}") in workspace mode.`,
|
|
301
380
|
"",
|
|
302
|
-
'PREREQUISITE: If `app_refresh` is not yet available, call `skill_load` with `
|
|
381
|
+
'PREREQUISITE: If `app_refresh` is not yet available, call `skill_load` with `skill: "app-builder"` first to load it.',
|
|
303
382
|
"",
|
|
304
383
|
"RULES FOR WORKSPACE MODIFICATION:",
|
|
305
384
|
`1. Use \`file_edit\` to make surgical changes to app files. The file path is \`${getAppDirPath(ctx.appId)}/<path>\`.`,
|
|
@@ -313,7 +392,7 @@ function injectActiveSurfaceContext(
|
|
|
313
392
|
);
|
|
314
393
|
|
|
315
394
|
// File tree with sizes (capped at 50 files to bound prompt size)
|
|
316
|
-
const files =
|
|
395
|
+
const files = listAppFiles(ctx.appId);
|
|
317
396
|
const MAX_FILE_TREE_ENTRIES = 50;
|
|
318
397
|
const displayFiles = files.slice(0, MAX_FILE_TREE_ENTRIES);
|
|
319
398
|
lines.push("", "App files:");
|
|
@@ -488,7 +567,7 @@ export function buildSubagentStatusBlock(
|
|
|
488
567
|
}
|
|
489
568
|
|
|
490
569
|
// The `<active_subagents>` block is emitted by the `subagent-status` default
|
|
491
|
-
// injector (`plugins/defaults/injectors.ts`) as an `append-user-tail`
|
|
570
|
+
// injector (`plugins/defaults/memory-retrieval/injectors.ts`) as an `append-user-tail`
|
|
492
571
|
// placement. Use {@link applyRuntimeInjections} with
|
|
493
572
|
// `options.subagentStatusBlock` set, or drive the injector chain directly
|
|
494
573
|
// via `collectInjectorBlocks`.
|
|
@@ -512,30 +591,7 @@ function injectVoiceCallControlContext(
|
|
|
512
591
|
// NOW.md scratchpad injection
|
|
513
592
|
// ---------------------------------------------------------------------------
|
|
514
593
|
|
|
515
|
-
/**
|
|
516
|
-
* Read the NOW.md scratchpad from the workspace prompt directory.
|
|
517
|
-
*
|
|
518
|
-
* Returns the trimmed content with `_`-prefixed comment lines stripped,
|
|
519
|
-
* or `null` if the file is missing, empty, or unreadable.
|
|
520
|
-
*/
|
|
521
|
-
export function readNowScratchpad(): string | null {
|
|
522
|
-
const nowPath = getWorkspacePromptPath("NOW.md");
|
|
523
|
-
if (!existsSync(nowPath)) return null;
|
|
524
|
-
try {
|
|
525
|
-
const stripped = stripCommentLines(readFileSync(nowPath, "utf-8")).trim();
|
|
526
|
-
return stripped.length > 0 ? stripped : null;
|
|
527
|
-
} catch {
|
|
528
|
-
return null;
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
/**
|
|
533
|
-
* The `<NOW.md>` block is emitted by the `now-md` default injector
|
|
534
|
-
* (`plugins/defaults/injectors.ts`) as an `after-memory-prefix` placement.
|
|
535
|
-
* Use {@link applyRuntimeInjections} with `options.nowScratchpad` set.
|
|
536
|
-
*/
|
|
537
|
-
|
|
538
|
-
/** Strip `<NOW.md>` blocks injected by `injectNowScratchpad`. */
|
|
594
|
+
/** Strip `<NOW.md>` blocks injected by the `now-md` default injector. */
|
|
539
595
|
export function stripNowScratchpad(messages: Message[]): Message[] {
|
|
540
596
|
return stripUserTextBlocksByPrefix(messages, [
|
|
541
597
|
// Shared prefix catches both the current tag and any pre-line-limit
|
|
@@ -545,102 +601,6 @@ export function stripNowScratchpad(messages: Message[]): Message[] {
|
|
|
545
601
|
]);
|
|
546
602
|
}
|
|
547
603
|
|
|
548
|
-
// ---------------------------------------------------------------------------
|
|
549
|
-
// PKB (Personal Knowledge Base) injection
|
|
550
|
-
// ---------------------------------------------------------------------------
|
|
551
|
-
|
|
552
|
-
const PKB_DEFAULT_FILES = [
|
|
553
|
-
"INDEX.md",
|
|
554
|
-
"essentials.md",
|
|
555
|
-
"threads.md",
|
|
556
|
-
"buffer.md",
|
|
557
|
-
];
|
|
558
|
-
|
|
559
|
-
const AUTOINJECT_FILENAME = "_autoinject.md";
|
|
560
|
-
|
|
561
|
-
/** Max buffer.md lines injected into prompts — keeps context bounded even when filing is off. */
|
|
562
|
-
const MAX_BUFFER_LINES = 50;
|
|
563
|
-
|
|
564
|
-
/**
|
|
565
|
-
* Read `_autoinject.md` from the PKB directory and return the list of
|
|
566
|
-
* filenames to inject.
|
|
567
|
-
*
|
|
568
|
-
* - Returns `null` when the file is missing or unreadable — callers
|
|
569
|
-
* should fall back to the hardcoded defaults.
|
|
570
|
-
* - Returns `[]` when the file exists but has no entries (empty or
|
|
571
|
-
* comments only) — an explicit opt-out meaning "inject nothing."
|
|
572
|
-
*/
|
|
573
|
-
export function readAutoinjectList(pkbDir: string): string[] | null {
|
|
574
|
-
const filePath = join(pkbDir, AUTOINJECT_FILENAME);
|
|
575
|
-
if (!existsSync(filePath)) return null;
|
|
576
|
-
try {
|
|
577
|
-
const raw = stripCommentLines(readFileSync(filePath, "utf-8"));
|
|
578
|
-
const files = raw
|
|
579
|
-
.split("\n")
|
|
580
|
-
.map((l) => l.trim())
|
|
581
|
-
.filter((l) => l.length > 0);
|
|
582
|
-
return files.length > 0 ? files : [];
|
|
583
|
-
} catch {
|
|
584
|
-
return null;
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
/**
|
|
589
|
-
* Resolve the effective list of auto-inject filenames for a PKB directory.
|
|
590
|
-
*
|
|
591
|
-
* This is the single source of truth used both by `readPkbContext` (which
|
|
592
|
-
* actually injects the files) and by the PKB reminder-hint tracker in
|
|
593
|
-
* `conversation-agent-loop.ts` (which needs to know what's already in
|
|
594
|
-
* context so it doesn't redundantly recommend those files).
|
|
595
|
-
*
|
|
596
|
-
* Returns `PKB_DEFAULT_FILES` when `_autoinject.md` is missing/unreadable,
|
|
597
|
-
* or the parsed list (possibly empty) when it is present.
|
|
598
|
-
*/
|
|
599
|
-
export function getPkbAutoInjectList(pkbRoot: string): string[] {
|
|
600
|
-
return readAutoinjectList(pkbRoot) ?? PKB_DEFAULT_FILES;
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
/**
|
|
604
|
-
* Read the always-loaded PKB files and append a nudge encouraging the
|
|
605
|
-
* assistant to proactively read topic files and use `remember` aggressively.
|
|
606
|
-
*
|
|
607
|
-
* Which files are loaded is determined by `pkb/_autoinject.md` (one filename
|
|
608
|
-
* per line). Falls back to the built-in defaults when that file is absent.
|
|
609
|
-
*
|
|
610
|
-
* Returns the concatenated content ready for injection, or `null` if all
|
|
611
|
-
* files are missing or empty.
|
|
612
|
-
*/
|
|
613
|
-
export function readPkbContext(): string | null {
|
|
614
|
-
const pkbDir = join(getWorkspaceDir(), "pkb");
|
|
615
|
-
if (!existsSync(pkbDir)) return null;
|
|
616
|
-
|
|
617
|
-
const filesToInject = getPkbAutoInjectList(pkbDir);
|
|
618
|
-
|
|
619
|
-
const parts: string[] = [];
|
|
620
|
-
for (const file of filesToInject) {
|
|
621
|
-
// Path traversal guard: reject entries that escape the pkb directory
|
|
622
|
-
const filePath = resolve(pkbDir, file);
|
|
623
|
-
if (!filePath.startsWith(pkbDir + "/")) continue;
|
|
624
|
-
|
|
625
|
-
if (!existsSync(filePath)) continue;
|
|
626
|
-
try {
|
|
627
|
-
let content = stripCommentLines(readFileSync(filePath, "utf-8")).trim();
|
|
628
|
-
if (file === "buffer.md" && content.length > 0) {
|
|
629
|
-
// Cap buffer entries to prevent unbounded growth when filing is disabled
|
|
630
|
-
const lines = content.split("\n");
|
|
631
|
-
if (lines.length > MAX_BUFFER_LINES) {
|
|
632
|
-
content = lines.slice(-MAX_BUFFER_LINES).join("\n");
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
if (content.length > 0) parts.push(content);
|
|
636
|
-
} catch {
|
|
637
|
-
// Skip unreadable files
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
return parts.length > 0 ? parts.join("\n\n") : null;
|
|
642
|
-
}
|
|
643
|
-
|
|
644
604
|
/**
|
|
645
605
|
* Prepend channel capability context to the last user message so the
|
|
646
606
|
* model knows what the current channel can and cannot do.
|
|
@@ -992,53 +952,6 @@ export function buildUnifiedTurnContextBlock(
|
|
|
992
952
|
return lines.join("\n");
|
|
993
953
|
}
|
|
994
954
|
|
|
995
|
-
// ---------------------------------------------------------------------------
|
|
996
|
-
// Prefix-based stripping primitive
|
|
997
|
-
// ---------------------------------------------------------------------------
|
|
998
|
-
|
|
999
|
-
/**
|
|
1000
|
-
* A matcher for an injected text block. A plain string matches by prefix
|
|
1001
|
-
* (`startsWith`). A `{ prefix, suffix }` wrapper requires BOTH the opening
|
|
1002
|
-
* prefix and the closing suffix, so user-authored content that merely begins
|
|
1003
|
-
* with an injection-like opening tag (e.g. a message discussing `<info>`
|
|
1004
|
-
* markup) is not mistaken for an injected block and dropped. This mirrors
|
|
1005
|
-
* `countMemoryPrefixBlocks`, which only treats `<memory>…</memory>` /
|
|
1006
|
-
* `<info>…</info>` blocks as injected when the full wrapper is present.
|
|
1007
|
-
*/
|
|
1008
|
-
type InjectionMatcher = string | { prefix: string; suffix: string };
|
|
1009
|
-
|
|
1010
|
-
/**
|
|
1011
|
-
* Remove text blocks from user messages that match any of the given matchers.
|
|
1012
|
-
* If stripping removes all content blocks from a message, the message itself
|
|
1013
|
-
* is dropped.
|
|
1014
|
-
*
|
|
1015
|
-
* This is the shared primitive behind the individual strip* functions and
|
|
1016
|
-
* the `stripInjectionsForCompaction` pipeline.
|
|
1017
|
-
*/
|
|
1018
|
-
function stripUserTextBlocksByPrefix(
|
|
1019
|
-
messages: Message[],
|
|
1020
|
-
matchers: InjectionMatcher[],
|
|
1021
|
-
): Message[] {
|
|
1022
|
-
return messages
|
|
1023
|
-
.map((message) => {
|
|
1024
|
-
if (message.role !== "user") return message;
|
|
1025
|
-
const nextContent = message.content.filter((block) => {
|
|
1026
|
-
if (block.type !== "text") return true;
|
|
1027
|
-
return !matchers.some((m) =>
|
|
1028
|
-
typeof m === "string"
|
|
1029
|
-
? block.text.startsWith(m)
|
|
1030
|
-
: block.text.startsWith(m.prefix) && block.text.endsWith(m.suffix),
|
|
1031
|
-
);
|
|
1032
|
-
});
|
|
1033
|
-
if (nextContent.length === message.content.length) return message;
|
|
1034
|
-
if (nextContent.length === 0) return null;
|
|
1035
|
-
return { ...message, content: nextContent };
|
|
1036
|
-
})
|
|
1037
|
-
.filter(
|
|
1038
|
-
(message): message is NonNullable<typeof message> => message != null,
|
|
1039
|
-
);
|
|
1040
|
-
}
|
|
1041
|
-
|
|
1042
955
|
// ---------------------------------------------------------------------------
|
|
1043
956
|
// Individual strip functions (thin wrappers around the primitive)
|
|
1044
957
|
// ---------------------------------------------------------------------------
|
|
@@ -1647,10 +1560,9 @@ function buildActiveThreadBlockFromRenderable(
|
|
|
1647
1560
|
|
|
1648
1561
|
if (members.length === 0) return null;
|
|
1649
1562
|
|
|
1650
|
-
// The active-thread block is flattened to plain text below
|
|
1651
|
-
//
|
|
1652
|
-
// the
|
|
1653
|
-
// bracket-tagged by the renderer and must not receive another prefix.
|
|
1563
|
+
// The active-thread block is flattened to plain text below. User rows keep
|
|
1564
|
+
// explicit Slack attribution through the renderer; assistant rows pass
|
|
1565
|
+
// through unchanged so the model does not learn a synthetic reply prefix.
|
|
1654
1566
|
// Unnamed user rows (no real Slack displayName) get a `@user` senderLabel
|
|
1655
1567
|
// here so their tag line carries attribution through the renderer. Labeled
|
|
1656
1568
|
// user rows and assistant rows pass through unchanged.
|
|
@@ -1662,18 +1574,8 @@ function buildActiveThreadBlockFromRenderable(
|
|
|
1662
1574
|
|
|
1663
1575
|
const rendered = renderSlackTranscriptWithProvenance(labeledMembers);
|
|
1664
1576
|
if (rendered.renderedMessages.length === 0) return null;
|
|
1665
|
-
// Reaction / overflow-trailer lines are renderer-owned Slack event lines,
|
|
1666
|
-
// and timezone-aware assistant rows already carry metadata-backed compact
|
|
1667
|
-
// attribution. Regular assistant content and the `[deleted]` sentinel get
|
|
1668
|
-
// the prefix so attribution survives flattening.
|
|
1669
1577
|
const lines = rendered.renderedMessages
|
|
1670
|
-
.map((entry) =>
|
|
1671
|
-
const text = extractTagLineTexts([entry.message])[0] ?? "";
|
|
1672
|
-
return entry.message.role === "assistant" &&
|
|
1673
|
-
entry.tagLineProvenance === "none"
|
|
1674
|
-
? `@assistant: ${text}`
|
|
1675
|
-
: text;
|
|
1676
|
-
})
|
|
1578
|
+
.map((entry) => extractTagLineTexts([entry.message])[0] ?? "")
|
|
1677
1579
|
.join("\n");
|
|
1678
1580
|
return `<active_thread>\n${lines}\n</active_thread>`;
|
|
1679
1581
|
}
|
|
@@ -1735,98 +1637,6 @@ export function loadSlackActiveThreadFocusBlock(
|
|
|
1735
1637
|
return assembleSlackActiveThreadFocusBlock(rows, capabilities);
|
|
1736
1638
|
}
|
|
1737
1639
|
|
|
1738
|
-
/** Matchers stripped by the pipeline (order doesn't matter — single pass). */
|
|
1739
|
-
const RUNTIME_INJECTION_PREFIXES: InjectionMatcher[] = [
|
|
1740
|
-
"<channel_capabilities>",
|
|
1741
|
-
"<channel_command_context>",
|
|
1742
|
-
"<disk_pressure_warning>",
|
|
1743
|
-
"<channel_turn_context>", // backward-compat: strip legacy separate channel blocks
|
|
1744
|
-
"<guardian_context>",
|
|
1745
|
-
"<inbound_actor_context>", // backward-compat: strip legacy separate actor blocks
|
|
1746
|
-
"<interface_turn_context>", // backward-compat: strip legacy separate interface blocks
|
|
1747
|
-
// NOTE: <turn_context> is intentionally NOT stripped — unified turn context
|
|
1748
|
-
// blocks persist in history so the assistant retains temporal/actor grounding.
|
|
1749
|
-
"<background_turn>",
|
|
1750
|
-
"<memory_context __injected>",
|
|
1751
|
-
"<memory_context>", // backward-compat: strip legacy blocks from pre-__injected history
|
|
1752
|
-
// The static `memory-v2-static` block (`<info>\n…</info>`) and the
|
|
1753
|
-
// dynamic activation block (`<memory>\n…</memory>`, plus legacy
|
|
1754
|
-
// `<memory __injected>…`) are both stripped so each compaction
|
|
1755
|
-
// re-injects the freshest essentials/threads/recent/buffer view and
|
|
1756
|
-
// re-runs the activation pipeline, matching the `<knowledge_base>`
|
|
1757
|
-
// cadence. The activation pipeline dedupes via `everInjected`, and
|
|
1758
|
-
// compaction handles aggregate growth, so accumulation does not cause
|
|
1759
|
-
// unbounded context growth. Both wrappers may appear in persisted rows.
|
|
1760
|
-
//
|
|
1761
|
-
// These two use the full `{ prefix, suffix }` wrapper shape (not a bare
|
|
1762
|
-
// prefix) so that user-authored text merely starting with `<memory>\n` or
|
|
1763
|
-
// `<info>\n` is never silently dropped during compaction/`/clean`. This
|
|
1764
|
-
// matches the full-wrapper requirement in `countMemoryPrefixBlocks`.
|
|
1765
|
-
{ prefix: "<memory>\n", suffix: "\n</memory>" },
|
|
1766
|
-
{ prefix: "<info>\n", suffix: "\n</info>" },
|
|
1767
|
-
"<voice_call_control>",
|
|
1768
|
-
"<workspace_top_level>", // backward-compat: strip legacy workspace blocks
|
|
1769
|
-
// NOTE: <workspace> is intentionally NOT stripped — workspace context
|
|
1770
|
-
// persists in history so the assistant retains workspace grounding.
|
|
1771
|
-
"<temporal_context>\nToday:", // backward-compat: strip legacy temporal blocks
|
|
1772
|
-
"<active_subagents>",
|
|
1773
|
-
"<active_workspace>",
|
|
1774
|
-
"<active_dynamic_page>",
|
|
1775
|
-
"<non_interactive_context>",
|
|
1776
|
-
// Shared prefix catches both the current NOW.md tag and any pre-line-limit
|
|
1777
|
-
// variant that may linger in in-flight histories during a rolling deploy.
|
|
1778
|
-
"<NOW.md Always keep this up to date",
|
|
1779
|
-
"<now_scratchpad>", // backward-compat: strip legacy blocks from pre-rename history
|
|
1780
|
-
"<knowledge_base>",
|
|
1781
|
-
"<pkb>", // backward-compat: strip legacy tag from pre-rename history
|
|
1782
|
-
"<system_reminder>",
|
|
1783
|
-
"<transport_hints>",
|
|
1784
|
-
// The Slack active-thread focus block is non-persisted and injected on
|
|
1785
|
-
// the FINAL user turn only. Strip it here so re-assembly during compaction
|
|
1786
|
-
// and overflow recovery does not duplicate it across turns.
|
|
1787
|
-
"<active_thread>",
|
|
1788
|
-
"<system_notice>One or more tool calls returned an error.",
|
|
1789
|
-
];
|
|
1790
|
-
|
|
1791
|
-
/**
|
|
1792
|
-
* Strip all runtime-injected context from message history in a single pass.
|
|
1793
|
-
*
|
|
1794
|
-
* Used only during compaction and overflow recovery — not on normal turns.
|
|
1795
|
-
* Runtime injections persist in history to keep the conversation prefix
|
|
1796
|
-
* stable for Anthropic's prefix caching. Stripping is only needed when
|
|
1797
|
-
* compaction rewrites the message array (cache miss is expected anyway).
|
|
1798
|
-
*/
|
|
1799
|
-
export function stripInjectionsForCompaction(messages: Message[]): Message[] {
|
|
1800
|
-
return stripUserTextBlocksByPrefix(messages, RUNTIME_INJECTION_PREFIXES);
|
|
1801
|
-
}
|
|
1802
|
-
|
|
1803
|
-
/**
|
|
1804
|
-
* Extract the most recently injected NOW.md content from the message history.
|
|
1805
|
-
* Returns null if no NOW.md injection is found.
|
|
1806
|
-
*/
|
|
1807
|
-
export function findLastInjectedNowContent(messages: Message[]): string | null {
|
|
1808
|
-
// Matches every NOW.md opening tag we emit (the tag text may evolve over
|
|
1809
|
-
// time, e.g. adding a line-limit hint), so in-flight histories with older
|
|
1810
|
-
// tag variants remain discoverable during a rolling deploy.
|
|
1811
|
-
const openTagPrefix = "<NOW.md Always keep this up to date";
|
|
1812
|
-
const suffix = "\n</NOW.md>";
|
|
1813
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
1814
|
-
const msg = messages[i];
|
|
1815
|
-
if (msg.role !== "user") continue;
|
|
1816
|
-
for (const block of msg.content) {
|
|
1817
|
-
if (block.type !== "text" || !block.text.startsWith(openTagPrefix)) {
|
|
1818
|
-
continue;
|
|
1819
|
-
}
|
|
1820
|
-
const tagEnd = block.text.indexOf(">\n");
|
|
1821
|
-
if (tagEnd < 0) continue;
|
|
1822
|
-
const contentStart = tagEnd + ">\n".length;
|
|
1823
|
-
const end = block.text.lastIndexOf(suffix);
|
|
1824
|
-
if (end > contentStart) return block.text.slice(contentStart, end);
|
|
1825
|
-
}
|
|
1826
|
-
}
|
|
1827
|
-
return null;
|
|
1828
|
-
}
|
|
1829
|
-
|
|
1830
1640
|
/**
|
|
1831
1641
|
* Controls which runtime injections are applied.
|
|
1832
1642
|
*
|
|
@@ -1874,8 +1684,14 @@ export interface RuntimeInjectionResult {
|
|
|
1874
1684
|
}
|
|
1875
1685
|
|
|
1876
1686
|
/**
|
|
1877
|
-
* Run every
|
|
1878
|
-
* and return every non-null block
|
|
1687
|
+
* Run every {@link Injector} in the chain ({@link getInjectorChain}, already
|
|
1688
|
+
* sorted by ascending `order`) and return every non-null block it produced.
|
|
1689
|
+
*
|
|
1690
|
+
* `runMessages` is the turn's working message array, forwarded to each
|
|
1691
|
+
* injector so producers that need the current prompt contents read it from a
|
|
1692
|
+
* parameter rather than the shared {@link TurnContext}. Omitted by text-only
|
|
1693
|
+
* callers ({@link composeInjectorChain}) that drive the chain without a
|
|
1694
|
+
* message array.
|
|
1879
1695
|
*
|
|
1880
1696
|
* Injectors returning `null` are omitted from the result. The returned array
|
|
1881
1697
|
* preserves ascending-`order` sort so downstream callers (notably
|
|
@@ -1884,12 +1700,11 @@ export interface RuntimeInjectionResult {
|
|
|
1884
1700
|
*/
|
|
1885
1701
|
async function collectInjectorBlocks(
|
|
1886
1702
|
ctx: TurnContext,
|
|
1703
|
+
runMessages?: Message[],
|
|
1887
1704
|
): Promise<InjectionBlock[]> {
|
|
1888
|
-
const injectors = getInjectors();
|
|
1889
|
-
if (injectors.length === 0) return [];
|
|
1890
1705
|
const out: InjectionBlock[] = [];
|
|
1891
|
-
for (const injector of
|
|
1892
|
-
const block = await injector.produce(ctx);
|
|
1706
|
+
for (const injector of getInjectorChain()) {
|
|
1707
|
+
const block = await injector.produce(ctx, runMessages);
|
|
1893
1708
|
if (block) out.push(block);
|
|
1894
1709
|
}
|
|
1895
1710
|
return out;
|
|
@@ -2007,63 +1822,21 @@ function applyInjectionBlock(
|
|
|
2007
1822
|
* bag attached to the {@link TurnContext} the caller provides (or to an
|
|
2008
1823
|
* ephemeral {@link TurnContext} synthesized for test call sites). A small
|
|
2009
1824
|
* number of fields drive hardcoded branches that live outside the injector
|
|
2010
|
-
* chain — `
|
|
2011
|
-
* `
|
|
2012
|
-
*
|
|
2013
|
-
*
|
|
1825
|
+
* chain — `channelCommandContext`, `voiceCallControlPrompt`,
|
|
1826
|
+
* `transportHints`, and `isNonInteractive` — because they are
|
|
1827
|
+
* orchestrator-owned content that never made sense as plugin-overridable
|
|
1828
|
+
* default injectors.
|
|
1829
|
+
*
|
|
1830
|
+
* The active workspace surface, the channel capabilities, and the active
|
|
1831
|
+
* document list are not on this bag: `applyRuntimeInjections` resolves them
|
|
1832
|
+
* from the live conversation itself (its surface state, `channelCapabilities`,
|
|
1833
|
+
* and the document store keyed by `conversationId` respectively), so the
|
|
1834
|
+
* orchestrator does not compute or thread them per turn.
|
|
2014
1835
|
*/
|
|
2015
1836
|
export interface RuntimeInjectionOptions {
|
|
2016
|
-
diskPressureContext?: DiskPressureInjectionContext | null;
|
|
2017
|
-
/**
|
|
2018
|
-
* Active dashboard-surface context (read from `<active_workspace>`). Kept
|
|
2019
|
-
* on the options bag rather than an injector because it is a
|
|
2020
|
-
* channel-capability concern that has never been gated as a default
|
|
2021
|
-
* injector.
|
|
2022
|
-
*/
|
|
2023
|
-
activeSurface?: ActiveSurfaceContext | null;
|
|
2024
|
-
workspaceTopLevelContext?: string | null;
|
|
2025
|
-
channelCapabilities?: ChannelCapabilities | null;
|
|
2026
1837
|
channelCommandContext?: ChannelCommandContext | null;
|
|
2027
1838
|
unifiedTurnContext?: string | null;
|
|
2028
1839
|
voiceCallControlPrompt?: string | null;
|
|
2029
|
-
pkbContext?: string | null;
|
|
2030
|
-
pkbActive?: boolean;
|
|
2031
|
-
/**
|
|
2032
|
-
* Dense query vector surfaced from the graph memory retriever.
|
|
2033
|
-
* When present together with `pkbActive`, used to run `searchPkbFiles`
|
|
2034
|
-
* to surface relevance hints in the PKB system reminder. When missing,
|
|
2035
|
-
* the reminder falls back to the flat static text.
|
|
2036
|
-
*/
|
|
2037
|
-
pkbQueryVector?: number[];
|
|
2038
|
-
/** Optional sparse vector accompanying `pkbQueryVector`. */
|
|
2039
|
-
pkbSparseVector?: QdrantSparseVector;
|
|
2040
|
-
/** Memory scope id used to filter PKB search results. */
|
|
2041
|
-
pkbScopeId?: string;
|
|
2042
|
-
/**
|
|
2043
|
-
* The live conversation (or a minimal shape containing `messages`) used
|
|
2044
|
-
* to compute which PKB paths are already "in context" and therefore
|
|
2045
|
-
* suppressed from hint suggestions.
|
|
2046
|
-
*/
|
|
2047
|
-
pkbConversation?: PkbContextConversation;
|
|
2048
|
-
/** Auto-injected PKB filenames (resolved relative to `pkbRoot`). */
|
|
2049
|
-
pkbAutoInjectList?: string[];
|
|
2050
|
-
/** Absolute path to the PKB directory (e.g. `<workspace>/pkb`). */
|
|
2051
|
-
pkbRoot?: string;
|
|
2052
|
-
/**
|
|
2053
|
-
* Working directory against which relative `file_read` tool paths
|
|
2054
|
-
* resolve, used to detect workspace-relative reads like
|
|
2055
|
-
* `pkb/threads.md`. Falls back to `pkbRoot` when omitted.
|
|
2056
|
-
*/
|
|
2057
|
-
pkbWorkingDir?: string;
|
|
2058
|
-
/**
|
|
2059
|
-
* Pre-rendered v2 static memory content (essentials/threads/recent/buffer
|
|
2060
|
-
* concatenated, header-wrapped). When non-null on full-mode turns the
|
|
2061
|
-
* `memory-v2-static` injector wraps it in `<info>` and splices it onto
|
|
2062
|
-
* the user message; subsequent turns leave the prior block cached on its
|
|
2063
|
-
* original user message.
|
|
2064
|
-
*/
|
|
2065
|
-
memoryV2Static?: string | null;
|
|
2066
|
-
nowScratchpad?: string | null;
|
|
2067
1840
|
subagentStatusBlock?: string | null;
|
|
2068
1841
|
isNonInteractive?: boolean;
|
|
2069
1842
|
/**
|
|
@@ -2108,7 +1881,6 @@ export interface RuntimeInjectionOptions {
|
|
|
2108
1881
|
* `undefined` when the inbound is a top-level (non-thread) post.
|
|
2109
1882
|
*/
|
|
2110
1883
|
slackActiveThreadFocusBlock?: string | null;
|
|
2111
|
-
activeDocuments?: TurnInjectionInputs["activeDocuments"];
|
|
2112
1884
|
mode?: InjectionMode;
|
|
2113
1885
|
/**
|
|
2114
1886
|
* Per-turn {@link TurnContext} forwarded to plugin-registered
|
|
@@ -2136,44 +1908,38 @@ export interface RuntimeInjectionOptions {
|
|
|
2136
1908
|
*/
|
|
2137
1909
|
function buildTurnInjectionInputs(
|
|
2138
1910
|
options: RuntimeInjectionOptions,
|
|
1911
|
+
channelCapabilities: ChannelCapabilities | null,
|
|
1912
|
+
activeDocuments: TurnInjectionInputs["activeDocuments"],
|
|
2139
1913
|
): TurnInjectionInputs {
|
|
2140
1914
|
return {
|
|
2141
1915
|
mode: options.mode,
|
|
2142
|
-
diskPressureContext: options.diskPressureContext,
|
|
2143
|
-
workspaceTopLevelContext: options.workspaceTopLevelContext,
|
|
2144
1916
|
unifiedTurnContext: options.unifiedTurnContext,
|
|
2145
|
-
pkbContext: options.pkbContext,
|
|
2146
|
-
pkbActive: options.pkbActive,
|
|
2147
|
-
pkbQueryVector: options.pkbQueryVector,
|
|
2148
|
-
pkbSparseVector: options.pkbSparseVector,
|
|
2149
|
-
pkbScopeId: options.pkbScopeId,
|
|
2150
|
-
pkbConversation: options.pkbConversation,
|
|
2151
|
-
pkbAutoInjectList: options.pkbAutoInjectList,
|
|
2152
|
-
pkbRoot: options.pkbRoot,
|
|
2153
|
-
pkbWorkingDir: options.pkbWorkingDir,
|
|
2154
|
-
memoryV2Static: options.memoryV2Static,
|
|
2155
|
-
nowScratchpad: options.nowScratchpad,
|
|
2156
1917
|
subagentStatusBlock: options.subagentStatusBlock,
|
|
2157
|
-
channelCapabilities
|
|
1918
|
+
channelCapabilities,
|
|
2158
1919
|
slackChronologicalMessages: options.slackChronologicalMessages,
|
|
2159
1920
|
slackActiveThreadFocusBlock: options.slackActiveThreadFocusBlock,
|
|
2160
|
-
activeSurface: options.activeSurface,
|
|
2161
1921
|
channelCommandContext: options.channelCommandContext,
|
|
2162
1922
|
voiceCallControlPrompt: options.voiceCallControlPrompt,
|
|
2163
1923
|
transportHints: options.transportHints,
|
|
2164
1924
|
isNonInteractive: options.isNonInteractive,
|
|
2165
1925
|
isBackgroundConversation: options.isBackgroundConversation,
|
|
2166
|
-
activeDocuments
|
|
1926
|
+
activeDocuments,
|
|
2167
1927
|
};
|
|
2168
1928
|
}
|
|
2169
1929
|
|
|
1930
|
+
/**
|
|
1931
|
+
* Conversation id used for the synthetic fallback {@link TurnContext} and the
|
|
1932
|
+
* live-conversation lookup when the caller omits a context (test call sites).
|
|
1933
|
+
*/
|
|
1934
|
+
const RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID = "runtime-assembly-fallback";
|
|
1935
|
+
|
|
2170
1936
|
/** Minimal synthetic TurnContext used when the caller omits one. */
|
|
2171
1937
|
function synthesizeFallbackTurnContext(
|
|
2172
1938
|
inputs: TurnInjectionInputs,
|
|
2173
1939
|
): TurnContext {
|
|
2174
1940
|
return {
|
|
2175
|
-
requestId:
|
|
2176
|
-
conversationId:
|
|
1941
|
+
requestId: RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID,
|
|
1942
|
+
conversationId: RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID,
|
|
2177
1943
|
turnIndex: 0,
|
|
2178
1944
|
trust: {
|
|
2179
1945
|
sourceChannel: inputs.channelCapabilities?.channel
|
|
@@ -2214,6 +1980,8 @@ function synthesizeFallbackTurnContext(
|
|
|
2214
1980
|
* 6. Run the remaining hardcoded branches (`isNonInteractive`,
|
|
2215
1981
|
* `voiceCallControlPrompt`, `activeSurface`, `channelCapabilities`,
|
|
2216
1982
|
* `channelCommandContext`, `transportHints`) in their historical order.
|
|
1983
|
+
* `activeSurface` and `channelCapabilities` are sourced from the live
|
|
1984
|
+
* conversation rather than `options`.
|
|
2217
1985
|
* 7. Finally, apply the chain's remaining blocks by placement:
|
|
2218
1986
|
* `"append-user-tail"` in ascending `order`, then `"prepend-user-tail"`
|
|
2219
1987
|
* in descending `order` so the lowest-`order` prepend lands topmost in
|
|
@@ -2228,19 +1996,39 @@ export async function applyRuntimeInjections(
|
|
|
2228
1996
|
options: RuntimeInjectionOptions,
|
|
2229
1997
|
): Promise<RuntimeInjectionResult> {
|
|
2230
1998
|
const mode = options.mode ?? "full";
|
|
2231
|
-
|
|
1999
|
+
|
|
2000
|
+
// Source the channel capabilities from the live conversation rather than a
|
|
2001
|
+
// per-turn option computed by the orchestrator. The same value drives the
|
|
2002
|
+
// Slack-conversation gate, the `<channel_capabilities>` branch, and the
|
|
2003
|
+
// per-injector inputs the Slack injectors read.
|
|
2004
|
+
const conversationId =
|
|
2005
|
+
options.turnContext?.conversationId ??
|
|
2006
|
+
RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID;
|
|
2007
|
+
const channelCapabilities =
|
|
2008
|
+
findConversationOrSubagent(conversationId)?.channelCapabilities ?? null;
|
|
2009
|
+
const slackConversation = channelCapabilities?.channel === "slack";
|
|
2010
|
+
|
|
2011
|
+
// Source the active documents from the document store keyed by the same
|
|
2012
|
+
// conversation id rather than a per-turn option computed by the
|
|
2013
|
+
// orchestrator; the `active-documents` and `document-comments` injectors
|
|
2014
|
+
// read the result off their per-injector inputs.
|
|
2015
|
+
const activeDocuments = buildActiveDocuments(conversationId);
|
|
2232
2016
|
|
|
2233
2017
|
// Build the per-injector inputs and attach them to the caller's
|
|
2234
2018
|
// TurnContext (without mutating it). When the caller didn't supply one,
|
|
2235
2019
|
// synthesize a minimal fallback so the chain still runs — test call sites
|
|
2236
2020
|
// that drive injection via `options` without constructing a full context
|
|
2237
2021
|
// continue to work.
|
|
2238
|
-
const injectionInputs = buildTurnInjectionInputs(
|
|
2022
|
+
const injectionInputs = buildTurnInjectionInputs(
|
|
2023
|
+
options,
|
|
2024
|
+
channelCapabilities,
|
|
2025
|
+
activeDocuments,
|
|
2026
|
+
);
|
|
2239
2027
|
const turnCtx: TurnContext = options.turnContext
|
|
2240
2028
|
? { ...options.turnContext, injectionInputs }
|
|
2241
2029
|
: synthesizeFallbackTurnContext(injectionInputs);
|
|
2242
2030
|
|
|
2243
|
-
const chainBlocks = await collectInjectorBlocks(turnCtx);
|
|
2031
|
+
const chainBlocks = await collectInjectorBlocks(turnCtx, runMessages);
|
|
2244
2032
|
|
|
2245
2033
|
// Split the chain output by placement so the downstream assembly can
|
|
2246
2034
|
// process each slot with the correct ordering rule.
|
|
@@ -2319,7 +2107,30 @@ export async function applyRuntimeInjections(
|
|
|
2319
2107
|
? injectorChainPieces.join("\n\n")
|
|
2320
2108
|
: undefined;
|
|
2321
2109
|
|
|
2322
|
-
|
|
2110
|
+
// ── Step 0: memory-v3-live v2 suppression ──
|
|
2111
|
+
// When the `memory-v3-live` flag is on AND the v3 injector actually produced
|
|
2112
|
+
// a block this turn, v3 is the sole `<memory>` source. v2's `prepareMemory`
|
|
2113
|
+
// already prepended its own `<memory>` block to the tail user message (and
|
|
2114
|
+
// historical turns may carry v2 blocks from earlier turns). Strip every user
|
|
2115
|
+
// message's memory prefix here so:
|
|
2116
|
+
// 1. The v3 `after-memory-prefix` block (Step 2) lands at the top of the
|
|
2117
|
+
// tail with no v2 prefix ahead of it — exactly one `<memory>` block.
|
|
2118
|
+
// 2. History is byte-stable across turns for prompt caching.
|
|
2119
|
+
// Keyed off the v3 block being present (not the flag alone) so a v3 failure
|
|
2120
|
+
// (`produce()` → null) leaves v2's block intact — fallback rather than a
|
|
2121
|
+
// memory-less turn. Idempotent: re-injection sites that already stripped
|
|
2122
|
+
// see no change. Flag off → bit-for-bit identical to the v2 path.
|
|
2123
|
+
const suppressV2MemoryForV3 = isAssistantFeatureFlagEnabled(
|
|
2124
|
+
"memory-v3-live",
|
|
2125
|
+
getConfig(),
|
|
2126
|
+
);
|
|
2127
|
+
const v3ProducedBlock = afterMemory.some((b) => b.id === MEMORY_V3_BLOCK_ID);
|
|
2128
|
+
let runMessagesForAssembly = runMessages;
|
|
2129
|
+
if (suppressV2MemoryForV3 && v3ProducedBlock) {
|
|
2130
|
+
runMessagesForAssembly = stripAllMemoryInjections(runMessages);
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2133
|
+
let result = runMessagesForAssembly;
|
|
2323
2134
|
|
|
2324
2135
|
// ── Step 1: Slack chronological replacement (chain "replace" block) ──
|
|
2325
2136
|
if (replaceBlock && replaceBlock.messagesOverride) {
|
|
@@ -2328,7 +2139,9 @@ export async function applyRuntimeInjections(
|
|
|
2328
2139
|
// runtime assembly runs. The Slack transcript is freshly rendered
|
|
2329
2140
|
// from persisted rows and has no such prefix, so swap it in and then
|
|
2330
2141
|
// re-prepend the captured prefix onto the new tail user message.
|
|
2331
|
-
const carriedMemoryBlocks = extractMemoryPrefixBlocks(
|
|
2142
|
+
const carriedMemoryBlocks = extractMemoryPrefixBlocks(
|
|
2143
|
+
runMessagesForAssembly,
|
|
2144
|
+
);
|
|
2332
2145
|
result = replaceBlock.messagesOverride;
|
|
2333
2146
|
if (carriedMemoryBlocks.length > 0) {
|
|
2334
2147
|
const slackTail = result[result.length - 1];
|
|
@@ -2394,22 +2207,36 @@ export async function applyRuntimeInjections(
|
|
|
2394
2207
|
}
|
|
2395
2208
|
}
|
|
2396
2209
|
|
|
2397
|
-
if (mode === "full"
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2210
|
+
if (mode === "full") {
|
|
2211
|
+
// Source the active workspace surface from the live conversation's surface
|
|
2212
|
+
// state rather than from a per-turn option computed by the orchestrator.
|
|
2213
|
+
const surfaceConversation = findConversationOrSubagent(
|
|
2214
|
+
turnCtx.conversationId,
|
|
2215
|
+
);
|
|
2216
|
+
const activeSurface = surfaceConversation
|
|
2217
|
+
? buildActiveSurfaceContext({
|
|
2218
|
+
currentActiveSurfaceId: surfaceConversation.currentActiveSurfaceId,
|
|
2219
|
+
currentPage: surfaceConversation.currentPage,
|
|
2220
|
+
surfaceState: surfaceConversation.surfaceState,
|
|
2221
|
+
})
|
|
2222
|
+
: null;
|
|
2223
|
+
if (activeSurface) {
|
|
2224
|
+
const userTail = result[result.length - 1];
|
|
2225
|
+
if (userTail && userTail.role === "user") {
|
|
2226
|
+
result = [
|
|
2227
|
+
...result.slice(0, -1),
|
|
2228
|
+
injectActiveSurfaceContext(userTail, activeSurface),
|
|
2229
|
+
];
|
|
2230
|
+
}
|
|
2404
2231
|
}
|
|
2405
2232
|
}
|
|
2406
2233
|
|
|
2407
|
-
if (
|
|
2234
|
+
if (channelCapabilities) {
|
|
2408
2235
|
const userTail = result[result.length - 1];
|
|
2409
2236
|
if (userTail && userTail.role === "user") {
|
|
2410
2237
|
result = [
|
|
2411
2238
|
...result.slice(0, -1),
|
|
2412
|
-
injectChannelCapabilityContext(userTail,
|
|
2239
|
+
injectChannelCapabilityContext(userTail, channelCapabilities),
|
|
2413
2240
|
];
|
|
2414
2241
|
}
|
|
2415
2242
|
}
|