@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
@@ -1,52 +1,114 @@
1
1
  /**
2
- * `interf mcp` — Model Context Protocol server.
2
+ * Interf Model Context Protocol server.
3
3
  *
4
4
  * Wraps the local-service HTTP API as a typed agent surface so coding
5
5
  * agents can interact with Interf the same way they call other MCP tools
6
6
  * (instead of shelling out to the CLI).
7
7
  *
8
- * interf mcp # stdio transport (default)
9
- * interf mcp --transport=http --port=4889 # advanced: HTTP transport
8
+ * Packaged Desktop exposes this through `dist/bin-mcp.js`; the CLI subcommand
9
+ * is kept as a hidden developer entrypoint so tests and local hosts can launch
10
+ * the same adapter directly when needed.
10
11
  *
11
12
  * API-backed tools read `~/.interf/connection.json` (the same file every
12
- * other client uses) on each call. The MCP server can start before an
13
- * engine is connected so local plugin hosts such as Cowork can load the
14
- * tool surface first, then call `web_start` or `web_status`. The MCP
15
- * server itself holds no Interf runtime state. The transport options are
16
- * intentionally minimal agents speaking MCP today are stdio-first.
13
+ * other client uses) on each call. In the default headless profile, the
14
+ * MCP server can start before a local service is connected so local plugin hosts
15
+ * can load the tool surface first, then call `runtime_start` or `runtime_status`.
16
+ * In the app profile, lifecycle, inventory, admin, and library-browsing tools
17
+ * are hidden because Interf Desktop owns the running service and the user flow
18
+ * should stay preparation-first: create a Project for the current Source,
19
+ * draft a Build Plan, build a Context Graph, then inspect graph evidence.
20
+ * The MCP server itself holds no Interf runtime state.
17
21
  *
18
22
  * Tool list:
19
- * web_start shell out to `interf web start`
20
- * web_stop shell out to `interf web stop`
21
- * web_status shell out to `interf web status`
22
- * prep_list GET /v1/preparations
23
- * prep_create POST /v1/preparations
24
- * prep_show GET /v1/preparations/{id}
25
- * prep_select_build_plan PATCH /v1/preparations/{id}
26
- * prep_remove DELETE /v1/preparations/{id}
27
- * prep_build POST /v1/preparations/{id}/build-runs
28
- * prep_test POST /v1/preparations/{id}/verify-runs
29
- * build_plan_list GET /v1/build-plans
30
- * build_plan_draft POST /v1/preparations/{id}/build-plan-draft-runs
31
- * build_plan_improve POST /v1/preparations/{id}/build-plan-improvement-runs
32
- * runs_status GET /v1/runs/{run-id}
33
- * runs_watch GET /v1/build-runs/{run-id}/events (snapshot, not SSE)
34
- * runs_cancel POST /v1/build-runs/{run-id}/cancel
35
- * runs_fetch GET /v1/build-runs/{run-id}/artifacts
36
- * instance_status GET /v1/instance
23
+ * runtime_start shell out to `interf runtime start`
24
+ * runtime_stop shell out to `interf runtime stop`
25
+ * runtime_status shell out to `interf runtime status`
26
+ * Desktop app profile tools:
27
+ * create_project, prepare_build_plan, run_build
28
+ * get_instance_status, get_project, get_run_status, get_run_artifacts
29
+ * get_latest_context_graph, read_context_graph_file
30
+ * get_context_graph_traces, get_build_evidence
31
+ *
32
+ * Headless developer profile additionally exposes runtime lifecycle,
33
+ * inventory, Build Plan library, benchmark, cancel, and admin tools.
37
34
  */
38
35
  import { spawn } from "node:child_process";
39
36
  import { readFileSync } from "node:fs";
40
37
  import { z } from "zod";
41
38
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
42
39
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
43
- import { CONNECT_OR_ERROR_HINT, readActiveConnection, } from "../../packages/engine/connection-config.js";
44
- import { LOCAL_SERVICE_ROUTES, preparationResourcePath, preparationSubresourcePath, runResourcePath, } from "../../packages/engine/routes.js";
45
- import { BuildPlanAuthoringArtifactRequirementSchema, } from "../../packages/engine/lib/schema.js";
46
- import { RequestedArtifactSchema, SourceProfileSchema, } from "../../packages/project/lib/schema.js";
40
+ import { CONNECT_OR_ERROR_HINT, readActiveConnection, } from "../../packages/runtime/connection-config.js";
41
+ import { readServiceRegistry, } from "../../packages/runtime/service/service-registry.js";
42
+ import { LOCAL_SERVICE_ROUTES, buildPlanResourcePath, buildPlanSubresourcePath, projectResourcePath, projectSubresourcePath, runResourcePath, runSubresourcePath, } from "../../packages/runtime/service/routes.js";
43
+ import { BuildPlanAuthoringArtifactRequirementSchema, BuildPlanContextCheckDraftSchema, RequestedArtifactSchema, } from "../../packages/runtime/schemas/index.js";
44
+ import { SourceContextSchema, } from "../../packages/projects/lib/schema.js";
45
+ const INTERF_MCP_INSTRUCTIONS = [
46
+ "Interf prepares data for agents. It is not a search engine and not a general RAG index.",
47
+ "Interf MCP is how this host talks to Interf. Agents listed inside Interf are executors that run Build Plan stages. Do not treat MCP setup as executor setup.",
48
+ "App MCP exposes three core workflow tools: create_project, prepare_build_plan, and run_build. Other tools are read-only inspection helpers.",
49
+ "Default workflow for a user question over files: create a fresh Project for the current Source, propose Context Checks and requested Artifacts, prepare the Build Plan after the user approves those checks and Artifacts, stop for Build Plan approval, run_build only after that approval, then answer from the prepared Context Graph and its source-backed traces.",
50
+ "Source scope default: if Interf Desktop, the MCP host, or the user context already provides a Source locator or file set, use that whole Source. Do not ask the user to choose individual files or a subset unless they explicitly ask to narrow scope.",
51
+ "Do not answer by browsing existing Projects as if they were a corpus. In the Desktop app profile, always create a fresh Project for the current Source unless the user explicitly names an existing Project id.",
52
+ "Use existing Projects or Context Graphs only when the user explicitly selected or named them and they bind the same Source and task.",
53
+ "If no usable Source locator is available, ask for one Source locator. In the local Desktop path this may be a folder path. Do not present a file-selection menu or ask which files inside the Source to use.",
54
+ "Project creation is allowed when the user asks Interf to use a Source. Project ids are generated internally. Do not ask for existing Project ids. Approval gates are for Build Plan preparation and Build execution.",
55
+ "Before building, show the user the Context Checks, requested Artifacts, and drafted Build Plan in chat. Wait for approval unless the user has explicitly granted end-to-end autonomy.",
56
+ "No automatic retries: if prepare_build_plan, run_build, or a polled Run reaches failed/cancelled, report the failure and ask the user before starting another draft or Build run.",
57
+ "After a Build succeeds, read the task handoff under artifacts/ first. Treat home.md as a graph index, summaries/ as source coverage proof, and knowledge/ as navigation/drilldown.",
58
+ "A Context Graph is a knowledge map over the Source, not the answer source. Use it to understand what exists and where evidence lives; follow source references and traces when exact values, chart reads, tables, or provenance matter.",
59
+ "If a Context Graph artifact is too coarse or missing the needed evidence, improve the Build Plan and rebuild instead of giving a weak answer.",
60
+ ].join("\n");
61
+ const McpRequestedArtifactSchema = RequestedArtifactSchema.describe("Requested Artifact the user approved. Use a short title, optional id, description/purpose, and plain-English checks.");
62
+ function normalizeRequestedArtifacts(artifacts) {
63
+ if (!artifacts)
64
+ return undefined;
65
+ return artifacts.map((artifact) => RequestedArtifactSchema.parse(artifact));
66
+ }
47
67
  function trimTrailingSlash(value) {
48
68
  return value.replace(/\/+$/, "");
49
69
  }
