@interf/compiler 0.5.1 → 0.6.3

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 (353) hide show
  1. package/README.md +160 -201
  2. package/builtin-workflows/interf/README.md +22 -10
  3. package/builtin-workflows/interf/compile/stages/shape/SKILL.md +8 -5
  4. package/builtin-workflows/interf/compile/stages/structure/SKILL.md +3 -0
  5. package/builtin-workflows/interf/compile/stages/summarize/SKILL.md +18 -2
  6. package/builtin-workflows/interf/improve/SKILL.md +4 -4
  7. package/builtin-workflows/interf/use/query/SKILL.md +1 -1
  8. package/builtin-workflows/interf/workflow.json +19 -5
  9. package/builtin-workflows/interf/{compiled.schema.json → workflow.schema.json} +10 -3
  10. package/dist/bin.js +2 -28
  11. package/dist/{commands → cli/commands}/check-draft.d.ts +2 -2
  12. package/dist/{commands → cli/commands}/check-draft.js +13 -13
  13. package/dist/{commands → cli/commands}/compile-controller.d.ts +3 -3
  14. package/dist/{commands → cli/commands}/compile-controller.js +39 -44
  15. package/dist/cli/commands/compile.d.ts +33 -0
  16. package/dist/{commands → cli/commands}/compile.js +107 -33
  17. package/dist/{commands → cli/commands}/compiled-flow.d.ts +3 -4
  18. package/dist/{commands → cli/commands}/compiled-flow.js +9 -14
  19. package/dist/{commands → cli/commands}/create-workflow-wizard.d.ts +20 -2
  20. package/dist/cli/commands/create-workflow-wizard.js +288 -0
  21. package/dist/{commands → cli/commands}/create.d.ts +2 -2
  22. package/dist/cli/commands/create.js +166 -0
  23. package/dist/cli/commands/dataset-selection.d.ts +6 -0
  24. package/dist/cli/commands/dataset-selection.js +11 -0
  25. package/dist/{commands → cli/commands}/default.js +5 -5
  26. package/dist/{commands → cli/commands}/doctor.js +12 -13
  27. package/dist/{commands → cli/commands}/executor-flow.d.ts +2 -2
  28. package/dist/{commands → cli/commands}/executor-flow.js +17 -17
  29. package/dist/cli/commands/init.d.ts +11 -0
  30. package/dist/{commands → cli/commands}/init.js +202 -109
  31. package/dist/{commands → cli/commands}/list.js +9 -6
  32. package/dist/{commands → cli/commands}/reset.js +5 -5
  33. package/dist/{commands → cli/commands}/source-config-wizard.d.ts +10 -5
  34. package/dist/{commands → cli/commands}/source-config-wizard.js +202 -95
  35. package/dist/{commands → cli/commands}/status.js +20 -11
  36. package/dist/{commands → cli/commands}/test-flow.d.ts +13 -4
  37. package/dist/{commands → cli/commands}/test-flow.js +30 -26
  38. package/dist/cli/commands/test.d.ts +14 -0
  39. package/dist/{commands → cli/commands}/test.js +48 -40
  40. package/dist/{commands → cli/commands}/verify.js +4 -4
  41. package/dist/cli/index.d.ts +21 -0
  42. package/dist/cli/index.js +33 -0
  43. package/dist/index.d.ts +22 -11
  44. package/dist/index.js +15 -6
  45. package/dist/lib/agent-args.d.ts +1 -3
  46. package/dist/lib/agent-args.js +1 -42
  47. package/dist/lib/agent-constants.d.ts +1 -5
  48. package/dist/lib/agent-constants.js +1 -28
  49. package/dist/lib/agent-detection.d.ts +1 -7
  50. package/dist/lib/agent-detection.js +1 -65
  51. package/dist/lib/agent-execution.d.ts +1 -2
  52. package/dist/lib/agent-execution.js +1 -242
  53. package/dist/lib/agent-logs.d.ts +1 -2
  54. package/dist/lib/agent-logs.js +1 -17
  55. package/dist/lib/agent-preflight.d.ts +1 -7
  56. package/dist/lib/agent-preflight.js +1 -76
  57. package/dist/lib/agent-render.d.ts +1 -8
  58. package/dist/lib/agent-render.js +1 -218
  59. package/dist/lib/agent-shells.d.ts +1 -44
  60. package/dist/lib/agent-shells.js +1 -847
  61. package/dist/lib/agent-status.d.ts +1 -3
  62. package/dist/lib/agent-status.js +1 -58
  63. package/dist/lib/agent-types.d.ts +1 -30
  64. package/dist/lib/agent-types.js +1 -1
  65. package/dist/lib/agents.d.ts +1 -6
  66. package/dist/lib/agents.js +1 -5
  67. package/dist/lib/builtin-compiled-workflow.d.ts +1 -129
  68. package/dist/lib/builtin-compiled-workflow.js +1 -153
  69. package/dist/lib/compiled-compile.d.ts +1 -52
  70. package/dist/lib/compiled-compile.js +1 -274
  71. package/dist/lib/compiled-paths.d.ts +1 -39
  72. package/dist/lib/compiled-paths.js +3 -103
  73. package/dist/lib/compiled-raw.d.ts +1 -49
  74. package/dist/lib/compiled-raw.js +3 -102
  75. package/dist/lib/compiled-reset.d.ts +1 -1
  76. package/dist/lib/compiled-reset.js +3 -44
  77. package/dist/lib/compiled-schema.d.ts +1 -27
  78. package/dist/lib/compiled-schema.js +1 -110
  79. package/dist/lib/discovery.d.ts +1 -1
  80. package/dist/lib/discovery.js +2 -2
  81. package/dist/lib/execution-profile.d.ts +1 -17
  82. package/dist/lib/execution-profile.js +1 -84
  83. package/dist/lib/executors.d.ts +1 -32
  84. package/dist/lib/executors.js +1 -43
  85. package/dist/lib/interf-bootstrap.d.ts +1 -3
  86. package/dist/lib/interf-bootstrap.js +3 -18
  87. package/dist/lib/interf-detect.d.ts +1 -33
  88. package/dist/lib/interf-detect.js +3 -176
  89. package/dist/lib/interf-scaffold.d.ts +1 -2
  90. package/dist/lib/interf-scaffold.js +3 -121
  91. package/dist/lib/interf-workflow-package.d.ts +1 -20
  92. package/dist/lib/interf-workflow-package.js +1 -276
  93. package/dist/lib/interf.d.ts +1 -5
  94. package/dist/lib/interf.js +3 -4
  95. package/dist/lib/local-workflows.d.ts +1 -53
  96. package/dist/lib/local-workflows.js +1 -399
  97. package/dist/lib/package-root.d.ts +1 -0
  98. package/dist/lib/package-root.js +1 -0
  99. package/dist/lib/project-paths.d.ts +1 -11
  100. package/dist/lib/project-paths.js +3 -32
  101. package/dist/lib/runtime-acceptance.d.ts +1 -9
  102. package/dist/lib/runtime-acceptance.js +1 -257
  103. package/dist/lib/runtime-contracts.d.ts +1 -2
  104. package/dist/lib/runtime-contracts.js +1 -47
  105. package/dist/lib/runtime-inventory.d.ts +1 -7
  106. package/dist/lib/runtime-inventory.js +1 -29
  107. package/dist/lib/runtime-paths.d.ts +1 -7
  108. package/dist/lib/runtime-paths.js +1 -23
  109. package/dist/lib/runtime-prompt.d.ts +1 -2
  110. package/dist/lib/runtime-prompt.js +1 -46
  111. package/dist/lib/runtime-reconcile.d.ts +1 -2
  112. package/dist/lib/runtime-reconcile.js +1 -156
  113. package/dist/lib/runtime-runs.d.ts +1 -11
  114. package/dist/lib/runtime-runs.js +1 -250
  115. package/dist/lib/runtime-types.d.ts +1 -43
  116. package/dist/lib/runtime-types.js +1 -1
  117. package/dist/lib/runtime.d.ts +1 -6
  118. package/dist/lib/runtime.js +1 -5
  119. package/dist/lib/schema.d.ts +4 -1016
  120. package/dist/lib/schema.js +6 -539
  121. package/dist/lib/source-config.d.ts +1 -39
  122. package/dist/lib/source-config.js +3 -293
  123. package/dist/lib/state-artifacts.d.ts +1 -8
  124. package/dist/lib/state-artifacts.js +1 -13
  125. package/dist/lib/state-health.d.ts +1 -4
  126. package/dist/lib/state-health.js +1 -132
  127. package/dist/lib/state-io.d.ts +1 -10
  128. package/dist/lib/state-io.js +1 -76
  129. package/dist/lib/state-paths.d.ts +1 -4
  130. package/dist/lib/state-paths.js +1 -13
  131. package/dist/lib/state-view.d.ts +1 -4
  132. package/dist/lib/state-view.js +1 -103
  133. package/dist/lib/state.d.ts +1 -6
  134. package/dist/lib/state.js +1 -5
  135. package/dist/lib/test-execution.d.ts +1 -14
  136. package/dist/lib/test-execution.js +3 -525
  137. package/dist/lib/test-matrices.d.ts +1 -90
  138. package/dist/lib/test-matrices.js +3 -96
  139. package/dist/lib/test-paths.d.ts +1 -12
  140. package/dist/lib/test-paths.js +3 -59
  141. package/dist/lib/test-profile-presets.d.ts +1 -57
  142. package/dist/lib/test-profile-presets.js +3 -50
  143. package/dist/lib/test-sandbox.d.ts +1 -11
  144. package/dist/lib/test-sandbox.js +3 -105
  145. package/dist/lib/test-specs.d.ts +1 -7
  146. package/dist/lib/test-specs.js +3 -114
  147. package/dist/lib/test-targets.d.ts +1 -5
  148. package/dist/lib/test-targets.js +3 -38
  149. package/dist/lib/test-types.d.ts +1 -17
  150. package/dist/lib/test-types.js +3 -1
  151. package/dist/lib/test.d.ts +1 -4
  152. package/dist/lib/test.js +3 -3
  153. package/dist/lib/validate-compiled.d.ts +1 -27
  154. package/dist/lib/validate-compiled.js +1 -238
  155. package/dist/lib/validate-helpers.d.ts +1 -12
  156. package/dist/lib/validate-helpers.js +1 -41
  157. package/dist/lib/validate.d.ts +1 -19
  158. package/dist/lib/validate.js +1 -256
  159. package/dist/lib/workflow-authoring.d.ts +1 -0
  160. package/dist/lib/workflow-authoring.js +1 -0
  161. package/dist/lib/workflow-definitions.d.ts +1 -68
  162. package/dist/lib/workflow-definitions.js +1 -206
  163. package/dist/lib/workflow-edit-session.d.ts +1 -0
  164. package/dist/lib/workflow-edit-session.js +1 -0
  165. package/dist/lib/workflow-edit-utils.d.ts +1 -0
  166. package/dist/lib/workflow-edit-utils.js +1 -0
  167. package/dist/lib/workflow-helpers.d.ts +1 -38
  168. package/dist/lib/workflow-helpers.js +1 -167
  169. package/dist/lib/workflow-improvement.d.ts +1 -22
  170. package/dist/lib/workflow-improvement.js +1 -396
  171. package/dist/lib/workflow-primitives.d.ts +1 -2
  172. package/dist/lib/workflow-primitives.js +1 -5
  173. package/dist/lib/workflow-review-paths.d.ts +1 -10
  174. package/dist/lib/workflow-review-paths.js +1 -27
  175. package/dist/lib/workflow-stage-policy.d.ts +1 -0
  176. package/dist/lib/workflow-stage-policy.js +1 -0
  177. package/dist/lib/workflow-stage-runner.d.ts +1 -41
  178. package/dist/lib/workflow-stage-runner.js +1 -109
  179. package/dist/lib/workflows.d.ts +1 -15
  180. package/dist/lib/workflows.js +1 -31
  181. package/dist/packages/agents/index.d.ts +17 -0
  182. package/dist/packages/agents/index.js +15 -0
  183. package/dist/packages/agents/lib/agents.d.ts +6 -0
  184. package/dist/packages/agents/lib/agents.js +5 -0
  185. package/dist/packages/agents/lib/args.d.ts +4 -0
  186. package/dist/packages/agents/lib/args.js +52 -0
  187. package/dist/packages/agents/lib/constants.d.ts +5 -0
  188. package/dist/packages/agents/lib/constants.js +28 -0
  189. package/dist/packages/agents/lib/detection.d.ts +7 -0
  190. package/dist/packages/agents/lib/detection.js +65 -0
  191. package/dist/packages/agents/lib/execution-profile.d.ts +17 -0
  192. package/dist/packages/agents/lib/execution-profile.js +84 -0
  193. package/dist/packages/agents/lib/execution.d.ts +2 -0
  194. package/dist/packages/agents/lib/execution.js +243 -0
  195. package/dist/packages/agents/lib/executors.d.ts +32 -0
  196. package/dist/packages/agents/lib/executors.js +45 -0
  197. package/dist/packages/agents/lib/logs.d.ts +2 -0
  198. package/dist/packages/agents/lib/logs.js +17 -0
  199. package/dist/packages/agents/lib/preflight.d.ts +7 -0
  200. package/dist/packages/agents/lib/preflight.js +77 -0
  201. package/dist/packages/agents/lib/render.d.ts +8 -0
  202. package/dist/packages/agents/lib/render.js +218 -0
  203. package/dist/packages/agents/lib/schema.d.ts +8 -0
  204. package/dist/packages/agents/lib/schema.js +7 -0
  205. package/dist/packages/agents/lib/shells.d.ts +69 -0
  206. package/dist/packages/agents/lib/shells.js +1021 -0
  207. package/dist/packages/agents/lib/status.d.ts +3 -0
  208. package/dist/packages/agents/lib/status.js +58 -0
  209. package/dist/packages/agents/lib/types.d.ts +30 -0
  210. package/dist/packages/agents/lib/types.js +1 -0
  211. package/dist/{lib → packages/agents/lib}/user-config.d.ts +1 -0
  212. package/dist/{lib → packages/agents/lib}/user-config.js +3 -2
  213. package/dist/packages/compiler/compiled-compile.d.ts +48 -0
  214. package/dist/packages/compiler/compiled-compile.js +256 -0
  215. package/dist/packages/compiler/compiled-schema.d.ts +31 -0
  216. package/dist/packages/compiler/compiled-schema.js +141 -0
  217. package/dist/packages/compiler/index.d.ts +24 -0
  218. package/dist/packages/compiler/index.js +23 -0
  219. package/dist/packages/compiler/lib/schema.d.ts +684 -0
  220. package/dist/packages/compiler/lib/schema.js +361 -0
  221. package/dist/packages/compiler/runtime-acceptance.d.ts +9 -0
  222. package/dist/packages/compiler/runtime-acceptance.js +269 -0
  223. package/dist/packages/compiler/runtime-contracts.d.ts +2 -0
  224. package/dist/packages/compiler/runtime-contracts.js +48 -0
  225. package/dist/packages/compiler/runtime-inventory.d.ts +7 -0
  226. package/dist/packages/compiler/runtime-inventory.js +29 -0
  227. package/dist/packages/compiler/runtime-paths.d.ts +8 -0
  228. package/dist/packages/compiler/runtime-paths.js +26 -0
  229. package/dist/packages/compiler/runtime-prompt.d.ts +2 -0
  230. package/dist/packages/compiler/runtime-prompt.js +48 -0
  231. package/dist/packages/compiler/runtime-reconcile.d.ts +2 -0
  232. package/dist/packages/compiler/runtime-reconcile.js +193 -0
  233. package/dist/packages/compiler/runtime-runs.d.ts +11 -0
  234. package/dist/packages/compiler/runtime-runs.js +262 -0
  235. package/dist/packages/compiler/runtime-types.d.ts +43 -0
  236. package/dist/packages/compiler/runtime-types.js +1 -0
  237. package/dist/packages/compiler/runtime.d.ts +6 -0
  238. package/dist/packages/compiler/runtime.js +5 -0
  239. package/dist/packages/compiler/state-artifacts.d.ts +8 -0
  240. package/dist/packages/compiler/state-artifacts.js +13 -0
  241. package/dist/packages/compiler/state-health.d.ts +4 -0
  242. package/dist/packages/compiler/state-health.js +132 -0
  243. package/dist/packages/compiler/state-io.d.ts +10 -0
  244. package/dist/packages/compiler/state-io.js +76 -0
  245. package/dist/packages/compiler/state-paths.d.ts +4 -0
  246. package/dist/packages/compiler/state-paths.js +13 -0
  247. package/dist/packages/compiler/state-view.d.ts +4 -0
  248. package/dist/packages/compiler/state-view.js +103 -0
  249. package/dist/packages/compiler/state.d.ts +7 -0
  250. package/dist/packages/compiler/state.js +12 -0
  251. package/dist/packages/compiler/validate-compiled.d.ts +27 -0
  252. package/dist/packages/compiler/validate-compiled.js +241 -0
  253. package/dist/packages/compiler/validate-helpers.d.ts +12 -0
  254. package/dist/packages/compiler/validate-helpers.js +41 -0
  255. package/dist/packages/compiler/validate.d.ts +21 -0
  256. package/dist/packages/compiler/validate.js +249 -0
  257. package/dist/packages/compiler/workflow-primitives.d.ts +2 -0
  258. package/dist/packages/compiler/workflow-primitives.js +5 -0
  259. package/dist/packages/compiler/workflows.d.ts +15 -0
  260. package/dist/packages/compiler/workflows.js +31 -0
  261. package/dist/packages/project-model/compiled-paths.d.ts +40 -0
  262. package/dist/packages/project-model/compiled-paths.js +106 -0
  263. package/dist/packages/project-model/compiled-raw.d.ts +49 -0
  264. package/dist/packages/project-model/compiled-raw.js +102 -0
  265. package/dist/packages/project-model/compiled-reset.d.ts +2 -0
  266. package/dist/packages/project-model/compiled-reset.js +72 -0
  267. package/dist/packages/project-model/index.d.ts +11 -0
  268. package/dist/packages/project-model/index.js +10 -0
  269. package/dist/packages/project-model/interf-bootstrap.d.ts +3 -0
  270. package/dist/packages/project-model/interf-bootstrap.js +18 -0
  271. package/dist/packages/project-model/interf-detect.d.ts +33 -0
  272. package/dist/packages/project-model/interf-detect.js +176 -0
  273. package/dist/packages/project-model/interf-scaffold.d.ts +2 -0
  274. package/dist/packages/project-model/interf-scaffold.js +124 -0
  275. package/dist/packages/project-model/interf.d.ts +5 -0
  276. package/dist/packages/project-model/interf.js +4 -0
  277. package/dist/packages/project-model/lib/schema.d.ts +125 -0
  278. package/dist/packages/project-model/lib/schema.js +62 -0
  279. package/dist/packages/project-model/project-paths.d.ts +11 -0
  280. package/dist/packages/project-model/project-paths.js +32 -0
  281. package/dist/packages/project-model/source-config.d.ts +38 -0
  282. package/dist/packages/project-model/source-config.js +297 -0
  283. package/dist/packages/testing/index.d.ts +13 -0
  284. package/dist/packages/testing/index.js +10 -0
  285. package/dist/packages/testing/lib/schema.d.ts +261 -0
  286. package/dist/packages/testing/lib/schema.js +119 -0
  287. package/dist/packages/testing/test-execution.d.ts +14 -0
  288. package/dist/packages/testing/test-execution.js +525 -0
  289. package/dist/packages/testing/test-matrices.d.ts +90 -0
  290. package/dist/packages/testing/test-matrices.js +96 -0
  291. package/dist/packages/testing/test-paths.d.ts +12 -0
  292. package/dist/packages/testing/test-paths.js +59 -0
  293. package/dist/packages/testing/test-profile-presets.d.ts +57 -0
  294. package/dist/packages/testing/test-profile-presets.js +50 -0
  295. package/dist/packages/testing/test-sandbox.d.ts +11 -0
  296. package/dist/packages/testing/test-sandbox.js +105 -0
  297. package/dist/packages/testing/test-specs.d.ts +7 -0
  298. package/dist/packages/testing/test-specs.js +114 -0
  299. package/dist/packages/testing/test-targets.d.ts +5 -0
  300. package/dist/packages/testing/test-targets.js +38 -0
  301. package/dist/packages/testing/test-types.d.ts +16 -0
  302. package/dist/packages/testing/test-types.js +1 -0
  303. package/dist/packages/testing/test.d.ts +4 -0
  304. package/dist/packages/testing/test.js +3 -0
  305. package/dist/packages/workflow-authoring/index.d.ts +4 -0
  306. package/dist/packages/workflow-authoring/index.js +4 -0
  307. package/dist/packages/workflow-authoring/lib/workflow-edit-utils.d.ts +10 -0
  308. package/dist/packages/workflow-authoring/lib/workflow-edit-utils.js +39 -0
  309. package/dist/packages/workflow-authoring/workflow-authoring.d.ts +26 -0
  310. package/dist/packages/workflow-authoring/workflow-authoring.js +120 -0
  311. package/dist/packages/workflow-authoring/workflow-edit-session.d.ts +16 -0
  312. package/dist/packages/workflow-authoring/workflow-edit-session.js +57 -0
  313. package/dist/packages/workflow-authoring/workflow-improvement.d.ts +23 -0
  314. package/dist/packages/workflow-authoring/workflow-improvement.js +209 -0
  315. package/dist/packages/workflow-package/builtin-compiled-workflow.d.ts +38 -0
  316. package/dist/packages/workflow-package/builtin-compiled-workflow.js +94 -0
  317. package/dist/packages/workflow-package/index.d.ts +9 -0
  318. package/dist/packages/workflow-package/index.js +9 -0
  319. package/dist/packages/workflow-package/interf-workflow-package.d.ts +25 -0
  320. package/dist/packages/workflow-package/interf-workflow-package.js +342 -0
  321. package/dist/{lib/config.d.ts → packages/workflow-package/lib/package-root.d.ts} +0 -1
  322. package/dist/packages/workflow-package/lib/package-root.js +6 -0
  323. package/dist/packages/workflow-package/local-workflows.d.ts +54 -0
  324. package/dist/packages/workflow-package/local-workflows.js +422 -0
  325. package/dist/packages/workflow-package/workflow-definitions.d.ts +78 -0
  326. package/dist/packages/workflow-package/workflow-definitions.js +203 -0
  327. package/dist/packages/workflow-package/workflow-helpers.d.ts +38 -0
  328. package/dist/packages/workflow-package/workflow-helpers.js +167 -0
  329. package/dist/packages/workflow-package/workflow-review-paths.d.ts +10 -0
  330. package/dist/packages/workflow-package/workflow-review-paths.js +27 -0
  331. package/dist/packages/workflow-package/workflow-stage-policy.d.ts +5 -0
  332. package/dist/packages/workflow-package/workflow-stage-policy.js +31 -0
  333. package/dist/packages/workflow-package/workflow-stage-runner.d.ts +41 -0
  334. package/dist/packages/workflow-package/workflow-stage-runner.js +109 -0
  335. package/package.json +44 -21
  336. package/dist/commands/compile.d.ts +0 -15
  337. package/dist/commands/create-workflow-wizard.js +0 -125
  338. package/dist/commands/create.js +0 -162
  339. package/dist/commands/init.d.ts +0 -3
  340. package/dist/commands/test.d.ts +0 -9
  341. package/dist/lib/compiled-home.d.ts +0 -5
  342. package/dist/lib/compiled-home.js +0 -32
  343. package/dist/lib/config.js +0 -9
  344. package/dist/lib/obsidian.d.ts +0 -1
  345. package/dist/lib/obsidian.js +0 -15
  346. package/dist/lib/summarize-plan.d.ts +0 -17
  347. package/dist/lib/summarize-plan.js +0 -120
  348. /package/dist/{commands → cli/commands}/default.d.ts +0 -0
  349. /package/dist/{commands → cli/commands}/doctor.d.ts +0 -0
  350. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  351. /package/dist/{commands → cli/commands}/reset.d.ts +0 -0
  352. /package/dist/{commands → cli/commands}/status.d.ts +0 -0
  353. /package/dist/{commands → cli/commands}/verify.d.ts +0 -0
