@joekytc/dsh-swarm 0.1.2 → 0.3.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.
Files changed (603) hide show
  1. package/README.md +177 -140
  2. package/README.zh-CN.md +173 -126
  3. package/client/BoardCard.tsx +24 -2
  4. package/client/ConfigSection.tsx +162 -0
  5. package/client/ConfigSelect.tsx +71 -0
  6. package/client/KanbanBoard.tsx +3 -0
  7. package/client/KanbanTab.tsx +4 -3
  8. package/client/TaskDrawer.tsx +4 -26
  9. package/client/WorkflowRail.tsx +3 -1
  10. package/client/config-store.ts +92 -0
  11. package/client/config.css +110 -0
  12. package/client/index.ts +39 -4
  13. package/client/kanban.css +88 -2
  14. package/client/session-bridge.ts +39 -0
  15. package/client/timeline-model.ts +12 -1
  16. package/client/workflow-model.ts +3 -1
  17. package/lib/client.js +519 -56
  18. package/lib/config.d.ts +26 -2
  19. package/lib/config.js +20 -1
  20. package/lib/dispatcher/agent-runner.d.ts +37 -7
  21. package/lib/dispatcher/agent-runner.js +239 -86
  22. package/lib/dispatcher/chain-auditor.d.ts +4 -4
  23. package/lib/dispatcher/chain-auditor.js +14 -9
  24. package/lib/dispatcher/dispatcher.d.ts +69 -10
  25. package/lib/dispatcher/dispatcher.js +281 -42
  26. package/lib/dispatcher/event-waker.d.ts +1 -1
  27. package/lib/dispatcher/event-waker.js +2 -2
  28. package/lib/dispatcher/git-credentials.d.ts +2 -2
  29. package/lib/dispatcher/git-credentials.js +2 -2
  30. package/lib/dispatcher/model-candidates.d.ts +1 -1
  31. package/lib/dispatcher/model-candidates.js +1 -1
  32. package/lib/dispatcher/session-events.d.ts +12 -16
  33. package/lib/dispatcher/session-events.js +18 -6
  34. package/lib/dispatcher/target-repo.d.ts +2 -2
  35. package/lib/dispatcher/target-repo.js +3 -3
  36. package/lib/dispatcher/v-orchestrator.d.ts +44 -11
  37. package/lib/dispatcher/v-orchestrator.js +257 -49
  38. package/lib/dispatcher/watchdog.d.ts +1 -1
  39. package/lib/dispatcher/watchdog.js +2 -2
  40. package/lib/domain/config-override.d.ts +52 -0
  41. package/lib/domain/config-override.js +138 -0
  42. package/lib/domain/delivery-contract.d.ts +4 -3
  43. package/lib/domain/delivery-contract.js +30 -18
  44. package/lib/domain/delivery-evidence.d.ts +1 -1
  45. package/lib/domain/delivery-evidence.js +1 -1
  46. package/lib/domain/event-store.js +1 -1
  47. package/lib/domain/gate-policy.d.ts +26 -0
  48. package/lib/domain/gate-policy.js +44 -0
  49. package/lib/domain/im-message.d.ts +15 -0
  50. package/lib/domain/im-message.js +149 -0
  51. package/lib/domain/kanban-service.d.ts +28 -12
  52. package/lib/domain/kanban-service.js +73 -30
  53. package/lib/domain/memory.js +1 -1
  54. package/lib/domain/ocr-review.d.ts +47 -0
  55. package/lib/domain/ocr-review.js +105 -0
  56. package/lib/domain/permissions.js +6 -6
  57. package/lib/domain/planning-checklist.d.ts +5 -0
  58. package/lib/domain/planning-checklist.js +80 -6
  59. package/lib/domain/projection.js +8 -7
  60. package/lib/domain/review-evidence.js +1 -1
  61. package/lib/domain/state-machine.js +3 -2
  62. package/lib/domain/task-parents.js +1 -1
  63. package/lib/domain/types.d.ts +5 -5
  64. package/lib/index.js +28 -25
  65. package/lib/roles/clean-fs-tools.d.ts +22 -0
  66. package/lib/roles/clean-fs-tools.js +117 -0
  67. package/lib/roles/preset-installer.js +3 -3
  68. package/lib/roles/skill-installer.d.ts +6 -0
  69. package/lib/roles/skill-installer.js +32 -0
  70. package/lib/roles/toolsets.d.ts +71 -15
  71. package/lib/roles/toolsets.js +418 -68
  72. package/lib/roles/wiki-worker.d.ts +1 -0
  73. package/lib/roles/wiki-worker.js +12 -4
  74. package/lib/routes/kanban-http.d.ts +28 -2
  75. package/lib/routes/kanban-http.js +199 -6
  76. package/lib/routes/kanban-sse.d.ts +1 -1
  77. package/lib/routes/kanban-sse.js +1 -1
  78. package/lib/routes/planning-driver.d.ts +6 -2
  79. package/lib/routes/planning-driver.js +15 -7
  80. package/lib/routes/prefix-router.d.ts +19 -3
  81. package/lib/routes/prefix-router.js +40 -3
  82. package/lib/services/config-provider.d.ts +38 -0
  83. package/lib/services/config-provider.js +92 -0
  84. package/lib/services/gate-runner.d.ts +24 -0
  85. package/lib/services/gate-runner.js +87 -0
  86. package/lib/services/im-delivery.d.ts +94 -0
  87. package/lib/services/im-delivery.js +263 -0
  88. package/lib/services/kanban-provider.d.ts +6 -2
  89. package/lib/services/kanban-provider.js +41 -3
  90. package/lib/services/llm-catalog.d.ts +35 -0
  91. package/lib/services/llm-catalog.js +19 -0
  92. package/lib/services/ocr-cli.d.ts +35 -0
  93. package/lib/services/ocr-cli.js +128 -0
  94. package/lib/tools/kanban-tools.d.ts +2 -2
  95. package/lib/tools/kanban-tools.js +2 -1
  96. package/lib/tools/main-session-tools.d.ts +22 -3
  97. package/lib/tools/main-session-tools.js +135 -30
  98. package/lib/tools/ocr-review-tools.d.ts +11 -0
  99. package/lib/tools/ocr-review-tools.js +63 -0
  100. package/lib/tools/planning-tools.d.ts +8 -1
  101. package/lib/tools/planning-tools.js +44 -15
  102. package/lib/tools/prefetch-tools.js +1 -0
  103. package/lib/tools/spec-card-tools.js +1 -0
  104. package/lib/tools/wiki-tools.js +6 -5
  105. package/lib/wiki/kb-linkage.d.ts +9 -2
  106. package/lib/wiki/kb-linkage.js +3 -3
  107. package/lib/wiki/local-kb-client.d.ts +14 -0
  108. package/lib/wiki/local-kb-client.js +101 -0
  109. package/lib/wiki/local-kb.d.ts +6 -0
  110. package/lib/wiki/local-kb.js +25 -0
  111. package/lib/wiki/memory-recall.d.ts +14 -6
  112. package/lib/wiki/memory-recall.js +17 -13
  113. package/lib/wiki/page-path.d.ts +9 -3
  114. package/lib/wiki/page-path.js +33 -12
  115. package/lib/wiki/wiki-vault-client.d.ts +3 -3
  116. package/lib/wiki/wiki-vault-client.js +6 -6
  117. package/package.json +16 -11
  118. package/personas/kanban-d/agent.cordis.yml +5 -5
  119. package/personas/kanban-d/preset.yml +1 -1
  120. package/personas/kanban-dt/agent.cordis.yml +25 -7
  121. package/personas/kanban-dt/preset.yml +1 -1
  122. package/personas/kanban-p/agent.cordis.yml +19 -3
  123. package/personas/kanban-p/preset.yml +1 -1
  124. package/personas/kanban-pt/agent.cordis.yml +39 -9
  125. package/personas/kanban-pt/preset.yml +1 -1
  126. package/personas/kanban-v/agent.cordis.yml +3 -3
  127. package/personas/kanban-w/agent.cordis.yml +37 -18
  128. package/personas/kanban-w/preset.yml +1 -1
  129. package/personas/persona-d.md +1 -1
  130. package/personas/persona-dt.md +13 -5
  131. package/personas/persona-p.md +5 -2
  132. package/personas/persona-pt.md +13 -6
  133. package/personas/persona-v.md +2 -2
  134. package/personas/persona-w.md +11 -9
  135. package/personas/swarm/agent.cordis.yml +43 -0
  136. package/personas/swarm/preset.yml +5 -0
  137. package/skills/grill-me/SKILL.md +71 -0
  138. package/skills/llm-wiki-skill/.mise.toml +2 -0
  139. package/skills/llm-wiki-skill/.nvmrc +1 -0
  140. package/skills/llm-wiki-skill/AGENTS.md +173 -0
  141. package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
  142. package/skills/llm-wiki-skill/CLAUDE.md +152 -0
  143. package/skills/llm-wiki-skill/HERMES.md +44 -0
  144. package/skills/llm-wiki-skill/README.en.md +261 -0
  145. package/skills/llm-wiki-skill/README.md +291 -0
  146. package/skills/llm-wiki-skill/SKILL.md +1133 -0
  147. package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
  148. package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
  149. package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
  150. package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
  151. package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
  152. package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
  153. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
  154. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
  155. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
  156. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
  157. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
  158. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
  159. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
  160. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
  161. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
  162. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
  163. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
  164. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
  165. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
  166. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
  167. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
  168. package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
  169. package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
  170. package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
  171. package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
  172. package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
  173. package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
  174. package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
  175. package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
  176. package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
  177. package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
  178. package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
  179. package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
  180. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
  181. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
  182. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
  183. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
  184. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
  185. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
  186. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
  187. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
  188. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
  189. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
  190. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
  191. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
  192. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
  193. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
  194. package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
  195. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
  196. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
  197. package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
  198. package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
  199. package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
  200. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
  201. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
  202. package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
  203. package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
  204. package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
  205. package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
  206. package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
  207. package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
  208. package/skills/llm-wiki-skill/install.ps1 +87 -0
  209. package/skills/llm-wiki-skill/install.sh +722 -0
  210. package/skills/llm-wiki-skill/package-lock.json +11171 -0
  211. package/skills/llm-wiki-skill/package.json +24 -0
  212. package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
  213. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
  214. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
  215. package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
  216. package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
  217. package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
  218. package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
  219. package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
  220. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
  221. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
  222. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
  223. package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
  224. package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
  225. package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
  226. package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
  227. package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
  228. package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
  229. package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
  230. package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
  231. package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
  232. package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
  233. package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
  234. package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
  235. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
  236. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
  237. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
  238. package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
  239. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
  240. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
  241. package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
  242. package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
  243. package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
  244. package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
  245. package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
  246. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
  247. package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
  248. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
  249. package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
  250. package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
  251. package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
  252. package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
  253. package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
  254. package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
  255. package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
  256. package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
  257. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
  258. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
  259. package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
  260. package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
  261. package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
  262. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
  263. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
  264. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
  265. package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
  266. package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
  267. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
  268. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
  269. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
  270. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
  271. package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
  272. package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
  273. package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
  274. package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
  275. package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
  276. package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
  277. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
  278. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
  279. package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
  280. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
  281. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
  282. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
  283. package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
  284. package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
  285. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
  286. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
  287. package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
  288. package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
  289. package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
  290. package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
  291. package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
  292. package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
  293. package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
  294. package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
  295. package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
  296. package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
  297. package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
  298. package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
  299. package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
  300. package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
  301. package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
  302. package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
  303. package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
  304. package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
  305. package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
  306. package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
  307. package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
  308. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
  309. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
  310. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
  311. package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
  312. package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
  313. package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
  314. package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
  315. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
  316. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
  317. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
  318. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
  319. package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
  320. package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
  321. package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
  322. package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
  323. package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
  324. package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
  325. package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
  326. package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
  327. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
  328. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
  329. package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
  330. package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
  331. package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
  332. package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
  333. package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
  334. package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
  335. package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
  336. package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
  337. package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
  338. package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
  339. package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
  340. package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
  341. package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
  342. package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
  343. package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
  344. package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
  345. package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
  346. package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
  347. package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
  348. package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
  349. package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
  350. package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
  351. package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
  352. package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
  353. package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
  354. package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
  355. package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
  356. package/skills/llm-wiki-skill/setup.sh +8 -0
  357. package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
  358. package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
  359. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
  360. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
  361. package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
  362. package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
  363. package/skills/llm-wiki-skill/templates/index-template.md +51 -0
  364. package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
  365. package/skills/llm-wiki-skill/templates/log-template.md +11 -0
  366. package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
  367. package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
  368. package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
  369. package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
  370. package/skills/llm-wiki-skill/templates/query-template.md +19 -0
  371. package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
  372. package/skills/llm-wiki-skill/templates/source-template.md +51 -0
  373. package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
  374. package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
  375. package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
  376. package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
  377. package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
  378. package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
  379. package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
  380. package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
  381. package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
  382. package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
  383. package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
  384. package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
  385. package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
  386. package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
  387. package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
  388. package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
  389. package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
  390. package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
  391. package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
  392. package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
  393. package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
  394. package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
  395. package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
  396. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
  397. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
  398. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
  399. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
  400. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
  401. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
  402. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
  403. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
  404. package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
  405. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
  406. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
  407. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
  408. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
  409. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
  410. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
  411. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
  412. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
  413. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
  414. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
  415. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
  416. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
  417. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
  418. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
  419. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
  420. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
  421. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
  422. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
  423. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
  424. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
  425. package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
  426. package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
  427. package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
  428. package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
  429. package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
  430. package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
  431. package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
  432. package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
  433. package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
  434. package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
  435. package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
  436. package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
  437. package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
  438. package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
  439. package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
  440. package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
  441. package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
  442. package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
  443. package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
  444. package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
  445. package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
  446. package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
  447. package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
  448. package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
  449. package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
  450. package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
  451. package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
  452. package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
  453. package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
  454. package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
  455. package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
  456. package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
  457. package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
  458. package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
  459. package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
  460. package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
  461. package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
  462. package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
  463. package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
  464. package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
  465. package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
  466. package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
  467. package/skills/llm-wiki-skill/workbench/README.md +30 -0
  468. package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
  469. package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
  470. package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
  471. package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
  472. package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
  473. package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
  474. package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
  475. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
  476. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
  477. package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
  478. package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
  479. package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
  480. package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
  481. package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
  482. package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
  483. package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
  484. package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
  485. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
  486. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
  487. package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
  488. package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
  489. package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
  490. package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
  491. package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
  492. package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
  493. package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
  494. package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
  495. package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
  496. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
  497. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
  498. package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
  499. package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
  500. package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
  501. package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
  502. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
  503. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
  504. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
  505. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
  506. package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
  507. package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
  508. package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
  509. package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
  510. package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
  511. package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
  512. package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
  513. package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
  514. package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
  515. package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
  516. package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
  517. package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
  518. package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
  519. package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
  520. package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
  521. package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
  522. package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
  523. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
  524. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
  525. package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
  526. package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
  527. package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
  528. package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
  529. package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
  530. package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
  531. package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
  532. package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
  533. package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
  534. package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
  535. package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
  536. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
  537. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
  538. package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
  539. package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
  540. package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
  541. package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
  542. package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
  543. package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
  544. package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
  545. package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
  546. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
  547. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
  548. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
  549. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
  550. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
  551. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
  552. package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
  553. package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
  554. package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
  555. package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
  556. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
  557. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
  558. package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
  559. package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
  560. package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
  561. package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
  562. package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
  563. package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
  564. package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
  565. package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
  566. package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
  567. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
  568. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
  569. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
  570. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
  571. package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
  572. package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
  573. package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
  574. package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
  575. package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
  576. package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
  577. package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
  578. package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
  579. package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
  580. package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
  581. package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
  582. package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
  583. package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
  584. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
  585. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
  586. package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
  587. package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
  588. package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
  589. package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
  590. package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
  591. package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
  592. package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
  593. package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
  594. package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
  595. package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
  596. package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
  597. package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
  598. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
  599. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
  600. package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
  601. package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
  602. package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
  603. package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
