mixdog 1.2.5 → 1.3.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/LICENSES/simple-icons-CC0-1.0.txt +30 -0
- package/NOTICE.md +19 -0
- package/package.json +4 -1
- package/scripts/check-model-recommendations.mjs +89 -0
- package/scripts/gate-local.mjs +7 -0
- package/scripts/lib/gate-scheduler.mjs +2 -2
- package/scripts/lib/isolated-test-env.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +5 -14
- package/scripts/provider-pingpong-live.mjs +9 -9
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +5 -4
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +17 -0
- package/src/defaults/skills/browser-use/SKILL.md +7 -1
- package/src/defaults/skills/computer-use/SKILL.md +3 -1
- package/src/defaults/skills/memory-management/SKILL.md +4 -1
- package/src/defaults/skills/setup/references/actions.md +11 -4
- package/src/defaults/skills/setup-guide/SKILL.md +175 -0
- package/src/defaults/skills/setup-guide/model-recommendations.json +333 -0
- package/src/defaults/skills/visualize/SKILL.md +3 -2
- package/src/lib/rules-builder.cjs +56 -7
- package/src/output-styles/common.md +22 -6
- package/src/output-styles/detailed.md +7 -5
- package/src/output-styles/minimal.md +7 -3
- package/src/output-styles/simple.md +2 -3
- package/src/rules/agent/AGENT.md +7 -1
- package/src/rules/agent-mode/AGENT_MODE.md +24 -0
- package/src/rules/agent-mode/MIXY.md +21 -0
- package/src/rules/agent-mode/ROUTINE.md +6 -0
- package/src/rules/lead/LEAD.md +9 -4
- package/src/rules/shared/10-tool-workflow.md +2 -1
- package/src/rules/shared/60-verification.md +4 -5
- package/src/rules/shared/70-delivery.md +3 -0
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -1
- package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +86 -0
- package/src/runtime/agent/orchestrator/config.mjs +6 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +77 -14
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +182 -13
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +5 -3
- package/src/runtime/agent/orchestrator/internal-agents.mjs +10 -0
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +215 -0
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +58 -64
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +10 -1
- package/src/runtime/agent/orchestrator/mcp/client.mjs +122 -15
- package/src/runtime/agent/orchestrator/mcp/oauth-account.mjs +97 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +2 -3
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +49 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +59 -9
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +32 -7
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +45 -6
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +195 -6
- package/src/runtime/agent/orchestrator/mcp/server-connectors.mjs +17 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +41 -19
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +11 -5
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/catalog-deadline.mjs +163 -0
- package/src/runtime/agent/orchestrator/providers/catalog-failures.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +38 -14
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +100 -26
- package/src/runtime/agent/orchestrator/providers/lib/send-callbacks.mjs +24 -0
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +49 -4
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +0 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +17 -12
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +45 -16
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-connect.mjs +196 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +74 -9
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-login.mjs +194 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-tokens.mjs +353 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +293 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +33 -100
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +23 -14
- package/src/runtime/agent/orchestrator/providers/registry.mjs +41 -27
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +98 -4
- package/src/runtime/agent/orchestrator/runtime-core/context-status-shape.mjs +4 -0
- package/src/runtime/agent/orchestrator/runtime-core/extension-scopes.mjs +6 -4
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +15 -8
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +12 -6
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +32 -5
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +10 -4
- package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +50 -20
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/agent-home.d.mts +4 -0
- package/src/runtime/agent/orchestrator/session/agent-home.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/agent-mode.mjs +62 -0
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +15 -3
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +31 -0
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +241 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +162 -0
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +641 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +74 -13
- package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +102 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +8 -2
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +165 -0
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +95 -0
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +221 -0
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +195 -0
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +167 -0
- package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +39 -2
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +82 -33
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +11 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +5 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +13 -3
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +10 -7
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +62 -22
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +44 -16
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -5
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +81 -34
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +39 -4
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -5
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +55 -8
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +58 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +32 -5
- package/src/runtime/agent/orchestrator/session/request-fork.mjs +47 -0
- package/src/runtime/agent/orchestrator/session/routine-result.d.mts +70 -0
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +277 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/side-question.mjs +5 -43
- package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +73 -6
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +40 -0
- package/src/runtime/agent/orchestrator/session/store/save-fault.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-header.mjs +36 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +258 -43
- package/src/runtime/agent/orchestrator/session/store-record-strict-scan.mjs +325 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +84 -21
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -12
- package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +46 -0
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +46 -30
- package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +144 -45
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +32 -13
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +364 -38
- package/src/runtime/agent/orchestrator/session/store.mjs +9 -2
- package/src/runtime/agent/orchestrator/session/task-wait-control.mjs +43 -12
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +23 -6
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +44 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +12 -6
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +13 -7
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/bashism-rewrite.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/benign-exit.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +40 -7
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +37 -34
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +0 -4
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -0
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +29 -27
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +28 -11
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +12 -3
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +203 -101
- package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.mjs +90 -41
- package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +17 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-delivery.mjs +199 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +12 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +165 -39
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +25 -13
- package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +113 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +7 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +19 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-line-collector.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +25 -7
- package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-render.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +12 -5
- package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +61 -22
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +32 -8
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +193 -19
- package/src/runtime/agent/orchestrator/tools/builtin/shell-direct-exe.mjs +57 -7
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +123 -32
- package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +26 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +13 -28
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +90 -11
- package/src/runtime/agent/orchestrator/tools/builtin/wait-budgets.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +54 -10
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +22 -28
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +11 -7
- package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +126 -9
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +15 -6
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +64 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +10 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promotion-results.mjs +13 -3
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +8 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +104 -55
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +7 -2
- package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +39 -23
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/attachments/office-extract.mjs +11 -9
- package/src/runtime/browser-bridge/client.mjs +24 -0
- package/src/runtime/channels/lib/scheduler.mjs +40 -12
- package/src/runtime/channels/lib/schedules-db.mjs +71 -12
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +36 -16
- package/src/runtime/channels/lib/webhook.mjs +0 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +100 -10
- package/src/runtime/channels/lib/worker-main.mjs +17 -20
- package/src/runtime/computer-bridge/client.mjs +28 -1
- package/src/runtime/connectors/gmail-app-password.mjs +690 -0
- package/src/runtime/connectors/google-mcp.mjs +446 -0
- package/src/runtime/memory/lib/core-memory-access.mjs +69 -0
- package/src/runtime/memory/lib/core-memory-file.mjs +16 -8
- package/src/runtime/memory/lib/core-memory-index.mjs +15 -9
- package/src/runtime/memory/lib/core-memory-management.mjs +10 -4
- package/src/runtime/memory/lib/core-memory-store.mjs +53 -30
- package/src/runtime/memory/lib/core-memory-uniqueness.mjs +10 -6
- package/src/runtime/memory/lib/embedding-tokenizer.mjs +32 -18
- package/src/runtime/memory/lib/http-router/session-routes.mjs +3 -2
- package/src/runtime/memory/lib/memory-action-handlers/core-actions.mjs +44 -14
- package/src/runtime/memory/lib/memory-schema/core-and-meta.mjs +11 -0
- package/src/runtime/memory/lib/memory.mjs +7 -1
- package/src/runtime/memory/lib/query-core-recall.mjs +9 -1
- package/src/runtime/memory/lib/query-hybrid-search.mjs +2 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -1
- package/src/runtime/memory/lib/tool-call-handler.mjs +9 -5
- package/src/runtime/memory/tool-defs.mjs +5 -0
- package/src/runtime/office/authoring/pptx-script-normalize.mjs +11 -8
- package/src/runtime/office/core/tabular.mjs +1 -1
- package/src/runtime/office/design/library/design-template-inspect.mjs +7 -4
- package/src/runtime/office/portable/docx-formatting.mjs +1 -1
- package/src/runtime/office/portable/docx-runs.mjs +1 -1
- package/src/runtime/office/portable/docx-tracked-edits.mjs +2 -2
- package/src/runtime/office/portable/portable-docx-edits.mjs +11 -10
- package/src/runtime/office/portable/portable-docx-operations.mjs +21 -17
- package/src/runtime/office/portable/portable-docx-parts.mjs +15 -9
- package/src/runtime/office/portable/portable-docx-styles.mjs +4 -1
- package/src/runtime/office/portable/portable-docx-xml.mjs +9 -9
- package/src/runtime/office/portable/portable-opc.mjs +27 -13
- package/src/runtime/office/portable/portable-pivot.mjs +3 -3
- package/src/runtime/office/portable/portable-pptx-chart.mjs +3 -3
- package/src/runtime/office/portable/portable-pptx-charts.mjs +24 -18
- package/src/runtime/office/portable/portable-pptx-core.mjs +5 -5
- package/src/runtime/office/portable/portable-pptx-deck.mjs +8 -4
- package/src/runtime/office/portable/portable-pptx-package.mjs +7 -4
- package/src/runtime/office/portable/portable-pptx-shapes.mjs +18 -9
- package/src/runtime/office/portable/portable-sheet-parts.mjs +9 -3
- package/src/runtime/office/portable/portable-sheet-xml.mjs +5 -5
- package/src/runtime/office/portable/portable-xlsx-charts.mjs +4 -1
- package/src/runtime/office/portable/portable-xlsx-drawings.mjs +10 -6
- package/src/runtime/office/portable/portable-xlsx-operations.mjs +8 -5
- package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +1 -1
- package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +11 -7
- package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +6 -3
- package/src/runtime/office/portable/portable-xml.mjs +1 -1
- package/src/runtime/shared/agent-avatar-sprites.mjs +445 -0
- package/src/runtime/shared/agent-avatar.d.mts +64 -0
- package/src/runtime/shared/agent-avatar.mjs +320 -0
- package/src/runtime/shared/agent-route-config.d.mts +3 -0
- package/src/runtime/shared/agent-route-config.mjs +16 -0
- package/src/runtime/shared/atomic-file.mjs +36 -14
- package/src/runtime/shared/background-tasks.mjs +60 -20
- package/src/runtime/shared/child-spawn-gate.mjs +26 -16
- package/src/runtime/shared/config.mjs +8 -11
- package/src/runtime/shared/connector-accounts.mjs +15 -0
- package/src/runtime/shared/connector-catalog.d.mts +52 -0
- package/src/runtime/shared/connector-catalog.mjs +230 -0
- package/src/runtime/shared/connector-triggers.d.mts +3 -0
- package/src/runtime/shared/connector-triggers.mjs +43 -0
- package/src/runtime/shared/file-lock.mjs +7 -1
- package/src/runtime/shared/file-permissions-worker.mjs +38 -0
- package/src/runtime/shared/file-permissions.d.mts +19 -4
- package/src/runtime/shared/file-permissions.mjs +310 -4
- package/src/runtime/shared/git-runner-worker.mjs +6 -78
- package/src/runtime/shared/google-oauth-client.mjs +24 -0
- package/src/runtime/shared/held-request-host.d.mts +12 -0
- package/src/runtime/shared/held-request-host.mjs +71 -0
- package/src/runtime/shared/llm/http-agent.mjs +7 -3
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +10 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +2 -0
- package/src/runtime/shared/llm/usage-ledger-import.mjs +32 -3
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +12 -5
- package/src/runtime/shared/llm/usage-ledger-worker.mjs +1 -1
- package/src/runtime/shared/llm/usage-ledger.mjs +20 -5
- package/src/runtime/shared/memory-snapshot.mjs +5 -1
- package/src/runtime/shared/notify-trace.mjs +8 -1
- package/src/runtime/shared/plain-preview.d.mts +1 -0
- package/src/runtime/shared/plain-preview.mjs +28 -0
- package/src/runtime/shared/pristine-execution-contract.json +5 -1
- package/src/runtime/shared/process-runner-worker.mjs +7 -0
- package/src/runtime/shared/process-runner.mjs +38 -0
- package/src/runtime/shared/provider-accounts.mjs +2 -1
- package/src/runtime/shared/provider-api-key.mjs +0 -1
- package/src/runtime/shared/read-row-numbers.mjs +1 -1
- package/src/runtime/shared/resource-admission.mjs +60 -18
- package/src/runtime/shared/routine-limits.d.mts +11 -0
- package/src/runtime/shared/routine-limits.mjs +21 -0
- package/src/runtime/shared/routine-trigger.d.mts +10 -0
- package/src/runtime/shared/routine-trigger.mjs +44 -0
- package/src/runtime/shared/run-child.mjs +84 -0
- package/src/runtime/shared/schedule-model-ref.mjs +9 -10
- package/src/runtime/shared/session-activity-signal.mjs +23 -0
- package/src/runtime/shared/shell-output-summary.mjs +23 -0
- package/src/runtime/shared/singleton-owner.mjs +126 -42
- package/src/runtime/shared/slow-span.mjs +4 -12
- package/src/runtime/shared/statusline/statusline-segments.mjs +13 -1
- package/src/runtime/shared/tool-output-limit.mjs +4 -2
- package/src/runtime/shared/tool-output-marker.mjs +58 -0
- package/src/runtime/shared/transcript-metadata.mjs +10 -0
- package/src/runtime/shared/turn-changes.mjs +0 -8
- package/src/runtime/shared/usage-readout-totals.mjs +56 -0
- package/src/runtime/shared/user-data-guard.mjs +131 -34
- package/src/runtime/shared/worktrees/activity-gate.mjs +33 -8
- package/src/runtime/shared/worktrees/git-head.mjs +20 -2
- package/src/runtime/shared/worktrees/lock.mjs +3 -2
- package/src/runtime/terminal-bridge/tool-defs.mjs +1 -1
- package/src/runtime/tidy/runners/biome.mjs +3 -1
- package/src/runtime/tidy/shadow.mjs +2 -1
- package/src/runtime/web-search/index.mjs +5 -7
- package/src/runtime/web-search/lib/formatter.mjs +42 -6
- package/src/runtime/web-search/tool-defs.mjs +6 -1
- package/src/session-runtime/agent-home-delivery.mjs +459 -0
- package/src/session-runtime/agent-profile-changes.mjs +21 -0
- package/src/session-runtime/agent-room-delivery.mjs +92 -0
- package/src/session-runtime/agent-task-sessions.mjs +200 -0
- package/src/session-runtime/boot/apis.mjs +50 -18
- package/src/session-runtime/boot/facade.mjs +5 -8
- package/src/session-runtime/boot/infrastructure.mjs +28 -17
- package/src/session-runtime/boot/tools.mjs +3 -0
- package/src/session-runtime/channel-config-api.mjs +53 -5
- package/src/session-runtime/cwd-plugins/core-memory-context.mjs +36 -20
- package/src/session-runtime/cwd-plugins/plugin-status.mjs +6 -1
- package/src/session-runtime/held-requests.mjs +228 -0
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +121 -0
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +31 -2
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +31 -2
- package/src/session-runtime/internal-tool-executor.mjs +2 -0
- package/src/session-runtime/lifecycle/session-catalog.mjs +9 -0
- package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +4 -3
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +11 -4
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +3 -3
- package/src/session-runtime/lifecycle/shared.mjs +25 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +2 -0
- package/src/session-runtime/lifecycle/teardown.mjs +5 -2
- package/src/session-runtime/lifecycle-api.mjs +3 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +8 -0
- package/src/session-runtime/mcp-glue/server-input.mjs +3 -0
- package/src/session-runtime/mcp-oauth-login.mjs +112 -15
- package/src/session-runtime/model-route/set-route.mjs +14 -3
- package/src/session-runtime/owned-automation-run.mjs +229 -0
- package/src/session-runtime/provider-auth/login.mjs +10 -6
- package/src/session-runtime/provider-auth/setup.mjs +19 -2
- package/src/session-runtime/provider-catalog-cache.mjs +101 -25
- package/src/session-runtime/provider-models/catalog-load.mjs +14 -3
- package/src/session-runtime/provider-models/row-hydration.mjs +4 -0
- package/src/session-runtime/provider-models.mjs +76 -10
- package/src/session-runtime/provider-readiness.mjs +4 -0
- package/src/session-runtime/resource-api.mjs +5 -0
- package/src/session-runtime/resource-mcp-api.mjs +107 -13
- package/src/session-runtime/resource-skills-api.mjs +12 -0
- package/src/session-runtime/room-member-gate.mjs +48 -0
- package/src/session-runtime/routine-home-turn.mjs +156 -0
- package/src/session-runtime/routine-owner.mjs +48 -0
- package/src/session-runtime/schedule-session-run.mjs +30 -64
- package/src/session-runtime/services/agent-tool/close-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +10 -0
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +10 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +13 -4
- package/src/session-runtime/services/agent-tool/notify.mjs +15 -4
- package/src/session-runtime/services/agent-tool/restart-notify.mjs +134 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/deferred-spawn.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +19 -4
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +2 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -1
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +8 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +4 -0
- package/src/session-runtime/services/agent-tool/worker-index.mjs +44 -10
- package/src/session-runtime/services/agent-tool.mjs +20 -0
- package/src/session-runtime/services/channel-admin.mjs +93 -24
- package/src/session-runtime/services/memory-access.mjs +37 -0
- package/src/session-runtime/services/provider-admin.mjs +166 -59
- package/src/session-runtime/services/schedule-access.mjs +91 -0
- package/src/session-runtime/services/usage-dashboard-model.mjs +2 -2
- package/src/session-runtime/services/usage-dashboard.mjs +27 -69
- package/src/session-runtime/session-create/session-options.mjs +34 -7
- package/src/session-runtime/session-hooks.mjs +16 -8
- package/src/session-runtime/setup-tool/executor.mjs +68 -6
- package/src/session-runtime/setup-tool/extended-actions.mjs +72 -14
- package/src/session-runtime/setup-tool/settings-contract.mjs +8 -6
- package/src/session-runtime/setup-tool/tool-defs.mjs +8 -0
- package/src/session-runtime/skills-api.mjs +16 -1
- package/src/session-runtime/tool-policy-refresh.mjs +238 -29
- package/src/session-runtime/turn/session-ops.mjs +10 -3
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +11 -2
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +3 -0
- package/src/session-runtime/usage-stats-api.mjs +6 -1
- package/src/session-runtime/webhook-session-run.mjs +49 -67
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +239 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +556 -22
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +11 -1
- package/src/session-runtime/workflow-agents-api.mjs +4 -1
- package/src/standalone/channel-transport/http-routes.mjs +10 -9
- package/src/standalone/daemon-agent-control.mjs +1 -8
- package/src/standalone/daemon-desktop-runtime.mjs +20 -7
- package/src/standalone/daemon-owner.mjs +117 -25
- package/src/standalone/daemon-session-control.mjs +11 -2
- package/src/standalone/daemon.mjs +61 -17
- package/src/standalone/session-call-cache.mjs +6 -0
- package/src/standalone/session-protocol.mjs +28 -1
- package/src/standalone/session-service/retention/busy.mjs +7 -2
- package/src/standalone/session-service/session-calls/session-turns.mjs +9 -0
- package/src/standalone/session-service.mjs +19 -0
- package/src/standalone/session-transport/routes.mjs +7 -6
- package/src/tui/app/model-options.mjs +39 -2
- package/src/tui/app/model-picker.mjs +16 -2
- package/src/tui/app/provider-setup-picker.mjs +1 -2
- package/src/tui/app/slash-commands.mjs +20 -0
- package/src/tui/dist/index.mjs +487 -128
- package/src/tui/session/context-state.mjs +6 -1
- package/src/tui/session/notice-surface.mjs +35 -4
- package/src/tui/session/notice-text.mjs +0 -1
- package/src/tui/session/queue-helpers.mjs +2 -1
- package/src/tui/session/session-api/extensions.mjs +4 -0
- package/src/tui/session/session-api/intake/submission.mjs +12 -13
- package/src/tui/session/session-api/integrations.mjs +9 -5
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +13 -3
- package/src/tui/session/session-api/lifecycle.mjs +17 -1
- package/src/tui/session/session-api/routes.mjs +48 -3
- package/src/tui/session/session-flow/drain.mjs +20 -3
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -1
- package/src/tui/session/session-flow/queue/take-entries.mjs +3 -2
- package/src/tui/session/session-flow/steering.mjs +104 -24
- package/src/tui/session/session-flow.mjs +2 -0
- package/src/tui/session/tool-approval.mjs +26 -5
- package/src/tui/session/transcript-intake.mjs +6 -2
- package/src/tui/session/transcript-spill.mjs +5 -1
- package/src/tui/session/tui-steering-persist.mjs +65 -42
- package/src/tui/session/turn-live-call.mjs +56 -0
- package/src/tui/session/turn-stream.mjs +33 -0
- package/src/tui/session/turn.mjs +50 -7
- package/src/ui/statusline.mjs +1 -6
- package/src/ui/streaming-markdown-heal.mjs +24 -7
- package/src/vendor/statusline/bin/statusline-route.mjs +0 -1
- package/src/vendor/statusline/src/gateway/route-meta.mjs +0 -1
- package/src/workflows/default/WORKFLOW.md +9 -13
- package/src/session-runtime/automation-agents.mjs +0 -94
- package/src/session-runtime/automation-workflow.mjs +0 -59
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* state, so the closure identifiers (state/set/nextId/disposed/timeout) are
|
|
7
7
|
* threaded through the factory argument via getters — never stale snapshots.
|
|
8
8
|
*/
|
|
9
|
+
import {
|
|
10
|
+
humanRequestFields,
|
|
11
|
+
normalizeHumanResponse,
|
|
12
|
+
} from '../../runtime/agent/orchestrator/session/human-gate/requests.mjs';
|
|
13
|
+
|
|
9
14
|
export function createToolApproval({ getState, set, nextId, getDisposed, timeoutMs }) {
|
|
10
15
|
const toolApprovalQueue = [];
|
|
11
16
|
let activeToolApproval = null;
|
|
@@ -32,6 +37,8 @@ export function createToolApproval({ getState, set, nextId, getDisposed, timeout
|
|
|
32
37
|
requestedAt: now,
|
|
33
38
|
timeoutMs: requestTimeoutMs,
|
|
34
39
|
expiresAt: requestTimeoutMs === null ? null : now + requestTimeoutMs,
|
|
40
|
+
// outbound / secret / takeover / permission fields (human-gate/requests.mjs).
|
|
41
|
+
...humanRequestFields(input),
|
|
35
42
|
};
|
|
36
43
|
}
|
|
37
44
|
// Every request expires from ITS OWN requestedAt, queued or active. Arming
|
|
@@ -41,18 +48,24 @@ export function createToolApproval({ getState, set, nextId, getDisposed, timeout
|
|
|
41
48
|
if (!entry || entry.timer || entry.request?.expiresAt === null) return;
|
|
42
49
|
const remainingMs = Math.max(0, Number(entry.request?.expiresAt || 0) - Date.now());
|
|
43
50
|
entry.timer = setTimeout(() => {
|
|
44
|
-
finishToolApproval(entry.id, false, 'approval timed out');
|
|
51
|
+
finishToolApproval(entry.id, false, 'approval timed out', '', undefined, undefined, { timedOut: true });
|
|
45
52
|
}, remainingMs);
|
|
46
53
|
entry.timer.unref?.();
|
|
47
54
|
}
|
|
48
55
|
// Settle one entry: drop its timeout, then hand the waiter its answer. The
|
|
49
56
|
// resolve stays guarded — a waiter whose caller already went away must never
|
|
50
57
|
// take the rest of the queue down with it.
|
|
51
|
-
function settleToolApproval(entry, approved, reason, answers, reply) {
|
|
58
|
+
function settleToolApproval(entry, approved, reason, answers, reply, extra, device = '') {
|
|
52
59
|
if (entry?.timer) clearTimeout(entry.timer);
|
|
53
60
|
const result = { approved, reason };
|
|
54
61
|
if (answers !== undefined) result.answers = answers;
|
|
55
62
|
if (reply !== undefined) result.reply = reply;
|
|
63
|
+
// A human-kind request answers with its canonical response (never a value).
|
|
64
|
+
if (entry?.request?.remember) {
|
|
65
|
+
Object.assign(result, normalizeHumanResponse(entry.request, approved, extra));
|
|
66
|
+
if (device) result.device = device;
|
|
67
|
+
}
|
|
68
|
+
if (extra?.timedOut === true) result.timedOut = true;
|
|
56
69
|
try {
|
|
57
70
|
entry.resolve(result);
|
|
58
71
|
} catch {}
|
|
@@ -68,7 +81,15 @@ export function createToolApproval({ getState, set, nextId, getDisposed, timeout
|
|
|
68
81
|
armToolApprovalTimeout(entry);
|
|
69
82
|
set({ toolApproval: entry.request });
|
|
70
83
|
}
|
|
71
|
-
function finishToolApproval(
|
|
84
|
+
function finishToolApproval(
|
|
85
|
+
id,
|
|
86
|
+
approved,
|
|
87
|
+
reason = '',
|
|
88
|
+
device = '',
|
|
89
|
+
answers = undefined,
|
|
90
|
+
reply = undefined,
|
|
91
|
+
extra = undefined
|
|
92
|
+
) {
|
|
72
93
|
const targetId = String(id || '');
|
|
73
94
|
if (activeToolApproval && activeToolApproval.id === targetId) {
|
|
74
95
|
const entry = activeToolApproval;
|
|
@@ -79,14 +100,14 @@ export function createToolApproval({ getState, set, nextId, getDisposed, timeout
|
|
|
79
100
|
? { id: targetId, approved: approved === true, device: String(device), at: Date.now() }
|
|
80
101
|
: null;
|
|
81
102
|
set({ toolApproval: null, toolApprovalResult });
|
|
82
|
-
settleToolApproval(entry, approved === true, String(reason || ''), answers, reply);
|
|
103
|
+
settleToolApproval(entry, approved === true, String(reason || ''), answers, reply, extra, String(device || ''));
|
|
83
104
|
presentNextToolApproval();
|
|
84
105
|
return true;
|
|
85
106
|
}
|
|
86
107
|
const index = toolApprovalQueue.findIndex((entry) => entry.id === targetId);
|
|
87
108
|
if (index >= 0) {
|
|
88
109
|
const [entry] = toolApprovalQueue.splice(index, 1);
|
|
89
|
-
settleToolApproval(entry, approved === true, String(reason || ''), answers, reply);
|
|
110
|
+
settleToolApproval(entry, approved === true, String(reason || ''), answers, reply, extra, String(device || ''));
|
|
90
111
|
return true;
|
|
91
112
|
}
|
|
92
113
|
return false;
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
import { isLateToolAnnouncement } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
13
13
|
import { appendPromptHistory } from '../prompt-history-store.mjs';
|
|
14
14
|
import { newTranscriptMessageId } from '../../runtime/shared/transcript-metadata.mjs';
|
|
15
|
+
import { routineTriggerField } from '../../runtime/shared/routine-trigger.mjs';
|
|
15
16
|
import {
|
|
16
17
|
buildExecutionResponseToolItem,
|
|
17
18
|
completionCardFromExecution,
|
|
@@ -107,16 +108,19 @@ export function createTranscriptIntake({ getState, flags, pushItem, patchItem, t
|
|
|
107
108
|
// message reports it) or, for a typed prompt, a new one that goes with
|
|
108
109
|
// the prompt into the model transcript. An injected row with no message
|
|
109
110
|
// id of its own carries none.
|
|
111
|
+
// A routine fire's row is the prompt the turn persists, like a typed one.
|
|
112
|
+
const ownsPrompt = origin === 'user' || origin === 'routine';
|
|
110
113
|
let messageId = '';
|
|
111
114
|
if (typeof extra?.messageId === 'string' && extra.messageId) messageId = extra.messageId;
|
|
112
|
-
else if (
|
|
115
|
+
else if (ownsPrompt) messageId = newTranscriptMessageId();
|
|
113
116
|
const transcriptMeta = { ...transcriptRouteMetadata(), ...(messageId ? { messageId } : {}) };
|
|
114
|
-
if (
|
|
117
|
+
if (ownsPrompt) flags.pendingTranscriptMeta = transcriptMeta;
|
|
115
118
|
pushItem({
|
|
116
119
|
kind: 'user',
|
|
117
120
|
id,
|
|
118
121
|
text,
|
|
119
122
|
...transcriptMeta,
|
|
123
|
+
...routineTriggerField(extra),
|
|
120
124
|
...(extra && typeof extra.sender === 'string' && extra.sender ? { sender: extra.sender } : {}),
|
|
121
125
|
...(extra && typeof extra.device === 'string' && extra.device ? { device: extra.device } : {}),
|
|
122
126
|
// Byte-free attachment metadata (name/mime/size) from the queue entry —
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Transcript spill storage, history paging, and session item-state mutations.
|
|
3
3
|
*/
|
|
4
|
+
import { randomBytes } from 'node:crypto';
|
|
4
5
|
import { readFileSync } from 'node:fs';
|
|
5
6
|
import { join } from 'node:path';
|
|
6
7
|
import { Worker } from 'node:worker_threads';
|
|
@@ -19,8 +20,11 @@ export const tuiDebug = (msg) => {
|
|
|
19
20
|
} catch {}
|
|
20
21
|
};
|
|
21
22
|
|
|
23
|
+
// Item ids outlive the process (queued-input mirror, turn change records), so
|
|
24
|
+
// a restarted process never issues an id again.
|
|
25
|
+
const ID_PREFIX = `it_${randomBytes(4).toString('hex')}_`;
|
|
22
26
|
let _idSeq = 0;
|
|
23
|
-
export const nextId = () =>
|
|
27
|
+
export const nextId = () => `${ID_PREFIX}${++_idSeq}`;
|
|
24
28
|
|
|
25
29
|
export const TRANSCRIPT_LIVE_ITEM_CAP = 512;
|
|
26
30
|
export const TRANSCRIPT_SPILL_CHUNK_ITEMS = 128;
|
|
@@ -7,10 +7,10 @@ import { promptContentText } from './queue-helpers.mjs';
|
|
|
7
7
|
// Restore window for persisted busy-input steering rows. Rows older than this
|
|
8
8
|
// are leftovers of a session that ended long ago — restoring them into a fresh
|
|
9
9
|
// TUI boot reads as a surprise self-injection (user report), so they are
|
|
10
|
-
// discarded
|
|
10
|
+
// discarded when the mirror is read instead.
|
|
11
11
|
const STALE_STEERING_RESTORE_TTL_MS = 30 * 60 * 1000;
|
|
12
12
|
|
|
13
|
-
// Serialize this UI process's own steering writes so append→drop→
|
|
13
|
+
// Serialize this UI process's own steering writes so append→drop→read keep
|
|
14
14
|
// their issue order even though each now waits on the lock asynchronously.
|
|
15
15
|
// Cross-process mutual exclusion still comes from the shared lock protocol;
|
|
16
16
|
// this chain only orders same-process operations that were previously
|
|
@@ -59,23 +59,40 @@ function newSteeringPersistId() {
|
|
|
59
59
|
return `ts_${Date.now().toString(36)}_${randomBytes(4).toString('hex')}`;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
// What the accepted input runs: its executable content (attachment
|
|
63
|
+
// references), the pasted-attachment links and transcript metadata it was
|
|
64
|
+
// submitted with, and its run options. Callbacks and live queue state never
|
|
65
|
+
// reach the spool.
|
|
66
|
+
function persistedQueuePayload(entry) {
|
|
67
|
+
const out = {};
|
|
68
|
+
if (typeof entry.content === 'string' || Array.isArray(entry.content)) out.content = entry.content;
|
|
69
|
+
for (const field of ['pastedImages', 'pastedTexts', 'transcriptMeta']) {
|
|
70
|
+
const value = entry[field];
|
|
71
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) out[field] = value;
|
|
72
|
+
}
|
|
73
|
+
for (const field of ['mode', 'priority', 'context']) {
|
|
74
|
+
if (typeof entry[field] === 'string' && entry[field]) out[field] = entry[field];
|
|
66
75
|
}
|
|
76
|
+
if (entry.skipSlashCommands === true) out.skipSlashCommands = true;
|
|
77
|
+
return out;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function normalizeTuiSteeringQueueEntry(entry) {
|
|
81
|
+
if (typeof entry === 'string') entry = { text: entry };
|
|
67
82
|
if (!entry || typeof entry !== 'object') return null;
|
|
68
83
|
if (typeof entry.text === 'string' && entry.text.trim()) {
|
|
69
84
|
const text = entry.text.trim();
|
|
70
|
-
|
|
85
|
+
// A row of an older build may have no id; it gets one here, under the
|
|
86
|
+
// shard lock, so every later read and drop names the same row.
|
|
87
|
+
const id = typeof entry.id === 'string' && entry.id.trim() ? entry.id.trim() : newSteeringPersistId();
|
|
71
88
|
const submissionId =
|
|
72
89
|
typeof entry.submissionId === 'string' && entry.submissionId.trim() ? entry.submissionId.trim() : null;
|
|
73
90
|
const submittedAt = Number(entry.submittedAt);
|
|
74
|
-
if (!id) return text;
|
|
75
91
|
const at = Number(entry.at);
|
|
76
92
|
return {
|
|
77
93
|
id,
|
|
78
94
|
text,
|
|
95
|
+
...persistedQueuePayload(entry),
|
|
79
96
|
...(Number.isFinite(at) && at > 0 ? { at } : {}),
|
|
80
97
|
...(submissionId ? { submissionId } : {}),
|
|
81
98
|
...(Number.isFinite(submittedAt) && submittedAt > 0 ? { submittedAt } : {}),
|
|
@@ -131,24 +148,15 @@ function entryPersistText(entry) {
|
|
|
131
148
|
return text;
|
|
132
149
|
}
|
|
133
150
|
|
|
134
|
-
|
|
135
|
-
const persistId = entry?.steeringPersistId;
|
|
136
|
-
if (persistId) {
|
|
137
|
-
return Boolean(row && typeof row === 'object' && row.id === persistId);
|
|
138
|
-
}
|
|
139
|
-
const text = entryPersistText(entry);
|
|
140
|
-
if (!text) return false;
|
|
141
|
-
return row === text;
|
|
142
|
-
}
|
|
143
|
-
|
|
151
|
+
// Every stored row has an id (normalize assigns one), so a row is named by it.
|
|
144
152
|
function removePersistRow(q, entry) {
|
|
145
|
-
const idx = q.findIndex((row) =>
|
|
153
|
+
const idx = q.findIndex((row) => row.id === entry?.steeringPersistId);
|
|
146
154
|
if (idx >= 0) q.splice(idx, 1);
|
|
147
155
|
}
|
|
148
156
|
|
|
149
157
|
// Consistency-required: a dropped append loses a user's queued steering
|
|
150
158
|
// message, so we async-wait for the lock (never try-once). Returns a promise;
|
|
151
|
-
// fire-and-forget at call sites is fine — _serialize keeps append/drop/
|
|
159
|
+
// fire-and-forget at call sites is fine — _serialize keeps append/drop/read
|
|
152
160
|
// in issue order and the write never blocks the render loop.
|
|
153
161
|
export function appendTuiSteeringPersist(leadSessionId, entry) {
|
|
154
162
|
const text = entryPersistText(entry);
|
|
@@ -158,13 +166,22 @@ export function appendTuiSteeringPersist(leadSessionId, entry) {
|
|
|
158
166
|
if (!entry.steeringPersistId) entry.steeringPersistId = newSteeringPersistId();
|
|
159
167
|
const submissionId = typeof entry.id === 'string' && entry.id.trim() ? entry.id.trim() : null;
|
|
160
168
|
const submittedAt = Number(entry.submittedAt);
|
|
161
|
-
const
|
|
169
|
+
const identity = {
|
|
162
170
|
id: entry.steeringPersistId,
|
|
163
171
|
text,
|
|
164
172
|
at: Date.now(),
|
|
165
173
|
...(submissionId ? { submissionId } : {}),
|
|
166
174
|
...(Number.isFinite(submittedAt) && submittedAt > 0 ? { submittedAt } : {}),
|
|
167
175
|
};
|
|
176
|
+
// A JSON snapshot taken now: the lock wait below must not let a later
|
|
177
|
+
// edit of the live entry change what was accepted. A payload JSON cannot
|
|
178
|
+
// carry still leaves the input itself durable.
|
|
179
|
+
let record;
|
|
180
|
+
try {
|
|
181
|
+
record = JSON.parse(JSON.stringify({ ...identity, ...persistedQueuePayload(entry) }));
|
|
182
|
+
} catch {
|
|
183
|
+
record = identity;
|
|
184
|
+
}
|
|
168
185
|
return _serialize(key, async () => {
|
|
169
186
|
try {
|
|
170
187
|
await updatePendingShard(key, (raw) => {
|
|
@@ -225,30 +242,27 @@ export function _steeringPersistChainCount() {
|
|
|
225
242
|
return _persistChains.size;
|
|
226
243
|
}
|
|
227
244
|
|
|
228
|
-
function
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
submissionId: typeof row.submissionId === 'string' ? row.submissionId : null,
|
|
237
|
-
submittedAt: Number.isFinite(Number(row.submittedAt)) ? Number(row.submittedAt) : null,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
return null;
|
|
245
|
+
function persistedRowToRestore(row) {
|
|
246
|
+
return {
|
|
247
|
+
...persistedQueuePayload(row),
|
|
248
|
+
text: row.text,
|
|
249
|
+
steeringPersistId: row.id,
|
|
250
|
+
submissionId: typeof row.submissionId === 'string' ? row.submissionId : null,
|
|
251
|
+
submittedAt: Number.isFinite(Number(row.submittedAt)) ? Number(row.submittedAt) : null,
|
|
252
|
+
};
|
|
241
253
|
}
|
|
242
254
|
|
|
243
255
|
// Consistency-required (restores queued messages after boot/command). Async
|
|
244
256
|
// lock wait, serialized on _persistChain so it never reorders against a
|
|
245
257
|
// pending append/drop and never blocks the render loop. Returns a promise of
|
|
246
|
-
// the
|
|
247
|
-
|
|
258
|
+
// the stored rows; call sites await it. A read never consumes: a row stays
|
|
259
|
+
// durable until the queue commits, reclaims or closes it (drop), so a
|
|
260
|
+
// restart before then restores it again.
|
|
261
|
+
export function readTuiSteeringPersist(leadSessionId) {
|
|
248
262
|
const key = tuiSteeringSessionKey(leadSessionId);
|
|
249
263
|
if (!key) return Promise.resolve([]);
|
|
250
264
|
return _serialize(key, async () => {
|
|
251
|
-
let
|
|
265
|
+
let restored = [];
|
|
252
266
|
let droppedStale = 0;
|
|
253
267
|
try {
|
|
254
268
|
await updatePendingShard(key, (raw) => {
|
|
@@ -262,18 +276,27 @@ export function drainTuiSteeringPersist(leadSessionId) {
|
|
|
262
276
|
if (stale) droppedStale += 1;
|
|
263
277
|
return !stale;
|
|
264
278
|
});
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
279
|
+
restored = fresh.map(persistedRowToRestore);
|
|
280
|
+
// Write only to drop stale rows or to keep the ids normalize gave
|
|
281
|
+
// rows of an older build.
|
|
282
|
+
const stored = Array.isArray(raw?.sessions?.[key]) ? raw.sessions[key] : [];
|
|
283
|
+
if (droppedStale === 0 && stored.every((row) => typeof row?.id === 'string' && row.id.trim())) {
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
if (fresh.length > 0) next.sessions[key] = fresh;
|
|
287
|
+
else deleteSessionBucket(next, key);
|
|
268
288
|
next.updatedAt = Date.now();
|
|
269
289
|
return next;
|
|
270
290
|
});
|
|
271
291
|
} catch (err) {
|
|
272
|
-
|
|
292
|
+
// An id assigned to an older row that never reached disk names nothing.
|
|
293
|
+
restored = [];
|
|
294
|
+
droppedStale = 0;
|
|
295
|
+
writeSteeringDiagnostic(`steering-queue read failed sessionId=${leadSessionId}: ${err?.message || err}`);
|
|
273
296
|
}
|
|
274
297
|
if (droppedStale > 0) {
|
|
275
298
|
writeSteeringDiagnostic(`dropped ${droppedStale} stale steering row(s) sessionId=${leadSessionId}`);
|
|
276
299
|
}
|
|
277
|
-
return
|
|
300
|
+
return restored;
|
|
278
301
|
});
|
|
279
302
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tui/session/turn-live-call.mjs — the live decode speed of the model call
|
|
3
|
+
* that is streaming right now (`spinner.liveCall`), for the desktop composer's
|
|
4
|
+
* usage readout.
|
|
5
|
+
*
|
|
6
|
+
* Providers report a call's exact output tokens only when it ends (the usage
|
|
7
|
+
* delta), so mid-stream the count is the runtime's own token estimate of the
|
|
8
|
+
* text and reasoning streamed so far (token-estimate.mjs, measured against a
|
|
9
|
+
* real tokenizer at +6.5% aggregate bias). The clock starts at the call's first
|
|
10
|
+
* visible text/reasoning token, so queueing and time-to-first-token stay out.
|
|
11
|
+
*
|
|
12
|
+
* Published at most every LIVE_CALL_PUBLISH_MS with its own sample time, so the
|
|
13
|
+
* reader divides tokens by (sample time - start) and a pause between samples
|
|
14
|
+
* never skews the figure. A tool call's arguments stream without text the
|
|
15
|
+
* runtime can count: once the call turns to one, the live figure is withdrawn
|
|
16
|
+
* until the next call rather than decaying against tokens nobody counted. The
|
|
17
|
+
* call's usage delta ends it.
|
|
18
|
+
*/
|
|
19
|
+
import { estimateTokens } from '../../runtime/agent/orchestrator/session/token-estimate.mjs';
|
|
20
|
+
|
|
21
|
+
export const LIVE_CALL_PUBLISH_MS = 250;
|
|
22
|
+
|
|
23
|
+
function publish({ getState, set }, liveCall) {
|
|
24
|
+
const spinner = getState().spinner;
|
|
25
|
+
if (spinner) set({ spinner: { ...spinner, liveCall } });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** A text or reasoning chunk of the streaming call arrived. */
|
|
29
|
+
export function noteLiveCallText(stream, chunk, now = Date.now()) {
|
|
30
|
+
const text = String(chunk ?? '');
|
|
31
|
+
if (!text || stream.liveCallWithdrawn) return;
|
|
32
|
+
const call = stream.liveCall || { startedAt: now, text: '', publishedAt: 0 };
|
|
33
|
+
stream.liveCall = call;
|
|
34
|
+
call.text += text;
|
|
35
|
+
if (call.publishedAt && now - call.publishedAt < LIVE_CALL_PUBLISH_MS) return;
|
|
36
|
+
call.publishedAt = now;
|
|
37
|
+
publish(stream, { startedAt: call.startedAt, outputTokens: estimateTokens(call.text), at: now });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** The call turned to a tool call (withdraw until the next call) or was reset. */
|
|
41
|
+
export function withdrawLiveCall(stream) {
|
|
42
|
+
stream.liveCallWithdrawn = true;
|
|
43
|
+
endLiveCall(stream);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The call ended (its usage delta landed): the next call starts fresh. */
|
|
47
|
+
export function endLiveCall(stream) {
|
|
48
|
+
const had = Boolean(stream.liveCall) || Boolean(stream.getState().spinner?.liveCall);
|
|
49
|
+
stream.liveCall = null;
|
|
50
|
+
if (had) publish(stream, null);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function startNextLiveCall(stream) {
|
|
54
|
+
stream.liveCallWithdrawn = false;
|
|
55
|
+
endLiveCall(stream);
|
|
56
|
+
}
|
|
@@ -33,6 +33,12 @@ export function createTurnStream(deps) {
|
|
|
33
33
|
// segment out of the provider's final content individually: the combined
|
|
34
34
|
// prefix no longer matches when the provider omits an earlier segment.
|
|
35
35
|
committedSegments: [],
|
|
36
|
+
// The open segment was settled when the provider streamed a tool call
|
|
37
|
+
// (turn.mjs); cleared when that response's tool calls open.
|
|
38
|
+
settledBeforeToolCall: false,
|
|
39
|
+
// The phase the provider named for the message this segment streams
|
|
40
|
+
// (`commentary` / `final_answer`), or null; the desktop row carries it.
|
|
41
|
+
phase: null,
|
|
36
42
|
thinkingText: '',
|
|
37
43
|
thinkingStartedAt: 0,
|
|
38
44
|
thinkingSegmentStartedAt: 0,
|
|
@@ -113,6 +119,7 @@ function ensureAssistant(stream, initialText = '') {
|
|
|
113
119
|
text: String(initialText || ''),
|
|
114
120
|
at,
|
|
115
121
|
messageId,
|
|
122
|
+
...phaseField(stream),
|
|
116
123
|
...stream.routeMeta,
|
|
117
124
|
});
|
|
118
125
|
}
|
|
@@ -149,11 +156,17 @@ function partialNow(stream) {
|
|
|
149
156
|
streaming: true,
|
|
150
157
|
at: identity.at,
|
|
151
158
|
messageId: identity.messageId,
|
|
159
|
+
...phaseField(stream),
|
|
152
160
|
...stream.routeMeta,
|
|
153
161
|
},
|
|
154
162
|
};
|
|
155
163
|
}
|
|
156
164
|
|
|
165
|
+
// The row's `phase` field; absent when the provider named none.
|
|
166
|
+
function phaseField(stream) {
|
|
167
|
+
return stream.phase ? { phase: stream.phase } : {};
|
|
168
|
+
}
|
|
169
|
+
|
|
157
170
|
function samePartial(left, right) {
|
|
158
171
|
if (left === right) return true;
|
|
159
172
|
if (!left || !right) return false;
|
|
@@ -208,6 +221,7 @@ function resetLineScan(stream) {
|
|
|
208
221
|
function closeAssistantSegment(stream) {
|
|
209
222
|
stream.currentAssistantId = null;
|
|
210
223
|
stream.currentAssistantText = '';
|
|
224
|
+
stream.phase = null;
|
|
211
225
|
stream.claimPersistedAssistant = false;
|
|
212
226
|
stream.assistantIdentity = null;
|
|
213
227
|
resetLineScan(stream);
|
|
@@ -296,6 +310,7 @@ function flushTextBatch(stream) {
|
|
|
296
310
|
text: visibleText,
|
|
297
311
|
streaming: true,
|
|
298
312
|
at: current?.at || Date.now(),
|
|
313
|
+
phase: stream.phase || undefined,
|
|
299
314
|
...stream.routeMeta,
|
|
300
315
|
};
|
|
301
316
|
}
|
|
@@ -449,6 +464,24 @@ export function appendAssistantText(stream, full, { committed = false } = {}) {
|
|
|
449
464
|
flushStreamBatch(stream);
|
|
450
465
|
}
|
|
451
466
|
|
|
467
|
+
// The provider named the phase of the message it is streaming. A message of
|
|
468
|
+
// another phase than the open segment's text is its own row: that segment
|
|
469
|
+
// settles first. A segment whose phase was not known yet (the provider named
|
|
470
|
+
// it only on the finished message) takes it.
|
|
471
|
+
export function noteAssistantPhase(stream, phase) {
|
|
472
|
+
if (phase !== 'commentary' && phase !== 'final_answer') return;
|
|
473
|
+
if (stream.phase === phase) return;
|
|
474
|
+
if (stream.phase && stream.currentAssistantText.trim()) {
|
|
475
|
+
flushStreamBatch(stream);
|
|
476
|
+
commitAssistantSegment(stream);
|
|
477
|
+
}
|
|
478
|
+
stream.phase = phase;
|
|
479
|
+
const tail = stream.getState().streamingTail;
|
|
480
|
+
if (stream.currentAssistantId != null && tail?.id === stream.currentAssistantId) {
|
|
481
|
+
stream.updateStreamingTail(tail.id, { phase });
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
452
485
|
// Reasoning is not a commit boundary: a turn interrupted while it is still
|
|
453
486
|
// thinking produced no model-visible message, so Esc must hand the prompt
|
|
454
487
|
// back to the input box. Text, tool calls and turn end still commit it.
|
package/src/tui/session/turn.mjs
CHANGED
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
appendTextDelta,
|
|
35
35
|
appendAssistantText,
|
|
36
36
|
appendReasoningDelta,
|
|
37
|
+
noteAssistantPhase,
|
|
37
38
|
resetStreamedText,
|
|
38
39
|
applyStageChange,
|
|
39
40
|
settleFinalText,
|
|
@@ -53,6 +54,7 @@ import {
|
|
|
53
54
|
startLiveTail,
|
|
54
55
|
} from './turn-tool-cards.mjs';
|
|
55
56
|
import { startQuietWatch } from './turn-quiet.mjs';
|
|
57
|
+
import { endLiveCall, noteLiveCallText, startNextLiveCall, withdrawLiveCall } from './turn-live-call.mjs';
|
|
56
58
|
|
|
57
59
|
// A usage limit is exactly a spent quota, a plan-gated feature or a billing
|
|
58
60
|
// refusal; overloads, rate limits and server faults recover by waiting.
|
|
@@ -241,9 +243,21 @@ function injectSteerMessage({ stream, cards, pushUserOrSyntheticItem }, text, st
|
|
|
241
243
|
pushUserOrSyntheticItem(value, steeringIds[0], 'injected', steeringItemExtras(steeringMeta));
|
|
242
244
|
}
|
|
243
245
|
|
|
246
|
+
function settleSegmentBeforeToolCall(ctx) {
|
|
247
|
+
const { stream } = ctx;
|
|
248
|
+
if (!stream.currentAssistantText.trim()) return;
|
|
249
|
+
ctx.markPromptCommitted();
|
|
250
|
+
flushStreamBatch(stream);
|
|
251
|
+
commitAssistantSegment(stream, { sealToolBlock: true });
|
|
252
|
+
// The response's own content (onAssistantText, before its tool calls open)
|
|
253
|
+
// is this streamed text again: it must not reopen as a second row.
|
|
254
|
+
stream.settledBeforeToolCall = true;
|
|
255
|
+
}
|
|
256
|
+
|
|
244
257
|
async function openToolCalls(ctx, calls) {
|
|
245
258
|
const { stream, cards, runtime } = ctx;
|
|
246
259
|
ctx.markPromptCommitted();
|
|
260
|
+
stream.settledBeforeToolCall = false;
|
|
247
261
|
// Flush buffered mid-turn assistant text before the tool card appears;
|
|
248
262
|
// otherwise, with neither a thinking panel nor a spinner active, the
|
|
249
263
|
// message above the tool card vanished.
|
|
@@ -323,10 +337,15 @@ export function applyCompactEvent(ctx, event) {
|
|
|
323
337
|
set({ ...routeState(), stats: { ...getState().stats } });
|
|
324
338
|
}
|
|
325
339
|
|
|
326
|
-
function applyTurnUsageDelta(
|
|
340
|
+
function applyTurnUsageDelta(ctx, delta) {
|
|
341
|
+
const { turn, getState, set, syncContextStats } = ctx;
|
|
327
342
|
const stats = { ...getState().stats };
|
|
328
343
|
applyUsageDelta(stats, delta);
|
|
329
344
|
set({ stats });
|
|
345
|
+
// The call is over: the composer's live speed gives way to the session's
|
|
346
|
+
// figure, which this delta's exact usage has just joined.
|
|
347
|
+
startNextLiveCall(ctx.stream);
|
|
348
|
+
// Publishes the session's persisted usage totals (stats.usageReadout) too.
|
|
330
349
|
syncContextStats({ allowEstimated: true });
|
|
331
350
|
const inputTokens = Math.max(0, getState().stats.inputTokens - turn.inputBaseline);
|
|
332
351
|
const outputTokens = Math.max(0, getState().stats.outputTokens - turn.outputBaseline);
|
|
@@ -356,7 +375,6 @@ function turnHandlers(ctx) {
|
|
|
356
375
|
},
|
|
357
376
|
drainSteering: (_sessionId, drainOptions) =>
|
|
358
377
|
isCurrentTurn() ? drainPendingSteering({ ...drainOptions, turnEpoch: ctx.turn.epoch }) : [],
|
|
359
|
-
onStreamDelta: () => {},
|
|
360
378
|
onSteerMessage: (text, steeringMeta = {}) => {
|
|
361
379
|
if (isCurrentTurn()) injectSteerMessage(ctx, text, steeringMeta);
|
|
362
380
|
},
|
|
@@ -372,9 +390,14 @@ function turnHandlers(ctx) {
|
|
|
372
390
|
};
|
|
373
391
|
}
|
|
374
392
|
|
|
375
|
-
function toolHandlers(ctx) {
|
|
393
|
+
export function toolHandlers(ctx) {
|
|
376
394
|
const { isCurrentTurn, cards, getState, set, options } = ctx;
|
|
377
395
|
return {
|
|
396
|
+
// The provider streamed a tool call: the text before it is complete (a
|
|
397
|
+
// preamble), so it settles now instead of after the whole response.
|
|
398
|
+
onAssistantToolCallObserved: () => {
|
|
399
|
+
if (isCurrentTurn()) settleSegmentBeforeToolCall(ctx);
|
|
400
|
+
},
|
|
378
401
|
onToolCall: async (_iter, calls) => {
|
|
379
402
|
if (isCurrentTurn()) await openToolCalls(ctx, calls);
|
|
380
403
|
},
|
|
@@ -423,20 +446,38 @@ export function streamHandlers(ctx) {
|
|
|
423
446
|
// prompt — the runtime would rewind it while the host skipped the requeue.
|
|
424
447
|
if (textChunk.trim()) ctx.markPromptCommitted();
|
|
425
448
|
appendTextDelta(stream, textChunk);
|
|
449
|
+
noteLiveCallText(stream, textChunk);
|
|
450
|
+
},
|
|
451
|
+
onTextReset: (reset = {}) => {
|
|
452
|
+
if (!isCurrentTurn()) return false;
|
|
453
|
+
endLiveCall(stream);
|
|
454
|
+
return resetStreamedText(stream, reset);
|
|
426
455
|
},
|
|
427
|
-
onTextReset: (reset = {}) => (isCurrentTurn() ? resetStreamedText(stream, reset) : false),
|
|
428
456
|
onAssistantText: (text, detail) => {
|
|
429
457
|
const full = String(text ?? '');
|
|
430
458
|
if (!full.trim() || !isCurrentTurn()) return;
|
|
431
459
|
// The streaming path owns this segment when it already produced text.
|
|
432
460
|
// Do not check turn-global assistantText: earlier closed preambles stay
|
|
433
461
|
// there across tool calls.
|
|
434
|
-
if (stream.currentAssistantText.trim()) return;
|
|
462
|
+
if (stream.currentAssistantText.trim() || stream.settledBeforeToolCall) return;
|
|
435
463
|
ctx.markPromptCommitted();
|
|
436
464
|
appendAssistantText(stream, full, { committed: detail?.committed === true });
|
|
437
465
|
},
|
|
438
466
|
onReasoningDelta: (chunk) => {
|
|
439
|
-
if (isCurrentTurn())
|
|
467
|
+
if (!isCurrentTurn()) return;
|
|
468
|
+
appendReasoningDelta(stream, String(chunk ?? ''));
|
|
469
|
+
noteLiveCallText(stream, chunk);
|
|
470
|
+
},
|
|
471
|
+
// A provider output item started. A tool call ends the text before it
|
|
472
|
+
// (a preamble settles at the call's start, not after its arguments or
|
|
473
|
+
// the whole response); a message naming its phase marks its row as
|
|
474
|
+
// commentary or final answer.
|
|
475
|
+
onStreamItemStart: (detail) => {
|
|
476
|
+
if (!isCurrentTurn()) return;
|
|
477
|
+
if (detail?.kind === 'tool') {
|
|
478
|
+
withdrawLiveCall(stream);
|
|
479
|
+
settleSegmentBeforeToolCall(ctx);
|
|
480
|
+
} else if (detail?.kind === 'text') noteAssistantPhase(stream, detail.phase);
|
|
440
481
|
},
|
|
441
482
|
};
|
|
442
483
|
}
|
|
@@ -693,11 +734,12 @@ export function createRunTurn(bag) {
|
|
|
693
734
|
markPromptCommitted: () => commitPromptRestore(flags, turn),
|
|
694
735
|
};
|
|
695
736
|
const stopTaskWaitSteeringCheck = registerTaskWaitSteeringCheck(
|
|
696
|
-
(sessionId) => isCurrentTurn() && runtime.id === sessionId && bag.
|
|
737
|
+
(sessionId) => isCurrentTurn() && runtime.id === sessionId && bag.pendingTaskWaitWake()
|
|
697
738
|
);
|
|
698
739
|
try {
|
|
699
740
|
const { result, session } = await runtime.ask(userText, {
|
|
700
741
|
id: turn.submittedIds[0],
|
|
742
|
+
submissionIds: turn.submittedIds,
|
|
701
743
|
submittedAt: options.submittedAt,
|
|
702
744
|
promptSource: options.promptSource,
|
|
703
745
|
retryFailedTurn: options.retryFailedTurn === true,
|
|
@@ -705,6 +747,7 @@ export function createRunTurn(bag) {
|
|
|
705
747
|
retryAttemptId: options.retryAttemptId,
|
|
706
748
|
transcriptMeta: turn.transcriptMeta,
|
|
707
749
|
context: options.context || null,
|
|
750
|
+
...(typeof options.skillSelection === 'string' ? { skillSelection: options.skillSelection } : {}),
|
|
708
751
|
...turnHandlers(ctx),
|
|
709
752
|
...toolHandlers(ctx),
|
|
710
753
|
...streamHandlers(ctx),
|
package/src/ui/statusline.mjs
CHANGED
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
* CLI route passed here.
|
|
11
11
|
*/
|
|
12
12
|
import { readCachedOAuthUsageSnapshot } from '../runtime/agent/orchestrator/providers/oauth-usage.mjs';
|
|
13
|
-
import { readCachedOpenCodeGoUsageSnapshot } from '../runtime/agent/orchestrator/providers/opencode-go-usage.mjs';
|
|
14
13
|
import { buildGatewayLimits } from '../runtime/agent/orchestrator/providers/statusline-route-meta.mjs';
|
|
15
14
|
import { formatGatewayLimitSegments, loadGatewayStatus } from '../vendor/statusline/bin/statusline-route.mjs';
|
|
16
15
|
import { createSessionStats } from './session-stats.mjs';
|
|
@@ -614,14 +613,11 @@ function refreshFallbackQuotaStatus(cacheKey, normalizedProvider, model) {
|
|
|
614
613
|
// the route reports nothing worth a segment.
|
|
615
614
|
function fallbackQuotaValue(routeInfo, normalizedProvider) {
|
|
616
615
|
let usageSnapshot = null;
|
|
617
|
-
if (normalizedProvider
|
|
618
|
-
usageSnapshot = readCachedOpenCodeGoUsageSnapshot();
|
|
619
|
-
} else if (normalizedProvider.includes('oauth')) {
|
|
616
|
+
if (normalizedProvider.includes('oauth')) {
|
|
620
617
|
try {
|
|
621
618
|
usageSnapshot = readCachedOAuthUsageSnapshot(routeInfo, { allowStale: true });
|
|
622
619
|
} catch {}
|
|
623
620
|
}
|
|
624
|
-
if (normalizedProvider === 'opencode-go' && !usageSnapshot) return null;
|
|
625
621
|
// Boot guard: do not render previous-launch usage before the current
|
|
626
622
|
// runtime has captured at least one snapshot. Once captured in this
|
|
627
623
|
// process, keep it visible while idle even if refreshes are delayed.
|
|
@@ -647,7 +643,6 @@ function fallbackQuotaValue(routeInfo, normalizedProvider) {
|
|
|
647
643
|
|
|
648
644
|
function providerKindForQuota(provider) {
|
|
649
645
|
const p = String(provider || '').toLowerCase();
|
|
650
|
-
if (p === 'opencode-go') return 'quota-api';
|
|
651
646
|
if (p.includes('oauth')) return 'oauth';
|
|
652
647
|
if (p === 'mixdog-local') return 'local';
|
|
653
648
|
return 'api';
|