@interf/compiler 0.22.2 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/README.md +119 -282
  2. package/dist/bin-mcp.d.ts +2 -0
  3. package/dist/bin-mcp.js +63 -0
  4. package/dist/bin-runtime.d.ts +2 -0
  5. package/dist/bin-runtime.js +111 -0
  6. package/dist/cli/commands/agents.js +4 -35
  7. package/dist/cli/commands/auth.d.ts +20 -0
  8. package/dist/cli/commands/auth.js +161 -0
  9. package/dist/cli/commands/benchmark.d.ts +9 -0
  10. package/dist/cli/commands/benchmark.js +58 -0
  11. package/dist/cli/commands/build-plan.js +107 -139
  12. package/dist/cli/commands/build.d.ts +3 -4
  13. package/dist/cli/commands/build.js +16 -45
  14. package/dist/cli/commands/doctor.js +3 -3
  15. package/dist/cli/commands/graphs.d.ts +2 -0
  16. package/dist/cli/commands/graphs.js +344 -0
  17. package/dist/cli/commands/login.js +4 -6
  18. package/dist/cli/commands/logout.js +1 -1
  19. package/dist/cli/commands/mcp.d.ts +4 -2
  20. package/dist/cli/commands/mcp.js +846 -232
  21. package/dist/cli/commands/project.d.ts +2 -0
  22. package/dist/cli/commands/project.js +176 -0
  23. package/dist/cli/commands/reset.d.ts +3 -4
  24. package/dist/cli/commands/reset.js +10 -31
  25. package/dist/cli/commands/runs.js +136 -57
  26. package/dist/cli/commands/runtime.d.ts +24 -0
  27. package/dist/cli/commands/runtime.js +373 -0
  28. package/dist/cli/commands/status.d.ts +1 -0
  29. package/dist/cli/commands/status.js +35 -45
  30. package/dist/cli/commands/traces.d.ts +2 -0
  31. package/dist/cli/commands/traces.js +97 -0
  32. package/dist/cli/commands/wizard.js +171 -178
  33. package/dist/cli/index.d.ts +7 -4
  34. package/dist/cli/index.js +13 -7
  35. package/dist/cli/lib/http-client.d.ts +39 -0
  36. package/dist/cli/lib/http-client.js +73 -0
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.js +2 -2
  39. package/dist/packages/build-plans/authoring/brief.d.ts +538 -0
  40. package/dist/packages/build-plans/authoring/brief.js +89 -0
  41. package/dist/packages/build-plans/authoring/build-plan-authoring.d.ts +52 -11
  42. package/dist/packages/build-plans/authoring/build-plan-authoring.js +493 -46
  43. package/dist/packages/build-plans/authoring/build-plan-edit-session.d.ts +10 -1
  44. package/dist/packages/build-plans/authoring/build-plan-edit-session.js +27 -4
  45. package/dist/packages/build-plans/authoring/build-plan-improvement.d.ts +9 -6
  46. package/dist/packages/build-plans/authoring/build-plan-improvement.js +97 -46
  47. package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.d.ts +1 -0
  48. package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.js +7 -7
  49. package/dist/packages/build-plans/build-plan-resolution.d.ts +1 -1
  50. package/dist/packages/build-plans/build-plan-resolution.js +3 -3
  51. package/dist/packages/build-plans/index.d.ts +1 -1
  52. package/dist/packages/build-plans/index.js +1 -1
  53. package/dist/packages/build-plans/package/build-plan-definitions.d.ts +14 -13
  54. package/dist/packages/build-plans/package/build-plan-definitions.js +45 -42
  55. package/dist/packages/build-plans/package/build-plan-helpers.d.ts +3 -2
  56. package/dist/packages/build-plans/package/build-plan-helpers.js +27 -13
  57. package/dist/packages/build-plans/package/build-plan-review-paths.d.ts +5 -5
  58. package/dist/packages/build-plans/package/build-plan-review-paths.js +15 -15
  59. package/dist/packages/build-plans/package/build-plan-stage-runner.d.ts +5 -4
  60. package/dist/packages/build-plans/package/build-plan-stage-runner.js +23 -11
  61. package/dist/packages/build-plans/package/builtin-build-plan.d.ts +7 -8
  62. package/dist/packages/build-plans/package/builtin-build-plan.js +10 -11
  63. package/dist/packages/build-plans/package/context-interface.d.ts +14 -9
  64. package/dist/packages/build-plans/package/context-interface.js +14 -33
  65. package/dist/packages/build-plans/package/interf-build-plan-package.d.ts +6 -17
  66. package/dist/packages/build-plans/package/interf-build-plan-package.js +68 -64
  67. package/dist/packages/build-plans/package/local-build-plans.d.ts +21 -14
  68. package/dist/packages/build-plans/package/local-build-plans.js +105 -55
  69. package/dist/packages/build-plans/package/user-build-plans.js +1 -1
  70. package/dist/packages/contracts/index.d.ts +5 -2
  71. package/dist/packages/contracts/index.js +3 -1
  72. package/dist/packages/contracts/lib/context-graph-layer.d.ts +161 -0
  73. package/dist/packages/contracts/lib/context-graph-layer.js +216 -0
  74. package/dist/packages/contracts/lib/project-paths.d.ts +144 -0
  75. package/dist/packages/contracts/lib/project-paths.js +220 -0
  76. package/dist/packages/contracts/lib/project-schema.d.ts +423 -0
  77. package/dist/packages/contracts/lib/project-schema.js +138 -0
  78. package/dist/packages/contracts/lib/schema.d.ts +1273 -81
  79. package/dist/packages/contracts/lib/schema.js +675 -79
  80. package/dist/packages/contracts/utils/filesystem.d.ts +1 -0
  81. package/dist/packages/contracts/utils/filesystem.js +29 -1
  82. package/dist/packages/contracts/utils/parse.js +67 -0
  83. package/dist/packages/projects/index.d.ts +6 -0
  84. package/dist/packages/{project → projects}/index.js +0 -3
  85. package/dist/packages/{project → projects}/interf-detect.d.ts +12 -12
  86. package/dist/packages/{project → projects}/interf-detect.js +56 -50
  87. package/dist/packages/projects/interf.d.ts +2 -0
  88. package/dist/packages/projects/interf.js +1 -0
  89. package/dist/packages/projects/lib/schema.d.ts +77 -0
  90. package/dist/packages/projects/lib/schema.js +91 -0
  91. package/dist/packages/projects/source-config.d.ts +53 -0
  92. package/dist/packages/projects/source-config.js +339 -0
  93. package/dist/packages/projects/source-folders.d.ts +11 -0
  94. package/dist/packages/{project → projects}/source-folders.js +26 -26
  95. package/dist/packages/{engine → runtime}/action-planner.d.ts +1 -1
  96. package/dist/packages/{engine → runtime}/action-planner.js +20 -22
  97. package/dist/packages/runtime/action-values.d.ts +1 -0
  98. package/dist/packages/runtime/action-values.js +1 -0
  99. package/dist/packages/runtime/actions/errors.d.ts +2 -0
  100. package/dist/packages/runtime/actions/errors.js +12 -0
  101. package/dist/packages/runtime/actions/fields.d.ts +86 -0
  102. package/dist/packages/runtime/actions/form-builders.d.ts +14 -0
  103. package/dist/packages/runtime/actions/form-builders.js +667 -0
  104. package/dist/packages/runtime/actions/form-validators.d.ts +8 -0
  105. package/dist/packages/runtime/actions/form-validators.js +134 -0
  106. package/dist/packages/runtime/actions/helpers.d.ts +11 -0
  107. package/dist/packages/runtime/actions/helpers.js +80 -0
  108. package/dist/packages/runtime/actions/index.d.ts +8 -0
  109. package/dist/packages/runtime/actions/index.js +11 -0
  110. package/dist/packages/runtime/actions/registry.d.ts +64 -0
  111. package/dist/packages/runtime/actions/registry.js +62 -0
  112. package/dist/packages/runtime/actions/requests.d.ts +45 -0
  113. package/dist/packages/runtime/actions/requests.js +164 -0
  114. package/dist/packages/runtime/actions/schemas.d.ts +161 -0
  115. package/dist/packages/runtime/actions/schemas.js +37 -0
  116. package/dist/packages/runtime/agent-handoff.d.ts +11 -0
  117. package/dist/packages/runtime/agent-handoff.js +102 -0
  118. package/dist/packages/{engine → runtime}/agents/index.d.ts +1 -2
  119. package/dist/packages/{engine → runtime}/agents/index.js +1 -2
  120. package/dist/packages/runtime/agents/lib/args.d.ts +14 -0
  121. package/dist/packages/runtime/agents/lib/args.js +24 -0
  122. package/dist/packages/{engine → runtime}/agents/lib/constants.d.ts +4 -1
  123. package/dist/packages/runtime/agents/lib/constants.js +13 -0
  124. package/dist/packages/runtime/agents/lib/context-graph-bootstrap.d.ts +3 -0
  125. package/dist/packages/{engine/agents/lib/verifiable-context-bootstrap.js → runtime/agents/lib/context-graph-bootstrap.js} +5 -6
  126. package/dist/packages/{engine → runtime}/agents/lib/detection.d.ts +5 -0
  127. package/dist/packages/{engine → runtime}/agents/lib/detection.js +16 -7
  128. package/dist/packages/{engine → runtime}/agents/lib/execution-profile.d.ts +14 -0
  129. package/dist/packages/{engine → runtime}/agents/lib/execution-profile.js +31 -14
  130. package/dist/packages/{engine → runtime}/agents/lib/execution.js +22 -6
  131. package/dist/packages/{engine → runtime}/agents/lib/executors.d.ts +1 -0
  132. package/dist/packages/{engine → runtime}/agents/lib/executors.js +11 -2
  133. package/dist/packages/runtime/agents/lib/logs.d.ts +12 -0
  134. package/dist/packages/runtime/agents/lib/logs.js +41 -0
  135. package/dist/packages/{engine → runtime}/agents/lib/preflight.js +19 -14
  136. package/dist/packages/runtime/agents/lib/render.d.ts +26 -0
  137. package/dist/packages/{engine → runtime}/agents/lib/render.js +48 -22
  138. package/dist/packages/runtime/agents/lib/shell-fs.d.ts +18 -0
  139. package/dist/packages/runtime/agents/lib/shell-fs.js +190 -0
  140. package/dist/packages/runtime/agents/lib/shell-paths.d.ts +16 -0
  141. package/dist/packages/runtime/agents/lib/shell-paths.js +63 -0
  142. package/dist/packages/runtime/agents/lib/shell-projection.d.ts +25 -0
  143. package/dist/packages/runtime/agents/lib/shell-projection.js +314 -0
  144. package/dist/packages/runtime/agents/lib/shell-templates.d.ts +30 -0
  145. package/dist/packages/runtime/agents/lib/shell-templates.js +494 -0
  146. package/dist/packages/runtime/agents/lib/shell-workspace.d.ts +17 -0
  147. package/dist/packages/runtime/agents/lib/shell-workspace.js +70 -0
  148. package/dist/packages/runtime/agents/lib/shells.d.ts +92 -0
  149. package/dist/packages/runtime/agents/lib/shells.js +509 -0
  150. package/dist/packages/runtime/agents/lib/source-context-scan.d.ts +10 -0
  151. package/dist/packages/runtime/agents/lib/source-context-scan.js +388 -0
  152. package/dist/packages/{engine → runtime}/agents/lib/status.js +1 -14
  153. package/dist/packages/runtime/agents/lib/string-utils.d.ts +16 -0
  154. package/dist/packages/runtime/agents/lib/string-utils.js +36 -0
  155. package/dist/packages/{engine → runtime}/agents/lib/types.d.ts +1 -0
  156. package/dist/packages/{engine → runtime}/agents/lib/user-config.d.ts +8 -2
  157. package/dist/packages/{engine → runtime}/agents/lib/user-config.js +8 -2
  158. package/dist/packages/runtime/agents/providers/claude-code.d.ts +13 -0
  159. package/dist/packages/runtime/agents/providers/claude-code.js +45 -0
  160. package/dist/packages/runtime/agents/providers/codex.d.ts +17 -0
  161. package/dist/packages/runtime/agents/providers/codex.js +66 -0
  162. package/dist/packages/runtime/agents/providers/cursor.d.ts +9 -0
  163. package/dist/packages/runtime/agents/providers/cursor.js +24 -0
  164. package/dist/packages/runtime/agents/providers/index.d.ts +9 -0
  165. package/dist/packages/runtime/agents/providers/index.js +31 -0
  166. package/dist/packages/runtime/agents/providers/types.d.ts +50 -0
  167. package/dist/packages/{engine → runtime}/agents/registry.d.ts +13 -2
  168. package/dist/packages/{engine → runtime}/agents/registry.js +48 -10
  169. package/dist/packages/{engine → runtime}/agents/role-executors.d.ts +1 -1
  170. package/dist/packages/{engine → runtime}/agents/role-executors.js +9 -7
  171. package/dist/packages/{engine → runtime}/agents/role-router.js +7 -5
  172. package/dist/packages/runtime/auth/account-context.d.ts +52 -0
  173. package/dist/packages/runtime/auth/account-context.js +68 -0
  174. package/dist/packages/runtime/auth/auth-flow.d.ts +73 -0
  175. package/dist/packages/runtime/auth/auth-flow.js +189 -0
  176. package/dist/packages/runtime/auth/jwt-validator.d.ts +58 -0
  177. package/dist/packages/runtime/auth/jwt-validator.js +86 -0
  178. package/dist/packages/runtime/auth/keychain.d.ts +35 -0
  179. package/dist/packages/runtime/auth/keychain.js +85 -0
  180. package/dist/packages/runtime/auth/session-store.d.ts +38 -0
  181. package/dist/packages/runtime/auth/session-store.js +96 -0
  182. package/dist/packages/runtime/auth/workos-client.d.ts +58 -0
  183. package/dist/packages/runtime/auth/workos-client.js +87 -0
  184. package/dist/packages/runtime/benchmark-question-draft.d.ts +23 -0
  185. package/dist/packages/runtime/benchmark-question-draft.js +153 -0
  186. package/dist/packages/runtime/build/artifact-counts.d.ts +1 -0
  187. package/dist/packages/{engine → runtime}/build/artifact-counts.js +5 -9
  188. package/dist/packages/{engine → runtime}/build/artifact-status.d.ts +6 -6
  189. package/dist/packages/{engine → runtime}/build/artifact-status.js +26 -24
  190. package/dist/packages/runtime/build/atomic-fs.d.ts +3 -0
  191. package/dist/packages/runtime/build/atomic-fs.js +95 -0
  192. package/dist/packages/runtime/build/billing-events.d.ts +78 -0
  193. package/dist/packages/{engine → runtime}/build/billing-events.js +17 -19
  194. package/dist/packages/runtime/build/build-evidence.d.ts +16 -0
  195. package/dist/packages/runtime/build/build-evidence.js +179 -0
  196. package/dist/packages/{engine → runtime}/build/build-pipeline.d.ts +12 -8
  197. package/dist/packages/runtime/build/build-pipeline.js +388 -0
  198. package/dist/packages/{engine → runtime}/build/build-plan-primitives.d.ts +1 -1
  199. package/dist/packages/{engine → runtime}/build/build-plan-primitives.js +0 -1
  200. package/dist/packages/runtime/build/build-plan-runs.d.ts +14 -0
  201. package/dist/packages/runtime/build/build-plan-runs.js +31 -0
  202. package/dist/packages/runtime/build/build-stage-plan.d.ts +16 -0
  203. package/dist/packages/runtime/build/build-stage-plan.js +101 -0
  204. package/dist/packages/{engine → runtime}/build/build-stage-runner.d.ts +2 -1
  205. package/dist/packages/runtime/build/build-stage-runner.js +302 -0
  206. package/dist/packages/{engine → runtime}/build/build-target.d.ts +7 -4
  207. package/dist/packages/runtime/build/build-target.js +40 -0
  208. package/dist/packages/{engine → runtime}/build/check-evaluator.d.ts +14 -16
  209. package/dist/packages/runtime/build/check-evaluator.js +1226 -0
  210. package/dist/packages/runtime/build/context-graph-paths.d.ts +64 -0
  211. package/dist/packages/runtime/build/context-graph-paths.js +160 -0
  212. package/dist/packages/runtime/build/context-graph-schema.d.ts +19 -0
  213. package/dist/packages/runtime/build/context-graph-schema.js +39 -0
  214. package/dist/packages/{engine → runtime}/build/discovery.d.ts +2 -2
  215. package/dist/packages/{engine → runtime}/build/discovery.js +4 -4
  216. package/dist/packages/{engine → runtime}/build/index.d.ts +7 -5
  217. package/dist/packages/{engine → runtime}/build/index.js +7 -5
  218. package/dist/packages/runtime/build/inspect-map.d.ts +10 -0
  219. package/dist/packages/runtime/build/inspect-map.js +270 -0
  220. package/dist/packages/{engine → runtime}/build/lib/schema.d.ts +449 -123
  221. package/dist/packages/runtime/build/lib/schema.js +494 -0
  222. package/dist/packages/runtime/build/native-entrypoint.d.ts +2 -0
  223. package/dist/packages/runtime/build/native-entrypoint.js +286 -0
  224. package/dist/packages/runtime/build/reset.d.ts +2 -0
  225. package/dist/packages/runtime/build/reset.js +62 -0
  226. package/dist/packages/{engine → runtime}/build/runtime-contracts.js +13 -7
  227. package/dist/packages/runtime/build/runtime-inventory.d.ts +7 -0
  228. package/dist/packages/{engine → runtime}/build/runtime-inventory.js +3 -3
  229. package/dist/packages/runtime/build/runtime-log-paths.d.ts +3 -0
  230. package/dist/packages/runtime/build/runtime-log-paths.js +16 -0
  231. package/dist/packages/{engine → runtime}/build/runtime-prompt.js +12 -9
  232. package/dist/packages/{engine → runtime}/build/runtime-reconcile.d.ts +1 -1
  233. package/dist/packages/{engine → runtime}/build/runtime-reconcile.js +25 -21
  234. package/dist/packages/runtime/build/runtime-runs.d.ts +10 -0
  235. package/dist/packages/runtime/build/runtime-runs.js +318 -0
  236. package/dist/packages/{engine → runtime}/build/runtime-types.d.ts +9 -6
  237. package/dist/packages/runtime/build/runtime-types.js +1 -0
  238. package/dist/packages/runtime/build/runtime.d.ts +8 -0
  239. package/dist/packages/runtime/build/runtime.js +7 -0
  240. package/dist/packages/runtime/build/source-files.d.ts +58 -0
  241. package/dist/packages/runtime/build/source-files.js +193 -0
  242. package/dist/packages/runtime/build/source-inventory.d.ts +28 -0
  243. package/dist/packages/runtime/build/source-inventory.js +512 -0
  244. package/dist/packages/runtime/build/source-manifest.d.ts +63 -0
  245. package/dist/packages/runtime/build/source-manifest.js +220 -0
  246. package/dist/packages/runtime/build/stage-evidence.d.ts +22 -0
  247. package/dist/packages/runtime/build/stage-evidence.js +386 -0
  248. package/dist/packages/runtime/build/stage-manifest.d.ts +45 -0
  249. package/dist/packages/runtime/build/stage-manifest.js +1125 -0
  250. package/dist/packages/runtime/build/stage-reuse.d.ts +11 -0
  251. package/dist/packages/runtime/build/stage-reuse.js +154 -0
  252. package/dist/packages/runtime/build/stage-session.d.ts +81 -0
  253. package/dist/packages/runtime/build/stage-session.js +308 -0
  254. package/dist/packages/runtime/build/state-artifacts.d.ts +9 -0
  255. package/dist/packages/runtime/build/state-artifacts.js +14 -0
  256. package/dist/packages/runtime/build/state-health.d.ts +4 -0
  257. package/dist/packages/{engine → runtime}/build/state-health.js +21 -26
  258. package/dist/packages/runtime/build/state-io.d.ts +12 -0
  259. package/dist/packages/runtime/build/state-io.js +118 -0
  260. package/dist/packages/runtime/build/state-view.d.ts +5 -0
  261. package/dist/packages/runtime/build/state-view.js +121 -0
  262. package/dist/packages/runtime/build/state.d.ts +7 -0
  263. package/dist/packages/runtime/build/state.js +12 -0
  264. package/dist/packages/runtime/build/summary-coverage-index.d.ts +21 -0
  265. package/dist/packages/runtime/build/summary-coverage-index.js +189 -0
  266. package/dist/packages/runtime/build/traces.d.ts +30 -0
  267. package/dist/packages/runtime/build/traces.js +133 -0
  268. package/dist/packages/{engine/build/validate-verifiable-context.d.ts → runtime/build/validate-context-graph.d.ts} +6 -6
  269. package/dist/packages/{engine/build/validate-verifiable-context.js → runtime/build/validate-context-graph.js} +49 -36
  270. package/dist/packages/{engine → runtime}/build/validate.d.ts +5 -5
  271. package/dist/packages/{engine → runtime}/build/validate.js +26 -26
  272. package/dist/packages/{engine → runtime}/client.d.ts +18 -18
  273. package/dist/packages/{engine → runtime}/client.js +48 -36
  274. package/dist/packages/{engine → runtime}/connection-config.d.ts +3 -2
  275. package/dist/packages/{engine → runtime}/connection-config.js +9 -8
  276. package/dist/packages/runtime/context-checks.d.ts +10 -0
  277. package/dist/packages/runtime/context-checks.js +127 -0
  278. package/dist/packages/runtime/context-graph-scaffold.d.ts +9 -0
  279. package/dist/packages/runtime/context-graph-scaffold.js +135 -0
  280. package/dist/packages/runtime/context-graph-semantic-graph.d.ts +9 -0
  281. package/dist/packages/runtime/context-graph-semantic-graph.js +416 -0
  282. package/dist/packages/runtime/entitlement-guard.d.ts +43 -0
  283. package/dist/packages/runtime/entitlement-guard.js +70 -0
  284. package/dist/packages/{engine → runtime}/execution/index.d.ts +2 -2
  285. package/dist/packages/{engine → runtime}/execution/index.js +1 -1
  286. package/dist/packages/{engine → runtime}/execution/lib/schema.d.ts +272 -191
  287. package/dist/packages/{engine → runtime}/execution/lib/schema.js +35 -32
  288. package/dist/packages/runtime/index.d.ts +29 -0
  289. package/dist/packages/runtime/index.js +21 -0
  290. package/dist/packages/runtime/instance-paths.d.ts +30 -0
  291. package/dist/packages/runtime/instance-paths.js +29 -0
  292. package/dist/packages/runtime/native-run-handlers.d.ts +63 -0
  293. package/dist/packages/{engine → runtime}/native-run-handlers.js +217 -166
  294. package/dist/packages/runtime/plan-artifact-contract.d.ts +17 -0
  295. package/dist/packages/runtime/plan-artifact-contract.js +42 -0
  296. package/dist/packages/runtime/project-entries.d.ts +11 -0
  297. package/dist/packages/runtime/project-entries.js +49 -0
  298. package/dist/packages/runtime/project-source-state.d.ts +26 -0
  299. package/dist/packages/runtime/project-source-state.js +56 -0
  300. package/dist/packages/runtime/project-store.d.ts +90 -0
  301. package/dist/packages/runtime/project-store.js +195 -0
  302. package/dist/packages/runtime/requested-artifacts.d.ts +7 -0
  303. package/dist/packages/{engine → runtime}/requested-artifacts.js +23 -1
  304. package/dist/packages/{engine → runtime}/run-observability.d.ts +2 -1
  305. package/dist/packages/{engine → runtime}/run-observability.js +174 -87
  306. package/dist/packages/runtime/runtime-action-proposals.d.ts +7 -0
  307. package/dist/packages/runtime/runtime-action-proposals.js +542 -0
  308. package/dist/packages/runtime/runtime-build-plans.d.ts +5 -0
  309. package/dist/packages/runtime/runtime-build-plans.js +175 -0
  310. package/dist/packages/runtime/runtime-build-runs.d.ts +47 -0
  311. package/dist/packages/runtime/runtime-build-runs.js +555 -0
  312. package/dist/packages/runtime/runtime-caches.d.ts +117 -0
  313. package/dist/packages/runtime/runtime-caches.js +266 -0
  314. package/dist/packages/{engine → runtime}/runtime-event-applier.d.ts +3 -1
  315. package/dist/packages/{engine → runtime}/runtime-event-applier.js +53 -17
  316. package/dist/packages/runtime/runtime-executor.d.ts +22 -0
  317. package/dist/packages/runtime/runtime-executor.js +131 -0
  318. package/dist/packages/runtime/runtime-jobs.d.ts +13 -0
  319. package/dist/packages/runtime/runtime-jobs.js +463 -0
  320. package/dist/packages/runtime/runtime-observability.d.ts +11 -0
  321. package/dist/packages/runtime/runtime-observability.js +39 -0
  322. package/dist/packages/{engine → runtime}/runtime-persistence.d.ts +9 -18
  323. package/dist/packages/{engine → runtime}/runtime-persistence.js +25 -25
  324. package/dist/packages/runtime/runtime-project-mutations.d.ts +7 -0
  325. package/dist/packages/runtime/runtime-project-mutations.js +65 -0
  326. package/dist/packages/runtime/runtime-project-reads.d.ts +18 -0
  327. package/dist/packages/runtime/runtime-project-reads.js +574 -0
  328. package/dist/packages/runtime/runtime-proposal-helpers.d.ts +22 -0
  329. package/dist/packages/runtime/runtime-proposal-helpers.js +223 -0
  330. package/dist/packages/{engine → runtime}/runtime-resource-builders.d.ts +23 -16
  331. package/dist/packages/{engine → runtime}/runtime-resource-builders.js +58 -46
  332. package/dist/packages/runtime/runtime-status.d.ts +14 -0
  333. package/dist/packages/runtime/runtime-status.js +15 -0
  334. package/dist/packages/runtime/runtime-verify-runs.d.ts +84 -0
  335. package/dist/packages/runtime/runtime-verify-runs.js +296 -0
  336. package/dist/packages/runtime/runtime.d.ts +1582 -0
  337. package/dist/packages/runtime/runtime.js +431 -0
  338. package/dist/packages/runtime/schemas/actions.d.ts +1206 -0
  339. package/dist/packages/runtime/schemas/actions.js +117 -0
  340. package/dist/packages/runtime/schemas/agents.d.ts +104 -0
  341. package/dist/packages/runtime/schemas/agents.js +74 -0
  342. package/dist/packages/runtime/schemas/build-plans.d.ts +1132 -0
  343. package/dist/packages/runtime/schemas/build-plans.js +141 -0
  344. package/dist/packages/runtime/schemas/context-graphs.d.ts +1522 -0
  345. package/dist/packages/runtime/schemas/context-graphs.js +110 -0
  346. package/dist/packages/runtime/schemas/files.d.ts +227 -0
  347. package/dist/packages/runtime/schemas/files.js +28 -0
  348. package/dist/packages/runtime/schemas/index.d.ts +9 -0
  349. package/dist/packages/runtime/schemas/index.js +13 -0
  350. package/dist/packages/runtime/schemas/instance.d.ts +141 -0
  351. package/dist/packages/runtime/schemas/instance.js +143 -0
  352. package/dist/packages/runtime/schemas/jobs.d.ts +339 -0
  353. package/dist/packages/runtime/schemas/jobs.js +107 -0
  354. package/dist/packages/runtime/schemas/projects.d.ts +366 -0
  355. package/dist/packages/runtime/schemas/projects.js +160 -0
  356. package/dist/packages/runtime/schemas/runs.d.ts +3445 -0
  357. package/dist/packages/runtime/schemas/runs.js +115 -0
  358. package/dist/packages/runtime/service/index.d.ts +3 -0
  359. package/dist/packages/runtime/service/index.js +3 -0
  360. package/dist/packages/runtime/service/openapi.d.ts +7 -0
  361. package/dist/packages/runtime/service/openapi.js +118 -0
  362. package/dist/packages/runtime/service/operations.d.ts +3011 -0
  363. package/dist/packages/runtime/service/operations.js +375 -0
  364. package/dist/packages/runtime/service/routes.d.ts +114 -0
  365. package/dist/packages/runtime/service/routes.js +128 -0
  366. package/dist/packages/runtime/service/server-api-files.d.ts +10 -0
  367. package/dist/packages/runtime/service/server-api-files.js +85 -0
  368. package/dist/packages/runtime/service/server-app-boot.d.ts +4 -0
  369. package/dist/packages/runtime/service/server-app-boot.js +46 -0
  370. package/dist/packages/runtime/service/server-guards.d.ts +63 -0
  371. package/dist/packages/runtime/service/server-guards.js +181 -0
  372. package/dist/packages/runtime/service/server-helpers.d.ts +38 -0
  373. package/dist/packages/runtime/service/server-helpers.js +108 -0
  374. package/dist/packages/runtime/service/server-instance-helpers.d.ts +30 -0
  375. package/dist/packages/runtime/service/server-instance-helpers.js +114 -0
  376. package/dist/packages/runtime/service/server-routes-action-proposals.d.ts +3 -0
  377. package/dist/packages/runtime/service/server-routes-action-proposals.js +45 -0
  378. package/dist/packages/runtime/service/server-routes-agents.d.ts +4 -0
  379. package/dist/packages/runtime/service/server-routes-agents.js +132 -0
  380. package/dist/packages/runtime/service/server-routes-auth.d.ts +33 -0
  381. package/dist/packages/runtime/service/server-routes-auth.js +138 -0
  382. package/dist/packages/runtime/service/server-routes-build-plans.d.ts +3 -0
  383. package/dist/packages/runtime/service/server-routes-build-plans.js +86 -0
  384. package/dist/packages/runtime/service/server-routes-discovery.d.ts +4 -0
  385. package/dist/packages/runtime/service/server-routes-discovery.js +196 -0
  386. package/dist/packages/runtime/service/server-routes-events.d.ts +5 -0
  387. package/dist/packages/runtime/service/server-routes-events.js +99 -0
  388. package/dist/packages/runtime/service/server-routes-project-context.d.ts +9 -0
  389. package/dist/packages/runtime/service/server-routes-project-context.js +287 -0
  390. package/dist/packages/runtime/service/server-routes-project-jobs.d.ts +9 -0
  391. package/dist/packages/runtime/service/server-routes-project-jobs.js +137 -0
  392. package/dist/packages/runtime/service/server-routes-project-runs.d.ts +14 -0
  393. package/dist/packages/runtime/service/server-routes-project-runs.js +88 -0
  394. package/dist/packages/runtime/service/server-routes-projects.d.ts +4 -0
  395. package/dist/packages/runtime/service/server-routes-projects.js +96 -0
  396. package/dist/packages/runtime/service/server-routes-runs.d.ts +3 -0
  397. package/dist/packages/runtime/service/server-routes-runs.js +119 -0
  398. package/dist/packages/runtime/service/server.d.ts +37 -0
  399. package/dist/packages/runtime/service/server.js +300 -0
  400. package/dist/packages/{engine → runtime/service}/service-registry.d.ts +5 -5
  401. package/dist/packages/{engine → runtime/service}/service-registry.js +7 -7
  402. package/dist/packages/runtime/verify/benchmark-run.d.ts +81 -0
  403. package/dist/packages/runtime/verify/benchmark-run.js +303 -0
  404. package/dist/packages/{engine → runtime}/verify/index.d.ts +2 -2
  405. package/dist/packages/{engine → runtime}/verify/index.js +1 -1
  406. package/dist/packages/{engine → runtime}/verify/lib/schema.d.ts +83 -16
  407. package/dist/packages/{engine → runtime}/verify/lib/schema.js +38 -18
  408. package/dist/packages/runtime/verify/test-file-guard.d.ts +2 -0
  409. package/dist/packages/runtime/verify/test-file-guard.js +29 -0
  410. package/dist/packages/{engine → runtime}/verify/verify-execution.d.ts +7 -0
  411. package/dist/packages/{engine → runtime}/verify/verify-execution.js +119 -45
  412. package/dist/packages/{engine → runtime}/verify/verify-paths.d.ts +5 -4
  413. package/dist/packages/runtime/verify/verify-paths.js +65 -0
  414. package/dist/packages/{engine → runtime}/verify/verify-sandbox.d.ts +1 -1
  415. package/dist/packages/runtime/verify/verify-sandbox.js +88 -0
  416. package/dist/packages/{engine → runtime}/verify/verify-specs.d.ts +2 -0
  417. package/dist/packages/runtime/verify/verify-specs.js +126 -0
  418. package/dist/packages/runtime/verify/verify-targets.d.ts +5 -0
  419. package/dist/packages/{engine → runtime}/verify/verify-targets.js +12 -12
  420. package/dist/packages/runtime/verify/verify-types.js +1 -0
  421. package/dist/packages/{engine → runtime}/verify/verify.d.ts +1 -1
  422. package/dist/packages/{engine → runtime}/verify/verify.js +1 -1
  423. package/dist/packages/runtime/wire-schemas.d.ts +18 -0
  424. package/dist/packages/runtime/wire-schemas.js +27 -0
  425. package/package.json +32 -30
  426. package/public-repo/CONTRIBUTING.md +16 -18
  427. package/public-repo/README.md +119 -282
  428. package/public-repo/SECURITY.md +3 -4
  429. package/public-repo/build-plans/interf-default/README.md +24 -16
  430. package/public-repo/build-plans/interf-default/build/stages/entrypoint/SKILL.md +74 -0
  431. package/public-repo/build-plans/interf-default/build/stages/knowledge/SKILL.md +95 -0
  432. package/public-repo/build-plans/interf-default/build/stages/summarize/SKILL.md +49 -4
  433. package/public-repo/build-plans/interf-default/build-plan.json +49 -39
  434. package/public-repo/build-plans/interf-default/build-plan.schema.json +59 -33
  435. package/public-repo/build-plans/interf-default/improve/SKILL.md +3 -3
  436. package/public-repo/build-plans/interf-default/use/query/SKILL.md +18 -11
  437. package/public-repo/openapi/local-service.openapi.json +14227 -0
  438. package/public-repo/skills/interf/SKILL.md +508 -187
  439. package/dist/cli/commands/prep.d.ts +0 -2
  440. package/dist/cli/commands/prep.js +0 -240
  441. package/dist/cli/commands/test.d.ts +0 -10
  442. package/dist/cli/commands/test.js +0 -85
  443. package/dist/cli/commands/web.d.ts +0 -2
  444. package/dist/cli/commands/web.js +0 -286
  445. package/dist/interf-ui/404.html +0 -1
  446. package/dist/interf-ui/__next.__PAGE__.txt +0 -10
  447. package/dist/interf-ui/__next._full.txt +0 -20
  448. package/dist/interf-ui/__next._head.txt +0 -5
  449. package/dist/interf-ui/__next._index.txt +0 -5
  450. package/dist/interf-ui/__next._tree.txt +0 -5
  451. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_buildManifest.js +0 -11
  452. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_clientMiddlewareManifest.js +0 -1
  453. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_ssgManifest.js +0 -1
  454. package/dist/interf-ui/_next/static/chunks/0.tjb6f4golw..css +0 -3
  455. package/dist/interf-ui/_next/static/chunks/03~yq9q893hmn.js +0 -1
  456. package/dist/interf-ui/_next/static/chunks/085-n_jv2ng_q.css +0 -1
  457. package/dist/interf-ui/_next/static/chunks/0dn41fa_zvgsl.js +0 -1
  458. package/dist/interf-ui/_next/static/chunks/0g-ea0zj5d-0k.js +0 -1
  459. package/dist/interf-ui/_next/static/chunks/0gwqglc4iz583.js +0 -1
  460. package/dist/interf-ui/_next/static/chunks/0haldgm65ve6l.js +0 -1
  461. package/dist/interf-ui/_next/static/chunks/0nv3am99vjzn4.js +0 -1
  462. package/dist/interf-ui/_next/static/chunks/0s77gt_o4jwtx.js +0 -1
  463. package/dist/interf-ui/_next/static/chunks/0y5z3t-z1c8ks.js.map +0 -5
  464. package/dist/interf-ui/_next/static/chunks/0~a36ujuzpaz..js +0 -116
  465. package/dist/interf-ui/_next/static/chunks/10jeodxe4nkgj.js +0 -31
  466. package/dist/interf-ui/_next/static/chunks/119h2rouych2t.js +0 -1
  467. package/dist/interf-ui/_next/static/chunks/13c8b~m8knjsf.js +0 -1
  468. package/dist/interf-ui/_next/static/chunks/14dznb2qpt-ho.js +0 -91
  469. package/dist/interf-ui/_next/static/chunks/15z_en80lrq-3.js +0 -5
  470. package/dist/interf-ui/_next/static/chunks/turbopack-0p.pvcjrtq-jh.js +0 -1
  471. package/dist/interf-ui/_next/static/chunks/turbopack-0usj_75.8frlw.js +0 -1
  472. package/dist/interf-ui/_next/static/chunks/turbopack-worker-0sjn--fhq~1cg.js +0 -1
  473. package/dist/interf-ui/_next/static/media/GeistMono_Variable.p.17jn9btb_52pq.woff2 +0 -0
  474. package/dist/interf-ui/_next/static/media/Geist_Variable-s.p.0-te~ja_gpvcf.woff2 +0 -0
  475. package/dist/interf-ui/_next/static/media/worker.102zas1s52_pf.js +0 -109
  476. package/dist/interf-ui/_not-found/__next._full.txt +0 -15
  477. package/dist/interf-ui/_not-found/__next._head.txt +0 -5
  478. package/dist/interf-ui/_not-found/__next._index.txt +0 -5
  479. package/dist/interf-ui/_not-found/__next._not-found.__PAGE__.txt +0 -5
  480. package/dist/interf-ui/_not-found/__next._not-found.txt +0 -5
  481. package/dist/interf-ui/_not-found/__next._tree.txt +0 -2
  482. package/dist/interf-ui/_not-found.html +0 -1
  483. package/dist/interf-ui/_not-found.txt +0 -15
  484. package/dist/interf-ui/index.html +0 -1
  485. package/dist/interf-ui/index.txt +0 -20
  486. package/dist/packages/contracts/lib/preparation-paths.d.ts +0 -117
  487. package/dist/packages/contracts/lib/preparation-paths.js +0 -177
  488. package/dist/packages/engine/action-definitions.d.ts +0 -407
  489. package/dist/packages/engine/action-definitions.js +0 -1158
  490. package/dist/packages/engine/action-values.d.ts +0 -1
  491. package/dist/packages/engine/action-values.js +0 -1
  492. package/dist/packages/engine/agents/lib/args.d.ts +0 -4
  493. package/dist/packages/engine/agents/lib/args.js +0 -52
  494. package/dist/packages/engine/agents/lib/chart-guidance.d.ts +0 -1
  495. package/dist/packages/engine/agents/lib/chart-guidance.js +0 -8
  496. package/dist/packages/engine/agents/lib/constants.js +0 -28
  497. package/dist/packages/engine/agents/lib/logs.d.ts +0 -2
  498. package/dist/packages/engine/agents/lib/logs.js +0 -17
  499. package/dist/packages/engine/agents/lib/render.d.ts +0 -8
  500. package/dist/packages/engine/agents/lib/schema.d.ts +0 -8
  501. package/dist/packages/engine/agents/lib/schema.js +0 -7
  502. package/dist/packages/engine/agents/lib/shells.d.ts +0 -74
  503. package/dist/packages/engine/agents/lib/shells.js +0 -1052
  504. package/dist/packages/engine/agents/lib/verifiable-context-bootstrap.d.ts +0 -3
  505. package/dist/packages/engine/build/artifact-counts.d.ts +0 -1
  506. package/dist/packages/engine/build/billing-events.d.ts +0 -89
  507. package/dist/packages/engine/build/build-pipeline.js +0 -175
  508. package/dist/packages/engine/build/build-plan-runs.d.ts +0 -14
  509. package/dist/packages/engine/build/build-plan-runs.js +0 -31
  510. package/dist/packages/engine/build/build-stage-plan.d.ts +0 -16
  511. package/dist/packages/engine/build/build-stage-plan.js +0 -100
  512. package/dist/packages/engine/build/build-stage-runner.js +0 -94
  513. package/dist/packages/engine/build/build-target.js +0 -16
  514. package/dist/packages/engine/build/check-evaluator.js +0 -298
  515. package/dist/packages/engine/build/lib/schema.js +0 -316
  516. package/dist/packages/engine/build/reset.d.ts +0 -2
  517. package/dist/packages/engine/build/reset.js +0 -74
  518. package/dist/packages/engine/build/runtime-inventory.d.ts +0 -7
  519. package/dist/packages/engine/build/runtime-paths.d.ts +0 -8
  520. package/dist/packages/engine/build/runtime-paths.js +0 -26
  521. package/dist/packages/engine/build/runtime-runs.d.ts +0 -10
  522. package/dist/packages/engine/build/runtime-runs.js +0 -224
  523. package/dist/packages/engine/build/runtime.d.ts +0 -5
  524. package/dist/packages/engine/build/runtime.js +0 -4
  525. package/dist/packages/engine/build/source-files.d.ts +0 -46
  526. package/dist/packages/engine/build/source-files.js +0 -149
  527. package/dist/packages/engine/build/state-artifacts.d.ts +0 -9
  528. package/dist/packages/engine/build/state-artifacts.js +0 -14
  529. package/dist/packages/engine/build/state-health.d.ts +0 -4
  530. package/dist/packages/engine/build/state-io.d.ts +0 -11
  531. package/dist/packages/engine/build/state-io.js +0 -82
  532. package/dist/packages/engine/build/state-paths.d.ts +0 -5
  533. package/dist/packages/engine/build/state-paths.js +0 -16
  534. package/dist/packages/engine/build/state-view.d.ts +0 -5
  535. package/dist/packages/engine/build/state-view.js +0 -94
  536. package/dist/packages/engine/build/state.d.ts +0 -7
  537. package/dist/packages/engine/build/state.js +0 -12
  538. package/dist/packages/engine/build/validate-helpers.d.ts +0 -12
  539. package/dist/packages/engine/build/validate-helpers.js +0 -41
  540. package/dist/packages/engine/build/verifiable-context-paths.d.ts +0 -47
  541. package/dist/packages/engine/build/verifiable-context-paths.js +0 -121
  542. package/dist/packages/engine/build/verifiable-context-schema.d.ts +0 -21
  543. package/dist/packages/engine/build/verifiable-context-schema.js +0 -126
  544. package/dist/packages/engine/cloud-seams.d.ts +0 -115
  545. package/dist/packages/engine/cloud-seams.js +0 -84
  546. package/dist/packages/engine/index.d.ts +0 -22
  547. package/dist/packages/engine/index.js +0 -15
  548. package/dist/packages/engine/instance-paths.d.ts +0 -106
  549. package/dist/packages/engine/instance-paths.js +0 -171
  550. package/dist/packages/engine/lib/schema.d.ts +0 -6304
  551. package/dist/packages/engine/lib/schema.js +0 -730
  552. package/dist/packages/engine/native-run-handlers.d.ts +0 -25
  553. package/dist/packages/engine/preparation-store.d.ts +0 -105
  554. package/dist/packages/engine/preparation-store.js +0 -213
  555. package/dist/packages/engine/readiness-check-draft.d.ts +0 -20
  556. package/dist/packages/engine/readiness-check-draft.js +0 -111
  557. package/dist/packages/engine/requested-artifacts.d.ts +0 -5
  558. package/dist/packages/engine/routes.d.ts +0 -85
  559. package/dist/packages/engine/routes.js +0 -99
  560. package/dist/packages/engine/runtime-caches.d.ts +0 -76
  561. package/dist/packages/engine/runtime-caches.js +0 -191
  562. package/dist/packages/engine/runtime-proposal-helpers.d.ts +0 -35
  563. package/dist/packages/engine/runtime-proposal-helpers.js +0 -247
  564. package/dist/packages/engine/runtime.d.ts +0 -371
  565. package/dist/packages/engine/runtime.js +0 -2463
  566. package/dist/packages/engine/server.d.ts +0 -58
  567. package/dist/packages/engine/server.js +0 -1399
  568. package/dist/packages/engine/verify/readiness-check-run.d.ts +0 -82
  569. package/dist/packages/engine/verify/readiness-check-run.js +0 -265
  570. package/dist/packages/engine/verify/verify-paths.js +0 -61
  571. package/dist/packages/engine/verify/verify-sandbox.js +0 -88
  572. package/dist/packages/engine/verify/verify-specs.js +0 -114
  573. package/dist/packages/engine/verify/verify-targets.d.ts +0 -5
  574. package/dist/packages/engine/wire-schemas.d.ts +0 -547
  575. package/dist/packages/engine/wire-schemas.js +0 -59
  576. package/dist/packages/project/index.d.ts +0 -9
  577. package/dist/packages/project/interf-bootstrap.d.ts +0 -1
  578. package/dist/packages/project/interf-bootstrap.js +0 -1
  579. package/dist/packages/project/interf-scaffold.d.ts +0 -3
  580. package/dist/packages/project/interf-scaffold.js +0 -136
  581. package/dist/packages/project/interf.d.ts +0 -4
  582. package/dist/packages/project/interf.js +0 -3
  583. package/dist/packages/project/lib/schema.d.ts +0 -328
  584. package/dist/packages/project/lib/schema.js +0 -136
  585. package/dist/packages/project/preparation-entries.d.ts +0 -11
  586. package/dist/packages/project/preparation-entries.js +0 -49
  587. package/dist/packages/project/source-config.d.ts +0 -46
  588. package/dist/packages/project/source-config.js +0 -394
  589. package/dist/packages/project/source-folders.d.ts +0 -11
  590. package/public-repo/build-plans/interf-default/build/stages/shape/SKILL.md +0 -27
  591. package/public-repo/build-plans/interf-default/build/stages/structure/SKILL.md +0 -21
  592. package/public-repo/plugins/README.md +0 -9
  593. package/public-repo/plugins/interf/.claude-plugin/plugin.json +0 -21
  594. package/public-repo/plugins/interf/.mcp.json +0 -12
  595. package/public-repo/plugins/interf/README.md +0 -32
  596. package/public-repo/plugins/interf/skills/interf/SKILL.md +0 -376
  597. /package/dist/packages/{engine/agents/lib/types.js → runtime/actions/fields.js} +0 -0
  598. /package/dist/packages/{engine → runtime}/agents/lib/agents.d.ts +0 -0
  599. /package/dist/packages/{engine → runtime}/agents/lib/agents.js +0 -0
  600. /package/dist/packages/{engine → runtime}/agents/lib/execution.d.ts +0 -0
  601. /package/dist/packages/{engine → runtime}/agents/lib/preflight.d.ts +0 -0
  602. /package/dist/packages/{engine → runtime}/agents/lib/status.d.ts +0 -0
  603. /package/dist/packages/{engine/build/runtime-types.js → runtime/agents/lib/types.js} +0 -0
  604. /package/dist/packages/{engine/verify/verify-types.js → runtime/agents/providers/types.js} +0 -0
  605. /package/dist/packages/{engine → runtime}/agents/role-router.d.ts +0 -0
  606. /package/dist/packages/{engine → runtime}/build/build-execution.d.ts +0 -0
  607. /package/dist/packages/{engine → runtime}/build/build-execution.js +0 -0
  608. /package/dist/packages/{engine → runtime}/build/runtime-contracts.d.ts +0 -0
  609. /package/dist/packages/{engine → runtime}/build/runtime-prompt.d.ts +0 -0
  610. /package/dist/packages/{engine → runtime}/execution/adapters.d.ts +0 -0
  611. /package/dist/packages/{engine → runtime}/execution/adapters.js +0 -0
  612. /package/dist/packages/{engine → runtime}/execution/events.d.ts +0 -0
  613. /package/dist/packages/{engine → runtime}/execution/events.js +0 -0
  614. /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.d.ts +0 -0
  615. /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.js +0 -0
  616. /package/dist/packages/{engine → runtime}/verify/verify-types.d.ts +0 -0
