@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091926.ebb2d62
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/ARCHITECTURE.md +6 -6
- package/bun.lock +2 -2
- package/docs/activation-funnel-telemetry.md +310 -0
- package/examples/plugins/echo/README.md +61 -60
- package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
- package/examples/plugins/echo/hooks/stop.ts +16 -0
- package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
- package/examples/plugins/echo/package.json +1 -2
- package/examples/plugins/echo/src/emit.ts +19 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
- package/openapi.yaml +273 -121
- package/package.json +2 -2
- package/scripts/sync-llm-catalog.ts +2 -0
- package/src/__tests__/activation-early-marking.test.ts +120 -0
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
- package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
- package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
- package/src/__tests__/agent-loop-thinking.test.ts +36 -20
- package/src/__tests__/agent-loop.test.ts +441 -96
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
- package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
- package/src/__tests__/anthropic-provider.test.ts +23 -8
- package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
- package/src/__tests__/app-control-flow.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +132 -0
- package/src/__tests__/approval-cascade.test.ts +6 -5
- package/src/__tests__/approval-routes-http.test.ts +4 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/build-persisted-content.test.ts +75 -1
- package/src/__tests__/channel-approval-routes.test.ts +1 -1
- package/src/__tests__/channel-approvals.test.ts +1 -1
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +146 -0
- package/src/__tests__/compaction-events.test.ts +7 -7
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +2 -46
- package/src/__tests__/context-overflow-reducer.test.ts +265 -125
- package/src/__tests__/context-window-manager-compact-retry.test.ts +121 -15
- package/src/__tests__/conversation-abort-tool-results.test.ts +7 -5
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +158 -234
- package/src/__tests__/conversation-agent-loop.test.ts +342 -623
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -5
- package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
- package/src/__tests__/conversation-error.test.ts +15 -1
- package/src/__tests__/conversation-history-web-search.test.ts +6 -1
- package/src/__tests__/conversation-media-retry.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +44 -4
- package/src/__tests__/conversation-process-callsite.test.ts +15 -15
- package/src/__tests__/conversation-provider-retry-repair.test.ts +66 -65
- package/src/__tests__/conversation-queue.test.ts +10 -10
- package/src/__tests__/conversation-runtime-assembly.test.ts +1059 -231
- package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
- package/src/__tests__/conversation-slash-queue.test.ts +7 -5
- package/src/__tests__/conversation-slash-unknown.test.ts +7 -5
- package/src/__tests__/conversation-speed-override.test.ts +11 -10
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +395 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +48 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +73 -4
- package/src/__tests__/conversation-undo.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +24 -21
- package/src/__tests__/conversation-workspace-injection.test.ts +69 -7
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +15 -12
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/corrected-target.test.ts +93 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -4
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +36 -0
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/dynamic-page-surface.test.ts +31 -0
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +6 -40
- package/src/__tests__/empty-response-hook.test.ts +1 -1
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/gateway-only-guard.test.ts +17 -2
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +93 -4
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/history-repair-hook.test.ts +5 -1
- package/src/__tests__/host-app-control-proxy.test.ts +45 -0
- package/src/__tests__/host-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- package/src/__tests__/inference-profile-reaper.test.ts +62 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
- package/src/__tests__/injector-background-turn.test.ts +13 -23
- package/src/__tests__/injector-chain.test.ts +268 -44
- package/src/__tests__/injector-disk-pressure.test.ts +210 -52
- package/src/__tests__/injector-document-comments.test.ts +97 -114
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-v3-suppression.test.ts +4 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
- package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
- package/src/__tests__/llm-catalog-parity.test.ts +4 -0
- package/src/__tests__/llm-resolver.test.ts +73 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +156 -38
- package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
- package/src/__tests__/notification-decision-strategy.test.ts +3 -3
- package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +145 -0
- package/src/__tests__/persist-unsendable-image.test.ts +97 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +78 -0
- package/src/__tests__/plugin-api-shim.test.ts +6 -9
- package/src/__tests__/plugin-bootstrap.test.ts +91 -81
- package/src/__tests__/plugin-registry.test.ts +3 -49
- package/src/__tests__/plugin-skill-contribution.test.ts +15 -14
- package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
- package/src/__tests__/plugin-types.test.ts +0 -70
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +69 -0
- package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
- package/src/__tests__/published-app-updater.test.ts +138 -0
- package/src/__tests__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/retry-thinking-adaptive-only.test.ts +245 -0
- package/src/__tests__/send-endpoint-busy.test.ts +4 -1
- package/src/__tests__/server-history-render.test.ts +39 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +31 -0
- package/src/__tests__/steer-tool-repair.test.ts +1 -1
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- package/src/__tests__/subagent-detail.test.ts +25 -7
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -3
- package/src/__tests__/subagent-notify-parent.test.ts +1 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +5 -1
- package/src/__tests__/tool-error-hook.test.ts +1 -1
- package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
- package/src/__tests__/tool-start-timestamp.test.ts +218 -0
- package/src/__tests__/user-plugin-loader.test.ts +54 -286
- package/src/__tests__/web-fetch.test.ts +45 -0
- package/src/acp/__tests__/agent-process.test.ts +161 -0
- package/src/acp/__tests__/client-handler.test.ts +40 -0
- package/src/acp/__tests__/helpers/acp-config-stub.ts +0 -2
- package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +280 -0
- package/src/acp/auto-install.ts +232 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/prepare-agent-env.ts +80 -27
- package/src/acp/resolve-agent.test.ts +188 -28
- package/src/acp/resolve-agent.ts +119 -42
- package/src/acp/resume-hint.ts +23 -0
- package/src/acp/session-manager.ts +507 -73
- package/src/agent/compaction-circuit.ts +60 -102
- package/src/agent/loop.ts +403 -251
- package/src/api/events/tool-result.ts +9 -0
- package/src/api/events/tool-use-start.ts +7 -0
- package/src/api/responses/conversation-message.ts +72 -13
- package/src/api/responses/memory-v3-selection-log.ts +19 -10
- package/src/approvals/guardian-request-resolvers.ts +27 -1
- package/src/background-wake/next-wake.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +191 -210
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
- package/src/cli/commands/memory-v3.ts +57 -199
- package/src/cli/commands/plugins.ts +43 -37
- package/src/cli/lib/__tests__/install-from-github.test.ts +790 -111
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
- package/src/cli/lib/__tests__/plugin-details.test.ts +381 -0
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +270 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +233 -32
- package/src/cli/lib/install-from-github.ts +797 -60
- package/src/cli/lib/plugin-catalog-cache.ts +84 -0
- package/src/cli/lib/plugin-details.ts +416 -0
- package/src/cli/lib/plugin-marketplace.ts +215 -0
- package/src/cli/lib/search-plugins.ts +201 -29
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +9 -3
- package/src/config/acp-schema.ts +1 -7
- package/src/config/bundled-skills/acp/SKILL.md +80 -41
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
- package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-tool-registry.ts +4 -0
- package/src/config/call-site-defaults.ts +0 -3
- package/src/config/feature-flag-registry.json +10 -56
- package/src/config/llm-resolver.ts +39 -7
- package/src/config/loader.ts +5 -22
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -9
- package/src/config/schemas/call-site-catalog.ts +0 -21
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +17 -3
- package/src/config/schemas/memory-v3.ts +58 -8
- package/src/config/seed-inference-profiles.ts +18 -0
- package/src/context/compactor.ts +22 -4
- package/src/context/post-turn-tool-result-truncation.ts +39 -1
- package/src/context/strip-injections.ts +8 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +120 -42
- package/src/daemon/conversation-agent-loop.ts +308 -1297
- package/src/daemon/conversation-error.ts +31 -4
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +11 -255
- package/src/daemon/conversation-media-retry.ts +19 -6
- package/src/daemon/conversation-messaging.ts +17 -0
- package/src/daemon/conversation-process.ts +22 -141
- package/src/daemon/conversation-queue-manager.ts +8 -0
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +361 -393
- package/src/daemon/conversation-store.ts +9 -90
- package/src/daemon/conversation-surfaces.ts +165 -11
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +444 -62
- package/src/daemon/disk-pressure-policy.ts +0 -1
- package/src/daemon/external-plugins-bootstrap.ts +36 -46
- package/src/daemon/handlers/config-channels.ts +11 -2
- package/src/daemon/handlers/conversations.ts +3 -1
- package/src/daemon/handlers/shared.ts +9 -1
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-app-control-proxy.ts +72 -57
- package/src/daemon/host-proxy-preactivation.ts +1 -3
- package/src/daemon/lifecycle.ts +21 -7
- package/src/daemon/persist-unsendable-image.ts +62 -25
- package/src/daemon/process-message.ts +1 -1
- package/src/daemon/server.ts +2 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/wake-conversation-ops.ts +269 -0
- package/src/embedded/plugin-api.ts +2 -2
- package/src/export/__tests__/transcript-formatter.test.ts +5 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
- package/src/heartbeat/heartbeat-run-store.ts +23 -1
- package/src/heartbeat/heartbeat-service.ts +26 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
- package/src/ipc/skill-routes/memory.ts +4 -2
- package/src/memory/__tests__/activation-session-store.test.ts +41 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
- package/src/memory/__tests__/onboarding-events-store.test.ts +80 -0
- package/src/memory/activation-session-store.ts +43 -0
- package/src/memory/conversation-crud.ts +29 -19
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +5 -22
- package/src/memory/job-handlers/conversation-starters.ts +13 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
- package/src/memory/jobs-worker.ts +25 -1
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/273-onboarding-events-funnel-columns.ts +46 -0
- package/src/memory/migrations/274-create-activation-sessions.ts +15 -0
- package/src/memory/migrations/index.ts +3 -0
- package/src/memory/onboarding-events-store.ts +66 -18
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +13 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -97
- package/src/memory/v2/__tests__/page-store.test.ts +22 -0
- package/src/memory/v2/consolidation-job.ts +2 -63
- package/src/memory/v2/types.ts +5 -0
- package/src/messaging/providers/telegram-bot/api.ts +14 -5
- package/src/notifications/__tests__/copy-composer.test.ts +244 -0
- package/src/notifications/access-request-copy.ts +298 -0
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +9 -2
- package/src/notifications/copy-composer.ts +49 -267
- package/src/notifications/decision-engine.ts +16 -35
- package/src/notifications/home-feed-side-effect.ts +1 -6
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +40 -11
- package/src/plugin-api/types.ts +108 -0
- package/src/plugins/defaults/compaction/compact.ts +106 -0
- package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +250 -42
- package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
- package/src/plugins/defaults/compaction/manager-store.ts +57 -0
- package/src/plugins/defaults/compaction/package.json +1 -2
- package/src/{context → plugins/defaults/compaction}/window-manager.ts +95 -25
- package/src/plugins/defaults/empty-response/package.json +0 -1
- package/src/plugins/defaults/history-repair/package.json +0 -1
- package/src/plugins/defaults/index.ts +156 -26
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +285 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
- package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
- package/src/plugins/defaults/memory-retrieval/package.json +14 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +181 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +247 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +147 -134
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +456 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +662 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +306 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +402 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-needle.test.ts +135 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/sections.test.ts +125 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +74 -19
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +446 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +592 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -24
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +91 -0
- package/src/plugins/defaults/memory-v3-shadow/dense.ts +97 -0
- package/src/plugins/defaults/memory-v3-shadow/edge.ts +252 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +76 -0
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +555 -0
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +266 -0
- package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +71 -0
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +204 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +16 -8
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +236 -0
- package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +200 -0
- package/src/plugins/defaults/memory-v3-shadow/sections.ts +115 -0
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +156 -0
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +382 -0
- package/src/plugins/defaults/memory-v3-shadow/types.ts +92 -0
- package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +4 -1
- package/src/plugins/defaults/title-generate/package.json +0 -1
- package/src/plugins/defaults/tool-error/package.json +0 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
- package/src/plugins/external-api.ts +12 -2
- package/src/plugins/pipeline.ts +6 -293
- package/src/plugins/registry.ts +9 -37
- package/src/plugins/types.ts +76 -381
- package/src/plugins/user-loader.ts +30 -127
- package/src/prompts/__tests__/system-prompt.test.ts +6 -0
- package/src/prompts/system-prompt.ts +61 -10
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +71 -4
- package/src/providers/anthropic/client.ts +9 -10
- package/src/providers/inference/kimi-cjk-token-ids.ts +493 -0
- package/src/providers/inference/logit-bias.ts +55 -0
- package/src/providers/model-catalog.ts +57 -0
- package/src/providers/openai/__tests__/vision-not-supported.test.ts +75 -0
- package/src/providers/openai/chat-completions-provider.ts +44 -1
- package/src/providers/retry.ts +57 -7
- package/src/providers/types.ts +6 -0
- package/src/runtime/__tests__/agent-wake.test.ts +555 -691
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +108 -209
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/routes/__tests__/acp-routes.test.ts +466 -55
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
- package/src/runtime/routes/__tests__/stt-routes.test.ts +112 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
- package/src/runtime/routes/acp-routes.test.ts +185 -32
- package/src/runtime/routes/acp-routes.ts +328 -30
- package/src/runtime/routes/app-management-routes.ts +3 -0
- package/src/runtime/routes/approval-routes.ts +1 -1
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/browser-tabs-routes.ts +6 -10
- package/src/runtime/routes/channel-verification-routes.ts +14 -5
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +1 -1
- package/src/runtime/routes/conversation-routes.ts +30 -2
- package/src/runtime/routes/conversation-starter-routes.ts +13 -7
- package/src/runtime/routes/conversations-import-routes.ts +24 -7
- package/src/runtime/routes/host-app-control-routes.ts +1 -1
- package/src/runtime/routes/host-cu-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +18 -3
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
- package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
- package/src/runtime/routes/memory-v3-routes.ts +65 -305
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +337 -35
- package/src/runtime/routes/stt-routes.ts +45 -12
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/work-items-routes.ts +2 -4
- package/src/runtime/routes/workspace-routes.ts +50 -15
- package/src/runtime/services/conversation-serializer.ts +1 -1
- package/src/runtime/verification-outbound-actions.ts +147 -2
- package/src/runtime/verification-templates.ts +29 -3
- package/src/services/published-app-updater.ts +30 -8
- package/src/signals/cancel.ts +2 -4
- package/src/subagent/manager.ts +21 -5
- package/src/telemetry/__tests__/activation-funnel.test.ts +95 -0
- package/src/telemetry/activation-funnel.ts +167 -0
- package/src/telemetry/types.ts +13 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +154 -0
- package/src/telemetry/usage-telemetry-reporter.ts +26 -1
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +9 -19
- package/src/tools/acp/list-agents.ts +3 -15
- package/src/tools/acp/spawn.test.ts +173 -202
- package/src/tools/acp/spawn.ts +37 -172
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/executors.ts +166 -50
- package/src/tools/browser/browser-execution.ts +12 -2
- package/src/tools/filesystem/write.ts +34 -0
- package/src/tools/network/web-fetch.ts +65 -24
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/ui-surface/definitions.ts +32 -5
- package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
- package/docs/plugins.md +0 -832
- package/examples/plugins/echo/register.ts +0 -143
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
- package/src/__tests__/compaction-pipeline.test.ts +0 -210
- package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
- package/src/__tests__/pipeline-runner.test.ts +0 -554
- package/src/daemon/wake-target-adapter.ts +0 -253
- package/src/memory/v3/__tests__/assign.test.ts +0 -242
- package/src/memory/v3/__tests__/capabilities.test.ts +0 -118
- package/src/memory/v3/__tests__/core.test.ts +0 -39
- package/src/memory/v3/__tests__/health.test.ts +0 -219
- package/src/memory/v3/__tests__/maintain-job.test.ts +0 -288
- package/src/memory/v3/__tests__/needle.test.ts +0 -107
- package/src/memory/v3/__tests__/orchestrate.test.ts +0 -436
- package/src/memory/v3/__tests__/provider-blocks.test.ts +0 -13
- package/src/memory/v3/__tests__/reconcile.test.ts +0 -274
- package/src/memory/v3/__tests__/render-injection.test.ts +0 -61
- package/src/memory/v3/__tests__/router.test.ts +0 -332
- package/src/memory/v3/__tests__/selector.test.ts +0 -470
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +0 -432
- package/src/memory/v3/__tests__/snapshot.test.ts +0 -168
- package/src/memory/v3/__tests__/tree.test.ts +0 -192
- package/src/memory/v3/assign.ts +0 -268
- package/src/memory/v3/capabilities.ts +0 -124
- package/src/memory/v3/core.ts +0 -26
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +0 -314
- package/src/memory/v3/needle.ts +0 -115
- package/src/memory/v3/orchestrate.ts +0 -126
- package/src/memory/v3/page-content.ts +0 -34
- package/src/memory/v3/provider-blocks.ts +0 -26
- package/src/memory/v3/reconcile.ts +0 -523
- package/src/memory/v3/router.ts +0 -190
- package/src/memory/v3/selection-log-store.ts +0 -84
- package/src/memory/v3/selector.ts +0 -226
- package/src/memory/v3/shadow-plugin.ts +0 -411
- package/src/memory/v3/snapshot.ts +0 -209
- package/src/memory/v3/tree.ts +0 -174
- package/src/memory/v3/types.ts +0 -59
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
- package/src/plugins/defaults/circuit-breaker/package.json +0 -15
- package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
- package/src/plugins/defaults/compaction/register.ts +0 -35
- package/src/plugins/defaults/compaction/terminal.ts +0 -73
- package/src/plugins/defaults/empty-response/register.ts +0 -23
- package/src/plugins/defaults/history-repair/register.ts +0 -24
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +0 -216
- package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
- package/src/plugins/defaults/overflow-reduce/package.json +0 -15
- package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
- package/src/plugins/defaults/title-generate/register.ts +0 -35
- package/src/plugins/defaults/tool-error/register.ts +0 -23
- package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
- package/src/proactive-artifact/aux-message-injector.ts +0 -97
- package/src/proactive-artifact/decision.test.ts +0 -226
- package/src/proactive-artifact/decision.ts +0 -165
- package/src/proactive-artifact/index.ts +0 -7
- package/src/proactive-artifact/job.test.ts +0 -962
- package/src/proactive-artifact/job.ts +0 -372
- package/src/proactive-artifact/message-copy.ts +0 -58
- package/src/proactive-artifact/trigger-state.test.ts +0 -286
- package/src/proactive-artifact/trigger-state.ts +0 -123
- package/src/util/map-limit.ts +0 -27
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
- /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
|
@@ -17,7 +17,6 @@ import type {
|
|
|
17
17
|
import { getConfig } from "../config/loader.js";
|
|
18
18
|
import { recordEstimate } from "../context/estimator-calibration.js";
|
|
19
19
|
import { getCalibrationProviderKey } from "../context/token-estimator.js";
|
|
20
|
-
import type { ContextWindowResult } from "../context/window-manager.js";
|
|
21
20
|
import { projectAssistantMessage } from "../memory/conversation-attention-store.js";
|
|
22
21
|
import {
|
|
23
22
|
deleteMessageById,
|
|
@@ -46,6 +45,7 @@ import {
|
|
|
46
45
|
type SlackMessageMetadata,
|
|
47
46
|
writeSlackMetadata,
|
|
48
47
|
} from "../messaging/providers/slack/message-metadata.js";
|
|
48
|
+
import type { ContextWindowResult } from "../plugins/defaults/compaction/window-manager.js";
|
|
49
49
|
import type {
|
|
50
50
|
ContentBlock,
|
|
51
51
|
ImageContent,
|
|
@@ -76,10 +76,8 @@ import {
|
|
|
76
76
|
cleanAssistantContent,
|
|
77
77
|
drainDirectiveDisplayBuffer,
|
|
78
78
|
} from "./assistant-attachments.js";
|
|
79
|
-
import type {
|
|
80
|
-
|
|
81
|
-
AssistantSurface,
|
|
82
|
-
} from "./conversation-agent-loop.js";
|
|
79
|
+
import type { Conversation } from "./conversation.js";
|
|
80
|
+
import type { AssistantSurface } from "./conversation-agent-loop.js";
|
|
83
81
|
import {
|
|
84
82
|
buildConversationErrorMessage,
|
|
85
83
|
classifyConversationError,
|
|
@@ -284,6 +282,15 @@ export interface EventHandlerState {
|
|
|
284
282
|
* debounce so a mid-turn snapshot reflects what the user is watching live.
|
|
285
283
|
*/
|
|
286
284
|
currentMessageContent: ContentBlock[];
|
|
285
|
+
/**
|
|
286
|
+
* Per-thinking-block timing for the in-flight LLM call, in stream order:
|
|
287
|
+
* entry `i` is the `i`-th thinking block mirrored into `currentMessageContent`.
|
|
288
|
+
* `startedAt` is stamped when a thinking block opens; `completedAt` is the
|
|
289
|
+
* last reasoning delta fused into it. Used to stamp `_startedAt`/`_completedAt`
|
|
290
|
+
* onto the authoritative thinking blocks at `message_complete`, mirroring how
|
|
291
|
+
* tool calls persist timing. Reset alongside `currentMessageContent`.
|
|
292
|
+
*/
|
|
293
|
+
currentThinkingTimestamps: { startedAt: number; completedAt: number }[];
|
|
287
294
|
/**
|
|
288
295
|
* `seq` of the most recent streamed content delta mirrored into
|
|
289
296
|
* `currentMessageContent`. Recorded as the conversation's persisted `seq`
|
|
@@ -295,29 +302,11 @@ export interface EventHandlerState {
|
|
|
295
302
|
* never claims content a flush has not yet written.
|
|
296
303
|
*/
|
|
297
304
|
lastPersistedContentSeq: number | undefined;
|
|
298
|
-
/**
|
|
299
|
-
* Whether the workspace top-level block should be (re)injected on this
|
|
300
|
-
* turn. Compaction's prepare phase strips the workspace / NOW.md / PKB
|
|
301
|
-
* blocks off the tail, so it is set after any successful compaction to
|
|
302
|
-
* force the workspace overview back in. On an ordinary turn the block is
|
|
303
|
-
* already present in history, so it defaults `false` to avoid burning
|
|
304
|
-
* tokens re-injecting it redundantly.
|
|
305
|
-
*/
|
|
306
|
-
shouldInjectWorkspace: boolean;
|
|
307
|
-
/**
|
|
308
|
-
* Whether the reducer has compacted `ctx.messages`, gating the Slack
|
|
309
|
-
* chronological-transcript override on re-injection. The captured
|
|
310
|
-
* transcript is the full persisted history; blindly replaying it after
|
|
311
|
-
* compaction would overwrite the reduced messages and undo compaction, so
|
|
312
|
-
* once this is `true` the override falls back to the reduced
|
|
313
|
-
* `ctx.messages`.
|
|
314
|
-
*/
|
|
315
|
-
reducerCompacted: boolean;
|
|
316
305
|
}
|
|
317
306
|
|
|
318
307
|
/** Immutable context shared across event handlers within a single agent loop run. */
|
|
319
308
|
export interface EventHandlerDeps {
|
|
320
|
-
readonly ctx:
|
|
309
|
+
readonly ctx: Conversation;
|
|
321
310
|
readonly onEvent: (msg: ServerMessage) => void;
|
|
322
311
|
readonly reqId: string;
|
|
323
312
|
readonly isFirstMessage: boolean;
|
|
@@ -391,9 +380,8 @@ export function createEventHandlerState(): EventHandlerState {
|
|
|
391
380
|
pendingPartialFlushTimer: undefined,
|
|
392
381
|
pendingPartialFlushPromise: undefined,
|
|
393
382
|
currentMessageContent: [],
|
|
383
|
+
currentThinkingTimestamps: [],
|
|
394
384
|
lastPersistedContentSeq: undefined,
|
|
395
|
-
shouldInjectWorkspace: false,
|
|
396
|
-
reducerCompacted: false,
|
|
397
385
|
};
|
|
398
386
|
}
|
|
399
387
|
|
|
@@ -442,6 +430,37 @@ export function buildPersistedAssistantContent(
|
|
|
442
430
|
});
|
|
443
431
|
}
|
|
444
432
|
|
|
433
|
+
/**
|
|
434
|
+
* Stamp `_startedAt`/`_completedAt` onto the content's thinking blocks from the
|
|
435
|
+
* per-block timing captured while streaming, matched by position: the `i`-th
|
|
436
|
+
* thinking block in `content` takes `timings[i]`. The `_`-prefixed fields are
|
|
437
|
+
* vellum-internal metadata (never sent to providers), mirroring how tool calls
|
|
438
|
+
* persist timing; `renderHistoryContent` reads them back onto the wire schema's
|
|
439
|
+
* `startedAt`/`completedAt`.
|
|
440
|
+
*
|
|
441
|
+
* Timing is only captured when reasoning is streamed (`streamThinking`), so a
|
|
442
|
+
* turn with thinking disabled — or any block without a matching entry — is left
|
|
443
|
+
* unstamped and the UI hides its duration, exactly as a tool call with no
|
|
444
|
+
* timing does.
|
|
445
|
+
*/
|
|
446
|
+
export function stampThinkingTiming(
|
|
447
|
+
content: ContentBlock[],
|
|
448
|
+
timings: ReadonlyArray<{ startedAt: number; completedAt: number }>,
|
|
449
|
+
): ContentBlock[] {
|
|
450
|
+
if (timings.length === 0) return content;
|
|
451
|
+
let thinkingIdx = 0;
|
|
452
|
+
return content.map((block) => {
|
|
453
|
+
if (block.type !== "thinking") return block;
|
|
454
|
+
const timing = timings[thinkingIdx++];
|
|
455
|
+
if (!timing) return block;
|
|
456
|
+
return {
|
|
457
|
+
...block,
|
|
458
|
+
_startedAt: timing.startedAt,
|
|
459
|
+
_completedAt: timing.completedAt,
|
|
460
|
+
} as ContentBlock;
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
|
|
445
464
|
/** Append a streamed text chunk to `state.currentMessageContent`, fusing into tail text block. */
|
|
446
465
|
function appendTextToCurrentMessage(
|
|
447
466
|
state: EventHandlerState,
|
|
@@ -468,15 +487,19 @@ function appendThinkingToCurrentMessage(
|
|
|
468
487
|
thinking: string,
|
|
469
488
|
): void {
|
|
470
489
|
if (thinking.length === 0) return;
|
|
490
|
+
const now = Date.now();
|
|
471
491
|
const tail = state.currentMessageContent.at(-1);
|
|
472
492
|
if (tail && tail.type === "thinking") {
|
|
473
493
|
tail.thinking = tail.thinking + thinking;
|
|
494
|
+
const timing = state.currentThinkingTimestamps.at(-1);
|
|
495
|
+
if (timing) timing.completedAt = now;
|
|
474
496
|
} else {
|
|
475
497
|
state.currentMessageContent.push({
|
|
476
498
|
type: "thinking",
|
|
477
499
|
thinking,
|
|
478
500
|
signature: "",
|
|
479
501
|
});
|
|
502
|
+
state.currentThinkingTimestamps.push({ startedAt: now, completedAt: now });
|
|
480
503
|
}
|
|
481
504
|
}
|
|
482
505
|
|
|
@@ -487,6 +510,7 @@ function resetPartialPersistAccumulator(state: EventHandlerState): void {
|
|
|
487
510
|
state.pendingPartialFlushTimer = undefined;
|
|
488
511
|
}
|
|
489
512
|
state.currentMessageContent = [];
|
|
513
|
+
state.currentThinkingTimestamps = [];
|
|
490
514
|
state.lastPersistedContentSeq = undefined;
|
|
491
515
|
state.pendingPartialFlushPromise = undefined;
|
|
492
516
|
}
|
|
@@ -655,9 +679,7 @@ function computeToolUseStatusText(
|
|
|
655
679
|
return `Running ${friendlyToolName(name)}`;
|
|
656
680
|
}
|
|
657
681
|
|
|
658
|
-
function resolveAssistantReplyTimestampTimezone(
|
|
659
|
-
ctx: AgentLoopConversationContext,
|
|
660
|
-
): string {
|
|
682
|
+
function resolveAssistantReplyTimestampTimezone(ctx: Conversation): string {
|
|
661
683
|
const config = getConfig();
|
|
662
684
|
return resolveTurnTimezoneContext({
|
|
663
685
|
configuredUserTimeZone: config.ui?.userTimezone ?? null,
|
|
@@ -876,9 +898,14 @@ export function handleToolUse(
|
|
|
876
898
|
if (event.name === "app_create" || event.name === "app_refresh") {
|
|
877
899
|
state.appBuildToolUsedThisRun = true;
|
|
878
900
|
}
|
|
879
|
-
|
|
901
|
+
const startedAt = Date.now();
|
|
902
|
+
state.toolCallTimestamps.set(event.id, { startedAt });
|
|
880
903
|
state.currentToolUseId = event.id;
|
|
881
904
|
state.currentTurnToolUseIds.push(event.id);
|
|
905
|
+
// Stamp the start time onto the already-durable tool_use block so a snapshot
|
|
906
|
+
// fetched mid-tool (refresh / reconnect) carries it and clients can render a
|
|
907
|
+
// running timer without having seen the live `tool_use_start` event.
|
|
908
|
+
recordToolStartOnPersistedMessage(state, event.id, startedAt);
|
|
882
909
|
const statusText = computeToolUseStatusText(event.name, event.input);
|
|
883
910
|
deps.ctx.emitActivityState("tool_running", "tool_use_start", {
|
|
884
911
|
requestId: deps.reqId,
|
|
@@ -891,6 +918,7 @@ export function handleToolUse(
|
|
|
891
918
|
conversationId: deps.ctx.conversationId,
|
|
892
919
|
toolUseId: event.id,
|
|
893
920
|
messageId: state.lastAssistantMessageId,
|
|
921
|
+
startedAt,
|
|
894
922
|
});
|
|
895
923
|
// `message_complete` always precedes tool events (see handleMessageComplete),
|
|
896
924
|
// so this tool_use block is already durable in the assistant row. The
|
|
@@ -1272,8 +1300,9 @@ export async function handleToolResult(
|
|
|
1272
1300
|
});
|
|
1273
1301
|
|
|
1274
1302
|
// Record tool completion timestamp
|
|
1303
|
+
const completedAt = Date.now();
|
|
1275
1304
|
const ts = state.toolCallTimestamps.get(event.toolUseId);
|
|
1276
|
-
if (ts) ts.completedAt =
|
|
1305
|
+
if (ts) ts.completedAt = completedAt;
|
|
1277
1306
|
state.currentToolUseId = undefined;
|
|
1278
1307
|
|
|
1279
1308
|
// Capture risk metadata when present. autoApproved is true when the tool
|
|
@@ -1392,6 +1421,7 @@ export async function handleToolResult(
|
|
|
1392
1421
|
approvalReason: event.approvalReason,
|
|
1393
1422
|
riskThreshold: event.riskThreshold,
|
|
1394
1423
|
activityMetadata: event.activityMetadata,
|
|
1424
|
+
completedAt,
|
|
1395
1425
|
});
|
|
1396
1426
|
|
|
1397
1427
|
// Capture the seq synchronously (before the persist await) so it reflects the
|
|
@@ -1409,6 +1439,44 @@ export async function handleToolResult(
|
|
|
1409
1439
|
}
|
|
1410
1440
|
}
|
|
1411
1441
|
|
|
1442
|
+
/**
|
|
1443
|
+
* Stamp `_startedAt` onto the in-flight tool_use block in the persisted
|
|
1444
|
+
* assistant message the moment the tool begins. The block is already durable
|
|
1445
|
+
* (message_complete precedes tool events), so without this a `/messages`
|
|
1446
|
+
* snapshot fetched mid-tool would carry no start time and clients could not
|
|
1447
|
+
* render a running elapsed-time counter until the whole turn finished. The
|
|
1448
|
+
* full timing + risk annotation still happens in
|
|
1449
|
+
* `annotatePersistedAssistantMessage` once every tool in the turn completes.
|
|
1450
|
+
*/
|
|
1451
|
+
function recordToolStartOnPersistedMessage(
|
|
1452
|
+
state: EventHandlerState,
|
|
1453
|
+
toolUseId: string,
|
|
1454
|
+
startedAt: number,
|
|
1455
|
+
): void {
|
|
1456
|
+
const messageId = state.lastAssistantMessageId;
|
|
1457
|
+
if (!messageId) return;
|
|
1458
|
+
|
|
1459
|
+
const row = getMessageById(messageId);
|
|
1460
|
+
if (!row) return;
|
|
1461
|
+
|
|
1462
|
+
let content: ContentBlock[];
|
|
1463
|
+
try {
|
|
1464
|
+
content = JSON.parse(row.content) as ContentBlock[];
|
|
1465
|
+
} catch {
|
|
1466
|
+
return;
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
for (const block of content) {
|
|
1470
|
+
if (block.type !== "tool_use") continue;
|
|
1471
|
+
const rec = block as unknown as Record<string, unknown>;
|
|
1472
|
+
if (rec.id !== toolUseId) continue;
|
|
1473
|
+
if (rec._startedAt === startedAt) return;
|
|
1474
|
+
rec._startedAt = startedAt;
|
|
1475
|
+
updateMessageContent(messageId, JSON.stringify(content));
|
|
1476
|
+
return;
|
|
1477
|
+
}
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1412
1480
|
/**
|
|
1413
1481
|
* After all tools for the current turn complete, fetch the persisted assistant
|
|
1414
1482
|
* message, annotate its tool_use blocks with timing and confirmation metadata,
|
|
@@ -1506,6 +1574,13 @@ function annotatePersistedAssistantMessage(
|
|
|
1506
1574
|
display: surface.display,
|
|
1507
1575
|
...(surface.persistent ? { persistent: true } : {}),
|
|
1508
1576
|
...(surface.toolCallId ? { toolCallId: surface.toolCallId } : {}),
|
|
1577
|
+
// Daemon-only commit-timing activation tag, persisted so
|
|
1578
|
+
// restoreSurfaceStateFromHistory can rehydrate it after a reload. This
|
|
1579
|
+
// block lives only in server-side conversation history, never in the
|
|
1580
|
+
// client `ui_surface_show` message.
|
|
1581
|
+
...(surface.activationMoment
|
|
1582
|
+
? { activationMoment: surface.activationMoment }
|
|
1583
|
+
: {}),
|
|
1509
1584
|
} as unknown as ContentBlock);
|
|
1510
1585
|
}
|
|
1511
1586
|
modified = true;
|
|
@@ -1659,6 +1734,8 @@ export async function handleMessageComplete(
|
|
|
1659
1734
|
deps.ctx.conversationId,
|
|
1660
1735
|
state.pendingNotifiedInferenceProfile,
|
|
1661
1736
|
);
|
|
1737
|
+
deps.ctx.lastNotifiedInferenceProfile =
|
|
1738
|
+
state.pendingNotifiedInferenceProfile;
|
|
1662
1739
|
state.pendingNotifiedInferenceProfile = null;
|
|
1663
1740
|
}
|
|
1664
1741
|
|
|
@@ -1745,10 +1822,13 @@ export async function handleMessageComplete(
|
|
|
1745
1822
|
// redacted) via the shared helper. The partial-persist flush uses
|
|
1746
1823
|
// the same helper with `surfaces=[]` so a mid-turn snapshot lands in
|
|
1747
1824
|
// the same shape as the finalize.
|
|
1748
|
-
const contentForPersistence =
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1825
|
+
const contentForPersistence = stampThinkingTiming(
|
|
1826
|
+
buildPersistedAssistantContent(
|
|
1827
|
+
event.message.content as ContentBlock[],
|
|
1828
|
+
deps.ctx.currentTurnSurfaces,
|
|
1829
|
+
state.toolActivityMetadata,
|
|
1830
|
+
),
|
|
1831
|
+
state.currentThinkingTimestamps,
|
|
1752
1832
|
);
|
|
1753
1833
|
|
|
1754
1834
|
// The row was reserved at `llm_call_started` (with channel metadata
|
|
@@ -1781,6 +1861,7 @@ export async function handleMessageComplete(
|
|
|
1781
1861
|
// Reset the partial-persist mirror so subsequent calls in this turn
|
|
1782
1862
|
// start with an empty running view.
|
|
1783
1863
|
state.currentMessageContent = [];
|
|
1864
|
+
state.currentThinkingTimestamps = [];
|
|
1784
1865
|
state.lastPersistedContentSeq = undefined;
|
|
1785
1866
|
|
|
1786
1867
|
// ── Indexing + attention projection ──
|
|
@@ -2302,17 +2383,14 @@ export async function dispatchAgentEvent(
|
|
|
2302
2383
|
// so re-injection re-applies onto the stripped history even when the
|
|
2303
2384
|
// pipeline ran but did not compact. When it did compact, commit the
|
|
2304
2385
|
// durable result (DB-record fields, Slack provenance, SSE) — which
|
|
2305
|
-
// overwrites `ctx.messages` with the compacted history
|
|
2306
|
-
// per-turn re-injection guards the orchestrator reads. This runs
|
|
2386
|
+
// overwrites `ctx.messages` with the compacted history. This runs
|
|
2307
2387
|
// before the loop's `reinject` hook (the loop awaits this dispatch),
|
|
2308
|
-
// so the
|
|
2309
|
-
// below to abort the turn rather than re-injecting
|
|
2310
|
-
// half-applied state.
|
|
2388
|
+
// so the committed history is in place in time. A failed durable
|
|
2389
|
+
// commit re-throws below to abort the turn rather than re-injecting
|
|
2390
|
+
// against half-applied state.
|
|
2311
2391
|
deps.ctx.messages = event.basis;
|
|
2312
2392
|
if (event.result.compacted) {
|
|
2313
2393
|
await deps.applyCompaction(event.result, event.basis);
|
|
2314
|
-
state.reducerCompacted = true;
|
|
2315
|
-
state.shouldInjectWorkspace = true;
|
|
2316
2394
|
}
|
|
2317
2395
|
break;
|
|
2318
2396
|
case "history_stripped":
|