@vellumai/assistant 0.8.6 → 0.8.7
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 +1 -0
- package/bun.lock +11 -2
- package/docker-entrypoint.sh +8 -6
- package/docs/plugins.md +63 -28
- package/examples/plugins/echo/register.ts +4 -7
- 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/skill-host.ts +6 -2
- package/openapi.yaml +3735 -353
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
- 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 +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +4 -2
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- 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__/btw-routes.test.ts +7 -12
- 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 +48 -20
- package/src/__tests__/channel-approvals.test.ts +3 -1
- 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__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- 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 +14 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
- package/src/__tests__/conversation-agent-loop.test.ts +581 -62
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- 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-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 +34 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
- package/src/__tests__/conversation-queue.test.ts +270 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-slash-queue.test.ts +37 -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-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -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-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 +3 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
- 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 +6 -2
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -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 +7 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -1
- package/src/__tests__/history-repair-hook.test.ts +161 -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-cu-proxy.test.ts +2 -0
- 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 +35 -14
- package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +1 -1
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- 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 +45 -0
- 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-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- 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 +14 -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 +10 -0
- package/src/__tests__/openai-provider.test.ts +66 -70
- 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 +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +15 -26
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +51 -25
- 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 +7 -14
- 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 +30 -42
- 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__/relay-server.test.ts +20 -13
- 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 +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +67 -0
- package/src/__tests__/schedule-tools.test.ts +125 -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 +2 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +11 -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 +2 -2
- 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 +54 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -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__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +13 -7
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +409 -85
- 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-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-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +8 -10
- 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 +354 -0
- package/src/api/requests/dictation.ts +45 -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 +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -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 +4 -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/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/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- 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/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/llm.ts +2 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -253
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +19 -0
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
- package/src/daemon/conversation-agent-loop.ts +284 -584
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +1 -3
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +100 -79
- package/src/daemon/conversation-runtime-assembly.ts +47 -21
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +55 -69
- package/src/daemon/conversation-tool-setup.ts +3 -0
- package/src/daemon/conversation.ts +91 -126
- 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 +46 -24
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +4 -0
- package/src/daemon/handlers/skills.ts +15 -14
- 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 +28 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- 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 +28 -343
- 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 +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +49 -46
- package/src/daemon/server.ts +12 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +11 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +16 -0
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- 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 +18 -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 +26 -13
- 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/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__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -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/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -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 +32 -32
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +51 -39
- 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 +10 -0
- 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/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/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- 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 +89 -9
- 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/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -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 -6
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -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 +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -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/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +51 -90
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +20 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +5 -1
- package/src/prompts/templates/system-sections.ts +6 -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 +24 -5
- 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 +0 -2
- package/src/providers/openai/chat-completions-provider.ts +1 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +1 -6
- 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 +131 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- 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 +3 -14
- 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/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- 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__/inference-provider-connection-routes.test.ts +13 -22
- 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__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +97 -24
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- 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 +238 -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 +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- 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 +13 -5
- 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 +88 -41
- package/src/runtime/routes/conversation-routes.ts +74 -19
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +6 -1
- 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 +21 -10
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- 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 +25 -9
- 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 +5 -0
- 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 +5 -0
- 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 +17 -6
- package/src/runtime/routes/identity-routes.ts +12 -2
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- 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/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 +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -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-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +28 -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 +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +273 -407
- 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 +33 -11
- 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 +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- 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 +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- 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 +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- 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 +133 -69
- 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/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- 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 +71 -3
- 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 +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- 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 +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- 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 +8 -0
- package/src/schedule/scheduler.ts +3 -1
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/subagent/manager.ts +3 -6
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +8 -4
- 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/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 +34 -31
- 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/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +16 -13
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +11 -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/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- 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 +69 -9
- 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/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- 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/__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 +6 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- 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/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- 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/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/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-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
|
@@ -19,8 +19,10 @@ import {
|
|
|
19
19
|
import {
|
|
20
20
|
countMemoryPrefixBlocks,
|
|
21
21
|
extractMemoryPrefixBlocks,
|
|
22
|
+
stripAllMemoryInjections,
|
|
22
23
|
} from "../memory/graph/conversation-graph-memory.js";
|
|
23
24
|
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
25
|
+
import { MEMORY_V3_BLOCK_ID } from "../memory/v3/types.js";
|
|
24
26
|
import {
|
|
25
27
|
readSlackMetadata,
|
|
26
28
|
readSlackMetadataFromMessageMetadata,
|
|
@@ -53,7 +55,7 @@ import { TERMINAL_STATUSES } from "../subagent/types.js";
|
|
|
53
55
|
import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
|
|
54
56
|
import { getWorkspaceDir, getWorkspacePromptPath } from "../util/platform.js";
|
|
55
57
|
import { stripCommentLines } from "../util/strip-comment-lines.js";
|
|
56
|
-
import { filterMessagesForUntrustedActor } from "./
|
|
58
|
+
import { filterMessagesForUntrustedActor } from "./message-provenance.js";
|
|
57
59
|
import { type PkbContextConversation } from "./pkb-context-tracker.js";
|
|
58
60
|
import type { TrustContext } from "./trust-context.js";
|
|
59
61
|
|
|
@@ -299,7 +301,7 @@ function injectActiveSurfaceContext(
|
|
|
299
301
|
lines.push(
|
|
300
302
|
`The user is viewing app "${ctx.appName ?? "Untitled"}" (app_id: "${ctx.appId}", slug: "${slug}") in workspace mode.`,
|
|
301
303
|
"",
|
|
302
|
-
'PREREQUISITE: If `app_refresh` is not yet available, call `skill_load` with `
|
|
304
|
+
'PREREQUISITE: If `app_refresh` is not yet available, call `skill_load` with `skill: "app-builder"` first to load it.',
|
|
303
305
|
"",
|
|
304
306
|
"RULES FOR WORKSPACE MODIFICATION:",
|
|
305
307
|
`1. Use \`file_edit\` to make surgical changes to app files. The file path is \`${getAppDirPath(ctx.appId)}/<path>\`.`,
|
|
@@ -488,7 +490,7 @@ export function buildSubagentStatusBlock(
|
|
|
488
490
|
}
|
|
489
491
|
|
|
490
492
|
// The `<active_subagents>` block is emitted by the `subagent-status` default
|
|
491
|
-
// injector (`plugins/defaults/injectors.ts`) as an `append-user-tail`
|
|
493
|
+
// injector (`plugins/defaults/injectors/register.ts`) as an `append-user-tail`
|
|
492
494
|
// placement. Use {@link applyRuntimeInjections} with
|
|
493
495
|
// `options.subagentStatusBlock` set, or drive the injector chain directly
|
|
494
496
|
// via `collectInjectorBlocks`.
|
|
@@ -531,7 +533,7 @@ export function readNowScratchpad(): string | null {
|
|
|
531
533
|
|
|
532
534
|
/**
|
|
533
535
|
* The `<NOW.md>` block is emitted by the `now-md` default injector
|
|
534
|
-
* (`plugins/defaults/injectors.ts`) as an `after-memory-prefix` placement.
|
|
536
|
+
* (`plugins/defaults/injectors/register.ts`) as an `after-memory-prefix` placement.
|
|
535
537
|
* Use {@link applyRuntimeInjections} with `options.nowScratchpad` set.
|
|
536
538
|
*/
|
|
537
539
|
|
|
@@ -1647,10 +1649,9 @@ function buildActiveThreadBlockFromRenderable(
|
|
|
1647
1649
|
|
|
1648
1650
|
if (members.length === 0) return null;
|
|
1649
1651
|
|
|
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.
|
|
1652
|
+
// The active-thread block is flattened to plain text below. User rows keep
|
|
1653
|
+
// explicit Slack attribution through the renderer; assistant rows pass
|
|
1654
|
+
// through unchanged so the model does not learn a synthetic reply prefix.
|
|
1654
1655
|
// Unnamed user rows (no real Slack displayName) get a `@user` senderLabel
|
|
1655
1656
|
// here so their tag line carries attribution through the renderer. Labeled
|
|
1656
1657
|
// user rows and assistant rows pass through unchanged.
|
|
@@ -1662,18 +1663,8 @@ function buildActiveThreadBlockFromRenderable(
|
|
|
1662
1663
|
|
|
1663
1664
|
const rendered = renderSlackTranscriptWithProvenance(labeledMembers);
|
|
1664
1665
|
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
1666
|
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
|
-
})
|
|
1667
|
+
.map((entry) => extractTagLineTexts([entry.message])[0] ?? "")
|
|
1677
1668
|
.join("\n");
|
|
1678
1669
|
return `<active_thread>\n${lines}\n</active_thread>`;
|
|
1679
1670
|
}
|
|
@@ -2110,6 +2101,20 @@ export interface RuntimeInjectionOptions {
|
|
|
2110
2101
|
slackActiveThreadFocusBlock?: string | null;
|
|
2111
2102
|
activeDocuments?: TurnInjectionInputs["activeDocuments"];
|
|
2112
2103
|
mode?: InjectionMode;
|
|
2104
|
+
/**
|
|
2105
|
+
* memory-v3-live: when true AND the v3 injector produced a `<memory>` block
|
|
2106
|
+
* this turn (placement `after-memory-prefix`, id `memory-v3`), the v2
|
|
2107
|
+
* `<memory>` injection that `graphMemory.prepareMemory` prepended to the
|
|
2108
|
+
* tail is stripped from EVERY user message before the v3 block is spliced —
|
|
2109
|
+
* so v3 becomes the sole `<memory>` source and history stays byte-stable for
|
|
2110
|
+
* prompt caching.
|
|
2111
|
+
*
|
|
2112
|
+
* The strip is keyed off whether v3 ACTUALLY produced a block, not off the
|
|
2113
|
+
* flag alone: when v3 errors or selects nothing (its injector returns
|
|
2114
|
+
* `null`), v2's block is left in place so the turn still ships memory rather
|
|
2115
|
+
* than dropping it (fallback-to-v2). Default false — v2 untouched.
|
|
2116
|
+
*/
|
|
2117
|
+
suppressV2MemoryForV3?: boolean;
|
|
2113
2118
|
/**
|
|
2114
2119
|
* Per-turn {@link TurnContext} forwarded to plugin-registered
|
|
2115
2120
|
* {@link Injector}s via {@link collectInjectorBlocks}. When omitted,
|
|
@@ -2319,7 +2324,26 @@ export async function applyRuntimeInjections(
|
|
|
2319
2324
|
? injectorChainPieces.join("\n\n")
|
|
2320
2325
|
: undefined;
|
|
2321
2326
|
|
|
2322
|
-
|
|
2327
|
+
// ── Step 0: memory-v3-live v2 suppression ──
|
|
2328
|
+
// When v3 live mode is on AND the v3 injector actually produced a block this
|
|
2329
|
+
// turn, v3 is the sole `<memory>` source. v2's `prepareMemory` already
|
|
2330
|
+
// prepended its own `<memory>` block to the tail user message (and historical
|
|
2331
|
+
// turns may carry v2 blocks from earlier turns). Strip every user message's
|
|
2332
|
+
// memory prefix here so:
|
|
2333
|
+
// 1. The v3 `after-memory-prefix` block (Step 2) lands at the top of the
|
|
2334
|
+
// tail with no v2 prefix ahead of it — exactly one `<memory>` block.
|
|
2335
|
+
// 2. History is byte-stable across turns for prompt caching.
|
|
2336
|
+
// Keyed off the v3 block being present (not the flag alone) so a v3 failure
|
|
2337
|
+
// (`produce()` → null) leaves v2's block intact — fallback rather than a
|
|
2338
|
+
// memory-less turn. Idempotent: re-injection sites that already stripped
|
|
2339
|
+
// see no change.
|
|
2340
|
+
const v3ProducedBlock = afterMemory.some((b) => b.id === MEMORY_V3_BLOCK_ID);
|
|
2341
|
+
let runMessagesForAssembly = runMessages;
|
|
2342
|
+
if (options.suppressV2MemoryForV3 && v3ProducedBlock) {
|
|
2343
|
+
runMessagesForAssembly = stripAllMemoryInjections(runMessages);
|
|
2344
|
+
}
|
|
2345
|
+
|
|
2346
|
+
let result = runMessagesForAssembly;
|
|
2323
2347
|
|
|
2324
2348
|
// ── Step 1: Slack chronological replacement (chain "replace" block) ──
|
|
2325
2349
|
if (replaceBlock && replaceBlock.messagesOverride) {
|
|
@@ -2328,7 +2352,9 @@ export async function applyRuntimeInjections(
|
|
|
2328
2352
|
// runtime assembly runs. The Slack transcript is freshly rendered
|
|
2329
2353
|
// from persisted rows and has no such prefix, so swap it in and then
|
|
2330
2354
|
// re-prepend the captured prefix onto the new tail user message.
|
|
2331
|
-
const carriedMemoryBlocks = extractMemoryPrefixBlocks(
|
|
2355
|
+
const carriedMemoryBlocks = extractMemoryPrefixBlocks(
|
|
2356
|
+
runMessagesForAssembly,
|
|
2357
|
+
);
|
|
2332
2358
|
result = replaceBlock.messagesOverride;
|
|
2333
2359
|
if (carriedMemoryBlocks.length > 0) {
|
|
2334
2360
|
const slackTail = result[result.length - 1];
|
|
@@ -265,13 +265,14 @@ export async function getOrCreateConversation(
|
|
|
265
265
|
conversationId,
|
|
266
266
|
provider,
|
|
267
267
|
systemPrompt,
|
|
268
|
-
maxTokens,
|
|
269
268
|
sendToClient,
|
|
270
269
|
workingDir,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
270
|
+
{
|
|
271
|
+
maxTokens,
|
|
272
|
+
sharedCesClient,
|
|
273
|
+
speedOverride: storedOptions?.speed,
|
|
274
|
+
modelOverride: storedOptions?.modelOverride,
|
|
275
|
+
},
|
|
275
276
|
);
|
|
276
277
|
newConversation.updateClient(sendToClient, true);
|
|
277
278
|
await newConversation.loadFromDb();
|
|
@@ -18,7 +18,11 @@ import {
|
|
|
18
18
|
assistantEventHub,
|
|
19
19
|
broadcastMessage,
|
|
20
20
|
} from "../runtime/assistant-event-hub.js";
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
ambiguousSameUserError,
|
|
23
|
+
enforceSameActorOrErrorResult,
|
|
24
|
+
pickSameUserAutoResolve,
|
|
25
|
+
} from "../runtime/auth/same-actor.js";
|
|
22
26
|
import type {
|
|
23
27
|
InteractiveUiRequest,
|
|
24
28
|
InteractiveUiResult,
|
|
@@ -29,6 +33,7 @@ import { isPlainObject } from "../util/object.js";
|
|
|
29
33
|
import { buildConversationErrorMessage } from "./conversation-error.js";
|
|
30
34
|
import { launchConversation } from "./conversation-launch.js";
|
|
31
35
|
import type { EnqueueMessageOptions } from "./conversation-messaging.js";
|
|
36
|
+
import type { ProcessMessageOptions } from "./conversation-process.js";
|
|
32
37
|
import type { HostAppControlProxy } from "./host-app-control-proxy.js";
|
|
33
38
|
import type { HostCuProxy } from "./host-cu-proxy.js";
|
|
34
39
|
import type {
|
|
@@ -503,6 +508,7 @@ export interface SurfaceConversationContext {
|
|
|
503
508
|
}>;
|
|
504
509
|
display?: string;
|
|
505
510
|
persistent?: boolean;
|
|
511
|
+
toolCallId?: string;
|
|
506
512
|
}>;
|
|
507
513
|
/** Optional proxy for delegating computer-use actions to a connected desktop client. */
|
|
508
514
|
hostCuProxy?: HostCuProxy;
|
|
@@ -524,16 +530,7 @@ export interface SurfaceConversationContext {
|
|
|
524
530
|
rejected?: boolean;
|
|
525
531
|
};
|
|
526
532
|
getQueueDepth(): number;
|
|
527
|
-
processMessage(
|
|
528
|
-
content: string,
|
|
529
|
-
attachments: UserMessageAttachment[],
|
|
530
|
-
onEvent?: (msg: ServerMessage) => void,
|
|
531
|
-
requestId?: string,
|
|
532
|
-
activeSurfaceId?: string,
|
|
533
|
-
currentPage?: string,
|
|
534
|
-
options?: { isInteractive?: boolean },
|
|
535
|
-
displayContent?: string,
|
|
536
|
-
): Promise<string>;
|
|
533
|
+
processMessage(options: ProcessMessageOptions): Promise<string>;
|
|
537
534
|
/** Serialize operations on a given surface to prevent read-modify-write races. */
|
|
538
535
|
withSurface<T>(surfaceId: string, fn: () => T | Promise<T>): Promise<T>;
|
|
539
536
|
}
|
|
@@ -1492,16 +1489,14 @@ export async function handleSurfaceAction(
|
|
|
1492
1489
|
"Processing surface action immediately (history-restored) with attachments",
|
|
1493
1490
|
);
|
|
1494
1491
|
ctx
|
|
1495
|
-
.processMessage(
|
|
1492
|
+
.processMessage({
|
|
1496
1493
|
content,
|
|
1497
1494
|
attachments,
|
|
1498
1495
|
onEvent,
|
|
1499
1496
|
requestId,
|
|
1500
|
-
surfaceId,
|
|
1501
|
-
undefined,
|
|
1502
|
-
undefined,
|
|
1497
|
+
activeSurfaceId: surfaceId,
|
|
1503
1498
|
displayContent,
|
|
1504
|
-
)
|
|
1499
|
+
})
|
|
1505
1500
|
.catch((err) => {
|
|
1506
1501
|
const message = err instanceof Error ? err.message : String(err);
|
|
1507
1502
|
log.error(
|
|
@@ -1779,16 +1774,14 @@ export async function handleSurfaceAction(
|
|
|
1779
1774
|
"Processing surface action as follow-up with attachments",
|
|
1780
1775
|
);
|
|
1781
1776
|
ctx
|
|
1782
|
-
.processMessage(
|
|
1777
|
+
.processMessage({
|
|
1783
1778
|
content,
|
|
1784
|
-
pendingAttachments,
|
|
1779
|
+
attachments: pendingAttachments,
|
|
1785
1780
|
onEvent,
|
|
1786
1781
|
requestId,
|
|
1787
|
-
surfaceId,
|
|
1788
|
-
undefined,
|
|
1789
|
-
undefined,
|
|
1782
|
+
activeSurfaceId: surfaceId,
|
|
1790
1783
|
displayContent,
|
|
1791
|
-
)
|
|
1784
|
+
})
|
|
1792
1785
|
.catch((err) => {
|
|
1793
1786
|
const message = err instanceof Error ? err.message : String(err);
|
|
1794
1787
|
log.error(
|
|
@@ -1978,6 +1971,7 @@ export async function surfaceProxyResolver(
|
|
|
1978
1971
|
toolName: string,
|
|
1979
1972
|
input: Record<string, unknown>,
|
|
1980
1973
|
signal?: AbortSignal,
|
|
1974
|
+
toolUseId?: string,
|
|
1981
1975
|
): Promise<ToolExecutionResult> {
|
|
1982
1976
|
// Route CU proxy tools (all computer_use_* action tools)
|
|
1983
1977
|
if (toolName.startsWith("computer_use_")) {
|
|
@@ -2042,44 +2036,29 @@ export async function surfaceProxyResolver(
|
|
|
2042
2036
|
if (rejection) return rejection;
|
|
2043
2037
|
}
|
|
2044
2038
|
|
|
2045
|
-
//
|
|
2046
|
-
//
|
|
2047
|
-
//
|
|
2048
|
-
// it at runtime until now. Without this guard, the request would
|
|
2049
|
-
// broadcast to all capable clients simultaneously, causing the same CU
|
|
2050
|
-
// action to execute on multiple machines. The filter mirrors
|
|
2051
|
-
// HostFileProxy's auto-resolve: only same-user clients participate, so
|
|
2052
|
-
// a cross-user client connected to the same daemon does not falsely
|
|
2053
|
-
// trigger this ambiguity error.
|
|
2054
|
-
//
|
|
2055
|
-
// Asymmetry with host_bash / host_file (host-shell.ts): the bash/file
|
|
2056
|
-
// guard additionally checks `transportInterface != null &&
|
|
2057
|
-
// !supportsHostProxy(transportInterface)` and so only fires for non-host-
|
|
2058
|
-
// proxy transports (web, Slack). For CU that check would be a no-op:
|
|
2059
|
-
// every host_cu-capable client is host-proxy-capable by definition
|
|
2060
|
-
// (host_cu only ships on macOS and the Chrome extension), so there is no
|
|
2061
|
-
// host_cu-capable transport for which auto-routing-to-self would be
|
|
2062
|
-
// appropriate. We therefore fire whenever there is genuine ambiguity.
|
|
2039
|
+
// Untargeted CU must resolve to exactly one same-user capable client
|
|
2040
|
+
// before dispatch. Otherwise the proxy would broadcast without a target
|
|
2041
|
+
// actor binding, which is unsafe in shared runtimes.
|
|
2063
2042
|
if (targetClientId == null) {
|
|
2064
|
-
const
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2043
|
+
const resolved = pickSameUserAutoResolve({
|
|
2044
|
+
hub: assistantEventHub,
|
|
2045
|
+
capability: "host_cu",
|
|
2046
|
+
sourceActorPrincipalId,
|
|
2047
|
+
});
|
|
2048
|
+
if (resolved.kind === "ambiguous") {
|
|
2049
|
+
return ambiguousSameUserError("host_cu");
|
|
2050
|
+
}
|
|
2051
|
+
if (resolved.kind === "match") {
|
|
2052
|
+
targetClientId = resolved.clientId;
|
|
2053
|
+
} else if (
|
|
2054
|
+
assistantEventHub.listClientsByCapability("host_cu").length > 0
|
|
2055
|
+
) {
|
|
2069
2056
|
return {
|
|
2070
|
-
content:
|
|
2057
|
+
content:
|
|
2058
|
+
"Computer use is not available for the current actor. Connect a host_cu-capable client as the same user.",
|
|
2071
2059
|
isError: true,
|
|
2072
2060
|
};
|
|
2073
2061
|
}
|
|
2074
|
-
// When cross-user host_cu clients are connected, we MUST auto-resolve
|
|
2075
|
-
// to the unique same-user client (or fail explicitly) — otherwise the
|
|
2076
|
-
// proxy would broadcast untargeted and the CU action would reach the
|
|
2077
|
-
// cross-user client too. Setting targetClientId here forces the proxy
|
|
2078
|
-
// to deliver only to that client, with the same-user check below as
|
|
2079
|
-
// belt-and-suspenders.
|
|
2080
|
-
if (sameUserCuClients.length === 1 && allCuClients.length > 1) {
|
|
2081
|
-
targetClientId = sameUserCuClients[0].clientId;
|
|
2082
|
-
}
|
|
2083
2062
|
}
|
|
2084
2063
|
|
|
2085
2064
|
ctx.hostCuProxy.recordAction(toolName, input, reasoning);
|
|
@@ -2164,24 +2143,25 @@ export async function surfaceProxyResolver(
|
|
|
2164
2143
|
}
|
|
2165
2144
|
|
|
2166
2145
|
if (targetClientId == null) {
|
|
2167
|
-
const
|
|
2168
|
-
assistantEventHub
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
);
|
|
2172
|
-
if (
|
|
2146
|
+
const resolved = pickSameUserAutoResolve({
|
|
2147
|
+
hub: assistantEventHub,
|
|
2148
|
+
capability: "host_app_control",
|
|
2149
|
+
sourceActorPrincipalId,
|
|
2150
|
+
});
|
|
2151
|
+
if (resolved.kind === "ambiguous") {
|
|
2152
|
+
return ambiguousSameUserError("host_app_control");
|
|
2153
|
+
}
|
|
2154
|
+
if (resolved.kind === "match") {
|
|
2155
|
+
targetClientId = resolved.clientId;
|
|
2156
|
+
} else if (
|
|
2157
|
+
assistantEventHub.listClientsByCapability("host_app_control").length > 0
|
|
2158
|
+
) {
|
|
2173
2159
|
return {
|
|
2174
|
-
content:
|
|
2160
|
+
content:
|
|
2161
|
+
"App control is not available for the current actor. Connect a host_app_control-capable client as the same user.",
|
|
2175
2162
|
isError: true,
|
|
2176
2163
|
};
|
|
2177
2164
|
}
|
|
2178
|
-
// When cross-user host_app_control clients are connected, auto-
|
|
2179
|
-
// resolve to the unique same-user client. Otherwise the proxy would
|
|
2180
|
-
// dispatch untargeted and the action could reach a cross-user
|
|
2181
|
-
// client. Belt-and-suspenders: the proxy re-checks same-user.
|
|
2182
|
-
if (sameUserAcClients.length === 1 && allAcClients.length > 1) {
|
|
2183
|
-
targetClientId = sameUserAcClients[0].clientId;
|
|
2184
|
-
}
|
|
2185
2165
|
}
|
|
2186
2166
|
|
|
2187
2167
|
// The TS `HostAppControlInput` (and the Swift mirror) is a discriminated
|
|
@@ -2323,6 +2303,7 @@ export async function surfaceProxyResolver(
|
|
|
2323
2303
|
actions: mappedActions,
|
|
2324
2304
|
display,
|
|
2325
2305
|
...(persistent ? { persistent: true } : {}),
|
|
2306
|
+
...(toolUseId ? { toolCallId: toolUseId } : {}),
|
|
2326
2307
|
} as unknown as UiSurfaceShow);
|
|
2327
2308
|
|
|
2328
2309
|
// Track surface for persistence with the message
|
|
@@ -2334,6 +2315,7 @@ export async function surfaceProxyResolver(
|
|
|
2334
2315
|
actions: mappedActions,
|
|
2335
2316
|
display,
|
|
2336
2317
|
...(persistent ? { persistent: true } : {}),
|
|
2318
|
+
...(toolUseId ? { toolCallId: toolUseId } : {}),
|
|
2337
2319
|
});
|
|
2338
2320
|
|
|
2339
2321
|
if (awaitAction) {
|
|
@@ -2507,6 +2489,7 @@ export async function surfaceProxyResolver(
|
|
|
2507
2489
|
title: app.name,
|
|
2508
2490
|
data: surfaceData,
|
|
2509
2491
|
display: "inline",
|
|
2492
|
+
...(toolUseId ? { toolCallId: toolUseId } : {}),
|
|
2510
2493
|
} as UiSurfaceShow);
|
|
2511
2494
|
|
|
2512
2495
|
// Track for message persistence so the inline card survives history reload.
|
|
@@ -2516,6 +2499,7 @@ export async function surfaceProxyResolver(
|
|
|
2516
2499
|
title: app.name,
|
|
2517
2500
|
data: surfaceData,
|
|
2518
2501
|
display: "inline",
|
|
2502
|
+
...(toolUseId ? { toolCallId: toolUseId } : {}),
|
|
2519
2503
|
});
|
|
2520
2504
|
|
|
2521
2505
|
return { content: JSON.stringify({ surfaceId, appId }), isError: false };
|
|
@@ -2534,6 +2518,7 @@ export async function surfaceProxyResolver(
|
|
|
2534
2518
|
surfaceType: "dynamic_page",
|
|
2535
2519
|
title: app.name,
|
|
2536
2520
|
data: surfaceData,
|
|
2521
|
+
...(toolUseId ? { toolCallId: toolUseId } : {}),
|
|
2537
2522
|
} as UiSurfaceShow);
|
|
2538
2523
|
|
|
2539
2524
|
// Track surface for persistence
|
|
@@ -2542,6 +2527,7 @@ export async function surfaceProxyResolver(
|
|
|
2542
2527
|
surfaceType: "dynamic_page",
|
|
2543
2528
|
title: app.name,
|
|
2544
2529
|
data: surfaceData,
|
|
2530
|
+
...(toolUseId ? { toolCallId: toolUseId } : {}),
|
|
2545
2531
|
});
|
|
2546
2532
|
|
|
2547
2533
|
ctx.pendingSurfaceActions.set(surfaceId, { surfaceType: "dynamic_page" });
|
|
@@ -159,6 +159,7 @@ export function createToolExecutor(
|
|
|
159
159
|
ctx.sendToClient(msg as ServerMessage);
|
|
160
160
|
if (msg.type === "ui_surface_show") {
|
|
161
161
|
const s = msg as unknown as UiSurfaceShow;
|
|
162
|
+
const surfaceToolCallId = s.toolCallId ?? toolUseId;
|
|
162
163
|
ctx.currentTurnSurfaces.push({
|
|
163
164
|
surfaceId: s.surfaceId,
|
|
164
165
|
surfaceType: s.surfaceType,
|
|
@@ -167,6 +168,7 @@ export function createToolExecutor(
|
|
|
167
168
|
actions: s.actions,
|
|
168
169
|
display: s.display,
|
|
169
170
|
...(s.persistent ? { persistent: true } : {}),
|
|
171
|
+
...(surfaceToolCallId ? { toolCallId: surfaceToolCallId } : {}),
|
|
170
172
|
});
|
|
171
173
|
}
|
|
172
174
|
},
|
|
@@ -180,6 +182,7 @@ export function createToolExecutor(
|
|
|
180
182
|
toolName,
|
|
181
183
|
proxyInput,
|
|
182
184
|
ctx.abortController?.signal,
|
|
185
|
+
toolUseId,
|
|
183
186
|
),
|
|
184
187
|
proxyApprovalCallback: createProxyApprovalCallback(prompter, ctx),
|
|
185
188
|
requestSecret: async (params) => {
|