@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
|
@@ -117,7 +117,11 @@ mock.module("../../memory/llm-request-log-store.js", () => ({
|
|
|
117
117
|
backfillMessageIdOnLogs: () => {},
|
|
118
118
|
}));
|
|
119
119
|
|
|
120
|
-
import type {
|
|
120
|
+
import type {
|
|
121
|
+
AgentEvent,
|
|
122
|
+
AgentLoopRunOptions,
|
|
123
|
+
AgentLoopRunResult,
|
|
124
|
+
} from "../../agent/loop.js";
|
|
121
125
|
import type { Message } from "../../providers/types.js";
|
|
122
126
|
import {
|
|
123
127
|
__resetWakeChainForTests,
|
|
@@ -127,6 +131,13 @@ import {
|
|
|
127
131
|
|
|
128
132
|
// ── Test helpers ─────────────────────────────────────────────────────
|
|
129
133
|
|
|
134
|
+
// Wake runs never pause at a checkpoint — their onCheckpoint always returns
|
|
135
|
+
// "continue" — so the loop result always carries a null pause-reason.
|
|
136
|
+
const runResult = (history: Message[]): AgentLoopRunResult => ({
|
|
137
|
+
history,
|
|
138
|
+
exitReason: null,
|
|
139
|
+
});
|
|
140
|
+
|
|
130
141
|
interface MockTarget extends WakeTarget {
|
|
131
142
|
emittedEvents: AgentEvent[];
|
|
132
143
|
pushedMessages: Message[];
|
|
@@ -134,6 +145,7 @@ interface MockTarget extends WakeTarget {
|
|
|
134
145
|
input: Message[];
|
|
135
146
|
requestId?: string;
|
|
136
147
|
turnContext?: unknown;
|
|
148
|
+
allowedTools?: string[];
|
|
137
149
|
}>;
|
|
138
150
|
processingToggles: boolean[];
|
|
139
151
|
/** Tail messages handed to `persistTailMessage`, in call order. */
|
|
@@ -152,6 +164,11 @@ interface MockTarget extends WakeTarget {
|
|
|
152
164
|
* just inferring it from the order of recorded toggles.
|
|
153
165
|
*/
|
|
154
166
|
processingDuringDrain: boolean[];
|
|
167
|
+
/**
|
|
168
|
+
* Tool allowlist snapshots captured whenever the wake applies/restores a
|
|
169
|
+
* scope. `undefined` means unrestricted.
|
|
170
|
+
*/
|
|
171
|
+
allowedToolSnapshots: Array<string[] | undefined>;
|
|
155
172
|
}
|
|
156
173
|
|
|
157
174
|
function makeTarget(options: {
|
|
@@ -164,6 +181,7 @@ function makeTarget(options: {
|
|
|
164
181
|
isProcessing?: boolean;
|
|
165
182
|
/** When true, omit `drainQueue` so we can verify the wake handles its absence. */
|
|
166
183
|
omitDrainQueue?: boolean;
|
|
184
|
+
initialAllowedTools?: Set<string>;
|
|
167
185
|
}): MockTarget {
|
|
168
186
|
const emittedEvents: AgentEvent[] = [];
|
|
169
187
|
const pushedMessages: Message[] = [];
|
|
@@ -171,14 +189,19 @@ function makeTarget(options: {
|
|
|
171
189
|
input: Message[];
|
|
172
190
|
requestId?: string;
|
|
173
191
|
turnContext?: unknown;
|
|
192
|
+
allowedTools?: string[];
|
|
174
193
|
}> = [];
|
|
175
194
|
const processingToggles: boolean[] = [];
|
|
176
195
|
const persistedTailCalls: Message[] = [];
|
|
177
196
|
const callSequence: string[] = [];
|
|
178
197
|
const processingDuringDrain: boolean[] = [];
|
|
198
|
+
const allowedToolSnapshots: Array<string[] | undefined> = [];
|
|
179
199
|
const history: Message[] = [...(options.baseline ?? [])];
|
|
180
200
|
let processing = options.isProcessing ?? false;
|
|
181
201
|
let drainQueueCalls = 0;
|
|
202
|
+
let activeAllowedTools = options.initialAllowedTools;
|
|
203
|
+
const snapshotAllowedTools = (): string[] | undefined =>
|
|
204
|
+
activeAllowedTools ? [...activeAllowedTools].sort() : undefined;
|
|
182
205
|
|
|
183
206
|
const target: MockTarget = {
|
|
184
207
|
conversationId: options.conversationId ?? "conv-test",
|
|
@@ -189,6 +212,7 @@ function makeTarget(options: {
|
|
|
189
212
|
persistedTailCalls,
|
|
190
213
|
callSequence,
|
|
191
214
|
processingDuringDrain,
|
|
215
|
+
allowedToolSnapshots,
|
|
192
216
|
get drainQueueCalls() {
|
|
193
217
|
return drainQueueCalls;
|
|
194
218
|
},
|
|
@@ -196,13 +220,14 @@ function makeTarget(options: {
|
|
|
196
220
|
run: async (
|
|
197
221
|
input: Message[],
|
|
198
222
|
onEvent: (event: AgentEvent) => void | Promise<void>,
|
|
199
|
-
|
|
200
|
-
requestId?: string,
|
|
201
|
-
_onCheckpoint?: unknown,
|
|
202
|
-
_callSite?: unknown,
|
|
203
|
-
turnContext?: unknown,
|
|
223
|
+
runOptions?: AgentLoopRunOptions,
|
|
204
224
|
) => {
|
|
205
|
-
runCalls.push({
|
|
225
|
+
runCalls.push({
|
|
226
|
+
input: [...input],
|
|
227
|
+
requestId: runOptions?.requestId,
|
|
228
|
+
turnContext: runOptions?.turnContext,
|
|
229
|
+
allowedTools: snapshotAllowedTools(),
|
|
230
|
+
});
|
|
206
231
|
// Emit any scripted events the test wanted us to produce.
|
|
207
232
|
for (const ev of options.scriptedEvents ?? []) {
|
|
208
233
|
await onEvent(ev);
|
|
@@ -221,7 +246,7 @@ function makeTarget(options: {
|
|
|
221
246
|
next.push(tailMsg);
|
|
222
247
|
}
|
|
223
248
|
}
|
|
224
|
-
return next;
|
|
249
|
+
return runResult(next);
|
|
225
250
|
},
|
|
226
251
|
},
|
|
227
252
|
getMessages: () => history,
|
|
@@ -243,6 +268,19 @@ function makeTarget(options: {
|
|
|
243
268
|
persistedTailCalls.push(msg);
|
|
244
269
|
callSequence.push("persist");
|
|
245
270
|
},
|
|
271
|
+
setWakeAllowedTools: (tools: ReadonlySet<string>) => {
|
|
272
|
+
const previous = activeAllowedTools;
|
|
273
|
+
activeAllowedTools = new Set(tools);
|
|
274
|
+
allowedToolSnapshots.push(snapshotAllowedTools());
|
|
275
|
+
callSequence.push(`tools:${snapshotAllowedTools()?.join(",") ?? "all"}`);
|
|
276
|
+
return () => {
|
|
277
|
+
activeAllowedTools = previous;
|
|
278
|
+
allowedToolSnapshots.push(snapshotAllowedTools());
|
|
279
|
+
callSequence.push(
|
|
280
|
+
`tools:${snapshotAllowedTools()?.join(",") ?? "all"}`,
|
|
281
|
+
);
|
|
282
|
+
};
|
|
283
|
+
},
|
|
246
284
|
...(options.omitDrainQueue
|
|
247
285
|
? {}
|
|
248
286
|
: {
|
|
@@ -491,6 +529,69 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
491
529
|
});
|
|
492
530
|
});
|
|
493
531
|
|
|
532
|
+
test("scopes allowed tools during the wake and restores before queued messages drain", async () => {
|
|
533
|
+
const target = makeTarget({
|
|
534
|
+
initialAllowedTools: new Set(["bash"]),
|
|
535
|
+
scriptedAssistant: {
|
|
536
|
+
role: "assistant",
|
|
537
|
+
content: [{ type: "text", text: "Saved." }],
|
|
538
|
+
},
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
const result = await wakeAgentForOpportunity(
|
|
542
|
+
{
|
|
543
|
+
conversationId: target.conversationId,
|
|
544
|
+
hint: "review for memories",
|
|
545
|
+
source: "memory-retrospective",
|
|
546
|
+
allowedTools: ["remember"],
|
|
547
|
+
},
|
|
548
|
+
{ resolveTarget: async () => target },
|
|
549
|
+
);
|
|
550
|
+
|
|
551
|
+
expect(result).toEqual({ invoked: true, producedToolCalls: false });
|
|
552
|
+
expect(target.runCalls[0]!.allowedTools).toEqual(["remember"]);
|
|
553
|
+
expect(target.allowedToolSnapshots).toEqual([["remember"], ["bash"]]);
|
|
554
|
+
|
|
555
|
+
const restoreIndex = target.callSequence.indexOf("tools:bash");
|
|
556
|
+
const processingFalseIndex =
|
|
557
|
+
target.callSequence.indexOf("processing:false");
|
|
558
|
+
const drainIndex = target.callSequence.indexOf("drain");
|
|
559
|
+
expect(restoreIndex).toBeGreaterThan(-1);
|
|
560
|
+
expect(restoreIndex).toBeLessThan(processingFalseIndex);
|
|
561
|
+
expect(processingFalseIndex).toBeLessThan(drainIndex);
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
test("restores allowed tools before drain when the wake is a silent no-op", async () => {
|
|
565
|
+
const target = makeTarget({
|
|
566
|
+
scriptedAssistant: {
|
|
567
|
+
role: "assistant",
|
|
568
|
+
content: [{ type: "text", text: "" }],
|
|
569
|
+
},
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
const result = await wakeAgentForOpportunity(
|
|
573
|
+
{
|
|
574
|
+
conversationId: target.conversationId,
|
|
575
|
+
hint: "review for memories",
|
|
576
|
+
source: "memory-retrospective",
|
|
577
|
+
allowedTools: ["remember"],
|
|
578
|
+
},
|
|
579
|
+
{ resolveTarget: async () => target },
|
|
580
|
+
);
|
|
581
|
+
|
|
582
|
+
expect(result).toEqual({ invoked: true, producedToolCalls: false });
|
|
583
|
+
expect(target.runCalls[0]!.allowedTools).toEqual(["remember"]);
|
|
584
|
+
expect(target.allowedToolSnapshots).toEqual([["remember"], undefined]);
|
|
585
|
+
|
|
586
|
+
const restoreIndex = target.callSequence.indexOf("tools:all");
|
|
587
|
+
const processingFalseIndex =
|
|
588
|
+
target.callSequence.indexOf("processing:false");
|
|
589
|
+
const drainIndex = target.callSequence.indexOf("drain");
|
|
590
|
+
expect(restoreIndex).toBeGreaterThan(-1);
|
|
591
|
+
expect(restoreIndex).toBeLessThan(processingFalseIndex);
|
|
592
|
+
expect(processingFalseIndex).toBeLessThan(drainIndex);
|
|
593
|
+
});
|
|
594
|
+
|
|
494
595
|
test("produces tool calls when LLM emits a tool_use block", async () => {
|
|
495
596
|
const assistantMessage: Message = {
|
|
496
597
|
role: "assistant",
|
|
@@ -605,9 +706,13 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
605
706
|
// hold the processing flag while agentLoop.run executes.
|
|
606
707
|
const observedDuringRun: boolean[] = [];
|
|
607
708
|
const originalRun = target.agentLoop.run;
|
|
608
|
-
target.agentLoop.run = async (
|
|
709
|
+
target.agentLoop.run = async (
|
|
710
|
+
input: Message[],
|
|
711
|
+
onEvent: (event: AgentEvent) => void | Promise<void>,
|
|
712
|
+
runOptions?: AgentLoopRunOptions,
|
|
713
|
+
) => {
|
|
609
714
|
observedDuringRun.push(target.isProcessing());
|
|
610
|
-
return originalRun(input, onEvent,
|
|
715
|
+
return originalRun(input, onEvent, runOptions);
|
|
611
716
|
};
|
|
612
717
|
|
|
613
718
|
await wakeAgentForOpportunity(
|
|
@@ -677,7 +782,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
677
782
|
agentLoop: {
|
|
678
783
|
run: async (input) => {
|
|
679
784
|
runCalls.push(callOrder++);
|
|
680
|
-
return [...input];
|
|
785
|
+
return runResult([...input]);
|
|
681
786
|
},
|
|
682
787
|
},
|
|
683
788
|
getMessages: () => history,
|
|
@@ -720,7 +825,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
720
825
|
const target: WakeTarget = {
|
|
721
826
|
conversationId: "conv-no-trust",
|
|
722
827
|
agentLoop: {
|
|
723
|
-
run: async (input) => [...input],
|
|
828
|
+
run: async (input) => runResult([...input]),
|
|
724
829
|
},
|
|
725
830
|
getMessages: () => history,
|
|
726
831
|
pushMessage: () => {},
|
|
@@ -772,7 +877,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
772
877
|
await gate2.promise;
|
|
773
878
|
}
|
|
774
879
|
runCompleteOrder.push(myIndex);
|
|
775
|
-
return input; // no assistant message → silent no-op
|
|
880
|
+
return runResult(input); // no assistant message → silent no-op
|
|
776
881
|
},
|
|
777
882
|
},
|
|
778
883
|
getMessages: () => history,
|
|
@@ -820,7 +925,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
820
925
|
const target: WakeTarget & { setProcessing: (v: boolean) => void } = {
|
|
821
926
|
conversationId: "conv-user-turn",
|
|
822
927
|
agentLoop: {
|
|
823
|
-
run: async (input) => input,
|
|
928
|
+
run: async (input) => runResult(input),
|
|
824
929
|
},
|
|
825
930
|
getMessages: () => history,
|
|
826
931
|
pushMessage: (msg) => {
|
|
@@ -886,7 +991,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
886
991
|
const history: Message[] = [];
|
|
887
992
|
const target: WakeTarget = {
|
|
888
993
|
conversationId: "conv-busy",
|
|
889
|
-
agentLoop: { run: async () => history },
|
|
994
|
+
agentLoop: { run: async () => runResult(history) },
|
|
890
995
|
getMessages: () => history,
|
|
891
996
|
pushMessage: () => {},
|
|
892
997
|
emitAgentEvent: () => {},
|
|
@@ -1296,7 +1401,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
1296
1401
|
const target: WakeTarget = {
|
|
1297
1402
|
conversationId: "conv-stream",
|
|
1298
1403
|
agentLoop: {
|
|
1299
|
-
run: async (_input, onEvent,
|
|
1404
|
+
run: async (_input, onEvent, runOptions) => {
|
|
1300
1405
|
// Preamble + assistant hint + postamble (mirrors what the
|
|
1301
1406
|
// wake injects). The agent-wake helper expects these three
|
|
1302
1407
|
// hint messages in the input it hands to run().
|
|
@@ -1311,7 +1416,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
1311
1416
|
message: turn1Assistant,
|
|
1312
1417
|
});
|
|
1313
1418
|
runHistory.push(turn1ToolResult);
|
|
1314
|
-
const dec1 = await onCheckpoint!({
|
|
1419
|
+
const dec1 = await runOptions!.onCheckpoint!({
|
|
1315
1420
|
turnIndex: 0,
|
|
1316
1421
|
toolCount: 1,
|
|
1317
1422
|
hasToolUse: true,
|
|
@@ -1328,7 +1433,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
1328
1433
|
message: turn2Assistant,
|
|
1329
1434
|
});
|
|
1330
1435
|
runHistory.push(turn2ToolResult);
|
|
1331
|
-
const dec2 = await onCheckpoint!({
|
|
1436
|
+
const dec2 = await runOptions!.onCheckpoint!({
|
|
1332
1437
|
turnIndex: 1,
|
|
1333
1438
|
toolCount: 1,
|
|
1334
1439
|
hasToolUse: true,
|
|
@@ -1345,7 +1450,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
1345
1450
|
type: "message_complete",
|
|
1346
1451
|
message: finalAssistant,
|
|
1347
1452
|
});
|
|
1348
|
-
return runHistory;
|
|
1453
|
+
return runResult(runHistory);
|
|
1349
1454
|
},
|
|
1350
1455
|
},
|
|
1351
1456
|
getMessages: () => history,
|
|
@@ -1432,17 +1537,17 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
1432
1537
|
const target: WakeTarget = {
|
|
1433
1538
|
conversationId: "conv-card",
|
|
1434
1539
|
agentLoop: {
|
|
1435
|
-
run: async (_input, _onEvent,
|
|
1540
|
+
run: async (_input, _onEvent, runOptions) => {
|
|
1436
1541
|
const runHistory: Message[] = [..._input];
|
|
1437
1542
|
runHistory.push(firstAssistant);
|
|
1438
1543
|
runHistory.push(toolResult);
|
|
1439
|
-
await onCheckpoint!({
|
|
1544
|
+
await runOptions!.onCheckpoint!({
|
|
1440
1545
|
turnIndex: 0,
|
|
1441
1546
|
toolCount: 1,
|
|
1442
1547
|
hasToolUse: true,
|
|
1443
1548
|
history: runHistory,
|
|
1444
1549
|
});
|
|
1445
|
-
return runHistory;
|
|
1550
|
+
return runResult(runHistory);
|
|
1446
1551
|
},
|
|
1447
1552
|
},
|
|
1448
1553
|
getMessages: () => history,
|
|
@@ -1627,7 +1732,7 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
1627
1732
|
let processing = false;
|
|
1628
1733
|
return {
|
|
1629
1734
|
conversationId,
|
|
1630
|
-
agentLoop: { run: async (input) => input },
|
|
1735
|
+
agentLoop: { run: async (input) => runResult(input) },
|
|
1631
1736
|
getMessages: () => history,
|
|
1632
1737
|
pushMessage: () => {},
|
|
1633
1738
|
emitAgentEvent: () => {},
|
|
@@ -1704,17 +1809,17 @@ describe("wakeAgentForOpportunity", () => {
|
|
|
1704
1809
|
const target: WakeTarget = {
|
|
1705
1810
|
conversationId: "conv-suppress-surface",
|
|
1706
1811
|
agentLoop: {
|
|
1707
|
-
run: async (_input, _onEvent,
|
|
1812
|
+
run: async (_input, _onEvent, runOptions) => {
|
|
1708
1813
|
const runHistory: Message[] = [..._input];
|
|
1709
1814
|
runHistory.push(firstAssistant);
|
|
1710
1815
|
runHistory.push(toolResult);
|
|
1711
|
-
await onCheckpoint!({
|
|
1816
|
+
await runOptions!.onCheckpoint!({
|
|
1712
1817
|
turnIndex: 0,
|
|
1713
1818
|
toolCount: 1,
|
|
1714
1819
|
hasToolUse: true,
|
|
1715
1820
|
history: runHistory,
|
|
1716
1821
|
});
|
|
1717
|
-
return runHistory;
|
|
1822
|
+
return runResult(runHistory);
|
|
1718
1823
|
},
|
|
1719
1824
|
},
|
|
1720
1825
|
getMessages: () => history,
|
|
@@ -46,7 +46,6 @@ mock.module("../../memory/conversation-crud.js", () => ({
|
|
|
46
46
|
let processMessageImpl: (
|
|
47
47
|
conversationId: string,
|
|
48
48
|
content: string,
|
|
49
|
-
attachmentIds: string[] | undefined,
|
|
50
49
|
options: Record<string, unknown> | undefined,
|
|
51
50
|
) => Promise<{ messageId: string }> = async () => ({ messageId: "msg-1" });
|
|
52
51
|
const processMessageCalls: Array<{
|
|
@@ -59,11 +58,10 @@ mock.module("../../daemon/process-message.js", () => ({
|
|
|
59
58
|
processMessage: async (
|
|
60
59
|
conversationId: string,
|
|
61
60
|
content: string,
|
|
62
|
-
attachmentIds: string[] | undefined,
|
|
63
61
|
options: Record<string, unknown> | undefined,
|
|
64
62
|
) => {
|
|
65
63
|
processMessageCalls.push({ conversationId, content, options });
|
|
66
|
-
return processMessageImpl(conversationId, content,
|
|
64
|
+
return processMessageImpl(conversationId, content, options);
|
|
67
65
|
},
|
|
68
66
|
}));
|
|
69
67
|
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
* trailing user message satisfies providers that reject assistant
|
|
15
15
|
* prefill. The bookend user messages are hardcoded strings with no
|
|
16
16
|
* dynamic content, so they cannot carry injection payloads.
|
|
17
|
-
* - Invokes the agent loop with all conversation tools available
|
|
17
|
+
* - Invokes the agent loop with all conversation tools available unless
|
|
18
|
+
* the caller provides an explicit `allowedTools` scope.
|
|
18
19
|
* - No tool calls AND no assistant text → silent no-op (nothing persisted,
|
|
19
20
|
* nothing emitted). Returns `{ invoked: true, producedToolCalls: false }`.
|
|
20
21
|
* - Tool calls produced → normal tool execution runs (the conversation's
|
|
@@ -164,6 +165,12 @@ export interface WakeTarget {
|
|
|
164
165
|
* `trustContext` through the wake.
|
|
165
166
|
*/
|
|
166
167
|
setTrustContext?(ctx: TrustContext): void;
|
|
168
|
+
/**
|
|
169
|
+
* Temporarily restrict the tools visible/executable during this wake.
|
|
170
|
+
* Returns a restore callback so the wake can release the scope before any
|
|
171
|
+
* queued user turn is drained.
|
|
172
|
+
*/
|
|
173
|
+
setWakeAllowedTools?(tools: ReadonlySet<string>): () => void;
|
|
167
174
|
}
|
|
168
175
|
|
|
169
176
|
export interface WakeOptions {
|
|
@@ -238,6 +245,12 @@ export interface WakeOptions {
|
|
|
238
245
|
* retrospectives whose conversation title already says "(Retrospective)").
|
|
239
246
|
*/
|
|
240
247
|
suppressWakeSurface?: boolean;
|
|
248
|
+
/**
|
|
249
|
+
* Optional exact tool allowlist for this wake. Used by internal maintenance
|
|
250
|
+
* jobs that need the assistant's judgment but must not execute arbitrary
|
|
251
|
+
* side-effect tools.
|
|
252
|
+
*/
|
|
253
|
+
allowedTools?: readonly string[];
|
|
241
254
|
}
|
|
242
255
|
|
|
243
256
|
/**
|
|
@@ -834,11 +847,55 @@ export async function wakeAgentForOpportunity(
|
|
|
834
847
|
overrideProfile,
|
|
835
848
|
});
|
|
836
849
|
|
|
850
|
+
let wakeToolScopeRestored = false;
|
|
851
|
+
let restoreWakeToolScope: (() => void) | null = null;
|
|
852
|
+
const restoreWakeAllowedTools = (): void => {
|
|
853
|
+
if (wakeToolScopeRestored) return;
|
|
854
|
+
wakeToolScopeRestored = true;
|
|
855
|
+
if (!restoreWakeToolScope) return;
|
|
856
|
+
try {
|
|
857
|
+
restoreWakeToolScope();
|
|
858
|
+
} catch (err) {
|
|
859
|
+
log.warn(
|
|
860
|
+
{ conversationId, source, err },
|
|
861
|
+
"agent-wake: failed to restore tool allowlist; continuing",
|
|
862
|
+
);
|
|
863
|
+
}
|
|
864
|
+
};
|
|
865
|
+
const applyWakeAllowedTools = (): boolean => {
|
|
866
|
+
if (!opts.allowedTools) return true;
|
|
867
|
+
if (!target.setWakeAllowedTools) {
|
|
868
|
+
log.warn(
|
|
869
|
+
{ conversationId, source, allowedTools: opts.allowedTools },
|
|
870
|
+
"agent-wake: target cannot apply requested tool allowlist; skipping",
|
|
871
|
+
);
|
|
872
|
+
return false;
|
|
873
|
+
}
|
|
874
|
+
try {
|
|
875
|
+
restoreWakeToolScope = target.setWakeAllowedTools(
|
|
876
|
+
new Set(opts.allowedTools),
|
|
877
|
+
);
|
|
878
|
+
return true;
|
|
879
|
+
} catch (err) {
|
|
880
|
+
log.warn(
|
|
881
|
+
{ conversationId, source, allowedTools: opts.allowedTools, err },
|
|
882
|
+
"agent-wake: failed to apply requested tool allowlist; skipping",
|
|
883
|
+
);
|
|
884
|
+
return false;
|
|
885
|
+
}
|
|
886
|
+
};
|
|
887
|
+
|
|
837
888
|
// Mark processing for the duration of the run so a concurrent user
|
|
838
889
|
// send is queued by `enqueueMessage()` rather than spawning a second
|
|
839
890
|
// concurrent agent loop on the same conversation (which would
|
|
840
|
-
// interleave writes to `conversation.messages`).
|
|
841
|
-
|
|
891
|
+
// interleave writes to `conversation.messages`). This happens before
|
|
892
|
+
// applying a wake-scoped tool allowlist so a concurrent user turn cannot
|
|
893
|
+
// start under the wake's restricted tool set.
|
|
894
|
+
try {
|
|
895
|
+
target.markProcessing(true);
|
|
896
|
+
} catch (err) {
|
|
897
|
+
throw err;
|
|
898
|
+
}
|
|
842
899
|
|
|
843
900
|
// Fires after each tool-execution turn finalizes (assistant message
|
|
844
901
|
// + matching tool_result user message both in history). A single
|
|
@@ -860,25 +917,41 @@ export async function wakeAgentForOpportunity(
|
|
|
860
917
|
let tailMessageCount = 0;
|
|
861
918
|
let drainedInTry = false;
|
|
862
919
|
try {
|
|
920
|
+
if (!applyWakeAllowedTools()) {
|
|
921
|
+
return {
|
|
922
|
+
invoked: false,
|
|
923
|
+
producedToolCalls: false,
|
|
924
|
+
reason: "no_resolver" as const,
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
|
|
863
928
|
let updatedHistory: Message[];
|
|
864
929
|
try {
|
|
865
|
-
updatedHistory = await target.agentLoop.run(
|
|
930
|
+
({ history: updatedHistory } = await target.agentLoop.run(
|
|
866
931
|
runInput,
|
|
867
932
|
onEvent,
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
933
|
+
{
|
|
934
|
+
requestId: `wake:${source}`,
|
|
935
|
+
onCheckpoint,
|
|
936
|
+
// Route through the caller-supplied call site (defaults to
|
|
937
|
+
// `mainAgent` so a normal user-turn wake shares the user's chat
|
|
938
|
+
// selection). Without an explicit callSite, the resolver in
|
|
939
|
+
// `RetryProvider` and the routing in `CallSiteRoutingProvider`
|
|
940
|
+
// short-circuit and silently drop both per-callsite config and the
|
|
941
|
+
// pinned `overrideProfile` below.
|
|
942
|
+
callSite,
|
|
943
|
+
turnContext: wakeTurnContext,
|
|
944
|
+
overrideProfile,
|
|
945
|
+
// Wake runs have no orchestrator-side mid-loop compaction path,
|
|
946
|
+
// so the budget gate stays disabled (`overflowRecovery.enabled =
|
|
947
|
+
// false`); `maxInputTokens` is still supplied for tool-result
|
|
948
|
+
// truncation.
|
|
949
|
+
resolveContextWindow: () => ({
|
|
950
|
+
maxInputTokens: effectiveContextWindow.maxInputTokens,
|
|
951
|
+
overflowRecovery: { enabled: false, safetyMarginRatio: 0 },
|
|
952
|
+
}),
|
|
953
|
+
},
|
|
954
|
+
));
|
|
882
955
|
} catch (err) {
|
|
883
956
|
// Capture the error for post-finally logging, then short-circuit
|
|
884
957
|
// the rest of the try body — no tail to push/persist when the
|
|
@@ -935,6 +1008,7 @@ export async function wakeAgentForOpportunity(
|
|
|
935
1008
|
// accepts entries while processing === true, and drain expects
|
|
936
1009
|
// processing to already be false). The finally block handles the
|
|
937
1010
|
// error/early-return paths where no tail was produced.
|
|
1011
|
+
restoreWakeAllowedTools();
|
|
938
1012
|
try {
|
|
939
1013
|
target.markProcessing(false);
|
|
940
1014
|
} catch (err) {
|
|
@@ -963,6 +1037,7 @@ export async function wakeAgentForOpportunity(
|
|
|
963
1037
|
// exit the try body before reaching the drain block, so
|
|
964
1038
|
// `drainedInTry` is still false.
|
|
965
1039
|
if (!drainedInTry) {
|
|
1040
|
+
restoreWakeAllowedTools();
|
|
966
1041
|
try {
|
|
967
1042
|
target.markProcessing(false);
|
|
968
1043
|
} catch (err) {
|
|
@@ -43,6 +43,7 @@ import { appendEventToStream } from "../signals/event-stream.js";
|
|
|
43
43
|
import { getLogger } from "../util/logger.js";
|
|
44
44
|
import type { AssistantEvent } from "./assistant-event.js";
|
|
45
45
|
import { buildAssistantEvent } from "./assistant-event.js";
|
|
46
|
+
import { stampAndBuffer } from "./conversation-stream-state.js";
|
|
46
47
|
|
|
47
48
|
const log = getLogger("assistant-event-hub");
|
|
48
49
|
|
|
@@ -604,6 +605,7 @@ export function broadcastMessage(
|
|
|
604
605
|
excludeClientId,
|
|
605
606
|
}
|
|
606
607
|
: undefined;
|
|
608
|
+
stampAndBuffer(event, { targeting: publishOptions });
|
|
607
609
|
_hubChain = _hubChain
|
|
608
610
|
.then(() => assistantEventHub.publish(event, publishOptions))
|
|
609
611
|
.then(() => {
|
|
@@ -658,7 +660,6 @@ function resolveCanonicalRequestSourceType(
|
|
|
658
660
|
return "channel";
|
|
659
661
|
}
|
|
660
662
|
|
|
661
|
-
|
|
662
663
|
/**
|
|
663
664
|
* Lazily load heavy dependencies and create a canonical guardian request +
|
|
664
665
|
* bridge for a confirmation_request message. Called fire-and-forget from
|
|
@@ -732,4 +733,3 @@ async function createCanonicalRequestForConfirmation(
|
|
|
732
733
|
);
|
|
733
734
|
}
|
|
734
735
|
}
|
|
735
|
-
|