@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
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// src/roles/clean-fs-tools.ts
|
|
2
|
+
// sandbox-menu-align Task 1(计划 /tmp/sandbox-menu-align-plan.md):danger-full-access 会话
|
|
3
|
+
// (P、D(execute))的 write/edit/bash 工具菜单去毒。
|
|
4
|
+
//
|
|
5
|
+
// 为什么:宿主 dsh-tool-fs / dsh-tool-bash 在组合层把可选参数 sandbox_permissions / justification
|
|
6
|
+
// 合入 write/edit/bash schema(dsh-tool-fs lib/index.js:617/771 schemaFields()、dsh-tool-bash
|
|
7
|
+
// lib/index.js:285-289;广播与否只看组合默认沙箱模式 :1111,会话层 sandbox/mode 改不掉)。
|
|
8
|
+
// 在 danger-full-access(权限天花板)会话里,escalation「必须严格更宽」无更宽可升——任何值
|
|
9
|
+
// 都被 approveEscalation 拒绝,模型却仍从菜单看到这两个按钮,触发拒绝-重试循环
|
|
10
|
+
// (2026-09-02 P 会话 30 连败事故根因)。plan-guard 的带参拦截保留为兜底网(toolsets.ts 不动),
|
|
11
|
+
// 本文件是根治面:agent scope shadow 注册「无带毒参数的干净版」盖住宿主版本 + execute 剥参转发。
|
|
12
|
+
//
|
|
13
|
+
// 宿主探明结论(详见 .superpowers/sdd/sandbox-menu-align-plan/task-1-report.md):
|
|
14
|
+
// - 遮蔽语义(dsh-tools lib/index.js view/get + dsh-scope ScopedLayers):scope 自身层注册在
|
|
15
|
+
// inherited(global + preset standing 祖先层)之后覆盖 visible map → agent scope 同名注册
|
|
16
|
+
// 真实盖住宿主版本;「重复注册 fail」仅指同一层内(NamedEntries.insert),跨层 shadow 合法。
|
|
17
|
+
// agentPresets.mount 是 bindScopeParent(agent scope 挂为 preset standing scope 的 child),
|
|
18
|
+
// preset 里 tool-fs/tool-bash 的注册落在 standing 祖先层而非 agent own 层 → 本模块经
|
|
19
|
+
// agentCtx.tools.register 落 own 层,无同层冲突(Task 2 的 kanban_comment 遮蔽已实证该通道)。
|
|
20
|
+
// - 转发通道:agentCtx.tools.get(name, agent) 返回该 scope 可见定义(shadow 注册前即宿主原定义,
|
|
21
|
+
// kanban-p/d 的 fs/bash 在 preset standing 祖先层,全局视角 get(name) 反而可能取不到);
|
|
22
|
+
// 直接调用 hostDef.execute(cleanArgs, exec) 与注册表 dispatchToolBody 的调用形态逐字一致
|
|
23
|
+
// (lib/index.js:3174 tool.execute(exec.arguments, exec))。绕开 approval/escalation 前置管线
|
|
24
|
+
// 安全:resolvePolicy 在两参皆缺时走 standingPolicy 路径(dsh-sandbox validateEscalationArgs
|
|
25
|
+
// 对 (undefined, undefined) 放行)——即官方默认行为,escalation 管线本就不触发。
|
|
26
|
+
// - guard 管线在 dispatch 前运行且 deny-only(registry pre-execute → guardReason → dispatch),
|
|
27
|
+
// 转发是对宿主 execute 的普通函数调用,不存在 guard 二次绕过问题。
|
|
28
|
+
// - justification 仅为 escalation 配套参数(dsh-sandbox:「justification is only valid together
|
|
29
|
+
// with sandbox_permissions」),与两参一并剥离 = 官方 standing 行为,无害。
|
|
30
|
+
/** 需剥离的带毒参数(dsh-sandbox escalation 配对参数;写死避免依赖宿主内部导出)。 */
|
|
31
|
+
export const ESCALATION_PARAM_KEYS = ['sandbox_permissions', 'justification'];
|
|
32
|
+
/** 需去毒的宿主工具名单:write/edit(dsh-tool-fs)+ bash(dsh-tool-bash,schema 同样带毒)。 */
|
|
33
|
+
const CLEAN_FS_TOOL_NAMES = ['write', 'edit', 'bash'];
|
|
34
|
+
/** 本模块 shadow 的品牌标记(幂等判定:setup 重入/live 修复重跑 setup 时识别已挂 shadow)。
|
|
35
|
+
* Symbol.for 跨模块实例一致;对象展开会复制自有可枚举 symbol 属性,标记随干净版定义存活。 */
|
|
36
|
+
const CLEAN_FS_BRAND = Symbol.for('dsh-swarm.clean-fs-shadow');
|
|
37
|
+
/** 从 agentCtx 解出工具注册表(缺 service = 测试桩/异常宿主 → undefined)。 */
|
|
38
|
+
function toolsRuntimeOf(agentCtx) {
|
|
39
|
+
const tools = agentCtx.tools;
|
|
40
|
+
if (!tools || typeof tools.get !== 'function' || typeof tools.register !== 'function')
|
|
41
|
+
return undefined;
|
|
42
|
+
return tools;
|
|
43
|
+
}
|
|
44
|
+
/** 剥离 escalation 参数:净化后新对象返回;本就干净则原对象透传(零拷贝零改写)。 */
|
|
45
|
+
export function stripEscalationArgs(args) {
|
|
46
|
+
if (!args || typeof args !== 'object' || Array.isArray(args))
|
|
47
|
+
return args;
|
|
48
|
+
const a = args;
|
|
49
|
+
const poisoned = ESCALATION_PARAM_KEYS.some((k) => a[k] !== undefined);
|
|
50
|
+
if (!poisoned)
|
|
51
|
+
return args;
|
|
52
|
+
const { sandbox_permissions: _sp, justification: _j, ...rest } = a;
|
|
53
|
+
return rest;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 给 danger-full-access 会话 shadow 注册去毒版 write/edit/bash。
|
|
57
|
+
*
|
|
58
|
+
* 行为契约:
|
|
59
|
+
* - 干净版 = 宿主定义浅拷贝 + parameters 去掉两带毒字段(JSON 深拷贝后删除,注册表保证 lossless JSON)
|
|
60
|
+
* + execute 换成「剥参 → 转发宿主原工具 execute」。写逻辑零自实现,行为 100% 官方。
|
|
61
|
+
* - 宿主 schema 本就无带毒参数(无沙箱后端的组合,escalationModes 为空)→ 无需 shadow,跳过
|
|
62
|
+
* (最小触碰面:不去盖一个本来就干净的版本)。
|
|
63
|
+
* - 转发失败面(宿主定义不可达 / 缺 execute / 同层注册冲突)→ 该工具不挂 + console.error 显形,
|
|
64
|
+
* 宿主带毒版本保持可见(fail-safe:绝不注册一个自实现写文件的半成品)。
|
|
65
|
+
* - 幂等:setup 重入(live 会话修复路径 resumeOrReuse 会重跑 setup)先以品牌标记识别已挂
|
|
66
|
+
* shadow → 跳过;同层冲突抛错也被捕获显形,不炸 setup(宿主版本继续可见,plan-guard 兜底网仍在)。
|
|
67
|
+
*
|
|
68
|
+
* @param agentCtx agent setup 收到的 scoped ctx(agentCtx.tools 即该 scope 的注册表)
|
|
69
|
+
* @param agent Agent 实例(= dsh-tools scope key,exec.agent 同源;get 的 scope 视角参数)
|
|
70
|
+
*/
|
|
71
|
+
export function installCleanFsTools(agentCtx, agent) {
|
|
72
|
+
const tools = toolsRuntimeOf(agentCtx);
|
|
73
|
+
if (!tools)
|
|
74
|
+
return; // 无工具服务(测试桩)跳过;宿主版本自然保持可见
|
|
75
|
+
for (const name of CLEAN_FS_TOOL_NAMES) {
|
|
76
|
+
try {
|
|
77
|
+
// shadow 注册前取样:get(name, agent) 走该 agent scope 视角——own 层尚无同名时返回
|
|
78
|
+
// inherited(global + preset standing 祖先层)里的宿主原定义
|
|
79
|
+
const visible = tools.get(name, agent);
|
|
80
|
+
if (!visible || typeof visible !== 'object' || !visible.parameters || typeof visible.execute !== 'function') {
|
|
81
|
+
console.error('[dsh-swarm][clean-fs] host "' + name + '" not reachable via agent-scope registry — shadow skipped, host version stays visible');
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (visible[CLEAN_FS_BRAND])
|
|
85
|
+
continue; // 幂等:上次 setup 已挂 shadow
|
|
86
|
+
const props = visible.parameters.properties;
|
|
87
|
+
const poisoned = !!props && ESCALATION_PARAM_KEYS.some((k) => props[k] !== undefined);
|
|
88
|
+
if (!poisoned)
|
|
89
|
+
continue; // 宿主 schema 本就干净(无沙箱组合)→ 无需 shadow
|
|
90
|
+
// parameters 深拷贝去毒(注册表已保证 lossless JSON,JSON 往返安全);
|
|
91
|
+
// 宿主编译态无 additionalProperties:false(parameterSchemaSpecToJsonSchema 开根),
|
|
92
|
+
// 模型惯性硬塞的带毒参数由 execute 剥参兜住,不会在宿主 execute 的 args 校验处炸出。
|
|
93
|
+
const parameters = JSON.parse(JSON.stringify(visible.parameters));
|
|
94
|
+
if (parameters['properties'] && typeof parameters['properties'] === 'object') {
|
|
95
|
+
for (const key of ESCALATION_PARAM_KEYS)
|
|
96
|
+
delete parameters['properties'][key];
|
|
97
|
+
}
|
|
98
|
+
// 防御:宿主未来若把两参数标成必填,required 一并过滤(当前为可选,此过滤为空操作)
|
|
99
|
+
if (Array.isArray(parameters['required'])) {
|
|
100
|
+
parameters['required'] = parameters['required'].filter((k) => !ESCALATION_PARAM_KEYS.includes(k));
|
|
101
|
+
}
|
|
102
|
+
tools.register({
|
|
103
|
+
...visible,
|
|
104
|
+
parameters,
|
|
105
|
+
[CLEAN_FS_BRAND]: true,
|
|
106
|
+
// 剥参后转发宿主原 execute:调用形态与注册表 dispatchToolBody 逐字一致(args, exec)。
|
|
107
|
+
// 禁止在此自实现任何写逻辑——行为漂移风险,宿主升级即失效。
|
|
108
|
+
execute(args, exec) {
|
|
109
|
+
return visible.execute(stripEscalationArgs(args), exec);
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// fail-safe:单工具失败只降级该工具(宿主版本保持可见),不阻断其余工具与 setup
|
|
115
|
+
console.error('[dsh-swarm][clean-fs] shadow register failed for "' + name + '" — host version stays visible: ' + String(err));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// src/roles/skill-installer.ts
|
|
2
|
+
// llm-wiki skill 自动安装(设计 §7 / D6):DSH 的 dsh-tool-skill 只从 ~/.agents/skills/ 发现 skill,
|
|
3
|
+
// 不扫插件包内 skills 目录(同 agent-presets 只认 $DSH_HOME/.agent-presets 的先例)。
|
|
4
|
+
// 完整复制(含 deps/assets/tests 全部子目录);幂等(SKILL.md 已存在跳过);尽力而为(失败仅告警)。
|
|
5
|
+
import { cpSync, existsSync, mkdirSync } from 'node:fs';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
export function packageSkillDir() {
|
|
10
|
+
return fileURLToPath(new URL('../../skills/llm-wiki-skill/', import.meta.url));
|
|
11
|
+
}
|
|
12
|
+
export function userSkillsRoot() {
|
|
13
|
+
return join(homedir(), '.agents', 'skills');
|
|
14
|
+
}
|
|
15
|
+
export function installLlWikiSkill(opts) {
|
|
16
|
+
const src = opts?.src ?? packageSkillDir();
|
|
17
|
+
const dst = join(opts?.dstRoot ?? userSkillsRoot(), 'llm-wiki-skill');
|
|
18
|
+
if (!existsSync(src))
|
|
19
|
+
return 'skipped';
|
|
20
|
+
if (existsSync(join(dst, 'SKILL.md')))
|
|
21
|
+
return 'exists';
|
|
22
|
+
try {
|
|
23
|
+
mkdirSync(dst, { recursive: true });
|
|
24
|
+
cpSync(src, dst, { recursive: true });
|
|
25
|
+
console.info('[dsh-swarm] llm-wiki-skill installed -> ' + dst);
|
|
26
|
+
return 'installed';
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.warn('[dsh-swarm] llm-wiki-skill install skipped -> ' + dst + ': ' + String(err));
|
|
30
|
+
return 'skipped';
|
|
31
|
+
}
|
|
32
|
+
}
|
package/lib/roles/toolsets.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import type { Context } from '@deepseek-ai/cordis';
|
|
|
2
2
|
import { KanbanService } from '../domain/kanban-service.js';
|
|
3
3
|
import type { WikiVaultClient } from '../wiki/wiki-vault-client.js';
|
|
4
4
|
import type { Role } from '../domain/types.js';
|
|
5
|
-
/** 判定 wiki 路径是否位于 DT 评审命名空间 projects/<
|
|
5
|
+
/** 判定 wiki 路径是否位于 DT 评审命名空间 projects/<repoSlug>/<chainId>/review/
|
|
6
|
+
* (repoSlug=[a-z0-9-]+ 通配,chainId 精确匹配;拒绝 ../、绝对路径、跨链、旧格式直挂根)。 */
|
|
6
7
|
export declare function isReviewNamespacePath(pagePath: string, chainId: string): boolean;
|
|
7
8
|
/**
|
|
8
9
|
* 评审引擎决策(DT):ocr(open-code-review Delegation 模式)优先;
|
|
@@ -25,6 +26,16 @@ export declare function buildReadOnlyWriteGuard(_repoRoot: string): (execution:
|
|
|
25
26
|
name?: string;
|
|
26
27
|
arguments?: unknown;
|
|
27
28
|
}) => string | undefined;
|
|
29
|
+
/** 本地模式 KB 写护栏(D7/D10):全名只读拦截(base)之上,仅对「实际写目标全部为
|
|
30
|
+
* 库根内绝对路径」的写操作豁免。目标提取不到 / 相对路径 / 越界 → 维持 base 拒绝(fail-closed)。
|
|
31
|
+
* 仅 local 模式对 W/DT 装配;remote 模式仍用 buildReadOnlyWriteGuard(库根写也被拒)。
|
|
32
|
+
* 审查修订(C2):extractWriteTargets 保持既有双参签名(cmd, redirectRe),按入口分流
|
|
33
|
+
* 传 BASH_REDIRECT_TARGET_RE / CODE_REDIRECT_TARGET_RE(与 buildPlanWriteGuard 同款)——
|
|
34
|
+
* 单参调用会在首个写意图命令上 TypeError。 */
|
|
35
|
+
export declare function buildKbWriteGuard(kbRoot: string): (execution: {
|
|
36
|
+
name?: string;
|
|
37
|
+
arguments?: unknown;
|
|
38
|
+
}) => string | undefined;
|
|
28
39
|
/** P 专用写护栏(Q3):读全放行;git mutation 一律拒绝;写仅允许目标仓库 openspec/changes 目录。
|
|
29
40
|
* 直接 fs 写工具 → 路径经 resolve 归一化后须落在 <workspaceRoot>/openspec/changes/ 之下(相邻段对判定);
|
|
30
41
|
* bash/run_code 写标记命令 → 命令文本须含 `openspec/changes` 子串,且提取出的实际写目标(重定向
|
|
@@ -42,6 +53,7 @@ export declare function installRoleTools(agentCtx: Context, role: Role, deps: {
|
|
|
42
53
|
kanban: KanbanService;
|
|
43
54
|
wiki: WikiVaultClient;
|
|
44
55
|
taskId?: string;
|
|
56
|
+
kbMode?: 'remote' | 'local';
|
|
45
57
|
}): Promise<void>;
|
|
46
58
|
export declare function registerDtTaskChain(taskId: string, chainId: string): void;
|
|
47
59
|
export declare function unregisterDtTaskChain(taskId: string): void;
|
package/lib/roles/toolsets.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { resolve } from 'node:path';
|
|
2
2
|
import { KanbanService } from '../domain/kanban-service.js';
|
|
3
|
+
import { isInsideKbRoot } from '../wiki/local-kb.js';
|
|
3
4
|
import { buildKanbanTools } from '../tools/kanban-tools.js';
|
|
4
5
|
import { buildSpecCardTools } from '../tools/spec-card-tools.js';
|
|
5
6
|
import { buildWikiTools } from '../tools/wiki-tools.js';
|
|
@@ -25,6 +26,29 @@ const GIT_READ_VERBS = new Set(['status', 'log', 'show', 'diff', 'rev-parse', 'l
|
|
|
25
26
|
* 可直接执行任意文件写 API)∪ 原地编辑器 -i(sed -i / perl -i / awk -i inplace:可越过重定向直达
|
|
26
27
|
* 源码原地改写,P 写护栏硬约束须识别,与 BASH_WRITE_RE 同源)。 */
|
|
27
28
|
const GUARD_WRITE_INTENT_RE = /(?:\b(?:touch|mkdir|rm|rmdir|mv|cp|tee|truncate|install|ln|dd|chmod|chown|make|cmake)\b|\b(?:sed|perl|awk)\s+-i\b|\b(?:node|python|python3|perl|ruby|php|sh|bash)\s+-[ec]\b|(?<!2)>>|(?<!2)(?<!>)>)/i;
|
|
29
|
+
/** run_code(JS/TS/Python 程序)重定向写意图:仅带空格形态 \s>>?(run_code 内嵌 shell 字符串的
|
|
30
|
+
* `echo x > f` 重定向,与 BASH_WRITE_RE 的带空格形态同源)。对 run_code 必须与 bash 的
|
|
31
|
+
* GUARD_WRITE_INTENT_RE 分离(planguard-falsepositive 根治):
|
|
32
|
+
* 1) 无空格 `>` 规则移除——JS 里 `=>`(箭头函数)、`remaining>0`(比较)是运算符而非重定向,
|
|
33
|
+
* 误判致 P 会话 openspec 裸 edit 随机被拒(15 次误报实证,2026-09-03);
|
|
34
|
+
* 2) GUARD 写动词(touch/mkdir/rm/…)与解释器 -c/-e、原地编辑器 -i 移除——真文件写由
|
|
35
|
+
* CODE_WRITE_RE 补回覆盖(writeFile/mkdir/unlink/open 写模式/os./pathlib/shutil),
|
|
36
|
+
* 内嵌 shell 裸动词由 CODE_SHELL_VERB_RE 补回覆盖(Fix round 1),内嵌 shell 重定向由
|
|
37
|
+
* 本正则覆盖。三层分工与 accepted-risk 见 CODE_SHELL_VERB_RE 注释。 */
|
|
38
|
+
const CODE_REDIRECT_WRITE_RE = /\s>>?/;
|
|
39
|
+
/** run_code 内嵌 shell 裸动词写意图(Fix round 1,评审 Important):CODE_WRITE_RE 只含文件写
|
|
40
|
+
* API,不含裸 shell 动词——run_code 字符串派发的 shell 命令(`child_process.exec('cp /tmp/x
|
|
41
|
+
* src/foo.ts')`)会绕过写护栏。词表对齐 GUARD_WRITE_INTENT_RE 动词清单中 CODE_WRITE_RE 未覆盖
|
|
42
|
+
* 的部分(rm/mkdir 已由 CODE_WRITE_RE 覆盖不重复;touch/rmdir/make/cmake 按评审定版不纳入)。
|
|
43
|
+
* word boundary 形态:JS 里作为独立词出现即拦(copy/cpSync/mkdirSync 等复合词不误伤),
|
|
44
|
+
* 误伤率与 GUARD 复用旧版一致可接受。三层分工:内嵌 shell 动词由本词表覆盖;重定向由
|
|
45
|
+
* CODE_REDIRECT_WRITE_RE(带空格 \s>>?)覆盖;JS/Python 文件写 API 由 CODE_WRITE_RE 覆盖。
|
|
46
|
+
* accepted-risk:内嵌 shell 无空格重定向(`exec('cat t>src/y')`)与 JS 运算符(=>、比较)
|
|
47
|
+
* 在正则上不可分辨——无空格 `>` 规则一旦保留即复活 planguard-falsepositive 运算符误报
|
|
48
|
+
* (15 次实证),GUARD 复用旧版拦得住它但误报面更大,取舍为放行(accepted-risk);
|
|
49
|
+
* run_code 带空格比较 `a > b` 且同 code 含 openspec/changes 路径时仍可能误拒(残余面小,
|
|
50
|
+
* 失败可恢复——模型改用 write 工具重试即可)。 */
|
|
51
|
+
const CODE_SHELL_VERB_RE = /\b(?:cp|mv|tee|dd|chmod|chown|ln|install|truncate)\b/i;
|
|
28
52
|
/** 剥去 shell 重定向目标 token 外壳的一层引号(' " `)(F3:引号包裹的 plan 路径被 I1 误拒修复)。
|
|
29
53
|
* 仅剥对称外壳一层;剥完仍走 resolve+isPlanPath,.. / 绝对路径逃逸不被削弱。 */
|
|
30
54
|
function stripShellQuotes(tok) {
|
|
@@ -35,11 +59,12 @@ function stripShellQuotes(tok) {
|
|
|
35
59
|
return tok;
|
|
36
60
|
}
|
|
37
61
|
/** I1:从 bash/run_code 写意图命令提取实际写目标路径。
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
|
|
62
|
+
* redirectRe 按入口分流:bash 传 BASH_REDIRECT_TARGET_RE(无空格形态),run_code 传
|
|
63
|
+
* CODE_REDIRECT_TARGET_RE(带空格形态)——两形态各自命名,禁止共享开关参数。
|
|
64
|
+
* 另提取 writeFileSync(/appendFileSync( 首个字符串实参;提取不到返回空数组(调用方据此
|
|
65
|
+
* fail-closed 或放行)。 */
|
|
66
|
+
function extractWriteTargets(cmd, redirectRe) {
|
|
41
67
|
const out = [];
|
|
42
|
-
const redirectRe = /(?:(?<!2)>>|(?<!2)(?<!>)>)\s*([^\s;&|<>]+)/g;
|
|
43
68
|
let m;
|
|
44
69
|
while ((m = redirectRe.exec(cmd)) !== null) {
|
|
45
70
|
if (m[1])
|
|
@@ -50,15 +75,37 @@ function extractWriteTargets(cmd) {
|
|
|
50
75
|
if (m[2])
|
|
51
76
|
out.push(m[2]);
|
|
52
77
|
}
|
|
78
|
+
// 双模式 D7:动词目标提取——必须捕获动词后【全部】路径实参(只取首个会让
|
|
79
|
+
// `mkdir -p <kb>/x /repo/y` 漏检第二个目标 → 护栏越权放行,审查 C2)。
|
|
80
|
+
// cp/mv/rm 的源+目标全部入列:任一在库根外即整体拒绝(fail-closed,accepted-risk:
|
|
81
|
+
// 库根内合法 cp/mv 改用 write 工具完成)。
|
|
82
|
+
const verbRe = /\b(?:touch|mkdir|tee|cp|mv|rm|install)\b([^;&|<>]*)/g;
|
|
83
|
+
while ((m = verbRe.exec(cmd)) !== null) {
|
|
84
|
+
for (const tok of m[1].split(/\s+/)) {
|
|
85
|
+
if (!tok || tok.startsWith('-'))
|
|
86
|
+
continue;
|
|
87
|
+
out.push(stripShellQuotes(tok));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
53
90
|
return out;
|
|
54
91
|
}
|
|
55
|
-
/**
|
|
92
|
+
/** bash 重定向目标提取(无空格形态):`>file`/`>>file` 是 bash 合法写重定向,必须识别为写目标;
|
|
93
|
+
* fd2 stderr 豁免沿用 lookbehind(重定向符前(首个 > 前)字符非 '2' 才算,2>/dev/null、2>&1、
|
|
94
|
+
* 2>>err.log 不命中),且禁止从 >> 的第二个 > 起匹配。仅用于 bash 入口。 */
|
|
95
|
+
const BASH_REDIRECT_TARGET_RE = /(?:(?<!2)>>|(?<!2)(?<!>)>)\s*([^\s;&|<>]+)/g;
|
|
96
|
+
/** run_code 重定向目标提取(带空格形态):run_code 是 JS/TS/Python 程序代码,无空格 `>` 是
|
|
97
|
+
* 运算符(箭头 =>、比较 remaining>0),旧版无空格形态会把 `>0` 的 "0" 提取成写目标 →
|
|
98
|
+
* isPlanPath("0")=false → openspec 裸 edit 随机误拒(15 次误报实证)。故只认带空格重定向
|
|
99
|
+
* (run_code 内嵌 shell 字符串 `echo x > /tmp/f`),与 CODE_REDIRECT_WRITE_RE 同源。 */
|
|
100
|
+
const CODE_REDIRECT_TARGET_RE = /\s>>?\s*([^\s;&|<>]+)/g;
|
|
101
|
+
/** 判定 wiki 路径是否位于 DT 评审命名空间 projects/<repoSlug>/<chainId>/review/
|
|
102
|
+
* (repoSlug=[a-z0-9-]+ 通配,chainId 精确匹配;拒绝 ../、绝对路径、跨链、旧格式直挂根)。 */
|
|
56
103
|
export function isReviewNamespacePath(pagePath, chainId) {
|
|
57
104
|
const p = String(pagePath ?? '');
|
|
58
105
|
if (!p || p.startsWith('/') || p.includes('..'))
|
|
59
106
|
return false;
|
|
60
|
-
const
|
|
61
|
-
return
|
|
107
|
+
const chain = chainId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
108
|
+
return new RegExp(`^projects\\/[a-z0-9-]+\\/${chain}\\/review\\/`).test(p);
|
|
62
109
|
}
|
|
63
110
|
/**
|
|
64
111
|
* 评审引擎决策(DT):ocr(open-code-review Delegation 模式)优先;
|
|
@@ -84,7 +131,7 @@ export function buildDTWriteGuard(repoRoot, chainId) {
|
|
|
84
131
|
const args = execution?.arguments ?? {};
|
|
85
132
|
const pagePath = String(args && typeof args === 'object' ? args['pagePath'] ?? '' : '');
|
|
86
133
|
if (!isReviewNamespacePath(pagePath, chainId))
|
|
87
|
-
return 'wiki-write-outside-review-namespace: DT may only write projects/<chain>/review/';
|
|
134
|
+
return 'wiki-write-outside-review-namespace: DT may only write projects/<repoSlug>/<chain>/review/';
|
|
88
135
|
}
|
|
89
136
|
return base(execution);
|
|
90
137
|
};
|
|
@@ -102,14 +149,54 @@ export function buildReadOnlyWriteGuard(_repoRoot) {
|
|
|
102
149
|
const cmd = String(args && typeof args === 'object' ? (args['command'] ?? args['code'] ?? '') : '');
|
|
103
150
|
// bash 用 BASH_WRITE_RE(写动词 + git mutation + 带空格重定向)∪ GUARD_WRITE_INTENT_RE
|
|
104
151
|
// (无空格重定向 + 解释器 -c/-e)——全名拦截,写标记即拒,无论目标是否在 repo 内。
|
|
105
|
-
// run_code
|
|
106
|
-
|
|
107
|
-
|
|
152
|
+
// run_code 与 bash 分离(planguard-falsepositive 根治):CODE_WRITE_RE(文件写 API)
|
|
153
|
+
// ∪ CODE_SHELL_VERB_RE(内嵌 shell 裸动词,exec cp/mv 不再绕过)∪
|
|
154
|
+
// CODE_REDIRECT_WRITE_RE(带空格重定向)——无空格 > 在 JS 里是运算符(=>、比较),
|
|
155
|
+
// 不能复用 GUARD_WRITE_INTENT_RE(P 会话 15 次误报实证)。
|
|
156
|
+
const isWrite = name === 'run_code'
|
|
157
|
+
? CODE_WRITE_RE.test(cmd) || CODE_SHELL_VERB_RE.test(cmd) || CODE_REDIRECT_WRITE_RE.test(cmd)
|
|
158
|
+
: BASH_WRITE_RE.test(cmd) || GUARD_WRITE_INTENT_RE.test(cmd);
|
|
159
|
+
if (cmd && isWrite)
|
|
108
160
|
return 'write-to-repo-source-denied: ' + name + ' with write marker';
|
|
109
161
|
}
|
|
110
162
|
return undefined;
|
|
111
163
|
};
|
|
112
164
|
}
|
|
165
|
+
/** 本地模式 KB 写护栏(D7/D10):全名只读拦截(base)之上,仅对「实际写目标全部为
|
|
166
|
+
* 库根内绝对路径」的写操作豁免。目标提取不到 / 相对路径 / 越界 → 维持 base 拒绝(fail-closed)。
|
|
167
|
+
* 仅 local 模式对 W/DT 装配;remote 模式仍用 buildReadOnlyWriteGuard(库根写也被拒)。
|
|
168
|
+
* 审查修订(C2):extractWriteTargets 保持既有双参签名(cmd, redirectRe),按入口分流
|
|
169
|
+
* 传 BASH_REDIRECT_TARGET_RE / CODE_REDIRECT_TARGET_RE(与 buildPlanWriteGuard 同款)——
|
|
170
|
+
* 单参调用会在首个写意图命令上 TypeError。 */
|
|
171
|
+
export function buildKbWriteGuard(kbRoot) {
|
|
172
|
+
const base = buildReadOnlyWriteGuard(kbRoot);
|
|
173
|
+
const isKbTarget = (t) => isInsideKbRoot(kbRoot, t);
|
|
174
|
+
return (execution) => {
|
|
175
|
+
const baseReason = base(execution);
|
|
176
|
+
if (!baseReason)
|
|
177
|
+
return undefined;
|
|
178
|
+
const name = String(execution?.name ?? '');
|
|
179
|
+
const args = execution?.arguments ?? {};
|
|
180
|
+
const a = args && typeof args === 'object' ? args : {};
|
|
181
|
+
if (DIRECT_WRITE_TOOLS.has(name)) {
|
|
182
|
+
const target = String(a['path'] ?? a['file_path'] ?? '');
|
|
183
|
+
if (target && isKbTarget(target))
|
|
184
|
+
return undefined;
|
|
185
|
+
return baseReason;
|
|
186
|
+
}
|
|
187
|
+
if (name === 'bash' || name === 'run_code') {
|
|
188
|
+
const cmd = String(a['command'] ?? a['code'] ?? '');
|
|
189
|
+
if (!cmd)
|
|
190
|
+
return baseReason;
|
|
191
|
+
// 双参签名 + 按入口分流 redirect 正则(审查 C2);targets 为空 = 写意图但提取不到目标 → fail-closed 拒绝
|
|
192
|
+
const targets = extractWriteTargets(cmd, name === 'bash' ? BASH_REDIRECT_TARGET_RE : CODE_REDIRECT_TARGET_RE);
|
|
193
|
+
if (targets.length > 0 && targets.every(isKbTarget))
|
|
194
|
+
return undefined;
|
|
195
|
+
return baseReason;
|
|
196
|
+
}
|
|
197
|
+
return baseReason;
|
|
198
|
+
};
|
|
199
|
+
}
|
|
113
200
|
/** P 专用写护栏(Q3):读全放行;git mutation 一律拒绝;写仅允许目标仓库 openspec/changes 目录。
|
|
114
201
|
* 直接 fs 写工具 → 路径经 resolve 归一化后须落在 <workspaceRoot>/openspec/changes/ 之下(相邻段对判定);
|
|
115
202
|
* bash/run_code 写标记命令 → 命令文本须含 `openspec/changes` 子串,且提取出的实际写目标(重定向
|
|
@@ -140,6 +227,14 @@ export function buildPlanWriteGuard(workspaceRoot) {
|
|
|
140
227
|
const args = execution?.arguments ?? {};
|
|
141
228
|
const a = args && typeof args === 'object' ? args : {};
|
|
142
229
|
if (DIRECT_WRITE_TOOLS.has(name)) {
|
|
230
|
+
// Fix(2026-09-02 P 会话 30 连败事故):P 会话为 danger-full-access(天花板),官方 write/edit
|
|
231
|
+
// schema 仍广播可选参数 sandbox_permissions,模型误填后任何值都触发官方 approveEscalation
|
|
232
|
+
// "not strictly wider" 拒绝(escalation 必须严格更宽,天花板无更宽可升)。此处工具级拦截:
|
|
233
|
+
// 带该参数即拒并返回自解释文案(模型一轮纠偏改用裸 file_path+content),先于路径判定(参数
|
|
234
|
+
// 本身即非法,与目标无关)。
|
|
235
|
+
if (a['sandbox_permissions'] !== undefined) {
|
|
236
|
+
return 'plan-guard: 本会话已是 danger-full-access(权限天花板),禁止附带 sandbox_permissions(任何值都会被拒绝,且无需升级)。请直接用 file_path + content 裸写 openspec/changes/ 下的目标文件,不要重试被拒的带参调用。';
|
|
237
|
+
}
|
|
143
238
|
const target = String(a['path'] ?? a['file_path'] ?? '');
|
|
144
239
|
if (isPlanPath(target))
|
|
145
240
|
return undefined;
|
|
@@ -163,11 +258,14 @@ export function buildPlanWriteGuard(workspaceRoot) {
|
|
|
163
258
|
if (!verb || !GIT_READ_VERBS.has(verb))
|
|
164
259
|
return 'plan-guard: P 禁止 git 操作';
|
|
165
260
|
}
|
|
166
|
-
// THEN
|
|
167
|
-
// run_code
|
|
168
|
-
//
|
|
261
|
+
// THEN 写意图:bash 用增强写标记(含无空格重定向与解释器 -c/-e)且不含 plan 路径 → 拒绝。
|
|
262
|
+
// run_code 与 bash 分离(planguard-falsepositive 根治,2026-09-03):CODE_WRITE_RE(文件
|
|
263
|
+
// 写 API)∪ CODE_SHELL_VERB_RE(内嵌 shell 裸动词,Fix round 1)∪ CODE_REDIRECT_WRITE_RE
|
|
264
|
+
// (带空格重定向)——无空格 > 在 JS 里是运算符(=>、比较 remaining>0),
|
|
265
|
+
// GUARD_WRITE_INTENT_RE 复用致 openspec 裸 edit 随机误拒(15 次实证);GUARD 动词/
|
|
266
|
+
// 解释器对 run_code 移除的论证见 CODE_REDIRECT_WRITE_RE / CODE_SHELL_VERB_RE 注释。
|
|
169
267
|
const isWrite = name === 'run_code'
|
|
170
|
-
? CODE_WRITE_RE.test(cmd) ||
|
|
268
|
+
? CODE_WRITE_RE.test(cmd) || CODE_SHELL_VERB_RE.test(cmd) || CODE_REDIRECT_WRITE_RE.test(cmd)
|
|
171
269
|
: GUARD_WRITE_INTENT_RE.test(cmd);
|
|
172
270
|
if (isWrite) {
|
|
173
271
|
if (!isPlanCmd(cmd))
|
|
@@ -175,7 +273,8 @@ export function buildPlanWriteGuard(workspaceRoot) {
|
|
|
175
273
|
// I1:含 plan 标记仍须验证实际写目标——重定向 >/>> 目标与 writeFileSync(/appendFileSync(
|
|
176
274
|
// 首个字符串实参,逐条 resolve + isPlanPath(与 write/edit 入口同款判定,杀 M1 同款
|
|
177
275
|
// openspec/changes/../.. 穿越写源码,补齐 bash/run_code 入口)。任一条目标不通过 → 拒绝。
|
|
178
|
-
|
|
276
|
+
// 重定向形态按入口分流:bash 无空格(>f 合法写),run_code 带空格(无空格 > 是运算符)。
|
|
277
|
+
const targets = extractWriteTargets(cmd, name === 'run_code' ? CODE_REDIRECT_TARGET_RE : BASH_REDIRECT_TARGET_RE);
|
|
179
278
|
if (targets.length === 0) {
|
|
180
279
|
// 快速防线:命令同时含 openspec/changes 与 .. 但目标解析不出(无法提取)→ fail-closed 拒绝
|
|
181
280
|
if (cmd.includes('..'))
|
|
@@ -191,10 +290,34 @@ export function buildPlanWriteGuard(workspaceRoot) {
|
|
|
191
290
|
return undefined;
|
|
192
291
|
};
|
|
193
292
|
}
|
|
293
|
+
/** 工具注册表解析:直取 ctx.tools(官方语义),失败回退 ctx.get('tools')(cordis 服务路径,
|
|
294
|
+
* 与 v-orchestrator setup 取 agentPresets 同款)。宿主/ cordis 版本混装(web profile 实证
|
|
295
|
+
* 0.1.1-rc.2 包 + 4.0.1/4.0.2 peer 并存)下直取路径可能静默 undefined(旧语义),回退路径
|
|
296
|
+
* 保证角色工具面仍能注册。两者皆空时必须告警——静默跳过=角色裸奔且无痕。 */
|
|
297
|
+
function resolveToolRegistry(agentCtx) {
|
|
298
|
+
const direct = agentCtx.tools;
|
|
299
|
+
if (direct && typeof direct.register === 'function')
|
|
300
|
+
return direct;
|
|
301
|
+
const fallback = agentCtx.get?.('tools');
|
|
302
|
+
if (fallback && typeof fallback.register === 'function') {
|
|
303
|
+
console.error('[dsh-swarm][debug] tool registry via ctx.get fallback (direct .tools missing)');
|
|
304
|
+
return fallback;
|
|
305
|
+
}
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
function safeKeys(ctx) {
|
|
309
|
+
try {
|
|
310
|
+
return Object.keys(ctx).slice(0, 12).join(',');
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return '<unkeyed>';
|
|
314
|
+
}
|
|
315
|
+
}
|
|
194
316
|
/** 按角色在 agent scope 注册工具面(P1-3 统一注册策略):
|
|
195
317
|
* 所有 kanban 工具从 T9 工厂选取 + getCaller 闭包(actor=role、boundTaskId=taskId)。
|
|
196
318
|
* can() 权限兜底仍保留在工具 execute 内(纵深防御第二道)。 */
|
|
197
319
|
export async function installRoleTools(agentCtx, role, deps) {
|
|
320
|
+
const kbMode = deps.kbMode ?? 'remote';
|
|
198
321
|
console.error('[dsh-swarm][debug] installRoleTools role=' + role + ' task=' + deps.taskId);
|
|
199
322
|
const caller = () => ({ actor: role, boundTaskId: deps.taskId });
|
|
200
323
|
const allKanban = buildKanbanTools(deps.kanban, caller);
|
|
@@ -211,23 +334,28 @@ export async function installRoleTools(agentCtx, role, deps) {
|
|
|
211
334
|
dt: ['kanban_show', 'kanban_chain', 'kanban_list', 'kanban_complete', 'kanban_block', 'kanban_heartbeat', 'kanban_comment'],
|
|
212
335
|
};
|
|
213
336
|
const want = new Set(namesFor[role]);
|
|
214
|
-
const registry = agentCtx
|
|
215
|
-
if (!registry)
|
|
216
|
-
|
|
337
|
+
const registry = resolveToolRegistry(agentCtx);
|
|
338
|
+
if (!registry) {
|
|
339
|
+
console.error('[dsh-swarm][error] tool registry unavailable — role tools NOT registered (silent capability loss risk) role=' + role + ' task=' + (deps.taskId ?? '-') + ' ctxKeys=' + safeKeys(agentCtx));
|
|
340
|
+
return; // 保持返回不抛:本轮先取证,全角色 fail-fast 另行决策
|
|
341
|
+
}
|
|
217
342
|
for (const tool of allKanban) {
|
|
218
343
|
const name = tool.name;
|
|
219
344
|
if (name && want.has(name))
|
|
220
345
|
registry.register(tool);
|
|
221
346
|
}
|
|
222
347
|
if (role === 'w') {
|
|
223
|
-
|
|
224
|
-
|
|
348
|
+
if (kbMode === 'remote') {
|
|
349
|
+
for (const tool of buildWikiTools(deps.wiki, caller))
|
|
350
|
+
registry.register(tool);
|
|
351
|
+
}
|
|
352
|
+
// local(D2):wiki 三原语不注册,W 经 skill 工具(preset 提供)自治查写;prefetch/spec 视图保留
|
|
225
353
|
// 设计表 §3:W 对规格卡只读(spec_card_view)
|
|
226
354
|
for (const tool of buildSpecCardTools(deps.kanban, caller)) {
|
|
227
355
|
if (tool.name === 'spec_card_view')
|
|
228
356
|
registry.register(tool);
|
|
229
357
|
}
|
|
230
|
-
const worker = new WikiWorker(deps.kanban, deps.wiki, { pagePrefix: 'projects/' });
|
|
358
|
+
const worker = new WikiWorker(deps.kanban, deps.wiki, { pagePrefix: 'projects/', kbMode: deps.kbMode });
|
|
231
359
|
const getTask = async (taskId) => {
|
|
232
360
|
const state = await deps.kanban.snapshot();
|
|
233
361
|
const t = state.tasks.get(taskId);
|
|
@@ -240,10 +368,12 @@ export async function installRoleTools(agentCtx, role, deps) {
|
|
|
240
368
|
}
|
|
241
369
|
else if (role === 'd') {
|
|
242
370
|
// D:只读 KB——注册 wiki_read + wiki_search(均走 can('wiki-read')=w/d 只读兜底);规格卡只读
|
|
243
|
-
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
|
|
371
|
+
if (kbMode === 'remote') {
|
|
372
|
+
for (const tool of buildWikiTools(deps.wiki, caller)) {
|
|
373
|
+
const name = tool.name;
|
|
374
|
+
if (name === 'wiki_read' || name === 'wiki_search')
|
|
375
|
+
registry.register(tool);
|
|
376
|
+
}
|
|
247
377
|
}
|
|
248
378
|
for (const tool of buildSpecCardTools(deps.kanban, caller)) {
|
|
249
379
|
if (tool.name === 'spec_card_view')
|
|
@@ -270,10 +400,12 @@ export async function installRoleTools(agentCtx, role, deps) {
|
|
|
270
400
|
if (tool.name === 'spec_card_view')
|
|
271
401
|
registry.register(tool);
|
|
272
402
|
}
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
403
|
+
if (kbMode === 'remote') {
|
|
404
|
+
for (const tool of buildWikiTools(deps.wiki, caller)) {
|
|
405
|
+
const n = tool.name;
|
|
406
|
+
if (n === 'wiki_read' || n === 'wiki_search' || n === 'wiki_write')
|
|
407
|
+
registry.register(tool);
|
|
408
|
+
}
|
|
277
409
|
}
|
|
278
410
|
}
|
|
279
411
|
else if (role === 'v') {
|
|
@@ -319,7 +451,7 @@ export function buildSubagentTreeGuard(deps = {}) {
|
|
|
319
451
|
return undefined;
|
|
320
452
|
// 仅真实子代理(parentSession 为 kbn- 前缀)受全局护栏约束;DT 父会话自身
|
|
321
453
|
// parentSession 是主会话或缺失(非 kbn- 前缀),chainId 解析不到 → 空,若误拦
|
|
322
|
-
// 会把 DT 评审写入(wiki_write projects/<chain>/review/...)拒掉 → 直接放行。
|
|
454
|
+
// 会把 DT 评审写入(wiki_write projects/<repoSlug>/<chain>/review/...)拒掉 → 直接放行。
|
|
323
455
|
const parent = header.parentSession;
|
|
324
456
|
if (typeof parent !== 'string' || !parent.startsWith('kbn-'))
|
|
325
457
|
return undefined;
|
|
@@ -8,6 +8,7 @@ export declare class WikiWorker {
|
|
|
8
8
|
private readonly cfg;
|
|
9
9
|
constructor(kanban: KanbanService, wiki: WikiVaultClient, cfg: {
|
|
10
10
|
pagePrefix: string;
|
|
11
|
+
kbMode?: 'remote' | 'local';
|
|
11
12
|
});
|
|
12
13
|
executePrefetch(task: Task, mode: 'file' | 'external' | 'kb', source: string): Promise<{
|
|
13
14
|
ref: string;
|
package/lib/roles/wiki-worker.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { buildRepoSlug } from '../domain/memory.js';
|
|
3
4
|
function workspaceOf(chainId, taskId) {
|
|
4
5
|
return join(process.env.DSH_HOME ?? process.cwd(), 'storages', 'kanban', 'workspaces', chainId, taskId);
|
|
5
6
|
}
|
|
@@ -26,15 +27,22 @@ export class WikiWorker {
|
|
|
26
27
|
throw new Error('prefetch source outside workspace: ' + source);
|
|
27
28
|
return { ref: source || ref };
|
|
28
29
|
}
|
|
29
|
-
// kb
|
|
30
|
+
// kb 模式:知识库查询产物。local 模式(D2)不走 wiki 工具——明确指引改用 skill 加载 llm-wiki。
|
|
31
|
+
if (this.cfg.kbMode === 'local') {
|
|
32
|
+
throw new Error('prefetch_kb unavailable in local KB mode: use the skill tool to load llm-wiki for KB search instead');
|
|
33
|
+
}
|
|
34
|
+
// remote:知识库查询产物(wiki-vault search/read 由 wiki 工具执行,agent 落盘 ws/prefetch-kb.md)
|
|
30
35
|
const ref = join(ws, 'prefetch-kb.md');
|
|
31
36
|
if (!source.startsWith(ws) && source !== '')
|
|
32
37
|
throw new Error('prefetch source outside workspace: ' + source);
|
|
33
38
|
return { ref: source || ref };
|
|
34
39
|
}
|
|
35
40
|
async syncToWiki(task, sourceRef) {
|
|
41
|
+
const chain = (await this.kanban.snapshot()).chains.get(task.chainId);
|
|
42
|
+
if (!chain?.workspaceDir)
|
|
43
|
+
throw new Error('syncToWiki requires chain.workspaceDir: ' + task.chainId);
|
|
36
44
|
const content = readFileSync(sourceRef, 'utf8'); // 原汁原味:不压缩不蒸馏
|
|
37
|
-
const pagePath = this.cfg.pagePrefix
|
|
45
|
+
const pagePath = `${this.cfg.pagePrefix}${buildRepoSlug(chain.workspaceDir)}/${task.chainId}/${task.id}.md`;
|
|
38
46
|
await this.wiki.write(pagePath, content);
|
|
39
47
|
return { kb_url: this.wikiBase() + '/#/page/' + pagePath, page_path: pagePath };
|
|
40
48
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { Context } from '@deepseek-ai/cordis';
|
|
2
2
|
import type { KanbanConfig } from '../config.js';
|
|
3
3
|
import type { KanbanProvider } from '../services/kanban-provider.js';
|
|
4
|
-
|
|
4
|
+
import type { ConfigProvider } from '../services/config-provider.js';
|
|
5
|
+
import type { LlmRuntimeLike } from '../services/llm-catalog.js';
|
|
6
|
+
/** 看板 HTTP 桥(Web GUI 浏览器半消费):GET /kanban/board 读快照;POST /kanban/action 执行状态操作;
|
|
7
|
+
* GET/PUT /kanban/config + POST /kanban/config/reset 配置读写;GET /kanban/llm-catalog 模型目录。
|
|
5
8
|
* 仅在 webServer 服务存在时挂载(CLI/headless/测试裸 Context 不挂)。 */
|
|
6
|
-
export declare function registerKanbanHttp(ctx: Context, provider: KanbanProvider, config?: Pick<KanbanConfig, 'ui'>): void;
|
|
9
|
+
export declare function registerKanbanHttp(ctx: Context, provider: KanbanProvider, configProvider: ConfigProvider, llm: LlmRuntimeLike, config?: Pick<KanbanConfig, 'ui'>): void;
|