@isaacriehm/cairn 0.1.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 (562) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/backprop/id.d.ts +14 -0
  5. package/dist/backprop/id.js +40 -0
  6. package/dist/backprop/id.js.map +1 -0
  7. package/dist/backprop/index.d.ts +23 -0
  8. package/dist/backprop/index.js +21 -0
  9. package/dist/backprop/index.js.map +1 -0
  10. package/dist/backprop/prompt.d.ts +16 -0
  11. package/dist/backprop/prompt.js +101 -0
  12. package/dist/backprop/prompt.js.map +1 -0
  13. package/dist/backprop/runner.d.ts +18 -0
  14. package/dist/backprop/runner.js +95 -0
  15. package/dist/backprop/runner.js.map +1 -0
  16. package/dist/backprop/schema.d.ts +61 -0
  17. package/dist/backprop/schema.js +55 -0
  18. package/dist/backprop/schema.js.map +1 -0
  19. package/dist/backprop/types.d.ts +101 -0
  20. package/dist/backprop/types.js +24 -0
  21. package/dist/backprop/types.js.map +1 -0
  22. package/dist/backprop/writer.d.ts +27 -0
  23. package/dist/backprop/writer.js +301 -0
  24. package/dist/backprop/writer.js.map +1 -0
  25. package/dist/claude/error.d.ts +33 -0
  26. package/dist/claude/error.js +58 -0
  27. package/dist/claude/error.js.map +1 -0
  28. package/dist/claude/index.d.ts +3 -0
  29. package/dist/claude/index.js +3 -0
  30. package/dist/claude/index.js.map +1 -0
  31. package/dist/claude/runner.d.ts +11 -0
  32. package/dist/claude/runner.js +132 -0
  33. package/dist/claude/runner.js.map +1 -0
  34. package/dist/claude/types.d.ts +52 -0
  35. package/dist/claude/types.js +14 -0
  36. package/dist/claude/types.js.map +1 -0
  37. package/dist/cli/attention.d.ts +11 -0
  38. package/dist/cli/attention.js +234 -0
  39. package/dist/cli/attention.js.map +1 -0
  40. package/dist/cli/daemon.d.ts +54 -0
  41. package/dist/cli/daemon.js +351 -0
  42. package/dist/cli/daemon.js.map +1 -0
  43. package/dist/cli/doctor.d.ts +8 -0
  44. package/dist/cli/doctor.js +116 -0
  45. package/dist/cli/doctor.js.map +1 -0
  46. package/dist/cli/gc.d.ts +15 -0
  47. package/dist/cli/gc.js +139 -0
  48. package/dist/cli/gc.js.map +1 -0
  49. package/dist/cli/hook.d.ts +18 -0
  50. package/dist/cli/hook.js +57 -0
  51. package/dist/cli/hook.js.map +1 -0
  52. package/dist/cli/index.d.ts +2 -0
  53. package/dist/cli/index.js +127 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/cli/init.d.ts +1 -0
  56. package/dist/cli/init.js +77 -0
  57. package/dist/cli/init.js.map +1 -0
  58. package/dist/cli/install.d.ts +52 -0
  59. package/dist/cli/install.js +308 -0
  60. package/dist/cli/install.js.map +1 -0
  61. package/dist/cli/join.d.ts +1 -0
  62. package/dist/cli/join.js +84 -0
  63. package/dist/cli/join.js.map +1 -0
  64. package/dist/cli/mcp.d.ts +1 -0
  65. package/dist/cli/mcp.js +62 -0
  66. package/dist/cli/mcp.js.map +1 -0
  67. package/dist/cli/mirror.d.ts +1 -0
  68. package/dist/cli/mirror.js +97 -0
  69. package/dist/cli/mirror.js.map +1 -0
  70. package/dist/cli/run.d.ts +1 -0
  71. package/dist/cli/run.js +174 -0
  72. package/dist/cli/run.js.map +1 -0
  73. package/dist/cli/scope.d.ts +8 -0
  74. package/dist/cli/scope.js +65 -0
  75. package/dist/cli/scope.js.map +1 -0
  76. package/dist/cli/task.d.ts +18 -0
  77. package/dist/cli/task.js +137 -0
  78. package/dist/cli/task.js.map +1 -0
  79. package/dist/cli/watch.d.ts +1 -0
  80. package/dist/cli/watch.js +73 -0
  81. package/dist/cli/watch.js.map +1 -0
  82. package/dist/decision-capture/capture.d.ts +57 -0
  83. package/dist/decision-capture/capture.js +186 -0
  84. package/dist/decision-capture/capture.js.map +1 -0
  85. package/dist/decision-capture/extractor.d.ts +20 -0
  86. package/dist/decision-capture/extractor.js +103 -0
  87. package/dist/decision-capture/extractor.js.map +1 -0
  88. package/dist/decision-capture/id.d.ts +14 -0
  89. package/dist/decision-capture/id.js +44 -0
  90. package/dist/decision-capture/id.js.map +1 -0
  91. package/dist/decision-capture/index.d.ts +25 -0
  92. package/dist/decision-capture/index.js +21 -0
  93. package/dist/decision-capture/index.js.map +1 -0
  94. package/dist/decision-capture/prompt.d.ts +15 -0
  95. package/dist/decision-capture/prompt.js +68 -0
  96. package/dist/decision-capture/prompt.js.map +1 -0
  97. package/dist/decision-capture/refinement-prompt.d.ts +25 -0
  98. package/dist/decision-capture/refinement-prompt.js +146 -0
  99. package/dist/decision-capture/refinement-prompt.js.map +1 -0
  100. package/dist/decision-capture/refinement-schema.d.ts +52 -0
  101. package/dist/decision-capture/refinement-schema.js +61 -0
  102. package/dist/decision-capture/refinement-schema.js.map +1 -0
  103. package/dist/decision-capture/refinement.d.ts +60 -0
  104. package/dist/decision-capture/refinement.js +439 -0
  105. package/dist/decision-capture/refinement.js.map +1 -0
  106. package/dist/decision-capture/schema.d.ts +70 -0
  107. package/dist/decision-capture/schema.js +71 -0
  108. package/dist/decision-capture/schema.js.map +1 -0
  109. package/dist/decision-capture/types.d.ts +201 -0
  110. package/dist/decision-capture/types.js +20 -0
  111. package/dist/decision-capture/types.js.map +1 -0
  112. package/dist/decision-capture/writer.d.ts +90 -0
  113. package/dist/decision-capture/writer.js +267 -0
  114. package/dist/decision-capture/writer.js.map +1 -0
  115. package/dist/frontend/discord/acl.d.ts +6 -0
  116. package/dist/frontend/discord/acl.js +19 -0
  117. package/dist/frontend/discord/acl.js.map +1 -0
  118. package/dist/frontend/discord/channels.d.ts +29 -0
  119. package/dist/frontend/discord/channels.js +58 -0
  120. package/dist/frontend/discord/channels.js.map +1 -0
  121. package/dist/frontend/discord/classifier.d.ts +16 -0
  122. package/dist/frontend/discord/classifier.js +29 -0
  123. package/dist/frontend/discord/classifier.js.map +1 -0
  124. package/dist/frontend/discord/index.d.ts +118 -0
  125. package/dist/frontend/discord/index.js +1104 -0
  126. package/dist/frontend/discord/index.js.map +1 -0
  127. package/dist/frontend/discord/slash.d.ts +18 -0
  128. package/dist/frontend/discord/slash.js +90 -0
  129. package/dist/frontend/discord/slash.js.map +1 -0
  130. package/dist/frontend/inbox.d.ts +17 -0
  131. package/dist/frontend/inbox.js +30 -0
  132. package/dist/frontend/inbox.js.map +1 -0
  133. package/dist/frontend/index.d.ts +8 -0
  134. package/dist/frontend/index.js +6 -0
  135. package/dist/frontend/index.js.map +1 -0
  136. package/dist/frontend/stub/index.d.ts +58 -0
  137. package/dist/frontend/stub/index.js +144 -0
  138. package/dist/frontend/stub/index.js.map +1 -0
  139. package/dist/frontend/types.d.ts +247 -0
  140. package/dist/frontend/types.js +15 -0
  141. package/dist/frontend/types.js.map +1 -0
  142. package/dist/gc/apply.d.ts +26 -0
  143. package/dist/gc/apply.js +48 -0
  144. package/dist/gc/apply.js.map +1 -0
  145. package/dist/gc/canary.d.ts +42 -0
  146. package/dist/gc/canary.js +134 -0
  147. package/dist/gc/canary.js.map +1 -0
  148. package/dist/gc/classify.d.ts +25 -0
  149. package/dist/gc/classify.js +89 -0
  150. package/dist/gc/classify.js.map +1 -0
  151. package/dist/gc/doc-gardening.d.ts +29 -0
  152. package/dist/gc/doc-gardening.js +146 -0
  153. package/dist/gc/doc-gardening.js.map +1 -0
  154. package/dist/gc/frontmatter.d.ts +35 -0
  155. package/dist/gc/frontmatter.js +111 -0
  156. package/dist/gc/frontmatter.js.map +1 -0
  157. package/dist/gc/generator-drift.d.ts +28 -0
  158. package/dist/gc/generator-drift.js +53 -0
  159. package/dist/gc/generator-drift.js.map +1 -0
  160. package/dist/gc/index.d.ts +35 -0
  161. package/dist/gc/index.js +26 -0
  162. package/dist/gc/index.js.map +1 -0
  163. package/dist/gc/quality-update.d.ts +23 -0
  164. package/dist/gc/quality-update.js +69 -0
  165. package/dist/gc/quality-update.js.map +1 -0
  166. package/dist/gc/stub-hits.d.ts +31 -0
  167. package/dist/gc/stub-hits.js +125 -0
  168. package/dist/gc/stub-hits.js.map +1 -0
  169. package/dist/gc/sweep.d.ts +56 -0
  170. package/dist/gc/sweep.js +178 -0
  171. package/dist/gc/sweep.js.map +1 -0
  172. package/dist/gc/types.d.ts +129 -0
  173. package/dist/gc/types.js +26 -0
  174. package/dist/gc/types.js.map +1 -0
  175. package/dist/ground/drift.d.ts +8 -0
  176. package/dist/ground/drift.js +23 -0
  177. package/dist/ground/drift.js.map +1 -0
  178. package/dist/ground/frontmatter.d.ts +20 -0
  179. package/dist/ground/frontmatter.js +49 -0
  180. package/dist/ground/frontmatter.js.map +1 -0
  181. package/dist/ground/glob.d.ts +10 -0
  182. package/dist/ground/glob.js +46 -0
  183. package/dist/ground/glob.js.map +1 -0
  184. package/dist/ground/index.d.ts +14 -0
  185. package/dist/ground/index.js +10 -0
  186. package/dist/ground/index.js.map +1 -0
  187. package/dist/ground/ledgers.d.ts +18 -0
  188. package/dist/ground/ledgers.js +103 -0
  189. package/dist/ground/ledgers.js.map +1 -0
  190. package/dist/ground/manifest.d.ts +10 -0
  191. package/dist/ground/manifest.js +88 -0
  192. package/dist/ground/manifest.js.map +1 -0
  193. package/dist/ground/paths.d.ts +20 -0
  194. package/dist/ground/paths.js +61 -0
  195. package/dist/ground/paths.js.map +1 -0
  196. package/dist/ground/quality-grades.d.ts +11 -0
  197. package/dist/ground/quality-grades.js +98 -0
  198. package/dist/ground/quality-grades.js.map +1 -0
  199. package/dist/ground/schemas.d.ts +306 -0
  200. package/dist/ground/schemas.js +188 -0
  201. package/dist/ground/schemas.js.map +1 -0
  202. package/dist/ground/walk.d.ts +7 -0
  203. package/dist/ground/walk.js +53 -0
  204. package/dist/ground/walk.js.map +1 -0
  205. package/dist/index.d.ts +8 -0
  206. package/dist/index.js +9 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/init/detect.d.ts +25 -0
  209. package/dist/init/detect.js +336 -0
  210. package/dist/init/detect.js.map +1 -0
  211. package/dist/init/index.d.ts +14 -0
  212. package/dist/init/index.js +9 -0
  213. package/dist/init/index.js.map +1 -0
  214. package/dist/init/init.d.ts +68 -0
  215. package/dist/init/init.js +673 -0
  216. package/dist/init/init.js.map +1 -0
  217. package/dist/init/mapper.d.ts +160 -0
  218. package/dist/init/mapper.js +248 -0
  219. package/dist/init/mapper.js.map +1 -0
  220. package/dist/init/prompts.d.ts +70 -0
  221. package/dist/init/prompts.js +80 -0
  222. package/dist/init/prompts.js.map +1 -0
  223. package/dist/init/secrets.d.ts +18 -0
  224. package/dist/init/secrets.js +76 -0
  225. package/dist/init/secrets.js.map +1 -0
  226. package/dist/init/seed.d.ts +21 -0
  227. package/dist/init/seed.js +75 -0
  228. package/dist/init/seed.js.map +1 -0
  229. package/dist/init/setup-runners.d.ts +17 -0
  230. package/dist/init/setup-runners.js +70 -0
  231. package/dist/init/setup-runners.js.map +1 -0
  232. package/dist/init/types.d.ts +59 -0
  233. package/dist/init/types.js +10 -0
  234. package/dist/init/types.js.map +1 -0
  235. package/dist/init/walker.d.ts +53 -0
  236. package/dist/init/walker.js +460 -0
  237. package/dist/init/walker.js.map +1 -0
  238. package/dist/init/workflow-block.d.ts +34 -0
  239. package/dist/init/workflow-block.js +110 -0
  240. package/dist/init/workflow-block.js.map +1 -0
  241. package/dist/logger.d.ts +3 -0
  242. package/dist/logger.js +23 -0
  243. package/dist/logger.js.map +1 -0
  244. package/dist/mcp/context.d.ts +16 -0
  245. package/dist/mcp/context.js +8 -0
  246. package/dist/mcp/context.js.map +1 -0
  247. package/dist/mcp/errors.d.ts +17 -0
  248. package/dist/mcp/errors.js +23 -0
  249. package/dist/mcp/errors.js.map +1 -0
  250. package/dist/mcp/index.d.ts +10 -0
  251. package/dist/mcp/index.js +7 -0
  252. package/dist/mcp/index.js.map +1 -0
  253. package/dist/mcp/path-allowlist.d.ts +25 -0
  254. package/dist/mcp/path-allowlist.js +66 -0
  255. package/dist/mcp/path-allowlist.js.map +1 -0
  256. package/dist/mcp/result.d.ts +8 -0
  257. package/dist/mcp/result.js +18 -0
  258. package/dist/mcp/result.js.map +1 -0
  259. package/dist/mcp/schemas.d.ts +153 -0
  260. package/dist/mcp/schemas.js +135 -0
  261. package/dist/mcp/schemas.js.map +1 -0
  262. package/dist/mcp/server.d.ts +11 -0
  263. package/dist/mcp/server.js +58 -0
  264. package/dist/mcp/server.js.map +1 -0
  265. package/dist/mcp/telemetry.d.ts +15 -0
  266. package/dist/mcp/telemetry.js +13 -0
  267. package/dist/mcp/telemetry.js.map +1 -0
  268. package/dist/mcp/tools/append.d.ts +8 -0
  269. package/dist/mcp/tools/append.js +33 -0
  270. package/dist/mcp/tools/append.js.map +1 -0
  271. package/dist/mcp/tools/archive.d.ts +8 -0
  272. package/dist/mcp/tools/archive.js +49 -0
  273. package/dist/mcp/tools/archive.js.map +1 -0
  274. package/dist/mcp/tools/ask-operator.d.ts +34 -0
  275. package/dist/mcp/tools/ask-operator.js +93 -0
  276. package/dist/mcp/tools/ask-operator.js.map +1 -0
  277. package/dist/mcp/tools/canonical-for-topic.d.ts +6 -0
  278. package/dist/mcp/tools/canonical-for-topic.js +40 -0
  279. package/dist/mcp/tools/canonical-for-topic.js.map +1 -0
  280. package/dist/mcp/tools/decision-get.d.ts +6 -0
  281. package/dist/mcp/tools/decision-get.js +49 -0
  282. package/dist/mcp/tools/decision-get.js.map +1 -0
  283. package/dist/mcp/tools/decisions-for-symbol.d.ts +7 -0
  284. package/dist/mcp/tools/decisions-for-symbol.js +42 -0
  285. package/dist/mcp/tools/decisions-for-symbol.js.map +1 -0
  286. package/dist/mcp/tools/decisions-in-scope.d.ts +7 -0
  287. package/dist/mcp/tools/decisions-in-scope.js +47 -0
  288. package/dist/mcp/tools/decisions-in-scope.js.map +1 -0
  289. package/dist/mcp/tools/drop-task.d.ts +12 -0
  290. package/dist/mcp/tools/drop-task.js +47 -0
  291. package/dist/mcp/tools/drop-task.js.map +1 -0
  292. package/dist/mcp/tools/get-full.d.ts +7 -0
  293. package/dist/mcp/tools/get-full.js +46 -0
  294. package/dist/mcp/tools/get-full.js.map +1 -0
  295. package/dist/mcp/tools/ground-get.d.ts +7 -0
  296. package/dist/mcp/tools/ground-get.js +80 -0
  297. package/dist/mcp/tools/ground-get.js.map +1 -0
  298. package/dist/mcp/tools/index.d.ts +3 -0
  299. package/dist/mcp/tools/index.js +44 -0
  300. package/dist/mcp/tools/index.js.map +1 -0
  301. package/dist/mcp/tools/invariant-get.d.ts +6 -0
  302. package/dist/mcp/tools/invariant-get.js +49 -0
  303. package/dist/mcp/tools/invariant-get.js.map +1 -0
  304. package/dist/mcp/tools/invariants-in-scope.d.ts +7 -0
  305. package/dist/mcp/tools/invariants-in-scope.js +65 -0
  306. package/dist/mcp/tools/invariants-in-scope.js.map +1 -0
  307. package/dist/mcp/tools/query-history.d.ts +9 -0
  308. package/dist/mcp/tools/query-history.js +33 -0
  309. package/dist/mcp/tools/query-history.js.map +1 -0
  310. package/dist/mcp/tools/record-decision.d.ts +14 -0
  311. package/dist/mcp/tools/record-decision.js +101 -0
  312. package/dist/mcp/tools/record-decision.js.map +1 -0
  313. package/dist/mcp/tools/record-run-event.d.ts +10 -0
  314. package/dist/mcp/tools/record-run-event.js +28 -0
  315. package/dist/mcp/tools/record-run-event.js.map +1 -0
  316. package/dist/mcp/tools/search.d.ts +9 -0
  317. package/dist/mcp/tools/search.js +165 -0
  318. package/dist/mcp/tools/search.js.map +1 -0
  319. package/dist/mcp/tools/supersedes-chain.d.ts +6 -0
  320. package/dist/mcp/tools/supersedes-chain.js +66 -0
  321. package/dist/mcp/tools/supersedes-chain.js.map +1 -0
  322. package/dist/mcp/tools/timeline.d.ts +9 -0
  323. package/dist/mcp/tools/timeline.js +65 -0
  324. package/dist/mcp/tools/timeline.js.map +1 -0
  325. package/dist/mcp/tools/types.d.ts +9 -0
  326. package/dist/mcp/tools/types.js +2 -0
  327. package/dist/mcp/tools/types.js.map +1 -0
  328. package/dist/mirror/clone.d.ts +6 -0
  329. package/dist/mirror/clone.js +48 -0
  330. package/dist/mirror/clone.js.map +1 -0
  331. package/dist/mirror/dirty-overlap.d.ts +13 -0
  332. package/dist/mirror/dirty-overlap.js +77 -0
  333. package/dist/mirror/dirty-overlap.js.map +1 -0
  334. package/dist/mirror/index.d.ts +7 -0
  335. package/dist/mirror/index.js +7 -0
  336. package/dist/mirror/index.js.map +1 -0
  337. package/dist/mirror/paths.d.ts +18 -0
  338. package/dist/mirror/paths.js +45 -0
  339. package/dist/mirror/paths.js.map +1 -0
  340. package/dist/mirror/push.d.ts +9 -0
  341. package/dist/mirror/push.js +27 -0
  342. package/dist/mirror/push.js.map +1 -0
  343. package/dist/mirror/state.d.ts +4 -0
  344. package/dist/mirror/state.js +36 -0
  345. package/dist/mirror/state.js.map +1 -0
  346. package/dist/mirror/sync.d.ts +9 -0
  347. package/dist/mirror/sync.js +33 -0
  348. package/dist/mirror/sync.js.map +1 -0
  349. package/dist/mirror/types.d.ts +77 -0
  350. package/dist/mirror/types.js +2 -0
  351. package/dist/mirror/types.js.map +1 -0
  352. package/dist/orchestrator/activity-summarizer.d.ts +33 -0
  353. package/dist/orchestrator/activity-summarizer.js +120 -0
  354. package/dist/orchestrator/activity-summarizer.js.map +1 -0
  355. package/dist/orchestrator/inbox.d.ts +78 -0
  356. package/dist/orchestrator/inbox.js +115 -0
  357. package/dist/orchestrator/inbox.js.map +1 -0
  358. package/dist/orchestrator/index.d.ts +9 -0
  359. package/dist/orchestrator/index.js +7 -0
  360. package/dist/orchestrator/index.js.map +1 -0
  361. package/dist/orchestrator/orchestrator.d.ts +154 -0
  362. package/dist/orchestrator/orchestrator.js +2437 -0
  363. package/dist/orchestrator/orchestrator.js.map +1 -0
  364. package/dist/orchestrator/prompt.d.ts +19 -0
  365. package/dist/orchestrator/prompt.js +50 -0
  366. package/dist/orchestrator/prompt.js.map +1 -0
  367. package/dist/orchestrator/queue.d.ts +21 -0
  368. package/dist/orchestrator/queue.js +80 -0
  369. package/dist/orchestrator/queue.js.map +1 -0
  370. package/dist/orchestrator/run-log.d.ts +53 -0
  371. package/dist/orchestrator/run-log.js +92 -0
  372. package/dist/orchestrator/run-log.js.map +1 -0
  373. package/dist/orchestrator/runner.d.ts +56 -0
  374. package/dist/orchestrator/runner.js +172 -0
  375. package/dist/orchestrator/runner.js.map +1 -0
  376. package/dist/orchestrator/tool-digest.d.ts +35 -0
  377. package/dist/orchestrator/tool-digest.js +116 -0
  378. package/dist/orchestrator/tool-digest.js.map +1 -0
  379. package/dist/orchestrator/types.d.ts +263 -0
  380. package/dist/orchestrator/types.js +2 -0
  381. package/dist/orchestrator/types.js.map +1 -0
  382. package/dist/orchestrator/workspace.d.ts +21 -0
  383. package/dist/orchestrator/workspace.js +31 -0
  384. package/dist/orchestrator/workspace.js.map +1 -0
  385. package/dist/profiles/index.d.ts +3 -0
  386. package/dist/profiles/index.js +3 -0
  387. package/dist/profiles/index.js.map +1 -0
  388. package/dist/profiles/registry.d.ts +5 -0
  389. package/dist/profiles/registry.js +31 -0
  390. package/dist/profiles/registry.js.map +1 -0
  391. package/dist/profiles/types.d.ts +48 -0
  392. package/dist/profiles/types.js +11 -0
  393. package/dist/profiles/types.js.map +1 -0
  394. package/dist/profiles/unknown.d.ts +9 -0
  395. package/dist/profiles/unknown.js +17 -0
  396. package/dist/profiles/unknown.js.map +1 -0
  397. package/dist/reviewer/index.d.ts +6 -0
  398. package/dist/reviewer/index.js +5 -0
  399. package/dist/reviewer/index.js.map +1 -0
  400. package/dist/reviewer/prompt.d.ts +11 -0
  401. package/dist/reviewer/prompt.js +132 -0
  402. package/dist/reviewer/prompt.js.map +1 -0
  403. package/dist/reviewer/remediation.d.ts +15 -0
  404. package/dist/reviewer/remediation.js +61 -0
  405. package/dist/reviewer/remediation.js.map +1 -0
  406. package/dist/reviewer/reviewer.d.ts +9 -0
  407. package/dist/reviewer/reviewer.js +89 -0
  408. package/dist/reviewer/reviewer.js.map +1 -0
  409. package/dist/reviewer/schema.d.ts +45 -0
  410. package/dist/reviewer/schema.js +43 -0
  411. package/dist/reviewer/schema.js.map +1 -0
  412. package/dist/reviewer/types.d.ts +74 -0
  413. package/dist/reviewer/types.js +14 -0
  414. package/dist/reviewer/types.js.map +1 -0
  415. package/dist/sensors/attestation.d.ts +44 -0
  416. package/dist/sensors/attestation.js +262 -0
  417. package/dist/sensors/attestation.js.map +1 -0
  418. package/dist/sensors/catalog.d.ts +41 -0
  419. package/dist/sensors/catalog.js +123 -0
  420. package/dist/sensors/catalog.js.map +1 -0
  421. package/dist/sensors/decisions.d.ts +30 -0
  422. package/dist/sensors/decisions.js +393 -0
  423. package/dist/sensors/decisions.js.map +1 -0
  424. package/dist/sensors/diff.d.ts +27 -0
  425. package/dist/sensors/diff.js +148 -0
  426. package/dist/sensors/diff.js.map +1 -0
  427. package/dist/sensors/index.d.ts +13 -0
  428. package/dist/sensors/index.js +9 -0
  429. package/dist/sensors/index.js.map +1 -0
  430. package/dist/sensors/remediation.d.ts +20 -0
  431. package/dist/sensors/remediation.js +65 -0
  432. package/dist/sensors/remediation.js.map +1 -0
  433. package/dist/sensors/runner.d.ts +44 -0
  434. package/dist/sensors/runner.js +95 -0
  435. package/dist/sensors/runner.js.map +1 -0
  436. package/dist/sensors/structural.d.ts +30 -0
  437. package/dist/sensors/structural.js +204 -0
  438. package/dist/sensors/structural.js.map +1 -0
  439. package/dist/sensors/stub-catalog.d.ts +39 -0
  440. package/dist/sensors/stub-catalog.js +115 -0
  441. package/dist/sensors/stub-catalog.js.map +1 -0
  442. package/dist/sensors/types.d.ts +135 -0
  443. package/dist/sensors/types.js +14 -0
  444. package/dist/sensors/types.js.map +1 -0
  445. package/dist/tier0/classify.d.ts +5 -0
  446. package/dist/tier0/classify.js +91 -0
  447. package/dist/tier0/classify.js.map +1 -0
  448. package/dist/tier0/index.d.ts +3 -0
  449. package/dist/tier0/index.js +3 -0
  450. package/dist/tier0/index.js.map +1 -0
  451. package/dist/tier0/ollama.d.ts +22 -0
  452. package/dist/tier0/ollama.js +63 -0
  453. package/dist/tier0/ollama.js.map +1 -0
  454. package/dist/tier0/types.d.ts +24 -0
  455. package/dist/tier0/types.js +7 -0
  456. package/dist/tier0/types.js.map +1 -0
  457. package/dist/tightener/index.d.ts +4 -0
  458. package/dist/tightener/index.js +4 -0
  459. package/dist/tightener/index.js.map +1 -0
  460. package/dist/tightener/prompt.d.ts +3 -0
  461. package/dist/tightener/prompt.js +67 -0
  462. package/dist/tightener/prompt.js.map +1 -0
  463. package/dist/tightener/schema.d.ts +68 -0
  464. package/dist/tightener/schema.js +44 -0
  465. package/dist/tightener/schema.js.map +1 -0
  466. package/dist/tightener/tighten.d.ts +2 -0
  467. package/dist/tightener/tighten.js +66 -0
  468. package/dist/tightener/tighten.js.map +1 -0
  469. package/dist/tightener/types.d.ts +74 -0
  470. package/dist/tightener/types.js +6 -0
  471. package/dist/tightener/types.js.map +1 -0
  472. package/dist/uat/bundle.d.ts +68 -0
  473. package/dist/uat/bundle.js +168 -0
  474. package/dist/uat/bundle.js.map +1 -0
  475. package/dist/uat/index.d.ts +15 -0
  476. package/dist/uat/index.js +10 -0
  477. package/dist/uat/index.js.map +1 -0
  478. package/dist/uat/persistent.d.ts +64 -0
  479. package/dist/uat/persistent.js +206 -0
  480. package/dist/uat/persistent.js.map +1 -0
  481. package/dist/uat/probes/cli.d.ts +11 -0
  482. package/dist/uat/probes/cli.js +107 -0
  483. package/dist/uat/probes/cli.js.map +1 -0
  484. package/dist/uat/probes/http.d.ts +12 -0
  485. package/dist/uat/probes/http.js +139 -0
  486. package/dist/uat/probes/http.js.map +1 -0
  487. package/dist/uat/probes/index.d.ts +21 -0
  488. package/dist/uat/probes/index.js +30 -0
  489. package/dist/uat/probes/index.js.map +1 -0
  490. package/dist/uat/probes/integration.d.ts +18 -0
  491. package/dist/uat/probes/integration.js +188 -0
  492. package/dist/uat/probes/integration.js.map +1 -0
  493. package/dist/uat/probes/sql/config.d.ts +14 -0
  494. package/dist/uat/probes/sql/config.js +57 -0
  495. package/dist/uat/probes/sql/config.js.map +1 -0
  496. package/dist/uat/probes/sql/index.d.ts +29 -0
  497. package/dist/uat/probes/sql/index.js +43 -0
  498. package/dist/uat/probes/sql/index.js.map +1 -0
  499. package/dist/uat/probes/sql/mysql.d.ts +12 -0
  500. package/dist/uat/probes/sql/mysql.js +96 -0
  501. package/dist/uat/probes/sql/mysql.js.map +1 -0
  502. package/dist/uat/probes/sql/pg.d.ts +20 -0
  503. package/dist/uat/probes/sql/pg.js +102 -0
  504. package/dist/uat/probes/sql/pg.js.map +1 -0
  505. package/dist/uat/probes/sql/sqlite.d.ts +9 -0
  506. package/dist/uat/probes/sql/sqlite.js +58 -0
  507. package/dist/uat/probes/sql/sqlite.js.map +1 -0
  508. package/dist/uat/probes/sql/types.d.ts +46 -0
  509. package/dist/uat/probes/sql/types.js +10 -0
  510. package/dist/uat/probes/sql/types.js.map +1 -0
  511. package/dist/uat/probes/sql.d.ts +9 -0
  512. package/dist/uat/probes/sql.js +119 -0
  513. package/dist/uat/probes/sql.js.map +1 -0
  514. package/dist/uat/probes/ui.d.ts +19 -0
  515. package/dist/uat/probes/ui.js +244 -0
  516. package/dist/uat/probes/ui.js.map +1 -0
  517. package/dist/uat/prompt.d.ts +10 -0
  518. package/dist/uat/prompt.js +85 -0
  519. package/dist/uat/prompt.js.map +1 -0
  520. package/dist/uat/question.d.ts +50 -0
  521. package/dist/uat/question.js +139 -0
  522. package/dist/uat/question.js.map +1 -0
  523. package/dist/uat/rejection.d.ts +58 -0
  524. package/dist/uat/rejection.js +163 -0
  525. package/dist/uat/rejection.js.map +1 -0
  526. package/dist/uat/runner.d.ts +6 -0
  527. package/dist/uat/runner.js +96 -0
  528. package/dist/uat/runner.js.map +1 -0
  529. package/dist/uat/schema.d.ts +322 -0
  530. package/dist/uat/schema.js +189 -0
  531. package/dist/uat/schema.js.map +1 -0
  532. package/dist/uat/types.d.ts +268 -0
  533. package/dist/uat/types.js +18 -0
  534. package/dist/uat/types.js.map +1 -0
  535. package/dist/uat/uat.d.ts +89 -0
  536. package/dist/uat/uat.js +256 -0
  537. package/dist/uat/uat.js.map +1 -0
  538. package/dist/voice/index.d.ts +4 -0
  539. package/dist/voice/index.js +4 -0
  540. package/dist/voice/index.js.map +1 -0
  541. package/dist/voice/model.d.ts +23 -0
  542. package/dist/voice/model.js +46 -0
  543. package/dist/voice/model.js.map +1 -0
  544. package/dist/voice/pipe.d.ts +9 -0
  545. package/dist/voice/pipe.js +47 -0
  546. package/dist/voice/pipe.js.map +1 -0
  547. package/dist/voice/transcribe.d.ts +3 -0
  548. package/dist/voice/transcribe.js +43 -0
  549. package/dist/voice/transcribe.js.map +1 -0
  550. package/dist/voice/types.d.ts +26 -0
  551. package/dist/voice/types.js +9 -0
  552. package/dist/voice/types.js.map +1 -0
  553. package/dist/watch/daemon.d.ts +21 -0
  554. package/dist/watch/daemon.js +143 -0
  555. package/dist/watch/daemon.js.map +1 -0
  556. package/dist/watch/index.d.ts +4 -0
  557. package/dist/watch/index.js +3 -0
  558. package/dist/watch/index.js.map +1 -0
  559. package/dist/watch/regenerate.d.ts +25 -0
  560. package/dist/watch/regenerate.js +51 -0
  561. package/dist/watch/regenerate.js.map +1 -0
  562. package/package.json +75 -0
