@vellumai/assistant 0.12.2 → 0.12.3-staging.2
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/.env.example +2 -0
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +43 -29
- package/Dockerfile +63 -0
- package/docs/architecture/integrations.md +7 -0
- package/docs/architecture/memory.md +17 -2
- package/docs/architecture/security.md +10 -5
- package/docs/architecture/turn-actor.md +2 -0
- package/docs/credential-execution-service.md +1 -1
- package/docs/desktop-browser-cli.md +50 -5
- package/docs/live-voice-task-outcomes.md +100 -0
- package/docs/mode-sessions.md +183 -0
- package/docs/voice-input-diagnostics.md +58 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
- package/node_modules/@vellumai/environments/src/shell.test.ts +21 -0
- package/node_modules/@vellumai/environments/src/shell.ts +24 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +2 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +20 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -2
- package/node_modules/@vellumai/gateway-client/src/index.ts +4 -1
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +38 -7
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +5 -6
- package/node_modules/@vellumai/service-contracts/package.json +2 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
- package/node_modules/@vellumai/slack-text/src/index.ts +4 -8
- package/openapi.yaml +716 -16
- package/package.json +1 -1
- package/scripts/smoke-desktop-browser-cli.ts +11 -26
- package/scripts/smoke-desktop-window-theme.ts +2 -3
- package/scripts/sync-llm-catalog.ts +3 -0
- package/scripts/voice-ttft-spike.ts +2 -2
- package/src/__tests__/agent-loop-output-hooks.test.ts +150 -1
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +87 -19
- package/src/__tests__/agent-loop.test.ts +259 -0
- package/src/__tests__/agent-wake-delegation-prompt.test.ts +64 -2
- package/src/__tests__/annotate-activity-metadata.test.ts +3 -1
- package/src/__tests__/annotate-risk-options.test.ts +2 -0
- package/src/__tests__/answered-question-persistence.test.ts +2 -0
- package/src/__tests__/anthropic-gateway-shared.test.ts +22 -0
- package/src/__tests__/anthropic-provider.test.ts +55 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +40 -0
- package/src/__tests__/approval-message-composer.test.ts +1 -118
- package/src/__tests__/approval-routes-http.test.ts +3 -0
- package/src/__tests__/assistant-event-hub-connection-history.test.ts +111 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +50 -0
- package/src/__tests__/assistant-event-targeting.test.ts +186 -0
- package/src/__tests__/assistant-stream-state.test.ts +29 -9
- package/src/__tests__/attachments-store.test.ts +22 -3
- package/src/__tests__/browser-fill-credential.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +4 -1
- package/src/__tests__/build-persisted-content.test.ts +1 -1
- package/src/__tests__/call-conversation-messages.test.ts +5 -0
- package/src/__tests__/call-recovery.test.ts +7 -2
- package/src/__tests__/call-routes-http.test.ts +12 -0
- package/src/__tests__/call-store.test.ts +7 -2
- package/src/__tests__/channel-approval.test.ts +9 -14
- package/src/__tests__/channel-reply-delivery.test.ts +56 -0
- package/src/__tests__/channel-retry-sweep.test.ts +9 -0
- package/src/__tests__/chat-credential-redaction.test.ts +23 -0
- package/src/__tests__/chat-reveal-guard-priming.test.ts +2 -0
- package/src/__tests__/checker.test.ts +11 -3
- package/src/__tests__/client-os-metadata-persistence.test.ts +35 -1
- package/src/__tests__/computer-use-screenshot-attachments.test.ts +411 -0
- package/src/__tests__/computer-use-screenshot-selection.test.ts +50 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +0 -25
- package/src/__tests__/computer-use-tools.test.ts +1 -233
- package/src/__tests__/config-model-image-provider.test.ts +39 -0
- package/src/__tests__/config-schema.test.ts +16 -0
- package/src/__tests__/config-watcher.test.ts +24 -0
- package/src/__tests__/context-search-agent-runner.test.ts +260 -1
- package/src/__tests__/context-search-fanout.test.ts +1 -1
- package/src/__tests__/context-search-types.test.ts +7 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +8 -2
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop.test.ts +797 -16
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +53 -1
- package/src/__tests__/conversation-attachments.test.ts +106 -0
- package/src/__tests__/conversation-evictor.test.ts +62 -37
- package/src/__tests__/conversation-fork-crud.test.ts +191 -0
- package/src/__tests__/conversation-history-boundary-repair-failure.test.ts +174 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +2 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +2 -0
- package/src/__tests__/conversation-rendered-delegation-state.test.ts +276 -0
- package/src/__tests__/conversation-retry-route.test.ts +22 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +2 -0
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +2 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +10 -0
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +2 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -0
- package/src/__tests__/conversation-surface-snapshots.test.ts +543 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +151 -0
- package/src/__tests__/conversation-surfaces-point-at-budget.test.ts +63 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +23 -0
- package/src/__tests__/conversation-undo.test.ts +61 -0
- package/src/__tests__/credential-execution-client.test.ts +72 -55
- package/src/__tests__/credential-prompt-route.test.ts +35 -3
- package/src/__tests__/cu-unified-flow.test.ts +82 -1
- package/src/__tests__/db-conversation-tool-surface.test.ts +221 -0
- package/src/__tests__/db-mode-sessions-migration.test.ts +175 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -0
- package/src/__tests__/dm-backfill.test.ts +91 -1
- package/src/__tests__/document-create-route.test.ts +88 -0
- package/src/__tests__/document-sync-tags.test.ts +27 -0
- package/src/__tests__/emit-signal-routing-intent.test.ts +142 -2
- package/src/__tests__/events-tail-route.test.ts +58 -0
- package/src/__tests__/evict-conversations-for-reload.test.ts +57 -8
- package/src/__tests__/guardian-action-sweep.test.ts +16 -0
- package/src/__tests__/guardian-dispatch.test.ts +13 -0
- package/src/__tests__/headless-browser-interactions.test.ts +64 -20
- package/src/__tests__/heartbeat-service.test.ts +2 -59
- package/src/__tests__/helpers/mock-conversation.ts +21 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +2 -0
- package/src/__tests__/helpers/verification-sessions-ipc-sim.ts +5 -0
- package/src/__tests__/history-repair.test.ts +53 -0
- package/src/__tests__/host-cu-proxy.test.ts +46 -2
- package/src/__tests__/http-user-message-parity.test.ts +2 -0
- package/src/__tests__/image-credentials.test.ts +49 -0
- package/src/__tests__/image-service-dispatcher.test.ts +45 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +26 -0
- package/src/__tests__/interrupt-on-send.test.ts +57 -43
- package/src/__tests__/interrupt-turn-note.test.ts +5 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +85 -1
- package/src/__tests__/llm-catalog-parity.test.ts +27 -4
- package/src/__tests__/media-generate-image.test.ts +49 -1
- package/src/__tests__/message-provenance-contact-id.test.ts +69 -0
- package/src/__tests__/migration-export-to-gcs.test.ts +142 -0
- package/src/__tests__/mode-session-history.test.ts +245 -0
- package/src/__tests__/mode-session-recovery.test.ts +222 -0
- package/src/__tests__/mode-session-wire.test.ts +141 -0
- package/src/__tests__/notification-guardian-path.test.ts +7 -0
- package/src/__tests__/notification-telegram-adapter.test.ts +2 -2
- package/src/__tests__/notification-vellum-adapter.test.ts +34 -0
- package/src/__tests__/oauth-apps-routes.test.ts +1 -0
- package/src/__tests__/oauth-commands-routes.test.ts +114 -101
- package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +13 -0
- package/src/__tests__/oauth-providers-routes.test.ts +3 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/persist-media-references.test.ts +50 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -0
- package/src/__tests__/plugin-api-provider.test.ts +5 -0
- package/src/__tests__/plugin-api-resolve-credential.test.ts +97 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +9 -1
- package/src/__tests__/process-message-display-content.test.ts +56 -0
- package/src/__tests__/reaction-persistence.test.ts +5 -0
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +25 -9
- package/src/__tests__/run-conversation-turn-persistence.test.ts +138 -1
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +20 -0
- package/src/__tests__/scheduler-result-notification.test.ts +23 -4
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/scripted-turn-metadata-persistence.test.ts +73 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +86 -31
- package/src/__tests__/secret-routes-scrub.test.ts +22 -27
- package/src/__tests__/secret-scanner.test.ts +20 -0
- package/src/__tests__/secure-keys-managed-failover.test.ts +8 -0
- package/src/__tests__/secure-keys.test.ts +50 -4
- package/src/__tests__/send-endpoint-busy.test.ts +163 -1
- package/src/__tests__/server-history-render.test.ts +91 -1
- package/src/__tests__/server-tool-pairing.test.ts +107 -0
- package/src/__tests__/settings-routes.test.ts +50 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +32 -0
- package/src/__tests__/skills.test.ts +5 -4
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -2
- package/src/__tests__/subagent-manager-notify.test.ts +1 -2
- package/src/__tests__/subagent-notify-parent.test.ts +146 -39
- package/src/__tests__/subagent-notify-stale-rebuild.test.ts +2 -4
- package/src/__tests__/subagent-tool-gate-mode.test.ts +226 -0
- package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +2 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/thread-backfill.test.ts +53 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +2 -0
- package/src/__tests__/tool-result-follow-up.test.ts +99 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +66 -1
- package/src/__tests__/tool-start-timestamp.test.ts +2 -0
- package/src/__tests__/twilio-routes.test.ts +1 -0
- package/src/__tests__/unicode.test.ts +36 -0
- package/src/__tests__/web-search-backend-failure.test.ts +1 -1
- package/src/activation/progress-store.test.ts +12 -7
- package/src/agent/loop.ts +136 -53
- package/src/agent/tool-result-follow-up.ts +70 -0
- package/src/api/attachment-provenance.test.ts +68 -0
- package/src/api/computer-use-tool.test.ts +55 -0
- package/src/api/computer-use-tool.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +3 -0
- package/src/api/events/assistant-turn-start.ts +3 -0
- package/src/api/events/desktop-activity-changed.ts +10 -0
- package/src/api/events/generation-handoff.ts +2 -0
- package/src/api/events/message-complete.ts +2 -0
- package/src/api/events/notification-conversation-created.ts +14 -16
- package/src/api/events/notification-intent.ts +4 -2
- package/src/api/events/question-request.ts +1 -0
- package/src/api/events/tool-result.ts +85 -0
- package/src/api/events/tool-use-start.ts +3 -0
- package/src/api/events/user-message-echo.ts +3 -0
- package/src/api/index.ts +42 -6
- package/src/api/mode-session.test.ts +131 -0
- package/src/api/mode-session.ts +148 -0
- package/src/api/remember-tool.ts +15 -0
- package/src/api/responses/conversation-message.ts +9 -0
- package/src/approvals/AGENTS.md +4 -2
- package/src/approvals/approval-primitive.ts +5 -2
- package/src/approvals/scoped-approval-grants.ts +6 -2
- package/src/browser/__tests__/operations.test.ts +29 -0
- package/src/browser/operation-meta.ts +2 -1
- package/src/browser/operations.ts +29 -0
- package/src/browser/virtual-desktop-target.ts +2 -9
- package/src/bundler/bundle-signer.ts +1 -3
- package/src/calls/__tests__/barge-in-guard.test.ts +3 -0
- package/src/calls/__tests__/call-controller.test.ts +94 -0
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +204 -0
- package/src/calls/__tests__/voice-control-protocol.test.ts +15 -0
- package/src/calls/__tests__/voice-escalation-judge.test.ts +209 -0
- package/src/calls/__tests__/voice-leg-coordinator.test.ts +168 -0
- package/src/{live-voice/__tests__/live-voice-metrics.test.ts → calls/__tests__/voice-metrics.test.ts} +32 -38
- package/src/calls/__tests__/voice-session-bridge.test.ts +576 -122
- package/src/calls/barge-in-guard.ts +5 -0
- package/src/calls/call-controller.ts +196 -1
- package/src/calls/call-domain.ts +4 -0
- package/src/calls/call-store.ts +87 -2
- package/src/calls/guardian-action-sweep.ts +22 -8
- package/src/calls/media-stream-audio-transcode.ts +1 -3
- package/src/calls/typesafe-noul.ts +156 -0
- package/src/calls/voice-control-protocol.ts +6 -0
- package/src/calls/voice-escalation-judge.ts +145 -0
- package/src/calls/voice-escalation-target.ts +10 -0
- package/src/calls/voice-leg-coordinator.ts +121 -3
- package/src/{live-voice/live-voice-metrics.ts → calls/voice-metrics.ts} +94 -87
- package/src/calls/voice-session-bridge.ts +256 -112
- package/src/calls/voice-triage-escalate.ts +7 -0
- package/src/cli/__tests__/roadmap-cli.test.ts +4 -41
- package/src/cli/commands/__tests__/cli-test-harness.ts +21 -3
- package/src/cli/commands/__tests__/notifications.test.ts +35 -10
- package/src/cli/commands/__tests__/plugins.test.ts +20 -1
- package/src/cli/commands/__tests__/schedules.test.ts +14 -0
- package/src/cli/commands/bash.help.ts +4 -3
- package/src/cli/commands/browser.help.ts +9 -6
- package/src/cli/commands/browser.ts +0 -1
- package/src/cli/commands/clients.help.ts +46 -0
- package/src/cli/commands/clients.ts +116 -0
- package/src/cli/commands/credentials.help.ts +9 -4
- package/src/cli/commands/notifications.help.ts +16 -2
- package/src/cli/commands/notifications.ts +30 -8
- package/src/cli/commands/oauth/index.help.ts +10 -0
- package/src/cli/commands/oauth/providers.ts +12 -0
- package/src/cli/commands/oauth/request.test.ts +179 -2
- package/src/cli/commands/oauth/request.ts +41 -10
- package/src/cli/commands/plugins.ts +12 -5
- package/src/cli/commands/roadmap.help.ts +18 -21
- package/src/cli/commands/roadmap.ts +4 -21
- package/src/cli/commands/schedules.ts +2 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +5 -2
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +133 -51
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +8 -2
- package/src/cli/lib/bundled-marketplace.json +906 -1
- package/src/cli/lib/bundled-plugin-packages.json +783 -1
- package/src/cli/lib/inspect-plugin.ts +11 -4
- package/src/cli/lib/plugin-marketplace.ts +8 -0
- package/src/cli/lib/publish-plugin.ts +1 -2
- package/src/cli/lib/upgrade-plugin.ts +19 -11
- package/src/cli/output.ts +18 -4
- package/src/config/__tests__/default-provider.test.ts +6 -0
- package/src/config/__tests__/memory-retrospective-schema.test.ts +14 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +1 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +89 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +17 -2
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +7 -11
- package/src/config/bundled-skills/schedule/SKILL.md +6 -6
- package/src/config/bundled-skills/sequences/TOOLS.json +1 -5
- package/src/config/call-site-defaults.ts +9 -0
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/loader.ts +9 -17
- package/src/config/platform-identity.ts +8 -8
- package/src/config/profile-text-generation.test.ts +51 -0
- package/src/config/profile-text-generation.ts +51 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +12 -0
- package/src/config/schemas/__tests__/tools.test.ts +31 -0
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/channels.ts +0 -18
- package/src/config/schemas/llm.ts +9 -2
- package/src/config/schemas/mcp.ts +6 -1
- package/src/config/schemas/memory-retrospective.ts +11 -2
- package/src/config/schemas/memory-v3.ts +12 -0
- package/src/config/schemas/services.ts +15 -6
- package/src/config/schemas/tools.ts +10 -0
- package/src/config/session-groups-gate.ts +21 -0
- package/src/config/skills.ts +2 -6
- package/src/conversations/__tests__/message-consolidation.test.ts +149 -0
- package/src/conversations/message-consolidation.ts +102 -5
- package/src/credential-execution/ces-connect.test.ts +69 -0
- package/src/credential-execution/ces-connect.ts +115 -0
- package/src/credential-execution/ces-runtime.ts +55 -93
- package/src/credential-execution/executable-discovery.ts +34 -142
- package/src/credential-execution/process-manager.test.ts +20 -24
- package/src/credential-execution/process-manager.ts +24 -19
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +10 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +43 -0
- package/src/daemon/__tests__/inference-profile-notification.test.ts +2 -0
- package/src/daemon/__tests__/turn-tail-deleted-conversation.test.ts +36 -0
- package/src/daemon/assistant-attachments.ts +20 -12
- package/src/daemon/browser-mode-session.test.ts +402 -0
- package/src/daemon/browser-mode-session.ts +186 -0
- package/src/daemon/chat-credential-redaction.ts +16 -1
- package/src/daemon/computer-use-mode-session.test.ts +210 -0
- package/src/daemon/computer-use-mode-session.ts +105 -0
- package/src/daemon/config-watcher.ts +10 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +132 -13
- package/src/daemon/conversation-agent-loop.ts +231 -25
- package/src/daemon/conversation-attachments.ts +93 -12
- package/src/daemon/conversation-evictor.ts +5 -24
- package/src/daemon/conversation-history.ts +10 -0
- package/src/daemon/conversation-interrupt-repair.ts +4 -43
- package/src/daemon/conversation-interrupt.ts +7 -11
- package/src/daemon/conversation-messaging.ts +58 -5
- package/src/daemon/conversation-mode-session.test.ts +1667 -0
- package/src/daemon/conversation-mode-session.ts +1008 -0
- package/src/daemon/conversation-process.ts +5 -0
- package/src/daemon/conversation-runtime-assembly.ts +10 -20
- package/src/daemon/conversation-skill-tools.ts +1 -0
- package/src/daemon/conversation-store.ts +4 -4
- package/src/daemon/conversation-surface-snapshots.ts +135 -0
- package/src/daemon/conversation-surfaces.ts +113 -5
- package/src/daemon/conversation-tool-setup.ts +79 -6
- package/src/daemon/conversation-turn-finalize.ts +26 -13
- package/src/daemon/conversation.ts +215 -58
- package/src/daemon/daemon-control.ts +3 -7
- package/src/daemon/handlers/config-model.ts +7 -5
- package/src/daemon/handlers/shared.ts +55 -16
- package/src/daemon/host-cu-proxy.ts +51 -22
- package/src/daemon/lifecycle.ts +30 -13
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/message-protocol.ts +0 -1
- package/src/daemon/message-provenance.ts +28 -4
- package/src/daemon/message-types/shared.ts +1 -0
- package/src/daemon/mode-session-startup-recovery.ts +23 -0
- package/src/daemon/mode-session-tracking.ts +54 -0
- package/src/daemon/orphan-reaper.ts +4 -3
- package/src/daemon/persist-media-references.ts +20 -3
- package/src/daemon/process-message.ts +13 -4
- package/src/daemon/tool-setup-types.ts +6 -0
- package/src/daemon/virtual-desktop-context.ts +21 -0
- package/src/daemon/wake-conversation-ops.ts +50 -15
- package/src/desktop/__tests__/fake-desktop.ts +1 -0
- package/src/desktop/desktop-accessibility-script.ts +88 -0
- package/src/desktop/desktop-accessibility.test.ts +160 -0
- package/src/desktop/desktop-accessibility.ts +169 -0
- package/src/desktop/desktop-automation-lease.test.ts +302 -64
- package/src/desktop/desktop-automation-lease.ts +129 -54
- package/src/desktop/desktop-browser-endpoint.ts +4 -0
- package/src/desktop/desktop-computer-use-routing.test.ts +330 -0
- package/src/desktop/desktop-computer-use.test.ts +449 -0
- package/src/desktop/desktop-computer-use.ts +502 -0
- package/src/desktop/desktop-dependencies.ts +47 -293
- package/src/desktop/desktop-display.ts +2 -2
- package/src/desktop/desktop-help.ts +15 -0
- package/src/desktop/desktop-panel-config.test.ts +13 -3
- package/src/desktop/desktop-panel-config.ts +109 -15
- package/src/desktop/desktop-session-manager.test.ts +69 -21
- package/src/desktop/desktop-session-manager.ts +76 -22
- package/src/desktop/desktop-stream-bridge.test.ts +76 -132
- package/src/desktop/desktop-stream-bridge.ts +9 -11
- package/src/desktop/desktop-wallpaper-renderer.ts +132 -0
- package/src/desktop/desktop-wallpaper-worker.ts +17 -0
- package/src/desktop/desktop-wallpaper.test.ts +48 -7
- package/src/desktop/desktop-wallpaper.ts +34 -102
- package/src/desktop/desktop-window-theme.ts +5 -25
- package/src/desktop/virtual-desktop-feature.ts +53 -3
- package/src/desktop/virtual-desktop-platform.test.ts +5 -9
- package/src/documents/document-store.ts +23 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +22 -26
- package/src/heartbeat/heartbeat-service.ts +5 -33
- package/src/ipc/__tests__/browser-ipc.test.ts +215 -6
- package/src/ipc/assistant-server.ts +2 -0
- package/src/ipc/routes/__tests__/channel-reply-ipc-routes.test.ts +111 -0
- package/src/ipc/routes/channel-reply-ipc-routes.ts +73 -0
- package/src/live-voice/__tests__/continuation-judge.test.ts +151 -0
- package/src/live-voice/__tests__/live-activity-reporter.test.ts +154 -15
- package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +743 -31
- package/src/live-voice/__tests__/live-voice-look-follow-up.test.ts +191 -10
- package/src/live-voice/__tests__/live-voice-session-groups-gate.test.ts +87 -0
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +5 -1
- package/src/live-voice/__tests__/live-voice-sight-frame-echo.test.ts +41 -0
- package/src/live-voice/__tests__/live-voice-sight-frame.test.ts +1017 -9
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +224 -1
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +101 -0
- package/src/live-voice/__tests__/live-voice-tts.test.ts +44 -0
- package/src/live-voice/__tests__/live-voice-vad.test.ts +939 -75
- package/src/live-voice/__tests__/microphone-idle-gate.test.ts +87 -0
- package/src/live-voice/__tests__/session-controls.test.ts +23 -0
- package/src/live-voice/__tests__/task-outcomes.test.ts +117 -0
- package/src/live-voice/__tests__/voice-input-diagnostics.test.ts +117 -0
- package/src/live-voice/camera-mode-session.test.ts +265 -0
- package/src/live-voice/camera-mode-session.ts +277 -0
- package/src/live-voice/continuation-judge.ts +123 -0
- package/src/live-voice/live-activity-reporter.ts +115 -6
- package/src/live-voice/live-voice-manager.ts +36 -1
- package/src/live-voice/live-voice-photo.ts +88 -7
- package/src/live-voice/live-voice-session-manager.ts +15 -0
- package/src/live-voice/live-voice-session.ts +1443 -747
- package/src/live-voice/live-voice-tts.ts +22 -4
- package/src/live-voice/microphone-idle-gate.ts +56 -0
- package/src/live-voice/protocol.ts +171 -4
- package/src/live-voice/session-controls.ts +11 -3
- package/src/live-voice/task-outcomes.ts +131 -0
- package/src/live-voice/voice-input-diagnostics.ts +117 -0
- package/src/mcp/__tests__/manager-tool-caps.test.ts +156 -0
- package/src/mcp/__tests__/startup.test.ts +30 -7
- package/src/mcp/__tests__/tool-caps.test.ts +134 -0
- package/src/mcp/manager.ts +171 -101
- package/src/mcp/startup.ts +33 -13
- package/src/mcp/tool-caps.ts +184 -0
- package/src/media/__tests__/image-models.test.ts +58 -0
- package/src/media/image-credentials.ts +5 -0
- package/src/media/image-models.ts +52 -0
- package/src/media/image-service.ts +8 -0
- package/src/media/openrouter-image-service.test.ts +133 -0
- package/src/media/openrouter-image-service.ts +153 -0
- package/src/media/types.ts +1 -1
- package/src/messaging/provider-message-metadata.ts +3 -3
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +65 -11
- package/src/messaging/providers/discord/send.ts +4 -17
- package/src/messaging/providers/discord/transport.ts +2 -2
- package/src/messaging/providers/outlook/client.ts +16 -22
- package/src/messaging/providers/telegram-bot/send.test.ts +236 -1
- package/src/messaging/providers/telegram-bot/send.ts +10 -7
- package/src/messaging/providers/telegram-bot/transport.ts +3 -10
- package/src/messaging/providers/whatsapp/send.test.ts +169 -4
- package/src/monitoring/__tests__/control.test.ts +17 -5
- package/src/monitoring/control.ts +15 -5
- package/src/notifications/AGENTS.md +1 -1
- package/src/notifications/README.md +83 -99
- package/src/notifications/__tests__/broadcaster.test.ts +1 -1
- package/src/notifications/__tests__/channel-allowlist.test.ts +39 -0
- package/src/notifications/__tests__/copy-composer.test.ts +71 -1
- package/src/notifications/__tests__/decision-engine.test.ts +79 -2
- package/src/notifications/__tests__/deterministic-checks.test.ts +10 -10
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +93 -4
- package/src/notifications/__tests__/notification-utils.test.ts +18 -0
- package/src/notifications/adapters/macos.ts +37 -46
- package/src/notifications/broadcaster.ts +5 -6
- package/src/notifications/channel-allowlist.ts +44 -0
- package/src/notifications/copy-composer.ts +11 -26
- package/src/notifications/decision-engine.ts +24 -14
- package/src/notifications/deterministic-checks.ts +1 -1
- package/src/notifications/emit-signal.ts +123 -37
- package/src/notifications/home-feed-side-effect.ts +9 -7
- package/src/notifications/notification-utils.ts +19 -0
- package/src/notifications/schedule-result-producer.ts +4 -6
- package/src/notifications/signal.ts +4 -19
- package/src/notifications/types.ts +15 -0
- package/src/oauth/AGENTS.md +2 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +36 -1
- package/src/oauth/connection-resolver.ts +1 -2
- package/src/oauth/identity-verifier.ts +24 -0
- package/src/oauth/oauth-store.ts +12 -4
- package/src/oauth/provider-serializer.ts +8 -0
- package/src/oauth/seed-providers.ts +42 -0
- package/src/onboarding/onboarding-events-store.ts +99 -12
- package/src/permissions/confirmation-guardian-request.test.ts +16 -0
- package/src/permissions/confirmation-guardian-request.ts +2 -3
- package/src/permissions/question-prompter.test.ts +31 -0
- package/src/permissions/question-prompter.ts +2 -0
- package/src/persistence/__tests__/client-connection-events-store.test.ts +322 -0
- package/src/persistence/attachments-store.ts +84 -44
- package/src/persistence/client-connection-events-store.ts +377 -0
- package/src/persistence/conversation-crud.ts +166 -26
- package/src/persistence/conversation-mode-sessions.test.ts +424 -0
- package/src/persistence/conversation-mode-sessions.ts +460 -0
- package/src/persistence/conversation-plugin-facade.ts +30 -0
- package/src/persistence/conversation-queries.ts +6 -19
- package/src/persistence/conversation-tool-surface.ts +135 -0
- package/src/persistence/conversation-types.test.ts +32 -0
- package/src/persistence/conversation-types.ts +26 -4
- package/src/persistence/llm-usage-store.ts +3 -9
- package/src/persistence/message-metadata.ts +25 -0
- package/src/persistence/migrations/378-create-conversation-tool-surfaces.test.ts +78 -0
- package/src/persistence/migrations/378-create-conversation-tool-surfaces.ts +29 -0
- package/src/persistence/migrations/379-oauth-providers-response-ok-field.test.ts +92 -0
- package/src/persistence/migrations/379-oauth-providers-response-ok-field.ts +32 -0
- package/src/persistence/migrations/380-conversation-tool-surfaces-delegate-independent-tasks.test.ts +90 -0
- package/src/persistence/migrations/380-conversation-tool-surfaces-delegate-independent-tasks.ts +34 -0
- package/src/persistence/migrations/381-create-conversation-mode-sessions.ts +41 -0
- package/src/persistence/migrations/382-create-client-connection-events.ts +40 -0
- package/src/persistence/migrations/__tests__/382-create-client-connection-events.test.ts +56 -0
- package/src/persistence/schema/conversation-tool-surfaces.ts +32 -0
- package/src/persistence/schema/conversations.ts +67 -0
- package/src/persistence/schema/index.ts +1 -0
- package/src/persistence/schema/infrastructure.ts +29 -0
- package/src/persistence/schema/oauth.ts +1 -0
- package/src/persistence/steps.ts +41 -3
- package/src/plugin-api/__tests__/plugin-name-env.test.ts +249 -0
- package/src/plugin-api/conversation-turn.ts +31 -7
- package/src/plugin-api/effective-context-window.ts +33 -0
- package/src/plugin-api/index.ts +35 -6
- package/src/plugin-api/plugin-channel-turn-trust.test.ts +133 -0
- package/src/plugin-api/plugin-channel-turn-trust.ts +71 -0
- package/src/plugin-api/plugin-name-env.ts +125 -0
- package/src/plugin-api/resolve-credential.ts +79 -20
- package/src/plugin-api/vision-support.test.ts +22 -0
- package/src/plugin-api/vision-support.ts +17 -5
- package/src/plugins/__tests__/active-plugin-env.test.ts +136 -0
- package/src/plugins/active-plugin-env.ts +51 -0
- package/src/plugins/defaults/index.ts +24 -0
- package/src/plugins/defaults/memory/AGENTS.md +39 -5
- package/src/plugins/defaults/memory/__tests__/archive-removal-framing.test.ts +64 -0
- package/src/plugins/defaults/memory/__tests__/buffer-file.test.ts +365 -0
- package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +43 -0
- package/src/plugins/defaults/memory/__tests__/conversation-memory-purge.test.ts +1 -0
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +2 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/buffer-appender.ts +17 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +74 -0
- package/src/plugins/defaults/memory/__tests__/memory-run-evidence.test.ts +161 -0
- package/src/plugins/defaults/memory/__tests__/relocated-memory-test-rows.ts +10 -0
- package/src/plugins/defaults/memory/__tests__/worker-control.test.ts +19 -6
- package/src/plugins/defaults/memory/buffer-file.ts +354 -0
- package/src/plugins/defaults/memory/buffer-format.ts +40 -0
- package/src/plugins/defaults/memory/context-search/agent-protocol.ts +9 -12
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +77 -22
- package/src/plugins/defaults/memory/context-search/format.ts +53 -8
- package/src/plugins/defaults/memory/context-search/limits.ts +10 -12
- package/src/plugins/defaults/memory/context-search/recall-input.ts +38 -0
- package/src/plugins/defaults/memory/context-search/search.ts +8 -14
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +1 -0
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -1
- package/src/plugins/defaults/memory/context-search/sources/workspace.ts +2 -1
- package/src/plugins/defaults/memory/context-search/types.ts +1 -11
- package/src/plugins/defaults/memory/conversation-memory-purge.ts +4 -0
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +11 -4
- package/src/plugins/defaults/memory/graph/capability-seed.ts +1 -2
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +13 -63
- package/src/plugins/defaults/memory/graph/tools.ts +35 -64
- package/src/plugins/defaults/memory/host-utils.ts +0 -10
- package/src/plugins/defaults/memory/injectors.ts +4 -3
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +72 -183
- package/src/plugins/defaults/memory/memory-run-evidence.ts +213 -0
- package/src/plugins/defaults/memory/src/memory-eval-routes.ts +2 -3
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +6 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +2 -1
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +407 -99
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +10 -0
- package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +107 -7
- package/src/plugins/defaults/memory/substrate/consolidation-job.ts +307 -86
- package/src/plugins/defaults/memory/substrate/consolidation-tool-surface.ts +34 -0
- package/src/plugins/defaults/memory/substrate/page-index.ts +2 -1
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +91 -51
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +1 -1
- package/src/plugins/defaults/memory/tools.test.ts +124 -9
- package/src/plugins/defaults/memory/tools.ts +38 -11
- package/src/plugins/defaults/memory/v1/graph/consolidation.ts +2 -2
- package/src/plugins/defaults/memory/v1/graph/extraction.ts +2 -1
- package/src/plugins/defaults/memory/v1/graph/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +5 -0
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +5 -2
- package/src/plugins/defaults/memory/v2/reranker.ts +2 -1
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +81 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +87 -0
- package/src/plugins/defaults/memory/v3/__tests__/plugin-schema.test.ts +12 -0
- package/src/plugins/defaults/memory/v3/__tests__/pool-log-store.test.ts +332 -15
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +626 -27
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +148 -28
- package/src/plugins/defaults/memory/v3/card.ts +2 -1
- package/src/plugins/defaults/memory/v3/injector.ts +212 -178
- package/src/plugins/defaults/memory/v3/orchestrate.ts +159 -32
- package/src/plugins/defaults/memory/v3/plugin-schema.ts +54 -4
- package/src/plugins/defaults/memory/v3/pool-log-store.ts +275 -37
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +47 -5
- package/src/plugins/defaults/memory/v3/pool-select.ts +710 -59
- package/src/plugins/defaults/memory/v3/sections.ts +2 -1
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +41 -14
- package/src/plugins/defaults/memory/worker-control.ts +15 -5
- package/src/plugins/defaults/task-progress/__tests__/registration.test.ts +70 -0
- package/src/plugins/defaults/task-progress/__tests__/task-progress-context.test.ts +380 -0
- package/src/plugins/defaults/task-progress/hooks/post-compact.ts +19 -0
- package/src/plugins/defaults/task-progress/hooks/user-prompt-submit.ts +24 -0
- package/src/plugins/defaults/task-progress/package.json +14 -0
- package/src/plugins/defaults/task-progress/src/apply-task-progress-context.ts +93 -0
- package/src/plugins/defaults/task-progress/src/format-task-progress-context.ts +67 -0
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +4 -1
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +1 -46
- package/src/prompts/__tests__/parallel-tasks-section.test.ts +25 -0
- package/src/prompts/delegation-gate.ts +57 -0
- package/src/prompts/system-prompt.ts +14 -32
- package/src/providers/__tests__/context-overflow-error.test.ts +10 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +18 -0
- package/src/providers/anthropic/client.ts +10 -1
- package/src/providers/anthropic-gateway-shared.ts +6 -0
- package/src/providers/fetch-provider-catalog.ts +11 -0
- package/src/providers/gemini/client.ts +25 -8
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/jev/client.test.ts +270 -0
- package/src/providers/jev/client.ts +534 -0
- package/src/providers/model-catalog.ts +59 -3
- package/src/providers/openai/__tests__/chat-completions-extra-body.test.ts +94 -1
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +106 -1
- package/src/providers/openai/__tests__/chat-template-flatten.test.ts +24 -0
- package/src/providers/openai/__tests__/google-thought-signature.test.ts +1 -2
- package/src/providers/openai/chat-completions-provider.ts +100 -29
- package/src/providers/openai/google-thought-signature.ts +0 -6
- package/src/providers/openai/responses-provider.ts +23 -1
- package/src/providers/ratelimit.ts +1 -3
- package/src/providers/search-provider-catalog.ts +24 -0
- package/src/providers/server-tool-pairing.ts +16 -7
- package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +24 -0
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +7 -1
- package/src/providers/speech-to-text/__tests__/vellum-managed-realtime.test.ts +50 -1
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +11 -0
- package/src/providers/speech-to-text/vellum-managed-flux-realtime.ts +13 -0
- package/src/providers/types.ts +5 -0
- package/src/routes/control.ts +7 -5
- package/src/runtime/AGENTS.md +6 -4
- package/src/runtime/__tests__/agent-wake.test.ts +94 -1
- package/src/runtime/actor-trust-resolver.ts +3 -3
- package/src/runtime/agent-wake.ts +32 -5
- package/src/runtime/approval-message-composer.ts +3 -69
- package/src/runtime/assistant-event-hub.ts +73 -75
- package/src/runtime/assistant-event-publish-options.ts +7 -0
- package/src/runtime/assistant-event-targeting.ts +79 -0
- package/src/runtime/assistant-stream-state.ts +13 -100
- package/src/runtime/background-job-runner.ts +5 -5
- package/src/runtime/channel-retry-sweep.ts +1 -0
- package/src/runtime/guardian-action-message-composer.ts +8 -161
- package/src/runtime/guardian-action-service.ts +2 -17
- package/src/runtime/guardian-reply-router.ts +29 -40
- package/src/runtime/http-server.ts +2 -2
- package/src/runtime/http-types.ts +6 -0
- package/src/runtime/message-composer-types.ts +3 -61
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +67 -1
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +89 -0
- package/src/runtime/migrations/vbundle-builder.ts +24 -1
- package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +43 -11
- package/src/runtime/migrations/vbundle-importer.ts +4 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +4 -1
- package/src/runtime/migrations/vbundle-validator.ts +1 -0
- package/src/runtime/pending-interactions-mode-session.test.ts +62 -0
- package/src/runtime/pending-interactions.ts +29 -0
- package/src/runtime/routes/__tests__/client-history-routes.test.ts +104 -0
- package/src/runtime/routes/__tests__/image-generation-routes.test.ts +97 -0
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +24 -2
- package/src/runtime/routes/__tests__/roadmap-routes.test.ts +29 -6
- package/src/runtime/routes/browser-context.ts +31 -11
- package/src/runtime/routes/browser-routes.ts +43 -4
- package/src/runtime/routes/btw-routes.ts +9 -4
- package/src/runtime/routes/channel-route-shared.ts +1 -9
- package/src/runtime/routes/client-routes.ts +108 -0
- package/src/runtime/routes/conversation-management-routes.ts +4 -1
- package/src/runtime/routes/conversation-routes.ts +125 -14
- package/src/runtime/routes/credential-prompt-routes.ts +4 -3
- package/src/runtime/routes/credential-routes.ts +1 -2
- package/src/runtime/routes/desktop-setup-routes.test.ts +9 -18
- package/src/runtime/routes/desktop-setup-routes.ts +8 -7
- package/src/runtime/routes/documents-routes.ts +51 -0
- package/src/runtime/routes/email-routes.ts +3 -7
- package/src/runtime/routes/events-routes.ts +75 -54
- package/src/runtime/routes/guardian-approval-interception.ts +24 -0
- package/src/runtime/routes/identity-routes.ts +1 -5
- package/src/runtime/routes/image-generation-routes.ts +8 -14
- package/src/runtime/routes/inbound-message-handler.ts +37 -41
- package/src/runtime/routes/inbound-stages/backfill-sender-provenance.test.ts +168 -0
- package/src/runtime/routes/inbound-stages/backfill-sender-provenance.ts +96 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +39 -10
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +9 -9
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +2 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +11 -1
- package/src/runtime/routes/inference-profiles-routes.ts +9 -0
- package/src/runtime/routes/llm-context-normalization.ts +1 -7
- package/src/runtime/routes/migration-routes.ts +73 -2
- package/src/runtime/routes/notification-routes.ts +10 -0
- package/src/runtime/routes/oauth-commands-routes.ts +57 -54
- package/src/runtime/routes/oauth-providers.ts +11 -0
- package/src/runtime/routes/oauth-request-hints.test.ts +246 -0
- package/src/runtime/routes/oauth-request-hints.ts +149 -0
- package/src/runtime/routes/plugins-routes.ts +6 -0
- package/src/runtime/routes/roadmap-routes.ts +47 -8
- package/src/runtime/routes/schedule-routes.ts +2 -0
- package/src/runtime/routes/secret-routes.ts +99 -119
- package/src/runtime/routes/settings-routes.ts +10 -4
- package/src/runtime/routes/watcher-routes.ts +1 -3
- package/src/runtime/trust-class.test.ts +7 -6
- package/src/runtime/trust-class.ts +9 -17
- package/src/schedule/__tests__/worker-control.test.ts +36 -5
- package/src/schedule/__tests__/worker-mcp-bootstrap.test.ts +107 -0
- package/src/schedule/__tests__/worker-mcp-readiness.test.ts +173 -0
- package/src/schedule/__tests__/worker-mcp-tools.test.ts +13 -47
- package/src/schedule/run-script.ts +2 -2
- package/src/schedule/scheduler.ts +47 -11
- package/src/schedule/tool-surface-readiness.ts +65 -0
- package/src/schedule/worker-control.ts +15 -5
- package/src/schedule/worker-mcp.ts +85 -0
- package/src/schedule/worker.ts +9 -31
- package/src/security/secure-keys.ts +74 -112
- package/src/skills/clawhub.ts +3 -8
- package/src/skills/managed-store.ts +1 -5
- package/src/stt/types.ts +4 -0
- package/src/subagent/notify.ts +54 -34
- package/src/subagent/parent-notification.ts +6 -0
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +72 -0
- package/src/telemetry/phone-call-funnel.ts +144 -0
- package/src/tools/__tests__/tool-schema-root-combinator-guard.test.ts +81 -0
- package/src/tools/ask-question/ask-question-tool.test.ts +167 -5
- package/src/tools/ask-question/ask-question-tool.ts +120 -22
- package/src/tools/browser/browser-execution.ts +29 -60
- package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +561 -39
- package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +435 -39
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +1 -8
- package/src/tools/client-os.ts +15 -0
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
- package/src/tools/computer-use/target.ts +42 -0
- package/src/tools/document/document-tool.ts +13 -18
- package/src/tools/execution-target.ts +14 -16
- package/src/tools/host-terminal/host-shell.ts +16 -7
- package/src/tools/network/__tests__/web-fetch-tinyfish.test.ts +250 -0
- package/src/tools/network/__tests__/web-search.test.ts +203 -0
- package/src/tools/network/web-fetch.ts +274 -7
- package/src/tools/network/web-search.ts +468 -6
- package/src/tools/permission-checker.ts +3 -3
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +1 -31
- package/src/tools/shared/shell-output.test.ts +10 -0
- package/src/tools/shared/shell-output.ts +14 -2
- package/src/tools/skills/load.ts +2 -1
- package/src/tools/skills/sandbox-runner.ts +24 -4
- package/src/tools/skills/scaffold-managed.ts +2 -1
- package/src/tools/skills/skill-script-runner.ts +7 -0
- package/src/tools/skills/skill-tool-factory.ts +15 -1
- package/src/tools/terminal/__tests__/safe-env.test.ts +44 -4
- package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -14
- package/src/tools/terminal/safe-env.ts +39 -24
- package/src/tools/terminal/sanitized-bash.ts +15 -2
- package/src/tools/terminal/shell-launch.test.ts +162 -0
- package/src/tools/terminal/shell.test.ts +29 -0
- package/src/tools/terminal/shell.ts +15 -7
- package/src/tools/tool-approval-handler.ts +5 -1
- package/src/tools/tool-types.ts +3 -3
- package/src/tools/types.ts +8 -2
- package/src/util/__tests__/worker-process-command.test.ts +5 -4
- package/src/util/abort-reasons.ts +18 -26
- package/src/util/browser-human-verification.ts +14 -0
- package/src/util/canonicalize-identity.test.ts +21 -0
- package/src/util/canonicalize-identity.ts +16 -0
- package/src/util/errors.ts +13 -3
- package/src/util/host-process.test.ts +17 -1
- package/src/util/host-process.ts +24 -0
- package/src/util/provider-error-patterns.ts +3 -0
- package/src/util/unicode.ts +29 -0
- package/src/util/worker-process.ts +77 -35
- package/src/workspace/migrations/157-add-desktop-files-launcher.ts +94 -0
- package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +4 -10
- package/src/workspace/migrations/__tests__/157-add-desktop-files-launcher.test.ts +113 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/__tests__/computer-use-window-schema.test.ts +0 -24
- package/src/api/events/heartbeat-alert.ts +0 -20
- package/src/daemon/message-types/web-activity.ts +0 -65
- package/src/desktop/desktop-dependencies.test.ts +0 -131
- package/src/tools/computer-use/definitions.ts +0 -607
|
@@ -6,15 +6,16 @@
|
|
|
6
6
|
// into concept pages.
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
|
|
9
|
-
import { appendFileSync, existsSync, mkdirSync } from "node:fs";
|
|
10
9
|
import { join } from "node:path";
|
|
11
10
|
|
|
11
|
+
import type { RememberInput } from "../../../../api/remember-tool.js";
|
|
12
12
|
import {
|
|
13
13
|
isMemoryEnabled,
|
|
14
14
|
usesConceptPageMemory,
|
|
15
15
|
} from "../../../../config/memory-v3-gate.js";
|
|
16
16
|
import type { AssistantConfig } from "../../../../config/types.js";
|
|
17
17
|
import { enqueueMemoryJob } from "../../../../persistence/jobs-store.js";
|
|
18
|
+
import { appendBufferAndArchive } from "../buffer-file.js";
|
|
18
19
|
import { formatRememberEntry } from "../buffer-format.js";
|
|
19
20
|
import { getWorkspaceDir } from "../paths.js";
|
|
20
21
|
import type { GraphStats } from "./store.js";
|
|
@@ -31,33 +32,23 @@ import { type CapabilityKind, capabilityKind } from "./types.js";
|
|
|
31
32
|
// remember handler — appends to the memory/ buffer + daily archive
|
|
32
33
|
// ---------------------------------------------------------------------------
|
|
33
34
|
|
|
34
|
-
export
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
finish_turn?: boolean;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface RememberResult {
|
|
46
|
-
success: boolean;
|
|
47
|
-
message: string;
|
|
48
|
-
}
|
|
35
|
+
export type RememberResult =
|
|
36
|
+
| {
|
|
37
|
+
success: true;
|
|
38
|
+
message: string;
|
|
39
|
+
/** The facts saved, trimmed, in the order they were given. */
|
|
40
|
+
facts: string[];
|
|
41
|
+
}
|
|
42
|
+
| { success: false; message: string };
|
|
49
43
|
|
|
50
44
|
/**
|
|
51
45
|
* Normalize the `remember` content input to a list of non-empty facts.
|
|
52
46
|
* Accepts the single-string form or the batch array form, trims each fact, and
|
|
53
47
|
* drops blanks so an empty or whitespace-only input yields no facts.
|
|
54
48
|
*/
|
|
55
|
-
function normalizeFacts(content:
|
|
49
|
+
function normalizeFacts(content: RememberInput["content"]): string[] {
|
|
56
50
|
const raw = Array.isArray(content) ? content : [content];
|
|
57
|
-
return raw
|
|
58
|
-
.filter((fact): fact is string => typeof fact === "string")
|
|
59
|
-
.map((fact) => fact.trim())
|
|
60
|
-
.filter((fact) => fact.length > 0);
|
|
51
|
+
return raw.map((fact) => fact.trim()).filter((fact) => fact.length > 0);
|
|
61
52
|
}
|
|
62
53
|
|
|
63
54
|
function rememberSuccessMessage(count: number): string {
|
|
@@ -96,48 +87,7 @@ export function handleRemember(
|
|
|
96
87
|
now,
|
|
97
88
|
});
|
|
98
89
|
|
|
99
|
-
return { success: true, message };
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Append `entry` to `<rootDir>/buffer.md` and `<rootDir>/archive/<today>.md`,
|
|
104
|
-
* creating the archive directory and seeding the archive header if missing.
|
|
105
|
-
*
|
|
106
|
-
* Returns the absolute paths of both files so callers can fan out follow-up
|
|
107
|
-
* work.
|
|
108
|
-
*
|
|
109
|
-
* Exported so background jobs (`sweep`, future LLM-driven extractors) can
|
|
110
|
-
* append to `memory/buffer.md` + `memory/archive/<today>.md` with exactly the
|
|
111
|
-
* same format `remember()` produces, keeping the two write paths
|
|
112
|
-
* byte-compatible for downstream consumers (consolidation, search).
|
|
113
|
-
*/
|
|
114
|
-
export function appendBufferAndArchive(args: {
|
|
115
|
-
rootDir: string;
|
|
116
|
-
entry: string;
|
|
117
|
-
now: Date;
|
|
118
|
-
}): { bufferPath: string; archivePath: string } {
|
|
119
|
-
const { rootDir, entry, now } = args;
|
|
120
|
-
const archiveDir = join(rootDir, "archive");
|
|
121
|
-
mkdirSync(archiveDir, { recursive: true });
|
|
122
|
-
|
|
123
|
-
const bufferPath = join(rootDir, "buffer.md");
|
|
124
|
-
appendFileSync(bufferPath, entry, "utf-8");
|
|
125
|
-
|
|
126
|
-
const yyyy = now.getFullYear();
|
|
127
|
-
const mm = String(now.getMonth() + 1).padStart(2, "0");
|
|
128
|
-
const dd = String(now.getDate()).padStart(2, "0");
|
|
129
|
-
const archivePath = join(archiveDir, `${yyyy}-${mm}-${dd}.md`);
|
|
130
|
-
if (!existsSync(archivePath)) {
|
|
131
|
-
const month = now.toLocaleString("en-US", { month: "short" });
|
|
132
|
-
appendFileSync(
|
|
133
|
-
archivePath,
|
|
134
|
-
`# ${month} ${now.getDate()}, ${yyyy}\n\n`,
|
|
135
|
-
"utf-8",
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
appendFileSync(archivePath, entry, "utf-8");
|
|
139
|
-
|
|
140
|
-
return { bufferPath, archivePath };
|
|
90
|
+
return { success: true, message, facts };
|
|
141
91
|
}
|
|
142
92
|
|
|
143
93
|
// ---------------------------------------------------------------------------
|
|
@@ -2,14 +2,11 @@
|
|
|
2
2
|
// Memory Tool definitions for agentic recall and remember.
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
ALL_RECALL_SOURCES,
|
|
7
|
-
MAX_RECALL_MAX_RESULTS,
|
|
8
|
-
MIN_RECALL_MAX_RESULTS,
|
|
9
|
-
} from "../context-search/limits.js";
|
|
10
|
-
import type { ToolDefinition } from "../llm-helpers.js";
|
|
5
|
+
import { toToolInputSchema } from "@vellumai/plugin-api";
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
import { RememberInputSchema } from "../../../../api/remember-tool.js";
|
|
8
|
+
import { RecallInputSchema } from "../context-search/recall-input.js";
|
|
9
|
+
import type { ToolDefinition } from "../llm-helpers.js";
|
|
13
10
|
|
|
14
11
|
/**
|
|
15
12
|
* Explicit local information search across memory, conversations, and
|
|
@@ -19,38 +16,7 @@ export const graphRecallDefinition = {
|
|
|
19
16
|
name: "recall",
|
|
20
17
|
description:
|
|
21
18
|
'Search local information the moment you feel uncertain. Use recall for memory, past conversations, and workspace files — before you guess, before you ask, before you hedge. Auto-injection is incomplete by design; it surfaces patterns, not the specifics you need to answer well. If you catch yourself reaching for "I think", "I believe", "if I remember", "didn\'t we", "last time" — that\'s the signal. Recall. If a turn references someone, a place, a decision, a document, or prior work you should be able to find locally — recall. Call it multiple times per conversation if the turn warrants it. Be specific in your query for best results. Results reflect what was true when the memory was written — do not use recall alone to answer questions about current system state (account connections, watchers, service health); verify those with live checks.',
|
|
22
|
-
input_schema:
|
|
23
|
-
type: "object",
|
|
24
|
-
properties: {
|
|
25
|
-
query: {
|
|
26
|
-
type: "string",
|
|
27
|
-
description:
|
|
28
|
-
"What you're looking for. Be specific and descriptive: include the topic, person, project, decision, time period, or file clues when known.",
|
|
29
|
-
},
|
|
30
|
-
sources: {
|
|
31
|
-
type: "array",
|
|
32
|
-
items: {
|
|
33
|
-
type: "string",
|
|
34
|
-
enum: [...ALL_RECALL_SOURCES],
|
|
35
|
-
},
|
|
36
|
-
description:
|
|
37
|
-
"Optional local sources to search. Omit to search memory, conversations, and workspace files.",
|
|
38
|
-
},
|
|
39
|
-
max_results: {
|
|
40
|
-
type: "integer",
|
|
41
|
-
minimum: MIN_RECALL_MAX_RESULTS,
|
|
42
|
-
maximum: MAX_RECALL_MAX_RESULTS,
|
|
43
|
-
description: "Maximum number of evidence items to return.",
|
|
44
|
-
},
|
|
45
|
-
depth: {
|
|
46
|
-
type: "string",
|
|
47
|
-
enum: [...RECALL_DEPTHS],
|
|
48
|
-
description:
|
|
49
|
-
"Search effort. Use fast for quick lookups, standard by default, and deep when the answer may require multiple local searches.",
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
required: ["query"],
|
|
53
|
-
},
|
|
19
|
+
input_schema: toToolInputSchema(RecallInputSchema),
|
|
54
20
|
} satisfies ToolDefinition;
|
|
55
21
|
|
|
56
22
|
/**
|
|
@@ -77,8 +43,9 @@ export const REMEMBER_PAGE_HINT_GUIDANCE =
|
|
|
77
43
|
"When a fact relates to memory pages already in your context, reference the most specific ones inline as [[slug]] wikilinks — consolidation reads hinted pages first when filing the fact, which matters most for corrections (the hint names the page carrying the outdated fact). Hint only pages you have actually seen, and prefer specific pages over broad hubs.";
|
|
78
44
|
|
|
79
45
|
/**
|
|
80
|
-
* Build the `remember` input schema
|
|
81
|
-
*
|
|
46
|
+
* Build the `remember` input schema from {@link RememberInputSchema}, the one
|
|
47
|
+
* `execute` parses with, adding the descriptions the model reads.
|
|
48
|
+
* `pageHints` reflects whether concept-page memory is active and appends
|
|
82
49
|
* {@link REMEMBER_PAGE_HINT_GUIDANCE} to the `content` description. It is a
|
|
83
50
|
* thunk re-resolved on every read of that description: the registry's
|
|
84
51
|
* finalized tool shares the returned schema object by reference, so a
|
|
@@ -87,29 +54,33 @@ export const REMEMBER_PAGE_HINT_GUIDANCE =
|
|
|
87
54
|
*/
|
|
88
55
|
export function buildRememberInputSchema(options: {
|
|
89
56
|
pageHints: () => boolean;
|
|
90
|
-
}) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
57
|
+
}): Record<string, unknown> {
|
|
58
|
+
const schema = toToolInputSchema(
|
|
59
|
+
RememberInputSchema.extend({
|
|
60
|
+
content: RememberInputSchema.shape.content.describe(
|
|
61
|
+
REMEMBER_CONTENT_DESCRIPTION,
|
|
62
|
+
),
|
|
63
|
+
finish_turn: RememberInputSchema.shape.finish_turn.describe(
|
|
64
|
+
"When you have nothing else to say and want to yield the turn you MUST set this to true. When true, your turn ends after this tool call. It's critical that you do this in order to avoid unnecessary LLM calls.",
|
|
65
|
+
),
|
|
66
|
+
}),
|
|
67
|
+
);
|
|
68
|
+
const properties = schema.properties;
|
|
69
|
+
const content =
|
|
70
|
+
typeof properties === "object" && properties !== null
|
|
71
|
+
? Reflect.get(properties, "content")
|
|
72
|
+
: undefined;
|
|
73
|
+
if (typeof content === "object" && content !== null) {
|
|
74
|
+
Object.defineProperty(content, "description", {
|
|
75
|
+
enumerable: true,
|
|
76
|
+
configurable: true,
|
|
77
|
+
get: (): string =>
|
|
78
|
+
options.pageHints()
|
|
79
|
+
? `${REMEMBER_CONTENT_DESCRIPTION} ${REMEMBER_PAGE_HINT_GUIDANCE}`
|
|
80
|
+
: REMEMBER_CONTENT_DESCRIPTION,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return schema;
|
|
113
84
|
}
|
|
114
85
|
|
|
115
86
|
/**
|
|
@@ -25,7 +25,6 @@ import type { SqliteRetryOptions } from "../../../util/sqlite-retry.js";
|
|
|
25
25
|
import * as hostSqliteRetry from "../../../util/sqlite-retry.js";
|
|
26
26
|
import * as hostStripCommentLines from "../../../util/strip-comment-lines.js";
|
|
27
27
|
import * as hostTruncate from "../../../util/truncate.js";
|
|
28
|
-
import * as hostUnicode from "../../../util/unicode.js";
|
|
29
28
|
import * as hostWorkerCompute from "../../../util/worker-compute.js";
|
|
30
29
|
import * as hostWorkerMemory from "../../../util/worker-memory.js";
|
|
31
30
|
|
|
@@ -77,15 +76,6 @@ export function truncate(str: string, maxLen: number, suffix?: string): string {
|
|
|
77
76
|
: hostTruncate.truncate(str, maxLen, suffix);
|
|
78
77
|
}
|
|
79
78
|
|
|
80
|
-
/** `String.prototype.slice` that never cuts a UTF-16 surrogate pair in half. */
|
|
81
|
-
export function safeStringSlice(
|
|
82
|
-
str: string,
|
|
83
|
-
start?: number,
|
|
84
|
-
end?: number,
|
|
85
|
-
): string {
|
|
86
|
-
return hostUnicode.safeStringSlice(str, start, end);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
79
|
export function workerMemoryEnv(): Record<string, string | undefined> {
|
|
90
80
|
return hostWorkerMemory.workerMemoryEnv();
|
|
91
81
|
}
|
|
@@ -374,9 +374,10 @@ const memoryV2StaticInjector: Injector = {
|
|
|
374
374
|
if (mode !== "full") {
|
|
375
375
|
return null;
|
|
376
376
|
}
|
|
377
|
-
// The consolidation
|
|
378
|
-
//
|
|
379
|
-
//
|
|
377
|
+
// The consolidation run already carries its pass's buffer entries in
|
|
378
|
+
// the prompt itself, and the job removes them from memory/buffer.md
|
|
379
|
+
// after the run; injecting the buffer section here would duplicate the
|
|
380
|
+
// pass and hand the agent entries that are not its to file.
|
|
380
381
|
const content = readGatedMemoryV2Static(ctx.trust, {
|
|
381
382
|
excludeBuffer: ctx.callSite === "memoryV2Consolidation",
|
|
382
383
|
});
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
import {
|
|
44
44
|
addMessage,
|
|
45
45
|
type AgentLoopExitReason,
|
|
46
|
-
type ContentBlock,
|
|
47
46
|
type ConversationRow,
|
|
48
47
|
deleteConversation,
|
|
49
48
|
getConversation,
|
|
50
49
|
getConversationProcessingStartedAt,
|
|
50
|
+
getRecordedConversationToolSurface,
|
|
51
51
|
isConversationProcessing,
|
|
52
52
|
} from "@vellumai/plugin-api";
|
|
53
53
|
|
|
@@ -105,6 +105,12 @@ import {
|
|
|
105
105
|
upsertRetrospectiveState,
|
|
106
106
|
} from "./memory-retrospective-state.js";
|
|
107
107
|
import { effectiveSweepLookbackMs } from "./memory-retrospective-sweep.js";
|
|
108
|
+
import {
|
|
109
|
+
collectSuccessfulToolResultIds,
|
|
110
|
+
countDurableToolUses,
|
|
111
|
+
extractRememberContents,
|
|
112
|
+
hasCommittedTextReply,
|
|
113
|
+
} from "./memory-run-evidence.js";
|
|
108
114
|
|
|
109
115
|
const log = getLogger("memory-retrospective-job");
|
|
110
116
|
|
|
@@ -500,10 +506,9 @@ export async function runForkBasedRetrospective(
|
|
|
500
506
|
// Persona + tool-context parity pins derived from the source conversation
|
|
501
507
|
// (see `resolveSourceParityPins`), both passed unconditionally. The persona
|
|
502
508
|
// override keeps the system-prompt prefix in parity (and is a review-quality
|
|
503
|
-
// fix on its own); the tool-context pin
|
|
504
|
-
//
|
|
505
|
-
//
|
|
506
|
-
// execution time.
|
|
509
|
+
// fix on its own); the tool-context pin resolves the fork's execution-side
|
|
510
|
+
// tool inventory under the source's client context and carries the wire
|
|
511
|
+
// surface when the source has no recorded one (`sourceToolSurface` below).
|
|
507
512
|
// Warm both guardian-delivery cache keys (vellum + unfiltered) so the sync
|
|
508
513
|
// slug resolution inside resolveSourceParityPins (resolveUserSlug(undefined)),
|
|
509
514
|
// including its any-channel fallback, hits fresh keys instead of falling
|
|
@@ -514,6 +519,16 @@ export async function runForkBasedRetrospective(
|
|
|
514
519
|
newMessages,
|
|
515
520
|
);
|
|
516
521
|
|
|
522
|
+
// The tools array the source's most recent live turn actually sent,
|
|
523
|
+
// replayed verbatim on the fork. The wire tool block is the first tier of
|
|
524
|
+
// the provider cache prefix (tools → system → messages), and re-deriving it
|
|
525
|
+
// on the fork cannot reproduce the source's bytes: this worker's registry
|
|
526
|
+
// has no user-plugin tools, host-tool gates read connected clients the
|
|
527
|
+
// worker never has, and presence derived from a persisted interface stamp
|
|
528
|
+
// misreads clientless turns. `null` (no live turn has recorded a surface)
|
|
529
|
+
// leaves the pin's derivation as the wire surface.
|
|
530
|
+
const sourceToolSurface = await readSourceToolSurface(sourceConversationId);
|
|
531
|
+
|
|
517
532
|
// `skipHintInjection: true` because the instruction is already a
|
|
518
533
|
// persisted message — the wake's hint sandwich would only duplicate it.
|
|
519
534
|
let wakeSucceeded = false;
|
|
@@ -542,16 +557,32 @@ export async function runForkBasedRetrospective(
|
|
|
542
557
|
"find_similar_skills",
|
|
543
558
|
]
|
|
544
559
|
: ["remember"],
|
|
545
|
-
//
|
|
546
|
-
//
|
|
547
|
-
//
|
|
548
|
-
//
|
|
549
|
-
//
|
|
550
|
-
//
|
|
551
|
-
//
|
|
560
|
+
// Keep the source's full tool surface on the wire: replay the array its
|
|
561
|
+
// last live turn sent when one is recorded, otherwise resolve the fork's
|
|
562
|
+
// own surface under the source's client context (`toolContextPin`). The
|
|
563
|
+
// wire tool block is the first tier of the provider cache prefix
|
|
564
|
+
// (tools → system → messages), so any wire difference busts cache parity
|
|
565
|
+
// with the source's live turns, re-creating the cached prefix instead of
|
|
566
|
+
// reading it. The recorded delegation-section state rides with the array
|
|
567
|
+
// into the fork's system prompt (the second tier) for the same reason:
|
|
568
|
+
// this wake's own scope cannot spawn, so deriving the section here
|
|
569
|
+
// renders it off where an interactive source rendered it on. The
|
|
570
|
+
// allowlist still holds at execution time: non-allowlisted calls are
|
|
571
|
+
// rejected before any executor or side effect runs. See
|
|
552
572
|
// {@link SubagentToolGateMode} and {@link WakeToolContextPin}.
|
|
553
573
|
toolGateMode: "execution" as const,
|
|
554
574
|
toolContextPin,
|
|
575
|
+
...(sourceToolSurface
|
|
576
|
+
? {
|
|
577
|
+
wireToolDefinitions: sourceToolSurface.tools,
|
|
578
|
+
...(sourceToolSurface.delegateIndependentTasks === null
|
|
579
|
+
? {}
|
|
580
|
+
: {
|
|
581
|
+
delegateIndependentTasks:
|
|
582
|
+
sourceToolSurface.delegateIndependentTasks,
|
|
583
|
+
}),
|
|
584
|
+
}
|
|
585
|
+
: {}),
|
|
555
586
|
// Preactivate skill-management so its authoring tools (`find_similar_skills`
|
|
556
587
|
// / `scaffold_managed_skill` / the `skill_load` target) are in the turn's
|
|
557
588
|
// active set from turn 1; the checker's origin-scoped grant then makes them
|
|
@@ -731,6 +762,25 @@ function enqueueFollowUpJobs(): string[] {
|
|
|
731
762
|
return followUpJobIds;
|
|
732
763
|
}
|
|
733
764
|
|
|
765
|
+
/**
|
|
766
|
+
* The source's recorded wire surface (its tool array and the delegation
|
|
767
|
+
* section state of its system prompt), or `null` when none is recorded or the
|
|
768
|
+
* read fails (logged; the fork then derives both for itself).
|
|
769
|
+
*/
|
|
770
|
+
async function readSourceToolSurface(
|
|
771
|
+
sourceConversationId: string,
|
|
772
|
+
): ReturnType<typeof getRecordedConversationToolSurface> {
|
|
773
|
+
try {
|
|
774
|
+
return await getRecordedConversationToolSurface(sourceConversationId);
|
|
775
|
+
} catch (err) {
|
|
776
|
+
log.warn(
|
|
777
|
+
{ err, sourceConversationId },
|
|
778
|
+
"memory-retrospective (fork): failed to read the source's recorded tool surface; deriving the wire surface instead",
|
|
779
|
+
);
|
|
780
|
+
return null;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
|
|
734
784
|
/**
|
|
735
785
|
* The source-derived parity pins the fork wake runs under: the system-prompt
|
|
736
786
|
* persona override and the tool-resolution context pin. Both exist so the
|
|
@@ -1252,177 +1302,16 @@ async function collectRetrospectiveRunEvidence(
|
|
|
1252
1302
|
const succeededIds = collectSuccessfulToolResultIds(runMessages);
|
|
1253
1303
|
return {
|
|
1254
1304
|
remembers: extractRememberContents(runMessages, succeededIds),
|
|
1255
|
-
durableToolCallCount: countDurableToolUses(
|
|
1256
|
-
|
|
1305
|
+
durableToolCallCount: countDurableToolUses(
|
|
1306
|
+
runMessages,
|
|
1307
|
+
DURABLE_RETROSPECTIVE_TOOLS,
|
|
1308
|
+
succeededIds,
|
|
1309
|
+
),
|
|
1310
|
+
durableToolAttemptCount: countDurableToolUses(
|
|
1311
|
+
runMessages,
|
|
1312
|
+
DURABLE_RETROSPECTIVE_TOOLS,
|
|
1313
|
+
null,
|
|
1314
|
+
),
|
|
1257
1315
|
committedTextReply: hasCommittedTextReply(runMessages),
|
|
1258
1316
|
};
|
|
1259
1317
|
}
|
|
1260
|
-
|
|
1261
|
-
/**
|
|
1262
|
-
* Whether the LAST persisted assistant row on the run's tail carries a text
|
|
1263
|
-
* block with non-whitespace content. Paired with a model-driven stop and
|
|
1264
|
-
* zero memory-write attempts, that closing reply is the persisted artifact
|
|
1265
|
-
* of a pass that read its window and had nothing to save: the model spoke
|
|
1266
|
-
* and then chose to end the run. Reading only the final row separates it
|
|
1267
|
-
* from a run whose narration went live but whose actual conclusion was
|
|
1268
|
-
* empty, as well as from a response that committed nothing at all
|
|
1269
|
-
* (thinking-only output, an empty content array).
|
|
1270
|
-
*/
|
|
1271
|
-
function hasCommittedTextReply(messages: MessageLike[]): boolean {
|
|
1272
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
1273
|
-
const msg = messages[i]!;
|
|
1274
|
-
if (msg.role !== "assistant") {
|
|
1275
|
-
continue;
|
|
1276
|
-
}
|
|
1277
|
-
const blocks = parseMessageBlocks(msg);
|
|
1278
|
-
if (blocks === null) {
|
|
1279
|
-
return false;
|
|
1280
|
-
}
|
|
1281
|
-
return blocks.some(
|
|
1282
|
-
(b) =>
|
|
1283
|
-
b.type === "text" && typeof b.text === "string" && b.text.trim() !== "",
|
|
1284
|
-
);
|
|
1285
|
-
}
|
|
1286
|
-
return false;
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
/**
|
|
1290
|
-
* Ids of `tool_result` blocks on the run's user rows whose execution did not
|
|
1291
|
-
* report an error. Robust to malformed content JSON the same way
|
|
1292
|
-
* `extractRememberContents` is.
|
|
1293
|
-
*/
|
|
1294
|
-
function collectSuccessfulToolResultIds(messages: MessageLike[]): Set<string> {
|
|
1295
|
-
const ids = new Set<string>();
|
|
1296
|
-
for (const msg of messages) {
|
|
1297
|
-
if (msg.role !== "user") {
|
|
1298
|
-
continue;
|
|
1299
|
-
}
|
|
1300
|
-
for (const b of parseMessageBlocks(msg) ?? []) {
|
|
1301
|
-
// guard:allow-tool-result-only: success evidence for locally-executed
|
|
1302
|
-
// durable memory tools; server-side web_search_tool_result never
|
|
1303
|
-
// corresponds to a durable write and carries no is_error flag.
|
|
1304
|
-
if (
|
|
1305
|
-
b.type === "tool_result" &&
|
|
1306
|
-
typeof b.tool_use_id === "string" &&
|
|
1307
|
-
b.is_error !== true
|
|
1308
|
-
) {
|
|
1309
|
-
ids.add(b.tool_use_id);
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
}
|
|
1313
|
-
return ids;
|
|
1314
|
-
}
|
|
1315
|
-
|
|
1316
|
-
/**
|
|
1317
|
-
* Count persisted `tool_use` blocks whose `name` is in
|
|
1318
|
-
* {@link DURABLE_RETROSPECTIVE_TOOLS} across the run's assistant rows.
|
|
1319
|
-
* With a `succeededIds` set, only calls whose id has a matching successful
|
|
1320
|
-
* `tool_result` count (verified executions); with `null`, every attempt
|
|
1321
|
-
* counts regardless of outcome.
|
|
1322
|
-
*/
|
|
1323
|
-
function countDurableToolUses(
|
|
1324
|
-
messages: MessageLike[],
|
|
1325
|
-
succeededIds: ReadonlySet<string> | null,
|
|
1326
|
-
): number {
|
|
1327
|
-
let count = 0;
|
|
1328
|
-
for (const msg of messages) {
|
|
1329
|
-
if (msg.role !== "assistant") {
|
|
1330
|
-
continue;
|
|
1331
|
-
}
|
|
1332
|
-
for (const b of parseMessageBlocks(msg) ?? []) {
|
|
1333
|
-
if (
|
|
1334
|
-
b.type === "tool_use" &&
|
|
1335
|
-
DURABLE_RETROSPECTIVE_TOOLS.has(String(b.name)) &&
|
|
1336
|
-
(succeededIds === null ||
|
|
1337
|
-
(typeof b.id === "string" && succeededIds.has(b.id)))
|
|
1338
|
-
) {
|
|
1339
|
-
count += 1;
|
|
1340
|
-
}
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
return count;
|
|
1344
|
-
}
|
|
1345
|
-
|
|
1346
|
-
interface MessageLike {
|
|
1347
|
-
role: string;
|
|
1348
|
-
content: string | ContentBlock[];
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
|
-
/**
|
|
1352
|
-
* Parse a message row's content into its block objects, or `null` when the
|
|
1353
|
-
* content is malformed (unparseable JSON, not an array). Non-object entries
|
|
1354
|
-
* are dropped. Every evidence reader in this module goes through this so
|
|
1355
|
-
* malformed rows degrade the same way everywhere: skipped, not propagated.
|
|
1356
|
-
*/
|
|
1357
|
-
function parseMessageBlocks(
|
|
1358
|
-
msg: MessageLike,
|
|
1359
|
-
): Record<string, unknown>[] | null {
|
|
1360
|
-
let blocks: unknown = msg.content;
|
|
1361
|
-
if (typeof blocks === "string") {
|
|
1362
|
-
try {
|
|
1363
|
-
blocks = JSON.parse(blocks);
|
|
1364
|
-
} catch {
|
|
1365
|
-
return null;
|
|
1366
|
-
}
|
|
1367
|
-
}
|
|
1368
|
-
if (!Array.isArray(blocks)) {
|
|
1369
|
-
return null;
|
|
1370
|
-
}
|
|
1371
|
-
return blocks.filter(
|
|
1372
|
-
(block): block is Record<string, unknown> =>
|
|
1373
|
-
typeof block === "object" && block !== null,
|
|
1374
|
-
);
|
|
1375
|
-
}
|
|
1376
|
-
|
|
1377
|
-
/**
|
|
1378
|
-
* Scan an array of message rows for `tool_use` blocks where `name` is
|
|
1379
|
-
* `"remember"` and return the `input.content` strings in order. Robust to
|
|
1380
|
-
* malformed content JSON — unparseable rows are skipped, not propagated.
|
|
1381
|
-
*/
|
|
1382
|
-
function extractRememberContents(
|
|
1383
|
-
messages: MessageLike[],
|
|
1384
|
-
succeededIds?: ReadonlySet<string>,
|
|
1385
|
-
): string[] {
|
|
1386
|
-
const contents: string[] = [];
|
|
1387
|
-
for (const msg of messages) {
|
|
1388
|
-
if (msg.role !== "assistant") {
|
|
1389
|
-
continue;
|
|
1390
|
-
}
|
|
1391
|
-
for (const b of parseMessageBlocks(msg) ?? []) {
|
|
1392
|
-
if (b.type !== "tool_use") {
|
|
1393
|
-
continue;
|
|
1394
|
-
}
|
|
1395
|
-
if (b.name !== "remember") {
|
|
1396
|
-
continue;
|
|
1397
|
-
}
|
|
1398
|
-
// When a success set is provided, only executions that reported a
|
|
1399
|
-
// non-error tool_result contribute facts: a failed remember never
|
|
1400
|
-
// wrote the buffer, and logging its facts would suppress the retry's
|
|
1401
|
-
// re-save via <already_remembered>.
|
|
1402
|
-
if (
|
|
1403
|
-
succeededIds !== undefined &&
|
|
1404
|
-
(typeof b.id !== "string" || !succeededIds.has(b.id))
|
|
1405
|
-
) {
|
|
1406
|
-
continue;
|
|
1407
|
-
}
|
|
1408
|
-
const input = b.input;
|
|
1409
|
-
if (!input || typeof input !== "object") {
|
|
1410
|
-
continue;
|
|
1411
|
-
}
|
|
1412
|
-
const content = (input as Record<string, unknown>).content;
|
|
1413
|
-
// `remember` accepts a single string or an array of facts (batch form);
|
|
1414
|
-
// flatten both so batched saves still feed the dedup baseline.
|
|
1415
|
-
const facts = Array.isArray(content) ? content : [content];
|
|
1416
|
-
for (const fact of facts) {
|
|
1417
|
-
if (typeof fact !== "string") {
|
|
1418
|
-
continue;
|
|
1419
|
-
}
|
|
1420
|
-
const trimmed = fact.trim();
|
|
1421
|
-
if (trimmed.length > 0) {
|
|
1422
|
-
contents.push(trimmed);
|
|
1423
|
-
}
|
|
1424
|
-
}
|
|
1425
|
-
}
|
|
1426
|
-
}
|
|
1427
|
-
return contents;
|
|
1428
|
-
}
|