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,23 @@
1
+ import { chmodSync, statSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ const require = createRequire(import.meta.url);
5
+ export function nodePtySpawnHelperPath(nativeModule) {
6
+ const nativeAddon = Object.values(require.cache).find((loaded) => loaded?.exports === nativeModule)?.filename;
7
+ if (!nativeAddon)
8
+ throw new Error('cannot locate node-pty loaded native addon');
9
+ return join(dirname(nativeAddon), 'spawn-helper');
10
+ }
11
+ export function ensureExecutableIfPresent(path) {
12
+ let mode;
13
+ try {
14
+ mode = statSync(path).mode & 0o777;
15
+ }
16
+ catch (error) {
17
+ if (error?.code === 'ENOENT')
18
+ return;
19
+ throw error;
20
+ }
21
+ if ((mode & 0o111) !== 0o111)
22
+ chmodSync(path, mode | 0o111);
23
+ }
@@ -0,0 +1,46 @@
1
+ export declare const PUBLIC_GRAPH_SCHEMA: "spexcode.public-spec-graph/v1";
2
+ export declare const PUBLIC_GRAPH_PAYLOAD_NAME: "public-graph.json";
3
+ export type PublicGraphNode = Readonly<{
4
+ id: string;
5
+ parent: string | null;
6
+ path: string;
7
+ title: string;
8
+ status: string;
9
+ fmStatus: string | null;
10
+ hue: number;
11
+ desc: string;
12
+ code: readonly string[];
13
+ related: readonly string[];
14
+ version: number;
15
+ lastEdited: string | null;
16
+ drift: number;
17
+ driftFiles: readonly {
18
+ file: string;
19
+ behind: number;
20
+ }[];
21
+ }>;
22
+ export type PublicGraph = Readonly<{
23
+ schema: typeof PUBLIC_GRAPH_SCHEMA;
24
+ payloadName: typeof PUBLIC_GRAPH_PAYLOAD_NAME;
25
+ revision: string;
26
+ sourceRoot: string;
27
+ identity: Readonly<{
28
+ title: string;
29
+ icon: string;
30
+ }>;
31
+ nodes: readonly PublicGraphNode[];
32
+ }>;
33
+ export type PublicGraphDocument = Readonly<{
34
+ schema: 'spexcode.public-spec-document/v1';
35
+ revision: string;
36
+ id: string;
37
+ body: string;
38
+ parts: unknown;
39
+ }>;
40
+ export type PublicGraphArtifact = Readonly<{
41
+ graph: PublicGraph;
42
+ documents: readonly PublicGraphDocument[];
43
+ }>;
44
+ export declare function buildPublicGraphArtifact(): Promise<PublicGraphArtifact>;
45
+ export declare function buildPublicGraph(): Promise<PublicGraph>;
46
+ export declare function publicGraphJson(graph: PublicGraph): string;
@@ -0,0 +1,56 @@
1
+ import { loadSpecs, repoRoot, resolveProjectIdentity, gitA } from '@spexcode/spec-core';
2
+ export const PUBLIC_GRAPH_SCHEMA = 'spexcode.public-spec-graph/v1';
3
+ export const PUBLIC_GRAPH_PAYLOAD_NAME = 'public-graph.json';
4
+ function stableNode(node) {
5
+ return {
6
+ id: node.id,
7
+ parent: node.parent,
8
+ path: node.path,
9
+ title: node.title,
10
+ status: node.status,
11
+ fmStatus: node.fmStatus,
12
+ hue: node.hue,
13
+ desc: node.desc,
14
+ code: [...node.code],
15
+ related: [...node.related],
16
+ version: node.version,
17
+ lastEdited: node.lastEdited,
18
+ drift: node.drift,
19
+ driftFiles: node.driftFiles.map((entry) => ({ file: entry.file, behind: entry.behind })),
20
+ };
21
+ }
22
+ export async function buildPublicGraphArtifact() {
23
+ const root = repoRoot();
24
+ const [nodes, revision] = await Promise.all([
25
+ loadSpecs(root),
26
+ gitA(['-C', root, 'rev-parse', 'HEAD']).then((value) => value.trim()),
27
+ ]);
28
+ if (!revision)
29
+ throw new Error('public graph cannot be published without a Git revision');
30
+ const identity = resolveProjectIdentity(root, root);
31
+ const graph = Object.freeze({
32
+ schema: PUBLIC_GRAPH_SCHEMA,
33
+ payloadName: PUBLIC_GRAPH_PAYLOAD_NAME,
34
+ revision,
35
+ // A public artifact must be relocatable and must not disclose its producer's checkout layout.
36
+ sourceRoot: '.',
37
+ identity: Object.freeze({ title: identity.title, icon: identity.icon }),
38
+ nodes: Object.freeze(nodes.map(stableNode).sort((a, b) => a.path.localeCompare(b.path))),
39
+ });
40
+ const documents = Object.freeze(nodes
41
+ .map((node) => Object.freeze({
42
+ schema: 'spexcode.public-spec-document/v1',
43
+ revision,
44
+ id: node.id,
45
+ body: node.body,
46
+ parts: node.parts,
47
+ }))
48
+ .sort((a, b) => a.id.localeCompare(b.id)));
49
+ return Object.freeze({ graph, documents });
50
+ }
51
+ export async function buildPublicGraph() {
52
+ return (await buildPublicGraphArtifact()).graph;
53
+ }
54
+ export function publicGraphJson(graph) {
55
+ return `${JSON.stringify(graph, null, 2)}\n`;
56
+ }
@@ -0,0 +1,15 @@
1
+ export declare function terms(query: string): string[];
2
+ export type RankInput<T> = {
3
+ ref: T;
4
+ name: string;
5
+ desc: string;
6
+ body: string;
7
+ };
8
+ export type Ranked<T> = {
9
+ ref: T;
10
+ score: number;
11
+ snippet: string;
12
+ };
13
+ export declare function rankDocs<T>(query: string, inputs: RankInput<T>[], opts?: {
14
+ limit?: number;
15
+ }): Ranked<T>[];
@@ -0,0 +1,188 @@
1
+ // tier multipliers, name > desc > body. A doc's NAME is the strongest signal, its one-line DESC a curated
2
+ // summary (next), its BODY the weakest per-hit — but the body carries BM25 term-frequency so a doc that
3
+ // genuinely concentrates a rare word still climbs. IDF scales all three. The spread only ORDERS the tiers;
4
+ // the discriminating magnitude comes from rarity (IDF) and body-density (BM25), not these constants — which
5
+ // is why they sit in flat plateaus rather than being fitted to any case.
6
+ const W_NAME_PREFIX = 8;
7
+ const W_NAME_SUBSTR = 5;
8
+ const W_DESC = 2.2;
9
+ const W_BODY = 1;
10
+ // a tiny stoplist of question scaffolding + length-1 tokens, dropped so "how does the … is it …" can't drown
11
+ // the content words. Deliberately small and general — NOT tuned to any benchmark; just the function words a
12
+ // natural-language query carries that match nothing meaningful. Quantifiers (many, several, same, too…) are
13
+ // NOT stopped: in this corpus they are load-bearing ("too many owners" IS the multi-ownership concept —
14
+ // dropping them measurably breaks that reach).
15
+ const STOP = new Set([
16
+ 'the', 'a', 'an', 'and', 'or', 'of', 'to', 'in', 'on', 'is', 'it', 'its', 'as', 'at', 'by', 'for',
17
+ 'how', 'does', 'do', 'what', 'which', 'that', 'this', 'these', 'those', 'with', 'from', 'into', 'are',
18
+ 'be', 'can', 'just', 'them', 'they', 'their', 'so', 'if', 'not', 'no', 'but', 'vs', 'us', 'we', 'you',
19
+ ]);
20
+ // The corpus is mostly English but not only — some nodes carry CJK prose (the root spexcode node is a whole
21
+ // Chinese paragraph), and the dashboard palette ([[shared-ranker]]) ranks session/issue titles that are
22
+ // frequently Chinese. CJK has no spaces, so a whitespace/`[^a-z0-9]` split silently discards ALL of it. We
23
+ // tokenize the SAME way on both sides: an ASCII alphanumeric run is one token; each CJK character is its own
24
+ // token (a unigram). Unigrams — not bigrams — keep the shared prefix-match/IDF/BM25 machinery untouched (a
25
+ // single-char query still matches, no bigram edge cases) and stay BLUNT & ROBUST, the floor's whole stance.
26
+ // Han (incl. Ext-A + compat) plus Japanese kana; enough to cover the CJK a spec body or a session title carries.
27
+ const CJK = '\\u3400-\\u4dbf\\u4e00-\\u9fff\\uf900-\\ufaff\\u3040-\\u30ff'; // Ext-A · Unified · Compat · kana
28
+ const TOKEN_RE = new RegExp(`[a-z0-9]+|[${CJK}]`, 'g');
29
+ const CJK_RE = new RegExp(`[${CJK}]`);
30
+ function isCjk(t) { return CJK_RE.test(t); }
31
+ function tokenize(text) {
32
+ return text.toLowerCase().match(TOKEN_RE) ?? [];
33
+ }
34
+ // tokenize, lowercase, drop stopwords + length-1 ASCII tokens (a length-1 CJK token is a real word — keep it), de-dup.
35
+ export function terms(query) {
36
+ const seen = new Set();
37
+ for (const w of tokenize(query)) {
38
+ if (isCjk(w) || (w.length > 1 && !STOP.has(w)))
39
+ seen.add(w);
40
+ }
41
+ return [...seen];
42
+ }
43
+ // the words of a field, lowercased — used for word-boundary (prefix-of-a-word) matching, which kills
44
+ // short-token pollution (`main` must not match inside `domain`); CJK chars are single-char words.
45
+ function words(text) {
46
+ return tokenize(text);
47
+ }
48
+ // light query-side stem for prefix matching: drop a trailing plural 's' (len≥4, not 'ss') then a mute 'e'
49
+ // (len≥5) — so `sessions` prefix-reaches `session`, `merge`→`merg` reaches `merging`, `declare`→`declar`
50
+ // reaches `declaration`. Without the e-drop the spec's promised merge↔merging reach silently never worked
51
+ // (`'merging'.startsWith('merge')` is false). Query-side only; IDF self-neutralises the extra reach (a
52
+ // looser term matches more docs → bigger df → smaller idf), so no flood.
53
+ function stem(t) {
54
+ let s = t;
55
+ if (s.length >= 4 && s.endsWith('s') && !s.endsWith('ss'))
56
+ s = s.slice(0, -1);
57
+ if (s.length >= 5 && s.endsWith('e'))
58
+ s = s.slice(0, -1);
59
+ return s;
60
+ }
61
+ // name match is forward-only (a chosen short field — reverse would let a stray short word swallow it);
62
+ // desc/body match bidirectionally so a longer doc word still reaches a shorter query term, reverse gated to
63
+ // words ≥3 chars so a stray short word can't swallow a longer term (IDF neutralises the generic words it
64
+ // pulls in).
65
+ function nameMatch(term, w) { return w.startsWith(stem(term)); }
66
+ function textMatch(term, w) { return w.startsWith(stem(term)) || (w.length >= 3 && term.startsWith(w)); }
67
+ // how strongly a query term's name-prefix hit counts, over a doc's name words: the FRACTION of the matched
68
+ // name word the query term actually spans. A full word (`port`→`port`, `api`→`api`) is 1.0 — the strong
69
+ // signal a name tier is for; a short query term that only PREFIXES a longer, unrelated word (`port`→`portable`,
70
+ // `governs`→`governed`) covers less of it and is weaker evidence, so it earns proportionally less than the
71
+ // full name weight. Floored at 0.5 (a prefix is still evidence, not noise). Returns 0 when no name word is
72
+ // prefixed. This is what stops a corpus-growth collision — a sibling whose NAME merely starts with a query
73
+ // word (portable-layout for "port", governed-related for "governs") — from outranking the node that owns the
74
+ // concept; the floor sat at an implicit 1.0 before, which let those partial prefixes score a full name hit.
75
+ const NAME_COVER_FLOOR = 0.5;
76
+ function nameCover(term, n) {
77
+ const st = stem(term);
78
+ let best = 0;
79
+ for (const w of n.nameWords) {
80
+ if (w.startsWith(st)) {
81
+ const r = st.length / w.length;
82
+ if (r > best)
83
+ best = r;
84
+ }
85
+ }
86
+ return best > 0 ? Math.max(NAME_COVER_FLOOR, best) : 0;
87
+ }
88
+ // classic BM25 tf: frequency with saturation (K1 sets how fast it saturates) and length-normalisation (B),
89
+ // both in a wide insensitive plateau. tf=0 → 0.
90
+ const K1 = 1.2;
91
+ const B = 0.4;
92
+ function bm25tf(tf, len, avgLen) {
93
+ if (tf <= 0)
94
+ return 0;
95
+ return (tf * (K1 + 1)) / (tf + K1 * (1 - B + (B * len) / (avgLen || 1)));
96
+ }
97
+ // the pre-IDF weight a term earns against one doc, picking its single best tier (three fields): a name
98
+ // word-prefix beats a name substring beats a desc hit beats a body hit. Name is a short, chosen field →
99
+ // near-binary, scaled only by prefix COVERAGE (a full word counts full; a query term that is a mere prefix
100
+ // of a longer name word counts proportionally less — see nameCover). Desc is presence too (a curated
101
+ // one-liner — repetition there is stuffing, not evidence)
102
+ // but LENGTH-NORMALISED: it was flat-binary until descs drifted long and a bloated desc became a cheat code
103
+ // (one 60-word desc catches every query term a curated one-liner can't). bm25tf(1, avgLen, avgLen) = 1, so
104
+ // a hit in an average-length desc scores exactly the old binary W_DESC — the normalisation only bites
105
+ // outliers. The body keeps the full BM25-saturated term-frequency that discriminates the long ties.
106
+ function tierWeight(term, n, avgBodyLen, avgDescLen) {
107
+ const cover = nameCover(term, n);
108
+ if (cover > 0)
109
+ return W_NAME_PREFIX * cover;
110
+ if (n.name.includes(term))
111
+ return W_NAME_SUBSTR;
112
+ if (n.descWords.some((w) => textMatch(term, w)))
113
+ return W_DESC * bm25tf(1, n.descWords.length, avgDescLen);
114
+ const tf = n.bodyWords.reduce((c, w) => c + (textMatch(term, w) ? 1 : 0), 0);
115
+ return W_BODY * bm25tf(tf, n.bodyWords.length, avgBodyLen);
116
+ }
117
+ // a short single-line window of prose around the FIRST matched term, so a reader sees WHY it matched. Falls
118
+ // back to the desc (then the text head) when only the name matched. Collapsed to one line, ~window chars.
119
+ function snippetFor(text, desc, qterms, window = 140) {
120
+ const flat = text.replace(/\s+/g, ' ').trim();
121
+ const lower = flat.toLowerCase();
122
+ let at = -1;
123
+ for (const t of qterms) {
124
+ // ASCII terms locate at a word boundary (so `main` doesn't hit inside `domain`); a CJK term has no
125
+ // `\b` around it (JS `\b` is ASCII-only), so locate it by plain substring.
126
+ const i = isCjk(t) ? lower.indexOf(t) : lower.search(new RegExp('\\b' + t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
127
+ if (i >= 0 && (at < 0 || i < at))
128
+ at = i;
129
+ }
130
+ if (at < 0) {
131
+ const fb = (desc || flat).replace(/\s+/g, ' ').trim();
132
+ return fb.length > window ? fb.slice(0, window).trimEnd() + '…' : fb;
133
+ }
134
+ const start = Math.max(0, at - Math.floor(window / 3));
135
+ let s = flat.slice(start, start + window).trim();
136
+ if (start > 0)
137
+ s = '…' + s;
138
+ if (start + window < flat.length)
139
+ s = s + '…';
140
+ return s;
141
+ }
142
+ // the shared entrypoint: sum each query term's best-tier weight × IDF, keep docs hitting ≥1 term, sort by
143
+ // score desc (stable — equal scores keep the caller's pre-sorted input order), cap to `limit` (default 10).
144
+ export function rankDocs(query, inputs, opts = {}) {
145
+ const limit = opts.limit ?? 10;
146
+ const qterms = terms(query);
147
+ if (!qterms.length)
148
+ return [];
149
+ const docs = inputs.map((d) => {
150
+ const name = d.name.toLowerCase();
151
+ return {
152
+ ref: d.ref, name, nameWords: words(name),
153
+ desc: d.desc.toLowerCase(), descWords: words(d.desc),
154
+ bodyWords: words(d.body),
155
+ snippetText: `${d.desc}\n${d.body}`,
156
+ };
157
+ });
158
+ // IDF per query term: df = docs containing it (any field), idf = ln(N/df) — a term in every doc scores 0,
159
+ // a rare one carries the rank. Read from the corpus, not hand-set.
160
+ const N = docs.length;
161
+ const avgBodyLen = docs.reduce((a, n) => a + n.bodyWords.length, 0) / (N || 1);
162
+ const avgDescLen = docs.reduce((a, n) => a + n.descWords.length, 0) / (N || 1);
163
+ const idf = {};
164
+ for (const t of qterms) {
165
+ let df = 0;
166
+ for (const n of docs) {
167
+ if (n.nameWords.some((w) => nameMatch(t, w)) || n.descWords.some((w) => textMatch(t, w)) || n.bodyWords.some((w) => textMatch(t, w)))
168
+ df++;
169
+ }
170
+ idf[t] = df > 0 ? Math.log(N / df) : 0;
171
+ }
172
+ const scored = [];
173
+ for (const n of docs) {
174
+ let score = 0;
175
+ // cap EACH term's contribution at W_NAME_PREFIX: idf and BM25 order the tiers WITHIN this ceiling, but no
176
+ // single query term may out-score a full name hit. A many-word question should be answered by the node
177
+ // that matches it BROADLY, not by one that spikes on a single rare word it happens to carry in its NAME
178
+ // (a `spex search`-named node swallowing "…searches specs…", an injected-* node swallowing "injected…") —
179
+ // the corpus-growth failure where one uncapped idf×name term buried a node matching more of the query.
180
+ for (const t of qterms)
181
+ score += Math.min(tierWeight(t, n, avgBodyLen, avgDescLen) * idf[t], W_NAME_PREFIX);
182
+ if (score <= 0)
183
+ continue;
184
+ scored.push({ ref: n.ref, score: Math.round(score * 100) / 100, snippet: snippetFor(n.snippetText, n.desc, qterms) });
185
+ }
186
+ scored.sort((a, b) => b.score - a.score); // stable: equal scores keep the caller's pre-sorted input order
187
+ return scored.slice(0, limit);
188
+ }
@@ -0,0 +1,6 @@
1
+ import type { Server as HttpServer } from 'node:http';
2
+ export interface ReaperOptions {
3
+ headerMs?: number;
4
+ idleMs?: number;
5
+ }
6
+ export declare function installConnectionReaper(server: HttpServer, opts?: ReaperOptions): void;
@@ -0,0 +1,81 @@
1
+ import { Server as TlsServer } from 'node:tls';
2
+ const STATE = Symbol('spexcode.reaper');
3
+ function resolveMs(explicit, env, fallback) {
4
+ if (typeof explicit === 'number' && explicit > 0)
5
+ return explicit;
6
+ const n = Number(env);
7
+ return Number.isFinite(n) && n > 0 ? n : fallback;
8
+ }
9
+ // Attach the reaper to a Node http/https server. Call it right after the server is created (before or just
10
+ // after listen); it hooks the socket-birth event ('connection', or 'secureConnection' on TLS servers),
11
+ // 'request' and 'upgrade', and needs no changes to the request handlers.
12
+ export function installConnectionReaper(server, opts = {}) {
13
+ const headerMs = resolveMs(opts.headerMs, process.env.SPEXCODE_REAP_HEADER_MS, 30000);
14
+ const idleMs = resolveMs(opts.idleMs, process.env.SPEXCODE_REAP_IDLE_MS, 15000);
15
+ // claim single ownership of the phases the reaper covers (see header comment): Node's overlapping
16
+ // timeouts would otherwise race these deadlines and silently cap the env knobs. `requestTimeout` is
17
+ // deliberately LEFT at Node's default (~5 min): it bounds the in-flight request-body phase the reaper
18
+ // exempts (a silently-abandoned mid-body upload has no other reaper), and 5 min shadows no sane knob.
19
+ server.headersTimeout = 0;
20
+ server.keepAliveTimeout = 0;
21
+ // per-socket tracking, on the SAME socket object 'request'/'upgrade' will report (see header comment).
22
+ const track = (socket) => {
23
+ const state = {
24
+ timer: undefined, active: 0, upgraded: false,
25
+ disarm() { if (state.timer) {
26
+ clearTimeout(state.timer);
27
+ state.timer = undefined;
28
+ } },
29
+ arm(ms) { state.disarm(); state.timer = setTimeout(() => socket.destroy(), ms); state.timer.unref?.(); },
30
+ };
31
+ socket[STATE] = state;
32
+ state.arm(headerMs); // slow-loris guard: first request's headers must complete within headerMs
33
+ socket.once('close', state.disarm); // socket gone → drop its pending timer
34
+ };
35
+ if (server instanceof TlsServer) {
36
+ // TLS: requests report the TLSSocket, so that is where the deadline must live. The raw phase before the
37
+ // handshake completes still needs a guard of its own; the 4-tuple key hands it off to the TLSSocket.
38
+ const pendingHandshake = new Map();
39
+ server.on('connection', (raw) => {
40
+ const key = `${raw.remoteAddress}:${raw.remotePort}`;
41
+ const timer = setTimeout(() => raw.destroy(), headerMs);
42
+ timer.unref?.();
43
+ const done = () => { clearTimeout(timer); pendingHandshake.delete(key); };
44
+ pendingHandshake.set(key, done);
45
+ raw.once('close', done);
46
+ });
47
+ server.on('secureConnection', (tlsSocket) => {
48
+ pendingHandshake.get(`${tlsSocket.remoteAddress}:${tlsSocket.remotePort}`)?.();
49
+ track(tlsSocket);
50
+ });
51
+ }
52
+ else {
53
+ server.on('connection', track);
54
+ }
55
+ server.on('request', (req, res) => {
56
+ const s = req.socket[STATE];
57
+ if (!s)
58
+ return;
59
+ s.active++;
60
+ s.disarm(); // a request is in flight — never reap an active request/response
61
+ let ended = false;
62
+ const done = () => {
63
+ if (ended)
64
+ return;
65
+ ended = true;
66
+ s.active--;
67
+ // response over and nothing else in flight → this is now an idle keep-alive socket; re-arm.
68
+ if (s.active === 0 && !s.upgraded && !req.socket.destroyed)
69
+ s.arm(idleMs);
70
+ };
71
+ res.once('finish', done); // response fully sent
72
+ res.once('close', done); // response aborted / connection dropped
73
+ });
74
+ server.on('upgrade', (req) => {
75
+ const s = req.socket[STATE];
76
+ if (s) {
77
+ s.upgraded = true;
78
+ s.disarm();
79
+ } // persistent stream — exempt for its lifetime
80
+ });
81
+ }
@@ -0,0 +1,189 @@
1
+ import { type SessionEvalOrderRow, type SessionEvals } from '@spexcode/spec-eval/sessioneval';
2
+ import { evalTimeline } from '@spexcode/spec-eval/evaltab';
3
+ export declare const REVIEW_PER_PAGE = 25;
4
+ type ReviewItem = Record<string, unknown>;
5
+ export type ReviewCount = number | Record<string, number>;
6
+ type ReviewOption = {
7
+ value: string;
8
+ label?: string;
9
+ count?: number;
10
+ };
11
+ type ReviewFacet = {
12
+ key: string;
13
+ label?: string;
14
+ value: string;
15
+ meaningful?: boolean;
16
+ options: ReviewOption[];
17
+ };
18
+ type EvalNeighbor = {
19
+ node: string;
20
+ scenario: string;
21
+ state: string;
22
+ };
23
+ export type PagedReview<T extends ReviewItem = ReviewItem> = {
24
+ items: T[];
25
+ page: number;
26
+ perPage: number;
27
+ total: number;
28
+ sourceTotal: number;
29
+ pageCount: number;
30
+ prev: number | null;
31
+ next: number | null;
32
+ revision: string;
33
+ counts: Record<string, ReviewCount>;
34
+ facets: Record<string, ReviewFacet>;
35
+ section: {
36
+ key: string;
37
+ value: string;
38
+ options: ReviewOption[];
39
+ } | null;
40
+ };
41
+ export type EvalDetailReview = {
42
+ scope: string | null;
43
+ requestedScope: string | null;
44
+ scopeFallback: 'trunk' | null;
45
+ availability: 'measured' | 'unmeasured' | 'missing';
46
+ selected: ReviewItem | null;
47
+ history: ReviewItem[];
48
+ neighbors: {
49
+ prev: EvalNeighbor[];
50
+ next: EvalNeighbor[];
51
+ total: number;
52
+ index: number | null;
53
+ order: 'default';
54
+ };
55
+ revision: string;
56
+ summary?: SessionEvals['summary'];
57
+ evalRevision?: SessionEvals['evalRevision'];
58
+ };
59
+ type EvalDetailMetadata = {
60
+ scope?: string | null;
61
+ requestedScope?: string | null;
62
+ scopeFallback?: 'trunk' | null;
63
+ summary?: SessionEvals['summary'];
64
+ evalRevision?: SessionEvals['evalRevision'];
65
+ sequence?: {
66
+ node: string;
67
+ scenario: string;
68
+ }[];
69
+ };
70
+ export declare function reviewPageNumber(value: unknown): number;
71
+ export declare function paginateReview<T extends ReviewItem>(source: T[], shown: T[], model: any, requestedPage: unknown, revisionInputs: unknown): PagedReview<T>;
72
+ export declare function issuesReview(query: string | undefined, requestedPage: unknown): Promise<{
73
+ items: any[];
74
+ page: number;
75
+ perPage: number;
76
+ total: number;
77
+ sourceTotal: number;
78
+ pageCount: number;
79
+ prev: number | null;
80
+ next: number | null;
81
+ revision: string;
82
+ counts: Record<string, ReviewCount>;
83
+ facets: Record<string, ReviewFacet>;
84
+ section: {
85
+ key: string;
86
+ value: string;
87
+ options: ReviewOption[];
88
+ } | null;
89
+ enabled: boolean;
90
+ stores: import("./issues.js").IssueStore[];
91
+ }>;
92
+ export declare function trunkEvalReviewItems(nodes: any[]): ReviewItem[];
93
+ export declare function scopedEvalReviewItems(model: SessionEvals): ReviewItem[];
94
+ export declare function boundedEvalNeighbors(sequence: {
95
+ node: string;
96
+ scenario: string;
97
+ }[], node: string, scenario: string, stateOf: (row: {
98
+ node: string;
99
+ scenario: string;
100
+ }) => string, want?: number): {
101
+ prev: never[];
102
+ next: never[];
103
+ total: number;
104
+ index: null;
105
+ order: "default";
106
+ } | {
107
+ prev: EvalNeighbor[];
108
+ next: EvalNeighbor[];
109
+ total: number;
110
+ index: number;
111
+ order: "default";
112
+ };
113
+ export declare function projectEvalDetail(items: ReviewItem[], historySource: ReviewItem[], node: string, scenario: string, metadata?: EvalDetailMetadata): EvalDetailReview;
114
+ export declare function measuredSequence(order: SessionEvalOrderRow[]): {
115
+ node: string;
116
+ scenario: string;
117
+ }[];
118
+ export declare function focusNodes(order: SessionEvalOrderRow[], node: string, scenario: string): string[];
119
+ export declare function evalDetailReview(node: string, scenario: string, scope?: string | null): Promise<EvalDetailReview>;
120
+ export declare function timelineEvalReviewItems(timeline: Awaited<ReturnType<typeof evalTimeline>>, node: string): ReviewItem[];
121
+ export declare function evalsReview(query: string | undefined, requestedPage: unknown, options?: {
122
+ view?: string;
123
+ }): Promise<{
124
+ items: ReviewItem[];
125
+ page: number;
126
+ perPage: number;
127
+ total: number;
128
+ sourceTotal: number;
129
+ pageCount: number;
130
+ prev: number | null;
131
+ next: number | null;
132
+ revision: string;
133
+ counts: Record<string, ReviewCount>;
134
+ facets: Record<string, ReviewFacet>;
135
+ section: {
136
+ key: string;
137
+ value: string;
138
+ options: ReviewOption[];
139
+ } | null;
140
+ scope: null;
141
+ view: string;
142
+ node: any;
143
+ hasEvalFile: boolean;
144
+ gates: never[];
145
+ unknown: number;
146
+ } | {
147
+ items: ReviewItem[];
148
+ page: number;
149
+ perPage: number;
150
+ total: number;
151
+ sourceTotal: number;
152
+ pageCount: number;
153
+ prev: number | null;
154
+ next: number | null;
155
+ revision: string;
156
+ counts: Record<string, ReviewCount>;
157
+ facets: Record<string, ReviewFacet>;
158
+ section: {
159
+ key: string;
160
+ value: string;
161
+ options: ReviewOption[];
162
+ } | null;
163
+ scope: any;
164
+ gates: never[];
165
+ unknown: number;
166
+ summary: import("@spexcode/spec-eval/sessioneval").SessionEvalSummary | undefined;
167
+ evalRevision: import("@spexcode/spec-eval/sessioneval").SessionEvalRevision;
168
+ } | {
169
+ items: ReviewItem[];
170
+ page: number;
171
+ perPage: number;
172
+ total: number;
173
+ sourceTotal: number;
174
+ pageCount: number;
175
+ prev: number | null;
176
+ next: number | null;
177
+ revision: string;
178
+ counts: Record<string, ReviewCount>;
179
+ facets: Record<string, ReviewFacet>;
180
+ section: {
181
+ key: string;
182
+ value: string;
183
+ options: ReviewOption[];
184
+ } | null;
185
+ scope: null;
186
+ gates: never[];
187
+ unknown: number;
188
+ } | null>;
189
+ export {};