70
+ function normalizeConnectionUrl(value) {
71
+ return trimTrailingSlash(value.trim());
72
+ }
73
+ function registryTokenForUrl(url) {
74
+ const normalized = normalizeConnectionUrl(url);
75
+ for (const service of readServiceRegistry()) {
76
+ if (normalizeConnectionUrl(service.url) === normalized && service.auth_token) {
77
+ return service.auth_token;
78
+ }
79
+ }
80
+ return null;
81
+ }
82
+ function connectionTokenForUrl(url) {
83
+ const normalized = normalizeConnectionUrl(url);
84
+ const active = readActiveConnection();
85
+ if (!active)
86
+ return null;
87
+ return normalizeConnectionUrl(active.url) === normalized ? active.auth_token : null;
88
+ }
89
+ function encodeRelativePath(value) {
90
+ return value
91
+ .split("/")
92
+ .filter((segment) => segment.length > 0)
93
+ .map((segment) => encodeURIComponent(segment))
94
+ .join("/");
95
+ }
96
+ function contextGraphFilePath(projectId, filePath) {
97
+ return `${projectSubresourcePath(projectId, "contextGraphFile")}?path=${encodeURIComponent(filePath)}`;
98
+ }
99
+ function slugifyMcpId(input) {
100
+ return input
101
+ .toLowerCase()
102
+ .trim()
103
+ .replace(/[^a-z0-9]+/g, "-")
104
+ .replace(/^-+|-+$/g, "")
105
+ .slice(0, 48);
106
+ }
107
+ function generatedMcpId(prefix) {
108
+ const base = slugifyMcpId(prefix).slice(0, 18) || "item";
109
+ const suffix = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`;
110
+ return `${base}-${suffix}`;
111
+ }
50
112
  function packageVersionFromManifest() {
51
113
  try {
52
114
  const url = new URL("../../../package.json", import.meta.url);
@@ -59,14 +121,18 @@ function packageVersionFromManifest() {
59
121
  }
60
122
  }
61
123
  function resolveConnectionOrNull(args) {
124
+ const urlOverride = args.url?.trim();
125
+ const currentLocalToken = urlOverride
126
+ ? registryTokenForUrl(urlOverride) ?? connectionTokenForUrl(urlOverride)
127
+ : null;
62
128
  const conn = readActiveConnection({
63
- urlOverride: args.url ?? null,
64
- authTokenOverride: args.token ?? null,
129
+ urlOverride: urlOverride ?? null,
130
+ authTokenOverride: currentLocalToken ?? args.token ?? null,
65
131
  });
66
132
  if (!conn)
67
133
  return null;
68
134
  return {
69
- url: trimTrailingSlash(conn.url),
135
+ url: normalizeConnectionUrl(conn.url),
70
136
  token: conn.auth_token ?? null,
71
137
  };
72
138
  }
@@ -164,262 +230,712 @@ async function callAndReturn(args, path, init = {}) {
164
230
  }
165
231
  return toolErrorJson(`Local service responded with HTTP ${response.status}.`, response.body ?? response.raw);
166
232
  }
167
- function registerTools(server, connectionArgs) {
168
- // ── Local engine lifecycle ─────────────────────────────────────────────
169
- server.registerTool("web_start", {
170
- title: "Start local Interf engine",
171
- description: "Start the Interf engine in the background on the user's machine. "
172
- + "Use this when no Interf instance is connected yet.",
233
+ async function callAndProject(args, path, project, init = {}) {
234
+ const conn = resolveConnectionOrNull(args);
235
+ if (!conn)
236
+ return toolErrorJson(CONNECT_OR_ERROR_HINT);
237
+ const response = await callApi(conn, path, init);
238
+ if (response.status >= 200 && response.status < 300) {
239
+ return toolResultJson(project(response.body, response.raw));
240
+ }
241
+ return toolErrorJson(`Local service responded with HTTP ${response.status}.`, response.body ?? response.raw);
242
+ }
243
+ function isRecord(value) {
244
+ return typeof value === "object" && value !== null && !Array.isArray(value);
245
+ }
246
+ function readString(record, key) {
247
+ const value = record[key];
248
+ return typeof value === "string" && value.length > 0 ? value : null;
249
+ }
250
+ function readNumber(record, key) {
251
+ const value = record[key];
252
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
253
+ }
254
+ function readArray(record, key) {
255
+ const value = record[key];
256
+ return Array.isArray(value) ? value : [];
257
+ }
258
+ function truncateText(value, max = 360) {
259
+ if (value.length <= max)
260
+ return value;
261
+ return `${value.slice(0, Math.max(0, max - 1))}…`;
262
+ }
263
+ function summarizeMetrics(metrics) {
264
+ return metrics
265
+ .filter(isRecord)
266
+ .map((metric) => ({
267
+ label: readString(metric, "label") ?? "",
268
+ value: String(metric.value ?? ""),
269
+ }))
270
+ .filter((metric) => metric.label.length > 0 && metric.value.length > 0)
271
+ .slice(0, 12);
272
+ }
273
+ function summarizeCollection(items) {
274
+ const statuses = {};
275
+ for (const item of items) {
276
+ if (!isRecord(item))
277
+ continue;
278
+ const status = readString(item, "status");
279
+ if (status)
280
+ statuses[status] = (statuses[status] ?? 0) + 1;
281
+ }
282
+ return {
283
+ total: items.length,
284
+ ...(Object.keys(statuses).length > 0 ? { statuses } : {}),
285
+ };
286
+ }
287
+ function summarizeReadiness(value) {
288
+ if (!isRecord(value))
289
+ return null;
290
+ return {
291
+ status: readString(value, "status"),
292
+ ready: value.ready === true ? true : value.ready === false ? false : undefined,
293
+ checks_passed: readNumber(value, "checks_passed"),
294
+ checks_total: readNumber(value, "checks_total"),
295
+ };
296
+ }
297
+ function summarizeTraceEvent(event) {
298
+ if (!isRecord(event))
299
+ return null;
300
+ const eventData = isRecord(event.eventData) ? event.eventData : {};
301
+ const result = isRecord(eventData.result) ? eventData.result : {};
302
+ const error = isRecord(eventData.error) ? eventData.error : {};
303
+ return {
304
+ event_id: readString(event, "eventId"),
305
+ type: readString(event, "eventType"),
306
+ correlation_id: readString(event, "correlationId"),
307
+ created_at: readString(event, "createdAt"),
308
+ message: readString(eventData, "message") ?? readString(result, "summary") ?? readString(error, "message"),
309
+ };
310
+ }
311
+ function compactTraceStream(stream) {
312
+ if (!isRecord(stream))
313
+ return null;
314
+ const text = readString(stream, "text");
315
+ if (!text)
316
+ return null;
317
+ return {
318
+ stream_id: readString(stream, "streamId"),
319
+ chunk_id: readString(stream, "chunkId"),
320
+ index: readNumber(stream, "index"),
321
+ created_at: readString(stream, "createdAt"),
322
+ text: truncateText(text),
323
+ };
324
+ }
325
+ function latestTraceStream(streams) {
326
+ for (let index = streams.length - 1; index >= 0; index -= 1) {
327
+ const compact = compactTraceStream(streams[index]);
328
+ if (compact)
329
+ return compact;
330
+ }
331
+ return null;
332
+ }
333
+ function compactRunStatus(payload) {
334
+ if (!isRecord(payload))
335
+ return payload;
336
+ const trace = isRecord(payload.trace) ? payload.trace : {};
337
+ const events = readArray(trace, "events");
338
+ const streams = readArray(trace, "streams");
339
+ return {
340
+ kind: "interf-run-status",
341
+ version: 1,
342
+ run_id: readString(payload, "run_id"),
343
+ run_type: readString(payload, "run_type"),
344
+ title: readString(payload, "title"),
345
+ status: readString(payload, "status"),
346
+ project: readString(payload, "project"),
347
+ build_plan: readString(payload, "build_plan"),
348
+ created_at: readString(payload, "created_at"),
349
+ started_at: readString(payload, "started_at"),
350
+ finished_at: readString(payload, "finished_at"),
351
+ metrics: summarizeMetrics(readArray(payload, "metrics")),
352
+ artifacts: summarizeCollection(readArray(payload, "artifacts")),
353
+ checks: summarizeCollection(readArray(payload, "checks")),
354
+ context_checks: summarizeCollection(readArray(payload, "context_checks")),
355
+ readiness: summarizeReadiness(payload.readiness),
356
+ latest_event: events.length > 0 ? summarizeTraceEvent(events[events.length - 1]) : null,
357
+ latest_log: latestTraceStream(streams),
358
+ detail_hint: "Poll this compact status until terminal. If status is failed or cancelled, report it and ask before retrying; use event/log and artifact tools only when debugging or reading finished outputs.",
359
+ };
360
+ }
361
+ function compactRunEvents(payload, options) {
362
+ if (!isRecord(payload))
363
+ return payload;
364
+ const trace = isRecord(payload.trace) ? payload.trace : {};
365
+ const events = readArray(trace, "events");
366
+ const streams = readArray(trace, "streams");
367
+ const recentEvents = events
368
+ .slice(Math.max(0, events.length - options.eventLimit))
369
+ .map(summarizeTraceEvent)
370
+ .filter((event) => event !== null);
371
+ const recentStreams = options.includeStreams
372
+ ? streams
373
+ .slice(Math.max(0, streams.length - options.streamLimit))
374
+ .map(compactTraceStream)
375
+ .filter((stream) => stream !== null)
376
+ : undefined;
377
+ return {
378
+ kind: "interf-run-events",
379
+ version: 1,
380
+ run_id: readString(payload, "run_id"),
381
+ status: readString(payload, "status"),
382
+ event_count: events.length,
383
+ stream_count: streams.length,
384
+ events: recentEvents,
385
+ ...(recentStreams ? { streams: recentStreams } : {}),
386
+ detail_hint: "This is a bounded tail. Use a larger limit only when debugging; use compact run status for polling.",
387
+ };
388
+ }
389
+ async function currentSourcePathForApp(conn) {
390
+ const response = await callApi(conn, LOCAL_SERVICE_ROUTES.health);
391
+ if (response.status >= 200 && response.status < 300 && isRecord(response.body)) {
392
+ const sourcePath = readString(response.body, "source_folder_path");
393
+ if (sourcePath)
394
+ return sourcePath;
395
+ }
396
+ const sourceCandidates = await sourceCandidatesForApp(conn);
397
+ return sourceCandidates.length === 1 ? sourceCandidates[0]?.source_path ?? null : null;
398
+ }
399
+ async function sourceCandidatesForApp(conn) {
400
+ const response = await callApi(conn, LOCAL_SERVICE_ROUTES.projects);
401
+ if (response.status < 200 || response.status >= 300 || !isRecord(response.body))
402
+ return [];
403
+ const bySource = new Map();
404
+ for (const project of readArray(response.body, "projects").filter(isRecord)) {
405
+ const source = isRecord(project.source) ? project.source : {};
406
+ const sourcePath = readString(source, "locator");
407
+ if (!sourcePath)
408
+ continue;
409
+ const entry = bySource.get(sourcePath) ?? { count: 0, buildPlanIds: new Set() };
410
+ entry.count += 1;
411
+ const buildPlanId = readString(project, "build_plan_id");
412
+ if (buildPlanId)
413
+ entry.buildPlanIds.add(buildPlanId);
414
+ bySource.set(sourcePath, entry);
415
+ }
416
+ return [...bySource.entries()]
417
+ .map(([sourcePath, entry]) => ({
418
+ source_path: sourcePath,
419
+ project_count: entry.count,
420
+ build_plan_ids: [...entry.buildPlanIds].slice(0, 4),
421
+ }))
422
+ .slice(0, 8);
423
+ }
424
+ async function callAppCreateProject(args, request) {
425
+ const conn = resolveConnectionOrNull(args);
426
+ if (!conn)
427
+ return toolErrorJson(CONNECT_OR_ERROR_HINT);
428
+ const sourcePath = request.source_path?.trim() || await currentSourcePathForApp(conn);
429
+ if (!sourcePath) {
430
+ const sourceCandidates = await sourceCandidatesForApp(conn);
431
+ return toolErrorJson("No unambiguous current Source locator is exposed by Interf. If source_candidates contains a Source that clearly matches the user's task, call create_project again with that source_path. Otherwise ask for one Source locator. Do not ask for an existing Project id or ask the user to choose individual files.", { source_candidates: sourceCandidates });
432
+ }
433
+ const id = generatedMcpId("project");
434
+ const response = await callApi(conn, LOCAL_SERVICE_ROUTES.projects, {
435
+ method: "POST",
436
+ body: JSON.stringify({
437
+ id,
438
+ source: { kind: "local-folder", locator: sourcePath },
439
+ }),
440
+ });
441
+ if (response.status >= 200 && response.status < 300) {
442
+ return toolResultJson(response.body ?? response.raw);
443
+ }
444
+ return toolErrorJson(`Local service responded with HTTP ${response.status}.`, response.body ?? response.raw);
445
+ }
446
+ function registerAppProfileTools(server, connectionArgs) {
447
+ server.registerTool("create_project", {
448
+ title: "Create Project",
449
+ description: "Core step 1. Create a fresh Project for this task and the whole current Source. The Project id is generated internally; do not ask for or provide one.",
173
450
  inputSchema: {
174
- host: z.string().min(1).optional().describe("Host to bind. Defaults to 127.0.0.1."),
175
- port: z.number().int().positive().optional().describe("Port to bind. Defaults to 4873."),
176
- timeout_ms: z.number().int().positive().optional().describe("Startup timeout in milliseconds."),
177
- log: z.string().min(1).optional().describe("Optional path for background engine logs."),
451
+ source_path: z.string().min(1).optional().describe("Fallback Source locator. In the local Desktop path this is an absolute folder path. Use only when Interf does not expose a current Source; do not pass individual files or a subset selection."),
178
452
  },
179
- }, async (args) => {
180
- const cliArgs = ["web", "start"];
181
- if (args.host)
182
- cliArgs.push("--host", args.host);
183
- if (args.port)
184
- cliArgs.push("--port", String(args.port));
185
- if (args.timeout_ms)
186
- cliArgs.push("--timeout-ms", String(args.timeout_ms));
187
- if (args.log)
188
- cliArgs.push("--log", args.log);
189
- return cliToolResult(await runInterfCli(cliArgs));
190
- });
191
- server.registerTool("web_stop", {
192
- title: "Stop local Interf engine",
193
- description: "Stop the connected Interf engine or the live engine recorded in the "
194
- + "local service registry.",
453
+ }, async (args) => callAppCreateProject(connectionArgs, args));
454
+ server.registerTool("prepare_build_plan", {
455
+ title: "Prepare Build Plan",
456
+ description: "Core step 2. Draft the approved Build Plan for the Project. Use after the user approves checks and requested Artifacts. Stop after this tool and ask for Build Plan approval before building. If it fails, report the failure; do not retry without explicit user approval.",
195
457
  inputSchema: {
196
- url: z.string().url().optional().describe("Optional engine URL to stop."),
197
- token: z.string().min(1).optional().describe("Optional bearer token."),
458
+ project_id: z.string().min(1).describe("Project id from create_project."),
459
+ build_plan_id: z.string().min(1).optional().describe("Optional Build Plan id. Omit to auto-generate."),
460
+ label: z.string().min(1).optional().describe("Optional short human label."),
461
+ hint: z.string().min(1).optional().describe("Optional one-line plan hint."),
462
+ intent: z.string().min(1).describe("Question/task the Context Graph must support."),
463
+ context_checks: z.array(BuildPlanContextCheckDraftSchema).optional().describe("Plain-English checks the user approved."),
464
+ requested_artifacts: z.array(McpRequestedArtifactSchema).optional().describe("Requested Artifacts the user approved."),
465
+ source_context: SourceContextSchema.nullable().optional(),
198
466
  },
199
- }, async (args) => {
200
- const cliArgs = ["web", "stop"];
201
- if (args.url)
202
- cliArgs.push("--url", args.url);
203
- if (args.token)
204
- cliArgs.push("--token", args.token);
205
- return cliToolResult(await runInterfCli(cliArgs));
206
- });
207
- server.registerTool("web_status", {
208
- title: "Show local Interf engine status",
209
- description: "Return the connected engine status using the same connection record "
210
- + "as the CLI.",
467
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildPlanDraftRuns"), {
468
+ method: "POST",
469
+ body: JSON.stringify((() => {
470
+ const intent = args.intent.trim();
471
+ const buildPlanId = args.build_plan_id?.trim() || generatedMcpId("plan");
472
+ return {
473
+ build_plan_id: buildPlanId,
474
+ label: args.label?.trim() || buildPlanId,
475
+ hint: args.hint?.trim() || intent,
476
+ intent,
477
+ ...(args.context_checks ? { checks: args.context_checks } : {}),
478
+ ...(args.requested_artifacts ? { requested_artifacts: normalizeRequestedArtifacts(args.requested_artifacts) } : {}),
479
+ ...(args.source_context !== undefined ? { source_context: args.source_context } : {}),
480
+ };
481
+ })()),
482
+ }));
483
+ server.registerTool("run_build", {
484
+ title: "Run Build",
485
+ description: "Core step 3. Run the selected Build Plan and create the Context Graph. Never call immediately after prepare_build_plan; use only after explicit Build Plan approval or explicit end-to-end autonomy. If it fails, report the failure; do not retry without explicit user approval.",
211
486
  inputSchema: {
212
- url: z.string().url().optional().describe("Optional engine URL."),
213
- token: z.string().min(1).optional().describe("Optional bearer token."),
487
+ project_id: z.string().min(1).describe("Project id from create_project."),
214
488
  },
215
- }, async (args) => {
216
- const cliArgs = ["web", "status"];
217
- if (args.url)
218
- cliArgs.push("--url", args.url);
219
- if (args.token)
220
- cliArgs.push("--token", args.token);
221
- return cliToolResult(await runInterfCli(cliArgs));
222
- });
223
- // ── Preparations ────────────────────────────────────────────────────────
224
- server.registerTool("prep_list", {
225
- title: "List preparations",
226
- description: "List every Preparation registered on the connected Interf instance, "
227
- + "with source binding, Build Plan id, and current readiness.",
489
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildRuns"), { method: "POST", body: "{}" }));
490
+ server.registerTool("get_instance_status", {
491
+ title: "Get Instance Status",
492
+ description: "Read-only helper. Check service health, current Source, active runs, and instance metadata. Not for Project search.",
228
493
  inputSchema: {},
229
- }, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.preparations));
230
- server.registerTool("prep_create", {
231
- title: "Create a preparation",
232
- description: "Create a new Preparation. The Preparation binds a Source, "
233
- + "agent intent, requested Artifacts, and optional Build Plan.",
494
+ }, async () => {
495
+ const conn = resolveConnectionOrNull(connectionArgs);
496
+ if (!conn)
497
+ return toolErrorJson(CONNECT_OR_ERROR_HINT);
498
+ const [health, instance, sourceCandidates] = await Promise.all([
499
+ callApi(conn, LOCAL_SERVICE_ROUTES.health),
500
+ callApi(conn, LOCAL_SERVICE_ROUTES.instance),
501
+ sourceCandidatesForApp(conn),
502
+ ]);
503
+ if (health.status < 200 || health.status >= 300) {
504
+ return toolErrorJson(`Health responded with HTTP ${health.status}.`, health.body ?? health.raw);
505
+ }
506
+ if (instance.status < 200 || instance.status >= 300) {
507
+ return toolErrorJson(`Instance responded with HTTP ${instance.status}.`, instance.body ?? instance.raw);
508
+ }
509
+ const healthBody = isRecord(health.body) ? health.body : {};
510
+ const instanceBody = isRecord(instance.body) ? instance.body : {};
511
+ const healthSource = readString(healthBody, "source_folder_path");
512
+ const sourcePath = healthSource ?? (sourceCandidates.length === 1 ? sourceCandidates[0]?.source_path ?? null : null);
513
+ return toolResultJson({
514
+ kind: "interf-mcp-status",
515
+ version: 1,
516
+ service_url: readString(healthBody, "service_url") ?? readString(instanceBody, "url"),
517
+ source_path: sourcePath,
518
+ project_count: readNumber(instanceBody, "project_count"),
519
+ active_run_count: readNumber(instanceBody, "active_run_count"),
520
+ agent_count: readNumber(instanceBody, "agent_count"),
521
+ default_agent: readString(instanceBody, "default_agent"),
522
+ source_candidates: sourceCandidates,
523
+ instruction: "For a new file question: use the whole current Source, create_project -> ask user to approve checks/Artifacts -> prepare_build_plan -> ask user to approve the Build Plan -> run_build. If source_path is null but source_candidates has a Source that clearly matches the user's task, pass that source_path to create_project. Do not ask which files inside the Source to use unless the user explicitly narrows scope.",
524
+ });
525
+ });
526
+ server.registerTool("get_project", {
527
+ title: "Get Project",
528
+ description: "Read-only helper. Confirm one Project's Source binding, selected Build Plan, readiness, and latest Context Graph.",
529
+ inputSchema: {
530
+ project_id: z.string().min(1).describe("Project id."),
531
+ },
532
+ }, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.project_id)));
533
+ server.registerTool("get_run_status", {
534
+ title: "Get Run Status",
535
+ description: "Read-only helper. Compact polling receipt for one Run. Use this for repeated status checks.",
536
+ inputSchema: {
537
+ run_id: z.string().min(1).describe("Run id."),
538
+ },
539
+ }, async (args) => callAndProject(connectionArgs, runSubresourcePath(args.run_id, "status"), compactRunStatus));
540
+ server.registerTool("get_run_artifacts", {
541
+ title: "Get Run Artifacts",
542
+ description: "Read-only helper. Fetch a finished Run's artifact manifest only when status is terminal or when reviewing a completed Build Plan draft.",
543
+ inputSchema: {
544
+ run_id: z.string().min(1).describe("Run id."),
545
+ },
546
+ }, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.runs}/${encodeURIComponent(args.run_id)}/artifacts`));
547
+ server.registerTool("get_latest_context_graph", {
548
+ title: "Get Latest Context Graph",
549
+ description: "Read-only helper. Show the latest Context Graph locator for a Project. This is a locator/status read, not the answer surface; read artifacts/ handoff files next.",
550
+ inputSchema: {
551
+ project_id: z.string().min(1).describe("Project id."),
552
+ },
553
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "contextGraph")));
554
+ server.registerTool("read_context_graph_file", {
555
+ title: "Read Context Graph File",
556
+ description: "Read one prepared Context Graph file by relative path. Start with artifacts/ task handoffs; use summaries/ for coverage and knowledge/ for drilldown.",
557
+ inputSchema: {
558
+ project_id: z.string().min(1).describe("Project id."),
559
+ path: z.string().min(1).describe("Relative path inside the Context Graph."),
560
+ },
561
+ }, async (args) => callAndReturn(connectionArgs, contextGraphFilePath(args.project_id, args.path)));
562
+ server.registerTool("get_context_graph_traces", {
563
+ title: "Get Context Graph Traces",
564
+ description: "Read-only helper. Read source-backed traces for exact values and provenance.",
565
+ inputSchema: {
566
+ project_id: z.string().min(1).describe("Project id."),
567
+ },
568
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "traces")));
569
+ server.registerTool("get_build_evidence", {
570
+ title: "Get Build Evidence",
571
+ description: "Read-only helper. Read checks, Artifact diagnostics, and readiness evidence.",
234
572
  inputSchema: {
235
- id: z.string().min(1).describe("Preparation id (kebab-case)."),
573
+ project_id: z.string().min(1).describe("Project id."),
574
+ },
575
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildEvidence")));
576
+ }
577
+ function registerTools(server, connectionArgs) {
578
+ const appProfile = (connectionArgs.profile ?? "headless") === "app";
579
+ if (appProfile) {
580
+ registerAppProfileTools(server, connectionArgs);
581
+ return;
582
+ }
583
+ // ── Local service lifecycle ────────────────────────────────────────────
584
+ if (!appProfile) {
585
+ server.registerTool("runtime_start", {
586
+ title: "Start local Interf service",
587
+ description: "Start the Interf local service in the background on the user's machine. "
588
+ + "Use this when no Interf instance is connected yet.",
589
+ inputSchema: {
590
+ host: z.string().min(1).optional().describe("Host to bind. Defaults to 127.0.0.1."),
591
+ port: z.number().int().positive().optional().describe("Port to bind. Defaults to 4873."),
592
+ timeout_ms: z.number().int().positive().optional().describe("Startup timeout in milliseconds."),
593
+ log: z.string().min(1).optional().describe("Optional path for background service logs."),
594
+ },
595
+ }, async (args) => {
596
+ const cliArgs = ["runtime", "start"];
597
+ if (args.host)
598
+ cliArgs.push("--host", args.host);
599
+ if (args.port)
600
+ cliArgs.push("--port", String(args.port));
601
+ if (args.timeout_ms)
602
+ cliArgs.push("--timeout-ms", String(args.timeout_ms));
603
+ if (args.log)
604
+ cliArgs.push("--log", args.log);
605
+ return cliToolResult(await runInterfCli(cliArgs));
606
+ });
607
+ server.registerTool("runtime_stop", {
608
+ title: "Stop local Interf service",
609
+ description: "Stop the connected Interf local service or the live service recorded in the "
610
+ + "local service registry.",
611
+ inputSchema: {
612
+ url: z.string().url().optional().describe("Optional service URL to stop."),
613
+ token: z.string().min(1).optional().describe("Optional bearer token."),
614
+ },
615
+ }, async (args) => {
616
+ const cliArgs = ["runtime", "stop"];
617
+ if (args.url)
618
+ cliArgs.push("--url", args.url);
619
+ if (args.token)
620
+ cliArgs.push("--token", args.token);
621
+ return cliToolResult(await runInterfCli(cliArgs));
622
+ });
623
+ server.registerTool("runtime_status", {
624
+ title: "Show local Interf service status",
625
+ description: "Return the connected service status using the same connection record "
626
+ + "as the CLI.",
627
+ inputSchema: {
628
+ url: z.string().url().optional().describe("Optional service URL."),
629
+ token: z.string().min(1).optional().describe("Optional bearer token."),
630
+ },
631
+ }, async (args) => {
632
+ const cliArgs = ["runtime", "status"];
633
+ if (args.url)
634
+ cliArgs.push("--url", args.url);
635
+ if (args.token)
636
+ cliArgs.push("--token", args.token);
637
+ return cliToolResult(await runInterfCli(cliArgs));
638
+ });
639
+ }
640
+ // ── Projects ────────────────────────────────────────────────────────────
641
+ if (!appProfile) {
642
+ server.registerTool("project_list", {
643
+ title: "List Projects",
644
+ description: "Developer inventory tool. Do not use this as search over a corpus. "
645
+ + "For user questions over files, create a Project for the current Source unless the user names an existing Project.",
646
+ inputSchema: {},
647
+ }, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.projects));
648
+ }
649
+ server.registerTool("project_create", {
650
+ title: "Create a Project",
651
+ description: "Create a Project for the user's current Source. In the Desktop app profile, this is normally "
652
+ + "the first Interf action for a new user question over files.",
653
+ inputSchema: {
654
+ id: z.string().min(1).describe("Project id (kebab-case)."),
236
655
  source_path: z.string().min(1).describe("Source path visible to the connected instance."),
237
- build_plan_id: z.string().min(1).optional().describe("Optional Build Plan id to select. Select later with prep_select_build_plan if omitted."),
238
- about: z.string().min(1).optional().describe("Optional human-readable description."),
239
- requested_artifacts: z.array(RequestedArtifactSchema).optional().describe("Requested Artifacts the agent/user confirmed for this Preparation."),
240
- source_profile: SourceProfileSchema.optional().describe("Advisory source profile from the agent's inspection before build."),
656
+ ...(!appProfile
657
+ ? {
658
+ build_plan_id: z.string().min(1).optional().describe("Optional Build Plan id to select."),
659
+ }
660
+ : {}),
241
661
  },
242
- }, async (args) => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.preparations, {
662
+ }, async (args) => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.projects, {
243
663
  method: "POST",
244
664
  body: JSON.stringify({
245
665
  id: args.id,
246
666
  source: { kind: "local-folder", locator: args.source_path },
247
667
  ...(args.build_plan_id ? { build_plan_id: args.build_plan_id } : {}),
248
- ...(args.about ? { about: args.about } : {}),
249
- ...(args.requested_artifacts ? { requested_artifacts: args.requested_artifacts } : {}),
250
- ...(args.source_profile ? { source_profile: args.source_profile } : {}),
251
668
  }),
252
669
  }));