@@ -0,0 +1,243 @@
1
+ import { spawn } from "node:child_process";
2
+ import chalk from "chalk";
3
+ import { CODEX_NOISE_PATTERNS } from "./constants.js";
4
+ import { buildAgentArgs, buildAgentEnv } from "./args.js";
5
+ import { appendAgentEventLog, appendAgentStatusLog } from "./logs.js";
6
+ import { displayAgentEvent, emitVisibleAgentText, summarizeAgentToolActivity, } from "./render.js";
7
+ import { classifyTerminalVisibleStatus, extractAgentFailureStatus, hasAgentStalled, } from "./status.js";
8
+ const STOP_SIGNAL_GRACE_MS = 1500;
9
+ export function spawnAgent(agent, dirPath, prompt, options = {}) {
10
+ return new Promise((resolve) => {
11
+ const args = buildAgentArgs(agent, prompt, options.executionProfile);
12
+ appendAgentEventLog(options.eventLogPath, {
13
+ type: "spawn",
14
+ command: agent.command,
15
+ args,
16
+ cwd: dirPath,
17
+ });
18
+ const launchLine = `Launching ${agent.displayName}...`;
19
+ console.log(chalk.dim(` ${launchLine}`));
20
+ appendAgentStatusLog(options.statusLogPath, launchLine);
21
+ const proc = spawn(agent.command, args, {
22
+ cwd: dirPath,
23
+ env: buildAgentEnv(agent),
24
+ stdio: ["ignore", "pipe", "pipe"],
25
+ });
26
+ const timeoutMs = options.executionProfile?.timeoutMs ?? null;
27
+ let buffer = "";
28
+ let stderrBuffer = "";
29
+ let lastVisibleOutputAt = Date.now();
30
+ let lastActivityAt = Date.now();
31
+ let lastHeartbeatAt = 0;
32
+ let sawRawOutput = false;
33
+ let sawVisibleEvent = false;
34
+ let timedOut = false;
35
+ let completionSatisfied = false;
36
+ let failureStatus = null;
37
+ let terminalSignalSent = false;
38
+ let lastToolActivity = null;
39
+ let stopPhase = "running";
40
+ let stopTimer = null;
41
+ const lastVisibleText = { current: null };
42
+ const clearStopTimer = () => {
43
+ if (!stopTimer)
44
+ return;
45
+ clearTimeout(stopTimer);
46
+ stopTimer = null;
47
+ };
48
+ const requestProcessStop = (signal = "SIGINT") => {
49
+ if (proc.exitCode != null)
50
+ return;
51
+ if (signal === "SIGINT") {
52
+ if (stopPhase !== "running")
53
+ return;
54
+ stopPhase = "sigint";
55
+ }
56
+ else if (signal === "SIGTERM") {
57
+ if (stopPhase === "sigterm" || stopPhase === "sigkill")
58
+ return;
59
+ stopPhase = "sigterm";
60
+ }
61
+ else if (signal === "SIGKILL") {
62
+ if (stopPhase === "sigkill")
63
+ return;
64
+ stopPhase = "sigkill";
65
+ }
66
+ appendAgentEventLog(options.eventLogPath, {
67
+ type: "signal",
68
+ signal,
69
+ });
70
+ proc.kill(signal);
71
+ clearStopTimer();
72
+ if (signal === "SIGKILL")
73
+ return;
74
+ stopTimer = setTimeout(() => {
75
+ if (proc.exitCode != null)
76
+ return;
77
+ requestProcessStop(signal === "SIGINT" ? "SIGTERM" : "SIGKILL");
78
+ }, STOP_SIGNAL_GRACE_MS);
79
+ };
80
+ const heartbeat = setInterval(() => {
81
+ const now = Date.now();
82
+ const minQuietMs = sawVisibleEvent ? 15000 : 8000;
83
+ const minHeartbeatGapMs = sawVisibleEvent ? 30000 : 12000;
84
+ if (now - lastVisibleOutputAt < minQuietMs)
85
+ return;
86
+ if (now - lastHeartbeatAt < minHeartbeatGapMs)
87
+ return;
88
+ lastHeartbeatAt = now;
89
+ const seconds = Math.floor((now - lastVisibleOutputAt) / 1000);
90
+ const activitySuffix = lastToolActivity ? ` while ${lastToolActivity}` : "";
91
+ const label = sawVisibleEvent
92
+ ? `${agent.displayName} is still running${activitySuffix}... (${seconds}s since last output)`
93
+ : sawRawOutput
94
+ ? `${agent.displayName} is active${activitySuffix}, but has not emitted visible progress yet... (${seconds}s)`
95
+ : `${agent.displayName} started, but has not emitted visible progress yet... (${seconds}s)`;
96
+ console.log(chalk.dim(` ${label}`));
97
+ appendAgentStatusLog(options.statusLogPath, label);
98
+ }, 5000);
99
+ const forwardSignal = () => {
100
+ requestProcessStop("SIGINT");
101
+ };
102
+ const maybeInterruptAfterTerminalStatus = () => {
103
+ if (options.completionCheck)
104
+ return;
105
+ if (terminalSignalSent || !lastVisibleText.terminalStatus)
106
+ return;
107
+ terminalSignalSent = true;
108
+ appendAgentEventLog(options.eventLogPath, {
109
+ type: "terminal-status",
110
+ status: lastVisibleText.terminalStatus,
111
+ });
112
+ const terminalKind = classifyTerminalVisibleStatus(lastVisibleText.terminalStatus);
113
+ if (terminalKind === "done") {
114
+ completionSatisfied = true;
115
+ }
116
+ else if (terminalKind === "failure") {
117
+ failureStatus ||= lastVisibleText.terminalStatus;
118
+ }
119
+ requestProcessStop("SIGINT");
120
+ };
121
+ const timeout = typeof timeoutMs === "number" && timeoutMs > 0
122
+ ? setInterval(() => {
123
+ const now = Date.now();
124
+ const idleMs = now - lastActivityAt;
125
+ if (!hasAgentStalled(lastActivityAt, now, timeoutMs))
126
+ return;
127
+ timedOut = true;
128
+ appendAgentEventLog(options.eventLogPath, {
129
+ type: "stall-timeout",
130
+ timeout_ms: timeoutMs,
131
+ idle_ms: idleMs,
132
+ });
133
+ console.log(chalk.red(` ${agent.displayName} stalled for ${Math.round(idleMs / 1000)}s without agent output.`));
134
+ requestProcessStop("SIGINT");
135
+ }, 2000)
136
+ : null;
137
+ const completionPoll = options.completionCheck
138
+ ? setInterval(() => {
139
+ if (timedOut || completionSatisfied)
140
+ return;
141
+ try {
142
+ if (!options.completionCheck?.())
143
+ return;
144
+ completionSatisfied = true;
145
+ appendAgentEventLog(options.eventLogPath, {
146
+ type: "completion-check-satisfied",
147
+ });
148
+ requestProcessStop("SIGINT");
149
+ }
150
+ catch {
151
+ // Ignore completion check failures and let the agent continue.
152
+ }
153
+ }, 1000)
154
+ : null;
155
+ process.once("SIGINT", forwardSignal);
156
+ proc.stdout?.on("data", (chunk) => {
157
+ sawRawOutput = true;
158
+ lastActivityAt = Date.now();
159
+ buffer += chunk.toString();
160
+ const lines = buffer.split("\n");
161
+ buffer = lines.pop() ?? "";
162
+ for (const line of lines) {
163
+ if (!line.trim())
164
+ continue;
165
+ appendAgentEventLog(options.eventLogPath, {
166
+ type: "stdout",
167
+ line,
168
+ });
169
+ try {
170
+ const event = JSON.parse(line);
171
+ const toolActivity = summarizeAgentToolActivity(event);
172
+ if (toolActivity) {
173
+ lastToolActivity = toolActivity;
174
+ }
175
+ failureStatus ||= extractAgentFailureStatus(event);
176
+ if (displayAgentEvent(event, options.statusLogPath, lastVisibleText)) {
177
+ sawVisibleEvent = true;
178
+ lastVisibleOutputAt = Date.now();
179
+ }
180
+ maybeInterruptAfterTerminalStatus();
181
+ }
182
+ catch {
183
+ if (emitVisibleAgentText(line, options.statusLogPath, lastVisibleText)) {
184
+ sawVisibleEvent = true;
185
+ lastVisibleOutputAt = Date.now();
186
+ }
187
+ maybeInterruptAfterTerminalStatus();
188
+ }
189
+ }
190
+ });
191
+ proc.stderr?.on("data", (chunk) => {
192
+ lastActivityAt = Date.now();
193
+ stderrBuffer += chunk.toString();
194
+ const lines = stderrBuffer.split("\n");
195
+ stderrBuffer = lines.pop() ?? "";
196
+ for (const line of lines) {
197
+ if (!line.trim())
198
+ continue;
199
+ appendAgentEventLog(options.eventLogPath, {
200
+ type: "stderr",
201
+ line,
202
+ });
203
+ if (CODEX_NOISE_PATTERNS.some((pattern) => pattern.test(line)))
204
+ continue;
205
+ sawRawOutput = true;
206
+ lastVisibleOutputAt = Date.now();
207
+ process.stderr.write(`${line}\n`);
208
+ sawVisibleEvent = true;
209
+ }
210
+ });
211
+ proc.on("close", (code) => {
212
+ clearInterval(heartbeat);
213
+ if (timeout)
214
+ clearInterval(timeout);
215
+ if (completionPoll)
216
+ clearInterval(completionPoll);
217
+ clearStopTimer();
218
+ process.removeListener("SIGINT", forwardSignal);
219
+ const finalCode = timedOut ? 124 : failureStatus ? 1 : completionSatisfied ? 0 : (code ?? 0);
220
+ appendAgentEventLog(options.eventLogPath, {
221
+ type: "close",
222
+ code: finalCode,
223
+ failure_status: failureStatus,
224
+ });
225
+ resolve(finalCode);
226
+ });
227
+ proc.on("error", () => {
228
+ clearInterval(heartbeat);
229
+ if (timeout)
230
+ clearInterval(timeout);
231
+ if (completionPoll)
232
+ clearInterval(completionPoll);
233
+ clearStopTimer();
234
+ process.removeListener("SIGINT", forwardSignal);
235
+ appendAgentEventLog(options.eventLogPath, {
236
+ type: "error",
237
+ message: `Failed to start ${agent.displayName}`,
238
+ });
239
+ console.log(chalk.red(` Failed to start ${agent.displayName}.`));
240
+ resolve(1);
241
+ });
242
+ });
243
+ }
@@ -0,0 +1,32 @@
1
+ import type { RuntimeExecutorInfo } from "../../../lib/schema.js";
2
+ import type { Agent } from "./types.js";
3
+ export type WorkflowExecutorKind = "local-agent" | "connected-provider" | "managed";
4
+ export interface WorkflowExecutionProfile {
5
+ model?: string | null;
6
+ effort?: string | null;
7
+ profile?: string | null;
8
+ timeoutMs?: number | null;
9
+ }
10
+ export interface WorkflowExecuteOptions {
11
+ eventLogPath?: string | null;
12
+ statusLogPath?: string | null;
13
+ completionCheck?: (() => boolean) | null;
14
+ }
15
+ export interface WorkflowExecutor {
16
+ kind: WorkflowExecutorKind;
17
+ name: string;
18
+ displayName: string;
19
+ command?: string | null;
20
+ executionProfile?: WorkflowExecutionProfile;
21
+ execute(rootPath: string, prompt: string, options?: WorkflowExecuteOptions): Promise<number>;
22
+ }
23
+ export type { RuntimeExecutorInfo } from "../../../lib/schema.js";
24
+ export declare function buildRuntimeExecutorInfo(executor: WorkflowExecutor): RuntimeExecutorInfo;
25
+ export declare function createLocalAgentExecutor(agent: Agent, executionProfile?: WorkflowExecutionProfile): WorkflowExecutor;
26
+ export declare function resolveLocalExecutor(options?: {
27
+ preflight?: boolean;
28
+ executionProfile?: WorkflowExecutionProfile;
29
+ }): {
30
+ executor: WorkflowExecutor | null;
31
+ error?: string;
32
+ };
@@ -0,0 +1,45 @@
1
+ import { resolveAgent } from "./detection.js";
2
+ import { spawnAgent } from "./execution.js";
3
+ import { ensureAgentAutomatedRunReady } from "./preflight.js";
4
+ export function buildRuntimeExecutorInfo(executor) {
5
+ return {
6
+ kind: executor.kind,
7
+ name: executor.name,
8
+ display_name: executor.displayName,
9
+ command: executor.command ?? null,
10
+ model: executor.executionProfile?.model ?? null,
11
+ effort: executor.executionProfile?.effort ?? null,
12
+ profile: executor.executionProfile?.profile ?? null,
13
+ timeout_ms: executor.executionProfile?.timeoutMs ?? null,
14
+ };
15
+ }
16
+ export function createLocalAgentExecutor(agent, executionProfile = {}) {
17
+ return {
18
+ kind: "local-agent",
19
+ name: agent.name,
20
+ displayName: agent.displayName,
21
+ command: agent.command,
22
+ executionProfile,
23
+ execute(rootPath, prompt, options) {
24
+ return spawnAgent(agent, rootPath, prompt, {
25
+ eventLogPath: options?.eventLogPath,
26
+ statusLogPath: options?.statusLogPath,
27
+ executionProfile,
28
+ completionCheck: options?.completionCheck,
29
+ });
30
+ },
31
+ };
32
+ }
33
+ export function resolveLocalExecutor(options = {}) {
34
+ const { agent, error } = resolveAgent();
35
+ if (!agent) {
36
+ return { executor: null, error };
37
+ }
38
+ if (options.preflight !== false) {
39
+ const readiness = ensureAgentAutomatedRunReady(agent);
40
+ if (!readiness.ok) {
41
+ return { executor: null, error: readiness.error };
42
+ }
43
+ }
44
+ return { executor: createLocalAgentExecutor(agent, options.executionProfile) };
45
+ }
@@ -0,0 +1,2 @@
1
+ export declare function appendAgentEventLog(eventLogPath: string | null | undefined, event: Record<string, unknown>): void;
2
+ export declare function appendAgentStatusLog(statusLogPath: string | null | undefined, text: string): void;
@@ -0,0 +1,17 @@
1
+ import { appendFileSync, mkdirSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ export function appendAgentEventLog(eventLogPath, event) {
4
+ if (!eventLogPath)
5
+ return;
6
+ mkdirSync(dirname(eventLogPath), { recursive: true });
7
+ appendFileSync(eventLogPath, `${JSON.stringify({
8
+ timestamp: new Date().toISOString(),
9
+ ...event,
10
+ })}\n`);
11
+ }
12
+ export function appendAgentStatusLog(statusLogPath, text) {
13
+ if (!statusLogPath)
14
+ return;
15
+ mkdirSync(dirname(statusLogPath), { recursive: true });
16
+ appendFileSync(statusLogPath, `${new Date().toISOString()} ${text}\n`);
17
+ }
@@ -0,0 +1,7 @@
1
+ import type { Agent, AgentAutomationReadiness, AgentPreflightOptions, AgentPreflightResult } from "./types.js";
2
+ export declare function buildAgentPreflightPrompt(): string;
3
+ export declare function runAgentPreflight(agent: Agent, options?: AgentPreflightOptions): AgentPreflightResult;
4
+ export declare function ensureAgentAutomatedRunReady(agent: Agent, options?: {
5
+ force?: boolean;
6
+ runPreflight?: typeof runAgentPreflight;
7
+ }): AgentAutomationReadiness;
@@ -0,0 +1,77 @@
1
+ import { mkdtempSync, rmSync } from "node:fs";
2
+ import { spawnSync } from "node:child_process";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { CODEX_NOISE_PATTERNS } from "./constants.js";
6
+ import { buildAgentArgs, buildAgentEnv } from "./args.js";
7
+ const successfulPreflightAgents = new Set();
8
+ export function buildAgentPreflightPrompt() {
9
+ return [
10
+ "Interf doctor preflight.",
11
+ 'Reply with exactly one line: "DONE: Interf doctor ok".',
12
+ "Do not use tools.",
13
+ "Do not read files.",
14
+ "Do not write files.",
15
+ ].join(" ");
16
+ }
17
+ export function runAgentPreflight(agent, options = {}) {
18
+ const timeoutMs = options.timeoutMs ?? 60000;
19
+ const spawnSyncImpl = options.spawnSyncImpl ?? spawnSync;
20
+ const dirPath = mkdtempSync(join(tmpdir(), "interf-doctor-"));
21
+ try {
22
+ const result = spawnSyncImpl(agent.command, buildAgentArgs(agent, buildAgentPreflightPrompt()), {
23
+ cwd: dirPath,
24
+ encoding: "utf8",
25
+ env: buildAgentEnv(agent),
26
+ timeout: timeoutMs,
27
+ });
28
+ const stdout = typeof result.stdout === "string" ? result.stdout.trim() : "";
29
+ const stderr = sanitizeAgentStderr(typeof result.stderr === "string" ? result.stderr : "");
30
+ const timedOut = result.error?.name === "Error" && result.error.message.includes("timed out");
31
+ if (result.error) {
32
+ return {
33
+ ok: false,
34
+ code: typeof result.status === "number" ? result.status : null,
35
+ timedOut,
36
+ stdout,
37
+ stderr,
38
+ error: result.error.message,
39
+ };
40
+ }
41
+ return {
42
+ ok: result.status === 0,
43
+ code: typeof result.status === "number" ? result.status : null,
44
+ timedOut: false,
45
+ stdout,
46
+ stderr,
47
+ error: result.status === 0 ? null : `Exited with code ${result.status ?? "unknown"}`,
48
+ };
49
+ }
50
+ finally {
51
+ rmSync(dirPath, { recursive: true, force: true });
52
+ }
53
+ }
54
+ export function ensureAgentAutomatedRunReady(agent, options = {}) {
55
+ if (!options.force && successfulPreflightAgents.has(agent.name)) {
56
+ return { ok: true };
57
+ }
58
+ const runPreflight = options.runPreflight ?? runAgentPreflight;
59
+ const result = runPreflight(agent);
60
+ if (!result.ok) {
61
+ const details = [result.error, result.stderr].filter(Boolean).join(" ");
62
+ return {
63
+ ok: false,
64
+ error: `${agent.displayName} failed Interf executor preflight. Run \`interf doctor --live\` for details.${details ? ` ${details}` : ""}`,
65
+ };
66
+ }
67
+ successfulPreflightAgents.add(agent.name);
68
+ return { ok: true };
69
+ }
70
+ function sanitizeAgentStderr(stderr) {
71
+ return stderr
72
+ .split("\n")
73
+ .filter((line) => line.trim().length > 0)
74
+ .filter((line) => !CODEX_NOISE_PATTERNS.some((pattern) => pattern.test(line)))
75
+ .join("\n")
76
+ .trim();
77
+ }
@@ -0,0 +1,8 @@
1
+ export interface VisibleTextState {
2
+ current: string | null;
3
+ terminated?: boolean;
4
+ terminalStatus?: string | null;
5
+ }
6
+ export declare function emitVisibleAgentText(text: string, statusLogPath: string | null | undefined, lastVisibleText?: VisibleTextState): boolean;
7
+ export declare function displayAgentEvent(event: Record<string, unknown>, statusLogPath: string | null | undefined, lastVisibleText: VisibleTextState): boolean;
8
+ export declare function summarizeAgentToolActivity(event: Record<string, unknown>): string | null;
@@ -0,0 +1,218 @@
1
+ import { basename } from "node:path";
2
+ import chalk from "chalk";
3
+ import { SHOW_AGENT_TOOL_EVENTS, VISIBLE_STATUS_PREFIXES, } from "./constants.js";
4
+ import { appendAgentStatusLog } from "./logs.js";
5
+ export function emitVisibleAgentText(text, statusLogPath, lastVisibleText) {
6
+ if (lastVisibleText?.terminated) {
7
+ return false;
8
+ }
9
+ let displayed = false;
10
+ const lines = text
11
+ .split(/\r?\n/)
12
+ .map((line) => line.trim())
13
+ .filter((line) => shouldDisplayAgentText(line));
14
+ for (const line of lines) {
15
+ if (lastVisibleText && lastVisibleText.current === line) {
16
+ continue;
17
+ }
18
+ console.log(chalk.dim(` ${line}`));
19
+ appendAgentStatusLog(statusLogPath, line);
20
+ if (lastVisibleText) {
21
+ lastVisibleText.current = line;
22
+ if (isTerminalVisibleStatus(line)) {
23
+ lastVisibleText.terminated = true;
24
+ lastVisibleText.terminalStatus = line;
25
+ }
26
+ }
27
+ displayed = true;
28
+ }
29
+ return displayed;
30
+ }
31
+ export function displayAgentEvent(event, statusLogPath, lastVisibleText) {
32
+ const type = event.type;
33
+ let displayed = false;
34
+ if (type === "tool_use" && SHOW_AGENT_TOOL_EVENTS) {
35
+ const name = event.name ?? "unknown";
36
+ const input = event.input;
37
+ let detail = "";
38
+ if (input) {
39
+ const path = (input.file_path ?? input.path ?? input.pattern ?? input.command ?? "");
40
+ if (path)
41
+ detail = chalk.dim(` ${path.slice(0, 80)}`);
42
+ }
43
+ console.log(chalk.blue(` → ${name}`) + detail);
44
+ displayed = true;
45
+ }
46
+ if (type === "assistant") {
47
+ const msg = event.message;
48
+ const content = msg?.content;
49
+ if (Array.isArray(content)) {
50
+ for (const block of content) {
51
+ if (block.type === "text" && block.text) {
52
+ const text = block.text.trim();
53
+ displayed = emitVisibleAgentText(text, statusLogPath, lastVisibleText) || displayed;
54
+ }
55
+ if (block.type === "tool_use" && SHOW_AGENT_TOOL_EVENTS) {
56
+ const name = block.name;
57
+ const input = block.input;
58
+ let detail = "";
59
+ if (input) {
60
+ const path = (input.file_path ?? input.path ?? input.pattern ?? input.command ?? "");
61
+ if (path)
62
+ detail = chalk.dim(` ${path.slice(0, 80)}`);
63
+ }
64
+ console.log(chalk.blue(` → ${name}`) + detail);
65
+ displayed = true;
66
+ }
67
+ }
68
+ }
69
+ }
70
+ if (type === "item.started" || type === "item.completed") {
71
+ const item = event.item;
72
+ if (item) {
73
+ displayed = displayItemEvent(type, item, statusLogPath, lastVisibleText) || displayed;
74
+ }
75
+ }
76
+ if (type === "result") {
77
+ const result = event.result;
78
+ const subtype = event.subtype;
79
+ if (result && subtype !== "tool_result") {
80
+ const lines = result.split("\n");
81
+ for (const line of lines) {
82
+ displayed = emitVisibleAgentText(line, statusLogPath, lastVisibleText) || displayed;
83
+ }
84
+ }
85
+ }
86
+ const message = pickString(event.message) ??
87
+ pickString(event.text) ??
88
+ pickString(event.content) ??
89
+ pickString(event.output) ??
90
+ pickString(event.summary);
91
+ if (message && type !== "assistant" && type !== "result") {
92
+ const text = message.trim();
93
+ displayed = emitVisibleAgentText(text, statusLogPath, lastVisibleText) || displayed;
94
+ }
95
+ return displayed;
96
+ }
97
+ export function summarizeAgentToolActivity(event) {
98
+ const type = event.type;
99
+ if (type === "assistant") {
100
+ const message = event.message;
101
+ const content = message?.content;
102
+ if (Array.isArray(content)) {
103
+ for (const block of content) {
104
+ if (block.type === "tool_use") {
105
+ return summarizeToolUse(block.name, block.input);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ if (type === "item.started" || type === "item.completed") {
111
+ const item = event.item;
112
+ if (item?.type === "tool_use") {
113
+ return summarizeToolUse(item.name, item.input);
114
+ }
115
+ }
116
+ return null;
117
+ }
118
+ function pickString(value) {
119
+ if (typeof value === "string")
120
+ return value;
121
+ if (!Array.isArray(value))
122
+ return null;
123
+ for (const entry of value) {
124
+ if (typeof entry === "string")
125
+ return entry;
126
+ if (entry && typeof entry === "object" && "text" in entry && typeof entry.text === "string") {
127
+ return entry.text;
128
+ }
129
+ }
130
+ return null;
131
+ }
132
+ function displayItemEvent(type, item, statusLogPath, lastVisibleText) {
133
+ const itemType = item.type;
134
+ if (itemType === "agent_message") {
135
+ const text = item.text?.trim();
136
+ return text ? emitVisibleAgentText(text, statusLogPath, lastVisibleText) : false;
137
+ }
138
+ if (itemType === "command_execution" && type === "item.completed") {
139
+ const output = item.aggregated_output?.trim();
140
+ if (output) {
141
+ return emitVisibleAgentText(output, statusLogPath, lastVisibleText);
142
+ }
143
+ }
144
+ if (!SHOW_AGENT_TOOL_EVENTS) {
145
+ return false;
146
+ }
147
+ const title = pickString(item.title) ?? pickString(item.name);
148
+ const input = item.input;
149
+ const detail = input ? describeInput(input) : "";
150
+ if (type === "item.started" && title) {
151
+ console.log(chalk.blue(` → ${title}`) + detail);
152
+ return true;
153
+ }
154
+ if (type === "item.completed" && title) {
155
+ console.log(chalk.blue(` → ${title}`) + detail);
156
+ return true;
157
+ }
158
+ return false;
159
+ }
160
+ function describeInput(input) {
161
+ const path = (input.file_path ?? input.path ?? input.pattern ?? input.command ?? "");
162
+ return path ? chalk.dim(` ${path.slice(0, 80)}`) : "";
163
+ }
164
+ function summarizeToolUse(name, input) {
165
+ if (!name)
166
+ return null;
167
+ const target = summarizeToolTarget(input);
168
+ switch (name) {
169
+ case "Read":
170
+ return target ? `reading ${target}` : "reading compiled files";
171
+ case "Write":
172
+ return target ? `writing ${target}` : "writing compiled files";
173
+ case "Edit":
174
+ return target ? `editing ${target}` : "editing compiled files";
175
+ case "Glob":
176
+ case "Grep":
177
+ return target ? `${name.toLowerCase()} on ${target}` : `${name.toLowerCase()}ing compiled files`;
178
+ case "Bash":
179
+ return target ? `running ${target}` : "running a local helper";
180
+ default:
181
+ return target ? `${name} on ${target}` : name;
182
+ }
183
+ }
184
+ function summarizeToolTarget(input) {
185
+ if (!input)
186
+ return null;
187
+ const raw = (input.file_path ?? input.path ?? input.pattern ?? input.command ?? input.notebook_path);
188
+ if (!raw || raw.length === 0)
189
+ return null;
190
+ if (raw.includes("\n")) {
191
+ const commandName = summarizeMultilineCommand(raw);
192
+ return commandName ? `${commandName} helper` : "a multi-line local helper";
193
+ }
194
+ return basename(raw);
195
+ }
196
+ function summarizeMultilineCommand(command) {
197
+ const lines = command
198
+ .split("\n")
199
+ .map((line) => line.trim())
200
+ .filter((line) => line.length > 0 && !line.startsWith("#"));
201
+ for (const line of lines) {
202
+ const token = line.split(/\s+/)[0];
203
+ if (!token)
204
+ continue;
205
+ if (token.includes("="))
206
+ continue;
207
+ return basename(token);
208
+ }
209
+ return null;
210
+ }
211
+ function shouldDisplayAgentText(text) {
212
+ if (text.length === 0 || text.length >= 300)
213
+ return false;
214
+ return VISIBLE_STATUS_PREFIXES.some((prefix) => text.startsWith(prefix));
215
+ }
216
+ function isTerminalVisibleStatus(text) {
217
+ return text.startsWith("DONE:") || text.startsWith("BLOCKED:") || text.startsWith("ERROR:");
218
+ }
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ export declare const InterfUserConfigSchema: z.ZodObject<{
3
+ agent: z.ZodString;
4
+ agentCommand: z.ZodString;
5
+ skillsInstalled: z.ZodBoolean;
6
+ initialized: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export type InterfUserConfig = z.infer<typeof InterfUserConfigSchema>;
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+ export const InterfUserConfigSchema = z.object({
3
+ agent: z.string(),
4
+ agentCommand: z.string(),
5
+ skillsInstalled: z.boolean(),
6
+ initialized: z.string(),
7
+ });