@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,948 @@
1
+ // The SCAN FINDINGS STORE (spec "Findings"): every finding
2
+ // a scan has reported, keyed by its fingerprint — file + lens + kind + a hash
3
+ // of the anchored code, whitespace-normalised (scan.ts findingFingerprint).
4
+ //
5
+ // Recognition across re-scans is two steps, and only the second
6
+ // costs judgement:
7
+ //
8
+ // * EXACT MATCH FIRST. A finding whose fingerprint is already stored is the
9
+ // same finding: its last sighting and wording are refreshed, and its
10
+ // state — `new`, `promoted`, `dismissed` — is kept, so nothing is ever
11
+ // triaged twice. (A `fixed` finding seen again has come back: it is
12
+ // `new` again — or still `promoted` while its ticket is open.)
13
+ // * THE COMPANION JUDGES THE REST. After a run, `reconcile` finds the
14
+ // stored findings the re-scan no longer reports: their file was read
15
+ // again at other content — the content the run's tree holds (the ledger
16
+ // says so) — and no exact match came back, or their file is gone from
17
+ // the tree. One that no fresh finding of a lens that raised it (in its
18
+ // unit, or of its kind) could possibly be is
19
+ // `fixed` at once. The rest are held with those fresh candidates in ONE
20
+ // pending MATCH QUESTION, which the companion answers whole (`match`,
21
+ // quoting the question's key): the pairs it names are the same finding —
22
+ // the old one keeps its state and history and takes the new wording,
23
+ // position and fingerprint (the old fingerprint kept as an alias) — and
24
+ // every old finding it did not pair is `fixed`. Nothing is ever fixed on
25
+ // a guess, and nothing waits on the companion that an exact rule settles.
26
+ // * A DISMISSAL IS STICKY. The operator's triage is never
27
+ // overwritten by a scan: a dismissed finding every rule above would fix
28
+ // stays `dismissed`, stamped `unreported` (the run and sha) for audit, and
29
+ // is out of play until a scan reports it again — which clears the stamp
30
+ // and keeps the dismissal (no scan reopens it; the operator's promote is
31
+ // the only way out). One settle, `settleUnreported`, serves every path.
32
+ // A legacy store's finding fixed FROM dismissed reads back as dismissed
33
+ // (scanreport.ts `parseFindingsFile`).
34
+ // * `fixed` NEEDS CHANGED CONTENT. Only a re-read of OTHER
35
+ // content can settle a finding fixed. A later reading of the SAME content
36
+ // it was last seen at that does not report it again (a narrower stage-2
37
+ // row, a re-run — model variance) leaves it open and stamps
38
+ // `not_reproduced`: how many such readings, and the latest — once per
39
+ // reading, cleared by the next sighting. Triage can still dismiss it; a
40
+ // promoted one's ticket stays open, because only `fixed` closes one.
41
+ // * `fixed` RECORDS WHERE. The run and sha that stopped reporting it, and
42
+ // the state it was fixed from — what a promoted finding's ticket is
43
+ // closed with.
44
+ // * "MAY NOT BE VALID" IS A FLAG, NOT A STATE. A finding the validator
45
+ // doubted is stored with its `doubt` (word and reason) and shown as such;
46
+ // a finding no validator looked at is `validated: false`. Neither is
47
+ // dropped.
48
+ // * EVERY JUDGED FINDING HAS A VALIDITY TIER (the scan validator is the
49
+ // skeptic). `confirmed` — the skeptic traced a concrete
50
+ // scenario (kept in `scenario`); `likely` — a real mechanism whose
51
+ // reachability it could not trace all the way; `doubtful` — refuted,
52
+ // class-matched, or anything it would have killed, carried in `doubt`
53
+ // (word, reason, and the false-positive class when one matched). A
54
+ // finding no skeptic judged — the validator off or failed, or stored
55
+ // before tiers existed — has none and reads as UNKNOWN (scanreport.ts
56
+ // `validityOf`), never a guessed tier. The tier travels with the finding
57
+ // through an exact match (the latest JUDGED sighting wins — an unjudged
58
+ // re-sighting of the same code keeps the judgement it has), an alias and
59
+ // a near-duplicate fold (the best-supported sighting wins, and the doubt
60
+ // follows the tier it chose, so a finding never reads doubtful with no
61
+ // reason nor confirmed while flagged "may not be valid").
62
+ // * Individual findings never become memory (spec "Scan memory") — this
63
+ // store is the PC-side record, in the state home, never shipped.
64
+ // * TRIAGE (triage.ts drives it): a DISMISSED finding carries its
65
+ // reason and whether its memory note was written; a PROMOTED one carries
66
+ // its TICKET — where it was filed (the issue tracker or a markdown file)
67
+ // and, once a re-scan found it fixed, when that ticket was closed. The
68
+ // ticket record is what makes a finding never filed twice: it survives a
69
+ // match (the new fingerprint inherits it), a fix and a return.
70
+ // * NEAR-DUPLICATES COLLAPSE. The fingerprint hashes the lens
71
+ // and the anchored code, so one defect raised by two lenses — or by two
72
+ // rows of one lens anchored a few lines apart — arrives under two
73
+ // fingerprints. A fresh finding (no exact or alias match) that is the
74
+ // same file, the same kind, within NEAR_LINES of a live finding the SAME
75
+ // run sighted and says the same thing (`nearDuplicate`: same subject, stemmed token
76
+ // overlap at CLAIM_SIMILARITY) is folded into it: the stored one keeps
77
+ // its identity, wording and triage, takes the higher severity, lists the
78
+ // lens in `lenses`, the absorbed sighting in `merged`, and its
79
+ // fingerprint in `aliases` — so the next run's exact match, triage by
80
+ // fingerprint and ticket stamps all still find it. Deterministic and
81
+ // deliberately under-merging: different kinds, far ranges, different
82
+ // subjects, a fixed finding or one the match question holds never fold,
83
+ // and a later run's look-alike of an older sighting is the companion's
84
+ // match question, never a fold. `reconcile` runs the same fold once more
85
+ // over the run's fresh findings (`collapseRun`), for a duplicate whose
86
+ // case ran before the sighting it duplicates. A collapsed finding's
87
+ // severity is the highest its sightings' LATEST reports give, and it is
88
+ // unreported (fixed, or put to the match question) only once every lens
89
+ // that raised it has re-read other content.
90
+ //
91
+ // Persistence: `<state home>/scan/findings.json`. An unreadable store is
92
+ // reported and refuses writes, like the ledger and the unit cut.
93
+ import { createHash } from "node:crypto";
94
+ import { readings } from "./ledger.js";
95
+ import { SEVERITIES } from "./scan.js";
96
+ import { FINDING_STATES, FINDINGS_FILE, FINDINGS_VERSION, VALIDITY_ORDER, dismissedLookalike, goneDismissal, lookalikeRank, parseFindingsFile, validityOf, } from "./scanreport.js";
97
+ export { FINDINGS_FILE, FINDINGS_VERSION, dismissedLookalike, lookalikeRank };
98
+ export { FINDING_STATES };
99
+ // ---- near-duplicate collapse ----
100
+ /** How far apart (lines between the two ranges) two sightings of one defect
101
+ * may be anchored — one real pair sat 81 lines apart. */
102
+ export const NEAR_LINES = 100;
103
+ /** The stemmed-token Jaccard two claims must reach to be one defect. */
104
+ export const CLAIM_SIMILARITY = 0.4;
105
+ const STOPWORDS = new Set(("the a an of to in on at is are be by for and or not than rather but its it this that with from as into instead " +
106
+ "being has have was were can could may when which while every only their them then there these those does did do").split(" "));
107
+ /** A claim's content tokens, in order: lower-cased words of 3+ characters,
108
+ * stopwords out, each stemmed to its first five characters (so
109
+ * authorization/authority, validate/validation, refresh/refreshed agree;
110
+ * words of five characters or fewer stay whole, so read/reads do not). */
111
+ function claimStems(claim) {
112
+ return (claim.toLowerCase().match(/[a-z0-9]+/g) ?? [])
113
+ .filter((w) => w.length >= 3 && !STOPWORDS.has(w))
114
+ .map((w) => w.slice(0, 5));
115
+ }
116
+ /** Most severe first: `SEVERITIES`' own order. */
117
+ const severityRank = (s) => SEVERITIES.indexOf(s);
118
+ const higher = (a, b) => severityRank(b) < severityRank(a) ? b : a;
119
+ /**
120
+ * Are `a` and `b` the same defect reported twice? Same file, same kind,
121
+ * ranges overlapping or at most NEAR_LINES apart, the same subject (first
122
+ * content stem — "Inline-comment reads…" and "Issue-comment reads…" are one
123
+ * pattern in two places, not one defect) and claims whose stemmed tokens
124
+ * overlap at CLAIM_SIMILARITY or more. Pure; symmetric.
125
+ */
126
+ export function nearDuplicate(a, b) {
127
+ if (a.path !== b.path || a.kind !== b.kind)
128
+ return false;
129
+ const gap = Math.max(a.start, b.start) - Math.min(a.end, b.end);
130
+ if (gap > NEAR_LINES)
131
+ return false;
132
+ const sa = claimStems(a.claim);
133
+ const sb = claimStems(b.claim);
134
+ if (sa.length === 0 || sb.length === 0 || sa[0] !== sb[0])
135
+ return false;
136
+ const A = new Set(sa);
137
+ const B = new Set(sb);
138
+ let common = 0;
139
+ for (const t of A)
140
+ if (B.has(t))
141
+ common++;
142
+ return common / (A.size + B.size - common) >= CLAIM_SIMILARITY;
143
+ }
144
+ /**
145
+ * The dismissed finding `r` resembles, and why it was dismissed — or null.
146
+ * The dedup's own test (`nearDuplicate`) against every DISMISSED finding,
147
+ * its own sighting and each near-duplicate collapsed into it, first in
148
+ * store order. A new finding's wording can shift between runs, so an exact
149
+ * fingerprint never catches a re-raise of what the operator already
150
+ * dismissed; this says so. It decides nothing: the caller only flags.
151
+ */
152
+ function resemblingDismissal(stored, r) {
153
+ for (const d of stored) {
154
+ if (d.state !== "dismissed" || d.fingerprint === r.fingerprint)
155
+ continue;
156
+ const sightings = [d, ...(d.merged ?? []).map((m) => ({ ...m, path: d.path, kind: d.kind }))];
157
+ if (sightings.some((s) => nearDuplicate(s, r))) {
158
+ return { fingerprint: d.fingerprint, reason: d.dismissal?.reason ?? "(no reason recorded)" };
159
+ }
160
+ }
161
+ return null;
162
+ }
163
+ /** A validated survivor with no doubt, of the two, clears the flag. */
164
+ function combinedDoubt(a, b) {
165
+ if ((a.validated && a.doubt === null) || (b.validated && b.doubt === null))
166
+ return null;
167
+ return a.doubt ?? b.doubt;
168
+ }
169
+ /** Better supported ranks higher — the display order (confirmed first,
170
+ * unknown last) read backwards. */
171
+ const validityRank = (v) => VALIDITY_ORDER.length - VALIDITY_ORDER.indexOf(v);
172
+ /** Two sightings of one defect: the best-supported tier wins (a confirmed
173
+ * sighting outranks a doubt, as a clean survivor clears the doubt flag), and
174
+ * its scenario with it. Unknown only when neither was judged. */
175
+ function combinedValidity(a, b) {
176
+ const best = validityRank(validityOf(b)) > validityRank(validityOf(a)) ? b : a;
177
+ const v = validityOf(best);
178
+ return { validity: v === "unknown" ? null : v, scenario: best.scenario ?? null };
179
+ }
180
+ /** The doubt and tier of two sightings, told as ONE story: when either was
181
+ * tiered, the tier decides and the doubt follows it (a doubtful tier keeps
182
+ * its doubt, a confirmed/likely one clears it) — so a finding never reads
183
+ * doubtful with no reason, nor confirmed while flagged "may not be valid".
184
+ * With no tier on either side, the pre-tier doubt rule stands. */
185
+ function combinedJudgement(a, b) {
186
+ const tiered = combinedValidity(a, b);
187
+ if (tiered.validity === null || tiered.validity === undefined)
188
+ return { doubt: combinedDoubt(a, b), ...tiered };
189
+ if (tiered.validity !== "doubtful")
190
+ return { doubt: null, ...tiered };
191
+ // Neither side ranks above doubtful here, so at least one IS doubtful.
192
+ const src = validityOf(b) === "doubtful" ? b : a;
193
+ return { doubt: src.doubt ?? a.doubt ?? b.doubt, ...tiered };
194
+ }
195
+ /** A sighting nobody judged (the skeptic off or failed) says nothing about
196
+ * the finding's validity: an exact re-sighting of the SAME code keeps the
197
+ * judgement it already has rather than dropping a confirmed tier — or a
198
+ * doubt — to unknown. Any judged sighting replaces it (the latest wins). */
199
+ function judgementOf(known, r) {
200
+ if (r.validated || validityOf(r) !== "unknown") {
201
+ return {
202
+ validated: r.validated,
203
+ doubt: r.doubt,
204
+ validity: r.validity ?? null,
205
+ scenario: r.scenario ?? null,
206
+ };
207
+ }
208
+ return {
209
+ validated: known.validated,
210
+ doubt: known.doubt,
211
+ validity: known.validity ?? null,
212
+ scenario: known.scenario ?? null,
213
+ };
214
+ }
215
+ /** Can a fresh near-duplicate fold into `f`? Only a live finding this very
216
+ * run has sighted — a sighting in a LATER run that merely resembles an old
217
+ * one is the companion's match question, never a silent fold —
218
+ * and never one the pending question holds. */
219
+ function collapsible(f, run, held) {
220
+ return f.state !== "fixed" && f.last_seen.run === run && !held.has(f.fingerprint);
221
+ }
222
+ /** Fold stored finding `f` (fresh this run) into `into`, its own collapsed
223
+ * sightings and aliases with it. `f` becomes a sighting at ITS OWN latest
224
+ * severity — its aggregate already counts the sightings folded into it,
225
+ * which come along as their own merged entries, so a later re-sighting of
226
+ * one of them can still lower the whole. */
227
+ function absorbFinding(into, f) {
228
+ const once = absorb(into, { ...f, ...f.own_judgement, severity: f.own_severity ?? f.severity });
229
+ const merged = [
230
+ ...once.merged,
231
+ ...(f.merged ?? []).filter((m) => !once.merged.some((x) => x.fingerprint === m.fingerprint)),
232
+ ];
233
+ return {
234
+ ...once,
235
+ severity: aggregateSeverity(once.own_severity, merged),
236
+ ...aggregateJudgements(once.own_judgement ?? judgementOf(once, once), merged),
237
+ lenses: [...new Set([...once.lenses, ...(f.lenses ?? [])])],
238
+ merged,
239
+ aliases: [...new Set([...once.aliases, ...(f.aliases ?? [])])],
240
+ };
241
+ }
242
+ /**
243
+ * The end-of-run pass: a finding first seen this run, untriaged, that is a
244
+ * near-duplicate of another finding this run sighted folds into it — what
245
+ * report-time collapse misses when the duplicate's case ran before the
246
+ * sighting it duplicates. Mutates `byFp`; returns how many folded.
247
+ */
248
+ function collapseRun(byFp, run, held) {
249
+ let folded = 0;
250
+ const all = [...byFp.values()];
251
+ for (const f of all) {
252
+ if (!byFp.has(f.fingerprint))
253
+ continue;
254
+ const fresh = f.state === "new" &&
255
+ f.first_seen.run === run &&
256
+ !f.ticket &&
257
+ !f.dismissal &&
258
+ !held.has(f.fingerprint);
259
+ if (!fresh)
260
+ continue;
261
+ const into = [...byFp.values()].find((o) => o.fingerprint !== f.fingerprint && collapsible(o, run, held) && nearDuplicate(o, f));
262
+ if (!into)
263
+ continue;
264
+ const cur = byFp.get(f.fingerprint);
265
+ byFp.delete(f.fingerprint);
266
+ byFp.set(into.fingerprint, absorbFinding(into, cur));
267
+ folded++;
268
+ }
269
+ return folded;
270
+ }
271
+ function sightingOf(r) {
272
+ return {
273
+ fingerprint: r.fingerprint,
274
+ lens: r.lens,
275
+ start: r.start,
276
+ end: r.end,
277
+ severity: r.severity,
278
+ claim: r.claim,
279
+ validated: r.validated,
280
+ doubt: r.doubt,
281
+ validity: r.validity ?? null,
282
+ scenario: r.scenario ?? null,
283
+ };
284
+ }
285
+ function aggregateJudgements(own, merged) {
286
+ return merged.reduce((current, sighting) => {
287
+ if (sighting.validated === undefined)
288
+ return current;
289
+ const next = {
290
+ validated: sighting.validated,
291
+ doubt: sighting.doubt ?? null,
292
+ validity: sighting.validity ?? null,
293
+ scenario: sighting.scenario ?? null,
294
+ };
295
+ return { validated: current.validated || next.validated, ...combinedJudgement(current, next) };
296
+ }, own);
297
+ }
298
+ /** The highest of a finding's own latest severity and each merged
299
+ * sighting's latest. */
300
+ function aggregateSeverity(own, merged) {
301
+ return merged.reduce((s, m) => higher(s, m.severity), own);
302
+ }
303
+ /** Fold reported near-duplicate `r` into stored `into`. It is a sighting at
304
+ * the content `r` read, so the content hash moves with it. */
305
+ function absorb(into, r) {
306
+ const lenses = [...new Set([...lensesOf(into), r.lens])];
307
+ const merged = [
308
+ ...(into.merged ?? []).filter((m) => m.fingerprint !== r.fingerprint),
309
+ sightingOf({
310
+ ...r,
311
+ ...judgementOf((into.merged ?? []).find((m) => m.fingerprint === r.fingerprint && m.validated !== undefined) ?? { validated: false, doubt: null }, r),
312
+ }),
313
+ ];
314
+ const ownJudgement = into.own_judgement ?? judgementOf(into, into);
315
+ // Before anything collapsed into it, its severity IS its own; a record
316
+ // stored before `own_severity` existed falls back to its aggregate.
317
+ const own = into.own_severity ?? into.severity;
318
+ return {
319
+ ...into,
320
+ ...(r.blob !== undefined ? { blob: r.blob } : {}),
321
+ own_severity: own,
322
+ severity: aggregateSeverity(own, merged),
323
+ own_judgement: ownJudgement,
324
+ ...aggregateJudgements(ownJudgement, merged),
325
+ lenses,
326
+ merged,
327
+ aliases: [...new Set([...(into.aliases ?? []), r.fingerprint])],
328
+ };
329
+ }
330
+ /** Every lens that raised `f` — a collapsed finding's all of them. */
331
+ const lensesOf = (f) => f.lenses ?? [f.lens];
332
+ /** Do `a` and `b` share a lens that raised them? */
333
+ function shareLens(a, b) {
334
+ const la = lensesOf(a);
335
+ return lensesOf(b).some((l) => la.includes(l));
336
+ }
337
+ /** Could fresh finding `n` be old finding `o`, moved or reworded? A lens in
338
+ * common (any lens a collapsed finding holds — its silent primary lens is
339
+ * not the only one that can report it again), and the same unit or the
340
+ * same kind. */
341
+ function mightBe(o, n) {
342
+ return shareLens(o, n) && (o.unit === n.unit || o.kind === n.kind);
343
+ }
344
+ /** The state a `fixed` finding takes when a scan reports it again: promoted
345
+ * stays promoted while its ticket is still open (nothing closed it yet);
346
+ * anything else, including a promoted one whose ticket was closed, is `new`
347
+ * again — the ticket record stays, so a re-promote never files twice.
348
+ * (A dismissed finding is never fixed at all — `settleUnreported`.) */
349
+ function returnedState(f) {
350
+ if (f.fixed?.from === "promoted" && f.ticket && !f.ticket.closed)
351
+ return "promoted";
352
+ return "new";
353
+ }
354
+ export { goneDismissal } from "./scanreport.js";
355
+ /** Is `f` already settled — fixed, or a gone dismissal? A settled finding is
356
+ * out of play until a scan reports it again. */
357
+ export const settled = (f) => f.state === "fixed" || goneDismissal(f);
358
+ /**
359
+ * Settle a finding a re-scan no longer reports — the ONE place every path
360
+ * (reconcile, a report that shrinks the question, the companion's match)
361
+ * settles one. A DISMISSED finding stays dismissed (a re-scan never
362
+ * overwrites the operator's triage), stamped `unreported` for audit;
363
+ * any other becomes `fixed` (a promoted one's ticket then closes).
364
+ * `null` when there was nothing to settle.
365
+ */
366
+ function settleUnreported(f, at) {
367
+ if (f.state === "fixed" || settled(f))
368
+ return null;
369
+ const where = { run: at.run, sha: at.sha, at: at.at };
370
+ if (f.state === "dismissed")
371
+ return { finding: { ...f, unreported: where, not_reproduced: null }, as: "dismissed" };
372
+ return {
373
+ finding: {
374
+ ...f,
375
+ state: "fixed",
376
+ fixed: { ...where, from: f.state },
377
+ unreported: null,
378
+ not_reproduced: null,
379
+ },
380
+ as: "fixed",
381
+ };
382
+ }
383
+ /** The question over `unreported` × `fresh`, or null when nothing waits. */
384
+ function questionOf(unreported, fresh, at) {
385
+ if (unreported.length === 0)
386
+ return null;
387
+ const u = [...new Set(unreported)].sort();
388
+ const f = [...new Set(fresh)].sort();
389
+ const key = createHash("sha256")
390
+ .update(JSON.stringify({ u, f, run: at.run }))
391
+ .digest("hex")
392
+ .slice(0, 16);
393
+ return { key, run: at.run, sha: at.sha, at: at.at, unreported: u, fresh: f };
394
+ }
395
+ /**
396
+ * Settle a question's two sides against `byFp`: an old finding with no
397
+ * fresh candidate left is fixed now; a fresh one no old finding could be
398
+ * leaves the question (it is simply new). Mutates `byFp`; returns the
399
+ * question that still waits and how many it fixed.
400
+ */
401
+ function settleQuestion(byFp, unreported, fresh, at) {
402
+ const live = (fp) => {
403
+ const f = byFp.get(fp);
404
+ return f && !settled(f) ? f : null;
405
+ };
406
+ const olds = [...new Set(unreported)].map(live).filter((f) => f !== null);
407
+ const oldSet = new Set(olds.map((f) => f.fingerprint));
408
+ const news = [...new Set(fresh)]
409
+ .map(live)
410
+ .filter((f) => f !== null && !oldSet.has(f.fingerprint));
411
+ let fixed = 0;
412
+ let dismissed = 0;
413
+ const waiting = [];
414
+ for (const o of olds) {
415
+ if (news.some((n) => mightBe(o, n)))
416
+ waiting.push(o.fingerprint);
417
+ else {
418
+ const s = settleUnreported(o, at);
419
+ byFp.set(o.fingerprint, s.finding);
420
+ if (s.as === "fixed")
421
+ fixed++;
422
+ else
423
+ dismissed++;
424
+ }
425
+ }
426
+ const held = olds.filter((o) => waiting.includes(o.fingerprint));
427
+ const candidates = news.filter((n) => held.some((o) => mightBe(o, n))).map((n) => n.fingerprint);
428
+ return { question: questionOf(waiting, candidates, at), fixed, dismissed };
429
+ }
430
+ /** The lines each lens raised `f` at: its own anchor for its own lens, and
431
+ * each collapsed sighting's for that sighting's lens. A lens with no sighting
432
+ * of its own (one a match carried over) answers for the finding's anchor. */
433
+ function sightingsByLens(f) {
434
+ const out = [{ lens: f.lens, start: f.start, end: f.end }];
435
+ for (const m of f.merged ?? [])
436
+ out.push({ lens: m.lens, start: m.start, end: m.end });
437
+ for (const lens of lensesOf(f))
438
+ if (!out.some((o) => o.lens === lens))
439
+ out.push({ lens, start: f.start, end: f.end });
440
+ return out;
441
+ }
442
+ /**
443
+ * The latest reading that re-read `f`'s lines at the very content it was
444
+ * last seen at, by another run since, with EVERY lens that raised it — and
445
+ * did not report it (a reading that did would have moved its last sighting).
446
+ * Null when some lens has no such row. A ranged row counts only when its
447
+ * range holds the lines THAT lens raised it at — a collapsed sighting's own
448
+ * lines, not the finding's anchor.
449
+ */
450
+ function silentReread(f, rows, current) {
451
+ if (f.blob == null || (current !== undefined && current !== f.blob))
452
+ return null;
453
+ let latest = null;
454
+ for (const s of sightingsByLens(f)) {
455
+ let best = null;
456
+ for (const r of rows) {
457
+ if (r.lens !== s.lens || r.path !== f.path || r.blob !== f.blob)
458
+ continue;
459
+ if (r.run === f.last_seen.run || r.at < f.last_seen.at)
460
+ continue;
461
+ if (r.range && (r.range.start > s.start || r.range.end < s.end))
462
+ continue;
463
+ if (best === null || r.at > best.at)
464
+ best = r;
465
+ }
466
+ if (best === null)
467
+ return null;
468
+ if (latest === null || best.at > latest.at)
469
+ latest = best;
470
+ }
471
+ return latest;
472
+ }
473
+ export class FindingsStore {
474
+ state;
475
+ constructor(state) {
476
+ this.state = state;
477
+ }
478
+ loadFile() {
479
+ const empty = { version: FINDINGS_VERSION, findings: [], question: null };
480
+ let text;
481
+ try {
482
+ text = this.state.read(FINDINGS_FILE);
483
+ }
484
+ catch (err) {
485
+ return {
486
+ file: empty,
487
+ error: `${FINDINGS_FILE} in ${this.state.location} cannot be read: ${String(err)}`,
488
+ };
489
+ }
490
+ if (text === null)
491
+ return { file: empty, error: null };
492
+ try {
493
+ return { file: parseFindingsFile(text), error: null };
494
+ }
495
+ catch (err) {
496
+ return {
497
+ file: empty,
498
+ error: `${FINDINGS_FILE} in ${this.state.location} is not a findings store this version reads (${String(err)}) — ` +
499
+ "nothing will overwrite it; move it aside to start over",
500
+ };
501
+ }
502
+ }
503
+ write(findings, question) {
504
+ const file = { version: FINDINGS_VERSION, findings: [...findings], question };
505
+ this.state.write(FINDINGS_FILE, `${JSON.stringify(file, null, 1)}\n`);
506
+ }
507
+ load() {
508
+ const { file, error } = this.loadFile();
509
+ return { findings: file.findings, error };
510
+ }
511
+ /**
512
+ * Record what one case reported. Exact fingerprint match first: a known
513
+ * finding keeps its state and first sighting; an unknown one is `new`.
514
+ * A known finding the pending match question held as unreported has been
515
+ * reported again, so it leaves the question. An unknown one that is a
516
+ * near-duplicate of a stored live finding is collapsed into it
517
+ * (`nearDuplicate`). Returns how many were new, how many matched (by
518
+ * fingerprint or alias) and how many were collapsed. Throws when the stored file cannot be read — never
519
+ * writes over it.
520
+ */
521
+ report(reported, seen) {
522
+ const { file, error } = this.loadFile();
523
+ if (error !== null)
524
+ throw new Error(error);
525
+ const byFp = new Map(file.findings.map((f) => [f.fingerprint, f]));
526
+ // Every alias names the finding that carries it: an absorbed
527
+ // near-duplicate's fingerprint, and a fingerprint the finding had before
528
+ // the companion matched it to a moved or reworded sighting.
529
+ const aliasOf = new Map();
530
+ for (const f of file.findings) {
531
+ for (const a of f.aliases ?? [])
532
+ aliasOf.set(a, f.fingerprint);
533
+ for (const a of f.merged ?? [])
534
+ aliasOf.set(a.fingerprint, f.fingerprint);
535
+ }
536
+ const held = new Set(file.question?.unreported ?? []);
537
+ let added = 0;
538
+ let matched = 0;
539
+ let merged = 0;
540
+ const back = new Set();
541
+ for (const r of reported) {
542
+ const ownFp = byFp.has(r.fingerprint) ? r.fingerprint : aliasOf.get(r.fingerprint);
543
+ const known = ownFp === undefined ? undefined : byFp.get(ownFp);
544
+ if (known && ownFp !== undefined) {
545
+ // The same sighting twice (one case reporting a duplicate) counts once.
546
+ const again = known.last_seen.run === seen.run && known.last_seen.sha === seen.sha;
547
+ const state = known.state === "fixed" ? returnedState(known) : known.state;
548
+ const history = {
549
+ state,
550
+ fixed: null,
551
+ unreported: null,
552
+ not_reproduced: null,
553
+ first_seen: known.first_seen,
554
+ last_seen: seen,
555
+ seen: again ? known.seen : known.seen + 1,
556
+ };
557
+ if (!(known.merged ?? []).some((m) => m.fingerprint === r.fingerprint)) {
558
+ // Its own fingerprint, or one it carried before a match: a sighting
559
+ // of the finding itself, stored under the identity it already has.
560
+ // A collapsed finding carries the highest severity its sightings now
561
+ // give — its own latest and each absorbed one's latest, never a
562
+ // stale maximum a re-scan has since lowered.
563
+ const severity = aggregateSeverity(r.severity, known.merged ?? []);
564
+ const ownJudgement = judgementOf(known.own_judgement ?? known, r);
565
+ byFp.set(ownFp, {
566
+ ...known,
567
+ ...r,
568
+ fingerprint: ownFp,
569
+ ...aggregateJudgements(ownJudgement, known.merged ?? []),
570
+ severity,
571
+ ...(known.merged ? { own_severity: r.severity, own_judgement: ownJudgement } : {}),
572
+ ...history,
573
+ });
574
+ }
575
+ else {
576
+ // A sighting of an absorbed near-duplicate: the finding keeps its own
577
+ // wording and position; the alias's record and the severity move.
578
+ byFp.set(ownFp, { ...absorb(known, r), ...history });
579
+ }
580
+ // An untriaged finding's resemblance is re-read at every sighting: a
581
+ // dismissal made (or undone) since is reflected, never a stale flag.
582
+ const now = byFp.get(ownFp);
583
+ if (now.state === "new") {
584
+ const { resembles_dismissed: _was, ...rest } = now;
585
+ const lookalike = resemblingDismissal(byFp.values(), now);
586
+ byFp.set(ownFp, lookalike ? { ...rest, resembles_dismissed: lookalike } : rest);
587
+ }
588
+ back.add(ownFp);
589
+ matched++;
590
+ continue;
591
+ }
592
+ const twin = [...byFp.values()].find((f) => collapsible(f, seen.run, held) && nearDuplicate(f, r));
593
+ if (twin) {
594
+ byFp.set(twin.fingerprint, absorb(twin, r));
595
+ aliasOf.set(r.fingerprint, twin.fingerprint);
596
+ merged++;
597
+ }
598
+ else {
599
+ const lookalike = resemblingDismissal(byFp.values(), r);
600
+ byFp.set(r.fingerprint, {
601
+ ...r,
602
+ state: "new",
603
+ first_seen: seen,
604
+ last_seen: seen,
605
+ seen: 1,
606
+ ...(lookalike ? { resembles_dismissed: lookalike } : {}),
607
+ });
608
+ added++;
609
+ }
610
+ }
611
+ let question = file.question ?? null;
612
+ if (question !== null && question.unreported.some((fp) => back.has(fp))) {
613
+ const q = question;
614
+ question = settleQuestion(byFp, q.unreported.filter((fp) => !back.has(fp)), q.fresh, { run: q.run, sha: q.sha, at: q.at }).question;
615
+ }
616
+ this.write(byFp.values(), question);
617
+ return { added, matched, merged };
618
+ }
619
+ /**
620
+ * After a run: find the stored findings a re-scan no longer reports and
621
+ * settle what an exact rule can. A finding is UNREPORTED when its file is
622
+ * gone from the run's tree, or when the ledger's newest row for its lens
623
+ * and file is a later run's reading of other content — so a run the
624
+ * companion never finished is still counted by the next one. Unreported
625
+ * findings with no possible fresh counterpart are fixed now; the rest join
626
+ * the one pending match question, with the fresh findings (first seen by
627
+ * the runs that re-read those files) that might be them.
628
+ */
629
+ reconcile(args) {
630
+ const { file, error } = this.loadFile();
631
+ if (error !== null)
632
+ throw new Error(error);
633
+ const byFp = new Map(file.findings.map((f) => [f.fingerprint, f]));
634
+ // Each file's newest reading per lens — only a COMPLETE one: a file read
635
+ // in line ranges whose ranges are not all back yet has not been re-read,
636
+ // and the findings in its unread ranges must not read as fixed.
637
+ const newest = new Map();
638
+ for (const lens of new Set(args.rows.map((r) => r.lens))) {
639
+ for (const [path, r] of readings(args.rows, lens))
640
+ if (r.complete)
641
+ newest.set(`${lens}\0${path}`, r);
642
+ }
643
+ const prior = file.question ?? null;
644
+ collapseRun(byFp, args.run.run, new Set([...(prior?.unreported ?? []), ...(prior?.fresh ?? [])]));
645
+ const pending = new Set((prior?.unreported ?? []).filter((fp) => {
646
+ const finding = byFp.get(fp);
647
+ const current = finding ? args.blobs?.get(finding.path) : undefined;
648
+ return current === undefined || finding?.blob == null || current !== finding.blob;
649
+ }));
650
+ const rereadBy = new Set([args.run.run]);
651
+ const unreported = [];
652
+ let notReproduced = 0;
653
+ for (const f of [...byFp.values()]) {
654
+ if (settled(f) || pending.has(f.fingerprint))
655
+ continue;
656
+ if (!args.tree.has(f.path)) {
657
+ unreported.push(f.fingerprint);
658
+ // Wherever it moved may have been read by a run the companion never
659
+ // finished: every run of its lenses since its last sighting is one
660
+ // whose fresh findings might be it.
661
+ const lenses = lensesOf(f);
662
+ for (const r of args.rows) {
663
+ if (r.run !== f.last_seen.run && r.at >= f.last_seen.at && lenses.includes(r.lens))
664
+ rereadBy.add(r.run);
665
+ }
666
+ continue;
667
+ }
668
+ const current = args.blobs?.get(f.path);
669
+ // A collapsed finding is unreported only when EVERY lens that raised
670
+ // it has re-read other content since — one lens's silence is not the
671
+ // other's, and a single-lens run must not settle what it never read.
672
+ const readingsOf = lensesOf(f).map((l) => newest.get(`${l}\0${f.path}`));
673
+ const reread = readingsOf.every((reading) => {
674
+ const row = reading?.newest;
675
+ return (row !== undefined &&
676
+ row.run !== f.last_seen.run &&
677
+ row.at >= f.last_seen.at &&
678
+ !(f.blob != null && row.blob === f.blob) &&
679
+ (current === undefined || row.blob === current));
680
+ });
681
+ if (!reread) {
682
+ // Only OTHER content can have fixed it: a later reading of
683
+ // the content it was last seen at, over its lines, that did not
684
+ // report it again is not a fix — it stays open, stamped, once per
685
+ // reading. A dismissed one is already triaged: nothing to stamp or
686
+ // count (the count asks for triage).
687
+ const silent = f.state === "dismissed" ? null : silentReread(f, args.rows, current);
688
+ if (silent !== null && !(f.not_reproduced && f.not_reproduced.at >= silent.at)) {
689
+ byFp.set(f.fingerprint, {
690
+ ...f,
691
+ not_reproduced: {
692
+ run: silent.run,
693
+ sha: silent.sha,
694
+ at: silent.at,
695
+ count: (f.not_reproduced?.count ?? 0) + 1,
696
+ },
697
+ });
698
+ notReproduced++;
699
+ }
700
+ continue;
701
+ }
702
+ unreported.push(f.fingerprint);
703
+ // Every run of each reading re-read the file: a ranged reading finished
704
+ // by a later run keeps the earlier run's findings as candidates.
705
+ for (const reading of readingsOf)
706
+ for (const r of reading.runs)
707
+ rereadBy.add(r);
708
+ }
709
+ const fresh = [...byFp.values()]
710
+ .filter((f) => f.state !== "fixed" && rereadBy.has(f.first_seen.run))
711
+ .map((f) => f.fingerprint);
712
+ const at = args.run;
713
+ const settledNow = settleQuestion(byFp, [...pending, ...unreported], [...(prior?.fresh ?? []), ...fresh], at);
714
+ // A run that changed nothing about the question leaves it as it was: its
715
+ // key must not move under a companion that is judging it right now.
716
+ const same = (a, b) => a.length === b.length && a.every((x, i) => x === b[i]);
717
+ const question = prior !== null &&
718
+ settledNow.question !== null &&
719
+ same(settledNow.question.unreported, prior.unreported) &&
720
+ same(settledNow.question.fresh, prior.fresh)
721
+ ? prior
722
+ : settledNow.question;
723
+ this.write(byFp.values(), question);
724
+ return {
725
+ fixed: settledNow.fixed,
726
+ pending: settledNow.question?.unreported.length ?? 0,
727
+ not_reproduced: notReproduced,
728
+ dismissed_unreported: settledNow.dismissed,
729
+ };
730
+ }
731
+ /** The pending match question with both sides expanded, or null. */
732
+ question() {
733
+ const { file, error } = this.loadFile();
734
+ const q = file.question ?? null;
735
+ if (q === null)
736
+ return { question: null, error };
737
+ const byFp = new Map(file.findings.map((f) => [f.fingerprint, f]));
738
+ const expand = (fps) => fps.map((fp) => byFp.get(fp)).filter((f) => f !== undefined);
739
+ return {
740
+ question: {
741
+ key: q.key,
742
+ run: q.run,
743
+ sha: q.sha,
744
+ unreported: expand(q.unreported),
745
+ fresh: expand(q.fresh),
746
+ },
747
+ error,
748
+ };
749
+ }
750
+ /**
751
+ * The companion's answer to the pending question, whole: `pairs` are the
752
+ * same finding (one-to-one, a lens in common); every unreported finding it does
753
+ * not pair is fixed; every fresh one it does not pair stays new. Refused —
754
+ * all of it — on a stale key, an unknown fingerprint, a reused one, a
755
+ * lens mismatch, or a pair whose two sides carry different tickets.
756
+ */
757
+ match(args) {
758
+ const { file, error } = this.loadFile();
759
+ if (error !== null)
760
+ return { ok: false, errors: [error] };
761
+ const q = file.question ?? null;
762
+ if (q === null)
763
+ return { ok: false, errors: ["no match question is pending — nothing to judge"] };
764
+ if (args.key !== q.key) {
765
+ return {
766
+ ok: false,
767
+ errors: [
768
+ `the question moved since you read it (key ${String(args.key)}, now ${q.key}) — read it again`,
769
+ ],
770
+ };
771
+ }
772
+ if (args.pairs !== undefined && !Array.isArray(args.pairs))
773
+ return { ok: false, errors: ["`pairs` must be a list of {old, new}"] };
774
+ const byFp = new Map(file.findings.map((f) => [f.fingerprint, f]));
775
+ const pairs = [];
776
+ const errors = [];
777
+ const usedOld = new Set();
778
+ const usedNew = new Set();
779
+ for (const raw of (args.pairs ?? [])) {
780
+ const p = raw;
781
+ const o = typeof p?.old === "string" ? p.old : "";
782
+ const n = typeof p?.new === "string" ? p.new : "";
783
+ if (!q.unreported.includes(o))
784
+ errors.push(`${JSON.stringify(o)} is not an unreported finding of this question`);
785
+ else if (usedOld.has(o))
786
+ errors.push(`${o.slice(0, 12)} is paired twice`);
787
+ if (!q.fresh.includes(n))
788
+ errors.push(`${JSON.stringify(n)} is not a fresh finding of this question`);
789
+ else if (usedNew.has(n))
790
+ errors.push(`${n.slice(0, 12)} is paired twice`);
791
+ const of = byFp.get(o);
792
+ const nf = byFp.get(n);
793
+ if (of && nf && !shareLens(of, nf))
794
+ errors.push(`${o.slice(0, 12)} and ${n.slice(0, 12)} are different lenses' findings`);
795
+ // Each side's ticket is a filed work item: a pair that would keep only
796
+ // one of two different tickets would orphan the other.
797
+ else if (of?.ticket && nf?.ticket && of.ticket.ref !== nf.ticket.ref) {
798
+ errors.push(`${o.slice(0, 12)} (${of.ticket.ref}) and ${n.slice(0, 12)} (${nf.ticket.ref}) each carry their own ticket — pairing would orphan one; leave them unpaired (the old one then settles as fixed and its ticket closes, the fresh one keeps its own)`);
799
+ }
800
+ usedOld.add(o);
801
+ usedNew.add(n);
802
+ pairs.push({ old: o, new: n });
803
+ }
804
+ if (errors.length > 0)
805
+ return { ok: false, errors };
806
+ const at = { run: q.run, sha: q.sha, at: q.at };
807
+ let matched = 0;
808
+ for (const { old, new: nfp } of pairs) {
809
+ const o = byFp.get(old);
810
+ const n = byFp.get(nfp);
811
+ if (!o || !n)
812
+ continue;
813
+ byFp.delete(old);
814
+ // The triage travels with the finding: a matched promoted finding
815
+ // keeps its ticket (never filed twice), a dismissed one its reason —
816
+ // and a fresh one promoted or dismissed while the question waited
817
+ // keeps its own when the old side has none.
818
+ const triaged = o.ticket ? o : n.ticket ? n : o.dismissal ? o : n.dismissal ? n : o;
819
+ // The sightings each side had collapsed come along, and the severity is
820
+ // the highest of the fresh finding's own and theirs — the invariant a
821
+ // report keeps, never the fresh record's alone.
822
+ const merged = o.merged || n.merged ? [...(o.merged ?? []), ...(n.merged ?? [])] : null;
823
+ const own = n.own_severity ?? n.severity;
824
+ const ownJudgement = n.own_judgement ?? judgementOf(n, n);
825
+ byFp.set(nfp, {
826
+ ...n,
827
+ ...(merged
828
+ ? {
829
+ own_severity: own,
830
+ severity: aggregateSeverity(own, merged),
831
+ own_judgement: ownJudgement,
832
+ ...aggregateJudgements(ownJudgement, merged),
833
+ }
834
+ : {}),
835
+ state: triaged.state,
836
+ fixed: null,
837
+ first_seen: o.first_seen,
838
+ seen: o.seen + n.seen,
839
+ aliases: [...new Set([...(o.aliases ?? []), old, ...(n.aliases ?? [])])],
840
+ ...(o.lenses || n.lenses ? { lenses: [...new Set([...lensesOf(o), ...lensesOf(n)])] } : {}),
841
+ ...(merged ? { merged } : {}),
842
+ dismissal: o.dismissal ?? n.dismissal ?? null,
843
+ ticket: triaged.ticket ?? null,
844
+ });
845
+ matched++;
846
+ }
847
+ let fixed = 0;
848
+ let dismissed = 0;
849
+ for (const fp of q.unreported) {
850
+ if (usedOld.has(fp))
851
+ continue;
852
+ const f = byFp.get(fp);
853
+ const s = f ? settleUnreported(f, at) : null;
854
+ if (s) {
855
+ byFp.set(fp, s.finding);
856
+ if (s.as === "fixed")
857
+ fixed++;
858
+ else
859
+ dismissed++;
860
+ }
861
+ }
862
+ this.write(byFp.values(), null);
863
+ return {
864
+ ok: true,
865
+ matched,
866
+ fixed,
867
+ new: q.fresh.filter((fp) => !usedNew.has(fp)).length,
868
+ dismissed_unreported: dismissed,
869
+ };
870
+ }
871
+ /** The stored findings the filter keeps, most severe first — a finding
872
+ * flagged as resembling a dismissed one below the rest of its severity —
873
+ * then by file. */
874
+ list(filter = {}) {
875
+ const { findings, error } = this.load();
876
+ const rank = severityRank;
877
+ const kept = findings
878
+ .filter((f) => (filter.state === undefined || f.state === filter.state) &&
879
+ (filter.lens === undefined ||
880
+ f.lens === filter.lens ||
881
+ (f.lenses ?? []).includes(filter.lens)) &&
882
+ (filter.unit === undefined || f.unit === filter.unit) &&
883
+ (filter.severity === undefined || f.severity === filter.severity) &&
884
+ (filter.doubted === undefined || (f.doubt !== null) === filter.doubted) &&
885
+ (filter.validity === undefined || validityOf(f) === filter.validity))
886
+ .sort((a, b) => rank(a.severity) - rank(b.severity) ||
887
+ lookalikeRank(a) - lookalikeRank(b) ||
888
+ (a.path < b.path ? -1 : a.path > b.path ? 1 : a.start - b.start));
889
+ return { findings: kept, error };
890
+ }
891
+ // -- triage (the rules are triage.ts's, the record is here) --
892
+ /**
893
+ * The one stored finding `ref` names: a full fingerprint, an alias (a
894
+ * fingerprint it carried before a match), or an unambiguous prefix of at
895
+ * least 12 hex characters — what `scan_findings` shows.
896
+ */
897
+ find(ref) {
898
+ const { findings, error } = this.load();
899
+ if (error !== null)
900
+ return { ok: false, errors: [error] };
901
+ const want = ref.trim().toLowerCase();
902
+ if (!/^[0-9a-f]{12,64}$/.test(want))
903
+ return {
904
+ ok: false,
905
+ errors: [`${JSON.stringify(ref)} is not a fingerprint (12+ hex characters)`],
906
+ };
907
+ const exact = findings.find((f) => f.fingerprint === want || (f.aliases ?? []).includes(want));
908
+ if (exact)
909
+ return { ok: true, finding: exact };
910
+ const hits = findings.filter((f) => f.fingerprint.startsWith(want) || (f.aliases ?? []).some((a) => a.startsWith(want)));
911
+ if (hits.length === 1)
912
+ return { ok: true, finding: hits[0] };
913
+ return {
914
+ ok: false,
915
+ errors: [
916
+ hits.length === 0
917
+ ? `no stored finding has fingerprint ${want}`
918
+ : `${want} matches ${hits.length} findings — give more of the fingerprint`,
919
+ ],
920
+ };
921
+ }
922
+ /**
923
+ * Rewrite ONE finding, by its current fingerprint, under a fresh load —
924
+ * refused (nothing written) when the store cannot be read or the finding
925
+ * is gone (a match renamed it since the caller looked). `change` returns
926
+ * the new record, or an error string to refuse.
927
+ */
928
+ update(fingerprint, change) {
929
+ const { file, error } = this.loadFile();
930
+ if (error !== null)
931
+ return { ok: false, errors: [error] };
932
+ const i = file.findings.findIndex((f) => f.fingerprint === fingerprint);
933
+ if (i < 0)
934
+ return {
935
+ ok: false,
936
+ errors: [
937
+ `finding ${fingerprint.slice(0, 12)} is no longer stored under that fingerprint — list the findings again`,
938
+ ],
939
+ };
940
+ const next = change(file.findings[i]);
941
+ if (typeof next === "string")
942
+ return { ok: false, errors: [next] };
943
+ file.findings[i] = next;
944
+ this.write(file.findings, file.question ?? null);
945
+ return { ok: true, finding: next };
946
+ }
947
+ }
948
+ //# sourceMappingURL=findings.js.map