muonroi-cli 1.8.4 → 1.9.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/LICENSE +17 -5
- package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
- package/dist/packages/agent-harness-core/src/driver.js +46 -0
- package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
- package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
- package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
- package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
- package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
- package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
- package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
- package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
- package/dist/packages/agent-harness-core/src/protocol.js +15 -0
- package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
- package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
- package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
- package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
- package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
- package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
- package/dist/packages/agent-harness-opentui/src/install.js +10 -0
- package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
- package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
- package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
- package/dist/src/agent-harness/mock-model.d.ts +38 -0
- package/dist/src/agent-harness/mock-model.js +69 -3
- package/dist/src/agent-harness/test-spawn.js +31 -0
- package/dist/src/chat/chat-keychain.d.ts +7 -12
- package/dist/src/chat/chat-keychain.js +19 -86
- package/dist/src/cli/config/screen-providers.js +1 -1
- package/dist/src/cli/cost-forensics.d.ts +10 -0
- package/dist/src/cli/cost-forensics.js +18 -3
- package/dist/src/cli/keys-bundle.d.ts +1 -1
- package/dist/src/cli/keys-bundle.js +1 -1
- package/dist/src/cli/keys.d.ts +10 -47
- package/dist/src/cli/keys.js +31 -399
- package/dist/src/council/clarifier.d.ts +31 -3
- package/dist/src/council/clarifier.js +220 -32
- package/dist/src/council/context.js +49 -15
- package/dist/src/council/debate-checkpoint.d.ts +129 -0
- package/dist/src/council/debate-checkpoint.js +176 -0
- package/dist/src/council/debate-planner.js +54 -5
- package/dist/src/council/debate-summary.d.ts +25 -0
- package/dist/src/council/debate-summary.js +85 -0
- package/dist/src/council/debate.d.ts +169 -2
- package/dist/src/council/debate.js +1265 -135
- package/dist/src/council/index.d.ts +108 -1
- package/dist/src/council/index.js +670 -197
- package/dist/src/council/leader.d.ts +26 -0
- package/dist/src/council/leader.js +150 -9
- package/dist/src/council/llm.d.ts +94 -0
- package/dist/src/council/llm.js +348 -55
- package/dist/src/council/panel-select.d.ts +30 -0
- package/dist/src/council/panel-select.js +82 -0
- package/dist/src/council/planner.js +40 -0
- package/dist/src/council/preflight.d.ts +17 -0
- package/dist/src/council/preflight.js +50 -2
- package/dist/src/council/prompts.d.ts +39 -4
- package/dist/src/council/prompts.js +256 -69
- package/dist/src/council/stance-recall.d.ts +42 -0
- package/dist/src/council/stance-recall.js +57 -0
- package/dist/src/council/strip-think.d.ts +17 -0
- package/dist/src/council/strip-think.js +33 -0
- package/dist/src/council/types.d.ts +138 -0
- package/dist/src/ee/artifact-cache.d.ts +16 -0
- package/dist/src/ee/artifact-cache.js +32 -0
- package/dist/src/ee/auth.d.ts +20 -0
- package/dist/src/ee/auth.js +54 -2
- package/dist/src/ee/bridge.d.ts +10 -0
- package/dist/src/ee/bridge.js +58 -0
- package/dist/src/ee/client.js +109 -21
- package/dist/src/ee/ee-onboarding.js +6 -26
- package/dist/src/ee/export-transcripts.d.ts +1 -0
- package/dist/src/ee/export-transcripts.js +8 -10
- package/dist/src/ee/extract-session.js +29 -0
- package/dist/src/ee/extract-style.d.ts +58 -0
- package/dist/src/ee/extract-style.js +270 -0
- package/dist/src/ee/recall-ledger.d.ts +9 -0
- package/dist/src/ee/recall-ledger.js +3 -0
- package/dist/src/ee/scope.d.ts +1 -0
- package/dist/src/ee/scope.js +26 -1
- package/dist/src/ee/search.d.ts +7 -0
- package/dist/src/ee/search.js +24 -0
- package/dist/src/ee/transcript-emit.js +2 -0
- package/dist/src/ee/types.d.ts +22 -0
- package/dist/src/ee/who-am-i-brain.d.ts +35 -0
- package/dist/src/ee/who-am-i-brain.js +220 -0
- package/dist/src/ee/who-am-i.d.ts +10 -3
- package/dist/src/ee/who-am-i.js +12 -0
- package/dist/src/ee/workflow-event.d.ts +48 -0
- package/dist/src/ee/workflow-event.js +81 -0
- package/dist/src/flow/compaction/compress.d.ts +3 -3
- package/dist/src/flow/compaction/compress.js +58 -8
- package/dist/src/flow/compaction/extract.d.ts +4 -7
- package/dist/src/flow/compaction/extract.js +50 -10
- package/dist/src/flow/compaction/index.d.ts +14 -1
- package/dist/src/flow/compaction/index.js +96 -3
- package/dist/src/flow/compaction/input-guard.d.ts +24 -0
- package/dist/src/flow/compaction/input-guard.js +43 -0
- package/dist/src/flow/compaction/progress.d.ts +35 -0
- package/dist/src/flow/compaction/progress.js +35 -0
- package/dist/src/flow/fold-planning.d.ts +36 -0
- package/dist/src/flow/fold-planning.js +83 -0
- package/dist/src/flow/hierarchy.d.ts +146 -0
- package/dist/src/flow/hierarchy.js +427 -0
- package/dist/src/flow/index.d.ts +1 -0
- package/dist/src/flow/index.js +2 -0
- package/dist/src/flow/run-artifacts.d.ts +102 -0
- package/dist/src/flow/run-artifacts.js +208 -0
- package/dist/src/generated/version.d.ts +1 -1
- package/dist/src/generated/version.js +1 -1
- package/dist/src/gsd/assessment-schema.d.ts +44 -0
- package/dist/src/gsd/assessment-schema.js +134 -0
- package/dist/src/gsd/capability-registry.d.ts +45 -0
- package/dist/src/gsd/capability-registry.js +337 -0
- package/dist/src/gsd/complexity-assessor.d.ts +39 -0
- package/dist/src/gsd/complexity-assessor.js +152 -0
- package/dist/src/gsd/config-bridge.d.ts +7 -0
- package/dist/src/gsd/config-bridge.js +114 -0
- package/dist/src/gsd/config-loader.d.ts +27 -0
- package/dist/src/gsd/config-loader.js +50 -0
- package/dist/src/gsd/council-context.d.ts +44 -0
- package/dist/src/gsd/council-context.js +114 -0
- package/dist/src/gsd/ee-closure.d.ts +28 -0
- package/dist/src/gsd/ee-closure.js +49 -0
- package/dist/src/gsd/flags.d.ts +66 -0
- package/dist/src/gsd/flags.js +102 -0
- package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
- package/dist/src/gsd/gsd-dispatch.js +131 -0
- package/dist/src/gsd/gsd-runtime.d.ts +22 -0
- package/dist/src/gsd/gsd-runtime.js +37 -0
- package/dist/src/gsd/host-adapter.d.ts +11 -0
- package/dist/src/gsd/host-adapter.js +29 -0
- package/dist/src/gsd/index.d.ts +24 -1
- package/dist/src/gsd/index.js +27 -0
- package/dist/src/gsd/loop-host-contract.d.ts +21 -0
- package/dist/src/gsd/loop-host-contract.js +39 -0
- package/dist/src/gsd/loop-host.d.ts +69 -0
- package/dist/src/gsd/loop-host.js +245 -0
- package/dist/src/gsd/loop-resolver.d.ts +36 -0
- package/dist/src/gsd/loop-resolver.js +79 -0
- package/dist/src/gsd/model-tier.d.ts +13 -0
- package/dist/src/gsd/model-tier.js +45 -0
- package/dist/src/gsd/mutation-gate.d.ts +16 -0
- package/dist/src/gsd/mutation-gate.js +41 -0
- package/dist/src/gsd/native-roadmap.d.ts +89 -0
- package/dist/src/gsd/native-roadmap.js +343 -0
- package/dist/src/gsd/native-state.d.ts +47 -0
- package/dist/src/gsd/native-state.js +220 -0
- package/dist/src/gsd/paths.d.ts +23 -0
- package/dist/src/gsd/paths.js +66 -0
- package/dist/src/gsd/phase-dag.d.ts +12 -0
- package/dist/src/gsd/phase-dag.js +94 -0
- package/dist/src/gsd/phase-sync.d.ts +42 -0
- package/dist/src/gsd/phase-sync.js +321 -0
- package/dist/src/gsd/pil-gate-context.d.ts +13 -0
- package/dist/src/gsd/pil-gate-context.js +64 -0
- package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
- package/dist/src/gsd/pil-gate-critic.js +74 -0
- package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
- package/dist/src/gsd/plan-council-prompts.js +79 -0
- package/dist/src/gsd/plan-council.d.ts +44 -0
- package/dist/src/gsd/plan-council.js +283 -0
- package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
- package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
- package/dist/src/gsd/product-workspace.d.ts +13 -0
- package/dist/src/gsd/product-workspace.js +124 -0
- package/dist/src/gsd/ship-bridge.d.ts +25 -0
- package/dist/src/gsd/ship-bridge.js +65 -0
- package/dist/src/gsd/state-document.d.ts +40 -0
- package/dist/src/gsd/state-document.js +163 -0
- package/dist/src/gsd/verdict-schema.d.ts +39 -0
- package/dist/src/gsd/verdict-schema.js +144 -0
- package/dist/src/gsd/verify-context.d.ts +22 -0
- package/dist/src/gsd/verify-context.js +27 -0
- package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
- package/dist/src/gsd/verify-council-prompts.js +85 -0
- package/dist/src/gsd/verify-council.d.ts +25 -0
- package/dist/src/gsd/verify-council.js +119 -0
- package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
- package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
- package/dist/src/gsd/workflow-engine.d.ts +60 -0
- package/dist/src/gsd/workflow-engine.js +207 -0
- package/dist/src/gsd/workflow-tools.d.ts +13 -0
- package/dist/src/gsd/workflow-tools.js +277 -0
- package/dist/src/headless/council-answers.js +4 -0
- package/dist/src/hooks/index.js +1 -1
- package/dist/src/index.js +172 -270
- package/dist/src/lsp/builtins.js +3 -1
- package/dist/src/lsp/manager.d.ts +5 -1
- package/dist/src/lsp/manager.js +249 -3
- package/dist/src/lsp/npm-cache.d.ts +11 -1
- package/dist/src/lsp/npm-cache.js +17 -1
- package/dist/src/lsp/runtime.d.ts +6 -1
- package/dist/src/lsp/runtime.js +17 -1
- package/dist/src/lsp/types.d.ts +83 -1
- package/dist/src/lsp/types.js +10 -0
- package/dist/src/maintain/pr-builder.js +23 -13
- package/dist/src/mcp/auto-setup.js +57 -32
- package/dist/src/mcp/client-pool.js +44 -16
- package/dist/src/mcp/lsp-tools.d.ts +5 -1
- package/dist/src/mcp/lsp-tools.js +93 -2
- package/dist/src/mcp/mcp-keychain.d.ts +3 -5
- package/dist/src/mcp/mcp-keychain.js +9 -49
- package/dist/src/mcp/research-onboarding.js +8 -7
- package/dist/src/mcp/runtime.js +34 -2
- package/dist/src/mcp/setup-guide-text.d.ts +1 -1
- package/dist/src/mcp/setup-guide-text.js +22 -2
- package/dist/src/mcp/tools-server.d.ts +10 -0
- package/dist/src/mcp/tools-server.js +10 -2
- package/dist/src/models/catalog-client.d.ts +87 -0
- package/dist/src/models/catalog-client.js +105 -38
- package/dist/src/models/catalog.json +528 -265
- package/dist/src/models/registry.d.ts +22 -7
- package/dist/src/models/registry.js +73 -10
- package/dist/src/ops/doctor.js +1 -1
- package/dist/src/orchestrator/ask-user.d.ts +61 -0
- package/dist/src/orchestrator/ask-user.js +65 -0
- package/dist/src/orchestrator/auto-commit.js +1 -1
- package/dist/src/orchestrator/batch-turn-runner.js +2 -2
- package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
- package/dist/src/orchestrator/cache-prefix.js +83 -0
- package/dist/src/orchestrator/compact-request.d.ts +32 -0
- package/dist/src/orchestrator/compact-request.js +41 -0
- package/dist/src/orchestrator/compaction.d.ts +12 -3
- package/dist/src/orchestrator/compaction.js +35 -15
- package/dist/src/orchestrator/council-manager.d.ts +12 -3
- package/dist/src/orchestrator/council-manager.js +74 -32
- package/dist/src/orchestrator/council-request.d.ts +49 -0
- package/dist/src/orchestrator/council-request.js +62 -0
- package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
- package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
- package/dist/src/orchestrator/error-utils.d.ts +29 -0
- package/dist/src/orchestrator/error-utils.js +132 -24
- package/dist/src/orchestrator/grounding-check.js +39 -1
- package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
- package/dist/src/orchestrator/interactive-pause.js +36 -0
- package/dist/src/orchestrator/message-processor.d.ts +4 -0
- package/dist/src/orchestrator/message-processor.js +268 -41
- package/dist/src/orchestrator/orchestrator.d.ts +64 -3
- package/dist/src/orchestrator/orchestrator.js +823 -120
- package/dist/src/orchestrator/preprocessor.js +3 -3
- package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
- package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
- package/dist/src/orchestrator/prompts.js +17 -17
- package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
- package/dist/src/orchestrator/reactive-delegation.js +59 -0
- package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
- package/dist/src/orchestrator/retry-classifier.js +46 -2
- package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
- package/dist/src/orchestrator/safety-askcard.js +5 -2
- package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
- package/dist/src/orchestrator/safety-intercept.js +62 -0
- package/dist/src/orchestrator/scope-reminder.js +1 -1
- package/dist/src/orchestrator/session-experience.d.ts +2 -1
- package/dist/src/orchestrator/session-experience.js +2 -1
- package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
- package/dist/src/orchestrator/should-run-gate.js +18 -0
- package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
- package/dist/src/orchestrator/stall-watchdog.js +65 -10
- package/dist/src/orchestrator/stream-runner.d.ts +13 -3
- package/dist/src/orchestrator/stream-runner.js +115 -49
- package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-cap.js +16 -1
- package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
- package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
- package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
- package/dist/src/orchestrator/subagent-compactor.js +126 -15
- package/dist/src/orchestrator/tool-engine.d.ts +41 -0
- package/dist/src/orchestrator/tool-engine.js +846 -66
- package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
- package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
- package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
- package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
- package/dist/src/orchestrator/turn-watchdog.js +84 -0
- package/dist/src/pil/agent-operating-contract.d.ts +1 -1
- package/dist/src/pil/agent-operating-contract.js +6 -4
- package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
- package/dist/src/pil/cheap-model-playbook.js +5 -1
- package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
- package/dist/src/pil/cheap-model-workbooks.js +1 -1
- package/dist/src/pil/discovery-types.d.ts +1 -0
- package/dist/src/pil/discovery.d.ts +1 -1
- package/dist/src/pil/discovery.js +18 -13
- package/dist/src/pil/layer1-intent.d.ts +18 -6
- package/dist/src/pil/layer1-intent.js +66 -757
- package/dist/src/pil/layer15-context-scan.js +15 -1
- package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
- package/dist/src/pil/layer1_5-complexity-size.js +31 -5
- package/dist/src/pil/layer3-ee-injection.js +23 -8
- package/dist/src/pil/layer4-gsd.js +69 -16
- package/dist/src/pil/layer5-context.js +7 -3
- package/dist/src/pil/layer6-output.d.ts +23 -0
- package/dist/src/pil/layer6-output.js +5 -1
- package/dist/src/pil/llm-classify.d.ts +111 -5
- package/dist/src/pil/llm-classify.js +421 -189
- package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
- package/dist/src/pil/native-capabilities-workbook.js +8 -0
- package/dist/src/pil/pipeline.js +36 -2
- package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
- package/dist/src/pil/repo-grounding-probe.js +136 -0
- package/dist/src/pil/repo-structure-hints.d.ts +7 -0
- package/dist/src/pil/repo-structure-hints.js +45 -0
- package/dist/src/pil/response-tools.js +5 -3
- package/dist/src/pil/schema.d.ts +1 -0
- package/dist/src/pil/schema.js +2 -0
- package/dist/src/pil/types.d.ts +18 -0
- package/dist/src/playbook/directives.d.ts +4 -0
- package/dist/src/playbook/directives.js +17 -5
- package/dist/src/product-loop/artifact-io.js +4 -0
- package/dist/src/product-loop/backlog-builder.d.ts +14 -1
- package/dist/src/product-loop/backlog-builder.js +30 -6
- package/dist/src/product-loop/criteria-seed.d.ts +51 -0
- package/dist/src/product-loop/criteria-seed.js +200 -0
- package/dist/src/product-loop/discovery-context-format.js +3 -1
- package/dist/src/product-loop/discovery-ecosystem.js +4 -1
- package/dist/src/product-loop/discovery-interview.d.ts +9 -0
- package/dist/src/product-loop/discovery-interview.js +60 -12
- package/dist/src/product-loop/discovery-recommender.js +2 -1
- package/dist/src/product-loop/discovery-schema.js +19 -2
- package/dist/src/product-loop/discovery-triage.d.ts +23 -0
- package/dist/src/product-loop/discovery-triage.js +109 -0
- package/dist/src/product-loop/gather.js +150 -2
- package/dist/src/product-loop/ideal-trace.d.ts +7 -0
- package/dist/src/product-loop/ideal-trace.js +64 -0
- package/dist/src/product-loop/index.d.ts +13 -1
- package/dist/src/product-loop/index.js +340 -52
- package/dist/src/product-loop/loop-driver.d.ts +7 -0
- package/dist/src/product-loop/loop-driver.js +330 -106
- package/dist/src/product-loop/phase-plan.d.ts +21 -0
- package/dist/src/product-loop/phase-plan.js +81 -6
- package/dist/src/product-loop/phase-rituals.d.ts +3 -0
- package/dist/src/product-loop/phase-rituals.js +8 -3
- package/dist/src/product-loop/phase-runner.js +39 -12
- package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
- package/dist/src/product-loop/plan-adherence-review.js +144 -0
- package/dist/src/product-loop/sprint-runner.d.ts +173 -0
- package/dist/src/product-loop/sprint-runner.js +863 -19
- package/dist/src/product-loop/types.d.ts +61 -5
- package/dist/src/providers/adapter.d.ts +1 -1
- package/dist/src/providers/adapter.js +3 -4
- package/dist/src/providers/anthropic.d.ts +9 -8
- package/dist/src/providers/anthropic.js +13 -47
- package/dist/src/providers/auth/browser-flow.d.ts +1 -1
- package/dist/src/providers/auth/browser-flow.js +1 -1
- package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
- package/dist/src/providers/auth/grok-oauth.js +30 -5
- package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
- package/dist/src/providers/auth/openai-oauth.js +15 -1
- package/dist/src/providers/auth/registry.js +0 -34
- package/dist/src/providers/auth/token-store.d.ts +9 -9
- package/dist/src/providers/auth/token-store.js +8 -67
- package/dist/src/providers/auth/types.d.ts +9 -1
- package/dist/src/providers/auth/types.js +1 -1
- package/dist/src/providers/capabilities.d.ts +24 -5
- package/dist/src/providers/capabilities.js +42 -24
- package/dist/src/providers/endpoints.d.ts +2 -2
- package/dist/src/providers/endpoints.js +11 -10
- package/dist/src/providers/env-store.d.ts +17 -0
- package/dist/src/providers/env-store.js +228 -0
- package/dist/src/providers/keychain.d.ts +22 -18
- package/dist/src/providers/keychain.js +127 -140
- package/dist/src/providers/mcp-vision-bridge.js +56 -146
- package/dist/src/providers/openai-compatible.js +8 -1
- package/dist/src/providers/pricing.d.ts +2 -2
- package/dist/src/providers/pricing.js +3 -13
- package/dist/src/providers/runtime.d.ts +43 -3
- package/dist/src/providers/runtime.js +88 -14
- package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
- package/dist/src/providers/strategies/base.strategy.js +24 -1
- package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
- package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
- package/dist/src/providers/strategies/registry.js +4 -4
- package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
- package/dist/src/providers/strategies/thinking-mode.js +288 -1
- package/dist/src/providers/strategies/xai.strategy.js +27 -0
- package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
- package/dist/src/providers/strategies/zai.strategy.js +44 -0
- package/dist/src/providers/types.d.ts +5 -6
- package/dist/src/providers/types.js +2 -2
- package/dist/src/providers/vision-backend.d.ts +47 -0
- package/dist/src/providers/vision-backend.js +258 -0
- package/dist/src/providers/vision-proxy.d.ts +22 -9
- package/dist/src/providers/vision-proxy.js +63 -132
- package/dist/src/providers/warm.d.ts +65 -0
- package/dist/src/providers/warm.js +145 -0
- package/dist/src/providers/wire-debug.js +95 -0
- package/dist/src/router/decide.d.ts +13 -0
- package/dist/src/router/decide.js +138 -36
- package/dist/src/router/peak-hour.d.ts +38 -0
- package/dist/src/router/peak-hour.js +107 -0
- package/dist/src/router/step-router.js +3 -2
- package/dist/src/router/warm.js +4 -5
- package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
- package/dist/src/scaffold/continuation-prompt.js +26 -0
- package/dist/src/scaffold/point-to-existing.d.ts +21 -0
- package/dist/src/scaffold/point-to-existing.js +25 -0
- package/dist/src/self-qa/agentic-loop.js +6 -5
- package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
- package/dist/src/{ui/state → state}/active-run.js +21 -0
- package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
- package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
- package/dist/src/state/turn-trace.d.ts +43 -0
- package/dist/src/state/turn-trace.js +32 -0
- package/dist/src/storage/db.js +2 -1
- package/dist/src/storage/index.d.ts +1 -1
- package/dist/src/storage/index.js +1 -1
- package/dist/src/storage/interaction-log.d.ts +1 -1
- package/dist/src/storage/migrations.js +71 -1
- package/dist/src/storage/sessions.d.ts +28 -10
- package/dist/src/storage/sessions.js +78 -21
- package/dist/src/storage/transcript-view.js +1 -1
- package/dist/src/storage/transcript.d.ts +51 -0
- package/dist/src/storage/transcript.js +340 -15
- package/dist/src/tools/file.d.ts +15 -0
- package/dist/src/tools/file.js +32 -0
- package/dist/src/tools/git-safety.d.ts +19 -0
- package/dist/src/tools/git-safety.js +168 -0
- package/dist/src/tools/native-tools.d.ts +1 -1
- package/dist/src/tools/native-tools.js +81 -1
- package/dist/src/tools/registry.d.ts +20 -0
- package/dist/src/tools/registry.js +576 -23
- package/dist/src/tools/research.d.ts +29 -0
- package/dist/src/tools/research.js +233 -0
- package/dist/src/types/index.d.ts +147 -4
- package/dist/src/ui/app.js +0 -0
- package/dist/src/ui/cards/product-status-card.js +1 -1
- package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
- package/dist/src/ui/components/agent-rail-activities.js +47 -0
- package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
- package/dist/src/ui/components/bubble-body-guard.js +50 -0
- package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
- package/dist/src/ui/components/compact-progress-card.js +42 -0
- package/dist/src/ui/components/context-rail.d.ts +26 -0
- package/dist/src/ui/components/context-rail.js +33 -0
- package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
- package/dist/src/ui/components/council-conclusion-card.js +420 -0
- package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
- package/dist/src/ui/components/council-debate-pill.js +34 -0
- package/dist/src/ui/components/council-info-card.js +2 -2
- package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
- package/dist/src/ui/components/council-leader-bubble.js +21 -11
- package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
- package/dist/src/ui/components/council-message-bubble.js +16 -15
- package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
- package/dist/src/ui/components/council-phase-timeline.js +66 -17
- package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
- package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
- package/dist/src/ui/components/council-question-card.js +13 -12
- package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
- package/dist/src/ui/components/council-rail-rounds.js +57 -0
- package/dist/src/ui/components/council-round-group.d.ts +38 -0
- package/dist/src/ui/components/council-round-group.js +88 -0
- package/dist/src/ui/components/council-status-list.d.ts +3 -1
- package/dist/src/ui/components/council-status-list.js +36 -24
- package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
- package/dist/src/ui/components/council-synthesis-banner.js +20 -5
- package/dist/src/ui/components/halt-recovery-card.js +9 -5
- package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
- package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
- package/dist/src/ui/components/message-view.d.ts +15 -0
- package/dist/src/ui/components/message-view.js +50 -1
- package/dist/src/ui/components/prompt-box.js +18 -16
- package/dist/src/ui/components/session-tree-card.d.ts +14 -0
- package/dist/src/ui/components/session-tree-card.js +46 -0
- package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
- package/dist/src/ui/components/slash-inline-menu.js +26 -5
- package/dist/src/ui/components/task-list-panel.d.ts +14 -1
- package/dist/src/ui/components/task-list-panel.js +22 -2
- package/dist/src/ui/components/tool-group.d.ts +15 -3
- package/dist/src/ui/components/tool-group.js +69 -11
- package/dist/src/ui/containers/modals-layer.d.ts +4 -2
- package/dist/src/ui/containers/modals-layer.js +2 -2
- package/dist/src/ui/council-harness-event.d.ts +57 -0
- package/dist/src/ui/council-harness-event.js +46 -0
- package/dist/src/ui/heartbeat-debug.d.ts +29 -0
- package/dist/src/ui/heartbeat-debug.js +45 -0
- package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
- package/dist/src/ui/mcp-modal.js +2 -4
- package/dist/src/ui/modals/api-key-modal.js +1 -1
- package/dist/src/ui/modals/connect-modal.js +4 -3
- package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
- package/dist/src/ui/modals/model-picker-modal.js +8 -10
- package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
- package/dist/src/ui/modals/session-picker-modal.js +3 -5
- package/dist/src/ui/picker-providers.d.ts +1 -1
- package/dist/src/ui/picker-providers.js +1 -1
- package/dist/src/ui/primitives/index.d.ts +1 -0
- package/dist/src/ui/primitives/index.js +2 -0
- package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
- package/dist/src/ui/primitives/semantic-primitives.js +81 -0
- package/dist/src/ui/slash/compact.js +5 -7
- package/dist/src/ui/slash/cost.js +1 -1
- package/dist/src/ui/slash/council.js +19 -1
- package/dist/src/ui/slash/debug.d.ts +3 -31
- package/dist/src/ui/slash/debug.js +9 -20
- package/dist/src/ui/slash/ee.js +81 -0
- package/dist/src/ui/slash/ideal.d.ts +6 -2
- package/dist/src/ui/slash/ideal.js +97 -7
- package/dist/src/ui/slash/menu-items.d.ts +7 -0
- package/dist/src/ui/slash/menu-items.js +23 -20
- package/dist/src/ui/slash/registry.d.ts +2 -0
- package/dist/src/ui/slash/registry.js +4 -0
- package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
- package/dist/src/ui/status-bar/cache-hit.js +9 -0
- package/dist/src/ui/status-bar/index.d.ts +1 -1
- package/dist/src/ui/status-bar/index.js +7 -3
- package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
- package/dist/src/ui/status-bar/usd-meter.js +6 -4
- package/dist/src/ui/theme.d.ts +1 -0
- package/dist/src/ui/theme.js +2 -0
- package/dist/src/ui/types.d.ts +7 -0
- package/dist/src/ui/use-app-logic.js +0 -0
- package/dist/src/ui/utils/agent-activities.d.ts +39 -0
- package/dist/src/ui/utils/agent-activities.js +96 -0
- package/dist/src/ui/utils/format.d.ts +14 -0
- package/dist/src/ui/utils/format.js +23 -3
- package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
- package/dist/src/ui/utils/group-tool-entries.js +111 -0
- package/dist/src/ui/utils/tool-summary.d.ts +21 -0
- package/dist/src/ui/utils/tool-summary.js +91 -0
- package/dist/src/usage/downgrade.js +2 -2
- package/dist/src/usage/product-ledger.js +2 -2
- package/dist/src/utils/event-loop-monitor.d.ts +85 -0
- package/dist/src/utils/event-loop-monitor.js +107 -0
- package/dist/src/utils/install-manager.js +2 -1
- package/dist/src/utils/llm-deadline.d.ts +14 -0
- package/dist/src/utils/llm-deadline.js +19 -0
- package/dist/src/utils/logger.js +2 -2
- package/dist/src/utils/loop-profiler.d.ts +102 -0
- package/dist/src/utils/loop-profiler.js +202 -0
- package/dist/src/utils/permission-mode.js +5 -3
- package/dist/src/utils/redactor.js +1 -1
- package/dist/src/utils/settings.d.ts +180 -5
- package/dist/src/utils/settings.js +271 -31
- package/dist/src/utils/side-question.d.ts +1 -2
- package/dist/src/utils/side-question.js +2 -2
- package/dist/src/utils/visible-retry.d.ts +11 -0
- package/dist/src/utils/visible-retry.js +10 -1
- package/dist/src/verify/entrypoint.d.ts +1 -1
- package/dist/src/verify/entrypoint.js +52 -17
- package/dist/src/verify/orchestrator.d.ts +1 -1
- package/dist/src/verify/orchestrator.js +20 -3
- package/dist/src/verify/recipes.d.ts +13 -0
- package/dist/src/verify/recipes.js +15 -0
- package/package.json +134 -132
- package/dist/src/cli/bw-vault.d.ts +0 -55
- package/dist/src/cli/bw-vault.js +0 -133
- package/dist/src/mcp/ee-tools.d.ts +0 -46
- package/dist/src/mcp/ee-tools.js +0 -193
- package/dist/src/providers/auth/gcloud.d.ts +0 -28
- package/dist/src/providers/auth/gcloud.js +0 -102
- package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
- package/dist/src/providers/auth/gemini-oauth.js +0 -472
- package/dist/src/providers/gemini.d.ts +0 -11
- package/dist/src/providers/gemini.js +0 -45
- package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
- package/dist/src/providers/siliconflow-sse-repair.js +0 -177
- package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
- package/dist/src/providers/strategies/google.strategy.js +0 -174
- package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
- package/dist/src/ui/containers/chat-feed.d.ts +0 -40
- package/dist/src/ui/containers/chat-feed.js +0 -66
|
@@ -40,3 +40,10 @@ export interface SlashMenuItem {
|
|
|
40
40
|
export declare const SLASH_MENU_ITEMS: SlashMenuItem[];
|
|
41
41
|
/** Items shown in the splash autocomplete + /help listing. */
|
|
42
42
|
export declare const VISIBLE_SLASH_MENU_ITEMS: SlashMenuItem[];
|
|
43
|
+
/**
|
|
44
|
+
* Arrow-navigation order for the empty-query ("just /") dropdown: primary
|
|
45
|
+
* surface first, then the hidden commands. The dropdown renders a scrolling
|
|
46
|
+
* viewport, so listing the full set here makes every command reachable by
|
|
47
|
+
* arrow keys without cluttering the top of the list (primary stays on top).
|
|
48
|
+
*/
|
|
49
|
+
export declare const SLASH_MENU_ITEMS_ARROW_ORDER: SlashMenuItem[];
|
|
@@ -28,32 +28,36 @@
|
|
|
28
28
|
export const SLASH_MENU_ITEMS = [
|
|
29
29
|
// ── Primary surface ────────────────────────────────────────────────────
|
|
30
30
|
{ id: "exit", label: "exit", description: "Quit the CLI" },
|
|
31
|
-
{
|
|
31
|
+
{
|
|
32
|
+
id: "providers",
|
|
33
|
+
label: "providers",
|
|
34
|
+
description: "Providers, keys and sign-in (K adds a key, Enter signs in with OAuth)",
|
|
35
|
+
},
|
|
32
36
|
{ id: "compact", label: "compact", description: "Compact conversation context" },
|
|
33
37
|
{ id: "clear", label: "clear", description: "Clear conversation and start fresh" },
|
|
34
|
-
{ id: "ideal", label: "ideal", description: "Product Ideal Loop —
|
|
38
|
+
{ id: "ideal", label: "ideal", description: "Product Ideal Loop — from idea to shipped product, autonomously" },
|
|
35
39
|
{ id: "council", label: "council", description: "Multi-model adversarial debate" },
|
|
36
40
|
// ── Hidden (still functional when typed in full) ───────────────────────
|
|
37
41
|
{ id: "help", label: "help", description: "Show available commands", hidden: true },
|
|
38
|
-
{ id: "config", label: "config", description: "Open provider and council configuration", hidden: true },
|
|
39
42
|
{ id: "remote-control", label: "remote-control", description: "Remote control", hidden: true },
|
|
40
|
-
{ id: "agents", label: "agents", description: "Manage custom sub-agents", hidden: true },
|
|
41
|
-
{ id: "schedule", label: "schedule", description: "View scheduled runs", hidden: true },
|
|
42
43
|
{ id: "mcp", label: "mcp", description: "Manage MCP servers", hidden: true },
|
|
43
44
|
{ id: "sandbox", label: "sandbox", description: "Select shell sandbox mode", hidden: true },
|
|
44
45
|
{ id: "wallet", label: "wallet", description: "Wallet and payment settings", hidden: true },
|
|
45
46
|
{ id: "models", label: "models", description: "Alias of /providers", hidden: true },
|
|
46
47
|
{ id: "new", label: "new session", description: "Start a new session", hidden: true },
|
|
47
|
-
{ id: "
|
|
48
|
+
{ id: "resume", label: "resume", description: "List recent sessions to resume" },
|
|
48
49
|
{ id: "commit-push", label: "commit & push", description: "Commit and push", hidden: true },
|
|
49
50
|
{ id: "commit-pr", label: "commit & pr", description: "Commit and open PR", hidden: true },
|
|
50
51
|
{ id: "review", label: "review", description: "Review recent changes", hidden: true },
|
|
51
52
|
{ id: "verify", label: "verify", description: "Run local verification", hidden: true },
|
|
52
|
-
{ id: "skills", label: "skills", description: "Manage skills", hidden: true },
|
|
53
|
-
{ id: "btw", label: "btw", description: "Ask a side question without interrupting", hidden: true },
|
|
54
53
|
{ id: "update", label: "update", description: "Update muonroi-cli to the latest version", hidden: true },
|
|
55
54
|
{ id: "cost", label: "cost", description: "Show session cost breakdown", hidden: true },
|
|
56
|
-
{
|
|
55
|
+
{
|
|
56
|
+
id: "ee",
|
|
57
|
+
label: "ee",
|
|
58
|
+
description: "Experience Engine — connect a brain (/ee config <url> [token]), stats, search",
|
|
59
|
+
hidden: true,
|
|
60
|
+
},
|
|
57
61
|
{ id: "route", label: "route", description: "Show current model routing info", hidden: true },
|
|
58
62
|
{ id: "plan", label: "plan", description: "Show active GSD plan", hidden: true },
|
|
59
63
|
{ id: "execute", label: "execute", description: "Execute active GSD plan", hidden: true },
|
|
@@ -74,21 +78,20 @@ export const SLASH_MENU_ITEMS = [
|
|
|
74
78
|
{ id: "pin", label: "pin", description: "Pin a user message so it survives compaction", hidden: true },
|
|
75
79
|
{ id: "unpin", label: "unpin", description: "Remove a pinned message by sequence number", hidden: true },
|
|
76
80
|
{ id: "pins", label: "pins", description: "List currently pinned message sequences", hidden: true },
|
|
77
|
-
{ id: "ee-stats", label: "ee stats", description: "Knowledge base statistics", hidden: true },
|
|
78
|
-
{ id: "ee-gates", label: "ee gates", description: "Quality gate checklist", hidden: true },
|
|
79
|
-
{ id: "ee-evolve", label: "ee evolve", description: "Trigger EE evolution cycle", hidden: true },
|
|
80
|
-
{ id: "ee-user", label: "ee user", description: "Current EE user identity", hidden: true },
|
|
81
|
-
{ id: "ee-search", label: "ee search", description: "Semantic search across knowledge base", hidden: true },
|
|
82
|
-
{ id: "ee-timeline", label: "ee timeline", description: "Principle evolution for a topic", hidden: true },
|
|
83
|
-
{ id: "ee-graph", label: "ee graph", description: "Principle relationship graph", hidden: true },
|
|
84
|
-
{ id: "ee-route", label: "ee route", description: "Route task to workflow", hidden: true },
|
|
85
|
-
{ id: "ee-context-on", label: "ee-context on", description: "Enable BB-aware EE context injection", hidden: true },
|
|
86
|
-
{ id: "ee-context-off", label: "ee-context off", description: "Disable BB-aware EE context injection", hidden: true },
|
|
87
|
-
{ id: "ee-context-status", label: "ee-context status", description: "Show current BB-context setting", hidden: true },
|
|
88
81
|
{ id: "export", label: "export", description: "Export entire conversation to a .txt file", hidden: true },
|
|
89
82
|
{ id: "status", label: "status", description: "Show Agile sprint progress dashboard", hidden: true },
|
|
90
83
|
{ id: "ponytail", label: "ponytail", description: "Toggle Lazy Senior AI Mode (on/off/status)", hidden: false },
|
|
91
84
|
];
|
|
92
85
|
/** Items shown in the splash autocomplete + /help listing. */
|
|
93
86
|
export const VISIBLE_SLASH_MENU_ITEMS = SLASH_MENU_ITEMS.filter((m) => !m.hidden);
|
|
87
|
+
/**
|
|
88
|
+
* Arrow-navigation order for the empty-query ("just /") dropdown: primary
|
|
89
|
+
* surface first, then the hidden commands. The dropdown renders a scrolling
|
|
90
|
+
* viewport, so listing the full set here makes every command reachable by
|
|
91
|
+
* arrow keys without cluttering the top of the list (primary stays on top).
|
|
92
|
+
*/
|
|
93
|
+
export const SLASH_MENU_ITEMS_ARROW_ORDER = [
|
|
94
|
+
...VISIBLE_SLASH_MENU_ITEMS,
|
|
95
|
+
...SLASH_MENU_ITEMS.filter((m) => m.hidden),
|
|
96
|
+
];
|
|
94
97
|
//# sourceMappingURL=menu-items.js.map
|
|
@@ -23,6 +23,8 @@ export interface SlashContext {
|
|
|
23
23
|
export type SlashHandler = (args: string[], ctx: SlashContext) => Promise<string> | string;
|
|
24
24
|
/** Register a slash command handler. */
|
|
25
25
|
export declare function registerSlash(name: string, handler: SlashHandler): void;
|
|
26
|
+
/** Unregister a slash command handler (used for tests). */
|
|
27
|
+
export declare function unregisterSlash(name: string): void;
|
|
26
28
|
/**
|
|
27
29
|
* Dispatch a slash command by name.
|
|
28
30
|
* Returns null if command not registered (caller falls back to legacy switch).
|
|
@@ -9,6 +9,10 @@ const registry = new Map();
|
|
|
9
9
|
export function registerSlash(name, handler) {
|
|
10
10
|
registry.set(name, handler);
|
|
11
11
|
}
|
|
12
|
+
/** Unregister a slash command handler (used for tests). */
|
|
13
|
+
export function unregisterSlash(name) {
|
|
14
|
+
registry.delete(name);
|
|
15
|
+
}
|
|
12
16
|
/**
|
|
13
17
|
* Dispatch a slash command by name.
|
|
14
18
|
* Returns null if command not registered (caller falls back to legacy switch).
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Cache-hit ratio = cache_read / total input (cumulative). `in_tokens` already
|
|
2
|
+
* includes cache-read tokens (verified: usage_events cache_read ⊆ input_tokens). */
|
|
3
|
+
export declare function computeCacheHitPct(s: {
|
|
4
|
+
in_tokens: number;
|
|
5
|
+
cache_read_tokens: number;
|
|
6
|
+
}): number | null;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Cache-hit ratio = cache_read / total input (cumulative). `in_tokens` already
|
|
2
|
+
* includes cache-read tokens (verified: usage_events cache_read ⊆ input_tokens). */
|
|
3
|
+
export function computeCacheHitPct(s) {
|
|
4
|
+
if (s.in_tokens <= 0)
|
|
5
|
+
return null;
|
|
6
|
+
const pct = (s.cache_read_tokens / s.in_tokens) * 100;
|
|
7
|
+
return Math.max(0, Math.min(100, Math.round(pct)));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=cache-hit.js.map
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Subscribes to statusBarStore for live updates (no polling).
|
|
8
8
|
*/
|
|
9
9
|
import * as React from "react";
|
|
10
|
-
import { type SprintProgressSegment, type StatusBarState } from "
|
|
10
|
+
import { type SprintProgressSegment, type StatusBarState } from "../../state/status-bar-store.js";
|
|
11
11
|
/**
|
|
12
12
|
* Format a SprintProgressSegment into the StatusBar display string.
|
|
13
13
|
* Format: Sprint N/M · X/Y stories · Z%
|
|
@@ -9,7 +9,8 @@ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
|
9
9
|
*/
|
|
10
10
|
import { Semantic } from "@muonroi/agent-harness-opentui";
|
|
11
11
|
import * as React from "react";
|
|
12
|
-
import { statusBarStore } from "
|
|
12
|
+
import { statusBarStore } from "../../state/status-bar-store.js";
|
|
13
|
+
import { computeCacheHitPct } from "./cache-hit.js";
|
|
13
14
|
import { TierBadge } from "./tier-badge.js";
|
|
14
15
|
import { UsdMeter } from "./usd-meter.js";
|
|
15
16
|
function useStatusBarState() {
|
|
@@ -57,7 +58,11 @@ export function renderStatusBar(s) {
|
|
|
57
58
|
: s.ctx_tokens !== undefined
|
|
58
59
|
? ` [ctx: ${fmtTokens(s.ctx_tokens)}]`
|
|
59
60
|
: "";
|
|
60
|
-
const
|
|
61
|
+
const hitPct = computeCacheHitPct(s);
|
|
62
|
+
const cacheSeg = s.cache_read_tokens
|
|
63
|
+
? ` ⊚${fmtTokens(s.cache_read_tokens)}${hitPct !== null ? ` ${hitPct}%` : ""}`
|
|
64
|
+
: "";
|
|
65
|
+
const tokenStr = `↑${fmtTokens(s.in_tokens)} ↓${fmtTokens(s.out_tokens)}${cacheSeg}${ctxFill}`;
|
|
61
66
|
const ee = EE_DOT[s.ee_status] ?? EE_DOT.unknown;
|
|
62
67
|
const slots = [
|
|
63
68
|
React.createElement("text", { key: "pm", fg: "#5c9cf5", "data-testid": "slot-provider-model" }, modelLabel),
|
|
@@ -66,7 +71,6 @@ export function renderStatusBar(s) {
|
|
|
66
71
|
React.createElement(UsdMeter, {
|
|
67
72
|
key: "usd",
|
|
68
73
|
session_usd: s.session_usd,
|
|
69
|
-
month_usd: s.month_usd,
|
|
70
74
|
current_pct: s.current_pct,
|
|
71
75
|
}),
|
|
72
76
|
React.createElement("text", { key: "ee", fg: ee.color, "data-testid": "slot-ee" }, ee.symbol),
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/ui/status-bar/usd-meter.tsx
|
|
3
3
|
*
|
|
4
|
-
* USD meter sub-component: session
|
|
5
|
-
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%.
|
|
4
|
+
* USD meter sub-component: session spend with threshold color escalation.
|
|
5
|
+
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%. The month total is
|
|
6
|
+
* intentionally NOT shown here (redundant on the status bar); it remains in the
|
|
7
|
+
* store and is surfaced on demand via `/cost`.
|
|
6
8
|
*/
|
|
7
9
|
import * as React from "react";
|
|
8
10
|
export interface UsdMeterProps {
|
|
9
11
|
session_usd: number;
|
|
10
|
-
month_usd: number;
|
|
11
12
|
current_pct: number;
|
|
12
13
|
}
|
|
13
|
-
export declare function UsdMeter({ session_usd,
|
|
14
|
+
export declare function UsdMeter({ session_usd, current_pct }: UsdMeterProps): React.ReactElement;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/ui/status-bar/usd-meter.tsx
|
|
3
3
|
*
|
|
4
|
-
* USD meter sub-component: session
|
|
5
|
-
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%.
|
|
4
|
+
* USD meter sub-component: session spend with threshold color escalation.
|
|
5
|
+
* white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%. The month total is
|
|
6
|
+
* intentionally NOT shown here (redundant on the status bar); it remains in the
|
|
7
|
+
* store and is surfaced on demand via `/cost`.
|
|
6
8
|
*/
|
|
7
9
|
import * as React from "react";
|
|
8
|
-
export function UsdMeter({ session_usd,
|
|
10
|
+
export function UsdMeter({ session_usd, current_pct }) {
|
|
9
11
|
const color = current_pct >= 100 ? "red" : current_pct >= 80 ? "yellow" : current_pct >= 50 ? "cyan" : "white";
|
|
10
|
-
const text = `session: $${session_usd.toFixed(2)}
|
|
12
|
+
const text = `session: $${session_usd.toFixed(2)}`;
|
|
11
13
|
return React.createElement("text", { fg: color, "data-testid": "usd-meter", "data-pct": current_pct }, text);
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=usd-meter.js.map
|
package/dist/src/ui/theme.d.ts
CHANGED
|
@@ -65,6 +65,7 @@ export declare const dark: {
|
|
|
65
65
|
readonly syntaxRegex: "#d16969";
|
|
66
66
|
readonly syntaxTag: "#569cd6";
|
|
67
67
|
readonly syntaxAttr: "#9cdcfe";
|
|
68
|
+
readonly overlay: "#000000cc";
|
|
68
69
|
readonly councilLeaderBorder: "#666666";
|
|
69
70
|
readonly councilSynthesisBorder: "#5c9cf5";
|
|
70
71
|
readonly councilInfoCardBorder: "#4a4a4a";
|
package/dist/src/ui/theme.js
CHANGED
|
@@ -65,6 +65,8 @@ export const dark = {
|
|
|
65
65
|
syntaxRegex: "#d16969",
|
|
66
66
|
syntaxTag: "#569cd6",
|
|
67
67
|
syntaxAttr: "#9cdcfe",
|
|
68
|
+
// ── Overlay / modal backdrop ─────────────────────────────────────────────
|
|
69
|
+
overlay: "#000000cc",
|
|
68
70
|
// ── Council bubble tokens ────────────────────────────────────────────────
|
|
69
71
|
councilLeaderBorder: "#666666",
|
|
70
72
|
councilSynthesisBorder: "#5c9cf5",
|
package/dist/src/ui/types.d.ts
CHANGED
|
@@ -63,6 +63,13 @@ export interface AppStartupConfig {
|
|
|
63
63
|
* Never set this in production — only passed via --inject-halt CLI flag.
|
|
64
64
|
*/
|
|
65
65
|
injectHalt?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* TEST SEAM (A): when true, dispatch a synthetic `sprint_failed` halt chunk
|
|
68
|
+
* (Resume / Retry / Skip verify / Abort) after first idle. Lets harness E2E
|
|
69
|
+
* specs verify the sprint-break recovery card without a real mid-run failure.
|
|
70
|
+
* Never set this in production — only passed via --inject-halt-sprint.
|
|
71
|
+
*/
|
|
72
|
+
injectHaltSprint?: boolean;
|
|
66
73
|
}
|
|
67
74
|
export interface AppProps {
|
|
68
75
|
agent: Agent;
|
|
Binary file
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/ui/utils/agent-activities.ts
|
|
3
|
+
*
|
|
4
|
+
* Collect every sub-agent / background job the main agent has spawned this
|
|
5
|
+
* session, for the rail's Agents block.
|
|
6
|
+
*
|
|
7
|
+
* Derived entirely from state the UI already holds — the transcript entries and
|
|
8
|
+
* the in-flight tool calls. Spawning goes through tools (`task`, `delegate`,
|
|
9
|
+
* `bash background:true`), so the tool stream IS the record; there is no need
|
|
10
|
+
* for a parallel registry in core, and nothing here can drift out of sync with
|
|
11
|
+
* what the transcript shows.
|
|
12
|
+
*
|
|
13
|
+
* Running entries come from activeToolCalls (no result yet), finished ones from
|
|
14
|
+
* tool_result / tool_group items. A call that is both (still streaming while an
|
|
15
|
+
* earlier identical call finished) is keyed by tool-call id, so it appears once.
|
|
16
|
+
*/
|
|
17
|
+
import type { ChatEntry, ToolCall } from "../../types/index.js";
|
|
18
|
+
export type ActivityKind = "subagent" | "delegate" | "background";
|
|
19
|
+
export type ActivityStatus = "running" | "done" | "failed";
|
|
20
|
+
export interface AgentActivity {
|
|
21
|
+
/** Tool-call id — stable across the running → finished transition. */
|
|
22
|
+
id: string;
|
|
23
|
+
kind: ActivityKind;
|
|
24
|
+
/** Short line for the rail row, e.g. an explore agent's description. */
|
|
25
|
+
label: string;
|
|
26
|
+
/** Sub-agent type ("explore", "general", …). Empty for background shells. */
|
|
27
|
+
agent: string;
|
|
28
|
+
status: ActivityStatus;
|
|
29
|
+
/** Full text shown when the row is opened: the prompt/command, then output. */
|
|
30
|
+
detail: string;
|
|
31
|
+
}
|
|
32
|
+
/** The activity kind a tool call represents, or null if it spawns nothing. */
|
|
33
|
+
export declare function activityKindFor(tc: ToolCall): ActivityKind | null;
|
|
34
|
+
/**
|
|
35
|
+
* Every activity in the session, oldest first. Later state for the same
|
|
36
|
+
* tool-call id wins, so a call that finishes replaces its own running row
|
|
37
|
+
* instead of adding a second one.
|
|
38
|
+
*/
|
|
39
|
+
export declare function collectAgentActivities(messages: ChatEntry[], activeToolCalls?: ToolCall[]): AgentActivity[];
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/ui/utils/agent-activities.ts
|
|
3
|
+
*
|
|
4
|
+
* Collect every sub-agent / background job the main agent has spawned this
|
|
5
|
+
* session, for the rail's Agents block.
|
|
6
|
+
*
|
|
7
|
+
* Derived entirely from state the UI already holds — the transcript entries and
|
|
8
|
+
* the in-flight tool calls. Spawning goes through tools (`task`, `delegate`,
|
|
9
|
+
* `bash background:true`), so the tool stream IS the record; there is no need
|
|
10
|
+
* for a parallel registry in core, and nothing here can drift out of sync with
|
|
11
|
+
* what the transcript shows.
|
|
12
|
+
*
|
|
13
|
+
* Running entries come from activeToolCalls (no result yet), finished ones from
|
|
14
|
+
* tool_result / tool_group items. A call that is both (still streaming while an
|
|
15
|
+
* earlier identical call finished) is keyed by tool-call id, so it appears once.
|
|
16
|
+
*/
|
|
17
|
+
const KIND_BY_TOOL = {
|
|
18
|
+
task: "subagent",
|
|
19
|
+
delegate: "delegate",
|
|
20
|
+
};
|
|
21
|
+
function parseArgs(tc) {
|
|
22
|
+
try {
|
|
23
|
+
const parsed = JSON.parse(tc.function.arguments || "{}");
|
|
24
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
// Arguments stream in as partial JSON while a call assembles — an
|
|
28
|
+
// unparseable value here is expected mid-flight, not an error.
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function str(value) {
|
|
33
|
+
return typeof value === "string" ? value : "";
|
|
34
|
+
}
|
|
35
|
+
/** The activity kind a tool call represents, or null if it spawns nothing. */
|
|
36
|
+
export function activityKindFor(tc) {
|
|
37
|
+
const name = tc.function.name;
|
|
38
|
+
const known = KIND_BY_TOOL[name];
|
|
39
|
+
if (known)
|
|
40
|
+
return known;
|
|
41
|
+
// A backgrounded shell is a spawned job too — but only when it actually
|
|
42
|
+
// backgrounds. A normal bash call is just a tool, not an activity.
|
|
43
|
+
if (name === "bash" && parseArgs(tc).background === true)
|
|
44
|
+
return "background";
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function toActivity(tc, result) {
|
|
48
|
+
const kind = activityKindFor(tc);
|
|
49
|
+
if (!kind)
|
|
50
|
+
return null;
|
|
51
|
+
const args = parseArgs(tc);
|
|
52
|
+
const agent = kind === "background" ? "" : str(args.agent);
|
|
53
|
+
const command = str(args.command);
|
|
54
|
+
const label = (kind === "background" ? command : str(args.description) || str(args.prompt)) || tc.function.name;
|
|
55
|
+
const request = kind === "background" ? command : str(args.prompt);
|
|
56
|
+
let status = "running";
|
|
57
|
+
if (result)
|
|
58
|
+
status = result.success ? "done" : "failed";
|
|
59
|
+
const output = result ? (result.success ? result.output || "" : result.error || "") : "";
|
|
60
|
+
const detail = [request, output].filter((s) => s.trim().length > 0).join("\n\n");
|
|
61
|
+
return { id: tc.id, kind, label: label.replace(/\s+/g, " ").trim(), agent, status, detail };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Every activity in the session, oldest first. Later state for the same
|
|
65
|
+
* tool-call id wins, so a call that finishes replaces its own running row
|
|
66
|
+
* instead of adding a second one.
|
|
67
|
+
*/
|
|
68
|
+
export function collectAgentActivities(messages, activeToolCalls = []) {
|
|
69
|
+
const byId = new Map();
|
|
70
|
+
const add = (tc, result) => {
|
|
71
|
+
if (!tc)
|
|
72
|
+
return;
|
|
73
|
+
const activity = toActivity(tc, result);
|
|
74
|
+
if (activity)
|
|
75
|
+
byId.set(activity.id, activity);
|
|
76
|
+
};
|
|
77
|
+
for (const entry of messages) {
|
|
78
|
+
if (entry.type === "tool_result") {
|
|
79
|
+
add(entry.toolCall, entry.toolResult);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (entry.type === "tool_group") {
|
|
83
|
+
for (const item of entry.toolGroup?.items ?? [])
|
|
84
|
+
add(item.toolCall, item.result);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// In-flight calls fill in only what the transcript does not already have.
|
|
88
|
+
// activeToolCalls is not always cleared the instant a result lands, so adding
|
|
89
|
+
// one unconditionally would flip a finished row back to "running".
|
|
90
|
+
for (const tc of activeToolCalls) {
|
|
91
|
+
if (!byId.has(tc.id))
|
|
92
|
+
add(tc, undefined);
|
|
93
|
+
}
|
|
94
|
+
return [...byId.values()];
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=agent-activities.js.map
|
|
@@ -35,4 +35,18 @@ export declare function buildPreflightQuestion(pf: {
|
|
|
35
35
|
model: string;
|
|
36
36
|
}>;
|
|
37
37
|
}): CouncilQuestionData;
|
|
38
|
+
/**
|
|
39
|
+
* F5 — the council entrypoint (council/index.ts) emits `leader`+`panel`+`topic`
|
|
40
|
+
* together exactly once, at the START of each debate; every later `council_meta`
|
|
41
|
+
* patch is partial (a lone roundBudget / researchMode / successCriteria /
|
|
42
|
+
* criteriaMet). That combination is the strongest new-council signal — stronger
|
|
43
|
+
* than a topic change, which misses a re-run on the SAME topic (auto-council
|
|
44
|
+
* re-firing on a phase, or a fresh /council after an Esc that skipped
|
|
45
|
+
* clearLiveTurnUi) and leaks the prior council's pinned criteria into the rail as
|
|
46
|
+
* stale ○ rows. The rail resets its meta+rounds on this.
|
|
47
|
+
*/
|
|
48
|
+
export declare function isCouncilStartPatch(patch: {
|
|
49
|
+
leader?: string;
|
|
50
|
+
panel?: string[];
|
|
51
|
+
}): boolean;
|
|
38
52
|
export declare function mapCouncilCardKey(key: KeyEvent): CouncilCardKey | null;
|
|
@@ -41,6 +41,13 @@ export function formatAnswerForLog(ans, ctx) {
|
|
|
41
41
|
return verb;
|
|
42
42
|
// Single line — labels carry value + rationale tail; keep echo to the value.
|
|
43
43
|
const valueOnly = label.split("—")[0].trim().replace(/\s+/g, " ");
|
|
44
|
+
// Internal snake_case action ids (continue_session, save_exit, generate_plan,
|
|
45
|
+
// ask_followup…) are routing tokens the user should NEVER see. When the value
|
|
46
|
+
// is such an id, echo the human label alone instead of "continue_session · …".
|
|
47
|
+
// Short human verbs (accept, skip, override) have no underscore and keep the
|
|
48
|
+
// value-prefixed forensics form below.
|
|
49
|
+
if (/_/.test(verb))
|
|
50
|
+
return valueOnly || verb;
|
|
44
51
|
if (ctx?.questionId) {
|
|
45
52
|
return `${verb} · ${ctx.questionId}=${valueOnly}`;
|
|
46
53
|
}
|
|
@@ -89,15 +96,28 @@ export function buildPreflightQuestion(pf) {
|
|
|
89
96
|
questionId: pf.preflightId,
|
|
90
97
|
phase: "preflight",
|
|
91
98
|
question: `Approve discussion plan for: ${pf.problemStatement}`,
|
|
92
|
-
context: pf.participants.length > 0 ? `
|
|
99
|
+
context: pf.participants.length > 0 ? `Panel: ${pf.participants.map((p) => p.model).join(", ")}` : undefined,
|
|
93
100
|
options: [
|
|
94
|
-
{ label: "Approve", value: "approve", kind: "choice", description: "
|
|
95
|
-
{ label: "Reject", value: "reject", kind: "choice", description: "
|
|
101
|
+
{ label: "Approve", value: "approve", kind: "choice", description: "Looks good — start the debate" },
|
|
102
|
+
{ label: "Reject", value: "reject", kind: "choice", description: "Hold off — go back and rephrase the topic" },
|
|
96
103
|
],
|
|
97
104
|
isRequired: true,
|
|
98
105
|
defaultIndex: 0,
|
|
99
106
|
};
|
|
100
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* F5 — the council entrypoint (council/index.ts) emits `leader`+`panel`+`topic`
|
|
110
|
+
* together exactly once, at the START of each debate; every later `council_meta`
|
|
111
|
+
* patch is partial (a lone roundBudget / researchMode / successCriteria /
|
|
112
|
+
* criteriaMet). That combination is the strongest new-council signal — stronger
|
|
113
|
+
* than a topic change, which misses a re-run on the SAME topic (auto-council
|
|
114
|
+
* re-firing on a phase, or a fresh /council after an Esc that skipped
|
|
115
|
+
* clearLiveTurnUi) and leaks the prior council's pinned criteria into the rail as
|
|
116
|
+
* stale ○ rows. The rail resets its meta+rounds on this.
|
|
117
|
+
*/
|
|
118
|
+
export function isCouncilStartPatch(patch) {
|
|
119
|
+
return !!patch.leader && !!patch.panel;
|
|
120
|
+
}
|
|
101
121
|
export function mapCouncilCardKey(key) {
|
|
102
122
|
if (key.name === "up")
|
|
103
123
|
return { kind: "up" };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/ui/utils/group-tool-entries.ts
|
|
3
|
+
*
|
|
4
|
+
* Rebuild the tool_group panels when a flat transcript is (re)loaded.
|
|
5
|
+
*
|
|
6
|
+
* WHY: the live turn renders tool calls inside a `tool_group` ChatEntry, but the
|
|
7
|
+
* persisted transcript stores one `tool_result` entry per call. Anything that
|
|
8
|
+
* replaces the message list with `agent.getChatEntries()` — the end-of-turn
|
|
9
|
+
* resync in finalizeActiveTurn, session load, resume — therefore DESTROYED the
|
|
10
|
+
* group and dropped the transcript back to one flat "→ <tool>" line per call.
|
|
11
|
+
* That is what a user sees after the answer lands, so the nice
|
|
12
|
+
* "Read 2 files, ran 1 shell command" recap only ever existed mid-turn.
|
|
13
|
+
*
|
|
14
|
+
* This folds consecutive tool_result entries back into a done/failed group.
|
|
15
|
+
*/
|
|
16
|
+
import type { ChatEntry } from "../../types/index.js";
|
|
17
|
+
/**
|
|
18
|
+
* Fold runs of consecutive groupable tool_result entries into one tool_group
|
|
19
|
+
* entry each. Non-tool entries and rich results pass through untouched, so the
|
|
20
|
+
* transcript keeps its order. A run of one is still grouped: the recap line
|
|
21
|
+
* ("Read 1 file") is what stays visible once collapsed.
|
|
22
|
+
*
|
|
23
|
+
* `tool_call` entries are dropped inside a run — they are the pending twin of a
|
|
24
|
+
* result that is already represented by the item.
|
|
25
|
+
*/
|
|
26
|
+
export declare function groupToolEntries(entries: ChatEntry[]): ChatEntry[];
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/ui/utils/group-tool-entries.ts
|
|
3
|
+
*
|
|
4
|
+
* Rebuild the tool_group panels when a flat transcript is (re)loaded.
|
|
5
|
+
*
|
|
6
|
+
* WHY: the live turn renders tool calls inside a `tool_group` ChatEntry, but the
|
|
7
|
+
* persisted transcript stores one `tool_result` entry per call. Anything that
|
|
8
|
+
* replaces the message list with `agent.getChatEntries()` — the end-of-turn
|
|
9
|
+
* resync in finalizeActiveTurn, session load, resume — therefore DESTROYED the
|
|
10
|
+
* group and dropped the transcript back to one flat "→ <tool>" line per call.
|
|
11
|
+
* That is what a user sees after the answer lands, so the nice
|
|
12
|
+
* "Read 2 files, ran 1 shell command" recap only ever existed mid-turn.
|
|
13
|
+
*
|
|
14
|
+
* This folds consecutive tool_result entries back into a done/failed group.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Tool results whose own renderer shows something a tool-group item line cannot
|
|
18
|
+
* (a plan, a sub-agent run, an image, streaming process logs). These stay as
|
|
19
|
+
* standalone entries and also break a run, so ordering is preserved.
|
|
20
|
+
*/
|
|
21
|
+
function rendersRichResult(entry) {
|
|
22
|
+
const name = entry.toolCall?.function.name ?? "";
|
|
23
|
+
const r = entry.toolResult;
|
|
24
|
+
if (!r)
|
|
25
|
+
return true;
|
|
26
|
+
if (r.plan || r.task || r.delegation || r.backgroundProcess || (r.media?.length ?? 0) > 0)
|
|
27
|
+
return true;
|
|
28
|
+
return (name === "generate_plan" ||
|
|
29
|
+
name === "task" ||
|
|
30
|
+
name === "delegate" ||
|
|
31
|
+
name === "delegation_list" ||
|
|
32
|
+
name === "delegation_read" ||
|
|
33
|
+
name === "lsp" ||
|
|
34
|
+
name === "process_logs" ||
|
|
35
|
+
name === "process_stop" ||
|
|
36
|
+
name === "process_list");
|
|
37
|
+
}
|
|
38
|
+
function groupable(entry) {
|
|
39
|
+
return entry.type === "tool_result" && !!entry.toolCall && !rendersRichResult(entry);
|
|
40
|
+
}
|
|
41
|
+
function toItem(entry) {
|
|
42
|
+
const at = entry.timestamp instanceof Date ? entry.timestamp.getTime() : Date.now();
|
|
43
|
+
const failed = entry.toolResult?.success === false;
|
|
44
|
+
return {
|
|
45
|
+
toolCall: entry.toolCall,
|
|
46
|
+
result: entry.toolResult,
|
|
47
|
+
startedAt: at,
|
|
48
|
+
finishedAt: at,
|
|
49
|
+
...(failed ? { failed: true } : {}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Fold runs of consecutive groupable tool_result entries into one tool_group
|
|
54
|
+
* entry each. Non-tool entries and rich results pass through untouched, so the
|
|
55
|
+
* transcript keeps its order. A run of one is still grouped: the recap line
|
|
56
|
+
* ("Read 1 file") is what stays visible once collapsed.
|
|
57
|
+
*
|
|
58
|
+
* `tool_call` entries are dropped inside a run — they are the pending twin of a
|
|
59
|
+
* result that is already represented by the item.
|
|
60
|
+
*/
|
|
61
|
+
export function groupToolEntries(entries) {
|
|
62
|
+
const out = [];
|
|
63
|
+
let run = [];
|
|
64
|
+
const flush = () => {
|
|
65
|
+
if (run.length === 0)
|
|
66
|
+
return;
|
|
67
|
+
const items = run.map(toItem);
|
|
68
|
+
const first = run[0];
|
|
69
|
+
const last = run[run.length - 1];
|
|
70
|
+
const startedAt = items[0].startedAt;
|
|
71
|
+
const finishedAt = items[items.length - 1].finishedAt ?? startedAt;
|
|
72
|
+
out.push({
|
|
73
|
+
type: "tool_group",
|
|
74
|
+
content: "",
|
|
75
|
+
timestamp: first.timestamp,
|
|
76
|
+
...(first.modeColor ? { modeColor: first.modeColor } : {}),
|
|
77
|
+
...(first.remoteKey ? { remoteKey: first.remoteKey } : {}),
|
|
78
|
+
...(first.sourceLabel ? { sourceLabel: first.sourceLabel } : {}),
|
|
79
|
+
toolGroup: {
|
|
80
|
+
// Deterministic id: the same transcript must rebuild to the same ids, or
|
|
81
|
+
// React remounts every group on each resync and expansion state is lost.
|
|
82
|
+
id: `tg-restored-${startedAt}-${items.length}-${last.toolCall?.id ?? "x"}`,
|
|
83
|
+
state: items.some((i) => i.failed) ? "failed" : "done",
|
|
84
|
+
items,
|
|
85
|
+
startedAt,
|
|
86
|
+
finishedAt,
|
|
87
|
+
// The persisted entries carry a write-time timestamp, not the tool's real
|
|
88
|
+
// wall-clock span, so any duration derived here is fiction (a 10s turn
|
|
89
|
+
// rebuilt as "23ms"). Flag it and let the header omit the number rather
|
|
90
|
+
// than print a confident lie.
|
|
91
|
+
restored: true,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
run = [];
|
|
95
|
+
};
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
if (groupable(entry)) {
|
|
98
|
+
run.push(entry);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
// A pending tool_call adjacent to a run is already covered by the run's
|
|
102
|
+
// items; dropping it prevents a duplicate line above the group.
|
|
103
|
+
if (entry.type === "tool_call" && run.length > 0)
|
|
104
|
+
continue;
|
|
105
|
+
flush();
|
|
106
|
+
out.push(entry);
|
|
107
|
+
}
|
|
108
|
+
flush();
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=group-tool-entries.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/ui/utils/tool-summary.ts
|
|
3
|
+
*
|
|
4
|
+
* Phrasing for the tool-group panel. Pure string helpers, no React, so the
|
|
5
|
+
* wording is unit-testable and the component stays presentational.
|
|
6
|
+
*
|
|
7
|
+
* Active: "Reading 2 files…" (header, present participle)
|
|
8
|
+
* Done: "Read 2 files, ran 1 shell command" (past-tense recap)
|
|
9
|
+
*
|
|
10
|
+
* Counting is per CATEGORY, not per tool name: read_file and
|
|
11
|
+
* mcp__filesystem__read_text_file are both "files" to a reader.
|
|
12
|
+
*/
|
|
13
|
+
export declare function categoryForTool(name: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Header while the group runs: "Reading 2 files…".
|
|
16
|
+
* With a mixed batch the dominant category wins and the rest are summed into a
|
|
17
|
+
* trailing "+N more" so the header never claims work it isn't doing.
|
|
18
|
+
*/
|
|
19
|
+
export declare function activeToolGroupHeader(toolNames: readonly string[]): string;
|
|
20
|
+
/** Past-tense recap once the group closes: "Read 2 files, ran 1 shell command". */
|
|
21
|
+
export declare function doneToolGroupSummary(toolNames: readonly string[]): string;
|