@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,47 @@
1
+ import { type ArtifactRef, type BuildRun, type InterfRunEvent, type EvidenceRecord } from "./execution/lib/schema.js";
2
+ import { type BuildRunResource } from "./schemas/index.js";
3
+ import type { LocalServiceRuntime } from "./runtime.js";
4
+ export declare function listBuildRuns(runtime: LocalServiceRuntime, projectDataDir: string): BuildRunResource[];
5
+ export declare function listBuildRunsForProject(runtime: LocalServiceRuntime, projectDataDir: string, projectName: string): BuildRun[];
6
+ export declare function getBuildRun(runtime: LocalServiceRuntime, projectDataDir: string, runId: string): BuildRunResource | null;
7
+ export declare function getBuildRunEvents(runtime: LocalServiceRuntime, projectDataDir: string, runId: string): InterfRunEvent[] | null;
8
+ export declare function getBuildRunEvidence(runtime: LocalServiceRuntime, projectDataDir: string, runId: string): EvidenceRecord[] | null;
9
+ export declare function getBuildRunArtifacts(runtime: LocalServiceRuntime, projectDataDir: string, runId: string): ArtifactRef[] | null;
10
+ export declare function createBuildRun(runtime: LocalServiceRuntime, projectDataDir: string, requestValue: unknown): Promise<BuildRunResource>;
11
+ /**
12
+ * Cancel an in-flight Build run. Marks the persisted record as
13
+ * `cancelled`, emits a `run.cancelled` event to capture the cancellation in
14
+ * the run timeline, and clears the active handle so retries may start a
15
+ * fresh run. If the run already finished, returns
16
+ * `{ cancelled: false, reason: "already finished" }` and persists nothing.
17
+ */
18
+ export declare function cancelBuildRun(runtime: LocalServiceRuntime, runId: string): {
19
+ cancelled: boolean;
20
+ reason?: string;
21
+ };
22
+ /**
23
+ * Look up the run id previously associated with this idempotency key in
24
+ * `projectDataDir`. Returns null when the key is unknown or its TTL has
25
+ * elapsed. The project argument is required so that the same key in
26
+ * two different projects always returns two different runs.
27
+ */
28
+ export declare function findIdempotentBuildRun(runtime: LocalServiceRuntime, projectDataDir: string, key: string): string | null;
29
+ /**
30
+ * Cache the run id created (or returned) for this idempotency key in
31
+ * `projectDataDir`. Entries expire after `IDEMPOTENCY_TTL_MS`. Pruning
32
+ * is opportunistic: the previous implementation walked every entry on
33
+ * every read AND write, which was O(N) per request. Now we only sweep
34
+ * when the cache grows past {@link IDEMPOTENCY_PRUNE_THRESHOLD}.
35
+ */
36
+ export declare function recordIdempotentBuildRun(runtime: LocalServiceRuntime, projectDataDir: string, key: string, runId: string): void;
37
+ /**
38
+ * Test seam: force the cached entry for `key` in `projectDataDir` to be
39
+ * expired so the next lookup returns null. Returns true when an entry was
40
+ * found and expired. Tests use this in place of fake timers because the
41
+ * idempotency TTL is one hour and faking `Date.now()` would destabilize
42
+ * unrelated runtime state.
43
+ */
44
+ export declare function expireIdempotencyKeyForTesting(runtime: LocalServiceRuntime, projectDataDir: string, key: string): boolean;
45
+ export declare function readBuildRun(projectDataDir: string, runId: string): BuildRun | null;
46
+ export declare function finalizeInterruptedBuildRuns(runtime: LocalServiceRuntime, projectDataDir: string): void;
47
+ export declare function writeBuildRun(runtime: LocalServiceRuntime, projectDataDir: string, run: BuildRun): void;
@@ -0,0 +1,562 @@
1
+ import { mkdirSync, } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { listProjectConfigs, loadSourceFolderConfig, markProjectLatestContextGraphRun, resolveProjectSourceBindingPath, } from "../projects/source-config.js";
4
+ import { BuildRunSchema, } from "./execution/lib/schema.js";
5
+ import { createRunEventId, createRunEventTimestamp, } from "./execution/events.js";
6
+ import { loadState, } from "./build/state.js";
7
+ import { loadContextGraphSourceManifest, } from "./build/source-manifest.js";
8
+ import { byCreatedAtDesc, listJsonFiles, projectBuildRunPath, projectBuildRunsRoot, readBuildRunAt, readExecutionStageLedgerHistory, timestampKey, writeJsonFile, } from "./runtime-persistence.js";
9
+ import { applyEventToBuildRun, INTERRUPTED_BUILD_RUN_REASON, reconcileBuildRunTerminalStatus, } from "./runtime-event-applier.js";
10
+ import { createRunId, logsForExecutionStageLedger, logsForStageRun, evidenceForStage, stageArtifactRefs, } from "./runtime-resource-builders.js";
11
+ import { computeArtifactStatuses } from "./build/artifact-status.js";
12
+ import { buildPlanContextChecks, projectContextChecksForRun, } from "./context-checks.js";
13
+ import { JsonlBillingEventSink, buildBillingEventsForRun, defaultBillingEventLogPath, } from "./build/billing-events.js";
14
+ import { getBuildPlan } from "../build-plans/package/build-plan-definitions.js";
15
+ import { BuildRunCreateRequestSchema, BuildRunResourceSchema, LocalRunHandlerResultSchema, } from "./schemas/index.js";
16
+ import { uniqueArtifacts } from "./run-observability.js";
17
+ import { requireSelectedBuildPlan } from "./runtime-proposal-helpers.js";
18
+ import { readinessUpdatedEvent } from "./runtime-verify-runs.js";
19
+ /** TTL for `POST .../build-runs` idempotency-key dedupe entries. */
20
+ const IDEMPOTENCY_TTL_MS = 60 * 60 * 1000;
21
+ /** Idempotency cache size at which to schedule an opportunistic prune. */
22
+ const IDEMPOTENCY_PRUNE_THRESHOLD = 64;
23
+ function isTerminalBuildRunStatus(status) {
24
+ return status === "succeeded" || status === "failed" || status === "cancelled";
25
+ }
26
+ function countsFromContextGraphState(state, contextGraphPath) {
27
+ const counts = {};
28
+ const sourceManifest = loadContextGraphSourceManifest(contextGraphPath);
29
+ if (sourceManifest)
30
+ counts.source_total = sourceManifest.source_total;
31
+ for (const stage of Object.values(state.stages ?? {})) {
32
+ for (const [key, value] of Object.entries(stage.counts ?? {})) {
33
+ if (Number.isFinite(value))
34
+ counts[key] = Math.max(counts[key] ?? 0, value);
35
+ }
36
+ for (const [key, value] of Object.entries(stage.artifact_counts ?? {})) {
37
+ if (Number.isFinite(value))
38
+ counts[key] = Math.max(counts[key] ?? 0, value);
39
+ }
40
+ }
41
+ return counts;
42
+ }
43
+ function buildRunRecordFilesForProject(projectDataDir, projectName) {
44
+ void projectName;
45
+ return listJsonFiles(projectBuildRunsRoot(projectDataDir));
46
+ }
47
+ function readBuildRunRecordsForProject(projectDataDir, projectName) {
48
+ const byRunId = new Map();
49
+ for (const filePath of buildRunRecordFilesForProject(projectDataDir, projectName)) {
50
+ const run = readBuildRunAt(filePath);
51
+ if (!run || run.project !== projectName)
52
+ continue;
53
+ if (!byRunId.has(run.run_id))
54
+ byRunId.set(run.run_id, run);
55
+ }
56
+ return [...byRunId.values()];
57
+ }
58
+ export function listBuildRuns(runtime, projectDataDir) {
59
+ return byCreatedAtDesc(listProjectConfigs(loadSourceFolderConfig(projectDataDir))
60
+ .flatMap((project) => listBuildRunsForProject(runtime, projectDataDir, project.name))).map((run) => BuildRunResourceSchema.parse({ run }));
61
+ }
62
+ export function listBuildRunsForProject(runtime, projectDataDir, projectName) {
63
+ return runtime.buildRunCache.get(projectDataDir, projectName, () => {
64
+ return byCreatedAtDesc(readBuildRunRecordsForProject(projectDataDir, projectName)).map((run) => hydrateBuildRunFromRuntime(runtime, projectDataDir, run));
65
+ }, (run) => run.run_id);
66
+ }
67
+ export function getBuildRun(runtime, projectDataDir, runId) {
68
+ // Fast path: if the runId was seen during a recent listing, look up
69
+ // its owning Project directly and return that Project's
70
+ // cached entry instead of scanning every project on disk.
71
+ const known = runtime.buildRunCache.projectFor(projectDataDir, runId);
72
+ if (known) {
73
+ const found = listBuildRunsForProject(runtime, projectDataDir, known).find((entry) => entry.run_id === runId);
74
+ if (found)
75
+ return BuildRunResourceSchema.parse({ run: found });
76
+ }
77
+ // Slow path: scan all projects. Falls through after a cache
78
+ // miss for an in-flight run created before this process restarted.
79
+ for (const resource of listBuildRuns(runtime, projectDataDir)) {
80
+ if (resource.run.run_id === runId)
81
+ return resource;
82
+ }
83
+ return null;
84
+ }
85
+ export function getBuildRunEvents(runtime, projectDataDir, runId) {
86
+ return getBuildRun(runtime, projectDataDir, runId)?.run.events ?? null;
87
+ }
88
+ export function getBuildRunEvidence(runtime, projectDataDir, runId) {
89
+ const run = getBuildRun(runtime, projectDataDir, runId)?.run;
90
+ if (!run)
91
+ return null;
92
+ return run.stages
93
+ .map((stage) => stage.latest_evidence ?? null)
94
+ .filter((evidence) => evidence !== null);
95
+ }
96
+ export function getBuildRunArtifacts(runtime, projectDataDir, runId) {
97
+ const run = getBuildRun(runtime, projectDataDir, runId)?.run;
98
+ if (!run)
99
+ return null;
100
+ return uniqueArtifacts(run.stages.flatMap((stage) => stage.artifacts));
101
+ }
102
+ export async function createBuildRun(runtime, projectDataDir, requestValue) {
103
+ const request = BuildRunCreateRequestSchema.parse(requestValue);
104
+ const projectConfig = runtime.resolveProjectConfig(projectDataDir, request.project);
105
+ const runId = createRunId("build");
106
+ const contextGraphPath = runtime.ensureContextGraphForRun(projectDataDir, projectConfig, runId);
107
+ const now = new Date().toISOString();
108
+ const buildPlan = getBuildPlan(requireSelectedBuildPlan(projectConfig), {
109
+ projectDataDir,
110
+ });
111
+ const stageTotal = buildPlan.stages.length;
112
+ const run = BuildRunSchema.parse({
113
+ kind: "interf-build-run",
114
+ version: 1,
115
+ run_id: runId,
116
+ status: "running",
117
+ project: projectConfig.name,
118
+ build_plan: buildPlan.id,
119
+ backend: "native",
120
+ source_path: resolveProjectSourceBindingPath(projectDataDir, projectConfig),
121
+ context_graph_path: contextGraphPath,
122
+ created_at: now,
123
+ started_at: now,
124
+ stages: buildPlan.stages
125
+ .map((stage, index) => {
126
+ return {
127
+ run_id: runId,
128
+ stage_id: stage.id,
129
+ stage_label: stage.label,
130
+ stage_index: index,
131
+ stage_total: stageTotal,
132
+ status: "queued",
133
+ contract: {
134
+ stage_label: stage.label,
135
+ stage_index: index,
136
+ stage_total: stageTotal,
137
+ reads: stage.reads,
138
+ writes: stage.writes,
139
+ },
140
+ artifacts: [],
141
+ };
142
+ }),
143
+ events: [],
144
+ context_checks: buildPlanContextChecks({
145
+ brief: buildPlan.brief ?? null,
146
+ artifacts: buildPlan.contextInterface?.artifacts ?? buildPlan.schema?.artifacts ?? [],
147
+ }),
148
+ });
149
+ writeBuildRun(runtime, projectDataDir, run);
150
+ runtime.activeBuildRuns.set(runId, {
151
+ projectDataDir,
152
+ contextGraphPath,
153
+ project: projectConfig.name,
154
+ cancelled: false,
155
+ });
156
+ await recordBuildRunEvent(runtime, projectDataDir, contextGraphPath, runId, {
157
+ type: "run.started",
158
+ event_id: createRunEventId("event"),
159
+ run_id: runId,
160
+ timestamp: now,
161
+ project: projectConfig.name,
162
+ build_plan: buildPlan.id,
163
+ context_graph_path: contextGraphPath,
164
+ backend: "native",
165
+ });
166
+ const sink = {
167
+ emit: (event) => recordBuildRunEvent(runtime, projectDataDir, contextGraphPath, runId, event),
168
+ };
169
+ void runBuildInBackground(runtime, projectDataDir, request, {
170
+ runId,
171
+ sourcePath: projectDataDir,
172
+ contextGraphPath,
173
+ projectConfig,
174
+ events: sink,
175
+ });
176
+ const saved = readBuildRun(projectDataDir, runId) ?? run;
177
+ return BuildRunResourceSchema.parse({ run: saved });
178
+ }
179
+ /**
180
+ * Cancel an in-flight Build run. Marks the persisted record as
181
+ * `cancelled`, emits a `run.cancelled` event to capture the cancellation in
182
+ * the run timeline, and clears the active handle so retries may start a
183
+ * fresh run. If the run already finished, returns
184
+ * `{ cancelled: false, reason: "already finished" }` and persists nothing.
185
+ */
186
+ export function cancelBuildRun(runtime, runId) {
187
+ const handle = runtime.activeBuildRuns.get(runId);
188
+ if (!handle) {
189
+ // Either unknown or already terminal. The server route already 404s
190
+ // unknown ids before calling this, so anything reaching here is a run
191
+ // we already finalized.
192
+ return { cancelled: false, reason: "already finished" };
193
+ }
194
+ if (handle.cancelled) {
195
+ return { cancelled: false, reason: "already cancelled" };
196
+ }
197
+ const cancelledAt = new Date().toISOString();
198
+ handle.cancelled = true;
199
+ handle.cancelledAt = cancelledAt;
200
+ const current = readBuildRun(handle.projectDataDir, runId);
201
+ if (current && !isTerminalBuildRunStatus(current.status)) {
202
+ writeBuildRun(runtime, handle.projectDataDir, applyEventToBuildRun(current, {
203
+ type: "run.cancelled",
204
+ event_id: createRunEventId("event"),
205
+ run_id: runId,
206
+ timestamp: cancelledAt,
207
+ reason: "Build cancelled by request.",
208
+ }));
209
+ }
210
+ return { cancelled: true };
211
+ }
212
+ /**
213
+ * Look up the run id previously associated with this idempotency key in
214
+ * `projectDataDir`. Returns null when the key is unknown or its TTL has
215
+ * elapsed. The project argument is required so that the same key in
216
+ * two different projects always returns two different runs.
217
+ */
218
+ export function findIdempotentBuildRun(runtime, projectDataDir, key) {
219
+ const resolvedRoot = resolve(projectDataDir);
220
+ const bucket = runtime.idempotencyKeyCache.get(resolvedRoot);
221
+ if (!bucket)
222
+ return null;
223
+ const entry = bucket.get(key);
224
+ if (!entry)
225
+ return null;
226
+ if (entry.expiresAt <= Date.now()) {
227
+ // Opportunistic single-key prune. The bulk prune runs on writes
228
+ // when the cache crosses the size threshold (see
229
+ // {@link recordIdempotentBuildRun}).
230
+ bucket.delete(key);
231
+ if (bucket.size === 0)
232
+ runtime.idempotencyKeyCache.delete(resolvedRoot);
233
+ return null;
234
+ }
235
+ return entry.runId;
236
+ }
237
+ /**
238
+ * Cache the run id created (or returned) for this idempotency key in
239
+ * `projectDataDir`. Entries expire after `IDEMPOTENCY_TTL_MS`. Pruning
240
+ * is opportunistic: the previous implementation walked every entry on
241
+ * every read AND write, which was O(N) per request. Now we only sweep
242
+ * when the cache grows past {@link IDEMPOTENCY_PRUNE_THRESHOLD}.
243
+ */
244
+ export function recordIdempotentBuildRun(runtime, projectDataDir, key, runId) {
245
+ const resolvedRoot = resolve(projectDataDir);
246
+ let bucket = runtime.idempotencyKeyCache.get(resolvedRoot);
247
+ if (!bucket) {
248
+ bucket = new Map();
249
+ runtime.idempotencyKeyCache.set(resolvedRoot, bucket);
250
+ }
251
+ bucket.set(key, {
252
+ runId,
253
+ expiresAt: Date.now() + IDEMPOTENCY_TTL_MS,
254
+ });
255
+ if (totalIdempotencyEntries(runtime) > IDEMPOTENCY_PRUNE_THRESHOLD) {
256
+ pruneIdempotencyKeyCache(runtime);
257
+ }
258
+ }
259
+ /** Total cached idempotency entries across all projects. */
260
+ function totalIdempotencyEntries(runtime) {
261
+ let total = 0;
262
+ for (const bucket of runtime.idempotencyKeyCache.values())
263
+ total += bucket.size;
264
+ return total;
265
+ }
266
+ function pruneIdempotencyKeyCache(runtime) {
267
+ const now = Date.now();
268
+ for (const [projectDataDir, bucket] of runtime.idempotencyKeyCache) {
269
+ for (const [key, entry] of bucket) {
270
+ if (entry.expiresAt <= now)
271
+ bucket.delete(key);
272
+ }
273
+ if (bucket.size === 0)
274
+ runtime.idempotencyKeyCache.delete(projectDataDir);
275
+ }
276
+ }
277
+ /**
278
+ * Test seam: force the cached entry for `key` in `projectDataDir` to be
279
+ * expired so the next lookup returns null. Returns true when an entry was
280
+ * found and expired. Tests use this in place of fake timers because the
281
+ * idempotency TTL is one hour and faking `Date.now()` would destabilize
282
+ * unrelated runtime state.
283
+ */
284
+ export function expireIdempotencyKeyForTesting(runtime, projectDataDir, key) {
285
+ const bucket = runtime.idempotencyKeyCache.get(resolve(projectDataDir));
286
+ if (!bucket)
287
+ return false;
288
+ const entry = bucket.get(key);
289
+ if (!entry)
290
+ return false;
291
+ entry.expiresAt = Date.now() - 1;
292
+ return true;
293
+ }
294
+ async function runBuildInBackground(runtime, projectDataDir, request, context) {
295
+ runtime.beginActiveRun();
296
+ try {
297
+ if (!runtime.handlers.createBuildRun) {
298
+ throw new Error("No build-run handler is configured for this local service.");
299
+ }
300
+ const result = LocalRunHandlerResultSchema.parse(await runtime.handlers.createBuildRun(request, context));
301
+ const wasCancelled = runtime.activeBuildRuns.get(context.runId)?.cancelled === true;
302
+ if (wasCancelled) {
303
+ // The run was cancelled while the handler was still running. The
304
+ // cancellation path already wrote a `cancelled` record; just refresh
305
+ // observability and skip emitting a second terminal event.
306
+ refreshBuildRunFromRuntime(runtime, projectDataDir, context.contextGraphPath, context.runId);
307
+ await emitRuntimeDerivedEvents(runtime, projectDataDir, context.contextGraphPath, context.runId);
308
+ await recordBuildRunEvent(runtime, projectDataDir, context.contextGraphPath, context.runId, readinessUpdatedEvent(context.runId, context.projectConfig.name, runtime.computeProjectReadiness(projectDataDir, context.projectConfig)));
309
+ return;
310
+ }
311
+ refreshBuildRunFromRuntime(runtime, projectDataDir, context.contextGraphPath, context.runId);
312
+ await emitRuntimeDerivedEvents(runtime, projectDataDir, context.contextGraphPath, context.runId);
313
+ let readinessProjectConfig = context.projectConfig;
314
+ if (!result.ok) {
315
+ await recordBuildRunEvent(runtime, projectDataDir, context.contextGraphPath, context.runId, {
316
+ type: "run.failed",
317
+ event_id: createRunEventId("event"),
318
+ run_id: context.runId,
319
+ timestamp: createRunEventTimestamp(),
320
+ error: result.error ?? "Build failed.",
321
+ });
322
+ }
323
+ else {
324
+ await recordBuildRunEvent(runtime, projectDataDir, context.contextGraphPath, context.runId, {
325
+ type: "run.completed",
326
+ event_id: createRunEventId("event"),
327
+ run_id: context.runId,
328
+ timestamp: createRunEventTimestamp(),
329
+ summary: "Context Graph ready.",
330
+ });
331
+ readinessProjectConfig = markProjectLatestContextGraphRun(projectDataDir, context.projectConfig.name, context.runId);
332
+ runtime.readinessCache.invalidateProject(projectDataDir, context.projectConfig.name);
333
+ }
334
+ await recordBuildRunEvent(runtime, projectDataDir, context.contextGraphPath, context.runId, readinessUpdatedEvent(context.runId, context.projectConfig.name, runtime.computeProjectReadiness(projectDataDir, readinessProjectConfig)));
335
+ emitBillingEventsForRun(projectDataDir, context, runtime);
336
+ }
337
+ catch (error) {
338
+ await recordBuildRunEvent(runtime, projectDataDir, context.contextGraphPath, context.runId, {
339
+ type: "run.failed",
340
+ event_id: createRunEventId("event"),
341
+ run_id: context.runId,
342
+ timestamp: createRunEventTimestamp(),
343
+ error: error instanceof Error ? error.message : String(error),
344
+ });
345
+ await recordBuildRunEvent(runtime, projectDataDir, context.contextGraphPath, context.runId, readinessUpdatedEvent(context.runId, context.projectConfig.name, runtime.computeProjectReadiness(projectDataDir, context.projectConfig)));
346
+ }
347
+ finally {
348
+ runtime.activeBuildRuns.delete(context.runId);
349
+ runtime.endActiveRun();
350
+ }
351
+ }
352
+ export function readBuildRun(projectDataDir, runId) {
353
+ return readBuildRunAt(projectBuildRunPath(projectDataDir, runId));
354
+ }
355
+ function hydrateBuildRunFromRuntime(runtime, projectDataDir, run) {
356
+ if (!isTerminalBuildRunStatus(run.status))
357
+ return run;
358
+ refreshBuildRunFromRuntime(runtime, projectDataDir, run.context_graph_path, run.run_id);
359
+ return readBuildRun(projectDataDir, run.run_id) ?? run;
360
+ }
361
+ export function finalizeInterruptedBuildRuns(runtime, projectDataDir) {
362
+ let projects;
363
+ try {
364
+ projects = listProjectConfigs(loadSourceFolderConfig(projectDataDir));
365
+ }
366
+ catch {
367
+ return;
368
+ }
369
+ for (const project of projects) {
370
+ for (const run of readBuildRunRecordsForProject(projectDataDir, project.name)) {
371
+ if (isTerminalBuildRunStatus(run.status) || runtime.activeBuildRuns.has(run.run_id))
372
+ continue;
373
+ const timestamp = createRunEventTimestamp();
374
+ const interruptedRun = {
375
+ ...run,
376
+ stages: run.stages.map((stage) => {
377
+ if (stage.status !== "running")
378
+ return stage;
379
+ return {
380
+ ...stage,
381
+ status: "failed",
382
+ finished_at: stage.finished_at ?? timestamp,
383
+ summary: stage.summary ?? INTERRUPTED_BUILD_RUN_REASON,
384
+ failure: stage.failure ?? INTERRUPTED_BUILD_RUN_REASON,
385
+ };
386
+ }),
387
+ };
388
+ writeBuildRun(runtime, projectDataDir, applyEventToBuildRun(interruptedRun, {
389
+ type: "run.cancelled",
390
+ event_id: createRunEventId("event"),
391
+ run_id: run.run_id,
392
+ timestamp,
393
+ reason: INTERRUPTED_BUILD_RUN_REASON,
394
+ }));
395
+ }
396
+ }
397
+ }
398
+ /**
399
+ * Emit per-Artifact billing events when a Build run reaches a terminal
400
+ * state. Writes a JSONL file under hidden context-graph runtime
401
+ * metadata. The JSONL output is an observability/dev fixture, NOT
402
+ * production billing data.
403
+ */
404
+ function emitBillingEventsForRun(projectDataDir, context, runtime) {
405
+ try {
406
+ const run = readBuildRun(projectDataDir, context.runId);
407
+ if (!run || run.artifacts.length === 0)
408
+ return;
409
+ const sink = new JsonlBillingEventSink(defaultBillingEventLogPath({
410
+ projectDataDir: projectDataDir,
411
+ projectName: run.project,
412
+ runId: context.runId,
413
+ }));
414
+ const events = buildBillingEventsForRun({
415
+ runId: context.runId,
416
+ project: run.project,
417
+ buildPlanId: run.build_plan,
418
+ accountId: runtime?.currentAccount?.user_id ?? null,
419
+ artifacts: run.artifacts,
420
+ startedAt: run.started_at ?? null,
421
+ finishedAt: run.finished_at ?? null,
422
+ });
423
+ for (const event of events) {
424
+ sink.emit(event);
425
+ }
426
+ }
427
+ catch {
428
+ // Billing is observability-only locally; never let sink failures
429
+ // block a successful build.
430
+ }
431
+ }
432
+ export function writeBuildRun(runtime, projectDataDir, run) {
433
+ mkdirSync(projectBuildRunsRoot(projectDataDir), { recursive: true });
434
+ writeJsonFile(projectBuildRunPath(projectDataDir, run.run_id), BuildRunSchema.parse(run));
435
+ // Bust per-Project list + readiness caches so the next read
436
+ // reflects the write. We invalidate broadly (per-Project, not
437
+ // per-record) because list recompute cost is bounded by run count
438
+ // and the simpler model avoids fan-out bugs.
439
+ runtime.buildRunCache.invalidateProject(projectDataDir, run.project);
440
+ runtime.readinessCache.invalidateProject(projectDataDir, run.project);
441
+ }
442
+ async function recordBuildRunEvent(runtime, projectDataDir, contextGraphPath, runId, event) {
443
+ const current = readBuildRun(projectDataDir, runId);
444
+ if (!current)
445
+ return;
446
+ writeBuildRun(runtime, projectDataDir, applyEventToBuildRun(current, event));
447
+ if (event.type === "stage.passed" || event.type === "stage.failed") {
448
+ refreshBuildRunFromRuntime(runtime, projectDataDir, contextGraphPath, runId);
449
+ }
450
+ }
451
+ function refreshBuildRunFromRuntime(runtime, projectDataDir, contextGraphPath, runId) {
452
+ const current = readBuildRun(projectDataDir, runId);
453
+ if (!current)
454
+ return;
455
+ const state = loadState(contextGraphPath);
456
+ if (!state?.stages)
457
+ return;
458
+ const historyByStage = new Map();
459
+ for (const run of readExecutionStageLedgerHistory(contextGraphPath)) {
460
+ if (run.target_name !== current.project)
461
+ continue;
462
+ const existing = historyByStage.get(run.stage);
463
+ if (!existing || timestampKey(run.updated_at) >= timestampKey(existing.updated_at)) {
464
+ historyByStage.set(run.stage, run);
465
+ }
466
+ }
467
+ const next = {
468
+ ...current,
469
+ stages: current.stages.map((stage) => {
470
+ const stageState = state.stages?.[stage.stage_id];
471
+ if (!stageState)
472
+ return stage;
473
+ const runtimeRun = historyByStage.get(stage.stage_id);
474
+ const artifacts = uniqueArtifacts([
475
+ ...(stage.artifacts ?? []),
476
+ ...stageArtifactRefs(stage.stage_id, stageState.artifacts),
477
+ ]);
478
+ const evidence = stage.latest_evidence ?? (stageState.status === "succeeded"
479
+ ? evidenceForStage({
480
+ runId,
481
+ stageId: stage.stage_id,
482
+ summary: stageState.summary,
483
+ stageState,
484
+ artifacts,
485
+ })
486
+ : null);
487
+ return {
488
+ ...stage,
489
+ started_at: stage.started_at ?? stageState.started_at,
490
+ finished_at: stage.finished_at ?? stageState.finished_at,
491
+ summary: stage.summary ?? stageState.summary ?? null,
492
+ executor: stage.executor ?? runtimeRun?.executor ?? null,
493
+ artifacts,
494
+ logs: stage.logs ?? logsForExecutionStageLedger(runtimeRun) ?? logsForStageRun(stageState),
495
+ latest_evidence: evidence,
496
+ };
497
+ }),
498
+ };
499
+ next.latest_evidence = [...next.stages].reverse().find((stage) => Boolean(stage.latest_evidence))?.latest_evidence ?? next.latest_evidence;
500
+ // Recompute per-Artifact status whenever the Build run is
501
+ // refreshed from runtime state.
502
+ try {
503
+ const buildPlan = getBuildPlan(current.build_plan, { projectDataDir });
504
+ next.artifacts = computeArtifactStatuses({
505
+ buildPlan,
506
+ contextGraphPath,
507
+ stageRuns: next.stages,
508
+ counts: countsFromContextGraphState(state, contextGraphPath),
509
+ });
510
+ next.context_checks = projectContextChecksForRun({
511
+ contextChecks: buildPlanContextChecks({
512
+ brief: buildPlan.brief ?? null,
513
+ artifacts: buildPlan.contextInterface?.artifacts ?? buildPlan.schema?.artifacts ?? [],
514
+ }),
515
+ artifactStatuses: next.artifacts,
516
+ });
517
+ }
518
+ catch {
519
+ next.artifacts = current.artifacts ?? [];
520
+ next.context_checks = current.context_checks ?? [];
521
+ }
522
+ writeBuildRun(runtime, projectDataDir, reconcileBuildRunTerminalStatus(next));
523
+ }
524
+ async function emitRuntimeDerivedEvents(runtime, projectDataDir, contextGraphPath, runId) {
525
+ const state = loadState(contextGraphPath);
526
+ const run = readBuildRun(projectDataDir, runId);
527
+ if (!state?.stages || !run)
528
+ return;
529
+ for (const stage of run.stages) {
530
+ const stageState = state.stages[stage.stage_id];
531
+ if (!stageState)
532
+ continue;
533
+ const artifacts = stageArtifactRefs(stage.stage_id, stageState.artifacts);
534
+ const eventTimestamp = stage.finished_at ?? stageState.finished_at ?? createRunEventTimestamp();
535
+ for (const artifact of artifacts) {
536
+ await recordBuildRunEvent(runtime, projectDataDir, contextGraphPath, runId, {
537
+ type: "artifact.written",
538
+ event_id: createRunEventId("event"),
539
+ run_id: runId,
540
+ timestamp: eventTimestamp,
541
+ stage_id: stage.stage_id,
542
+ artifact,
543
+ });
544
+ }
545
+ if (stageState.status === "succeeded") {
546
+ await recordBuildRunEvent(runtime, projectDataDir, contextGraphPath, runId, {
547
+ type: "evidence.updated",
548
+ event_id: createRunEventId("event"),
549
+ run_id: runId,
550
+ timestamp: eventTimestamp,
551
+ stage_id: stage.stage_id,
552
+ evidence: evidenceForStage({
553
+ runId,
554
+ stageId: stage.stage_id,
555
+ summary: stageState.summary,
556
+ stageState,
557
+ artifacts,
558
+ }),
559
+ });
560
+ }
561
+ }
562
+ }