@@ -0,0 +1,99 @@
1
+ import { LOCAL_SERVICE_ROUTES } from "./routes.js";
2
+ import { parseRequestUrl, sendError, writeHeaders } from "./server-helpers.js";
3
+ /**
4
+ * `GET /v1/events` — a Server-Sent Events change stream.
5
+ *
6
+ * Every authorized client (Interf Desktop, CLI, MCP host) is a peer of the
7
+ * same local service, so any client's write fans out here to every open
8
+ * renderer. The renderer keeps one `EventSource` open and refreshes on each
9
+ * frame — push, not idle polling. The dispatcher calls `notifyServiceChange`
10
+ * after a successful mutating request (see `server.ts`); the active-run poll
11
+ * still owns in-flight run progress.
12
+ *
13
+ * Auth: browser `EventSource` cannot set an `Authorization` header, so the
14
+ * token rides in `?token=`. The dispatcher exempts this path from the header
15
+ * guard; we validate the query token here against the runtime token.
16
+ */
17
+ // One subscriber set per runtime. A WeakMap keeps multi-runtime test setups
18
+ // isolated and lets sets be GC'd with their runtime — no global leak.
19
+ const subscribers = new WeakMap();
20
+ const KEEPALIVE_INTERVAL_MS = 25_000;
21
+ function subscriberSet(runtime) {
22
+ let set = subscribers.get(runtime);
23
+ if (!set) {
24
+ set = new Set();
25
+ subscribers.set(runtime, set);
26
+ }
27
+ return set;
28
+ }
29
+ /** Constant-time compare of the query token against the runtime token. */
30
+ function isAuthorizedQueryToken(runtime, token) {
31
+ if (!runtime.authToken)
32
+ return true; // tokenless-dev mode
33
+ if (!token || token.length !== runtime.authToken.length)
34
+ return false;
35
+ let mismatch = 0;
36
+ for (let index = 0; index < runtime.authToken.length; index += 1) {
37
+ mismatch |= token.charCodeAt(index) ^ runtime.authToken.charCodeAt(index);
38
+ }
39
+ return mismatch === 0;
40
+ }
41
+ /** Fan a change ping out to every open events stream for this runtime. */
42
+ export function notifyServiceChange(runtime) {
43
+ const set = subscribers.get(runtime);
44
+ if (!set || set.size === 0)
45
+ return;
46
+ const frame = `event: changed\ndata: {"ts":"${new Date().toISOString()}"}\n\n`;
47
+ for (const res of set) {
48
+ try {
49
+ res.write(frame);
50
+ }
51
+ catch {
52
+ // A dead socket is reaped by its own close handler; ignore here.
53
+ }
54
+ }
55
+ }
56
+ export function tryHandleEvents(req, res, runtime, path, method) {
57
+ if (path !== LOCAL_SERVICE_ROUTES.events)
58
+ return false;
59
+ if (method !== "GET")
60
+ return false;
61
+ const url = parseRequestUrl(req);
62
+ if (!isAuthorizedQueryToken(runtime, url.searchParams.get("token"))) {
63
+ sendError(res, 401, "Missing or invalid token.");
64
+ return true;
65
+ }
66
+ // SSE headers (CORS context is merged in by writeHeaders). Connection stays
67
+ // open — no res.end until the client disconnects.
68
+ writeHeaders(res, 200, {
69
+ "content-type": "text/event-stream; charset=utf-8",
70
+ "cache-control": "no-cache, no-transform",
71
+ connection: "keep-alive",
72
+ // Disable proxy buffering so frames flush immediately.
73
+ "x-accel-buffering": "no",
74
+ });
75
+ // Initial sync frame: tells the client to refresh on every (re)connect.
76
+ // EventSource reconnects when the webview wakes, so this is what makes the
77
+ // app fresh "on focus" without any client-side focus listener.
78
+ res.write(`event: sync\ndata: {"ts":"${new Date().toISOString()}"}\n\n`);
79
+ const set = subscriberSet(runtime);
80
+ set.add(res);
81
+ // Keepalive comment so idle connections aren't reaped by the webview/proxy.
82
+ const keepalive = setInterval(() => {
83
+ try {
84
+ res.write(`: keepalive ${Date.now()}\n\n`);
85
+ }
86
+ catch {
87
+ // ignore; close handler cleans up
88
+ }
89
+ }, KEEPALIVE_INTERVAL_MS);
90
+ if (typeof keepalive.unref === "function")
91
+ keepalive.unref();
92
+ const cleanup = () => {
93
+ clearInterval(keepalive);
94
+ set.delete(res);
95
+ };
96
+ req.on("close", cleanup);
97
+ res.on("close", cleanup);
98
+ return true;
99
+ }
@@ -0,0 +1,9 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { ProjectRouteContext } from "./server-routes-project-runs.js";
3
+ import type { LocalServiceRuntime } from "../runtime.js";
4
+ /**
5
+ * Read-only observability over a project: readiness state,
6
+ * source-file inventory, Context Graph locator, file serving
7
+ * inside the Context Graph root, and per-Artifact status.
8
+ */
9
+ export declare function tryHandleProjectContext(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, ctx: ProjectRouteContext, method: string): Promise<boolean>;
@@ -0,0 +1,287 @@
1
+ import { PROJECT_SUBRESOURCES } from "./routes.js";
2
+ import { parseRequestUrl, sendError, sendJson, } from "./server-helpers.js";
3
+ import { isTraversalRelativePath, safeApiFilePath, sendApiFile, } from "./server-api-files.js";
4
+ import { buildTraces } from "../build/traces.js";
5
+ import { loadContextGraphSourceManifest } from "../build/source-manifest.js";
6
+ import { computeProjectSourceState } from "../project-source-state.js";
7
+ /**
8
+ * Read-only observability over a project: readiness state,
9
+ * source-file inventory, Context Graph locator, file serving
10
+ * inside the Context Graph root, and per-Artifact status.
11
+ */
12
+ export async function tryHandleProjectContext(req, res, runtime, ctx, method) {
13
+ const { storedProject, subPath } = ctx;
14
+ if (subPath === PROJECT_SUBRESOURCES.readiness) {
15
+ if (method === "GET") {
16
+ const readiness = runtime.getReadiness(storedProject.projectDataDir, storedProject.id);
17
+ sendJson(res, 200, readiness);
18
+ return true;
19
+ }
20
+ }
21
+ if (subPath === PROJECT_SUBRESOURCES.sourceFiles) {
22
+ if (method === "GET") {
23
+ sendJson(res, 200, {
24
+ source_files: runtime.listSourceFiles(storedProject.projectDataDir, storedProject.id),
25
+ });
26
+ return true;
27
+ }
28
+ }
29
+ if (subPath === PROJECT_SUBRESOURCES.sourceManifest) {
30
+ if (method === "GET") {
31
+ const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
32
+ const manifest = latestContext?.path ? loadContextGraphSourceManifest(latestContext.path) : null;
33
+ if (!manifest)
34
+ sendError(res, 404, "Source Manifest not found.");
35
+ else
36
+ sendJson(res, 200, { source_manifest: manifest });
37
+ return true;
38
+ }
39
+ }
40
+ if (subPath === PROJECT_SUBRESOURCES.contextGraph) {
41
+ if (method === "GET") {
42
+ const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
43
+ if (!context)
44
+ sendError(res, 404, "Context Graph not found.");
45
+ else
46
+ sendJson(res, 200, context);
47
+ return true;
48
+ }
49
+ }
50
+ if (subPath === PROJECT_SUBRESOURCES.graphs) {
51
+ if (method === "GET") {
52
+ sendJson(res, 200, {
53
+ graphs: runtime.listContextGraphs(storedProject.projectDataDir, storedProject.id),
54
+ });
55
+ return true;
56
+ }
57
+ }
58
+ if (subPath.startsWith(`${PROJECT_SUBRESOURCES.graphs}/`)) {
59
+ if (method === "GET") {
60
+ const rawGraphId = subPath.slice(PROJECT_SUBRESOURCES.graphs.length + 1);
61
+ let graphId;
62
+ try {
63
+ graphId = decodeURIComponent(rawGraphId);
64
+ }
65
+ catch {
66
+ sendError(res, 400, "Context Graph id is not valid URI-encoded UTF-8.");
67
+ return true;
68
+ }
69
+ const graph = runtime
70
+ .listContextGraphs(storedProject.projectDataDir, storedProject.id)
71
+ .find((entry) => entry.graph_id === graphId || entry.build_run_id === graphId);
72
+ if (!graph)
73
+ sendError(res, 404, "Context Graph not found.");
74
+ else
75
+ sendJson(res, 200, graph);
76
+ return true;
77
+ }
78
+ }
79
+ if (subPath === PROJECT_SUBRESOURCES.buildEvidence) {
80
+ if (method === "GET") {
81
+ const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
82
+ if (!context?.build_evidence) {
83
+ sendError(res, 404, "Graph diagnostics not found.");
84
+ }
85
+ else {
86
+ sendJson(res, 200, context.build_evidence);
87
+ }
88
+ return true;
89
+ }
90
+ }
91
+ if (subPath === PROJECT_SUBRESOURCES.contextGraphSessions) {
92
+ if (method === "GET") {
93
+ const sessions = runtime.listLatestContextGraphStageSessions(storedProject.projectDataDir, storedProject.id);
94
+ sendJson(res, 200, { sessions });
95
+ return true;
96
+ }
97
+ }
98
+ if (subPath.startsWith(`${PROJECT_SUBRESOURCES.contextGraphSessions}/`)) {
99
+ if (method === "GET") {
100
+ const rawStageRunId = subPath.slice(PROJECT_SUBRESOURCES.contextGraphSessions.length + 1);
101
+ let stageRunId;
102
+ try {
103
+ stageRunId = decodeURIComponent(rawStageRunId);
104
+ }
105
+ catch {
106
+ sendError(res, 400, "Stage execution session id is not valid URI-encoded UTF-8.");
107
+ return true;
108
+ }
109
+ const session = runtime
110
+ .listLatestContextGraphStageSessions(storedProject.projectDataDir, storedProject.id)
111
+ .find((entry) => entry.stage_run_id === stageRunId) ?? null;
112
+ if (!session)
113
+ sendError(res, 404, `Stage execution session not found: ${stageRunId}`);
114
+ else
115
+ sendJson(res, 200, { session });
116
+ return true;
117
+ }
118
+ }
119
+ if (subPath === PROJECT_SUBRESOURCES.contextGraphEntrypoint) {
120
+ if (method === "GET") {
121
+ const handoff = runtime.getContextGraphHandoff(storedProject.projectDataDir, storedProject.id);
122
+ if (!handoff) {
123
+ sendError(res, 404, "Context Graph handoff not found.");
124
+ }
125
+ else {
126
+ sendJson(res, 200, handoff);
127
+ }
128
+ return true;
129
+ }
130
+ }
131
+ // GET /v1/projects/<id>/context-graph/traces — first-class traces surface.
132
+ // Returns a derived Traces wire shape rolled up from the current
133
+ // Context Graph's artifacts + Checks + source file index.
134
+ if (subPath === PROJECT_SUBRESOURCES.traces) {
135
+ if (method === "GET") {
136
+ const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
137
+ if (!project) {
138
+ sendError(res, 404, "Context Graph not found.");
139
+ return true;
140
+ }
141
+ const readiness = runtime.getReadiness(storedProject.projectDataDir, storedProject.id);
142
+ const sourceFiles = runtime.listSourceFiles(storedProject.projectDataDir, storedProject.id);
143
+ const sourceFileCount = Array.isArray(sourceFiles) ? sourceFiles.length : 0;
144
+ const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
145
+ const filesProcessed = context?.build_evidence?.rows
146
+ .find((row) => row.id === "files-processed")
147
+ ?.metric.observed;
148
+ const traces = buildTraces({
149
+ projectId: storedProject.id,
150
+ graphId: project.latest_build_run_id ?? project.runs?.latest_build_run_id ?? "no-graph",
151
+ readiness,
152
+ artifacts: project.artifacts ?? [],
153
+ sourceFileCount,
154
+ filesProcessed,
155
+ });
156
+ sendJson(res, 200, traces);
157
+ return true;
158
+ }
159
+ }
160
+ if (subPath === PROJECT_SUBRESOURCES.contextGraphStages) {
161
+ if (method === "GET") {
162
+ const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
163
+ if (!context) {
164
+ sendError(res, 404, "Context Graph not found.");
165
+ }
166
+ else {
167
+ sendJson(res, 200, {
168
+ stages: context.stage_summaries,
169
+ readiness: context.readiness_rollup,
170
+ primary_metrics: context.primary_metrics,
171
+ });
172
+ }
173
+ return true;
174
+ }
175
+ }
176
+ if (subPath === PROJECT_SUBRESOURCES.contextGraphResources) {
177
+ if (method === "GET") {
178
+ const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
179
+ if (!context) {
180
+ sendError(res, 404, "Context Graph not found.");
181
+ }
182
+ else {
183
+ sendJson(res, 200, {
184
+ resources: context.resources,
185
+ entrypoints: context.entrypoints,
186
+ graph_outputs: context.graph_manifest?.graph_outputs ?? null,
187
+ });
188
+ }
189
+ return true;
190
+ }
191
+ }
192
+ if (subPath.startsWith(`${PROJECT_SUBRESOURCES.contextGraphResources}/`)) {
193
+ if (method === "GET") {
194
+ const rawResourceId = subPath.slice(PROJECT_SUBRESOURCES.contextGraphResources.length + 1);
195
+ let resourceId;
196
+ try {
197
+ resourceId = decodeURIComponent(rawResourceId);
198
+ }
199
+ catch {
200
+ sendError(res, 400, "Resource id is not valid URI-encoded UTF-8.");
201
+ return true;
202
+ }
203
+ const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
204
+ const resource = context?.resources.find((entry) => entry.id === resourceId) ?? null;
205
+ if (!resource) {
206
+ sendError(res, 404, `Context Graph resource not found: ${resourceId}`);
207
+ }
208
+ else {
209
+ const stage = resource.stage_id
210
+ ? context?.stage_summaries.find((entry) => entry.stage_id === resource.stage_id) ?? null
211
+ : null;
212
+ sendJson(res, 200, {
213
+ resource,
214
+ stage,
215
+ linked_resources: context?.resources.filter((entry) => resource.links.includes(entry.path ?? entry.id)) ?? [],
216
+ });
217
+ }
218
+ return true;
219
+ }
220
+ }
221
+ // GET /v1/projects/<id>/source-state — manifest-backed drift verdict for
222
+ // the Project's Source binding.
223
+ if (subPath === PROJECT_SUBRESOURCES.sourceState) {
224
+ if (method === "GET") {
225
+ const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
226
+ const state = computeProjectSourceState({
227
+ projectId: storedProject.id,
228
+ contextGraphPath: latestContext?.path ?? storedProject.contextGraphPath,
229
+ });
230
+ sendJson(res, 200, state);
231
+ return true;
232
+ }
233
+ }
234
+ if (subPath === PROJECT_SUBRESOURCES.contextGraphFile) {
235
+ // GET /v1/projects/<id>/context-graph/file?path=<relpath>
236
+ if (method === "GET") {
237
+ const relPath = parseRequestUrl(req).searchParams.get("path")?.trim() ?? "";
238
+ if (!relPath) {
239
+ sendError(res, 400, "Missing required query parameter: path.");
240
+ return true;
241
+ }
242
+ if (isTraversalRelativePath(relPath)) {
243
+ sendError(res, 400, "File path escapes Context Graph root.");
244
+ return true;
245
+ }
246
+ const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
247
+ if (!latestContext?.path) {
248
+ sendError(res, 404, "Context Graph not found.");
249
+ return true;
250
+ }
251
+ const contextGraphPath = latestContext.path;
252
+ const safePath = safeApiFilePath(contextGraphPath, relPath);
253
+ if (!safePath) {
254
+ sendError(res, 400, "File path escapes Context Graph root.");
255
+ return true;
256
+ }
257
+ if (!sendApiFile(res, safePath)) {
258
+ sendError(res, 404, `File not found: ${relPath}`);
259
+ }
260
+ return true;
261
+ }
262
+ }
263
+ if (subPath.startsWith(`${PROJECT_SUBRESOURCES.artifacts}/`)) {
264
+ // GET /v1/projects/<id>/artifacts/<artifact-id> — per-Artifact
265
+ // status from the latest Build.
266
+ if (method === "GET") {
267
+ const rawArtifactId = subPath.slice(PROJECT_SUBRESOURCES.artifacts.length + 1);
268
+ let artifactId;
269
+ try {
270
+ artifactId = decodeURIComponent(rawArtifactId);
271
+ }
272
+ catch {
273
+ sendError(res, 400, "Artifact id is not valid URI-encoded UTF-8.");
274
+ return true;
275
+ }
276
+ const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
277
+ const status = project?.artifacts.find((entry) => entry.artifact_id === artifactId);
278
+ if (!status) {
279
+ sendError(res, 404, `Artifact not found: ${artifactId}`);
280
+ return true;
281
+ }
282
+ sendJson(res, 200, status);
283
+ return true;
284
+ }
285
+ }
286
+ return false;
287
+ }
@@ -0,0 +1,9 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { ProjectRouteContext } from "./server-routes-project-runs.js";
3
+ import type { LocalServiceRuntime } from "../runtime.js";
4
+ /**
5
+ * Async/structured mutations on a project: Build Plan authoring
6
+ * and improvement jobs, benchmark-question drafts, Build Plan change deltas,
7
+ * and the destructive reset action.
8
+ */
9
+ export declare function tryHandleProjectJobs(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, ctx: ProjectRouteContext, method: string): Promise<boolean>;
@@ -0,0 +1,137 @@
1
+ import { PROJECT_SUBRESOURCES } from "./routes.js";
2
+ import { readJsonBody, sendError, sendJson, } from "./server-helpers.js";
3
+ import { writeBenchmarkSpecsForProject } from "../../projects/source-config.js";
4
+ import { loadTestSpec } from "../verify/verify-specs.js";
5
+ import { ProjectBenchmarkQuestionDraftCreateRequestSchema, ProjectBuildPlanAuthoringCreateRequestSchema, ProjectResetRequestSchema, } from "../schemas/index.js";
6
+ function projectScopedJobRequest(storedProject, body) {
7
+ const scopedRequest = ProjectBuildPlanAuthoringCreateRequestSchema.parse(body ?? {});
8
+ const explicitIntent = typeof scopedRequest.intent === "string" && scopedRequest.intent.trim().length > 0
9
+ ? scopedRequest.intent
10
+ : null;
11
+ return {
12
+ ...scopedRequest,
13
+ project: storedProject.id,
14
+ source_folder_path: storedProject.source.locator,
15
+ intent: explicitIntent ?? storedProject.intent,
16
+ };
17
+ }
18
+ /**
19
+ * Async/structured mutations on a project: Build Plan authoring
20
+ * and improvement jobs, benchmark-question drafts, Build Plan change deltas,
21
+ * and the destructive reset action.
22
+ */
23
+ export async function tryHandleProjectJobs(req, res, runtime, ctx, method) {
24
+ const { storedProject, subPath } = ctx;
25
+ if (subPath === PROJECT_SUBRESOURCES.buildPlanDraftRuns ||
26
+ subPath === PROJECT_SUBRESOURCES.legacyBuildPlanDraftRuns) {
27
+ if (method === "POST") {
28
+ try {
29
+ const body = (await readJsonBody(req));
30
+ const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, projectScopedJobRequest(storedProject, body));
31
+ sendJson(res, 202, job);
32
+ }
33
+ catch (error) {
34
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
35
+ }
36
+ return true;
37
+ }
38
+ }
39
+ if (subPath === PROJECT_SUBRESOURCES.buildPlanImprovementRuns) {
40
+ if (method === "POST") {
41
+ try {
42
+ const body = (await readJsonBody(req));
43
+ const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, projectScopedJobRequest(storedProject, body), "build-plan-improvement");
44
+ sendJson(res, 202, job);
45
+ }
46
+ catch (error) {
47
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
48
+ }
49
+ return true;
50
+ }
51
+ }
52
+ if (subPath === PROJECT_SUBRESOURCES.benchmarkQuestionDrafts) {
53
+ if (method === "POST") {
54
+ try {
55
+ const body = (await readJsonBody(req));
56
+ const scopedRequest = ProjectBenchmarkQuestionDraftCreateRequestSchema.parse(body ?? {});
57
+ const job = await runtime.createBenchmarkQuestionDraftRun(storedProject.projectDataDir, {
58
+ ...scopedRequest,
59
+ project: storedProject.id,
60
+ source_folder_path: storedProject.source.locator,
61
+ });
62
+ sendJson(res, 202, job);
63
+ }
64
+ catch (error) {
65
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
66
+ }
67
+ return true;
68
+ }
69
+ }
70
+ // The saved Q&A check set is the editable benchmark spec. Read it from the
71
+ // source-files spec (source + context graph specs share the same cases) and
72
+ // persist edits to both via the spec writer.
73
+ if (subPath === PROJECT_SUBRESOURCES.benchmarkChecks) {
74
+ if (method === "GET") {
75
+ const spec = loadTestSpec(storedProject.projectDataDir, "source-files", storedProject.id);
76
+ const checks = (spec?.cases ?? []).map((testCase) => ({
77
+ question: testCase.question,
78
+ answer: testCase.answer ?? "",
79
+ }));
80
+ sendJson(res, 200, { checks });
81
+ return true;
82
+ }
83
+ if (method === "PATCH") {
84
+ try {
85
+ const body = (await readJsonBody(req));
86
+ const rawChecks = Array.isArray(body?.checks) ? body.checks : [];
87
+ const checks = rawChecks
88
+ .filter((entry) => Boolean(entry) &&
89
+ typeof entry === "object" &&
90
+ typeof entry.question === "string")
91
+ .map((entry) => ({
92
+ question: entry.question.trim(),
93
+ answer: typeof entry.answer === "string" ? entry.answer.trim() : "",
94
+ }))
95
+ .filter((entry) => entry.question.length > 0);
96
+ writeBenchmarkSpecsForProject({
97
+ projectDataDir: storedProject.projectDataDir,
98
+ projectName: storedProject.id,
99
+ checks,
100
+ });
101
+ sendJson(res, 200, { checks });
102
+ }
103
+ catch (error) {
104
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
105
+ }
106
+ return true;
107
+ }
108
+ }
109
+ if (subPath === PROJECT_SUBRESOURCES.buildPlanChanges) {
110
+ if (method === "POST") {
111
+ try {
112
+ const body = (await readJsonBody(req));
113
+ sendJson(res, 200, runtime.applyBuildPlanChange(storedProject.projectDataDir, body));
114
+ }
115
+ catch (error) {
116
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
117
+ }
118
+ return true;
119
+ }
120
+ }
121
+ if (subPath === PROJECT_SUBRESOURCES.reset) {
122
+ if (method === "POST") {
123
+ try {
124
+ const body = (await readJsonBody(req));
125
+ const scopedRequest = ProjectResetRequestSchema.parse(body ?? {});
126
+ const request = { ...scopedRequest, project: storedProject.id };
127
+ const result = runtime.applyReset(storedProject.projectDataDir, request);
128
+ sendJson(res, 200, result);
129
+ }
130
+ catch (error) {
131
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
132
+ }
133
+ return true;
134
+ }
135
+ }
136
+ return false;
137
+ }
@@ -0,0 +1,14 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { StoredProject } from "../project-store.js";
3
+ import type { LocalServiceRuntime } from "../runtime.js";
4
+ export type ProjectRouteContext = {
5
+ storedProject: StoredProject;
6
+ decodedProjectId: string;
7
+ subPath: string;
8
+ };
9
+ /**
10
+ * Build/verify run mutations and the per-Project runs listing.
11
+ * Run-id lookups for an unknown project are handled by the
12
+ * top-level /v1/runs and /v1/verify-runs routes.
13
+ */
14
+ export declare function tryHandleProjectRuns(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, ctx: ProjectRouteContext, method: string): Promise<boolean>;
@@ -0,0 +1,88 @@
1
+ import { PROJECT_SUBRESOURCES } from "./routes.js";
2
+ import { readJsonBody, sendError, sendErrorResponse, sendJson, } from "./server-helpers.js";
3
+ import { assertCanRunBenchmark } from "../entitlement-guard.js";
4
+ import { ProjectBuildRunCreateRequestSchema, ProjectVerifyRunCreateRequestSchema, } from "../schemas/index.js";
5
+ /**
6
+ * Build/verify run mutations and the per-Project runs listing.
7
+ * Run-id lookups for an unknown project are handled by the
8
+ * top-level /v1/runs and /v1/verify-runs routes.
9
+ */
10
+ export async function tryHandleProjectRuns(req, res, runtime, ctx, method) {
11
+ const { storedProject, subPath } = ctx;
12
+ if (subPath === PROJECT_SUBRESOURCES.buildRuns) {
13
+ if (method === "POST") {
14
+ if (!storedProject.buildPlanId) {
15
+ sendError(res, 400, `Project ${storedProject.id} has no Build Plan selected. Select one via PATCH /v1/projects/${storedProject.id} { "build_plan_id": "<id>" } before building.`);
16
+ return true;
17
+ }
18
+ try {
19
+ const body = (await readJsonBody(req));
20
+ const scopedRequest = ProjectBuildRunCreateRequestSchema.parse(body ?? {});
21
+ const request = { ...scopedRequest, project: storedProject.id };
22
+ const idempotencyKeyRaw = req.headers["x-interf-idempotency-key"];
23
+ const idempotencyKey = Array.isArray(idempotencyKeyRaw)
24
+ ? idempotencyKeyRaw[0]
25
+ : idempotencyKeyRaw;
26
+ const trimmedKey = typeof idempotencyKey === "string" ? idempotencyKey.trim() : "";
27
+ const dedupedRunId = trimmedKey
28
+ ? runtime.findIdempotentBuildRun(storedProject.projectDataDir, trimmedKey)
29
+ : null;
30
+ if (dedupedRunId) {
31
+ const existing = runtime.getBuildRun(storedProject.projectDataDir, dedupedRunId);
32
+ if (existing) {
33
+ sendJson(res, 200, existing);
34
+ return true;
35
+ }
36
+ }
37
+ const resource = await runtime.createBuildRun(storedProject.projectDataDir, request);
38
+ if (trimmedKey) {
39
+ runtime.recordIdempotentBuildRun(storedProject.projectDataDir, trimmedKey, resource.run.run_id);
40
+ }
41
+ sendJson(res, 201, resource);
42
+ }
43
+ catch (error) {
44
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
45
+ }
46
+ return true;
47
+ }
48
+ }
49
+ if (subPath === PROJECT_SUBRESOURCES.verifyRuns) {
50
+ if (method === "GET") {
51
+ const runs = runtime.listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id);
52
+ sendJson(res, 200, { runs });
53
+ return true;
54
+ }
55
+ if (method === "POST") {
56
+ if (!storedProject.buildPlanId) {
57
+ sendError(res, 400, `Project ${storedProject.id} has no Build Plan selected. Select one via PATCH /v1/projects/${storedProject.id} { "build_plan_id": "<id>" } before running a benchmark.`);
58
+ return true;
59
+ }
60
+ try {
61
+ // Free-tier benchmark quota lives next to project creation.
62
+ // Pro / Enterprise have `benchmarking-unlimited` and bypass;
63
+ // Free / Anonymous get one run per Project, ever.
64
+ const existingCount = runtime
65
+ .listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id)
66
+ .filter((run) => !run.parent_run_id).length;
67
+ assertCanRunBenchmark(runtime.currentAccount, existingCount);
68
+ const body = (await readJsonBody(req));
69
+ const scopedRequest = ProjectVerifyRunCreateRequestSchema.parse(body ?? {});
70
+ const request = { ...scopedRequest, project: storedProject.id };
71
+ const resource = await runtime.createVerifyRun(storedProject.projectDataDir, request);
72
+ sendJson(res, 201, resource);
73
+ }
74
+ catch (error) {
75
+ sendErrorResponse(res, error);
76
+ }
77
+ return true;
78
+ }
79
+ }
80
+ if (subPath === PROJECT_SUBRESOURCES.runs) {
81
+ if (method === "GET") {
82
+ const runs = runtime.listBuildRunsForProject(storedProject.projectDataDir, storedProject.id);
83
+ sendJson(res, 200, { runs });
84
+ return true;
85
+ }
86
+ }
87
+ return false;
88
+ }
@@ -0,0 +1,4 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { LocalServiceRuntime } from "../runtime.js";
3
+ export declare function tryHandleProjectCollection(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
4
+ export declare function tryHandlePerProject(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;