@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.
Files changed (567) hide show
  1. package/README.md +3 -3
  2. package/README.zh-CN.md +3 -3
  3. package/client/BoardCard.tsx +24 -2
  4. package/client/ConfigSection.tsx +71 -0
  5. package/client/ConfigSelect.tsx +69 -0
  6. package/client/KanbanBoard.tsx +3 -0
  7. package/client/KanbanTab.tsx +4 -3
  8. package/client/TaskDrawer.tsx +2 -26
  9. package/client/WorkflowRail.tsx +3 -1
  10. package/client/config-store.ts +51 -0
  11. package/client/config.css +110 -0
  12. package/client/index.ts +39 -4
  13. package/client/kanban.css +19 -2
  14. package/client/session-bridge.ts +39 -0
  15. package/client/timeline-model.ts +10 -1
  16. package/client/workflow-model.ts +3 -1
  17. package/lib/client.js +358 -53
  18. package/lib/config.d.ts +8 -1
  19. package/lib/config.js +6 -1
  20. package/lib/dispatcher/agent-runner.d.ts +28 -6
  21. package/lib/dispatcher/agent-runner.js +175 -62
  22. package/lib/dispatcher/chain-auditor.js +4 -1
  23. package/lib/dispatcher/dispatcher.d.ts +62 -3
  24. package/lib/dispatcher/dispatcher.js +243 -20
  25. package/lib/dispatcher/session-events.d.ts +11 -15
  26. package/lib/dispatcher/session-events.js +17 -5
  27. package/lib/dispatcher/v-orchestrator.d.ts +42 -9
  28. package/lib/dispatcher/v-orchestrator.js +236 -28
  29. package/lib/domain/config-override.d.ts +38 -0
  30. package/lib/domain/config-override.js +101 -0
  31. package/lib/domain/delivery-contract.d.ts +3 -2
  32. package/lib/domain/delivery-contract.js +28 -16
  33. package/lib/domain/gate-policy.d.ts +26 -0
  34. package/lib/domain/gate-policy.js +44 -0
  35. package/lib/domain/kanban-service.d.ts +16 -3
  36. package/lib/domain/kanban-service.js +41 -6
  37. package/lib/domain/permissions.js +1 -1
  38. package/lib/domain/planning-checklist.d.ts +5 -0
  39. package/lib/domain/planning-checklist.js +80 -6
  40. package/lib/domain/projection.js +2 -1
  41. package/lib/domain/review-evidence.js +1 -1
  42. package/lib/domain/state-machine.js +2 -1
  43. package/lib/domain/types.d.ts +2 -2
  44. package/lib/index.js +19 -21
  45. package/lib/roles/clean-fs-tools.d.ts +22 -0
  46. package/lib/roles/clean-fs-tools.js +118 -0
  47. package/lib/roles/skill-installer.d.ts +6 -0
  48. package/lib/roles/skill-installer.js +32 -0
  49. package/lib/roles/toolsets.d.ts +13 -1
  50. package/lib/roles/toolsets.js +163 -31
  51. package/lib/roles/wiki-worker.d.ts +1 -0
  52. package/lib/roles/wiki-worker.js +10 -2
  53. package/lib/routes/kanban-http.d.ts +5 -2
  54. package/lib/routes/kanban-http.js +36 -3
  55. package/lib/routes/planning-driver.d.ts +3 -1
  56. package/lib/routes/planning-driver.js +10 -6
  57. package/lib/routes/prefix-router.d.ts +16 -0
  58. package/lib/routes/prefix-router.js +37 -2
  59. package/lib/services/config-provider.d.ts +42 -0
  60. package/lib/services/config-provider.js +94 -0
  61. package/lib/services/gate-runner.d.ts +24 -0
  62. package/lib/services/gate-runner.js +87 -0
  63. package/lib/services/kanban-provider.d.ts +5 -1
  64. package/lib/services/kanban-provider.js +40 -2
  65. package/lib/services/llm-catalog.d.ts +35 -0
  66. package/lib/services/llm-catalog.js +19 -0
  67. package/lib/tools/kanban-tools.js +1 -0
  68. package/lib/tools/main-session-tools.d.ts +17 -2
  69. package/lib/tools/main-session-tools.js +88 -21
  70. package/lib/tools/planning-tools.d.ts +4 -0
  71. package/lib/tools/planning-tools.js +39 -12
  72. package/lib/tools/prefetch-tools.js +1 -0
  73. package/lib/tools/spec-card-tools.js +1 -0
  74. package/lib/tools/wiki-tools.js +5 -4
  75. package/lib/wiki/kb-linkage.d.ts +9 -2
  76. package/lib/wiki/kb-linkage.js +3 -3
  77. package/lib/wiki/local-kb-client.d.ts +14 -0
  78. package/lib/wiki/local-kb-client.js +101 -0
  79. package/lib/wiki/local-kb.d.ts +6 -0
  80. package/lib/wiki/local-kb.js +25 -0
  81. package/lib/wiki/memory-recall.d.ts +14 -6
  82. package/lib/wiki/memory-recall.js +17 -13
  83. package/lib/wiki/page-path.d.ts +9 -3
  84. package/lib/wiki/page-path.js +29 -11
  85. package/lib/wiki/wiki-vault-client.d.ts +3 -3
  86. package/lib/wiki/wiki-vault-client.js +6 -6
  87. package/package.json +16 -11
  88. package/personas/kanban-d/preset.yml +1 -1
  89. package/personas/kanban-dt/agent.cordis.yml +2 -2
  90. package/personas/kanban-dt/preset.yml +1 -1
  91. package/personas/kanban-p/agent.cordis.yml +16 -0
  92. package/personas/kanban-p/preset.yml +1 -1
  93. package/personas/kanban-pt/agent.cordis.yml +38 -8
  94. package/personas/kanban-pt/preset.yml +1 -1
  95. package/personas/kanban-w/agent.cordis.yml +35 -16
  96. package/personas/kanban-w/preset.yml +1 -1
  97. package/personas/persona-dt.md +1 -1
  98. package/personas/persona-p.md +4 -1
  99. package/personas/persona-pt.md +13 -6
  100. package/personas/persona-w.md +11 -9
  101. package/skills/grill-me/SKILL.md +71 -0
  102. package/skills/llm-wiki-skill/.mise.toml +2 -0
  103. package/skills/llm-wiki-skill/.nvmrc +1 -0
  104. package/skills/llm-wiki-skill/AGENTS.md +173 -0
  105. package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
  106. package/skills/llm-wiki-skill/CLAUDE.md +152 -0
  107. package/skills/llm-wiki-skill/HERMES.md +44 -0
  108. package/skills/llm-wiki-skill/README.en.md +261 -0
  109. package/skills/llm-wiki-skill/README.md +291 -0
  110. package/skills/llm-wiki-skill/SKILL.md +1133 -0
  111. package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
  112. package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
  113. package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
  114. package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
  115. package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
  116. package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
  117. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
  118. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
  119. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
  120. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
  121. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
  122. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
  123. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
  124. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
  125. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
  126. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
  127. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
  128. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
  129. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
  130. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
  131. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
  132. package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
  133. package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
  134. package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
  135. package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
  136. package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
  137. package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
  138. package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
  139. package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
  140. package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
  141. package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
  142. package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
  143. package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
  144. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
  145. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
  146. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
  147. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
  148. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
  149. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
  150. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
  151. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
  152. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
  153. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
  154. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
  155. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
  156. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
  157. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
  158. package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
  159. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
  160. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
  161. package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
  162. package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
  163. package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
  164. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
  165. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
  166. package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
  167. package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
  168. package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
  169. package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
  170. package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
  171. package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
  172. package/skills/llm-wiki-skill/install.ps1 +87 -0
  173. package/skills/llm-wiki-skill/install.sh +722 -0
  174. package/skills/llm-wiki-skill/package-lock.json +11171 -0
  175. package/skills/llm-wiki-skill/package.json +24 -0
  176. package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
  177. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
  178. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
  179. package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
  180. package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
  181. package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
  182. package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
  183. package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
  184. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
  185. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
  186. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
  187. package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
  188. package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
  189. package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
  190. package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
  191. package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
  192. package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
  193. package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
  194. package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
  195. package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
  196. package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
  197. package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
  198. package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
  199. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
  200. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
  201. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
  202. package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
  203. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
  204. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
  205. package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
  206. package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
  207. package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
  208. package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
  209. package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
  210. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
  211. package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
  212. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
  213. package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
  214. package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
  215. package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
  216. package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
  217. package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
  218. package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
  219. package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
  220. package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
  221. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
  222. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
  223. package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
  224. package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
  225. package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
  226. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
  227. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
  228. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
  229. package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
  230. package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
  231. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
  232. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
  233. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
  234. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
  235. package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
  236. package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
  237. package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
  238. package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
  239. package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
  240. package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
  241. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
  242. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
  243. package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
  244. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
  245. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
  246. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
  247. package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
  248. package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
  249. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
  250. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
  251. package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
  252. package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
  253. package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
  254. package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
  255. package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
  256. package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
  257. package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
  258. package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
  259. package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
  260. package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
  261. package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
  262. package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
  263. package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
  264. package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
  265. package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
  266. package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
  267. package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
  268. package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
  269. package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
  270. package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
  271. package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
  272. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
  273. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
  274. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
  275. package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
  276. package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
  277. package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
  278. package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
  279. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
  280. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
  281. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
  282. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
  283. package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
  284. package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
  285. package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
  286. package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
  287. package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
  288. package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
  289. package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
  290. package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
  291. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
  292. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
  293. package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
  294. package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
  295. package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
  296. package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
  297. package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
  298. package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
  299. package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
  300. package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
  301. package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
  302. package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
  303. package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
  304. package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
  305. package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
  306. package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
  307. package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
  308. package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
  309. package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
  310. package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
  311. package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
  312. package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
  313. package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
  314. package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
  315. package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
  316. package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
  317. package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
  318. package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
  319. package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
  320. package/skills/llm-wiki-skill/setup.sh +8 -0
  321. package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
  322. package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
  323. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
  324. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
  325. package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
  326. package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
  327. package/skills/llm-wiki-skill/templates/index-template.md +51 -0
  328. package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
  329. package/skills/llm-wiki-skill/templates/log-template.md +11 -0
  330. package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
  331. package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
  332. package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
  333. package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
  334. package/skills/llm-wiki-skill/templates/query-template.md +19 -0
  335. package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
  336. package/skills/llm-wiki-skill/templates/source-template.md +51 -0
  337. package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
  338. package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
  339. package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
  340. package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
  341. package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
  342. package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
  343. package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
  344. package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
  345. package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
  346. package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
  347. package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
  348. package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
  349. package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
  350. package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
  351. package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
  352. package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
  353. package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
  354. package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
  355. package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
  356. package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
  357. package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
  358. package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
  359. package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
  360. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
  361. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
  362. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
  363. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
  364. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
  365. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
  366. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
  367. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
  368. package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
  369. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
  370. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
  371. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
  372. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
  373. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
  374. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
  375. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
  376. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
  377. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
  378. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
  379. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
  380. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
  381. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
  382. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
  383. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
  384. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
  385. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
  386. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
  387. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
  388. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
  389. package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
  390. package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
  391. package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
  392. package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
  393. package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
  394. package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
  395. package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
  396. package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
  397. package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
  398. package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
  399. package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
  400. package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
  401. package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
  402. package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
  403. package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
  404. package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
  405. package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
  406. package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
  407. package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
  408. package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
  409. package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
  410. package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
  411. package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
  412. package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
  413. package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
  414. package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
  415. package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
  416. package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
  417. package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
  418. package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
  419. package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
  420. package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
  421. package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
  422. package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
  423. package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
  424. package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
  425. package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
  426. package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
  427. package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
  428. package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
  429. package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
  430. package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
  431. package/skills/llm-wiki-skill/workbench/README.md +30 -0
  432. package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
  433. package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
  434. package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
  435. package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
  436. package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
  437. package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
  438. package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
  439. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
  440. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
  441. package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
  442. package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
  443. package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
  444. package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
  445. package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
  446. package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
  447. package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
  448. package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
  449. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
  450. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
  451. package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
  452. package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
  453. package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
  454. package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
  455. package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
  456. package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
  457. package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
  458. package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
  459. package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
  460. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
  461. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
  462. package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
  463. package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
  464. package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
  465. package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
  466. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
  467. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
  468. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
  469. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
  470. package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
  471. package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
  472. package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
  473. package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
  474. package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
  475. package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
  476. package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
  477. package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
  478. package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
  479. package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
  480. package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
  481. package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
  482. package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
  483. package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
  484. package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
  485. package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
  486. package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
  487. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
  488. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
  489. package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
  490. package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
  491. package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
  492. package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
  493. package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
  494. package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
  495. package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
  496. package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
  497. package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
  498. package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
  499. package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
  500. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
  501. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
  502. package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
  503. package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
  504. package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
  505. package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
  506. package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
  507. package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
  508. package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
  509. package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
  510. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
  511. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
  512. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
  513. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
  514. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
  515. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
  516. package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
  517. package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
  518. package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
  519. package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
  520. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
  521. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
  522. package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
  523. package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
  524. package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
  525. package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
  526. package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
  527. package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
  528. package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
  529. package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
  530. package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
  531. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
  532. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
  533. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
  534. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
  535. package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
  536. package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
  537. package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
  538. package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
  539. package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
  540. package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
  541. package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
  542. package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
  543. package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
  544. package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
  545. package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
  546. package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
  547. package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
  548. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
  549. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
  550. package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
  551. package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
  552. package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
  553. package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
  554. package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
  555. package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
  556. package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
  557. package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
  558. package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
  559. package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
  560. package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
  561. package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
  562. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
  563. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
  564. package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
  565. package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
  566. package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
  567. package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