@@ -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;
@@ -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
  }
@@ -11,7 +12,7 @@ export class WikiWorker {
11
12
  constructor(kanban, wiki, cfg) { this.kanban = kanban; this.wiki = wiki; this.cfg = cfg; }
12
13
  async executePrefetch(task, mode, source) {
13
14
  const ws = workspaceOf(task.chainId, task.id);
14
- // P1-6:三模式全部落地;产物一律写入任务工作区(原汁原味,禁压缩/蒸馏)
15
+ // 三模式全部落地;产物一律写入任务工作区(原汁原味,禁压缩/蒸馏)
15
16
  if (mode === 'file') {
16
17
  // 只读命令由角色 agent 的 terminal 白名单执行;此处仅登记产物引用
17
18
  if (!source.startsWith(ws))
@@ -26,19 +27,26 @@ export class WikiWorker {
26
27
  throw new Error('prefetch source outside workspace: ' + source);
27
28
  return { ref: source || ref };
28
29
  }
29
- // kb 模式:知识库查询产物(wiki-vault search/read 由 wiki 工具执行,agent 落盘 ws/prefetch-kb.md)
30
+ // kb 模式:知识库查询产物。local 模式不走 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 + task.chainId + '/' + task.id + '.md';
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
  }
41
49
  wikiBase() {
42
- return this.wiki.baseUrl; // P2:用 WikiVaultClient 公开 getter,不做类型强转
50
+ return this.wiki.baseUrl; // 用 WikiVaultClient 公开 getter,不做类型强转
43
51
  }
44
52
  }
@@ -1,6 +1,32 @@
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
- /** 看板 HTTP 桥(Web GUI 浏览器半消费):GET /kanban/board 读快照;POST /kanban/action 执行状态操作。
4
+ import type { ConfigProvider } from '../services/config-provider.js';
5
+ import type { LlmRuntimeLike } from '../services/llm-catalog.js';
6
+ import { managedProviderReady, probeOcr } from '../services/ocr-cli.js';
7
+ /** ocr 全局安装器:回调式 npm install -g,onSpawn 转交子进程句柄供取消。 */
8
+ export type OcrInstaller = (onSpawn?: (child: {
9
+ kill(sig?: string): boolean;
10
+ }) => void) => Promise<{
11
+ ok: boolean;
12
+ version?: string;
13
+ log: string;
14
+ }>;
15
+ /** ocr HTTP 分支可注入依赖(测试用);缺省走真实现。 */
16
+ export interface KanbanOcrDeps {
17
+ installer?: OcrInstaller;
18
+ probeFn?: typeof probeOcr;
19
+ managedReadyFn?: typeof managedProviderReady;
20
+ wirer?: (a: {
21
+ provider: string;
22
+ model: string;
23
+ }) => Promise<{
24
+ ok: boolean;
25
+ log: string;
26
+ }>;
27
+ }
28
+ /** 看板 HTTP 桥(Web GUI 浏览器半消费):GET /kanban/board 读快照;POST /kanban/action 执行状态操作;
29
+ * GET/PUT /kanban/config 配置读写(无 reset:各用户模型配置不同,无公共默认值);GET /kanban/llm-catalog 模型目录;
30
+ * GET /kanban/ocr/status + POST /kanban/ocr/install(/cancel) + GET install/state + POST /kanban/ocr/wire ocr 评审引擎运维。
5
31
  * 仅在 webServer 服务存在时挂载(CLI/headless/测试裸 Context 不挂)。 */
6
- export declare function registerKanbanHttp(ctx: Context, provider: KanbanProvider, config?: Pick<KanbanConfig, 'ui'>): void;
32
+ export declare function registerKanbanHttp(ctx: Context, provider: KanbanProvider, configProvider: ConfigProvider, llm: LlmRuntimeLike, config?: Pick<KanbanConfig, 'ui'>, ocrDeps?: KanbanOcrDeps): void;
@@ -1,3 +1,8 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { buildLlmCatalog } from '../services/llm-catalog.js';
5
+ import { INSTALL_GUIDANCE, OCR_PACKAGE, managedProviderReady, probeOcr, wireManagedProvider } from '../services/ocr-cli.js';
1
6
  import { serveKanbanEvents } from './kanban-sse.js';
2
7
  function json(res, status, body) {
3
8
  res.statusCode = status;
@@ -12,9 +17,95 @@ function readBody(req) {
12
17
  req.on('error', reject);
13
18
  });
14
19
  }