253
- server.registerTool("prep_show", {
254
- title: "Show one preparation",
255
- description: "Return the full resource for one Preparation by id.",
670
+ server.registerTool("project_show", {
671
+ title: "Show one Project",
672
+ description: "Return one Project resource to confirm its Source binding, selected Build Plan, readiness, "
673
+ + "and latest Context Graph before deciding whether it matches the current task.",
674
+ inputSchema: {
675
+ id: z.string().min(1).describe("Project id."),
676
+ },
677
+ }, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.id)));
678
+ if (!appProfile) {
679
+ server.registerTool("project_select_build_plan", {
680
+ title: "Select a Build Plan for a Project",
681
+ description: "Developer/admin tool. Update the selected Build Plan on a Project. "
682
+ + "Build Plan draft/improve runs select their resulting Plan automatically.",
683
+ inputSchema: {
684
+ id: z.string().min(1).describe("Project id."),
685
+ build_plan_id: z.string().min(1).describe("Build Plan id to use."),
686
+ },
687
+ }, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.id), {
688
+ method: "PATCH",
689
+ body: JSON.stringify({ build_plan_id: args.build_plan_id }),
690
+ }));
691
+ server.registerTool("project_remove", {
692
+ title: "Remove a Project",
693
+ description: "Developer/admin tool. Delete a Project and its Context Graph.",
694
+ inputSchema: {
695
+ id: z.string().min(1).describe("Project id."),
696
+ },
697
+ }, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.id), {
698
+ method: "DELETE",
699
+ }));
700
+ }
701
+ // ── Build + benchmark/evaluation runs ────────────────────────────
702
+ server.registerTool("project_build", {
703
+ title: "Build Context Graph",
704
+ description: "Run the selected Build Plan for a Project and write a task-specific Context Graph. "
705
+ + "Use this only after the user has approved the checks/requested Artifacts and Build Plan, "
706
+ + "unless they explicitly granted autonomy. Returns immediately; poll with runs_status.",
256
707
  inputSchema: {
257
- id: z.string().min(1).describe("Preparation id."),
708
+ id: z.string().min(1).describe("Project id."),
258
709
  },
259
- }, async (args) => callAndReturn(connectionArgs, preparationResourcePath(args.id)));
260
- server.registerTool("prep_select_build_plan", {
261
- title: "Select a Build Plan for a Preparation",
262
- description: "Update the selected Build Plan on a Preparation. Use this to swap "
263
- + "Build Plans between Build runs without rebuilding the Preparation.",
710
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.id, "buildRuns"), { method: "POST", body: "{}" }));
711
+ if (!appProfile) {
712
+ server.registerTool("project_benchmark", {
713
+ title: "Run benchmark/evaluation",
714
+ description: "Developer/evaluation tool. Run the Project's Q&A / fact-check benchmark against the latest Context Graph.",
715
+ inputSchema: {
716
+ id: z.string().min(1).describe("Project id."),
717
+ },
718
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.id, "verifyRuns"), {
719
+ method: "POST",
720
+ body: JSON.stringify({}),
721
+ }));
722
+ }
723
+ server.registerTool("project_source_files", {
724
+ title: "List Project source files",
725
+ description: "List the Source files bound to a Project to confirm coverage scope. "
726
+ + "This is not an answer source by itself; prepare or inspect a Context Graph before answering.",
264
727
  inputSchema: {
265
- id: z.string().min(1).describe("Preparation id."),
266
- build_plan_id: z.string().min(1).describe("Build Plan id to use."),
728
+ id: z.string().min(1).describe("Project id."),
267
729
  },
268
- }, async (args) => callAndReturn(connectionArgs, preparationResourcePath(args.id), {
269
- method: "PATCH",
270
- body: JSON.stringify({ build_plan_id: args.build_plan_id }),
271
- }));
272
- server.registerTool("prep_remove", {
273
- title: "Remove a preparation",
274
- description: "Delete a Preparation. Verifiable context is removed too.",
730
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.id, "sourceFiles")));
731
+ server.registerTool("context_graph_show", {
732
+ title: "Show latest Context Graph",
733
+ description: "Inspect the latest Context Graph locator/status for a Project. Reuse it only if it was built for the same Source "
734
+ + "and task-relevant checks/artifacts; otherwise improve or draft a Build Plan and rebuild. Read artifacts/ handoffs before answering.",
275
735
  inputSchema: {
276
- id: z.string().min(1).describe("Preparation id."),
736
+ project_id: z.string().min(1).describe("Project id."),
277
737
  },
278
- }, async (args) => callAndReturn(connectionArgs, preparationResourcePath(args.id), {
279
- method: "DELETE",
280
- }));
281
- // ── Build + readiness-check runs ───────────────────────────────────────
282
- server.registerTool("prep_build", {
283
- title: "Start a Build run",
284
- description: "Run the selected Build Plan for a Preparation. Returns the new Build run "
285
- + "resource immediately; use runs_status to poll progress and "
286
- + "runs_fetch when the run finishes.",
738
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "contextGraph")));
739
+ server.registerTool("context_graph_file_read", {
740
+ title: "Read a Context Graph file",
741
+ description: "Read one prepared Context Graph file by relative path. Start with artifacts/ task handoffs, "
742
+ + "then use summaries/ for coverage and knowledge/ for drilldown. Do not use this to search unrelated Projects for answers.",
287
743
  inputSchema: {
288
- id: z.string().min(1).describe("Preparation id."),
744
+ project_id: z.string().min(1).describe("Project id."),
745
+ path: z.string().min(1).describe("Relative path inside the Context Graph root."),
289
746
  },
290
- }, async (args) => callAndReturn(connectionArgs, preparationSubresourcePath(args.id, "buildRuns"), { method: "POST", body: "{}" }));
291
- server.registerTool("prep_test", {
292
- title: "Run readiness checks",
293
- description: "Run the Preparation's readiness checks against the latest verifiable "
294
- + "context.",
747
+ }, async (args) => callAndReturn(connectionArgs, contextGraphFilePath(args.project_id, args.path)));
748
+ server.registerTool("project_traces", {
749
+ title: "Read Project traces",
750
+ description: "Read source-backed traces for the latest Context Graph. Use traces to follow prepared context "
751
+ + "back to the Source for exact values, chart reads, tables, and provenance-sensitive claims.",
295
752
  inputSchema: {
296
- id: z.string().min(1).describe("Preparation id."),
753
+ project_id: z.string().min(1).describe("Project id."),
297
754
  },
298
- }, async (args) => callAndReturn(connectionArgs, preparationSubresourcePath(args.id, "verifyRuns"), {
299
- method: "POST",
300
- body: JSON.stringify({}),
301
- }));
755
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "traces")));
756
+ server.registerTool("project_build_evidence", {
757
+ title: "Read Build evidence",
758
+ description: "Read the latest Build evidence resource for a Project: check rows, Artifact diagnostics, "
759
+ + "and readiness backing. If evidence is weak or missing, improve the Build Plan instead of answering.",
760
+ inputSchema: {
761
+ project_id: z.string().min(1).describe("Project id."),
762
+ },
763
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildEvidence")));
764
+ server.registerTool("project_artifact_show", {
765
+ title: "Show Project Artifact",
766
+ description: "Return latest status and contributing evidence for one Build Plan-declared Artifact.",
767
+ inputSchema: {
768
+ project_id: z.string().min(1).describe("Project id."),
769
+ artifact_id: z.string().min(1).describe("Artifact id."),
770
+ },
771
+ }, async (args) => callAndReturn(connectionArgs, `${projectSubresourcePath(args.project_id, "artifacts")}/${encodeURIComponent(args.artifact_id)}`));
302
772
  // ── Build Plans ────────────────────────────────────────────────────────
303
- server.registerTool("build_plan_list", {
304
- title: "List Build Plans",
305
- description: "List every Build Plan visible to the connected instance: Preparation drafts, "
306
- + "saved Build Plans, and bundled Build Plans.",
307
- inputSchema: {},
308
- }, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.buildPlans));
773
+ if (!appProfile) {
774
+ server.registerTool("build_plan_list", {
775
+ title: "List Build Plans",
776
+ description: "Developer/library tool. Do not treat the Build Plan library as an answer source.",
777
+ inputSchema: {},
778
+ }, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.buildPlans));
779
+ server.registerTool("build_plan_show", {
780
+ title: "Show one Build Plan",
781
+ description: "Developer/library tool. Return one Build Plan resource, including requested Artifacts, stages, and checks.",
782
+ inputSchema: {
783
+ build_plan_id: z.string().min(1).describe("Build Plan id."),
784
+ },
785
+ }, async (args) => callAndReturn(connectionArgs, buildPlanResourcePath(args.build_plan_id)));
786
+ server.registerTool("build_plan_file_read", {
787
+ title: "Read a Build Plan file",
788
+ description: "Developer/library tool. Read one file inside a Build Plan package by relative path, such as "
789
+ + "build-plan.json, build-plan.schema.json, or a stage SKILL.md.",
790
+ inputSchema: {
791
+ build_plan_id: z.string().min(1).describe("Build Plan id."),
792
+ path: z.string().min(1).describe("Relative path inside the Build Plan package."),
793
+ },
794
+ }, async (args) => callAndReturn(connectionArgs, `${buildPlanSubresourcePath(args.build_plan_id, "files")}/${encodeRelativePath(args.path)}`));
795
+ }
309
796
  server.registerTool("build_plan_draft", {
310
797
  title: "Draft a Build Plan",
311
- description: "Run the Build Plan authoring agent for a Preparation. Saved requested "
312
- + "Artifacts are used automatically when omitted from the request.",
798
+ description: "Draft the task-specific Build Plan after the user approves the proposed Context Checks "
799
+ + "and requested Artifacts. This is the main Interf preparation action before building.",
313
800
  inputSchema: {
314
- prep_id: z.string().min(1).describe("Preparation id."),
315
- source_folder_path: z.string().min(1).describe("Source folder path visible to the connected instance."),
801
+ project_id: z.string().min(1).describe("Project id."),
316
802
  build_plan_id: z.string().min(1).describe("Build Plan id to create."),
317
803
  label: z.string().min(1).describe("Human-readable Build Plan label."),
318
804
  hint: z.string().min(1).describe("Short Build Plan hint."),
319
- task_prompt: z.string().min(1).describe("Agent job this Build Plan should support."),
320
- requested_artifacts: z.array(RequestedArtifactSchema).optional(),
321
- source_profile: SourceProfileSchema.nullable().optional(),
322
- artifact_requirements: z.array(BuildPlanAuthoringArtifactRequirementSchema).optional(),
805
+ intent: z.string().min(1).describe("Agent task this Build Plan should support."),
806
+ context_checks: z.array(BuildPlanContextCheckDraftSchema).optional().describe("Plain-English Context Checks the user approved before drafting."),
807
+ requested_artifacts: z.array(McpRequestedArtifactSchema).optional().describe("Requested Artifacts the user approved before drafting. Use simple titles, descriptions, and plain-English checks."),
808
+ source_context: SourceContextSchema.nullable().optional(),
809
+ ...(!appProfile
810
+ ? {
811
+ artifact_requirements: z.array(BuildPlanAuthoringArtifactRequirementSchema).optional(),
812
+ }
813
+ : {}),
323
814
  },
324
- }, async (args) => callAndReturn(connectionArgs, preparationSubresourcePath(args.prep_id, "buildPlanDraftRuns"), {
815
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildPlanDraftRuns"), {
325
816
  method: "POST",
326
817
  body: JSON.stringify({
327
- preparation: args.prep_id,
328
- source_folder_path: args.source_folder_path,
818
+ project: args.project_id,
329
819
  build_plan_id: args.build_plan_id,
330
820
  label: args.label,
331
821
  hint: args.hint,
332
- task_prompt: args.task_prompt,
333
- ...(args.requested_artifacts ? { requested_artifacts: args.requested_artifacts } : {}),
334
- ...(args.source_profile !== undefined ? { source_profile: args.source_profile } : {}),
335
- ...(args.artifact_requirements ? { artifact_requirements: args.artifact_requirements } : {}),
822
+ intent: args.intent,
823
+ ...(args.context_checks ? { checks: args.context_checks } : {}),
824
+ ...(args.requested_artifacts ? { requested_artifacts: normalizeRequestedArtifacts(args.requested_artifacts) } : {}),
825
+ ...(args.source_context !== undefined ? { source_context: args.source_context } : {}),
826
+ ...(!appProfile && args.artifact_requirements ? { artifact_requirements: args.artifact_requirements } : {}),
336
827
  }),
337
828
  }));
