@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,198 @@
1
+ import { join } from "node:path";
2
+ import { InterfMcpHandoffSchema } from "../schemas/index.js";
3
+ import { buildInterfMcpHandoff } from "../agent-handoff.js";
4
+ import { buildLocalServiceUrl, LOCAL_SERVICE_ROUTES } from "./routes.js";
5
+ import { readJsonBody, sendError, sendJson, } from "./server-helpers.js";
6
+ import { packageRoot } from "./server-api-files.js";
7
+ export async function tryHandleExecutor(req, res, runtime, path, method) {
8
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.executor) {
9
+ sendJson(res, 200, runtime.getExecutorStatus());
10
+ return true;
11
+ }
12
+ if (method === "POST" && path === LOCAL_SERVICE_ROUTES.executor) {
13
+ const body = await readJsonBody(req);
14
+ sendJson(res, 202, runtime.selectExecutor(body));
15
+ return true;
16
+ }
17
+ return false;
18
+ }
19
+ export async function tryHandleAgents(req, res, runtime, path, method) {
20
+ if (path === LOCAL_SERVICE_ROUTES.agents) {
21
+ if (method === "GET") {
22
+ sendJson(res, 200, runtime.getAgentsRegistry());
23
+ return true;
24
+ }
25
+ if (method === "POST") {
26
+ try {
27
+ const body = (await readJsonBody(req));
28
+ if (!body || typeof body !== "object") {
29
+ sendError(res, 400, "Request body must be a JSON object.");
30
+ return true;
31
+ }
32
+ if (!body.name || typeof body.name !== "string") {
33
+ sendError(res, 400, "Missing required field: name");
34
+ return true;
35
+ }
36
+ if (!body.display_name || typeof body.display_name !== "string") {
37
+ sendError(res, 400, "Missing required field: display_name");
38
+ return true;
39
+ }
40
+ if (!body.command || typeof body.command !== "string") {
41
+ sendError(res, 400, "Missing required field: command");
42
+ return true;
43
+ }
44
+ const updated = runtime.registerCustomAgent({
45
+ name: body.name,
46
+ display_name: body.display_name,
47
+ command: body.command,
48
+ });
49
+ sendJson(res, 201, updated);
50
+ }
51
+ catch (error) {
52
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
53
+ }
54
+ return true;
55
+ }
56
+ }
57
+ if (method === "GET" && path === `${LOCAL_SERVICE_ROUTES.agents}/roles`) {
58
+ sendJson(res, 200, {
59
+ kind: "interf-canonical-roles",
60
+ version: 1,
61
+ roles: ["extractor", "summarizer", "structurer", "verifier", "general"],
62
+ });
63
+ return true;
64
+ }
65
+ if (method === "GET" && path === `${LOCAL_SERVICE_ROUTES.mcp}/connect`) {
66
+ const serviceUrl = buildLocalServiceUrl({ host: runtime.host, port: runtime.port });
67
+ const skillPath = join(packageRoot(), "public-repo", "skills", "interf", "SKILL.md");
68
+ const mcpBinPath = join(packageRoot(), "dist", "bin-mcp.js");
69
+ const mcpArgs = [mcpBinPath, "--profile", "app", "--url", serviceUrl];
70
+ if (runtime.authToken) {
71
+ mcpArgs.push("--token", runtime.authToken);
72
+ }
73
+ sendJson(res, 200, InterfMcpHandoffSchema.parse(buildInterfMcpHandoff({
74
+ serviceUrl,
75
+ authToken: runtime.authToken,
76
+ skillPath,
77
+ mcpCommand: process.execPath,
78
+ mcpArgs,
79
+ })));
80
+ return true;
81
+ }
82
+ if (path === `${LOCAL_SERVICE_ROUTES.agents}/role-map`) {
83
+ if (method === "GET") {
84
+ const registry = runtime.getAgentsRegistry();
85
+ sendJson(res, 200, {
86
+ role_map: registry.role_map,
87
+ active_agent: registry.active_agent,
88
+ });
89
+ return true;
90
+ }
91
+ if (method === "PATCH") {
92
+ try {
93
+ const body = (await readJsonBody(req));
94
+ if (!body || typeof body !== "object") {
95
+ sendError(res, 400, "Request body must be a JSON object.");
96
+ return true;
97
+ }
98
+ const patch = {};
99
+ for (const [role, value] of Object.entries(body)) {
100
+ if (typeof value !== "string") {
101
+ sendError(res, 400, `Role-map values must be strings (or "" to clear). Got ${typeof value} for role "${role}".`);
102
+ return true;
103
+ }
104
+ patch[role] = value;
105
+ }
106
+ const updated = runtime.patchAgentsRoleMap(patch);
107
+ sendJson(res, 200, updated);
108
+ }
109
+ catch (error) {
110
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
111
+ }
112
+ return true;
113
+ }
114
+ }
115
+ // /v1/agents/<name> — DELETE removes a custom agent (built-in names
116
+ // return 400). PATCH updates the agent's stored prefs (env vars, model,
117
+ // effort) for built-ins or custom agents alike.
118
+ const agentMatch = path.match(/^\/v1\/agents\/([^/]+)$/);
119
+ if (agentMatch?.[1] && method === "DELETE") {
120
+ const name = decodeURIComponent(agentMatch[1]);
121
+ try {
122
+ const updated = runtime.unregisterCustomAgent(name);
123
+ sendJson(res, 200, updated);
124
+ }
125
+ catch (error) {
126
+ const message = error instanceof Error ? error.message : String(error);
127
+ const status = /built-in agent/.test(message) ? 400 : 404;
128
+ sendError(res, status, message);
129
+ }
130
+ return true;
131
+ }
132
+ if (agentMatch?.[1] && method === "PATCH") {
133
+ const name = decodeURIComponent(agentMatch[1]);
134
+ try {
135
+ const body = (await readJsonBody(req));
136
+ if (!body || typeof body !== "object") {
137
+ sendError(res, 400, "Request body must be a JSON object.");
138
+ return true;
139
+ }
140
+ const prefs = {};
141
+ if ("env_vars" in body) {
142
+ const value = body.env_vars;
143
+ if (value === null || value === undefined) {
144
+ // explicit clear — no env_vars in prefs
145
+ }
146
+ else if (typeof value === "object" && !Array.isArray(value)) {
147
+ const entries = {};
148
+ for (const [k, v] of Object.entries(value)) {
149
+ if (typeof v !== "string") {
150
+ sendError(res, 400, `env_vars values must be strings. Got ${typeof v} for "${k}".`);
151
+ return true;
152
+ }
153
+ entries[k] = v;
154
+ }
155
+ if (Object.keys(entries).length > 0)
156
+ prefs.env_vars = entries;
157
+ }
158
+ else {
159
+ sendError(res, 400, "env_vars must be an object of string→string entries.");
160
+ return true;
161
+ }
162
+ }
163
+ if ("model" in body) {
164
+ const value = body.model;
165
+ if (value === null || value === "" || value === undefined) {
166
+ prefs.model = null;
167
+ }
168
+ else if (typeof value === "string") {
169
+ prefs.model = value;
170
+ }
171
+ else {
172
+ sendError(res, 400, "model must be a string or null.");
173
+ return true;
174
+ }
175
+ }
176
+ if ("effort" in body) {
177
+ const value = body.effort;
178
+ if (value === null || value === "" || value === undefined) {
179
+ prefs.effort = null;
180
+ }
181
+ else if (typeof value === "string") {
182
+ prefs.effort = value;
183
+ }
184
+ else {
185
+ sendError(res, 400, "effort must be a string or null.");
186
+ return true;
187
+ }
188
+ }
189
+ const updated = runtime.setAgentPrefs(name, prefs);
190
+ sendJson(res, 200, updated);
191
+ }
192
+ catch (error) {
193
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
194
+ }
195
+ return true;
196
+ }
197
+ return false;
198
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Auth routes for the desktop shell.
3
+ *
4
+ * The CLI's `interf auth login` command runs the loopback PKCE flow
5
+ * in-process and writes the session itself. The desktop app cannot do
6
+ * that — it is a Zero Native (Zig + WKWebView) binary with no Node
7
+ * runtime — so it asks the engine to run the same flow on its behalf
8
+ * and waits for the result.
9
+ *
10
+ * The flow is identical to the CLI path:
11
+ *
12
+ * 1. Engine binds a fresh loopback HTTP server on 127.0.0.1.
13
+ * 2. Engine asks WorkOS for a PKCE authorize URL bound to that
14
+ * callback URL and opens the user's system browser at it.
15
+ * 3. User completes AuthKit; AuthKit redirects to the loopback
16
+ * server with `?code=...&state=...`.
17
+ * 4. Engine exchanges the code for tokens, writes the refresh token
18
+ * to the keychain, writes `~/.interf/auth/session.json`, and
19
+ * updates `runtime.currentAccount` so any subsequent `/v1/me` GET
20
+ * reflects the new identity without an engine restart.
21
+ *
22
+ * The POST that triggers all this is long-running by design — the
23
+ * response is sent only after AuthKit has roundtripped. The UI calls
24
+ * it with a generous timeout and shows a spinner.
25
+ *
26
+ * `interf://` URL scheme handling is intentionally NOT used here. The
27
+ * loopback flow is platform-agnostic and reuses the CLI's well-tested
28
+ * orchestration; the deep-link path adds an Info.plist /
29
+ * NSAppleEventManager hop that zero-native 0.1.9 does not register.
30
+ */
31
+ import type { IncomingMessage, ServerResponse } from "node:http";
32
+ import type { LocalServiceRuntime } from "../runtime.js";
33
+ export declare function tryHandleAuth(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Auth routes for the desktop shell.
3
+ *
4
+ * The CLI's `interf auth login` command runs the loopback PKCE flow
5
+ * in-process and writes the session itself. The desktop app cannot do
6
+ * that — it is a Zero Native (Zig + WKWebView) binary with no Node
7
+ * runtime — so it asks the engine to run the same flow on its behalf
8
+ * and waits for the result.
9
+ *
10
+ * The flow is identical to the CLI path:
11
+ *
12
+ * 1. Engine binds a fresh loopback HTTP server on 127.0.0.1.
13
+ * 2. Engine asks WorkOS for a PKCE authorize URL bound to that
14
+ * callback URL and opens the user's system browser at it.
15
+ * 3. User completes AuthKit; AuthKit redirects to the loopback
16
+ * server with `?code=...&state=...`.
17
+ * 4. Engine exchanges the code for tokens, writes the refresh token
18
+ * to the keychain, writes `~/.interf/auth/session.json`, and
19
+ * updates `runtime.currentAccount` so any subsequent `/v1/me` GET
20
+ * reflects the new identity without an engine restart.
21
+ *
22
+ * The POST that triggers all this is long-running by design — the
23
+ * response is sent only after AuthKit has roundtripped. The UI calls
24
+ * it with a generous timeout and shows a spinner.
25
+ *
26
+ * `interf://` URL scheme handling is intentionally NOT used here. The
27
+ * loopback flow is platform-agnostic and reuses the CLI's well-tested
28
+ * orchestration; the deep-link path adds an Info.plist /
29
+ * NSAppleEventManager hop that zero-native 0.1.9 does not register.
30
+ */
31
+ import { AuthFlowError, defaultPkceTransport, runPkceFlow, } from "../auth/auth-flow.js";
32
+ import { entitlementsForPlan } from "../auth/account-context.js";
33
+ import { deleteRefreshToken, setRefreshToken, } from "../auth/keychain.js";
34
+ import { clearSession, writeSession, } from "../auth/session-store.js";
35
+ import { WorkOSConfigError } from "../auth/workos-client.js";
36
+ import { LOCAL_SERVICE_ROUTES } from "./routes.js";
37
+ import { readJsonBody, sendError, sendErrorResponse, sendJson, } from "./server-helpers.js";
38
+ const AUTH_LOGIN_PATH = `${LOCAL_SERVICE_ROUTES.auth}/login`;
39
+ const AUTH_LOGOUT_PATH = `${LOCAL_SERVICE_ROUTES.auth}/logout`;
40
+ export async function tryHandleAuth(req, res, runtime, path, method) {
41
+ if (method !== "POST")
42
+ return false;
43
+ if (path === AUTH_LOGIN_PATH) {
44
+ await handleLogin(req, res, runtime);
45
+ return true;
46
+ }
47
+ if (path === AUTH_LOGOUT_PATH) {
48
+ await handleLogout(req, res, runtime);
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ async function handleLogin(req, res, runtime) {
54
+ let body = {};
55
+ try {
56
+ const raw = await readJsonBody(req);
57
+ if (raw && typeof raw === "object")
58
+ body = raw;
59
+ }
60
+ catch {
61
+ // Empty/invalid body is fine — login takes no required input.
62
+ }
63
+ try {
64
+ const result = await runPkceFlow(defaultPkceTransport(), {
65
+ autoOpenBrowser: body.open_browser ?? true,
66
+ ...(body.login_hint ? { loginHint: body.login_hint } : {}),
67
+ });
68
+ try {
69
+ await setRefreshToken(result.user.id, result.refreshToken);
70
+ }
71
+ catch {
72
+ // Keychain failure is non-fatal — the session still works for
73
+ // the current process. The user will be prompted again after
74
+ // the next engine restart.
75
+ }
76
+ const refreshedAt = new Date().toISOString();
77
+ const plan = "free";
78
+ const displayName = [result.user.firstName, result.user.lastName]
79
+ .filter((part) => typeof part === "string" && part.length > 0)
80
+ .join(" ") || null;
81
+ const account = {
82
+ user_id: result.user.id,
83
+ email: result.user.email,
84
+ display_name: displayName,
85
+ plan,
86
+ entitlements: entitlementsForPlan(plan),
87
+ refreshed_at: refreshedAt,
88
+ };
89
+ writeSession(account);
90
+ runtime.currentAccount = account;
91
+ sendJson(res, 200, {
92
+ kind: "interf-auth-login",
93
+ version: 1,
94
+ account: {
95
+ user_id: account.user_id,
96
+ email: account.email,
97
+ display_name: account.display_name,
98
+ plan: account.plan,
99
+ entitlements: {
100
+ max_active_projects: Number.isFinite(account.entitlements.max_active_projects)
101
+ ? account.entitlements.max_active_projects
102
+ : null,
103
+ pro_features: account.entitlements.pro_features,
104
+ },
105
+ refreshed_at: account.refreshed_at,
106
+ },
107
+ });
108
+ }
109
+ catch (error) {
110
+ if (error instanceof WorkOSConfigError) {
111
+ sendError(res, 503, error.message);
112
+ return;
113
+ }
114
+ if (error instanceof AuthFlowError) {
115
+ sendError(res, 400, `Sign-in failed: ${error.message}`);
116
+ return;
117
+ }
118
+ sendErrorResponse(res, error, 500);
119
+ }
120
+ }
121
+ async function handleLogout(_req, res, runtime) {
122
+ const previous = runtime.currentAccount;
123
+ if (previous) {
124
+ try {
125
+ await deleteRefreshToken(previous.user_id);
126
+ }
127
+ catch {
128
+ // Best-effort cleanup; the on-disk session below is the
129
+ // authoritative signal.
130
+ }
131
+ }
132
+ clearSession();
133
+ runtime.currentAccount = null;
134
+ sendJson(res, 200, {
135
+ kind: "interf-auth-logout",
136
+ version: 1,
137
+ });
138
+ }
@@ -0,0 +1,3 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { LocalServiceRuntime } from "../runtime.js";
3
+ export declare function tryHandleBuildPlans(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
@@ -0,0 +1,83 @@
1
+ import { BuildPlanSaveRequestSchema } from "../schemas/index.js";
2
+ import { LOCAL_SERVICE_ROUTES } from "./routes.js";
3
+ import { readJsonBody, sendError, sendJson, } from "./server-helpers.js";
4
+ import { isTraversalRelativePath, safeApiFilePath, sendApiFile, } from "./server-api-files.js";
5
+ import { findInstanceBuildPlan, listInstanceBuildPlanRuns, listInstanceBuildPlans, resolveInstanceBuildPlanPackageRoot, } from "./server-instance-helpers.js";
6
+ import { installUserBuildPlan } from "../../build-plans/package/user-build-plans.js";
7
+ export async function tryHandleBuildPlans(req, res, runtime, path, method) {
8
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.buildPlans) {
9
+ sendJson(res, 200, { build_plans: listInstanceBuildPlans(runtime) });
10
+ return true;
11
+ }
12
+ if (method === "POST" && path === LOCAL_SERVICE_ROUTES.buildPlans) {
13
+ try {
14
+ const body = BuildPlanSaveRequestSchema.parse(await readJsonBody(req));
15
+ const installed = installUserBuildPlan({
16
+ sourceDir: body.source_path,
17
+ id: body.id,
18
+ overwrite: body.overwrite,
19
+ });
20
+ sendJson(res, 201, {
21
+ build_plan_id: installed.id,
22
+ installed: true,
23
+ path: installed.path,
24
+ });
25
+ }
26
+ catch (error) {
27
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
28
+ }
29
+ return true;
30
+ }
31
+ const buildPlanMatch = path.match(/^\/v1\/build-plans\/([^/]+)$/);
32
+ if (method === "GET" && buildPlanMatch?.[1]) {
33
+ const buildPlanResource = findInstanceBuildPlan(runtime, decodeURIComponent(buildPlanMatch[1]));
34
+ if (!buildPlanResource)
35
+ sendError(res, 404, "Build Plan not found.");
36
+ else
37
+ sendJson(res, 200, buildPlanResource);
38
+ return true;
39
+ }
40
+ const buildPlanRunsMatch = path.match(/^\/v1\/build-plans\/([^/]+)\/runs$/);
41
+ if (method === "GET" && buildPlanRunsMatch?.[1]) {
42
+ const runs = listInstanceBuildPlanRuns(runtime, decodeURIComponent(buildPlanRunsMatch[1]));
43
+ sendJson(res, 200, { runs });
44
+ return true;
45
+ }
46
+ // GET /v1/build-plans/<id>/files/<relpath> — read-only file serving inside
47
+ // the Build Plan package root. Used by the locator pattern's `api-served` kind so
48
+ // the UI can render SKILL.md / contract files in a side drawer over a
49
+ // remote engine. Resolution: project-draft (when first project exists) →
50
+ // user library → built-in. Path-guard rejects any traversal outside
51
+ // the resolved root.
52
+ const buildPlanFilesMatch = path.match(/^\/v1\/build-plans\/([^/]+)\/files\/(.+)$/);
53
+ if (method === "GET" && buildPlanFilesMatch?.[1] && buildPlanFilesMatch[2]) {
54
+ const buildPlanId = decodeURIComponent(buildPlanFilesMatch[1]);
55
+ let relPath;
56
+ try {
57
+ relPath = decodeURIComponent(buildPlanFilesMatch[2]);
58
+ }
59
+ catch {
60
+ sendError(res, 400, "File path is not valid URI-encoded UTF-8.");
61
+ return true;
62
+ }
63
+ if (isTraversalRelativePath(relPath)) {
64
+ sendError(res, 400, "File path escapes Build Plan root.");
65
+ return true;
66
+ }
67
+ const root = resolveInstanceBuildPlanPackageRoot(runtime, buildPlanId);
68
+ if (!root) {
69
+ sendError(res, 404, `Build Plan not found: ${buildPlanId}`);
70
+ return true;
71
+ }
72
+ const safePath = safeApiFilePath(root, relPath);
73
+ if (!safePath) {
74
+ sendError(res, 400, "File path escapes Build Plan root.");
75
+ return true;
76
+ }
77
+ if (!sendApiFile(res, safePath)) {
78
+ sendError(res, 404, `File not found: ${relPath}`);
79
+ }
80
+ return true;
81
+ }
82
+ return false;
83
+ }
@@ -0,0 +1,4 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { LocalServiceRuntime } from "../runtime.js";
3
+ export declare function tryHandleDiscovery(_req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): boolean;
4
+ export declare function tryHandleOpenPath(req: IncomingMessage, res: ServerResponse, _runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
@@ -0,0 +1,196 @@
1
+ import { LOCAL_SERVICE_LOOPBACK_HOSTS, LocalServiceDiscoverySchema, OpenPathRequestSchema, } from "../schemas/index.js";
2
+ import { buildLocalServiceUrl, LOCAL_SERVICE_ROUTES, } from "./routes.js";
3
+ import { buildOpenApiDocument } from "./openapi.js";
4
+ import { readJsonBody, sendError, sendJson, } from "./server-helpers.js";
5
+ import { packageRoot, } from "./server-api-files.js";
6
+ import { listStoredProjects } from "../project-store.js";
7
+ import { userBuildPlansRoot } from "../../contracts/lib/project-paths.js";
8
+ import { spawn } from "node:child_process";
9
+ import { existsSync, statSync } from "node:fs";
10
+ import { dirname, resolve } from "node:path";
11
+ import { assertPathWithinRoot } from "../../contracts/utils/path-guards.js";
12
+ export function tryHandleDiscovery(_req, res, runtime, path, method) {
13
+ // GET /health — liveness probe used by the CLI bootstrap.
14
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.health) {
15
+ sendJson(res, 200, runtime.health());
16
+ return true;
17
+ }
18
+ // GET /v1 — discovery list of available resources.
19
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.api) {
20
+ sendJson(res, 200, LocalServiceDiscoverySchema.parse({
21
+ kind: "interf-local-service-discovery",
22
+ version: 1,
23
+ resources: {
24
+ instance: LOCAL_SERVICE_ROUTES.instance,
25
+ projects: LOCAL_SERVICE_ROUTES.projects,
26
+ build_plans: LOCAL_SERVICE_ROUTES.buildPlans,
27
+ runs: LOCAL_SERVICE_ROUTES.runs,
28
+ openapi: LOCAL_SERVICE_ROUTES.openapi,
29
+ action_proposals: LOCAL_SERVICE_ROUTES.actionProposals,
30
+ executor: LOCAL_SERVICE_ROUTES.executor,
31
+ agents: LOCAL_SERVICE_ROUTES.agents,
32
+ me: LOCAL_SERVICE_ROUTES.me,
33
+ open_path: LOCAL_SERVICE_ROUTES.openPath,
34
+ },
35
+ }));
36
+ return true;
37
+ }
38
+ // GET /v1/openapi.json — human-readable API contract generated from the
39
+ // same operation registry used by clients and tools.
40
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.openapi) {
41
+ sendJson(res, 200, buildOpenApiDocument({
42
+ version: runtime.packageVersion ?? "0.1.0",
43
+ }));
44
+ return true;
45
+ }
46
+ // GET /v1/me — current account / session.
47
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.me) {
48
+ if (runtime.currentAccount) {
49
+ sendJson(res, 200, {
50
+ kind: "interf-current-account",
51
+ version: 1,
52
+ user_id: runtime.currentAccount.user_id,
53
+ email: runtime.currentAccount.email,
54
+ display_name: runtime.currentAccount.display_name,
55
+ plan: runtime.currentAccount.plan,
56
+ entitlements: {
57
+ max_active_projects: Number.isFinite(runtime.currentAccount.entitlements.max_active_projects)
58
+ ? runtime.currentAccount.entitlements.max_active_projects
59
+ : null,
60
+ pro_features: runtime.currentAccount.entitlements.pro_features,
61
+ },
62
+ refreshed_at: runtime.currentAccount.refreshed_at,
63
+ });
64
+ }
65
+ else {
66
+ sendJson(res, 200, {
67
+ kind: "interf-current-account",
68
+ version: 1,
69
+ user_id: null,
70
+ email: null,
71
+ display_name: null,
72
+ plan: "anonymous",
73
+ entitlements: {
74
+ max_active_projects: 10,
75
+ pro_features: [],
76
+ },
77
+ refreshed_at: null,
78
+ });
79
+ }
80
+ return true;
81
+ }
82
+ // GET /v1/instance — local service metadata.
83
+ if (method === "GET" && path === LOCAL_SERVICE_ROUTES.instance) {
84
+ const startedAtIso = runtime.startedAt ?? new Date().toISOString();
85
+ const startedMs = Date.parse(startedAtIso);
86
+ const uptimeSeconds = Number.isFinite(startedMs)
87
+ ? Math.max(0, Math.floor((Date.now() - startedMs) / 1000))
88
+ : 0;
89
+ const agentState = runtime.getAgentsRegistry();
90
+ // `connection_kind` lets the UI know whether OS-open is even
91
+ // possible. A loopback bind means the local service has filesystem access
92
+ // to the same host as the user; non-loopback (cloud) returns
93
+ // "remote" so the UI routes to api-served / signed-URL paths
94
+ // instead. The current binary refuses non-loopback binds (see the
95
+ // host whitelist below), so the value is "local" today; the field
96
+ // is in place so the UI can read it without a CLI version sniff.
97
+ const isLoopback = LOCAL_SERVICE_LOOPBACK_HOSTS.includes(runtime.host);
98
+ const health = runtime.health();
99
+ sendJson(res, 200, {
100
+ kind: "interf-instance",
101
+ version: 1,
102
+ url: buildLocalServiceUrl({ host: runtime.host, port: runtime.port }),
103
+ host: runtime.host,
104
+ port: runtime.port,
105
+ pid: process.pid,
106
+ started_at: startedAtIso,
107
+ uptime_seconds: uptimeSeconds,
108
+ package_version: runtime.packageVersion ?? null,
109
+ project_count: listStoredProjects().length,
110
+ active_run_count: health.active_runs,
111
+ idle_for_seconds: health.idle_for_seconds,
112
+ auth_required: Boolean(runtime.authToken),
113
+ owner_kind: runtime.ownerKind,
114
+ ...(runtime.ownerPid ? { owner_pid: runtime.ownerPid } : {}),
115
+ // connected-agents fields:
116
+ agent_count: agentState.agents.length,
117
+ default_agent: agentState.active_agent?.name ?? null,
118
+ // connection-mode flag:
119
+ connection_kind: isLoopback ? "local" : "remote",
120
+ });
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ function resolveOpenPath(allowedRoots, pathValue) {
126
+ const roots = allowedRoots.map((root) => resolve(root));
127
+ const targetPath = resolve(pathValue);
128
+ for (const root of roots) {
129
+ try {
130
+ return assertPathWithinRoot(root, targetPath, "Open path");
131
+ }
132
+ catch {
133
+ continue;
134
+ }
135
+ }
136
+ throw new Error(`Open path must stay inside ${roots.join(" or ")}: ${targetPath}`);
137
+ }
138
+ async function openLocalPath(allowedRoots, pathValue) {
139
+ const targetPath = resolveOpenPath(allowedRoots, pathValue);
140
+ if (!existsSync(targetPath)) {
141
+ throw new Error(`Path does not exist: ${targetPath}`);
142
+ }
143
+ if (process.env.INTERF_OPEN_PATH_DRY_RUN === "1") {
144
+ return targetPath;
145
+ }
146
+ const isDirectory = statSync(targetPath).isDirectory();
147
+ const command = process.platform === "darwin"
148
+ ? "open"
149
+ : process.platform === "win32"
150
+ ? "explorer.exe"
151
+ : "xdg-open";
152
+ const args = process.platform === "darwin"
153
+ ? (isDirectory ? [targetPath] : ["-R", targetPath])
154
+ : process.platform === "win32"
155
+ ? (isDirectory ? [targetPath] : ["/select,", targetPath])
156
+ : [isDirectory ? targetPath : dirname(targetPath)];
157
+ await new Promise((resolveOpen, rejectOpen) => {
158
+ const child = spawn(command, args, {
159
+ detached: true,
160
+ stdio: "ignore",
161
+ });
162
+ child.once("error", rejectOpen);
163
+ child.once("spawn", () => {
164
+ child.unref();
165
+ resolveOpen();
166
+ });
167
+ });
168
+ return targetPath;
169
+ }
170
+ export async function tryHandleOpenPath(req, res, _runtime, path, method) {
171
+ if (!(method === "POST" && path === LOCAL_SERVICE_ROUTES.openPath)) {
172
+ return false;
173
+ }
174
+ try {
175
+ const body = OpenPathRequestSchema.parse(await readJsonBody(req));
176
+ // Permit opening:
177
+ // - any registered project root or its bound source folder
178
+ // - the user buildPlan library at `~/.interf/build-plans/`
179
+ // - the bundled built-in buildPlan root inside the installed package
180
+ // (so SKILL.md / contract files in `interf-default` open correctly)
181
+ const allowedRoots = [];
182
+ for (const stored of listStoredProjects()) {
183
+ allowedRoots.push(stored.projectDataDir);
184
+ if (stored.source.locator)
185
+ allowedRoots.push(stored.source.locator);
186
+ }
187
+ allowedRoots.push(userBuildPlansRoot());
188
+ allowedRoots.push(packageRoot()); // covers <pkg>/public-repo/build-plans/...
189
+ const openedPath = await openLocalPath(allowedRoots, body.path);
190
+ sendJson(res, 202, { opened: true, path: openedPath });
191
+ }
192
+ catch (error) {
193
+ sendError(res, 400, error instanceof Error ? error.message : String(error));
194
+ }
195
+ return true;
196
+ }
@@ -0,0 +1,5 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { LocalServiceRuntime } from "../runtime.js";
3
+ /** Fan a change ping out to every open events stream for this runtime. */
4
+ export declare function notifyServiceChange(runtime: LocalServiceRuntime): void;
5
+ export declare function tryHandleEvents(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): boolean;