spexcode 0.6.2 → 0.6.6

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 (495) hide show
  1. package/README.md +3 -1
  2. package/bin/spex.mjs +4 -0
  3. package/node_modules/@spexcode/session-core/dist/delivery-queue.d.ts +23 -0
  4. package/node_modules/@spexcode/session-core/dist/delivery-queue.js +195 -0
  5. package/node_modules/@spexcode/session-core/dist/index.d.ts +5 -0
  6. package/node_modules/@spexcode/session-core/dist/index.js +5 -0
  7. package/node_modules/@spexcode/session-core/dist/internal.d.ts +3 -0
  8. package/node_modules/@spexcode/session-core/dist/internal.js +3 -0
  9. package/node_modules/@spexcode/session-core/dist/message.d.ts +22 -0
  10. package/node_modules/@spexcode/session-core/dist/message.js +52 -0
  11. package/node_modules/@spexcode/session-core/dist/record-lock.d.ts +7 -0
  12. package/node_modules/@spexcode/session-core/dist/record-lock.js +152 -0
  13. package/node_modules/@spexcode/session-core/dist/runtime-session.d.ts +50 -0
  14. package/node_modules/@spexcode/session-core/dist/runtime-session.js +286 -0
  15. package/node_modules/@spexcode/session-core/dist/session-cursors.d.ts +14 -0
  16. package/node_modules/@spexcode/session-core/dist/session-cursors.js +82 -0
  17. package/node_modules/@spexcode/session-core/dist/session-timeline.d.ts +46 -0
  18. package/node_modules/@spexcode/session-core/dist/session-timeline.js +216 -0
  19. package/node_modules/@spexcode/session-core/package.json +33 -0
  20. package/node_modules/@spexcode/spec-cli/bin/spex.mjs +77 -0
  21. package/node_modules/@spexcode/spec-cli/dist/attach.d.ts +2 -0
  22. package/node_modules/@spexcode/spec-cli/dist/attach.js +48 -0
  23. package/node_modules/@spexcode/spec-cli/dist/claude-headless.d.ts +36 -0
  24. package/node_modules/@spexcode/spec-cli/dist/claude-headless.js +316 -0
  25. package/node_modules/@spexcode/spec-cli/dist/cli.d.ts +1 -0
  26. package/node_modules/@spexcode/spec-cli/dist/cli.js +1908 -0
  27. package/node_modules/@spexcode/spec-cli/dist/client.d.ts +112 -0
  28. package/node_modules/@spexcode/spec-cli/dist/client.js +481 -0
  29. package/node_modules/@spexcode/spec-cli/dist/cockpit.d.ts +7 -0
  30. package/node_modules/@spexcode/spec-cli/dist/cockpit.js +26 -0
  31. package/node_modules/@spexcode/spec-cli/dist/codex-headless.d.ts +1 -0
  32. package/{spec-cli/src/codex-headless.ts → node_modules/@spexcode/spec-cli/dist/codex-headless.js} +3 -9
  33. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.d.ts +58 -0
  34. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.js +798 -0
  35. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.d.ts +1 -0
  36. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.js +90 -0
  37. package/node_modules/@spexcode/spec-cli/dist/contract-filter.d.ts +14 -0
  38. package/node_modules/@spexcode/spec-cli/dist/contract-filter.js +219 -0
  39. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.d.ts +6 -0
  40. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.js +50 -0
  41. package/node_modules/@spexcode/spec-cli/dist/doctor.d.ts +9 -0
  42. package/node_modules/@spexcode/spec-cli/dist/doctor.js +553 -0
  43. package/node_modules/@spexcode/spec-cli/dist/eval-host.d.ts +1 -0
  44. package/node_modules/@spexcode/spec-cli/dist/eval-host.js +19 -0
  45. package/node_modules/@spexcode/spec-cli/dist/execution-trace.d.ts +26 -0
  46. package/node_modules/@spexcode/spec-cli/dist/execution-trace.js +475 -0
  47. package/node_modules/@spexcode/spec-cli/dist/file-write.d.ts +2 -0
  48. package/node_modules/@spexcode/spec-cli/dist/file-write.js +26 -0
  49. package/node_modules/@spexcode/spec-cli/dist/flat.d.ts +89 -0
  50. package/node_modules/@spexcode/spec-cli/dist/flat.js +1076 -0
  51. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.d.ts +56 -0
  52. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.js +168 -0
  53. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.d.ts +28 -0
  54. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.js +363 -0
  55. package/node_modules/@spexcode/spec-cli/dist/gateway.d.ts +38 -0
  56. package/node_modules/@spexcode/spec-cli/dist/gateway.js +527 -0
  57. package/node_modules/@spexcode/spec-cli/dist/graphCache.d.ts +27 -0
  58. package/node_modules/@spexcode/spec-cli/dist/graphCache.js +717 -0
  59. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.d.ts +14 -0
  60. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.js +36 -0
  61. package/node_modules/@spexcode/spec-cli/dist/graphStream.d.ts +85 -0
  62. package/node_modules/@spexcode/spec-cli/dist/graphStream.js +1195 -0
  63. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.d.ts +64 -0
  64. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.js +166 -0
  65. package/node_modules/@spexcode/spec-cli/dist/guide.d.ts +8 -0
  66. package/{spec-cli/src/guide.ts → node_modules/@spexcode/spec-cli/dist/guide.js} +36 -32
  67. package/node_modules/@spexcode/spec-cli/dist/harness-select.d.ts +18 -0
  68. package/node_modules/@spexcode/spec-cli/dist/harness-select.js +62 -0
  69. package/node_modules/@spexcode/spec-cli/dist/harness.d.ts +338 -0
  70. package/node_modules/@spexcode/spec-cli/dist/harness.js +3146 -0
  71. package/node_modules/@spexcode/spec-cli/dist/headless-controller.d.ts +9 -0
  72. package/node_modules/@spexcode/spec-cli/dist/headless-controller.js +47 -0
  73. package/node_modules/@spexcode/spec-cli/dist/help.d.ts +15 -0
  74. package/node_modules/@spexcode/spec-cli/dist/help.js +594 -0
  75. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.d.ts +18 -0
  76. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.js +122 -0
  77. package/node_modules/@spexcode/spec-cli/dist/hooks.d.ts +1 -0
  78. package/{spec-cli/src/hooks.ts → node_modules/@spexcode/spec-cli/dist/hooks.js} +15 -15
  79. package/node_modules/@spexcode/spec-cli/dist/host-resources.d.ts +97 -0
  80. package/node_modules/@spexcode/spec-cli/dist/host-resources.js +795 -0
  81. package/node_modules/@spexcode/spec-cli/dist/host.d.ts +88 -0
  82. package/node_modules/@spexcode/spec-cli/dist/host.js +663 -0
  83. package/node_modules/@spexcode/spec-cli/dist/index.d.ts +1 -0
  84. package/node_modules/@spexcode/spec-cli/dist/index.js +899 -0
  85. package/node_modules/@spexcode/spec-cli/dist/init.d.ts +1 -0
  86. package/node_modules/@spexcode/spec-cli/dist/init.js +284 -0
  87. package/node_modules/@spexcode/spec-cli/dist/issues-cli.d.ts +6 -0
  88. package/node_modules/@spexcode/spec-cli/dist/issues-cli.js +334 -0
  89. package/node_modules/@spexcode/spec-cli/dist/issues.d.ts +69 -0
  90. package/node_modules/@spexcode/spec-cli/dist/issues.js +189 -0
  91. package/node_modules/@spexcode/spec-cli/dist/lint.d.ts +34 -0
  92. package/node_modules/@spexcode/spec-cli/dist/lint.js +476 -0
  93. package/node_modules/@spexcode/spec-cli/dist/listen.d.ts +8 -0
  94. package/node_modules/@spexcode/spec-cli/dist/listen.js +24 -0
  95. package/node_modules/@spexcode/spec-cli/dist/localIssues.d.ts +65 -0
  96. package/node_modules/@spexcode/spec-cli/dist/localIssues.js +582 -0
  97. package/node_modules/@spexcode/spec-cli/dist/login-page.d.ts +5 -0
  98. package/{spec-cli/src/login-page.ts → node_modules/@spexcode/spec-cli/dist/login-page.js} +7 -7
  99. package/node_modules/@spexcode/spec-cli/dist/loop-in.d.ts +23 -0
  100. package/{spec-cli/src/loop-in.ts → node_modules/@spexcode/spec-cli/dist/loop-in.js} +35 -45
  101. package/node_modules/@spexcode/spec-cli/dist/machine-peer.d.ts +69 -0
  102. package/node_modules/@spexcode/spec-cli/dist/machine-peer.js +603 -0
  103. package/node_modules/@spexcode/spec-cli/dist/materialize.d.ts +18 -0
  104. package/node_modules/@spexcode/spec-cli/dist/materialize.js +468 -0
  105. package/node_modules/@spexcode/spec-cli/dist/mentions.d.ts +50 -0
  106. package/node_modules/@spexcode/spec-cli/dist/mentions.js +117 -0
  107. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.d.ts +5 -0
  108. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.js +215 -0
  109. package/node_modules/@spexcode/spec-cli/dist/opencode.d.ts +3 -0
  110. package/{spec-cli/src/opencode.ts → node_modules/@spexcode/spec-cli/dist/opencode.js} +9 -13
  111. package/node_modules/@spexcode/spec-cli/dist/pi-harness.d.ts +3 -0
  112. package/{spec-cli/src/pi-harness.ts → node_modules/@spexcode/spec-cli/dist/pi-harness.js} +45 -40
  113. package/node_modules/@spexcode/spec-cli/dist/pi-headless.d.ts +25 -0
  114. package/node_modules/@spexcode/spec-cli/dist/pi-headless.js +196 -0
  115. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.d.ts +21 -0
  116. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.js +146 -0
  117. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.d.ts +10 -0
  118. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.js +404 -0
  119. package/node_modules/@spexcode/spec-cli/dist/pty-helper.d.mts +1 -0
  120. package/node_modules/@spexcode/spec-cli/dist/pty-helper.mjs +101 -0
  121. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.d.mts +2 -0
  122. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.mjs +23 -0
  123. package/node_modules/@spexcode/spec-cli/dist/public-graph.d.ts +46 -0
  124. package/node_modules/@spexcode/spec-cli/dist/public-graph.js +56 -0
  125. package/node_modules/@spexcode/spec-cli/dist/ranker.d.ts +15 -0
  126. package/node_modules/@spexcode/spec-cli/dist/ranker.js +188 -0
  127. package/node_modules/@spexcode/spec-cli/dist/reaper.d.ts +6 -0
  128. package/node_modules/@spexcode/spec-cli/dist/reaper.js +81 -0
  129. package/node_modules/@spexcode/spec-cli/dist/reviews.d.ts +189 -0
  130. package/node_modules/@spexcode/spec-cli/dist/reviews.js +350 -0
  131. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.d.ts +6 -0
  132. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.js +37 -0
  133. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.d.ts +21 -0
  134. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.js +84 -0
  135. package/node_modules/@spexcode/spec-cli/dist/runtime-rotate.d.ts +1 -0
  136. package/node_modules/@spexcode/spec-cli/dist/runtime-rotate.js +58 -0
  137. package/node_modules/@spexcode/spec-cli/dist/search.bench.d.mts +1 -0
  138. package/node_modules/@spexcode/spec-cli/dist/search.bench.mjs +75 -0
  139. package/node_modules/@spexcode/spec-cli/dist/search.d.ts +20 -0
  140. package/node_modules/@spexcode/spec-cli/dist/search.js +61 -0
  141. package/node_modules/@spexcode/spec-cli/dist/session-declarations.d.ts +13 -0
  142. package/node_modules/@spexcode/spec-cli/dist/session-declarations.js +126 -0
  143. package/node_modules/@spexcode/spec-cli/dist/session-execution.d.ts +10 -0
  144. package/node_modules/@spexcode/spec-cli/dist/session-execution.js +70 -0
  145. package/node_modules/@spexcode/spec-cli/dist/session-files.d.ts +28 -0
  146. package/node_modules/@spexcode/spec-cli/dist/session-files.js +130 -0
  147. package/node_modules/@spexcode/spec-cli/dist/session-follow.d.ts +31 -0
  148. package/node_modules/@spexcode/spec-cli/dist/session-follow.js +179 -0
  149. package/node_modules/@spexcode/spec-cli/dist/session-reparent.d.ts +10 -0
  150. package/node_modules/@spexcode/spec-cli/dist/session-reparent.js +33 -0
  151. package/node_modules/@spexcode/spec-cli/dist/session-timeline.d.ts +11 -0
  152. package/node_modules/@spexcode/spec-cli/dist/session-timeline.js +20 -0
  153. package/node_modules/@spexcode/spec-cli/dist/session-web.d.ts +24 -0
  154. package/node_modules/@spexcode/spec-cli/dist/session-web.js +141 -0
  155. package/node_modules/@spexcode/spec-cli/dist/sessions.d.ts +433 -0
  156. package/node_modules/@spexcode/spec-cli/dist/sessions.js +4667 -0
  157. package/node_modules/@spexcode/spec-cli/dist/sh.d.ts +1 -0
  158. package/node_modules/@spexcode/spec-cli/dist/sh.js +3 -0
  159. package/node_modules/@spexcode/spec-cli/dist/shim-runtime.d.ts +1 -0
  160. package/{spec-cli/src/shim-runtime.ts → node_modules/@spexcode/spec-cli/dist/shim-runtime.js} +3 -4
  161. package/node_modules/@spexcode/spec-cli/dist/slash-commands.d.ts +9 -0
  162. package/node_modules/@spexcode/spec-cli/dist/slash-commands.js +307 -0
  163. package/node_modules/@spexcode/spec-cli/dist/source-files.d.ts +9 -0
  164. package/node_modules/@spexcode/spec-cli/dist/source-files.js +113 -0
  165. package/node_modules/@spexcode/spec-cli/dist/supervise.d.ts +1 -0
  166. package/node_modules/@spexcode/spec-cli/dist/supervise.js +308 -0
  167. package/node_modules/@spexcode/spec-cli/dist/tree.d.ts +25 -0
  168. package/node_modules/@spexcode/spec-cli/dist/tree.js +98 -0
  169. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.d.ts +3 -0
  170. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.js +41 -0
  171. package/node_modules/@spexcode/spec-cli/dist/uninstall.d.ts +3 -0
  172. package/node_modules/@spexcode/spec-cli/dist/uninstall.js +177 -0
  173. package/node_modules/@spexcode/spec-cli/dist/uploads.d.ts +36 -0
  174. package/node_modules/@spexcode/spec-cli/dist/uploads.js +243 -0
  175. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.d.ts +1 -0
  176. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.js +47 -0
  177. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/dispatch.sh +5 -5
  178. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/harness.sh +1 -1
  179. package/node_modules/@spexcode/spec-cli/package.json +49 -0
  180. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +8 -0
  181. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec-first.sh +1 -1
  182. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec-of-file.sh +1 -0
  183. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/spec.md +2 -2
  184. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +31 -29
  185. package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +94 -0
  186. package/node_modules/@spexcode/spec-core/dist/anchors.js +730 -0
  187. package/node_modules/@spexcode/spec-core/dist/git.d.ts +170 -0
  188. package/node_modules/@spexcode/spec-core/dist/git.js +2768 -0
  189. package/node_modules/@spexcode/spec-core/dist/graph-delta.d.ts +44 -0
  190. package/node_modules/@spexcode/spec-core/dist/graph-delta.js +72 -0
  191. package/node_modules/@spexcode/spec-core/dist/graph.d.ts +34 -0
  192. package/node_modules/@spexcode/spec-core/dist/graph.js +237 -0
  193. package/node_modules/@spexcode/spec-core/dist/graphDelta.d.ts +3 -0
  194. package/node_modules/@spexcode/spec-core/dist/graphDelta.js +13 -0
  195. package/node_modules/@spexcode/spec-core/dist/harness-identity.d.ts +31 -0
  196. package/node_modules/@spexcode/spec-core/dist/harness-identity.js +20 -0
  197. package/node_modules/@spexcode/spec-core/dist/identity-presets.d.ts +152 -0
  198. package/node_modules/@spexcode/spec-core/dist/identity-presets.js +132 -0
  199. package/node_modules/@spexcode/spec-core/dist/index.d.ts +45 -0
  200. package/node_modules/@spexcode/spec-core/dist/index.js +19 -0
  201. package/node_modules/@spexcode/spec-core/dist/layout.d.ts +187 -0
  202. package/node_modules/@spexcode/spec-core/dist/layout.js +548 -0
  203. package/node_modules/@spexcode/spec-core/dist/process-identity.d.ts +37 -0
  204. package/node_modules/@spexcode/spec-core/dist/process-identity.js +214 -0
  205. package/node_modules/@spexcode/spec-core/dist/project-identity.d.ts +12 -0
  206. package/node_modules/@spexcode/spec-core/dist/project-identity.js +71 -0
  207. package/node_modules/@spexcode/spec-core/dist/project-store.d.ts +3 -0
  208. package/node_modules/@spexcode/spec-core/dist/project-store.js +14 -0
  209. package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +2 -0
  210. package/node_modules/@spexcode/spec-core/dist/resilience.js +40 -0
  211. package/node_modules/@spexcode/spec-core/dist/review/index.d.ts +3 -0
  212. package/node_modules/@spexcode/spec-core/dist/review/index.js +5 -0
  213. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +77 -0
  214. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +308 -0
  215. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +66 -0
  216. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +180 -0
  217. package/node_modules/@spexcode/spec-core/dist/review/session.d.ts +4 -0
  218. package/node_modules/@spexcode/spec-core/dist/review/session.js +8 -0
  219. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.d.ts +15 -0
  220. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.js +12 -0
  221. package/node_modules/@spexcode/spec-core/dist/root-lru.d.ts +4 -0
  222. package/{spec-cli/src/root-lru.ts → node_modules/@spexcode/spec-core/dist/root-lru.js} +26 -30
  223. package/node_modules/@spexcode/spec-core/dist/specs.d.ts +117 -0
  224. package/node_modules/@spexcode/spec-core/dist/specs.js +489 -0
  225. package/node_modules/@spexcode/spec-core/package.json +28 -0
  226. package/node_modules/@spexcode/spec-eval/dist/cache.d.ts +10 -0
  227. package/node_modules/@spexcode/spec-eval/dist/cache.js +50 -0
  228. package/node_modules/@spexcode/spec-eval/dist/cli.d.ts +22 -0
  229. package/node_modules/@spexcode/spec-eval/dist/cli.js +981 -0
  230. package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +98 -0
  231. package/node_modules/@spexcode/spec-eval/dist/evaltab.js +176 -0
  232. package/node_modules/@spexcode/spec-eval/dist/filing.d.ts +16 -0
  233. package/node_modules/@spexcode/spec-eval/dist/filing.js +36 -0
  234. package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +48 -0
  235. package/node_modules/@spexcode/spec-eval/dist/freshness.js +799 -0
  236. package/node_modules/@spexcode/spec-eval/dist/host.d.ts +46 -0
  237. package/node_modules/@spexcode/spec-eval/dist/host.js +53 -0
  238. package/node_modules/@spexcode/spec-eval/dist/humanok.d.ts +11 -0
  239. package/node_modules/@spexcode/spec-eval/dist/humanok.js +27 -0
  240. package/node_modules/@spexcode/spec-eval/dist/index.d.ts +4 -0
  241. package/node_modules/@spexcode/spec-eval/dist/index.js +4 -0
  242. package/node_modules/@spexcode/spec-eval/dist/remarks.d.ts +31 -0
  243. package/node_modules/@spexcode/spec-eval/dist/remarks.js +1 -0
  244. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.d.ts +13 -0
  245. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.js +303 -0
  246. package/node_modules/@spexcode/spec-eval/dist/scenarios.d.ts +99 -0
  247. package/node_modules/@spexcode/spec-eval/dist/scenarios.js +650 -0
  248. package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +307 -0
  249. package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +1883 -0
  250. package/node_modules/@spexcode/spec-eval/dist/sidecar.d.ts +55 -0
  251. package/node_modules/@spexcode/spec-eval/dist/sidecar.js +82 -0
  252. package/node_modules/@spexcode/spec-eval/dist/timeline.d.ts +25 -0
  253. package/node_modules/@spexcode/spec-eval/dist/timeline.js +65 -0
  254. package/node_modules/@spexcode/spec-eval/dist/ui-path.d.ts +1 -0
  255. package/node_modules/@spexcode/spec-eval/dist/ui-path.js +2 -0
  256. package/node_modules/@spexcode/spec-eval/package.json +36 -0
  257. package/node_modules/@spexcode/spec-forge/dist/cache.d.ts +29 -0
  258. package/node_modules/@spexcode/spec-forge/dist/cache.js +59 -0
  259. package/node_modules/@spexcode/spec-forge/dist/cli.d.ts +1 -0
  260. package/node_modules/@spexcode/spec-forge/dist/cli.js +100 -0
  261. package/node_modules/@spexcode/spec-forge/dist/drivers/github.d.ts +2 -0
  262. package/node_modules/@spexcode/spec-forge/dist/drivers/github.js +116 -0
  263. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.d.ts +7 -0
  264. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.js +144 -0
  265. package/node_modules/@spexcode/spec-forge/dist/drivers.d.ts +10 -0
  266. package/node_modules/@spexcode/spec-forge/dist/drivers.js +83 -0
  267. package/node_modules/@spexcode/spec-forge/dist/index.d.ts +4 -0
  268. package/node_modules/@spexcode/spec-forge/dist/index.js +4 -0
  269. package/node_modules/@spexcode/spec-forge/dist/links.d.ts +15 -0
  270. package/node_modules/@spexcode/spec-forge/dist/links.js +65 -0
  271. package/node_modules/@spexcode/spec-forge/dist/needs-eval.d.ts +10 -0
  272. package/node_modules/@spexcode/spec-forge/dist/needs-eval.js +20 -0
  273. package/node_modules/@spexcode/spec-forge/dist/port.d.ts +53 -0
  274. package/node_modules/@spexcode/spec-forge/dist/port.js +1 -0
  275. package/node_modules/@spexcode/spec-forge/dist/resident.d.ts +7 -0
  276. package/node_modules/@spexcode/spec-forge/dist/resident.js +43 -0
  277. package/node_modules/@spexcode/spec-forge/package.json +32 -0
  278. package/package.json +33 -19
  279. package/spec-cli/bin/spex.mjs +0 -69
  280. package/spec-cli/src/anchors.ts +0 -728
  281. package/spec-cli/src/attach.ts +0 -43
  282. package/spec-cli/src/claude-headless.ts +0 -321
  283. package/spec-cli/src/cli.ts +0 -1258
  284. package/spec-cli/src/client.ts +0 -414
  285. package/spec-cli/src/cockpit.ts +0 -43
  286. package/spec-cli/src/codex-runtime-generations.ts +0 -646
  287. package/spec-cli/src/commit-surgery.ts +0 -68
  288. package/spec-cli/src/contract-filter.ts +0 -202
  289. package/spec-cli/src/delivery-queue.ts +0 -165
  290. package/spec-cli/src/doctor.ts +0 -516
  291. package/spec-cli/src/execution-trace.ts +0 -444
  292. package/spec-cli/src/file-write.ts +0 -22
  293. package/spec-cli/src/gateway-auth.ts +0 -181
  294. package/spec-cli/src/gateway-hub.ts +0 -358
  295. package/spec-cli/src/gateway.ts +0 -461
  296. package/spec-cli/src/git.ts +0 -2556
  297. package/spec-cli/src/graph.ts +0 -271
  298. package/spec-cli/src/graphCache.ts +0 -710
  299. package/spec-cli/src/graphDelta.ts +0 -77
  300. package/spec-cli/src/graphStream.ts +0 -1019
  301. package/spec-cli/src/harness-select.ts +0 -77
  302. package/spec-cli/src/harness.ts +0 -3025
  303. package/spec-cli/src/headless-controller.ts +0 -63
  304. package/spec-cli/src/help.ts +0 -492
  305. package/spec-cli/src/host-resources.ts +0 -762
  306. package/spec-cli/src/host.ts +0 -611
  307. package/spec-cli/src/identity-presets.d.ts +0 -13
  308. package/spec-cli/src/identity-presets.js +0 -138
  309. package/spec-cli/src/index.ts +0 -818
  310. package/spec-cli/src/init.ts +0 -258
  311. package/spec-cli/src/issues-cli.ts +0 -276
  312. package/spec-cli/src/issues.ts +0 -237
  313. package/spec-cli/src/layout.ts +0 -640
  314. package/spec-cli/src/lint.ts +0 -488
  315. package/spec-cli/src/listen.ts +0 -28
  316. package/spec-cli/src/localIssues.ts +0 -538
  317. package/spec-cli/src/materialize.ts +0 -417
  318. package/spec-cli/src/mentions.ts +0 -81
  319. package/spec-cli/src/opencode-headless.ts +0 -205
  320. package/spec-cli/src/pi-headless.ts +0 -153
  321. package/spec-cli/src/plugin-harness.ts +0 -157
  322. package/spec-cli/src/process-identity.ts +0 -207
  323. package/spec-cli/src/project-identity.ts +0 -73
  324. package/spec-cli/src/project-store.ts +0 -17
  325. package/spec-cli/src/pty-bridge.ts +0 -396
  326. package/spec-cli/src/pty-helper.mjs +0 -96
  327. package/spec-cli/src/pty-native-helper.mjs +0 -22
  328. package/spec-cli/src/ranker.ts +0 -191
  329. package/spec-cli/src/reaper.ts +0 -125
  330. package/spec-cli/src/resilience.ts +0 -41
  331. package/spec-cli/src/reviewSnapshot.ts +0 -28
  332. package/spec-cli/src/reviews.ts +0 -434
  333. package/spec-cli/src/runtime-guard.ts +0 -35
  334. package/spec-cli/src/runtime-ownership.ts +0 -88
  335. package/spec-cli/src/search.bench.mjs +0 -80
  336. package/spec-cli/src/search.ts +0 -63
  337. package/spec-cli/src/session-cursors.ts +0 -91
  338. package/spec-cli/src/session-execution.ts +0 -68
  339. package/spec-cli/src/session-files.ts +0 -121
  340. package/spec-cli/src/session-follow.ts +0 -182
  341. package/spec-cli/src/session-reparent.ts +0 -33
  342. package/spec-cli/src/session-timeline.ts +0 -247
  343. package/spec-cli/src/session-web.ts +0 -135
  344. package/spec-cli/src/sessions.ts +0 -3883
  345. package/spec-cli/src/sh.ts +0 -3
  346. package/spec-cli/src/slash-commands.ts +0 -318
  347. package/spec-cli/src/source-files.ts +0 -104
  348. package/spec-cli/src/specs.ts +0 -498
  349. package/spec-cli/src/supervise.ts +0 -245
  350. package/spec-cli/src/tree.ts +0 -118
  351. package/spec-cli/src/tsx-bin.ts +0 -18
  352. package/spec-cli/src/uninstall.ts +0 -171
  353. package/spec-cli/src/uploads.ts +0 -253
  354. package/spec-cli/src/worktree-sources.ts +0 -42
  355. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +0 -8
  356. package/spec-dashboard/dist/assets/App-B6IbFbGu.js +0 -2
  357. package/spec-dashboard/dist/assets/Dashboard-C5ap-Sga.css +0 -1
  358. package/spec-dashboard/dist/assets/Dashboard-_sDk7Rcg.js +0 -27
  359. package/spec-dashboard/dist/assets/EvalsPage-BT357Lyt.js +0 -2
  360. package/spec-dashboard/dist/assets/IssuesPage-BG9rNOgV.js +0 -1
  361. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  362. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  363. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  364. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  365. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  366. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  367. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  368. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  369. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  370. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  371. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  372. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  373. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  374. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  375. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  376. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  377. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  378. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  379. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  380. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  381. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  382. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  383. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  384. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  385. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  386. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  387. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  388. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  389. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  390. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  391. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  392. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  393. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  394. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  395. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  396. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  397. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  398. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  399. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  400. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  401. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  402. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  403. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  404. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  405. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  406. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  407. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  408. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  409. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  410. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  411. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  412. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  413. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  414. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  415. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  416. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  417. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  418. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  419. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  420. package/spec-dashboard/dist/assets/MobileApp-D9yPMR3A.js +0 -2
  421. package/spec-dashboard/dist/assets/Modal-B3EcgeA3.js +0 -1
  422. package/spec-dashboard/dist/assets/PageScroll-CNZOugWV.js +0 -1
  423. package/spec-dashboard/dist/assets/ProjectsPage-C2CRHmvs.js +0 -1
  424. package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +0 -32
  425. package/spec-dashboard/dist/assets/SessionInterface-DOEjuT3l.js +0 -40
  426. package/spec-dashboard/dist/assets/SessionWindow-1nYgZ4CL.js +0 -1
  427. package/spec-dashboard/dist/assets/Settings-7WeTJn0V.js +0 -1
  428. package/spec-dashboard/dist/assets/Thread-CEbzAFQn.js +0 -13
  429. package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +0 -1
  430. package/spec-dashboard/dist/assets/data-SlvxNA2r.js +0 -1
  431. package/spec-dashboard/dist/assets/index-DLVeOHL-.js +0 -41
  432. package/spec-dashboard/dist/assets/index-DYLGfPjx.css +0 -1
  433. package/spec-dashboard/dist/assets/launch-Cp579UoJ.css +0 -1
  434. package/spec-dashboard/dist/assets/launch-yxCYr64x.js +0 -276
  435. package/spec-dashboard/dist/assets/sessionSurface--7l69h4F.js +0 -1
  436. package/spec-dashboard/dist/index.html +0 -29
  437. package/spec-dashboard/src/reviewFilters.js +0 -322
  438. package/spec-dashboard/src/reviewQuery.js +0 -174
  439. package/spec-dashboard/src/session.js +0 -199
  440. package/spec-eval/src/cache.ts +0 -57
  441. package/spec-eval/src/cli.ts +0 -894
  442. package/spec-eval/src/evaltab.ts +0 -264
  443. package/spec-eval/src/filing.ts +0 -39
  444. package/spec-eval/src/freshness.ts +0 -836
  445. package/spec-eval/src/humanok.ts +0 -28
  446. package/spec-eval/src/scenariofresh.ts +0 -244
  447. package/spec-eval/src/scenarios.ts +0 -672
  448. package/spec-eval/src/sessioneval.ts +0 -2220
  449. package/spec-eval/src/sidecar.ts +0 -93
  450. package/spec-eval/src/timeline.ts +0 -54
  451. package/spec-forge/src/__fixtures__/github-forge.json +0 -63
  452. package/spec-forge/src/cache.ts +0 -66
  453. package/spec-forge/src/cli.ts +0 -99
  454. package/spec-forge/src/drivers/github.ts +0 -132
  455. package/spec-forge/src/drivers/gitlab.ts +0 -153
  456. package/spec-forge/src/drivers.ts +0 -73
  457. package/spec-forge/src/links.ts +0 -72
  458. package/spec-forge/src/needs-eval.ts +0 -29
  459. package/spec-forge/src/port.ts +0 -36
  460. package/spec-forge/src/resident.ts +0 -46
  461. /package/{spec-cli → node_modules/@spexcode/spec-cli}/README.md +0 -0
  462. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -0
  463. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-sed-v0.fixture +0 -0
  464. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/commit-msg +0 -0
  465. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-checkout +0 -0
  466. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-merge +0 -0
  467. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/pre-commit +0 -0
  468. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/prepare-commit-msg +0 -0
  469. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/reference-transaction +0 -0
  470. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/extract/spec.md +0 -0
  471. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/regroup/spec.md +0 -0
  472. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/rename/spec.md +0 -0
  473. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/spec.md +0 -0
  474. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/tidy/spec.md +0 -0
  475. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/comment-altitude/spec.md +0 -0
  476. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/idle.sh +0 -0
  477. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/spec.md +0 -0
  478. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/mark-active.sh +0 -0
  479. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/spec.md +0 -0
  480. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/fail.sh +0 -0
  481. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/spec.md +0 -0
  482. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec.md +0 -0
  483. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec.md +0 -0
  484. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec.md +0 -0
  485. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +0 -0
  486. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/forge-link/spec.md +0 -0
  487. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +0 -0
  488. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +0 -0
  489. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/spec.md +0 -0
  490. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/digest.mjs +0 -0
  491. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/spec.md +0 -0
  492. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/spec.md +0 -0
  493. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/spec.md +0 -0
  494. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/spec.md +0 -0
  495. /package/{spec-cli → node_modules/@spexcode/spec-core}/templates/spexcode.json +0 -0
