@quickchatai/quickreview 0.0.0-stage → 1.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 (1443) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +385 -2
  3. package/THIRD-PARTY-NOTICES.md +134 -0
  4. package/agents/pass-abstraction.md +64 -0
  5. package/agents/pass-ask-human.md +134 -0
  6. package/agents/pass-backcompat.md +67 -0
  7. package/agents/pass-baseline.md +61 -0
  8. package/agents/pass-behaviour-delta.md +64 -0
  9. package/agents/pass-bounds.md +36 -0
  10. package/agents/pass-claims.md +31 -0
  11. package/agents/pass-concurrency.md +168 -0
  12. package/agents/pass-consistency.md +57 -0
  13. package/agents/pass-contracts.md +30 -0
  14. package/agents/pass-data-safety.md +54 -0
  15. package/agents/pass-deferred.md +35 -0
  16. package/agents/pass-delivery.md +37 -0
  17. package/agents/pass-duplication.md +60 -0
  18. package/agents/pass-intent.md +63 -0
  19. package/agents/pass-lint-conformance.md +46 -0
  20. package/agents/pass-maintainability.md +67 -0
  21. package/agents/pass-placement.md +68 -0
  22. package/agents/pass-prod-risk.md +24 -0
  23. package/agents/pass-rollout.md +32 -0
  24. package/agents/pass-roundtrip.md +46 -0
  25. package/agents/pass-security.md +31 -0
  26. package/agents/pass-simplicity.md +68 -0
  27. package/agents/pass-statelessness.md +27 -0
  28. package/agents/pass-style.md +37 -0
  29. package/agents/pass-sweep.md +57 -0
  30. package/agents/pass-tests.md +58 -0
  31. package/agents/pass-ui.md +23 -0
  32. package/agents/pass-validate.md +50 -0
  33. package/agents/pass-widened.md +46 -0
  34. package/agents/scan/pass-scan.md +86 -0
  35. package/bin/qcr.js +11 -0
  36. package/config.example.toml +1067 -0
  37. package/deploy/ansible/README.md +356 -0
  38. package/deploy/ansible/group_vars/all.yml +212 -0
  39. package/deploy/ansible/inventory.example.ini +25 -0
  40. package/deploy/ansible/playbook.yml +360 -0
  41. package/deploy/collect-secrets.sh +289 -0
  42. package/deploy/collect-slack-secrets.mjs +1190 -0
  43. package/deploy/github-app-manifest.json +31 -0
  44. package/deploy/manifest.schema.json +75 -0
  45. package/deploy/qcr-update.sh +803 -0
  46. package/deploy/reviewer/AGENTS.override.md +12 -0
  47. package/dist/extensions/cli/bash-guard-ambient.js +42 -0
  48. package/dist/extensions/cli/bash-guard-ambient.js.map +1 -0
  49. package/dist/extensions/cli/bash-guard.js +5 -0
  50. package/dist/extensions/cli/bash-guard.js.map +1 -0
  51. package/dist/extensions/cli/companion-guard.js +5 -0
  52. package/dist/extensions/cli/companion-guard.js.map +1 -0
  53. package/dist/extensions/cli/debug-round.js +8 -0
  54. package/dist/extensions/cli/debug-round.js.map +1 -0
  55. package/dist/extensions/cli/inject-bridge.js +5 -0
  56. package/dist/extensions/cli/inject-bridge.js.map +1 -0
  57. package/dist/extensions/cli/ledger-pin.js +5 -0
  58. package/dist/extensions/cli/ledger-pin.js.map +1 -0
  59. package/dist/extensions/cli/lens.js +13 -0
  60. package/dist/extensions/cli/lens.js.map +1 -0
  61. package/dist/extensions/cli/muted-theme.js +5 -0
  62. package/dist/extensions/cli/muted-theme.js.map +1 -0
  63. package/dist/extensions/cli/onboarding.js +5 -0
  64. package/dist/extensions/cli/onboarding.js.map +1 -0
  65. package/dist/extensions/cli/setup.js +5 -0
  66. package/dist/extensions/cli/setup.js.map +1 -0
  67. package/dist/extensions/cli/tui-view.js +5 -0
  68. package/dist/extensions/cli/tui-view.js.map +1 -0
  69. package/dist/extensions/companion-guard.js +361 -0
  70. package/dist/extensions/companion-guard.js.map +1 -0
  71. package/dist/extensions/debug-round.js +204 -0
  72. package/dist/extensions/debug-round.js.map +1 -0
  73. package/dist/extensions/inject-bridge.js +603 -0
  74. package/dist/extensions/inject-bridge.js.map +1 -0
  75. package/dist/extensions/muted-theme.js +12 -0
  76. package/dist/extensions/muted-theme.js.map +1 -0
  77. package/dist/extensions/onboarding.js +175 -0
  78. package/dist/extensions/onboarding.js.map +1 -0
  79. package/dist/extensions/setup-replay.js +269 -0
  80. package/dist/extensions/setup-replay.js.map +1 -0
  81. package/dist/extensions/setup-scan.js +998 -0
  82. package/dist/extensions/setup-scan.js.map +1 -0
  83. package/dist/extensions/setup-triage.js +175 -0
  84. package/dist/extensions/setup-triage.js.map +1 -0
  85. package/dist/extensions/setup.js +1160 -0
  86. package/dist/extensions/setup.js.map +1 -0
  87. package/dist/extensions/tui-view.js +389 -0
  88. package/dist/extensions/tui-view.js.map +1 -0
  89. package/dist/extensions/vendor/openviking-pi/client.js +376 -0
  90. package/dist/extensions/vendor/openviking-pi/client.js.map +1 -0
  91. package/dist/extensions/vendor/openviking-pi/config.js +189 -0
  92. package/dist/extensions/vendor/openviking-pi/config.js.map +1 -0
  93. package/dist/extensions/vendor/openviking-pi/index.js +421 -0
  94. package/dist/extensions/vendor/openviking-pi/index.js.map +1 -0
  95. package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +86 -0
  96. package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs.map +1 -0
  97. package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs +408 -0
  98. package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs.map +1 -0
  99. package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +41 -0
  100. package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs.map +1 -0
  101. package/dist/extensions/vendor/openviking-pi/qcr-hint.js +290 -0
  102. package/dist/extensions/vendor/openviking-pi/qcr-hint.js.map +1 -0
  103. package/dist/extensions/vendor/openviking-pi/qcr-honest.js +148 -0
  104. package/dist/extensions/vendor/openviking-pi/qcr-honest.js.map +1 -0
  105. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +68 -0
  106. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -0
  107. package/dist/extensions/vendor/openviking-pi/qcr-leaf.js +77 -0
  108. package/dist/extensions/vendor/openviking-pi/qcr-leaf.js.map +1 -0
  109. package/dist/extensions/vendor/openviking-pi/qcr-lesson.js +216 -0
  110. package/dist/extensions/vendor/openviking-pi/qcr-lesson.js.map +1 -0
  111. package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js +154 -0
  112. package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js.map +1 -0
  113. package/dist/extensions/vendor/openviking-pi/qcr-recall.js +254 -0
  114. package/dist/extensions/vendor/openviking-pi/qcr-recall.js.map +1 -0
  115. package/dist/extensions/vendor/openviking-pi/qcr-shim.js +94 -0
  116. package/dist/extensions/vendor/openviking-pi/qcr-shim.js.map +1 -0
  117. package/dist/extensions/vendor/openviking-pi/qcr-write.js +333 -0
  118. package/dist/extensions/vendor/openviking-pi/qcr-write.js.map +1 -0
  119. package/dist/extensions/vendor/openviking-pi/recall.js +108 -0
  120. package/dist/extensions/vendor/openviking-pi/recall.js.map +1 -0
  121. package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs +529 -0
  122. package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs.map +1 -0
  123. package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs +205 -0
  124. package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs.map +1 -0
  125. package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs +442 -0
  126. package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs.map +1 -0
  127. package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs +286 -0
  128. package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs.map +1 -0
  129. package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +189 -0
  130. package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs.map +1 -0
  131. package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs +580 -0
  132. package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs.map +1 -0
  133. package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs +11 -0
  134. package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs.map +1 -0
  135. package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs +63 -0
  136. package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs.map +1 -0
  137. package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs +58 -0
  138. package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs.map +1 -0
  139. package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
  140. package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs.map +1 -0
  141. package/dist/extensions/vendor/openviking-pi/sync.js +127 -0
  142. package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -0
  143. package/dist/extensions/vendor/openviking-pi/takeover.js +25 -0
  144. package/dist/extensions/vendor/openviking-pi/takeover.js.map +1 -0
  145. package/dist/extensions/vendor/openviking-pi/tools.js +417 -0
  146. package/dist/extensions/vendor/openviking-pi/tools.js.map +1 -0
  147. package/dist/src/anomalies.js +483 -0
  148. package/dist/src/anomalies.js.map +1 -0
  149. package/dist/src/answerworker.js +180 -0
  150. package/dist/src/answerworker.js.map +1 -0
  151. package/dist/src/appstamp.js +68 -0
  152. package/dist/src/appstamp.js.map +1 -0
  153. package/dist/src/archive/admission.js +3 -0
  154. package/dist/src/archive/admission.js.map +1 -0
  155. package/dist/src/archive/archivedb.js +474 -0
  156. package/dist/src/archive/archivedb.js.map +1 -0
  157. package/dist/src/archive/archiver.js +1770 -0
  158. package/dist/src/archive/archiver.js.map +1 -0
  159. package/dist/src/archive/archivewrite.js +198 -0
  160. package/dist/src/archive/archivewrite.js.map +1 -0
  161. package/dist/src/archive/bundle.js +266 -0
  162. package/dist/src/archive/bundle.js.map +1 -0
  163. package/dist/src/archive/dbmove.js +638 -0
  164. package/dist/src/archive/dbmove.js.map +1 -0
  165. package/dist/src/archive/duplicatecounts.js +80 -0
  166. package/dist/src/archive/duplicatecounts.js.map +1 -0
  167. package/dist/src/archive/eligibility.js +113 -0
  168. package/dist/src/archive/eligibility.js.map +1 -0
  169. package/dist/src/archive/extract.js +288 -0
  170. package/dist/src/archive/extract.js.map +1 -0
  171. package/dist/src/archive/fsutil.js +330 -0
  172. package/dist/src/archive/fsutil.js.map +1 -0
  173. package/dist/src/archive/gzfile.js +277 -0
  174. package/dist/src/archive/gzfile.js.map +1 -0
  175. package/dist/src/archive/kinds.js +22 -0
  176. package/dist/src/archive/kinds.js.map +1 -0
  177. package/dist/src/archive/livecheckpoint.js +178 -0
  178. package/dist/src/archive/livecheckpoint.js.map +1 -0
  179. package/dist/src/archive/liveretention.js +145 -0
  180. package/dist/src/archive/liveretention.js.map +1 -0
  181. package/dist/src/archive/manifest.js +284 -0
  182. package/dist/src/archive/manifest.js.map +1 -0
  183. package/dist/src/archive/overseer.js +283 -0
  184. package/dist/src/archive/overseer.js.map +1 -0
  185. package/dist/src/archive/piglobal.js +129 -0
  186. package/dist/src/archive/piglobal.js.map +1 -0
  187. package/dist/src/archive/plan.js +398 -0
  188. package/dist/src/archive/plan.js.map +1 -0
  189. package/dist/src/archive/prarchive.js +831 -0
  190. package/dist/src/archive/prarchive.js.map +1 -0
  191. package/dist/src/archive/prfiles.js +303 -0
  192. package/dist/src/archive/prfiles.js.map +1 -0
  193. package/dist/src/archive/report.js +169 -0
  194. package/dist/src/archive/report.js.map +1 -0
  195. package/dist/src/archive/restore.js +276 -0
  196. package/dist/src/archive/restore.js.map +1 -0
  197. package/dist/src/archive/rows.js +106 -0
  198. package/dist/src/archive/rows.js.map +1 -0
  199. package/dist/src/archive/seal.js +480 -0
  200. package/dist/src/archive/seal.js.map +1 -0
  201. package/dist/src/archive/status.js +528 -0
  202. package/dist/src/archive/status.js.map +1 -0
  203. package/dist/src/archive/storepass.js +409 -0
  204. package/dist/src/archive/storepass.js.map +1 -0
  205. package/dist/src/backfill.js +217 -0
  206. package/dist/src/backfill.js.map +1 -0
  207. package/dist/src/bench/cost.js +87 -0
  208. package/dist/src/bench/exec.js +76 -0
  209. package/dist/src/bench/values.js +14 -0
  210. package/dist/src/botcontrol.js +127 -0
  211. package/dist/src/botcontrol.js.map +1 -0
  212. package/dist/src/botworker.js +805 -0
  213. package/dist/src/botworker.js.map +1 -0
  214. package/dist/src/capture.js +234 -0
  215. package/dist/src/capture.js.map +1 -0
  216. package/dist/src/cases.js +1491 -0
  217. package/dist/src/cases.js.map +1 -0
  218. package/dist/src/channelfs.js +27 -0
  219. package/dist/src/channelfs.js.map +1 -0
  220. package/dist/src/checklist.js +312 -0
  221. package/dist/src/checklist.js.map +1 -0
  222. package/dist/src/ciretry.js +91 -0
  223. package/dist/src/ciretry.js.map +1 -0
  224. package/dist/src/cli.js +1916 -0
  225. package/dist/src/cli.js.map +1 -0
  226. package/dist/src/cliops.js +333 -0
  227. package/dist/src/cliops.js.map +1 -0
  228. package/dist/src/clonedir.js +15 -0
  229. package/dist/src/clonedir.js.map +1 -0
  230. package/dist/src/commandeffects.js +43 -0
  231. package/dist/src/commandeffects.js.map +1 -0
  232. package/dist/src/commands.js +1312 -0
  233. package/dist/src/commands.js.map +1 -0
  234. package/dist/src/companioninbox.js +203 -0
  235. package/dist/src/companioninbox.js.map +1 -0
  236. package/dist/src/compare.js +673 -0
  237. package/dist/src/compare.js.map +1 -0
  238. package/dist/src/config.js +1027 -0
  239. package/dist/src/config.js.map +1 -0
  240. package/dist/src/configcheck.js +111 -0
  241. package/dist/src/configcheck.js.map +1 -0
  242. package/dist/src/coreext.js +43 -0
  243. package/dist/src/coreext.js.map +1 -0
  244. package/dist/src/daemon.js +929 -0
  245. package/dist/src/daemon.js.map +1 -0
  246. package/dist/src/debuground.js +731 -0
  247. package/dist/src/debuground.js.map +1 -0
  248. package/dist/src/debugroundpi.js +219 -0
  249. package/dist/src/debugroundpi.js.map +1 -0
  250. package/dist/src/diagnostics.js +14 -0
  251. package/dist/src/diagnostics.js.map +1 -0
  252. package/dist/src/digest.js +139 -0
  253. package/dist/src/digest.js.map +1 -0
  254. package/dist/src/dispatch.js +1726 -0
  255. package/dist/src/dispatch.js.map +1 -0
  256. package/dist/src/engine/answerguard.js +18 -0
  257. package/dist/src/engine/answerguard.js.map +1 -0
  258. package/dist/src/engine/botsdk.js +262 -0
  259. package/dist/src/engine/botsdk.js.map +1 -0
  260. package/dist/src/engine/caserunner-sdk.js +332 -0
  261. package/dist/src/engine/caserunner-sdk.js.map +1 -0
  262. package/dist/src/engine/debugpi.js +194 -0
  263. package/dist/src/engine/debugpi.js.map +1 -0
  264. package/dist/src/eod.js +473 -0
  265. package/dist/src/eod.js.map +1 -0
  266. package/dist/src/eodpinwatch.js +391 -0
  267. package/dist/src/eodpinwatch.js.map +1 -0
  268. package/dist/src/escalation.js +1009 -0
  269. package/dist/src/escalation.js.map +1 -0
  270. package/dist/src/eventloop.js +779 -0
  271. package/dist/src/eventloop.js.map +1 -0
  272. package/dist/src/execboundary.js +430 -0
  273. package/dist/src/execboundary.js.map +1 -0
  274. package/dist/src/feedback.js +915 -0
  275. package/dist/src/feedback.js.map +1 -0
  276. package/dist/src/findingscheck.js +200 -0
  277. package/dist/src/findingscheck.js.map +1 -0
  278. package/dist/src/fsdenied.js +26 -0
  279. package/dist/src/fsdenied.js.map +1 -0
  280. package/dist/src/ghread.js +181 -0
  281. package/dist/src/ghread.js.map +1 -0
  282. package/dist/src/github.js +1063 -0
  283. package/dist/src/github.js.map +1 -0
  284. package/dist/src/homes.js +103 -0
  285. package/dist/src/homes.js.map +1 -0
  286. package/dist/src/hostroute.js +24 -0
  287. package/dist/src/hostroute.js.map +1 -0
  288. package/dist/src/improvements.js +625 -0
  289. package/dist/src/improvements.js.map +1 -0
  290. package/dist/src/install.js +946 -0
  291. package/dist/src/install.js.map +1 -0
  292. package/dist/src/installkind.js +40 -0
  293. package/dist/src/installkind.js.map +1 -0
  294. package/dist/src/ipc/capability.js +286 -0
  295. package/dist/src/ipc/capability.js.map +1 -0
  296. package/dist/src/ipc/client.js +226 -0
  297. package/dist/src/ipc/client.js.map +1 -0
  298. package/dist/src/ipc/control.js +70 -0
  299. package/dist/src/ipc/control.js.map +1 -0
  300. package/dist/src/ipc/ghreadshim.js +77 -0
  301. package/dist/src/ipc/ghreadshim.js.map +1 -0
  302. package/dist/src/ipc/launcher.js +65 -0
  303. package/dist/src/ipc/launcher.js.map +1 -0
  304. package/dist/src/ipc/permits.js +293 -0
  305. package/dist/src/ipc/permits.js.map +1 -0
  306. package/dist/src/ipc/postshim.js +137 -0
  307. package/dist/src/ipc/postshim.js.map +1 -0
  308. package/dist/src/ipc/protocol.js +239 -0
  309. package/dist/src/ipc/protocol.js.map +1 -0
  310. package/dist/src/ipc/server.js +312 -0
  311. package/dist/src/ipc/server.js.map +1 -0
  312. package/dist/src/ipc/workerspec.js +148 -0
  313. package/dist/src/ipc/workerspec.js.map +1 -0
  314. package/dist/src/learner/learner.js +1272 -0
  315. package/dist/src/learner/learner.js.map +1 -0
  316. package/dist/src/learner/miner.js +948 -0
  317. package/dist/src/learner/miner.js.map +1 -0
  318. package/dist/src/learner/packet.js +216 -0
  319. package/dist/src/learner/packet.js.map +1 -0
  320. package/dist/src/learner/receipt.js +135 -0
  321. package/dist/src/learner/receipt.js.map +1 -0
  322. package/dist/src/learner/status.js +38 -0
  323. package/dist/src/learner/status.js.map +1 -0
  324. package/dist/src/ledgercheck.js +120 -0
  325. package/dist/src/ledgercheck.js.map +1 -0
  326. package/dist/src/lessonledger.js +451 -0
  327. package/dist/src/lessonledger.js.map +1 -0
  328. package/dist/src/lessonselect.js +639 -0
  329. package/dist/src/lessonselect.js.map +1 -0
  330. package/dist/src/lessonshadow.js +540 -0
  331. package/dist/src/lessonshadow.js.map +1 -0
  332. package/dist/src/levers.js +302 -0
  333. package/dist/src/levers.js.map +1 -0
  334. package/dist/src/live/projection.js +450 -0
  335. package/dist/src/live/projection.js.map +1 -0
  336. package/dist/src/live/publish.js +83 -0
  337. package/dist/src/live/publish.js.map +1 -0
  338. package/dist/src/live/read.js +60 -0
  339. package/dist/src/live/read.js.map +1 -0
  340. package/dist/src/livecli.js +288 -0
  341. package/dist/src/livecli.js.map +1 -0
  342. package/dist/src/loginhint.js +42 -0
  343. package/dist/src/loginhint.js.map +1 -0
  344. package/dist/src/loginrefresh/atomic.js +66 -0
  345. package/dist/src/loginrefresh/atomic.js.map +1 -0
  346. package/dist/src/loginrefresh/lock.js +93 -0
  347. package/dist/src/loginrefresh/lock.js.map +1 -0
  348. package/dist/src/loginrefresh/main.js +58 -0
  349. package/dist/src/loginrefresh/main.js.map +1 -0
  350. package/dist/src/loginrefresh/pirefresh.js +49 -0
  351. package/dist/src/loginrefresh/pirefresh.js.map +1 -0
  352. package/dist/src/loginrefresh/refresher.js +286 -0
  353. package/dist/src/loginrefresh/refresher.js.map +1 -0
  354. package/dist/src/loginrefresh/supervisor.js +253 -0
  355. package/dist/src/loginrefresh/supervisor.js.map +1 -0
  356. package/dist/src/loginrefresh/types.js +4 -0
  357. package/dist/src/loginrefresh/types.js.map +1 -0
  358. package/dist/src/memory/context.js +251 -0
  359. package/dist/src/memory/context.js.map +1 -0
  360. package/dist/src/memory/datafence.js +5 -0
  361. package/dist/src/memory/datafence.js.map +1 -0
  362. package/dist/src/memory/delivery.js +131 -0
  363. package/dist/src/memory/delivery.js.map +1 -0
  364. package/dist/src/memory/eventtags.js +81 -0
  365. package/dist/src/memory/eventtags.js.map +1 -0
  366. package/dist/src/memory/health.js +713 -0
  367. package/dist/src/memory/health.js.map +1 -0
  368. package/dist/src/memory/import.js +504 -0
  369. package/dist/src/memory/import.js.map +1 -0
  370. package/dist/src/memory/layout.js +252 -0
  371. package/dist/src/memory/layout.js.map +1 -0
  372. package/dist/src/memory/legacy-file.js +100 -0
  373. package/dist/src/memory/legacy-file.js.map +1 -0
  374. package/dist/src/memory/lessons.js +370 -0
  375. package/dist/src/memory/lessons.js.map +1 -0
  376. package/dist/src/memory/ovsession.js +449 -0
  377. package/dist/src/memory/ovsession.js.map +1 -0
  378. package/dist/src/memory/relayout.js +259 -0
  379. package/dist/src/memory/relayout.js.map +1 -0
  380. package/dist/src/memory/roundactivity.js +180 -0
  381. package/dist/src/memory/roundactivity.js.map +1 -0
  382. package/dist/src/memory/selection.js +690 -0
  383. package/dist/src/memory/selection.js.map +1 -0
  384. package/dist/src/memory/shadowstatus.js +69 -0
  385. package/dist/src/memory/shadowstatus.js.map +1 -0
  386. package/dist/src/memory/store.js +83 -0
  387. package/dist/src/memory/store.js.map +1 -0
  388. package/dist/src/memory/textidentity.js +8 -0
  389. package/dist/src/memory/textidentity.js.map +1 -0
  390. package/dist/src/metrics.js +773 -0
  391. package/dist/src/metrics.js.map +1 -0
  392. package/dist/src/missingconfig.js +8 -0
  393. package/dist/src/missingconfig.js.map +1 -0
  394. package/dist/src/npmverbs.js +226 -0
  395. package/dist/src/npmverbs.js.map +1 -0
  396. package/dist/src/onboard/choices.js +191 -0
  397. package/dist/src/onboard/choices.js.map +1 -0
  398. package/dist/src/onboard/engine.js +344 -0
  399. package/dist/src/onboard/engine.js.map +1 -0
  400. package/dist/src/onboard/launch.js +83 -0
  401. package/dist/src/onboard/launch.js.map +1 -0
  402. package/dist/src/onboard/steps/appslug.js +211 -0
  403. package/dist/src/onboard/steps/appslug.js.map +1 -0
  404. package/dist/src/onboard/steps/bringup.js +408 -0
  405. package/dist/src/onboard/steps/bringup.js.map +1 -0
  406. package/dist/src/onboard/steps/compose.js +343 -0
  407. package/dist/src/onboard/steps/compose.js.map +1 -0
  408. package/dist/src/onboard/steps/configdelivery.js +50 -0
  409. package/dist/src/onboard/steps/configdelivery.js.map +1 -0
  410. package/dist/src/onboard/steps/configfill.js +1148 -0
  411. package/dist/src/onboard/steps/configfill.js.map +1 -0
  412. package/dist/src/onboard/steps/deploysh.js +80 -0
  413. package/dist/src/onboard/steps/deploysh.js.map +1 -0
  414. package/dist/src/onboard/steps/embeddings.js +472 -0
  415. package/dist/src/onboard/steps/embeddings.js.map +1 -0
  416. package/dist/src/onboard/steps/escalation.js +571 -0
  417. package/dist/src/onboard/steps/escalation.js.map +1 -0
  418. package/dist/src/onboard/steps/githubapp.js +1092 -0
  419. package/dist/src/onboard/steps/githubapp.js.map +1 -0
  420. package/dist/src/onboard/steps/golive.js +506 -0
  421. package/dist/src/onboard/steps/golive.js.map +1 -0
  422. package/dist/src/onboard/steps/index.js +67 -0
  423. package/dist/src/onboard/steps/index.js.map +1 -0
  424. package/dist/src/onboard/steps/ingress.js +762 -0
  425. package/dist/src/onboard/steps/ingress.js.map +1 -0
  426. package/dist/src/onboard/steps/inventory.js +420 -0
  427. package/dist/src/onboard/steps/inventory.js.map +1 -0
  428. package/dist/src/onboard/steps/llmauth.js +893 -0
  429. package/dist/src/onboard/steps/llmauth.js.map +1 -0
  430. package/dist/src/onboard/steps/memory.js +1060 -0
  431. package/dist/src/onboard/steps/memory.js.map +1 -0
  432. package/dist/src/onboard/steps/memorykeys.js +43 -0
  433. package/dist/src/onboard/steps/memorykeys.js.map +1 -0
  434. package/dist/src/onboard/steps/preflight.js +172 -0
  435. package/dist/src/onboard/steps/preflight.js.map +1 -0
  436. package/dist/src/onboard/steps/proof.js +502 -0
  437. package/dist/src/onboard/steps/proof.js.map +1 -0
  438. package/dist/src/onboard/steps/ssh.js +300 -0
  439. package/dist/src/onboard/steps/ssh.js.map +1 -0
  440. package/dist/src/onboard/steps/topology.js +291 -0
  441. package/dist/src/onboard/steps/topology.js.map +1 -0
  442. package/dist/src/onboard/steps/transport.js +511 -0
  443. package/dist/src/onboard/steps/transport.js.map +1 -0
  444. package/dist/src/onboard/steps/verifyup.js +362 -0
  445. package/dist/src/onboard/steps/verifyup.js.map +1 -0
  446. package/dist/src/onboard/steps/vmdeploy.js +368 -0
  447. package/dist/src/onboard/steps/vmdeploy.js.map +1 -0
  448. package/dist/src/onboard/toml.js +53 -0
  449. package/dist/src/onboard/toml.js.map +1 -0
  450. package/dist/src/opencli.js +508 -0
  451. package/dist/src/opencli.js.map +1 -0
  452. package/dist/src/openpr.js +457 -0
  453. package/dist/src/openpr.js.map +1 -0
  454. package/dist/src/openviking/client.js +821 -0
  455. package/dist/src/openviking/client.js.map +1 -0
  456. package/dist/src/openviking/context.js +218 -0
  457. package/dist/src/openviking/context.js.map +1 -0
  458. package/dist/src/openviking/embedder.js +457 -0
  459. package/dist/src/openviking/embedder.js.map +1 -0
  460. package/dist/src/openviking/gapsink.js +38 -0
  461. package/dist/src/openviking/gapsink.js.map +1 -0
  462. package/dist/src/openviking/health.js +69 -0
  463. package/dist/src/openviking/health.js.map +1 -0
  464. package/dist/src/openviking/index.js +24 -0
  465. package/dist/src/openviking/index.js.map +1 -0
  466. package/dist/src/openviking/lessonfind.js +54 -0
  467. package/dist/src/openviking/lessonfind.js.map +1 -0
  468. package/dist/src/openviking/probe.js +89 -0
  469. package/dist/src/openviking/probe.js.map +1 -0
  470. package/dist/src/openviking/proc.js +95 -0
  471. package/dist/src/openviking/proc.js.map +1 -0
  472. package/dist/src/openviking/provisionreport.js +144 -0
  473. package/dist/src/openviking/provisionreport.js.map +1 -0
  474. package/dist/src/openviking/reembed.js +317 -0
  475. package/dist/src/openviking/reembed.js.map +1 -0
  476. package/dist/src/openviking/relayout.js +153 -0
  477. package/dist/src/openviking/relayout.js.map +1 -0
  478. package/dist/src/openviking/sidecar-main.js +39 -0
  479. package/dist/src/openviking/sidecar-main.js.map +1 -0
  480. package/dist/src/openviking/sidecar.js +79 -0
  481. package/dist/src/openviking/sidecar.js.map +1 -0
  482. package/dist/src/openviking/store.js +1758 -0
  483. package/dist/src/openviking/store.js.map +1 -0
  484. package/dist/src/openviking/supervisor.js +422 -0
  485. package/dist/src/openviking/supervisor.js.map +1 -0
  486. package/dist/src/openviking/types.js +5 -0
  487. package/dist/src/openviking/types.js.map +1 -0
  488. package/dist/src/operator-recovery.js +172 -0
  489. package/dist/src/operator-recovery.js.map +1 -0
  490. package/dist/src/operatormessage.js +44 -0
  491. package/dist/src/operatormessage.js.map +1 -0
  492. package/dist/src/outcomes.js +1361 -0
  493. package/dist/src/outcomes.js.map +1 -0
  494. package/dist/src/piauthcopy.js +5 -0
  495. package/dist/src/piauthcopy.js.map +1 -0
  496. package/dist/src/picli.js +45 -0
  497. package/dist/src/picli.js.map +1 -0
  498. package/dist/src/picwd.js +25 -0
  499. package/dist/src/picwd.js.map +1 -0
  500. package/dist/src/pilogin.js +35 -0
  501. package/dist/src/pilogin.js.map +1 -0
  502. package/dist/src/pingpong.js +1028 -0
  503. package/dist/src/pingpong.js.map +1 -0
  504. package/dist/src/posting-journal.js +441 -0
  505. package/dist/src/posting-journal.js.map +1 -0
  506. package/dist/src/posting-outbox.js +662 -0
  507. package/dist/src/posting-outbox.js.map +1 -0
  508. package/dist/src/posting-receipt.js +203 -0
  509. package/dist/src/posting-receipt.js.map +1 -0
  510. package/dist/src/posting.js +348 -0
  511. package/dist/src/posting.js.map +1 -0
  512. package/dist/src/postops.js +637 -0
  513. package/dist/src/postops.js.map +1 -0
  514. package/dist/src/pr-activity.js +11 -0
  515. package/dist/src/pr-activity.js.map +1 -0
  516. package/dist/src/pr-author.js +5 -0
  517. package/dist/src/pr-author.js.map +1 -0
  518. package/dist/src/pr-conversation.js +355 -0
  519. package/dist/src/pr-conversation.js.map +1 -0
  520. package/dist/src/pr-session-lifecycle.js +542 -0
  521. package/dist/src/pr-session-lifecycle.js.map +1 -0
  522. package/dist/src/preflight.js +341 -0
  523. package/dist/src/preflight.js.map +1 -0
  524. package/dist/src/priorresolve.js +275 -0
  525. package/dist/src/priorresolve.js.map +1 -0
  526. package/dist/src/qcrbin.js +180 -0
  527. package/dist/src/qcrbin.js.map +1 -0
  528. package/dist/src/recheck.js +1398 -0
  529. package/dist/src/recheck.js.map +1 -0
  530. package/dist/src/reconcile.js +820 -0
  531. package/dist/src/reconcile.js.map +1 -0
  532. package/dist/src/recordedfindings.js +15 -0
  533. package/dist/src/recordedfindings.js.map +1 -0
  534. package/dist/src/regression.js +546 -0
  535. package/dist/src/regression.js.map +1 -0
  536. package/dist/src/replay.js +598 -0
  537. package/dist/src/replay.js.map +1 -0
  538. package/dist/src/requiredpasses.js +113 -0
  539. package/dist/src/requiredpasses.js.map +1 -0
  540. package/dist/src/resumecheck.js +168 -0
  541. package/dist/src/resumecheck.js.map +1 -0
  542. package/dist/src/reviewcli.js +671 -0
  543. package/dist/src/reviewcli.js.map +1 -0
  544. package/dist/src/reviewcontext.js +22 -0
  545. package/dist/src/reviewcontext.js.map +1 -0
  546. package/dist/src/reviewdetach.js +574 -0
  547. package/dist/src/reviewdetach.js.map +1 -0
  548. package/dist/src/reviewhistory.js +284 -0
  549. package/dist/src/reviewhistory.js.map +1 -0
  550. package/dist/src/reviewhome.js +26 -0
  551. package/dist/src/reviewhome.js.map +1 -0
  552. package/dist/src/reviewmemory.js +110 -0
  553. package/dist/src/reviewmemory.js.map +1 -0
  554. package/dist/src/reviewrendercli.js +104 -0
  555. package/dist/src/reviewrendercli.js.map +1 -0
  556. package/dist/src/round-work.js +20 -0
  557. package/dist/src/round-work.js.map +1 -0
  558. package/dist/src/runhost.js +72 -0
  559. package/dist/src/runhost.js.map +1 -0
  560. package/dist/src/scanauth.js +25 -0
  561. package/dist/src/scanauth.js.map +1 -0
  562. package/dist/src/scanbox.js +846 -0
  563. package/dist/src/scanbox.js.map +1 -0
  564. package/dist/src/scancli.js +1074 -0
  565. package/dist/src/scancli.js.map +1 -0
  566. package/dist/src/scandriverlog.js +30 -0
  567. package/dist/src/scandriverlog.js.map +1 -0
  568. package/dist/src/session-bridge.js +75 -0
  569. package/dist/src/session-bridge.js.map +1 -0
  570. package/dist/src/session-command-payload.js +29 -0
  571. package/dist/src/session-command-payload.js.map +1 -0
  572. package/dist/src/session-command-supervisor.js +939 -0
  573. package/dist/src/session-command-supervisor.js.map +1 -0
  574. package/dist/src/sessionjsonl.js +85 -0
  575. package/dist/src/sessionjsonl.js.map +1 -0
  576. package/dist/src/sessions.js +541 -0
  577. package/dist/src/sessions.js.map +1 -0
  578. package/dist/src/setup/adapters.js +330 -0
  579. package/dist/src/setup/adapters.js.map +1 -0
  580. package/dist/src/setup/baselines.js +64 -0
  581. package/dist/src/setup/baselines.js.map +1 -0
  582. package/dist/src/setup/caserunner.js +554 -0
  583. package/dist/src/setup/caserunner.js.map +1 -0
  584. package/dist/src/setup/configcommit.js +358 -0
  585. package/dist/src/setup/configcommit.js.map +1 -0
  586. package/dist/src/setup/engine.js +672 -0
  587. package/dist/src/setup/engine.js.map +1 -0
  588. package/dist/src/setup/facts.js +593 -0
  589. package/dist/src/setup/facts.js.map +1 -0
  590. package/dist/src/setup/findings.js +948 -0
  591. package/dist/src/setup/findings.js.map +1 -0
  592. package/dist/src/setup/history.js +338 -0
  593. package/dist/src/setup/history.js.map +1 -0
  594. package/dist/src/setup/interview.js +185 -0
  595. package/dist/src/setup/interview.js.map +1 -0
  596. package/dist/src/setup/ledger.js +207 -0
  597. package/dist/src/setup/ledger.js.map +1 -0
  598. package/dist/src/setup/pins.js +43 -0
  599. package/dist/src/setup/pins.js.map +1 -0
  600. package/dist/src/setup/portrait.js +432 -0
  601. package/dist/src/setup/portrait.js.map +1 -0
  602. package/dist/src/setup/presentation.js +9 -0
  603. package/dist/src/setup/presentation.js.map +1 -0
  604. package/dist/src/setup/profile.js +417 -0
  605. package/dist/src/setup/profile.js.map +1 -0
  606. package/dist/src/setup/replay.js +240 -0
  607. package/dist/src/setup/replay.js.map +1 -0
  608. package/dist/src/setup/replaybuild.js +311 -0
  609. package/dist/src/setup/replaybuild.js.map +1 -0
  610. package/dist/src/setup/replayrun.js +806 -0
  611. package/dist/src/setup/replayrun.js.map +1 -0
  612. package/dist/src/setup/replaysource.js +169 -0
  613. package/dist/src/setup/replaysource.js.map +1 -0
  614. package/dist/src/setup/retune.js +333 -0
  615. package/dist/src/setup/retune.js.map +1 -0
  616. package/dist/src/setup/retunelog.js +51 -0
  617. package/dist/src/setup/retunelog.js.map +1 -0
  618. package/dist/src/setup/scan.js +725 -0
  619. package/dist/src/setup/scan.js.map +1 -0
  620. package/dist/src/setup/scanbuild.js +133 -0
  621. package/dist/src/setup/scanbuild.js.map +1 -0
  622. package/dist/src/setup/scanfacts.js +96 -0
  623. package/dist/src/setup/scanfacts.js.map +1 -0
  624. package/dist/src/setup/scanlease.js +251 -0
  625. package/dist/src/setup/scanlease.js.map +1 -0
  626. package/dist/src/setup/scanreport.js +289 -0
  627. package/dist/src/setup/scanreport.js.map +1 -0
  628. package/dist/src/setup/scanrun.js +1733 -0
  629. package/dist/src/setup/scanrun.js.map +1 -0
  630. package/dist/src/setup/scantree.js +257 -0
  631. package/dist/src/setup/scantree.js.map +1 -0
  632. package/dist/src/setup/stage2.js +617 -0
  633. package/dist/src/setup/stage2.js.map +1 -0
  634. package/dist/src/setup/stage2request.js +259 -0
  635. package/dist/src/setup/stage2request.js.map +1 -0
  636. package/dist/src/setup/survey.js +307 -0
  637. package/dist/src/setup/survey.js.map +1 -0
  638. package/dist/src/setup/surveyrun.js +549 -0
  639. package/dist/src/setup/surveyrun.js.map +1 -0
  640. package/dist/src/setup/textsniff.js +89 -0
  641. package/dist/src/setup/textsniff.js.map +1 -0
  642. package/dist/src/setup/trackersink.js +395 -0
  643. package/dist/src/setup/trackersink.js.map +1 -0
  644. package/dist/src/setup/triage.js +636 -0
  645. package/dist/src/setup/triage.js.map +1 -0
  646. package/dist/src/setup/tuning.js +585 -0
  647. package/dist/src/setup/tuning.js.map +1 -0
  648. package/dist/src/setup/unitcut.js +437 -0
  649. package/dist/src/setup/unitcut.js.map +1 -0
  650. package/dist/src/singleflight.js +72 -0
  651. package/dist/src/singleflight.js.map +1 -0
  652. package/dist/src/slack/announce.js +725 -0
  653. package/dist/src/slack/announce.js.map +1 -0
  654. package/dist/src/slack/api.js +227 -0
  655. package/dist/src/slack/api.js.map +1 -0
  656. package/dist/src/slack/messages.js +158 -0
  657. package/dist/src/slack/messages.js.map +1 -0
  658. package/dist/src/slack/origin.js +550 -0
  659. package/dist/src/slack/origin.js.map +1 -0
  660. package/dist/src/slack/policy.js +225 -0
  661. package/dist/src/slack/policy.js.map +1 -0
  662. package/dist/src/slack/reply.js +153 -0
  663. package/dist/src/slack/reply.js.map +1 -0
  664. package/dist/src/slack/router.js +189 -0
  665. package/dist/src/slack/router.js.map +1 -0
  666. package/dist/src/slack/socket.js +323 -0
  667. package/dist/src/slack/socket.js.map +1 -0
  668. package/dist/src/slack/types.js +11 -0
  669. package/dist/src/slack/types.js.map +1 -0
  670. package/dist/src/sqlitehint.js +30 -0
  671. package/dist/src/sqlitehint.js.map +1 -0
  672. package/dist/src/ssh-observation.js +25 -0
  673. package/dist/src/ssh-observation.js.map +1 -0
  674. package/dist/src/state.js +5869 -0
  675. package/dist/src/state.js.map +1 -0
  676. package/dist/src/statemachine.js +220 -0
  677. package/dist/src/statemachine.js.map +1 -0
  678. package/dist/src/stubs.js +52 -0
  679. package/dist/src/stubs.js.map +1 -0
  680. package/dist/src/takeover.js +506 -0
  681. package/dist/src/takeover.js.map +1 -0
  682. package/dist/src/takeoverpi.js +249 -0
  683. package/dist/src/takeoverpi.js.map +1 -0
  684. package/dist/src/terminal-failure.js +26 -0
  685. package/dist/src/terminal-failure.js.map +1 -0
  686. package/dist/src/thread-resolution-refusal.js +4 -0
  687. package/dist/src/thread-resolution-refusal.js.map +1 -0
  688. package/dist/src/tmux.js +126 -0
  689. package/dist/src/tmux.js.map +1 -0
  690. package/dist/src/trackerid.js +43 -0
  691. package/dist/src/trackerid.js.map +1 -0
  692. package/dist/src/transcriptindex.js +512 -0
  693. package/dist/src/transcriptindex.js.map +1 -0
  694. package/dist/src/tui/actions.js +404 -0
  695. package/dist/src/tui/actions.js.map +1 -0
  696. package/dist/src/tui/alerts.js +523 -0
  697. package/dist/src/tui/alerts.js.map +1 -0
  698. package/dist/src/tui/app.js +1835 -0
  699. package/dist/src/tui/app.js.map +1 -0
  700. package/dist/src/tui/archiveops.js +164 -0
  701. package/dist/src/tui/archiveops.js.map +1 -0
  702. package/dist/src/tui/autofile.js +191 -0
  703. package/dist/src/tui/autofile.js.map +1 -0
  704. package/dist/src/tui/board.js +1143 -0
  705. package/dist/src/tui/board.js.map +1 -0
  706. package/dist/src/tui/candidates.js +699 -0
  707. package/dist/src/tui/candidates.js.map +1 -0
  708. package/dist/src/tui/cellwidth.js +151 -0
  709. package/dist/src/tui/cellwidth.js.map +1 -0
  710. package/dist/src/tui/changelog-store.js +404 -0
  711. package/dist/src/tui/changelog-store.js.map +1 -0
  712. package/dist/src/tui/chord.js +26 -0
  713. package/dist/src/tui/chord.js.map +1 -0
  714. package/dist/src/tui/clipboard.js +81 -0
  715. package/dist/src/tui/clipboard.js.map +1 -0
  716. package/dist/src/tui/cmdbar.js +253 -0
  717. package/dist/src/tui/cmdbar.js.map +1 -0
  718. package/dist/src/tui/companion.js +1275 -0
  719. package/dist/src/tui/companion.js.map +1 -0
  720. package/dist/src/tui/companionplan.js +200 -0
  721. package/dist/src/tui/companionplan.js.map +1 -0
  722. package/dist/src/tui/companiontab.js +61 -0
  723. package/dist/src/tui/companiontab.js.map +1 -0
  724. package/dist/src/tui/confighome.js +105 -0
  725. package/dist/src/tui/confighome.js.map +1 -0
  726. package/dist/src/tui/connect.js +44 -0
  727. package/dist/src/tui/connect.js.map +1 -0
  728. package/dist/src/tui/deploy-ceremony.js +75 -0
  729. package/dist/src/tui/deploy-ceremony.js.map +1 -0
  730. package/dist/src/tui/deploy-drain.js +93 -0
  731. package/dist/src/tui/deploy-drain.js.map +1 -0
  732. package/dist/src/tui/deploy-process.js +234 -0
  733. package/dist/src/tui/deploy-process.js.map +1 -0
  734. package/dist/src/tui/deploytab.js +1263 -0
  735. package/dist/src/tui/deploytab.js.map +1 -0
  736. package/dist/src/tui/design.js +111 -0
  737. package/dist/src/tui/design.js.map +1 -0
  738. package/dist/src/tui/digesttab.js +148 -0
  739. package/dist/src/tui/digesttab.js.map +1 -0
  740. package/dist/src/tui/emptystate.js +32 -0
  741. package/dist/src/tui/emptystate.js.map +1 -0
  742. package/dist/src/tui/evidence.js +790 -0
  743. package/dist/src/tui/evidence.js.map +1 -0
  744. package/dist/src/tui/feed.js +415 -0
  745. package/dist/src/tui/feed.js.map +1 -0
  746. package/dist/src/tui/feedbacktab.js +907 -0
  747. package/dist/src/tui/feedbacktab.js.map +1 -0
  748. package/dist/src/tui/filters.js +72 -0
  749. package/dist/src/tui/filters.js.map +1 -0
  750. package/dist/src/tui/ghread.js +272 -0
  751. package/dist/src/tui/ghread.js.map +1 -0
  752. package/dist/src/tui/historypull.js +61 -0
  753. package/dist/src/tui/historypull.js.map +1 -0
  754. package/dist/src/tui/inboxpull.js +197 -0
  755. package/dist/src/tui/inboxpull.js.map +1 -0
  756. package/dist/src/tui/index.js +1425 -0
  757. package/dist/src/tui/index.js.map +1 -0
  758. package/dist/src/tui/issuesink.js +206 -0
  759. package/dist/src/tui/issuesink.js.map +1 -0
  760. package/dist/src/tui/jsonfile.js +32 -0
  761. package/dist/src/tui/jsonfile.js.map +1 -0
  762. package/dist/src/tui/keys.js +97 -0
  763. package/dist/src/tui/keys.js.map +1 -0
  764. package/dist/src/tui/layout.js +70 -0
  765. package/dist/src/tui/layout.js.map +1 -0
  766. package/dist/src/tui/learning.js +469 -0
  767. package/dist/src/tui/learning.js.map +1 -0
  768. package/dist/src/tui/lessonswitch.js +103 -0
  769. package/dist/src/tui/lessonswitch.js.map +1 -0
  770. package/dist/src/tui/livecontrol.js +167 -0
  771. package/dist/src/tui/livecontrol.js.map +1 -0
  772. package/dist/src/tui/memforward.js +310 -0
  773. package/dist/src/tui/memforward.js.map +1 -0
  774. package/dist/src/tui/memincident.js +287 -0
  775. package/dist/src/tui/memincident.js.map +1 -0
  776. package/dist/src/tui/memory.js +485 -0
  777. package/dist/src/tui/memory.js.map +1 -0
  778. package/dist/src/tui/memtab.js +513 -0
  779. package/dist/src/tui/memtab.js.map +1 -0
  780. package/dist/src/tui/metricstab.js +979 -0
  781. package/dist/src/tui/metricstab.js.map +1 -0
  782. package/dist/src/tui/model.js +104 -0
  783. package/dist/src/tui/model.js.map +1 -0
  784. package/dist/src/tui/mouse.js +83 -0
  785. package/dist/src/tui/mouse.js.map +1 -0
  786. package/dist/src/tui/msg.js +196 -0
  787. package/dist/src/tui/msg.js.map +1 -0
  788. package/dist/src/tui/nativecompanion.js +321 -0
  789. package/dist/src/tui/nativecompanion.js.map +1 -0
  790. package/dist/src/tui/openurl.js +17 -0
  791. package/dist/src/tui/openurl.js.map +1 -0
  792. package/dist/src/tui/paint.js +501 -0
  793. package/dist/src/tui/paint.js.map +1 -0
  794. package/dist/src/tui/panes.js +74 -0
  795. package/dist/src/tui/panes.js.map +1 -0
  796. package/dist/src/tui/pipane.js +166 -0
  797. package/dist/src/tui/pipane.js.map +1 -0
  798. package/dist/src/tui/poll-hooks.js +11 -0
  799. package/dist/src/tui/poll-hooks.js.map +1 -0
  800. package/dist/src/tui/poll.js +113 -0
  801. package/dist/src/tui/poll.js.map +1 -0
  802. package/dist/src/tui/proposals.js +715 -0
  803. package/dist/src/tui/proposals.js.map +1 -0
  804. package/dist/src/tui/prpause.js +132 -0
  805. package/dist/src/tui/prpause.js.map +1 -0
  806. package/dist/src/tui/reload.js +351 -0
  807. package/dist/src/tui/reload.js.map +1 -0
  808. package/dist/src/tui/remote.js +312 -0
  809. package/dist/src/tui/remote.js.map +1 -0
  810. package/dist/src/tui/rollover.js +767 -0
  811. package/dist/src/tui/rollover.js.map +1 -0
  812. package/dist/src/tui/scantab.js +1053 -0
  813. package/dist/src/tui/scantab.js.map +1 -0
  814. package/dist/src/tui/setupentry.js +81 -0
  815. package/dist/src/tui/setupentry.js.map +1 -0
  816. package/dist/src/tui/sidebar.js +602 -0
  817. package/dist/src/tui/sidebar.js.map +1 -0
  818. package/dist/src/tui/sshtriage.js +393 -0
  819. package/dist/src/tui/sshtriage.js.map +1 -0
  820. package/dist/src/tui/startup.js +172 -0
  821. package/dist/src/tui/startup.js.map +1 -0
  822. package/dist/src/tui/tabs.js +41 -0
  823. package/dist/src/tui/tabs.js.map +1 -0
  824. package/dist/src/tui/termmirror.js +217 -0
  825. package/dist/src/tui/termmirror.js.map +1 -0
  826. package/dist/src/tui/theme.js +95 -0
  827. package/dist/src/tui/theme.js.map +1 -0
  828. package/dist/src/tui/ticketstab.js +224 -0
  829. package/dist/src/tui/ticketstab.js.map +1 -0
  830. package/dist/src/tui/tmuxsocket.js +101 -0
  831. package/dist/src/tui/tmuxsocket.js.map +1 -0
  832. package/dist/src/tui/trackertickets.js +77 -0
  833. package/dist/src/tui/trackertickets.js.map +1 -0
  834. package/dist/src/tui/unwedge.js +245 -0
  835. package/dist/src/tui/unwedge.js.map +1 -0
  836. package/dist/src/tui/viewer.js +479 -0
  837. package/dist/src/tui/viewer.js.map +1 -0
  838. package/dist/src/tui/viewerinput.js +125 -0
  839. package/dist/src/tui/viewerinput.js.map +1 -0
  840. package/dist/src/updatenotice.js +143 -0
  841. package/dist/src/updatenotice.js.map +1 -0
  842. package/dist/src/usage.js +1007 -0
  843. package/dist/src/usage.js.map +1 -0
  844. package/dist/src/verdicts.js +3848 -0
  845. package/dist/src/verdicts.js.map +1 -0
  846. package/dist/src/version.js +58 -0
  847. package/dist/src/version.js.map +1 -0
  848. package/dist/src/wakes.js +411 -0
  849. package/dist/src/wakes.js.map +1 -0
  850. package/dist/src/webhook.js +725 -0
  851. package/dist/src/webhook.js.map +1 -0
  852. package/dist/src/webhookheal.js +238 -0
  853. package/dist/src/webhookheal.js.map +1 -0
  854. package/dist/src/wire.js +1801 -0
  855. package/dist/src/wire.js.map +1 -0
  856. package/dist/src/worker-session-host.js +531 -0
  857. package/dist/src/worker-session-host.js.map +1 -0
  858. package/dist/src/workerbreaker.js +112 -0
  859. package/dist/src/workerbreaker.js.map +1 -0
  860. package/dist/src/workercontrol.js +49 -0
  861. package/dist/src/workercontrol.js.map +1 -0
  862. package/dist/src/workerlease.js +351 -0
  863. package/dist/src/workerlease.js.map +1 -0
  864. package/dist/src/workerliveness.js +84 -0
  865. package/dist/src/workerliveness.js.map +1 -0
  866. package/dist/src/workerlog.js +65 -0
  867. package/dist/src/workerlog.js.map +1 -0
  868. package/dist/src/workerruntime.js +10 -0
  869. package/dist/src/workerruntime.js.map +1 -0
  870. package/dist/src/workersupervisor.js +1206 -0
  871. package/dist/src/workersupervisor.js.map +1 -0
  872. package/dist/src/workerusage.js +23 -0
  873. package/dist/src/workerusage.js.map +1 -0
  874. package/dist/src/workerworld.js +332 -0
  875. package/dist/src/workerworld.js.map +1 -0
  876. package/dist/src/worktrees.js +984 -0
  877. package/dist/src/worktrees.js.map +1 -0
  878. package/docker/Dockerfile +284 -0
  879. package/docker/Dockerfile.dockerignore +35 -0
  880. package/docker/README.md +221 -0
  881. package/docker/companion/Dockerfile +139 -0
  882. package/docker/companion/agents/evidence.md +34 -0
  883. package/docker/companion/agents/explore.md +26 -0
  884. package/docker/companion/agents/pass-survey.md +49 -0
  885. package/docker/companion/agents/study.md +26 -0
  886. package/docker/companion/entrypoint.sh +343 -0
  887. package/docker/companion/memory-health.mjs +269 -0
  888. package/docker/entrypoint.sh +782 -0
  889. package/docker/memory/Dockerfile +191 -0
  890. package/docker/memory/Dockerfile.dockerignore +20 -0
  891. package/docker/memory/README.md +60 -0
  892. package/docker/memory/entrypoint.sh +163 -0
  893. package/docker/setid/qcr-setid.c +109 -0
  894. package/docker/tunnel/Dockerfile.cloudflared +51 -0
  895. package/docker/tunnel/Dockerfile.ngrok +40 -0
  896. package/docker/tunnel/sidecar.mjs +411 -0
  897. package/docker/vm/tmux.conf +26 -0
  898. package/docker-compose.yml +348 -0
  899. package/extensions/cli/bash-guard-ambient.ts +71 -0
  900. package/extensions/cli/bash-guard.ts +12 -0
  901. package/extensions/cli/companion-guard.ts +8 -0
  902. package/extensions/cli/debug-round.ts +9 -0
  903. package/extensions/cli/inject-bridge.ts +8 -0
  904. package/extensions/cli/ledger-pin.ts +13 -0
  905. package/extensions/cli/lens.ts +22 -0
  906. package/extensions/cli/muted-theme.ts +9 -0
  907. package/extensions/cli/onboarding.ts +8 -0
  908. package/extensions/cli/setup.ts +8 -0
  909. package/extensions/cli/tui-view.ts +8 -0
  910. package/extensions/companion-guard.ts +411 -0
  911. package/extensions/debug-round.ts +281 -0
  912. package/extensions/inject-bridge.ts +630 -0
  913. package/extensions/inline-bash.ts +102 -0
  914. package/extensions/muted-theme.json +68 -0
  915. package/extensions/muted-theme.ts +23 -0
  916. package/extensions/onboarding.ts +233 -0
  917. package/extensions/setup-replay.ts +336 -0
  918. package/extensions/setup-scan.ts +1236 -0
  919. package/extensions/setup-triage.ts +190 -0
  920. package/extensions/setup.ts +1428 -0
  921. package/extensions/tui-view.ts +489 -0
  922. package/extensions/vendor/openviking-pi/LICENSE +201 -0
  923. package/extensions/vendor/openviking-pi/NOTICE +68 -0
  924. package/extensions/vendor/openviking-pi/README.md +550 -0
  925. package/extensions/vendor/openviking-pi/client.ts +588 -0
  926. package/extensions/vendor/openviking-pi/config.json +28 -0
  927. package/extensions/vendor/openviking-pi/config.ts +271 -0
  928. package/extensions/vendor/openviking-pi/index.ts +523 -0
  929. package/extensions/vendor/openviking-pi/lib/capture-adapter.d.mts +10 -0
  930. package/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +88 -0
  931. package/extensions/vendor/openviking-pi/lib/takeover-core.d.mts +80 -0
  932. package/extensions/vendor/openviking-pi/lib/takeover-core.mjs +406 -0
  933. package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.d.mts +1 -0
  934. package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +42 -0
  935. package/extensions/vendor/openviking-pi/patches/0000-vendoring-and-build-conformance.patch +726 -0
  936. package/extensions/vendor/openviking-pi/patches/0001-remove-session-before-compact-handler.patch +101 -0
  937. package/extensions/vendor/openviking-pi/patches/0002-no-ambient-work-in-subagent-leaves.patch +202 -0
  938. package/extensions/vendor/openviking-pi/patches/0003-never-auto-create-openviking-sessions.patch +120 -0
  939. package/extensions/vendor/openviking-pi/patches/0004-viking-write-durable-batch-write.patch +521 -0
  940. package/extensions/vendor/openviking-pi/patches/0005-second-memory-namespace.patch +786 -0
  941. package/extensions/vendor/openviking-pi/patches/0006-writes-that-stick-and-honest-errors.patch +996 -0
  942. package/extensions/vendor/openviking-pi/patches/0007-bounded-recall-no-commit.patch +794 -0
  943. package/extensions/vendor/openviking-pi/patches/0008-pr-derived-recall.patch +379 -0
  944. package/extensions/vendor/openviking-pi/patches/0009-pr-session-tools-in-round-areas.patch +375 -0
  945. package/extensions/vendor/openviking-pi/patches/0010-typed-lessons.patch +448 -0
  946. package/extensions/vendor/openviking-pi/patches/0011-review-session-memory-boundary.patch +382 -0
  947. package/extensions/vendor/openviking-pi/patches/0012-typecheck-against-the-real-pi.patch +129 -0
  948. package/extensions/vendor/openviking-pi/patches/0013-createopenviking-factory.patch +1168 -0
  949. package/extensions/vendor/openviking-pi/qcr-hint.ts +313 -0
  950. package/extensions/vendor/openviking-pi/qcr-honest.ts +183 -0
  951. package/extensions/vendor/openviking-pi/qcr-hooks.ts +87 -0
  952. package/extensions/vendor/openviking-pi/qcr-leaf.ts +78 -0
  953. package/extensions/vendor/openviking-pi/qcr-lesson.ts +231 -0
  954. package/extensions/vendor/openviking-pi/qcr-namespaces.ts +198 -0
  955. package/extensions/vendor/openviking-pi/qcr-recall.ts +288 -0
  956. package/extensions/vendor/openviking-pi/qcr-shim.ts +142 -0
  957. package/extensions/vendor/openviking-pi/qcr-write.ts +427 -0
  958. package/extensions/vendor/openviking-pi/recall.ts +149 -0
  959. package/extensions/vendor/openviking-pi/shared/capture-utils.d.mts +9 -0
  960. package/extensions/vendor/openviking-pi/shared/capture-utils.mjs +515 -0
  961. package/extensions/vendor/openviking-pi/shared/credentials.d.mts +14 -0
  962. package/extensions/vendor/openviking-pi/shared/credentials.mjs +228 -0
  963. package/extensions/vendor/openviking-pi/shared/pending-queue.d.mts +19 -0
  964. package/extensions/vendor/openviking-pi/shared/pending-queue.mjs +458 -0
  965. package/extensions/vendor/openviking-pi/shared/profile-inject.d.mts +17 -0
  966. package/extensions/vendor/openviking-pi/shared/profile-inject.mjs +294 -0
  967. package/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +195 -0
  968. package/extensions/vendor/openviking-pi/shared/recall-core.d.mts +13 -0
  969. package/extensions/vendor/openviking-pi/shared/recall-core.mjs +609 -0
  970. package/extensions/vendor/openviking-pi/shared/retryable.mjs +9 -0
  971. package/extensions/vendor/openviking-pi/shared/session-model.d.mts +3 -0
  972. package/extensions/vendor/openviking-pi/shared/session-model.mjs +57 -0
  973. package/extensions/vendor/openviking-pi/shared/uri-guard.mjs +56 -0
  974. package/extensions/vendor/openviking-pi/shared/workspace-peer.d.mts +5 -0
  975. package/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
  976. package/extensions/vendor/openviking-pi/sync.ts +163 -0
  977. package/extensions/vendor/openviking-pi/takeover.ts +36 -0
  978. package/extensions/vendor/openviking-pi/tools.ts +479 -0
  979. package/extensions/vendor/openviking-pi/upstream.json +48 -0
  980. package/package.json +138 -4
  981. package/profiles/default/README.md +21 -0
  982. package/profiles/default/addenda/.gitkeep +0 -0
  983. package/profiles/default/profile.toml +17 -0
  984. package/profiles/example-django/README.md +21 -0
  985. package/profiles/example-django/addenda/10-migration-discipline.md +13 -0
  986. package/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
  987. package/profiles/example-django/addenda/30-test-doctrine.md +12 -0
  988. package/profiles/example-django/addenda/40-orm-usage.md +19 -0
  989. package/profiles/example-django/addenda/50-declared-shape.md +10 -0
  990. package/profiles/example-django/addenda/60-config-placement.md +14 -0
  991. package/profiles/example-django/heuristics.toml +24 -0
  992. package/profiles/example-django/profile.toml +9 -0
  993. package/profiles/fast/README.md +24 -0
  994. package/profiles/fast/profile.toml +59 -0
  995. package/profiles/minimal/README.md +17 -0
  996. package/profiles/minimal/addenda/.gitkeep +0 -0
  997. package/profiles/minimal/profile.toml +8 -0
  998. package/profiles/snappy/README.md +24 -0
  999. package/profiles/snappy/addenda/10-race-as-question.md +6 -0
  1000. package/profiles/snappy/profile.toml +46 -0
  1001. package/prompts/companion-day-open.md +46 -0
  1002. package/prompts/companion-first-run.md +104 -0
  1003. package/prompts/companion.md +821 -0
  1004. package/prompts/conversation-system.md +117 -0
  1005. package/prompts/eod-sweep.md +120 -0
  1006. package/prompts/onboarding.md +74 -0
  1007. package/prompts/pass-common.md +52 -0
  1008. package/prompts/pass-quality-common.md +22 -0
  1009. package/prompts/round-first.md +874 -0
  1010. package/prompts/round-follow-up.md +991 -0
  1011. package/prompts/round-re-review.md +889 -0
  1012. package/prompts/round-recheck.md +196 -0
  1013. package/prompts/round-staleness.md +856 -0
  1014. package/schemas/review-result.v1.json +391 -0
  1015. package/schemas/scan-result.v1.json +421 -0
  1016. package/schemas/version.v1.json +57 -0
  1017. package/scripts/approve-pr.sh +16 -0
  1018. package/scripts/build-stamp.mjs +67 -0
  1019. package/scripts/commit-verdict.sh +155 -0
  1020. package/scripts/companion-e2e.sh +250 -0
  1021. package/scripts/companion-memory-forward.mjs +1966 -0
  1022. package/scripts/config-fingerprint.sh +28 -0
  1023. package/scripts/deploy-manifest.mjs +141 -0
  1024. package/scripts/deploy.sh +1435 -0
  1025. package/scripts/directory-lock.mjs +193 -0
  1026. package/scripts/heartbeat-fresh.mjs +54 -0
  1027. package/scripts/install-locator.sh +328 -0
  1028. package/scripts/install-wrapper.sh +76 -0
  1029. package/scripts/memory-search-check.mjs +98 -0
  1030. package/scripts/mint-token.sh +212 -0
  1031. package/scripts/openviking-embedder.py +392 -0
  1032. package/scripts/openviking-ov-conf.mjs +161 -0
  1033. package/scripts/openviking-provision.mjs +1122 -0
  1034. package/scripts/openviking-reembed.mjs +1154 -0
  1035. package/scripts/post-review.sh +16 -0
  1036. package/scripts/pr-checks.sh +256 -0
  1037. package/scripts/pr-context.py +174 -0
  1038. package/scripts/pr-context.sh +63 -0
  1039. package/scripts/pr-self.sh +144 -0
  1040. package/scripts/pr-threads.sh +145 -0
  1041. package/scripts/qcr +15 -0
  1042. package/scripts/qcr-host.sh +769 -0
  1043. package/scripts/render-review.sh +24 -0
  1044. package/scripts/reply-thread.sh +16 -0
  1045. package/scripts/required-passes.py +112 -0
  1046. package/scripts/smoke-companion.sh +211 -0
  1047. package/scripts/tui-deploy-runner.mjs +61 -0
  1048. package/scripts/verify-dist.mjs +201 -0
  1049. package/scripts/vm-ghcr-login.sh +188 -0
  1050. package/seeds/agents/pass-baseline.md +61 -0
  1051. package/seeds/agents/pass-contracts.md +30 -0
  1052. package/seeds/agents/pass-data-safety.md +54 -0
  1053. package/seeds/agents/pass-delivery.md +37 -0
  1054. package/seeds/agents/pass-prod-risk.md +24 -0
  1055. package/seeds/agents/pass-security.md +31 -0
  1056. package/seeds/agents/pass-statelessness.md +27 -0
  1057. package/seeds/agents/pass-ui.md +23 -0
  1058. package/seeds/agents/pass-validate.md +50 -0
  1059. package/seeds/prompts/conversation-system.md +117 -0
  1060. package/seeds/prompts/eod-sweep.md +120 -0
  1061. package/seeds/prompts/pass-common.md +52 -0
  1062. package/skills/companion/adjudicate/SKILL.md +247 -0
  1063. package/skills/companion/evidence/SKILL.md +150 -0
  1064. package/skills/companion/land/SKILL.md +200 -0
  1065. package/skills/companion/replay/SKILL.md +138 -0
  1066. package/skills/companion/setup/SKILL.md +167 -0
  1067. package/skills/companion/survey/SKILL.md +160 -0
  1068. package/skills/selfimprove/README.md +34 -0
  1069. package/skills/selfimprove/SKILL.md +127 -0
  1070. package/skills/selfimprove/agents/openai.yaml +2 -0
  1071. package/skills/selfimprove/commands/selfimprove.md +6 -0
  1072. package/skills/selfimprove/references/fix-loop.md +49 -0
  1073. package/skills/selfimprove/references/ledger.md +20 -0
  1074. package/skills/selfimprove/references/setup.md +40 -0
  1075. package/src/anomalies.ts +566 -0
  1076. package/src/answerworker.ts +251 -0
  1077. package/src/appstamp.ts +65 -0
  1078. package/src/archive/admission.ts +3 -0
  1079. package/src/archive/archivedb.ts +548 -0
  1080. package/src/archive/archiver.ts +1963 -0
  1081. package/src/archive/archivewrite.ts +279 -0
  1082. package/src/archive/bundle.ts +333 -0
  1083. package/src/archive/dbmove.ts +911 -0
  1084. package/src/archive/duplicatecounts.ts +98 -0
  1085. package/src/archive/eligibility.ts +181 -0
  1086. package/src/archive/extract.ts +342 -0
  1087. package/src/archive/fsutil.ts +415 -0
  1088. package/src/archive/gzfile.ts +370 -0
  1089. package/src/archive/kinds.ts +21 -0
  1090. package/src/archive/livecheckpoint.ts +217 -0
  1091. package/src/archive/liveretention.ts +180 -0
  1092. package/src/archive/manifest.ts +519 -0
  1093. package/src/archive/overseer.ts +336 -0
  1094. package/src/archive/piglobal.ts +174 -0
  1095. package/src/archive/plan.ts +612 -0
  1096. package/src/archive/prarchive.ts +984 -0
  1097. package/src/archive/prfiles.ts +406 -0
  1098. package/src/archive/report.ts +252 -0
  1099. package/src/archive/restore.ts +330 -0
  1100. package/src/archive/rows.ts +187 -0
  1101. package/src/archive/seal.ts +630 -0
  1102. package/src/archive/status.ts +719 -0
  1103. package/src/archive/storepass.ts +581 -0
  1104. package/src/backfill.ts +362 -0
  1105. package/src/bench/cost.ts +113 -0
  1106. package/src/bench/exec.ts +90 -0
  1107. package/src/bench/values.ts +13 -0
  1108. package/src/botcontrol.ts +176 -0
  1109. package/src/botworker.ts +953 -0
  1110. package/src/capture.ts +321 -0
  1111. package/src/cases.ts +1789 -0
  1112. package/src/channelfs.ts +26 -0
  1113. package/src/checklist.ts +506 -0
  1114. package/src/ciretry.ts +141 -0
  1115. package/src/cli.ts +2271 -0
  1116. package/src/cliops.ts +384 -0
  1117. package/src/clonedir.ts +15 -0
  1118. package/src/commandeffects.ts +57 -0
  1119. package/src/commands.ts +1678 -0
  1120. package/src/companioninbox.ts +239 -0
  1121. package/src/compare.ts +957 -0
  1122. package/src/config.ts +2050 -0
  1123. package/src/configcheck.ts +133 -0
  1124. package/src/coreext.ts +47 -0
  1125. package/src/daemon.ts +1302 -0
  1126. package/src/debuground.ts +927 -0
  1127. package/src/debugroundpi.ts +262 -0
  1128. package/src/diagnostics.ts +14 -0
  1129. package/src/digest.ts +183 -0
  1130. package/src/dispatch.ts +2250 -0
  1131. package/src/engine/answerguard.ts +27 -0
  1132. package/src/engine/botsdk.ts +336 -0
  1133. package/src/engine/caserunner-sdk.ts +423 -0
  1134. package/src/engine/debugpi.ts +235 -0
  1135. package/src/eod.ts +669 -0
  1136. package/src/eodpinwatch.ts +556 -0
  1137. package/src/escalation.ts +1253 -0
  1138. package/src/eventloop.ts +1045 -0
  1139. package/src/execboundary.ts +633 -0
  1140. package/src/feedback.ts +1162 -0
  1141. package/src/findingscheck.ts +298 -0
  1142. package/src/fsdenied.ts +24 -0
  1143. package/src/ghread.ts +242 -0
  1144. package/src/github.ts +1497 -0
  1145. package/src/homes.ts +175 -0
  1146. package/src/hostroute.ts +53 -0
  1147. package/src/improvements.ts +787 -0
  1148. package/src/install.ts +1103 -0
  1149. package/src/installkind.ts +50 -0
  1150. package/src/ipc/capability.ts +333 -0
  1151. package/src/ipc/client.ts +269 -0
  1152. package/src/ipc/control.ts +90 -0
  1153. package/src/ipc/ghreadshim.ts +94 -0
  1154. package/src/ipc/launcher.ts +65 -0
  1155. package/src/ipc/permits.ts +362 -0
  1156. package/src/ipc/postshim.ts +164 -0
  1157. package/src/ipc/protocol.ts +342 -0
  1158. package/src/ipc/server.ts +371 -0
  1159. package/src/ipc/workerspec.ts +218 -0
  1160. package/src/learner/learner.ts +1655 -0
  1161. package/src/learner/miner.ts +1290 -0
  1162. package/src/learner/packet.ts +340 -0
  1163. package/src/learner/receipt.ts +168 -0
  1164. package/src/learner/status.ts +107 -0
  1165. package/src/ledgercheck.ts +157 -0
  1166. package/src/lessonledger.ts +703 -0
  1167. package/src/lessonselect.ts +888 -0
  1168. package/src/lessonshadow.ts +810 -0
  1169. package/src/levers.ts +393 -0
  1170. package/src/live/projection.ts +491 -0
  1171. package/src/live/publish.ts +92 -0
  1172. package/src/live/read.ts +86 -0
  1173. package/src/livecli.ts +336 -0
  1174. package/src/loginhint.ts +56 -0
  1175. package/src/loginrefresh/atomic.ts +76 -0
  1176. package/src/loginrefresh/lock.ts +104 -0
  1177. package/src/loginrefresh/main.ts +59 -0
  1178. package/src/loginrefresh/pirefresh.ts +57 -0
  1179. package/src/loginrefresh/refresher.ts +326 -0
  1180. package/src/loginrefresh/supervisor.ts +273 -0
  1181. package/src/loginrefresh/types.ts +35 -0
  1182. package/src/memory/context.ts +385 -0
  1183. package/src/memory/datafence.ts +9 -0
  1184. package/src/memory/delivery.ts +171 -0
  1185. package/src/memory/eventtags.ts +80 -0
  1186. package/src/memory/health.ts +953 -0
  1187. package/src/memory/import.ts +664 -0
  1188. package/src/memory/layout.ts +261 -0
  1189. package/src/memory/legacy-file.ts +104 -0
  1190. package/src/memory/lessons.ts +447 -0
  1191. package/src/memory/ovsession.ts +601 -0
  1192. package/src/memory/relayout.ts +335 -0
  1193. package/src/memory/roundactivity.ts +209 -0
  1194. package/src/memory/selection.ts +989 -0
  1195. package/src/memory/shadowstatus.ts +125 -0
  1196. package/src/memory/store.ts +275 -0
  1197. package/src/memory/textidentity.ts +8 -0
  1198. package/src/metrics.ts +1056 -0
  1199. package/src/missingconfig.ts +7 -0
  1200. package/src/npmverbs.ts +264 -0
  1201. package/src/onboard/choices.ts +222 -0
  1202. package/src/onboard/engine.ts +518 -0
  1203. package/src/onboard/launch.ts +115 -0
  1204. package/src/onboard/steps/appslug.ts +265 -0
  1205. package/src/onboard/steps/bringup.ts +482 -0
  1206. package/src/onboard/steps/compose.ts +459 -0
  1207. package/src/onboard/steps/configdelivery.ts +58 -0
  1208. package/src/onboard/steps/configfill.ts +1352 -0
  1209. package/src/onboard/steps/deploysh.ts +105 -0
  1210. package/src/onboard/steps/embeddings.ts +550 -0
  1211. package/src/onboard/steps/escalation.ts +640 -0
  1212. package/src/onboard/steps/githubapp.ts +1414 -0
  1213. package/src/onboard/steps/golive.ts +577 -0
  1214. package/src/onboard/steps/index.ts +71 -0
  1215. package/src/onboard/steps/ingress.ts +907 -0
  1216. package/src/onboard/steps/inventory.ts +526 -0
  1217. package/src/onboard/steps/llmauth.ts +1095 -0
  1218. package/src/onboard/steps/memory.ts +1290 -0
  1219. package/src/onboard/steps/memorykeys.ts +85 -0
  1220. package/src/onboard/steps/preflight.ts +191 -0
  1221. package/src/onboard/steps/proof.ts +624 -0
  1222. package/src/onboard/steps/ssh.ts +377 -0
  1223. package/src/onboard/steps/topology.ts +337 -0
  1224. package/src/onboard/steps/transport.ts +665 -0
  1225. package/src/onboard/steps/verifyup.ts +448 -0
  1226. package/src/onboard/steps/vmdeploy.ts +442 -0
  1227. package/src/onboard/toml.ts +50 -0
  1228. package/src/opencli.ts +591 -0
  1229. package/src/openpr.ts +568 -0
  1230. package/src/openviking/client.ts +1131 -0
  1231. package/src/openviking/context.ts +263 -0
  1232. package/src/openviking/embedder.ts +516 -0
  1233. package/src/openviking/gapsink.ts +63 -0
  1234. package/src/openviking/health.ts +83 -0
  1235. package/src/openviking/index.ts +119 -0
  1236. package/src/openviking/lessonfind.ts +92 -0
  1237. package/src/openviking/probe.ts +129 -0
  1238. package/src/openviking/proc.ts +110 -0
  1239. package/src/openviking/provisionreport.ts +160 -0
  1240. package/src/openviking/reembed.ts +412 -0
  1241. package/src/openviking/relayout.ts +177 -0
  1242. package/src/openviking/sidecar-main.ts +38 -0
  1243. package/src/openviking/sidecar.ts +106 -0
  1244. package/src/openviking/store.ts +2025 -0
  1245. package/src/openviking/supervisor.ts +474 -0
  1246. package/src/openviking/types.ts +174 -0
  1247. package/src/operator-recovery.ts +237 -0
  1248. package/src/operatormessage.ts +52 -0
  1249. package/src/outcomes.ts +1670 -0
  1250. package/src/piauthcopy.ts +12 -0
  1251. package/src/picli.ts +49 -0
  1252. package/src/picwd.ts +25 -0
  1253. package/src/pilogin.ts +37 -0
  1254. package/src/pingpong.ts +1339 -0
  1255. package/src/posting-journal.ts +549 -0
  1256. package/src/posting-outbox.ts +802 -0
  1257. package/src/posting-receipt.ts +324 -0
  1258. package/src/posting.ts +603 -0
  1259. package/src/postops.ts +832 -0
  1260. package/src/pr-activity.ts +20 -0
  1261. package/src/pr-author.ts +6 -0
  1262. package/src/pr-conversation.ts +432 -0
  1263. package/src/pr-session-lifecycle.ts +631 -0
  1264. package/src/preflight.ts +391 -0
  1265. package/src/priorresolve.ts +343 -0
  1266. package/src/qcrbin.ts +186 -0
  1267. package/src/recheck.ts +1775 -0
  1268. package/src/reconcile.ts +1030 -0
  1269. package/src/recordedfindings.ts +27 -0
  1270. package/src/regression.ts +833 -0
  1271. package/src/replay.ts +816 -0
  1272. package/src/requiredpasses.ts +148 -0
  1273. package/src/resumecheck.ts +246 -0
  1274. package/src/reviewcli.ts +787 -0
  1275. package/src/reviewcontext.ts +35 -0
  1276. package/src/reviewdetach.ts +734 -0
  1277. package/src/reviewhistory.ts +427 -0
  1278. package/src/reviewhome.ts +36 -0
  1279. package/src/reviewmemory.ts +133 -0
  1280. package/src/reviewrendercli.ts +139 -0
  1281. package/src/round-work.ts +42 -0
  1282. package/src/runhost.ts +108 -0
  1283. package/src/scanauth.ts +36 -0
  1284. package/src/scanbox.ts +1081 -0
  1285. package/src/scancli.ts +1296 -0
  1286. package/src/scandriverlog.ts +32 -0
  1287. package/src/session-bridge.ts +139 -0
  1288. package/src/session-command-payload.ts +35 -0
  1289. package/src/session-command-supervisor.ts +1142 -0
  1290. package/src/sessionjsonl.ts +88 -0
  1291. package/src/sessions.ts +659 -0
  1292. package/src/setup/adapters.ts +335 -0
  1293. package/src/setup/baselines.ts +110 -0
  1294. package/src/setup/caserunner.ts +611 -0
  1295. package/src/setup/configcommit.ts +443 -0
  1296. package/src/setup/engine.ts +1001 -0
  1297. package/src/setup/facts.ts +627 -0
  1298. package/src/setup/findings.ts +1264 -0
  1299. package/src/setup/history.ts +443 -0
  1300. package/src/setup/interview.ts +243 -0
  1301. package/src/setup/ledger.ts +324 -0
  1302. package/src/setup/pins.ts +66 -0
  1303. package/src/setup/portrait.ts +635 -0
  1304. package/src/setup/presentation.ts +18 -0
  1305. package/src/setup/profile.ts +508 -0
  1306. package/src/setup/replay.ts +370 -0
  1307. package/src/setup/replaybuild.ts +392 -0
  1308. package/src/setup/replayrun.ts +1096 -0
  1309. package/src/setup/replaysource.ts +198 -0
  1310. package/src/setup/retune.ts +415 -0
  1311. package/src/setup/retunelog.ts +95 -0
  1312. package/src/setup/scan.ts +1033 -0
  1313. package/src/setup/scanbuild.ts +168 -0
  1314. package/src/setup/scanfacts.ts +107 -0
  1315. package/src/setup/scanlease.ts +297 -0
  1316. package/src/setup/scanreport.ts +373 -0
  1317. package/src/setup/scanrun.ts +2268 -0
  1318. package/src/setup/scantree.ts +259 -0
  1319. package/src/setup/stage2.ts +926 -0
  1320. package/src/setup/stage2request.ts +347 -0
  1321. package/src/setup/survey.ts +458 -0
  1322. package/src/setup/surveyrun.ts +758 -0
  1323. package/src/setup/textsniff.ts +95 -0
  1324. package/src/setup/trackersink.ts +433 -0
  1325. package/src/setup/triage.ts +768 -0
  1326. package/src/setup/tuning.ts +766 -0
  1327. package/src/setup/unitcut.ts +523 -0
  1328. package/src/singleflight.ts +86 -0
  1329. package/src/slack/announce.ts +911 -0
  1330. package/src/slack/api.ts +303 -0
  1331. package/src/slack/messages.ts +288 -0
  1332. package/src/slack/origin.ts +599 -0
  1333. package/src/slack/policy.ts +354 -0
  1334. package/src/slack/reply.ts +201 -0
  1335. package/src/slack/router.ts +285 -0
  1336. package/src/slack/socket.ts +384 -0
  1337. package/src/slack/types.ts +108 -0
  1338. package/src/sqlitehint.ts +32 -0
  1339. package/src/ssh-observation.ts +30 -0
  1340. package/src/state.ts +8243 -0
  1341. package/src/statemachine.ts +369 -0
  1342. package/src/stubs.ts +68 -0
  1343. package/src/takeover.ts +634 -0
  1344. package/src/takeoverpi.ts +293 -0
  1345. package/src/terminal-failure.ts +41 -0
  1346. package/src/thread-resolution-refusal.ts +2 -0
  1347. package/src/tmux.ts +153 -0
  1348. package/src/trackerid.ts +41 -0
  1349. package/src/transcriptindex.ts +665 -0
  1350. package/src/tui/actions.ts +484 -0
  1351. package/src/tui/alerts.ts +666 -0
  1352. package/src/tui/app.ts +1979 -0
  1353. package/src/tui/archiveops.ts +192 -0
  1354. package/src/tui/autofile.ts +233 -0
  1355. package/src/tui/board.ts +1432 -0
  1356. package/src/tui/candidates.ts +889 -0
  1357. package/src/tui/cellwidth.ts +148 -0
  1358. package/src/tui/changelog-store.ts +503 -0
  1359. package/src/tui/chord.ts +25 -0
  1360. package/src/tui/clipboard.ts +92 -0
  1361. package/src/tui/cmdbar.ts +296 -0
  1362. package/src/tui/companion.ts +1427 -0
  1363. package/src/tui/companionplan.ts +247 -0
  1364. package/src/tui/companiontab.ts +83 -0
  1365. package/src/tui/confighome.ts +155 -0
  1366. package/src/tui/connect.ts +68 -0
  1367. package/src/tui/deploy-ceremony.ts +104 -0
  1368. package/src/tui/deploy-drain.ts +129 -0
  1369. package/src/tui/deploy-process.ts +265 -0
  1370. package/src/tui/deploytab.ts +1523 -0
  1371. package/src/tui/design.ts +125 -0
  1372. package/src/tui/digesttab.ts +214 -0
  1373. package/src/tui/emptystate.ts +39 -0
  1374. package/src/tui/evidence.ts +999 -0
  1375. package/src/tui/feed.ts +604 -0
  1376. package/src/tui/feedbacktab.ts +1077 -0
  1377. package/src/tui/filters.ts +90 -0
  1378. package/src/tui/ghread.ts +321 -0
  1379. package/src/tui/historypull.ts +81 -0
  1380. package/src/tui/inboxpull.ts +236 -0
  1381. package/src/tui/index.ts +1565 -0
  1382. package/src/tui/issuesink.ts +238 -0
  1383. package/src/tui/jsonfile.ts +42 -0
  1384. package/src/tui/keys.ts +109 -0
  1385. package/src/tui/layout.ts +108 -0
  1386. package/src/tui/learning.ts +627 -0
  1387. package/src/tui/lessonswitch.ts +118 -0
  1388. package/src/tui/livecontrol.ts +228 -0
  1389. package/src/tui/memforward.ts +443 -0
  1390. package/src/tui/memincident.ts +363 -0
  1391. package/src/tui/memory.ts +620 -0
  1392. package/src/tui/memtab.ts +606 -0
  1393. package/src/tui/metricstab.ts +1177 -0
  1394. package/src/tui/model.ts +131 -0
  1395. package/src/tui/mouse.ts +98 -0
  1396. package/src/tui/msg.ts +268 -0
  1397. package/src/tui/nativecompanion.ts +417 -0
  1398. package/src/tui/openurl.ts +21 -0
  1399. package/src/tui/paint.ts +511 -0
  1400. package/src/tui/panes.ts +98 -0
  1401. package/src/tui/pipane.ts +219 -0
  1402. package/src/tui/poll-hooks.ts +12 -0
  1403. package/src/tui/poll.ts +147 -0
  1404. package/src/tui/proposals.ts +838 -0
  1405. package/src/tui/prpause.ts +150 -0
  1406. package/src/tui/reload.ts +436 -0
  1407. package/src/tui/remote.ts +413 -0
  1408. package/src/tui/rollover.ts +969 -0
  1409. package/src/tui/scantab.ts +1290 -0
  1410. package/src/tui/setupentry.ts +93 -0
  1411. package/src/tui/sidebar.ts +749 -0
  1412. package/src/tui/sshtriage.ts +510 -0
  1413. package/src/tui/startup.ts +231 -0
  1414. package/src/tui/tabs.ts +45 -0
  1415. package/src/tui/termmirror.ts +224 -0
  1416. package/src/tui/theme.ts +95 -0
  1417. package/src/tui/ticketstab.ts +310 -0
  1418. package/src/tui/tmuxsocket.ts +129 -0
  1419. package/src/tui/trackertickets.ts +84 -0
  1420. package/src/tui/unwedge.ts +286 -0
  1421. package/src/tui/viewer.ts +575 -0
  1422. package/src/tui/viewerinput.ts +173 -0
  1423. package/src/updatenotice.ts +178 -0
  1424. package/src/usage.ts +1154 -0
  1425. package/src/verdicts.ts +4689 -0
  1426. package/src/version.ts +80 -0
  1427. package/src/wakes.ts +476 -0
  1428. package/src/webhook.ts +942 -0
  1429. package/src/webhookheal.ts +276 -0
  1430. package/src/wire.ts +2153 -0
  1431. package/src/worker-session-host.ts +602 -0
  1432. package/src/workerbreaker.ts +156 -0
  1433. package/src/workercontrol.ts +104 -0
  1434. package/src/workerlease.ts +441 -0
  1435. package/src/workerliveness.ts +103 -0
  1436. package/src/workerlog.ts +79 -0
  1437. package/src/workerruntime.ts +30 -0
  1438. package/src/workersupervisor.ts +1538 -0
  1439. package/src/workerusage.ts +42 -0
  1440. package/src/workerworld.ts +427 -0
  1441. package/src/worktrees.ts +1138 -0
  1442. package/tests/fixtures/regression-cases.json +795 -0
  1443. package/tests/fixtures/seed-manifest.json +19 -0
