spexcode 0.6.1 → 0.6.5

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 (480) hide show
  1. package/README.md +99 -149
  2. package/bin/spex.mjs +4 -0
  3. package/node_modules/@spexcode/spec-cli/bin/spex.mjs +76 -0
  4. package/node_modules/@spexcode/spec-cli/dist/attach.d.ts +2 -0
  5. package/node_modules/@spexcode/spec-cli/dist/attach.js +48 -0
  6. package/node_modules/@spexcode/spec-cli/dist/claude-headless.d.ts +33 -0
  7. package/node_modules/@spexcode/spec-cli/dist/claude-headless.js +307 -0
  8. package/node_modules/@spexcode/spec-cli/dist/cli.d.ts +1 -0
  9. package/node_modules/@spexcode/spec-cli/dist/cli.js +1859 -0
  10. package/node_modules/@spexcode/spec-cli/dist/client.d.ts +111 -0
  11. package/node_modules/@spexcode/spec-cli/dist/client.js +476 -0
  12. package/node_modules/@spexcode/spec-cli/dist/cockpit.d.ts +7 -0
  13. package/node_modules/@spexcode/spec-cli/dist/cockpit.js +26 -0
  14. package/node_modules/@spexcode/spec-cli/dist/codex-headless.d.ts +1 -0
  15. package/{spec-cli/src/codex-headless.ts → node_modules/@spexcode/spec-cli/dist/codex-headless.js} +3 -9
  16. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.d.ts +53 -0
  17. package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.js +686 -0
  18. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.d.ts +1 -0
  19. package/node_modules/@spexcode/spec-cli/dist/commit-surgery.js +90 -0
  20. package/node_modules/@spexcode/spec-cli/dist/contract-filter.d.ts +14 -0
  21. package/node_modules/@spexcode/spec-cli/dist/contract-filter.js +219 -0
  22. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.d.ts +6 -0
  23. package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.js +50 -0
  24. package/node_modules/@spexcode/spec-cli/dist/delivery-queue.d.ts +23 -0
  25. package/node_modules/@spexcode/spec-cli/dist/delivery-queue.js +179 -0
  26. package/node_modules/@spexcode/spec-cli/dist/doctor.d.ts +9 -0
  27. package/node_modules/@spexcode/spec-cli/dist/doctor.js +547 -0
  28. package/node_modules/@spexcode/spec-cli/dist/eval-host.d.ts +1 -0
  29. package/node_modules/@spexcode/spec-cli/dist/eval-host.js +19 -0
  30. package/node_modules/@spexcode/spec-cli/dist/execution-trace.d.ts +26 -0
  31. package/node_modules/@spexcode/spec-cli/dist/execution-trace.js +475 -0
  32. package/node_modules/@spexcode/spec-cli/dist/file-write.d.ts +2 -0
  33. package/node_modules/@spexcode/spec-cli/dist/file-write.js +26 -0
  34. package/node_modules/@spexcode/spec-cli/dist/flat.d.ts +89 -0
  35. package/node_modules/@spexcode/spec-cli/dist/flat.js +1076 -0
  36. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.d.ts +56 -0
  37. package/node_modules/@spexcode/spec-cli/dist/gateway-auth.js +168 -0
  38. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.d.ts +28 -0
  39. package/node_modules/@spexcode/spec-cli/dist/gateway-hub.js +361 -0
  40. package/node_modules/@spexcode/spec-cli/dist/gateway.d.ts +37 -0
  41. package/node_modules/@spexcode/spec-cli/dist/gateway.js +503 -0
  42. package/node_modules/@spexcode/spec-cli/dist/graphCache.d.ts +27 -0
  43. package/node_modules/@spexcode/spec-cli/dist/graphCache.js +716 -0
  44. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.d.ts +14 -0
  45. package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.js +35 -0
  46. package/node_modules/@spexcode/spec-cli/dist/graphStream.d.ts +85 -0
  47. package/node_modules/@spexcode/spec-cli/dist/graphStream.js +1195 -0
  48. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.d.ts +64 -0
  49. package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.js +166 -0
  50. package/node_modules/@spexcode/spec-cli/dist/guide.d.ts +8 -0
  51. package/{spec-cli/src/guide.ts → node_modules/@spexcode/spec-cli/dist/guide.js} +115 -22
  52. package/node_modules/@spexcode/spec-cli/dist/harness-select.d.ts +18 -0
  53. package/node_modules/@spexcode/spec-cli/dist/harness-select.js +62 -0
  54. package/node_modules/@spexcode/spec-cli/dist/harness.d.ts +325 -0
  55. package/node_modules/@spexcode/spec-cli/dist/harness.js +3026 -0
  56. package/node_modules/@spexcode/spec-cli/dist/headless-controller.d.ts +9 -0
  57. package/node_modules/@spexcode/spec-cli/dist/headless-controller.js +47 -0
  58. package/node_modules/@spexcode/spec-cli/dist/help.d.ts +10 -0
  59. package/node_modules/@spexcode/spec-cli/dist/help.js +574 -0
  60. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.d.ts +18 -0
  61. package/node_modules/@spexcode/spec-cli/dist/hook-prompts.js +122 -0
  62. package/node_modules/@spexcode/spec-cli/dist/hooks.d.ts +1 -0
  63. package/{spec-cli/src/hooks.ts → node_modules/@spexcode/spec-cli/dist/hooks.js} +15 -15
  64. package/node_modules/@spexcode/spec-cli/dist/host-resources.d.ts +97 -0
  65. package/node_modules/@spexcode/spec-cli/dist/host-resources.js +795 -0
  66. package/node_modules/@spexcode/spec-cli/dist/host.d.ts +88 -0
  67. package/node_modules/@spexcode/spec-cli/dist/host.js +663 -0
  68. package/node_modules/@spexcode/spec-cli/dist/index.d.ts +1 -0
  69. package/node_modules/@spexcode/spec-cli/dist/index.js +899 -0
  70. package/node_modules/@spexcode/spec-cli/dist/init.d.ts +1 -0
  71. package/node_modules/@spexcode/spec-cli/dist/init.js +284 -0
  72. package/node_modules/@spexcode/spec-cli/dist/issues-cli.d.ts +6 -0
  73. package/node_modules/@spexcode/spec-cli/dist/issues-cli.js +334 -0
  74. package/node_modules/@spexcode/spec-cli/dist/issues.d.ts +69 -0
  75. package/node_modules/@spexcode/spec-cli/dist/issues.js +189 -0
  76. package/node_modules/@spexcode/spec-cli/dist/lint.d.ts +34 -0
  77. package/node_modules/@spexcode/spec-cli/dist/lint.js +476 -0
  78. package/node_modules/@spexcode/spec-cli/dist/listen.d.ts +7 -0
  79. package/{spec-cli/src/listen.ts → node_modules/@spexcode/spec-cli/dist/listen.js} +13 -17
  80. package/node_modules/@spexcode/spec-cli/dist/localIssues.d.ts +65 -0
  81. package/node_modules/@spexcode/spec-cli/dist/localIssues.js +582 -0
  82. package/node_modules/@spexcode/spec-cli/dist/login-page.d.ts +5 -0
  83. package/{spec-cli/src/login-page.ts → node_modules/@spexcode/spec-cli/dist/login-page.js} +7 -7
  84. package/node_modules/@spexcode/spec-cli/dist/loop-in.d.ts +23 -0
  85. package/{spec-cli/src/loop-in.ts → node_modules/@spexcode/spec-cli/dist/loop-in.js} +35 -45
  86. package/node_modules/@spexcode/spec-cli/dist/machine-peer.d.ts +69 -0
  87. package/node_modules/@spexcode/spec-cli/dist/machine-peer.js +603 -0
  88. package/node_modules/@spexcode/spec-cli/dist/materialize.d.ts +18 -0
  89. package/node_modules/@spexcode/spec-cli/dist/materialize.js +468 -0
  90. package/node_modules/@spexcode/spec-cli/dist/mentions.d.ts +50 -0
  91. package/node_modules/@spexcode/spec-cli/dist/mentions.js +117 -0
  92. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.d.ts +4 -0
  93. package/node_modules/@spexcode/spec-cli/dist/opencode-headless.js +208 -0
  94. package/node_modules/@spexcode/spec-cli/dist/opencode.d.ts +3 -0
  95. package/{spec-cli/src/opencode.ts → node_modules/@spexcode/spec-cli/dist/opencode.js} +9 -13
  96. package/node_modules/@spexcode/spec-cli/dist/pi-harness.d.ts +3 -0
  97. package/{spec-cli/src/pi-harness.ts → node_modules/@spexcode/spec-cli/dist/pi-harness.js} +45 -40
  98. package/node_modules/@spexcode/spec-cli/dist/pi-headless.d.ts +25 -0
  99. package/node_modules/@spexcode/spec-cli/dist/pi-headless.js +196 -0
  100. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.d.ts +21 -0
  101. package/node_modules/@spexcode/spec-cli/dist/plugin-harness.js +146 -0
  102. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.d.ts +10 -0
  103. package/node_modules/@spexcode/spec-cli/dist/pty-bridge.js +404 -0
  104. package/node_modules/@spexcode/spec-cli/dist/pty-helper.d.mts +1 -0
  105. package/node_modules/@spexcode/spec-cli/dist/pty-helper.mjs +101 -0
  106. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.d.mts +2 -0
  107. package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.mjs +23 -0
  108. package/node_modules/@spexcode/spec-cli/dist/public-graph.d.ts +46 -0
  109. package/node_modules/@spexcode/spec-cli/dist/public-graph.js +56 -0
  110. package/node_modules/@spexcode/spec-cli/dist/ranker.d.ts +15 -0
  111. package/node_modules/@spexcode/spec-cli/dist/ranker.js +188 -0
  112. package/node_modules/@spexcode/spec-cli/dist/reaper.d.ts +6 -0
  113. package/node_modules/@spexcode/spec-cli/dist/reaper.js +81 -0
  114. package/node_modules/@spexcode/spec-cli/dist/reviews.d.ts +189 -0
  115. package/node_modules/@spexcode/spec-cli/dist/reviews.js +350 -0
  116. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.d.ts +6 -0
  117. package/node_modules/@spexcode/spec-cli/dist/runtime-guard.js +37 -0
  118. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.d.ts +21 -0
  119. package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.js +84 -0
  120. package/node_modules/@spexcode/spec-cli/dist/search.bench.d.mts +1 -0
  121. package/node_modules/@spexcode/spec-cli/dist/search.bench.mjs +75 -0
  122. package/node_modules/@spexcode/spec-cli/dist/search.d.ts +20 -0
  123. package/node_modules/@spexcode/spec-cli/dist/search.js +61 -0
  124. package/node_modules/@spexcode/spec-cli/dist/session-cursors.d.ts +14 -0
  125. package/node_modules/@spexcode/spec-cli/dist/session-cursors.js +82 -0
  126. package/node_modules/@spexcode/spec-cli/dist/session-declarations.d.ts +13 -0
  127. package/node_modules/@spexcode/spec-cli/dist/session-declarations.js +126 -0
  128. package/node_modules/@spexcode/spec-cli/dist/session-execution.d.ts +10 -0
  129. package/node_modules/@spexcode/spec-cli/dist/session-execution.js +70 -0
  130. package/node_modules/@spexcode/spec-cli/dist/session-files.d.ts +28 -0
  131. package/node_modules/@spexcode/spec-cli/dist/session-files.js +130 -0
  132. package/node_modules/@spexcode/spec-cli/dist/session-follow.d.ts +31 -0
  133. package/node_modules/@spexcode/spec-cli/dist/session-follow.js +179 -0
  134. package/node_modules/@spexcode/spec-cli/dist/session-reparent.d.ts +10 -0
  135. package/node_modules/@spexcode/spec-cli/dist/session-reparent.js +33 -0
  136. package/node_modules/@spexcode/spec-cli/dist/session-timeline.d.ts +51 -0
  137. package/node_modules/@spexcode/spec-cli/dist/session-timeline.js +233 -0
  138. package/node_modules/@spexcode/spec-cli/dist/session-web.d.ts +24 -0
  139. package/node_modules/@spexcode/spec-cli/dist/session-web.js +141 -0
  140. package/node_modules/@spexcode/spec-cli/dist/sessions.d.ts +412 -0
  141. package/node_modules/@spexcode/spec-cli/dist/sessions.js +4239 -0
  142. package/node_modules/@spexcode/spec-cli/dist/sh.d.ts +1 -0
  143. package/node_modules/@spexcode/spec-cli/dist/sh.js +3 -0
  144. package/node_modules/@spexcode/spec-cli/dist/shim-runtime.d.ts +1 -0
  145. package/{spec-cli/src/shim-runtime.ts → node_modules/@spexcode/spec-cli/dist/shim-runtime.js} +3 -4
  146. package/node_modules/@spexcode/spec-cli/dist/slash-commands.d.ts +9 -0
  147. package/node_modules/@spexcode/spec-cli/dist/slash-commands.js +307 -0
  148. package/node_modules/@spexcode/spec-cli/dist/source-files.d.ts +9 -0
  149. package/node_modules/@spexcode/spec-cli/dist/source-files.js +113 -0
  150. package/node_modules/@spexcode/spec-cli/dist/supervise.d.ts +1 -0
  151. package/node_modules/@spexcode/spec-cli/dist/supervise.js +308 -0
  152. package/node_modules/@spexcode/spec-cli/dist/tree.d.ts +25 -0
  153. package/node_modules/@spexcode/spec-cli/dist/tree.js +98 -0
  154. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.d.ts +3 -0
  155. package/node_modules/@spexcode/spec-cli/dist/tsx-bin.js +41 -0
  156. package/node_modules/@spexcode/spec-cli/dist/uninstall.d.ts +3 -0
  157. package/node_modules/@spexcode/spec-cli/dist/uninstall.js +177 -0
  158. package/node_modules/@spexcode/spec-cli/dist/uploads.d.ts +36 -0
  159. package/node_modules/@spexcode/spec-cli/dist/uploads.js +243 -0
  160. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.d.ts +1 -0
  161. package/node_modules/@spexcode/spec-cli/dist/worktree-sources.js +47 -0
  162. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/dispatch.sh +5 -5
  163. package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/harness.sh +27 -7
  164. package/node_modules/@spexcode/spec-cli/package.json +47 -0
  165. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +8 -0
  166. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/comment-altitude/spec.md +9 -0
  167. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec-first.sh +1 -1
  168. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec-of-file.sh +1 -0
  169. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/spec.md +22 -0
  170. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/spec.md +2 -2
  171. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +31 -29
  172. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +15 -0
  173. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/forge-link/spec.md +10 -0
  174. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +13 -0
  175. package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +12 -0
  176. package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +94 -0
  177. package/node_modules/@spexcode/spec-core/dist/anchors.js +730 -0
  178. package/node_modules/@spexcode/spec-core/dist/git.d.ts +166 -0
  179. package/node_modules/@spexcode/spec-core/dist/git.js +2736 -0
  180. package/node_modules/@spexcode/spec-core/dist/graph-delta.d.ts +44 -0
  181. package/node_modules/@spexcode/spec-core/dist/graph-delta.js +72 -0
  182. package/node_modules/@spexcode/spec-core/dist/graph.d.ts +34 -0
  183. package/node_modules/@spexcode/spec-core/dist/graph.js +237 -0
  184. package/node_modules/@spexcode/spec-core/dist/graphDelta.d.ts +3 -0
  185. package/node_modules/@spexcode/spec-core/dist/graphDelta.js +13 -0
  186. package/node_modules/@spexcode/spec-core/dist/harness-identity.d.ts +31 -0
  187. package/node_modules/@spexcode/spec-core/dist/harness-identity.js +20 -0
  188. package/node_modules/@spexcode/spec-core/dist/identity-presets.d.ts +152 -0
  189. package/node_modules/@spexcode/spec-core/dist/identity-presets.js +132 -0
  190. package/node_modules/@spexcode/spec-core/dist/index.d.ts +45 -0
  191. package/node_modules/@spexcode/spec-core/dist/index.js +19 -0
  192. package/node_modules/@spexcode/spec-core/dist/layout.d.ts +183 -0
  193. package/node_modules/@spexcode/spec-core/dist/layout.js +548 -0
  194. package/node_modules/@spexcode/spec-core/dist/process-identity.d.ts +37 -0
  195. package/node_modules/@spexcode/spec-core/dist/process-identity.js +214 -0
  196. package/node_modules/@spexcode/spec-core/dist/project-identity.d.ts +12 -0
  197. package/node_modules/@spexcode/spec-core/dist/project-identity.js +71 -0
  198. package/node_modules/@spexcode/spec-core/dist/project-store.d.ts +3 -0
  199. package/node_modules/@spexcode/spec-core/dist/project-store.js +14 -0
  200. package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +2 -0
  201. package/node_modules/@spexcode/spec-core/dist/resilience.js +40 -0
  202. package/node_modules/@spexcode/spec-core/dist/review/index.d.ts +3 -0
  203. package/node_modules/@spexcode/spec-core/dist/review/index.js +5 -0
  204. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +77 -0
  205. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +308 -0
  206. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +66 -0
  207. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +180 -0
  208. package/node_modules/@spexcode/spec-core/dist/review/session.d.ts +4 -0
  209. package/node_modules/@spexcode/spec-core/dist/review/session.js +8 -0
  210. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.d.ts +15 -0
  211. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.js +12 -0
  212. package/node_modules/@spexcode/spec-core/dist/root-lru.d.ts +4 -0
  213. package/{spec-cli/src/root-lru.ts → node_modules/@spexcode/spec-core/dist/root-lru.js} +26 -30
  214. package/node_modules/@spexcode/spec-core/dist/specs.d.ts +117 -0
  215. package/node_modules/@spexcode/spec-core/dist/specs.js +489 -0
  216. package/node_modules/@spexcode/spec-core/package.json +28 -0
  217. package/node_modules/@spexcode/spec-eval/dist/cache.d.ts +10 -0
  218. package/node_modules/@spexcode/spec-eval/dist/cache.js +50 -0
  219. package/node_modules/@spexcode/spec-eval/dist/cli.d.ts +22 -0
  220. package/node_modules/@spexcode/spec-eval/dist/cli.js +981 -0
  221. package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +98 -0
  222. package/node_modules/@spexcode/spec-eval/dist/evaltab.js +176 -0
  223. package/node_modules/@spexcode/spec-eval/dist/filing.d.ts +16 -0
  224. package/node_modules/@spexcode/spec-eval/dist/filing.js +36 -0
  225. package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +48 -0
  226. package/node_modules/@spexcode/spec-eval/dist/freshness.js +799 -0
  227. package/node_modules/@spexcode/spec-eval/dist/host.d.ts +46 -0
  228. package/node_modules/@spexcode/spec-eval/dist/host.js +53 -0
  229. package/node_modules/@spexcode/spec-eval/dist/humanok.d.ts +11 -0
  230. package/node_modules/@spexcode/spec-eval/dist/humanok.js +27 -0
  231. package/node_modules/@spexcode/spec-eval/dist/index.d.ts +4 -0
  232. package/node_modules/@spexcode/spec-eval/dist/index.js +4 -0
  233. package/node_modules/@spexcode/spec-eval/dist/remarks.d.ts +31 -0
  234. package/node_modules/@spexcode/spec-eval/dist/remarks.js +1 -0
  235. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.d.ts +13 -0
  236. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.js +303 -0
  237. package/node_modules/@spexcode/spec-eval/dist/scenarios.d.ts +99 -0
  238. package/node_modules/@spexcode/spec-eval/dist/scenarios.js +650 -0
  239. package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +307 -0
  240. package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +1883 -0
  241. package/node_modules/@spexcode/spec-eval/dist/sidecar.d.ts +55 -0
  242. package/node_modules/@spexcode/spec-eval/dist/sidecar.js +82 -0
  243. package/node_modules/@spexcode/spec-eval/dist/timeline.d.ts +25 -0
  244. package/node_modules/@spexcode/spec-eval/dist/timeline.js +65 -0
  245. package/node_modules/@spexcode/spec-eval/dist/ui-path.d.ts +1 -0
  246. package/node_modules/@spexcode/spec-eval/dist/ui-path.js +2 -0
  247. package/node_modules/@spexcode/spec-eval/package.json +36 -0
  248. package/node_modules/@spexcode/spec-forge/dist/cache.d.ts +29 -0
  249. package/node_modules/@spexcode/spec-forge/dist/cache.js +59 -0
  250. package/node_modules/@spexcode/spec-forge/dist/cli.d.ts +1 -0
  251. package/node_modules/@spexcode/spec-forge/dist/cli.js +100 -0
  252. package/node_modules/@spexcode/spec-forge/dist/drivers/github.d.ts +2 -0
  253. package/node_modules/@spexcode/spec-forge/dist/drivers/github.js +116 -0
  254. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.d.ts +7 -0
  255. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.js +144 -0
  256. package/node_modules/@spexcode/spec-forge/dist/drivers.d.ts +10 -0
  257. package/node_modules/@spexcode/spec-forge/dist/drivers.js +83 -0
  258. package/node_modules/@spexcode/spec-forge/dist/index.d.ts +4 -0
  259. package/node_modules/@spexcode/spec-forge/dist/index.js +4 -0
  260. package/node_modules/@spexcode/spec-forge/dist/links.d.ts +15 -0
  261. package/node_modules/@spexcode/spec-forge/dist/links.js +65 -0
  262. package/node_modules/@spexcode/spec-forge/dist/needs-eval.d.ts +10 -0
  263. package/node_modules/@spexcode/spec-forge/dist/needs-eval.js +20 -0
  264. package/node_modules/@spexcode/spec-forge/dist/port.d.ts +53 -0
  265. package/node_modules/@spexcode/spec-forge/dist/port.js +1 -0
  266. package/node_modules/@spexcode/spec-forge/dist/resident.d.ts +7 -0
  267. package/node_modules/@spexcode/spec-forge/dist/resident.js +43 -0
  268. package/node_modules/@spexcode/spec-forge/package.json +32 -0
  269. package/package.json +33 -19
  270. package/spec-cli/bin/spex.mjs +0 -69
  271. package/spec-cli/src/anchors.ts +0 -706
  272. package/spec-cli/src/attach.ts +0 -43
  273. package/spec-cli/src/claude-headless.ts +0 -321
  274. package/spec-cli/src/cli.ts +0 -1115
  275. package/spec-cli/src/client.ts +0 -315
  276. package/spec-cli/src/cockpit.ts +0 -43
  277. package/spec-cli/src/codex-runtime-generations.ts +0 -646
  278. package/spec-cli/src/commit-surgery.ts +0 -68
  279. package/spec-cli/src/contract-filter.ts +0 -202
  280. package/spec-cli/src/delivery-queue.ts +0 -107
  281. package/spec-cli/src/doctor.ts +0 -516
  282. package/spec-cli/src/file-write.ts +0 -22
  283. package/spec-cli/src/gateway-auth.ts +0 -181
  284. package/spec-cli/src/gateway-hub.ts +0 -356
  285. package/spec-cli/src/gateway.ts +0 -368
  286. package/spec-cli/src/git.ts +0 -2180
  287. package/spec-cli/src/graph.ts +0 -221
  288. package/spec-cli/src/graphCache.ts +0 -641
  289. package/spec-cli/src/graphDelta.ts +0 -77
  290. package/spec-cli/src/graphStream.ts +0 -1019
  291. package/spec-cli/src/harness-select.ts +0 -77
  292. package/spec-cli/src/harness.ts +0 -2747
  293. package/spec-cli/src/headless-controller.ts +0 -63
  294. package/spec-cli/src/help.ts +0 -480
  295. package/spec-cli/src/host-resources.ts +0 -707
  296. package/spec-cli/src/host.ts +0 -611
  297. package/spec-cli/src/identity-presets.d.ts +0 -13
  298. package/spec-cli/src/identity-presets.js +0 -128
  299. package/spec-cli/src/index.ts +0 -730
  300. package/spec-cli/src/init.ts +0 -258
  301. package/spec-cli/src/issues-cli.ts +0 -276
  302. package/spec-cli/src/issues.ts +0 -237
  303. package/spec-cli/src/layout.ts +0 -557
  304. package/spec-cli/src/lint.ts +0 -458
  305. package/spec-cli/src/localIssues.ts +0 -538
  306. package/spec-cli/src/materialize.ts +0 -412
  307. package/spec-cli/src/mentions.ts +0 -81
  308. package/spec-cli/src/opencode-headless.ts +0 -205
  309. package/spec-cli/src/pi-headless.ts +0 -153
  310. package/spec-cli/src/plugin-harness.ts +0 -157
  311. package/spec-cli/src/process-identity.ts +0 -207
  312. package/spec-cli/src/project-identity.ts +0 -73
  313. package/spec-cli/src/project-store.ts +0 -17
  314. package/spec-cli/src/pty-bridge.ts +0 -396
  315. package/spec-cli/src/pty-helper.mjs +0 -96
  316. package/spec-cli/src/pty-native-helper.mjs +0 -22
  317. package/spec-cli/src/ranker.ts +0 -191
  318. package/spec-cli/src/reaper.ts +0 -125
  319. package/spec-cli/src/resilience.ts +0 -41
  320. package/spec-cli/src/reviewSnapshot.ts +0 -28
  321. package/spec-cli/src/reviews.ts +0 -405
  322. package/spec-cli/src/runtime-guard.ts +0 -35
  323. package/spec-cli/src/runtime-ownership.ts +0 -88
  324. package/spec-cli/src/search.bench.mjs +0 -80
  325. package/spec-cli/src/search.ts +0 -63
  326. package/spec-cli/src/session-cursors.ts +0 -91
  327. package/spec-cli/src/session-follow.ts +0 -182
  328. package/spec-cli/src/session-timeline.ts +0 -98
  329. package/spec-cli/src/sessions.ts +0 -3403
  330. package/spec-cli/src/sh.ts +0 -3
  331. package/spec-cli/src/slash-commands.ts +0 -318
  332. package/spec-cli/src/source-files.ts +0 -104
  333. package/spec-cli/src/specs.ts +0 -498
  334. package/spec-cli/src/supervise.ts +0 -245
  335. package/spec-cli/src/tree.ts +0 -118
  336. package/spec-cli/src/tsx-bin.ts +0 -18
  337. package/spec-cli/src/uninstall.ts +0 -171
  338. package/spec-cli/src/uploads.ts +0 -253
  339. package/spec-cli/src/worktree-sources.ts +0 -42
  340. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +0 -8
  341. package/spec-cli/templates/spec/project/.plugins/core/comment-altitude/spec.md +0 -28
  342. package/spec-cli/templates/spec/project/.plugins/core/spec.md +0 -23
  343. package/spec-cli/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +0 -32
  344. package/spec-cli/templates/spec/project/.plugins/prompts/forge-link/spec.md +0 -9
  345. package/spec-cli/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +0 -15
  346. package/spec-cli/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +0 -18
  347. package/spec-dashboard/dist/assets/App-F9uaAVcH.js +0 -2
  348. package/spec-dashboard/dist/assets/Dashboard-Ba_jhxp1.js +0 -27
  349. package/spec-dashboard/dist/assets/Dashboard-C5ap-Sga.css +0 -1
  350. package/spec-dashboard/dist/assets/EvalsPage-FixoOg_n.js +0 -2
  351. package/spec-dashboard/dist/assets/IssuesPage-CuKLFhH3.js +0 -1
  352. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  353. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  354. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  355. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  356. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  357. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  358. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  359. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  360. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  361. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  362. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  363. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  364. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  365. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  366. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  367. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  368. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  369. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  370. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  371. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  372. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  373. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  374. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  375. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  376. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  377. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  378. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  379. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  380. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  381. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  382. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  383. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  384. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  385. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  386. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  387. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  388. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  389. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  390. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  391. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  392. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  393. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  394. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  395. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  396. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  397. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  398. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  399. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  400. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  401. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  402. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  403. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  404. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  405. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  406. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  407. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  408. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  409. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  410. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  411. package/spec-dashboard/dist/assets/MobileApp-CHgEHORJ.js +0 -2
  412. package/spec-dashboard/dist/assets/Modal-CQgYymmr.js +0 -1
  413. package/spec-dashboard/dist/assets/PageScroll-hT7UTLvD.js +0 -1
  414. package/spec-dashboard/dist/assets/ProjectsPage-CtXxakF9.js +0 -1
  415. package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +0 -32
  416. package/spec-dashboard/dist/assets/SessionInterface-Bpie-9fs.js +0 -39
  417. package/spec-dashboard/dist/assets/SessionWindow-CixDi4PI.js +0 -1
  418. package/spec-dashboard/dist/assets/Settings-C2MsucfE.js +0 -1
  419. package/spec-dashboard/dist/assets/Thread-C6Go8HRh.js +0 -13
  420. package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +0 -1
  421. package/spec-dashboard/dist/assets/data-B-RQmit6.js +0 -1
  422. package/spec-dashboard/dist/assets/index-CsI8DElI.css +0 -1
  423. package/spec-dashboard/dist/assets/index-DrVao0Ep.js +0 -41
  424. package/spec-dashboard/dist/assets/launch-BBH02b1v.js +0 -276
  425. package/spec-dashboard/dist/assets/launch-Cp579UoJ.css +0 -1
  426. package/spec-dashboard/dist/assets/terminalFont-C6oGNKrf.js +0 -1
  427. package/spec-dashboard/dist/index.html +0 -29
  428. package/spec-dashboard/src/reviewFilters.js +0 -322
  429. package/spec-dashboard/src/reviewQuery.js +0 -174
  430. package/spec-dashboard/src/session.js +0 -199
  431. package/spec-eval/src/cache.ts +0 -57
  432. package/spec-eval/src/cli.ts +0 -889
  433. package/spec-eval/src/evaltab.ts +0 -262
  434. package/spec-eval/src/filing.ts +0 -39
  435. package/spec-eval/src/freshness.ts +0 -557
  436. package/spec-eval/src/humanok.ts +0 -28
  437. package/spec-eval/src/scenariofresh.ts +0 -244
  438. package/spec-eval/src/scenarios.ts +0 -672
  439. package/spec-eval/src/sessioneval.ts +0 -2226
  440. package/spec-eval/src/sidecar.ts +0 -93
  441. package/spec-eval/src/timeline.ts +0 -54
  442. package/spec-forge/src/__fixtures__/github-forge.json +0 -63
  443. package/spec-forge/src/cache.ts +0 -66
  444. package/spec-forge/src/cli.ts +0 -99
  445. package/spec-forge/src/drivers/github.ts +0 -132
  446. package/spec-forge/src/drivers/gitlab.ts +0 -153
  447. package/spec-forge/src/drivers.ts +0 -73
  448. package/spec-forge/src/links.ts +0 -72
  449. package/spec-forge/src/needs-eval.ts +0 -29
  450. package/spec-forge/src/port.ts +0 -36
  451. package/spec-forge/src/resident.ts +0 -46
  452. /package/{spec-cli → node_modules/@spexcode/spec-cli}/README.md +0 -0
  453. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -0
  454. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-sed-v0.fixture +0 -0
  455. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/commit-msg +0 -0
  456. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-checkout +0 -0
  457. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-merge +0 -0
  458. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/pre-commit +0 -0
  459. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/prepare-commit-msg +0 -0
  460. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/reference-transaction +0 -0
  461. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/extract/spec.md +0 -0
  462. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/regroup/spec.md +0 -0
  463. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/rename/spec.md +0 -0
  464. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/spec.md +0 -0
  465. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/tidy/spec.md +0 -0
  466. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/idle.sh +0 -0
  467. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/spec.md +0 -0
  468. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/mark-active.sh +0 -0
  469. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/spec.md +0 -0
  470. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/fail.sh +0 -0
  471. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/spec.md +0 -0
  472. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec.md +0 -0
  473. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec.md +0 -0
  474. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/spec.md +0 -0
  475. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/digest.mjs +0 -0
  476. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/spec.md +0 -0
  477. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/spec.md +0 -0
  478. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/spec.md +0 -0
  479. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/spec.md +0 -0
  480. /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[];