mixdog 1.1.2 → 1.2.0
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/README.md +1 -0
- package/package.json +2 -1
- package/scripts/lib/run-node-tests.mjs +9 -0
- package/scripts/prune-desktop-runtime.mjs +3 -0
- package/scripts/test-direct.mjs +4 -2
- package/src/defaults/shipped-history.json +6 -0
- package/src/defaults/skills/setup/references/actions.md +5 -2
- package/src/defaults/skills/visualize/SKILL.md +157 -0
- package/src/defaults/skills/visualize/references/craft.md +88 -0
- package/src/headless-command.mjs +56 -3
- package/src/headless-exec.mjs +17 -1
- package/src/help.mjs +2 -0
- package/src/rules/shared/70-delivery.md +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +2 -0
- package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +17 -11
- package/src/runtime/agent/orchestrator/config-storage.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +9 -1
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +47 -7
- package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +51 -8
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +25 -5
- package/src/runtime/agent/orchestrator/mcp/client.mjs +348 -122
- package/src/runtime/agent/orchestrator/mcp/reconnect-singleflight.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +15 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +12 -4
- package/src/runtime/agent/orchestrator/providers/effort-rejection.mjs +244 -0
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +8 -40
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-tokens.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +51 -12
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +37 -2
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +67 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +521 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +251 -0
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth-tokens.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +69 -102
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog-store.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +15 -1
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +10 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +36 -3
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +12 -11
- package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +16 -1
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +11 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +10 -3
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +9 -5
- package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +10 -3
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +18 -11
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +362 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +253 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/diagnostic.mjs +1 -7
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/refusal.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +17 -7
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +37 -16
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +90 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +22 -12
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +32 -3
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +27 -0
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/message-ids.mjs +123 -0
- package/src/runtime/agent/orchestrator/session/message-ids.test-support.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +29 -19
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +10 -3
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +23 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +20 -3
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +28 -8
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +140 -0
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +52 -2
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +32 -22
- package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-cache-policy.mjs +8 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +31 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +32 -35
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +11 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +9 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +80 -66
- package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +8 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +16 -7
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +137 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +11 -10
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +21 -11
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +56 -13
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +58 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +25 -1
- package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +78 -5
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +2 -0
- package/src/runtime/attachments/store.mjs +38 -0
- package/src/runtime/shared/atomic-file.mjs +8 -2
- package/src/runtime/shared/best-effort-stderr.mjs +8 -0
- package/src/runtime/shared/code-graph-state.mjs +12 -0
- package/src/runtime/shared/defaults-separation.mjs +2 -0
- package/src/runtime/shared/git-runner-worker.mjs +3 -2
- package/src/runtime/shared/git-runner.mjs +4 -3
- package/src/runtime/shared/llm/default-context-window.mjs +6 -0
- package/src/runtime/shared/llm/model-catalog-projection.mjs +5 -4
- package/src/runtime/shared/llm/model-catalog.mjs +240 -118
- package/src/runtime/shared/llm/provider-catalog-cache.mjs +36 -28
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +156 -0
- package/src/runtime/shared/llm/provider-seed-rosters.mjs +130 -0
- package/src/runtime/shared/model-proxy-mode.d.mts +3 -0
- package/src/runtime/shared/model-proxy-mode.mjs +19 -0
- package/src/runtime/shared/provider-accounts.mjs +2 -2
- package/src/runtime/shared/provider-api-key.mjs +21 -1
- package/src/runtime/shared/schedule-model-ref.mjs +11 -2
- package/src/runtime/shared/session-usage-totals.mjs +19 -0
- package/src/runtime/shared/sharp-electron-linux.mjs +25 -0
- package/src/runtime/shared/singleton-owner.mjs +36 -6
- package/src/runtime/shared/statusline/statusline-segments.mjs +68 -14
- package/src/runtime/shared/tool-surface.mjs +7 -0
- package/src/runtime/shared/tool-work-units.mjs +14 -0
- package/src/runtime/shared/transcript-metadata.mjs +17 -1
- package/src/runtime/shared/turn-changes.mjs +791 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +346 -12
- package/src/runtime/shared/turn-snapshot.mjs +690 -81
- package/src/runtime/shared/turn-worktree-snapshot.mjs +161 -11
- package/src/runtime/shared/worktrees/cache-cleanups.mjs +52 -0
- package/src/runtime/shared/worktrees/contract.mjs +551 -0
- package/src/runtime/shared/worktrees/disk.mjs +57 -0
- package/src/runtime/shared/worktrees/git.mjs +247 -0
- package/src/runtime/shared/worktrees/include.mjs +480 -0
- package/src/runtime/shared/worktrees/lock.mjs +46 -0
- package/src/runtime/shared/worktrees/maintenance.mjs +96 -0
- package/src/runtime/shared/worktrees/manager.mjs +1215 -0
- package/src/runtime/shared/worktrees/merge.mjs +182 -0
- package/src/runtime/shared/worktrees/owner.mjs +46 -0
- package/src/runtime/shared/worktrees/paths.mjs +62 -0
- package/src/runtime/shared/worktrees/registry.mjs +110 -0
- package/src/runtime/shared/worktrees/settings.mjs +84 -0
- package/src/runtime/shared/worktrees/slug.mjs +62 -0
- package/src/runtime/shared/worktrees/test-support.mjs +96 -0
- package/src/runtime/visualize-bridge/client.mjs +181 -0
- package/src/runtime/visualize-bridge/tool-defs.mjs +97 -0
- package/src/session-runtime/boot/apis.mjs +35 -0
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +20 -0
- package/src/session-runtime/boot/infrastructure.mjs +1 -0
- package/src/session-runtime/boot/session.mjs +1 -0
- package/src/session-runtime/boot/tools.mjs +4 -0
- package/src/session-runtime/config-lifecycle.mjs +10 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +11 -1
- package/src/session-runtime/global-extensions.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +27 -2
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +32 -1
- package/src/session-runtime/internal-tool-executor.mjs +9 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +8 -1
- package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +5 -0
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +21 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +16 -0
- package/src/session-runtime/mcp-glue/connect.mjs +11 -6
- package/src/session-runtime/mcp-glue/server-catalog.mjs +7 -3
- package/src/session-runtime/mcp-glue/server-input.mjs +29 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -0
- package/src/session-runtime/model-route/set-route.mjs +15 -2
- package/src/session-runtime/notification-bus.mjs +9 -1
- package/src/session-runtime/provider-models/row-hydration.mjs +2 -0
- package/src/session-runtime/resource-extension-sync.mjs +30 -7
- package/src/session-runtime/resource-mcp-api.mjs +20 -7
- package/src/session-runtime/route-resolution.mjs +10 -1
- package/src/session-runtime/route-state.mjs +16 -2
- package/src/session-runtime/runtime-core.mjs +5 -0
- package/src/session-runtime/runtime-facade.mjs +8 -0
- package/src/session-runtime/runtime-review-api.mjs +9 -0
- package/src/session-runtime/services/agent-tool/helpers.mjs +5 -0
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +3 -0
- package/src/session-runtime/services/agent-tool/job-views/job-lookup.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-views/spawn-meta.mjs +1 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +15 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +1 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +10 -2
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -7
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +2 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -0
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +1 -0
- package/src/session-runtime/services/agent-tool.mjs +1 -0
- package/src/session-runtime/services/daemon-candidate.mjs +3 -2
- package/src/session-runtime/services/daemon-crash-capture/spawn-capture.mjs +55 -0
- package/src/session-runtime/session-create/session-options.mjs +10 -1
- package/src/session-runtime/session-turn-api.mjs +1 -0
- package/src/session-runtime/settings-api.mjs +4 -2
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -2
- package/src/session-runtime/settings-worktree-api.mjs +17 -0
- package/src/session-runtime/setup-tool/executor.mjs +11 -4
- package/src/session-runtime/setup-tool/settings-contract.mjs +3 -1
- package/src/session-runtime/setup-tool/tool-defs.mjs +31 -3
- package/src/session-runtime/turn/agent-ops.mjs +12 -1
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +13 -3
- package/src/session-runtime/turn/turn-run/snapshot-tracker.mjs +20 -15
- package/src/session-runtime/turn/turn-run/turn-open.mjs +4 -5
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +29 -1
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +6 -1
- package/src/session-runtime/turn/turn-run.mjs +6 -7
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -3
- package/src/session-runtime/workspace/admission-gate.mjs +197 -0
- package/src/session-runtime/workspace/project-branches.mjs +136 -0
- package/src/session-runtime/workspace/transition-steps.mjs +364 -0
- package/src/session-runtime/workspace/transitions.mjs +651 -0
- package/src/session-runtime/workspace/workspace-state.mjs +112 -0
- package/src/standalone/channel-transport/http-routes.mjs +17 -0
- package/src/standalone/channel-transport.mjs +13 -1
- package/src/standalone/daemon-desktop-runtime.mjs +1 -0
- package/src/standalone/daemon-owner.mjs +372 -0
- package/src/standalone/daemon-stored-session-views.mjs +4 -1
- package/src/standalone/daemon.mjs +139 -5
- package/src/standalone/desktop-service-registry.mjs +20 -0
- package/src/standalone/local-session-runtime.mjs +11 -0
- package/src/standalone/session-client/attachment-calls.mjs +3 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +62 -0
- package/src/standalone/session-client/lease-heartbeat.mjs +47 -0
- package/src/standalone/session-client.mjs +104 -13
- package/src/standalone/session-protocol.mjs +16 -0
- package/src/standalone/session-proxy.mjs +3 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +4 -0
- package/src/standalone/session-service/agent-tree/agent-rehydrate.mjs +1 -0
- package/src/standalone/session-service/entries/lifecycle.mjs +6 -0
- package/src/standalone/session-service/projection/revisions.mjs +2 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +149 -19
- package/src/standalone/session-service/projection/workspace.mjs +14 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +11 -3
- package/src/standalone/session-transport/call-route.mjs +13 -0
- package/src/standalone/session-transport/client-registry/client-grace.mjs +45 -3
- package/src/standalone/session-transport/client-registry/registration-replays.mjs +1 -0
- package/src/standalone/session-transport/client-registry.mjs +20 -3
- package/src/standalone/session-transport/routes.mjs +79 -2
- package/src/standalone/session-transport/stack.mjs +2 -0
- package/src/standalone/session-transport.mjs +24 -1
- package/src/tui/app/message-selector.mjs +2 -1
- package/src/tui/app/model-options.mjs +35 -5
- package/src/tui/app/model-picker/provider-models-list.mjs +2 -2
- package/src/tui/app/model-picker.mjs +4 -2
- package/src/tui/dist/index.mjs +332 -36
- package/src/tui/index.jsx +10 -2
- package/src/tui/session/compaction-view.mjs +147 -0
- package/src/tui/session/context-state.mjs +6 -0
- package/src/tui/session/initial-state.mjs +3 -0
- package/src/tui/session/quota-resume.mjs +2 -1
- package/src/tui/session/session-api/commands.mjs +10 -2
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/intake/rewind.mjs +2 -1
- package/src/tui/session/session-api/integrations.mjs +17 -0
- package/src/tui/session/session-api/lifecycle/dispose.mjs +6 -1
- package/src/tui/session/session-api/lifecycle/inheritance.mjs +2 -0
- package/src/tui/session/session-api/lifecycle/resume.mjs +3 -0
- package/src/tui/session/session-api/routes.mjs +10 -1
- package/src/tui/session/session-api/settings.mjs +2 -0
- package/src/tui/session/session-api/worktree.mjs +60 -0
- package/src/tui/session/session-api.mjs +2 -0
- package/src/tui/session/session-flow/auto-clear.mjs +31 -12
- package/src/tui/session/session-flow/drain.mjs +15 -1
- package/src/tui/session/session-flow/session-reset.mjs +4 -3
- package/src/tui/session/session-flow.mjs +2 -0
- package/src/tui/session/transcript-intake.mjs +14 -5
- package/src/tui/session/turn-stream.mjs +32 -4
- package/src/tui/session/turn-tool-cards.mjs +10 -2
- package/src/tui/session/turn.mjs +39 -10
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// scalars); every function here takes it as its first argument.
|
|
6
6
|
import { TUI_FRAME_MS, yieldToRenderer } from './render-timing.mjs';
|
|
7
7
|
import { retryStatusLine } from '../../runtime/shared/err-text.mjs';
|
|
8
|
+
import { newTranscriptMessageId } from '../../runtime/shared/transcript-metadata.mjs';
|
|
8
9
|
|
|
9
10
|
// Share Ink's exact 120fps cadence with the frame-batched store. A separate
|
|
10
11
|
// 16ms timer left every other terminal frame idle, so completed script lines
|
|
@@ -59,9 +60,27 @@ function ensureAssistant(stream, initialText = '') {
|
|
|
59
60
|
if (!stream.currentAssistantId) {
|
|
60
61
|
stream.currentAssistantId = stream.nextId();
|
|
61
62
|
const meta = stream.transcriptMeta;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
// A non-streaming continuation was persisted before its text reached this
|
|
64
|
+
// row: the runtime left that message's id and time (ask-session
|
|
65
|
+
// takeAssistant), and the row carries them instead of minting new ones.
|
|
66
|
+
const persisted = stream.claimPersistedAssistant ? meta.persistedAssistant : null;
|
|
67
|
+
if (persisted) meta.persistedAssistant = null;
|
|
68
|
+
let assistantAt = persisted?.at;
|
|
69
|
+
let messageId = persisted?.messageId;
|
|
70
|
+
if (!persisted) {
|
|
71
|
+
assistantAt =
|
|
72
|
+
Number.isFinite(Number(meta.assistantAt)) && Number(meta.assistantAt) > 0
|
|
73
|
+
? Number(meta.assistantAt)
|
|
74
|
+
: Date.now();
|
|
75
|
+
meta.assistantAt = assistantAt;
|
|
76
|
+
// The reply this segment becomes is persisted with this stable id (the
|
|
77
|
+
// runtime takes it with assistantAt), so a compaction that drops the
|
|
78
|
+
// reply greys this row.
|
|
79
|
+
if (!(typeof meta.assistantMessageId === 'string' && meta.assistantMessageId)) {
|
|
80
|
+
meta.assistantMessageId = newTranscriptMessageId();
|
|
81
|
+
}
|
|
82
|
+
messageId = meta.assistantMessageId;
|
|
83
|
+
}
|
|
65
84
|
// Do NOT reset currentAssistantText here: the first onTextDelta has
|
|
66
85
|
// already accumulated the opening chunk before this batched flush runs.
|
|
67
86
|
// Segment resets are owned by closeAssistantSegment(). Seed the new row
|
|
@@ -70,6 +89,7 @@ function ensureAssistant(stream, initialText = '') {
|
|
|
70
89
|
stream.updateStreamingTail(stream.currentAssistantId, {
|
|
71
90
|
text: String(initialText || ''),
|
|
72
91
|
at: assistantAt,
|
|
92
|
+
messageId,
|
|
73
93
|
...stream.routeMeta,
|
|
74
94
|
});
|
|
75
95
|
}
|
|
@@ -86,6 +106,7 @@ function resetLineScan(stream) {
|
|
|
86
106
|
function closeAssistantSegment(stream) {
|
|
87
107
|
stream.currentAssistantId = null;
|
|
88
108
|
stream.currentAssistantText = '';
|
|
109
|
+
stream.claimPersistedAssistant = false;
|
|
89
110
|
resetLineScan(stream);
|
|
90
111
|
}
|
|
91
112
|
|
|
@@ -290,11 +311,18 @@ export function appendTextDelta(stream, textChunk) {
|
|
|
290
311
|
// Mid-turn assistant text that precedes a tool call from a provider that only
|
|
291
312
|
// returns the final response.content (no deltas); the streaming path owns
|
|
292
313
|
// the render when it already produced text for this segment.
|
|
293
|
-
export function appendAssistantText(stream, full) {
|
|
314
|
+
export function appendAssistantText(stream, full, { committed = false } = {}) {
|
|
294
315
|
endThinkingForText(stream);
|
|
295
316
|
stream.assistantText += full;
|
|
296
317
|
stream.currentAssistantText += full;
|
|
297
318
|
stream.pendingTextFlush = true;
|
|
319
|
+
// Only post-commit text is the persisted message's own: its row takes that
|
|
320
|
+
// id. Any other text (a tool preamble published before its message commits)
|
|
321
|
+
// leaves an earlier recorded id unclaimed, so drop it.
|
|
322
|
+
stream.claimPersistedAssistant = committed;
|
|
323
|
+
if (!committed && stream.transcriptMeta && typeof stream.transcriptMeta === 'object') {
|
|
324
|
+
stream.transcriptMeta.persistedAssistant = null;
|
|
325
|
+
}
|
|
298
326
|
flushStreamBatch(stream);
|
|
299
327
|
}
|
|
300
328
|
|
|
@@ -57,10 +57,12 @@ export async function builtinSkillNamesFor(runtime, calls) {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// Transcript spec for a standalone (non-aggregated) tool card.
|
|
60
|
-
function standaloneCardSpec(itemId, name, args) {
|
|
60
|
+
function standaloneCardSpec(itemId, name, args, callId = '') {
|
|
61
61
|
return {
|
|
62
62
|
kind: 'tool',
|
|
63
63
|
id: itemId,
|
|
64
|
+
// Ties the card to its call (a compaction that drops it greys the card).
|
|
65
|
+
...(callId ? { callId } : {}),
|
|
64
66
|
name,
|
|
65
67
|
args,
|
|
66
68
|
result: null,
|
|
@@ -221,7 +223,13 @@ function openToolCard(cards, call, index, batch) {
|
|
|
221
223
|
// Defer the visible push: the card enters the transcript when its real
|
|
222
224
|
// header will paint (delay elapsed) or its result lands first, so no
|
|
223
225
|
// blank placeholder height scrolls the body ahead of the glyphs.
|
|
224
|
-
const card = {
|
|
226
|
+
const card = {
|
|
227
|
+
itemId,
|
|
228
|
+
callId: callKey,
|
|
229
|
+
done: false,
|
|
230
|
+
pushed: false,
|
|
231
|
+
spec: standaloneCardSpec(itemId, name, args, callId),
|
|
232
|
+
};
|
|
225
233
|
cards.deferredCards.registerCard(card);
|
|
226
234
|
trackCard(cards, callId, card);
|
|
227
235
|
// Immediate row-reserve is deferred until every touched aggregate has its
|
package/src/tui/session/turn.mjs
CHANGED
|
@@ -18,6 +18,7 @@ import { isRejected429, safeErrorDetails } from '../../runtime/shared/error-pres
|
|
|
18
18
|
import { registerTaskWaitSteeringCheck } from '../../runtime/agent/orchestrator/session/task-wait-control.mjs';
|
|
19
19
|
import { promptDisplayText, STEERING_SUPPRESSED_DISPLAY } from './queue-helpers.mjs';
|
|
20
20
|
import { yieldToRenderer } from './render-timing.mjs';
|
|
21
|
+
import { archiveItemsForCompaction, compactionArchivedRows } from './compaction-view.mjs';
|
|
21
22
|
import {
|
|
22
23
|
createTurnStream,
|
|
23
24
|
flushStreamBatch,
|
|
@@ -105,7 +106,8 @@ function beginTurn({ flags, getState, transcriptRouteMetadata }, options) {
|
|
|
105
106
|
completionVerb,
|
|
106
107
|
};
|
|
107
108
|
flags.pendingTranscriptMeta = null;
|
|
108
|
-
|
|
109
|
+
// The prompt's own time and stable id stay on the prompt row.
|
|
110
|
+
const { at: _userItemAt, messageId: _promptMessageId, ...routeMeta } = transcriptMeta;
|
|
109
111
|
return {
|
|
110
112
|
index,
|
|
111
113
|
startedAt,
|
|
@@ -182,6 +184,11 @@ function commitPromptRestore(flags, turn) {
|
|
|
182
184
|
|
|
183
185
|
function steeringItemExtras(steeringMeta) {
|
|
184
186
|
return {
|
|
187
|
+
// The steered message's stable id, so a compaction that drops it greys
|
|
188
|
+
// this row.
|
|
189
|
+
...(typeof steeringMeta?.messageId === 'string' && steeringMeta.messageId
|
|
190
|
+
? { messageId: steeringMeta.messageId }
|
|
191
|
+
: {}),
|
|
185
192
|
// Queue mode + execution provenance: a task notification is rendered as
|
|
186
193
|
// a tool card, never as an injected user bubble.
|
|
187
194
|
...(steeringMeta?.mode === 'task-notification' ? { mode: 'task-notification' } : {}),
|
|
@@ -261,10 +268,10 @@ function publishContextPressure({ syncContextStats, getState, set }, info) {
|
|
|
261
268
|
}
|
|
262
269
|
|
|
263
270
|
// Compaction itself remains owned by the pre-provider-send pass. This event
|
|
264
|
-
//
|
|
265
|
-
//
|
|
266
|
-
// pressure.
|
|
267
|
-
function applyCompactEvent(ctx, event) {
|
|
271
|
+
// archives the visible rows before the current turn (they stay in view above
|
|
272
|
+
// the compaction divider) and refreshes the gauge from the already-mutated
|
|
273
|
+
// transcript before another render can show stale pressure.
|
|
274
|
+
export function applyCompactEvent(ctx, event) {
|
|
268
275
|
const { turn, stream, cards, getState, set, replaceItems, pushItem, nextId, syncContextStats, routeState } = ctx;
|
|
269
276
|
flushStreamBatch(stream);
|
|
270
277
|
// Non-tool transcript item — same block-boundary rule as the steered user
|
|
@@ -272,12 +279,31 @@ function applyCompactEvent(ctx, event) {
|
|
|
272
279
|
cards.aggregates.clearAggregateContinuation();
|
|
273
280
|
const compactStatus = String(event?.status || '').toLowerCase();
|
|
274
281
|
const compactChanged = !['failed', 'skipped', 'no_change'].includes(compactStatus);
|
|
282
|
+
const doneItem = {
|
|
283
|
+
kind: 'statusdone',
|
|
284
|
+
id: nextId(),
|
|
285
|
+
label: compactEventLabel(event),
|
|
286
|
+
detail: compactEventDetail(event),
|
|
287
|
+
};
|
|
275
288
|
if (compactChanged) {
|
|
276
|
-
|
|
277
|
-
turn.
|
|
289
|
+
// The current turn starts at its submitted row (spill paging may have
|
|
290
|
+
// shifted the index recorded at turn start).
|
|
291
|
+
const current = getState().items;
|
|
292
|
+
const submitted = new Set(turn.submittedIds.filter((id) => id != null));
|
|
293
|
+
const submittedIndex = submitted.size ? current.findIndex((item) => submitted.has(item?.id)) : -1;
|
|
294
|
+
const boundary = submittedIndex >= 0 ? submittedIndex : turn.currentItemsStart;
|
|
295
|
+
const { items, dividerIndex } = archiveItemsForCompaction(current, doneItem, boundary, {
|
|
296
|
+
archived: compactionArchivedRows(event),
|
|
297
|
+
// Only explicit identities name what left the current turn; a bare
|
|
298
|
+
// count says nothing about it.
|
|
299
|
+
archiveTail: Boolean(event?.droppedIdentities && typeof event.droppedIdentities === 'object'),
|
|
300
|
+
});
|
|
301
|
+
set({ items: replaceItems(items, { preserveStreamingTail: true, preserveSpill: true }) });
|
|
302
|
+
turn.currentItemsStart = dividerIndex + 1;
|
|
278
303
|
turn.transcriptCompacted = true;
|
|
304
|
+
} else {
|
|
305
|
+
pushItem(doneItem);
|
|
279
306
|
}
|
|
280
|
-
pushItem({ kind: 'statusdone', id: nextId(), label: compactEventLabel(event), detail: compactEventDetail(event) });
|
|
281
307
|
syncContextStats({ allowEstimated: true, invalidateExact: compactChanged });
|
|
282
308
|
// syncContextStats only STAGES its patch; publication is the caller's, and
|
|
283
309
|
// without this set the post-compact gauge reached React only if some later
|
|
@@ -359,7 +385,7 @@ function streamHandlers(ctx) {
|
|
|
359
385
|
appendTextDelta(stream, textChunk);
|
|
360
386
|
},
|
|
361
387
|
onTextReset: (reset = {}) => (isCurrentTurn() ? resetStreamedText(stream, reset) : false),
|
|
362
|
-
onAssistantText: (text) => {
|
|
388
|
+
onAssistantText: (text, detail) => {
|
|
363
389
|
const full = String(text ?? '');
|
|
364
390
|
if (!full.trim() || !isCurrentTurn()) return;
|
|
365
391
|
// The streaming path owns this segment when it already produced text.
|
|
@@ -367,7 +393,7 @@ function streamHandlers(ctx) {
|
|
|
367
393
|
// there across tool calls.
|
|
368
394
|
if (stream.currentAssistantText.trim()) return;
|
|
369
395
|
ctx.markPromptCommitted();
|
|
370
|
-
appendAssistantText(stream, full);
|
|
396
|
+
appendAssistantText(stream, full, { committed: detail?.committed === true });
|
|
371
397
|
},
|
|
372
398
|
onReasoningDelta: (chunk) => {
|
|
373
399
|
if (isCurrentTurn()) appendReasoningDelta(stream, String(chunk ?? ''));
|
|
@@ -420,9 +446,12 @@ export function failTurn(ctx, error) {
|
|
|
420
446
|
}
|
|
421
447
|
|
|
422
448
|
export function turnDoneItem({ turn, stream, cards, getState, nextId }) {
|
|
449
|
+
// The outer prompt id is the turn's change-record key (runtime.ask `id`).
|
|
450
|
+
const checkpointId = turn.submittedIds[0] == null ? '' : String(turn.submittedIds[0]).trim();
|
|
423
451
|
return {
|
|
424
452
|
kind: 'turndone',
|
|
425
453
|
id: nextId(),
|
|
454
|
+
...(checkpointId ? { checkpointId } : {}),
|
|
426
455
|
elapsedMs: Date.now() - turn.startedAt,
|
|
427
456
|
status: turnOutcome(turn.cancelled, turn.failed),
|
|
428
457
|
// Notifications resolve this exact terminal assistant item, never a
|