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
|
@@ -7,11 +7,75 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { promises as fs } from "node:fs";
|
|
9
9
|
import * as path from "node:path";
|
|
10
|
+
import { recordArtifact } from "../../ee/artifact-cache.js";
|
|
11
|
+
import { getDefaultEEClient } from "../../ee/intercept.js";
|
|
10
12
|
import { estimateConversationTokens, serializeConversation } from "../../orchestrator/compaction.js";
|
|
11
13
|
import { atomicWriteText } from "../../storage/atomic-io.js";
|
|
14
|
+
import { logger } from "../../utils/logger.js";
|
|
12
15
|
import { readArtifact, writeArtifact } from "../artifact-io.js";
|
|
13
16
|
import { compressChat } from "./compress.js";
|
|
14
17
|
import { extractDecisions } from "./extract.js";
|
|
18
|
+
import { stageProgress } from "./progress.js";
|
|
19
|
+
/**
|
|
20
|
+
* Anti-mù for the deliberate (/compact) path — parity with the auto/tool-loop
|
|
21
|
+
* compaction which persists every elided tool output via persistArtifact.
|
|
22
|
+
*
|
|
23
|
+
* deliberateCompact rewrites the whole history into a prose summary, so without
|
|
24
|
+
* this the model loses the ability to `ee_query "tool-artifact id=<id>"` a
|
|
25
|
+
* specific tool result after /compact. We record each tool result into the
|
|
26
|
+
* in-process + disk artifact cache (the tier ee_query reads FIRST, before EE),
|
|
27
|
+
* and fire a best-effort EE extract so cross-session rehydrate also survives.
|
|
28
|
+
* Fail-open: a cache/EE hiccup never blocks the compaction.
|
|
29
|
+
*/
|
|
30
|
+
export function recordToolArtifactsForRehydrate(messages, projectPath) {
|
|
31
|
+
let recorded = 0;
|
|
32
|
+
for (const msg of messages) {
|
|
33
|
+
if (msg.role !== "tool" || !Array.isArray(msg.content))
|
|
34
|
+
continue;
|
|
35
|
+
for (const part of msg.content) {
|
|
36
|
+
if (part?.type !== "tool-result")
|
|
37
|
+
continue;
|
|
38
|
+
const toolCallId = typeof part.toolCallId === "string" ? part.toolCallId : "";
|
|
39
|
+
if (!toolCallId)
|
|
40
|
+
continue;
|
|
41
|
+
const toolName = typeof part.toolName === "string" ? part.toolName : "";
|
|
42
|
+
// AI SDK v5 tool-result payloads live under `output` (typed) or `result`.
|
|
43
|
+
const payload = part.output ?? part.result;
|
|
44
|
+
const content = typeof payload === "string"
|
|
45
|
+
? payload
|
|
46
|
+
: payload == null
|
|
47
|
+
? ""
|
|
48
|
+
: (() => {
|
|
49
|
+
try {
|
|
50
|
+
return JSON.stringify(payload);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return String(payload);
|
|
54
|
+
}
|
|
55
|
+
})();
|
|
56
|
+
if (!content)
|
|
57
|
+
continue;
|
|
58
|
+
try {
|
|
59
|
+
recordArtifact(toolCallId, toolName, content);
|
|
60
|
+
recorded++;
|
|
61
|
+
getDefaultEEClient()
|
|
62
|
+
.extract({
|
|
63
|
+
transcript: content.slice(0, 8000),
|
|
64
|
+
projectPath,
|
|
65
|
+
meta: { source: "tool-artifact", toolCallId, toolName, reason: "deliberate-compact" },
|
|
66
|
+
}, AbortSignal.timeout(700))
|
|
67
|
+
.catch(() => { });
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger.error("orchestrator", "deliberate-compact artifact record failed", {
|
|
71
|
+
toolCallId,
|
|
72
|
+
message: err?.message,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return recorded;
|
|
78
|
+
}
|
|
15
79
|
/**
|
|
16
80
|
* Orchestrate two-pass deliberate compaction.
|
|
17
81
|
*
|
|
@@ -20,9 +84,35 @@ import { extractDecisions } from "./extract.js";
|
|
|
20
84
|
* 3. Pass 2: compressChat -> compressed output
|
|
21
85
|
* 4. Return metrics
|
|
22
86
|
*/
|
|
23
|
-
export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBudget,
|
|
87
|
+
export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBudget, modelId, customInstructions, onProgress) {
|
|
88
|
+
// Callers reach this through @ts-nocheck UI code, so an argument-order drift
|
|
89
|
+
// is invisible to tsc. It is NOT invisible at runtime: a non-string modelId
|
|
90
|
+
// makes resolveModelRuntime throw, compressChat catches it, and /compact
|
|
91
|
+
// silently degrades to truncation — which is how commit e2100fb7 shipped a
|
|
92
|
+
// broken /compact. Fail loudly instead of summarizing nothing.
|
|
93
|
+
if (modelId !== undefined && typeof modelId !== "string") {
|
|
94
|
+
throw new TypeError(`deliberateCompact: modelId must be a model id string, got ${typeof modelId}. ` +
|
|
95
|
+
`Check the argument order at the call site.`);
|
|
96
|
+
}
|
|
97
|
+
const report = (stage, fraction) => {
|
|
98
|
+
if (!onProgress)
|
|
99
|
+
return;
|
|
100
|
+
try {
|
|
101
|
+
onProgress(stageProgress(stage, fraction));
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
// A broken progress sink must never fail the compaction it is reporting.
|
|
105
|
+
logger.error("orchestrator", "compact progress callback threw", { stage, message: err?.message });
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
report("artifacts");
|
|
109
|
+
// Anti-mù parity: persist every tool result to the artifact cache (+ EE)
|
|
110
|
+
// BEFORE we summarize the history away, so the model can still rehydrate a
|
|
111
|
+
// specific tool output via ee_query "tool-artifact id=<id>" after /compact.
|
|
112
|
+
recordToolArtifactsForRehydrate(messages, flowDir);
|
|
24
113
|
// Pass 1: Extract decisions/facts/constraints
|
|
25
|
-
|
|
114
|
+
report("extract");
|
|
115
|
+
const extracted = await extractDecisions(messages, modelId, customInstructions);
|
|
26
116
|
const totalExtracted = extracted.decisions.length + extracted.facts.length + extracted.constraints.length;
|
|
27
117
|
// Append to decisions.md
|
|
28
118
|
if (totalExtracted > 0) {
|
|
@@ -43,6 +133,7 @@ export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBu
|
|
|
43
133
|
await writeArtifact(flowDir, "decisions.md", existing, ["Decisions", "Facts", "Constraints"]);
|
|
44
134
|
}
|
|
45
135
|
// Snapshot full chat to history/
|
|
136
|
+
report("snapshot");
|
|
46
137
|
const historyDir = path.join(flowDir, "history");
|
|
47
138
|
await fs.mkdir(historyDir, { recursive: true });
|
|
48
139
|
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
@@ -55,7 +146,9 @@ export async function deliberateCompact(flowDir, messages, systemPrompt, tokenBu
|
|
|
55
146
|
// Token estimation before
|
|
56
147
|
const tokensBefore = estimateConversationTokens(systemPrompt, messages);
|
|
57
148
|
// Pass 2: Compress
|
|
58
|
-
|
|
149
|
+
report("compress");
|
|
150
|
+
const compressed = await compressChat(messages, systemPrompt, tokenBudget, modelId, customInstructions, (f) => report("compress", f));
|
|
151
|
+
report("done");
|
|
59
152
|
return {
|
|
60
153
|
decisionsExtracted: totalExtracted,
|
|
61
154
|
tokensBeforeCompress: tokensBefore,
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/flow/compaction/input-guard.ts
|
|
3
|
+
*
|
|
4
|
+
* Guard the INPUT of the deliberate-compaction LLM calls (extractDecisions +
|
|
5
|
+
* compressChat) against context-window overflow.
|
|
6
|
+
*
|
|
7
|
+
* Compaction fires precisely when a conversation has grown large — which is
|
|
8
|
+
* exactly when the full serialized history can EXCEED the compaction model's
|
|
9
|
+
* own context window. Both passes previously sent the whole serialized text as
|
|
10
|
+
* a single prompt with no bound, so on a very long session the summarizing call
|
|
11
|
+
* would fail (or the provider would hard-truncate the tail, dropping the most
|
|
12
|
+
* recent — most relevant — context) and fall back to a dumb truncation.
|
|
13
|
+
*
|
|
14
|
+
* This keeps the HEAD (task setup / early decisions) and the TAIL (most recent
|
|
15
|
+
* work) and elides the middle, so the summarizer always gets a coherent,
|
|
16
|
+
* in-window view of both ends. Pure + dependency-free.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Cap `text` to a safe char budget derived from the compaction model's context
|
|
20
|
+
* window. Returns the text unchanged when it already fits (or the window is
|
|
21
|
+
* unknown and the text is under the floor). Otherwise keeps head+tail and marks
|
|
22
|
+
* the elided middle.
|
|
23
|
+
*/
|
|
24
|
+
export declare function capCompactionInput(text: string, contextWindowTokens: number): string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/flow/compaction/input-guard.ts
|
|
3
|
+
*
|
|
4
|
+
* Guard the INPUT of the deliberate-compaction LLM calls (extractDecisions +
|
|
5
|
+
* compressChat) against context-window overflow.
|
|
6
|
+
*
|
|
7
|
+
* Compaction fires precisely when a conversation has grown large — which is
|
|
8
|
+
* exactly when the full serialized history can EXCEED the compaction model's
|
|
9
|
+
* own context window. Both passes previously sent the whole serialized text as
|
|
10
|
+
* a single prompt with no bound, so on a very long session the summarizing call
|
|
11
|
+
* would fail (or the provider would hard-truncate the tail, dropping the most
|
|
12
|
+
* recent — most relevant — context) and fall back to a dumb truncation.
|
|
13
|
+
*
|
|
14
|
+
* This keeps the HEAD (task setup / early decisions) and the TAIL (most recent
|
|
15
|
+
* work) and elides the middle, so the summarizer always gets a coherent,
|
|
16
|
+
* in-window view of both ends. Pure + dependency-free.
|
|
17
|
+
*/
|
|
18
|
+
/** Fraction of the model window we allow the compaction INPUT to occupy. */
|
|
19
|
+
const INPUT_WINDOW_FRACTION = 0.55;
|
|
20
|
+
/** Chars-per-token estimate (matches the rest of the compaction code). */
|
|
21
|
+
const CHARS_PER_TOKEN = 4;
|
|
22
|
+
/** Absolute floor so a tiny/unknown window never collapses the input to nothing. */
|
|
23
|
+
const MIN_INPUT_CHARS = 24_000;
|
|
24
|
+
/**
|
|
25
|
+
* Cap `text` to a safe char budget derived from the compaction model's context
|
|
26
|
+
* window. Returns the text unchanged when it already fits (or the window is
|
|
27
|
+
* unknown and the text is under the floor). Otherwise keeps head+tail and marks
|
|
28
|
+
* the elided middle.
|
|
29
|
+
*/
|
|
30
|
+
export function capCompactionInput(text, contextWindowTokens) {
|
|
31
|
+
const windowBudget = contextWindowTokens > 0 ? Math.floor(contextWindowTokens * CHARS_PER_TOKEN * INPUT_WINDOW_FRACTION) : 0;
|
|
32
|
+
const budget = Math.max(MIN_INPUT_CHARS, windowBudget);
|
|
33
|
+
if (text.length <= budget)
|
|
34
|
+
return text;
|
|
35
|
+
// Split the budget between head and tail, reserving room for the marker.
|
|
36
|
+
const headChars = Math.floor(budget * 0.5);
|
|
37
|
+
const tailChars = budget - headChars;
|
|
38
|
+
const head = text.slice(0, headChars);
|
|
39
|
+
const tail = text.slice(text.length - tailChars);
|
|
40
|
+
const elided = text.length - headChars - tailChars;
|
|
41
|
+
return `${head}\n\n[... ${elided} characters of the middle of the conversation elided to fit the compaction model's context window; the head (task setup) and tail (most recent work) are preserved ...]\n\n${tail}`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=input-guard.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/flow/compaction/progress.ts
|
|
3
|
+
*
|
|
4
|
+
* Progress model for deliberate (/compact) compaction.
|
|
5
|
+
*
|
|
6
|
+
* A compaction is a fixed pipeline of stages (see index.ts), so the percentage
|
|
7
|
+
* is stage-weighted rather than invented: each stage owns a span of the bar and
|
|
8
|
+
* only advances when that stage really advances. The two LLM passes dominate the
|
|
9
|
+
* wall-clock, which is why they own most of the span; the compress pass streams,
|
|
10
|
+
* so it reports a genuine within-stage fraction instead of freezing.
|
|
11
|
+
*
|
|
12
|
+
* Weights are ordered spans covering 0..100 with no gaps — asserted in tests so
|
|
13
|
+
* a new stage can't silently make the bar jump or stall.
|
|
14
|
+
*/
|
|
15
|
+
export type CompactStage = "artifacts" | "extract" | "snapshot" | "compress" | "done";
|
|
16
|
+
export interface CompactProgress {
|
|
17
|
+
stage: CompactStage;
|
|
18
|
+
/** 0..100, monotonic across the run. */
|
|
19
|
+
percent: number;
|
|
20
|
+
/** Human-readable current step, e.g. "Compressing history…". */
|
|
21
|
+
label: string;
|
|
22
|
+
}
|
|
23
|
+
export type CompactProgressFn = (progress: CompactProgress) => void;
|
|
24
|
+
interface StageSpan {
|
|
25
|
+
from: number;
|
|
26
|
+
to: number;
|
|
27
|
+
label: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const COMPACT_STAGE_SPANS: Record<CompactStage, StageSpan>;
|
|
30
|
+
/**
|
|
31
|
+
* Percent for a stage at `fraction` (0..1) of its own work. Callers that cannot
|
|
32
|
+
* measure within-stage progress pass 0 and land on the stage's start.
|
|
33
|
+
*/
|
|
34
|
+
export declare function stageProgress(stage: CompactStage, fraction?: number): CompactProgress;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/flow/compaction/progress.ts
|
|
3
|
+
*
|
|
4
|
+
* Progress model for deliberate (/compact) compaction.
|
|
5
|
+
*
|
|
6
|
+
* A compaction is a fixed pipeline of stages (see index.ts), so the percentage
|
|
7
|
+
* is stage-weighted rather than invented: each stage owns a span of the bar and
|
|
8
|
+
* only advances when that stage really advances. The two LLM passes dominate the
|
|
9
|
+
* wall-clock, which is why they own most of the span; the compress pass streams,
|
|
10
|
+
* so it reports a genuine within-stage fraction instead of freezing.
|
|
11
|
+
*
|
|
12
|
+
* Weights are ordered spans covering 0..100 with no gaps — asserted in tests so
|
|
13
|
+
* a new stage can't silently make the bar jump or stall.
|
|
14
|
+
*/
|
|
15
|
+
export const COMPACT_STAGE_SPANS = {
|
|
16
|
+
artifacts: { from: 0, to: 5, label: "Preserving tool artifacts…" },
|
|
17
|
+
extract: { from: 5, to: 40, label: "Extracting decisions…" },
|
|
18
|
+
snapshot: { from: 40, to: 50, label: "Snapshotting history…" },
|
|
19
|
+
compress: { from: 50, to: 100, label: "Compressing history…" },
|
|
20
|
+
done: { from: 100, to: 100, label: "Compacted" },
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Percent for a stage at `fraction` (0..1) of its own work. Callers that cannot
|
|
24
|
+
* measure within-stage progress pass 0 and land on the stage's start.
|
|
25
|
+
*/
|
|
26
|
+
export function stageProgress(stage, fraction = 0) {
|
|
27
|
+
const span = COMPACT_STAGE_SPANS[stage];
|
|
28
|
+
const clamped = Math.max(0, Math.min(1, Number.isFinite(fraction) ? fraction : 0));
|
|
29
|
+
return {
|
|
30
|
+
stage,
|
|
31
|
+
percent: Math.round(span.from + (span.to - span.from) * clamped),
|
|
32
|
+
label: span.label,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fold `.planning/` into `.muonroi-flow/planning/` — net-new, non-destructive
|
|
3
|
+
* consolidation migration (Sprint-2 Part A, staged per REV-3 Kill B).
|
|
4
|
+
*
|
|
5
|
+
* WHY staged / copy-only:
|
|
6
|
+
* GSD phases are still CREATED by the external `gsd-tools.cjs` subprocess,
|
|
7
|
+
* which writes to `.planning/` (hardcoded). Until that writer is removed
|
|
8
|
+
* (Part B — deferred), `.planning/` must remain the live tree. So this
|
|
9
|
+
* migration COPIES `.planning/` into the consolidated location and NEVER
|
|
10
|
+
* deletes the original — the read layer (`paths.ts::planningRoot`) keeps
|
|
11
|
+
* preferring `.planning/` while it exists, so there is zero desync risk.
|
|
12
|
+
* Once Part B stops writing `.planning/`, the folded tree becomes the live
|
|
13
|
+
* source transparently via the same read fallback.
|
|
14
|
+
*
|
|
15
|
+
* Guarantees:
|
|
16
|
+
* - Idempotent: guarded by a `.migrated` marker (NOT by directory existence —
|
|
17
|
+
* an empty `.muonroi-flow/planning/` must not make the fold skip forever;
|
|
18
|
+
* see REV-2 Kill #2).
|
|
19
|
+
* - Non-destructive: source `.planning/` is left untouched.
|
|
20
|
+
* - Byte-preserving: every copied file is asserted equal in size to its source.
|
|
21
|
+
*/
|
|
22
|
+
export interface FoldResult {
|
|
23
|
+
/** True when a fold copy was performed this call. */
|
|
24
|
+
migrated: boolean;
|
|
25
|
+
/** Reason a fold was skipped (marker present / no source). */
|
|
26
|
+
skipReason?: "already-migrated" | "no-source";
|
|
27
|
+
/** Number of files copied. */
|
|
28
|
+
filesCopied: number;
|
|
29
|
+
/** Absolute path to the folded planning root. */
|
|
30
|
+
foldedRoot: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Perform the fold. Safe to call repeatedly; returns `{migrated:false}` when the
|
|
34
|
+
* marker is already present or there is no `.planning/` to fold.
|
|
35
|
+
*/
|
|
36
|
+
export declare function foldPlanningIntoFlow(cwd: string): Promise<FoldResult>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fold `.planning/` into `.muonroi-flow/planning/` — net-new, non-destructive
|
|
3
|
+
* consolidation migration (Sprint-2 Part A, staged per REV-3 Kill B).
|
|
4
|
+
*
|
|
5
|
+
* WHY staged / copy-only:
|
|
6
|
+
* GSD phases are still CREATED by the external `gsd-tools.cjs` subprocess,
|
|
7
|
+
* which writes to `.planning/` (hardcoded). Until that writer is removed
|
|
8
|
+
* (Part B — deferred), `.planning/` must remain the live tree. So this
|
|
9
|
+
* migration COPIES `.planning/` into the consolidated location and NEVER
|
|
10
|
+
* deletes the original — the read layer (`paths.ts::planningRoot`) keeps
|
|
11
|
+
* preferring `.planning/` while it exists, so there is zero desync risk.
|
|
12
|
+
* Once Part B stops writing `.planning/`, the folded tree becomes the live
|
|
13
|
+
* source transparently via the same read fallback.
|
|
14
|
+
*
|
|
15
|
+
* Guarantees:
|
|
16
|
+
* - Idempotent: guarded by a `.migrated` marker (NOT by directory existence —
|
|
17
|
+
* an empty `.muonroi-flow/planning/` must not make the fold skip forever;
|
|
18
|
+
* see REV-2 Kill #2).
|
|
19
|
+
* - Non-destructive: source `.planning/` is left untouched.
|
|
20
|
+
* - Byte-preserving: every copied file is asserted equal in size to its source.
|
|
21
|
+
*/
|
|
22
|
+
import { promises as fs } from "node:fs";
|
|
23
|
+
import * as path from "node:path";
|
|
24
|
+
const FLOW_DIR = ".muonroi-flow";
|
|
25
|
+
const PLANNING_DIR = ".planning";
|
|
26
|
+
const FOLDED_SUBDIR = "planning";
|
|
27
|
+
const MARKER = ".migrated";
|
|
28
|
+
/** Recursively copy a directory, asserting byte-size preservation per file. */
|
|
29
|
+
async function copyTreePreserving(src, dest) {
|
|
30
|
+
let copied = 0;
|
|
31
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
32
|
+
await fs.mkdir(dest, { recursive: true });
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
const from = path.join(src, entry.name);
|
|
35
|
+
const to = path.join(dest, entry.name);
|
|
36
|
+
if (entry.isDirectory()) {
|
|
37
|
+
copied += await copyTreePreserving(from, to);
|
|
38
|
+
}
|
|
39
|
+
else if (entry.isFile()) {
|
|
40
|
+
await fs.copyFile(from, to);
|
|
41
|
+
const [srcStat, destStat] = await Promise.all([fs.stat(from), fs.stat(to)]);
|
|
42
|
+
if (srcStat.size !== destStat.size) {
|
|
43
|
+
throw new Error(`fold-planning: byte mismatch copying ${from} (${srcStat.size} != ${destStat.size})`);
|
|
44
|
+
}
|
|
45
|
+
copied += 1;
|
|
46
|
+
}
|
|
47
|
+
// Symlinks / other node types are intentionally skipped — .planning holds
|
|
48
|
+
// only regular files and dirs; a stray symlink is not worth following.
|
|
49
|
+
}
|
|
50
|
+
return copied;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Perform the fold. Safe to call repeatedly; returns `{migrated:false}` when the
|
|
54
|
+
* marker is already present or there is no `.planning/` to fold.
|
|
55
|
+
*/
|
|
56
|
+
export async function foldPlanningIntoFlow(cwd) {
|
|
57
|
+
const foldedRoot = path.join(cwd, FLOW_DIR, FOLDED_SUBDIR);
|
|
58
|
+
const markerPath = path.join(foldedRoot, MARKER);
|
|
59
|
+
// Marker guard — idempotent regardless of whether the folded dir is empty.
|
|
60
|
+
try {
|
|
61
|
+
await fs.access(markerPath);
|
|
62
|
+
return { migrated: false, skipReason: "already-migrated", filesCopied: 0, foldedRoot };
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* marker absent → proceed */
|
|
66
|
+
}
|
|
67
|
+
const source = path.join(cwd, PLANNING_DIR);
|
|
68
|
+
try {
|
|
69
|
+
const st = await fs.stat(source);
|
|
70
|
+
if (!st.isDirectory()) {
|
|
71
|
+
return { migrated: false, skipReason: "no-source", filesCopied: 0, foldedRoot };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { migrated: false, skipReason: "no-source", filesCopied: 0, foldedRoot };
|
|
76
|
+
}
|
|
77
|
+
const filesCopied = await copyTreePreserving(source, foldedRoot);
|
|
78
|
+
// Stamp the marker LAST so a crash mid-copy leaves no false "migrated" flag —
|
|
79
|
+
// the next call re-copies (copyFile overwrites, byte-assert still holds).
|
|
80
|
+
await fs.writeFile(markerPath, JSON.stringify({ migratedFrom: PLANNING_DIR, filesCopied, note: "copy-only; original left in place" }, null, 2), "utf8");
|
|
81
|
+
return { migrated: true, filesCopied, foldedRoot };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=fold-planning.js.map
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Milestone → Phase → Run hierarchy for the Product Ideal Loop.
|
|
3
|
+
*
|
|
4
|
+
* Sprint-2 Part A (full plan, item 2 of the deferred list). Built as an ADDITIVE
|
|
5
|
+
* INDEX LAYER on top of `runs/<runId>/` (per REV-3 Kill B / REV-2 Kill #7): it
|
|
6
|
+
* groups runs under phases under milestones for navigation and cross-run memory,
|
|
7
|
+
* but does NOT reroute the numeric ROADMAP phases that phase-sync depends on. A
|
|
8
|
+
* phase here simply *references* the run IDs executed under it; the run
|
|
9
|
+
* artifacts remain the source of truth for sprint/verify state.
|
|
10
|
+
*
|
|
11
|
+
* .muonroi-flow/milestones/<mid>/milestone.json ← canonical record (read)
|
|
12
|
+
* .muonroi-flow/milestones/<mid>/milestone.md ← human-reviewable render
|
|
13
|
+
* .muonroi-flow/milestones/<mid>/phases/<pid>/phase.json
|
|
14
|
+
* .muonroi-flow/milestones/<mid>/phases/<pid>/phase.md
|
|
15
|
+
*
|
|
16
|
+
* The active milestone/phase pointers live in the top-level `state.md`
|
|
17
|
+
* ("Active Milestone" / "Active Phase" sections), alongside "Active Run".
|
|
18
|
+
*
|
|
19
|
+
* Records are JSON for reliable machine reads; the paired `.md` is a rendered
|
|
20
|
+
* summary only (never parsed back). Writes are atomic. Reads are tolerant: a
|
|
21
|
+
* missing/corrupt record returns null, never throws.
|
|
22
|
+
*/
|
|
23
|
+
export interface MilestoneRecord {
|
|
24
|
+
/** Sortable slug id, e.g. "m01-native-state". */
|
|
25
|
+
id: string;
|
|
26
|
+
/** Human title. */
|
|
27
|
+
title: string;
|
|
28
|
+
/** One-line goal / outcome the milestone delivers. */
|
|
29
|
+
goal: string;
|
|
30
|
+
/** Ordinal (1-based) — mirrors the numeric prefix in the id for stable sort. */
|
|
31
|
+
ordinal: number;
|
|
32
|
+
/** lifecycle status. */
|
|
33
|
+
status: "active" | "done" | "archived";
|
|
34
|
+
/** ISO creation timestamp. */
|
|
35
|
+
createdAt: string;
|
|
36
|
+
/** ISO last-update timestamp. */
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
export interface PhaseRecord {
|
|
40
|
+
/** Sortable slug id, e.g. "p01-scoping". */
|
|
41
|
+
id: string;
|
|
42
|
+
/** Parent milestone id. */
|
|
43
|
+
milestoneId: string;
|
|
44
|
+
/** Human title. */
|
|
45
|
+
title: string;
|
|
46
|
+
/** One-line goal. */
|
|
47
|
+
goal: string;
|
|
48
|
+
/** Ordinal (1-based) within the milestone. */
|
|
49
|
+
ordinal: number;
|
|
50
|
+
/** lifecycle status. */
|
|
51
|
+
status: "active" | "done" | "archived";
|
|
52
|
+
/** Run IDs executed under this phase (the index link; runs stay canonical). */
|
|
53
|
+
runIds: string[];
|
|
54
|
+
/** ISO creation timestamp. */
|
|
55
|
+
createdAt: string;
|
|
56
|
+
/** ISO last-update timestamp. */
|
|
57
|
+
updatedAt: string;
|
|
58
|
+
}
|
|
59
|
+
export declare const MILESTONES_DIR = "milestones";
|
|
60
|
+
/** List all milestones, sorted by ordinal ascending. */
|
|
61
|
+
export declare function listMilestones(flowDir: string): Promise<MilestoneRecord[]>;
|
|
62
|
+
export declare function loadMilestone(flowDir: string, milestoneId: string): Promise<MilestoneRecord | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Create a milestone. `nowIso` is injected (never Date.now here) so callers
|
|
65
|
+
* control the clock and tests stay deterministic. Ordinal is next-highest+1.
|
|
66
|
+
*/
|
|
67
|
+
export declare function createMilestone(flowDir: string, input: {
|
|
68
|
+
title: string;
|
|
69
|
+
goal?: string;
|
|
70
|
+
}, nowIso: string): Promise<MilestoneRecord>;
|
|
71
|
+
export declare function updateMilestone(flowDir: string, milestoneId: string, patch: Partial<Pick<MilestoneRecord, "title" | "goal" | "status">>, nowIso: string): Promise<MilestoneRecord | null>;
|
|
72
|
+
/** List phases under a milestone, sorted by ordinal ascending. */
|
|
73
|
+
export declare function listPhases(flowDir: string, milestoneId: string): Promise<PhaseRecord[]>;
|
|
74
|
+
export declare function loadPhase(flowDir: string, milestoneId: string, phaseId: string): Promise<PhaseRecord | null>;
|
|
75
|
+
export declare function createPhase(flowDir: string, milestoneId: string, input: {
|
|
76
|
+
title: string;
|
|
77
|
+
goal?: string;
|
|
78
|
+
runId?: string;
|
|
79
|
+
}, nowIso: string): Promise<PhaseRecord>;
|
|
80
|
+
export declare function updatePhase(flowDir: string, milestoneId: string, phaseId: string, patch: Partial<Pick<PhaseRecord, "title" | "goal" | "status">>, nowIso: string): Promise<PhaseRecord | null>;
|
|
81
|
+
/** Link a run to a phase (idempotent — no duplicate run ids). */
|
|
82
|
+
export declare function attachRunToPhase(flowDir: string, milestoneId: string, phaseId: string, runId: string, nowIso: string): Promise<PhaseRecord | null>;
|
|
83
|
+
/**
|
|
84
|
+
* Find the milestone+phase a run is already indexed under, scanning every
|
|
85
|
+
* milestone. Returns null when the run is not yet linked anywhere. Used to keep
|
|
86
|
+
* scoping wiring idempotent across `/ideal resume` (the scoping stage re-runs).
|
|
87
|
+
*/
|
|
88
|
+
export declare function findPhaseForRun(flowDir: string, runId: string): Promise<{
|
|
89
|
+
milestoneId: string;
|
|
90
|
+
phaseId: string;
|
|
91
|
+
} | null>;
|
|
92
|
+
/**
|
|
93
|
+
* Idempotently place a run in the hierarchy and mark it active. First call for a
|
|
94
|
+
* run creates (or reuses the active) milestone, opens a phase for the run, links
|
|
95
|
+
* it, and points the active-milestone/active-phase pointers at it. Subsequent
|
|
96
|
+
* calls (resume) are no-ops that just re-assert the pointers.
|
|
97
|
+
*
|
|
98
|
+
* The milestone groups an idea/product; the phase is one scoped iteration under
|
|
99
|
+
* it. This is purely an INDEX over `runs/<runId>/` — it never moves or rewrites
|
|
100
|
+
* run artifacts, and the numeric ROADMAP phases that phase-sync reads are
|
|
101
|
+
* untouched.
|
|
102
|
+
*/
|
|
103
|
+
export declare function ensureRunScoped(flowDir: string, input: {
|
|
104
|
+
runId: string;
|
|
105
|
+
milestoneTitle: string;
|
|
106
|
+
milestoneGoal?: string;
|
|
107
|
+
phaseTitle: string;
|
|
108
|
+
phaseGoal?: string;
|
|
109
|
+
}, nowIso: string): Promise<{
|
|
110
|
+
milestoneId: string;
|
|
111
|
+
phaseId: string;
|
|
112
|
+
}>;
|
|
113
|
+
/**
|
|
114
|
+
* One-time backfill: index any `runs/<id>/` not yet linked to a phase under a
|
|
115
|
+
* synthetic `m00-legacy` milestone (one phase per orphan run). Idempotent — runs
|
|
116
|
+
* already indexed are skipped, and re-running adds only newly-orphaned runs.
|
|
117
|
+
* Returns the number of runs newly indexed.
|
|
118
|
+
*
|
|
119
|
+
* `m00` (ordinal 0) sorts before any real milestone so legacy work stays visible
|
|
120
|
+
* but out of the way. The clock is injected for deterministic tests.
|
|
121
|
+
*/
|
|
122
|
+
export declare function migrateLegacyRuns(flowDir: string, nowIso: string): Promise<number>;
|
|
123
|
+
export interface ActivePointer {
|
|
124
|
+
milestoneId: string | null;
|
|
125
|
+
phaseId: string | null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* F8 — the active milestone/phase are DERIVED from the single canonical focus,
|
|
129
|
+
* the active run, via the hierarchy index; they are NOT separately persisted.
|
|
130
|
+
*
|
|
131
|
+
* Previously `state.md` carried independent `Active Run` (set for chat-runs) and
|
|
132
|
+
* `Active Milestone`/`Active Phase` (set by `ensureRunScoped` for product-runs)
|
|
133
|
+
* pointers that routinely drifted out of sync — `/ideal` never updated `Active
|
|
134
|
+
* Run`, so it pointed at a stale skeleton run while the milestone/phase pointed
|
|
135
|
+
* at the product run. Council decision (5/5): collapse to one truth. Whatever run
|
|
136
|
+
* is active, its phase (and that phase's milestone) is the active one; a
|
|
137
|
+
* chat/skeleton run that was never indexed resolves to nulls.
|
|
138
|
+
*/
|
|
139
|
+
export declare function getActivePointer(flowDir: string): Promise<ActivePointer>;
|
|
140
|
+
/**
|
|
141
|
+
* Blank the legacy `Active Milestone`/`Active Phase` sections if an old
|
|
142
|
+
* `state.md` still carries them, so a stale value can never be mistaken for the
|
|
143
|
+
* (now derived) truth. One-time, idempotent; no-op when the sections are absent
|
|
144
|
+
* or already empty. Legacy files are otherwise read-as-junk — never migrated.
|
|
145
|
+
*/
|
|
146
|
+
export declare function clearLegacyActivePointerSections(flowDir: string): Promise<void>;
|