mixdog 1.4.1 → 1.4.3
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/package.json +4 -3
- package/scripts/build-shipped-history.mjs +125 -33
- package/scripts/gate-local.mjs +220 -63
- package/scripts/graph-parity.mjs +8 -3
- package/scripts/lib/gate-scheduler.mjs +139 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +71 -34
- package/scripts/lib/scoped-temp.mjs +1 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +9 -4
- package/scripts/lib/test-spawn-ledger.mjs +43 -3
- package/scripts/post-release-check.mjs +26 -16
- package/scripts/pptx-kit-index.mjs +5 -6
- package/scripts/provider-pingpong-live.mjs +1 -1
- package/scripts/prune-embedding-runtime.mjs +3 -1
- package/scripts/release-paths.mjs +7 -1
- package/scripts/suite-health.mjs +110 -28
- package/scripts/test.mjs +9 -14
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/explore/AGENT.md +22 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +38 -2
- package/src/defaults/skills/browser-use/SKILL.md +4 -1
- package/src/defaults/skills/code-tidy/SKILL.md +71 -102
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
- package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
- package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
- package/src/defaults/skills/computer-use/SKILL.md +12 -2
- package/src/defaults/skills/setup/SKILL.md +2 -2
- package/src/defaults/skills/setup/references/actions.md +28 -9
- package/src/defaults/skills/setup/references/surfaces.md +5 -2
- package/src/defaults/skills/setup-guide/SKILL.md +11 -3
- package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
- package/src/defaults/skills/skill-creator/SKILL.md +85 -190
- package/src/defaults/skills/skill-creator/references/design.md +70 -162
- package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
- package/src/defaults/skills/test-suite/SKILL.md +194 -0
- package/src/defaults/skills/test-suite/references/case-management.md +51 -0
- package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
- package/src/defaults/skills/test-suite/references/reliability.md +49 -0
- package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
- package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
- package/src/defaults/skills/visualize/SKILL.md +6 -2
- package/src/lib/instruction-text.cjs +36 -0
- package/src/lib/rules-builder.cjs +40 -50
- package/src/orchestration/balanced.md +23 -0
- package/src/orchestration/focused.md +22 -0
- package/src/orchestration/none.md +5 -0
- package/src/orchestration/swarm.md +24 -0
- package/src/rules/agent-mode/AGENT_MODE.md +3 -1
- package/src/rules/agent-mode/MIXY.md +2 -2
- package/src/rules/lead/LEAD.md +3 -3
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +4 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
- package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
- package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
- package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
- package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
- package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
- package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
- package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/attachments/attachment-reference.mjs +1 -1
- package/src/runtime/attachments/pdf-extract.mjs +1 -1
- package/src/runtime/attachments/store.d.mts +1 -0
- package/src/runtime/attachments/store.mjs +2 -2
- package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
- package/src/runtime/channels/lib/scheduler.mjs +33 -0
- package/src/runtime/channels/lib/schedules-db.mjs +11 -4
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
- package/src/runtime/channels/lib/whisper-port.mjs +19 -10
- package/src/runtime/channels/lib/whisper-server.mjs +22 -13
- package/src/runtime/channels/lib/worker-main.mjs +9 -31
- package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
- package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
- package/src/runtime/connectors/gmail-app-password.mjs +4 -4
- package/src/runtime/connectors/google-mcp.mjs +1 -1
- package/src/runtime/effort-judge/judge-client.mjs +2 -2
- package/src/runtime/effort-judge/judge-input.mjs +4 -4
- package/src/runtime/explore/explorer.mjs +88 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/local-provider/hardware.mjs +1 -1
- package/src/runtime/media/adapters/codex-image.mjs +3 -3
- package/src/runtime/media/adapters/gemini-video.mjs +1 -1
- package/src/runtime/media/media-usage.mjs +1 -1
- package/src/runtime/media/store.mjs +1 -1
- package/src/runtime/memory/index.mjs +15 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
- package/src/runtime/memory/lib/memory-embed.mjs +83 -14
- package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
- package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
- package/src/runtime/memory/lib/memory.mjs +17 -0
- package/src/runtime/memory/lib/pg/process.mjs +1 -1
- package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
- package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/capabilities.mjs +1 -1
- package/src/runtime/office/core/office-core.mjs +1 -1
- package/src/runtime/office/design/content-model.mjs +3 -3
- package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
- package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
- package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
- package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
- package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
- package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +8 -6
- package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
- package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.d.mts +8 -0
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +37 -10
- package/src/runtime/shared/background-wait.mjs +66 -0
- package/src/runtime/shared/child-guardian.mjs +17 -7
- package/src/runtime/shared/config.mjs +313 -16
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +14 -8
- package/src/runtime/shared/connector-catalog.mjs +70 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +21 -18
- package/src/runtime/shared/git-launch.d.mts +9 -0
- package/src/runtime/shared/git-launch.mjs +213 -0
- package/src/runtime/shared/git-runner-worker.mjs +2 -1
- package/src/runtime/shared/git-runner.mjs +7 -2
- package/src/runtime/shared/idle-gc.mjs +30 -7
- package/src/runtime/shared/llm/cost.mjs +6 -1
- package/src/runtime/shared/llm/http-agent.mjs +316 -29
- package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
- package/src/runtime/shared/llm/model-catalog.mjs +46 -6
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
- package/src/runtime/shared/llm/system-proxy.mjs +453 -0
- package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
- package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
- package/src/runtime/shared/maintenance-schedule.mjs +109 -0
- package/src/runtime/shared/process-runner.mjs +8 -4
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/routine-trigger.d.mts +13 -0
- package/src/runtime/shared/routine-trigger.mjs +34 -0
- package/src/runtime/shared/run-child.d.mts +2 -1
- package/src/runtime/shared/run-child.mjs +70 -18
- package/src/runtime/shared/session-scratch.mjs +14 -2
- package/src/runtime/shared/shipped-definitions.mjs +7 -1
- package/src/runtime/shared/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- package/src/runtime/shared/tool-card-model.golden.json +3 -12
- package/src/runtime/shared/tool-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-surface.mjs +110 -36
- package/src/runtime/shared/tool-work-units.mjs +35 -6
- package/src/runtime/shared/turn-snapshot.mjs +26 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
- package/src/runtime/shared/worker-requests.mjs +17 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
- package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
- package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
- package/src/runtime/shared/worktrees/contract.mjs +16 -6
- package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
- package/src/runtime/shared/worktrees/disk.mjs +79 -2
- package/src/runtime/shared/worktrees/git.mjs +97 -7
- package/src/runtime/shared/worktrees/include.mjs +6 -4
- package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
- package/src/runtime/shared/worktrees/manager.mjs +962 -197
- package/src/runtime/shared/worktrees/settings.mjs +33 -7
- package/src/runtime/shared/worktrees/test-support.mjs +5 -1
- package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +9 -5
- package/src/runtime/tidy/resolve.mjs +19 -16
- package/src/runtime/tidy/runners/biome.mjs +3 -3
- package/src/runtime/tidy/tool.mjs +1 -1
- package/src/runtime/tidy/worktree.mjs +10 -6
- package/src/runtime/visualize-bridge/client.mjs +4 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +4 -23
- package/src/runtime/web-search/lib/web-tools.mjs +2 -2
- package/src/runtime/web-search/tool-defs.mjs +17 -26
- package/src/session-runtime/agent-profile-changes.mjs +55 -4
- package/src/session-runtime/agent-task-sessions.mjs +410 -353
- package/src/session-runtime/boot/apis.mjs +27 -4
- package/src/session-runtime/boot/begin.mjs +2 -0
- package/src/session-runtime/boot/config.mjs +10 -1
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/providers.mjs +70 -3
- package/src/session-runtime/boot/session.mjs +2 -0
- package/src/session-runtime/boot/tools.mjs +71 -25
- package/src/session-runtime/bot-status.mjs +103 -103
- package/src/session-runtime/channel-config-api.mjs +1 -0
- package/src/session-runtime/config-change-effects.mjs +179 -0
- package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
- package/src/session-runtime/config-lifecycle.mjs +160 -24
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/discovery.mjs +245 -47
- package/src/session-runtime/conversation-import/service.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +49 -3
- package/src/session-runtime/handoff-attachments.mjs +1 -1
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
- package/src/session-runtime/internal-tool-executor.mjs +12 -19
- package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
- package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
- package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
- package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
- package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
- package/src/session-runtime/mixy-heartbeat.mjs +1 -1
- package/src/session-runtime/model-route/set-route.mjs +40 -7
- package/src/session-runtime/native-web-search/routes.mjs +3 -3
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/provider-auth/refresh.mjs +6 -3
- package/src/session-runtime/provider-auth/setup.mjs +1 -1
- package/src/session-runtime/provider-readiness.mjs +53 -4
- package/src/session-runtime/resource-api.mjs +1 -1
- package/src/session-runtime/resource-extension-sync.mjs +4 -8
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
- package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/resource-plugins-api.mjs +4 -0
- package/src/session-runtime/routine-executor.mjs +152 -0
- package/src/session-runtime/routine-home-turn.mjs +46 -5
- package/src/session-runtime/runtime-facade.mjs +5 -0
- package/src/session-runtime/runtime-feature-gates.mjs +2 -11
- package/src/session-runtime/schedule-session-run.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
- package/src/session-runtime/services/agent-tool.mjs +51 -1
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- package/src/session-runtime/services/channel-admin.mjs +18 -0
- package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
- package/src/session-runtime/services/daemon-candidate.mjs +4 -1
- package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
- package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +14 -6
- package/src/session-runtime/services/provider-admin.mjs +281 -10
- package/src/session-runtime/services/seeds.mjs +7 -0
- package/src/session-runtime/services/usage-stats-model.mjs +32 -11
- package/src/session-runtime/session-create/materialize.mjs +4 -2
- package/src/session-runtime/session-create/session-options.mjs +2 -0
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
- package/src/session-runtime/settings-system-api.mjs +1 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
- package/src/session-runtime/setup-tool/executor.mjs +14 -3
- package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
- package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
- package/src/session-runtime/tool-policy-refresh.mjs +182 -5
- package/src/session-runtime/tool-surface.mjs +38 -1
- package/src/session-runtime/turn/agent-ops.mjs +33 -2
- package/src/session-runtime/turn/session-ops.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
- package/src/session-runtime/turn/turn-run.mjs +1 -1
- package/src/session-runtime/webhook-session-run.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
- package/src/session-runtime/workflow-agents-api.mjs +2 -0
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- package/src/session-runtime/workspace/project-branches.mjs +1 -1
- package/src/session-runtime/workspace/session-view.mjs +149 -0
- package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
- package/src/session-runtime/workspace/transition-runner.mjs +188 -0
- package/src/session-runtime/workspace/transitions.mjs +128 -1070
- package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
- package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
- package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
- package/src/standalone/daemon-agent-control.mjs +25 -8
- package/src/standalone/daemon-desktop-runtime.mjs +8 -2
- package/src/standalone/daemon-lag-profiler.mjs +7 -7
- package/src/standalone/daemon-session-control.mjs +151 -136
- package/src/standalone/daemon.mjs +61 -2
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +21 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +15 -0
- package/src/standalone/session-service/agent-route-follow.mjs +23 -20
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
- package/src/standalone/session-service/agent-tree.mjs +45 -9
- package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
- package/src/standalone/session-service/quota-resume.mjs +9 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
- package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
- package/src/standalone/session-service/session-calls.mjs +2 -1
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/tui/App.jsx +162 -164
- package/src/tui/app/app-view/floating-panel.jsx +3 -0
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +22 -11
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/doctor.mjs +2 -2
- package/src/tui/app/panel-signature.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
- package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
- package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
- package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
- package/src/tui/app/provider-setup-picker.mjs +20 -13
- package/src/tui/app/settings-picker.mjs +53 -8
- package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
- package/src/tui/app/slash-commands.mjs +2 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
- package/src/tui/app/slash-dispatch.mjs +1 -1
- package/src/tui/app/use-btw-panel.mjs +29 -0
- package/src/tui/app/use-context-panel-refresh.mjs +31 -0
- package/src/tui/app/use-model-catalog-cache.mjs +13 -10
- package/src/tui/app/use-mouse-input.mjs +11 -0
- package/src/tui/app/use-onboarding-start.mjs +8 -3
- package/src/tui/app/use-panel-transition.mjs +10 -1
- package/src/tui/app/use-pasted-buffers.mjs +28 -20
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
- package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
- package/src/tui/app/use-prompt-queue-history.mjs +5 -4
- package/src/tui/app/use-selection-focus.mjs +11 -2
- package/src/tui/app/use-selection-geometry.mjs +18 -9
- package/src/tui/app/use-selection-paint.mjs +4 -4
- package/src/tui/app/use-selection-stitch.mjs +3 -3
- package/src/tui/app/use-slash-palette.mjs +62 -0
- package/src/tui/app/use-terminal-chrome.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +48 -33
- package/src/tui/app/use-transcript-follow.mjs +12 -4
- package/src/tui/app/use-transcript-scroll.mjs +46 -17
- package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
- package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
- package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
- package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
- package/src/tui/app/use-transcript-window.mjs +21 -11
- package/src/tui/app/use-tui-ready.mjs +18 -0
- package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
- package/src/tui/components/Picker.jsx +27 -3
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
- package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
- package/src/tui/components/question-panel-model.mjs +4 -4
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/components/tool-execution/standard-card.jsx +3 -4
- package/src/tui/components/user-message-skills.mjs +1 -1
- package/src/tui/dist/index.mjs +2205 -1371
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
- package/src/tui/session/agent-job-feed.mjs +2 -0
- package/src/tui/session/context-state.mjs +3 -0
- package/src/tui/session/goal-turn-state.mjs +6 -2
- package/src/tui/session/quota-resume.mjs +1 -1
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +8 -0
- package/src/tui/session/session-api/intake/abort.mjs +2 -1
- package/src/tui/session/session-api/intake.mjs +2 -0
- package/src/tui/session/session-api/integrations.mjs +2 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
- package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/session-api/worktree.mjs +13 -1
- package/src/tui/session/session-flow/drain.mjs +11 -14
- package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
- package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
- package/src/tui/session/transcript-spill.mjs +92 -4
- package/src/tui/session/transcript-store.mjs +2 -0
- package/src/tui/session/turn-quiet.mjs +1 -1
- package/src/tui/session/turn.mjs +3 -0
- package/src/tui/session/worktree-setup-notice.mjs +1 -1
- package/src/tui/spinner-meta.mjs +3 -3
- package/src/tui/spinner-verbs.mjs +2 -2
- package/src/defaults/skills/goal-management/SKILL.md +0 -169
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
- package/src/session-runtime/goal-tasks.mjs +0 -1
|
@@ -6,9 +6,13 @@ import { openInBrowser } from '../../../runtime/shared/open-url.mjs';
|
|
|
6
6
|
import { providerDetailText } from '../app-format.mjs';
|
|
7
7
|
import { forgetProviderAuth, keyConsoleUrl, providerStatusFooter } from './provider-items.mjs';
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const VERTEX_EXPRESS_HINT =
|
|
10
|
+
'Express mode API keys serve Gemini models on the global location only. Claude and MaaS models need a service-account key or the gcloud login.';
|
|
11
|
+
|
|
12
|
+
const setApiKeyPrompt = (flow, providerItem, extra = {}) => {
|
|
10
13
|
if (!flow.ownsSurface()) return;
|
|
11
14
|
flow.setProviderPrompt({
|
|
15
|
+
...extra,
|
|
12
16
|
kind: 'api-key',
|
|
13
17
|
providerId: providerItem._providerId,
|
|
14
18
|
label: providerItem._providerName,
|
|
@@ -51,6 +55,28 @@ function apiKeyActions(providerItem, provider) {
|
|
|
51
55
|
return { apiActions, keyUrl };
|
|
52
56
|
}
|
|
53
57
|
|
|
58
|
+
// Vertex AI takes either a service-account key or an express-mode API key.
|
|
59
|
+
function openVertexModePicker(flow, providerItem) {
|
|
60
|
+
flow.paint({
|
|
61
|
+
title: `Provider · ${providerItem._providerName}`,
|
|
62
|
+
description: 'Choose the Vertex AI key type.',
|
|
63
|
+
help: '↑/↓ Select · Enter Choose · Esc Back',
|
|
64
|
+
indexMode: 'always',
|
|
65
|
+
labelWidth: 22,
|
|
66
|
+
pickerKey: `providers-vertex-mode:${providerItem.value}`,
|
|
67
|
+
initialIndex: 0,
|
|
68
|
+
items: [
|
|
69
|
+
{ value: 'service-account', label: 'Service account key', description: 'service-account JSON' },
|
|
70
|
+
{ value: 'api-key', label: 'API key (express mode)', description: 'Gemini only · global location' },
|
|
71
|
+
],
|
|
72
|
+
onSelect: (mode) => {
|
|
73
|
+
flow.releaseSurface();
|
|
74
|
+
setApiKeyPrompt(flow, providerItem, mode === 'api-key' ? { authMode: 'api-key', hint: VERTEX_EXPRESS_HINT } : {});
|
|
75
|
+
},
|
|
76
|
+
onCancel: () => openApiProviderActions(flow, providerItem),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
54
80
|
export function openApiProviderActions(flow, providerItem) {
|
|
55
81
|
// Reached from acks (a failed forget-key) as well as key presses: prove
|
|
56
82
|
// ownership at the sink so every caller is covered.
|
|
@@ -69,6 +95,10 @@ export function openApiProviderActions(flow, providerItem) {
|
|
|
69
95
|
initialIndex: 0,
|
|
70
96
|
items: apiActions,
|
|
71
97
|
onSelect: (_detailValue, detail) => {
|
|
98
|
+
if (detail._action === 'set-key' && providerItem._providerId === 'vertex-ai') {
|
|
99
|
+
openVertexModePicker(flow, providerItem);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
72
102
|
flow.releaseSurface();
|
|
73
103
|
if (detail._action === 'set-key') {
|
|
74
104
|
setApiKeyPrompt(flow, providerItem);
|
|
@@ -16,11 +16,21 @@ const panelFrame = (providerItem, provider, pickerKey) => ({
|
|
|
16
16
|
initialIndex: 0,
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
// Shown with every device code: a code someone else hands you signs THEM in to your account.
|
|
20
|
+
// One row that fits 80 columns: it takes the row the status footer did, so the URL
|
|
21
|
+
// keeps its copy-hint row and the "Enter code" line is never replaced by the copy note.
|
|
22
|
+
const DEVICE_CODE_WARNING = [
|
|
23
|
+
{ glyph: '!', text: 'Continue only if you started this. Never enter a code someone sent you.' },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
function showOAuthProgress(flow, providerItem, message, onBack, detail = '', footer = null) {
|
|
20
27
|
const provider = providerItem._provider || {};
|
|
28
|
+
const frame = panelFrame(providerItem, provider, `providers-oauth-progress:${providerItem.value}`);
|
|
21
29
|
flow.paint({
|
|
22
|
-
...
|
|
30
|
+
...frame,
|
|
31
|
+
...(footer ? { footer } : {}),
|
|
23
32
|
description: message,
|
|
33
|
+
detail,
|
|
24
34
|
help: '↑/↓ Select · Enter Choose · Esc Providers',
|
|
25
35
|
indexMode: 'never',
|
|
26
36
|
items: [
|
|
@@ -80,10 +90,11 @@ function oauthCodeHint(manualUrl, loginUrl, providerName) {
|
|
|
80
90
|
return `Paste the authorization code or full redirect URL for ${providerName}.`;
|
|
81
91
|
}
|
|
82
92
|
|
|
93
|
+
// The URL goes in the picker's wrapped `detail` block, never the one-line description.
|
|
83
94
|
function pollingLoginMessage(userCode, loginUrl, opened) {
|
|
84
|
-
if (userCode) return `Enter code ${userCode} at
|
|
85
|
-
if (loginUrl) return `Open this URL to sign in
|
|
86
|
-
return 'Finish signing in for this provider.';
|
|
95
|
+
if (userCode) return { message: `Enter code ${userCode} at${opened}:`, detail: loginUrl };
|
|
96
|
+
if (loginUrl) return { message: `Open this URL to sign in${opened}:`, detail: loginUrl };
|
|
97
|
+
return { message: 'Finish signing in for this provider.', detail: '' };
|
|
87
98
|
}
|
|
88
99
|
|
|
89
100
|
/** Login through store.beginOAuthProviderLogin: a code-completing login hands
|
|
@@ -148,7 +159,15 @@ function beginInteractiveOAuthLogin(flow, providerItem, login) {
|
|
|
148
159
|
// Device-code and URL-only polling logins stay in the progress panel,
|
|
149
160
|
// with the code and URL, until the result panel replaces it or Back.
|
|
150
161
|
const opened = openBrowser ? ' (browser opened)' : '';
|
|
151
|
-
|
|
162
|
+
const { message, detail } = pollingLoginMessage(started?.userCode, loginUrl, opened);
|
|
163
|
+
showOAuthProgress(
|
|
164
|
+
flow,
|
|
165
|
+
providerItem,
|
|
166
|
+
message,
|
|
167
|
+
login.onBack,
|
|
168
|
+
detail,
|
|
169
|
+
started?.userCode ? () => DEVICE_CODE_WARNING : null
|
|
170
|
+
);
|
|
152
171
|
}
|
|
153
172
|
started.waitForCallback
|
|
154
173
|
?.then((result) => {
|
|
@@ -18,6 +18,25 @@ import {
|
|
|
18
18
|
|
|
19
19
|
const providerFooter = (item) => providerStatusFooter(item?._provider);
|
|
20
20
|
|
|
21
|
+
/** The rows of the main provider list: the continue row, one row per provider,
|
|
22
|
+
* and the client refresh row. */
|
|
23
|
+
function mainListItems(setup, options, canContinue) {
|
|
24
|
+
const items = [];
|
|
25
|
+
if (canContinue && !options.confirmBar) {
|
|
26
|
+
items.push({
|
|
27
|
+
value: 'continue-setup',
|
|
28
|
+
label: options.continueLabel || 'Continue setup',
|
|
29
|
+
description: options.continueDescription || 'return to setup',
|
|
30
|
+
_type: 'continue',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
items.push(...buildProviderItems(setup));
|
|
34
|
+
if (setup.managedByClient === true) {
|
|
35
|
+
items.push({ value: 'refresh-client-providers', label: 'Refresh', _type: 'refresh-client-providers' });
|
|
36
|
+
}
|
|
37
|
+
return items;
|
|
38
|
+
}
|
|
39
|
+
|
|
21
40
|
export function createProviderSetupPicker({
|
|
22
41
|
store,
|
|
23
42
|
surface,
|
|
@@ -87,19 +106,7 @@ export function createProviderSetupPicker({
|
|
|
87
106
|
if (!setup) return;
|
|
88
107
|
}
|
|
89
108
|
|
|
90
|
-
const items =
|
|
91
|
-
if ((returnTo || onContinue) && !options.confirmBar) {
|
|
92
|
-
items.push({
|
|
93
|
-
value: 'continue-setup',
|
|
94
|
-
label: options.continueLabel || 'Continue setup',
|
|
95
|
-
description: options.continueDescription || 'return to setup',
|
|
96
|
-
_type: 'continue',
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
items.push(...buildProviderItems(setup));
|
|
100
|
-
if (setup.managedByClient === true) {
|
|
101
|
-
items.push({ value: 'refresh-client-providers', label: 'Refresh', _type: 'refresh-client-providers' });
|
|
102
|
-
}
|
|
109
|
+
const items = mainListItems(setup, options, Boolean(returnTo || onContinue));
|
|
103
110
|
|
|
104
111
|
const flow = {
|
|
105
112
|
store,
|
|
@@ -13,6 +13,16 @@ import { settingsHandoffPanel, createSettingsNavigation } from './settings-picke
|
|
|
13
13
|
import { buildSettingsItems, readSettingsView } from './settings-picker/settings-rows.mjs';
|
|
14
14
|
import { createSettingsToggles } from './settings-picker/settings-toggles.mjs';
|
|
15
15
|
|
|
16
|
+
// The factory is rebuilt every render, so the heavy-read gate lives beside the
|
|
17
|
+
// App-owned cache ref it protects: `running` is the one heavy read in flight,
|
|
18
|
+
// `queued` the single follow-up owed to changes that arrived meanwhile, and
|
|
19
|
+
// `freshWrites` counts heavy reads that wrote the cache.
|
|
20
|
+
const heavyGates = new WeakMap();
|
|
21
|
+
const heavyGateOf = (cacheRef) => {
|
|
22
|
+
if (!heavyGates.has(cacheRef)) heavyGates.set(cacheRef, { running: false, queued: false, freshWrites: 0 });
|
|
23
|
+
return heavyGates.get(cacheRef);
|
|
24
|
+
};
|
|
25
|
+
|
|
16
26
|
export function createSettingsPicker({
|
|
17
27
|
store,
|
|
18
28
|
state,
|
|
@@ -21,6 +31,7 @@ export function createSettingsPicker({
|
|
|
21
31
|
setSettingsPrompt,
|
|
22
32
|
settingsHeavyCacheRef,
|
|
23
33
|
settingsRequestRef,
|
|
34
|
+
settingsLiveRefreshRef,
|
|
24
35
|
formatDuration,
|
|
25
36
|
displayModelName,
|
|
26
37
|
routeModelLabel,
|
|
@@ -51,16 +62,31 @@ export function createSettingsPicker({
|
|
|
51
62
|
// destination synchronously before the daemon snapshot so the empty-chat
|
|
52
63
|
// welcome logo cannot appear between the old panel and Settings.
|
|
53
64
|
if (!light && !own.paint(settingsHandoffPanel())) return;
|
|
54
|
-
|
|
65
|
+
// `heavy` re-reads MCP/plugin/skill status even on a light (no handoff
|
|
66
|
+
// paint) build: the cached values would otherwise win over a fresh snapshot.
|
|
67
|
+
const heavyCache = light && opts.heavy !== true ? settingsHeavyCacheRef.current : null;
|
|
55
68
|
// ONE round-trip for the whole panel: on a daemon-backed store each getter
|
|
56
69
|
// below is a serialized remote call, and reading them synchronously handed
|
|
57
70
|
// back promises (every row rendered its default). getSettingsSnapshot runs
|
|
58
71
|
// the same getters engine-side and answers once.
|
|
72
|
+
const gate = heavyGateOf(settingsHeavyCacheRef);
|
|
73
|
+
const freshWritesAtStart = gate.freshWrites;
|
|
59
74
|
const snapshot = (await store.getSettingsSnapshot?.({ heavy: !heavyCache })) || {};
|
|
60
|
-
const view = readSettingsView({ snapshot, heavyCache, state });
|
|
75
|
+
const view = readSettingsView({ snapshot, heavyCache, state }); // A superseded build (newer open/refresh) or one whose panel was already
|
|
76
|
+
// closed with Esc must never paint, clear prompts or write the cache: an
|
|
77
|
+
// older response settling late would otherwise roll the cache back for
|
|
78
|
+
// every later light refresh.
|
|
79
|
+
if (!isCurrentSettingsRequest(requestId)) {
|
|
80
|
+
// Its fresh heavy rows were dropped; unless a newer heavy read already
|
|
81
|
+
// refreshed the cache, owe the still-open panel one follow-up read.
|
|
82
|
+
if (!heavyCache && own.owns() && gate.freshWrites === freshWritesAtStart) gate.queued = true;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!own.owns()) return;
|
|
61
86
|
// Refresh the cache every build (light or full) so the next light
|
|
62
87
|
// refresh reuses whatever was most recently known.
|
|
63
88
|
settingsHeavyCacheRef.current = { mcp: view.mcp, plugins: view.plugins, skills: view.skills };
|
|
89
|
+
if (!heavyCache) gate.freshWrites += 1;
|
|
64
90
|
const toggles = createSettingsToggles({
|
|
65
91
|
store,
|
|
66
92
|
view,
|
|
@@ -85,10 +111,6 @@ export function createSettingsPicker({
|
|
|
85
111
|
routeModelLabel,
|
|
86
112
|
workflowDisplayName,
|
|
87
113
|
});
|
|
88
|
-
// A superseded build (newer open/refresh) or one whose panel was already
|
|
89
|
-
// closed with Esc must never paint or clear prompts.
|
|
90
|
-
if (!isCurrentSettingsRequest(requestId)) return;
|
|
91
|
-
if (!own.owns()) return;
|
|
92
114
|
setProviderPrompt(null);
|
|
93
115
|
setSettingsPrompt(null);
|
|
94
116
|
own.paint({
|
|
@@ -116,6 +138,11 @@ export function createSettingsPicker({
|
|
|
116
138
|
own.close();
|
|
117
139
|
},
|
|
118
140
|
});
|
|
141
|
+
// A settings change from elsewhere re-reads this panel while it is still
|
|
142
|
+
// the one on screen (the claim's epoch guards a closed or replaced panel).
|
|
143
|
+
// The change names no section (MCP servers, plugins and skills may have
|
|
144
|
+
// moved), so unlike a post-write refresh it re-reads the heavy rows too.
|
|
145
|
+
if (settingsLiveRefreshRef) settingsLiveRefreshRef.current = own.defer(() => refreshSettings({ heavy: true }));
|
|
119
146
|
};
|
|
120
147
|
|
|
121
148
|
// Public entry point. NEVER rejects: callers fire it detached
|
|
@@ -130,8 +157,26 @@ export function createSettingsPicker({
|
|
|
130
157
|
store.pushNotice(`settings unavailable: ${error?.message || error}`, 'error');
|
|
131
158
|
}
|
|
132
159
|
};
|
|
133
|
-
|
|
134
|
-
|
|
160
|
+
// One heavy read at a time; changes arriving meanwhile share a single
|
|
161
|
+
// follow-up, which goes through the live-refresh callback so it is a no-op
|
|
162
|
+
// once the panel was closed or replaced.
|
|
163
|
+
const refreshHeavy = () => {
|
|
164
|
+
const gate = heavyGateOf(settingsHeavyCacheRef);
|
|
165
|
+
if (gate.running) {
|
|
166
|
+
gate.queued = true;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
gate.running = true;
|
|
170
|
+
void openSettingsPicker({ light: true, heavy: true }).finally(() => {
|
|
171
|
+
gate.running = false;
|
|
172
|
+
if (!gate.queued) return;
|
|
173
|
+
gate.queued = false;
|
|
174
|
+
settingsLiveRefreshRef?.current?.();
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
const refreshSettings = ({ heavy = false } = {}) => {
|
|
178
|
+
if (heavy) refreshHeavy();
|
|
179
|
+
else void openSettingsPicker({ light: true });
|
|
135
180
|
};
|
|
136
181
|
const navigation = createSettingsNavigation({ openers, openSettingsPicker, setSettingsPrompt });
|
|
137
182
|
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* welcome banner, floating panel, and the layout signature that names them.
|
|
5
5
|
*/
|
|
6
6
|
import { isLiveSpinnerMetaVisible } from '../live-spinner-visibility.mjs';
|
|
7
|
-
import { promptContentRows,
|
|
7
|
+
import { promptContentRows, queuedBandRows } from '../text-layout.mjs';
|
|
8
8
|
import { questionPanelRows, questionsOf } from '../../components/question-panel-model.mjs';
|
|
9
|
+
import { signInUrlLayout } from '../../components/sign-in-url-layout.mjs';
|
|
9
10
|
import { CORE_MULTILINE_TEXT_ENTRY_KINDS } from '../panel-signature.mjs';
|
|
10
11
|
import { btwPanelRows } from '../btw-controller.mjs';
|
|
11
12
|
|
|
@@ -49,24 +50,25 @@ function promptBoxBudget(inputBoxHidden, promptLayoutValueRef, promptContentColu
|
|
|
49
50
|
|
|
50
51
|
// TextEntryPanel content is one prompt line (chrome + 1) for single-line
|
|
51
52
|
// prompts, or up to PANEL_MAX_VISIBLE wrapped rows for core memory add/edit.
|
|
52
|
-
// PLUS an optional
|
|
53
|
-
//
|
|
53
|
+
// PLUS an optional borderless sign-in URL block under the panel (the manual
|
|
54
|
+
// OAuth URL). The floating container clips from the TOP (flex-end +
|
|
54
55
|
// overflow hidden), so under-reserving here pushed the bordered title off
|
|
55
|
-
// the top of the panel.
|
|
56
|
-
//
|
|
57
|
-
|
|
56
|
+
// the top of the panel. The block gets only the rows the terminal leaves
|
|
57
|
+
// (maxFloatingPanelRows minus chrome and content) and TextEntryPanel degrades
|
|
58
|
+
// it to fit, using the same sign-in-url-layout math.
|
|
59
|
+
function textEntryBudget(textEntryPrompt, textEntryLayoutRows, frameColumns, maxFloatingPanelRows) {
|
|
58
60
|
const textEntryKind = String(textEntryPrompt?.kind || '');
|
|
59
61
|
const textEntryMultiline = CORE_MULTILINE_TEXT_ENTRY_KINDS.has(textEntryKind);
|
|
60
62
|
const textEntryDetailText = String(textEntryPrompt?.detail || '').trim();
|
|
61
|
-
const textEntryDetailRows = textEntryDetailText
|
|
62
|
-
? 1 + wrappedDetailRows(textEntryDetailText, Math.max(1, frameColumns - 4))
|
|
63
|
-
: 0;
|
|
64
63
|
const textEntryContentRows = textEntryMultiline ? textEntryLayoutRows : 1;
|
|
64
|
+
const textEntryUrlMaxRows = Math.max(0, maxFloatingPanelRows - PANEL_CHROME_ROWS - textEntryContentRows);
|
|
65
|
+
const textEntryDetailRows = signInUrlLayout(textEntryDetailText, frameColumns, textEntryUrlMaxRows).rows;
|
|
65
66
|
return {
|
|
66
67
|
textEntryKind,
|
|
67
68
|
textEntryMultiline,
|
|
68
69
|
textEntryDetailText,
|
|
69
70
|
textEntryDetailRows,
|
|
71
|
+
textEntryUrlMaxRows,
|
|
70
72
|
textEntryContentRows,
|
|
71
73
|
TEXT_ENTRY_ROWS: PANEL_CHROME_ROWS + textEntryContentRows + textEntryDetailRows,
|
|
72
74
|
};
|
|
@@ -137,8 +139,8 @@ function floatingPanelBudget({
|
|
|
137
139
|
else if (btwPanel) desiredFloatingPanelRows = btwPanelRows(btwPanel, frameColumns);
|
|
138
140
|
const floatingPanelRows = desiredFloatingPanelRows > 0 ? Math.min(desiredFloatingPanelRows, maxFloatingPanelRows) : 0;
|
|
139
141
|
// Give the list every content row the panel exposes. The panel already grew
|
|
140
|
-
// by OPTION_PANEL_EXTRA_ROWS;
|
|
141
|
-
//
|
|
142
|
+
// by OPTION_PANEL_EXTRA_ROWS; subtracting that growth back out would leak the
|
|
143
|
+
// rows into an empty flexGrow gap instead of the list.
|
|
142
144
|
// Reserving only PICKER_CHROME_ROWS lets the list occupy the full interior
|
|
143
145
|
// (the footer's own reservation is handled inside Picker).
|
|
144
146
|
const pickerVisibleRows = picker ? Math.max(1, floatingPanelRows - PICKER_CHROME_ROWS) : PANEL_MAX_VISIBLE;
|
|
@@ -187,7 +189,6 @@ export function computeRowBudgets({
|
|
|
187
189
|
const { textEntryPrompt, hasTextEntryPrompt, hasFloatingPanel, expandedOptionPanel, inputBoxHidden } = surfaces;
|
|
188
190
|
const { liveSpinner, liveSpinnerIsCommand, latestTranscriptItem, inputHint } = hints;
|
|
189
191
|
const prompt = promptBoxBudget(inputBoxHidden, promptLayoutValueRef, promptContentColumns);
|
|
190
|
-
const textEntry = textEntryBudget(textEntryPrompt, textEntryLayoutRows, frameColumns);
|
|
191
192
|
const OPTION_PANEL_EXTRA_ROWS = expandedOptionPanel ? 3 : 0;
|
|
192
193
|
const queuedVisible = !hasFloatingPanel && !inputBoxHidden && state.queued?.length > 0;
|
|
193
194
|
// While the slash palette is open it owns the area above the prompt, so the
|
|
@@ -214,6 +215,7 @@ export function computeRowBudgets({
|
|
|
214
215
|
const baseReserve =
|
|
215
216
|
welcome.WELCOME_ROWS + SCROLL_HINT_ROWS + LIVE_STATUS_ROWS + INPUT_BOX_ROWS + STATUSLINE_ROWS + queued.queuedRows;
|
|
216
217
|
const maxFloatingPanelRows = Math.max(0, resizeState.rows - baseReserve - 1);
|
|
218
|
+
const textEntry = textEntryBudget(textEntryPrompt, textEntryLayoutRows, frameColumns, maxFloatingPanelRows);
|
|
217
219
|
const panel = floatingPanelBudget({
|
|
218
220
|
toolApproval,
|
|
219
221
|
picker,
|
|
@@ -24,7 +24,7 @@ export const SLASH_COMMANDS = [
|
|
|
24
24
|
{
|
|
25
25
|
name: 'goal',
|
|
26
26
|
usage: '/goal',
|
|
27
|
-
params: '[objective --time 1h
|
|
27
|
+
params: '[objective --time 1h|status|pause|resume|edit|stop]',
|
|
28
28
|
description: 'Run and manage a durable session Goal',
|
|
29
29
|
},
|
|
30
30
|
{
|
|
@@ -41,6 +41,7 @@ export const SLASH_COMMANDS = [
|
|
|
41
41
|
params: '[release <task_id> [--confirm]]',
|
|
42
42
|
description: 'List shells; release one whose termination is unconfirmed',
|
|
43
43
|
},
|
|
44
|
+
{ name: 'stop', usage: '/stop', description: 'Stop every background shell of this session' },
|
|
44
45
|
{
|
|
45
46
|
name: 'fork',
|
|
46
47
|
usage: '/fork',
|
|
@@ -139,7 +139,7 @@ export const routeCommands = {
|
|
|
139
139
|
|
|
140
140
|
effort(ctx, arg) {
|
|
141
141
|
const { state, store, openSlashPanel, deps } = ctx;
|
|
142
|
-
// A running turn
|
|
142
|
+
// A running turn does not block the switch: the in-flight turn keeps
|
|
143
143
|
// the effort it started with, and the new level applies from the next
|
|
144
144
|
// turn. Same for /fast below.
|
|
145
145
|
const pendingTurn = state.busy ? ' (applies from the next turn)' : '';
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// while a turn or session command is running.
|
|
5
5
|
import { presentErrorText } from '../../../runtime/shared/err-text.mjs';
|
|
6
6
|
import { BTW_USAGE_HINT } from '../btw-controller.mjs';
|
|
7
|
+
import { theme } from '../../theme.mjs';
|
|
7
8
|
|
|
8
9
|
function compactFailureNotice(error) {
|
|
9
10
|
if (error == null || String(error).trim() === '') return 'Compact failed.';
|
|
@@ -84,7 +85,7 @@ export const sessionCommands = {
|
|
|
84
85
|
store.pushNotice('Goal is unavailable.', 'warn');
|
|
85
86
|
return;
|
|
86
87
|
}
|
|
87
|
-
store.pushNotice(result.message || 'Goal updated.', 'info');
|
|
88
|
+
store.pushNotice(result.message || 'Goal updated.', result.ok === false ? 'warn' : 'info');
|
|
88
89
|
})
|
|
89
90
|
.catch((error) => store.pushNotice(`Goal failed: ${error?.message || error}`, 'error'));
|
|
90
91
|
return true;
|
|
@@ -168,6 +169,51 @@ export const sessionCommands = {
|
|
|
168
169
|
return true;
|
|
169
170
|
},
|
|
170
171
|
|
|
172
|
+
// /stop — stop every background shell of this session (never the running
|
|
173
|
+
// foreground command, agents or other sessions) after one confirmation.
|
|
174
|
+
stop(ctx) {
|
|
175
|
+
const { store, surface } = ctx;
|
|
176
|
+
const stopAll = () =>
|
|
177
|
+
Promise.resolve(store.stopShellJobs?.())
|
|
178
|
+
.then((result) => {
|
|
179
|
+
const stopped = result?.stopped || 0;
|
|
180
|
+
const stopping = result?.stopping || 0;
|
|
181
|
+
store.pushNotice(
|
|
182
|
+
stopping
|
|
183
|
+
? `Stopped background shells: ${stopped} · still stopping: ${stopping}`
|
|
184
|
+
: `Stopped background shells: ${stopped}`,
|
|
185
|
+
stopping ? 'warn' : 'info'
|
|
186
|
+
);
|
|
187
|
+
})
|
|
188
|
+
.catch((error) => store.pushNotice(String(error?.message || error), 'error'));
|
|
189
|
+
void Promise.resolve(store.listStoppableShellJobs?.())
|
|
190
|
+
.then((result) => {
|
|
191
|
+
const jobs = Array.isArray(result?.jobs) ? result.jobs : [];
|
|
192
|
+
if (!jobs.length) {
|
|
193
|
+
store.pushNotice('No background shells are running.', 'info');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const own = surface.claim();
|
|
197
|
+
own.paint({
|
|
198
|
+
title: `Stop background shells (${jobs.length})?`,
|
|
199
|
+
indexMode: 'always',
|
|
200
|
+
labelWidth: 12,
|
|
201
|
+
items: [
|
|
202
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
203
|
+
{ value: 'stop', label: 'Stop' },
|
|
204
|
+
],
|
|
205
|
+
footer: jobs.map((job) => ({ glyph: '·', color: theme.warning, text: job.command })),
|
|
206
|
+
onSelect: (value) => {
|
|
207
|
+
own.close();
|
|
208
|
+
if (value === 'stop') void stopAll();
|
|
209
|
+
},
|
|
210
|
+
onCancel: () => own.close(),
|
|
211
|
+
});
|
|
212
|
+
})
|
|
213
|
+
.catch((error) => store.pushNotice(String(error?.message || error), 'error'));
|
|
214
|
+
return true;
|
|
215
|
+
},
|
|
216
|
+
|
|
171
217
|
doctor(ctx) {
|
|
172
218
|
const { state, store, deps } = ctx;
|
|
173
219
|
if (state.commandBusy) {
|
|
@@ -17,7 +17,7 @@ import { createSlashPanelOpener } from './slash-dispatch/slash-panel.mjs';
|
|
|
17
17
|
const commands = { ...routeCommands, ...sessionCommands, ...panelCommands };
|
|
18
18
|
|
|
19
19
|
export function createSlashDispatch({ state, store, normalizeSlashCommandName, surface, closeUsagePanel, ...deps }) {
|
|
20
|
-
const ctx = { state, store, deps, openSlashPanel: createSlashPanelOpener({ surface, store }) };
|
|
20
|
+
const ctx = { state, store, deps, surface, openSlashPanel: createSlashPanelOpener({ surface, store }) };
|
|
21
21
|
const runSlashCommand = (cmd, arg = '') => {
|
|
22
22
|
const rawName = String(cmd || '').toLowerCase();
|
|
23
23
|
cmd = normalizeSlashCommandName(cmd);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* app/use-btw-panel.mjs — the /btw side-question panel: its state, the
|
|
3
|
+
* controller that fills it, and the controller's session/unmount lifecycle.
|
|
4
|
+
*/
|
|
5
|
+
import { useEffect, useRef, useState } from 'react';
|
|
6
|
+
import { createBtwController } from './btw-controller.mjs';
|
|
7
|
+
|
|
8
|
+
export function useBtwPanel({ store, sessionId }) {
|
|
9
|
+
const [btwPanel, setBtwPanel] = useState(null);
|
|
10
|
+
const btwRef = useRef(null);
|
|
11
|
+
const sessionIdRef = useRef('');
|
|
12
|
+
sessionIdRef.current = sessionId || '';
|
|
13
|
+
if (!btwRef.current) {
|
|
14
|
+
btwRef.current = createBtwController({
|
|
15
|
+
getStore: () => store,
|
|
16
|
+
setPanel: setBtwPanel,
|
|
17
|
+
getSessionId: () => sessionIdRef.current,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const btw = btwRef.current;
|
|
21
|
+
// A side answer belongs to the conversation it was asked in: drop it on a
|
|
22
|
+
// session change (new/resume/clear/switch) and cancel it on unmount.
|
|
23
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies(sessionId): session-change trigger; the controller reads the id through its getter
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
btw.sync();
|
|
26
|
+
}, [btw, sessionId]);
|
|
27
|
+
useEffect(() => () => btw.dispose(), [btw]);
|
|
28
|
+
return { btwPanel, btw };
|
|
29
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* app/use-context-panel-refresh.mjs — keeps an open /context breakdown panel
|
|
3
|
+
* current: it is rebuilt whenever one of the session fields it summarizes
|
|
4
|
+
* changes.
|
|
5
|
+
*/
|
|
6
|
+
import { useEffect } from 'react';
|
|
7
|
+
|
|
8
|
+
export function useContextPanelRefresh({ contextPanelKind, state, openContextPicker }) {
|
|
9
|
+
// The deps are the refresh triggers (the fields the breakdown summarizes),
|
|
10
|
+
// not the reads; openContextPicker is rebuilt by its factory every render
|
|
11
|
+
// and must not re-trigger the rebuild.
|
|
12
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: trigger-keyed refresh over the summarized session fields
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (contextPanelKind === 'context') openContextPicker();
|
|
15
|
+
}, [
|
|
16
|
+
contextPanelKind,
|
|
17
|
+
state.stats,
|
|
18
|
+
state.contextWindow,
|
|
19
|
+
state.rawContextWindow,
|
|
20
|
+
state.sessionId,
|
|
21
|
+
state.toolMode,
|
|
22
|
+
state.agentWorkers,
|
|
23
|
+
state.agentJobs,
|
|
24
|
+
state.provider,
|
|
25
|
+
state.model,
|
|
26
|
+
state.effort,
|
|
27
|
+
state.fast,
|
|
28
|
+
state.cwd,
|
|
29
|
+
state.clientHostPid,
|
|
30
|
+
]);
|
|
31
|
+
}
|
|
@@ -20,16 +20,19 @@ export function useModelCatalogCache({ store, onboardingRef }) {
|
|
|
20
20
|
// provider-scope cache clear (e.g. after auth) so a stale in-flight
|
|
21
21
|
// listProviderModels() cannot repopulate the ref after invalidation.
|
|
22
22
|
const onboardingPrefetchSeqRef = useRef(0);
|
|
23
|
-
const clearModelCaches = useCallback(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
const clearModelCaches = useCallback(
|
|
24
|
+
(scope = 'all') => {
|
|
25
|
+
if (scope === 'all' || scope === 'provider') {
|
|
26
|
+
providerModelsCacheRef.current = { models: null, at: 0 };
|
|
27
|
+
onboardingRef.current.providerModels = [];
|
|
28
|
+
onboardingPrefetchSeqRef.current += 1;
|
|
29
|
+
}
|
|
30
|
+
if (scope === 'all' || scope === 'webSearch') {
|
|
31
|
+
webSearchModelsCacheRef.current = { models: null, at: 0 };
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
[onboardingRef]
|
|
35
|
+
);
|
|
33
36
|
// Boot-time catalog prefetch: warm the /model & /agents provider catalog and
|
|
34
37
|
// the /websearch catalog once at startup so those pickers open instantly from
|
|
35
38
|
// cache (openModelPicker still TTL-refreshes stale rows in the background).
|
|
@@ -316,6 +316,17 @@ export function useMouseInput({
|
|
|
316
316
|
isRawModeSupported,
|
|
317
317
|
store,
|
|
318
318
|
stdout,
|
|
319
|
+
dragRef,
|
|
320
|
+
lastClickRef,
|
|
321
|
+
slashPaletteRef,
|
|
322
|
+
scrollFocusRef,
|
|
323
|
+
promptMouseSelectionRef,
|
|
324
|
+
frameRowsRef,
|
|
325
|
+
promptBoxRectRef,
|
|
326
|
+
transcriptViewportRef,
|
|
327
|
+
scrollTargetRef,
|
|
328
|
+
setSlashIndex,
|
|
329
|
+
setMeasuredRowsVersion,
|
|
319
330
|
passthroughCtrlWheelZoom,
|
|
320
331
|
frameColumns,
|
|
321
332
|
statuslineBandRows,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* app/use-onboarding-start.mjs — first-run onboarding gate + wizard launch.
|
|
3
3
|
*/
|
|
4
|
-
import { useEffect } from 'react';
|
|
4
|
+
import { useEffect, useRef } from 'react';
|
|
5
5
|
|
|
6
6
|
// First-run gate. The daemon-backed engine store answers any method it does
|
|
7
7
|
// not implement locally with an async remote call, so a synchronous
|
|
@@ -25,10 +25,15 @@ export function useOnboardingStart({
|
|
|
25
25
|
store,
|
|
26
26
|
forceOnboarding,
|
|
27
27
|
onboardingCompleted,
|
|
28
|
-
onboardingStartedRef,
|
|
29
28
|
setOnboardingActive,
|
|
30
29
|
openOnboardingAuthStep,
|
|
31
30
|
}) {
|
|
31
|
+
// Latches the launch so the wizard opens at most once per mount.
|
|
32
|
+
const onboardingStartedRef = useRef(false);
|
|
33
|
+
// openOnboardingAuthStep is rebuilt by the picker factory every render;
|
|
34
|
+
// depending on it would re-run this launch (and cancel its deferred open)
|
|
35
|
+
// on every commit. The launch keys on the gate inputs only.
|
|
36
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies(openOnboardingAuthStep): per-render factory callback; launch keys on gate inputs
|
|
32
37
|
useEffect(() => {
|
|
33
38
|
if (onboardingStartedRef.current) return undefined;
|
|
34
39
|
if (resolveOnboardingCompleted(store, onboardingCompleted) && !forceOnboarding) return undefined;
|
|
@@ -41,5 +46,5 @@ export function useOnboardingStart({
|
|
|
41
46
|
return () => {
|
|
42
47
|
canceled = true;
|
|
43
48
|
};
|
|
44
|
-
}, [store, forceOnboarding, onboardingCompleted]);
|
|
49
|
+
}, [store, forceOnboarding, onboardingCompleted, setOnboardingActive]);
|
|
45
50
|
}
|
|
@@ -30,7 +30,16 @@ export function usePanelTransition({
|
|
|
30
30
|
if (!hadTransitionClearance) return undefined;
|
|
31
31
|
const timer = setTimeout(() => setPanelTransitionEpoch((epoch) => epoch + 1), 0);
|
|
32
32
|
return () => clearTimeout(timer);
|
|
33
|
-
}, [
|
|
33
|
+
}, [
|
|
34
|
+
panelTransitionRef,
|
|
35
|
+
panelCloseInkMaskRowsRef,
|
|
36
|
+
panelLayoutSignature,
|
|
37
|
+
bottomClusterRows,
|
|
38
|
+
panelTransitionClearRows,
|
|
39
|
+
panelTransitionGuardRows,
|
|
40
|
+
setPanelInkMaskEpoch,
|
|
41
|
+
setPanelTransitionEpoch,
|
|
42
|
+
]);
|
|
34
43
|
// Record the transcript tail id AFTER every commit so the next render's
|
|
35
44
|
// spinner-meta-collapse gate (doneTailAppendedThisCommit) can tell a freshly
|
|
36
45
|
// appended done row from a stale one that was already at the tail.
|