@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,188 @@
1
+ /**
2
+ * Integration probe — docker-compose orchestration.
3
+ *
4
+ * Pipeline:
5
+ * 1. `docker compose -f <file> up -d <service>` (or up -d if service unset)
6
+ * 2. Poll ready_check (http or cli) until pass or 60s timeout
7
+ * 3. Run nested test probe (http or cli)
8
+ * 4. `docker compose -f <file> down` (always — even on failure)
9
+ *
10
+ * Skips when `docker compose` not on PATH OR compose_file doesn't exist.
11
+ * Operator runs `harness setup:uat-docker` to provision the compose template
12
+ * and confirm docker availability.
13
+ */
14
+ import { spawn, spawnSync } from "node:child_process";
15
+ import { existsSync } from "node:fs";
16
+ import { isAbsolute, join } from "node:path";
17
+ import { logger } from "../../logger.js";
18
+ import { runCliProbe } from "./cli.js";
19
+ import { runHttpProbe } from "./http.js";
20
+ const log = logger("uat.probe.integration");
21
+ function dockerComposeAvailable() {
22
+ try {
23
+ const result = spawnSync("docker", ["compose", "--version"], { encoding: "utf8" });
24
+ return result.status === 0;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ async function spawnPromise(args) {
31
+ return new Promise((resolve) => {
32
+ const ctrl = new AbortController();
33
+ const timer = setTimeout(() => ctrl.abort(), args.timeoutMs ?? 120_000);
34
+ let stdout = "";
35
+ let stderr = "";
36
+ const child = spawn(args.command, args.args, {
37
+ cwd: args.cwd,
38
+ signal: ctrl.signal,
39
+ });
40
+ child.stdout.on("data", (chunk) => {
41
+ stdout += chunk.toString("utf8");
42
+ });
43
+ child.stderr.on("data", (chunk) => {
44
+ stderr += chunk.toString("utf8");
45
+ });
46
+ child.on("error", (err) => {
47
+ clearTimeout(timer);
48
+ resolve({ exitCode: -1, stdout, stderr: stderr + `\n[spawn-error] ${String(err)}` });
49
+ });
50
+ child.on("close", (code) => {
51
+ clearTimeout(timer);
52
+ resolve({ exitCode: code ?? -1, stdout, stderr });
53
+ });
54
+ });
55
+ }
56
+ async function pollReadyCheck(ready, deadline) {
57
+ while (Date.now() < deadline) {
58
+ if (ready.kind === "http") {
59
+ try {
60
+ const res = await fetch(ready.url, {
61
+ signal: AbortSignal.timeout(ready.timeout_ms ?? 5_000),
62
+ });
63
+ if (ready.status === undefined) {
64
+ if (res.status >= 200 && res.status < 500)
65
+ return { ok: true };
66
+ }
67
+ else if (res.status === ready.status) {
68
+ return { ok: true };
69
+ }
70
+ }
71
+ catch {
72
+ // Service not ready yet — continue polling.
73
+ }
74
+ }
75
+ else {
76
+ const out = await spawnPromise({
77
+ command: ready.command,
78
+ args: ready.args,
79
+ timeoutMs: ready.timeout_ms ?? 5_000,
80
+ });
81
+ if (out.exitCode === 0)
82
+ return { ok: true };
83
+ }
84
+ await new Promise((r) => setTimeout(r, 1_000));
85
+ }
86
+ return { ok: false, reason: `ready_check timed out` };
87
+ }
88
+ export async function runIntegrationProbe(args) {
89
+ const startedAt = Date.now();
90
+ const probe = args.probe;
91
+ if (!dockerComposeAvailable()) {
92
+ return {
93
+ probe_id: probe.id,
94
+ probe_kind: "integration",
95
+ passed: false,
96
+ evidence: "docker compose not on PATH",
97
+ duration_ms: Date.now() - startedAt,
98
+ skipped_reason: "docker compose missing — install Docker Desktop or run `harness setup:uat-docker`",
99
+ };
100
+ }
101
+ const composeFile = isAbsolute(probe.compose_file)
102
+ ? probe.compose_file
103
+ : join(args.repoRoot ?? process.cwd(), probe.compose_file);
104
+ if (!existsSync(composeFile)) {
105
+ return {
106
+ probe_id: probe.id,
107
+ probe_kind: "integration",
108
+ passed: false,
109
+ evidence: `compose file not found: ${composeFile}`,
110
+ duration_ms: Date.now() - startedAt,
111
+ skipped_reason: `compose file ${composeFile} missing — provision via setup:uat-docker`,
112
+ };
113
+ }
114
+ // ── Up ───────────────────────────────────────────────────────────────
115
+ const up = await spawnPromise({
116
+ command: "docker",
117
+ args: ["compose", "-f", composeFile, "up", "-d", probe.service],
118
+ timeoutMs: 120_000,
119
+ });
120
+ if (up.exitCode !== 0) {
121
+ await teardown(composeFile);
122
+ return {
123
+ probe_id: probe.id,
124
+ probe_kind: "integration",
125
+ passed: false,
126
+ evidence: `docker compose up exit=${up.exitCode}; stderr=${up.stderr.slice(0, 200)}`,
127
+ duration_ms: Date.now() - startedAt,
128
+ failure_reason: `docker compose up failed: ${up.stderr.slice(0, 400)}`,
129
+ };
130
+ }
131
+ log.info({ probe_id: probe.id, service: probe.service }, "compose up succeeded");
132
+ // ── Ready check ──────────────────────────────────────────────────────
133
+ const readyDeadline = Date.now() + 60_000;
134
+ const ready = await pollReadyCheck(probe.ready_check, readyDeadline);
135
+ if (!ready.ok) {
136
+ await teardown(composeFile);
137
+ return {
138
+ probe_id: probe.id,
139
+ probe_kind: "integration",
140
+ passed: false,
141
+ evidence: `ready_check failed; service ${probe.service} did not come up`,
142
+ duration_ms: Date.now() - startedAt,
143
+ failure_reason: ready.reason ?? "ready_check failed",
144
+ };
145
+ }
146
+ log.info({ probe_id: probe.id }, "ready_check passed");
147
+ // ── Nested test probe ────────────────────────────────────────────────
148
+ let testResult;
149
+ if (probe.test.kind === "http") {
150
+ testResult = await runHttpProbe({ probe: probe.test });
151
+ }
152
+ else if (probe.test.kind === "cli") {
153
+ testResult = await runCliProbe({ probe: probe.test });
154
+ }
155
+ else {
156
+ await teardown(composeFile);
157
+ return {
158
+ probe_id: probe.id,
159
+ probe_kind: "integration",
160
+ passed: false,
161
+ evidence: `nested test probe must be http or cli, got ${probe.test.kind}`,
162
+ duration_ms: Date.now() - startedAt,
163
+ failure_reason: "integration probes only nest http/cli probes",
164
+ };
165
+ }
166
+ await teardown(composeFile);
167
+ return {
168
+ probe_id: probe.id,
169
+ probe_kind: "integration",
170
+ passed: testResult.passed,
171
+ evidence: `compose ${probe.service} up; test=${testResult.evidence.slice(0, 160)}`,
172
+ duration_ms: Date.now() - startedAt,
173
+ ...(testResult.failure_reason !== undefined ? { failure_reason: testResult.failure_reason } : {}),
174
+ };
175
+ }
176
+ async function teardown(composeFile) {
177
+ try {
178
+ await spawnPromise({
179
+ command: "docker",
180
+ args: ["compose", "-f", composeFile, "down"],
181
+ timeoutMs: 60_000,
182
+ });
183
+ }
184
+ catch {
185
+ // best effort — don't mask the test result
186
+ }
187
+ }
188
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../../../src/uat/probes/integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Load `.harness/config/probes/sql.yaml`.
3
+ *
4
+ * Path resolution:
5
+ * 1. <repoRoot>/.harness/config/probes/sql.yaml — project override
6
+ * 2. (no fallback; missing config = no sql connections)
7
+ *
8
+ * Returns an empty `connections` map when the file is missing so callers
9
+ * can produce a clean "no such connection" error instead of throwing on
10
+ * read.
11
+ */
12
+ import type { SqlConnectionsConfig } from "./types.js";
13
+ export declare function sqlConfigPath(repoRoot: string): string;
14
+ export declare function loadSqlConnections(repoRoot: string): SqlConnectionsConfig;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Load `.harness/config/probes/sql.yaml`.
3
+ *
4
+ * Path resolution:
5
+ * 1. <repoRoot>/.harness/config/probes/sql.yaml — project override
6
+ * 2. (no fallback; missing config = no sql connections)
7
+ *
8
+ * Returns an empty `connections` map when the file is missing so callers
9
+ * can produce a clean "no such connection" error instead of throwing on
10
+ * read.
11
+ */
12
+ import { existsSync, readFileSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ import { parse as parseYaml } from "yaml";
15
+ export function sqlConfigPath(repoRoot) {
16
+ return join(repoRoot, ".harness", "config", "probes", "sql.yaml");
17
+ }
18
+ export function loadSqlConnections(repoRoot) {
19
+ const path = sqlConfigPath(repoRoot);
20
+ if (!existsSync(path))
21
+ return { connections: {} };
22
+ const raw = parseYaml(readFileSync(path, "utf8"));
23
+ const connectionsRaw = (raw["connections"] ?? {});
24
+ const connections = {};
25
+ for (const [key, value] of Object.entries(connectionsRaw)) {
26
+ if (typeof value !== "object" || value === null)
27
+ continue;
28
+ const v = value;
29
+ const driver = v["driver"];
30
+ if (driver === "sqlite" && typeof v["file"] === "string") {
31
+ connections[key] = { driver: "sqlite", file: v["file"] };
32
+ }
33
+ else if (driver === "postgres" && typeof v["host"] === "string" && typeof v["database"] === "string") {
34
+ connections[key] = {
35
+ driver: "postgres",
36
+ host: v["host"],
37
+ database: v["database"],
38
+ ...(typeof v["port"] === "number" ? { port: v["port"] } : {}),
39
+ ...(typeof v["user_env"] === "string" ? { user_env: v["user_env"] } : {}),
40
+ ...(typeof v["password_env"] === "string" ? { password_env: v["password_env"] } : {}),
41
+ ...(typeof v["ssl"] === "boolean" ? { ssl: v["ssl"] } : {}),
42
+ };
43
+ }
44
+ else if (driver === "mysql" && typeof v["host"] === "string" && typeof v["database"] === "string") {
45
+ connections[key] = {
46
+ driver: "mysql",
47
+ host: v["host"],
48
+ database: v["database"],
49
+ ...(typeof v["port"] === "number" ? { port: v["port"] } : {}),
50
+ ...(typeof v["user_env"] === "string" ? { user_env: v["user_env"] } : {}),
51
+ ...(typeof v["password_env"] === "string" ? { password_env: v["password_env"] } : {}),
52
+ };
53
+ }
54
+ }
55
+ return { connections };
56
+ }
57
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/uat/probes/sql/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * SQL driver dispatcher.
3
+ *
4
+ * Loads `.harness/config/probes/sql.yaml`, resolves the SqlProbe's
5
+ * `connection` key to a typed connection config, and routes the query
6
+ * to the matching driver.
7
+ */
8
+ import type { SqlConnection, SqlDriver, SqlQueryResult } from "./types.js";
9
+ import { mysqlDriver } from "./mysql.js";
10
+ import { pgDriver } from "./pg.js";
11
+ import { sqliteDriver } from "./sqlite.js";
12
+ export type { SqlConnection, SqlConnectionsConfig, SqlDriver, SqlDriverKind, SqlQueryResult, SqliteConnection, PostgresConnection, MysqlConnection } from "./types.js";
13
+ export { loadSqlConnections, sqlConfigPath } from "./config.js";
14
+ export { sqliteDriver, pgDriver, mysqlDriver };
15
+ export interface ResolveConnectionResult {
16
+ connection: SqlConnection;
17
+ driver: SqlDriver;
18
+ }
19
+ export declare class SqlConnectionMissingError extends Error {
20
+ constructor(key: string);
21
+ }
22
+ /** Look up a connection by key + driver from the project config. */
23
+ export declare function resolveConnection(repoRoot: string, key: string): ResolveConnectionResult | null;
24
+ /** Run a query through the dispatcher. Throws on missing connection or driver error. */
25
+ export declare function runQuery(args: {
26
+ repoRoot: string;
27
+ connectionKey: string;
28
+ sql: string;
29
+ }): Promise<SqlQueryResult>;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * SQL driver dispatcher.
3
+ *
4
+ * Loads `.harness/config/probes/sql.yaml`, resolves the SqlProbe's
5
+ * `connection` key to a typed connection config, and routes the query
6
+ * to the matching driver.
7
+ */
8
+ import { loadSqlConnections } from "./config.js";
9
+ import { mysqlDriver } from "./mysql.js";
10
+ import { pgDriver } from "./pg.js";
11
+ import { sqliteDriver } from "./sqlite.js";
12
+ export { loadSqlConnections, sqlConfigPath } from "./config.js";
13
+ export { sqliteDriver, pgDriver, mysqlDriver };
14
+ const DRIVERS = {
15
+ sqlite: sqliteDriver,
16
+ postgres: pgDriver,
17
+ mysql: mysqlDriver,
18
+ };
19
+ export class SqlConnectionMissingError extends Error {
20
+ constructor(key) {
21
+ super(`sql connection "${key}" not configured — add it to .harness/config/probes/sql.yaml or run \`harness setup:uat-sql\``);
22
+ this.name = "SqlConnectionMissingError";
23
+ }
24
+ }
25
+ /** Look up a connection by key + driver from the project config. */
26
+ export function resolveConnection(repoRoot, key) {
27
+ const config = loadSqlConnections(repoRoot);
28
+ const connection = config.connections[key];
29
+ if (!connection)
30
+ return null;
31
+ const driver = DRIVERS[connection.driver];
32
+ if (!driver)
33
+ return null;
34
+ return { connection, driver };
35
+ }
36
+ /** Run a query through the dispatcher. Throws on missing connection or driver error. */
37
+ export async function runQuery(args) {
38
+ const resolved = resolveConnection(args.repoRoot, args.connectionKey);
39
+ if (!resolved)
40
+ throw new SqlConnectionMissingError(args.connectionKey);
41
+ return resolved.driver.query(resolved.connection, args.sql);
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/uat/probes/sql/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAE/C,MAAM,OAAO,GAA8B;IACzC,MAAM,EAAE,YAAY;IACpB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,WAAW;CACnB,CAAC;AAOF,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,GAAW;QACrB,KAAK,CACH,mBAAmB,GAAG,+FAA+F,CACtH,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,GAAW;IAC7D,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAI9B;IACC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,yBAAyB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvE,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MySQL SQL probe driver — live.
3
+ *
4
+ * Lazy-loads `mysql2/promise`. Adopting projects opt in via
5
+ * `harness setup:uat-sql --driver mysql --install`.
6
+ *
7
+ * READ-ONLY by contract — the upstream regex gate rejects mutating
8
+ * queries. We also issue `SET SESSION TRANSACTION READ ONLY` before the
9
+ * query as defense-in-depth.
10
+ */
11
+ import type { SqlDriver } from "./types.js";
12
+ export declare const mysqlDriver: SqlDriver;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * MySQL SQL probe driver — live.
3
+ *
4
+ * Lazy-loads `mysql2/promise`. Adopting projects opt in via
5
+ * `harness setup:uat-sql --driver mysql --install`.
6
+ *
7
+ * READ-ONLY by contract — the upstream regex gate rejects mutating
8
+ * queries. We also issue `SET SESSION TRANSACTION READ ONLY` before the
9
+ * query as defense-in-depth.
10
+ */
11
+ import { logger } from "../../../logger.js";
12
+ const log = logger("uat.probe.sql.mysql");
13
+ let cachedPromise;
14
+ async function loadMysql() {
15
+ if (cachedPromise !== undefined)
16
+ return cachedPromise;
17
+ try {
18
+ const mod = (await import(
19
+ /* @vite-ignore */ "mysql2/promise").catch(async () => (await import(/* @vite-ignore */ "mysql2").catch(() => null))));
20
+ if (!mod) {
21
+ cachedPromise = null;
22
+ return null;
23
+ }
24
+ if (mod.promise) {
25
+ cachedPromise = mod.promise;
26
+ return mod.promise;
27
+ }
28
+ if (mod.default?.promise) {
29
+ cachedPromise = mod.default.promise;
30
+ return mod.default.promise;
31
+ }
32
+ if (mod.createConnection) {
33
+ cachedPromise = { createConnection: mod.createConnection };
34
+ return cachedPromise;
35
+ }
36
+ cachedPromise = null;
37
+ return null;
38
+ }
39
+ catch {
40
+ cachedPromise = null;
41
+ return null;
42
+ }
43
+ }
44
+ export const mysqlDriver = {
45
+ kind: "mysql",
46
+ async query(connection, sql) {
47
+ if (connection.driver !== "mysql") {
48
+ throw new Error(`mysql driver received non-mysql connection: ${connection.driver}`);
49
+ }
50
+ const promise = await loadMysql();
51
+ if (!promise) {
52
+ throw new Error("mysql2 client not installed — run `pnpm add -D mysql2` then re-run `harness setup:uat-sql --driver mysql`");
53
+ }
54
+ const conn = connection;
55
+ const user = conn.user_env ? process.env[conn.user_env] : undefined;
56
+ const password = conn.password_env ? process.env[conn.password_env] : undefined;
57
+ const config = {
58
+ host: conn.host,
59
+ database: conn.database,
60
+ connectTimeout: 30_000,
61
+ };
62
+ if (conn.port !== undefined)
63
+ config.port = conn.port;
64
+ if (user !== undefined)
65
+ config.user = user;
66
+ if (password !== undefined)
67
+ config.password = password;
68
+ const client = await promise.createConnection(config);
69
+ try {
70
+ // Defense-in-depth read-only session.
71
+ try {
72
+ await client.query("SET SESSION TRANSACTION READ ONLY");
73
+ }
74
+ catch {
75
+ // Best effort — older MySQL may not support; the regex gate is
76
+ // primary protection.
77
+ }
78
+ const [rowsRaw] = await client.query(sql);
79
+ const rows = Array.isArray(rowsRaw)
80
+ ? rowsRaw
81
+ : [];
82
+ log.debug({ host: conn.host, database: conn.database, rowcount: rows.length }, "mysql query complete");
83
+ const out = { rowcount: rows.length, rows };
84
+ return out;
85
+ }
86
+ finally {
87
+ try {
88
+ await client.end();
89
+ }
90
+ catch {
91
+ // best effort
92
+ }
93
+ }
94
+ },
95
+ };
96
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../../src/uat/probes/sql/mysql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Postgres SQL probe driver — live.
3
+ *
4
+ * Lazy-loads `pg` so the harness package install stays lean. Adopting
5
+ * projects opt in via `harness setup:uat-sql --driver postgres --install`,
6
+ * which adds `pg` to their devDeps + writes a connection template to
7
+ * `.harness/config/probes/sql.yaml`.
8
+ *
9
+ * Connection credentials live in env vars referenced from the YAML
10
+ * (`user_env: PGUSER`, `password_env: PGPASSWORD`) — never literal in
11
+ * config files. Per operator preference: secrets in env, host/port/db in
12
+ * YAML.
13
+ *
14
+ * READ-ONLY by contract — the upstream `runSqlProbe` regex gate rejects
15
+ * any query that doesn't start with SELECT/WITH/SHOW/EXPLAIN/PRAGMA. We
16
+ * also wrap each query in a `BEGIN READ ONLY ... ROLLBACK` cycle as
17
+ * defense-in-depth so a bug elsewhere can't accidentally mutate.
18
+ */
19
+ import type { SqlDriver } from "./types.js";
20
+ export declare const pgDriver: SqlDriver;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Postgres SQL probe driver — live.
3
+ *
4
+ * Lazy-loads `pg` so the harness package install stays lean. Adopting
5
+ * projects opt in via `harness setup:uat-sql --driver postgres --install`,
6
+ * which adds `pg` to their devDeps + writes a connection template to
7
+ * `.harness/config/probes/sql.yaml`.
8
+ *
9
+ * Connection credentials live in env vars referenced from the YAML
10
+ * (`user_env: PGUSER`, `password_env: PGPASSWORD`) — never literal in
11
+ * config files. Per operator preference: secrets in env, host/port/db in
12
+ * YAML.
13
+ *
14
+ * READ-ONLY by contract — the upstream `runSqlProbe` regex gate rejects
15
+ * any query that doesn't start with SELECT/WITH/SHOW/EXPLAIN/PRAGMA. We
16
+ * also wrap each query in a `BEGIN READ ONLY ... ROLLBACK` cycle as
17
+ * defense-in-depth so a bug elsewhere can't accidentally mutate.
18
+ */
19
+ import { logger } from "../../../logger.js";
20
+ const log = logger("uat.probe.sql.pg");
21
+ let cachedCtor;
22
+ async function loadPg() {
23
+ if (cachedCtor !== undefined)
24
+ return cachedCtor;
25
+ try {
26
+ const mod = (await import(
27
+ /* @vite-ignore */ "pg").catch(() => null));
28
+ if (!mod) {
29
+ cachedCtor = null;
30
+ return null;
31
+ }
32
+ const ctor = mod.Client ?? mod.default?.Client ?? null;
33
+ cachedCtor = ctor;
34
+ return ctor;
35
+ }
36
+ catch {
37
+ cachedCtor = null;
38
+ return null;
39
+ }
40
+ }
41
+ export const pgDriver = {
42
+ kind: "postgres",
43
+ async query(connection, sql) {
44
+ if (connection.driver !== "postgres") {
45
+ throw new Error(`pg driver received non-postgres connection: ${connection.driver}`);
46
+ }
47
+ const Ctor = await loadPg();
48
+ if (!Ctor) {
49
+ throw new Error("pg client not installed — run `pnpm add -D pg @types/pg` then re-run `harness setup:uat-sql --driver postgres`");
50
+ }
51
+ const conn = connection;
52
+ const user = conn.user_env ? process.env[conn.user_env] : undefined;
53
+ const password = conn.password_env ? process.env[conn.password_env] : undefined;
54
+ const config = {
55
+ host: conn.host,
56
+ database: conn.database,
57
+ statement_timeout: 30_000,
58
+ };
59
+ if (conn.port !== undefined)
60
+ config.port = conn.port;
61
+ if (user !== undefined)
62
+ config.user = user;
63
+ if (password !== undefined)
64
+ config.password = password;
65
+ if (conn.ssl === true)
66
+ config.ssl = true;
67
+ const client = new Ctor(config);
68
+ try {
69
+ await client.connect();
70
+ // Defense-in-depth: read-only transaction wrapper. Any DDL/DML the
71
+ // gate misses is forced to roll back. SELECT works inside RO.
72
+ await client.query("BEGIN TRANSACTION READ ONLY");
73
+ let result;
74
+ try {
75
+ result = await client.query(sql);
76
+ }
77
+ finally {
78
+ try {
79
+ await client.query("ROLLBACK");
80
+ }
81
+ catch {
82
+ // best effort
83
+ }
84
+ }
85
+ log.debug({ host: conn.host, database: conn.database, rowcount: result.rows.length }, "pg query complete");
86
+ const out = {
87
+ rowcount: result.rowCount ?? result.rows.length,
88
+ rows: result.rows,
89
+ };
90
+ return out;
91
+ }
92
+ finally {
93
+ try {
94
+ await client.end();
95
+ }
96
+ catch {
97
+ // best effort
98
+ }
99
+ }
100
+ },
101
+ };
102
+ //# sourceMappingURL=pg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.js","sourceRoot":"","sources":["../../../../src/uat/probes/sql/pg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * sqlite driver — lazy-loads `better-sqlite3`.
3
+ *
4
+ * v1 sqlite is the only fully-functional driver. Operator runs
5
+ * `harness setup:uat-sql` to install better-sqlite3; smoke skips
6
+ * gracefully if the package is missing.
7
+ */
8
+ import type { SqlDriver } from "./types.js";
9
+ export declare const sqliteDriver: SqlDriver;