@@ -0,0 +1,1148 @@
1
+ // Interview → config fill: the onboarding step that turns the ~8
2
+ // answers only a human can give into a real config.toml, by COMMENT-PRESERVING
3
+ // PATCH of the shipped `config.example.toml` template.
4
+ //
5
+ // Three properties carry the design:
6
+ //
7
+ // * ASK ONLY WHAT A HUMAN KNOWS. `QUESTIONS` is the whole interview — the
8
+ // reviewed repo, its local checkout, the App slug, owner identity, the ops
9
+ // timezone, the base branch, the escalation mention, and (only where the
10
+ // recorded topology/ingress make them real questions) the ssh alias and
11
+ // public webhook hostname. Each carries `teach`: the concept is explained
12
+ // at the moment it becomes relevant, never merely prompted.
13
+ // * COMPUTE EVERYTHING ELSE. `DERIVABLES` is the closed enumeration of what
14
+ // this step derives instead of asking — the bot login from the App slug,
15
+ // the clone dir from the repo slug, the [eod]/[slack.policy] timezone
16
+ // cascade off [ops], the [backfill] cascade off [github], the sink default,
17
+ // directory defaults. `tests/onboard-configfill.test.ts` pins the id list,
18
+ // so the list cannot silently shrink back into the interview.
19
+ // * NEVER A BLIND REWRITE. The patch source is the operator's EXISTING
20
+ // config.toml when there is one (the template only on a fresh install), and
21
+ // only keys whose value actually changes are edited. A re-run with every
22
+ // answer kept produces a byte-identical file and does not touch the disk.
23
+ //
24
+ // Rule 1 (dry_run is the owner's flag alone) is structural here, not prompted:
25
+ // no question and no derivable targets `dry_run`, `assertNoDryRunEdit` refuses
26
+ // any edit that names it however it is spelled, and the fresh-fill path ships
27
+ // whatever the template ships (true). An existing config's flag — flipped or
28
+ // not — is carried through untouched; this step cannot move it in either
29
+ // direction. The explicit, offered go-live flip belongs to golive.ts alone.
30
+ //
31
+ // Secrets are not collected here and their validators are not duplicated:
32
+ // `deploy/collect-secrets.sh` owns pasted-secret prompting and validation, and
33
+ // the GitHub App step's manifest exchange writes the App credentials straight into the
34
+ // secrets dir. This step only reports which of that wizard's required files
35
+ // exist yet, reading the `deploy_shape` marker the wizard itself writes.
36
+ //
37
+ // I/O: answers come as the tool's arguments (`ctx.input`, one string per
38
+ // question id — the pi-driven wizard has no prompter), through the engine's
39
+ // `prompter` adapter (the non-LLM fallback entry), or from choices a sibling
40
+ // step already recorded; the config is read and written at
41
+ // `adapters.paths.configPath` (the install-located file), the template and state
42
+ // files live under the sandbox root derived from `adapters.paths.stateDir`.
43
+ // Tests point both at a temp dir and fake the prompter — no network, no docker,
44
+ // no real repo write.
45
+ import { parse as parseToml } from "smol-toml";
46
+ import { splitTail, tomlValueAt } from "../toml.js";
47
+ export { splitTail } from "../toml.js";
48
+ import { existsSync, readFileSync, rmSync } from "node:fs";
49
+ import { isAbsolute, join } from "node:path";
50
+ import { ESCALATION_LOGIN_RE as LOGIN_RE, assertIanaTimeZone, expandHome, githubCloneDir, loadConfig, TUI_DEFAULTS, } from "../../config.js";
51
+ import { CHOICE_KEYS, CHOICE_WRITERS, REPO_SLUG_RE, botLoginFor, ingressChoiceOf, } from "../choices.js";
52
+ import { readTextOrNull, sandboxRoot, writeAtomic, } from "../engine.js";
53
+ import { deliverConfigChange, configDeliveryChecks } from "./configdelivery.js";
54
+ import { BARE_HOSTNAME_RE, readTomlKey, secretsDirFor } from "./ingress.js";
55
+ import { SSH_ALIAS_RE } from "./topology.js";
56
+ export const CONFIG_FILL_STEP_ID = "config_fill";
57
+ /** The choice keys this step reads and writes live in one place for the whole
58
+ * wizard (src/onboard/choices.ts) — re-exported here because half the wizard
59
+ * imports them from this module. */
60
+ export { CHOICE_KEYS };
61
+ // A header may carry a trailing comment (`[tui] # mine` is legal TOML, and the
62
+ // ingress reader accepts it) — missing one would append a duplicate table.
63
+ const HEADER_RE = /^\s*\[([^\]]+)\]\s*(?:#.*)?$/;
64
+ /** A TOML basic string. JSON's escape set is a subset of TOML's, so a hostile
65
+ * answer (quotes, backslashes, newlines) can never break out of the value. */
66
+ export function tomlString(v) {
67
+ return JSON.stringify(v);
68
+ }
69
+ function validateGithubLogin(value) {
70
+ return LOGIN_RE.test(value)
71
+ ? null
72
+ : "a GitHub login is letters, digits and single dashes — no @, no URL";
73
+ }
74
+ function escapeRe(s) {
75
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
76
+ }
77
+ /** `← FILL (3): …` has done its job once the value is filled. Rewrite the
78
+ * marker in place — the EXPLANATION after it is the part worth keeping. */
79
+ export function rewriteFillMarker(comment) {
80
+ if (!/←\s*FILL/.test(comment))
81
+ return comment;
82
+ return comment.replace(/←\s*FILL(\s*\(\d+\))?\s*:?\s*/, "filled by qcr onboard: ");
83
+ }
84
+ function sectionAt(lines) {
85
+ const out = [];
86
+ let cur = "";
87
+ let continuation = null;
88
+ for (const line of lines) {
89
+ if (continuation !== null) {
90
+ continuation += "\n" + line;
91
+ out.push("\0");
92
+ if (splitTail(continuation) !== null)
93
+ continuation = null;
94
+ continue;
95
+ }
96
+ const m = HEADER_RE.exec(line);
97
+ if (m)
98
+ cur = m[1].trim();
99
+ out.push(cur);
100
+ const assignment = /^\s*(?:"(?:[^"\\]|\\.)*"|'[^']*'|[A-Za-z0-9_-]+)\s*=\s*(.*)$/.exec(line);
101
+ if (assignment && splitTail(assignment[1]) === null)
102
+ continuation = assignment[1];
103
+ }
104
+ return out;
105
+ }
106
+ /**
107
+ * Apply `edits` to a TOML document, preserving every comment, blank line and
108
+ * key order. An existing assignment has only its VALUE replaced (its trailing
109
+ * comment survives, with a spent `← FILL` marker rewritten); a commented-out
110
+ * assignment is uncommented in place; a key absent from its section is appended
111
+ * to the end of that section; a missing section is appended at EOF.
112
+ */
113
+ export function patchToml(text, edits) {
114
+ const lines = text.split("\n");
115
+ for (const edit of edits) {
116
+ const sections = sectionAt(lines);
117
+ const spelling = `(?:${escapeRe(edit.key)}|"(?:[^"\\\\]|\\\\.)*"|'[^']*')`;
118
+ const live = new RegExp(`^(\\s*)(${spelling})(\\s*=\\s*)(.*)$`);
119
+ const commented = new RegExp(`^(\\s*)#\\s*(${spelling})(\\s*=\\s*)(.*)$`);
120
+ let applied = false;
121
+ for (const re of [live, commented]) {
122
+ for (let i = 0; i < lines.length && !applied; i++) {
123
+ if (sections[i] !== edit.section)
124
+ continue;
125
+ const m = re.exec(lines[i]);
126
+ if (!m)
127
+ continue;
128
+ try {
129
+ if (!Object.hasOwn(parseToml(`${m[2]} = 0`), edit.key))
130
+ continue;
131
+ }
132
+ catch {
133
+ continue;
134
+ }
135
+ let end = i;
136
+ let tail = m[4];
137
+ while (splitTail(tail) === null && end + 1 < lines.length)
138
+ tail += "\n" + lines[++end];
139
+ const parts = splitTail(tail);
140
+ if (!parts)
141
+ throw new Error(`cannot patch unterminated TOML assignment ${edit.key}`);
142
+ const comment = parts.comment ? `${parts.gap}${rewriteFillMarker(parts.comment)}` : "";
143
+ lines.splice(i, end - i + 1, `${m[1]}${m[2]}${m[3]}${edit.value}${comment}`);
144
+ applied = true;
145
+ }
146
+ if (applied)
147
+ break;
148
+ }
149
+ if (applied)
150
+ continue;
151
+ // Not present: append inside the section, or create the section at EOF.
152
+ let end = -1;
153
+ for (let i = 0; i < lines.length; i++)
154
+ if (sections[i] === edit.section)
155
+ end = i;
156
+ if (end < 0) {
157
+ if (lines.at(-1) !== "")
158
+ lines.push("");
159
+ lines.push(`[${edit.section}]`, `${edit.key} = ${edit.value}`, "");
160
+ continue;
161
+ }
162
+ while (end > 0 && lines[end].trim() === "")
163
+ end--;
164
+ lines.splice(end + 1, 0, `${edit.key} = ${edit.value}`);
165
+ }
166
+ return lines.join("\n");
167
+ }
168
+ /** Rule 1's structural belt on the edit list: `dry_run` is not a key this step
169
+ * may write, however it is spelled. Same spirit as `configPatchViolation` in
170
+ * src/tui/proposals.ts — a refusal before anything reaches the file. */
171
+ const DRY_RUN_TOKEN = /(^|[^0-9A-Za-z_])dry_run([^0-9A-Za-z_]|$)/;
172
+ export function assertNoDryRunEdit(edits) {
173
+ for (const e of edits) {
174
+ if (DRY_RUN_TOKEN.test(e.key) || DRY_RUN_TOKEN.test(e.section)) {
175
+ throw new Error("onboarding config fill: refused an edit touching dry_run — rule 1: the flag is the owner's alone");
176
+ }
177
+ }
178
+ }
179
+ const SLUG_RE = /^[A-Za-z0-9][A-Za-z0-9-]*$/;
180
+ function oneLine(v) {
181
+ return /[\r\n]/.test(v) ? "that must be a single line" : null;
182
+ }
183
+ /** The ingress shapes where the operator supplies a stable public hostname.
184
+ * The quick tunnel assigns its own, polling exposes nothing, and ngrok's
185
+ * reserved domain is optional — so `named` is the one shape that MUST be
186
+ * asked. Typed as `IngressChoice`, so a value the ingress step
187
+ * cannot record is a compile error rather than a question that never fires. */
188
+ const OPERATOR_HOSTNAME_INGRESS = new Set(["named"]);
189
+ function str(choices, key) {
190
+ const v = choices[key];
191
+ return typeof v === "string" ? v.trim() : "";
192
+ }
193
+ export const QUESTIONS = [
194
+ {
195
+ id: "repo",
196
+ section: "github",
197
+ key: "repo",
198
+ title: "The repository to review",
199
+ teach: "QuickReview watches exactly ONE repository. It never reviews a PR on its own initiative: a round starts when " +
200
+ "someone puts the trigger label on a pull request (or requests the review team). Everything else — labels, " +
201
+ "clone directory, backfill identity — is derived from this one answer.",
202
+ prompt: 'Which repository should the reviewer watch? ("owner/name")',
203
+ optional: false,
204
+ from: [CHOICE_KEYS.repo],
205
+ read: (cfg) => cfg.github.repo,
206
+ validate: (v) => REPO_SLUG_RE.test(v)
207
+ ? null
208
+ : 'a repository is "owner/name" — e.g. "acme/web-app" (no URL, no trailing .git)',
209
+ },
210
+ {
211
+ id: "reviewed_repo_dir",
212
+ section: "companion",
213
+ key: "reviewed_repo_dir",
214
+ title: "Your local checkout of that repository",
215
+ teach: "The companion — the local pi that sits beside the TUI — reads the code a review is about. Your checkout is " +
216
+ "mounted READ-ONLY into its container: it can read every file and change none of them. A missing checkout only " +
217
+ "makes the companion less informed; it never breaks the reviewer.",
218
+ prompt: "Where is your local checkout of that repository?",
219
+ optional: false,
220
+ from: [CHOICE_KEYS.repoDir],
221
+ read: (cfg) => cfg.companion.reviewed_repo_dir,
222
+ validate: (v) => {
223
+ const line = oneLine(v);
224
+ if (line)
225
+ return line;
226
+ const p = expandHome(v);
227
+ if (!isAbsolute(p))
228
+ return "give an absolute path (or a ~/… path) — a relative path would depend on where the wizard ran";
229
+ if (!existsSync(p))
230
+ return `nothing exists at ${p} — clone the repository first, then give that directory`;
231
+ return null;
232
+ },
233
+ },
234
+ {
235
+ id: "app_slug",
236
+ section: "github",
237
+ key: "app_slug",
238
+ title: "The GitHub App slug",
239
+ teach: "Reviews are posted by a GitHub App, not by you. Its slug is the name in its URL — and the bot login the reviews " +
240
+ "appear under is DERIVED from it (`<slug>[bot]`), so you never type that twice. If the wizard already created " +
241
+ "the App for you, this is filled in from that step.",
242
+ prompt: "What is your GitHub App's slug?",
243
+ optional: false,
244
+ from: [CHOICE_KEYS.appSlug],
245
+ read: (cfg) => cfg.github.app_slug,
246
+ validate: (v) => SLUG_RE.test(v)
247
+ ? null
248
+ : 'the slug is the name in the App URL — letters, digits and dashes, e.g. "acme-reviewer"',
249
+ },
250
+ {
251
+ id: "timezone",
252
+ section: "ops",
253
+ key: "timezone",
254
+ title: "The operations timezone",
255
+ teach: "One knob decides whose calendar day the system runs on: the end-of-day learning sweep, the day-scoped feedback " +
256
+ "rules, metrics buckets and the companion's day rollover. The [eod] and [slack.policy] sections default from it, " +
257
+ "so this is the only place you state it.",
258
+ prompt: 'Which IANA timezone is your working day in? (e.g. "Europe/Warsaw")',
259
+ optional: false,
260
+ read: (cfg) => cfg.ops.timezone,
261
+ validate: (v) => {
262
+ try {
263
+ assertIanaTimeZone(v, "[ops] timezone");
264
+ return null;
265
+ }
266
+ catch (err) {
267
+ return `${String(err.message)} — use an IANA name like "Europe/Warsaw" or "America/New_York", not an abbreviation`;
268
+ }
269
+ },
270
+ },
271
+ {
272
+ id: "base_branch",
273
+ section: "github",
274
+ key: "base_branch",
275
+ title: "The repository's default branch",
276
+ teach: "Used where the system needs the repo's trunk: the base a bot improvement PR targets, and the diff base for " +
277
+ "replays. A review round never uses it — a round always reads the pull request's OWN base branch from GitHub.",
278
+ prompt: 'What is the repository\'s default branch? ("main" / "master")',
279
+ optional: false,
280
+ from: [CHOICE_KEYS.baseBranch],
281
+ read: (cfg) => cfg.github.base_branch,
282
+ validate: (v) => /^[^\s~^:?*[\\]+$/.test(v) ? null : "a branch name, e.g. main or master (no spaces)",
283
+ },
284
+ {
285
+ id: "owner_name",
286
+ section: "owner",
287
+ key: "name",
288
+ title: "Your display name",
289
+ teach: "The system has ONE accountable human, configured as a role. This name is rendered in prose — Slack messages, " +
290
+ 'the companion\'s day-open, the pinned-memory header. Leave it empty and every surface says "the owner" instead.',
291
+ prompt: "What name should the system call you in its own prose? (Enter to stay anonymous)",
292
+ optional: true,
293
+ read: (cfg) => cfg.owner.name,
294
+ validate: oneLine,
295
+ },
296
+ {
297
+ id: "owner_github_login",
298
+ section: "owner",
299
+ key: "github_login",
300
+ title: "Your GitHub login",
301
+ teach: "Used to recognise you on the repository and as the last-resort @-mention when a review has to point at a human. " +
302
+ "It is never used to authenticate anything — the App credential is the only identity that acts.",
303
+ prompt: "What is your GitHub login? (Enter to skip)",
304
+ optional: true,
305
+ from: [CHOICE_KEYS.ownerLogin],
306
+ read: (cfg) => cfg.owner.github_login,
307
+ validate: validateGithubLogin,
308
+ },
309
+ {
310
+ id: "owner_slack_id",
311
+ section: "owner",
312
+ key: "slack_id",
313
+ title: "Your Slack member id",
314
+ teach: "Only needed if you later switch the Slack concierge on: it is the one identity allowed to claim authorship of " +
315
+ "your own PRs in chat. Skipping it now costs nothing — Slack ships off.",
316
+ prompt: "Your Slack member id, if you use Slack? (U…, Enter to skip)",
317
+ optional: true,
318
+ read: (cfg) => cfg.owner.slack_id,
319
+ validate: (v) => /^U[A-Z0-9]{4,}$/.test(v)
320
+ ? null
321
+ : 'a Slack member id looks like "U01ABCD2EFG" (Slack profile → More → Copy member ID)',
322
+ },
323
+ {
324
+ id: "escalation_mention",
325
+ section: "review",
326
+ key: "escalation_mention_default",
327
+ title: "Fallback @-mention for directive edits",
328
+ teach: "When a PR edits the files that instruct coding agents (.claude/**, AGENTS.md, CLAUDE.md and kin), the review " +
329
+ "adds ONE short comment @-mentioning the person who most recently touched those files. This is the fallback when " +
330
+ "git history names nobody — your own login is the usual answer.",
331
+ prompt: "Which GitHub login should that fallback mention? (Enter uses your login, or leave both empty for no @)",
332
+ optional: true,
333
+ read: (cfg) => cfg.review.escalation_mention_default,
334
+ validate: validateGithubLogin,
335
+ },
336
+ {
337
+ id: "ssh_host",
338
+ section: "tui",
339
+ key: "ssh_host",
340
+ title: "The ssh alias of the review host",
341
+ teach: "On the VM route the operator TUI reads the daemon over ssh. This is the alias from your ~/.ssh/config — the " +
342
+ "same one you would type after `ssh`. On the local route nothing needs it and it stays empty.",
343
+ prompt: "Which ssh alias reaches the machine running the reviewer?",
344
+ optional: false,
345
+ from: [CHOICE_KEYS.sshAlias],
346
+ asked: (choices) => str(choices, CHOICE_KEYS.topology) === "vm",
347
+ read: (cfg) => cfg.tui.ssh_host,
348
+ validate: (v) => SSH_ALIAS_RE.test(v)
349
+ ? null
350
+ : "an ssh alias as it appears in ~/.ssh/config — a Host name, not a URL",
351
+ },
352
+ {
353
+ id: "webhook_hostname",
354
+ section: "server",
355
+ key: "hostname",
356
+ title: "The public webhook hostname",
357
+ teach: "GitHub delivers webhooks over HTTPS to a public hostname that fronts the daemon's loopback port. Tunnel shapes " +
358
+ "that assign their own hostname fill this themselves; a named tunnel or your own ingress means you own the name.",
359
+ prompt: "Which public hostname will GitHub deliver webhooks to?",
360
+ optional: false,
361
+ from: [CHOICE_KEYS.ingressHostname],
362
+ asked: (choices) => {
363
+ const ingress = ingressChoiceOf(choices);
364
+ return ingress !== null && OPERATOR_HOSTNAME_INGRESS.has(ingress);
365
+ },
366
+ read: (cfg) => cfg.server.hostname,
367
+ validate: (v) => BARE_HOSTNAME_RE.test(v)
368
+ ? null
369
+ : 'a bare hostname like "review.example.com" — no scheme, no path',
370
+ },
371
+ ];
372
+ export function questionAsked(q, choices) {
373
+ return q.asked ? q.asked(choices) : true;
374
+ }
375
+ /** The TUI transport a recorded topology implies; null while it is unrecorded. */
376
+ function tuiTargetFor(topology) {
377
+ return topology === "local" ? "local" : topology === "vm" ? "ssh" : null;
378
+ }
379
+ export const DERIVABLES = [
380
+ {
381
+ id: "bot_login",
382
+ path: "[github] bot_login",
383
+ explain: "the bot login is the App slug plus the [bot] suffix — asking for it twice is how the two drift apart",
384
+ write: (f) => ({
385
+ section: "github",
386
+ key: "bot_login",
387
+ value: tomlString(botLoginFor(f.app_slug)),
388
+ }),
389
+ stable: true,
390
+ holds: (cfg) => cfg.github.bot_login === botLoginFor(cfg.github.app_slug)
391
+ ? null
392
+ : `[github] bot_login is "${cfg.github.bot_login}" but the App slug "${cfg.github.app_slug}" implies "${botLoginFor(cfg.github.app_slug)}"`,
393
+ },
394
+ {
395
+ id: "clone_dir",
396
+ path: "[github] clone_dir",
397
+ explain: 'left empty so the base clone directory derives from the repo slug ("owner/name" ⇒ "name"); a clone_dir you ' +
398
+ "set yourself (deploy.sh asks for one when the repo's name collides with a sandbox directory) is kept",
399
+ write: (_f, fresh) => fresh ? { section: "github", key: "clone_dir", value: tomlString("") } : null,
400
+ stable: true,
401
+ // The loader's own resolution (an explicit clone_dir wins, else the repo's
402
+ // basename) must name ONE plain directory — the same test deploy.sh applies.
403
+ holds: (cfg) => {
404
+ const dir = githubCloneDir(cfg.github);
405
+ return /^[A-Za-z0-9._-]+$/.test(dir) && dir !== "." && dir !== ".."
406
+ ? null
407
+ : `the clone dir resolves to "${dir}", which is not one plain directory name — set [github] clone_dir to one`;
408
+ },
409
+ },
410
+ {
411
+ id: "secrets_dir",
412
+ path: "[github] secrets_dir",
413
+ explain: "the install's secrets directory — left empty in the file, so the install locator finds it: <config home>/secrets " +
414
+ "— the same dir deploy/collect-secrets.sh fills",
415
+ // Fill-time only: the loader EXPANDS `~`, so writing back a parsed value
416
+ // would replace the template's portable `~/…` with this machine's home.
417
+ write: (f, fresh) => fresh ? { section: "github", key: "secrets_dir", value: tomlString(f.secrets_dir) } : null,
418
+ stable: true,
419
+ holds: (cfg) => cfg.github.secrets_dir.trim()
420
+ ? null
421
+ : "[github] secrets_dir is empty — the App credential has nowhere to live",
422
+ },
423
+ {
424
+ id: "review_team",
425
+ path: "[github] review_team",
426
+ explain: 'left empty: the team trigger is optional, and the trigger label always works — "org/team" is added later if wanted',
427
+ write: () => null,
428
+ stable: false,
429
+ holds: () => null,
430
+ },
431
+ {
432
+ id: "eod_timezone",
433
+ path: "[eod] timezone",
434
+ explain: "the end-of-day sweep runs on the [ops] timezone — the cascade means you state your day once",
435
+ write: () => null,
436
+ stable: true,
437
+ holds: (cfg) => cfg.eod.timezone === cfg.ops.timezone
438
+ ? null
439
+ : `[eod] timezone "${cfg.eod.timezone}" no longer follows [ops] "${cfg.ops.timezone}"`,
440
+ },
441
+ {
442
+ id: "slack_policy_timezone",
443
+ path: "[slack.policy] timezone",
444
+ explain: "the Slack day caps run on the [ops] timezone by the same cascade",
445
+ write: () => null,
446
+ stable: true,
447
+ holds: (cfg) => cfg.slack.policy.timezone === cfg.ops.timezone
448
+ ? null
449
+ : `[slack.policy] timezone "${cfg.slack.policy.timezone}" no longer follows [ops] "${cfg.ops.timezone}"`,
450
+ },
451
+ {
452
+ id: "backfill_identity",
453
+ path: "[backfill] *",
454
+ explain: "the history importer's identity and labels cascade off [github] — never a second copy to keep in sync",
455
+ write: () => null,
456
+ stable: true,
457
+ holds: (cfg) => {
458
+ if (cfg.backfill.bot_login !== cfg.github.bot_login)
459
+ return "[backfill] bot_login no longer follows [github] bot_login";
460
+ if (cfg.backfill.bot_actor !== cfg.github.app_slug)
461
+ return "[backfill] bot_actor no longer follows [github] app_slug";
462
+ if (cfg.backfill.trigger_label !== cfg.github.trigger_label)
463
+ return "[backfill] trigger_label no longer follows [github] trigger_label";
464
+ return null;
465
+ },
466
+ },
467
+ {
468
+ id: "sink_kind",
469
+ path: "[sink] kind",
470
+ explain: 'defect auto-filing defaults to "github" — flagged defects become issues on the reviewed repo, through the one mutation gate',
471
+ write: (_f, fresh) => fresh ? { section: "sink", key: "kind", value: tomlString("github") } : null,
472
+ stable: false,
473
+ // The loader's parseSink refuses an unknown kind before any derivation is
474
+ // checked, so a parsed config always holds this.
475
+ holds: () => null,
476
+ },
477
+ {
478
+ id: "tui_target",
479
+ path: "[tui] target",
480
+ explain: 'follows the recorded topology: "local" when the daemon runs on this machine (the TUI talks to local Docker), "ssh" on the VM route',
481
+ write: (f) => {
482
+ const target = tuiTargetFor(f.topology);
483
+ return target ? { section: "tui", key: "target", value: tomlString(target) } : null;
484
+ },
485
+ stable: true,
486
+ holds: (cfg, f) => {
487
+ const want = tuiTargetFor(f.topology);
488
+ return want && cfg.tui.target !== want
489
+ ? `[tui] target = "${cfg.tui.target}", but the recorded topology is ${f.topology} — the TUI would ` +
490
+ `${want === "local" ? "look for the daemon over ssh" : "look for the daemon in local Docker"}. ` +
491
+ `Fix: run this step again (it writes target = "${want}")`
492
+ : null;
493
+ },
494
+ },
495
+ {
496
+ id: "tui_container",
497
+ path: "[tui] container",
498
+ explain: "the bundled local Compose project runs service daemon as quickreview-daemon-1; preserve an operator's custom container",
499
+ write: (f, fresh, existing) => f.topology === "local" && (fresh || existing?.tui.container === TUI_DEFAULTS.container)
500
+ ? { section: "tui", key: "container", value: tomlString("quickreview-daemon-1") }
501
+ : null,
502
+ stable: false,
503
+ holds: () => null,
504
+ },
505
+ {
506
+ id: "tui_memory_container",
507
+ path: "[tui] memory_container",
508
+ explain: "the bundled local Compose project runs the memory sidecar as quickreview-memory-1, where the memory forward must relay; preserve an operator's custom container",
509
+ write: (f, fresh, existing) => f.topology === "local" && (fresh || (existing?.tui.memory_container ?? "") === "")
510
+ ? { section: "tui", key: "memory_container", value: tomlString("quickreview-memory-1") }
511
+ : null,
512
+ stable: false,
513
+ holds: () => null,
514
+ },
515
+ {
516
+ id: "tui_ssh_host",
517
+ path: "[tui] ssh_host",
518
+ explain: "empty on the local topology (the TUI needs no ssh hop to reach a daemon on this machine); the recorded alias on the VM route",
519
+ write: (f) => f.ssh_host ? { section: "tui", key: "ssh_host", value: tomlString(f.ssh_host) } : null,
520
+ stable: false,
521
+ holds: () => null,
522
+ },
523
+ {
524
+ id: "server_hostname",
525
+ path: "[server] hostname",
526
+ explain: "left empty where the chosen ingress assigns the hostname itself (the quick tunnel writes it at start-up)",
527
+ write: (f) => f.webhook_hostname
528
+ ? { section: "server", key: "hostname", value: tomlString(f.webhook_hostname) }
529
+ : null,
530
+ stable: false,
531
+ holds: () => null,
532
+ },
533
+ {
534
+ id: "companion_repo_dir",
535
+ path: "[companion] repo_dir",
536
+ explain: "left empty so the companion's /workspace mount derives from the sandbox root — never a path to keep in sync",
537
+ write: () => null,
538
+ stable: true,
539
+ holds: (cfg) => isAbsolute(cfg.companion.repo_dir)
540
+ ? null
541
+ : "[companion] repo_dir did not derive to an absolute path",
542
+ },
543
+ {
544
+ id: "escalation_mention_fallback",
545
+ path: "[review] escalation_mention_default",
546
+ explain: "falls back to the owner's GitHub login when the interview leaves it blank",
547
+ write: (f) => {
548
+ const mention = f.escalation_mention || f.owner_github_login;
549
+ return mention
550
+ ? { section: "review", key: "escalation_mention_default", value: tomlString(mention) }
551
+ : null;
552
+ },
553
+ stable: false,
554
+ holds: () => null,
555
+ },
556
+ {
557
+ id: "dry_run",
558
+ path: "dry_run",
559
+ explain: "NEVER written by this step, in either direction (rule 1: the flag is the owner's alone). A fresh config ships the " +
560
+ "template's true; an existing config keeps exactly the value it has. The offered go-live flip is its own act.",
561
+ write: () => null,
562
+ stable: false,
563
+ holds: () => null,
564
+ },
565
+ ];
566
+ // ---- fill ------------------------------------------------------------------
567
+ export function rootFromStateDir(stateDir) {
568
+ return sandboxRoot({ stateDir });
569
+ }
570
+ export function templatePathFor(root) {
571
+ return join(root, "config.example.toml");
572
+ }
573
+ /** Empty = the install locator's answer: `<config home>/secrets`. */
574
+ export const DEFAULT_SECRETS_DIR = "";
575
+ /** The secret files `deploy/collect-secrets.sh` requires, by deployment shape.
576
+ * Read from ITS artefacts (the `deploy_shape` marker it writes) so this step
577
+ * reports the same required set without duplicating the wizard's validators. */
578
+ export const REQUIRED_SECRETS = ["app_id", "app.pem", "webhook_secret"];
579
+ export const TUNNEL_SHAPE_SECRET = "tunnel_token";
580
+ /** Unlike `readTextOrNull`, only ABSENCE is null: a file that exists and
581
+ * cannot be read is an error, never "no config" — the template must not be
582
+ * renamed over an operator's file (and its dry_run) we could not even see. */
583
+ function readExisting(path) {
584
+ try {
585
+ return { text: readFileSync(path, "utf8"), error: null };
586
+ }
587
+ catch (err) {
588
+ const code = err.code;
589
+ if (code === "ENOENT")
590
+ return { text: null, error: null };
591
+ return { text: null, error: code ?? String(err) };
592
+ }
593
+ }
594
+ /** The current config, when there is one that parses. A config that does NOT
595
+ * parse is not an error here — it is exactly what this step is for — but its
596
+ * values cannot be offered as defaults, so the answers fall back to asking. */
597
+ function currentConfig(path) {
598
+ if (!existsSync(path))
599
+ return null;
600
+ try {
601
+ return loadConfig(path);
602
+ }
603
+ catch {
604
+ return null;
605
+ }
606
+ }
607
+ /** Choice keys this step alone writes. A value recorded under one is this
608
+ * step's OWN earlier answer — never a sibling's word — so it ranks with the
609
+ * previous answers a fresh argument overrides, not above them. */
610
+ const OWN_ANSWER_KEYS = new Set(Object.keys(CHOICE_WRITERS)
611
+ .filter((n) => CHOICE_WRITERS[n].length === 1 && CHOICE_WRITERS[n][0] === CONFIG_FILL_STEP_ID)
612
+ .map((n) => CHOICE_KEYS[n]));
613
+ /** The tool argument for one question: a string the operator gave, or null
614
+ * when the call did not carry one. */
615
+ function inputAnswer(ctx, id) {
616
+ const v = ctx.input[id];
617
+ return typeof v === "string" ? v.trim() : null;
618
+ }
619
+ /** How an unanswered question is answered on the pi-driven route. */
620
+ function argumentHint(q) {
621
+ return `${q.prompt} — pass the answer as the \`${q.id}\` argument`;
622
+ }
623
+ /** How many times one question may be re-asked before the step fails with the
624
+ * validator's guidance. Enough for a typo, few enough that a wedged prompter
625
+ * cannot loop forever. */
626
+ export const MAX_ATTEMPTS = 3;
627
+ /**
628
+ * Run the interview. Precedence per question: a value a SIBLING step recorded
629
+ * in the checklist (a key some other step writes) > a fresh answer (the tool
630
+ * argument, else the prompter's) > the default a blank answer keeps: the
631
+ * current config value when the config parses (the file wins, as verify says),
632
+ * else this step's own previous answer. With neither an argument nor a
633
+ * prompter the recorded/current values stand alone, and anything genuinely
634
+ * unanswered is reported — never guessed. Every value that lands, whatever
635
+ * its source, passes the question's validator.
636
+ */
637
+ export async function collectAnswers(ctx, cfg, previous,
638
+ /** The text `cfg` was parsed from: a kept value is read as the FILE spells
639
+ * it, so a portable `~/…` is never replaced by the loader's expansion. */
640
+ configText = null) {
641
+ const choices = ctx.choices;
642
+ const prompter = ctx.adapters.prompter;
643
+ const answers = {};
644
+ const missing = [];
645
+ const rejected = [];
646
+ const asked = [];
647
+ const ignored = [];
648
+ for (const q of QUESTIONS) {
649
+ const given = inputAnswer(ctx, q.id);
650
+ if (!questionAsked(q, choices)) {
651
+ if (given)
652
+ ignored.push({
653
+ id: q.id,
654
+ detail: `the argument "${given}" was not used — the recorded topology/ingress does not ask this question`,
655
+ });
656
+ continue;
657
+ }
658
+ const from = q.from ?? [];
659
+ const recorded = from
660
+ .filter((k) => !OWN_ANSWER_KEYS.has(k))
661
+ .map((k) => str(choices, k))
662
+ .find((v) => v.length > 0) ?? "";
663
+ if (recorded && q.validate(recorded) === null) {
664
+ answers[q.id] = recorded;
665
+ if (given && given !== recorded)
666
+ ignored.push({
667
+ id: q.id,
668
+ detail: `kept "${recorded}", which an earlier step recorded — the argument "${given}" was not used (re-run the step that owns it to change it)`,
669
+ });
670
+ continue;
671
+ }
672
+ const ownRecorded = from
673
+ .filter((k) => OWN_ANSWER_KEYS.has(k))
674
+ .map((k) => str(choices, k))
675
+ .find((v) => v.length > 0);
676
+ const fallback = cfg
677
+ ? ((configText !== null ? readTomlKey(configText, q.section, q.key) : null) ?? q.read(cfg))
678
+ : (previous[q.id] ?? ownRecorded ?? "");
679
+ if (given !== null || !prompter) {
680
+ const value = given || fallback;
681
+ if (!value) {
682
+ if (q.optional)
683
+ answers[q.id] = "";
684
+ else
685
+ missing.push({ id: q.id, title: q.title, guidance: argumentHint(q) });
686
+ continue;
687
+ }
688
+ const reason = q.validate(value);
689
+ if (reason === null)
690
+ answers[q.id] = value;
691
+ else
692
+ rejected.push({
693
+ id: q.id,
694
+ guidance: `${given ? "" : `the kept value "${value}" no longer holds: `}${reason} — pass a corrected \`${q.id}\` argument`,
695
+ });
696
+ continue;
697
+ }
698
+ let settled = false;
699
+ let guidance = "";
700
+ for (let attempt = 0; attempt < MAX_ATTEMPTS && !settled; attempt++) {
701
+ const suffix = fallback ? ` [${fallback}]` : q.optional ? " [skip]" : "";
702
+ const head = attempt === 0 ? `${q.teach}\n` : `${guidance}\n`;
703
+ const raw = (await prompter(`${head}${q.prompt}${suffix}: `)).trim();
704
+ asked.push(q.id);
705
+ const value = raw || fallback;
706
+ if (!value) {
707
+ if (q.optional) {
708
+ answers[q.id] = "";
709
+ settled = true;
710
+ break;
711
+ }
712
+ guidance = "that answer is required — there is no sensible default for it";
713
+ continue;
714
+ }
715
+ const reason = q.validate(value);
716
+ if (reason === null) {
717
+ answers[q.id] = value;
718
+ settled = true;
719
+ break;
720
+ }
721
+ guidance = reason;
722
+ }
723
+ if (!settled)
724
+ rejected.push({ id: q.id, guidance: guidance || "no valid answer" });
725
+ }
726
+ const facts = {
727
+ repo: answers.repo ?? "",
728
+ app_slug: answers.app_slug ?? "",
729
+ reviewed_repo_dir: answers.reviewed_repo_dir ?? "",
730
+ owner_name: answers.owner_name ?? "",
731
+ owner_github_login: answers.owner_github_login ?? "",
732
+ owner_slack_id: answers.owner_slack_id ?? "",
733
+ timezone: answers.timezone ?? "",
734
+ base_branch: answers.base_branch ?? "",
735
+ escalation_mention: answers.escalation_mention ?? "",
736
+ ssh_host: answers.ssh_host ?? "",
737
+ webhook_hostname: answers.webhook_hostname ?? "",
738
+ secrets_dir: str(choices, CHOICE_KEYS.secretsDir) ||
739
+ (cfg ? cfg.github.secrets_dir : "") ||
740
+ DEFAULT_SECRETS_DIR,
741
+ topology: str(choices, CHOICE_KEYS.topology),
742
+ ingress: str(choices, CHOICE_KEYS.ingress),
743
+ };
744
+ return { facts, missing, rejected, asked, ignored };
745
+ }
746
+ /** Every edit the fill would make — answers first, then the derivations. The
747
+ * caller filters this against the source document so only real changes land. */
748
+ export function buildEdits(facts, choices, fresh, existing) {
749
+ const edits = [];
750
+ for (const q of QUESTIONS) {
751
+ if (!questionAsked(q, choices))
752
+ continue;
753
+ edits.push({ section: q.section, key: q.key, value: tomlString(facts[q.id]) });
754
+ }
755
+ for (const d of DERIVABLES) {
756
+ const w = d.write(facts, fresh, existing);
757
+ if (w)
758
+ edits.push(w);
759
+ }
760
+ // Later wins: a derivation over the same key (the escalation-mention
761
+ // fallback) is deliberately the last word.
762
+ const seen = new Map();
763
+ for (const e of edits)
764
+ seen.set(`${e.section}.${e.key}`, e);
765
+ const out = [...seen.values()];
766
+ assertNoDryRunEdit(out);
767
+ return out;
768
+ }
769
+ /** Drop edits whose value the document already carries — this is what makes a
770
+ * re-run TARGETED rather than a rewrite (and byte-identical when nothing
771
+ * changed). Comparison is on the rendered value, so formatting never counts. */
772
+ export function changedEdits(text, edits) {
773
+ let parsed;
774
+ try {
775
+ parsed = parseToml(text);
776
+ }
777
+ catch {
778
+ parsed = undefined;
779
+ }
780
+ const lines = text.split("\n");
781
+ const sections = sectionAt(lines);
782
+ return edits.filter((edit) => {
783
+ if (parsed !== undefined) {
784
+ try {
785
+ const before = tomlValueAt(parsed, edit.section, edit.key);
786
+ const after = parseToml(`value = ${edit.value}`)["value"];
787
+ if (before !== undefined && typeof before !== "object" && Object.is(before, after))
788
+ return false;
789
+ }
790
+ catch {
791
+ /* The line reader below decides whether a malformed value needs repair. */
792
+ }
793
+ }
794
+ const re = new RegExp(`^\\s*(${escapeRe(edit.key)})(\\s*=\\s*)(.*)$`);
795
+ for (let i = 0; i < lines.length; i++) {
796
+ if (sections[i] !== edit.section)
797
+ continue;
798
+ const m = re.exec(lines[i]);
799
+ if (!m)
800
+ continue;
801
+ const parts = splitTail(m[3]);
802
+ if (!parts)
803
+ return true;
804
+ if (parts.value === edit.value)
805
+ return false;
806
+ try {
807
+ const before = parseToml(`value = ${parts.value}`)["value"];
808
+ const after = parseToml(`value = ${edit.value}`)["value"];
809
+ return typeof before === "object" || !Object.is(before, after);
810
+ }
811
+ catch {
812
+ return true;
813
+ }
814
+ }
815
+ return true;
816
+ });
817
+ }
818
+ /** What the secrets dir holds, at the one resolution every step uses. */
819
+ function secretsReport(dir) {
820
+ if (!existsSync(dir)) {
821
+ return {
822
+ name: "secrets",
823
+ ok: true,
824
+ detail: `${dir} does not exist yet — the App credential lands there (the manifest step writes it, or run \`bash deploy/collect-secrets.sh\`)`,
825
+ };
826
+ }
827
+ const shape = (readTextOrNull(join(dir, "deploy_shape")) ?? "").trim();
828
+ const required = [...REQUIRED_SECRETS, ...(shape === "tunnel" ? [TUNNEL_SHAPE_SECRET] : [])];
829
+ const missing = required.filter((f) => !existsSync(join(dir, f)));
830
+ return {
831
+ name: "secrets",
832
+ ok: true,
833
+ detail: missing.length
834
+ ? `${dir}: still missing ${missing.join(", ")} — filled by the GitHub App step or \`bash deploy/collect-secrets.sh\` (this step never asks for a secret)`
835
+ : `${dir}: every secret this deployment shape needs is present`,
836
+ };
837
+ }
838
+ function recordChoices(ctx, facts, configPath, parsed) {
839
+ ctx.recordChoice(CHOICE_KEYS.repo, facts.repo);
840
+ ctx.recordChoice(CHOICE_KEYS.repoDir, expandHome(facts.reviewed_repo_dir));
841
+ ctx.recordChoice(CHOICE_KEYS.appSlug, facts.app_slug);
842
+ ctx.recordChoice(CHOICE_KEYS.baseBranch, facts.base_branch);
843
+ ctx.recordChoice(CHOICE_KEYS.timezone, facts.timezone);
844
+ ctx.recordChoice(CHOICE_KEYS.ownerLogin, facts.owner_github_login);
845
+ ctx.recordChoice(CHOICE_KEYS.secretsDir, facts.secrets_dir);
846
+ ctx.recordChoice(CHOICE_KEYS.configPath, configPath);
847
+ ctx.recordChoice(CHOICE_KEYS.dryRun, parsed.dry_run);
848
+ // The label NAMES this installation triggers on, straight off the file the
849
+ // daemon itself reads — so the App step creates the labels this config
850
+ // means rather than the shipped defaults (a customised label name would
851
+ // otherwise be lost).
852
+ ctx.recordChoice(CHOICE_KEYS.labels, {
853
+ trigger: parsed.github.trigger_label,
854
+ in_progress: parsed.github.in_progress_label,
855
+ reviewed: parsed.github.reviewed_label,
856
+ });
857
+ }
858
+ function previousAnswers(ctx) {
859
+ const raw = ctx.data.answers;
860
+ if (typeof raw !== "object" || raw === null)
861
+ return {};
862
+ const out = {};
863
+ for (const [k, v] of Object.entries(raw)) {
864
+ if (typeof v === "string")
865
+ out[k] = v;
866
+ }
867
+ return out;
868
+ }
869
+ /** The tool's argument schema: one optional string per interview question,
870
+ * described by its title, prompt and the concept it teaches. */
871
+ function configFillParameters() {
872
+ const properties = {};
873
+ for (const q of QUESTIONS) {
874
+ properties[q.id] = {
875
+ type: "string",
876
+ description: `${q.title}. ${q.prompt}${q.optional ? " Optional." : ""} ${q.teach}`,
877
+ };
878
+ }
879
+ return { type: "object", properties };
880
+ }
881
+ export function configFillStep(opts = {}) {
882
+ return {
883
+ id: CONFIG_FILL_STEP_ID,
884
+ title: "Interview and fill config.toml",
885
+ explain: "Asks the handful of things only you can answer — the repository to review, your checkout of it, the App slug, " +
886
+ "who you are, your timezone, the default branch — and computes everything else (the bot login, the clone " +
887
+ "directory, the timezone cascade, the defect sink). It patches the shipped template in place, so every comment " +
888
+ "in your config survives, and it re-runs as targeted edits over your own file rather than a rewrite. The review " +
889
+ "flag `dry_run` is never written here: a fresh config ships the template's true, an existing one keeps exactly " +
890
+ "the value it has, and going live is a separate, explicit act later. Pass the operator's answers as the " +
891
+ "arguments (one per question; an omitted or blank one keeps the current value); a run that still lacks a " +
892
+ "required answer names it and writes nothing.",
893
+ order: 35,
894
+ parameters: configFillParameters(),
895
+ async run(ctx) {
896
+ const root = rootFromStateDir(ctx.adapters.paths.stateDir);
897
+ const configPath = ctx.adapters.paths.configPath;
898
+ const templatePath = templatePathFor(root);
899
+ const current = readExisting(configPath);
900
+ if (current.error !== null) {
901
+ return {
902
+ ok: false,
903
+ checks: [
904
+ {
905
+ name: "config",
906
+ ok: false,
907
+ detail: `${configPath} exists but cannot be read (${current.error}) — nothing was written: replacing it from the ` +
908
+ "template would lose every setting in it. Fix its ownership/permissions and run this step again",
909
+ },
910
+ ],
911
+ };
912
+ }
913
+ const existing = current.text;
914
+ const source = existing ?? readTextOrNull(templatePath);
915
+ if (source === null) {
916
+ return {
917
+ ok: false,
918
+ checks: [
919
+ {
920
+ name: "template",
921
+ ok: false,
922
+ detail: `neither ${configPath} nor the shipped template ${templatePath} is readable — is this a complete checkout?`,
923
+ },
924
+ ],
925
+ };
926
+ }
927
+ const cfg = currentConfig(configPath);
928
+ const collected = await collectAnswers(ctx, cfg, previousAnswers(ctx), existing);
929
+ const checks = collected.ignored.map((i) => ({
930
+ name: `answer:${i.id}`,
931
+ ok: true,
932
+ detail: i.detail,
933
+ }));
934
+ if (collected.missing.length || collected.rejected.length) {
935
+ for (const m of collected.missing) {
936
+ checks.push({
937
+ name: `answer:${m.id}`,
938
+ ok: false,
939
+ detail: `${m.title} was never answered — ${m.guidance}`,
940
+ });
941
+ }
942
+ for (const r of collected.rejected) {
943
+ checks.push({
944
+ name: `answer:${r.id}`,
945
+ ok: false,
946
+ detail: `the answer was not usable — ${r.guidance}`,
947
+ });
948
+ }
949
+ return { ok: false, checks };
950
+ }
951
+ const facts = collected.facts;
952
+ const wanted = buildEdits(facts, ctx.choices, existing === null, cfg ?? undefined);
953
+ const edits = changedEdits(source, wanted);
954
+ const rendered = edits.length ? patchToml(source, edits) : source;
955
+ // Parse BEFORE writing: a config that would not load never reaches disk.
956
+ let parsed;
957
+ const probe = writeProbe(ctx.adapters.paths.stateDir, rendered);
958
+ try {
959
+ parsed = loadConfig(probe);
960
+ }
961
+ catch (err) {
962
+ return {
963
+ ok: false,
964
+ checks: [
965
+ ...checks,
966
+ {
967
+ name: "loader",
968
+ ok: false,
969
+ detail: `the filled config would not load: ${String(err.message)} — nothing was written`,
970
+ },
971
+ ],
972
+ };
973
+ }
974
+ finally {
975
+ rmSync(probe, { force: true });
976
+ }
977
+ if (existing === null && parsed.dry_run !== true) {
978
+ return {
979
+ ok: false,
980
+ checks: [
981
+ ...checks,
982
+ {
983
+ name: "dry_run",
984
+ ok: false,
985
+ detail: "the shipped template no longer ships dry_run = true — refusing to write (rule 1)",
986
+ },
987
+ ],
988
+ };
989
+ }
990
+ if (rendered !== source)
991
+ writeAtomic(configPath, rendered);
992
+ const delivery = await deliverConfigChange(ctx, opts.transport, ctx.data.restart_owed === true || (existing !== null && rendered !== source), CONFIG_FILL_STEP_ID);
993
+ checks.push(...delivery.checks);
994
+ checks.push({
995
+ name: "config",
996
+ ok: true,
997
+ detail: rendered === source
998
+ ? `${configPath} already carried every answer — nothing rewritten`
999
+ : `${configPath} ${existing === null ? "created from config.example.toml" : "updated"}: ${edits.length} key${edits.length === 1 ? "" : "s"} (${edits
1000
+ .map((e) => `${e.section ? `[${e.section}] ` : ""}${e.key}`)
1001
+ .join(", ")})`,
1002
+ });
1003
+ checks.push({
1004
+ name: "loader",
1005
+ ok: true,
1006
+ detail: "the strict loader parses the file as written",
1007
+ });
1008
+ for (const d of DERIVABLES) {
1009
+ const reason = d.holds(parsed, facts);
1010
+ checks.push(reason === null
1011
+ ? { name: `derived:${d.id}`, ok: true, detail: `${d.path} — ${d.explain}` }
1012
+ : { name: `derived:${d.id}`, ok: false, detail: reason });
1013
+ }
1014
+ checks.push({
1015
+ name: "dry_run",
1016
+ ok: true,
1017
+ detail: `dry_run = ${parsed.dry_run} — untouched by this step; every GitHub mutation is recorded to state/dryrun/ while it is true`,
1018
+ });
1019
+ // Which shape the fill was made for, said out loud: the two conditional
1020
+ // questions hang off these, and an unrecorded choice is an ASSUMPTION,
1021
+ // never a silent one. The topology/ingress steps own the choices; this
1022
+ // step only reads them.
1023
+ checks.push({
1024
+ name: "shape",
1025
+ ok: true,
1026
+ detail: `topology ${facts.topology || "(unrecorded — filled for a daemon on this machine, so [tui] ssh_host stays empty)"}, ` +
1027
+ `ingress ${facts.ingress || "(unrecorded — filled for an ingress that assigns its own hostname, so [server] hostname stays empty)"}` +
1028
+ `${str(ctx.choices, CHOICE_KEYS.authRoute) ? `, auth route ${str(ctx.choices, CHOICE_KEYS.authRoute)}` : ""}`,
1029
+ });
1030
+ // Read after the write, so the dir is the one the written config names.
1031
+ checks.push(secretsReport(secretsDirFor(ctx.adapters, ctx.choices)));
1032
+ const ok = checks.every((c) => c.ok);
1033
+ if (ok)
1034
+ recordChoices(ctx, facts, configPath, parsed);
1035
+ return {
1036
+ ok,
1037
+ checks,
1038
+ data: {
1039
+ answers: Object.fromEntries(QUESTIONS.filter((q) => questionAsked(q, ctx.choices)).map((q) => [q.id, facts[q.id]])),
1040
+ config_path: configPath,
1041
+ restart_owed: delivery.restartOwed,
1042
+ filled_from: existing === null ? "config.example.toml" : "config.toml",
1043
+ },
1044
+ };
1045
+ },
1046
+ async verify(ctx) {
1047
+ const configPath = ctx.adapters.paths.configPath;
1048
+ if (!existsSync(configPath)) {
1049
+ return {
1050
+ ok: false,
1051
+ checks: [
1052
+ {
1053
+ name: "config",
1054
+ ok: false,
1055
+ detail: `${configPath} does not exist — run the config step`,
1056
+ },
1057
+ ],
1058
+ };
1059
+ }
1060
+ let cfg;
1061
+ try {
1062
+ cfg = loadConfig(configPath);
1063
+ }
1064
+ catch (err) {
1065
+ return {
1066
+ ok: false,
1067
+ checks: [
1068
+ {
1069
+ name: "loader",
1070
+ ok: false,
1071
+ detail: `${configPath} does not load: ${String(err.message)}`,
1072
+ },
1073
+ ],
1074
+ };
1075
+ }
1076
+ const checks = [
1077
+ ...configDeliveryChecks(ctx),
1078
+ { name: "loader", ok: true, detail: `${configPath} parses under the strict loader` },
1079
+ ];
1080
+ const previous = previousAnswers(ctx);
1081
+ for (const q of QUESTIONS) {
1082
+ if (!questionAsked(q, ctx.choices))
1083
+ continue;
1084
+ const current = q.read(cfg);
1085
+ if (!current) {
1086
+ checks.push(q.optional
1087
+ ? { name: `answer:${q.id}`, ok: true, detail: `${q.title}: empty (optional)` }
1088
+ : {
1089
+ name: `answer:${q.id}`,
1090
+ ok: false,
1091
+ detail: `${q.title} is still empty in ${configPath} — re-run the config step`,
1092
+ });
1093
+ continue;
1094
+ }
1095
+ const reason = q.validate(current);
1096
+ if (reason !== null) {
1097
+ checks.push({
1098
+ name: `answer:${q.id}`,
1099
+ ok: false,
1100
+ detail: `${q.title} is not usable as configured: ${reason}`,
1101
+ });
1102
+ continue;
1103
+ }
1104
+ const recorded = previous[q.id];
1105
+ checks.push({
1106
+ name: `answer:${q.id}`,
1107
+ ok: true,
1108
+ detail: recorded && recorded !== current
1109
+ ? `${q.title}: "${current}" (changed since onboarding — your file wins)`
1110
+ : `${q.title}: "${current}"`,
1111
+ });
1112
+ }
1113
+ // Only the STABLE derivations are invariants; the rest are fill-time
1114
+ // defaults the operator is free to change afterwards.
1115
+ const facts = {
1116
+ ...Object.fromEntries(QUESTIONS.map((q) => [q.id, q.read(cfg)])),
1117
+ secrets_dir: cfg.github.secrets_dir,
1118
+ topology: str(ctx.choices, CHOICE_KEYS.topology),
1119
+ ingress: str(ctx.choices, CHOICE_KEYS.ingress),
1120
+ };
1121
+ for (const d of DERIVABLES) {
1122
+ if (!d.stable)
1123
+ continue;
1124
+ const reason = d.holds(cfg, facts);
1125
+ checks.push(reason === null
1126
+ ? { name: `derived:${d.id}`, ok: true, detail: `${d.path} holds` }
1127
+ : { name: `derived:${d.id}`, ok: false, detail: reason });
1128
+ }
1129
+ // dry_run is REPORTED, never judged: true is the shipped posture and
1130
+ // false is the owner's own flip (rule 1). Neither is red.
1131
+ checks.push({
1132
+ name: "dry_run",
1133
+ ok: true,
1134
+ detail: `dry_run = ${cfg.dry_run} (the owner's flag; this step never writes it)`,
1135
+ });
1136
+ return { ok: checks.every((c) => c.ok), checks };
1137
+ },
1138
+ };
1139
+ }
1140
+ /** Write the candidate to a scratch file under the state dir and hand back its
1141
+ * path, so the REAL loader (not a re-implementation of it) is what decides
1142
+ * whether the fill is good — before anything lands on config.toml. */
1143
+ function writeProbe(stateDir, content) {
1144
+ const path = join(stateDir, "onboarding", "config.candidate.toml");
1145
+ writeAtomic(path, content);
1146
+ return path;
1147
+ }
1148
+ //# sourceMappingURL=configfill.js.map