@interf/compiler 0.22.0 → 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 +268 -0
  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 +40 -30
  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/_qJKnA0dammQ306MG_zMq/_buildManifest.js +0 -11
  415. package/dist/interf-ui/_next/static/_qJKnA0dammQ306MG_zMq/_clientMiddlewareManifest.js +0 -1
  416. package/dist/interf-ui/_next/static/_qJKnA0dammQ306MG_zMq/_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,542 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { actionProposalPath, actionProposalsRoot, byCreatedAtDesc, listJsonFiles, readActionProposalAt, writeJsonFile, } from "./runtime-persistence.js";
3
+ import { ACTION_PLANNER_CLARIFICATION_MESSAGE, actionAssistantMessage, actionCommandPreview, actionTypeFromValues, actionValueBuildPlanIntent, buildPlanAuthoringHintFromPrompt, buildPlanAuthoringPromptFallback, buildPlanIdForProposal, buildPlanLabelFromId, createActionProposalId, directServiceEndpointForAction, hasContextGraphBenchmarkTarget, numberValue, sanitizeActionProposalPlan, stringValue, benchmarkModeFromValues, } from "./runtime-proposal-helpers.js";
4
+ import { ActionProposalApprovalRequestSchema, ActionProposalCreateRequestSchema, ActionProposalPlanSchema, ActionProposalResourceSchema, ActionProposalTypeSchema, } from "./schemas/index.js";
5
+ import { BuildPlanAuthoringActionValuesSchema, ProjectSetupActionValuesSchema, } from "./action-values.js";
6
+ import { buildPlanIdForProjectConfig, buildTestSpecFromSourceFolderConfig, listProjectConfigs, loadSourceFolderConfig, resolveConfiguredSourceFolderPath, resolveProjectSourceBindingPath, } from "../projects/source-config.js";
7
+ import { listSourceFolderChoices } from "../projects/source-folders.js";
8
+ import { artifactRequirementsForPlanAuthoring, requestedArtifactsForPlanAuthoring, } from "./plan-artifact-contract.js";
9
+ import { BuildPlanAuthoringArtifactRequirementSchema, BuildPlanContextCheckDraftSchema, RequestedArtifactSchema, } from "../build-plans/authoring/brief.js";
10
+ import { getExecutorStatus } from "./runtime-executor.js";
11
+ export function listActionProposals(projectDataDir) {
12
+ return byCreatedAtDesc(listJsonFiles(actionProposalsRoot(projectDataDir))
13
+ .map(readActionProposalAt)
14
+ .filter((proposal) => proposal !== null));
15
+ }
16
+ export function getActionProposal(projectDataDir, proposalId) {
17
+ return listActionProposals(projectDataDir).find((proposal) => proposal.proposal_id === proposalId) ?? null;
18
+ }
19
+ export async function createActionProposal(runtime, projectDataDir, requestValue) {
20
+ const request = ActionProposalCreateRequestSchema.parse(requestValue);
21
+ const proposal = ActionProposalResourceSchema.parse({
22
+ ...(await buildActionProposal(runtime, projectDataDir, request)),
23
+ client_origin: request.client_origin,
24
+ });
25
+ writeActionProposal(projectDataDir, proposal);
26
+ return proposal;
27
+ }
28
+ export async function decideActionProposal(runtime, projectDataDir, proposalId, requestValue) {
29
+ const decision = ActionProposalApprovalRequestSchema.parse(requestValue);
30
+ const current = getActionProposal(projectDataDir, proposalId);
31
+ if (!current)
32
+ return null;
33
+ if (current.status !== "awaiting_approval") {
34
+ throw new Error(`Action proposal "${proposalId}" is already ${current.status}.`);
35
+ }
36
+ const now = new Date().toISOString();
37
+ const decided = ActionProposalResourceSchema.parse({
38
+ ...current,
39
+ status: decision.approved ? "approved" : "denied",
40
+ updated_at: now,
41
+ approval: {
42
+ approved: decision.approved,
43
+ decided_at: now,
44
+ ...(decision.note ? { note: decision.note } : {}),
45
+ },
46
+ });
47
+ writeActionProposal(projectDataDir, decided);
48
+ if (!decision.approved)
49
+ return decided;
50
+ try {
51
+ const submission = await submitActionProposal(runtime, projectDataDir, decided);
52
+ const submitted = ActionProposalResourceSchema.parse({
53
+ ...decided,
54
+ status: "submitted",
55
+ updated_at: new Date().toISOString(),
56
+ submitted_run_id: submission.runId,
57
+ submitted_run_type: submission.runType,
58
+ });
59
+ writeActionProposal(projectDataDir, submitted);
60
+ return submitted;
61
+ }
62
+ catch (error) {
63
+ const failed = ActionProposalResourceSchema.parse({
64
+ ...decided,
65
+ status: "failed",
66
+ updated_at: new Date().toISOString(),
67
+ error: error instanceof Error ? error.message : String(error),
68
+ });
69
+ writeActionProposal(projectDataDir, failed);
70
+ return failed;
71
+ }
72
+ }
73
+ export function writeActionProposal(projectDataDir, proposal) {
74
+ mkdirSync(actionProposalsRoot(projectDataDir), { recursive: true });
75
+ writeJsonFile(actionProposalPath(projectDataDir, proposal.proposal_id), ActionProposalResourceSchema.parse(proposal));
76
+ }
77
+ function hasOwnValue(values, key) {
78
+ return Object.prototype.hasOwnProperty.call(values, key);
79
+ }
80
+ function requestedArtifactsFromProposalValues(values) {
81
+ if (!hasOwnValue(values, "requested_artifacts"))
82
+ return undefined;
83
+ return RequestedArtifactSchema.array().parse(values.requested_artifacts);
84
+ }
85
+ function artifactRequirementsFromProposalValues(values) {
86
+ if (!hasOwnValue(values, "artifact_requirements"))
87
+ return undefined;
88
+ return BuildPlanAuthoringArtifactRequirementSchema.array().parse(values.artifact_requirements);
89
+ }
90
+ function contextChecksFromProposalValues(values) {
91
+ if (!hasOwnValue(values, "checks"))
92
+ return undefined;
93
+ return BuildPlanContextCheckDraftSchema.array().parse(values.checks);
94
+ }
95
+ async function planActionProposal(runtime, projectDataDir, request) {
96
+ if (!runtime.handlers.planActionProposal) {
97
+ return ActionProposalPlanSchema.parse({
98
+ action_type: "clarification",
99
+ ...(request.project ? { project: request.project } : {}),
100
+ assistant_message: "No local action planner is configured for this Interf instance.",
101
+ });
102
+ }
103
+ const projects = listProjectConfigs(loadSourceFolderConfig(projectDataDir));
104
+ let rawPlan;
105
+ try {
106
+ rawPlan = await runtime.handlers.planActionProposal(request, {
107
+ sourcePath: projectDataDir,
108
+ projects,
109
+ projectHealth: projects.map((project) => {
110
+ const benchmarkSpec = buildTestSpecFromSourceFolderConfig({
111
+ projectDataDir,
112
+ targetName: project.name,
113
+ targetType: "context-graph",
114
+ });
115
+ const benchmarkQuestions = benchmarkSpec?.cases.length ?? 0;
116
+ const contextGraphReady = hasContextGraphBenchmarkTarget(projectDataDir, project);
117
+ return {
118
+ name: project.name,
119
+ benchmark_questions: benchmarkQuestions,
120
+ context_graph_ready: contextGraphReady,
121
+ can_run_benchmark: benchmarkQuestions > 0 && contextGraphReady,
122
+ recommended_next_actions: contextGraphReady
123
+ ? benchmarkQuestions > 0
124
+ ? ["run benchmark", "improve Build Plan", "build again"]
125
+ : ["draft benchmark questions", "build again"]
126
+ : ["build"],
127
+ };
128
+ }),
129
+ sourceFolders: listSourceFolderChoices(projectDataDir),
130
+ recentProposals: listActionProposals(projectDataDir).slice(0, 5),
131
+ });
132
+ }
133
+ catch {
134
+ return ActionProposalPlanSchema.parse({
135
+ action_type: "clarification",
136
+ ...(request.project ? { project: request.project } : {}),
137
+ assistant_message: ACTION_PLANNER_CLARIFICATION_MESSAGE,
138
+ });
139
+ }
140
+ const parsed = ActionProposalPlanSchema.safeParse(sanitizeActionProposalPlan(rawPlan));
141
+ if (parsed.success)
142
+ return parsed.data;
143
+ return ActionProposalPlanSchema.parse({
144
+ action_type: "clarification",
145
+ ...(request.project ? { project: request.project } : {}),
146
+ assistant_message: ACTION_PLANNER_CLARIFICATION_MESSAGE,
147
+ });
148
+ }
149
+ function directServiceActionClarification(options) {
150
+ const endpoint = directServiceEndpointForAction(options.actionType, {
151
+ project: options.project,
152
+ });
153
+ if (!endpoint) {
154
+ throw new Error(`Action "${options.actionType}" is not a direct deterministic service action.`);
155
+ }
156
+ const label = options.actionType === "project-setup"
157
+ ? "Project setup"
158
+ : options.actionType === "build-plan-change"
159
+ ? "Build Plan change"
160
+ : "Project change";
161
+ const now = new Date().toISOString();
162
+ return ActionProposalResourceSchema.parse({
163
+ kind: "interf-action-proposal",
164
+ version: 1,
165
+ proposal_id: createActionProposalId(),
166
+ status: "needs_clarification",
167
+ action_type: "clarification",
168
+ title: `${label} uses a direct service endpoint`,
169
+ summary: `${label} is deterministic and is not accepted through action proposals.`,
170
+ assistant_message: `${label} must be submitted directly to ${endpoint}. Action proposals are only for freeform planning or async local-agent-backed work.`,
171
+ message: options.message,
172
+ project: options.project ?? null,
173
+ build_plan: options.buildPlan ?? null,
174
+ request: {
175
+ message: options.message,
176
+ endpoint,
177
+ action_type: options.actionType,
178
+ ...(options.values ? { values: options.values } : {}),
179
+ },
180
+ created_at: now,
181
+ updated_at: now,
182
+ proposed_by_executor: getExecutorStatus().executor,
183
+ approval: null,
184
+ submitted_run_id: null,
185
+ submitted_run_type: null,
186
+ error: null,
187
+ });
188
+ }
189
+ async function buildActionProposal(runtime, projectDataDir, request) {
190
+ const structuredProjectSetup = ProjectSetupActionValuesSchema.safeParse(request.values);
191
+ const structuredBuildPlanAuthoring = BuildPlanAuthoringActionValuesSchema.safeParse(request.values);
192
+ const structuredActionType = actionTypeFromValues(request.values);
193
+ const structuredDirectActionType = structuredProjectSetup.success
194
+ ? "project-setup"
195
+ : structuredActionType && directServiceEndpointForAction(structuredActionType)
196
+ ? structuredActionType
197
+ : null;
198
+ if (structuredDirectActionType) {
199
+ return directServiceActionClarification({
200
+ actionType: structuredDirectActionType,
201
+ message: request.message,
202
+ buildPlan: stringValue(request.values, "build_plan") ??
203
+ stringValue(request.values, "build_plan_id") ??
204
+ stringValue(request.values, "new_build_plan_id"),
205
+ project: request.project ?? stringValue(request.values, "project") ?? stringValue(request.values, "name"),
206
+ values: request.values,
207
+ });
208
+ }
209
+ const structuredPlanActionType = structuredBuildPlanAuthoring.success ? "build-plan-draft" : structuredActionType;
210
+ // Typed UI/CLI actions already carry the service contract; only freeform chat needs planner inference.
211
+ const plan = structuredPlanActionType
212
+ ? ActionProposalPlanSchema.parse({
213
+ action_type: structuredPlanActionType,
214
+ ...(request.project ? { project: request.project } : {}),
215
+ })
216
+ : await planActionProposal(runtime, projectDataDir, request);
217
+ const actionType = structuredPlanActionType ?? plan.action_type;
218
+ if (directServiceEndpointForAction(actionType)) {
219
+ return directServiceActionClarification({
220
+ actionType,
221
+ message: request.message,
222
+ buildPlan: plan.build_plan ??
223
+ stringValue(plan.values, "build_plan") ??
224
+ stringValue(plan.values, "build_plan_id") ??
225
+ stringValue(request.values, "build_plan") ??
226
+ stringValue(request.values, "build_plan_id"),
227
+ project: plan.project ?? request.project ?? stringValue(plan.values, "project") ?? stringValue(request.values, "project"),
228
+ values: {
229
+ ...(plan.values ?? {}),
230
+ ...(request.values ?? {}),
231
+ },
232
+ });
233
+ }
234
+ const usePlannerText = !structuredPlanActionType && plan.action_type === actionType;
235
+ const now = new Date().toISOString();
236
+ if (actionType === "clarification") {
237
+ return ActionProposalResourceSchema.parse({
238
+ kind: "interf-action-proposal",
239
+ version: 1,
240
+ proposal_id: createActionProposalId(),
241
+ status: "needs_clarification",
242
+ action_type: actionType,
243
+ title: plan.title ?? "Clarify Interf action",
244
+ summary: plan.summary ?? "No local run was proposed because the request did not resolve to a confirmed Interf action.",
245
+ assistant_message: plan.assistant_message ?? ACTION_PLANNER_CLARIFICATION_MESSAGE,
246
+ ...(plan.command_preview ? { command_preview: plan.command_preview } : {}),
247
+ message: request.message,
248
+ project: plan.project ?? request.project ?? null,
249
+ build_plan: plan.build_plan ?? null,
250
+ request: {
251
+ message: request.message,
252
+ ...(plan.values ? { values: plan.values } : {}),
253
+ },
254
+ created_at: now,
255
+ updated_at: now,
256
+ proposed_by_executor: getExecutorStatus().executor,
257
+ approval: null,
258
+ submitted_run_id: null,
259
+ submitted_run_type: null,
260
+ error: null,
261
+ });
262
+ }
263
+ const proposalValues = {
264
+ ...(plan.values ?? {}),
265
+ ...(request.values ?? {}),
266
+ };
267
+ if (actionType === "build-plan-draft" || actionType === "build-plan-improvement") {
268
+ const requestedProjectName = plan.project ?? request.project ?? null;
269
+ const fallbackProject = requestedProjectName
270
+ ? null
271
+ : listProjectConfigs(loadSourceFolderConfig(projectDataDir))[0] ?? null;
272
+ const projectConfig = requestedProjectName
273
+ ? runtime.resolveProjectConfig(projectDataDir, requestedProjectName)
274
+ : fallbackProject;
275
+ const projectPath = projectConfig
276
+ ? resolveProjectSourceBindingPath(projectDataDir, projectConfig)
277
+ : resolveConfiguredSourceFolderPath(projectDataDir) ?? projectDataDir;
278
+ const requestedBuildPlanId = stringValue(request.values, "build_plan_id") ??
279
+ stringValue(request.values, "build_plan");
280
+ const plannedBuildPlanId = plan.build_plan ??
281
+ stringValue(plan.values, "build_plan_id") ??
282
+ stringValue(plan.values, "build_plan");
283
+ const buildPlanId = requestedBuildPlanId ?? plannedBuildPlanId ?? buildPlanIdForProposal(request.message, proposalValues);
284
+ const intent = actionValueBuildPlanIntent(proposalValues) ??
285
+ stringValue(proposalValues, "intent") ??
286
+ buildPlanAuthoringPromptFallback(request.message, buildPlanId);
287
+ const hint = stringValue(proposalValues, "hint") ?? buildPlanAuthoringHintFromPrompt(intent);
288
+ const explicitRequestedArtifacts = requestedArtifactsFromProposalValues(proposalValues);
289
+ const requestedArtifacts = requestedArtifactsForPlanAuthoring({
290
+ projectDataDir,
291
+ projectConfig: projectConfig ?? null,
292
+ explicitRequestedArtifacts,
293
+ });
294
+ const explicitArtifactRequirements = artifactRequirementsFromProposalValues(proposalValues);
295
+ const baseBuildPlanId = stringValue(proposalValues, "base_build_plan_id");
296
+ const referenceBuildPlanId = stringValue(proposalValues, "reference_build_plan_id");
297
+ const userPrepInstructions = stringValue(proposalValues, "user_prep_instructions");
298
+ const actionRequest = {
299
+ project: projectConfig?.name ?? null,
300
+ source_folder_path: projectPath,
301
+ build_plan_id: buildPlanId,
302
+ ...(baseBuildPlanId ? { base_build_plan_id: baseBuildPlanId } : {}),
303
+ ...(referenceBuildPlanId ? { reference_build_plan_id: referenceBuildPlanId } : {}),
304
+ label: stringValue(proposalValues, "label") ?? buildPlanLabelFromId(buildPlanId),
305
+ hint,
306
+ intent,
307
+ checks: contextChecksFromProposalValues(proposalValues) ?? [],
308
+ ...(userPrepInstructions ? { user_prep_instructions: userPrepInstructions } : {}),
309
+ requested_artifacts: requestedArtifacts,
310
+ source_context: proposalValues.source_context ?? null,
311
+ artifact_requirements: artifactRequirementsForPlanAuthoring({
312
+ projectDataDir,
313
+ projectConfig: projectConfig ?? null,
314
+ requestedArtifacts,
315
+ explicitArtifactRequirements,
316
+ }),
317
+ };
318
+ const commandPreview = (usePlannerText ? plan.command_preview : undefined) ??
319
+ actionCommandPreview(actionType, projectConfig?.name ?? null, buildPlanId, proposalValues);
320
+ return ActionProposalResourceSchema.parse({
321
+ kind: "interf-action-proposal",
322
+ version: 1,
323
+ proposal_id: createActionProposalId(),
324
+ status: "awaiting_approval",
325
+ action_type: actionType,
326
+ title: (usePlannerText ? plan.title : undefined) ?? `Draft Build Plan ${buildPlanId}`,
327
+ summary: (usePlannerText ? plan.summary : undefined) ?? "Ask the configured local executor to draft a Build Plan for requested Artifacts and Context Checks.",
328
+ assistant_message: (usePlannerText ? plan.assistant_message : undefined) ??
329
+ actionAssistantMessage(actionType, projectConfig?.name ?? null, commandPreview),
330
+ command_preview: commandPreview,
331
+ message: request.message,
332
+ project: projectConfig?.name ?? null,
333
+ build_plan: buildPlanId,
334
+ request: actionRequest,
335
+ created_at: now,
336
+ updated_at: now,
337
+ proposed_by_executor: getExecutorStatus().executor,
338
+ approval: null,
339
+ submitted_run_id: null,
340
+ submitted_run_type: null,
341
+ error: null,
342
+ });
343
+ }
344
+ const projectConfig = runtime.resolveProjectConfig(projectDataDir, plan.project ?? request.project ?? runtime.defaultProjectId(projectDataDir));
345
+ const proposalActionType = ActionProposalTypeSchema.parse(actionType);
346
+ const projectPath = resolveProjectSourceBindingPath(projectDataDir, projectConfig);
347
+ const requestedBuildPlanId = stringValue(request.values, "build_plan_id") ??
348
+ stringValue(request.values, "build_plan");
349
+ const plannedBuildPlanId = plan.build_plan ??
350
+ stringValue(plan.values, "build_plan_id") ??
351
+ stringValue(plan.values, "build_plan");
352
+ const buildPlanId = requestedBuildPlanId ?? plannedBuildPlanId ?? buildPlanIdForProjectConfig(projectConfig);
353
+ const clarifyResolvedAction = (options) => ActionProposalResourceSchema.parse({
354
+ kind: "interf-action-proposal",
355
+ version: 1,
356
+ proposal_id: createActionProposalId(),
357
+ status: "needs_clarification",
358
+ action_type: "clarification",
359
+ title: options.title,
360
+ summary: options.summary,
361
+ assistant_message: options.assistantMessage,
362
+ message: request.message,
363
+ project: projectConfig.name,
364
+ build_plan: buildPlanId ?? null,
365
+ request: {
366
+ message: request.message,
367
+ ...(proposalValues ? { values: proposalValues } : {}),
368
+ },
369
+ created_at: now,
370
+ updated_at: now,
371
+ proposed_by_executor: getExecutorStatus().executor,
372
+ approval: null,
373
+ submitted_run_id: null,
374
+ submitted_run_type: null,
375
+ error: null,
376
+ });
377
+ const requestedBenchmarkMode = actionType === "benchmark"
378
+ ? benchmarkModeFromValues(proposalValues)
379
+ : null;
380
+ if (actionType === "benchmark") {
381
+ const benchmarkSpec = buildTestSpecFromSourceFolderConfig({
382
+ projectDataDir,
383
+ targetName: projectConfig.name,
384
+ targetType: requestedBenchmarkMode === "source-files" ? "source-files" : "context-graph",
385
+ });
386
+ const hasBenchmarkChecks = (benchmarkSpec?.cases.length ?? 0) > 0;
387
+ const contextGraphReady = hasContextGraphBenchmarkTarget(projectDataDir, projectConfig);
388
+ if (!hasBenchmarkChecks) {
389
+ return clarifyResolvedAction({
390
+ title: `Add benchmark questions for ${projectConfig.name}`,
391
+ summary: "Benchmark evaluation needs saved Q&A / fact-check questions.",
392
+ assistantMessage: `Project "${projectConfig.name}" does not have saved benchmark questions yet. Ask me to draft benchmark questions after the Source is ready, or add evaluation guidance first.`,
393
+ });
394
+ }
395
+ if (!contextGraphReady) {
396
+ return clarifyResolvedAction({
397
+ title: `Build ${projectConfig.name} first`,
398
+ summary: "Benchmark evaluation needs a built Context Graph with a recorded Source Manifest.",
399
+ assistantMessage: `Project "${projectConfig.name}" has no built Context Graph yet. Build it first; after that Interf can run source-files and Context Graph benchmark targets from the same recorded Source Manifest.`,
400
+ });
401
+ }
402
+ }
403
+ const actionRequest = (() => {
404
+ if (actionType === "build") {
405
+ return {
406
+ project: projectConfig.name,
407
+ };
408
+ }
409
+ if (actionType === "benchmark") {
410
+ return {
411
+ project: projectConfig.name,
412
+ target: requestedBenchmarkMode ?? "both",
413
+ };
414
+ }
415
+ if (actionType === "benchmark-question-draft") {
416
+ return {
417
+ project: projectConfig.name,
418
+ source_folder_path: projectPath,
419
+ intent: stringValue(proposalValues, "intent") ?? request.message,
420
+ target_count: Math.max(1, Math.min(8, Math.round(numberValue(proposalValues, "target_count") ?? 4))),
421
+ };
422
+ }
423
+ const fallbackBuildPlanId = buildPlanId ?? buildPlanIdForProposal(request.message, proposalValues);
424
+ const intent = actionValueBuildPlanIntent(proposalValues) ??
425
+ stringValue(proposalValues, "intent") ??
426
+ buildPlanAuthoringPromptFallback(request.message, fallbackBuildPlanId);
427
+ const hint = stringValue(proposalValues, "hint") ?? buildPlanAuthoringHintFromPrompt(intent);
428
+ const explicitRequestedArtifacts = requestedArtifactsFromProposalValues(proposalValues);
429
+ const requestedArtifacts = requestedArtifactsForPlanAuthoring({
430
+ projectDataDir,
431
+ projectConfig: projectConfig,
432
+ explicitRequestedArtifacts,
433
+ });
434
+ const explicitArtifactRequirements = artifactRequirementsFromProposalValues(proposalValues);
435
+ const baseBuildPlanId = stringValue(proposalValues, "base_build_plan_id");
436
+ const referenceBuildPlanId = stringValue(proposalValues, "reference_build_plan_id");
437
+ const userPrepInstructions = stringValue(proposalValues, "user_prep_instructions");
438
+ return {
439
+ project: projectConfig.name,
440
+ source_folder_path: projectPath,
441
+ build_plan_id: fallbackBuildPlanId,
442
+ ...(baseBuildPlanId ? { base_build_plan_id: baseBuildPlanId } : {}),
443
+ ...(referenceBuildPlanId ? { reference_build_plan_id: referenceBuildPlanId } : {}),
444
+ label: stringValue(proposalValues, "label") ?? buildPlanLabelFromId(fallbackBuildPlanId),
445
+ hint,
446
+ intent,
447
+ checks: contextChecksFromProposalValues(proposalValues) ?? [],
448
+ ...(userPrepInstructions ? { user_prep_instructions: userPrepInstructions } : {}),
449
+ requested_artifacts: requestedArtifacts,
450
+ source_context: proposalValues.source_context ?? null,
451
+ artifact_requirements: artifactRequirementsForPlanAuthoring({
452
+ projectDataDir,
453
+ projectConfig: projectConfig,
454
+ requestedArtifacts,
455
+ explicitArtifactRequirements,
456
+ }),
457
+ };
458
+ })();
459
+ const title = (() => {
460
+ if (plan.title)
461
+ return plan.title;
462
+ if (proposalActionType === "build")
463
+ return `Build ${projectConfig.name}`;
464
+ if (proposalActionType === "benchmark")
465
+ return `Benchmark ${projectConfig.name}`;
466
+ if (proposalActionType === "benchmark-question-draft")
467
+ return `Draft benchmark questions for ${projectConfig.name}`;
468
+ return `Draft Build Plan ${buildPlanId}`;
469
+ })();
470
+ const summary = (() => {
471
+ if (plan.summary)
472
+ return plan.summary;
473
+ if (proposalActionType === "build")
474
+ return "Build a Context Graph with summaries, claims, links back to sources, Build evidence, and traces.";
475
+ if (proposalActionType === "benchmark")
476
+ return "Run Q&A / fact-check benchmarks against source files and Context Graph.";
477
+ if (proposalActionType === "benchmark-question-draft")
478
+ return "Ask the configured local executor to draft saved Q&A / fact-check evaluation questions.";
479
+ return "Ask the configured local executor to draft a Build Plan for requested Artifacts and Context Checks.";
480
+ })();
481
+ const previewValues = proposalValues;
482
+ const commandPreview = plan.command_preview ?? actionCommandPreview(proposalActionType, projectConfig.name, buildPlanId, previewValues);
483
+ return ActionProposalResourceSchema.parse({
484
+ kind: "interf-action-proposal",
485
+ version: 1,
486
+ proposal_id: createActionProposalId(),
487
+ status: "awaiting_approval",
488
+ action_type: proposalActionType,
489
+ title,
490
+ summary,
491
+ assistant_message: plan.assistant_message ?? actionAssistantMessage(proposalActionType, projectConfig.name, commandPreview),
492
+ command_preview: commandPreview,
493
+ message: request.message,
494
+ project: projectConfig.name,
495
+ build_plan: buildPlanId,
496
+ request: actionRequest,
497
+ created_at: now,
498
+ updated_at: now,
499
+ proposed_by_executor: getExecutorStatus().executor,
500
+ approval: null,
501
+ submitted_run_id: null,
502
+ submitted_run_type: null,
503
+ error: null,
504
+ });
505
+ }
506
+ async function submitActionProposal(runtime, projectDataDir, proposal) {
507
+ if (proposal.action_type === "clarification") {
508
+ throw new Error("Clarification proposals cannot be submitted.");
509
+ }
510
+ if (proposal.action_type === "build") {
511
+ const resource = await runtime.createBuildRun(projectDataDir, proposal.request);
512
+ return {
513
+ runId: resource.run.run_id,
514
+ runType: "build-run",
515
+ };
516
+ }
517
+ if (proposal.action_type === "benchmark") {
518
+ const resource = await runtime.createVerifyRun(projectDataDir, proposal.request);
519
+ return {
520
+ runId: resource.run_id,
521
+ runType: "verify-run",
522
+ };
523
+ }
524
+ if (proposal.action_type === "benchmark-question-draft") {
525
+ const job = await runtime.createBenchmarkQuestionDraftRun(projectDataDir, proposal.request);
526
+ return {
527
+ runId: job.run_id,
528
+ runType: "job-run",
529
+ };
530
+ }
531
+ const directEndpoint = directServiceEndpointForAction(proposal.action_type, {
532
+ project: proposal.project,
533
+ });
534
+ if (directEndpoint) {
535
+ throw new Error(`Action "${proposal.action_type}" must be submitted directly to ${directEndpoint}.`);
536
+ }
537
+ const job = await runtime.createBuildPlanAuthoringRun(projectDataDir, proposal.request, proposal.action_type === "build-plan-improvement" ? "build-plan-improvement" : "build-plan-draft");
538
+ return {
539
+ runId: job.run_id,
540
+ runType: "job-run",
541
+ };
542
+ }
@@ -0,0 +1,5 @@
1
+ import { type BuildPlanChangeResult, type BuildPlanResource } from "./schemas/index.js";
2
+ import type { LocalServiceRuntime } from "./runtime.js";
3
+ export declare function listBuildPlans(runtime: LocalServiceRuntime, projectDataDir: string): BuildPlanResource[];
4
+ export declare function getBuildPlanResource(runtime: LocalServiceRuntime, projectDataDir: string, buildPlanId: string): BuildPlanResource | null;
5
+ export declare function applyBuildPlanChange(runtime: LocalServiceRuntime, projectDataDir: string, requestValue: unknown): BuildPlanChangeResult;
@@ -0,0 +1,131 @@
1
+ import { existsSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { asProjectDataDir, projectBuildPlansRoot, userBuildPlansRoot, } from "../contracts/lib/project-paths.js";
4
+ import { buildPlanIdForProjectConfig, DEFAULT_BUILD_PLAN_ID, listProjectConfigs, loadSourceFolderConfig, saveSourceFolderConfig, } from "../projects/source-config.js";
5
+ import { listBuildPlanChoices, } from "../build-plans/package/build-plan-definitions.js";
6
+ import { buildPlanDefinitionPath, resolveBuildPlanPackageSourcePath, } from "../build-plans/package/local-build-plans.js";
7
+ import { seedLocalBuildPlanPackageFromBase, } from "../build-plans/package/interf-build-plan-package.js";
8
+ import { PACKAGE_ROOT } from "../build-plans/package/lib/package-root.js";
9
+ import { buildBuildPlanResource, } from "./runtime-resource-builders.js";
10
+ import { buildPlanLabelFromId, } from "./runtime-proposal-helpers.js";
11
+ function detachBuildPlanFromProject(project, buildPlanId) {
12
+ if (buildPlanIdForProjectConfig(project) !== buildPlanId)
13
+ return project;
14
+ const { build_plan: _removedBuildPlan, ...detachedProject } = project;
15
+ return detachedProject;
16
+ }
17
+ import { BuildPlanChangeCreateRequestSchema, BuildPlanChangeResultSchema, } from "./schemas/index.js";
18
+ export function listBuildPlans(runtime, projectDataDir) {
19
+ // The Build Plan choices list is dominated by repeated reads of
20
+ // build-plan.json + build-plan.schema.json across bundled, user-library, and
21
+ // Project-local Build Plan package roots. Key the cache off mtimes; if
22
+ // any of them changes (a new local Build Plan, an edit to the user
23
+ // library, etc.) the cache misses and we re-resolve.
24
+ const builtinRoot = join(PACKAGE_ROOT, "public-repo", "build-plans");
25
+ const localRoot = projectBuildPlansRoot(asProjectDataDir(projectDataDir));
26
+ const userRoot = userBuildPlansRoot();
27
+ return runtime.buildPlanListingCache.get(projectDataDir, [builtinRoot, localRoot, userRoot], () => {
28
+ const projects = listProjectConfigs(loadSourceFolderConfig(projectDataDir));
29
+ const choices = listBuildPlanChoices(projectDataDir);
30
+ return choices.map((buildPlan) => {
31
+ const activeForProjects = projects
32
+ .filter((project) => buildPlanIdForProjectConfig(project) === buildPlan.id)
33
+ .map((project) => project.name);
34
+ return buildBuildPlanResource({
35
+ id: buildPlan.id,
36
+ path: resolveBuildPlanPackageSourcePath(projectDataDir, buildPlan.id) ?? buildPlan.id,
37
+ label: buildPlan.label,
38
+ hint: buildPlan.hint,
39
+ purpose: buildPlan.purpose,
40
+ brief: buildPlan.brief,
41
+ inputs: buildPlan.inputs,
42
+ source_kind: buildPlan.scope === "builtin" ? "builtin" : "local",
43
+ built_in: buildPlan.scope === "builtin",
44
+ active_for_projects: activeForProjects,
45
+ artifacts: buildPlan.contextInterface?.artifacts ?? [],
46
+ stages: buildPlan.stages.map((stage) => ({
47
+ id: stage.id,
48
+ label: stage.label,
49
+ description: stage.description,
50
+ contract_type: stage.contractType,
51
+ skill_dir: stage.skillDir,
52
+ role: stage.role && stage.role.trim().length > 0 ? stage.role : "general",
53
+ reads: stage.reads,
54
+ writes: stage.writes,
55
+ })),
56
+ });
57
+ });
58
+ });
59
+ }
60
+ export function getBuildPlanResource(runtime, projectDataDir, buildPlanId) {
61
+ return listBuildPlans(runtime, projectDataDir).find((buildPlan) => buildPlan.id === buildPlanId) ?? null;
62
+ }
63
+ export function applyBuildPlanChange(runtime, projectDataDir, requestValue) {
64
+ const request = BuildPlanChangeCreateRequestSchema.parse(requestValue);
65
+ const buildPlanId = request.build_plan;
66
+ const outputPath = request.operation === "duplicate"
67
+ ? buildPlanDefinitionPath(projectDataDir, request.new_build_plan_id)
68
+ : buildPlanDefinitionPath(projectDataDir, buildPlanId);
69
+ if (request.operation === "duplicate") {
70
+ if (resolveBuildPlanPackageSourcePath(projectDataDir, request.new_build_plan_id)) {
71
+ throw new Error(`Build Plan "${request.new_build_plan_id}" already exists.`);
72
+ }
73
+ if (!resolveBuildPlanPackageSourcePath(projectDataDir, buildPlanId)) {
74
+ throw new Error(`Build Plan "${buildPlanId}" does not exist.`);
75
+ }
76
+ const label = request.label ?? buildPlanLabelFromId(request.new_build_plan_id);
77
+ const hint = request.hint ?? `Duplicate of ${buildPlanId}`;
78
+ const buildPlanPath = seedLocalBuildPlanPackageFromBase({
79
+ projectDataDir,
80
+ baseBuildPlanId: buildPlanId,
81
+ buildPlanId: request.new_build_plan_id,
82
+ label,
83
+ hint,
84
+ });
85
+ runtime.buildPlanListingCache.invalidate(projectDataDir);
86
+ return BuildPlanChangeResultSchema.parse({
87
+ kind: "interf-build-plan-change-result",
88
+ version: 1,
89
+ operation: "duplicate",
90
+ build_plan: buildPlanId,
91
+ new_build_plan_id: request.new_build_plan_id,
92
+ updated_projects: [],
93
+ build_plan_path: buildPlanPath,
94
+ changed: true,
95
+ message: `Duplicated Build Plan ${buildPlanId} as ${request.new_build_plan_id}.`,
96
+ });
97
+ }
98
+ if (request.confirmation !== buildPlanId) {
99
+ throw new Error(`Type ${buildPlanId} to confirm Build Plan removal.`);
100
+ }
101
+ const localBuildPlanPath = buildPlanDefinitionPath(projectDataDir, buildPlanId);
102
+ if (buildPlanId === DEFAULT_BUILD_PLAN_ID || !existsSync(localBuildPlanPath)) {
103
+ throw new Error(`Build Plan "${buildPlanId}" is not a removable local Build Plan.`);
104
+ }
105
+ const projects = listProjectConfigs(loadSourceFolderConfig(projectDataDir));
106
+ const updatedProjects = projects
107
+ .filter((project) => buildPlanIdForProjectConfig(project) === buildPlanId);
108
+ if (updatedProjects.length > 0) {
109
+ saveSourceFolderConfig(projectDataDir, {
110
+ projects: projects.map((project) => detachBuildPlanFromProject(project, buildPlanId)),
111
+ });
112
+ // Detaching a Build Plan changes readiness shape for those Projects.
113
+ for (const project of updatedProjects) {
114
+ runtime.readinessCache.invalidateProject(projectDataDir, project.name);
115
+ }
116
+ }
117
+ rmSync(outputPath, { recursive: true, force: true });
118
+ runtime.buildPlanListingCache.invalidate(projectDataDir);
119
+ return BuildPlanChangeResultSchema.parse({
120
+ kind: "interf-build-plan-change-result",
121
+ version: 1,
122
+ operation: "remove",
123
+ build_plan: buildPlanId,
124
+ updated_projects: updatedProjects.map((project) => project.name),
125
+ build_plan_path: outputPath,
126
+ changed: true,
127
+ message: updatedProjects.length > 0
128
+ ? `Removed Build Plan ${buildPlanId} and cleared it from ${updatedProjects.length} Project(s).`
129
+ : `Removed Build Plan ${buildPlanId}.`,
130
+ });
131
+ }