338
829
  server.registerTool("build_plan_improve", {
339
830
  title: "Improve a Build Plan",
340
- description: "Run the Build Plan improvement agent for a Preparation. Iterates on "
341
- + "the selected Build Plan based on requested Artifacts and latest readiness evidence.",
831
+ description: "Improve the selected Build Plan when the current Context Graph is not ready for the user's task, "
832
+ + "for example when an Artifact is too coarse, a chart/table was under-extracted, or evidence is missing.",
342
833
  inputSchema: {
343
- prep_id: z.string().min(1).describe("Preparation id."),
344
- source_folder_path: z.string().min(1).describe("Source folder path visible to the connected instance."),
834
+ project_id: z.string().min(1).describe("Project id."),
345
835
  build_plan_id: z.string().min(1).describe("Selected Build Plan id to improve."),
346
836
  label: z.string().min(1).describe("Human-readable Build Plan label."),
347
837
  hint: z.string().min(1).describe("Short Build Plan hint."),
348
- task_prompt: z.string().min(1).describe("Change request or improvement goal."),
349
- requested_artifacts: z.array(RequestedArtifactSchema).optional(),
350
- source_profile: SourceProfileSchema.nullable().optional(),
351
- artifact_requirements: z.array(BuildPlanAuthoringArtifactRequirementSchema).optional(),
838
+ intent: z.string().min(1).describe("Change request or improvement goal."),
839
+ context_checks: z.array(BuildPlanContextCheckDraftSchema).optional().describe("Plain-English Context Checks the improved Plan must satisfy."),
840
+ requested_artifacts: z.array(McpRequestedArtifactSchema).optional().describe("Requested Artifacts for the improved Plan. Use simple titles, descriptions, and plain-English checks."),
841
+ source_context: SourceContextSchema.nullable().optional(),
842
+ ...(!appProfile
843
+ ? {
844
+ artifact_requirements: z.array(BuildPlanAuthoringArtifactRequirementSchema).optional(),
845
+ }
846
+ : {}),
352
847
  },
353
- }, async (args) => callAndReturn(connectionArgs, preparationSubresourcePath(args.prep_id, "buildPlanImprovementRuns"), {
848
+ }, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildPlanImprovementRuns"), {
354
849
  method: "POST",
355
850
  body: JSON.stringify({
356
- preparation: args.prep_id,
357
- source_folder_path: args.source_folder_path,
851
+ project: args.project_id,
358
852
  build_plan_id: args.build_plan_id,
359
853
  reference_build_plan_id: args.build_plan_id,
360
854
  label: args.label,
361
855
  hint: args.hint,
362
- task_prompt: args.task_prompt,
363
- ...(args.requested_artifacts ? { requested_artifacts: args.requested_artifacts } : {}),
364
- ...(args.source_profile !== undefined ? { source_profile: args.source_profile } : {}),
365
- ...(args.artifact_requirements ? { artifact_requirements: args.artifact_requirements } : {}),
856
+ intent: args.intent,
857
+ ...(args.context_checks ? { checks: args.context_checks } : {}),
858
+ ...(args.requested_artifacts ? { requested_artifacts: normalizeRequestedArtifacts(args.requested_artifacts) } : {}),
859
+ ...(args.source_context !== undefined ? { source_context: args.source_context } : {}),
860
+ ...(!appProfile && args.artifact_requirements ? { artifact_requirements: args.artifact_requirements } : {}),
366
861
  }),
367
862
  }));
