@interf/compiler 0.22.2 → 0.33.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 (575) hide show
  1. package/README.md +175 -234
  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 -4
  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 +10 -0
  10. package/dist/cli/commands/benchmark.js +88 -0
  11. package/dist/cli/commands/build-plan.js +95 -103
  12. package/dist/cli/commands/build.d.ts +1 -1
  13. package/dist/cli/commands/build.js +16 -15
  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 +199 -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 +3 -2
  20. package/dist/cli/commands/mcp.js +721 -204
  21. package/dist/cli/commands/project.d.ts +2 -0
  22. package/dist/cli/commands/project.js +202 -0
  23. package/dist/cli/commands/reset.d.ts +1 -1
  24. package/dist/cli/commands/reset.js +10 -10
  25. package/dist/cli/commands/runs.js +52 -26
  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 +33 -22
  30. package/dist/cli/commands/traces.d.ts +2 -0
  31. package/dist/cli/commands/traces.js +125 -0
  32. package/dist/cli/commands/wizard.js +155 -150
  33. package/dist/cli/index.d.ts +7 -4
  34. package/dist/cli/index.js +13 -7
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.js +2 -2
  37. package/dist/packages/build-plans/authoring/brief.d.ts +517 -0
  38. package/dist/packages/build-plans/authoring/brief.js +89 -0
  39. package/dist/packages/build-plans/authoring/build-plan-authoring.d.ts +10 -10
  40. package/dist/packages/build-plans/authoring/build-plan-authoring.js +66 -26
  41. package/dist/packages/build-plans/authoring/build-plan-edit-session.d.ts +1 -1
  42. package/dist/packages/build-plans/authoring/build-plan-edit-session.js +8 -2
  43. package/dist/packages/build-plans/authoring/build-plan-improvement.d.ts +9 -6
  44. package/dist/packages/build-plans/authoring/build-plan-improvement.js +39 -42
  45. package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.js +7 -7
  46. package/dist/packages/build-plans/build-plan-resolution.d.ts +1 -1
  47. package/dist/packages/build-plans/build-plan-resolution.js +3 -3
  48. package/dist/packages/build-plans/index.d.ts +1 -1
  49. package/dist/packages/build-plans/index.js +1 -1
  50. package/dist/packages/build-plans/package/build-plan-definitions.d.ts +14 -12
  51. package/dist/packages/build-plans/package/build-plan-definitions.js +40 -39
  52. package/dist/packages/build-plans/package/build-plan-helpers.d.ts +3 -2
  53. package/dist/packages/build-plans/package/build-plan-helpers.js +27 -13
  54. package/dist/packages/build-plans/package/build-plan-review-paths.d.ts +5 -5
  55. package/dist/packages/build-plans/package/build-plan-review-paths.js +15 -15
  56. package/dist/packages/build-plans/package/build-plan-stage-runner.d.ts +4 -4
  57. package/dist/packages/build-plans/package/build-plan-stage-runner.js +22 -11
  58. package/dist/packages/build-plans/package/builtin-build-plan.d.ts +5 -6
  59. package/dist/packages/build-plans/package/builtin-build-plan.js +7 -8
  60. package/dist/packages/build-plans/package/context-interface.d.ts +11 -9
  61. package/dist/packages/build-plans/package/context-interface.js +14 -33
  62. package/dist/packages/build-plans/package/interf-build-plan-package.d.ts +6 -17
  63. package/dist/packages/build-plans/package/interf-build-plan-package.js +56 -52
  64. package/dist/packages/build-plans/package/local-build-plans.d.ts +12 -10
  65. package/dist/packages/build-plans/package/local-build-plans.js +56 -31
  66. package/dist/packages/build-plans/package/user-build-plans.js +1 -1
  67. package/dist/packages/contracts/index.d.ts +4 -2
  68. package/dist/packages/contracts/index.js +2 -1
  69. package/dist/packages/contracts/lib/project-paths.d.ts +137 -0
  70. package/dist/packages/contracts/lib/project-paths.js +211 -0
  71. package/dist/packages/contracts/lib/project-schema.d.ts +160 -0
  72. package/dist/packages/contracts/lib/project-schema.js +113 -0
  73. package/dist/packages/contracts/lib/schema.d.ts +739 -80
  74. package/dist/packages/contracts/lib/schema.js +410 -75
  75. package/dist/packages/contracts/utils/parse.js +67 -0
  76. package/dist/packages/projects/index.d.ts +6 -0
  77. package/dist/packages/{project → projects}/index.js +0 -3
  78. package/dist/packages/{project → projects}/interf-detect.d.ts +12 -12
  79. package/dist/packages/{project → projects}/interf-detect.js +56 -50
  80. package/dist/packages/projects/interf.d.ts +2 -0
  81. package/dist/packages/projects/interf.js +1 -0
  82. package/dist/packages/projects/lib/schema.d.ts +79 -0
  83. package/dist/packages/projects/lib/schema.js +89 -0
  84. package/dist/packages/projects/source-config.d.ts +58 -0
  85. package/dist/packages/projects/source-config.js +352 -0
  86. package/dist/packages/projects/source-folders.d.ts +11 -0
  87. package/dist/packages/{project → projects}/source-folders.js +26 -26
  88. package/dist/packages/{engine → runtime}/action-planner.d.ts +1 -1
  89. package/dist/packages/{engine → runtime}/action-planner.js +20 -22
  90. package/dist/packages/runtime/action-values.d.ts +1 -0
  91. package/dist/packages/runtime/action-values.js +1 -0
  92. package/dist/packages/runtime/actions/errors.d.ts +2 -0
  93. package/dist/packages/runtime/actions/errors.js +12 -0
  94. package/dist/packages/runtime/actions/fields.d.ts +82 -0
  95. package/dist/packages/runtime/actions/form-builders.d.ts +14 -0
  96. package/dist/packages/runtime/actions/form-builders.js +619 -0
  97. package/dist/packages/runtime/actions/form-validators.d.ts +8 -0
  98. package/dist/packages/runtime/actions/form-validators.js +128 -0
  99. package/dist/packages/runtime/actions/helpers.d.ts +11 -0
  100. package/dist/packages/runtime/actions/helpers.js +80 -0
  101. package/dist/packages/runtime/actions/index.d.ts +8 -0
  102. package/dist/packages/runtime/actions/index.js +11 -0
  103. package/dist/packages/runtime/actions/registry.d.ts +64 -0
  104. package/dist/packages/runtime/actions/registry.js +62 -0
  105. package/dist/packages/runtime/actions/requests.d.ts +45 -0
  106. package/dist/packages/runtime/actions/requests.js +158 -0
  107. package/dist/packages/runtime/actions/schemas.d.ts +154 -0
  108. package/dist/packages/runtime/actions/schemas.js +36 -0
  109. package/dist/packages/runtime/agent-handoff.d.ts +11 -0
  110. package/dist/packages/runtime/agent-handoff.js +101 -0
  111. package/dist/packages/{engine → runtime}/agents/index.d.ts +1 -2
  112. package/dist/packages/{engine → runtime}/agents/index.js +1 -2
  113. package/dist/packages/runtime/agents/lib/args.d.ts +14 -0
  114. package/dist/packages/runtime/agents/lib/args.js +24 -0
  115. package/dist/packages/{engine → runtime}/agents/lib/constants.d.ts +4 -1
  116. package/dist/packages/runtime/agents/lib/constants.js +13 -0
  117. package/dist/packages/runtime/agents/lib/context-graph-bootstrap.d.ts +3 -0
  118. package/dist/packages/{engine/agents/lib/verifiable-context-bootstrap.js → runtime/agents/lib/context-graph-bootstrap.js} +5 -6
  119. package/dist/packages/{engine → runtime}/agents/lib/detection.d.ts +5 -0
  120. package/dist/packages/{engine → runtime}/agents/lib/detection.js +16 -7
  121. package/dist/packages/{engine → runtime}/agents/lib/execution-profile.js +8 -14
  122. package/dist/packages/{engine → runtime}/agents/lib/execution.js +14 -4
  123. package/dist/packages/{engine → runtime}/agents/lib/preflight.js +15 -13
  124. package/dist/packages/{engine → runtime}/agents/lib/render.js +4 -4
  125. package/dist/packages/runtime/agents/lib/shell-fs.d.ts +18 -0
  126. package/dist/packages/runtime/agents/lib/shell-fs.js +190 -0
  127. package/dist/packages/runtime/agents/lib/shell-paths.d.ts +16 -0
  128. package/dist/packages/runtime/agents/lib/shell-paths.js +63 -0
  129. package/dist/packages/runtime/agents/lib/shell-projection.d.ts +25 -0
  130. package/dist/packages/runtime/agents/lib/shell-projection.js +314 -0
  131. package/dist/packages/runtime/agents/lib/shell-templates.d.ts +30 -0
  132. package/dist/packages/runtime/agents/lib/shell-templates.js +452 -0
  133. package/dist/packages/runtime/agents/lib/shell-workspace.d.ts +17 -0
  134. package/dist/packages/runtime/agents/lib/shell-workspace.js +70 -0
  135. package/dist/packages/runtime/agents/lib/shells.d.ts +63 -0
  136. package/dist/packages/runtime/agents/lib/shells.js +383 -0
  137. package/dist/packages/{engine → runtime}/agents/lib/user-config.d.ts +8 -2
  138. package/dist/packages/{engine → runtime}/agents/lib/user-config.js +8 -2
  139. package/dist/packages/runtime/agents/providers/claude-code.d.ts +13 -0
  140. package/dist/packages/runtime/agents/providers/claude-code.js +45 -0
  141. package/dist/packages/runtime/agents/providers/codex.d.ts +17 -0
  142. package/dist/packages/runtime/agents/providers/codex.js +64 -0
  143. package/dist/packages/runtime/agents/providers/cursor.d.ts +9 -0
  144. package/dist/packages/runtime/agents/providers/cursor.js +24 -0
  145. package/dist/packages/runtime/agents/providers/index.d.ts +9 -0
  146. package/dist/packages/runtime/agents/providers/index.js +31 -0
  147. package/dist/packages/runtime/agents/providers/types.d.ts +50 -0
  148. package/dist/packages/{engine → runtime}/agents/registry.d.ts +13 -2
  149. package/dist/packages/{engine → runtime}/agents/registry.js +48 -10
  150. package/dist/packages/{engine → runtime}/agents/role-executors.d.ts +1 -1
  151. package/dist/packages/{engine → runtime}/agents/role-executors.js +7 -6
  152. package/dist/packages/{engine → runtime}/agents/role-router.js +7 -5
  153. package/dist/packages/runtime/auth/account-context.d.ts +52 -0
  154. package/dist/packages/runtime/auth/account-context.js +68 -0
  155. package/dist/packages/runtime/auth/auth-flow.d.ts +73 -0
  156. package/dist/packages/runtime/auth/auth-flow.js +189 -0
  157. package/dist/packages/runtime/auth/jwt-validator.d.ts +58 -0
  158. package/dist/packages/runtime/auth/jwt-validator.js +86 -0
  159. package/dist/packages/runtime/auth/keychain.d.ts +35 -0
  160. package/dist/packages/runtime/auth/keychain.js +85 -0
  161. package/dist/packages/runtime/auth/session-store.d.ts +38 -0
  162. package/dist/packages/runtime/auth/session-store.js +88 -0
  163. package/dist/packages/runtime/auth/workos-client.d.ts +58 -0
  164. package/dist/packages/runtime/auth/workos-client.js +87 -0
  165. package/dist/packages/runtime/benchmark-question-draft.d.ts +20 -0
  166. package/dist/packages/runtime/benchmark-question-draft.js +124 -0
  167. package/dist/packages/runtime/build/artifact-counts.d.ts +1 -0
  168. package/dist/packages/{engine → runtime}/build/artifact-counts.js +5 -9
  169. package/dist/packages/{engine → runtime}/build/artifact-status.d.ts +5 -5
  170. package/dist/packages/{engine → runtime}/build/artifact-status.js +25 -23
  171. package/dist/packages/runtime/build/atomic-fs.d.ts +3 -0
  172. package/dist/packages/runtime/build/atomic-fs.js +95 -0
  173. package/dist/packages/runtime/build/billing-events.d.ts +78 -0
  174. package/dist/packages/{engine → runtime}/build/billing-events.js +17 -19
  175. package/dist/packages/runtime/build/build-evidence.d.ts +15 -0
  176. package/dist/packages/runtime/build/build-evidence.js +173 -0
  177. package/dist/packages/{engine → runtime}/build/build-pipeline.d.ts +12 -8
  178. package/dist/packages/runtime/build/build-pipeline.js +304 -0
  179. package/dist/packages/{engine → runtime}/build/build-plan-primitives.d.ts +1 -1
  180. package/dist/packages/{engine → runtime}/build/build-plan-primitives.js +0 -1
  181. package/dist/packages/runtime/build/build-plan-runs.d.ts +14 -0
  182. package/dist/packages/runtime/build/build-plan-runs.js +31 -0
  183. package/dist/packages/runtime/build/build-stage-plan.d.ts +16 -0
  184. package/dist/packages/{engine → runtime}/build/build-stage-plan.js +28 -29
  185. package/dist/packages/{engine → runtime}/build/build-stage-runner.d.ts +2 -1
  186. package/dist/packages/runtime/build/build-stage-runner.js +165 -0
  187. package/dist/packages/{engine → runtime}/build/build-target.d.ts +4 -4
  188. package/dist/packages/runtime/build/build-target.js +16 -0
  189. package/dist/packages/{engine → runtime}/build/check-evaluator.d.ts +14 -16
  190. package/dist/packages/runtime/build/check-evaluator.js +575 -0
  191. package/dist/packages/runtime/build/context-graph-paths.d.ts +51 -0
  192. package/dist/packages/runtime/build/context-graph-paths.js +133 -0
  193. package/dist/packages/runtime/build/context-graph-schema.d.ts +19 -0
  194. package/dist/packages/runtime/build/context-graph-schema.js +39 -0
  195. package/dist/packages/{engine → runtime}/build/discovery.d.ts +2 -2
  196. package/dist/packages/{engine → runtime}/build/discovery.js +4 -4
  197. package/dist/packages/{engine → runtime}/build/index.d.ts +5 -3
  198. package/dist/packages/{engine → runtime}/build/index.js +5 -3
  199. package/dist/packages/{engine → runtime}/build/lib/schema.d.ts +221 -88
  200. package/dist/packages/{engine → runtime}/build/lib/schema.js +61 -41
  201. package/dist/packages/runtime/build/reset.d.ts +2 -0
  202. package/dist/packages/runtime/build/reset.js +62 -0
  203. package/dist/packages/{engine → runtime}/build/runtime-contracts.js +5 -5
  204. package/dist/packages/runtime/build/runtime-inventory.d.ts +7 -0
  205. package/dist/packages/{engine → runtime}/build/runtime-inventory.js +3 -3
  206. package/dist/packages/{engine → runtime}/build/runtime-paths.js +6 -6
  207. package/dist/packages/{engine → runtime}/build/runtime-prompt.js +7 -6
  208. package/dist/packages/{engine → runtime}/build/runtime-reconcile.d.ts +1 -1
  209. package/dist/packages/{engine → runtime}/build/runtime-reconcile.js +25 -21
  210. package/dist/packages/runtime/build/runtime-runs.d.ts +10 -0
  211. package/dist/packages/runtime/build/runtime-runs.js +265 -0
  212. package/dist/packages/{engine → runtime}/build/runtime-types.d.ts +6 -6
  213. package/dist/packages/runtime/build/runtime-types.js +1 -0
  214. package/dist/packages/runtime/build/runtime.d.ts +6 -0
  215. package/dist/packages/runtime/build/runtime.js +5 -0
  216. package/dist/packages/runtime/build/source-files.d.ts +58 -0
  217. package/dist/packages/runtime/build/source-files.js +184 -0
  218. package/dist/packages/runtime/build/source-inventory.d.ts +27 -0
  219. package/dist/packages/runtime/build/source-inventory.js +273 -0
  220. package/dist/packages/runtime/build/source-manifest.d.ts +52 -0
  221. package/dist/packages/runtime/build/source-manifest.js +192 -0
  222. package/dist/packages/runtime/build/stage-evidence.d.ts +22 -0
  223. package/dist/packages/runtime/build/stage-evidence.js +317 -0
  224. package/dist/packages/runtime/build/stage-reuse.d.ts +11 -0
  225. package/dist/packages/runtime/build/stage-reuse.js +142 -0
  226. package/dist/packages/runtime/build/state-artifacts.d.ts +9 -0
  227. package/dist/packages/runtime/build/state-artifacts.js +14 -0
  228. package/dist/packages/runtime/build/state-health.d.ts +4 -0
  229. package/dist/packages/{engine → runtime}/build/state-health.js +21 -26
  230. package/dist/packages/runtime/build/state-io.d.ts +12 -0
  231. package/dist/packages/runtime/build/state-io.js +119 -0
  232. package/dist/packages/{engine → runtime}/build/state-paths.d.ts +3 -1
  233. package/dist/packages/runtime/build/state-paths.js +22 -0
  234. package/dist/packages/runtime/build/state-view.d.ts +5 -0
  235. package/dist/packages/{engine → runtime}/build/state-view.js +60 -33
  236. package/dist/packages/runtime/build/state.d.ts +7 -0
  237. package/dist/packages/runtime/build/state.js +12 -0
  238. package/dist/packages/runtime/build/traces.d.ts +30 -0
  239. package/dist/packages/runtime/build/traces.js +133 -0
  240. package/dist/packages/{engine/build/validate-verifiable-context.d.ts → runtime/build/validate-context-graph.d.ts} +6 -6
  241. package/dist/packages/{engine/build/validate-verifiable-context.js → runtime/build/validate-context-graph.js} +48 -35
  242. package/dist/packages/{engine → runtime}/build/validate.d.ts +5 -5
  243. package/dist/packages/{engine → runtime}/build/validate.js +26 -26
  244. package/dist/packages/{engine → runtime}/client.d.ts +15 -15
  245. package/dist/packages/{engine → runtime}/client.js +41 -24
  246. package/dist/packages/{engine → runtime}/connection-config.d.ts +3 -2
  247. package/dist/packages/{engine → runtime}/connection-config.js +9 -8
  248. package/dist/packages/runtime/context-checks.d.ts +10 -0
  249. package/dist/packages/runtime/context-checks.js +114 -0
  250. package/dist/packages/runtime/context-graph-scaffold.d.ts +9 -0
  251. package/dist/packages/runtime/context-graph-scaffold.js +134 -0
  252. package/dist/packages/runtime/entitlement-guard.d.ts +43 -0
  253. package/dist/packages/runtime/entitlement-guard.js +70 -0
  254. package/dist/packages/{engine → runtime}/execution/index.d.ts +2 -2
  255. package/dist/packages/{engine → runtime}/execution/index.js +1 -1
  256. package/dist/packages/{engine → runtime}/execution/lib/schema.d.ts +270 -192
  257. package/dist/packages/{engine → runtime}/execution/lib/schema.js +35 -32
  258. package/dist/packages/runtime/index.d.ts +29 -0
  259. package/dist/packages/runtime/index.js +21 -0
  260. package/dist/packages/runtime/instance-paths.d.ts +30 -0
  261. package/dist/packages/runtime/instance-paths.js +29 -0
  262. package/dist/packages/{engine → runtime}/native-run-handlers.d.ts +4 -4
  263. package/dist/packages/{engine → runtime}/native-run-handlers.js +184 -152
  264. package/dist/packages/runtime/plan-artifact-contract.d.ts +17 -0
  265. package/dist/packages/runtime/plan-artifact-contract.js +42 -0
  266. package/dist/packages/runtime/project-entries.d.ts +11 -0
  267. package/dist/packages/runtime/project-entries.js +49 -0
  268. package/dist/packages/runtime/project-source-state.d.ts +26 -0
  269. package/dist/packages/runtime/project-source-state.js +53 -0
  270. package/dist/packages/runtime/project-store.d.ts +85 -0
  271. package/dist/packages/runtime/project-store.js +168 -0
  272. package/dist/packages/runtime/requested-artifacts.d.ts +7 -0
  273. package/dist/packages/{engine → runtime}/requested-artifacts.js +23 -1
  274. package/dist/packages/{engine → runtime}/run-observability.d.ts +2 -1
  275. package/dist/packages/{engine → runtime}/run-observability.js +166 -84
  276. package/dist/packages/runtime/runtime-action-proposals.d.ts +7 -0
  277. package/dist/packages/runtime/runtime-action-proposals.js +542 -0
  278. package/dist/packages/runtime/runtime-build-plans.d.ts +5 -0
  279. package/dist/packages/runtime/runtime-build-plans.js +131 -0
  280. package/dist/packages/runtime/runtime-build-runs.d.ts +47 -0
  281. package/dist/packages/runtime/runtime-build-runs.js +562 -0
  282. package/dist/packages/runtime/runtime-caches.d.ts +91 -0
  283. package/dist/packages/{engine → runtime}/runtime-caches.js +77 -49
  284. package/dist/packages/{engine → runtime}/runtime-event-applier.d.ts +3 -1
  285. package/dist/packages/{engine → runtime}/runtime-event-applier.js +53 -17
  286. package/dist/packages/runtime/runtime-executor.d.ts +22 -0
  287. package/dist/packages/runtime/runtime-executor.js +131 -0
  288. package/dist/packages/runtime/runtime-jobs.d.ts +13 -0
  289. package/dist/packages/runtime/runtime-jobs.js +463 -0
  290. package/dist/packages/runtime/runtime-observability.d.ts +11 -0
  291. package/dist/packages/runtime/runtime-observability.js +39 -0
  292. package/dist/packages/{engine → runtime}/runtime-persistence.d.ts +9 -18
  293. package/dist/packages/{engine → runtime}/runtime-persistence.js +25 -25
  294. package/dist/packages/runtime/runtime-project-mutations.d.ts +7 -0
  295. package/dist/packages/runtime/runtime-project-mutations.js +64 -0
  296. package/dist/packages/runtime/runtime-project-reads.d.ts +15 -0
  297. package/dist/packages/runtime/runtime-project-reads.js +381 -0
  298. package/dist/packages/runtime/runtime-proposal-helpers.d.ts +22 -0
  299. package/dist/packages/runtime/runtime-proposal-helpers.js +223 -0
  300. package/dist/packages/{engine → runtime}/runtime-resource-builders.d.ts +21 -16
  301. package/dist/packages/{engine → runtime}/runtime-resource-builders.js +48 -38
  302. package/dist/packages/runtime/runtime-verify-runs.d.ts +84 -0
  303. package/dist/packages/runtime/runtime-verify-runs.js +295 -0
  304. package/dist/packages/runtime/runtime.d.ts +1165 -0
  305. package/dist/packages/runtime/runtime.js +417 -0
  306. package/dist/packages/runtime/schemas/actions.d.ts +1182 -0
  307. package/dist/packages/runtime/schemas/actions.js +117 -0
  308. package/dist/packages/runtime/schemas/agents.d.ts +76 -0
  309. package/dist/packages/runtime/schemas/agents.js +41 -0
  310. package/dist/packages/runtime/schemas/build-plans.d.ts +959 -0
  311. package/dist/packages/runtime/schemas/build-plans.js +107 -0
  312. package/dist/packages/runtime/schemas/files.d.ts +567 -0
  313. package/dist/packages/runtime/schemas/files.js +51 -0
  314. package/dist/packages/runtime/schemas/index.d.ts +8 -0
  315. package/dist/packages/runtime/schemas/index.js +12 -0
  316. package/dist/packages/runtime/schemas/instance.d.ts +141 -0
  317. package/dist/packages/runtime/schemas/instance.js +143 -0
  318. package/dist/packages/runtime/schemas/jobs.d.ts +339 -0
  319. package/dist/packages/runtime/schemas/jobs.js +103 -0
  320. package/dist/packages/runtime/schemas/projects.d.ts +339 -0
  321. package/dist/packages/runtime/schemas/projects.js +136 -0
  322. package/dist/packages/runtime/schemas/runs.d.ts +2676 -0
  323. package/dist/packages/runtime/schemas/runs.js +98 -0
  324. package/dist/packages/runtime/service/index.d.ts +3 -0
  325. package/dist/packages/runtime/service/index.js +3 -0
  326. package/dist/packages/runtime/service/openapi.d.ts +7 -0
  327. package/dist/packages/runtime/service/openapi.js +117 -0
  328. package/dist/packages/runtime/service/operations.d.ts +1490 -0
  329. package/dist/packages/runtime/service/operations.js +245 -0
  330. package/dist/packages/runtime/service/routes.d.ts +106 -0
  331. package/dist/packages/runtime/service/routes.js +120 -0
  332. package/dist/packages/runtime/service/server-api-files.d.ts +10 -0
  333. package/dist/packages/runtime/service/server-api-files.js +85 -0
  334. package/dist/packages/runtime/service/server-app-boot.d.ts +4 -0
  335. package/dist/packages/runtime/service/server-app-boot.js +46 -0
  336. package/dist/packages/runtime/service/server-guards.d.ts +63 -0
  337. package/dist/packages/runtime/service/server-guards.js +181 -0
  338. package/dist/packages/runtime/service/server-helpers.d.ts +27 -0
  339. package/dist/packages/runtime/service/server-helpers.js +89 -0
  340. package/dist/packages/runtime/service/server-instance-helpers.d.ts +30 -0
  341. package/dist/packages/runtime/service/server-instance-helpers.js +114 -0
  342. package/dist/packages/runtime/service/server-routes-action-proposals.d.ts +3 -0
  343. package/dist/packages/runtime/service/server-routes-action-proposals.js +43 -0
  344. package/dist/packages/runtime/service/server-routes-agents.d.ts +4 -0
  345. package/dist/packages/runtime/service/server-routes-agents.js +198 -0
  346. package/dist/packages/runtime/service/server-routes-auth.d.ts +33 -0
  347. package/dist/packages/runtime/service/server-routes-auth.js +138 -0
  348. package/dist/packages/runtime/service/server-routes-build-plans.d.ts +3 -0
  349. package/dist/packages/runtime/service/server-routes-build-plans.js +83 -0
  350. package/dist/packages/runtime/service/server-routes-discovery.d.ts +4 -0
  351. package/dist/packages/runtime/service/server-routes-discovery.js +196 -0
  352. package/dist/packages/runtime/service/server-routes-events.d.ts +5 -0
  353. package/dist/packages/runtime/service/server-routes-events.js +99 -0
  354. package/dist/packages/runtime/service/server-routes-project-context.d.ts +9 -0
  355. package/dist/packages/runtime/service/server-routes-project-context.js +192 -0
  356. package/dist/packages/runtime/service/server-routes-project-jobs.d.ts +9 -0
  357. package/dist/packages/runtime/service/server-routes-project-jobs.js +130 -0
  358. package/dist/packages/runtime/service/server-routes-project-runs.d.ts +14 -0
  359. package/dist/packages/runtime/service/server-routes-project-runs.js +85 -0
  360. package/dist/packages/runtime/service/server-routes-projects.d.ts +4 -0
  361. package/dist/packages/runtime/service/server-routes-projects.js +92 -0
  362. package/dist/packages/runtime/service/server-routes-runs.d.ts +3 -0
  363. package/dist/packages/runtime/service/server-routes-runs.js +112 -0
  364. package/dist/packages/runtime/service/server.d.ts +37 -0
  365. package/dist/packages/runtime/service/server.js +300 -0
  366. package/dist/packages/{engine → runtime/service}/service-registry.d.ts +5 -5
  367. package/dist/packages/{engine → runtime/service}/service-registry.js +7 -7
  368. package/dist/packages/runtime/verify/benchmark-run.d.ts +81 -0
  369. package/dist/packages/runtime/verify/benchmark-run.js +303 -0
  370. package/dist/packages/{engine → runtime}/verify/index.d.ts +2 -2
  371. package/dist/packages/{engine → runtime}/verify/index.js +1 -1
  372. package/dist/packages/{engine → runtime}/verify/lib/schema.d.ts +83 -16
  373. package/dist/packages/{engine → runtime}/verify/lib/schema.js +26 -18
  374. package/dist/packages/{engine → runtime}/verify/verify-execution.js +11 -11
  375. package/dist/packages/{engine → runtime}/verify/verify-paths.d.ts +4 -4
  376. package/dist/packages/runtime/verify/verify-paths.js +61 -0
  377. package/dist/packages/{engine → runtime}/verify/verify-sandbox.d.ts +1 -1
  378. package/dist/packages/runtime/verify/verify-sandbox.js +88 -0
  379. package/dist/packages/{engine → runtime}/verify/verify-specs.d.ts +2 -0
  380. package/dist/packages/{engine → runtime}/verify/verify-specs.js +5 -3
  381. package/dist/packages/runtime/verify/verify-targets.d.ts +5 -0
  382. package/dist/packages/{engine → runtime}/verify/verify-targets.js +12 -12
  383. package/dist/packages/runtime/verify/verify-types.js +1 -0
  384. package/dist/packages/{engine → runtime}/verify/verify.d.ts +1 -1
  385. package/dist/packages/{engine → runtime}/verify/verify.js +1 -1
  386. package/dist/packages/runtime/wire-schemas.d.ts +18 -0
  387. package/dist/packages/runtime/wire-schemas.js +27 -0
  388. package/package.json +39 -31
  389. package/public-repo/CONTRIBUTING.md +7 -16
  390. package/public-repo/README.md +175 -234
  391. package/public-repo/SECURITY.md +3 -4
  392. package/public-repo/build-plans/interf-default/README.md +19 -14
  393. package/public-repo/build-plans/interf-default/build/stages/shape/SKILL.md +18 -11
  394. package/public-repo/build-plans/interf-default/build/stages/structure/SKILL.md +12 -5
  395. package/public-repo/build-plans/interf-default/build/stages/summarize/SKILL.md +16 -4
  396. package/public-repo/build-plans/interf-default/build-plan.json +34 -28
  397. package/public-repo/build-plans/interf-default/build-plan.schema.json +54 -32
  398. package/public-repo/build-plans/interf-default/improve/SKILL.md +3 -3
  399. package/public-repo/build-plans/interf-default/use/query/SKILL.md +17 -11
  400. package/public-repo/openapi/local-service.openapi.json +6803 -0
  401. package/public-repo/skills/interf/SKILL.md +460 -179
  402. package/dist/cli/commands/prep.d.ts +0 -2
  403. package/dist/cli/commands/prep.js +0 -240
  404. package/dist/cli/commands/test.d.ts +0 -10
  405. package/dist/cli/commands/test.js +0 -85
  406. package/dist/cli/commands/web.d.ts +0 -2
  407. package/dist/cli/commands/web.js +0 -286
  408. package/dist/interf-ui/404.html +0 -1
  409. package/dist/interf-ui/__next.__PAGE__.txt +0 -10
  410. package/dist/interf-ui/__next._full.txt +0 -20
  411. package/dist/interf-ui/__next._head.txt +0 -5
  412. package/dist/interf-ui/__next._index.txt +0 -5
  413. package/dist/interf-ui/__next._tree.txt +0 -5
  414. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_buildManifest.js +0 -11
  415. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_clientMiddlewareManifest.js +0 -1
  416. package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_ssgManifest.js +0 -1
  417. package/dist/interf-ui/_next/static/chunks/0.tjb6f4golw..css +0 -3
  418. package/dist/interf-ui/_next/static/chunks/03~yq9q893hmn.js +0 -1
  419. package/dist/interf-ui/_next/static/chunks/085-n_jv2ng_q.css +0 -1
  420. package/dist/interf-ui/_next/static/chunks/0dn41fa_zvgsl.js +0 -1
  421. package/dist/interf-ui/_next/static/chunks/0g-ea0zj5d-0k.js +0 -1
  422. package/dist/interf-ui/_next/static/chunks/0gwqglc4iz583.js +0 -1
  423. package/dist/interf-ui/_next/static/chunks/0haldgm65ve6l.js +0 -1
  424. package/dist/interf-ui/_next/static/chunks/0nv3am99vjzn4.js +0 -1
  425. package/dist/interf-ui/_next/static/chunks/0s77gt_o4jwtx.js +0 -1
  426. package/dist/interf-ui/_next/static/chunks/0y5z3t-z1c8ks.js.map +0 -5
  427. package/dist/interf-ui/_next/static/chunks/0~a36ujuzpaz..js +0 -116
  428. package/dist/interf-ui/_next/static/chunks/10jeodxe4nkgj.js +0 -31
  429. package/dist/interf-ui/_next/static/chunks/119h2rouych2t.js +0 -1
  430. package/dist/interf-ui/_next/static/chunks/13c8b~m8knjsf.js +0 -1
  431. package/dist/interf-ui/_next/static/chunks/14dznb2qpt-ho.js +0 -91
  432. package/dist/interf-ui/_next/static/chunks/15z_en80lrq-3.js +0 -5
  433. package/dist/interf-ui/_next/static/chunks/turbopack-0p.pvcjrtq-jh.js +0 -1
  434. package/dist/interf-ui/_next/static/chunks/turbopack-0usj_75.8frlw.js +0 -1
  435. package/dist/interf-ui/_next/static/chunks/turbopack-worker-0sjn--fhq~1cg.js +0 -1
  436. package/dist/interf-ui/_next/static/media/GeistMono_Variable.p.17jn9btb_52pq.woff2 +0 -0
  437. package/dist/interf-ui/_next/static/media/Geist_Variable-s.p.0-te~ja_gpvcf.woff2 +0 -0
  438. package/dist/interf-ui/_next/static/media/worker.102zas1s52_pf.js +0 -109
  439. package/dist/interf-ui/_not-found/__next._full.txt +0 -15
  440. package/dist/interf-ui/_not-found/__next._head.txt +0 -5
  441. package/dist/interf-ui/_not-found/__next._index.txt +0 -5
  442. package/dist/interf-ui/_not-found/__next._not-found.__PAGE__.txt +0 -5
  443. package/dist/interf-ui/_not-found/__next._not-found.txt +0 -5
  444. package/dist/interf-ui/_not-found/__next._tree.txt +0 -2
  445. package/dist/interf-ui/_not-found.html +0 -1
  446. package/dist/interf-ui/_not-found.txt +0 -15
  447. package/dist/interf-ui/index.html +0 -1
  448. package/dist/interf-ui/index.txt +0 -20
  449. package/dist/packages/contracts/lib/preparation-paths.d.ts +0 -117
  450. package/dist/packages/contracts/lib/preparation-paths.js +0 -177
  451. package/dist/packages/engine/action-definitions.d.ts +0 -407
  452. package/dist/packages/engine/action-definitions.js +0 -1158
  453. package/dist/packages/engine/action-values.d.ts +0 -1
  454. package/dist/packages/engine/action-values.js +0 -1
  455. package/dist/packages/engine/agents/lib/args.d.ts +0 -4
  456. package/dist/packages/engine/agents/lib/args.js +0 -52
  457. package/dist/packages/engine/agents/lib/chart-guidance.d.ts +0 -1
  458. package/dist/packages/engine/agents/lib/chart-guidance.js +0 -8
  459. package/dist/packages/engine/agents/lib/constants.js +0 -28
  460. package/dist/packages/engine/agents/lib/schema.d.ts +0 -8
  461. package/dist/packages/engine/agents/lib/schema.js +0 -7
  462. package/dist/packages/engine/agents/lib/shells.d.ts +0 -74
  463. package/dist/packages/engine/agents/lib/shells.js +0 -1052
  464. package/dist/packages/engine/agents/lib/verifiable-context-bootstrap.d.ts +0 -3
  465. package/dist/packages/engine/build/artifact-counts.d.ts +0 -1
  466. package/dist/packages/engine/build/billing-events.d.ts +0 -89
  467. package/dist/packages/engine/build/build-pipeline.js +0 -175
  468. package/dist/packages/engine/build/build-plan-runs.d.ts +0 -14
  469. package/dist/packages/engine/build/build-plan-runs.js +0 -31
  470. package/dist/packages/engine/build/build-stage-plan.d.ts +0 -16
  471. package/dist/packages/engine/build/build-stage-runner.js +0 -94
  472. package/dist/packages/engine/build/build-target.js +0 -16
  473. package/dist/packages/engine/build/check-evaluator.js +0 -298
  474. package/dist/packages/engine/build/reset.d.ts +0 -2
  475. package/dist/packages/engine/build/reset.js +0 -74
  476. package/dist/packages/engine/build/runtime-inventory.d.ts +0 -7
  477. package/dist/packages/engine/build/runtime-runs.d.ts +0 -10
  478. package/dist/packages/engine/build/runtime-runs.js +0 -224
  479. package/dist/packages/engine/build/runtime.d.ts +0 -5
  480. package/dist/packages/engine/build/runtime.js +0 -4
  481. package/dist/packages/engine/build/source-files.d.ts +0 -46
  482. package/dist/packages/engine/build/source-files.js +0 -149
  483. package/dist/packages/engine/build/state-artifacts.d.ts +0 -9
  484. package/dist/packages/engine/build/state-artifacts.js +0 -14
  485. package/dist/packages/engine/build/state-health.d.ts +0 -4
  486. package/dist/packages/engine/build/state-io.d.ts +0 -11
  487. package/dist/packages/engine/build/state-io.js +0 -82
  488. package/dist/packages/engine/build/state-paths.js +0 -16
  489. package/dist/packages/engine/build/state-view.d.ts +0 -5
  490. package/dist/packages/engine/build/state.d.ts +0 -7
  491. package/dist/packages/engine/build/state.js +0 -12
  492. package/dist/packages/engine/build/validate-helpers.d.ts +0 -12
  493. package/dist/packages/engine/build/validate-helpers.js +0 -41
  494. package/dist/packages/engine/build/verifiable-context-paths.d.ts +0 -47
  495. package/dist/packages/engine/build/verifiable-context-paths.js +0 -121
  496. package/dist/packages/engine/build/verifiable-context-schema.d.ts +0 -21
  497. package/dist/packages/engine/build/verifiable-context-schema.js +0 -126
  498. package/dist/packages/engine/cloud-seams.d.ts +0 -115
  499. package/dist/packages/engine/cloud-seams.js +0 -84
  500. package/dist/packages/engine/index.d.ts +0 -22
  501. package/dist/packages/engine/index.js +0 -15
  502. package/dist/packages/engine/instance-paths.d.ts +0 -106
  503. package/dist/packages/engine/instance-paths.js +0 -171
  504. package/dist/packages/engine/lib/schema.d.ts +0 -6304
  505. package/dist/packages/engine/lib/schema.js +0 -730
  506. package/dist/packages/engine/preparation-store.d.ts +0 -105
  507. package/dist/packages/engine/preparation-store.js +0 -213
  508. package/dist/packages/engine/readiness-check-draft.d.ts +0 -20
  509. package/dist/packages/engine/readiness-check-draft.js +0 -111
  510. package/dist/packages/engine/requested-artifacts.d.ts +0 -5
  511. package/dist/packages/engine/routes.d.ts +0 -85
  512. package/dist/packages/engine/routes.js +0 -99
  513. package/dist/packages/engine/runtime-caches.d.ts +0 -76
  514. package/dist/packages/engine/runtime-proposal-helpers.d.ts +0 -35
  515. package/dist/packages/engine/runtime-proposal-helpers.js +0 -247
  516. package/dist/packages/engine/runtime.d.ts +0 -371
  517. package/dist/packages/engine/runtime.js +0 -2463
  518. package/dist/packages/engine/server.d.ts +0 -58
  519. package/dist/packages/engine/server.js +0 -1399
  520. package/dist/packages/engine/verify/readiness-check-run.d.ts +0 -82
  521. package/dist/packages/engine/verify/readiness-check-run.js +0 -265
  522. package/dist/packages/engine/verify/verify-paths.js +0 -61
  523. package/dist/packages/engine/verify/verify-sandbox.js +0 -88
  524. package/dist/packages/engine/verify/verify-targets.d.ts +0 -5
  525. package/dist/packages/engine/wire-schemas.d.ts +0 -547
  526. package/dist/packages/engine/wire-schemas.js +0 -59
  527. package/dist/packages/project/index.d.ts +0 -9
  528. package/dist/packages/project/interf-bootstrap.d.ts +0 -1
  529. package/dist/packages/project/interf-bootstrap.js +0 -1
  530. package/dist/packages/project/interf-scaffold.d.ts +0 -3
  531. package/dist/packages/project/interf-scaffold.js +0 -136
  532. package/dist/packages/project/interf.d.ts +0 -4
  533. package/dist/packages/project/interf.js +0 -3
  534. package/dist/packages/project/lib/schema.d.ts +0 -328
  535. package/dist/packages/project/lib/schema.js +0 -136
  536. package/dist/packages/project/preparation-entries.d.ts +0 -11
  537. package/dist/packages/project/preparation-entries.js +0 -49
  538. package/dist/packages/project/source-config.d.ts +0 -46
  539. package/dist/packages/project/source-config.js +0 -394
  540. package/dist/packages/project/source-folders.d.ts +0 -11
  541. package/public-repo/plugins/README.md +0 -9
  542. package/public-repo/plugins/interf/.claude-plugin/plugin.json +0 -21
  543. package/public-repo/plugins/interf/.mcp.json +0 -12
  544. package/public-repo/plugins/interf/README.md +0 -32
  545. package/public-repo/plugins/interf/skills/interf/SKILL.md +0 -376
  546. /package/dist/packages/{engine/agents/lib/types.js → runtime/actions/fields.js} +0 -0
  547. /package/dist/packages/{engine → runtime}/agents/lib/agents.d.ts +0 -0
  548. /package/dist/packages/{engine → runtime}/agents/lib/agents.js +0 -0
  549. /package/dist/packages/{engine → runtime}/agents/lib/execution-profile.d.ts +0 -0
  550. /package/dist/packages/{engine → runtime}/agents/lib/execution.d.ts +0 -0
  551. /package/dist/packages/{engine → runtime}/agents/lib/executors.d.ts +0 -0
  552. /package/dist/packages/{engine → runtime}/agents/lib/executors.js +0 -0
  553. /package/dist/packages/{engine → runtime}/agents/lib/logs.d.ts +0 -0
  554. /package/dist/packages/{engine → runtime}/agents/lib/logs.js +0 -0
  555. /package/dist/packages/{engine → runtime}/agents/lib/preflight.d.ts +0 -0
  556. /package/dist/packages/{engine → runtime}/agents/lib/render.d.ts +0 -0
  557. /package/dist/packages/{engine → runtime}/agents/lib/status.d.ts +0 -0
  558. /package/dist/packages/{engine → runtime}/agents/lib/status.js +0 -0
  559. /package/dist/packages/{engine → runtime}/agents/lib/types.d.ts +0 -0
  560. /package/dist/packages/{engine/build/runtime-types.js → runtime/agents/lib/types.js} +0 -0
  561. /package/dist/packages/{engine/verify/verify-types.js → runtime/agents/providers/types.js} +0 -0
  562. /package/dist/packages/{engine → runtime}/agents/role-router.d.ts +0 -0
  563. /package/dist/packages/{engine → runtime}/build/build-execution.d.ts +0 -0
  564. /package/dist/packages/{engine → runtime}/build/build-execution.js +0 -0
  565. /package/dist/packages/{engine → runtime}/build/runtime-contracts.d.ts +0 -0
  566. /package/dist/packages/{engine → runtime}/build/runtime-paths.d.ts +0 -0
  567. /package/dist/packages/{engine → runtime}/build/runtime-prompt.d.ts +0 -0
  568. /package/dist/packages/{engine → runtime}/execution/adapters.d.ts +0 -0
  569. /package/dist/packages/{engine → runtime}/execution/adapters.js +0 -0
  570. /package/dist/packages/{engine → runtime}/execution/events.d.ts +0 -0
  571. /package/dist/packages/{engine → runtime}/execution/events.js +0 -0
  572. /package/dist/packages/{engine → runtime}/verify/verify-execution.d.ts +0 -0
  573. /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.d.ts +0 -0
  574. /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.js +0 -0
  575. /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,192 @@
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, "Build evidence not found.");
84
+ }
85
+ else {
86
+ sendJson(res, 200, context.build_evidence);
87
+ }
88
+ return true;
89
+ }
90
+ }
91
+ // GET /v1/projects/<id>/context-graph/traces — first-class traces surface.
92
+ // Returns a derived Traces wire shape rolled up from the current
93
+ // Context Graph's artifacts + Checks + source file index.
94
+ if (subPath === PROJECT_SUBRESOURCES.traces) {
95
+ if (method === "GET") {
96
+ const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
97
+ if (!project) {
98
+ sendError(res, 404, "Context Graph not found.");
99
+ return true;
100
+ }
101
+ const readiness = runtime.getReadiness(storedProject.projectDataDir, storedProject.id);
102
+ const sourceFiles = runtime.listSourceFiles(storedProject.projectDataDir, storedProject.id);
103
+ const sourceFileCount = Array.isArray(sourceFiles) ? sourceFiles.length : 0;
104
+ const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
105
+ const filesProcessed = context?.build_evidence?.rows
106
+ .find((row) => row.id === "files-processed")
107
+ ?.metric.observed;
108
+ const traces = buildTraces({
109
+ projectId: storedProject.id,
110
+ graphId: project.latest_build_run_id ?? project.runs?.latest_build_run_id ?? "no-graph",
111
+ readiness,
112
+ artifacts: project.artifacts ?? [],
113
+ sourceFileCount,
114
+ filesProcessed,
115
+ });
116
+ sendJson(res, 200, traces);
117
+ return true;
118
+ }
119
+ }
120
+ // GET /v1/projects/<id>/source-state — manifest-backed drift verdict for
121
+ // the Project's Source binding.
122
+ if (subPath === PROJECT_SUBRESOURCES.sourceState) {
123
+ if (method === "GET") {
124
+ // The per-run SourceState record carries the historical file index;
125
+ // for v1 we treat the latest Build id as the graph pointer and
126
+ // leave the hash comparison to a follow-up enhancement. For now the
127
+ // verdict is `unknown` until a Build has produced a Context Graph.
128
+ const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
129
+ const state = computeProjectSourceState({
130
+ projectId: storedProject.id,
131
+ sourceFolderPath: storedProject.source.locator,
132
+ contextGraphPath: latestContext?.path ?? storedProject.contextGraphPath,
133
+ lastGraphIndexHash: null,
134
+ });
135
+ sendJson(res, 200, state);
136
+ return true;
137
+ }
138
+ }
139
+ if (subPath === PROJECT_SUBRESOURCES.contextGraphFile) {
140
+ // GET /v1/projects/<id>/context-graph/file?path=<relpath>
141
+ if (method === "GET") {
142
+ const relPath = parseRequestUrl(req).searchParams.get("path")?.trim() ?? "";
143
+ if (!relPath) {
144
+ sendError(res, 400, "Missing required query parameter: path.");
145
+ return true;
146
+ }
147
+ if (isTraversalRelativePath(relPath)) {
148
+ sendError(res, 400, "File path escapes Context Graph root.");
149
+ return true;
150
+ }
151
+ const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
152
+ if (!latestContext?.path) {
153
+ sendError(res, 404, "Context Graph not found.");
154
+ return true;
155
+ }
156
+ const contextGraphPath = latestContext.path;
157
+ const safePath = safeApiFilePath(contextGraphPath, relPath);
158
+ if (!safePath) {
159
+ sendError(res, 400, "File path escapes Context Graph root.");
160
+ return true;
161
+ }
162
+ if (!sendApiFile(res, safePath)) {
163
+ sendError(res, 404, `File not found: ${relPath}`);
164
+ }
165
+ return true;
166
+ }
167
+ }
168
+ if (subPath.startsWith(`${PROJECT_SUBRESOURCES.artifacts}/`)) {
169
+ // GET /v1/projects/<id>/artifacts/<artifact-id> — per-Artifact
170
+ // status from the latest Build.
171
+ if (method === "GET") {
172
+ const rawArtifactId = subPath.slice(PROJECT_SUBRESOURCES.artifacts.length + 1);
173
+ let artifactId;
174
+ try {
175
+ artifactId = decodeURIComponent(rawArtifactId);
176
+ }
177
+ catch {
178
+ sendError(res, 400, "Artifact id is not valid URI-encoded UTF-8.");
179
+ return true;
180
+ }
181
+ const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
182
+ const status = project?.artifacts.find((entry) => entry.artifact_id === artifactId);
183
+ if (!status) {
184
+ sendError(res, 404, `Artifact not found: ${artifactId}`);
185
+ return true;
186
+ }
187
+ sendJson(res, 200, status);
188
+ return true;
189
+ }
190
+ }
191
+ return false;
192
+ }
@@ -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,130 @@
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
+ /**
6
+ * Async/structured mutations on a project: Build Plan authoring
7
+ * and improvement jobs, benchmark-question drafts, Build Plan change deltas,
8
+ * and the destructive reset action.
9
+ */
10
+ export async function tryHandleProjectJobs(req, res, runtime, ctx, method) {
11
+ const { storedProject, subPath } = ctx;
12
+ if (subPath === PROJECT_SUBRESOURCES.buildPlanDraftRuns ||
13
+ subPath === PROJECT_SUBRESOURCES.legacyBuildPlanDraftRuns) {
14
+ if (method === "POST") {
15
+ try {
16
+ const body = (await readJsonBody(req));
17
+ const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, {
18
+ ...(body ?? {}),
19
+ project: storedProject.id,
20
+ source_folder_path: storedProject.source.locator,
21
+ });
22
+ sendJson(res, 202, job);
23
+ }
24
+ catch (error) {
25
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
26
+ }
27
+ return true;
28
+ }
29
+ }
30
+ if (subPath === PROJECT_SUBRESOURCES.buildPlanImprovementRuns) {
31
+ if (method === "POST") {
32
+ try {
33
+ const body = (await readJsonBody(req));
34
+ const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, {
35
+ ...(body ?? {}),
36
+ project: storedProject.id,
37
+ source_folder_path: storedProject.source.locator,
38
+ }, "build-plan-improvement");
39
+ sendJson(res, 202, job);
40
+ }
41
+ catch (error) {
42
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
43
+ }
44
+ return true;
45
+ }
46
+ }
47
+ if (subPath === PROJECT_SUBRESOURCES.benchmarkQuestionDrafts) {
48
+ if (method === "POST") {
49
+ try {
50
+ const body = (await readJsonBody(req));
51
+ const job = await runtime.createBenchmarkQuestionDraftRun(storedProject.projectDataDir, {
52
+ ...(body ?? {}),
53
+ project: storedProject.id,
54
+ source_folder_path: storedProject.source.locator,
55
+ });
56
+ sendJson(res, 202, job);
57
+ }
58
+ catch (error) {
59
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
60
+ }
61
+ return true;
62
+ }
63
+ }
64
+ // The saved Q&A check set is the editable benchmark spec. Read it from the
65
+ // source-files spec (source + context graph specs share the same cases) and
66
+ // persist edits to both via the spec writer.
67
+ if (subPath === PROJECT_SUBRESOURCES.benchmarkChecks) {
68
+ if (method === "GET") {
69
+ const spec = loadTestSpec(storedProject.projectDataDir, "source-files", storedProject.id);
70
+ const checks = (spec?.cases ?? []).map((testCase) => ({
71
+ question: testCase.question,
72
+ answer: testCase.answer ?? "",
73
+ }));
74
+ sendJson(res, 200, { checks });
75
+ return true;
76
+ }
77
+ if (method === "PATCH") {
78
+ try {
79
+ const body = (await readJsonBody(req));
80
+ const rawChecks = Array.isArray(body?.checks) ? body.checks : [];
81
+ const checks = rawChecks
82
+ .filter((entry) => Boolean(entry) &&
83
+ typeof entry === "object" &&
84
+ typeof entry.question === "string")
85
+ .map((entry) => ({
86
+ question: entry.question.trim(),
87
+ answer: typeof entry.answer === "string" ? entry.answer.trim() : "",
88
+ }))
89
+ .filter((entry) => entry.question.length > 0);
90
+ writeBenchmarkSpecsForProject({
91
+ projectDataDir: storedProject.projectDataDir,
92
+ projectName: storedProject.id,
93
+ checks,
94
+ });
95
+ sendJson(res, 200, { checks });
96
+ }
97
+ catch (error) {
98
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
99
+ }
100
+ return true;
101
+ }
102
+ }
103
+ if (subPath === PROJECT_SUBRESOURCES.buildPlanChanges) {
104
+ if (method === "POST") {
105
+ try {
106
+ const body = (await readJsonBody(req));
107
+ sendJson(res, 200, runtime.applyBuildPlanChange(storedProject.projectDataDir, body));
108
+ }
109
+ catch (error) {
110
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
111
+ }
112
+ return true;
113
+ }
114
+ }
115
+ if (subPath === PROJECT_SUBRESOURCES.reset) {
116
+ if (method === "POST") {
117
+ try {
118
+ const body = (await readJsonBody(req));
119
+ const request = { project: storedProject.id, scope: "build", ...(body ?? {}) };
120
+ const result = runtime.applyReset(storedProject.projectDataDir, request);
121
+ sendJson(res, 200, result);
122
+ }
123
+ catch (error) {
124
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
125
+ }
126
+ return true;
127
+ }
128
+ }
129
+ return false;
130
+ }
@@ -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,85 @@
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
+ /**
5
+ * Build/verify run mutations and the per-Project runs listing.
6
+ * Run-id lookups for an unknown project are handled by the
7
+ * top-level /v1/runs and /v1/verify-runs routes.
8
+ */
9
+ export async function tryHandleProjectRuns(req, res, runtime, ctx, method) {
10
+ const { storedProject, subPath } = ctx;
11
+ if (subPath === PROJECT_SUBRESOURCES.buildRuns) {
12
+ if (method === "POST") {
13
+ if (!storedProject.buildPlanId) {
14
+ 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.`);
15
+ return true;
16
+ }
17
+ try {
18
+ const body = (await readJsonBody(req));
19
+ const request = { project: storedProject.id, ...(body ?? {}) };
20
+ const idempotencyKeyRaw = req.headers["x-interf-idempotency-key"];
21
+ const idempotencyKey = Array.isArray(idempotencyKeyRaw)
22
+ ? idempotencyKeyRaw[0]
23
+ : idempotencyKeyRaw;
24
+ const trimmedKey = typeof idempotencyKey === "string" ? idempotencyKey.trim() : "";
25
+ const dedupedRunId = trimmedKey
26
+ ? runtime.findIdempotentBuildRun(storedProject.projectDataDir, trimmedKey)
27
+ : null;
28
+ if (dedupedRunId) {
29
+ const existing = runtime.getBuildRun(storedProject.projectDataDir, dedupedRunId);
30
+ if (existing) {
31
+ sendJson(res, 200, existing);
32
+ return true;
33
+ }
34
+ }
35
+ const resource = await runtime.createBuildRun(storedProject.projectDataDir, request);
36
+ if (trimmedKey) {
37
+ runtime.recordIdempotentBuildRun(storedProject.projectDataDir, trimmedKey, resource.run.run_id);
38
+ }
39
+ sendJson(res, 201, resource);
40
+ }
41
+ catch (error) {
42
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
43
+ }
44
+ return true;
45
+ }
46
+ }
47
+ if (subPath === PROJECT_SUBRESOURCES.verifyRuns) {
48
+ if (method === "GET") {
49
+ const runs = runtime.listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id);
50
+ sendJson(res, 200, { runs });
51
+ return true;
52
+ }
53
+ if (method === "POST") {
54
+ if (!storedProject.buildPlanId) {
55
+ 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.`);
56
+ return true;
57
+ }
58
+ try {
59
+ // Free-tier benchmark quota lives next to project creation.
60
+ // Pro / Enterprise have `benchmarking-unlimited` and bypass;
61
+ // Free / Anonymous get one run per Project, ever.
62
+ const existingCount = runtime
63
+ .listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id)
64
+ .filter((run) => !run.parent_run_id).length;
65
+ assertCanRunBenchmark(runtime.currentAccount, existingCount);
66
+ const body = (await readJsonBody(req));
67
+ const request = { project: storedProject.id, ...(body ?? {}) };
68
+ const resource = await runtime.createVerifyRun(storedProject.projectDataDir, request);
69
+ sendJson(res, 201, resource);
70
+ }
71
+ catch (error) {
72
+ sendErrorResponse(res, error);
73
+ }
74
+ return true;
75
+ }
76
+ }
77
+ if (subPath === PROJECT_SUBRESOURCES.runs) {
78
+ if (method === "GET") {
79
+ const runs = runtime.listBuildRunsForProject(storedProject.projectDataDir, storedProject.id);
80
+ sendJson(res, 200, { runs });
81
+ return true;
82
+ }
83
+ }
84
+ return false;
85
+ }
@@ -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>;
@@ -0,0 +1,92 @@
1
+ import { ProjectCreateRequestSchema, ProjectUpdateRequestSchema, } from "../schemas/index.js";
2
+ import { LOCAL_SERVICE_ROUTES } from "./routes.js";
3
+ import { readJsonBody, sendError, sendErrorResponse, sendJson, } from "./server-helpers.js";
4
+ import { createStoredProject, deleteStoredProject, getStoredProject, listStoredProjects, projectWireShape, updateStoredProject, } from "../project-store.js";
5
+ import { tryHandleProjectRuns, } from "./server-routes-project-runs.js";
6
+ import { tryHandleProjectJobs } from "./server-routes-project-jobs.js";
7
+ import { tryHandleProjectContext } from "./server-routes-project-context.js";
8
+ export async function tryHandleProjectCollection(req, res, runtime, path, method) {
9
+ // GET /v1/projects — list every Project on the instance.
10
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.projects) {
11
+ const items = listStoredProjects().map(projectWireShape);
12
+ sendJson(res, 200, { projects: items });
13
+ return true;
14
+ }
15
+ // POST /v1/projects — create a new Project.
16
+ if (method === "POST" && path === LOCAL_SERVICE_ROUTES.projects) {
17
+ try {
18
+ const body = ProjectCreateRequestSchema.parse(await readJsonBody(req));
19
+ const stored = createStoredProject(runtime, {
20
+ id: body.id,
21
+ source: { kind: "local-folder", locator: body.source.locator },
22
+ build_plan_id: body.build_plan_id,
23
+ });
24
+ sendJson(res, 201, projectWireShape(stored));
25
+ }
26
+ catch (error) {
27
+ // assertCanCreateProject throws EntitlementError when the Free
28
+ // 10-Project cap is reached. sendErrorResponse routes it to 402 with
29
+ // upgrade_hint; everything else stays a 400 with the message body.
30
+ sendErrorResponse(res, error);
31
+ }
32
+ return true;
33
+ }
34
+ return false;
35
+ }
36
+ export async function tryHandlePerProject(req, res, runtime, path, method) {
37
+ if (!path.startsWith(`${LOCAL_SERVICE_ROUTES.projects}/`)) {
38
+ return false;
39
+ }
40
+ const tail = path.slice(LOCAL_SERVICE_ROUTES.projects.length + 1);
41
+ const slashIndex = tail.indexOf("/");
42
+ const projectId = slashIndex === -1 ? tail : tail.slice(0, slashIndex);
43
+ const subPath = slashIndex === -1 ? "" : tail.slice(slashIndex + 1);
44
+ const decodedProjectId = decodeURIComponent(projectId);
45
+ const storedProject = getStoredProject(decodedProjectId);
46
+ if (!storedProject) {
47
+ sendError(res, 404, `Project not found: ${decodedProjectId}`);
48
+ return true;
49
+ }
50
+ runtime.touchProject(storedProject.projectDataDir);
51
+ if (subPath === "") {
52
+ // Bare /v1/projects/{id} — project CRUD.
53
+ if (method === "GET") {
54
+ const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
55
+ if (!project) {
56
+ sendError(res, 404, `Project not found: ${decodedProjectId}`);
57
+ return true;
58
+ }
59
+ sendJson(res, 200, project);
60
+ return true;
61
+ }
62
+ if (method === "PATCH") {
63
+ try {
64
+ const body = ProjectUpdateRequestSchema.parse(await readJsonBody(req));
65
+ const updated = updateStoredProject(decodedProjectId, {
66
+ build_plan_id: body.build_plan_id,
67
+ });
68
+ sendJson(res, 200, projectWireShape(updated));
69
+ }
70
+ catch (error) {
71
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
72
+ }
73
+ return true;
74
+ }
75
+ if (method === "DELETE") {
76
+ deleteStoredProject(runtime, decodedProjectId);
77
+ sendJson(res, 200, { id: decodedProjectId, deleted: true });
78
+ return true;
79
+ }
80
+ sendError(res, 404, `Unknown project route: ${path}`);
81
+ return true;
82
+ }
83
+ const ctx = { storedProject, decodedProjectId, subPath };
84
+ if (await tryHandleProjectRuns(req, res, runtime, ctx, method))
85
+ return true;
86
+ if (await tryHandleProjectJobs(req, res, runtime, ctx, method))
87
+ return true;
88
+ if (await tryHandleProjectContext(req, res, runtime, ctx, method))
89
+ return true;
90
+ sendError(res, 404, `Unknown project sub-route: ${subPath}`);
91
+ return true;
92
+ }
@@ -0,0 +1,3 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { LocalServiceRuntime } from "../runtime.js";
3
+ export declare function tryHandleRuns(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): boolean;