@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
package/lib/config.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export interface KanbanConfig {
|
|
|
31
31
|
heartbeatIntervalSeconds: number;
|
|
32
32
|
/** 协议违规护栏:连续 protocol_violation 阻塞 ≥ 此值后,下次违规直接 gave_up 不再恢复。默认 2。 */
|
|
33
33
|
maxProtocolViolations: number;
|
|
34
|
-
/** 评审返工护栏:pt/dt 各自最大返工次数(超限 review/gave-up + [review-final])。默认 pt=
|
|
34
|
+
/** 评审返工护栏:pt/dt 各自最大返工次数(超限 review/gave-up + [review-final])。默认 pt=3 dt=3。 */
|
|
35
35
|
maxReworksPerRole: {
|
|
36
36
|
pt: number;
|
|
37
37
|
dt: number;
|
|
@@ -50,5 +50,12 @@ export interface KanbanConfig {
|
|
|
50
50
|
contentMaxWidth: number;
|
|
51
51
|
sseHeartbeatSeconds: number;
|
|
52
52
|
};
|
|
53
|
+
gates: {
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
/** 单条命令超时(ms)。默认 600000(10min,vitest 冷启动余量)。到点 SIGKILL,非实际耗时。 */
|
|
56
|
+
timeoutMs: number;
|
|
57
|
+
/** 命令黑名单子串(命中即拒执行)。纵深防御:派生命令由系统从 tdd 生成,正常不触黑名单。 */
|
|
58
|
+
forbidden: string[];
|
|
59
|
+
};
|
|
53
60
|
}
|
|
54
61
|
export declare const Config: Schema<KanbanConfig>;
|
package/lib/config.js
CHANGED
|
@@ -31,7 +31,7 @@ export const Config = Schema.object({
|
|
|
31
31
|
heartbeatIntervalSeconds: Schema.number().default(300),
|
|
32
32
|
maxProtocolViolations: Schema.number().min(1).default(2),
|
|
33
33
|
maxReworksPerRole: Schema.object({
|
|
34
|
-
pt: Schema.number().min(1).default(
|
|
34
|
+
pt: Schema.number().min(1).default(3),
|
|
35
35
|
dt: Schema.number().min(1).default(3),
|
|
36
36
|
}),
|
|
37
37
|
}),
|
|
@@ -50,4 +50,9 @@ export const Config = Schema.object({
|
|
|
50
50
|
contentMaxWidth: Schema.number().min(320).max(960).default(780), // 看板最大宽度 780px
|
|
51
51
|
sseHeartbeatSeconds: Schema.number().min(5).default(20),
|
|
52
52
|
}),
|
|
53
|
+
gates: Schema.object({
|
|
54
|
+
enabled: Schema.boolean().default(true),
|
|
55
|
+
timeoutMs: Schema.number().min(1000).default(600000),
|
|
56
|
+
forbidden: Schema.array(Schema.string()).default(['rm -rf /', 'git push']),
|
|
57
|
+
}).default({ enabled: true, timeoutMs: 600000, forbidden: ['rm -rf /', 'git push'] }),
|
|
53
58
|
});
|
|
@@ -1,23 +1,45 @@
|
|
|
1
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
2
2
|
import type { KanbanService } from '../domain/kanban-service.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { ConfigProvider } from '../services/config-provider.js';
|
|
4
|
+
import type { Role } from '../domain/types.js';
|
|
4
5
|
import type { WikiVaultClient } from '../wiki/wiki-vault-client.js';
|
|
5
6
|
import type { AgentModelOptions } from './dispatcher.js';
|
|
7
|
+
/** 角色组合标记(Task 2,会话10事故根因A):setup 成功组合角色工具面后写入,live 复用前校验。 */
|
|
8
|
+
interface RoleCompositionMarker {
|
|
9
|
+
role: Role;
|
|
10
|
+
taskId: string;
|
|
11
|
+
}
|
|
12
|
+
/** 写入角色组合标记(setup 在 installRoleTools 成功后调用;导出仅供测试直接构造标记场景)。 */
|
|
13
|
+
export declare function markRoleComposition(agent: unknown, marker: RoleCompositionMarker): void;
|
|
6
14
|
/** 每任务一次性角色 agent:创建/resume、上下文组装、协议违规检测。 */
|
|
7
15
|
export declare class AgentRunner {
|
|
8
16
|
private readonly ctx;
|
|
9
17
|
private readonly kanban;
|
|
10
|
-
private readonly
|
|
18
|
+
private readonly configProvider;
|
|
11
19
|
private readonly wiki;
|
|
12
20
|
private readonly defaultModel;
|
|
13
|
-
constructor(ctx: Context, kanban: KanbanService,
|
|
21
|
+
constructor(ctx: Context, kanban: KanbanService, configProvider: ConfigProvider, wiki: WikiVaultClient, defaultModel?: AgentModelOptions);
|
|
14
22
|
private buildContext;
|
|
15
23
|
runTask(taskId: string): Promise<void>;
|
|
16
|
-
/** RC2:resume 前先查 agents registry 同名会话是否仍 live——live
|
|
17
|
-
*
|
|
18
|
-
*
|
|
24
|
+
/** RC2:resume 前先查 agents registry 同名会话是否仍 live——live 且组合标记匹配(role+taskId 一致)才复用。
|
|
25
|
+
* Task 2(会话10事故根因A):此前对 live agent 盲复用——GUI 打开同名会话产生的默认组合 incarnation
|
|
26
|
+
* 没有角色 preset/kanban_complete 工具面(setup 被跳过),模型只能把交付塞 kanban_comment。
|
|
27
|
+
* 现在标记缺失/不匹配时按宿主能力降级(探明结论):
|
|
28
|
+
* - (i) dispose 不可行:AgentHandle.dispose 仅创建者持有(dsh-agent types/index.d.ts:155-158,
|
|
29
|
+
* "ctx.agents.get(id) still returns a bare Agent"),无从释放他人 incarnation。
|
|
30
|
+
* - (ii) 修复可行(生产主路径):Agent.ctx 公开(runtime-types.d.ts:72)且经它访问的 tools 注册表
|
|
31
|
+
* 可枚举/可注册(ToolRuntime.get(name, scope) 返回该 scope 可见定义;register 经 traced ctx 落到
|
|
32
|
+
* 该 agent 的 scope 层)→ 重跑 setup 幂等补挂(effort/approval/sandbox/preset/角色工具/护栏),
|
|
33
|
+
* 补挂后必须验证 kanban_complete 可见才算修复成功。kanban_complete 是所有 runner 角色
|
|
34
|
+
* (p/w/d/pt/dt)都注册的任务工具,且全局面只读子集不含它(main-session-tools.ts:134),
|
|
35
|
+
* 故「scope 内可见 kanban_complete」⟺「该 incarnation 经我方角色 setup 组合过」。
|
|
36
|
+
* - (iii) 兜底:工具注册表不可达(异常宿主/测试桩)→ 抛错走 failTask。错误信息刻意不含
|
|
37
|
+
* isInfraError 关键词 → attempts+1 计入重试预算:每次重派都会撞同一个 live 错误 incarnation
|
|
38
|
+
* 直至重试预算耗尽——有界,不会形成无限重派循环(若误标 infra 则 attempts 不递增才会无限)。
|
|
39
|
+
* agents.get 未实现 → 回退 resume(原行为不回归)。 */
|
|
19
40
|
private resumeOrReuse;
|
|
20
41
|
/** M3(B):D(execute) 目标仓库在会话工作空间外时,跑 D 前询问用户是否允许。
|
|
21
42
|
* 经 ctx.userQuestions(GUI 弹窗)单次询问;无询问通道或拒绝 → 返回 false(由调用方 claim+block 等待人工放行)。 */
|
|
22
43
|
private requestRepoPermission;
|
|
23
44
|
}
|
|
45
|
+
export {};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { SessionId } from '@deepseek-ai/dsh-session';
|
|
2
|
-
import { installRoleTools, buildReadOnlyWriteGuard, buildDTWriteGuard, buildPlanWriteGuard, registerDtTaskChain, unregisterDtTaskChain } from '../roles/toolsets.js';
|
|
2
|
+
import { installRoleTools, buildReadOnlyWriteGuard, buildDTWriteGuard, buildPlanWriteGuard, buildKbWriteGuard, registerDtTaskChain, unregisterDtTaskChain } from '../roles/toolsets.js';
|
|
3
|
+
import { ensureLocalKbRoot } from '../wiki/local-kb.js';
|
|
4
|
+
import { installCleanFsTools } from '../roles/clean-fs-tools.js';
|
|
3
5
|
import { buildModelCandidates, isModelUnavailableError } from './model-candidates.js';
|
|
4
|
-
import { attachSessionToWorkspace, resolveOrCreateWorkspace } from './workspace-attach.js';
|
|
5
6
|
import { toolName } from './session-events.js';
|
|
7
|
+
import { attachSessionToWorkspace, resolveOrCreateWorkspace } from './workspace-attach.js';
|
|
6
8
|
import { isPathInside, resolveTargetRepoDir } from './target-repo.js';
|
|
7
9
|
import { injectGitCredentials, resolveGitPatFromCtx } from './git-credentials.js';
|
|
8
10
|
/** M3(B):目标仓库在会话工作空间外、已 claim+block 等待用户授权且尚未建会话的任务集合(key=taskId)。
|
|
@@ -14,14 +16,31 @@ const GOAL_MODE_KEYWORDS = ['/goal', '目标模式', 'goal mode'];
|
|
|
14
16
|
function isInfraError(err) {
|
|
15
17
|
return /cannot prepare session|while it is live|timeout|ETIMEDOUT|ECONNREFUSED|ECONNRESET|socket/i.test(String(err));
|
|
16
18
|
}
|
|
19
|
+
/** 组合标记存储:按 Agent 实例(incarnation)键控的进程内 WeakMap。
|
|
20
|
+
* 机制取舍(探明宿主 lib 后确定,详见 task-2-report):
|
|
21
|
+
* - 不用 session.append('kanban/role-composition'):自定义事件类型不在宿主 KNOWN_SESSION_EVENT_TYPES
|
|
22
|
+
* (dsh-session/lib/types/known-event-types.js),持久化读路径 assertEventsSupported
|
|
23
|
+
* (dsh-session-persistence/lib/index.js:1117)对未标 ignorable 的未知类型整份拒绝加载
|
|
24
|
+
* (SessionFormatUnsupportedError)→ 会话日志变成无法 resume 的毒日志;且 append 公共 API
|
|
25
|
+
* 不暴露 ignorable 信封字段,无法规避。
|
|
26
|
+
* - 不用 agentCtx.provide:cordis 服务 store 的 isolate 键解析到根作用域
|
|
27
|
+
* (cordis/lib/index.js provide → ctx.root[symbols.isolate][name]),多 agent 同名 provide 冲突。
|
|
28
|
+
* - WeakMap 按 incarnation 键控:GUI 重开同名会话是新 Agent 实例 → 查不到标记 → 不盲用;
|
|
29
|
+
* 实例被回收标记随 GC 消失,无泄漏。 */
|
|
30
|
+
const roleCompositions = new WeakMap();
|
|
31
|
+
/** 写入角色组合标记(setup 在 installRoleTools 成功后调用;导出仅供测试直接构造标记场景)。 */
|
|
32
|
+
export function markRoleComposition(agent, marker) {
|
|
33
|
+
if (agent && typeof agent === 'object')
|
|
34
|
+
roleCompositions.set(agent, marker);
|
|
35
|
+
}
|
|
17
36
|
/** 每任务一次性角色 agent:创建/resume、上下文组装、协议违规检测。 */
|
|
18
37
|
export class AgentRunner {
|
|
19
38
|
ctx;
|
|
20
39
|
kanban;
|
|
21
|
-
|
|
40
|
+
configProvider;
|
|
22
41
|
wiki;
|
|
23
42
|
defaultModel;
|
|
24
|
-
constructor(ctx, kanban,
|
|
43
|
+
constructor(ctx, kanban, configProvider, wiki, defaultModel) { this.ctx = ctx; this.kanban = kanban; this.configProvider = configProvider; this.wiki = wiki; this.defaultModel = defaultModel; }
|
|
25
44
|
buildContext(task, state, resume) {
|
|
26
45
|
const parts = [`# Task ${task.id}: ${task.title}`, `assignee=${task.assignee} mode=${task.mode}`];
|
|
27
46
|
// Q3:权限提示仅对受限角色显示(v 无写、d/execute 全权、p/w 全权但受工具级写护栏约束——写边界不靠 prompt 软约束)
|
|
@@ -35,6 +54,20 @@ export class AgentRunner {
|
|
|
35
54
|
if (task.body)
|
|
36
55
|
parts.push(`## Body
|
|
37
56
|
${task.body}`);
|
|
57
|
+
// W local KB 模式(D7/D8):注入本地库根 + llm-wiki 用法 + 排序原则 + 交付约定(remote 模式不注入)。
|
|
58
|
+
// 库内复制/移动补句(Task 6 评审):DIRECT cp/mv/mkdir 工具永远匹配不到 KB 目标(无 path/file_path
|
|
59
|
+
// 实参)会被护栏拒绝——必须显式指引 W 用 write 工具做库内复制/移动。
|
|
60
|
+
if (task.assignee === 'w' && this.configProvider.mode === 'local') {
|
|
61
|
+
const kbRoot = ensureLocalKbRoot();
|
|
62
|
+
parts.push('## 知识库(本地模式)', `- 本地库根:${kbRoot}(llm-wiki 原生结构;只读仓库源码,唯一可写区域为该库根);库内复制/移动一律用 write 工具(cp/mv 会被护栏拒绝)`, '- 经 skill 工具加载 llm-wiki 完成查写(query/ingest/crystallize);库未初始化时先按其 init 工作流初始化(幂等)', '- 检索排序原则:相关性优先 7 : 新鲜度 3', '- 交付:page_path = 库根下 wiki/** 相对路径(如 wiki/sources/ch_<chainId>/t_<taskId>.md);kb_url = 空串', '- 本地模式不 ingest 外部 URL;wiki_search/wiki_read/wiki_write 不可用(未注册)');
|
|
63
|
+
}
|
|
64
|
+
// D/DT local 库根注入(审查修订 M3/M4):Task 9 d:execute local 文案称「库根见运行时上下文」,
|
|
65
|
+
// 此处必须真的注入,否则 D 不知道去哪读计划;DT fs 写评审页同理。
|
|
66
|
+
if ((task.assignee === 'd' || task.assignee === 'dt') && this.configProvider.mode === 'local') {
|
|
67
|
+
parts.push('## 本地知识库(local KB mode)', `- 本地库根:${ensureLocalKbRoot()}`, task.assignee === 'd'
|
|
68
|
+
? '- 实施计划原文 = 父任务交接 page_path(库根下 wiki/** 相对路径)→ 直接 fs 读 <库根>/<page_path>;KB 经验召回经 skill 工具加载 llm-wiki(本地库)'
|
|
69
|
+
: '- 评审页经 fs 写 <库根>/wiki/queries/ch_<chainId>/review/<name>.md(库根外一律只读)');
|
|
70
|
+
}
|
|
38
71
|
// P1-1:规格卡六段 + 附件注入(经 Chain.specCardId),角色 agent 的输入契约,原汁原味
|
|
39
72
|
const chain = state.chains.get(task.chainId);
|
|
40
73
|
const specCard = chain?.specCardId ? state.specCards.get(chain.specCardId) : null;
|
|
@@ -139,7 +172,7 @@ ${task.body}`);
|
|
|
139
172
|
sessionCwd = await resolveOrCreateWorkspace(this.ctx, null, 'task ' + task.id + ' ' + task.assignee + '/' + task.mode);
|
|
140
173
|
}
|
|
141
174
|
if (!sessionCwd) {
|
|
142
|
-
await this.kanban.comment(taskId, `链未绑定工作区(Chain.workspaceDir 缺失且用户未提供工作区路径)。请重新 ${this.
|
|
175
|
+
await this.kanban.comment(taskId, `链未绑定工作区(Chain.workspaceDir 缺失且用户未提供工作区路径)。请重新 ${this.configProvider.getEffective().prefixRoutes.plan} 绑定主 agent 工作空间后重试。`, 'system');
|
|
143
176
|
await this.kanban.claimTask(taskId, 'system');
|
|
144
177
|
await this.kanban.blockTask(taskId, 'workspace-unknown: 链未绑定工作区(Chain.workspaceDir 缺失)', 'system');
|
|
145
178
|
return;
|
|
@@ -174,7 +207,7 @@ ${task.body}`);
|
|
|
174
207
|
// 里的 reasoningEffort 不被宿主消费,新建角色会话思考等级会落回宿主默认。改走 DSH agent/request
|
|
175
208
|
// waterfall 逐请求强制(宿主 installModelSelection 同机制),作用域仅本角色会话;
|
|
176
209
|
// effort 可由 per-role config 覆盖,默认 'high'(与 model-candidates.ts 默认一致)。
|
|
177
|
-
const effort = this.
|
|
210
|
+
const effort = this.configProvider.getEffective().roles?.models?.[task.assignee]?.reasoningEffort ?? 'high';
|
|
178
211
|
const scoped = agentCtx;
|
|
179
212
|
scoped.on('agent/request', async (_payload, next) => {
|
|
180
213
|
// 异常不吞:await next() 失败原样向上抛
|
|
@@ -208,15 +241,36 @@ ${task.body}`);
|
|
|
208
241
|
}
|
|
209
242
|
}
|
|
210
243
|
}
|
|
211
|
-
await installRoleTools(agentCtx, task.assignee, { kanban: this.kanban, wiki: this.wiki, taskId: task.id });
|
|
244
|
+
await installRoleTools(agentCtx, task.assignee, { kanban: this.kanban, wiki: this.wiki, taskId: task.id, kbMode: this.configProvider.mode });
|
|
245
|
+
// sandbox-menu-align Task 1:danger-full-access 会话(P、D(execute))write/edit/bash 菜单去毒
|
|
246
|
+
// (agent scope shadow 注册干净版盖住宿主带毒版本 + execute 剥参转发,详见 src/roles/clean-fs-tools.ts)。
|
|
247
|
+
// 挂载点选在 setup 内、preset.mount 之后:shadow 需经 get(name, agent) 取 preset standing
|
|
248
|
+
// 祖先层里的宿主原定义(kanban-p/d 的 fs/bash 由 preset 提供),且必须在会话开始前完成注册。
|
|
249
|
+
// 仅 P 与 D(execute):两者是 danger-full-access 天花板,escalation 参数无更宽可升(必被拒);
|
|
250
|
+
// PT/DT 是 workspace-write(sandbox_permissions 扩权到天花板是合法功能,剥了破坏官方能力);
|
|
251
|
+
// W 虽 fullAccess 但 I2 只读护栏全拒 write,shadow 无意义(最小挂载面,V 无执行工具不涉及)。
|
|
252
|
+
if (task.assignee === 'p' || isDExecute) {
|
|
253
|
+
installCleanFsTools(agentCtx, agentCtx.agent);
|
|
254
|
+
}
|
|
255
|
+
// Task 2:组合标记——角色工具面成功组合后,把 { role, taskId } 记到进程内 WeakMap(键=Agent 实例)。
|
|
256
|
+
// 宿主探明:setup 收到的 agentCtx.agent 与发布后 agents.get(id) 返回的是同一 Agent 实例
|
|
257
|
+
// (dsh-agent types/index.d.ts:38 `agent?: Agent` 安装为 Agent.ctx own property),
|
|
258
|
+
// 故此处键入的实例即 resumeOrReuse 里 agents.get 命中的实例。agentCtx.agent 缺失(宿主变体)时
|
|
259
|
+
// 不写标记 → live 复用走工具面校验路径(kanban_complete 可见性),能力无损。
|
|
260
|
+
const liveAgent = agentCtx.agent;
|
|
261
|
+
if (liveAgent)
|
|
262
|
+
markRoleComposition(liveAgent, { role: task.assignee, taskId: task.id });
|
|
212
263
|
// 只读评审角色(PT/DT)注册 ToolGuard:拦截 tracked source 写入 / git mutation / 含写标记 bash。
|
|
213
264
|
// 以 dsh-tools 类型为准:tools.guard(execution => reason|undefined),execution.name/arguments 为实际字段。
|
|
214
265
|
if (task.assignee === 'pt' || task.assignee === 'dt') {
|
|
215
266
|
const repoRoot = dRepo ?? sessionCwd; // DT 评审目标仓库;PT 以会话工作区为只读边界
|
|
216
267
|
const toolsSvc = agentCtx.tools;
|
|
217
|
-
// DT 额外叠加 wiki review namespace 收窄(projects/<chain>/review
|
|
268
|
+
// DT 额外叠加 wiki review namespace 收窄(projects/<repoSlug>/<chain>/review/);
|
|
269
|
+
// local KB 模式(D7):DT 改用 KB 写护栏(唯一可写区域=本地库根,评审页经 fs 写库根),
|
|
270
|
+
// remote 模式仍用 DT 收窄护栏(库根外全只读 + review namespace)。
|
|
271
|
+
const kbMode = this.configProvider.mode;
|
|
218
272
|
const guardFn = task.assignee === 'dt'
|
|
219
|
-
? buildDTWriteGuard(repoRoot, task.chainId)
|
|
273
|
+
? (kbMode === 'local' ? buildKbWriteGuard(ensureLocalKbRoot()) : buildDTWriteGuard(repoRoot, task.chainId))
|
|
220
274
|
: buildReadOnlyWriteGuard(repoRoot);
|
|
221
275
|
toolsSvc?.guard?.((e) => guardFn(e));
|
|
222
276
|
}
|
|
@@ -226,9 +280,14 @@ ${task.body}`);
|
|
|
226
280
|
// 挂载方式同 PT/DT:tools.guard 是注册方法(dsh-tools 类型),execution 以 { name, arguments } 传入。
|
|
227
281
|
if (task.assignee === 'p' || task.assignee === 'w') {
|
|
228
282
|
const toolsSvc = agentCtx.tools;
|
|
283
|
+
// local KB 模式(D7):W 改用 KB 写护栏(唯一可写区域=本地库根,交付页经 write 写库根),
|
|
284
|
+
// remote 模式 W 仍只读护栏(fs 零写);P 恒为 plan 写护栏(与 KB 模式无关)。
|
|
285
|
+
const kbMode = this.configProvider.mode;
|
|
229
286
|
const guardFn = task.assignee === 'p'
|
|
230
287
|
? buildPlanWriteGuard(sessionCwd)
|
|
231
|
-
:
|
|
288
|
+
: (kbMode === 'local' && task.assignee === 'w')
|
|
289
|
+
? buildKbWriteGuard(ensureLocalKbRoot())
|
|
290
|
+
: buildReadOnlyWriteGuard(sessionCwd);
|
|
232
291
|
toolsSvc?.guard?.((e) => guardFn(e));
|
|
233
292
|
}
|
|
234
293
|
// M4:D(execute) 注入 git 凭据(repo-local http extraheader,GitLab glpat-* 用 oauth2 basic)。
|
|
@@ -253,11 +312,11 @@ ${task.body}`);
|
|
|
253
312
|
context = this.buildContext(task, state, hasRunHistory);
|
|
254
313
|
// 模型候选链(Task 12):primary + fallbacks,model/provider 不可用时静默切换下一候选;
|
|
255
314
|
// 全部候选不可用 → block(model-unavailable) 抛给用户;非 model 错误 → failTask(原逻辑)。
|
|
256
|
-
const candidates = buildModelCandidates(this.
|
|
315
|
+
const candidates = buildModelCandidates(this.configProvider.getEffective(), task.assignee, this.defaultModel);
|
|
257
316
|
if (candidates.length === 0) {
|
|
258
317
|
// 无任何候选配置:不传 agentOptions(用部署默认),单次尝试
|
|
259
318
|
agent = hasRunHistory
|
|
260
|
-
? await this.resumeOrReuse(this.ctx.get('agents'), task.resumeSessionId ?? `kbn-${taskId}`, { setup })
|
|
319
|
+
? await this.resumeOrReuse(this.ctx.get('agents'), task.resumeSessionId ?? `kbn-${taskId}`, { setup, role: task.assignee, taskId: task.id })
|
|
261
320
|
: (await this.ctx.get('agents').create({
|
|
262
321
|
sessionId: SessionId(`kbn-${taskId}`),
|
|
263
322
|
meta: { cwd: sessionCwd },
|
|
@@ -272,7 +331,7 @@ ${task.body}`);
|
|
|
272
331
|
// hasRunHistory → resumeOrReuse 直接返回 AgentLike(内部已解包 .agent);create 返回 { agent } 需解包。
|
|
273
332
|
// 统一归一化为 AgentLike,避免二次解包(h.agent=undefined → if(!agent) 误标 failed)。
|
|
274
333
|
const h = hasRunHistory
|
|
275
|
-
? await this.resumeOrReuse(agents, task.resumeSessionId ?? `kbn-${taskId}`, { agentOptions: candidate, setup })
|
|
334
|
+
? await this.resumeOrReuse(agents, task.resumeSessionId ?? `kbn-${taskId}`, { agentOptions: candidate, setup, role: task.assignee, taskId: task.id })
|
|
276
335
|
: (await agents.create({ sessionId: SessionId(`kbn-${taskId}`), meta: { cwd: sessionCwd }, agentOptions: candidate, setup })).agent;
|
|
277
336
|
agent = h;
|
|
278
337
|
// 切换成功且非首选 → 发可审计 model/fallback 评论(记录证据,不弹用户)
|
|
@@ -315,6 +374,11 @@ ${task.body}`);
|
|
|
315
374
|
}
|
|
316
375
|
if (!agent)
|
|
317
376
|
return; // 防御:候选链耗尽已在上方 block(model-unavailable)/throw 处理
|
|
377
|
+
// Task 4(Bug C 告警):本轮增量事件基线——agent 拿到之后、followup 之前记录。
|
|
378
|
+
// 0.1.2(DSH-0.1.2-A4-03):Session.events 已移除 → followup 前记录 seq 基线,
|
|
379
|
+
// snapshotEvents(eventsBase) 即「本轮新增事件」(排除旧 incarnation 持久化事件),
|
|
380
|
+
// 供 protocol_violation 时识别 comment-only 收尾(交付滞留 comments,会话10事故形态)。
|
|
381
|
+
const eventsBase = Number(agent.session.seq);
|
|
318
382
|
// 归组:角色会话 attach 到 cwd 对应工作区(无则询问创建;失败不阻断)
|
|
319
383
|
const attachId = task.resumeSessionId ?? `kbn-${task.id}`;
|
|
320
384
|
await attachSessionToWorkspace(this.ctx, attachId, sessionCwd, 'task ' + task.id + ' ' + task.assignee + '/' + task.mode);
|
|
@@ -323,50 +387,57 @@ ${task.body}`);
|
|
|
323
387
|
console.error('[dsh-swarm][debug] runner followup sent ' + taskId);
|
|
324
388
|
await agent.whenIdle();
|
|
325
389
|
console.error('[dsh-swarm][debug] runner whenIdle resolved ' + taskId);
|
|
326
|
-
//
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
390
|
+
// 终态判据(session 10 事故修复):whenIdle resolve 后一次 snapshot,只看任务真实状态——
|
|
391
|
+
// 不再扫 session.events 全历史工具名(旧 incarnation 的 kanban_* 事件会污染判据,
|
|
392
|
+
// 「历史上调过工具名」≠「本轮成功提交」,骗过检查后卡永驻 running)。
|
|
393
|
+
// 确定态(done/archived/blocked/failed,TaskStatus 全集见 src/domain/types.ts)→ 防御日志 skip:
|
|
394
|
+
// blocked 上再 block 抛非法转换;failed 交调度器重派,不做 violation block。
|
|
395
|
+
// 非确定态(running/ready/todo/triage)→ protocol_violation 流程(证据链保留)。
|
|
396
|
+
const fresh = await this.kanban.snapshot();
|
|
397
|
+
const cur = fresh.tasks.get(taskId);
|
|
398
|
+
const settled = !!cur &&
|
|
399
|
+
(cur.status === 'done' || cur.status === 'archived' || cur.status === 'blocked' || cur.status === 'failed');
|
|
400
|
+
if (settled) {
|
|
401
|
+
console.error('[dsh-swarm][debug] runner skip block ' + taskId + ' status=' + (cur ? cur.status : 'gone'));
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
// 协议违规护栏:连续 protocol_violation 阻塞 ≥ maxProtocolViolations(默认 2)后,
|
|
405
|
+
// 下一次违规直接 gave_up(不再恢复,走 [blocked-final] 证据链抛给主 agent)。任意角色(含 pt/dt)统一。
|
|
406
|
+
const maxPV = this.configProvider.getEffective().dispatcher?.maxProtocolViolations ?? 2;
|
|
407
|
+
const priorViolations = fresh.events.filter((e) => e.taskId === taskId && e.kind === 'task/blocked' &&
|
|
408
|
+
String(e.payload['reason'] ?? '').startsWith('protocol_violation')).length;
|
|
409
|
+
const finalBlock = priorViolations >= maxPV;
|
|
410
|
+
const reason = finalBlock
|
|
411
|
+
? 'gave_up: protocol_violation after ' + maxPV + ' review cycles without complete/block'
|
|
412
|
+
: 'protocol_violation: idle without complete/block';
|
|
413
|
+
await this.kanban.blockTask(taskId, reason, 'system');
|
|
414
|
+
// Task 4(Bug C 告警):comment-only 收尾显形——放 block 之后(保证 block 一定先发生,
|
|
415
|
+
// 告警只追加在已阻塞卡上,不影响终态判据与 [blocked-final] 证据链快照)。
|
|
416
|
+
// 本轮增量事件命中 kanban_comment(经 toolName 兼容读取落盘/live 两形态)且未成功提交
|
|
417
|
+
// (能走到这里即终态判据已确认非确定态)→ 交付内容很可能滞留 comments,显形告警。
|
|
418
|
+
const commentOnly = agent.session.snapshotEvents(eventsBase).some((e) => toolName(e) === 'kanban_comment');
|
|
419
|
+
if (commentOnly) {
|
|
420
|
+
await this.kanban.comment(taskId, '[comment-only-closeout] 本轮仅用 kanban_comment 交付(无 complete/block)。交付内容可能滞留 comments(如角色工具缺失/会话被错误复用);请人工核对 comments 与产物后解除阻塞重派。', 'system');
|
|
338
421
|
}
|
|
339
|
-
|
|
340
|
-
//
|
|
341
|
-
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
String(e.payload['reason'] ?? '')
|
|
345
|
-
|
|
346
|
-
const
|
|
347
|
-
|
|
348
|
-
: '
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
.filter((e) => e.kind === 'task/commented')
|
|
359
|
-
.map((e) => ` - seq=${e.seq} at=${e.at} author=${e.author}: ${String(e.payload['body'] ?? '')}`)
|
|
360
|
-
.join('\n');
|
|
361
|
-
await this.kanban.comment(taskId, [
|
|
362
|
-
'[blocked-final] 协议违规超护栏,任务不再自动恢复(人工解除后仍按 gave_up 终态处理)。',
|
|
363
|
-
'## block 时间线',
|
|
364
|
-
blockTimeline,
|
|
365
|
-
'## 复核/评论时间线',
|
|
366
|
-
reviewTimeline || ' - (无复核评论)',
|
|
367
|
-
'最终原因: ' + reason,
|
|
368
|
-
].join('\n'), 'system');
|
|
369
|
-
}
|
|
422
|
+
if (finalBlock) {
|
|
423
|
+
// [blocked-final] 证据链:block 时间线 + 复核/评论时间线 + 最终 reason(system 确定性写入)
|
|
424
|
+
const evs = fresh.events.filter((e) => e.taskId === taskId);
|
|
425
|
+
const blockTimeline = evs
|
|
426
|
+
.filter((e) => e.kind === 'task/blocked')
|
|
427
|
+
.map((e) => ` - seq=${e.seq} at=${e.at} author=${e.author} reason=${String(e.payload['reason'] ?? '')}`)
|
|
428
|
+
.join('\n');
|
|
429
|
+
const reviewTimeline = evs
|
|
430
|
+
.filter((e) => e.kind === 'task/commented')
|
|
431
|
+
.map((e) => ` - seq=${e.seq} at=${e.at} author=${e.author}: ${String(e.payload['body'] ?? '')}`)
|
|
432
|
+
.join('\n');
|
|
433
|
+
await this.kanban.comment(taskId, [
|
|
434
|
+
'[blocked-final] 协议违规超护栏,任务不再自动恢复(人工解除后仍按 gave_up 终态处理)。',
|
|
435
|
+
'## block 时间线',
|
|
436
|
+
blockTimeline,
|
|
437
|
+
'## 复核/评论时间线',
|
|
438
|
+
reviewTimeline || ' - (无复核评论)',
|
|
439
|
+
'最终原因: ' + reason,
|
|
440
|
+
].join('\n'), 'system');
|
|
370
441
|
}
|
|
371
442
|
}
|
|
372
443
|
}
|
|
@@ -387,14 +458,56 @@ ${task.body}`);
|
|
|
387
458
|
unregisterDtTaskChain(task.id);
|
|
388
459
|
}
|
|
389
460
|
}
|
|
390
|
-
/** RC2:resume 前先查 agents registry 同名会话是否仍 live——live
|
|
391
|
-
*
|
|
392
|
-
*
|
|
461
|
+
/** RC2:resume 前先查 agents registry 同名会话是否仍 live——live 且组合标记匹配(role+taskId 一致)才复用。
|
|
462
|
+
* Task 2(会话10事故根因A):此前对 live agent 盲复用——GUI 打开同名会话产生的默认组合 incarnation
|
|
463
|
+
* 没有角色 preset/kanban_complete 工具面(setup 被跳过),模型只能把交付塞 kanban_comment。
|
|
464
|
+
* 现在标记缺失/不匹配时按宿主能力降级(探明结论):
|
|
465
|
+
* - (i) dispose 不可行:AgentHandle.dispose 仅创建者持有(dsh-agent types/index.d.ts:155-158,
|
|
466
|
+
* "ctx.agents.get(id) still returns a bare Agent"),无从释放他人 incarnation。
|
|
467
|
+
* - (ii) 修复可行(生产主路径):Agent.ctx 公开(runtime-types.d.ts:72)且经它访问的 tools 注册表
|
|
468
|
+
* 可枚举/可注册(ToolRuntime.get(name, scope) 返回该 scope 可见定义;register 经 traced ctx 落到
|
|
469
|
+
* 该 agent 的 scope 层)→ 重跑 setup 幂等补挂(effort/approval/sandbox/preset/角色工具/护栏),
|
|
470
|
+
* 补挂后必须验证 kanban_complete 可见才算修复成功。kanban_complete 是所有 runner 角色
|
|
471
|
+
* (p/w/d/pt/dt)都注册的任务工具,且全局面只读子集不含它(main-session-tools.ts:134),
|
|
472
|
+
* 故「scope 内可见 kanban_complete」⟺「该 incarnation 经我方角色 setup 组合过」。
|
|
473
|
+
* - (iii) 兜底:工具注册表不可达(异常宿主/测试桩)→ 抛错走 failTask。错误信息刻意不含
|
|
474
|
+
* isInfraError 关键词 → attempts+1 计入重试预算:每次重派都会撞同一个 live 错误 incarnation
|
|
475
|
+
* 直至重试预算耗尽——有界,不会形成无限重派循环(若误标 infra 则 attempts 不递增才会无限)。
|
|
476
|
+
* agents.get 未实现 → 回退 resume(原行为不回归)。 */
|
|
393
477
|
async resumeOrReuse(agents, sessionId, opts) {
|
|
394
478
|
const live = agents.get?.(sessionId);
|
|
395
|
-
if (live)
|
|
396
|
-
|
|
397
|
-
|
|
479
|
+
if (live) {
|
|
480
|
+
// 标记匹配(同 incarnation、同角色、同卡)→ 与 setup 组合完全一致 → 安全复用(原行为收窄版)
|
|
481
|
+
const marker = typeof live === 'object' && live !== null ? roleCompositions.get(live) : undefined;
|
|
482
|
+
if (marker && marker.role === opts.role && marker.taskId === opts.taskId)
|
|
483
|
+
return live;
|
|
484
|
+
// 标记缺失/不匹配 → 绝不盲用。工具注册表(live.ctx.tools,与 installRoleTools 同一访问路径):
|
|
485
|
+
const liveCtx = live.ctx;
|
|
486
|
+
const toolsSvc = liveCtx ? liveCtx.tools : undefined;
|
|
487
|
+
if (toolsSvc?.get) {
|
|
488
|
+
if (toolsSvc.get('kanban_complete', live)) {
|
|
489
|
+
// 工具面完备但标记缺失/不匹配:标记写入失败的历史 incarnation,或旧/手工数据把
|
|
490
|
+
// resumeSessionId 指向同角色其它卡(注:2026-09-07 起 createReworkTask 不再继承源卡
|
|
491
|
+
// resumeSessionId——返工卡走自己的 kbn-<id> 会话,此「跨卡复用」分支为 dead path 防御)——
|
|
492
|
+
// 验证过工具面后复用,不重复补挂(重复 register 同名工具会被 dsh-tools 拒绝)。
|
|
493
|
+
return live;
|
|
494
|
+
}
|
|
495
|
+
// GUI 默认组合 incarnation:缺 kanban_complete → 重跑 setup 幂等补挂后复用。
|
|
496
|
+
// setup 对 live ctx 的各步均可加:effort waterfall/approval+sandbox append(known 事件类型、
|
|
497
|
+
// latest-wins)/preset mount(bindings 覆盖)/角色工具(此前为默认组合,无同名冲突)/护栏。
|
|
498
|
+
await opts.setup(liveCtx);
|
|
499
|
+
if (toolsSvc.get('kanban_complete', live))
|
|
500
|
+
return live; // 修复后必须验证到位,防静默半修复
|
|
501
|
+
throw new Error('live session composition repair failed: kanban_complete still missing after re-setup (session ' + sessionId + ')');
|
|
502
|
+
}
|
|
503
|
+
// (iii):既无标记又无法访问工具注册表 → 拒绝盲复用(会复现事故),failTask 有界重试(见上)。
|
|
504
|
+
throw new Error('live session composition mismatch and unverifiable (no marker, no tool registry): ' + sessionId + ' — refusing blind reuse (incident root cause A)');
|
|
505
|
+
}
|
|
506
|
+
const { agentOptions, setup } = opts;
|
|
507
|
+
const resumeOpts = { resumeSessionId: SessionId(sessionId), setup };
|
|
508
|
+
if (agentOptions)
|
|
509
|
+
resumeOpts['agentOptions'] = agentOptions;
|
|
510
|
+
const h = await agents.resume(resumeOpts);
|
|
398
511
|
return h.agent;
|
|
399
512
|
}
|
|
400
513
|
/** M3(B):D(execute) 目标仓库在会话工作空间外时,跑 D 前询问用户是否允许。
|
|
@@ -159,7 +159,10 @@ export class ChainAuditor {
|
|
|
159
159
|
if (workspaceDir && agent.session?.header?.cwd && !isPathInside(agent.session.header.cwd, workspaceDir)) {
|
|
160
160
|
continue;
|
|
161
161
|
}
|
|
162
|
-
|
|
162
|
+
// 0.1.2(DSH-0.1.2-A4-03):Session.events 移除 → snapshotEvents() 优先,回退 events(旧宿主/测试)
|
|
163
|
+
const ses = agent.session;
|
|
164
|
+
const sessionEvents = ses?.snapshotEvents?.() ?? ses?.events ?? [];
|
|
165
|
+
const hit = sessionWriteEvidence(String(agent.id), this.workspacesRoot, sessionEvents);
|
|
163
166
|
if (hit)
|
|
164
167
|
evidence.push(hit);
|
|
165
168
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ConfigProvider } from '../services/config-provider.js';
|
|
3
3
|
import { EventWaker } from './event-waker.js';
|
|
4
4
|
import { Watchdog } from './watchdog.js';
|
|
5
5
|
import type { KanbanService } from '../domain/kanban-service.js';
|
|
6
|
+
import type { Task } from '../domain/types.js';
|
|
6
7
|
export interface AgentModelOptions {
|
|
7
8
|
provider: string;
|
|
8
9
|
model: string;
|
|
@@ -22,7 +23,26 @@ export interface DispatcherDeps {
|
|
|
22
23
|
stateFile: string;
|
|
23
24
|
/** 修复轮 6:调度器运行日志文件(storageDir/dispatcher.log)。 */
|
|
24
25
|
logFile: string;
|
|
26
|
+
/** Fix round 1:宿主 agents 注册表(ctx.get('agents'))——启动 reconcile 判别 kbn-<taskId>
|
|
27
|
+
* 会话是否仍 live(插件热重载豁免);缺省/无 get 方法时按原行为收敛(保守)。 */
|
|
28
|
+
agents?: unknown;
|
|
29
|
+
/** 防线①:链级停滞探针(生产传 VOrchestrator;测试传桩)。缺省=看门狗关闭(行为同旧)。 */
|
|
30
|
+
stallProbe?: {
|
|
31
|
+
orchestrationOf(chainId: string): {
|
|
32
|
+
phase: string;
|
|
33
|
+
} | null;
|
|
34
|
+
isWakeInFlight(chainId: string): boolean;
|
|
35
|
+
wake(chainId: string): Promise<void>;
|
|
36
|
+
};
|
|
25
37
|
}
|
|
38
|
+
/** wakeImpl 装配(防线②,2026-09-04 mtmgp81q 死法教训):wakeV 异常必须落盘 dispatcher.log——
|
|
39
|
+
* 原实现仅 console.error,无控制台运行时零痕迹(排障最大障碍)。吞异常是为防 withTimeout
|
|
40
|
+
* 超时后迟到的 rejection 变 unhandledRejection;onSettled(saveOrchs)无论成败都执行。 */
|
|
41
|
+
export declare function makeWakeImpl(wakeV: (chainId: string) => Promise<void>, logFile: string, onSettled: () => void): (chainId: string) => Promise<void>;
|
|
42
|
+
/** 防线①:链级进度看门狗阈值。tick=2000ms × 45 ticks = 90s 无进展即重唤醒(grill Q2 决议)。 */
|
|
43
|
+
export declare const STALL_WATCHDOG_TICKS = 45;
|
|
44
|
+
/** 防线①:链级重唤醒上限(grill Q3 决议:超限 [create-failed] + chain/blocked)。 */
|
|
45
|
+
export declare const STALL_WATCHDOG_REWAKE_LIMIT = 3;
|
|
26
46
|
/** 调度器:事件唤醒 V(R20 逐阶段建卡)+ 每任务一次性角色 agent + 心跳看门狗。
|
|
27
47
|
* - B1:failed 且 attempts<maxRetries 的任务重派(claim→running,AgentRunner resume 同一会话);
|
|
28
48
|
* attempts≥maxRetries 熔断 blocked(gave_up)。
|
|
@@ -36,15 +56,54 @@ export declare class Dispatcher {
|
|
|
36
56
|
private readonly maxRetries;
|
|
37
57
|
private readonly stateFile;
|
|
38
58
|
private readonly logFile;
|
|
59
|
+
private readonly agents;
|
|
60
|
+
private readonly stallProbe;
|
|
39
61
|
private lastSeq;
|
|
62
|
+
private orphanReconciled;
|
|
40
63
|
private inFlight;
|
|
64
|
+
private stallState;
|
|
41
65
|
private timer;
|
|
42
66
|
constructor(deps: DispatcherDeps);
|
|
43
67
|
private ensureLastSeq;
|
|
44
68
|
tick(): Promise<void>;
|
|
69
|
+
/** 防线①:链级进度看门狗(与 wakeVInner 内建 stall 互补,后者挂在 wakeVInner 内部,
|
|
70
|
+
* 异常退出/挂起/未触发时失效——2026-09-04 mtmgp81q)。只看最终事实:
|
|
71
|
+
* executing 非 summary + 链上零非终态任务卡 + 无在途唤醒 + 本链无新看板事件,
|
|
72
|
+
* 持续 STALL_WATCHDOG_TICKS 个 tick → 重唤醒(≤STALL_WATCHDOG_REWAKE_LIMIT 次)→
|
|
73
|
+
* 仍停滞 → [create-failed] 评论(有锚点卡时)+ blockChain 终态(人工恢复=删链重跑)。 */
|
|
74
|
+
private chainStallWatchdog;
|
|
45
75
|
start(intervalMs: number): void;
|
|
76
|
+
/** 整链硬删除联动(E):purge 物理重排 events.jsonl seq,游标必须同步钳到当前 maxSeq。
|
|
77
|
+
* 否则删链后新建链的可唤醒事件(seq < 旧内存游标)被运行中实例永久跳过——A1 仅在启动时自愈,
|
|
78
|
+
* 覆盖不了运行中删链场景(2026-09-02 残留审计结论)。 */
|
|
79
|
+
onPurge(): Promise<void>;
|
|
46
80
|
stop(): void;
|
|
47
81
|
}
|
|
48
82
|
/** 调度层装配:事件唤醒 V(R20 逐阶段建卡)+ 每任务一次性角色 agent + 心跳看门狗。
|
|
49
|
-
* 仅在 agents 与 kanban 服务同时可用时由插件入口调用(不依赖可能已错过的 ready 事件)。
|
|
50
|
-
|
|
83
|
+
* 仅在 agents 与 kanban 服务同时可用时由插件入口调用(不依赖可能已错过的 ready 事件)。
|
|
84
|
+
* Task 7:收 ConfigProvider——storageDir 取启动时快照;wiki/模型链经 getEffective() 调用时热读取。 */
|
|
85
|
+
/** 启动 reconcile(F):剔除事件流中已不存在的链的编排 entry(历史残留/外部 purge)。
|
|
86
|
+
* 原地删除并返回被移除的 chainId 列表(调用方负责持久化与日志)。 */
|
|
87
|
+
export declare function reconcileOrchestrations<T>(orch: Map<string, T>, chains: Set<string>): string[];
|
|
88
|
+
/** 启动 reconcile(G):进程重启会杀死 runner 的 whenIdle 协程,上次遗留的 running 卡无人收尾,
|
|
89
|
+
* 看门狗默认 4h(staleTimeoutSeconds=14400)才回收——重启后立即把 running 孤儿卡收敛为 blocked
|
|
90
|
+
* (system comment + blockTask),中断显形且可重派续跑(重派将 resume 同一会话,进度保留)。
|
|
91
|
+
* 状态机注:TaskStatus 无独立 'claimed' 态——claimTask 发 task/claimed 事件后投影即为 running,
|
|
92
|
+
* 扫描 running 即覆盖「claimed 未收尾」;todo/ready/triage 从未派发,done/blocked/failed/archived
|
|
93
|
+
* 已有归属或终态(且 failed 的处置归 B1 重派/熔断管辖),均不动。
|
|
94
|
+
* Fix round 1(热重载兼容,双重判据):收敛每张 running 卡前先查宿主 agents 注册表
|
|
95
|
+
* ctx.get('agents').get('kbn-<taskId>')(session id 构造同 AgentRunner.resumeOrReuse,Task 2 同款探明)。
|
|
96
|
+
* 两个世界的分野:
|
|
97
|
+
* - 进程重启:agents 注册表随宿主进程消亡,新进程内 kbn-<taskId> 必然查不到(undefined)
|
|
98
|
+
* → 会话已死 → 全部收敛,语义与修复前一致;
|
|
99
|
+
* - 插件热重载:宿主进程未死,dsh 插件重载重跑 startDispatcherInner → orphanReconciled 闸复位,
|
|
100
|
+
* 但宿主 agent 会话仍 live(注册表命中)→ 本进程真在跑,不是孤儿 → 跳过该卡,
|
|
101
|
+
* 避免把合法 running 卡误收敛为 blocked。
|
|
102
|
+
* agents 服务缺失 / 无 get 方法(测试桩/异常宿主)→ 无法证明 live,按原行为收敛(保守)。
|
|
103
|
+
* 调用位置必须在游标自愈(ensureLastSeq)之后、事件消费之前:游标 rewind 会全量重放旧事件,
|
|
104
|
+
* 先收敛孤儿可保证本次 tick 消费的重放事件面对的是已收敛状态,且孤儿产生的 block 事件天然
|
|
105
|
+
* 落在本轮快照之外(下一轮才被消费唤醒 V 走阻塞复核),不与启动重放交错。
|
|
106
|
+
* 幂等:仅启动执行一次(调用方置闸);对同一卡重复调用时状态机拒绝 running→blocked 之外的
|
|
107
|
+
* 非法转换,comment/block 失败均 try/catch 记日志跳过不抛(单卡失败不阻断其余收敛)。 */
|
|
108
|
+
export declare function reconcileOrphanRunningTasks(kanban: KanbanService, tasks: Iterable<Task>, logFile: string, agents?: unknown): Promise<string[]>;
|
|
109
|
+
export declare function startDispatcher(ctx: Context, configProvider: ConfigProvider): void;
|