368
863
  // ── Runs ────────────────────────────────────────────────────────────────
369
864
  server.registerTool("runs_status", {
370
865
  title: "Get run status",
371
- description: "Return the run record for one observable run.",
866
+ description: "Return a compact run-status receipt for polling. This intentionally omits full trace events, "
867
+ + "stream logs, and artifact manifests so repeated polls do not fill the agent context window.",
372
868
  inputSchema: {
373
869
  run_id: z.string().min(1).describe("Run id."),
374
870
  },
375
- }, async (args) => callAndReturn(connectionArgs, runResourcePath(args.run_id)));
871
+ }, async (args) => callAndProject(connectionArgs, runSubresourcePath(args.run_id, "status"), compactRunStatus));
376
872
  server.registerTool("runs_watch", {
377
- title: "Read run events",
378
- description: "Read the events log for one run as a snapshot. Returns the same "
379
- + "stream the UI consumes via SSE; agents that need live progress "
380
- + "should poll runs_status until the run reaches a terminal state.",
381
- inputSchema: {
382
- run_id: z.string().min(1).describe("Run id."),
383
- },
384
- }, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.buildRuns}/${encodeURIComponent(args.run_id)}/events`));
385
- server.registerTool("runs_cancel", {
386
- title: "Cancel a run",
387
- description: "Request cancellation of an in-flight run.",
873
+ title: "Read recent run events",
874
+ description: "Read a bounded tail of run events for debugging or progress detail. Do not use this for polling; "
875
+ + "poll runs_status until the run reaches a terminal state.",
388
876
  inputSchema: {
389
877
  run_id: z.string().min(1).describe("Run id."),
878
+ limit: z.number().int().min(1).max(50).default(10).describe("Maximum recent events to return. Defaults to 10; max 50."),
879
+ include_streams: z.boolean().default(false).describe("Include recent log stream chunks. Defaults to false because logs can be verbose."),
880
+ stream_limit: z.number().int().min(1).max(20).default(5).describe("Maximum recent log stream chunks to return when include_streams is true. Defaults to 5; max 20."),
390
881
  },
391
- }, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.buildRuns}/${encodeURIComponent(args.run_id)}/cancel`, { method: "POST", body: "{}" }));
882
+ }, async (args) => callAndProject(connectionArgs, runResourcePath(args.run_id), (body) => compactRunEvents(body, {
883
+ eventLimit: args.limit,
884
+ includeStreams: args.include_streams,
885
+ streamLimit: args.stream_limit,
886
+ })));
887
+ if (!appProfile) {
888
+ server.registerTool("runs_cancel", {
889
+ title: "Cancel a run",
890
+ description: "Developer/admin tool. Request cancellation of an in-flight run.",
891
+ inputSchema: {
892
+ run_id: z.string().min(1).describe("Run id."),
893
+ },
894
+ }, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.runs}/${encodeURIComponent(args.run_id)}/cancel`, { method: "POST", body: "{}" }));
895
+ }
392
896
  server.registerTool("runs_fetch", {
393
897
  title: "Fetch run artifacts",
394
- description: "Return the artifact manifest for a finished run (verifiable context, "
395
- + "proof records, logs, run-scoped audit trail).",
898
+ description: "Return the artifact manifest for a finished run (Context Graph, "
899
+ + "evidence records, logs, run-scoped audit trail).",
396
900
  inputSchema: {
397
901
  run_id: z.string().min(1).describe("Run id."),
398
902
  },
399
- }, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.buildRuns}/${encodeURIComponent(args.run_id)}/artifacts`));
903
+ }, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.runs}/${encodeURIComponent(args.run_id)}/artifacts`));
400
904
  // ── Instance ────────────────────────────────────────────────────────────
401
905
  server.registerTool("instance_status", {
402
906
  title: "Show instance status",
403
- description: "Return the engine's instance resource: started_at, package "
404
- + "version, registered preparations, active runs, idle seconds.",
907
+ description: "Return the local service instance resource: started_at, registered "
908
+ + "Projects, active runs, idle seconds.",
405
909
  inputSchema: {},
406
910
  }, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.instance));
407
911
  }
408
- async function startStdioServer(args) {
409
- const server = new McpServer({ name: "interf", version: packageVersionFromManifest() }, { capabilities: { tools: {} } });
912
+ export async function startInterfMcpServer(args) {
913
+ if (args.transport && args.transport !== "stdio") {
914
+ throw new Error("Only the MCP stdio transport is implemented for the local Interf MCP server.");
915
+ }
916
+ const server = new McpServer({ name: "interf", version: packageVersionFromManifest() }, {
917
+ capabilities: { tools: {} },
918
+ instructions: INTERF_MCP_INSTRUCTIONS,
919
+ });
410
920
  registerTools(server, args);
411
921
  const transport = new StdioServerTransport();
412
922
  await server.connect(transport);
413
923
  }
414
924
  export const mcpCommand = {
415
925
  command: "mcp",
416
- describe: "Run the Interf Model Context Protocol server (stdio by default).",
926
+ describe: false,
417
927
  builder: (yargs) => yargs
418
928
  .option("transport", {
419
929
  type: "string",
420
- choices: ["stdio", "http"],
930
+ choices: ["stdio"],
421
931
  default: "stdio",
422
932
  describe: "Transport for the MCP server.",
933
+ })
934
+ .option("profile", {
935
+ type: "string",
936
+ choices: ["headless", "app"],
937
+ default: "headless",
938
+ describe: "Tool profile. App profile hides lifecycle tools because Desktop owns the local service.",
423
939
  })
424
940
  .option("url", {
425
941
  type: "string",
@@ -430,11 +946,12 @@ export const mcpCommand = {
430
946
  describe: "Override the active bearer token.",
431
947
  }),
432
948
  handler: async (args) => {
433
- if (args.transport && args.transport !== "stdio") {
434
- process.stderr.write("interf mcp: only the stdio transport is implemented today. "
435
- + "Open an issue if you need --transport=http.\n");
949
+ try {
950
+ await startInterfMcpServer(args);
951
+ }
952
+ catch (error) {
953
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
436
954
  process.exit(2);
437
955
  }
438
- await startStdioServer(args);
439
956
  },
440
957
  };