@@ -0,0 +1,185 @@
1
+ # 对话自动跟随设计
2
+
3
+ 日期:2026-06-22
4
+ 状态:设计已确认,待实现
5
+ 当前分支:`codex/fix-chat-auto-scroll`
6
+
7
+ ## 目的
8
+
9
+ 这份设计用于解决 llm-wiki-agent 对话区在发送消息后不会自动向下推进的问题。
10
+
11
+ 当前现象是:用户发送消息后,AI 回复已经开始生成,但对话内容不会自动滚到最新位置。用户需要手动用滚轮向下滚,才能看到新回复或回复后续内容。这会打断对话连续性,尤其在长回复和工具调用之后更明显。
12
+
13
+ 目标体验是一句话:
14
+
15
+ **用户在看最新回复时,对话自动跟随;用户主动上翻看历史时,界面尊重用户,不强行拉回底部。**
16
+
17
+ ## 背景依据
18
+
19
+ llm-wiki-agent 的产品定位是“以对话为中心的本地知识库工作台”。对话主区是核心入口,自动跟随最新回复属于基础对话体验。
20
+
21
+ 本设计不是新增复杂功能,也不是改变对话模型、消息协议或会话存储。它只收口一件事:对话区应该在正确的时候展示最新内容。
22
+
23
+ 已确认的现状:
24
+
25
+ - 对话消息区本身是可滚动区域。
26
+ - 发送消息会立即新增用户消息和空的 AI 回复气泡。
27
+ - AI 回复是流式生成的,内容会持续变长。
28
+ - 当前没有专门的“是否跟随底部”的状态管理。
29
+
30
+ ## 设计结论
31
+
32
+ 采用“智能跟随 + 向下箭头按钮”的方案。
33
+
34
+ 1. 用户发送消息后,对话区立即滚到最新消息位置。
35
+ 2. AI 回复生成过程中,如果用户仍在底部附近,对话区持续跟随最新内容。
36
+ 3. 如果用户主动上翻历史,对话区暂停自动跟随。
37
+ 4. 暂停跟随后,显示向下箭头按钮,提醒用户有最新内容可回到。
38
+ 5. 用户点击向下箭头按钮,或自己手动滚回底部附近后,恢复自动跟随。
39
+
40
+ 这里的“底部附近”指用户距离消息区底部很近,已经是在看最新内容。实现时可使用一个固定容差,例如 80-120 px;具体数值以不误判用户上翻为优先。
41
+
42
+ 不采用以下方案:
43
+
44
+ - 不做“永远强制滚到底部”,因为会打断用户阅读历史消息。
45
+ - 不做“只在发送时滚一次”,因为 AI 回复流式变长时仍可能看不到后续内容。
46
+
47
+ ## 用户体验规则
48
+
49
+ ### 1. 发送消息
50
+
51
+ 用户点击发送或使用快捷键发送后:
52
+
53
+ - 输入框清空。
54
+ - 新的用户消息和 AI 回复占位出现在对话尾部。
55
+ - 对话区自动滚到尾部。
56
+ - 自动跟随状态开启。
57
+
58
+ 这样用户能立即看到“消息已发出,AI 正在回复”。
59
+
60
+ ### 2. 回复生成中
61
+
62
+ AI 回复逐步生成时:
63
+
64
+ - 如果用户没有上翻,最新回复始终保持在可见范围内。
65
+ - 回复内容变长、工具状态出现、工具状态完成、Markdown 表格展开等情况,都应继续跟随。
66
+ - 跟随不需要动画夸张,重点是稳定地看到最新内容。
67
+
68
+ ### 3. 用户主动上翻
69
+
70
+ 如果用户把对话区往上滚,离开底部一段距离:
71
+
72
+ - 自动跟随暂停。
73
+ - 后续 AI 回复继续生成,但不强行滚动页面。
74
+ - 显示向下箭头按钮。
75
+
76
+ 这里的产品原则是:一旦用户主动查看历史,系统不能替用户夺回滚动位置。
77
+
78
+ ### 4. 恢复跟随
79
+
80
+ 有两种方式恢复:
81
+
82
+ - 用户点击向下箭头按钮。
83
+ - 用户自己滚回底部附近。
84
+
85
+ 恢复后:
86
+
87
+ - 对话区滚到最新内容。
88
+ - 向下箭头按钮消失。
89
+ - 如果 AI 仍在生成,继续自动跟随。
90
+
91
+ ### 5. 切换会话或知识库
92
+
93
+ 切换会话或知识库后,新的对话面板应按当前会话历史展示:
94
+
95
+ - 如果进入的是已有长对话,默认展示底部最新消息。
96
+ - 如果是空会话,展示空状态。
97
+ - 切换动作不继承上一个会话的“暂停跟随”状态。
98
+
99
+ ## 界面边界
100
+
101
+ 回到底部入口采用类似 Codex 的向下箭头图标按钮,不使用文字按钮。
102
+
103
+ 按钮规则:
104
+
105
+ - 使用单个向下箭头表达“回到底部”。
106
+ - 按钮为轻量圆形或近圆形,视觉上像悬浮的小控制点。
107
+ - 放在对话区底部中间附近,悬浮在输入区上方,不遮挡消息正文。
108
+ - 样式跟随当前主题,使用柔和背景、细边框和轻微阴影;暗色和浅色模式都要自然。
109
+ - 鼠标悬停时只做轻微强调,不做夸张动画。
110
+ - 只在用户离开底部且有必要回到底部时出现。
111
+ - 按钮本身不显示文字,但可访问名称应是“回到底部”。
112
+ - 本次不增加未读数量;如果以后需要未读计数,另开设计,不混入本次实现。
113
+
114
+ 本次不做:
115
+
116
+ - 未读消息数量。
117
+ - 跳转到某一条消息。
118
+ - 对话搜索定位。
119
+ - 历史消息虚拟列表。
120
+ - 全局页面滚动重构。
121
+
122
+ ## 组件与数据流
123
+
124
+ 实现应集中在对话面板内部完成,不改变后端接口。
125
+
126
+ 需要维护的前端状态:
127
+
128
+ - 当前是否处于自动跟随状态。
129
+ - 当前是否离底部足够近。
130
+ - 是否需要显示向下箭头按钮。
131
+
132
+ 主要数据流:
133
+
134
+ 1. 用户发送消息,消息列表新增内容,开启自动跟随。
135
+ 2. AI 流式回复更新消息内容。
136
+ 3. 消息内容变化后,如果自动跟随开启,则滚到尾部。
137
+ 4. 用户滚动消息区时,判断是否离开底部。
138
+ 5. 离开底部则暂停自动跟随并显示向下箭头按钮。
139
+ 6. 用户点击向下箭头按钮或滚回底部,则恢复自动跟随。
140
+
141
+ ## 异常与边界
142
+
143
+ 需要覆盖以下情况:
144
+
145
+ - 对话为空时不显示向下箭头按钮。
146
+ - 只有图标按钮时,键盘和读屏仍能识别它是“回到底部”。
147
+ - 回复出错时,如果用户在底部附近,错误提示也应可见。
148
+ - 用户停止生成时,滚动状态不应乱跳。
149
+ - 工具调用状态展开或收起时,如果用户在底部附近,应继续跟随。
150
+ - 大段 Markdown、表格、代码块渲染后高度变化时,仍能保持跟随。
151
+ - 用户正在上翻时,即使回复继续增长,也不能强行滚回底部。
152
+
153
+ ## 验收标准
154
+
155
+ 实现完成后至少验证以下场景:
156
+
157
+ 1. 发出一条普通消息后,不需要滚轮就能看到 AI 回复开始。
158
+ 2. 长回复生成过程中,页面持续停在最新内容附近。
159
+ 3. 回复生成时用户上翻历史,页面不再被自动拉到底部。
160
+ 4. 用户上翻后看到符合当前主题的向下箭头按钮,而不是文字按钮。
161
+ 5. 用户点击向下箭头按钮后,立即回到最新回复,并恢复自动跟随。
162
+ 6. 用户自己滚回底部后,向下箭头按钮消失,后续回复继续自动跟随。
163
+ 7. 切换到已有长会话时,默认看到最新消息。
164
+ 8. 回复出错或停止生成时,界面没有异常跳动。
165
+
166
+ ## 验证方式
167
+
168
+ 推荐验证分三层:
169
+
170
+ 1. 增加前端组件测试,覆盖发送、流式更新、用户上翻、向下箭头按钮显示与恢复。
171
+ 2. 运行现有前端测试和类型检查,确认没有破坏输入框、导出按钮、消息气泡和工具状态。
172
+ 3. 启动本地应用,在浏览器里真实发送一条长回复请求,手动验证自动跟随和上翻暂停。
173
+
174
+ ## 后续实现范围
175
+
176
+ 后续实现应只修改对话面板和必要样式。
177
+
178
+ 不改:
179
+
180
+ - 后端流式协议。
181
+ - 会话存储格式。
182
+ - 知识库选择逻辑。
183
+ - 图谱、右抽屉、搜索、导出等无关模块。
184
+
185
+ 如果实现过程中发现对话区滚动容器和页面布局有冲突,应先优先修正对话区内部滚动边界,不扩大为整体布局重构。
@@ -0,0 +1,266 @@
1
+ # 社区节点轻量关系地图设计
2
+
3
+ 日期:2026-06-22
4
+ 状态:待用户复核
5
+ 当前分支:`codex/graph-community-node-visual-design`
6
+ 视觉稿:`designs/graph-community-node-map/Community Node Map Prototype.html`
7
+
8
+ ## 目的
9
+
10
+ 这份设计用于优化 llm-wiki 图谱里“进入社区后”的节点呈现。
11
+
12
+ 当前社区内节点更像一组大卡片,卡片体积偏大、节点挨得近,社区背景色块又强化了被框住的感觉。用户进入社区后,本来想看清“这个社区内部有哪些知识点、谁和谁有关”,却容易先看到一片拥挤的卡片。
13
+
14
+ 本次目标不是重做整个图谱,也不是重新定义社区、边或右侧抽屉,而是把社区内部的视觉层级改成一张轻量关系地图:
15
+
16
+ **社区里默认看地图,悬停临时看关系,点击固定看内容。**
17
+
18
+ ## 强范围边界
19
+
20
+ 本次只聚焦于图谱里的社区节点设计,具体是:用户已经进入某个社区后,社区内部节点、线、标签、社区底色,以及节点悬停/点击后的关系聚焦表现。
21
+
22
+ 本次不改:
23
+
24
+ - 全局图谱的默认呈现、路由、性能策略和 Sigma 全局规则。
25
+ - 对话、会话列表、知识库创建、消化、检索、导入导出等非图谱功能。
26
+ - 社区入口规则,例如从全局如何选择社区、如何进入社区。
27
+ - 右侧面板的信息结构和内容层级。
28
+ - 现有关系类型、置信度、权重这些图例概念的含义。
29
+ - 节点真实数据、知识库文件结构和图谱构建流程。
30
+
31
+ 允许的联动只有两类:
32
+
33
+ - 用户点击社区内节点时,沿用现有机制更新右侧面板里的节点内容。
34
+ - 为了让社区内线条表现正确,可以读取并复用现有边字段:关系类型、置信度、权重、节点类型和节点连接关系。
35
+
36
+ 任何超出以上范围的体验调整,都应另开设计,不混进本次实现。
37
+
38
+ ## 已确认现状
39
+
40
+ 代码和图例里已经存在三套边信息表达,本次必须继续沿用:
41
+
42
+ - 关系类型:实现 / 依赖 / 衍生 / 对比 / 矛盾,用线的颜色表达。
43
+ - 置信度:原文 / 推断 / 待确认,用线的虚实表达。
44
+ - 联系强弱:用线的粗细和透明度表达。
45
+
46
+ 当前实现已有“选中节点后相关边优先”的基础,但还没有把社区内节点明确分成一度、二度和无关三层,也没有把悬停和点击统一成同一套聚焦逻辑。
47
+
48
+ 因此本次设计不推翻原来的边图例,而是在社区视图里补上更清楚的关系距离规则。
49
+
50
+ ## 方案选择
51
+
52
+ 对比过三种方向:
53
+
54
+ 1. 轻量关系地图:节点像地图坐标点,默认留白多、线很细;聚焦时一度关系清晰,二度关系很淡。
55
+ 2. 聚焦星图:点中节点后把它变成中心,周围关系强烈围绕它呈现。
56
+ 3. 社区知识岛:强化社区边界感,让节点像散落在一个岛上的知识点。
57
+
58
+ 采用方案 1:轻量关系地图。
59
+
60
+ 原因:
61
+
62
+ - 它最能解决“卡片大、挤、不美观”的问题。
63
+ - 它保留当前视觉稿里已经被认可的空间感。
64
+ - 它不会把社区背景变成新的视觉负担。
65
+ - 它能自然承接现有边图例,而不是发明一套新说明。
66
+
67
+ ## 默认视觉状态
68
+
69
+ 进入社区后,画面不再铺满节点卡片,而是一张轻量关系地图。
70
+
71
+ 节点像散开的坐标点,有明显留白和空间感。普通节点保持小点形态,重点节点才默认显示名字。重点节点包括社区核心节点、结构上更重要的节点、搜索命中、已固定节点,以及当前选中节点。
72
+
73
+ 社区底色保留,但只作为很淡的氛围提示。它说明“你正在这个社区里”,不作为硬边界,也不限制节点位置。节点可以在视觉上更自由地分布,避免被一整块背景色压住。
74
+
75
+ 线在默认状态下很细、很安静,只提示社区内部存在关系,不抢节点层级。默认状态不强调所有边的完整解读,只有用户悬停或点击节点时,关系才进入可读状态。
76
+
77
+ 节点颜色继续区分节点性质,例如主题、实体、来源、对比或综合类节点。颜色必须克制,不和边的颜色抢语义。
78
+
79
+ ## 标签策略
80
+
81
+ 默认只显示重点节点标签。
82
+
83
+ 普通节点默认不显示名字,只保留可见点位。鼠标悬停或节点被聚焦时,才显示对应标签。这样社区第一眼是地图,而不是文字墙。
84
+
85
+ 标签显示必须稳定:
86
+
87
+ - 悬停时标签出现,但节点本身不能因为标签出现而移位。
88
+ - 标签不应撑大节点的命中区域。
89
+ - 标签应优先避开核心节点和高亮线,不让关键关系被遮住。
90
+ - 标签过长时截断,不把画面横向撑开。
91
+
92
+ ## 悬停与点击
93
+
94
+ 悬停和点击使用同一套关系聚焦逻辑。
95
+
96
+ 区别只在于:
97
+
98
+ - 悬停是临时聚焦,鼠标移走后恢复。
99
+ - 点击是固定聚焦,会保持住,并同步更新右侧面板。
100
+
101
+ 当没有固定选中节点时,鼠标放到某个节点上,地图立即进入临时聚焦:
102
+
103
+ - 当前节点最清楚。
104
+ - 一度相关节点清楚显示。
105
+ - 当前节点到一度节点之间的线清楚显示。
106
+ - 二度相关节点保留很淡的背景感。
107
+ - 无关节点和无关线退到几乎不可见。
108
+ - 鼠标移走后恢复默认地图。
109
+
110
+ 点击某个节点后:
111
+
112
+ - 使用同样的聚焦视觉。
113
+ - 该聚焦状态固定。
114
+ - 右侧面板显示该节点内容。
115
+ - 点击另一个节点时切换固定聚焦。
116
+ - 点击社区画布空白处时,取消固定聚焦,回到默认地图。
117
+
118
+ 当已经有固定选中节点时,再悬停其他节点:
119
+
120
+ - 临时展示悬停节点的关系。
121
+ - 鼠标移走后回到已固定节点的聚焦状态。
122
+ - 不因为悬停改写右侧面板内容。
123
+
124
+ ## 关系距离规则
125
+
126
+ 以当前被悬停或点击的节点作为焦点节点。
127
+
128
+ 一度相关节点:
129
+
130
+ - 与焦点节点直接相连。
131
+ - 直接连线清晰可见。
132
+ - 节点标签优先显示。
133
+ - 节点透明度和点尺寸略高于默认。
134
+
135
+ 二度相关节点:
136
+
137
+ - 与一度节点相连,但不直接连接焦点节点。
138
+ - 只保留很淡的背景存在感。
139
+ - 默认不显示标签。
140
+ - 二度连线通常不完整呈现,只作为极淡的延伸提示。
141
+
142
+ 无关节点:
143
+
144
+ - 与焦点节点没有一度或二度关系。
145
+ - 退到几乎不可见,但不制造画面跳变。
146
+ - 默认不显示标签。
147
+ - 无关节点之间的线隐藏或接近不可见。
148
+
149
+ 这里的“一度 / 二度”按现有图谱边关系计算,不引入新的语义数据。
150
+
151
+ ## 线条表达
152
+
153
+ 线条继续遵守现有图例:
154
+
155
+ - 颜色表示关系类型。
156
+ - 虚实表示置信度。
157
+ - 粗细表示联系强弱。
158
+
159
+ 聚焦状态下,一度直接连线应最清楚。它既要保留颜色和虚实语义,也要通过粗细让强关系更容易被看见。
160
+
161
+ 二度关系可以保留轻微线索,但不能抢一度关系。无关线默认隐藏或极淡。
162
+
163
+ 默认状态下,社区内部所有线都应更克制,避免整张社区图变成线团。只有悬停或点击后,用户才需要读具体关系。
164
+
165
+ ## 右侧面板
166
+
167
+ 地图只负责表达关系,右侧面板负责承接内容。
168
+
169
+ 社区地图里的节点不再展开大卡片,也不显示正文摘要。节点旁边最多显示名字。正文、摘要、路径、相关页面、节点详情继续放在右侧面板里。
170
+
171
+ 点击节点会更新右侧面板,这是允许的现有联动。悬停节点只做地图内临时关系预览,不更新右侧面板。
172
+
173
+ ## 社区底色
174
+
175
+ 社区底色应变得更轻。
176
+
177
+ 它的作用是提示当前社区,而不是圈住节点。视觉上更像一层淡淡的纸面水洗背景,而不是一块实心区域。
178
+
179
+ 当节点进入聚焦状态时,社区底色应进一步退后,让当前节点和一度关系成为主视觉。
180
+
181
+ ## 状态优先级
182
+
183
+ 同一时间最多有一个固定焦点节点。
184
+
185
+ 视觉优先级从高到低:
186
+
187
+ 1. 当前悬停节点。
188
+ 2. 当前固定选中节点。
189
+ 3. 一度相关节点和直接连线。
190
+ 4. 二度相关节点。
191
+ 5. 默认重点节点。
192
+ 6. 普通节点。
193
+ 7. 无关节点和无关线。
194
+
195
+ 如果存在固定选中节点,悬停其他节点时可以临时盖过固定焦点;悬停结束后恢复固定焦点。
196
+
197
+ ## 空状态和边界情况
198
+
199
+ 社区没有边:
200
+
201
+ - 节点仍按轻量地图显示。
202
+ - 默认只显示重点标签。
203
+ - 悬停节点时只强调该节点本身,并提示暂无直接关系。
204
+
205
+ 节点只有一度、没有二度:
206
+
207
+ - 一度关系正常高亮。
208
+ - 不强行制造二度背景。
209
+
210
+ 节点连接过多:
211
+
212
+ - 一度节点可以全部参与高亮,但标签仍按重要性控制。
213
+ - 线条可按权重区分强弱,避免全部同等抢眼。
214
+
215
+ 关系类型或置信度缺失:
216
+
217
+ - 关系类型缺失时走默认关系色。
218
+ - 置信度缺失时走默认实线。
219
+ - 不因为缺字段破坏社区地图整体可读性。
220
+
221
+ ## 体验验收
222
+
223
+ 实现完成后,进入社区的第一眼必须更像关系地图,不像卡片墙。
224
+
225
+ 必须满足:
226
+
227
+ - 默认状态有留白,有空间感,节点不挤。
228
+ - 普通节点是轻量点位,不是大卡片。
229
+ - 只有重点节点默认显示标签。
230
+ - 社区底色很淡,不压住节点。
231
+ - 默认线条细、轻,不形成线团。
232
+ - 悬停节点时,关系立刻变清楚。
233
+ - 点击节点时,关系固定,并更新右侧面板。
234
+ - 鼠标移走后,悬停关系自动收回。
235
+ - 点击空白处后,固定关系取消。
236
+ - 一度关系清楚,二度关系很淡,无关内容退后。
237
+ - 线的颜色、虚实、粗细与图例一致。
238
+ - 标签出现和消失时,节点不移位。
239
+ - 不改变全局图谱、对话、知识库流程或其他非社区图谱功能。
240
+
241
+ ## 验证建议
242
+
243
+ 实现时至少验证以下场景:
244
+
245
+ 1. 进入一个有 10 个以上节点、关系较密的社区,确认默认状态不是卡片墙。
246
+ 2. 悬停一个核心节点,确认一度关系清晰、二度很淡、无关线隐藏或极淡。
247
+ 3. 鼠标移走,确认画面恢复默认状态。
248
+ 4. 点击节点,确认聚焦固定并更新右侧面板。
249
+ 5. 固定节点后悬停另一个节点,确认只是临时预览,移走后回到固定节点。
250
+ 6. 点击空白处,确认取消固定聚焦。
251
+ 7. 检查图例里的关系类型和置信度,与画布线条颜色和虚实一致。
252
+ 8. 检查长标签、密集节点、无边节点,确认节点不会因为标签出现而移位。
253
+ 9. 回到全局图谱,确认本次改动没有改变全局图谱行为。
254
+
255
+ ## 后续不在本次做
256
+
257
+ 以下内容不进入本次社区节点视觉优化:
258
+
259
+ - 全局图谱重新设计。
260
+ - 移动端专项布局。
261
+ - 新增关系类型或置信度体系。
262
+ - 新的右侧面板结构。
263
+ - 自动社区总结。
264
+ - 图谱数据构建流程调整。
265
+ - 新增完整键盘漫游。
266
+ - 新增 Agent 提问入口。
@@ -0,0 +1,170 @@
1
+ # Sigma 覆盖层重构 + 性能改造 设计文档
2
+
3
+ - 日期:2026-06-25
4
+ - 分支:`feat/sigma-overlay-refactor-perf`
5
+ - 关联 issue:#64 拆分 `sigma-global-renderer.ts`、#63 第 2 条(DOM 重绘重建节点)
6
+ - 范围:本 spec 覆盖 Phase 1(#64)+ Phase 2(#63.2)两阶段。#63 第 1 条(云层签名全量遍历)与 #65(无障碍)**不在本 spec 范围内**,后续单独处理。
7
+
8
+ ---
9
+
10
+ ## 1. 背景与动机
11
+
12
+ 全局视角的知识图谱用 Sigma 在 canvas 上画点和边,再在上面盖一层 DOM/SVG 覆盖物(社区云团、节点命中框、社区标签)。这层覆盖物的全部逻辑集中在
13
+ `packages/graph-engine/src/render/sigma-global-renderer.ts`,当前 **1386 行**,存在两个已确认的问题:
14
+
15
+ 1. **单文件过大(#64)**:云层几何、SVG 渲染、凸包计算、坐标变换都堆在一个文件里。仓库已把 wash 逻辑拆到
16
+ `community-wash.ts` / `community-washes.ts`,本文件应顺势拆分。
17
+ 2. **每帧重建 DOM(#63 第 2 条)**:`renderSigmaOverlays()` 绑在 Sigma 的 `afterRender` 事件上
18
+ (`sigma-global-renderer.ts:426`),**平移/缩放的每一帧**都先 `overlayRoot.replaceChildren()` 清空
19
+ (`:623`),再全量重建所有节点命中框、云层 SVG,并重新绑定 click / pointerdown / mousedown / dragstart
20
+ 监听(`:621-715`)。但相机移动时节点集合并未改变,只有屏幕坐标变了——这是典型的 DOM 抖动热路径。
21
+
22
+ > 注:PR #60 的 1000 节点回归已通过,当前规模不卡。本改造目标是降低维护成本、消除架构坏味道,为更大规模做准备。
23
+
24
+ ### 设计原则
25
+
26
+ - 两个 Phase 相互独立、可分别合并。**Phase 1 是纯搬迁(零行为变化),Phase 2 才动行为。**
27
+ - 先拆后优化:在 1000+ 行单文件里直接改性能热路径风险叠加;拆完后 Phase 2 改动面更小、更好测。
28
+ - 依赖单向:`sigma-coordinates` ← `community-cloud-geometry` ← `sigma-overlay-svg` ← 主文件(编排)。
29
+ - 不改对外接口(`SigmaGlobalRenderer`),workbench 侧零感知。
30
+ - 遵循 YAGNI:不做通用 diff 框架、不顺手重构无关代码。
31
+
32
+ ---
33
+
34
+ ## 2. Phase 1(#64):按职责拆 3 个 helper
35
+
36
+ 从 `sigma-global-renderer.ts` 抽出三组纯函数 / 无状态工厂。主文件只保留编排核心:
37
+ `createSigmaGlobalRenderer`、生命周期、拖拽会话、事件接线、Graphology 属性映射、hit projector、edge style。
38
+
39
+ | 新文件 | 搬入内容 | 性质 |
40
+ |---|---|---|
41
+ | `render/sigma-coordinates.ts` | `sigmaWorldPointToScreenPoint`、`sigmaScreenPointToWorldPoint`、`overlayPointerScreenPoint` | 坐标变换 |
42
+ | `render/community-cloud-geometry.ts` | `SigmaCommunityCloud` / `SigmaCommunityCloudBasis` 接口、`sigmaCommunityCloudBasisById` + `...WithReuse` + `...WithNodePoint`、`sigmaCommunityCloudSignature`、`sigmaProjectedCloudHullPoints`、`clampPointToWorldEllipse`、`clampPointToScreenEllipse`、`sigmaCommunityCloud`、`convexHull2d` | 几何 / 凸包,多为纯函数 |
43
+ | `render/sigma-overlay-svg.ts` | `SIGMA_OVERLAY_SVG_NS`、`nextSigmaCloudFilterSequence`、`sigmaSharedCloudFilterDef`、`sigmaCloudSvg`,及 overlay 元素工厂 `sigmaOverlayButton` / `sigmaOverlayPassiveElement` / `applyOverlayBox` / `createSigmaOverlayRoot` | DOM / SVG 构造 |
44
+
45
+ 依赖说明:`community-cloud-geometry` 中的投影函数(`sigmaProjectedCloudHullPoints`、`sigmaCommunityCloud`)
46
+ 依赖坐标变换,故 import `sigma-coordinates`,单向依赖。
47
+
48
+ 预计主文件从 1386 行降到约 1000 行。
49
+
50
+ ### Phase 1 验收
51
+
52
+ - 行为零变化。
53
+ - 现有 8 个 graph-engine 测试全绿(`npm test`),`npm run typecheck` 通过。
54
+ - 几何纯函数补独立单测(凸包、签名、clamp、坐标往返)——这些此前埋在主文件内未单独测。
55
+
56
+ > 这些函数当前均为**模块私有、未对外导出**,搬到新 helper 后由新 helper 各自 `export`(供单测直接
57
+ > import),主文件再 import 回来使用。**公开 API(`SigmaGlobalRenderer` 等)与 `src/index.ts`
58
+ > barrel 不变**,workbench 侧零感知。模块级计数器 `sigmaCloudFilterSequence` 随 SVG 函数整组搬走,
59
+ > 仍是同一个计数器,行为不变。
60
+
61
+ ---
62
+
63
+ ## 3. Phase 2(#63.2):拆"结构更新"与"位置更新"
64
+
65
+ 把唯一的 `renderSigmaOverlays()`(每帧 `replaceChildren` 全量重建)拆成两条路径。
66
+
67
+ ### `rebuildSigmaOverlays()` — 仅数据 / 选中变化时调用
68
+
69
+ - 按 id 做 diff:复用已存在元素,新增缺失的、移除多余的;维护三张
70
+ `Map<id, element>`(节点命中框、社区云层 region、社区标签各一张)。
71
+ - 监听器(click / pointerdown / mousedown / dragstart)**只在元素创建时绑一次**。
72
+ - 处理由数据决定的状态:selected / dim / searchHit / pinned、label 文本等。
73
+
74
+ > 覆盖层只渲染**这 3 类** DOM 元素。aggregation 容器画在 Sigma canvas 上(走 Graphology
75
+ > 属性),不属于本覆盖层,本改造不涉及。
76
+
77
+ ### `repositionSigmaOverlays()` — 绑 `afterRender` / resize / 拖拽移动,每帧调用
78
+
79
+ - 遍历已存在元素,只更新屏幕坐标(`applyOverlayBox`)与云层 SVG 的 `points` 属性。
80
+ - **绝不** `replaceChildren` / `createElement` / `addEventListener`。
81
+
82
+ ### 调用点改造
83
+
84
+ | 位置 | 现状 | 改为 |
85
+ |---|---|---|
86
+ | 初始渲染(`:336`) | `renderSigmaOverlays()` | `rebuildSigmaOverlays()` |
87
+ | 数据更新(`:382`) | `renderSigmaOverlays()` | `rebuildSigmaOverlays()` |
88
+ | `afterRender` 相机移动 | `renderSigmaOverlays()` | `repositionSigmaOverlays()` |
89
+ | resize raf | `renderSigmaOverlays()` | `repositionSigmaOverlays()` |
90
+ | 拖拽提交/取消(`applyNodeDragPoint` 终态) | `renderSigmaOverlays()` | `rebuildSigmaOverlays()` |
91
+
92
+ 选中变化走数据更新路径(触发 rebuild),因此 dim / selected 不进每帧热路径。
93
+
94
+ > 实现修正(TDD 发现):原以为"拖拽 → reposition"。实际上拖拽**过程中**的每帧位置更新由
95
+ > `sigma.refresh()` → `afterRender` → reposition 负责;而 `applyNodeDragPoint` 里那处直接调用是
96
+ > 拖拽**提交/取消的终态**,此时 pin 状态与永久坐标已变(数据变化),必须 rebuild 才能刷新
97
+ > `dataset.pinned` 等属性。
98
+
99
+ ### 状态归属与不变量(防止双路径打架)
100
+
101
+ 覆盖层完全自封闭:生产代码里只有本文件操作 `overlayRoot` 与几何/SVG 函数,无第二处
102
+ 监听 `afterRender`。因此冲突风险只在文件内部的 rebuild / reposition 之间,必须守住以下不变量:
103
+
104
+ - **rebuild 是元素生命周期的唯一权威**:只有它能增删元素、维护三张 `Map<id, element>`、绑监听。
105
+ - **reposition 对结构只读、且幂等**:只改已存在元素的位置/box 与云 hull 投影;遇到表里有、
106
+ 但当前 `adapterData` 已无的 id,安全跳过(不报错、不创建)。
107
+ - **reposition 每帧从 `cloudBasisByCommunityId` 重新投影云 hull**:拖拽中 basis 冻结、松手才重算,
108
+ reposition 必须每次重投影才能让云层跟手(与现有行为一致)。
109
+ - **`update()` 的执行顺序安全前提**:现状 `sigma.refresh()`(`:381`)→ 真实 Sigma 触发 `afterRender`
110
+ → reposition,**早于** 紧随其后的 rebuild(`:382`)。因 reposition 满足"只读+容忍不同步+幂等",
111
+ 这次提前的 reposition 至多对旧元素做一次无害定位,rebuild 随后纠正为准。
112
+ - **`afterRender` 与 `cameraUpdated` 都绑同一处理器**(`:425-426`),reposition 一帧可能跑 2 次;
113
+ 因幂等无害,暂不做 rAF 去重(YAGNI,后续按需)。
114
+
115
+ ### 关键风险点
116
+
117
+ 云层每帧的 hull 投影点会变,所以 reposition 必须更新 polygon 的 `points` 属性和容器 box,
118
+ 同时保留同一个 shape 元素及其 click 监听。这是整个改造里最需要小心的一处,测试需专门覆盖。
119
+
120
+ ---
121
+
122
+ ## 4. 错误处理与边界
123
+
124
+ - 两条路径都保留 `destroyed` 守卫。
125
+ - 销毁时清空三张 `Map<id, element>`,避免悬挂引用。
126
+ - diff 按 id 增删;id 不变但内容变(如 label 文本)在 rebuild 内更新属性。
127
+ - 不改对外接口 `SigmaGlobalRenderer`。
128
+
129
+ ---
130
+
131
+ ## 5. 测试方案
132
+
133
+ ### Phase 1
134
+
135
+ - 现有回归全绿 + 几何纯函数新单测(凸包、签名、clamp、坐标往返)。
136
+
137
+ ### Phase 2(验收标准:可量化性能基线)
138
+
139
+ 在 `test/sigma-global-renderer.test.ts` 复用现有 `fakeContainer()` / `fakeRuntime()` / `sigma.emit()`
140
+ 基础设施(fake 元素内部已用 Map 记录子节点与监听,无需引入 jsdom):
141
+
142
+ 1. **量化基线断言**(核心):渲染后记录元素引用与 createElement / addEventListener 调用计数 →
143
+ 多次 `sigma.emit("afterRender")` → 断言**元素实例不变、createElement 计数不增、监听计数不增、
144
+ `replaceChildren` 在 reposition 路径未被调用**。
145
+ 2. **行为保持**:点击云层 → 社区选中、点击节点 → 节点选中、拖拽仍生效(沿用现有 emit 用例)。
146
+ 3. **结构 diff**:数据更新增 / 删节点后,元素表正确增删。
147
+ 4. **需更新的现有断言**:现有 resize 测试(`test/sigma-global-renderer.test.ts:574`)当前断言
148
+ resize 后覆盖层元素被**新建**(`assert.notEqual`)。Phase 2 后元素改为**复用**,这条须改成
149
+ `assert.equal`。这是**预期内的行为变更,不是回归**——它恰好验证了"reposition 不再重建元素"。
150
+ 5. **第三层手动回归**:在 codex 跑 1000 节点平移 / 缩放,主观确认不卡 + 基线测试通过
151
+ (按 CLAUDE.md 推送前测试规则)。
152
+
153
+ ---
154
+
155
+ ## 6. 分 Phase 推进计划
156
+
157
+ - **Phase 0(本次 spark)**:写本 spec,分支 `feat/sigma-overlay-refactor-perf`。
158
+ - **Phase 1**:拆 3 个 helper → 跑回归 → 分步 commit → 可单独开 PR 合入(纯重构、低风险)。
159
+ - **Phase 2**:基于 Phase 1 改双路径 + 量化基线测试 → codex 回归 → commit → PR。
160
+ - **文档**:每个含功能改动的 Phase,按 CLAUDE.md 更新 CHANGELOG / README / 版本号。
161
+
162
+ ---
163
+
164
+ ## 7. 验收清单(汇总)
165
+
166
+ - [ ] Phase 1:主文件显著瘦身、行为零变化、现有测试与 typecheck 全绿、几何函数有独立单测。
167
+ - [ ] Phase 2:`afterRender` 路径不再销毁 / 重建 DOM、不重绑监听(量化测试断言通过)。
168
+ - [ ] Phase 2:点选社区 / 点选节点 / 拖拽行为与改造前一致。
169
+ - [ ] Phase 2:1000 节点 codex 手动回归平移缩放不卡。
170
+ - [ ] 对外接口 `SigmaGlobalRenderer` 无变化,workbench 无需改动。