@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,1077 @@
1
+ // `[7] feedback` — the tuning loop on one surface, end to end:
2
+ //
3
+ // signal the inbox: every `#feedback` memory entry, newest first,
4
+ // acted-on ones archived (`a` shows them)
5
+ // adjudication the selected signal's card, and what the record says about it
6
+ // proposal PROPOSED: the companion's rubric proposals, `A` accept / `x` reject
7
+ // change CHANGED: the register of feedback-derived commits, newest first
8
+ // revert `R` arms a revert of the focused change, `y` runs it
9
+ // filed a summary of the tracker tickets adjudication opened ([4] is the list)
10
+ //
11
+ // The whole loop lives here so that adjudicating a signal and learning what
12
+ // it changed happen in one place, not across tabs.
13
+ //
14
+ // The revert confirmation is deliberate. The board is read-only over
15
+ // ssh with a short list of user-initiated exceptions and this revert is one:
16
+ // it writes a commit into the checkout the companion is live in, and the rows
17
+ // in the register look alike by construction (same author, same prefix,
18
+ // one-line subjects), so the realistic failure is reverting the row NEXT to
19
+ // the one you meant. `R` arms and paints exactly what will happen — the sha,
20
+ // the subject, the literal git command, and the fact that nothing is pushed —
21
+ // and `y` runs it. Any other key cancels, the same grammar the quit prompt
22
+ // uses. The register itself (what counts as one, how reverts are read back)
23
+ // lives in `changelog-store.ts`.
24
+ import { proposalKey } from "../setup/pins.js";
25
+ import { FEEDBACK_FULL_TEXT_LABEL, readFencedData } from "../memory/datafence.js";
26
+ import { parseEventTags, parseHashTags } from "../memory/eventtags.js";
27
+ import { lessonHeadline, lessonSectionTitle, lessonTierLine } from "../memory/shadowstatus.js";
28
+ import type { StatusSnapshot } from "../state.js";
29
+ import type { App } from "./app.js";
30
+ import {
31
+ revertArgv,
32
+ type ChangeEntry,
33
+ type ChangeLogProblem,
34
+ type ChangeRegister,
35
+ type RevertResult,
36
+ } from "./changelog-store.js";
37
+ import { barHeight, paintCmdBar, type BarButton, type LiveKeys } from "./cmdbar.js";
38
+ import {
39
+ ACCENT,
40
+ BAD,
41
+ HEADING,
42
+ MUTED,
43
+ OK,
44
+ RESET,
45
+ SEP,
46
+ STRONG,
47
+ WARN,
48
+ button,
49
+ modeBadge,
50
+ sectionTitle,
51
+ selected as selectedLine,
52
+ } from "./design.js";
53
+ import { emptyLine } from "./emptystate.js";
54
+ import { keyChar, type BoardKey } from "./keys.js";
55
+ import type { LearningStore } from "./learning.js";
56
+ import { timelineOrder, type MemoryEntry } from "./memory.js";
57
+ import { moveSelection } from "./model.js";
58
+ import { hitTest, type Zone } from "./mouse.js";
59
+ import { Frame, fit, rule, sanitizeText, truncate, wrap } from "./paint.js";
60
+ import {
61
+ paintSplit,
62
+ splitWidths,
63
+ windowStart,
64
+ zonedRow,
65
+ type RowChunk,
66
+ type ZonedRow,
67
+ } from "./panes.js";
68
+ import { tabDigit } from "./tabs.js";
69
+ import { FG, fmtAge } from "./theme.js";
70
+ import { isActionableTicket } from "./trackertickets.js";
71
+
72
+ // ---- the signal, as a card ----------------------------------------------------
73
+
74
+ export type FeedbackStatus = "unprocessed" | "settled" | "needs-attention" | "acted-on";
75
+
76
+ export interface FeedbackPresentation {
77
+ pr?: string;
78
+ episode: string;
79
+ /** Looked-at is independent of whether the episode reached a verdict. */
80
+ processed: boolean;
81
+ status: FeedbackStatus;
82
+ listTitle: string;
83
+ title: string;
84
+ summary: string;
85
+ raw: string;
86
+ learning: string;
87
+ }
88
+
89
+ /** Header-only (`parseHashTags`), not `e.tags`: the store's tag list is a
90
+ * full-text scan, and a feedback entry quotes a human comment verbatim — a
91
+ * comment mentioning `#adjudication` must not turn its own signal into a
92
+ * disposition record and drop it from the inbox. */
93
+ const hasTag = (e: MemoryEntry, tag: string): boolean => parseHashTags(e.text).includes(tag);
94
+
95
+ const isDisposition = (e: MemoryEntry): boolean =>
96
+ hasTag(e, "adjudication") || hasTag(e, "feedback-review") || hasTag(e, "feedback-action");
97
+
98
+ /**
99
+ * The inbox: every `#feedback` signal, newest first. Disposition records
100
+ * describe the processing of a signal and are not themselves another signal
101
+ * row — they stay in `all` so the selected card can prove its badge. An
102
+ * action receipt is the archive transition: the original signal remains
103
+ * durable in memory but leaves the active inbox unless `showArchived`.
104
+ */
105
+ export function feedbackInbox(entries: MemoryEntry[], showArchived = false): MemoryEntry[] {
106
+ return timelineOrder(entries).filter((e) => {
107
+ if (!hasTag(e, "feedback") || isDisposition(e)) return false;
108
+ return showArchived || feedbackPresentation(e, entries)?.status !== "acted-on";
109
+ });
110
+ }
111
+
112
+ function feedbackRaw(text: string): string {
113
+ // The comment's full text, when the entry carries it — what
114
+ // the human wrote, not the sentence's 280-character cut.
115
+ const full = readFencedData(text, FEEDBACK_FULL_TEXT_LABEL);
116
+ if (full !== null && full.trim() !== "") return full.trim();
117
+ const quoted = /\):\s*"([\s\S]*)"\s+—\s+/.exec(text);
118
+ if (quoted?.[1]) return quoted[1].trim();
119
+ return text.replace(/^(?:#[^\s]+\s+)*(?:[a-z][a-z0-9_-]*=[^\s]+\s+)*/, "").trim();
120
+ }
121
+
122
+ function feedbackEpisode(e: MemoryEntry, signal: string): string {
123
+ if (signal === "feedback_comment") {
124
+ const id = /\bcomment\s+(\d+)\)/.exec(e.text)?.[1];
125
+ if (id) return `comment-${id}`;
126
+ }
127
+ if (signal === "review_set_aside") {
128
+ const id = /\bbot review\s+(\d+)\b/.exec(e.text)?.[1];
129
+ if (id) return `review-${id}`;
130
+ }
131
+ if (signal === "bot_comment_deleted") {
132
+ const id = /\bbot comment\s+(\d+)\b/.exec(e.text)?.[1];
133
+ // An issue comment has its own id namespace; an unscoped entry is a review comment.
134
+ if (id) {
135
+ const scope = parseEventTags(e.text)["scope"];
136
+ return scope === "issue_comment" ? `deleted-issue-comment-${id}` : `deleted-comment-${id}`;
137
+ }
138
+ }
139
+ return `${signal || "feedback"}-${e.day}`;
140
+ }
141
+
142
+ function dispositionFor(
143
+ all: MemoryEntry[],
144
+ pr: string | undefined,
145
+ episode: string,
146
+ ): { status: Exclude<FeedbackStatus, "unprocessed">; entry: MemoryEntry } | undefined {
147
+ if (!pr) return undefined;
148
+ const exact = (candidate: MemoryEntry): boolean => {
149
+ const tags = parseEventTags(candidate.text);
150
+ return tags["pr"] === pr && tags["episode"] === episode;
151
+ };
152
+ // An action receipt supersedes every intermediate disposition. A reached
153
+ // verdict supersedes an earlier needs-attention marker.
154
+ const action = all.find((candidate) => hasTag(candidate, "feedback-action") && exact(candidate));
155
+ if (action) return { status: "acted-on", entry: action };
156
+ const adjudication = all.find(
157
+ (candidate) => hasTag(candidate, "adjudication") && exact(candidate),
158
+ );
159
+ if (adjudication) return { status: "settled", entry: adjudication };
160
+ const reviewed = all.find(
161
+ (candidate) => hasTag(candidate, "feedback-review") && exact(candidate),
162
+ );
163
+ if (reviewed) return { status: "needs-attention", entry: reviewed };
164
+ return undefined;
165
+ }
166
+
167
+ /** A deterministic, inspectable presentation over the raw memory signal. It
168
+ * does not adjudicate: unprocessed cards name a question to investigate, while
169
+ * processed cards quote the attribution and Changed fields from the actual
170
+ * #adjudication entry. */
171
+ export function feedbackPresentation(
172
+ e: MemoryEntry,
173
+ all: MemoryEntry[],
174
+ ): FeedbackPresentation | undefined {
175
+ if (!hasTag(e, "feedback") || isDisposition(e)) return undefined;
176
+ const tags = parseEventTags(e.text);
177
+ const pr = tags["pr"] ?? /\bPR\s+#?(\d+)\b/i.exec(e.text)?.[1];
178
+ const signal =
179
+ tags["signal"] ?? (e.text.includes("merged while") ? "merged_over_block" : "feedback");
180
+ const raw = feedbackRaw(e.text);
181
+ const lower = raw.toLowerCase();
182
+ const episode = feedbackEpisode(e, signal);
183
+ const disposition = dispositionFor(all, pr, episode);
184
+ const status: FeedbackStatus = disposition?.status ?? "unprocessed";
185
+ const actor = /human \[feedback\] by ([^\s]+) on PR/i.exec(e.text)?.[1];
186
+
187
+ let title: string;
188
+ let summary: string;
189
+ let learning: string;
190
+ if (signal === "review_set_aside") {
191
+ title = "Bot review was dismissed";
192
+ summary = `A bot review${pr ? ` on #${pr}` : ""} was set aside; GitHub may also auto-dismiss stale reviews, so this is a strong investigation prompt but not proof of a bad finding.`;
193
+ learning =
194
+ "Check whether the dismissed review was stale, superseded, or disposable on its merits before changing reviewer behaviour.";
195
+ } else if (signal === "merged_over_block") {
196
+ title = "PR merged over a standing bot block";
197
+ summary = `The PR${pr ? ` #${pr}` : ""} merged while REQUEST_CHANGES stood. That is a low-weight disagreement signal because repository policy may allow advisory overrides.`;
198
+ learning =
199
+ "Reconstruct the standing blockers and test each against the merged code; the merge alone does not refute them.";
200
+ } else if (signal === "bot_comment_deleted") {
201
+ title = "Bot comment was deleted";
202
+ summary = `A bot comment${pr ? ` on #${pr}` : ""} was deleted by a human. A deletion carries no stated reason: it may reject the finding, or tidy a thread that was already settled.`;
203
+ learning =
204
+ "Find the deleted comment's finding in the review record and check it against the code before reading the deletion as disagreement.";
205
+ } else if (signal === "trigger_withdrawn") {
206
+ title = "Review trigger was withdrawn";
207
+ summary = `The review trigger${pr ? ` on #${pr}` : ""} was removed before completion, which may indicate cost, delay, irrelevance, or an ordinary workflow change.`;
208
+ learning =
209
+ "Inspect timing and work already produced before attributing this to review quality.";
210
+ } else if (lower.includes("prompt injection")) {
211
+ title = "Prompt-injection blocker disputed";
212
+ summary = `${actor ?? "A human reviewer"} says the prompt-injection finding${pr ? ` on #${pr}` : ""} should be ignored as a false positive.`;
213
+ learning =
214
+ "Test the claimed execution boundary against the code and the standing injection bright line; do not infer safety merely from prior testing.";
215
+ } else if (/\brare\b|\bnarrow\b|\bunlikely\b|\bimprobabl/.test(lower)) {
216
+ title = "Narrow edge case judged non-actionable";
217
+ summary = `${actor ?? "A human reviewer"} says the finding${pr ? ` on #${pr}` : ""} concerns a production path too rare or narrow to belong in this feature PR.`;
218
+ learning =
219
+ "Re-derive reachability and impact separately: the bug may be real while its severity or delivery is wrong.";
220
+ } else if (lower.includes("small impact")) {
221
+ title = "Low-impact finding judged non-actionable";
222
+ summary = `${actor ?? "A human reviewer"} says the finding${pr ? ` on #${pr}` : ""} has too little impact to justify action.`;
223
+ learning =
224
+ "Check whether the evidence supports a present defect, then whether its delivery exceeded the practical maintenance bar.";
225
+ } else {
226
+ title = "Human disputes a review finding";
227
+ summary = `${actor ?? "A human reviewer"} challenged a finding${pr ? ` on #${pr}` : ""}; the complaint still needs contact with the review evidence and code.`;
228
+ learning =
229
+ "Compare the human claim, the posted finding, and the reviewed code before assigning fault or changing the rubric.";
230
+ }
231
+
232
+ if (status === "settled" && disposition) {
233
+ const attribution =
234
+ /^Attribution:\s*(.+)$/im.exec(disposition.entry.text)?.[1]?.trim() ??
235
+ "recorded in adjudication";
236
+ const changed =
237
+ /^Changed:\s*(.+)$/im.exec(disposition.entry.text)?.[1]?.trim() ?? "see adjudication";
238
+ learning = `Adjudicated as ${attribution}. Changed: ${changed}.`;
239
+ } else if (status === "needs-attention" && disposition) {
240
+ const reason =
241
+ /^Reason:\s*(.+)$/im.exec(disposition.entry.text)?.[1]?.trim() ??
242
+ "The review was inconclusive and needs the owner.";
243
+ learning = `Reviewed; needs attention. ${reason}`;
244
+ } else if (status === "acted-on" && disposition) {
245
+ const result =
246
+ /^Result:\s*(.+)$/im.exec(disposition.entry.text)?.[1]?.trim() ??
247
+ "The resulting action is recorded in memory.";
248
+ learning = `Acted on. ${result}`;
249
+ }
250
+
251
+ return {
252
+ pr,
253
+ episode,
254
+ processed: status !== "unprocessed",
255
+ status,
256
+ listTitle: `${pr ? `#${pr} · ` : ""}${title}`,
257
+ title,
258
+ summary,
259
+ raw,
260
+ learning,
261
+ };
262
+ }
263
+
264
+ /** Each status's glyph and its card line — the list row shows the glyph. */
265
+ const STATUS: Record<FeedbackStatus, { mark: string; line: string }> = {
266
+ unprocessed: { mark: "○", line: "UNPROCESSED — needs review" },
267
+ settled: { mark: "✓", line: "PROCESSED · SETTLED" },
268
+ "needs-attention": { mark: "!", line: "PROCESSED · NEEDS ATTENTION" },
269
+ "acted-on": { mark: "◆", line: "ACTED ON · ARCHIVED" },
270
+ };
271
+
272
+ const statusLine = (status: FeedbackStatus): string =>
273
+ `${STATUS[status].mark} ${STATUS[status].line}`;
274
+
275
+ export function feedbackEntryLine(
276
+ e: MemoryEntry,
277
+ presentation: FeedbackPresentation,
278
+ width: number,
279
+ ): string {
280
+ return truncate(
281
+ ` ${e.day} ${STATUS[presentation.status].mark} ${presentation.listTitle}`,
282
+ width,
283
+ );
284
+ }
285
+
286
+ // ---- the change register, as rows -----------------------------------------------
287
+
288
+ /** The register the CHANGED section reads and reverts through — what
289
+ * `ChangeLog` (changelog-store.ts) exposes, named structurally so tests can
290
+ * hand in a fake without a git checkout. */
291
+ export interface ChangeRegisterSource {
292
+ readonly register: ChangeRegister | undefined;
293
+ /** Why `register` may not be the whole story: an unreadable file or a
294
+ * failed scan is said in the section header, never painted as "no
295
+ * changes yet" — and rows already in memory stay on screen under it. */
296
+ readonly problem?: ChangeLogProblem | undefined;
297
+ /** Re-scan; the outcome is read back off `register`/`problem`. */
298
+ refresh(): Promise<unknown>;
299
+ revert(sha: string): Promise<RevertResult>;
300
+ }
301
+
302
+ /** `feedback #<pr> · <adjudication> · ratified <words>` — the provenance line. */
303
+ export function provenance(entry: ChangeEntry, width: number): string {
304
+ const bits: string[] = [];
305
+ bits.push(
306
+ entry.feedback_pr
307
+ ? `${FG.dim}feedback${RESET} #${sanitizeText(entry.feedback_pr)}`
308
+ : `${FG.dim}no episode${RESET}`,
309
+ );
310
+ if (entry.adjudication) bits.push(`${ACCENT}${sanitizeText(entry.adjudication)}${RESET}`);
311
+ bits.push(`${FG.dim}ratified ${sanitizeText(entry.ratified)}${RESET}`);
312
+ if (entry.reverted) bits.push(`${WARN}reverted by ${entry.reverted.by}${RESET}`);
313
+ return truncate(bits.join(SEP), width);
314
+ }
315
+
316
+ export function headline(entry: ChangeEntry, now: Date, width: number): string {
317
+ const mark = entry.reverted ? `${WARN}⤺${RESET}` : `${OK}●${RESET}`;
318
+ const age = `${FG.dim}${fit(fmtAge(entry.at, now), 4)}${RESET}`;
319
+ const subject = entry.reverted
320
+ ? `${MUTED}${sanitizeText(entry.subject)}${RESET}`
321
+ : `${STRONG}${sanitizeText(entry.subject)}${RESET}`;
322
+ return truncate(`${mark} ${ACCENT}${entry.short}${RESET} ${age} ${subject}`, width);
323
+ }
324
+
325
+ /** The armed banner: what will run, in the words git will run it in. */
326
+ export function armedLines(entry: ChangeEntry, width: number): string[] {
327
+ return [
328
+ truncate(
329
+ `${WARN}${STRONG}REVERT${RESET} ${ACCENT}${entry.short}${RESET} ${STRONG}${sanitizeText(entry.subject)}${RESET}`,
330
+ width,
331
+ ),
332
+ truncate(
333
+ `${FG.dim}runs${RESET} ${revertArgv(entry.short).join(" ")} ${FG.dim}in this checkout — no push, no GitHub, nothing near the mutation gate${RESET}`,
334
+ width,
335
+ ),
336
+ truncate(`${button("y do it")} ${button("any other key cancels")}`, width),
337
+ ];
338
+ }
339
+
340
+ // ---- the surface ------------------------------------------------------------------
341
+
342
+ export type FeedbackFocus = "inbox" | "proposed" | "changed";
343
+
344
+ export const FEEDBACK_FOCUS_ORDER: readonly FeedbackFocus[] = ["inbox", "proposed", "changed"];
345
+
346
+ export interface FeedbackTabState {
347
+ focus: FeedbackFocus;
348
+ /** Ordinal into the inbox; `selKey` its identity across reloads. */
349
+ sel: number;
350
+ selKey?: string;
351
+ propSel: number;
352
+ propSlug?: string;
353
+ changeSel: number;
354
+ showArchived: boolean;
355
+ /** The sha `R` armed; `y` runs it, anything else cancels. */
356
+ armed?: string;
357
+ /** Result of the last revert (or refusal), shown until the next action. */
358
+ result?: string;
359
+ /** A register refresh is in flight. */
360
+ changesLoading: boolean;
361
+ }
362
+
363
+ export type FeedbackAction =
364
+ | { t: "key"; key: string }
365
+ | { t: "signal"; i: number }
366
+ | { t: "prop"; i: number }
367
+ | { t: "prop-accept"; i: number }
368
+ | { t: "prop-reject"; i: number }
369
+ | { t: "change"; i: number }
370
+ | { t: "url"; url: string };
371
+
372
+ function entryKey(e: MemoryEntry): string {
373
+ return proposalKey(e);
374
+ }
375
+
376
+ /** What the feedback tab answers to on this frame: the verbs of the FOCUSED
377
+ * pane, plus the archive toggle and the focus cycle. */
378
+ export function feedbackKeys(
379
+ store: LearningStore,
380
+ st: FeedbackTabState,
381
+ changes: ChangeRegisterSource,
382
+ ): LiveKeys {
383
+ const bar: BarButton[] = [
384
+ { key: "a", label: st.showArchived ? "a hide archived" : "a show archived" },
385
+ { key: "t", label: "t focus" },
386
+ ];
387
+ if (st.focus === "proposed" && store.proposals[st.propSel] !== undefined) {
388
+ bar.push({ key: "A", label: "A accept" }, { key: "x", label: "x reject" });
389
+ }
390
+ if (st.focus === "changed" && (changes.register?.entries ?? [])[st.changeSel] !== undefined)
391
+ bar.push({ key: "R", label: "R revert" });
392
+ return { bar, inline: st.armed !== undefined ? ["y", "Y"] : [] };
393
+ }
394
+
395
+ export function renderFeedbackTab(
396
+ store: LearningStore,
397
+ st: FeedbackTabState,
398
+ changes: ChangeRegisterSource,
399
+ dryRun: boolean | undefined,
400
+ cols: number,
401
+ rows: number,
402
+ repo: string | undefined,
403
+ now: Date,
404
+ /** The daemon's last status.json — the lesson headline's only source;
405
+ * undefined until the first heartbeat is read. */
406
+ snapshot?: StatusSnapshot,
407
+ ): Frame {
408
+ const frame = new Frame(cols, rows);
409
+ const inbox = feedbackInbox(store.entries, st.showArchived);
410
+ const unprocessed = inbox.filter(
411
+ (e) => feedbackPresentation(e, store.entries)?.status === "unprocessed",
412
+ ).length;
413
+ frame.set(
414
+ 0,
415
+ rule(cols, "┌", "┐", [
416
+ `${HEADING}quickreview${RESET}`,
417
+ modeBadge(dryRun),
418
+ "feedback",
419
+ `${MUTED}signal ▸ adjudication ▸ proposal ▸ change ▸ revert${RESET}`,
420
+ ...(store.memError ? [`${WARN}${STRONG}✖ MEMORY UNREACHABLE${RESET}`] : []),
421
+ ]),
422
+ );
423
+ const live = feedbackKeys(store, st, changes);
424
+ const bodyRows = rows - 2 - barHeight("feedback", cols, live.bar);
425
+ const { leftW, rightW } = splitWidths(cols);
426
+ const focusTitle = (title: string, focus: FeedbackFocus): string =>
427
+ st.focus === focus ? `${sectionTitle(title)} ${ACCENT}◂${RESET}` : sectionTitle(title);
428
+
429
+ // ---- left: the inbox --------------------------------------------------------
430
+ const left: string[] = [];
431
+ const leftActions: Array<FeedbackAction | undefined> = [];
432
+ if (!store.memLoaded) {
433
+ left.push(sectionTitle("INBOX (—)"));
434
+ left.push(emptyLine({ kind: "unread", how: "reading the store" }));
435
+ } else if (store.memError) {
436
+ left.push(sectionTitle("INBOX (—)"));
437
+ left.push(`${WARN}${STRONG}✖ MEMORY UNREACHABLE${RESET}`);
438
+ for (const l of wrap(sanitizeText(store.memError), leftW - 3)) left.push(`${WARN}${l}${RESET}`);
439
+ left.push(`${MUTED}the signals live in memory — r retries.${RESET}`);
440
+ } else {
441
+ // Part of memory answered and part did not: the counts are of what was
442
+ // read, and the inbox says so rather than passing for complete.
443
+ const partial = store.memWarn !== undefined;
444
+ left.push(
445
+ `${focusTitle(`INBOX (${inbox.length}${partial ? "+?" : ""})`, "inbox")} ${MUTED}${unprocessed}${partial ? "+?" : ""} unprocessed${RESET}`,
446
+ );
447
+ if (partial)
448
+ left.push(
449
+ `${WARN}⚠ ${truncate(sanitizeText(`partial read — ${store.memWarn}`), leftW - 5)}${RESET}`,
450
+ );
451
+ if (inbox.length === 0 && !partial) {
452
+ left.push(
453
+ st.showArchived
454
+ ? emptyLine({
455
+ kind: "none",
456
+ what: "[feedback] comments, dismissed reviews, merges over a block and withdrawn triggers land here",
457
+ })
458
+ : emptyLine({ kind: "filtered", what: "a shows archived (acted-on) signals" }),
459
+ );
460
+ }
461
+ }
462
+ while (leftActions.length < left.length) leftActions.push(undefined);
463
+ const sel = Math.min(st.sel, Math.max(0, inbox.length - 1));
464
+ const visible = Math.max(1, bodyRows - left.length);
465
+ const start = windowStart(sel, inbox.length, visible);
466
+ inbox.slice(start, start + visible).forEach((e, offset) => {
467
+ const i = start + offset;
468
+ const card = feedbackPresentation(e, store.entries)!;
469
+ const line = feedbackEntryLine(e, card, leftW - 3);
470
+ left.push(st.focus === "inbox" && i === sel ? selectedLine(line) : line);
471
+ leftActions.push({ t: "signal", i });
472
+ });
473
+
474
+ // ---- right: the card, then the rest of the loop -----------------------------
475
+ const right: Array<ZonedRow<FeedbackAction>> = [];
476
+ const row = (chunks: Array<RowChunk<FeedbackAction>>, gap?: string): void => {
477
+ right.push(zonedRow(chunks, gap));
478
+ };
479
+ // The rows the focused verb acts on — the selected proposal, or the armed
480
+ // confirmation and the selected change — which the pane scrolls to keep on
481
+ // screen: a verb must never act on a row the operator cannot see.
482
+ let focusFrom: number | undefined;
483
+ let focusTo = 0;
484
+ const markFocus = (from: number): void => {
485
+ focusFrom = from;
486
+ focusTo = right.length - 1;
487
+ };
488
+ const selected = inbox[sel];
489
+ const card = selected ? feedbackPresentation(selected, store.entries) : undefined;
490
+ if (selected && card) {
491
+ row([
492
+ { text: `${sectionTitle("SIGNAL")} ${selected.ts} ${MUTED}episode=${card.episode}${RESET}` },
493
+ ]);
494
+ row([{ text: statusLine(card.status) }]);
495
+ const cardCap = Math.max(6, bodyRows - 18);
496
+ const text = [
497
+ `TITLE\n${card.title}`,
498
+ "",
499
+ `SUMMARY\n${card.summary}`,
500
+ "",
501
+ `RAW FEEDBACK\n${card.raw}`,
502
+ "",
503
+ `WHAT WE CAN LEARN\n${card.learning}`,
504
+ ].join("\n");
505
+ const wrapped = wrap(sanitizeText(text), rightW - 3);
506
+ for (const l of wrapped.slice(0, cardCap)) row([{ text: l }]);
507
+ if (wrapped.length > cardCap)
508
+ row([{ text: `… ${wrapped.length - cardCap} more lines`, dim: true }]);
509
+ row([{ text: "" }]);
510
+ }
511
+
512
+ row([
513
+ {
514
+ text: focusTitle(
515
+ store.propLoaded && store.proposalsError === undefined
516
+ ? `PROPOSED (${store.proposals.length})`
517
+ : "PROPOSED (—)",
518
+ "proposed",
519
+ ),
520
+ },
521
+ { text: "the companion's rubric changes, waiting on you", dim: true },
522
+ ]);
523
+ if (st.focus === "proposed") markFocus(right.length - 1);
524
+ if (!store.propLoaded)
525
+ row([{ text: emptyLine({ kind: "unread", how: "listing state/rubric/" }) }]);
526
+ else if (store.proposalsError !== undefined)
527
+ row([{ text: emptyLine({ kind: "unreadable", why: `${store.proposalsError} · r retries` }) }]);
528
+ else if (store.proposals.length === 0)
529
+ row([
530
+ {
531
+ text: emptyLine({
532
+ kind: "none",
533
+ what: "the companion authors proposals into state/rubric/",
534
+ }),
535
+ },
536
+ ]);
537
+ store.proposals.forEach((p, i) => {
538
+ const isSel = st.focus === "proposed" && i === st.propSel;
539
+ const from = right.length;
540
+ row([
541
+ {
542
+ text: isSel
543
+ ? selectedLine(`▸ ${truncate(p.slug, rightW - 26)}`)
544
+ : `▸ ${truncate(p.slug, rightW - 26)}`,
545
+ action: { t: "prop", i },
546
+ },
547
+ { text: button("A accept"), action: { t: "prop-accept", i } },
548
+ { text: button("x reject"), action: { t: "prop-reject", i } },
549
+ ]);
550
+ if (p.head[0]) row([{ text: truncate(` ${p.head[0]}`, rightW - 2), dim: true }]);
551
+ if (isSel) markFocus(from);
552
+ });
553
+ row([{ text: "" }]);
554
+
555
+ const register = changes.register;
556
+ const problem = changes.problem;
557
+ const entries = register?.entries ?? [];
558
+ const reverted = entries.filter((e) => e.reverted).length;
559
+ row([
560
+ { text: focusTitle(register ? `CHANGED (${entries.length})` : "CHANGED (—)", "changed") },
561
+ {
562
+ text: register
563
+ ? `landed and revertible · ${reverted} reverted · scanned ${register.scanned} commits ${fmtAge(register.updated_at, now)} ago${st.changesLoading ? " · refreshing…" : ""}`
564
+ : st.changesLoading
565
+ ? "scanning git log…"
566
+ : "",
567
+ dim: true,
568
+ },
569
+ ]);
570
+ if (st.focus === "changed") markFocus(right.length - 1);
571
+ // "none yet" is a claim, made only when a scan succeeded and found none.
572
+ // The two ways of not knowing each get their own sentence, and
573
+ // neither hides the rows already in memory.
574
+ if (problem?.kind === "register_unreadable") {
575
+ row([
576
+ {
577
+ text: emptyLine({
578
+ kind: "unreadable",
579
+ why: `change register unreadable (${sanitizeText(problem.reason)}) — nothing is scanned or saved over it; fix the file, then r`,
580
+ }),
581
+ },
582
+ ]);
583
+ } else if (problem?.kind === "save_failed") {
584
+ row([
585
+ {
586
+ text: emptyLine({
587
+ kind: "unreadable",
588
+ why: `change register not saved (${sanitizeText(problem.reason)}) — the list is current, but rows only it holds would not survive a restart; r retries`,
589
+ }),
590
+ },
591
+ ]);
592
+ } else if (problem) {
593
+ row([
594
+ {
595
+ text: emptyLine({
596
+ kind: "unreadable",
597
+ why: register
598
+ ? `last git log scan failed (${sanitizeText(problem.reason)}) — list may be behind; r retries`
599
+ : `git log failed (${sanitizeText(problem.reason)}) — whether there are feedback-derived commits is unknown; r retries`,
600
+ }),
601
+ },
602
+ ]);
603
+ }
604
+ if (!register) {
605
+ if (!problem)
606
+ row([
607
+ {
608
+ text: emptyLine({
609
+ kind: "unread",
610
+ how: "the register is scanned from git log · r retries",
611
+ }),
612
+ },
613
+ ]);
614
+ } else if (entries.length === 0 && !problem) {
615
+ row([
616
+ {
617
+ text: emptyLine({
618
+ kind: "none",
619
+ what: "a change joins this list when it carries a Ratified-in-session: trailer",
620
+ }),
621
+ },
622
+ ]);
623
+ }
624
+ const armedEntry = st.armed ? entries.find((e) => e.sha === st.armed) : undefined;
625
+ const armedFrom = right.length;
626
+ if (armedEntry) for (const l of armedLines(armedEntry, rightW - 3)) row([{ text: l }]);
627
+ const changeSel = Math.min(st.changeSel, Math.max(0, entries.length - 1));
628
+ const changeStart = windowStart(changeSel, entries.length, 4);
629
+ entries.slice(changeStart, changeStart + 4).forEach((e, offset) => {
630
+ const i = changeStart + offset;
631
+ const head = headline(e, now, rightW - 3);
632
+ const from = armedEntry ? armedFrom : right.length;
633
+ row([
634
+ {
635
+ text: st.focus === "changed" && i === changeSel ? selectedLine(head) : head,
636
+ action: { t: "change", i },
637
+ },
638
+ ]);
639
+ row([{ text: ` ${provenance(e, rightW - 5)}`, action: { t: "change", i } }]);
640
+ if (st.focus === "changed" && i === changeSel) markFocus(from);
641
+ });
642
+ if (st.result) {
643
+ row([{ text: truncate(st.result, rightW - 2) }]);
644
+ if (st.focus === "changed") focusTo = right.length - 1;
645
+ }
646
+ row([{ text: "" }]);
647
+
648
+ // The lesson shadow ledger's headline — the evidence the
649
+ // operator reads before switching `[memory] delivery` on.
650
+ const lessons = lessonsHeadline(snapshot);
651
+ row([
652
+ { text: sectionTitle(lessons.title) },
653
+ { text: "qcr lessons shadow-report has it per lesson, per lens and per tier", dim: true },
654
+ ]);
655
+ for (const l of lessons.lines) row([{ text: truncate(l, rightW - 2) }]);
656
+ row([{ text: "" }]);
657
+
658
+ const read = store.tickets;
659
+ const filed = read.kind === "read" ? read.tickets : undefined;
660
+ const actionable = filed?.filter(isActionableTicket) ?? [];
661
+ row([
662
+ {
663
+ text: sectionTitle(
664
+ filed ? `FILED (${actionable.length} actionable / ${filed.length} total)` : "FILED (—)",
665
+ ),
666
+ },
667
+ {
668
+ text: button(`${tabDigit("tickets")} tickets`),
669
+ action: { t: "key", key: tabDigit("tickets") },
670
+ },
671
+ ]);
672
+ if (read.kind === "unread")
673
+ row([
674
+ { text: emptyLine({ kind: "unread", how: "the tracker is scanned behind the first frame" }) },
675
+ ]);
676
+ else if (read.kind === "unconfigured")
677
+ row([{ text: emptyLine({ kind: "unreadable", why: "no tracker configured" }) }]);
678
+ else if (read.kind === "unreadable")
679
+ row([{ text: emptyLine({ kind: "unreadable", why: read.reason }) }]);
680
+ else if (actionable.length === 0)
681
+ row([
682
+ {
683
+ text: emptyLine({
684
+ kind: "none",
685
+ what: "adjudication files a ticket only when something changes",
686
+ }),
687
+ },
688
+ ]);
689
+ for (const ticket of actionable.slice(0, 3))
690
+ row([
691
+ {
692
+ text: truncate(`${ticket.id} [${ticket.status}] ${ticket.title}`, rightW - 3),
693
+ action: { t: "key", key: tabDigit("tickets") },
694
+ },
695
+ ]);
696
+ row([{ text: "" }]);
697
+
698
+ row([
699
+ {
700
+ text: sectionTitle(
701
+ store.improvements === undefined
702
+ ? "BOT PRs / ISSUES (—)"
703
+ : `BOT PRs / ISSUES (${store.improvements.length})`,
704
+ ),
705
+ },
706
+ ]);
707
+ if (store.improvements === undefined)
708
+ row([
709
+ {
710
+ text: emptyLine({ kind: "unread", how: "the gh query was skipped or failed · r retries" }),
711
+ },
712
+ ]);
713
+ else if (store.improvementsFailed.length > 0)
714
+ row([
715
+ {
716
+ text: emptyLine({
717
+ kind: "unreadable",
718
+ why: `the gh ${store.improvementsFailed.join(" + ")} list failed · r retries`,
719
+ }),
720
+ },
721
+ ]);
722
+ else if (store.improvements.length === 0)
723
+ row([{ text: emptyLine({ kind: "none", what: "the overseer files them" }) }]);
724
+ for (const it of (store.improvements ?? []).slice(0, 4)) {
725
+ const url = repo
726
+ ? `https://github.com/${repo}/${it.kind === "pr" ? "pull" : "issues"}/${it.number}`
727
+ : undefined;
728
+ row([
729
+ {
730
+ text: truncate(
731
+ `${it.kind === "pr" ? "PR" : "IS"} #${it.number} [${it.state}] ${it.title}`,
732
+ rightW - 2,
733
+ ),
734
+ action: url ? { t: "url", url } : undefined,
735
+ },
736
+ ]);
737
+ }
738
+ if (store.status) {
739
+ row([{ text: "" }]);
740
+ row([{ text: truncate(store.status, rightW - 2) }]);
741
+ }
742
+
743
+ // Scroll only as far as the focused rows need; when they cannot all fit,
744
+ // their first row (the armed confirmation's head) stays on screen.
745
+ const rightStart =
746
+ focusFrom !== undefined && focusTo >= bodyRows
747
+ ? Math.min(focusFrom, focusTo - bodyRows + 1)
748
+ : 0;
749
+ paintSplit(frame, {
750
+ left,
751
+ leftActions,
752
+ right: right.slice(rightStart),
753
+ leftW,
754
+ rightW,
755
+ top: 1,
756
+ bodyRows,
757
+ });
758
+ paintCmdBar(frame, "feedback", cols, rows, live.bar);
759
+ frame.set(rows - 1, rule(cols, "└", "┘", []));
760
+ return frame;
761
+ }
762
+
763
+ /**
764
+ * The LESSONS section: status.json `memory.lessons`, painted
765
+ * honest-unknown — no snapshot yet is "not read yet", a daemon whose status
766
+ * carries no memory block or no lesson block says so, and a ledger the daemon
767
+ * could not read (null) is unknown. None of the four ever reads as zero
768
+ * marks, which would tell the operator a lesson harmed nothing.
769
+ */
770
+ export function lessonsHeadline(snapshot: StatusSnapshot | undefined): {
771
+ title: string;
772
+ lines: string[];
773
+ } {
774
+ if (!snapshot)
775
+ return {
776
+ title: "LESSONS (—)",
777
+ lines: [emptyLine({ kind: "unread", how: "waiting for the daemon's status.json" })],
778
+ };
779
+ const memory = snapshot.memory;
780
+ if (!memory)
781
+ return {
782
+ title: "LESSONS (—)",
783
+ lines: [
784
+ emptyLine({
785
+ kind: "unreadable",
786
+ why: "this daemon reports no memory block — the lesson ledger is UNKNOWN",
787
+ }),
788
+ ],
789
+ };
790
+ const s = memory.lessons;
791
+ if (s === undefined)
792
+ return {
793
+ title: "LESSONS (—)",
794
+ lines: [
795
+ emptyLine({
796
+ kind: "unreadable",
797
+ why: "this daemon predates the lesson shadow ledger and does not report it — UNKNOWN",
798
+ }),
799
+ ],
800
+ };
801
+ if (s === null)
802
+ return {
803
+ title: "LESSONS (—)",
804
+ lines: [`${WARN}${STRONG}${lessonHeadline(null)}${RESET}`],
805
+ };
806
+ const title = lessonSectionTitle(s);
807
+ const line = lessonHeadline(s);
808
+ // The marked findings by match tier — class the would-demote one, lens
809
+ // evidence only — on a line of its own (the headline already fills the
810
+ // pane); unknown from a daemon that reports no tier split, never an empty
811
+ // split.
812
+ const tiers = lessonTierLine(s);
813
+ return {
814
+ title,
815
+ lines: [
816
+ s.lessons_off ? `${WARN}${STRONG}${line}${RESET}` : line,
817
+ ...(tiers === null ? [] : [tiers]),
818
+ ],
819
+ };
820
+ }
821
+
822
+ /** Install the feedback surface over the shared learning store and the
823
+ * change register. */
824
+ export function installFeedbackTab(
825
+ app: App,
826
+ store: LearningStore,
827
+ changes: ChangeRegisterSource,
828
+ ): FeedbackTabState {
829
+ const st: FeedbackTabState = {
830
+ focus: "inbox",
831
+ sel: 0,
832
+ propSel: 0,
833
+ changeSel: 0,
834
+ showArchived: false,
835
+ changesLoading: false,
836
+ };
837
+ const inbox = (): MemoryEntry[] => feedbackInbox(store.entries, st.showArchived);
838
+ const selectSignal = (i: number): void => {
839
+ const list = inbox();
840
+ st.sel = moveSelection(i, 0, list.length);
841
+ st.selKey = list[st.sel] ? entryKey(list[st.sel]!) : undefined;
842
+ };
843
+ const selectProposal = (i: number): void => {
844
+ st.propSel = moveSelection(i, 0, store.proposals.length);
845
+ st.propSlug = store.proposals[st.propSel]?.slug;
846
+ };
847
+ store.onLoaded((part) => {
848
+ if (part === "memory") {
849
+ const list = inbox();
850
+ const rebound = st.selKey ? list.findIndex((e) => entryKey(e) === st.selKey) : -1;
851
+ selectSignal(rebound >= 0 ? rebound : st.sel);
852
+ }
853
+ if (part === "proposals") {
854
+ const rebound = st.propSlug ? store.proposals.findIndex((p) => p.slug === st.propSlug) : -1;
855
+ selectProposal(rebound >= 0 ? rebound : st.propSel);
856
+ }
857
+ });
858
+
859
+ const reloadChanges = (): void => {
860
+ if (st.changesLoading) return;
861
+ st.changesLoading = true;
862
+ // The selected commit's identity, so a newer commit sorting ahead of it
863
+ // does not move the selection (and the next R) onto a different one.
864
+ const selectedSha = (changes.register?.entries ?? [])[st.changeSel]?.sha;
865
+ void changes
866
+ .refresh()
867
+ .catch(() => {
868
+ /* a failed scan keeps the persisted register — never an empty list; the
869
+ source's `problem` carries the reason onto the screen */
870
+ })
871
+ .finally(() => {
872
+ st.changesLoading = false;
873
+ const entries = changes.register?.entries ?? [];
874
+ const rebound = selectedSha ? entries.findIndex((c) => c.sha === selectedSha) : -1;
875
+ st.changeSel =
876
+ rebound >= 0 ? rebound : Math.min(st.changeSel, Math.max(0, entries.length - 1));
877
+ app.repaint();
878
+ });
879
+ };
880
+
881
+ // One revert at a time: two in flight would both pass the clean-tree check
882
+ // and interleave in the one checkout (a failing one runs `revert --abort`).
883
+ let reverting = false;
884
+ const runRevert = (sha: string): void => {
885
+ st.armed = undefined;
886
+ reverting = true;
887
+ st.result = `${FG.dim}reverting ${sha.slice(0, 7)}…${RESET}`;
888
+ app.repaint();
889
+ void changes
890
+ .revert(sha)
891
+ .then(
892
+ (res) => {
893
+ st.result = res.ok ? `${OK}${res.message}${RESET}` : `${BAD}${res.message}${RESET}`;
894
+ app.notice(res.message);
895
+ },
896
+ (err: unknown) => {
897
+ const message = `revert ${sha.slice(0, 7)} failed: ${err instanceof Error ? err.message : String(err)}`;
898
+ st.result = `${BAD}${message}${RESET}`;
899
+ app.notice(message);
900
+ },
901
+ )
902
+ .finally(() => {
903
+ reverting = false;
904
+ app.repaint();
905
+ });
906
+ };
907
+
908
+ let lastZones: Zone<FeedbackAction>[] = [];
909
+ let scannedOnce = false;
910
+
911
+ app.hooks.tabs.feedback = {
912
+ keys: () => feedbackKeys(store, st, changes),
913
+ screen: (theApp, cols, rows) => {
914
+ store.ensureMemory();
915
+ store.ensureProposals();
916
+ // The persisted register is the first paint; git is asked once per
917
+ // session behind it, and again on `r`.
918
+ if (!scannedOnce) {
919
+ scannedOnce = true;
920
+ setImmediate(reloadChanges);
921
+ }
922
+ const frame = renderFeedbackTab(
923
+ store,
924
+ st,
925
+ changes,
926
+ theApp.view.dryRun,
927
+ cols,
928
+ rows,
929
+ theApp.view.repo,
930
+ store.now(),
931
+ theApp.view.snapshot,
932
+ );
933
+ lastZones = frame.zones as Zone<FeedbackAction>[];
934
+ return frame;
935
+ },
936
+ click: (theApp, x, y): boolean => {
937
+ const action = hitTest(lastZones, x, y);
938
+ if (!action) return false;
939
+ // A click that moves focus off the armed change disarms it: the pane may
940
+ // scroll the confirmation out of view, and `y` must never run a revert
941
+ // the operator can no longer see.
942
+ if (
943
+ action.t === "signal" ||
944
+ action.t === "prop" ||
945
+ action.t === "prop-accept" ||
946
+ action.t === "prop-reject"
947
+ )
948
+ st.armed = undefined;
949
+ switch (action.t) {
950
+ case "key":
951
+ theApp.pressKey(action.key);
952
+ return true;
953
+ case "signal":
954
+ st.focus = "inbox";
955
+ selectSignal(action.i);
956
+ break;
957
+ case "prop":
958
+ st.focus = "proposed";
959
+ selectProposal(action.i);
960
+ break;
961
+ case "prop-accept":
962
+ case "prop-reject":
963
+ st.focus = "proposed";
964
+ selectProposal(action.i);
965
+ theApp.pressKey(action.t === "prop-accept" ? "A" : "x");
966
+ return true;
967
+ case "change":
968
+ st.focus = "changed";
969
+ st.changeSel = action.i;
970
+ st.armed = undefined; // any pointer move away from the armed row disarms
971
+ break;
972
+ case "url":
973
+ theApp.hooks.openUrl?.(action.url);
974
+ theApp.notice(`opened ${action.url}`);
975
+ return true;
976
+ }
977
+ theApp.repaint();
978
+ return true;
979
+ },
980
+ key: (theApp, key: BoardKey): boolean => {
981
+ // Armed is modal: every key is either the confirmation or a cancel, so a
982
+ // stray keystroke can never both cancel and do something else.
983
+ if (st.armed !== undefined) {
984
+ const ch = keyChar(key);
985
+ const sha = st.armed;
986
+ if (ch === "y" || ch === "Y") runRevert(sha);
987
+ else {
988
+ st.armed = undefined;
989
+ st.result = `${FG.dim}revert cancelled${RESET}`;
990
+ theApp.repaint();
991
+ }
992
+ return true;
993
+ }
994
+ const entries = changes.register?.entries ?? [];
995
+ const proposal = store.proposals[st.propSel];
996
+ switch (key.kind) {
997
+ case "down":
998
+ case "up": {
999
+ const delta = key.kind === "down" ? 1 : -1;
1000
+ if (st.focus === "inbox") selectSignal(st.sel + delta);
1001
+ else if (st.focus === "proposed") selectProposal(st.propSel + delta);
1002
+ else st.changeSel = moveSelection(st.changeSel, delta, entries.length);
1003
+ theApp.repaint();
1004
+ return true;
1005
+ }
1006
+ case "refresh":
1007
+ store.reloadMemory();
1008
+ store.reloadProposals();
1009
+ store.reloadTickets();
1010
+ reloadChanges();
1011
+ return true;
1012
+ case "escape":
1013
+ if (st.result === undefined) return false;
1014
+ st.result = undefined;
1015
+ theApp.repaint();
1016
+ return true;
1017
+ case "attach":
1018
+ // `a`: show / hide the acted-on signals — the archive toggle.
1019
+ st.showArchived = !st.showArchived;
1020
+ selectSignal(0);
1021
+ theApp.repaint();
1022
+ return true;
1023
+ case "char":
1024
+ switch (key.ch) {
1025
+ case "t": {
1026
+ const i = FEEDBACK_FOCUS_ORDER.indexOf(st.focus);
1027
+ st.focus = FEEDBACK_FOCUS_ORDER[(i + 1) % FEEDBACK_FOCUS_ORDER.length]!;
1028
+ theApp.repaint();
1029
+ return true;
1030
+ }
1031
+ case "A":
1032
+ if (st.focus !== "proposed" || !proposal) return false;
1033
+ store.status = `accepting '${proposal.slug}'…`;
1034
+ theApp.repaint();
1035
+ store.verb(
1036
+ store.accept(proposal.slug).then((result) => {
1037
+ if (result.ok) reloadChanges();
1038
+ return result;
1039
+ }),
1040
+ );
1041
+ return true;
1042
+ case "x":
1043
+ if (st.focus !== "proposed" || !proposal) return false;
1044
+ theApp.promptInput(`reject '${proposal.slug}' — reason`, "", (reason) => {
1045
+ store.verb(store.reject(proposal.slug, reason));
1046
+ });
1047
+ return true;
1048
+ case "R": {
1049
+ if (st.focus !== "changed") return false;
1050
+ const entry = entries[st.changeSel];
1051
+ if (!entry) return false;
1052
+ if (entry.reverted) {
1053
+ st.result = `${WARN}${entry.short} was already reverted by ${entry.reverted.by}${RESET}`;
1054
+ theApp.repaint();
1055
+ return true;
1056
+ }
1057
+ if (reverting) {
1058
+ st.result = `${WARN}a revert is still running — wait for its result${RESET}`;
1059
+ theApp.repaint();
1060
+ return true;
1061
+ }
1062
+ st.armed = entry.sha;
1063
+ st.result = undefined;
1064
+ theApp.repaint();
1065
+ return true;
1066
+ }
1067
+ default:
1068
+ return false;
1069
+ }
1070
+ default:
1071
+ return false;
1072
+ }
1073
+ },
1074
+ };
1075
+
1076
+ return st;
1077
+ }