@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,1063 @@
1
+ // The GitHub adapter. Reads run directly on the installation token; every
2
+ // mutation is expressed as a MutationIntent and pushed through the gate
3
+ // (dry-run writes it to state/dryrun/ instead of executing). There is no
4
+ // review-dismissal function in this adapter, by design — never add one.
5
+ import { GitHubRequestError, } from "@quickchatai/pi-quickreview/src/githubcore.js";
6
+ import { ThreadResolutionRefusal } from "./thread-resolution-refusal.js";
7
+ import { reviewTeamSlug } from "./config.js";
8
+ import { CHECK_THIS_RE, DEFERRED_RE } from "@quickchatai/pi-quickreview/src/severity.js";
9
+ import { APP_SELF_CONFIG_KINDS, } from "@quickchatai/pi-quickreview/src/gate.js";
10
+ import { appActorAlias, GITHUB_REQUEST_TIMEOUT_MS, } from "@quickchatai/pi-quickreview/src/githubAuth.js";
11
+ /** A pulls-endpoint PR as a `PrRef`. `merged` is the caller's: the single-PR
12
+ * read carries it, the open-PR list does not. */
13
+ function toPrRef(pr, merged) {
14
+ return {
15
+ number: pr.number,
16
+ title: pr.title,
17
+ author: pr.user.login,
18
+ head_sha: pr.head.sha,
19
+ base_ref: pr.base?.ref ?? "",
20
+ body: pr.body ?? "",
21
+ updated_at: pr.updated_at,
22
+ state: pr.state,
23
+ draft: pr.draft,
24
+ merged,
25
+ labels: (pr.labels ?? []).map((l) => l.name),
26
+ };
27
+ }
28
+ function toReviewCommentFull(c) {
29
+ return {
30
+ id: c.id,
31
+ user: c.user?.login ?? "",
32
+ user_type: c.user?.type ?? "User",
33
+ body: c.body ?? "",
34
+ path: c.path ?? "",
35
+ line: c.line ?? c.original_line ?? null,
36
+ pull_request_review_id: c.pull_request_review_id ?? null,
37
+ in_reply_to_id: c.in_reply_to_id ?? null,
38
+ created_at: c.created_at ?? null,
39
+ original_line: c.original_line ?? null,
40
+ };
41
+ }
42
+ /** How many newest-first pages `listRecentReviewComments` reads to reach the
43
+ * comment a lost reply answered. */
44
+ const RECENT_COMMENTS_MAX_PAGES = 10;
45
+ /** GitHub search serves at most 1,000 hits: ten pages of 100. */
46
+ const TRIGGER_SEARCH_MAX_PAGES = 10;
47
+ /** The trigger events the history importer reconstructs — one list for the
48
+ * first query and every follow-up page. */
49
+ const HISTORY_TIMELINE_TYPES = "[LABELED_EVENT, REVIEW_REQUESTED_EVENT, HEAD_REF_FORCE_PUSHED_EVENT]";
50
+ /** Hard stop for a connection walk — a server that keeps answering
51
+ * hasNextPage with a cursor that never ends cannot loop forever. */
52
+ const MAX_CONNECTION_PAGES = 50;
53
+ /** Every node of a connection: the first page as already fetched, then each
54
+ * `next(cursor)` until GitHub says there is no next page. A connection still
55
+ * going after `MAX_CONNECTION_PAGES` throws rather than answer a partial
56
+ * history as the whole of it. */
57
+ async function walkConnection(first, next) {
58
+ const out = [];
59
+ let conn = first;
60
+ for (let page = 1; conn; page++) {
61
+ out.push(...(conn.nodes ?? []).filter((n) => n !== null && n !== undefined));
62
+ const info = conn.pageInfo;
63
+ if (!info?.hasNextPage || !info.endCursor)
64
+ break;
65
+ if (page >= MAX_CONNECTION_PAGES)
66
+ throw new Error(`connection exceeded ${MAX_CONNECTION_PAGES} pages — history would be partial`);
67
+ conn = await next(info.endCursor);
68
+ }
69
+ return out;
70
+ }
71
+ /** Selection sets shared by a history query's first page and its follow-ups,
72
+ * so the two can never request different fields. */
73
+ const HISTORY_REVIEWS_BODY = "pageInfo { hasNextPage endCursor } nodes { databaseId state submittedAt body commit { oid } }";
74
+ const HISTORY_TIMELINE_BODY = `pageInfo { hasNextPage endCursor }
75
+ nodes {
76
+ __typename
77
+ ... on LabeledEvent { createdAt label { name } actor { login } }
78
+ ... on ReviewRequestedEvent { createdAt requestedReviewer { ... on Team { slug } ... on User { login } } }
79
+ ... on HeadRefForcePushedEvent { createdAt }
80
+ }`;
81
+ const DIGEST_COMMENTS_BODY = "pageInfo { hasNextPage endCursor } nodes { author { __typename login } path body }";
82
+ const DIGEST_REVIEWS_BODY = `pageInfo { hasNextPage endCursor }
83
+ nodes {
84
+ id author { __typename login } state submittedAt body
85
+ comments(first: 100) { ${DIGEST_COMMENTS_BODY} }
86
+ }`;
87
+ /** GitHub serves a compare's changed files on its first page only, capped at
88
+ * this many. A list that long is a floor, not the delta. */
89
+ export const COMPARE_FILES_CAP = 300;
90
+ /** GitHub serves at most this many pages of 100 from `pulls/<n>/files`. */
91
+ const PR_FILES_MAX_PAGES = 30;
92
+ // The error a refused request throws is the review core's (packages/pi-plugin/src/githubcore.ts).
93
+ export { GitHubRequestError };
94
+ /** A response body as UTF-8 text, at most `max` bytes of it, read as a stream so
95
+ * a large log never sits in memory whole: the first `max` bytes, or with `tail`
96
+ * the last. A cut that splits a character loses that character only. */
97
+ export async function cappedText(res, max, tail) {
98
+ if (res.body === null)
99
+ return { text: "", truncated: false };
100
+ const chunks = [];
101
+ let held = 0;
102
+ let truncated = false;
103
+ const reader = res.body.getReader();
104
+ for (;;) {
105
+ const { done, value } = await reader.read();
106
+ if (done)
107
+ break;
108
+ let chunk = Buffer.from(value);
109
+ if (!tail) {
110
+ if (held + chunk.length > max) {
111
+ chunk = chunk.subarray(0, max - held);
112
+ truncated = true;
113
+ }
114
+ chunks.push(chunk);
115
+ held += chunk.length;
116
+ if (truncated) {
117
+ await reader.cancel().catch(() => { });
118
+ break;
119
+ }
120
+ continue;
121
+ }
122
+ chunks.push(chunk);
123
+ held += chunk.length;
124
+ while (held > max && chunks.length > 0) {
125
+ truncated = true;
126
+ const first = chunks[0];
127
+ const over = held - max;
128
+ if (first.length <= over) {
129
+ chunks.shift();
130
+ held -= first.length;
131
+ }
132
+ else {
133
+ chunks[0] = first.subarray(over);
134
+ held -= over;
135
+ }
136
+ }
137
+ }
138
+ return { text: Buffer.concat(chunks).toString("utf8"), truncated };
139
+ }
140
+ /** One files-API entry (pulls/files and compare share the shape). */
141
+ function fileEntry(f) {
142
+ return {
143
+ filename: f.filename,
144
+ additions: f.additions,
145
+ deletions: f.deletions,
146
+ status: f.status,
147
+ ...(typeof f.patch === "string" ? { patch: f.patch } : {}),
148
+ ...(typeof f.previous_filename === "string" ? { previous_filename: f.previous_filename } : {}),
149
+ };
150
+ }
151
+ export class GitHubAdapter {
152
+ cfg;
153
+ minter;
154
+ gate;
155
+ fetchFn;
156
+ apiBase;
157
+ owner;
158
+ repo;
159
+ constructor(cfg, minter, gate, fetchFn = fetch, apiBase = "https://api.github.com") {
160
+ this.cfg = cfg;
161
+ this.minter = minter;
162
+ this.gate = gate;
163
+ this.fetchFn = fetchFn;
164
+ this.apiBase = apiBase;
165
+ const [owner, repo] = cfg.github.repo.split("/");
166
+ if (!owner || !repo)
167
+ throw new Error(`bad repo: ${cfg.github.repo}`);
168
+ this.owner = owner;
169
+ this.repo = repo;
170
+ }
171
+ // ---- plumbing ----------------------------------------------------------
172
+ async request(method, path, body, auth = "installation") {
173
+ const send = (token) => this.fetchFn(`${this.apiBase}${path}`, {
174
+ method,
175
+ signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
176
+ headers: {
177
+ authorization: `Bearer ${token}`,
178
+ accept: "application/vnd.github+json",
179
+ "x-github-api-version": "2022-11-28",
180
+ ...(body !== undefined ? { "content-type": "application/json" } : {}),
181
+ },
182
+ body: body !== undefined ? JSON.stringify(body) : undefined,
183
+ });
184
+ const res = auth === "jwt" ? await send(this.minter.appJwt()) : await this.sendInstallation(send);
185
+ if (!res.ok) {
186
+ const retryAfter = res.headers?.get("retry-after");
187
+ const reset = res.headers?.get("x-ratelimit-reset");
188
+ const retryAfterMs = retryAfter
189
+ ? /^\d+$/.test(retryAfter)
190
+ ? Number(retryAfter) * 1000
191
+ : Math.max(0, Date.parse(retryAfter) - Date.now())
192
+ : reset
193
+ ? Math.max(0, Number(reset) * 1000 - Date.now())
194
+ : undefined;
195
+ throw new GitHubRequestError(method, path, res.status, (await res.text()).slice(0, 300), Number.isFinite(retryAfterMs) ? retryAfterMs : undefined);
196
+ }
197
+ if (res.status === 204)
198
+ return undefined;
199
+ return (await res.json());
200
+ }
201
+ /** Send with an installation token; on a 401 drop the rejected response
202
+ * body, invalidate the cached token and send once more with a fresh one.
203
+ * The one owner of the installation-token 401 policy. */
204
+ async sendInstallation(send) {
205
+ let res = await send(await this.minter.installationToken());
206
+ if (res.status === 401) {
207
+ await res.body?.cancel().catch(() => { });
208
+ this.minter.invalidate();
209
+ res = await send(await this.minter.installationToken());
210
+ }
211
+ return res;
212
+ }
213
+ graphqlFetch(token, query, variables) {
214
+ return this.fetchFn(`${this.apiBase}/graphql`, {
215
+ method: "POST",
216
+ signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
217
+ headers: { authorization: `Bearer ${token}`, "content-type": "application/json" },
218
+ body: JSON.stringify({ query, variables }),
219
+ });
220
+ }
221
+ /** One GraphQL query, with REST's deadline and its one re-mint on a 401. */
222
+ async graphql(query, variables) {
223
+ const res = await this.sendInstallation((token) => this.graphqlFetch(token, query, variables));
224
+ if (!res.ok) {
225
+ let detail = "";
226
+ try {
227
+ detail = (await res.text()).slice(0, 300);
228
+ }
229
+ catch {
230
+ // No readable body: the status alone.
231
+ }
232
+ throw new Error(`graphql → ${res.status}${detail ? `: ${detail}` : ""}`);
233
+ }
234
+ const payload = (await res.json());
235
+ if (payload.errors?.length)
236
+ throw new Error(`graphql errors: ${JSON.stringify(payload.errors).slice(0, 300)}`);
237
+ return payload.data;
238
+ }
239
+ /**
240
+ * A session helper's read, served by the daemon (src/ghread.ts): one
241
+ * GET of `path` with the installation token, redirects followed (fetch drops
242
+ * the Authorization header on a cross-origin hop, which is what the Actions
243
+ * log storage wants), answered as GitHub answered it — the status and at most
244
+ * `maxBytes` of the body as text, the head or, with `tail`, the end. An HTTP
245
+ * error status is an answer, not a throw; only a request that never got one
246
+ * throws. The caller has already checked `path` is a read of the reviewed repo.
247
+ */
248
+ async readText(path, o) {
249
+ return this.rawAnswer(o, (token) => this.fetchFn(`${this.apiBase}${path}`, {
250
+ method: "GET",
251
+ redirect: "follow",
252
+ signal: AbortSignal.timeout(GITHUB_REQUEST_TIMEOUT_MS),
253
+ headers: {
254
+ authorization: `Bearer ${token}`,
255
+ accept: "application/vnd.github+json",
256
+ "x-github-api-version": "2022-11-28",
257
+ },
258
+ }));
259
+ }
260
+ /** The same for one GraphQL read: the caller supplies a query it holds itself
261
+ * (src/ghread.ts GH_READ_QUERIES), never one a session wrote. */
262
+ async graphqlText(query, variables, o) {
263
+ return this.rawAnswer(o, (token) => this.graphqlFetch(token, query, variables));
264
+ }
265
+ /** One raw request with REST's one re-mint on a 401, its body capped. */
266
+ async rawAnswer(o, send) {
267
+ const res = await this.sendInstallation(send);
268
+ const { text, truncated } = await cappedText(res, o.maxBytes, o.tail === true);
269
+ return { status: res.status, body: text, truncated };
270
+ }
271
+ /** The mutation executor the gate runs when it decides a mutation is real —
272
+ * every kind in live mode, and the app-self-config class in dry-run too.
273
+ * The gate, never a call site, makes that decision. */
274
+ executeMutation = async (intent) => {
275
+ if (intent.method === "git")
276
+ throw new Error("git pushes are executed by the caller, not the REST executor");
277
+ if (intent.path === "/graphql") {
278
+ const body = intent.body;
279
+ if (typeof body?.query !== "string" ||
280
+ typeof body.variables !== "object" ||
281
+ body.variables === null) {
282
+ throw new Error(`invalid GraphQL mutation intent for ${intent.kind}`);
283
+ }
284
+ return this.graphql(body.query, body.variables);
285
+ }
286
+ // App-self-config intents address the App's own configuration:
287
+ // GitHub authenticates those routes with the App JWT, not an installation
288
+ // token — the same auth split request() already carries for the
289
+ // /app/hook/deliveries read.
290
+ const auth = APP_SELF_CONFIG_KINDS.includes(intent.kind)
291
+ ? "jwt"
292
+ : "installation";
293
+ return this.request(intent.method, intent.path, intent.body, auth);
294
+ };
295
+ // ---- triggered-set queries (reads) -------------------------------------
296
+ /** One page of issue search (100 hits). GitHub's search may time out and
297
+ * answer a partial set; absence read from it would be invented, so the read
298
+ * fails with `incompleteMessage` rather than answers. */
299
+ async searchIssuePage(q, page, incompleteMessage) {
300
+ const res = await this.request("GET", `/search/issues?q=${encodeURIComponent(q)}&per_page=100&page=${page}`);
301
+ if (res.incomplete_results === true)
302
+ throw new Error(incompleteMessage);
303
+ return res.items ?? [];
304
+ }
305
+ /** Every hit, not the first 100: the reconcile pass reads a PR missing from
306
+ * this list as trigger-ABSENT, so a truncated page would fake an absent →
307
+ * present edge the moment search order reshuffled it back in. */
308
+ async searchIssues(q) {
309
+ const out = [];
310
+ for (let page = 1; page <= TRIGGER_SEARCH_MAX_PAGES; page++) {
311
+ const items = await this.searchIssuePage(q, page, `trigger search "${q}" answered incomplete results`);
312
+ out.push(...items);
313
+ if (items.length < 100)
314
+ return out;
315
+ }
316
+ throw new Error(`trigger search "${q}" exceeded ${TRIGGER_SEARCH_MAX_PAGES} pages`);
317
+ }
318
+ /** Every page of a list endpoint that answers a bare JSON array. `path`
319
+ * carries `per_page=100`; a short page ends the read and `maxPages` bounds
320
+ * it — `truncated` says the bound, not the list, ended it. */
321
+ async pagedArray(path, maxPages = 30) {
322
+ const rows = [];
323
+ for (let page = 1; page <= maxPages; page++) {
324
+ const batch = await this.request("GET", `${path}&page=${page}`);
325
+ rows.push(...batch);
326
+ if (batch.length < 100)
327
+ return { rows, truncated: false };
328
+ }
329
+ return { rows, truncated: true };
330
+ }
331
+ /** Paginated issue search — read-only, used by the history importer.
332
+ * Stops on a short page or after `maxPages` (search caps at 1,000 hits). */
333
+ async searchIssuesPaged(q, maxPages = 10) {
334
+ const out = [];
335
+ for (let page = 1; page <= maxPages; page++) {
336
+ const items = await this.searchIssuePage(q, page, "incomplete history search results");
337
+ out.push(...items);
338
+ if (items.length < 100)
339
+ break;
340
+ }
341
+ return out;
342
+ }
343
+ /** Read-only GraphQL per PR: the reviews `author` submitted plus the
344
+ * timeline items the backfill importer reconstructs triggers from — one
345
+ * query, then one more per further page of either connection. Returns null
346
+ * when the PR is gone. */
347
+ async prReviewHistory(n, author) {
348
+ const data = await this.graphql(`query ($owner: String!, $repo: String!, $number: Int!, $author: String!) {
349
+ repository(owner: $owner, name: $repo) {
350
+ pullRequest(number: $number) {
351
+ number title createdAt closedAt mergedAt merged
352
+ author { login }
353
+ reviews(author: $author, first: 100) { ${HISTORY_REVIEWS_BODY} }
354
+ timelineItems(itemTypes: ${HISTORY_TIMELINE_TYPES}, first: 100) { ${HISTORY_TIMELINE_BODY} }
355
+ }
356
+ }
357
+ }`, { owner: this.owner, repo: this.repo, number: n, author });
358
+ const pr = data.repository?.pullRequest;
359
+ if (!pr)
360
+ return null;
361
+ // A long PR's bot reviews run past 100 (every thread reply is a review):
362
+ // follow the cursors, or the importer silently loses the NEWEST ones.
363
+ const vars = { owner: this.owner, repo: this.repo, number: n, author };
364
+ const reviews = await walkConnection(pr.reviews, async (after) => {
365
+ const d = await this.graphql(`query ($owner: String!, $repo: String!, $number: Int!, $author: String!, $after: String!) {
366
+ repository(owner: $owner, name: $repo) {
367
+ pullRequest(number: $number) {
368
+ reviews(author: $author, first: 100, after: $after) { ${HISTORY_REVIEWS_BODY} }
369
+ }
370
+ }
371
+ }`, { ...vars, after });
372
+ return d.repository?.pullRequest?.reviews;
373
+ });
374
+ const timeline = await walkConnection(pr.timelineItems, async (after) => {
375
+ const d = await this.graphql(`query ($owner: String!, $repo: String!, $number: Int!, $after: String!) {
376
+ repository(owner: $owner, name: $repo) {
377
+ pullRequest(number: $number) {
378
+ timelineItems(itemTypes: ${HISTORY_TIMELINE_TYPES}, first: 100, after: $after) { ${HISTORY_TIMELINE_BODY} }
379
+ }
380
+ }
381
+ }`, { owner: this.owner, repo: this.repo, number: n, after });
382
+ return d.repository?.pullRequest?.timelineItems;
383
+ });
384
+ return {
385
+ number: pr.number ?? n,
386
+ title: pr.title ?? "",
387
+ author: pr.author?.login ?? "",
388
+ created_at: pr.createdAt ?? "",
389
+ closed_at: pr.closedAt ?? null,
390
+ merged_at: pr.mergedAt ?? null,
391
+ merged: Boolean(pr.merged),
392
+ reviews: reviews.map((r) => ({
393
+ database_id: r.databaseId ?? 0,
394
+ state: r.state ?? "",
395
+ submitted_at: r.submittedAt ?? null,
396
+ body: r.body ?? "",
397
+ commit_oid: r.commit?.oid ?? null,
398
+ })),
399
+ timeline: timeline
400
+ .filter((t) => Boolean(t.createdAt))
401
+ .map((t) => ({
402
+ type: t.__typename ?? "",
403
+ created_at: t.createdAt,
404
+ label: t.label?.name ?? null,
405
+ actor: t.actor?.login ?? null,
406
+ requested_team: t.requestedReviewer?.slug ?? null,
407
+ requested_user: t.requestedReviewer?.login ?? null,
408
+ })),
409
+ };
410
+ }
411
+ /** Read-only GraphQL per PR for the review history digest: every author's
412
+ * reviews, each with its inline comments, and the author's type so the
413
+ * digest can keep people and drop Apps — one query, then one more per
414
+ * further page of reviews or of one review's comments. Returns null when
415
+ * the PR is gone. */
416
+ async prReviews(n) {
417
+ const data = await this.graphql(`query ($owner: String!, $repo: String!, $number: Int!) {
418
+ repository(owner: $owner, name: $repo) {
419
+ pullRequest(number: $number) {
420
+ number title mergedAt
421
+ author { login }
422
+ reviews(first: 100) { ${DIGEST_REVIEWS_BODY} }
423
+ }
424
+ }
425
+ }`, { owner: this.owner, repo: this.repo, number: n });
426
+ const pr = data.repository?.pullRequest;
427
+ if (!pr)
428
+ return null;
429
+ // Reviews come oldest-first, so a truncated read drops the NEWEST human
430
+ // feedback — follow the cursors, and each long review's comment cursor.
431
+ const rawReviews = await walkConnection(pr.reviews, async (after) => {
432
+ const d = await this.graphql(`query ($owner: String!, $repo: String!, $number: Int!, $after: String!) {
433
+ repository(owner: $owner, name: $repo) {
434
+ pullRequest(number: $number) {
435
+ reviews(first: 100, after: $after) { ${DIGEST_REVIEWS_BODY} }
436
+ }
437
+ }
438
+ }`, { owner: this.owner, repo: this.repo, number: n, after });
439
+ return d.repository?.pullRequest?.reviews;
440
+ });
441
+ const commentsOf = (r) => walkConnection(r.comments, async (after) => {
442
+ if (!r.id)
443
+ return null;
444
+ const d = await this.graphql(`query ($id: ID!, $after: String!) {
445
+ node(id: $id) { ... on PullRequestReview { comments(first: 100, after: $after) { ${DIGEST_COMMENTS_BODY} } } }
446
+ }`, { id: r.id, after });
447
+ return d.node?.comments;
448
+ });
449
+ const reviews = [];
450
+ for (const r of rawReviews)
451
+ reviews.push({ r, comments: await commentsOf(r) });
452
+ const author = (a) => a ? { login: a.login ?? "", type: a.__typename ?? "" } : null;
453
+ return {
454
+ number: pr.number ?? n,
455
+ title: pr.title ?? "",
456
+ author: pr.author?.login ?? "",
457
+ merged_at: pr.mergedAt ?? null,
458
+ reviews: reviews.map(({ r, comments }) => ({
459
+ author: author(r.author),
460
+ state: r.state ?? "",
461
+ submitted_at: r.submittedAt ?? null,
462
+ body: r.body ?? "",
463
+ comments: comments.map((c) => ({
464
+ author: author(c.author),
465
+ path: c.path ?? null,
466
+ body: c.body ?? "",
467
+ })),
468
+ })),
469
+ };
470
+ }
471
+ /** PRs carrying the trigger label. Bot-authored PRs are excluded — the app
472
+ * can never approve its own PRs. */
473
+ async searchLabelTriggered() {
474
+ const q = `repo:${this.cfg.github.repo} is:open is:pr label:"${this.cfg.github.trigger_label}" -author:app/${this.cfg.github.app_slug}`;
475
+ return this.searchIssues(q);
476
+ }
477
+ /** PRs with a pending review-team request. */
478
+ async searchTeamTriggered() {
479
+ const q = `repo:${this.cfg.github.repo} is:open is:pr team-review-requested:${this.cfg.github.review_team} -author:app/${this.cfg.github.app_slug}`;
480
+ return this.searchIssues(q);
481
+ }
482
+ // ---- authoritative per-PR reads ----------------------------------------
483
+ async getPr(n) {
484
+ const pr = await this.request("GET", `/repos/${this.owner}/${this.repo}/pulls/${n}`);
485
+ return toPrRef(pr, Boolean(pr.merged));
486
+ }
487
+ /** Authoritative terminality read for operator debt cleanup. A PR-endpoint
488
+ * 404 is not enough by itself: GitHub also conceals inaccessible private
489
+ * repositories as 404. Absence therefore requires a second installation-
490
+ * authenticated read proving access to this exact repository. */
491
+ async getPrDisposition(n) {
492
+ const path = `/repos/${this.owner}/${this.repo}/pulls/${n}`;
493
+ try {
494
+ const raw = await this.request("GET", path);
495
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
496
+ throw new Error(`malformed PR #${n} response`);
497
+ }
498
+ const pr = raw;
499
+ if (pr.number !== n)
500
+ throw new Error(`PR endpoint #${n} returned number ${String(pr.number)}`);
501
+ if (pr.state !== "open" && pr.state !== "closed")
502
+ throw new Error(`unexpected PR #${n} state ${String(pr.state)}`);
503
+ const head = pr.head?.sha;
504
+ if (typeof head !== "string" || head.length === 0)
505
+ throw new Error(`malformed PR #${n} head sha`);
506
+ return { kind: pr.state, head_sha: head };
507
+ }
508
+ catch (error) {
509
+ if (!(error instanceof GitHubRequestError &&
510
+ error.method === "GET" &&
511
+ error.path === path &&
512
+ error.status === 404))
513
+ throw error;
514
+ const repoPath = `/repos/${this.owner}/${this.repo}`;
515
+ const rawRepo = await this.request("GET", repoPath);
516
+ if (typeof rawRepo !== "object" || rawRepo === null || Array.isArray(rawRepo)) {
517
+ throw new Error(`malformed repository proof for ${this.owner}/${this.repo}`, {
518
+ cause: error,
519
+ });
520
+ }
521
+ const fullName = rawRepo.full_name;
522
+ const expected = `${this.owner}/${this.repo}`;
523
+ if (typeof fullName !== "string" || fullName.toLowerCase() !== expected.toLowerCase()) {
524
+ throw new Error(`repository proof mismatch for ${expected}`, { cause: error });
525
+ }
526
+ return { kind: "absent" };
527
+ }
528
+ }
529
+ /** Read-only conversation surface for the TUI detail pane:
530
+ * PR description, labels, and the newest issue comments, oldest-first.
531
+ *
532
+ * The per-issue comments endpoint ignores `sort`/`direction` (those belong
533
+ * to the repo-wide listing) and always answers oldest-first, so the newest
534
+ * comments are on the LAST page: its index comes off the PR's own comment
535
+ * count, and the page before it is read too when the last one is short. */
536
+ async prConversation(n, commentCount = 3) {
537
+ const pr = await this.request("GET", `/repos/${this.owner}/${this.repo}/pulls/${n}`);
538
+ const path = `/repos/${this.owner}/${this.repo}/issues/${n}/comments?per_page=100`;
539
+ let comments;
540
+ if (typeof pr.comments === "number") {
541
+ const last = Math.max(1, Math.ceil(pr.comments / 100));
542
+ comments = await this.request("GET", `${path}&page=${last}`);
543
+ if (comments.length < commentCount && last > 1)
544
+ comments = [...(await this.request("GET", `${path}&page=${last - 1}`)), ...comments];
545
+ }
546
+ else {
547
+ comments = (await this.pagedArray(path)).rows;
548
+ }
549
+ return {
550
+ body: pr.body ?? "",
551
+ labels: (pr.labels ?? []).map((l) => l.name),
552
+ comments: comments.slice(-commentCount).map((c) => ({
553
+ author: c.user?.login ?? "?",
554
+ body: c.body ?? "",
555
+ created_at: c.created_at ?? "",
556
+ })),
557
+ };
558
+ }
559
+ /** EVERY open PR: the list is newest-first, so a first-page read drops the
560
+ * oldest tracked PRs out of reconcile step 1 entirely. */
561
+ async listOpenPrs() {
562
+ const { rows: prs, truncated } = await this.pagedArray(`/repos/${this.owner}/${this.repo}/pulls?state=open&per_page=100`);
563
+ // A PR past the bound would silently miss every head refresh: a partial
564
+ // list fails the read instead.
565
+ if (truncated)
566
+ throw new Error("open PRs exceeded the pagination bound");
567
+ // An open PR is not merged; the list endpoint does not carry `merged`.
568
+ return prs.map((pr) => toPrRef(pr, false));
569
+ }
570
+ async getRequestedReviewers(n) {
571
+ const res = await this.request("GET", `/repos/${this.owner}/${this.repo}/pulls/${n}/requested_reviewers`);
572
+ return { users: res.users.map((u) => u.login), teams: res.teams.map((t) => t.slug) };
573
+ }
574
+ /** Every file GitHub will list for the PR (it serves 3,000 at most). A list
575
+ * that reaches that cap is flagged `truncated`: it is a floor, and ownership
576
+ * decisions made off it must not treat a missing file as not-the-PR's. */
577
+ async listPrFiles(n) {
578
+ const { rows, truncated } = await this.pagedArray(`/repos/${this.owner}/${this.repo}/pulls/${n}/files?per_page=100`, PR_FILES_MAX_PAGES);
579
+ const out = rows.map(fileEntry);
580
+ if (truncated)
581
+ out.truncated = true;
582
+ return out;
583
+ }
584
+ /**
585
+ * Files a commit range changed (`GET /compare/<base>...<head>`) — the delta
586
+ * source for the post-approval recheck. Read-only. GitHub serves
587
+ * the files on the FIRST page only (later pages page the commits) and caps
588
+ * them at COMPARE_FILES_CAP, so a list that long is flagged `truncated`: the
589
+ * classifier must not read an unseen remainder as "nothing PR-owned".
590
+ * A behind/diverged comparison is merge-base-relative rather than the two
591
+ * reviewed trees; it also cannot prove an empty post-approval delta.
592
+ */
593
+ async compareFiles(base, head) {
594
+ const res = await this.request("GET", `/repos/${this.owner}/${this.repo}/compare/${encodeURIComponent(base)}...${encodeURIComponent(head)}?per_page=100&page=1`);
595
+ const files = res.files ?? [];
596
+ const out = files.map(fileEntry);
597
+ if (files.length >= COMPARE_FILES_CAP || res.status === "behind" || res.status === "diverged")
598
+ out.truncated = true;
599
+ return out;
600
+ }
601
+ /**
602
+ * Checks at a ref — check-runs plus the legacy commit statuses, since a repo
603
+ * can gate on either (guard 4). Read-only: CI is consulted, never
604
+ * triggered or re-run. Both endpoints are paginated the way listPrFiles is:
605
+ * guard 4 classifies what it is handed, so a failing or pending check past
606
+ * the first 100 rows must reach it, or a truncated list reads green.
607
+ */
608
+ async listChecks(ref) {
609
+ const out = [];
610
+ const enc = encodeURIComponent(ref);
611
+ const runs = await this.completeCheckPages(`/repos/${this.owner}/${this.repo}/commits/${enc}/check-runs`, "check_runs");
612
+ for (const r of runs)
613
+ out.push({
614
+ name: r.name ?? "check",
615
+ source: "check_run",
616
+ status: r.status ?? "",
617
+ conclusion: r.conclusion ?? null,
618
+ started_at: r.started_at ?? null,
619
+ });
620
+ const statuses = await this.completeCheckPages(`/repos/${this.owner}/${this.repo}/commits/${enc}/status`, "statuses");
621
+ for (const s of statuses)
622
+ out.push({
623
+ name: s.context ?? "status",
624
+ source: "status",
625
+ status: s.state === "pending" ? "pending" : "completed",
626
+ conclusion: s.state === "pending" ? null : s.state === "success" ? "success" : "failure",
627
+ });
628
+ return out;
629
+ }
630
+ /** Complete CI evidence, or an unreadable result that callers classify unknown. */
631
+ async completeCheckPages(path, field) {
632
+ const rows = [];
633
+ let expected;
634
+ for (let page = 1; page <= 10; page++) {
635
+ const result = await this.request("GET", `${path}?per_page=100&page=${page}`);
636
+ const count = result.total_count;
637
+ if (count !== undefined) {
638
+ if (typeof count !== "number" || !Number.isInteger(count) || count < 0)
639
+ throw new Error(`unreadable ${field} total_count`);
640
+ if (expected !== undefined && expected !== count)
641
+ throw new Error(`incomplete ${field}: count changed while reading`);
642
+ expected = count;
643
+ }
644
+ const batch = result[field];
645
+ if (!Array.isArray(batch))
646
+ throw new Error(`unreadable ${field} page`);
647
+ rows.push(...batch);
648
+ if (expected !== undefined && rows.length > expected)
649
+ throw new Error(`incomplete ${field}: rows exceed advertised count`);
650
+ if (batch.length < 100 || (expected !== undefined && rows.length === expected)) {
651
+ if (expected !== undefined && rows.length !== expected)
652
+ throw new Error(`incomplete ${field}: advertised count not reached`);
653
+ return rows;
654
+ }
655
+ }
656
+ throw new Error(`incomplete ${field}: page limit reached`);
657
+ }
658
+ async listReviews(n) {
659
+ // Every page, with no page bound: reviews are oldest-first and every
660
+ // thread reply is one, so on a long PR the human approval at the head is
661
+ // exactly what a bounded read misses — and guard 1 would then not soften
662
+ // over it. A short page ends the read, as for listReviewsFull.
663
+ return (await this.listReviewsFull(n)).map((r) => ({
664
+ id: r.id,
665
+ user: r.user,
666
+ state: r.state,
667
+ commit_id: r.commit_id,
668
+ }));
669
+ }
670
+ /** Full review rows (bodies included) — read-only, for compare and
671
+ * posting-marker reconciliation. Paginated so long-lived PRs cannot hide the
672
+ * accepted review beyond the first 100 rows. */
673
+ async listReviewsFull(n) {
674
+ const { rows } = await this.pagedArray(`/repos/${this.owner}/${this.repo}/pulls/${n}/reviews?per_page=100`, Number.POSITIVE_INFINITY);
675
+ return rows.map((r) => ({
676
+ id: r.id,
677
+ user: r.user?.login ?? "",
678
+ user_type: r.user?.type ?? "User",
679
+ state: r.state,
680
+ body: r.body ?? "",
681
+ commit_id: r.commit_id,
682
+ submitted_at: r.submitted_at ?? null,
683
+ }));
684
+ }
685
+ /** Top-level PR conversation comments — read-only, the feedback capture
686
+ * sweep's third source (the issues API is where GitHub keeps them). */
687
+ async listIssueComments(n) {
688
+ const { rows: res, truncated } = await this.pagedArray(`/repos/${this.owner}/${this.repo}/issues/${n}/comments?per_page=100`);
689
+ // A conversation retry must not read a partial list as proof that its
690
+ // earlier POST did not land. Capture callers already treat failure as unknown.
691
+ if (truncated)
692
+ throw new Error(`issue comments on #${n} exceeded the pagination bound`);
693
+ return res.map((c) => ({
694
+ id: c.id,
695
+ user: c.user?.login ?? "",
696
+ user_type: c.user?.type ?? "User",
697
+ body: c.body ?? "",
698
+ created_at: c.created_at ?? null,
699
+ }));
700
+ }
701
+ /** Every inline review comment, oldest first — read-only: the reconcile
702
+ * comment sweep, the case writer's backfill, the compare harness. A list
703
+ * past the pagination bound throws rather than answer its oldest part as
704
+ * the whole: a sweep that read a partial list would stamp its watermark and
705
+ * never look for the newer comments again. */
706
+ async listReviewCommentsFull(n) {
707
+ const { rows: res, truncated } = await this.pagedArray(`/repos/${this.owner}/${this.repo}/pulls/${n}/comments?per_page=100`);
708
+ if (truncated)
709
+ throw new Error(`inline comments on #${n} exceeded the pagination bound`);
710
+ return res.map(toReviewCommentFull);
711
+ }
712
+ /** The NEWEST inline review comments, newest first — read-only. The
713
+ * ping-pong retry path reads this to learn whether a reply whose POST
714
+ * response was lost actually landed, so the newest comments are the ones
715
+ * it needs. With `newerThan`, pages continue until one reaches a comment at
716
+ * or below that id (ids grow with creation, so every comment created after
717
+ * it has then been read) — or throw past `RECENT_COMMENTS_MAX_PAGES`, never
718
+ * answer a window that may have missed the reply. Without it, one page. */
719
+ async listRecentReviewComments(n, newerThan) {
720
+ const out = [];
721
+ for (let page = 1; page <= RECENT_COMMENTS_MAX_PAGES; page++) {
722
+ const res = await this.request("GET", `/repos/${this.owner}/${this.repo}/pulls/${n}/comments?sort=created&direction=desc&per_page=100&page=${page}`);
723
+ out.push(...res.map(toReviewCommentFull));
724
+ if (newerThan === undefined || res.length < 100)
725
+ return out;
726
+ if (res.some((c) => typeof c.id === "number" && c.id <= newerThan))
727
+ return out;
728
+ }
729
+ throw new Error(`inline comments on #${n} newer than ${newerThan} exceeded ${RECENT_COMMENTS_MAX_PAGES} pages`);
730
+ }
731
+ /** Review comments the bot authored on a PR — the registry backfill source.
732
+ * Read newest first, so a PR past the page bound loses its OLDEST comments
733
+ * (registered by earlier passes), never the newest. */
734
+ async listBotReviewComments(n) {
735
+ const { rows: res } = await this.pagedArray(`/repos/${this.owner}/${this.repo}/pulls/${n}/comments?sort=created&direction=desc&per_page=100`);
736
+ return res.filter((c) => c.user?.login === this.cfg.github.bot_login).map((c) => c.id);
737
+ }
738
+ // ---- staleness scan (GraphQL) -------------------------------------------
739
+ /** Open PRs whose latest bot APPROVED review no longer matches the head:
740
+ * `first: 100`, `UPDATED_AT DESC`, review author the configured
741
+ * `[github] bot_login`. */
742
+ async stalenessScan() {
743
+ const q = `repo:${this.cfg.github.repo} is:pr is:open sort:updated-desc`;
744
+ const data = await this.graphql(`query ($q: String!, $author: String!) {
745
+ search(query: $q, type: ISSUE, first: 100) {
746
+ nodes {
747
+ ... on PullRequest {
748
+ number
749
+ headRefOid
750
+ reviews(author: $author, states: [APPROVED], last: 1) {
751
+ nodes { state submittedAt commit { oid } }
752
+ }
753
+ }
754
+ }
755
+ }
756
+ }`, { q, author: this.cfg.github.bot_login });
757
+ const stale = [];
758
+ for (const node of data.search.nodes) {
759
+ if (!node.number || !node.headRefOid)
760
+ continue;
761
+ const review = node.reviews?.nodes?.[0];
762
+ if (!review?.commit)
763
+ continue;
764
+ if (review.commit.oid !== node.headRefOid) {
765
+ stale.push({
766
+ number: node.number,
767
+ head_sha: node.headRefOid,
768
+ approved_sha: review.commit.oid,
769
+ approved_at: review.submittedAt,
770
+ });
771
+ }
772
+ }
773
+ return stale;
774
+ }
775
+ // ---- webhook redeliveries (JWT) ----------------------------------------
776
+ async listWebhookDeliveries(perPage = 100) {
777
+ return this.request("GET", `/app/hook/deliveries?per_page=${perPage}`, undefined, "jwt");
778
+ }
779
+ // ---- the App's own webhook configuration -------------------------------
780
+ /** The App's own webhook config — the self-heal's read-back source. Direct
781
+ * JWT read, like the deliveries listing above. */
782
+ async getAppWebhookConfig() {
783
+ const res = await this.request("GET", "/app/hook/config", undefined, "jwt");
784
+ return {
785
+ url: res.url ?? "",
786
+ content_type: res.content_type ?? "",
787
+ insecure_ssl: res.insecure_ssl ?? "",
788
+ };
789
+ }
790
+ /**
791
+ * Re-point the App's OWN webhook URL (`PATCH /app/hook/config`, JWT-authed).
792
+ * The one member of the app-self-config gate class (AGENTS.md invariant 6): it
793
+ * touches only the App's own
794
+ * configuration, never the reviewed repo, and the gate executes it for real
795
+ * even in dry-run — loudly logged, with the note naming old and new URL.
796
+ */
797
+ async updateOwnWebhookUrl(newUrl, oldUrl) {
798
+ return this.gate.execute({
799
+ kind: "update_own_webhook_url",
800
+ method: "PATCH",
801
+ path: "/app/hook/config",
802
+ body: { url: newUrl },
803
+ note: `re-point own App webhook URL ${oldUrl || "(unknown)"} → ${newUrl}`,
804
+ });
805
+ }
806
+ // ---- mutations (all through the gate) ----------------------------------
807
+ async addLabel(n, label) {
808
+ return this.gate.execute({
809
+ kind: "add_label",
810
+ method: "POST",
811
+ path: `/repos/${this.owner}/${this.repo}/issues/${n}/labels`,
812
+ body: { labels: [label] },
813
+ note: `add label "${label}" to #${n}`,
814
+ pr: n,
815
+ });
816
+ }
817
+ async removeLabel(n, label) {
818
+ try {
819
+ return await this.gate.execute({
820
+ kind: "remove_label",
821
+ method: "DELETE",
822
+ path: `/repos/${this.owner}/${this.repo}/issues/${n}/labels/${encodeURIComponent(label)}`,
823
+ note: `remove label "${label}" from #${n}`,
824
+ pr: n,
825
+ });
826
+ }
827
+ catch (err) {
828
+ // Removing an already-absent label is the outcome we wanted — GitHub's
829
+ // 404 ("Label does not exist") is idempotent success, not an error —
830
+ // e.g. a label consumed by an earlier failed-dispatch cycle.
831
+ if (err instanceof GitHubRequestError && err.status === 404)
832
+ return { executed: false, response: { already_absent: label } };
833
+ throw err;
834
+ }
835
+ }
836
+ /** Consume the team trigger: DELETE with the JSON body, then verify. */
837
+ async deleteTeamReviewRequest(n) {
838
+ const teamSlug = reviewTeamSlug(this.cfg.github.review_team);
839
+ const result = await this.gate.execute({
840
+ kind: "delete_team_review_request",
841
+ method: "DELETE",
842
+ path: `/repos/${this.owner}/${this.repo}/pulls/${n}/requested_reviewers`,
843
+ body: { reviewers: [], team_reviewers: [teamSlug] },
844
+ note: `clear team review request (${teamSlug}) on #${n}`,
845
+ pr: n,
846
+ });
847
+ if (result.executed) {
848
+ const after = await this.getRequestedReviewers(n);
849
+ if (after.teams.includes(teamSlug))
850
+ throw new Error(`team request on #${n} survived DELETE`);
851
+ }
852
+ return result;
853
+ }
854
+ /**
855
+ * Put named people in this PR's review-requested queue — the second
856
+ * delivery shape of the optional escalation feature (the never-hand-to-a-human rule), an
857
+ * ordinary gated mutation.
858
+ *
859
+ * Three things this is not:
860
+ * * It is not a way to hand the review back. `src/escalation.ts` calls it
861
+ * only after the round's verdict has been decided and applied, and only
862
+ * alongside a comment that names the ONE thing being asked about —
863
+ * GitHub words the queue entry "review this pull request", which is
864
+ * exactly the framing the comment exists to correct.
865
+ * * It is not a dry-run exception. `request_reviewer` is an ordinary
866
+ * `MutationKind`: suppressed to `state/dryrun/` like everything else,
867
+ * `forceLive` throws on it, and it is not in `APP_SELF_CONFIG_KINDS`.
868
+ * * It is not review-dismissing. Rule 2 is untouched; requesting a review
869
+ * adds a reviewer and changes no existing review.
870
+ *
871
+ * Needs no new App permission: this is a POST on the same
872
+ * `/pulls/{n}/requested_reviewers` route the team-request DELETE already
873
+ * uses, and both are Pull requests: write, which the App manifest grants.
874
+ */
875
+ async requestEscalationReview(n, logins) {
876
+ const reviewers = logins.map((l) => l.trim().replace(/^@/, "")).filter(Boolean);
877
+ return this.gate.execute({
878
+ kind: "request_reviewer",
879
+ method: "POST",
880
+ path: `/repos/${this.owner}/${this.repo}/pulls/${n}/requested_reviewers`,
881
+ body: { reviewers },
882
+ note: `escalation: request review from ${reviewers.map((r) => `@${r}`).join(", ")} on #${n}`,
883
+ pr: n,
884
+ });
885
+ }
886
+ async createReview(n, payload, options) {
887
+ return this.gate.execute({
888
+ kind: "create_review",
889
+ method: "POST",
890
+ path: `/repos/${this.owner}/${this.repo}/pulls/${n}/reviews`,
891
+ body: payload,
892
+ note: `post ${payload.event} review on #${n}${options?.postingRetry ? " (deferred delivery)" : ""}`,
893
+ pr: n,
894
+ reviewPurpose: options?.purpose,
895
+ ...(options?.postingRetry !== undefined ? { postingRetry: options.postingRetry } : {}),
896
+ });
897
+ }
898
+ /** A claimed PR-level author response; ordinary posting guards and dry-run apply. */
899
+ async createIssueComment(n, body) {
900
+ return this.gate.execute({
901
+ kind: "create_issue_comment",
902
+ method: "POST",
903
+ path: `/repos/${this.owner}/${this.repo}/issues/${n}/comments`,
904
+ body: { body },
905
+ note: `answer the author in PR #${n}'s conversation`,
906
+ pr: n,
907
+ });
908
+ }
909
+ async createReviewCommentReply(n, commentId, body) {
910
+ return this.gate.execute({
911
+ kind: "create_review_comment_reply",
912
+ method: "POST",
913
+ path: `/repos/${this.owner}/${this.repo}/pulls/${n}/comments/${commentId}/replies`,
914
+ body: { body },
915
+ note: `reply in thread ${commentId} on #${n}`,
916
+ pr: n,
917
+ });
918
+ }
919
+ /** Resolve one inline review thread, but only after a read verifies that the
920
+ * numeric root comment belongs to this PR and was authored by this app.
921
+ * There is intentionally no generic resolve-thread mutation surface. */
922
+ async resolveOwnReviewThread(n, rootCommentId) {
923
+ const query = `query ($owner: String!, $repo: String!, $number: Int!, $after: String) {
924
+ repository(owner: $owner, name: $repo) {
925
+ pullRequest(number: $number) {
926
+ reviewThreads(first: 100, after: $after) {
927
+ nodes { id isResolved comments(first: 1) { nodes { databaseId author { login } body } } }
928
+ pageInfo { hasNextPage endCursor }
929
+ }
930
+ }
931
+ }
932
+ }`;
933
+ let after = null;
934
+ let found;
935
+ do {
936
+ const data = await this.graphql(query, {
937
+ owner: this.owner,
938
+ repo: this.repo,
939
+ number: n,
940
+ after,
941
+ });
942
+ const threads = data.repository?.pullRequest?.reviewThreads;
943
+ if (!threads)
944
+ throw new Error(`review threads unavailable for #${n}`);
945
+ for (const thread of threads.nodes) {
946
+ const root = thread.comments.nodes[0];
947
+ if (root?.databaseId === rootCommentId) {
948
+ found = {
949
+ id: thread.id,
950
+ isResolved: thread.isResolved,
951
+ author: root.author?.login ?? "",
952
+ body: root.body ?? "",
953
+ };
954
+ break;
955
+ }
956
+ }
957
+ if (found || !threads.pageInfo.hasNextPage)
958
+ break;
959
+ after = threads.pageInfo.endCursor;
960
+ } while (after);
961
+ if (!found)
962
+ throw new ThreadResolutionRefusal(`comment ${rootCommentId} is not a review-thread root on #${n}`);
963
+ // GitHub exposes the same App actor with two spellings: review-author
964
+ // filters use the `[bot]` login, while review-thread GraphQL actors use the
965
+ // bare App slug. Both values are independently configured; recognize
966
+ // exactly that pair here and nowhere else. Every unrelated identity stays
967
+ // structurally refused.
968
+ const bareAppActor = appActorAlias(this.cfg.github.bot_login, this.cfg.github.app_slug);
969
+ const ownActors = new Set([this.cfg.github.bot_login, bareAppActor].filter((v) => v !== undefined));
970
+ if (!ownActors.has(found.author)) {
971
+ throw new ThreadResolutionRefusal(`refusing to resolve thread ${rootCommentId} on #${n}: root author is ${found.author || "unknown"}`);
972
+ }
973
+ // A "[check this]" thread exists to force a human's eyes before merge (repo
974
+ // rule: every conversation must be resolved). The reviewer never resolves
975
+ // one — the author or another human only.
976
+ if (CHECK_THIS_RE.test(found.body))
977
+ return { skipped: "check-this-human-only" };
978
+ // A "[deferred]" thread says this finding is real and this PR is not where
979
+ // it gets fixed. If the author ignores the drafted ticket, the reviewer
980
+ // must not be able to tidy the thread away — that would make a deferral
981
+ // free again, which is the exact thing this mechanism exists to stop. So it
982
+ // takes the same structural refusal as "[check this]", and the repo's merge
983
+ // rule (every conversation resolved) puts a person in front of it. Distinct
984
+ // marker, distinct reason string: the two are never conflated, here or
985
+ // anywhere.
986
+ if (DEFERRED_RE.test(found.body))
987
+ return { skipped: "deferred-human-only" };
988
+ // An "[ask your human]" thread is deliberately not refused here. It is the
989
+ // sibling marker, not a second spelling of the one above: it addresses the
990
+ // PR author's AI implementer ("do not answer this yourself — ask a person
991
+ // and bring the answer back"), so what a human owes the thread is the
992
+ // answer, not the resolution. Making it human-only would force a person
993
+ // into every such thread, and the ordinary path already lands in the right
994
+ // place — ping-pong resolves such a thread only after the author replied
995
+ // and the session judged the reply settles it, and the prior-finding
996
+ // resolver only for a finding a later round reported fixed or obsolete.
997
+ // Rule 2 is
998
+ // unaffected: this resolves the bot's OWN finding thread and never
999
+ // dismisses or edits any review, anyone's.
1000
+ if (found.isResolved)
1001
+ return { skipped: "already-resolved" };
1002
+ const mutation = `mutation ($threadId: ID!) {
1003
+ resolveReviewThread(input: {threadId: $threadId}) { thread { id isResolved } }
1004
+ }`;
1005
+ const result = await this.gate.execute({
1006
+ kind: "resolve_own_review_thread",
1007
+ method: "POST",
1008
+ path: "/graphql",
1009
+ body: { query: mutation, variables: { threadId: found.id } },
1010
+ note: `resolve own review thread ${rootCommentId} on #${n}`,
1011
+ pr: n,
1012
+ });
1013
+ return { skipped: null, result };
1014
+ }
1015
+ async createIssue(title, body, labels) {
1016
+ return this.gate.execute({
1017
+ kind: "create_issue",
1018
+ method: "POST",
1019
+ path: `/repos/${this.owner}/${this.repo}/issues`,
1020
+ body: { title, body, labels },
1021
+ note: `file issue "${title}"`,
1022
+ });
1023
+ }
1024
+ /** Every open issue carrying the configured label, whoever filed it. */
1025
+ async listOpenLabelledIssues() {
1026
+ const q = `repo:${this.cfg.github.repo} is:open is:issue label:"${this.cfg.github.issue_label}"`;
1027
+ return (await this.searchIssues(q)).map((i) => ({ number: i.number, title: i.title }));
1028
+ }
1029
+ /** Recover only an exact daemon marker posted by our configured identity.
1030
+ * Absence is not permission to repeat an uncertain creation. */
1031
+ async findFiledItem(kind, marker, branch) {
1032
+ const path = kind === "issue"
1033
+ ? `/repos/${this.owner}/${this.repo}/issues?state=all&per_page=100`
1034
+ : `/repos/${this.owner}/${this.repo}/pulls?state=all&per_page=100&head=${encodeURIComponent(`${this.owner}:${branch.head}`)}&base=${encodeURIComponent(branch.base)}`;
1035
+ const { rows, truncated } = await this.pagedArray(path);
1036
+ if (truncated)
1037
+ throw new Error("filing reconciliation exceeded pagination bound");
1038
+ const matches = rows.filter((row) => row.user?.login === this.cfg.github.bot_login &&
1039
+ typeof row.body === "string" &&
1040
+ row.body.split(/\r?\n/).includes(marker) &&
1041
+ (kind === "issue"
1042
+ ? !row.pull_request
1043
+ : row.head?.ref === branch?.head && row.base?.ref === branch?.base));
1044
+ if (matches.length > 1)
1045
+ throw new Error("ambiguous filing markers");
1046
+ if (matches.length === 0)
1047
+ return null;
1048
+ const number = matches[0].number;
1049
+ if (typeof number !== "number" || !Number.isSafeInteger(number) || number <= 0)
1050
+ throw new Error("invalid filing receipt number");
1051
+ return number;
1052
+ }
1053
+ async createPull(head, base, title, body) {
1054
+ return this.gate.execute({
1055
+ kind: "create_pull",
1056
+ method: "POST",
1057
+ path: `/repos/${this.owner}/${this.repo}/pulls`,
1058
+ body: { head, base, title, body },
1059
+ note: `open PR ${head} → ${base}: "${title}"`,
1060
+ });
1061
+ }
1062
+ }
1063
+ //# sourceMappingURL=github.js.map