@joekytc/dsh-swarm 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/client/BoardCard.tsx +24 -2
- package/client/ConfigSection.tsx +71 -0
- package/client/ConfigSelect.tsx +69 -0
- package/client/KanbanBoard.tsx +3 -0
- package/client/KanbanTab.tsx +4 -3
- package/client/TaskDrawer.tsx +2 -26
- package/client/WorkflowRail.tsx +3 -1
- package/client/config-store.ts +51 -0
- package/client/config.css +110 -0
- package/client/index.ts +39 -4
- package/client/kanban.css +19 -2
- package/client/session-bridge.ts +39 -0
- package/client/timeline-model.ts +10 -1
- package/client/workflow-model.ts +3 -1
- package/lib/client.js +358 -53
- package/lib/config.d.ts +8 -1
- package/lib/config.js +6 -1
- package/lib/dispatcher/agent-runner.d.ts +28 -6
- package/lib/dispatcher/agent-runner.js +175 -62
- package/lib/dispatcher/chain-auditor.js +4 -1
- package/lib/dispatcher/dispatcher.d.ts +62 -3
- package/lib/dispatcher/dispatcher.js +243 -20
- package/lib/dispatcher/session-events.d.ts +11 -15
- package/lib/dispatcher/session-events.js +17 -5
- package/lib/dispatcher/v-orchestrator.d.ts +42 -9
- package/lib/dispatcher/v-orchestrator.js +236 -28
- package/lib/domain/config-override.d.ts +38 -0
- package/lib/domain/config-override.js +101 -0
- package/lib/domain/delivery-contract.d.ts +3 -2
- package/lib/domain/delivery-contract.js +28 -16
- package/lib/domain/gate-policy.d.ts +26 -0
- package/lib/domain/gate-policy.js +44 -0
- package/lib/domain/kanban-service.d.ts +16 -3
- package/lib/domain/kanban-service.js +41 -6
- package/lib/domain/permissions.js +1 -1
- package/lib/domain/planning-checklist.d.ts +5 -0
- package/lib/domain/planning-checklist.js +80 -6
- package/lib/domain/projection.js +2 -1
- package/lib/domain/review-evidence.js +1 -1
- package/lib/domain/state-machine.js +2 -1
- package/lib/domain/types.d.ts +2 -2
- package/lib/index.js +19 -21
- package/lib/roles/clean-fs-tools.d.ts +22 -0
- package/lib/roles/clean-fs-tools.js +118 -0
- package/lib/roles/skill-installer.d.ts +6 -0
- package/lib/roles/skill-installer.js +32 -0
- package/lib/roles/toolsets.d.ts +13 -1
- package/lib/roles/toolsets.js +163 -31
- package/lib/roles/wiki-worker.d.ts +1 -0
- package/lib/roles/wiki-worker.js +10 -2
- package/lib/routes/kanban-http.d.ts +5 -2
- package/lib/routes/kanban-http.js +36 -3
- package/lib/routes/planning-driver.d.ts +3 -1
- package/lib/routes/planning-driver.js +10 -6
- package/lib/routes/prefix-router.d.ts +16 -0
- package/lib/routes/prefix-router.js +37 -2
- package/lib/services/config-provider.d.ts +42 -0
- package/lib/services/config-provider.js +94 -0
- package/lib/services/gate-runner.d.ts +24 -0
- package/lib/services/gate-runner.js +87 -0
- package/lib/services/kanban-provider.d.ts +5 -1
- package/lib/services/kanban-provider.js +40 -2
- package/lib/services/llm-catalog.d.ts +35 -0
- package/lib/services/llm-catalog.js +19 -0
- package/lib/tools/kanban-tools.js +1 -0
- package/lib/tools/main-session-tools.d.ts +17 -2
- package/lib/tools/main-session-tools.js +88 -21
- package/lib/tools/planning-tools.d.ts +4 -0
- package/lib/tools/planning-tools.js +39 -12
- package/lib/tools/prefetch-tools.js +1 -0
- package/lib/tools/spec-card-tools.js +1 -0
- package/lib/tools/wiki-tools.js +5 -4
- package/lib/wiki/kb-linkage.d.ts +9 -2
- package/lib/wiki/kb-linkage.js +3 -3
- package/lib/wiki/local-kb-client.d.ts +14 -0
- package/lib/wiki/local-kb-client.js +101 -0
- package/lib/wiki/local-kb.d.ts +6 -0
- package/lib/wiki/local-kb.js +25 -0
- package/lib/wiki/memory-recall.d.ts +14 -6
- package/lib/wiki/memory-recall.js +17 -13
- package/lib/wiki/page-path.d.ts +9 -3
- package/lib/wiki/page-path.js +29 -11
- package/lib/wiki/wiki-vault-client.d.ts +3 -3
- package/lib/wiki/wiki-vault-client.js +6 -6
- package/package.json +16 -11
- package/personas/kanban-d/preset.yml +1 -1
- package/personas/kanban-dt/agent.cordis.yml +2 -2
- package/personas/kanban-dt/preset.yml +1 -1
- package/personas/kanban-p/agent.cordis.yml +16 -0
- package/personas/kanban-p/preset.yml +1 -1
- package/personas/kanban-pt/agent.cordis.yml +38 -8
- package/personas/kanban-pt/preset.yml +1 -1
- package/personas/kanban-w/agent.cordis.yml +35 -16
- package/personas/kanban-w/preset.yml +1 -1
- package/personas/persona-dt.md +1 -1
- package/personas/persona-p.md +4 -1
- package/personas/persona-pt.md +13 -6
- package/personas/persona-w.md +11 -9
- package/skills/grill-me/SKILL.md +71 -0
- package/skills/llm-wiki-skill/.mise.toml +2 -0
- package/skills/llm-wiki-skill/.nvmrc +1 -0
- package/skills/llm-wiki-skill/AGENTS.md +173 -0
- package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
- package/skills/llm-wiki-skill/CLAUDE.md +152 -0
- package/skills/llm-wiki-skill/HERMES.md +44 -0
- package/skills/llm-wiki-skill/README.en.md +261 -0
- package/skills/llm-wiki-skill/README.md +291 -0
- package/skills/llm-wiki-skill/SKILL.md +1133 -0
- package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
- package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
- package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
- package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
- package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
- package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
- package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
- package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
- package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
- package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
- package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
- package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
- package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
- package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
- package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
- package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
- package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
- package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
- package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
- package/skills/llm-wiki-skill/install.ps1 +87 -0
- package/skills/llm-wiki-skill/install.sh +722 -0
- package/skills/llm-wiki-skill/package-lock.json +11171 -0
- package/skills/llm-wiki-skill/package.json +24 -0
- package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
- package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
- package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
- package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
- package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
- package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
- package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
- package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
- package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
- package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
- package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
- package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
- package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
- package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
- package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
- package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
- package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
- package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
- package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
- package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
- package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
- package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
- package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
- package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
- package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
- package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
- package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
- package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
- package/skills/llm-wiki-skill/setup.sh +8 -0
- package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
- package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
- package/skills/llm-wiki-skill/templates/index-template.md +51 -0
- package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
- package/skills/llm-wiki-skill/templates/log-template.md +11 -0
- package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
- package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
- package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
- package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
- package/skills/llm-wiki-skill/templates/query-template.md +19 -0
- package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
- package/skills/llm-wiki-skill/templates/source-template.md +51 -0
- package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
- package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
- package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
- package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
- package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
- package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
- package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
- package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
- package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
- package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
- package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
- package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
- package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
- package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
- package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
- package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
- package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
- package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
- package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
- package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
- package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
- package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
- package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
- package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
- package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
- package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
- package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
- package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
- package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
- package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
- package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
- package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
- package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
- package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
- package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
- package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
- package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
- package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
- package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
- package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
- package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
- package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
- package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
- package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
- package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
- package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
- package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
- package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
- package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
- package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
- package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
- package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
- package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
- package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
- package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
- package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
- package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
- package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
- package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
- package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
- package/skills/llm-wiki-skill/workbench/README.md +30 -0
- package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
- package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
- package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
- package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
- package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
- package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
- package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
- package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
- package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
- package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
- package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
- package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
- package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
- package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
- package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
- package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
- package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
- package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
- package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
- package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
- package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
- package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
- package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
- package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
- package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
- package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
- package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
- package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
- package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
- package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
- package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
- package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
- package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
- package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
- package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
- package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
- package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
- package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
- package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
- package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
- package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
- package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
- package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
- package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
- package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
- package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
- package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
- package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
- package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
- package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
- package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
- package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
- package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
- package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
- package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
- package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
- package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
- package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
- package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
- package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
- package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { installRoleTools } from '../roles/toolsets.js';
|
|
2
2
|
import { resolveTaskParents } from '../domain/task-parents.js';
|
|
3
3
|
import { missingParentDelivery } from '../domain/delivery-contract.js';
|
|
4
|
-
import {
|
|
4
|
+
import { buildRepoSlug } from '../domain/memory.js';
|
|
5
|
+
import { toolArgs, toolName, replayModel } from './session-events.js';
|
|
5
6
|
import { buildModelCandidates, isModelUnavailableError } from './model-candidates.js';
|
|
6
7
|
import { attachSessionToWorkspace, resolveOrCreateWorkspace } from './workspace-attach.js';
|
|
7
8
|
export const R20_PHASE_ORDER = ['p', 'pt', 'w2', 'd', 'dt', 'w3', 'summary'];
|
|
@@ -23,6 +24,8 @@ export const PHASE_INSTRUCTIONS = {
|
|
|
23
24
|
'## P 阶段任务体要求(计划者,非执行者)',
|
|
24
25
|
'body 写入规划指令:读规格卡(含 file-prefetch/kb 附件=需求澄清清单)→ 产出 openspec 实施计划。仓库事实不足时先只读自查仓库代码实证(fs/search/grep 均可),再产出计划。',
|
|
25
26
|
'产物路径(OpenSpec 规范):写入目标仓库 `openspec/changes/<change_name>/` 下 proposal.md / design.md / tasks.md(change_name 依规格自拟 kebab-case,如 autoNote-tab);complete 时 metadata.artifacts_path = 该目录绝对路径。',
|
|
27
|
+
'tasks.md 拆分粒度(结构准备度,与 PT 同一判据):每个任务条目必须有单一、可独立核对的完成判据;禁止一条任务/一条测试用例混 N≥2 个互不依赖的可观察结果——按可独立验证的行为逐条拆分。',
|
|
28
|
+
'proposal.md 必须含「上游协议遵循说明」节:逐条列规格卡/澄清清单声明的工程协议引用(可定位出处:路径/明确协议名)+ 计划如何遵守;未声明任何协议则该节写「无」。禁止引用规格卡之外的协议标准。',
|
|
26
29
|
'铁律:P 是计划者,绝不执行任何 git/worktree/commit/push、不改源码/README、不跑构建部署——执行是 D 的职责;只读自查仅限读仓库,写边界仅限 openspec/changes/ 目录(会话工具级硬护栏强制,其余一律只读)。',
|
|
27
30
|
'complete 时 metadata 必须带 schema 合法的 pt_decision = { needed: boolean, reason?: string }(needed=true 时 reason 必填)。按下列复杂度清单判定(逐条勾选,禁止"感觉"):',
|
|
28
31
|
' needed=true(需 PT 计划评审),满足任一条:① 跨 ≥2 模块/目录,或改动公共接口/共享类型/配置文件;② 破坏性变更(对外 API、数据格式、迁移、兼容性);③ impl_decisions 含 ≥2 个互斥方案需仲裁;④ tasks ≥8 条,或含新增/重写核心模块;⑤ 涉安全/权限/并发/数据迁移等高风险面;⑥ OpenSpec change 中 specs/ 模块的 spec.md 文件数 ≥3。',
|
|
@@ -31,12 +34,15 @@ export const PHASE_INSTRUCTIONS = {
|
|
|
31
34
|
].join('\n'),
|
|
32
35
|
pt: [
|
|
33
36
|
'## PT 阶段任务体要求(计划评审,只读)',
|
|
34
|
-
'body 写入计划评审指令:P 已判定需要计划评审(理由见上)。只读评审 P
|
|
37
|
+
'body 写入计划评审指令:P 已判定需要计划评审(理由见上)。只读评审 P 的计划产物,按五要素核对:需求对齐(澄清清单条目↔任务双向映射,不遗漏不超纲)/完整性/逻辑交互一致性/结构准备度(每任务条目单一、可独立核对的完成判据;混 N≥2 个互不依赖的可观察结果=混行为须拆分)/工程协议一致性(只对账 proposal「上游协议遵循说明」节,未声明协议不得自行引入)。输出 verdict+issues 入交接 metadata.review_evidence。',
|
|
38
|
+
'issues 四要素缺一无效:location(哪条任务/哪节)+ 依据(上游声明引用或计划内部矛盾点)+ 问题 + 可执行建议;pass 时 issues 只放非阻塞建议。',
|
|
39
|
+
'返工复审:body 含「上一轮评审未通过 issues」节时必须先逐条三态对账(已修复/未修复/部分修复),未修复旧 issue 原样沿用,再提新问题。',
|
|
40
|
+
'评审闸硬要求(必须写入 body):complete 时 handoff metadata 顶层必须带 artifacts_path=<被评审计划的 openspec 目录绝对路径,直接继承被评审 P 卡 handoff 里的 artifacts_path 值>,或在 review_evidence 里给 reviewPage;review_evidence 形状不变({ verdict, issues, ...reviewPage 可选 })——两者都缺时评审闸拒绝 pass。',
|
|
35
41
|
'铁律:PT 是只读评审角色,绝不修改任何产物/源码;不调用 kanban_create、不执行代码。',
|
|
36
42
|
].join('\n'),
|
|
37
43
|
w2: [
|
|
38
44
|
'## W2 阶段任务体要求(KB 同步)',
|
|
39
|
-
'body 写入 KB 同步指令:读父任务交接(P 产物路径)→ wiki_write
|
|
45
|
+
'body 写入 KB 同步指令:读父任务交接(P 产物路径)→ wiki_write 同步为项目页(pagePath 必须逐字等于下方「KB 页路径规则」给出的路径)→ complete(kb_url, page_path)。禁止任何 git/代码操作。',
|
|
40
46
|
].join('\n'),
|
|
41
47
|
d: [
|
|
42
48
|
'## D 阶段任务体要求(执行者,唯一,非只读对齐/校验)',
|
|
@@ -44,8 +50,10 @@ export const PHASE_INSTRUCTIONS = {
|
|
|
44
50
|
'body 第一行以 TARGET_REPO=<真实仓库绝对路径> 声明目标仓库:必须取自规格卡 file-prefetch 附件 ref,禁止写 kanban 存储目录、禁止猜测回退。',
|
|
45
51
|
'body 同时声明 TARGET_BRANCH=<目标分支名>(来自规格卡/用户声明):D 在 worktree feature 分支完成实现并验证后即 complete,禁止合并回 TARGET_BRANCH、禁止推 TARGET_BRANCH——合入由 DT 通过后 system 统一执行。',
|
|
46
52
|
'complete 时 metadata 必须带 branch=<feature 分支名>(DT 评审与 system 合入定位该分支用);git 证据 changed_files + commit_hash 必须(push 可选,可推 feature 分支)。',
|
|
53
|
+
'complete 时 metadata 建议携带 worktree_dir=<你的 feature worktree 绝对路径>:系统将在该目录实测 tdd.test_files(npx vitest run);缺失则跳过实测(仅声明校验)。',
|
|
47
54
|
'禁止把 D 任务体写成"只读对齐/校验/审核"类措辞——D 是唯一执行者,必须实际改代码并提交推送。',
|
|
48
55
|
'TDD 硬要求:JS/TS/JSX/Vue 项目测试固定用 vitest(`npx vitest run`),先写测试(RED)再实现(GREEN),测试可与实现同提交但须不晚于实现进入 git 历史(DT 用 `git log --reverse` 核验);complete 时 metadata 必须带 tdd = { test_files: [...], test_first: bool };纯文档/配置变更则带 tdd = { skipped: { reason } }。',
|
|
56
|
+
'上下文含「评审遗留建议」节时:把该节原文完整复制进 D 卡 body 末尾「评审遗留建议」节(不得删改、不得省略);上下文无该节则 body 不含该节。',
|
|
49
57
|
].join('\n'),
|
|
50
58
|
dt: [
|
|
51
59
|
'## DT 阶段任务体要求(实现校验+评审,只读护栏)',
|
|
@@ -54,15 +62,54 @@ export const PHASE_INSTRUCTIONS = {
|
|
|
54
62
|
].join('\n'),
|
|
55
63
|
w3: [
|
|
56
64
|
'## W3 阶段任务体要求(KB 收尾同步)',
|
|
57
|
-
'body 写入 KB 收尾同步指令:读 D 交接 → wiki_write
|
|
65
|
+
'body 写入 KB 收尾同步指令:读 D 交接 → wiki_write 同步(pagePath 必须逐字等于下方「KB 页路径规则」给出的路径)→ complete(kb_url)。禁止任何 git/代码操作。',
|
|
58
66
|
].join('\n'),
|
|
59
67
|
};
|
|
68
|
+
/** D9(W 角色知识库双模式):按 kbMode 构建各阶段建卡 body 指令(phase 键控——W2/W3 同为
|
|
69
|
+
* assignee='w'+mode='kb',assignee+mode 签名无法区分两相文案;系统状态本就按 phase 键控)。
|
|
70
|
+
* remote → PHASE_INSTRUCTIONS 原文(护栏测试零改动前提);local → 覆盖 w2/w3/d/dt 四相
|
|
71
|
+
* (skill 工具加载 llm-wiki + 本地库 fs 读写,禁 wiki_write/wiki_read),p/pt/summary 原样回落。
|
|
72
|
+
* ctx.taskId 给出则插值确切页路径,缺省用占位符(建卡时 taskId 尚不存在,消费点传 undefined)。 */
|
|
73
|
+
export function buildPhaseInstruction(phase, ctx, kbMode) {
|
|
74
|
+
if (kbMode !== 'local')
|
|
75
|
+
return PHASE_INSTRUCTIONS[phase] ?? '';
|
|
76
|
+
const pagePath = `wiki/sources/${ctx.chainId}/${ctx.taskId ?? 't_<你的任务ID>'}.md`;
|
|
77
|
+
switch (phase) {
|
|
78
|
+
case 'w2':
|
|
79
|
+
return `读父任务交接(P 产物路径)→ 经 skill 工具加载 llm-wiki,将实施计划写入本地库 ${pagePath} → complete(kb_url="", page_path=<库根下相对路径>)。禁止任何 git/代码操作。`;
|
|
80
|
+
case 'w3':
|
|
81
|
+
return `读 D 交接 → 经 skill 工具加载 llm-wiki,将执行结果同步至本地库 ${pagePath} → complete(kb_url="", page_path=...)。禁止任何 git/代码操作。`;
|
|
82
|
+
case 'd':
|
|
83
|
+
return '先读父任务交接(W2)里的 page_path(本地库 wiki/sources/ 下相对路径,库根见运行时上下文注入——Task 8 已注入 D),直接 fs 读实施计划原文;如需 KB 经验召回,经 skill 工具加载 llm-wiki query(本地库;kanban-d preset 已挂 tool-skill)——再按计划执行规格卡 solution/testing —— git worktree/branch → 改代码/README → git commit → git push(仅 feature 分支,可选)→ 自检并附产物证据(changed_files/commit_hash)。其余 TDD/TARGET_REPO/TARGET_BRANCH 等要求与 remote 版一致。';
|
|
84
|
+
case 'dt':
|
|
85
|
+
return `对 D 产物实证校验(test/build/typecheck/diff/git 证据 + open-code-review 评审),输出 verdict+issues 入交接 metadata.review_evidence。评审页经 fs 写本地库 <库根>/wiki/queries/${ctx.chainId}/review/<name>.md(库根见运行时上下文注入——Task 8 已注入 DT);库根外一律只读,其余铁律与 remote 版一致。`;
|
|
86
|
+
default:
|
|
87
|
+
return PHASE_INSTRUCTIONS[phase] ?? '';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
60
90
|
/** 提取 P 交接里 pt_decision 的 reason(PT 阶段注入 V context,供 PT 卡 body 引用评审理由)。 */
|
|
61
91
|
function extractPtReason(state, chainId) {
|
|
62
92
|
const pTask = [...state.tasks.values()].find((t) => t.chainId === chainId && t.assignee === 'p' && t.mode === 'openspec');
|
|
63
93
|
const d = (pTask ? state.handoffs.get(pTask.id)?.metadata?.['pt_decision'] : undefined);
|
|
64
94
|
return typeof d?.reason === 'string' ? d.reason : '';
|
|
65
95
|
}
|
|
96
|
+
/** 评审 issues 统一格式化(对账/遗留建议注入用):`- [severity] title — detail(location)`。 */
|
|
97
|
+
function formatIssues(issues) {
|
|
98
|
+
return issues
|
|
99
|
+
.map((i) => `- [${i.severity ?? 'info'}] ${i.title ?? ''} — ${i.detail ?? ''}${i.location ? `(${i.location})` : ''}`)
|
|
100
|
+
.join('\n');
|
|
101
|
+
}
|
|
102
|
+
/** 最近一次 PT review/passed 的 issues(pass 时即非阻塞建议留档):建 D 卡时注入「评审遗留建议」。
|
|
103
|
+
* 取事件 payload.evidence(recordReview 落盘),按 reviewTaskId 回查任务确认 pt/review-plan 归属。 */
|
|
104
|
+
function extractPtPassSuggestions(state, chainId) {
|
|
105
|
+
const passed = [...state.events]
|
|
106
|
+
.filter((e) => e.kind === 'review/passed')
|
|
107
|
+
.map((e) => ({ e, rt: state.tasks.get(String(e.payload['reviewTaskId'] ?? '')) }))
|
|
108
|
+
.filter(({ rt }) => !!rt && rt.chainId === chainId && rt.assignee === 'pt' && rt.mode === 'review-plan')
|
|
109
|
+
.at(-1);
|
|
110
|
+
const ev = passed?.e.payload['evidence'];
|
|
111
|
+
return Array.isArray(ev?.issues) ? ev.issues : [];
|
|
112
|
+
}
|
|
66
113
|
/** 仅评审卡:archived 且从未处理过 verdict = 作废(void)。human 归档评审卡即作废,编排器视其不存在。
|
|
67
114
|
* 非评审卡(p/d/w…)一律返回 false——避免 B6 误判"该阶段无卡"而重复建卡。 */
|
|
68
115
|
const REVIEW_MODES = ['review-plan', 'review-impl'];
|
|
@@ -73,15 +120,27 @@ function isVoidReview(task, events) {
|
|
|
73
120
|
return false; // 非评审卡不判 void
|
|
74
121
|
return !events.some((e) => e.taskId === task.id && (e.kind === 'review/passed' || e.kind === 'review/failed' || e.kind === 'review/gave-up'));
|
|
75
122
|
}
|
|
123
|
+
/** Task 4(V 会话注入加固):V 会话身份标记——setup 完整成功(kanban-v preset mount + 角色工具面)后
|
|
124
|
+
* 写入,live 复用前校验。与 agent-runner.ts roleCompositions 同款机制(进程内 WeakMap 按 incarnation
|
|
125
|
+
* 键控:GUI 重开同名会话/宿主自建 incarnation 查不到标记 → 拒绝盲复用;实例回收标记随 GC 消失)。
|
|
126
|
+
* 不直接复用其 WeakMap:其 marker 结构 {role,taskId} 面向任务会话(V 无 taskId),读取端未导出,
|
|
127
|
+
* 导出需改 agent-runner.ts(本任务硬约束禁止)。 */
|
|
128
|
+
const vSessionCompositions = new WeakMap();
|
|
129
|
+
const V_SESSION_PRESET_ID = 'kanban-v';
|
|
130
|
+
/** 宿主形态防御:dsh 0.1.2-rc.1 移除 Session.events(DSH-0.1.2-A4-03)→ 优先 snapshotEvents();
|
|
131
|
+
* 旧宿主/测试回退 events;两者皆无 = 缺事件=零产出语义(stall 计数),不崩。 */
|
|
132
|
+
function sessionEventsOf(agent) {
|
|
133
|
+
return agent.session?.snapshotEvents?.() ?? agent.session?.events ?? [];
|
|
134
|
+
}
|
|
76
135
|
export class VOrchestrator {
|
|
77
136
|
ctx;
|
|
78
137
|
kanban;
|
|
79
138
|
agents;
|
|
80
|
-
|
|
139
|
+
configProvider;
|
|
81
140
|
orchestrations;
|
|
82
141
|
wiki;
|
|
83
142
|
defaultModel;
|
|
84
|
-
constructor(ctx, kanban, agents,
|
|
143
|
+
constructor(ctx, kanban, agents, configProvider, orchestrations, wiki, defaultModel) { this.ctx = ctx; this.kanban = kanban; this.agents = agents; this.configProvider = configProvider; this.orchestrations = orchestrations; this.wiki = wiki; this.defaultModel = defaultModel; }
|
|
85
144
|
currentPhase(chainId) {
|
|
86
145
|
let o = this.orchestrations.get(chainId);
|
|
87
146
|
if (!o) {
|
|
@@ -90,7 +149,67 @@ export class VOrchestrator {
|
|
|
90
149
|
}
|
|
91
150
|
return o;
|
|
92
151
|
}
|
|
152
|
+
/** Fix D:stall 自动再唤醒上限(同一阶段连续零产出 → 自动重试 ≤3 次,间隔递增)后放弃并显形。 */
|
|
153
|
+
static STALL_REWAKE_LIMIT = 3;
|
|
154
|
+
/** Fix D:stall 再唤醒基础延迟(按 stallCount 倍增:5s/10s/15s),给瞬时故障/采样波动恢复窗口。 */
|
|
155
|
+
static STALL_REWAKE_DELAY_MS = 5_000;
|
|
156
|
+
rewakeTimers = new Map();
|
|
157
|
+
/** 同链 wakeV 并发防护:在途时后续唤醒合并为 pending,完成后补跑一次(事件不丢)。 */
|
|
158
|
+
waking = new Set();
|
|
159
|
+
pendingWake = new Set();
|
|
160
|
+
/** Fix D:orchestration 变更回调(dispatcher 注入 saveOrchs)——stall re-wake 路径绕过
|
|
161
|
+
* EventWaker,其 stallCount/phase 变化需自行落盘,防重启丢重试进度。 */
|
|
162
|
+
onOrchChange;
|
|
93
163
|
async wakeV(chainId) {
|
|
164
|
+
if (this.waking.has(chainId)) {
|
|
165
|
+
this.pendingWake.add(chainId);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.waking.add(chainId);
|
|
169
|
+
try {
|
|
170
|
+
await this.wakeVInner(chainId);
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
this.waking.delete(chainId);
|
|
174
|
+
if (this.pendingWake.delete(chainId)) {
|
|
175
|
+
queueMicrotask(() => { this.wakeV(chainId).catch(() => { }); });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** Fix D:stall 自动再唤醒(≤3 次)。同链 pending 幂等;建卡成功(stallCount=0)后到期的
|
|
180
|
+
* re-wake 自动作废(回调内按 stallCount 判空跳过)。 */
|
|
181
|
+
scheduleRewake(chainId, stallCount) {
|
|
182
|
+
if (this.rewakeTimers.has(chainId))
|
|
183
|
+
return;
|
|
184
|
+
const delay = VOrchestrator.STALL_REWAKE_DELAY_MS * stallCount;
|
|
185
|
+
const timer = setTimeout(() => {
|
|
186
|
+
this.rewakeTimers.delete(chainId);
|
|
187
|
+
const orch = this.orchestrations.get(chainId);
|
|
188
|
+
if (!orch || (orch.stallCount ?? 0) === 0)
|
|
189
|
+
return; // 已建卡成功 → 作废
|
|
190
|
+
this.wakeV(chainId).catch((err) => console.error('[dsh-swarm][debug] stall re-wake failed chain=' + chainId + ': ' + String(err)));
|
|
191
|
+
}, delay);
|
|
192
|
+
this.rewakeTimers.set(chainId, timer);
|
|
193
|
+
}
|
|
194
|
+
/** Fix D:清理待触发的 re-wake 定时器(插件 dispose 时调用)。 */
|
|
195
|
+
dispose() {
|
|
196
|
+
for (const t of this.rewakeTimers.values())
|
|
197
|
+
clearTimeout(t);
|
|
198
|
+
this.rewakeTimers.clear();
|
|
199
|
+
}
|
|
200
|
+
/** 链级看门狗(Dispatcher,防线①)探针:编排 entry;无 entry 返回 null。 */
|
|
201
|
+
orchestrationOf(chainId) {
|
|
202
|
+
return this.orchestrations.get(chainId) ?? null;
|
|
203
|
+
}
|
|
204
|
+
/** 链级看门狗探针:该链是否有在途唤醒 / 待补跑唤醒 / 待触发再唤醒——任一为真视为「有人在管」。 */
|
|
205
|
+
isWakeInFlight(chainId) {
|
|
206
|
+
return this.waking.has(chainId) || this.pendingWake.has(chainId) || this.rewakeTimers.has(chainId);
|
|
207
|
+
}
|
|
208
|
+
/** 链级看门狗重唤醒入口(Dispatcher 防线①):复用 wakeV(同链并发合并/补跑幂等内建)。 */
|
|
209
|
+
wake(chainId) {
|
|
210
|
+
return this.wakeV(chainId);
|
|
211
|
+
}
|
|
212
|
+
async wakeVInner(chainId) {
|
|
94
213
|
const orch = this.currentPhase(chainId);
|
|
95
214
|
if (orch.phase === 'summary')
|
|
96
215
|
return; // 链完成由 completeTask 机械规则产生
|
|
@@ -99,7 +218,7 @@ export class VOrchestrator {
|
|
|
99
218
|
if (!chain)
|
|
100
219
|
throw new Error('unknown chain: ' + chainId);
|
|
101
220
|
const specCard = chain.specCardId ? state.specCards.get(chain.specCardId) : null;
|
|
102
|
-
if (chain.status === 'completed' || chain.status === 'aborted')
|
|
221
|
+
if (chain.status === 'completed' || chain.status === 'aborted' || chain.status === 'blocked')
|
|
103
222
|
return;
|
|
104
223
|
// 阻塞复核 pass(全量阻塞恢复):链上有 status=blocked 且尚无 [blocked-review] 复核评论的任务
|
|
105
224
|
// → 向 V 发一轮阻塞复核(本轮 V 唯一动作),V 用 kanban_comment 以 [blocked-review] 开头逐一
|
|
@@ -225,7 +344,9 @@ export class VOrchestrator {
|
|
|
225
344
|
// 交付契约闸已对所有 actor(含 human 强制收尾)在完成时拦截(缺交付物会先被标 blocked,
|
|
226
345
|
// 不会被 resolve 成父卡),故此处仅剩 legacy(改闸前已落盘的 done-but-missing)。done 不可变、
|
|
227
346
|
// 不能重标 blocked,发 system 评论记录断裂并停住:不建下游卡、不推进 phase,避免拖到下游执行时才报错。
|
|
228
|
-
|
|
347
|
+
// D9:透传当前 baseUrl(local 模式为 '' → strict local 分支认可 kb_url="" 交付);
|
|
348
|
+
// wikiVault?. 防护测试 stub(getEffective() 返回 {} 时回退 undefined=宽松,行为同旧)。
|
|
349
|
+
const missingParents = missingParentDelivery(state, parents, this.configProvider.getEffective().wikiVault?.baseUrl);
|
|
229
350
|
if (missingParents.length > 0) {
|
|
230
351
|
for (const mp of missingParents) {
|
|
231
352
|
await this.kanban.comment(mp.taskId, `[delivery-required] 上游 ${mp.assignee}/${mp.mode} 缺关键交付物:${mp.missing.join(', ')},下游 ${expect.assignee}/${expect.mode} 卡未创建,请补交交付物或人工处理。`, 'system');
|
|
@@ -234,6 +355,11 @@ export class VOrchestrator {
|
|
|
234
355
|
}
|
|
235
356
|
// PT 阶段注入 P 判定需要计划评审的理由(供 V 写入 PT 卡 body 引用评审上下文)
|
|
236
357
|
const ptReason = orch.phase === 'pt' ? extractPtReason(state, chainId) : '';
|
|
358
|
+
// 2026-09-03 P/PT 定位决议:D 卡创建上下文注入 PT pass 留档的非阻塞建议(评审遗留建议随卡传递)。
|
|
359
|
+
const ptSuggestions = orch.phase === 'd' ? extractPtPassSuggestions(state, chainId) : [];
|
|
360
|
+
// Task 7:KB 页路径规则(W2/W3 wiki_write pagePath 确定性下发)——repoSlug 由链 workspaceDir 派生,
|
|
361
|
+
// V 不需计算,直接把路径模板写入建卡 context;链无 workspaceDir 时注入空串(不拦截建卡)。
|
|
362
|
+
const kbPageRoot = chain?.workspaceDir ? `projects/${buildRepoSlug(chain.workspaceDir)}` : null;
|
|
237
363
|
const context = [
|
|
238
364
|
'# V 编排轮次(R20 逐阶段创建)',
|
|
239
365
|
`chain=${chainId} phase=${orch.phase}`,
|
|
@@ -247,38 +373,90 @@ export class VOrchestrator {
|
|
|
247
373
|
const reason = t.status === 'blocked' && lastBlock ? ` (${String(lastBlock.payload['reason'] ?? '')})` : '';
|
|
248
374
|
return `${t.id} ${t.assignee}/${t.mode} ${t.status}${reason}`;
|
|
249
375
|
}).join('\n'),
|
|
376
|
+
((orch.stallCount ?? 0) > 0
|
|
377
|
+
? `(rewake-nonce: ${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}——系统再唤醒标记,与任务无关,忽略本行)`
|
|
378
|
+
: ''),
|
|
250
379
|
'## 立即动作(本轮唯一任务)',
|
|
251
380
|
`调用 kanban_create 创建本阶段唯一任务卡:chainId=${chainId},assignee=${expect.assignee},mode=${expect.mode},parents=${JSON.stringify(parents)},title 自拟(按本阶段语义命名),body 按下述阶段要求撰写。`,
|
|
252
|
-
|
|
381
|
+
(kbPageRoot
|
|
382
|
+
? `## KB 页路径规则(W2/W3 wiki_write pagePath 固定格式)\n${kbPageRoot}/ch_${chainId}/t_<新建卡id>.md(repoSlug=${kbPageRoot.slice('projects/'.length)},系统由链 workspaceDir 派生;W2/W3 均用本链此规则,禁止自造路径)`
|
|
383
|
+
: ''),
|
|
384
|
+
buildPhaseInstruction(orch.phase, { chainId: orch.chainId }, this.configProvider.mode),
|
|
253
385
|
(ptReason ? '## P 判定需要计划评审的理由\n' + ptReason : ''),
|
|
386
|
+
(ptSuggestions.length > 0
|
|
387
|
+
? '## 评审遗留建议(PT 评审 pass 留档,非阻塞;原文完整复制进 D 卡 body 末尾「评审遗留建议」节,不得删改省略)\n' + formatIssues(ptSuggestions)
|
|
388
|
+
: ''),
|
|
254
389
|
'规则:只创建一张卡(上一阶段完成事件后才进入下一阶段);禁止跨阶段并行;禁止自己实现任务;不要调用 kanban_heartbeat/kanban_list 探测(看板状态已在上文给出)。',
|
|
255
390
|
].join('\n\n');
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
391
|
+
let agent = null;
|
|
392
|
+
let turnError = null;
|
|
393
|
+
try {
|
|
394
|
+
agent = await this.getVAgent(orch);
|
|
395
|
+
agent.followup({ content: [{ type: 'text', text: context }], source: { kind: 'user' } });
|
|
396
|
+
await agent.whenIdle();
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
// 防线④:异常收场 = 本轮零产出的一种形态(2026-09-04 mtmgp81q:异常逃出本函数
|
|
400
|
+
// 被 dispatcher 吞掉,Fix D stall 计数整段被跳过 → 链静默死锁)。在此并入 stall 计数。
|
|
401
|
+
// Task 4:getVAgent 也纳入——preset mount fail-fast / resume live 冲突等「获取会话失败」
|
|
402
|
+
// 与 turn 执行异常同收场(计 stall → scheduleRewake → 超限 [create-failed] + blockChain)。
|
|
403
|
+
turnError = err;
|
|
404
|
+
console.error('[dsh-swarm][debug] V turn error (treated as zero-output) chain=' + chainId + ' phase=' + orch.phase + ': ' + String(err));
|
|
405
|
+
}
|
|
259
406
|
// R4 建卡数量硬闸:本轮只允许一张期望匹配卡推进 phase——取第一张匹配卡,其余建卡不推进
|
|
260
407
|
// (提取 kanban_create 调用;假实现从会话事件取,真实实现同名)。
|
|
261
408
|
// 修复轮 6:session.events 条目形态为 {type, data:{name, arguments}},name 在 data 下且
|
|
262
409
|
// arguments 是 JSON 字符串——统一经 toolName/toolArgs(src/dispatcher/session-events.ts)读取。
|
|
263
|
-
|
|
410
|
+
// Task 5(宿主形态防御):session.events 缺失(undefined/非数组)时 console.error 留痕(含
|
|
411
|
+
// chainId/phase/sessionId),随零产出语义计 stall——非静默,但不崩(诊断仅在缺失时打)。
|
|
412
|
+
if (!turnError && agent !== null && !Array.isArray(agent.session?.events) && typeof agent.session?.snapshotEvents !== 'function') {
|
|
413
|
+
console.error('[dsh-swarm][debug] 宿主会话事件缺失(形态异常),按零产出处理 chain=' + chainId + ' phase=' + orch.phase + ' sessionId=' + String(orch.sessionId));
|
|
414
|
+
}
|
|
415
|
+
const creates = turnError || !agent
|
|
416
|
+
? []
|
|
417
|
+
: sessionEventsOf(agent).filter((e) => toolName(e) === 'kanban_create');
|
|
264
418
|
const firstMatch = creates.find((e) => {
|
|
265
419
|
const a = toolArgs(e);
|
|
266
420
|
return a.assignee === expect.assignee && a.mode === expect.mode;
|
|
267
421
|
});
|
|
268
|
-
//
|
|
269
|
-
//
|
|
270
|
-
//
|
|
422
|
+
// 建卡失败防护(Fix D):V 本轮未产生期望卡(assignee+mode 不匹配)→ 记 stall 轮次并自动再唤醒
|
|
423
|
+
// 重试(≤3 次,间隔 5s/10s/15s 递增——覆盖采样波动/瞬时故障,2026-09-02 倒计时链实测:V 首轮
|
|
424
|
+
// 只出文本不调工具、第二轮重放即正常建卡);超过上限 → 放弃:在链上锚点卡(最近终态卡,无则
|
|
425
|
+
// 最新卡)发 [create-failed] system 评论显形(幂等:已有该评论则不再发)+ blockChain 链级终态
|
|
426
|
+
// blocked(防线A:零任务链也有数据侧终态,人工恢复=删链重跑)。零任务无锚点可评论 →
|
|
427
|
+
// 落 console.error(无任务卡载体,auditWarning 语义不符不用),orchestration.json 已留 stallCount。
|
|
271
428
|
if (!firstMatch) {
|
|
429
|
+
const fromCache = !turnError && agent !== null && sessionEventsOf(agent).some((e) => replayModel(e) === 'from-cache');
|
|
430
|
+
if (fromCache) {
|
|
431
|
+
console.error('[dsh-swarm][debug] V turn replayed from gateway cache (from-cache, usage=0) chain=' + chainId + ' phase=' + orch.phase + ' — 缓存污染嫌疑,按零产出计 stall');
|
|
432
|
+
}
|
|
272
433
|
orch.stallCount = (orch.stallCount ?? 0) + 1;
|
|
273
|
-
if (orch.stallCount
|
|
434
|
+
if (orch.stallCount > VOrchestrator.STALL_REWAKE_LIMIT) {
|
|
274
435
|
const anchor = chainTasks.filter((t) => terminal.includes(t.status)).at(-1) ?? chainTasks.at(-1);
|
|
275
|
-
if (anchor
|
|
276
|
-
|
|
436
|
+
if (anchor) {
|
|
437
|
+
if (!state.events.some((e) => e.taskId === anchor.id && e.kind === 'task/commented' && String(e.payload['body'] ?? '').startsWith('[create-failed]'))) {
|
|
438
|
+
await this.kanban.comment(anchor.id, `[create-failed] 阶段 ${orch.phase} 连续 ${orch.stallCount} 轮建卡未产生期望卡(assignee=${expect.assignee}, mode=${expect.mode},已自动重试 ${VOrchestrator.STALL_REWAKE_LIMIT} 次)。请检查工具 schema/模型输出后人工处理。`, 'system');
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
console.error(`[dsh-swarm][debug] V create-failed (zero tasks, no anchor card to comment): chain=${chainId} phase=${orch.phase} stallCount=${orch.stallCount} — 已置链级 blocked(防线A)`);
|
|
277
443
|
}
|
|
444
|
+
// 防线A:超限不再只显形评论——零任务链从此有数据侧终态(人工恢复=删链重跑)
|
|
445
|
+
try {
|
|
446
|
+
await this.kanban.blockChain(chainId, `[create-failed] 阶段 ${orch.phase} 连续 ${orch.stallCount} 轮建卡未产生期望卡(assignee=${expect.assignee}, mode=${expect.mode}),已自动重试 ${VOrchestrator.STALL_REWAKE_LIMIT} 次`);
|
|
447
|
+
}
|
|
448
|
+
catch (err) {
|
|
449
|
+
console.error('[dsh-swarm][debug] blockChain failed chain=' + chainId + ': ' + String(err));
|
|
450
|
+
}
|
|
451
|
+
this.onOrchChange?.();
|
|
452
|
+
return;
|
|
278
453
|
}
|
|
454
|
+
this.scheduleRewake(chainId, orch.stallCount);
|
|
455
|
+
this.onOrchChange?.();
|
|
279
456
|
return;
|
|
280
457
|
}
|
|
281
458
|
orch.stallCount = 0;
|
|
459
|
+
this.onOrchChange?.();
|
|
282
460
|
if (firstMatch) {
|
|
283
461
|
// 评审阶段(pt/dt):建卡后不推进 phase(等评审 verdict 分流,pass 才推进);
|
|
284
462
|
// 普通阶段:建卡后推进 phase(生产上由 task/completed 事件串行唤醒下一阶段)。
|
|
@@ -338,7 +516,7 @@ export class VOrchestrator {
|
|
|
338
516
|
}
|
|
339
517
|
// fail
|
|
340
518
|
await this.kanban.recordReview(reviewTask.id, root.id, evidence, 'system');
|
|
341
|
-
const maxR = this.
|
|
519
|
+
const maxR = this.configProvider.getEffective().dispatcher?.maxReworksPerRole?.[role] ?? 3;
|
|
342
520
|
if ((currentTarget.reviewAttempt ?? 0) >= maxR) {
|
|
343
521
|
await this.kanban.reviewGaveUp(reviewTask.id, root.id, 'exceeded max reworks (' + maxR + ')', 'system');
|
|
344
522
|
// [review-final] 证据链:评审时间线 + 最终原因(system 确定性写入)
|
|
@@ -354,7 +532,18 @@ export class VOrchestrator {
|
|
|
354
532
|
].join('\n'), 'system');
|
|
355
533
|
return 'gave-up';
|
|
356
534
|
}
|
|
357
|
-
// 未超限:createReworkTask(原任务保持 done)+ 新建复审卡(parents=rework,reviewAttempt=rework.reviewAttempt
|
|
535
|
+
// 未超限:createReworkTask(原任务保持 done)+ 新建复审卡(parents=rework,reviewAttempt=rework.reviewAttempt)。
|
|
536
|
+
// 2026-09-03 P/PT 定位决议铁律3:复审卡 body 确定性注入上一轮 issues 对账输入——复审卡原为空 body,
|
|
537
|
+
// 对账纯靠模型自觉(ch_1_mtjuukv2 三轮空转的结构根因之一);输入直接取作用域内 evidence,不查事件。
|
|
538
|
+
const reconcileBody = [
|
|
539
|
+
role === 'pt' ? '## PT 复审任务体要求(计划评审,只读)' : '## DT 复审任务体要求(实现校验+评审,只读护栏)',
|
|
540
|
+
role === 'pt'
|
|
541
|
+
? 'P 已按上一轮 issues 返工。按 persona 五要素只读评审返工后的计划产物,输出 verdict+issues 入交接 metadata.review_evidence(评审闸要求不变:artifacts_path 或 reviewPage)。'
|
|
542
|
+
: 'D 已按上一轮 issues 返工。按 persona 对返工产物实证校验+评审,输出 verdict+issues 入交接 metadata.review_evidence。',
|
|
543
|
+
'## 上一轮评审未通过 issues(必须先逐条对账,再提新问题)',
|
|
544
|
+
formatIssues(evidence.issues) || ' -(无)',
|
|
545
|
+
'对账规则:每条旧 issue 给出三态结论——已修复(resolved=true)/未修复(resolved=false,detail 原样沿用)/部分修复(resolved=false,detail 注明剩余部分);未修复旧 issue 必须原样保留在 issues 中,禁止跳过对账只提新问题。',
|
|
546
|
+
].join('\n');
|
|
358
547
|
const rework = await this.kanban.createReworkTask({ sourceTaskId: currentTarget.id, reviewTaskId: reviewTask.id, reason: 'review failed' }, 'system');
|
|
359
548
|
await this.kanban.createTask({
|
|
360
549
|
chainId,
|
|
@@ -363,6 +552,7 @@ export class VOrchestrator {
|
|
|
363
552
|
mode: role === 'pt' ? 'review-plan' : 'review-impl',
|
|
364
553
|
parents: [rework.id],
|
|
365
554
|
reviewAttempt: rework.reviewAttempt,
|
|
555
|
+
body: reconcileBody,
|
|
366
556
|
}, 'v');
|
|
367
557
|
return 'rework';
|
|
368
558
|
}
|
|
@@ -393,26 +583,44 @@ export class VOrchestrator {
|
|
|
393
583
|
// 再注入 kanban/spec 工具面;从基座层面落实「V 只路由、不执行」。
|
|
394
584
|
const presets = agentCtx.get?.('agentPresets');
|
|
395
585
|
if (presets) {
|
|
586
|
+
// Task 4 加固:preset mount 失败即抛(fail-fast),不再 console.error 静默放行——V 会话
|
|
587
|
+
// 无 persona 基座不得裸奔。抛错 → create/resume 失败 → getVAgent 抛 → 主推进路径并入
|
|
588
|
+
// 异常收场(Fix D stall 计数,超限 [create-failed] + blockChain);候选循环对非 model
|
|
589
|
+
// 错误立即失败(isModelUnavailableError=false → throw),不会被候选切换吞掉。
|
|
590
|
+
const vSessionId = orch.sessionId ?? 'kbn-v-' + orch.chainId;
|
|
396
591
|
try {
|
|
397
|
-
await presets.mount(agentCtx,
|
|
592
|
+
await presets.mount(agentCtx, V_SESSION_PRESET_ID);
|
|
398
593
|
}
|
|
399
594
|
catch (err) {
|
|
400
|
-
|
|
401
|
-
console.error('[dsh-swarm][debug] V preset mount failed kanban-v: ' + String(err));
|
|
595
|
+
throw new Error(V_SESSION_PRESET_ID + ' preset mount failed for ' + vSessionId + ': ' + String(err));
|
|
402
596
|
}
|
|
403
597
|
}
|
|
404
598
|
await installRoleTools(agentCtx, 'v', { kanban: this.kanban, wiki: this.wiki });
|
|
599
|
+
// Task 4:setup 完整成功(mount + 工具面)后写身份标记——live 复用校验依据(同 agent-runner 组合标记机制)。
|
|
600
|
+
const vAgent = agentCtx.agent;
|
|
601
|
+
if (vAgent && typeof vAgent === 'object')
|
|
602
|
+
vSessionCompositions.set(vAgent, V_SESSION_PRESET_ID);
|
|
405
603
|
};
|
|
406
604
|
// 模型候选链(Task 12):V 会话 create/resume 按 primary→fallbacks 静默切换;
|
|
407
605
|
// V 无任务卡可 block——全候选不可用抛最后错误(wakeV 调用方按既有错误路径处理)。
|
|
408
|
-
const candidates = buildModelCandidates(this.
|
|
606
|
+
const candidates = buildModelCandidates(this.configProvider.getEffective(), 'v', this.defaultModel);
|
|
409
607
|
const spawnWith = async (opts) => {
|
|
410
608
|
if (orch.sessionId) {
|
|
411
609
|
// 修复轮 6:V 会话首轮创建后保持 live,resume 会抛 "cannot prepare session while it is live"。
|
|
412
610
|
// 优先复用 agents registry 中仍 live 的会话(followup 续用),仅当会话已下线时才 resume。
|
|
611
|
+
// Task 4 加固:live 复用前校验身份标记(参照 agent-runner resumeOrReuse 同款)——标记匹配
|
|
612
|
+
// 才复用;缺失/不匹配(GUI 重开同名会话/宿主自建 incarnation/历史会话)拒绝盲复用,改走
|
|
613
|
+
// resume 重跑 setup 重新 mount(身份自愈);resume 撞 live 冲突则抛错走防线——绝不静默
|
|
614
|
+
// 把错误身份的会话交给调用方。
|
|
413
615
|
const live = this.agents.get?.(orch.sessionId);
|
|
414
|
-
if (live)
|
|
415
|
-
|
|
616
|
+
if (live) {
|
|
617
|
+
const marker = typeof live === 'object' && live !== null ? vSessionCompositions.get(live) : undefined;
|
|
618
|
+
if (marker === V_SESSION_PRESET_ID)
|
|
619
|
+
return live;
|
|
620
|
+
console.error('[dsh-swarm][debug] V live session identity unverifiable (session ' + orch.sessionId + ', marker=' + String(marker) + ') — refusing blind reuse, falling back to resume (re-setup re-mounts ' + V_SESSION_PRESET_ID + ')');
|
|
621
|
+
const h = await this.agents.resume({ resumeSessionId: orch.sessionId, ...opts, setup });
|
|
622
|
+
return h.agent;
|
|
623
|
+
}
|
|
416
624
|
const h = await this.agents.resume({ resumeSessionId: orch.sessionId, ...opts, setup });
|
|
417
625
|
return h.agent;
|
|
418
626
|
}
|
|
@@ -422,7 +630,7 @@ export class VOrchestrator {
|
|
|
422
630
|
ws = await resolveOrCreateWorkspace(this.ctx, null, 'chain ' + orch.chainId + ' V');
|
|
423
631
|
}
|
|
424
632
|
if (!ws)
|
|
425
|
-
throw new Error('workspace-unknown: chain ' + orch.chainId + ` 无 workspaceDir,需重新 ${this.
|
|
633
|
+
throw new Error('workspace-unknown: chain ' + orch.chainId + ` 无 workspaceDir,需重新 ${this.configProvider.getEffective().prefixRoutes.plan}`);
|
|
426
634
|
const h = await this.agents.create({ sessionId: `kbn-v-${orch.chainId}`, meta: { cwd: ws }, ...opts, setup });
|
|
427
635
|
orch.sessionId = `kbn-v-${orch.chainId}`;
|
|
428
636
|
await attachSessionToWorkspace(this.ctx, `kbn-v-${orch.chainId}`, ws, 'chain ' + orch.chainId + ' V');
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { KanbanConfig } from '../config.js';
|
|
2
|
+
import type { Role } from './types.js';
|
|
3
|
+
export declare const ROLES: readonly Role[];
|
|
4
|
+
export interface EditableModelInput {
|
|
5
|
+
provider?: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
reasoningEffort?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface EditableOverride {
|
|
10
|
+
wikiVault?: {
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
pagePrefix?: string;
|
|
13
|
+
};
|
|
14
|
+
roles?: {
|
|
15
|
+
models?: Partial<Record<Role, EditableModelInput>>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface EditableModelSnapshot {
|
|
19
|
+
provider: string;
|
|
20
|
+
model: string;
|
|
21
|
+
reasoningEffort: string;
|
|
22
|
+
}
|
|
23
|
+
export interface EditableSnapshot {
|
|
24
|
+
wikiVault: {
|
|
25
|
+
baseUrl: string;
|
|
26
|
+
pagePrefix: string;
|
|
27
|
+
};
|
|
28
|
+
roles: {
|
|
29
|
+
models: Partial<Record<Role, EditableModelSnapshot>>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export type ConfigSource = 'override' | 'inherited';
|
|
33
|
+
export type SourceMap = Record<string, ConfigSource>;
|
|
34
|
+
export declare function mergeConfig(baseline: KanbanConfig, override: EditableOverride | undefined): KanbanConfig;
|
|
35
|
+
export declare function computeSources(override: EditableOverride | undefined): SourceMap;
|
|
36
|
+
export declare function projectEditable(effective: KanbanConfig): EditableSnapshot;
|
|
37
|
+
export declare function validateConfig(snapshot: EditableSnapshot): string[];
|
|
38
|
+
export declare function diffOverride(baseline: KanbanConfig, snapshot: EditableSnapshot): EditableOverride;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export const ROLES = ['v', 'p', 'w', 'd', 'pt', 'dt'];
|
|
2
|
+
const MODEL_FIELDS = ['provider', 'model', 'reasoningEffort'];
|
|
3
|
+
export function mergeConfig(baseline, override) {
|
|
4
|
+
const wiki = { ...baseline.wikiVault };
|
|
5
|
+
if (override?.wikiVault?.baseUrl !== undefined)
|
|
6
|
+
wiki.baseUrl = override.wikiVault.baseUrl;
|
|
7
|
+
if (override?.wikiVault?.pagePrefix !== undefined)
|
|
8
|
+
wiki.pagePrefix = override.wikiVault.pagePrefix;
|
|
9
|
+
const models = { ...baseline.roles.models };
|
|
10
|
+
for (const role of ROLES) {
|
|
11
|
+
const base = baseline.roles.models?.[role];
|
|
12
|
+
const over = override?.roles?.models?.[role];
|
|
13
|
+
if (!over)
|
|
14
|
+
continue;
|
|
15
|
+
const cur = { ...base };
|
|
16
|
+
if (over.provider !== undefined)
|
|
17
|
+
cur.provider = over.provider;
|
|
18
|
+
if (over.model !== undefined)
|
|
19
|
+
cur.model = over.model;
|
|
20
|
+
// 防御:空字符串 reasoningEffort 视为"未设置",永不覆盖 baseline/默认(读点回退 'high')。
|
|
21
|
+
if (over.reasoningEffort !== undefined && over.reasoningEffort.trim() !== '')
|
|
22
|
+
cur.reasoningEffort = over.reasoningEffort;
|
|
23
|
+
if (cur.provider && cur.model)
|
|
24
|
+
models[role] = cur;
|
|
25
|
+
}
|
|
26
|
+
return { ...baseline, wikiVault: wiki, roles: { ...baseline.roles, models } };
|
|
27
|
+
}
|
|
28
|
+
export function computeSources(override) {
|
|
29
|
+
const src = {};
|
|
30
|
+
for (const k of ['wikiVault.baseUrl', 'wikiVault.pagePrefix']) {
|
|
31
|
+
const hit = k === 'wikiVault.baseUrl' ? override?.wikiVault?.baseUrl !== undefined : override?.wikiVault?.pagePrefix !== undefined;
|
|
32
|
+
src[k] = hit ? 'override' : 'inherited';
|
|
33
|
+
}
|
|
34
|
+
for (const role of ROLES) {
|
|
35
|
+
for (const f of MODEL_FIELDS) {
|
|
36
|
+
const hit = override?.roles?.models?.[role]?.[f] !== undefined;
|
|
37
|
+
src[`roles.models.${role}.${f}`] = hit ? 'override' : 'inherited';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return src;
|
|
41
|
+
}
|
|
42
|
+
export function projectEditable(effective) {
|
|
43
|
+
const models = {};
|
|
44
|
+
for (const role of ROLES) {
|
|
45
|
+
const m = effective.roles.models?.[role];
|
|
46
|
+
if (m?.provider && m?.model)
|
|
47
|
+
models[role] = { provider: m.provider, model: m.model, reasoningEffort: m.reasoningEffort ?? 'high' };
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
wikiVault: { baseUrl: effective.wikiVault.baseUrl, pagePrefix: effective.wikiVault.pagePrefix },
|
|
51
|
+
roles: { models },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function validateConfig(snapshot) {
|
|
55
|
+
const errs = [];
|
|
56
|
+
const baseUrl = snapshot.wikiVault.baseUrl ?? '';
|
|
57
|
+
// 空 baseUrl = 本地 llm-wiki 回退(合法);仅非空时校验 ^https?://。
|
|
58
|
+
if (baseUrl.trim() && !/^https?:\/\//.test(baseUrl))
|
|
59
|
+
errs.push('wikiVault.baseUrl');
|
|
60
|
+
if (!(snapshot.wikiVault.pagePrefix ?? '').trim())
|
|
61
|
+
errs.push('wikiVault.pagePrefix');
|
|
62
|
+
for (const role of ROLES) {
|
|
63
|
+
const m = snapshot.roles.models[role];
|
|
64
|
+
if (!m)
|
|
65
|
+
continue;
|
|
66
|
+
if (!m.provider?.trim())
|
|
67
|
+
errs.push(`roles.models.${role}.provider`);
|
|
68
|
+
if (!m.model?.trim())
|
|
69
|
+
errs.push(`roles.models.${role}.model`);
|
|
70
|
+
}
|
|
71
|
+
return errs;
|
|
72
|
+
}
|
|
73
|
+
export function diffOverride(baseline, snapshot) {
|
|
74
|
+
const out = {};
|
|
75
|
+
const w = {};
|
|
76
|
+
if (snapshot.wikiVault.baseUrl !== baseline.wikiVault.baseUrl)
|
|
77
|
+
w.baseUrl = snapshot.wikiVault.baseUrl;
|
|
78
|
+
if (snapshot.wikiVault.pagePrefix !== baseline.wikiVault.pagePrefix)
|
|
79
|
+
w.pagePrefix = snapshot.wikiVault.pagePrefix;
|
|
80
|
+
if (Object.keys(w).length)
|
|
81
|
+
out.wikiVault = w;
|
|
82
|
+
const models = {};
|
|
83
|
+
for (const role of ROLES) {
|
|
84
|
+
const snap = snapshot.roles.models[role];
|
|
85
|
+
const base = baseline.roles.models?.[role];
|
|
86
|
+
const cur = {};
|
|
87
|
+
if (snap && snap.provider !== base?.provider)
|
|
88
|
+
cur.provider = snap.provider;
|
|
89
|
+
if (snap && snap.model !== base?.model)
|
|
90
|
+
cur.model = snap.model;
|
|
91
|
+
// 空/空白 reasoningEffort 视为"跟随默认":不写入 override,effective 保持 baseline/默认。
|
|
92
|
+
const snapEffort = snap?.reasoningEffort?.trim() ? snap.reasoningEffort : undefined;
|
|
93
|
+
if (snapEffort !== undefined && snapEffort !== (base?.reasoningEffort ?? 'high'))
|
|
94
|
+
cur.reasoningEffort = snapEffort;
|
|
95
|
+
if (Object.keys(cur).length)
|
|
96
|
+
models[role] = cur;
|
|
97
|
+
}
|
|
98
|
+
if (Object.keys(models).length)
|
|
99
|
+
out.roles = { models: models };
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
@@ -14,5 +14,6 @@ export interface MissingParentDelivery {
|
|
|
14
14
|
mode: TaskMode;
|
|
15
15
|
missing: string[];
|
|
16
16
|
}
|
|
17
|
-
/** 对一组父任务 id 做交付契约校验,返回缺关键交付物的父卡清单(无缺失返回空数组)。
|
|
18
|
-
|
|
17
|
+
/** 对一组父任务 id 做交付契约校验,返回缺关键交付物的父卡清单(无缺失返回空数组)。
|
|
18
|
+
* kbUrlBase 可选透传 missingDeliveryKeys(与 Task 4 的 C1 推导修正配套——local 模式传 '' 走 strict local 分支)。 */
|
|
19
|
+
export declare function missingParentDelivery(state: BoardState, parentIds: string[], kbUrlBase?: string): MissingParentDelivery[];
|