@@ -0,0 +1,172 @@
1
+ import { spawn } from "node:child_process";
2
+ import { appendFile, mkdir } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ import { logger } from "../logger.js";
5
+ import { ClaudeError, classifyClaudeError } from "../claude/error.js";
6
+ const log = logger("orchestrator.runner");
7
+ const TIER_MODEL = {
8
+ haiku: "haiku",
9
+ sonnet: "sonnet",
10
+ opus: "opus",
11
+ };
12
+ /**
13
+ * Run the implementer agent via `claude --print --output-format stream-json`
14
+ * and stream every event line to `eventsLogPath` (NDJSON). The final event
15
+ * (type: "result") is returned to the caller.
16
+ *
17
+ * The agent operates in `cwd` (the mirror) and has access to the standard
18
+ * Claude Code tool surface. It MUST NOT commit or push — those are later
19
+ * phases. The `workflow.md` template's "Constraints" section enforces this
20
+ * via instruction; future phases add hook-level enforcement.
21
+ */
22
+ export async function runImplementer(opts) {
23
+ const model = TIER_MODEL[opts.tier];
24
+ const args = [
25
+ "--print",
26
+ "--output-format",
27
+ "stream-json",
28
+ "--include-partial-messages",
29
+ "--no-session-persistence",
30
+ "--verbose",
31
+ "--permission-mode",
32
+ opts.permissionMode ?? "bypassPermissions",
33
+ "--model",
34
+ model,
35
+ ];
36
+ if (opts.allowedTools && opts.allowedTools.length > 0) {
37
+ args.push("--allowedTools", opts.allowedTools.join(" "));
38
+ }
39
+ if (opts.addDirs && opts.addDirs.length > 0) {
40
+ args.push("--add-dir", ...opts.addDirs);
41
+ }
42
+ await mkdir(dirname(opts.eventsLogPath), { recursive: true });
43
+ const startedAt = Date.now();
44
+ const ctrl = new AbortController();
45
+ const timer = setTimeout(() => ctrl.abort("timeout"), opts.timeoutMs ?? 600_000);
46
+ const signal = opts.abortSignal !== undefined
47
+ ? AbortSignal.any([ctrl.signal, opts.abortSignal])
48
+ : ctrl.signal;
49
+ return new Promise((resolve, reject) => {
50
+ const child = spawn("claude", args, {
51
+ cwd: opts.cwd,
52
+ stdio: ["pipe", "pipe", "pipe"],
53
+ signal,
54
+ });
55
+ // SIGKILL escalation when the abort fires (whether from /halt or timeout).
56
+ // `spawn`'s `signal` option sends SIGTERM via Node's internals; if the
57
+ // child ignores it (e.g. blocked on stdin), we force-terminate after the
58
+ // grace period so /halt actually kills.
59
+ let killEscalation;
60
+ const onAbort = () => {
61
+ if (killEscalation !== undefined)
62
+ return;
63
+ killEscalation = setTimeout(() => {
64
+ if (child.exitCode === null && child.signalCode === null) {
65
+ try {
66
+ child.kill("SIGKILL");
67
+ }
68
+ catch {
69
+ // best-effort
70
+ }
71
+ }
72
+ }, opts.killGraceMs ?? 30_000);
73
+ };
74
+ if (signal.aborted)
75
+ onAbort();
76
+ else
77
+ signal.addEventListener("abort", onAbort, { once: true });
78
+ let stderr = "";
79
+ let buffer = "";
80
+ let eventCount = 0;
81
+ let resultEvent;
82
+ const writeQueue = Promise.resolve();
83
+ let writeChain = writeQueue;
84
+ const handleLine = (line) => {
85
+ const trimmed = line.trim();
86
+ if (trimmed.length === 0)
87
+ return;
88
+ let parsed;
89
+ try {
90
+ parsed = JSON.parse(trimmed);
91
+ }
92
+ catch (err) {
93
+ log.warn({ err: String(err), preview: trimmed.slice(0, 120) }, "stream line parse failed");
94
+ return;
95
+ }
96
+ eventCount += 1;
97
+ if (parsed["type"] === "result")
98
+ resultEvent = parsed;
99
+ writeChain = writeChain
100
+ .then(() => appendFile(opts.eventsLogPath, `${trimmed}\n`, "utf8"))
101
+ .catch((err) => log.warn({ err: String(err) }, "events log append failed"));
102
+ if (opts.onEvent) {
103
+ try {
104
+ opts.onEvent(parsed);
105
+ }
106
+ catch (err) {
107
+ log.warn({ err: String(err) }, "onEvent threw");
108
+ }
109
+ }
110
+ };
111
+ child.stdout.on("data", (chunk) => {
112
+ buffer += chunk.toString("utf8");
113
+ let nl = buffer.indexOf("\n");
114
+ while (nl !== -1) {
115
+ handleLine(buffer.slice(0, nl));
116
+ buffer = buffer.slice(nl + 1);
117
+ nl = buffer.indexOf("\n");
118
+ }
119
+ });
120
+ child.stderr.on("data", (chunk) => {
121
+ stderr += chunk.toString("utf8");
122
+ });
123
+ child.on("error", (err) => {
124
+ clearTimeout(timer);
125
+ reject(err);
126
+ });
127
+ child.on("close", (code) => {
128
+ clearTimeout(timer);
129
+ if (killEscalation !== undefined)
130
+ clearTimeout(killEscalation);
131
+ // Flush any trailing line.
132
+ if (buffer.length > 0)
133
+ handleLine(buffer);
134
+ writeChain
135
+ .then(() => {
136
+ const durationMs = Date.now() - startedAt;
137
+ if (code !== 0 && resultEvent === undefined) {
138
+ const message = `claude (implementer) exited ${code}${stderr ? `: ${stderr.trim()}` : ""}`;
139
+ const kind = classifyClaudeError({ message, exitCode: code, stderr });
140
+ reject(new ClaudeError({ message, kind, exitCode: code, stderr }));
141
+ return;
142
+ }
143
+ if (resultEvent === undefined) {
144
+ reject(new ClaudeError({
145
+ message: `implementer ended without a result event`,
146
+ kind: "other",
147
+ exitCode: code,
148
+ stderr,
149
+ }));
150
+ return;
151
+ }
152
+ const isErr = resultEvent["is_error"] === true;
153
+ log.info({
154
+ model,
155
+ durationMs,
156
+ events: eventCount,
157
+ ok: !isErr,
158
+ }, "implementer run complete");
159
+ resolve({
160
+ result: resultEvent,
161
+ events: eventCount,
162
+ durationMs,
163
+ ok: !isErr,
164
+ });
165
+ })
166
+ .catch((err) => reject(err));
167
+ });
168
+ child.stdin.write(opts.prompt);
169
+ child.stdin.end();
170
+ });
171
+ }
172
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/orchestrator/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Tool-digest extractor — second-source visibility for §3.3.
3
+ *
4
+ * Reads claude stream-json events (from events.jsonl or the live activity
5
+ * window) and surfaces what the agent is actually doing — the file paths
6
+ * it edited, the bash commands it ran, the search patterns it grep'd.
7
+ *
8
+ * Operator-facing surface: rendered as embed FIELDS alongside the Tier-0
9
+ * Ollama summary. Independent of LLM availability — pure pattern match
10
+ * on tool_use entries. When the Ollama summary fails ("Working…"), the
11
+ * tool digest still gives the operator something concrete.
12
+ *
13
+ * Claude stream-json shape (only the fields we read):
14
+ * { type: "assistant", message: { content: [{ type: "tool_use",
15
+ * name: "Edit"|"Write"|"MultiEdit"|"Bash"|"Grep"|"Glob"|...,
16
+ * input: { file_path?, command?, pattern?, ... } }] } }
17
+ */
18
+ export interface ToolDigest {
19
+ files: string[];
20
+ bash: string[];
21
+ searches: string[];
22
+ }
23
+ export interface ExtractToolDigestOptions {
24
+ /** Max file paths kept (deduped, most-recent-last). Default 8. */
25
+ maxFiles?: number;
26
+ /** Max bash commands kept (most-recent-last). Default 6. */
27
+ maxBash?: number;
28
+ /** Max search patterns kept (most-recent-last). Default 6. */
29
+ maxSearches?: number;
30
+ /** Trim each captured string to this length. Default 120. */
31
+ truncateTo?: number;
32
+ }
33
+ export declare function extractToolDigest(events: readonly Record<string, unknown>[], opts?: ExtractToolDigestOptions): ToolDigest;
34
+ /** True if any of files/bash/searches are populated. */
35
+ export declare function digestIsEmpty(d: ToolDigest): boolean;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Tool-digest extractor — second-source visibility for §3.3.
3
+ *
4
+ * Reads claude stream-json events (from events.jsonl or the live activity
5
+ * window) and surfaces what the agent is actually doing — the file paths
6
+ * it edited, the bash commands it ran, the search patterns it grep'd.
7
+ *
8
+ * Operator-facing surface: rendered as embed FIELDS alongside the Tier-0
9
+ * Ollama summary. Independent of LLM availability — pure pattern match
10
+ * on tool_use entries. When the Ollama summary fails ("Working…"), the
11
+ * tool digest still gives the operator something concrete.
12
+ *
13
+ * Claude stream-json shape (only the fields we read):
14
+ * { type: "assistant", message: { content: [{ type: "tool_use",
15
+ * name: "Edit"|"Write"|"MultiEdit"|"Bash"|"Grep"|"Glob"|...,
16
+ * input: { file_path?, command?, pattern?, ... } }] } }
17
+ */
18
+ const FILE_EDIT_TOOLS = new Set([
19
+ "Edit",
20
+ "Write",
21
+ "MultiEdit",
22
+ "NotebookEdit",
23
+ ]);
24
+ const BASH_TOOLS = new Set(["Bash"]);
25
+ const SEARCH_TOOLS = new Set(["Grep", "Glob"]);
26
+ export function extractToolDigest(events, opts = {}) {
27
+ const maxFiles = opts.maxFiles ?? 8;
28
+ const maxBash = opts.maxBash ?? 6;
29
+ const maxSearches = opts.maxSearches ?? 6;
30
+ const truncateTo = opts.truncateTo ?? 120;
31
+ const files = [];
32
+ const bash = [];
33
+ const searches = [];
34
+ for (const event of events) {
35
+ if (event["type"] !== "assistant")
36
+ continue;
37
+ const msg = event["message"];
38
+ if (typeof msg !== "object" || msg === null)
39
+ continue;
40
+ const content = msg["content"];
41
+ if (!Array.isArray(content))
42
+ continue;
43
+ for (const part of content) {
44
+ if (typeof part !== "object" || part === null)
45
+ continue;
46
+ const p = part;
47
+ if (p["type"] !== "tool_use")
48
+ continue;
49
+ const name = typeof p["name"] === "string" ? p["name"] : "";
50
+ const input = typeof p["input"] === "object" && p["input"] !== null
51
+ ? p["input"]
52
+ : undefined;
53
+ if (input === undefined)
54
+ continue;
55
+ if (FILE_EDIT_TOOLS.has(name)) {
56
+ const path = stringFrom(input, ["file_path", "filePath", "notebook_path"]);
57
+ if (path !== undefined)
58
+ pushUnique(files, truncate(path, truncateTo));
59
+ }
60
+ else if (BASH_TOOLS.has(name)) {
61
+ const cmd = stringFrom(input, ["command"]);
62
+ if (cmd !== undefined)
63
+ bash.push(truncate(cmd, truncateTo));
64
+ }
65
+ else if (SEARCH_TOOLS.has(name)) {
66
+ const pat = stringFrom(input, ["pattern", "query", "glob"]);
67
+ if (pat !== undefined)
68
+ searches.push(truncate(pat, truncateTo));
69
+ }
70
+ }
71
+ }
72
+ return {
73
+ files: tailDedup(files, maxFiles),
74
+ bash: bash.slice(-maxBash),
75
+ searches: searches.slice(-maxSearches),
76
+ };
77
+ }
78
+ function stringFrom(obj, keys) {
79
+ for (const k of keys) {
80
+ const v = obj[k];
81
+ if (typeof v === "string" && v.length > 0)
82
+ return v;
83
+ }
84
+ return undefined;
85
+ }
86
+ function pushUnique(arr, value) {
87
+ const idx = arr.indexOf(value);
88
+ if (idx !== -1)
89
+ arr.splice(idx, 1);
90
+ arr.push(value);
91
+ }
92
+ function tailDedup(arr, cap) {
93
+ const seen = new Set();
94
+ const out = [];
95
+ for (let i = arr.length - 1; i >= 0; i--) {
96
+ const v = arr[i];
97
+ if (v === undefined)
98
+ continue;
99
+ if (seen.has(v))
100
+ continue;
101
+ seen.add(v);
102
+ out.unshift(v);
103
+ if (out.length >= cap)
104
+ break;
105
+ }
106
+ return out;
107
+ }
108
+ function truncate(s, n) {
109
+ const trimmed = s.replace(/\s+/g, " ").trim();
110
+ return trimmed.length > n ? `${trimmed.slice(0, n - 1)}…` : trimmed;
111
+ }
112
+ /** True if any of files/bash/searches are populated. */
113
+ export function digestIsEmpty(d) {
114
+ return d.files.length === 0 && d.bash.length === 0 && d.searches.length === 0;
115
+ }
116
+ //# sourceMappingURL=tool-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-digest.js","sourceRoot":"","sources":["../../src/orchestrator/tool-digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,263 @@
1
+ import type { ClaudeTier } from "../claude/index.js";
2
+ import type { FrontendAdapter } from "../frontend/index.js";
3
+ import type { ReviewVerdict } from "../reviewer/types.js";
4
+ import type { ProjectGlobs, SensorLanguage, SensorSweepResult } from "../sensors/types.js";
5
+ import type { UatDecision, UatRunnerInput } from "../uat/types.js";
6
+ /**
7
+ * Phases a code-class run can be in. The lifecycle is linear; no skipping.
8
+ *
9
+ * queued — accepted from the inbox; waiting for the FIFO to drain
10
+ * tightening — Layer F spec tightener (Phase 7) is running
11
+ * blocked — tightener returned ready=false; awaiting operator answers
12
+ * prepping — workspace prep: mirror sync + SHA pin + dirty-overlap gate
13
+ * running — agent subprocess executing inside the mirror
14
+ * succeeded — agent finished; sensors / reviewer / UAT gates are later phases
15
+ * failed — terminal: tightener errored, workspace gate refused, agent timed
16
+ * out, or stream parse failed
17
+ *
18
+ * Phase 8 minimum exercises queued → prepping → running → succeeded | failed.
19
+ * `tightening` and `blocked` are wired but Phase 8 lets the smoke bypass via
20
+ * `bypass_tightener` to avoid spending Sonnet quota on every run.
21
+ */
22
+ export type RunPhase = "queued" | "tightening" | "blocked" | "prepping" | "running" | "sensing" | "reviewing" | "uat" | "backpropping" | "succeeded" | "failed";
23
+ /**
24
+ * Persisted at `.harness/runs/active/<run_id>/meta.json`. The orchestrator
25
+ * writes this on every phase transition. The grounding daemon's drift
26
+ * detector reads it for module-health quality grades.
27
+ */
28
+ export interface RunMeta {
29
+ run_id: string;
30
+ task_id: string;
31
+ agent_role: "implementer";
32
+ phase: RunPhase;
33
+ started_at: string;
34
+ finished_at?: string;
35
+ tier: ClaudeTier;
36
+ model: string;
37
+ mirror_path: string;
38
+ /** SHA captured at workspace prep (origin/main pin). */
39
+ sha_pin?: string;
40
+ events_count: number;
41
+ duration_ms?: number;
42
+ /** Populated when phase = "failed". */
43
+ error?: string;
44
+ /** Populated when tightener ran. */
45
+ tightener_score?: number;
46
+ tightener_ready?: boolean;
47
+ /**
48
+ * Set when the tightener returned ready=false and the orchestrator
49
+ * fired the resolution dialog. `approve_proposed` runs with the
50
+ * tightener's proposal; `ship_anyway` bypasses the gate using the
51
+ * operator's original body; `edit` / `cancel` / `timeout` mark the run
52
+ * failed (operator chose to re-submit / drop).
53
+ */
54
+ tightener_user_choice?: "approve_proposed" | "ship_anyway" | "edit" | "cancel" | "timeout";
55
+ /** Source channel id when ingested via Discord — used for postTaskUpdate. */
56
+ channel_id?: string;
57
+ /** Number of agent attempts dispatched (1 = no retries). */
58
+ attempts?: number;
59
+ /** Per-attempt sensor sweep summary; persisted in events log too. */
60
+ sensor_history?: {
61
+ attempt: number;
62
+ ok: boolean;
63
+ hard_failures: number;
64
+ soft_findings: number;
65
+ sensor_ids_failed: string[];
66
+ }[];
67
+ /** Final sweep result reference for downstream layers. */
68
+ last_sensor_sweep?: Pick<SensorSweepResult, "ok" | "hard_failures" | "soft_findings">;
69
+ /** Per-attempt reviewer subagent (Layer C) summary. */
70
+ reviewer_history?: {
71
+ attempt: number;
72
+ ok: boolean;
73
+ verdict: ReviewVerdict;
74
+ hard_gaps: number;
75
+ soft_gaps: number;
76
+ confidence_signal: "high" | "medium" | "low";
77
+ }[];
78
+ last_reviewer?: {
79
+ ok: boolean;
80
+ verdict: ReviewVerdict;
81
+ hard_gaps: number;
82
+ soft_gaps: number;
83
+ confidence_signal: "high" | "medium" | "low";
84
+ };
85
+ /** Per-attempt UAT (Layer U) summary. */
86
+ uat_history?: {
87
+ attempt: number;
88
+ ok: boolean;
89
+ all_passed: boolean;
90
+ probe_failures: number;
91
+ operator_decision: UatDecision;
92
+ }[];
93
+ last_uat?: {
94
+ ok: boolean;
95
+ all_passed: boolean;
96
+ probe_failures: number;
97
+ operator_decision: UatDecision;
98
+ };
99
+ /** Backprop subagent (Phase 13) summary. Set when backprop ran. */
100
+ last_backprop?: {
101
+ ok: boolean;
102
+ invariant_id: string;
103
+ invariant_path: string;
104
+ sensor_path: string;
105
+ enforcement_kind: "regex_sensor" | "named_e2e";
106
+ /** Commit SHA on the mirror; undefined if commit step skipped/failed. */
107
+ commit_sha?: string;
108
+ /** Set when ok=false; agent threw / write failed / commit threw. */
109
+ error?: string;
110
+ };
111
+ }
112
+ /**
113
+ * Shape of a `task` row dropped to `.harness/inbox/<...>.json` by adapters.
114
+ * The orchestrator is tolerant — fields beyond `task_id` and `task` are
115
+ * optional and just plumb through to the run.
116
+ */
117
+ export interface InboxTaskRow {
118
+ kind: "task";
119
+ source: string;
120
+ received_at: string;
121
+ task_id?: string;
122
+ task: {
123
+ rawText: string;
124
+ intent: string;
125
+ authorId: string;
126
+ channelId?: string;
127
+ guildId?: string;
128
+ messageId?: string;
129
+ receivedAt?: string;
130
+ };
131
+ classification?: {
132
+ intent: string;
133
+ confidence: number;
134
+ source: string;
135
+ };
136
+ free_text?: unknown;
137
+ slash?: unknown;
138
+ /** Optional override per L24 / WORKFLOW_GUIDE §4.5. */
139
+ ship_anyway?: boolean;
140
+ /** Globs the run is expected to touch — used for dirty-overlap. */
141
+ target_path_globs?: string[];
142
+ /** Optional title override (otherwise derived from rawText[0..80]). */
143
+ title?: string;
144
+ /** Optional acceptance criteria pre-supplied. */
145
+ acceptance_criteria?: string[];
146
+ }
147
+ export interface OrchestratorOptions {
148
+ /** Project name as registered with mirror (slug, not display). */
149
+ projectName: string;
150
+ /** Repo root for inbox + runs + tasks dirs (typically the mirror path). */
151
+ repoRoot: string;
152
+ /** Adapters used for surfacing run progress + dialogs. */
153
+ adapters: FrontendAdapter[];
154
+ /** Skip the spec tightener (Phase 7). Smoke convenience. Default false. */
155
+ bypassTightener?: boolean;
156
+ /** Skip the sensor sweep (Phase 9). Smoke convenience. Default false. */
157
+ bypassSensors?: boolean;
158
+ /** Skip the reviewer subagent (Phase 10). Smoke convenience. Default false. */
159
+ bypassReviewer?: boolean;
160
+ /** Skip the UAT pipeline (Phase 11). Smoke convenience. Default false. */
161
+ bypassUat?: boolean;
162
+ /**
163
+ * Skip the backprop subagent (Phase 13). Smoke convenience. Default
164
+ * false — production runs invoke backprop on every successful code-class
165
+ * UAT-approved run.
166
+ */
167
+ bypassBackprop?: boolean;
168
+ /**
169
+ * Override the backprop tier. Default = `tier_assignment.backprop_author`
170
+ * from workflow.md (Tier 2 / Sonnet). Smokes drop to Tier 1 (Haiku) for
171
+ * speed + quota.
172
+ */
173
+ backpropTier?: ClaudeTier;
174
+ /**
175
+ * Tier for the decision-capture extractor (Phase 14). Default = haiku
176
+ * per workflow.md `decision_extractor: 1`. Sonnet may be useful when
177
+ * directions are long-form and a Haiku miss-classifies them.
178
+ */
179
+ decisionExtractorTier?: ClaudeTier;
180
+ /**
181
+ * Confirm-dialog timeout for the decision-capture flow. Default 60_000
182
+ * ms. Smokes drop this to a few seconds so stub adapters resolve fast.
183
+ */
184
+ decisionConfirmTimeoutMs?: number;
185
+ /**
186
+ * Skip the post-commit refinement step (Phase 14.x). Default false.
187
+ * Smokes that don't care about refinement (e.g. `smoke:decision-capture`)
188
+ * flip this on to keep the flow pure-mechanical.
189
+ */
190
+ bypassRefinement?: boolean;
191
+ /**
192
+ * Tier for the refinement-proposer call. Default = decisionExtractorTier
193
+ * (haiku). The refiner is small JSON in / small JSON out; haiku is
194
+ * sufficient for almost every case.
195
+ */
196
+ refinementTier?: ClaudeTier;
197
+ /** Refinement-dialog timeout. Default 60_000 ms. */
198
+ refinementDialogTimeoutMs?: number;
199
+ /**
200
+ * UAT-runner hints surfaced to the agent — base URL for http probes,
201
+ * cli prefix/cwd, and which heavier probe surfaces are available
202
+ * (ui/sql/integration). Adopted from `<project>:` extension block at
203
+ * init. Defaults exclude the heavy surfaces; ui/sql/integration must be
204
+ * explicitly enabled via setup:uat-* helpers per Phase 11.5/11.6.
205
+ */
206
+ uatHints?: UatRunnerInput["hints"];
207
+ /**
208
+ * Cold-start smoke command (e.g. `pnpm db:reset && pnpm db:migrate &&
209
+ * pnpm start:dev`). Recorded as a single command + args; orchestrator
210
+ * spawns it before probes when the UAT-runner sets `cold_start_smoke=true`.
211
+ */
212
+ uatColdStartCommand?: {
213
+ command: string;
214
+ args: string[];
215
+ cwd?: string;
216
+ };
217
+ /**
218
+ * Override the post-reject A/B/C/D dialog timeout. Default 24h per
219
+ * UAT_PIPELINE.md §9 (`uat_decision_seconds`). Smokes pass a short
220
+ * value so stub adapters resolve quickly.
221
+ */
222
+ uatRejectDialogTimeoutMs?: number;
223
+ /** Override the question agent's tier. Default: same tier as implementer. */
224
+ uatQuestionTier?: ClaudeTier;
225
+ /** Cap on ❓ Ask iterations per run. Default 5 in runUat. */
226
+ uatMaxQuestionRounds?: number;
227
+ /**
228
+ * Force this tier for the implementer. Default: haiku (cheap; raise to
229
+ * sonnet for code-class tasks once Phase 9+ adds trust-class detection).
230
+ */
231
+ defaultTier?: ClaudeTier;
232
+ /** Inbox poll interval — chokidar fires events but we also poll for safety. */
233
+ pollIntervalMs?: number;
234
+ /** Per-run hard timeout. Default 600_000 ms (10 min). */
235
+ runTimeoutMs?: number;
236
+ /** Allowed tools list passed to `claude --allowed-tools`. */
237
+ allowedTools?: string[];
238
+ /** Stack-profile language list — filters Layer A patterns. Default ["typescript"]. */
239
+ sensorLanguages?: SensorLanguage[];
240
+ /** Resolved <project>: extension globs from workflow.md. Default {}. */
241
+ projectGlobs?: ProjectGlobs;
242
+ /**
243
+ * Max agent attempts before the run is failed-honesty-checked. Default 3
244
+ * per L42 (max_attempts_per_task=3, attempt 2 = first sensor-feedback retry).
245
+ */
246
+ maxAttempts?: number;
247
+ /**
248
+ * Stall watchdog threshold. When the active run logs no event for this
249
+ * many seconds AND the phase is one that should produce events
250
+ * (excludes operator-pending `blocked`), the orchestrator posts a
251
+ * one-shot remediation embed pointing at `/halt` + `/status`. Default
252
+ * 90s; smokes drop this to a few seconds.
253
+ */
254
+ watchdogStallSeconds?: number;
255
+ }
256
+ export interface QueueEntry {
257
+ run_id: string;
258
+ task_id: string;
259
+ enqueued_at: string;
260
+ row: InboxTaskRow;
261
+ /** Where the inbox row file lives — moved to processed/ on completion. */
262
+ inbox_file: string;
263
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/orchestrator/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { DirtyOverlapResult } from "../mirror/index.js";
2
+ export interface WorkspacePrepResult {
3
+ sha_pin: string;
4
+ branch: string;
5
+ /** Empty when no `target_path_globs` was supplied. */
6
+ dirty_overlap: DirtyOverlapResult | null;
7
+ }
8
+ /**
9
+ * Phase 8 workspace prep:
10
+ * 1. `syncMirror` — fetch + reset --hard origin/<branch>; capture SHA pin.
11
+ * 2. `checkLocalDirtyOverlap` — read user's working tree for files that
12
+ * overlap the run's target globs (per L45). The orchestrator decides
13
+ * whether to pause + dialog the operator based on the result; this
14
+ * function only reports.
15
+ *
16
+ * Mutates the mirror only. The user's working tree is NEVER written to.
17
+ */
18
+ export declare function prepareWorkspace(args: {
19
+ projectName: string;
20
+ targetGlobs?: string[];
21
+ }): Promise<WorkspacePrepResult>;
@@ -0,0 +1,31 @@
1
+ import { logger } from "../logger.js";
2
+ import { checkLocalDirtyOverlap, syncMirror } from "../mirror/index.js";
3
+ const log = logger("orchestrator.workspace");
4
+ /**
5
+ * Phase 8 workspace prep:
6
+ * 1. `syncMirror` — fetch + reset --hard origin/<branch>; capture SHA pin.
7
+ * 2. `checkLocalDirtyOverlap` — read user's working tree for files that
8
+ * overlap the run's target globs (per L45). The orchestrator decides
9
+ * whether to pause + dialog the operator based on the result; this
10
+ * function only reports.
11
+ *
12
+ * Mutates the mirror only. The user's working tree is NEVER written to.
13
+ */
14
+ export async function prepareWorkspace(args) {
15
+ const { projectName, targetGlobs } = args;
16
+ const sync = await syncMirror({ projectName });
17
+ log.info({ projectName, sha: sync.sha, branch: sync.branch }, "mirror pinned");
18
+ let dirty = null;
19
+ if (targetGlobs && targetGlobs.length > 0) {
20
+ dirty = await checkLocalDirtyOverlap({ projectName, targetGlobs });
21
+ if (dirty.overlap) {
22
+ log.warn({ projectName, files: dirty.overlappingFiles }, "dirty-overlap detected — orchestrator must pause + dialog");
23
+ }
24
+ }
25
+ return {
26
+ sha_pin: sync.sha,
27
+ branch: sync.branch,
28
+ dirty_overlap: dirty,
29
+ };
30
+ }
31
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/orchestrator/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGxE,MAAM,GAAG,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAS7C;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAGtC;IACC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAE1C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;IAE/E,IAAI,KAAK,GAA8B,IAAI,CAAC;IAC5C,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,GAAG,MAAM,sBAAsB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CACN,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,EAC9C,2DAA2D,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC"}