15
- /** 看板 HTTP 桥(Web GUI 浏览器半消费):GET /kanban/board 读快照;POST /kanban/action 执行状态操作。
20
+ const defaultOcrInstaller = (onSpawn) => new Promise((resolve) => {
21
+ const child = execFile('npm', ['install', '-g', OCR_PACKAGE], { timeout: 600_000 }, (err, stdout, stderr) => {
22
+ if (err)
23
+ resolve({ ok: false, log: `${err.message}\n${String(stderr ?? '')}`.trim() });
24
+ else
25
+ resolve({ ok: true, log: String(stdout ?? '') });
26
+ });
27
+ onSpawn?.(child);
28
+ });
29
+ /** 模块级单飞安装任务态:同一插件进程同时只允许一个 npm 全局安装在跑。 */
30
+ let installJob = null;
31
+ /** 安装关键事件落盘(与 dispatcher.log 同文件同格式,写失败静默——日志只是观测面)。 */
32
+ function logOcrEvent(configProvider, msg) {
33
+ try {
34
+ const storageDir = configProvider.getEffective().storageDir.replace('$DSH_HOME', process.env.DSH_HOME ?? process.cwd());
35
+ writeFileSync(join(storageDir, 'dispatcher.log'), new Date().toISOString() + ' ' + msg + '\n', { flag: 'a' });
36
+ }
37
+ catch { /* 忽略写失败 */ }
38
+ }
39
+ async function runOcrInstall(deps, configProvider) {
40
+ const job = installJob;
41
+ if (!job)
42
+ return;
43
+ try {
44
+ const r = await (deps?.installer ?? defaultOcrInstaller)((child) => { job.child = child; });
45
+ if (!job.running)
46
+ return; // 已取消:cancelled 是终态,迟到的安装结果不覆盖
47
+ job.running = false;
48
+ job.log = r.log;
49
+ if (r.ok) {
50
+ job.result = 'ok';
51
+ const probe = await (deps?.probeFn ?? probeOcr)();
52
+ job.version = probe.version;
53
+ logOcrEvent(configProvider, '[ocr-install] ok' + (probe.version ? ' version=' + probe.version : ''));
54
+ }
55
+ else {
56
+ job.result = 'failed';
57
+ logOcrEvent(configProvider, '[ocr-install] failed');
58
+ }
59
+ }
60
+ catch (err) {
61
+ if (!job.running)
62
+ return;
63
+ job.running = false;
64
+ job.result = 'failed';
65
+ job.log = String(err);
66
+ logOcrEvent(configProvider, '[ocr-install] failed: ' + String(err));
67
+ }
68
+ }
69
+ /** wire 降级文案:解析不到该提供方接入信息时,引导终端手动配置(不写半套 ocr 配置)。 */
70
+ const OCR_WIRE_DEGRADED = '未能从 dsh 解析该提供方的接入信息(baseUrl/apiKey)——请在终端手动执行 ocr config provider 完成托管配置;委托模式不受影响';
71
+ /**
72
+ * 从宿主设置解析所选提供方的接入信息(baseUrl/协议/apiKey)。
73
+ * 事实核查结论(实现期探查):llm 服务的公开 API 不暴露连接事实,但同进程可经
74
+ * settings 服务的 describe() 读到模型适配器的 provider profile——形如
75
+ * { providers: { <id>: { baseURL, api, apiKey | apiKeyEnv } } }(apiKeyEnv 指向进程环境变量名)。
76
+ * 命中 profile 但字段不全时跳过该 descriptor 继续尝试下一个(多 descriptor 场景勿误降级),
77
+ * 绝不回传半套配置;全部不合才返回 null 走降级。apiKey 只透传给 ocr config,不落日志。
78
+ */
79
+ function resolveDshProviderAccess(ctx, providerId) {
80
+ try {
81
+ const settings = ctx.get('settings');
82
+ const descriptors = settings?.describe?.() ?? [];
83
+ for (const d of descriptors) {
84
+ const providers = d.value?.providers;
85
+ const profile = providers?.[providerId];
86
+ if (!profile || typeof profile !== 'object')
87
+ continue;
88
+ const baseUrl = typeof profile.baseURL === 'string' ? profile.baseURL : '';
89
+ const api = typeof profile.api === 'string' ? profile.api : '';
90
+ const protocol = api.startsWith('openai') ? 'openai' : api.includes('anthropic') ? 'anthropic' : '';
91
+ let apiKey = typeof profile.apiKey === 'string' ? profile.apiKey : '';
92
+ if (!apiKey && typeof profile.apiKeyEnv === 'string')
93
+ apiKey = process.env[profile.apiKeyEnv] ?? '';
94
+ if (baseUrl && protocol && apiKey)
95
+ return { baseUrl, protocol, apiKey };
96
+ continue; // 字段不全:换下一个 descriptor,勿在此误降级
97
+ }
98
+ return null;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ /** 看板 HTTP 桥(Web GUI 浏览器半消费):GET /kanban/board 读快照;POST /kanban/action 执行状态操作;
105
+ * GET/PUT /kanban/config 配置读写(无 reset:各用户模型配置不同,无公共默认值);GET /kanban/llm-catalog 模型目录;
106
+ * GET /kanban/ocr/status + POST /kanban/ocr/install(/cancel) + GET install/state + POST /kanban/ocr/wire ocr 评审引擎运维。
16
107
  * 仅在 webServer 服务存在时挂载(CLI/headless/测试裸 Context 不挂)。 */
17
- export function registerKanbanHttp(ctx, provider, config) {
108
+ export function registerKanbanHttp(ctx, provider, configProvider, llm, config, ocrDeps) {
18
109
  // 可选服务:经 ctx.get 读取(cordis 4 直接属性读取需 inject;get 不需要)
19
110
  const webServer = ctx.get('webServer');
20
111
  if (!webServer)
@@ -44,7 +135,7 @@ export function registerKanbanHttp(ctx, provider, config) {
44
135
  }
45
136
  if (req.method === 'POST' && req.url?.startsWith('/kanban/action')) {
46
137
  const body = JSON.parse((await readBody(req)) || '{}');
47
- // D23:confirm-audit 是链级 action(无 taskId),提前分流处理
138
+ // confirm-audit 是链级 action(无 taskId),提前分流处理
48
139
  if (body.type === 'confirm-audit') {
49
140
  const chainId = String(body.chainId ?? '').trim();
50
141
  if (!chainId) {
@@ -55,7 +146,8 @@ export function registerKanbanHttp(ctx, provider, config) {
55
146
  json(res, 200, { ok: true });
56
147
  return;
57
148
  }
58
- // 整链硬删除(仅 human;GUI 二次确认):purge 无事件流,客户端需自行 resync
149
+ // 整链硬删除(仅 human;GUI 二次确认):purge 无事件流,客户端需自行 resync。
150
+ // E/F:删链后联动 dispatcher(游标同步钳回)+ V 编排 entry 清理,防运行中实例跳过后续新链事件。
59
151
  if (body.type === 'delete') {
60
152
  const chainId = String(body.chainId ?? '').trim();
61
153
  if (!chainId) {
@@ -63,10 +155,12 @@ export function registerKanbanHttp(ctx, provider, config) {
63
155
  return;
64
156
  }
65
157
  await provider.service.deleteChain(chainId, 'human');
158
+ if (provider.onChainDeleted)
159
+ await provider.onChainDeleted(chainId);
66
160
  json(res, 200, { ok: true });
67
161
  return;
68
162
  }
69
- // T7:rename 是链级或任务级 action(chainId 或 taskId 二选一),在 taskId 守卫前分流
163
+ // rename 是链级或任务级 action(chainId 或 taskId 二选一),在 taskId 守卫前分流
70
164
  if (body.type === 'rename') {
71
165
  const title = String(body.title ?? '').trim();
72
166
  if (!title) {
@@ -103,7 +197,7 @@ export function registerKanbanHttp(ctx, provider, config) {
103
197
  await provider.service.unblockTask(t, 'human');
104
198
  break;
105
199
  case 'retry': {
106
- // T32 fix:retry 走 runner(failed→claim→spawn/resume),而非只 claim 造成 running 悬挂
200
+ // retry 走 runner(failed→claim→spawn/resume),而非只 claim 造成 running 悬挂
107
201
  const state = await provider.service.snapshot();
108
202
  const task = state.tasks.get(t);
109
203
  if (!task) {
@@ -149,6 +243,105 @@ export function registerKanbanHttp(ctx, provider, config) {
149
243
  json(res, 200, { ok: true });
150
244
  return;
151
245
  }
246
+ if (req.method === 'GET' && req.url?.startsWith('/kanban/config')) {
247
+ json(res, 200, configProvider.snapshot());
248
+ return;
249
+ }
250
+ if (req.method === 'PUT' && req.url?.startsWith('/kanban/config')) {
251
+ const raw = JSON.parse((await readBody(req)) || '{}');
252
+ // 归一化缺省字段,保证缺字段走 400 校验失败而非 500。
253
+ // reviewEngine 缺省时回退当前 effective(再兜底默认):旧客户端 bundle 不带该字段时保存不清空既有评审引擎配置。
254
+ const fb = configProvider.getEffective().reviewEngine;
255
+ const snapshot = {
256
+ wikiVault: { baseUrl: raw.wikiVault?.baseUrl ?? '', pagePrefix: raw.wikiVault?.pagePrefix ?? '' },
257
+ roles: { models: raw.roles?.models ?? {} },
258
+ reviewEngine: {
259
+ mode: raw.reviewEngine?.mode ?? fb?.mode ?? 'delegate',
260
+ managed: {
261
+ provider: raw.reviewEngine?.managed?.provider ?? fb?.managed?.provider ?? '',
262
+ model: raw.reviewEngine?.managed?.model ?? fb?.managed?.model ?? '',
263
+ },
264
+ },
265
+ };
266
+ const r = configProvider.applyOverride(snapshot);
267
+ if (!r.ok) {
268
+ json(res, 400, { error: 'validation failed', fields: r.errors });
269
+ return;
270
+ }
271
+ json(res, 200, { ok: true, effective: r.effective, sources: r.sources });
272
+ return;
273
+ }
274
+ if (req.method === 'GET' && req.url?.startsWith('/kanban/llm-catalog')) {
275
+ json(res, 200, await buildLlmCatalog(llm));
276
+ return;
277
+ }
278
+ // ocr 运维面:cancel 前置于 install(POST 前缀匹配防遮蔽),install/state 与 install 以 method 区分
279
+ if (req.method === 'POST' && req.url?.startsWith('/kanban/ocr/install/cancel')) {
280
+ if (!installJob?.running) {
281
+ json(res, 200, { ok: false, error: 'no-install-running' });
282
+ return;
283
+ }
284
+ installJob.child?.kill('SIGTERM');
285
+ installJob.running = false;
286
+ installJob.result = 'cancelled';
287
+ logOcrEvent(configProvider, '[ocr-install] cancelled');
288
+ json(res, 200, { ok: true });
289
+ return;
290
+ }
291
+ if (req.method === 'POST' && req.url?.startsWith('/kanban/ocr/install')) {
292
+ if (installJob?.running) {
293
+ json(res, 409, { error: 'install-in-progress' });
294
+ return;
295
+ }
296
+ installJob = { id: 'ocr-install-' + Date.now(), running: true, child: null, log: '' };
297
+ logOcrEvent(configProvider, '[ocr-install] start');
298
+ void runOcrInstall(ocrDeps, configProvider);
299
+ json(res, 200, { ok: true, id: installJob.id });
300
+ return;
301
+ }
302
+ if (req.method === 'GET' && req.url?.startsWith('/kanban/ocr/install/state')) {
303
+ json(res, 200, installJob
304
+ ? { running: installJob.running, result: installJob.result, version: installJob.version, log: installJob.log }
305
+ : { running: false, log: '' });
306
+ return;
307
+ }
308
+ if (req.method === 'GET' && req.url?.startsWith('/kanban/ocr/status')) {
309
+ const probe = await (ocrDeps?.probeFn ?? probeOcr)();
310
+ json(res, 200, {
311
+ installed: probe.installed,
312
+ version: probe.version,
313
+ mode: configProvider.getEffective().reviewEngine.mode,
314
+ // kbMode 随状态端点透出:前端据此显示 local 模式下独立评审不落 wiki 的提示
315
+ kbMode: configProvider.mode,
316
+ managedReady: ocrDeps?.managedReadyFn ? ocrDeps.managedReadyFn() : managedProviderReady(),
317
+ });
318
+ return;
319
+ }
320
+ if (req.method === 'POST' && req.url?.startsWith('/kanban/ocr/wire')) {
321
+ const body = JSON.parse((await readBody(req)) || '{}');
322
+ const providerId = String(body.provider ?? '').trim();
323
+ const model = String(body.model ?? '').trim();
324
+ if (!providerId || !model) {
325
+ json(res, 400, { error: 'provider and model required' });
326
+ return;
327
+ }
328
+ const probe = await (ocrDeps?.probeFn ?? probeOcr)();
329
+ if (!probe.installed) {
330
+ json(res, 200, { ok: false, log: INSTALL_GUIDANCE });
331
+ return;
332
+ }
333
+ const access = resolveDshProviderAccess(ctx, providerId);
334
+ if (!access) {
335
+ json(res, 200, { ok: false, log: OCR_WIRE_DEGRADED });
336
+ return;
337
+ }
338
+ const r = ocrDeps?.wirer
339
+ ? await ocrDeps.wirer({ provider: providerId, model })
340
+ : await wireManagedProvider({ baseUrl: access.baseUrl, protocol: access.protocol, apiKey: access.apiKey, model });
341
+ logOcrEvent(configProvider, '[ocr-wire] ' + (r.ok ? 'ok' : 'fail'));
342
+ json(res, 200, { ok: r.ok, log: r.log });
343
+ return;
344
+ }
152
345
  json(res, 404, { error: 'not found' });
153
346
  }
154
347
  catch (err) {
@@ -2,7 +2,7 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import type { KanbanService } from '../domain/kanban-service.js';
3
3
  import type { KanbanEvent } from '../domain/types.js';
4
4
  export declare function writeSseEvent(res: ServerResponse, event: KanbanEvent): void;
5
- /** T23:SSE 事件桥。先订阅并缓存 live 事件,再补发补偿事件,握手窗口不丢事件。 */
5
+ /** SSE 事件桥。先订阅并缓存 live 事件,再补发补偿事件,握手窗口不丢事件。 */
6
6
  export declare function serveKanbanEvents(req: IncomingMessage, res: ServerResponse, service: Pick<KanbanService, 'subscribe' | 'eventsSince'>, options: {
7
7
  heartbeatMs: number;
8
8
  }): Promise<void>;
@@ -10,7 +10,7 @@ function lastSeen(req) {
10
10
  const header = Number(headerValue ?? -1);
11
11
  return Math.max(Number.isFinite(query) ? query : -1, Number.isFinite(header) ? header : -1);
12
12
  }
13
- /** T23:SSE 事件桥。先订阅并缓存 live 事件,再补发补偿事件,握手窗口不丢事件。 */
13
+ /** SSE 事件桥。先订阅并缓存 live 事件,再补发补偿事件,握手窗口不丢事件。 */
14
14
  export async function serveKanbanEvents(req, res, service, options) {
15
15
  res.statusCode = 200;
16
16
  res.setHeader('content-type', 'text/event-stream; charset=utf-8');
@@ -1,8 +1,12 @@
1
1
  import { KanbanService } from '../domain/kanban-service.js';
2
2
  import type { SpecCard, SpecCardAttachment } from '../domain/types.js';
3
3
  import { type PrefixRoutes } from '../config.js';
4
- /** 阶段 0 规划引导:命令串从 config 派生(决策12),/openspec: 改名时文案自动跟随。 */
5
- export declare function buildPlanningGuidance(routes: PrefixRoutes): string;
4
+ /** 阶段 0 规划引导:命令串从 config 派生,/openspec: 改名时文案自动跟随。
5
+ * 提问节奏与 skills/grill-me/SKILL.md 对齐:官方 frontier 分轮制(整批问 + 推荐答案 + 答复后解锁下一轮);
6
+ * 增强项:人话硬规则 + 过程风险登记;收敛产物仍为 planning_checklist_save(KB 清单是建链数据源)。 */
7
+ export declare function buildPlanningGuidance(routes: PrefixRoutes, opts?: {
8
+ swarm?: boolean;
9
+ }): string;
6
10
  export declare function validateSpecCardForApproval(card: SpecCard): string[];
7
11
  export declare function buildPlanningContext(chainId: string, card: SpecCard, attachments: SpecCardAttachment[], routes?: PrefixRoutes): string;
8
12
  export declare function approveIfReady(message: string, service: KanbanService, cfg: PrefixRoutes, chainId: string, specCardId: string): Promise<{
@@ -1,14 +1,22 @@
1
1
  import { KanbanService } from '../domain/kanban-service.js';
2
2
  import { parsePrefix } from './prefix-router.js';
3
3
  import { DEFAULT_PREFIX_ROUTES } from '../config.js';
4
- /** 阶段 0 规划引导:命令串从 config 派生(决策12),/openspec: 改名时文案自动跟随。 */
5
- export function buildPlanningGuidance(routes) {
4
+ /** 阶段 0 规划引导:命令串从 config 派生,/openspec: 改名时文案自动跟随。
5
+ * 提问节奏与 skills/grill-me/SKILL.md 对齐:官方 frontier 分轮制(整批问 + 推荐答案 + 答复后解锁下一轮);
6
+ * 增强项:人话硬规则 + 过程风险登记;收敛产物仍为 planning_checklist_save(KB 清单是建链数据源)。 */
7
+ export function buildPlanningGuidance(routes, opts) {
8
+ // 第 6 条按形态分叉:前缀 = 教学旧命令收尾(逐字节不变);swarm = 确认闸语义(不提旧命令,与 KANBAN_HANDOFF_RULE swarm 确认闸对齐)。
9
+ const finish = opts?.swarm
10
+ ? `6. 收尾(确认闸):清单落库后向用户征求确认;仅当用户回复含明确肯定语义(确认/开干/开跑/开始/go 等)才调 kanban_route{intent:'openspec'} 建链开跑;模糊回复视为未确认,继续澄清。`
11
+ : `6. 收尾:提醒用户以 ${routes.openspec} 确认执行结束规划阶段——${routes.openspec} 会从清单建链并自动串行执行。`;
6
12
  return `
7
- # 阶段 0 规划对话(v2:需求澄清前置化)
8
- 1. 需求澄清(grill-me):一次只问一个问题,先澄清目的、约束、成功标准;逐项拷问假设直至用户"没有任何疑问"。
9
- 2. 仓库事实(planning_prefetch):调只读子代理采集目标仓库/资料/知识库事实(本地路径/分支/目标文件基线/既有实现),不凭空假设。
10
- 3. 收敛(planning_checklist_save):把结论写成结构化需求澄清清单(spec 六段 + manifest repo.files + 澄清问答 + 疑问点)存入 KB(KB 不可达自动兜底临时目录)。
11
- 4. 收尾:提醒用户以 ${routes.openspec} 确认执行结束规划阶段——${routes.openspec} 会从清单建链并自动串行执行。
13
+ # 阶段 0 规划对话(v4:grill-me frontier 分轮,与 skills/grill-me 对齐)
14
+ 1. 需求澄清(grill-me,frontier 分轮):把计划映射为设计决策树——每轮只问当前前提已就绪的问题(frontier),整批问出:编号 + 每问附推荐答案;等用户全部答复后重算 frontier(已定决定向外推进、解锁依赖它的问题)再发下一轮,本轮答不了的依赖问题留到后续轮。先澄清目的、约束、成功标准,逐支拷问直至用户"没有任何疑问"。
15
+ 2. 人话硬规则:问题正文与选项必须通俗;术语避不开时首次出现括号一句话解释;发问前自检「不懂本仓库的人能直接回答吗」,不能就重写。
16
+ 3. 仓库事实(planning_prefetch):事实自查是规划者的职责——调只读子代理采集目标仓库/资料/知识库事实(本地路径/分支/目标文件基线/既有实现),不凭空假设、不拿可自查的问题问用户;只把真正的决定留给用户。
17
+ 4. 风险登记:每轮答复中若发现真实风险或非阻塞关注点,随手记一行(描述 + 来源决定 + 缓解思路),收敛时并入澄清清单;没有就不写,禁止硬凑。
18
+ 5. 收敛(planning_checklist_save):把结论写成结构化需求澄清清单(spec 六段 + manifest repo.files + 澄清问答 + 疑问点 + 风险点(若有))存入 KB(KB 不可达自动兜底临时目录)。
19
+ ${finish}
12
20
  护栏:规划期只读仓库,禁止任何 git/源码写入;只写 KB 与临时目录。
13
21
  `;
14
22
  }
@@ -1,14 +1,30 @@
1
1
  import { KanbanService } from '../domain/kanban-service.js';
2
2
  import type { PlanningChecklist } from '../domain/planning-checklist.js';
3
3
  import type { PrefixRoutes } from '../config.js';
4
+ /** 防线D:/openspec: 建链后同步等待首张任务卡的最长时长与轮询间隔(fail-open:超时返回 pending,
5
+ * 由链级看门狗接管)。可变对象供测试注入短值(vitest 文件级隔离)。 */
6
+ export declare const OPENSPEC_FIRST_CARD: {
7
+ timeoutMs: number;
8
+ pollIntervalMs: number;
9
+ };
4
10
  export interface PrefixRouteResult {
5
- kind: 'plan' | 'openspec' | 'learning' | 'none';
11
+ kind: 'plan' | 'openspec' | 'learning' | 'send' | 'none';
6
12
  chainId?: string;
7
13
  specCardId?: string;
8
14
  rest: string;
9
15
  brief?: string;
10
16
  guidance?: string;
11
17
  error?: string;
18
+ /** /openspec: 建链结果;false=被护栏拦截(reason 说明原因),未建任何链/卡。 */
19
+ approved?: boolean;
20
+ reason?: string;
21
+ /** 防线D:建链后同步等待的首卡结果。{taskId,status}=V 已建卡;{pending:true}=等待超时(fail-open,看门狗接管)。 */
22
+ firstCard?: {
23
+ taskId: string;
24
+ status: string;
25
+ } | {
26
+ pending: true;
27
+ };
12
28
  }
13
29
  export declare function parsePrefix(message: string, cfg: PrefixRoutes): PrefixRouteResult;
14
30
  /** v2:/plan: 零副作用——不建链/规格卡/任务卡,仅返回路由结果(workspaceDir/sessionId 由 main-session-tools 捕获)。 */
@@ -17,12 +33,12 @@ export interface OpenspecPlanningInput {
17
33
  workspaceDir: string | null;
18
34
  checklist: PlanningChecklist;
19
35
  checklistRef: string;
20
- /** T7:/plan: rest 原始需求描述;null=无 /plan: 捕获(回退 checklist.problem 首句/未命名需求)。 */
36
+ /** /plan: rest 原始需求描述;null=无 /plan: 捕获(回退 checklist.problem 首句/未命名需求)。 */
21
37
  requirementName?: string | null;
22
38
  }
23
39
  /** v2:/openspec: 建链——从清单机械映射规格卡六段 → 挂 file-prefetch(仓库 localPath)+kb(清单页) → 批准 → executing。 */
24
40
  export declare function handleOpenspecRoute(message: string, service: KanbanService, cfg: PrefixRoutes, planning: OpenspecPlanningInput, ownerSessionId: string): Promise<PrefixRouteResult>;
25
- /** /learning 零副作用引导文案:命令串从 config 派生(决策12),歧义/未找到时注入主 agent。 */
41
+ /** /learning 零副作用引导文案:命令串从 config 派生,歧义/未找到时注入主 agent。 */
26
42
  export declare function buildLearningGuidance(routes: PrefixRoutes): string;
27
43
  /** v2:/learning 零副作用——不建链建卡,仅机械提取证据包供主 agent 蒸馏。歧义返回候选列表,链不存在返回错误文本(不 throw)。 */
28
44
  export declare function handleLearningRoute(message: string, service: KanbanService, cfg: PrefixRoutes, _ownerSessionId: string): Promise<PrefixRouteResult>;
@@ -1,5 +1,8 @@
1
1
  import { KanbanService, buildChainTitle } from '../domain/kanban-service.js';
2
2
  import { buildLearningBrief, resolveLearningChainId } from '../domain/memory.js';
3
+ /** 防线D:/openspec: 建链后同步等待首张任务卡的最长时长与轮询间隔(fail-open:超时返回 pending,
4
+ * 由链级看门狗接管)。可变对象供测试注入短值(vitest 文件级隔离)。 */
5
+ export const OPENSPEC_FIRST_CARD = { timeoutMs: 120_000, pollIntervalMs: 1_000 };
3
6
  export function parsePrefix(message, cfg) {
4
7
  const trimmed = message.trim();
5
8
  if (trimmed.startsWith(cfg.plan))
@@ -8,6 +11,8 @@ export function parsePrefix(message, cfg) {
8
11
  return { kind: 'openspec', rest: trimmed.slice(cfg.openspec.length).trim() };
9
12
  if (trimmed.startsWith(cfg.learning))
10
13
  return { kind: 'learning', rest: trimmed.slice(cfg.learning.length).trim() };
14
+ if (trimmed.startsWith(cfg.send))
15
+ return { kind: 'send', rest: trimmed.slice(cfg.send.length).trim() };
11
16
  return { kind: 'none', rest: trimmed };
12
17
  }
13
18
  /** v2:/plan: 零副作用——不建链/规格卡/任务卡,仅返回路由结果(workspaceDir/sessionId 由 main-session-tools 捕获)。 */
@@ -19,6 +24,23 @@ export async function handleOpenspecRoute(message, service, cfg, planning, owner
19
24
  const parsed = parsePrefix(message, cfg);
20
25
  if (parsed.kind !== 'openspec')
21
26
  return parsed;
27
+ // 护栏前移(fail-fast):无 workspaceDir 的链会让 V 在 getVAgent 抛 workspace-unknown
28
+ // 且被 dispatcher 静默吞掉(链上零任务 → 无任何后续事件重试)→ 空壳链死锁。
29
+ // 典型成因:主 agent 进程重启后 planningBySession 重建,仅重存清单未重走 /plan:,
30
+ // workspaceDir 为 null。此处禁止建链建卡,引导用户先 /plan: 重新捕获工作区。
31
+ if (!planning.workspaceDir || !planning.workspaceDir.trim()) {
32
+ return {
33
+ kind: 'openspec', approved: false, reason: 'workspace-unknown', rest: parsed.rest,
34
+ guidance: [
35
+ '## 建链被拦截:workspaceDir 缺失(workspace-unknown)',
36
+ '当前规划上下文没有目标仓库工作区(多为主 agent 重启后清单内存重建所致)。',
37
+ '处理步骤(严格顺序):',
38
+ '1. 重新发送 ' + cfg.plan + ' <需求描述> 让主 agent 捕获工作区(必要时按提示注册工作区);',
39
+ '2. 清单仍在时重发 ' + cfg.openspec + ' 确认即可建链;清单丢失则重新澄清后再确认。',
40
+ '禁止:在无工作区时建链建卡;猜测工作区路径。',
41
+ ].join('\n'),
42
+ };
43
+ }
22
44
  const chain = await service.createChain({
23
45
  title: buildChainTitle(planning.checklist.requirementName ?? planning.requirementName ?? null, parsed.rest, planning.checklist.spec.problem),
24
46
  ownerSessionId, workspaceDir: planning.workspaceDir,
@@ -27,15 +49,30 @@ export async function handleOpenspecRoute(message, service, cfg, planning, owner
27
49
  await service.addSpecCardAttachment(card.id, { name: '需求澄清清单(仓库事实)', kind: 'file-prefetch', ref: planning.checklist.manifest.repo.localPath }, 'v');
28
50
  await service.addSpecCardAttachment(card.id, { name: '需求澄清清单(完整资料)', kind: 'kb', ref: planning.checklistRef }, 'v');
29
51
  await service.approveSpecCard(card.id, 'human');
30
- return { kind: 'openspec', chainId: chain.id, specCardId: card.id, rest: parsed.rest };
52
+ const firstCard = await waitFirstCard(service, chain.id);
53
+ return { kind: 'openspec', chainId: chain.id, specCardId: card.id, rest: parsed.rest, firstCard };
54
+ }
55
+ /** 防线D:轮询看板等首张任务卡(任意 assignee/mode,V 首轮建 p 卡)。成功即返;
56
+ * 超时 fail-open 返回 {pending:true}——不挂死工具调用,失败面由链级看门狗兜底。 */
57
+ async function waitFirstCard(service, chainId) {
58
+ const deadline = Date.now() + OPENSPEC_FIRST_CARD.timeoutMs;
59
+ for (;;) {
60
+ const state = await service.snapshot();
61
+ const t = [...state.tasks.values()].filter((x) => x.chainId === chainId).at(-1);
62
+ if (t)
63
+ return { taskId: t.id, status: t.status };
64
+ if (Date.now() >= deadline)
65
+ return { pending: true };
66
+ await new Promise((r) => setTimeout(r, Math.min(OPENSPEC_FIRST_CARD.pollIntervalMs, Math.max(1, deadline - Date.now()))));
67
+ }
31
68
  }
32
- /** /learning 零副作用引导文案:命令串从 config 派生(决策12),歧义/未找到时注入主 agent。 */
69
+ /** /learning 零副作用引导文案:命令串从 config 派生,歧义/未找到时注入主 agent。 */
33
70
  export function buildLearningGuidance(routes) {
34
71
  return [
35
72
  '## 经验蒸馏指令(' + routes.learning + ')',
36
73
  '消化上方「链上下文 + 机械信号证据包」,蒸馏 1-3 条可复用经验(返工根因 / 阻塞原因 / 审计教训)。',
37
74
  '每条约成 LearningEntry(title 一句话≤80 字符;lesson 教训;evidence 必须填本链 chain id 作机械证据;tags 自由标签)。',
38
- '调 planning_learning_save:scope=chain 存需求级 projects/<chainId>/learnings/;仓库通用经验用 scope=project(自动归入目标仓库项目级)。',
75
+ '调 planning_learning_save:scope=chain 存需求级 projects/<repoSlug>/<chainId>/learnings/;仓库通用经验用 scope=project(projects/<repoSlug>/learnings/,repoSlug 由链 workspaceDir 派生)。',
39
76
  '无值得沉淀的经验时,明确回复「无新经验」,不要硬凑。',
40
77
  ].join('\n');
41
78
  }
@@ -0,0 +1,38 @@
1
+ import { Service, type Context } from '@deepseek-ai/cordis';
2
+ import type { EditableSnapshot, SourceMap } from '../domain/config-override.js';
3
+ import type { KanbanConfig } from '../config.js';
4
+ declare module '@deepseek-ai/cordis' {
5
+ interface Context {
6
+ swarmConfig: ConfigProvider;
7
+ }
8
+ }
9
+ export type ApplyResult = {
10
+ ok: true;
11
+ effective: EditableSnapshot;
12
+ sources: SourceMap;
13
+ changed: string[];
14
+ } | {
15
+ ok: false;
16
+ errors: string[];
17
+ };
18
+ export declare class ConfigProvider extends Service {
19
+ private readonly baseline;
20
+ private readonly overrideFile;
21
+ private readonly auditFile;
22
+ private override;
23
+ private effective;
24
+ private sources;
25
+ constructor(ctx: Context, baseline: KanbanConfig, storageDir: string);
26
+ getEffective(): KanbanConfig;
27
+ getSources(): SourceMap;
28
+ get mode(): 'remote' | 'local';
29
+ snapshot(): {
30
+ effective: EditableSnapshot;
31
+ sources: SourceMap;
32
+ };
33
+ applyOverride(snapshot: EditableSnapshot): ApplyResult;
34
+ private readOverride;
35
+ private writeOverride;
36
+ private appendAudit;
37
+ private diffKeys;
38
+ }