@@ -0,0 +1,44 @@
1
+ export type Units = Map<string, {
2
+ j: string;
3
+ v: unknown;
4
+ }>;
5
+ export type Delta = {
6
+ from: string;
7
+ to: string;
8
+ set: Record<string, unknown>;
9
+ del: string[];
10
+ };
11
+ type Boardish = {
12
+ nodes?: unknown;
13
+ sessions?: unknown;
14
+ [k: string]: unknown;
15
+ };
16
+ export declare function unitize(board: Boardish): {
17
+ units: Units;
18
+ ok: boolean;
19
+ };
20
+ export type UnitKeyKind = {
21
+ kind: 'node';
22
+ id: string;
23
+ } | {
24
+ kind: 'nodes-order';
25
+ } | {
26
+ kind: 'session';
27
+ id: string;
28
+ } | {
29
+ kind: 'sessions-order';
30
+ } | {
31
+ kind: 'meta';
32
+ } | {
33
+ kind: 'unknown';
34
+ key: string;
35
+ };
36
+ export declare function unitKeyKind(key: string): UnitKeyKind;
37
+ export declare function applyDelta(values: Map<string, unknown>, d: Pick<Delta, 'set' | 'del'>): Map<string, unknown>;
38
+ export declare function boardFromUnits(values: Map<string, unknown>): Boardish;
39
+ export declare function diffUnits(prev: Units, next: Units): {
40
+ set: Record<string, unknown>;
41
+ del: string[];
42
+ };
43
+ export declare const unitValues: (units: Units) => Map<string, unknown>;
44
+ export {};
@@ -0,0 +1,72 @@
1
+ // decompose a board into units. `ok` = the bijection precondition held (arrays are arrays, ids unique &
2
+ // non-empty); when false the map is still returned (usable for tagging) but must not seed a delta chain.
3
+ export function unitize(board) {
4
+ const units = new Map();
5
+ let ok = true;
6
+ const keyed = (arr, prefix, orderKey) => {
7
+ const list = Array.isArray(arr) ? arr : (ok = false, []);
8
+ const order = [];
9
+ for (const item of list) {
10
+ const id = item?.id;
11
+ if (typeof id !== 'string' || !id || units.has(`${prefix}${id}`)) {
12
+ ok = false;
13
+ continue;
14
+ }
15
+ units.set(`${prefix}${id}`, { j: JSON.stringify(item), v: item });
16
+ order.push(id);
17
+ }
18
+ units.set(orderKey, { j: JSON.stringify(order), v: order });
19
+ };
20
+ const { nodes, sessions, ...meta } = board;
21
+ keyed(nodes, 'node:', 'nodes#order');
22
+ keyed(sessions, 'sess:', 'sess#order');
23
+ units.set('meta', { j: JSON.stringify(meta), v: meta });
24
+ return { units, ok };
25
+ }
26
+ export function unitKeyKind(key) {
27
+ if (key === 'nodes#order')
28
+ return { kind: 'nodes-order' };
29
+ if (key === 'sess#order')
30
+ return { kind: 'sessions-order' };
31
+ if (key === 'meta')
32
+ return { kind: 'meta' };
33
+ if (key.startsWith('node:') && key.length > 'node:'.length)
34
+ return { kind: 'node', id: key.slice(5) };
35
+ if (key.startsWith('sess:') && key.length > 'sess:'.length)
36
+ return { kind: 'session', id: key.slice(5) };
37
+ return { kind: 'unknown', key };
38
+ }
39
+ // apply a patch to a unit-value map — the exact algorithm the dashboard mirrors in data.js, kept here so
40
+ // the round-trip property is provable against the real shape, not a paraphrase of it.
41
+ export function applyDelta(values, d) {
42
+ const out = new Map(values);
43
+ for (const key of d.del)
44
+ out.delete(key);
45
+ for (const [key, v] of Object.entries(d.set))
46
+ out.set(key, v);
47
+ return out;
48
+ }
49
+ // reconstruct the board from unit values — R(U(B)) = B on the P-satisfying subspace (the client's render
50
+ // input after every applied patch). Order rides the #order units, so array order survives the round trip.
51
+ export function boardFromUnits(values) {
52
+ const pick = (prefix, orderKey) => {
53
+ const order = values.get(orderKey) || [];
54
+ return order.map((id) => values.get(`${prefix}${id}`));
55
+ };
56
+ const meta = values.get('meta') || {};
57
+ return { ...meta, nodes: pick('node:', 'nodes#order'), sessions: pick('sess:', 'sess#order') };
58
+ }
59
+ export function diffUnits(prev, next) {
60
+ const set = {};
61
+ const del = [];
62
+ for (const [key, u] of next) {
63
+ const p = prev.get(key);
64
+ if (!p || p.j !== u.j)
65
+ set[key] = u.v;
66
+ }
67
+ for (const key of prev.keys())
68
+ if (!next.has(key))
69
+ del.push(key);
70
+ return { set, del };
71
+ }
72
+ export const unitValues = (units) => new Map([...units].map(([k, u]) => [k, u.v]));
@@ -0,0 +1,34 @@
1
+ export type BoardSnapshot = {
2
+ root: string;
3
+ specs: any[];
4
+ layout: {
5
+ worktrees: any[];
6
+ };
7
+ sessions: any[];
8
+ issues: any[];
9
+ issuesStamp: string;
10
+ forgeRevision: number;
11
+ evalTimelines: Map<string, any>;
12
+ sessionEvalProjections: Map<string, any>;
13
+ };
14
+ export declare function latestPerScenario<T extends {
15
+ scenario: string;
16
+ }>(readings: T[]): T[];
17
+ export declare function nodeEvalSummary(scenarios: {
18
+ name: string;
19
+ }[], readings: any[]): {
20
+ total: number;
21
+ pass: number;
22
+ fail: number;
23
+ stalePass: number;
24
+ staleFail: number;
25
+ empty: number;
26
+ };
27
+ export declare function buildBoard({ root, specs, layout, sessions, issues: merged, issuesStamp, forgeRevision, evalTimelines, sessionEvalProjections }: BoardSnapshot): Promise<{
28
+ nodes: any[];
29
+ sessions: any[];
30
+ identity: import("./project-identity.js").ResolvedIdentity;
31
+ issuesStamp: string;
32
+ }>;
33
+ export declare function spliceSessions(prev: Awaited<ReturnType<typeof buildBoard>>, sessions: any[], sessionEvalProjections: Map<string, any>): Promise<Awaited<ReturnType<typeof buildBoard>>>;
34
+ export declare function rebasePublishedSessions(topology: Awaited<ReturnType<typeof buildBoard>>, published: Awaited<ReturnType<typeof buildBoard>>): Awaited<ReturnType<typeof buildBoard>>;
@@ -0,0 +1,237 @@
1
+ import { deriveStatus } from './specs.js';
2
+ import { resolveProjectIdentity } from './project-identity.js';
3
+ import { publishReviewSnapshot } from './reviewSnapshot.js';
4
+ import { evalReviewState } from './review/reviewFilters.js';
5
+ // a ghost (added) node's parent: the existing node whose directory is the longest prefix of the new one.
6
+ function resolveParent(path, byDir) {
7
+ const dir = path.replace(/\/spec\.md$/, '');
8
+ const segs = dir.split('/');
9
+ for (let k = segs.length - 1; k > 0; k--) {
10
+ const anc = segs.slice(0, k).join('/');
11
+ if (byDir[anc])
12
+ return byDir[anc];
13
+ }
14
+ return null;
15
+ }
16
+ const OVERLAY_TO_PATH = Symbol('overlay-to-path');
17
+ // The server-only review snapshot keeps latest readings verbatim. Graph JSON receives only counts.
18
+ export function latestPerScenario(readings) {
19
+ const seen = new Set();
20
+ return readings.filter((r) => !seen.has(r.scenario) && (seen.add(r.scenario), true));
21
+ }
22
+ export function nodeEvalSummary(scenarios, readings) {
23
+ const latest = new Map(latestPerScenario(readings).map((reading) => [reading.scenario, reading]));
24
+ const summary = { total: scenarios.length, pass: 0, fail: 0, stalePass: 0, staleFail: 0, empty: 0 };
25
+ for (const scenario of scenarios) {
26
+ const reading = latest.get(scenario.name);
27
+ const state = (reading ? evalReviewState(reading) : 'empty');
28
+ summary[state]++;
29
+ }
30
+ return summary;
31
+ }
32
+ // @@@ a shelved row carries no delta ([[archive]]) - the board has TWO producers (a full buildBoard and the
33
+ // sessions-only spliceSessions), and shelving is a session-scoped write, so it takes the SPLICE path — which
34
+ // reuses the previous board's ops by path. Skipping the delta only in layout's row builder would therefore be
35
+ // invisible exactly when it fires: the splice would carry the stale ops forward forever. The rule belongs to
36
+ // the row, not to one producer, so both decorate through this one function.
37
+ const rowOps = (s, opsByPath) => (s.archived ? [] : opsByPath[s.path] || []);
38
+ export async function buildBoard({ root, specs, layout, sessions, issues: merged, issuesStamp, forgeRevision, evalTimelines, sessionEvalProjections }) {
39
+ const worktrees = layout.worktrees.filter((w) => !w.isMain);
40
+ // resolveLayout already zeroed ops for unmanaged worktrees, so this is just "has pending changes".
41
+ const opWts = worktrees.filter((w) => w.ops && w.ops.length);
42
+ const sessIdByPath = {};
43
+ sessions.forEach((s) => { sessIdByPath[s.path] = s.id; });
44
+ const seedOf = (path) => sessIdByPath[path] || path;
45
+ const byId = Object.fromEntries(specs.map((n) => [n.id, n]));
46
+ const byDir = {};
47
+ specs.forEach((n) => { if (n.path)
48
+ byDir[n.path.replace(/\/spec\.md$/, '')] = n.id; });
49
+ // register each added node's own dir in byDir first, so resolveParent can chain a new node to its new
50
+ // ghost ancestor (a whole added subtree renders as one tree, not a flat scatter of roots).
51
+ for (const w of opWts)
52
+ for (const op of w.ops) {
53
+ if (op.op === 'added')
54
+ byDir[op.path.replace(/\/spec\.md$/, '')] = op.nodeId;
55
+ }
56
+ const overlaysByNode = {};
57
+ const ghostById = {};
58
+ for (const w of opWts) {
59
+ const source = w.path, label = w.node || w.branch || w.path, seed = seedOf(w.path);
60
+ for (const op of w.ops) {
61
+ const ov = {
62
+ op: op.op, source, label, branch: w.branch, seed,
63
+ committed: op.committed, dirty: op.dirty,
64
+ toParent: op.op === 'moved' ? resolveParent(op.toPath || op.path, byDir) : null,
65
+ [OVERLAY_TO_PATH]: op.op === 'moved' ? op.toPath || op.path : null,
66
+ };
67
+ if (op.op === 'added' && !byId[op.nodeId]) {
68
+ if (ghostById[op.nodeId]) {
69
+ ghostById[op.nodeId].overlays.push(ov);
70
+ continue;
71
+ }
72
+ // a ghost is a node being ADDED by a worktree but not yet on main -> it has a pending op,
73
+ // so its derived status is `active` (live, in-flight), never `pending`.
74
+ ghostById[op.nodeId] = {
75
+ id: op.nodeId, parent: resolveParent(op.path, byDir), path: op.path,
76
+ title: op.nodeId, status: deriveStatus({ version: 0, drift: 0, hasOverlay: true }),
77
+ version: 0, session: null, fmStatus: null,
78
+ desc: '', code: [], related: [], body: '', drift: 0, driftFiles: [], ghost: true, overlays: [ov],
79
+ };
80
+ }
81
+ else {
82
+ (overlaysByNode[op.nodeId] ??= []).push(ov);
83
+ }
84
+ }
85
+ }
86
+ // re-derive status WITH the overlay so a node an unmerged worktree is touching reads `active` — the only
87
+ // place in-flight work is known, so the only place `active` is produced.
88
+ const nodes = [
89
+ ...specs.map((n) => {
90
+ const overlays = overlaysByNode[n.id] || [];
91
+ // `body` and its derivation `parts` are DROPPED from the board payload ([[graph-lean]]): together ~56% of
92
+ // the bytes, and detail the graph overview never renders. The detail view fetches them per node from
93
+ // `/api/specs/:id/content` on open, and the search palette fetches the body corpus from `/api/specs/lite`
94
+ // once on open — both off this hot poll. `undefined` makes JSON.stringify omit the keys.
95
+ return { ...n, body: undefined, parts: undefined, overlays, status: deriveStatus({ version: n.version, drift: n.drift, hasOverlay: overlays.length > 0, hasCode: (n.code?.length ?? 0) > 0, fmStatus: n.fmStatus ?? undefined }) };
96
+ }),
97
+ ...Object.values(ghostById),
98
+ ];
99
+ // The outer adapter reads Issues once. Full rows stay in the server-only review snapshot; graph nodes get
100
+ // counts and open identity only, enough for tile/stat/tree glances without reconstructing the list.
101
+ const isOpen = (i) => i.status === 'open';
102
+ // `issuesStamp` above is that ONE board-level freshness stamp, over EVERY thread — noded or nodeless,
103
+ // both stores, BOTH remark hosts. It is folded from the whole store and NOT from the split `merged`: a
104
+ // scenario-hosted remark lands on an eval track the issue read splits out ([[eval-issue-split]]), so a
105
+ // carrier folded over the issue half alone left an open READING blind to every remark on it — the write
106
+ // moved no board byte, [[graph-delta]] correctly suppressed the no-change broadcast, and the push never
107
+ // fired at all. The per-node fold below stays [[graph-lean]]-slim (no reply payloads).
108
+ const issuesByNode = {};
109
+ for (const issue of merged)
110
+ for (const nid of issue.nodes)
111
+ (issuesByNode[nid] ??= []).push(issue);
112
+ for (const n of nodes) {
113
+ const issues = issuesByNode[n.id];
114
+ if (!issues || !issues.length)
115
+ continue;
116
+ const open = issues.filter(isOpen);
117
+ n.reviewSummary = {
118
+ ...(n.reviewSummary || {}),
119
+ issues: { open: open.length, closed: issues.length - open.length, openIds: open.map((issue) => issue.id) },
120
+ };
121
+ }
122
+ // The L1 adapter calculates current eval timelines once. Latest rows/declarations stay server-only for
123
+ // paged review; graph nodes receive the explicit per-state count projection and nothing row-shaped.
124
+ const evalReviewNodes = nodes.flatMap((n) => {
125
+ const timeline = evalTimelines.get(n.id);
126
+ if (!timeline?.hasEvalFile)
127
+ return [];
128
+ const latest = latestPerScenario(timeline.readings);
129
+ n.reviewSummary = { ...(n.reviewSummary || {}), evals: nodeEvalSummary(timeline.scenarios, latest) };
130
+ return [{ id: n.id, hue: n.hue, scenarios: timeline.scenarios, evals: latest, readings: timeline.readings }];
131
+ });
132
+ publishReviewSnapshot({ issues: merged, evalNodes: evalReviewNodes, forgeRevision });
133
+ const opsByPath = {};
134
+ opWts.forEach((w) => { opsByPath[w.path] = w.ops; });
135
+ const sess = sessions.map((s) => ({
136
+ ...s,
137
+ source: s.path,
138
+ ops: rowOps(s, opsByPath),
139
+ evalSummary: sessionEvalProjections.get(s.id),
140
+ }));
141
+ // One resolved identity projection feeds title, favicon, rail, and catalog compatibility. A worktree
142
+ // backend reads the actual served tree's branch config and identity; endpoint registration uses the
143
+ // same git toplevel, so a linked worktree occupies its own host slot instead of replacing main.
144
+ const identity = resolveProjectIdentity(root, root);
145
+ return { nodes, sessions: sess, identity, issuesStamp };
146
+ }
147
+ // @@@ spliceSessions — the SESSIONS-ONLY producer ([[graph-cache]]). A session-scoped change (a lifecycle
148
+ // write, a liveness/activity poll flip) reshapes only the board's `sessions` rows — the node/meta units are
149
+ // untouched — so the cache re-derives ONLY the sessions and splices them onto the previous board verbatim,
150
+ // skipping the whole loadSpecs/layout/eval assembly a full buildBoard() pays. The adapter supplies every
151
+ // live input:
152
+ // each row is decorated EXACTLY as buildBoard's sess mapping (`{...s, source: s.path, ops}`), and every
153
+ // path's `ops` is REUSED from the previous board (a path→ops map). A session path absent in `prev` gets []
154
+ // — a brand-new worktree has no pending spec ops yet, and any later ops-CHANGING event (a commit, a
155
+ // worktree `.spec` edit) is refs/worktree-scoped, i.e. a FULL rebuild, never a sessions splice. So the
156
+ // splice is byte-indistinguishable from a full rebuild whenever only session state moved.
157
+ export async function spliceSessions(prev, sessions, sessionEvalProjections) {
158
+ const activeSources = new Set(sessions.map((session) => session.path));
159
+ const opsByPath = {};
160
+ for (const s of prev.sessions)
161
+ opsByPath[s.source] = s.ops;
162
+ const sess = sessions.map((s) => ({
163
+ ...s,
164
+ source: s.path,
165
+ ops: rowOps(s, opsByPath),
166
+ evalSummary: sessionEvalProjections.get(s.id),
167
+ }));
168
+ // Archive and close are subtractive topology changes: their worktree leaves the working set, so its
169
+ // overlays must leave in the same cheap publication as its row. Filtering the already-built units is exact
170
+ // and forks nothing. A newly-active source is intentionally absent here; graphCache keeps a full obligation
171
+ // for additions/resume so resolveLayout can discover that worktree's current delta.
172
+ let nodeProjectionMoved = false;
173
+ const projectedNodes = prev.nodes.flatMap((node) => {
174
+ const overlays = (node.overlays || []).filter((overlay) => activeSources.has(overlay.source));
175
+ if (node.ghost && overlays.length === 0) {
176
+ nodeProjectionMoved = true;
177
+ return [];
178
+ }
179
+ if (overlays.length === (node.overlays || []).length)
180
+ return [node];
181
+ nodeProjectionMoved = true;
182
+ if (node.ghost)
183
+ return [{ ...node, overlays, status: deriveStatus({ version: 0, drift: 0, hasOverlay: true }) }];
184
+ return [{ ...node, overlays, status: deriveStatus({
185
+ version: node.version,
186
+ drift: node.drift,
187
+ hasOverlay: overlays.length > 0,
188
+ hasCode: (node.code?.length ?? 0) > 0,
189
+ fmStatus: node.fmStatus ?? undefined,
190
+ }) }];
191
+ });
192
+ const nodes = nodeProjectionMoved ? projectedNodes : prev.nodes;
193
+ if (nodeProjectionMoved) {
194
+ const byDir = {};
195
+ for (const node of nodes)
196
+ if (node.path)
197
+ byDir[node.path.replace(/\/spec\.md$/, '')] = node.id;
198
+ const retainedIds = new Set(nodes.map((node) => node.id));
199
+ for (let index = 0; index < nodes.length; index++) {
200
+ const node = nodes[index];
201
+ let changed = false;
202
+ let parent = node.parent;
203
+ if (node.ghost) {
204
+ const next = resolveParent(node.path, byDir);
205
+ if (next !== parent) {
206
+ parent = next;
207
+ changed = true;
208
+ }
209
+ }
210
+ const overlays = (node.overlays || []).map((overlay) => {
211
+ if (!overlay.toParent || retainedIds.has(overlay.toParent))
212
+ return overlay;
213
+ const toPath = overlay[OVERLAY_TO_PATH];
214
+ changed = true;
215
+ return { ...overlay, toParent: typeof toPath === 'string' ? resolveParent(toPath, byDir) : null };
216
+ });
217
+ if (changed)
218
+ nodes[index] = { ...node, parent, overlays };
219
+ }
220
+ }
221
+ return { ...prev, nodes, sessions: sess };
222
+ }
223
+ // A full producer may finish after the session lane has already shown a newer row. Reuse that published
224
+ // projection on the full topology without another store read: topology owns the current per-path ops, while
225
+ // the published row owns lifecycle/eval fields. This is deliberately synchronous so a full completion never
226
+ // waits for a quiet session store.
227
+ export function rebasePublishedSessions(topology, published) {
228
+ const opsByPath = {};
229
+ for (const session of topology.sessions)
230
+ opsByPath[session.source] = session.ops;
231
+ const sessions = published.sessions.map((session) => ({
232
+ ...session,
233
+ source: session.path,
234
+ ops: rowOps(session, opsByPath),
235
+ }));
236
+ return { ...topology, sessions };
237
+ }
@@ -0,0 +1,3 @@
1
+ import type { Units } from './graph-delta.js';
2
+ export * from './graph-delta.js';
3
+ export declare function tagOf(units: Units): string;
@@ -0,0 +1,13 @@
1
+ import { createHash } from 'node:crypto';
2
+ export * from './graph-delta.js';
3
+ // the snapshot tag: a digest over every unit's key + content hash, order-independent (keys sorted). Two
4
+ // builds serializing equal content get equal tags; JSON.stringify equality is conservative (equal strings ⇒
5
+ // equal values; a key-order difference at worst re-sends an unchanged unit, never misses a changed one).
6
+ export function tagOf(units) {
7
+ const h = createHash('sha1');
8
+ for (const key of [...units.keys()].sort()) {
9
+ const u = units.get(key);
10
+ h.update(key).update('\0').update(u.j).update('\0');
11
+ }
12
+ return h.digest('hex');
13
+ }
@@ -0,0 +1,31 @@
1
+ export declare const HARNESS_IDENTITIES: readonly [{
2
+ readonly id: "claude";
3
+ readonly sessionEnvVar: "CLAUDE_CODE_SESSION_ID";
4
+ }, {
5
+ readonly id: "codex";
6
+ readonly sessionEnvVar: "CODEX_THREAD_ID";
7
+ }, {
8
+ readonly id: "opencode";
9
+ readonly sessionEnvVar: "OPENCODE_SESSION_ID";
10
+ }, {
11
+ readonly id: "pi";
12
+ readonly sessionEnvVar: "PI_SESSION_ID";
13
+ }, {
14
+ readonly id: "zcode";
15
+ readonly sessionEnvVar: "ZCODE_SESSION_ID";
16
+ }, {
17
+ readonly id: "claude-headless";
18
+ readonly sessionEnvVar: "CLAUDE_CODE_SESSION_ID";
19
+ }, {
20
+ readonly id: "opencode-headless";
21
+ readonly sessionEnvVar: "OPENCODE_SESSION_ID";
22
+ }, {
23
+ readonly id: "pi-headless";
24
+ readonly sessionEnvVar: "PI_SESSION_ID";
25
+ }, {
26
+ readonly id: "codex-headless";
27
+ readonly sessionEnvVar: "CODEX_THREAD_ID";
28
+ }];
29
+ export type HarnessId = typeof HARNESS_IDENTITIES[number]['id'];
30
+ export type HarnessIdentity = typeof HARNESS_IDENTITIES[number];
31
+ export declare function harnessIdentity(id: HarnessId): HarnessIdentity;
@@ -0,0 +1,20 @@
1
+ // Adapter-neutral identity facts. Full harness adapters project these rows; consumers that only resolve an
2
+ // environment identity must not load launchers, runtime transport, or materialization code.
3
+ export const HARNESS_IDENTITIES = [
4
+ { id: 'claude', sessionEnvVar: 'CLAUDE_CODE_SESSION_ID' },
5
+ { id: 'codex', sessionEnvVar: 'CODEX_THREAD_ID' },
6
+ { id: 'opencode', sessionEnvVar: 'OPENCODE_SESSION_ID' },
7
+ { id: 'pi', sessionEnvVar: 'PI_SESSION_ID' },
8
+ { id: 'zcode', sessionEnvVar: 'ZCODE_SESSION_ID' },
9
+ { id: 'claude-headless', sessionEnvVar: 'CLAUDE_CODE_SESSION_ID' },
10
+ { id: 'opencode-headless', sessionEnvVar: 'OPENCODE_SESSION_ID' },
11
+ { id: 'pi-headless', sessionEnvVar: 'PI_SESSION_ID' },
12
+ { id: 'codex-headless', sessionEnvVar: 'CODEX_THREAD_ID' },
13
+ ];
14
+ const identityById = new Map(HARNESS_IDENTITIES.map((identity) => [identity.id, identity]));
15
+ export function harnessIdentity(id) {
16
+ const identity = identityById.get(id);
17
+ if (!identity)
18
+ throw new Error(`unknown harness identity '${id}'`);
19
+ return identity;
20
+ }
@@ -0,0 +1,152 @@
1
+ export function resolvedIdentityIcon(value: any, fallback?: string): string;
2
+ export function identityPreset(value: any): {
3
+ id: string;
4
+ label: string;
5
+ bg: string;
6
+ fg: string;
7
+ shapes: {
8
+ tag: string;
9
+ d: string;
10
+ fill: string;
11
+ stroke: string;
12
+ }[];
13
+ } | {
14
+ id: string;
15
+ label: string;
16
+ bg: string;
17
+ fg: string;
18
+ shapes: ({
19
+ tag: string;
20
+ d: string;
21
+ cx?: undefined;
22
+ cy?: undefined;
23
+ r?: undefined;
24
+ } | {
25
+ tag: string;
26
+ cx: number;
27
+ cy: number;
28
+ r: number;
29
+ d?: undefined;
30
+ })[];
31
+ } | {
32
+ id: string;
33
+ label: string;
34
+ bg: string;
35
+ fg: string;
36
+ shapes: ({
37
+ tag: string;
38
+ x: number;
39
+ y: number;
40
+ width: number;
41
+ height: number;
42
+ rx: number;
43
+ d?: undefined;
44
+ } | {
45
+ tag: string;
46
+ d: string;
47
+ x?: undefined;
48
+ y?: undefined;
49
+ width?: undefined;
50
+ height?: undefined;
51
+ rx?: undefined;
52
+ })[];
53
+ } | {
54
+ id: string;
55
+ label: string;
56
+ bg: string;
57
+ fg: string;
58
+ shapes: ({
59
+ tag: string;
60
+ cx: number;
61
+ cy: number;
62
+ rx: number;
63
+ ry: number;
64
+ d?: undefined;
65
+ } | {
66
+ tag: string;
67
+ d: string;
68
+ cx?: undefined;
69
+ cy?: undefined;
70
+ rx?: undefined;
71
+ ry?: undefined;
72
+ })[];
73
+ } | null;
74
+ export function isIconifyIcon(value: any): boolean;
75
+ export function requireIdentityChoice(value: any): string;
76
+ export function identitySvg(value: any, fallback?: string): string;
77
+ export function identityFaviconHref(value: any, fallback?: string): string;
78
+ export const DEFAULT_PROJECT_ICON: "spexcode";
79
+ export const DEFAULT_GATEWAY_ICON: "gateway";
80
+ export const IDENTITY_PRESETS: readonly ({
81
+ id: string;
82
+ label: string;
83
+ bg: string;
84
+ fg: string;
85
+ shapes: {
86
+ tag: string;
87
+ d: string;
88
+ fill: string;
89
+ stroke: string;
90
+ }[];
91
+ } | {
92
+ id: string;
93
+ label: string;
94
+ bg: string;
95
+ fg: string;
96
+ shapes: ({
97
+ tag: string;
98
+ d: string;
99
+ cx?: undefined;
100
+ cy?: undefined;
101
+ r?: undefined;
102
+ } | {
103
+ tag: string;
104
+ cx: number;
105
+ cy: number;
106
+ r: number;
107
+ d?: undefined;
108
+ })[];
109
+ } | {
110
+ id: string;
111
+ label: string;
112
+ bg: string;
113
+ fg: string;
114
+ shapes: ({
115
+ tag: string;
116
+ x: number;
117
+ y: number;
118
+ width: number;
119
+ height: number;
120
+ rx: number;
121
+ d?: undefined;
122
+ } | {
123
+ tag: string;
124
+ d: string;
125
+ x?: undefined;
126
+ y?: undefined;
127
+ width?: undefined;
128
+ height?: undefined;
129
+ rx?: undefined;
130
+ })[];
131
+ } | {
132
+ id: string;
133
+ label: string;
134
+ bg: string;
135
+ fg: string;
136
+ shapes: ({
137
+ tag: string;
138
+ cx: number;
139
+ cy: number;
140
+ rx: number;
141
+ ry: number;
142
+ d?: undefined;
143
+ } | {
144
+ tag: string;
145
+ d: string;
146
+ cx?: undefined;
147
+ cy?: undefined;
148
+ rx?: undefined;
149
+ ry?: undefined;
150
+ })[];
151
+ })[];
152
+ export const IDENTITY_PRESET_IDS: readonly string[];