spexcode 0.6.2 → 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 (479) hide show
  1. package/README.md +3 -1
  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} +36 -32
  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 +1 -1
  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/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec-first.sh +1 -1
  167. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec-of-file.sh +1 -0
  168. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/spec.md +2 -2
  169. package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +31 -29
  170. package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +94 -0
  171. package/node_modules/@spexcode/spec-core/dist/anchors.js +730 -0
  172. package/node_modules/@spexcode/spec-core/dist/git.d.ts +166 -0
  173. package/node_modules/@spexcode/spec-core/dist/git.js +2736 -0
  174. package/node_modules/@spexcode/spec-core/dist/graph-delta.d.ts +44 -0
  175. package/node_modules/@spexcode/spec-core/dist/graph-delta.js +72 -0
  176. package/node_modules/@spexcode/spec-core/dist/graph.d.ts +34 -0
  177. package/node_modules/@spexcode/spec-core/dist/graph.js +237 -0
  178. package/node_modules/@spexcode/spec-core/dist/graphDelta.d.ts +3 -0
  179. package/node_modules/@spexcode/spec-core/dist/graphDelta.js +13 -0
  180. package/node_modules/@spexcode/spec-core/dist/harness-identity.d.ts +31 -0
  181. package/node_modules/@spexcode/spec-core/dist/harness-identity.js +20 -0
  182. package/node_modules/@spexcode/spec-core/dist/identity-presets.d.ts +152 -0
  183. package/node_modules/@spexcode/spec-core/dist/identity-presets.js +132 -0
  184. package/node_modules/@spexcode/spec-core/dist/index.d.ts +45 -0
  185. package/node_modules/@spexcode/spec-core/dist/index.js +19 -0
  186. package/node_modules/@spexcode/spec-core/dist/layout.d.ts +183 -0
  187. package/node_modules/@spexcode/spec-core/dist/layout.js +548 -0
  188. package/node_modules/@spexcode/spec-core/dist/process-identity.d.ts +37 -0
  189. package/node_modules/@spexcode/spec-core/dist/process-identity.js +214 -0
  190. package/node_modules/@spexcode/spec-core/dist/project-identity.d.ts +12 -0
  191. package/node_modules/@spexcode/spec-core/dist/project-identity.js +71 -0
  192. package/node_modules/@spexcode/spec-core/dist/project-store.d.ts +3 -0
  193. package/node_modules/@spexcode/spec-core/dist/project-store.js +14 -0
  194. package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +2 -0
  195. package/node_modules/@spexcode/spec-core/dist/resilience.js +40 -0
  196. package/node_modules/@spexcode/spec-core/dist/review/index.d.ts +3 -0
  197. package/node_modules/@spexcode/spec-core/dist/review/index.js +5 -0
  198. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +77 -0
  199. package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +308 -0
  200. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +66 -0
  201. package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +180 -0
  202. package/node_modules/@spexcode/spec-core/dist/review/session.d.ts +4 -0
  203. package/node_modules/@spexcode/spec-core/dist/review/session.js +8 -0
  204. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.d.ts +15 -0
  205. package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.js +12 -0
  206. package/node_modules/@spexcode/spec-core/dist/root-lru.d.ts +4 -0
  207. package/{spec-cli/src/root-lru.ts → node_modules/@spexcode/spec-core/dist/root-lru.js} +26 -30
  208. package/node_modules/@spexcode/spec-core/dist/specs.d.ts +117 -0
  209. package/node_modules/@spexcode/spec-core/dist/specs.js +489 -0
  210. package/node_modules/@spexcode/spec-core/package.json +28 -0
  211. package/node_modules/@spexcode/spec-eval/dist/cache.d.ts +10 -0
  212. package/node_modules/@spexcode/spec-eval/dist/cache.js +50 -0
  213. package/node_modules/@spexcode/spec-eval/dist/cli.d.ts +22 -0
  214. package/node_modules/@spexcode/spec-eval/dist/cli.js +981 -0
  215. package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +98 -0
  216. package/node_modules/@spexcode/spec-eval/dist/evaltab.js +176 -0
  217. package/node_modules/@spexcode/spec-eval/dist/filing.d.ts +16 -0
  218. package/node_modules/@spexcode/spec-eval/dist/filing.js +36 -0
  219. package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +48 -0
  220. package/node_modules/@spexcode/spec-eval/dist/freshness.js +799 -0
  221. package/node_modules/@spexcode/spec-eval/dist/host.d.ts +46 -0
  222. package/node_modules/@spexcode/spec-eval/dist/host.js +53 -0
  223. package/node_modules/@spexcode/spec-eval/dist/humanok.d.ts +11 -0
  224. package/node_modules/@spexcode/spec-eval/dist/humanok.js +27 -0
  225. package/node_modules/@spexcode/spec-eval/dist/index.d.ts +4 -0
  226. package/node_modules/@spexcode/spec-eval/dist/index.js +4 -0
  227. package/node_modules/@spexcode/spec-eval/dist/remarks.d.ts +31 -0
  228. package/node_modules/@spexcode/spec-eval/dist/remarks.js +1 -0
  229. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.d.ts +13 -0
  230. package/node_modules/@spexcode/spec-eval/dist/scenariofresh.js +303 -0
  231. package/node_modules/@spexcode/spec-eval/dist/scenarios.d.ts +99 -0
  232. package/node_modules/@spexcode/spec-eval/dist/scenarios.js +650 -0
  233. package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +307 -0
  234. package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +1883 -0
  235. package/node_modules/@spexcode/spec-eval/dist/sidecar.d.ts +55 -0
  236. package/node_modules/@spexcode/spec-eval/dist/sidecar.js +82 -0
  237. package/node_modules/@spexcode/spec-eval/dist/timeline.d.ts +25 -0
  238. package/node_modules/@spexcode/spec-eval/dist/timeline.js +65 -0
  239. package/node_modules/@spexcode/spec-eval/dist/ui-path.d.ts +1 -0
  240. package/node_modules/@spexcode/spec-eval/dist/ui-path.js +2 -0
  241. package/node_modules/@spexcode/spec-eval/package.json +36 -0
  242. package/node_modules/@spexcode/spec-forge/dist/cache.d.ts +29 -0
  243. package/node_modules/@spexcode/spec-forge/dist/cache.js +59 -0
  244. package/node_modules/@spexcode/spec-forge/dist/cli.d.ts +1 -0
  245. package/node_modules/@spexcode/spec-forge/dist/cli.js +100 -0
  246. package/node_modules/@spexcode/spec-forge/dist/drivers/github.d.ts +2 -0
  247. package/node_modules/@spexcode/spec-forge/dist/drivers/github.js +116 -0
  248. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.d.ts +7 -0
  249. package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.js +144 -0
  250. package/node_modules/@spexcode/spec-forge/dist/drivers.d.ts +10 -0
  251. package/node_modules/@spexcode/spec-forge/dist/drivers.js +83 -0
  252. package/node_modules/@spexcode/spec-forge/dist/index.d.ts +4 -0
  253. package/node_modules/@spexcode/spec-forge/dist/index.js +4 -0
  254. package/node_modules/@spexcode/spec-forge/dist/links.d.ts +15 -0
  255. package/node_modules/@spexcode/spec-forge/dist/links.js +65 -0
  256. package/node_modules/@spexcode/spec-forge/dist/needs-eval.d.ts +10 -0
  257. package/node_modules/@spexcode/spec-forge/dist/needs-eval.js +20 -0
  258. package/node_modules/@spexcode/spec-forge/dist/port.d.ts +53 -0
  259. package/node_modules/@spexcode/spec-forge/dist/port.js +1 -0
  260. package/node_modules/@spexcode/spec-forge/dist/resident.d.ts +7 -0
  261. package/node_modules/@spexcode/spec-forge/dist/resident.js +43 -0
  262. package/node_modules/@spexcode/spec-forge/package.json +32 -0
  263. package/package.json +33 -19
  264. package/spec-cli/bin/spex.mjs +0 -69
  265. package/spec-cli/src/anchors.ts +0 -728
  266. package/spec-cli/src/attach.ts +0 -43
  267. package/spec-cli/src/claude-headless.ts +0 -321
  268. package/spec-cli/src/cli.ts +0 -1258
  269. package/spec-cli/src/client.ts +0 -414
  270. package/spec-cli/src/cockpit.ts +0 -43
  271. package/spec-cli/src/codex-runtime-generations.ts +0 -646
  272. package/spec-cli/src/commit-surgery.ts +0 -68
  273. package/spec-cli/src/contract-filter.ts +0 -202
  274. package/spec-cli/src/delivery-queue.ts +0 -165
  275. package/spec-cli/src/doctor.ts +0 -516
  276. package/spec-cli/src/execution-trace.ts +0 -444
  277. package/spec-cli/src/file-write.ts +0 -22
  278. package/spec-cli/src/gateway-auth.ts +0 -181
  279. package/spec-cli/src/gateway-hub.ts +0 -358
  280. package/spec-cli/src/gateway.ts +0 -461
  281. package/spec-cli/src/git.ts +0 -2556
  282. package/spec-cli/src/graph.ts +0 -271
  283. package/spec-cli/src/graphCache.ts +0 -710
  284. package/spec-cli/src/graphDelta.ts +0 -77
  285. package/spec-cli/src/graphStream.ts +0 -1019
  286. package/spec-cli/src/harness-select.ts +0 -77
  287. package/spec-cli/src/harness.ts +0 -3025
  288. package/spec-cli/src/headless-controller.ts +0 -63
  289. package/spec-cli/src/help.ts +0 -492
  290. package/spec-cli/src/host-resources.ts +0 -762
  291. package/spec-cli/src/host.ts +0 -611
  292. package/spec-cli/src/identity-presets.d.ts +0 -13
  293. package/spec-cli/src/identity-presets.js +0 -138
  294. package/spec-cli/src/index.ts +0 -818
  295. package/spec-cli/src/init.ts +0 -258
  296. package/spec-cli/src/issues-cli.ts +0 -276
  297. package/spec-cli/src/issues.ts +0 -237
  298. package/spec-cli/src/layout.ts +0 -640
  299. package/spec-cli/src/lint.ts +0 -488
  300. package/spec-cli/src/localIssues.ts +0 -538
  301. package/spec-cli/src/materialize.ts +0 -417
  302. package/spec-cli/src/mentions.ts +0 -81
  303. package/spec-cli/src/opencode-headless.ts +0 -205
  304. package/spec-cli/src/pi-headless.ts +0 -153
  305. package/spec-cli/src/plugin-harness.ts +0 -157
  306. package/spec-cli/src/process-identity.ts +0 -207
  307. package/spec-cli/src/project-identity.ts +0 -73
  308. package/spec-cli/src/project-store.ts +0 -17
  309. package/spec-cli/src/pty-bridge.ts +0 -396
  310. package/spec-cli/src/pty-helper.mjs +0 -96
  311. package/spec-cli/src/pty-native-helper.mjs +0 -22
  312. package/spec-cli/src/ranker.ts +0 -191
  313. package/spec-cli/src/reaper.ts +0 -125
  314. package/spec-cli/src/resilience.ts +0 -41
  315. package/spec-cli/src/reviewSnapshot.ts +0 -28
  316. package/spec-cli/src/reviews.ts +0 -434
  317. package/spec-cli/src/runtime-guard.ts +0 -35
  318. package/spec-cli/src/runtime-ownership.ts +0 -88
  319. package/spec-cli/src/search.bench.mjs +0 -80
  320. package/spec-cli/src/search.ts +0 -63
  321. package/spec-cli/src/session-cursors.ts +0 -91
  322. package/spec-cli/src/session-execution.ts +0 -68
  323. package/spec-cli/src/session-files.ts +0 -121
  324. package/spec-cli/src/session-follow.ts +0 -182
  325. package/spec-cli/src/session-reparent.ts +0 -33
  326. package/spec-cli/src/session-timeline.ts +0 -247
  327. package/spec-cli/src/session-web.ts +0 -135
  328. package/spec-cli/src/sessions.ts +0 -3883
  329. package/spec-cli/src/sh.ts +0 -3
  330. package/spec-cli/src/slash-commands.ts +0 -318
  331. package/spec-cli/src/source-files.ts +0 -104
  332. package/spec-cli/src/specs.ts +0 -498
  333. package/spec-cli/src/supervise.ts +0 -245
  334. package/spec-cli/src/tree.ts +0 -118
  335. package/spec-cli/src/tsx-bin.ts +0 -18
  336. package/spec-cli/src/uninstall.ts +0 -171
  337. package/spec-cli/src/uploads.ts +0 -253
  338. package/spec-cli/src/worktree-sources.ts +0 -42
  339. package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +0 -8
  340. package/spec-dashboard/dist/assets/App-B6IbFbGu.js +0 -2
  341. package/spec-dashboard/dist/assets/Dashboard-C5ap-Sga.css +0 -1
  342. package/spec-dashboard/dist/assets/Dashboard-_sDk7Rcg.js +0 -27
  343. package/spec-dashboard/dist/assets/EvalsPage-BT357Lyt.js +0 -2
  344. package/spec-dashboard/dist/assets/IssuesPage-BG9rNOgV.js +0 -1
  345. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  346. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  347. package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  348. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  349. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  350. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  351. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  352. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  353. package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  354. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  355. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  356. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  357. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  358. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  359. package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  360. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  361. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  362. package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  363. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  364. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  365. package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  366. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  367. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  368. package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  369. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  370. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  371. package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  372. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  373. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  374. package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  375. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  376. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  377. package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  378. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  379. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  380. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  381. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  382. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  383. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  384. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  385. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  386. package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  387. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  388. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  389. package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  390. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  391. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  392. package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  393. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  394. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  395. package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  396. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  397. package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  398. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  399. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  400. package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  401. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  402. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  403. package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  404. package/spec-dashboard/dist/assets/MobileApp-D9yPMR3A.js +0 -2
  405. package/spec-dashboard/dist/assets/Modal-B3EcgeA3.js +0 -1
  406. package/spec-dashboard/dist/assets/PageScroll-CNZOugWV.js +0 -1
  407. package/spec-dashboard/dist/assets/ProjectsPage-C2CRHmvs.js +0 -1
  408. package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +0 -32
  409. package/spec-dashboard/dist/assets/SessionInterface-DOEjuT3l.js +0 -40
  410. package/spec-dashboard/dist/assets/SessionWindow-1nYgZ4CL.js +0 -1
  411. package/spec-dashboard/dist/assets/Settings-7WeTJn0V.js +0 -1
  412. package/spec-dashboard/dist/assets/Thread-CEbzAFQn.js +0 -13
  413. package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +0 -1
  414. package/spec-dashboard/dist/assets/data-SlvxNA2r.js +0 -1
  415. package/spec-dashboard/dist/assets/index-DLVeOHL-.js +0 -41
  416. package/spec-dashboard/dist/assets/index-DYLGfPjx.css +0 -1
  417. package/spec-dashboard/dist/assets/launch-Cp579UoJ.css +0 -1
  418. package/spec-dashboard/dist/assets/launch-yxCYr64x.js +0 -276
  419. package/spec-dashboard/dist/assets/sessionSurface--7l69h4F.js +0 -1
  420. package/spec-dashboard/dist/index.html +0 -29
  421. package/spec-dashboard/src/reviewFilters.js +0 -322
  422. package/spec-dashboard/src/reviewQuery.js +0 -174
  423. package/spec-dashboard/src/session.js +0 -199
  424. package/spec-eval/src/cache.ts +0 -57
  425. package/spec-eval/src/cli.ts +0 -894
  426. package/spec-eval/src/evaltab.ts +0 -264
  427. package/spec-eval/src/filing.ts +0 -39
  428. package/spec-eval/src/freshness.ts +0 -836
  429. package/spec-eval/src/humanok.ts +0 -28
  430. package/spec-eval/src/scenariofresh.ts +0 -244
  431. package/spec-eval/src/scenarios.ts +0 -672
  432. package/spec-eval/src/sessioneval.ts +0 -2220
  433. package/spec-eval/src/sidecar.ts +0 -93
  434. package/spec-eval/src/timeline.ts +0 -54
  435. package/spec-forge/src/__fixtures__/github-forge.json +0 -63
  436. package/spec-forge/src/cache.ts +0 -66
  437. package/spec-forge/src/cli.ts +0 -99
  438. package/spec-forge/src/drivers/github.ts +0 -132
  439. package/spec-forge/src/drivers/gitlab.ts +0 -153
  440. package/spec-forge/src/drivers.ts +0 -73
  441. package/spec-forge/src/links.ts +0 -72
  442. package/spec-forge/src/needs-eval.ts +0 -29
  443. package/spec-forge/src/port.ts +0 -36
  444. package/spec-forge/src/resident.ts +0 -46
  445. /package/{spec-cli → node_modules/@spexcode/spec-cli}/README.md +0 -0
  446. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -0
  447. /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-sed-v0.fixture +0 -0
  448. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/commit-msg +0 -0
  449. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-checkout +0 -0
  450. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-merge +0 -0
  451. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/pre-commit +0 -0
  452. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/prepare-commit-msg +0 -0
  453. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/reference-transaction +0 -0
  454. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/extract/spec.md +0 -0
  455. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/regroup/spec.md +0 -0
  456. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/rename/spec.md +0 -0
  457. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/spec.md +0 -0
  458. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/tidy/spec.md +0 -0
  459. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/comment-altitude/spec.md +0 -0
  460. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/idle.sh +0 -0
  461. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/spec.md +0 -0
  462. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/mark-active.sh +0 -0
  463. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/spec.md +0 -0
  464. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/fail.sh +0 -0
  465. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/spec.md +0 -0
  466. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec.md +0 -0
  467. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec.md +0 -0
  468. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec.md +0 -0
  469. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +0 -0
  470. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/forge-link/spec.md +0 -0
  471. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +0 -0
  472. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +0 -0
  473. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/spec.md +0 -0
  474. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/digest.mjs +0 -0
  475. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/spec.md +0 -0
  476. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/spec.md +0 -0
  477. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/spec.md +0 -0
  478. /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/spec.md +0 -0
  479. /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 {};