@kya-os/cli 1.8.1 → 1.8.3

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 (385) hide show
  1. package/dist/commands/agent.d.ts +35 -0
  2. package/dist/commands/agent.d.ts.map +1 -0
  3. package/dist/commands/agent.js +321 -0
  4. package/dist/commands/agent.js.map +1 -0
  5. package/dist/commands/build.js +2 -2
  6. package/dist/commands/build.js.map +1 -1
  7. package/dist/commands/check.js +3 -3
  8. package/dist/commands/check.js.map +1 -1
  9. package/dist/commands/checkpoint-init.d.ts +1 -1
  10. package/dist/commands/checkpoint-init.d.ts.map +1 -1
  11. package/dist/commands/checkpoint-init.js +8 -41
  12. package/dist/commands/checkpoint-init.js.map +1 -1
  13. package/dist/commands/claim.js +2 -2
  14. package/dist/commands/claim.js.map +1 -1
  15. package/dist/commands/dco.d.ts +59 -0
  16. package/dist/commands/dco.d.ts.map +1 -1
  17. package/dist/commands/dco.js +280 -5
  18. package/dist/commands/dco.js.map +1 -1
  19. package/dist/commands/dev.js +1 -1
  20. package/dist/commands/dev.js.map +1 -1
  21. package/dist/commands/doctor.d.ts.map +1 -1
  22. package/dist/commands/doctor.js +18 -24
  23. package/dist/commands/doctor.js.map +1 -1
  24. package/dist/commands/env.js +6 -6
  25. package/dist/commands/env.js.map +1 -1
  26. package/dist/commands/identity.js +3 -3
  27. package/dist/commands/identity.js.map +1 -1
  28. package/dist/commands/init-stages.d.ts +141 -0
  29. package/dist/commands/init-stages.d.ts.map +1 -0
  30. package/dist/commands/init-stages.js +684 -0
  31. package/dist/commands/init-stages.js.map +1 -0
  32. package/dist/commands/init.d.ts +46 -16
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +229 -279
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/orchestrator.d.ts +18 -0
  37. package/dist/commands/orchestrator.d.ts.map +1 -0
  38. package/dist/commands/orchestrator.js +251 -0
  39. package/dist/commands/orchestrator.js.map +1 -0
  40. package/dist/commands/register.d.ts +1 -1
  41. package/dist/commands/register.d.ts.map +1 -1
  42. package/dist/commands/register.js +35 -7
  43. package/dist/commands/register.js.map +1 -1
  44. package/dist/commands/review.d.ts +48 -0
  45. package/dist/commands/review.d.ts.map +1 -0
  46. package/dist/commands/review.js +220 -0
  47. package/dist/commands/review.js.map +1 -0
  48. package/dist/commands/rotate.js +4 -4
  49. package/dist/commands/rotate.js.map +1 -1
  50. package/dist/commands/score.d.ts +15 -0
  51. package/dist/commands/score.d.ts.map +1 -0
  52. package/dist/commands/score.js +471 -0
  53. package/dist/commands/score.js.map +1 -0
  54. package/dist/commands/start.js +3 -3
  55. package/dist/commands/start.js.map +1 -1
  56. package/dist/commands/status.js +1 -1
  57. package/dist/commands/status.js.map +1 -1
  58. package/dist/commands/verify.js +6 -6
  59. package/dist/commands/verify.js.map +1 -1
  60. package/dist/dco.d.ts +4 -0
  61. package/dist/dco.d.ts.map +1 -0
  62. package/dist/dco.js +23 -0
  63. package/dist/dco.js.map +1 -0
  64. package/dist/index.js +52 -9
  65. package/dist/orchestrator/daemon.d.ts +137 -0
  66. package/dist/orchestrator/daemon.d.ts.map +1 -0
  67. package/dist/orchestrator/daemon.js +242 -0
  68. package/dist/orchestrator/daemon.js.map +1 -0
  69. package/dist/orchestrator/db/dispatches.d.ts +108 -0
  70. package/dist/orchestrator/db/dispatches.d.ts.map +1 -0
  71. package/dist/orchestrator/db/dispatches.js +122 -0
  72. package/dist/orchestrator/db/dispatches.js.map +1 -0
  73. package/dist/orchestrator/db/index.d.ts +50 -0
  74. package/dist/orchestrator/db/index.d.ts.map +1 -0
  75. package/dist/orchestrator/db/index.js +116 -0
  76. package/dist/orchestrator/db/index.js.map +1 -0
  77. package/dist/orchestrator/db/journal.d.ts +93 -0
  78. package/dist/orchestrator/db/journal.d.ts.map +1 -0
  79. package/dist/orchestrator/db/journal.js +91 -0
  80. package/dist/orchestrator/db/journal.js.map +1 -0
  81. package/dist/orchestrator/db/liveness.d.ts +97 -0
  82. package/dist/orchestrator/db/liveness.d.ts.map +1 -0
  83. package/dist/orchestrator/db/liveness.js +105 -0
  84. package/dist/orchestrator/db/liveness.js.map +1 -0
  85. package/dist/orchestrator/db/mission.d.ts +78 -0
  86. package/dist/orchestrator/db/mission.d.ts.map +1 -0
  87. package/dist/orchestrator/db/mission.js +99 -0
  88. package/dist/orchestrator/db/mission.js.map +1 -0
  89. package/dist/orchestrator/db/schema.d.ts +14 -0
  90. package/dist/orchestrator/db/schema.d.ts.map +1 -0
  91. package/dist/orchestrator/db/schema.js +169 -0
  92. package/dist/orchestrator/db/schema.js.map +1 -0
  93. package/dist/orchestrator/db/tickets.d.ts +147 -0
  94. package/dist/orchestrator/db/tickets.d.ts.map +1 -0
  95. package/dist/orchestrator/db/tickets.js +238 -0
  96. package/dist/orchestrator/db/tickets.js.map +1 -0
  97. package/dist/orchestrator/db/verdicts.d.ts +187 -0
  98. package/dist/orchestrator/db/verdicts.d.ts.map +1 -0
  99. package/dist/orchestrator/db/verdicts.js +197 -0
  100. package/dist/orchestrator/db/verdicts.js.map +1 -0
  101. package/dist/orchestrator/events.d.ts +69 -0
  102. package/dist/orchestrator/events.d.ts.map +1 -0
  103. package/dist/orchestrator/events.js +20 -0
  104. package/dist/orchestrator/events.js.map +1 -0
  105. package/dist/orchestrator/github-credential-anchor-sender.d.ts +159 -0
  106. package/dist/orchestrator/github-credential-anchor-sender.d.ts.map +1 -0
  107. package/dist/orchestrator/github-credential-anchor-sender.js +313 -0
  108. package/dist/orchestrator/github-credential-anchor-sender.js.map +1 -0
  109. package/dist/orchestrator/hub-dispatch.d.ts +120 -0
  110. package/dist/orchestrator/hub-dispatch.d.ts.map +1 -0
  111. package/dist/orchestrator/hub-dispatch.js +257 -0
  112. package/dist/orchestrator/hub-dispatch.js.map +1 -0
  113. package/dist/orchestrator/hub-observer.d.ts +201 -0
  114. package/dist/orchestrator/hub-observer.d.ts.map +1 -0
  115. package/dist/orchestrator/hub-observer.js +474 -0
  116. package/dist/orchestrator/hub-observer.js.map +1 -0
  117. package/dist/orchestrator/journal-writer.d.ts +80 -0
  118. package/dist/orchestrator/journal-writer.d.ts.map +1 -0
  119. package/dist/orchestrator/journal-writer.js +113 -0
  120. package/dist/orchestrator/journal-writer.js.map +1 -0
  121. package/dist/orchestrator/mcp/server.d.ts +136 -0
  122. package/dist/orchestrator/mcp/server.d.ts.map +1 -0
  123. package/dist/orchestrator/mcp/server.js +582 -0
  124. package/dist/orchestrator/mcp/server.js.map +1 -0
  125. package/dist/orchestrator/mcp/stdio.d.ts +22 -0
  126. package/dist/orchestrator/mcp/stdio.d.ts.map +1 -0
  127. package/dist/orchestrator/mcp/stdio.js +51 -0
  128. package/dist/orchestrator/mcp/stdio.js.map +1 -0
  129. package/dist/orchestrator/review.d.ts +131 -0
  130. package/dist/orchestrator/review.d.ts.map +1 -0
  131. package/dist/orchestrator/review.js +322 -0
  132. package/dist/orchestrator/review.js.map +1 -0
  133. package/dist/tui/app.d.ts +33 -0
  134. package/dist/tui/app.d.ts.map +1 -0
  135. package/dist/tui/app.js +71 -0
  136. package/dist/tui/app.js.map +1 -0
  137. package/dist/tui/components.d.ts +110 -0
  138. package/dist/tui/components.d.ts.map +1 -0
  139. package/dist/tui/components.js +118 -0
  140. package/dist/tui/components.js.map +1 -0
  141. package/dist/tui/index.d.ts +30 -0
  142. package/dist/tui/index.d.ts.map +1 -0
  143. package/dist/tui/index.js +95 -0
  144. package/dist/tui/index.js.map +1 -0
  145. package/dist/tui/keymap.d.ts +33 -0
  146. package/dist/tui/keymap.d.ts.map +1 -0
  147. package/dist/tui/keymap.js +49 -0
  148. package/dist/tui/keymap.js.map +1 -0
  149. package/dist/tui/nav.d.ts +29 -0
  150. package/dist/tui/nav.d.ts.map +1 -0
  151. package/dist/tui/nav.js +39 -0
  152. package/dist/tui/nav.js.map +1 -0
  153. package/dist/tui/sanitize.d.ts +25 -0
  154. package/dist/tui/sanitize.d.ts.map +1 -0
  155. package/dist/tui/sanitize.js +36 -0
  156. package/dist/tui/sanitize.js.map +1 -0
  157. package/dist/tui/theme.d.ts +32 -0
  158. package/dist/tui/theme.d.ts.map +1 -0
  159. package/dist/tui/theme.js +63 -0
  160. package/dist/tui/theme.js.map +1 -0
  161. package/dist/tui/views/agents.d.ts +67 -0
  162. package/dist/tui/views/agents.d.ts.map +1 -0
  163. package/dist/tui/views/agents.js +231 -0
  164. package/dist/tui/views/agents.js.map +1 -0
  165. package/dist/tui/views/index.d.ts +93 -0
  166. package/dist/tui/views/index.d.ts.map +1 -0
  167. package/dist/tui/views/index.js +150 -0
  168. package/dist/tui/views/index.js.map +1 -0
  169. package/dist/tui/views/registry.d.ts +22 -0
  170. package/dist/tui/views/registry.d.ts.map +1 -0
  171. package/dist/tui/views/registry.js +110 -0
  172. package/dist/tui/views/registry.js.map +1 -0
  173. package/dist/utils/agent/backoff.d.ts +31 -0
  174. package/dist/utils/agent/backoff.d.ts.map +1 -0
  175. package/dist/utils/agent/backoff.js +51 -0
  176. package/dist/utils/agent/backoff.js.map +1 -0
  177. package/dist/utils/agent/markers.d.ts +87 -0
  178. package/dist/utils/agent/markers.d.ts.map +1 -0
  179. package/dist/utils/agent/markers.js +147 -0
  180. package/dist/utils/agent/markers.js.map +1 -0
  181. package/dist/utils/agent/review.d.ts +67 -0
  182. package/dist/utils/agent/review.d.ts.map +1 -0
  183. package/dist/utils/agent/review.js +305 -0
  184. package/dist/utils/agent/review.js.map +1 -0
  185. package/dist/utils/agent/spawn-agent.d.ts +117 -0
  186. package/dist/utils/agent/spawn-agent.d.ts.map +1 -0
  187. package/dist/utils/agent/spawn-agent.js +177 -0
  188. package/dist/utils/agent/spawn-agent.js.map +1 -0
  189. package/dist/utils/agent/task.d.ts +101 -0
  190. package/dist/utils/agent/task.d.ts.map +1 -0
  191. package/dist/utils/agent/task.js +357 -0
  192. package/dist/utils/agent/task.js.map +1 -0
  193. package/dist/utils/agent/verify.d.ts +47 -0
  194. package/dist/utils/agent/verify.d.ts.map +1 -0
  195. package/dist/utils/agent/verify.js +144 -0
  196. package/dist/utils/agent/verify.js.map +1 -0
  197. package/dist/utils/agent-detector.d.ts +48 -0
  198. package/dist/utils/agent-detector.d.ts.map +1 -0
  199. package/dist/utils/agent-detector.js +74 -0
  200. package/dist/utils/agent-detector.js.map +1 -0
  201. package/dist/utils/agent-profile-stage.d.ts +70 -0
  202. package/dist/utils/agent-profile-stage.d.ts.map +1 -0
  203. package/dist/utils/agent-profile-stage.js +153 -0
  204. package/dist/utils/agent-profile-stage.js.map +1 -0
  205. package/dist/utils/agent-profiles.d.ts +27 -0
  206. package/dist/utils/agent-profiles.d.ts.map +1 -0
  207. package/dist/utils/agent-profiles.js +61 -0
  208. package/dist/utils/agent-profiles.js.map +1 -0
  209. package/dist/utils/checkpoint-api.d.ts +1 -1
  210. package/dist/utils/checkpoint-api.js +1 -1
  211. package/dist/utils/checkpoint-env.d.ts +1 -1
  212. package/dist/utils/checkpoint-env.js +2 -2
  213. package/dist/utils/checkpoint-env.js.map +1 -1
  214. package/dist/utils/checkpoint-scaffold.d.ts +1 -1
  215. package/dist/utils/checkpoint-scaffold.js +1 -1
  216. package/dist/utils/cli-kit/browser.d.ts +24 -0
  217. package/dist/utils/cli-kit/browser.d.ts.map +1 -0
  218. package/dist/utils/cli-kit/browser.js +58 -0
  219. package/dist/utils/cli-kit/browser.js.map +1 -0
  220. package/dist/utils/cli-kit/claim-polling.d.ts +18 -0
  221. package/dist/utils/cli-kit/claim-polling.d.ts.map +1 -0
  222. package/dist/utils/{claim-polling.js → cli-kit/claim-polling.js} +19 -26
  223. package/dist/utils/cli-kit/claim-polling.js.map +1 -0
  224. package/dist/utils/cli-kit/diagnostics.d.ts +9 -0
  225. package/dist/utils/cli-kit/diagnostics.d.ts.map +1 -0
  226. package/dist/utils/cli-kit/diagnostics.js +11 -0
  227. package/dist/utils/cli-kit/diagnostics.js.map +1 -0
  228. package/dist/utils/cli-kit/fs-safe.d.ts +14 -0
  229. package/dist/utils/cli-kit/fs-safe.d.ts.map +1 -0
  230. package/dist/utils/cli-kit/fs-safe.js +20 -0
  231. package/dist/utils/cli-kit/fs-safe.js.map +1 -0
  232. package/dist/utils/cli-kit/index.d.ts +15 -0
  233. package/dist/utils/cli-kit/index.d.ts.map +1 -0
  234. package/dist/utils/cli-kit/index.js +10 -0
  235. package/dist/utils/cli-kit/index.js.map +1 -0
  236. package/dist/utils/cli-kit/json-file.d.ts +21 -0
  237. package/dist/utils/cli-kit/json-file.d.ts.map +1 -0
  238. package/dist/utils/cli-kit/json-file.js +51 -0
  239. package/dist/utils/cli-kit/json-file.js.map +1 -0
  240. package/dist/utils/cli-kit/marker-block.d.ts +26 -0
  241. package/dist/utils/cli-kit/marker-block.d.ts.map +1 -0
  242. package/dist/utils/cli-kit/marker-block.js +61 -0
  243. package/dist/utils/cli-kit/marker-block.js.map +1 -0
  244. package/dist/utils/cli-kit/paths.d.ts +15 -0
  245. package/dist/utils/cli-kit/paths.d.ts.map +1 -0
  246. package/dist/utils/cli-kit/paths.js +21 -0
  247. package/dist/utils/cli-kit/paths.js.map +1 -0
  248. package/dist/utils/cli-kit/secure-storage.d.ts +14 -0
  249. package/dist/utils/cli-kit/secure-storage.d.ts.map +1 -0
  250. package/dist/utils/cli-kit/secure-storage.js +20 -0
  251. package/dist/utils/cli-kit/secure-storage.js.map +1 -0
  252. package/dist/utils/cli-kit/step-report.d.ts +16 -0
  253. package/dist/utils/cli-kit/step-report.d.ts.map +1 -0
  254. package/dist/utils/cli-kit/step-report.js +36 -0
  255. package/dist/utils/cli-kit/step-report.js.map +1 -0
  256. package/dist/utils/dco/agent-metadata.d.ts +1 -1
  257. package/dist/utils/dco/agent-metadata.js +1 -1
  258. package/dist/utils/dco/agent-metadata.js.map +1 -1
  259. package/dist/utils/dco/claude-config.d.ts +18 -14
  260. package/dist/utils/dco/claude-config.d.ts.map +1 -1
  261. package/dist/utils/dco/claude-config.js +31 -97
  262. package/dist/utils/dco/claude-config.js.map +1 -1
  263. package/dist/utils/dco/dispatch.d.ts +134 -0
  264. package/dist/utils/dco/dispatch.d.ts.map +1 -0
  265. package/dist/utils/dco/dispatch.js +399 -0
  266. package/dist/utils/dco/dispatch.js.map +1 -0
  267. package/dist/utils/dco/fix.d.ts +122 -0
  268. package/dist/utils/dco/fix.d.ts.map +1 -0
  269. package/dist/utils/dco/fix.js +560 -0
  270. package/dist/utils/dco/fix.js.map +1 -0
  271. package/dist/utils/dco/git-config.d.ts.map +1 -1
  272. package/dist/utils/dco/git-config.js +5 -3
  273. package/dist/utils/dco/git-config.js.map +1 -1
  274. package/dist/utils/dco/github.d.ts +101 -0
  275. package/dist/utils/dco/github.d.ts.map +1 -1
  276. package/dist/utils/dco/github.js +133 -0
  277. package/dist/utils/dco/github.js.map +1 -1
  278. package/dist/utils/dco/paths.d.ts +1 -8
  279. package/dist/utils/dco/paths.d.ts.map +1 -1
  280. package/dist/utils/dco/paths.js +3 -12
  281. package/dist/utils/dco/paths.js.map +1 -1
  282. package/dist/utils/dco/render.d.ts +1 -1
  283. package/dist/utils/dco/render.d.ts.map +1 -1
  284. package/dist/utils/dco/render.js +4 -21
  285. package/dist/utils/dco/render.js.map +1 -1
  286. package/dist/utils/dco/resolve-agent.d.ts +54 -0
  287. package/dist/utils/dco/resolve-agent.d.ts.map +1 -0
  288. package/dist/utils/dco/resolve-agent.js +164 -0
  289. package/dist/utils/dco/resolve-agent.js.map +1 -0
  290. package/dist/utils/dco/setup.d.ts +10 -7
  291. package/dist/utils/dco/setup.d.ts.map +1 -1
  292. package/dist/utils/dco/setup.js +264 -200
  293. package/dist/utils/dco/setup.js.map +1 -1
  294. package/dist/utils/dco/signing-key-writer.d.ts +40 -0
  295. package/dist/utils/dco/signing-key-writer.d.ts.map +1 -0
  296. package/dist/utils/dco/signing-key-writer.js +76 -0
  297. package/dist/utils/dco/signing-key-writer.js.map +1 -0
  298. package/dist/utils/dco/ssh-key.d.ts +50 -0
  299. package/dist/utils/dco/ssh-key.d.ts.map +1 -1
  300. package/dist/utils/dco/ssh-key.js +129 -8
  301. package/dist/utils/dco/ssh-key.js.map +1 -1
  302. package/dist/utils/dco/status.d.ts +1 -1
  303. package/dist/utils/dco/status.d.ts.map +1 -1
  304. package/dist/utils/dco/status.js +3 -3
  305. package/dist/utils/dco/status.js.map +1 -1
  306. package/dist/utils/dco/verify.d.ts +170 -0
  307. package/dist/utils/dco/verify.d.ts.map +1 -0
  308. package/dist/utils/dco/verify.js +550 -0
  309. package/dist/utils/dco/verify.js.map +1 -0
  310. package/dist/utils/dependency-installer.d.ts +37 -0
  311. package/dist/utils/dependency-installer.d.ts.map +1 -0
  312. package/dist/utils/dependency-installer.js +32 -0
  313. package/dist/utils/dependency-installer.js.map +1 -0
  314. package/dist/utils/github-credential-stage.d.ts +87 -0
  315. package/dist/utils/github-credential-stage.d.ts.map +1 -0
  316. package/dist/utils/github-credential-stage.js +168 -0
  317. package/dist/utils/github-credential-stage.js.map +1 -0
  318. package/dist/utils/github-credential.d.ts +160 -0
  319. package/dist/utils/github-credential.d.ts.map +1 -0
  320. package/dist/utils/github-credential.js +308 -0
  321. package/dist/utils/github-credential.js.map +1 -0
  322. package/dist/utils/gitignore.d.ts +17 -0
  323. package/dist/utils/gitignore.d.ts.map +1 -0
  324. package/dist/utils/gitignore.js +40 -0
  325. package/dist/utils/gitignore.js.map +1 -0
  326. package/dist/utils/hub-config.d.ts +21 -0
  327. package/dist/utils/hub-config.d.ts.map +1 -0
  328. package/dist/utils/hub-config.js +28 -0
  329. package/dist/utils/hub-config.js.map +1 -0
  330. package/dist/utils/identity-heal.d.ts +16 -0
  331. package/dist/utils/identity-heal.d.ts.map +1 -0
  332. package/dist/utils/identity-heal.js +37 -0
  333. package/dist/utils/identity-heal.js.map +1 -0
  334. package/dist/utils/init/pipeline.d.ts +74 -0
  335. package/dist/utils/init/pipeline.d.ts.map +1 -0
  336. package/dist/utils/init/pipeline.js +96 -0
  337. package/dist/utils/init/pipeline.js.map +1 -0
  338. package/dist/utils/poll.d.ts +15 -1
  339. package/dist/utils/poll.d.ts.map +1 -1
  340. package/dist/utils/poll.js +6 -3
  341. package/dist/utils/poll.js.map +1 -1
  342. package/dist/utils/register-agent-identity.d.ts +67 -0
  343. package/dist/utils/register-agent-identity.d.ts.map +1 -0
  344. package/dist/utils/register-agent-identity.js +34 -0
  345. package/dist/utils/register-agent-identity.js.map +1 -0
  346. package/dist/utils/review/did-web-key.d.ts +34 -0
  347. package/dist/utils/review/did-web-key.d.ts.map +1 -0
  348. package/dist/utils/review/did-web-key.js +104 -0
  349. package/dist/utils/review/did-web-key.js.map +1 -0
  350. package/dist/utils/review/load-registry.d.ts +33 -0
  351. package/dist/utils/review/load-registry.d.ts.map +1 -0
  352. package/dist/utils/review/load-registry.js +62 -0
  353. package/dist/utils/review/load-registry.js.map +1 -0
  354. package/dist/utils/review/verdict-verify.d.ts +43 -0
  355. package/dist/utils/review/verdict-verify.d.ts.map +1 -0
  356. package/dist/utils/review/verdict-verify.js +53 -0
  357. package/dist/utils/review/verdict-verify.js.map +1 -0
  358. package/dist/utils/review-registry-writer.d.ts +52 -0
  359. package/dist/utils/review-registry-writer.d.ts.map +1 -0
  360. package/dist/utils/review-registry-writer.js +79 -0
  361. package/dist/utils/review-registry-writer.js.map +1 -0
  362. package/dist/utils/should-install-dependency.d.ts +17 -0
  363. package/dist/utils/should-install-dependency.d.ts.map +1 -0
  364. package/dist/utils/should-install-dependency.js +25 -0
  365. package/dist/utils/should-install-dependency.js.map +1 -0
  366. package/dist/utils/tool-readiness.d.ts +57 -0
  367. package/dist/utils/tool-readiness.d.ts.map +1 -0
  368. package/dist/utils/tool-readiness.js +114 -0
  369. package/dist/utils/tool-readiness.js.map +1 -0
  370. package/dist/utils/which.d.ts +2 -0
  371. package/dist/utils/which.d.ts.map +1 -0
  372. package/dist/utils/which.js +22 -0
  373. package/dist/utils/which.js.map +1 -0
  374. package/dist/version.d.ts +15 -0
  375. package/dist/version.d.ts.map +1 -0
  376. package/dist/version.js +29 -0
  377. package/dist/version.js.map +1 -0
  378. package/package.json +19 -6
  379. package/dist/utils/claim-polling.d.ts +0 -21
  380. package/dist/utils/claim-polling.d.ts.map +0 -1
  381. package/dist/utils/claim-polling.js.map +0 -1
  382. package/dist/utils/dco/fs-safe.d.ts +0 -14
  383. package/dist/utils/dco/fs-safe.d.ts.map +0 -1
  384. package/dist/utils/dco/fs-safe.js +0 -20
  385. package/dist/utils/dco/fs-safe.js.map +0 -1
@@ -0,0 +1,150 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { theme, statusColor, severityColor } from "../theme.js";
4
+ import { Chips, Rule, SectionHeader, StatStrip, Table, Sparkline, } from "../components.js";
5
+ /**
6
+ * The newest timestamp in a set, computed rather than assumed.
7
+ *
8
+ * Both stat strips said "most recent activity" while reading row zero, which
9
+ * is only the newest row if a reader three files away happens to sort that
10
+ * way. It did not for tickets -- listTickets orders by created_at ascending,
11
+ * so row zero is the OLDEST ticket and the strip reported its update time as
12
+ * the latest activity. Filtering made it worse: row zero of a filtered set is
13
+ * arbitrary. Taking the max says what the label already claims.
14
+ *
15
+ * Compares the strings directly, which is sound only because every writer in
16
+ * db/ stamps `new Date(...).toISOString()`: fixed-width UTC, so lexical order
17
+ * is chronological order. A writer that stored a local-time or offset format
18
+ * would break this quietly, which is why the columns carry no SQL default.
19
+ */
20
+ export function mostRecent(rows, pick) {
21
+ let best;
22
+ for (const row of rows) {
23
+ const at = pick(row);
24
+ if (best === undefined || at > best)
25
+ best = at;
26
+ }
27
+ return best;
28
+ }
29
+ /** Relative time, the dashboard's "just now / 5m ago" idiom. */
30
+ export function ago(iso) {
31
+ const ms = Date.now() - new Date(iso).getTime();
32
+ if (!Number.isFinite(ms))
33
+ return "unknown";
34
+ const s = Math.floor(ms / 1000);
35
+ if (s < 45)
36
+ return "just now";
37
+ // Past the "just now" cutoff, never show 0m: 45-59s still floors to 0 here.
38
+ const m = Math.max(1, Math.floor(s / 60));
39
+ if (m < 60)
40
+ return `${m}m ago`;
41
+ const h = Math.floor(m / 60);
42
+ if (h < 24)
43
+ return `${h}h ago`;
44
+ return `${Math.floor(h / 24)}d ago`;
45
+ }
46
+ /**
47
+ * The state every Checkpoint-backed view shows until the read plane exists.
48
+ *
49
+ * Names the reason and the fix. "No data" would be a lie of omission: there is
50
+ * plenty of data, we simply have no route to it.
51
+ */
52
+ export function NotConnected({ what }) {
53
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: theme.dim, children: [what, " lives in Checkpoint."] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.dim, children: "This view needs the CLI read plane, which is not built yet. Nothing is" }) }), _jsx(Text, { color: theme.dim, children: "wrong with your setup and there is nothing to retry." }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.accent, children: "Tracked as CLI-P1 + CLI-P7 Workstream A." }) })] }));
54
+ }
55
+ // ── Ledger-backed views ───────────────────────────────────────────────
56
+ /**
57
+ * The ticket filters, as data.
58
+ *
59
+ * Declared here rather than inline so the chip row, the counts and the actual
60
+ * row filtering all read from one list. Split across three places, a new
61
+ * filter is three edits and the chip that silently filters nothing is the one
62
+ * you ship.
63
+ */
64
+ export const TICKET_FILTERS = [
65
+ { label: "All", match: () => true },
66
+ { label: "Open", match: (t) => t.status === "open" },
67
+ {
68
+ label: "In flight",
69
+ match: (t) => ["claimed", "in-progress", "in-review", "ready"].includes(t.status),
70
+ },
71
+ { label: "Blocked", match: (t) => t.status === "blocked" },
72
+ ];
73
+ export function TicketsView({ snap, width, filter = 0, }) {
74
+ const all = snap.tickets;
75
+ const active = TICKET_FILTERS[filter] ?? TICKET_FILTERS[0];
76
+ const t = all.filter(active.match);
77
+ const columns = [
78
+ { header: "Ticket", width: 22, render: (r) => r.title },
79
+ { header: "Status", width: 12, render: (r) => r.status, color: (r) => statusColor(r.status) },
80
+ { header: "Severity", width: 10, render: (r) => r.severity ?? "-", color: (r) => severityColor(r.severity) },
81
+ { header: "Claimed by", width: 24, render: (r) => r.claimed_by ?? "-" },
82
+ { header: "Updated", width: 10, render: (r) => ago(r.updated_at) },
83
+ ];
84
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginTop: 1, children: _jsx(Chips, { items: TICKET_FILTERS.map((f) => `${f.label} ${all.filter(f.match).length}`), activeIndex: filter }) }), _jsx(Rule, { width: width }), _jsx(StatStrip, { width: width,
85
+ // Derived from the SAME predicates the chips use, so the two cannot
86
+ // disagree. Hand-written totals did: the strip counted only claimed and
87
+ // in-progress as "in flight" while the chip of that name also matched
88
+ // in-review and ready, so one screen carried one label with two numbers.
89
+ // In a view whose whole argument is that every control carries its count,
90
+ // a count contradicting the control beside it is worse than none.
91
+ stats: TICKET_FILTERS.map((f) => ({
92
+ value: all.filter(f.match).length,
93
+ // "All" reads as the total here; the rest keep their own labels.
94
+ label: f.label === "All" ? "tickets" : f.label.toLowerCase(),
95
+ })), trailing: (() => {
96
+ const at = mostRecent(t, (r) => r.updated_at);
97
+ return at ? `updated ${ago(at)}` : undefined;
98
+ })() }), _jsx(Rule, { width: width }), _jsx(Box, { marginTop: 1, children: _jsx(Table, { width: width, columns: columns, rows: t, empty: all.length
99
+ ? `No ${active.label.toLowerCase()} tickets. Press f to change the filter.`
100
+ : "No tickets yet. They arrive by mirroring Linear." }) })] }));
101
+ }
102
+ export function DispatchesView({ snap, width }) {
103
+ const d = snap.dispatches;
104
+ const columns = [
105
+ { header: "Worker", width: 26, render: (r) => r.worker_did },
106
+ { header: "Repo", width: 20, render: (r) => r.repo ?? "-" },
107
+ { header: "PR", width: 6, render: (r) => (r.pr_number ? `#${r.pr_number}` : "-") },
108
+ { header: "Status", width: 12, render: (r) => r.status, color: (r) => statusColor(r.status) },
109
+ { header: "Started", width: 10, render: (r) => ago(r.dispatched_at) },
110
+ ];
111
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginTop: 1 }), _jsx(StatStrip, { width: width, stats: [
112
+ { value: d.length, label: "dispatches" },
113
+ { value: d.filter((x) => x.status === "in-progress").length, label: "running" },
114
+ { value: d.filter((x) => x.status === "failed").length, label: "failed" },
115
+ ] }), _jsx(Rule, { width: width }), _jsx(Box, { marginTop: 1, children: _jsx(Table, { width: width, columns: columns, rows: d, empty: "Nothing dispatched. Workers appear here once a ticket is staffed." }) })] }));
116
+ }
117
+ export function JournalView({ snap, width }) {
118
+ const j = snap.journal;
119
+ // Counts per event type, which is the aggregate the dashboard's chart carries.
120
+ const buckets = new Map();
121
+ for (const row of j)
122
+ buckets.set(row.event_type, (buckets.get(row.event_type) ?? 0) + 1);
123
+ const columns = [
124
+ { header: "Event", width: 24, render: (r) => r.event_type },
125
+ { header: "Agent", width: 22, render: (r) => r.agent_name ?? "-" },
126
+ { header: "Ticket", width: 14, render: (r) => r.ticket_id ?? "(none)" },
127
+ { header: "When", width: 10, render: (r) => ago(r.observed_at) },
128
+ ];
129
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginTop: 1 }), _jsx(StatStrip, { width: width, stats: [
130
+ { value: j.length, label: "observations" },
131
+ { value: buckets.size, label: "event types" },
132
+ { value: j.filter((r) => r.ticket_id === null).length, label: "uncorrelated" },
133
+ ], trailing: (() => {
134
+ const at = mostRecent(j, (r) => r.observed_at);
135
+ return at ? `last ${ago(at)}` : undefined;
136
+ })() }), _jsx(Rule, { width: width }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(SectionHeader, { title: "Observations over time", hint: "by event type", width: width }), _jsx(Sparkline, { values: [...buckets.values()] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Table, { width: width, columns: columns, rows: j.slice(0, 12), empty: "Nothing observed yet. The daemon writes here as hub events arrive." }) })] }));
137
+ }
138
+ export function ReviewView({ snap, width }) {
139
+ // Verdicts land here once the review loop is wired; until then this reads
140
+ // the review-shaped journal rows, which is honest about what exists.
141
+ const rows = snap.journal.filter((r) => /review|quorum|verdict/i.test(r.event_type));
142
+ const columns = [
143
+ { header: "Event", width: 22, render: (r) => r.event_type },
144
+ { header: "Reviewer", width: 26, render: (r) => r.agent_did ?? "-" },
145
+ { header: "Ticket", width: 14, render: (r) => r.ticket_id ?? "(none)" },
146
+ { header: "When", width: 10, render: (r) => ago(r.observed_at) },
147
+ ];
148
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Rule, { width: width }), _jsx(StatStrip, { width: width, stats: [{ value: rows.length, label: "review events" }], trailing: "approve/reject split lands with the verdict payload" }), _jsx(Rule, { width: width }), _jsx(Box, { marginTop: 1, children: _jsx(Table, { width: width, columns: columns, rows: rows, empty: "No review activity. Verdicts appear once the review loop is wired to the ledger." }) })] }));
149
+ }
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/views/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * View registry.
3
+ *
4
+ * The seam the frame depends on: it renders whatever is registered for the
5
+ * active nav id and knows nothing about where the data came from. Adding the
6
+ * Checkpoint-backed views later means adding entries here, not touching
7
+ * app.tsx.
8
+ *
9
+ * @module cli/tui/views/registry
10
+ */
11
+ import { type LedgerSnapshot, type ViewProps } from "./index.js";
12
+ export declare function buildViews(snap: LedgerSnapshot): Promise<Record<string, (p: ViewProps) => JSX.Element>>;
13
+ /**
14
+ * How many filter chips each view renders, keyed by nav id.
15
+ *
16
+ * Lives beside the registry because the same file already decides which
17
+ * component answers for which nav entry. A view absent here has one implicit
18
+ * "everything" filter, so `f` is a no-op rather than a key that appears to do
19
+ * something and does not.
20
+ */
21
+ export declare const FILTER_COUNTS: Record<string, number>;
22
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tui/views/registry.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAsDpB,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAyDxD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEhD,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * View registry.
3
+ *
4
+ * The seam the frame depends on: it renders whatever is registered for the
5
+ * active nav id and knows nothing about where the data came from. Adding the
6
+ * Checkpoint-backed views later means adding entries here, not touching
7
+ * app.tsx.
8
+ *
9
+ * @module cli/tui/views/registry
10
+ */
11
+ import React from "react";
12
+ import { TICKET_FILTERS } from "./index.js";
13
+ import { TicketsView, DispatchesView, JournalView, ReviewView, NotConnected, } from "./index.js";
14
+ import { AgentsView } from "./agents.js";
15
+ import { listProfiles } from "../../utils/agent-profiles.js";
16
+ import { readHubConfig } from "../../utils/hub-config.js";
17
+ import { dispatchToProfile } from "../../orchestrator/hub-dispatch.js";
18
+ // Generic module-existence probe, shared with init.ts's runtime-optional
19
+ // stage guards (P16/P17) -- the same "does this not-yet-landed module
20
+ // exist yet" question, here asked about review-loop P13's agent task/
21
+ // review run functions rather than an init stage.
22
+ import { moduleExists } from "../../utils/init/pipeline.js";
23
+ /**
24
+ * Builds the launchAgentFlow callback for the agents view IF review-loop
25
+ * P13's run functions are resolvable AND this view has a way to invoke
26
+ * them meaningfully -- else undefined (the view hides the action
27
+ * entirely rather than showing a dead key). P13 landed with real
28
+ * `agentTask`/`agentReview` functions, but both need a description or PR
29
+ * URL argument this view has no input step to collect (the dispatch
30
+ * action's text-entry submode has no launch counterpart yet), and firing
31
+ * either with an empty string is a real risk now that the module is
32
+ * genuinely reachable, not a placeholder: `launchAgentFlow` is called
33
+ * fire-and-forget from AgentsView (never awaited), so an unhandled
34
+ * rejection from a validation error would surface as an unhandled
35
+ * promise rejection instead of a rendered message. Staying undefined
36
+ * until a follow-up PR adds that input step is the safe default; the
37
+ * probe below still activates the moment both are wired.
38
+ */
39
+ async function resolveLaunchAgentFlow() {
40
+ const specifier = "../../commands/agent.js";
41
+ if (!(await moduleExists(specifier, import.meta.url)))
42
+ return undefined;
43
+ const mod = (await import(specifier));
44
+ if (!mod.agentTask && !mod.agentReview)
45
+ return undefined;
46
+ // Confirmed callable, but no description/prUrl input step exists in
47
+ // this view yet -- see the module doc above. Kept hidden rather than
48
+ // wired to an empty-string call.
49
+ return undefined;
50
+ }
51
+ export async function buildViews(snap) {
52
+ const checkpoint = (what) => () => React.createElement(NotConnected, { what });
53
+ /**
54
+ * Bind a ledger view to the snapshot, forwarding EVERY frame prop.
55
+ *
56
+ * Each wrapper used to name the props it passed on, which meant adding one
57
+ * to ViewProps silently dropped it at all four call sites: `filter` reached
58
+ * the wrapper and stopped there, so pressing f moved keymap state and help
59
+ * copy while the table never changed. Spreading makes the next added prop
60
+ * arrive on its own, and makes the drop impossible rather than merely fixed.
61
+ */
62
+ const ledger = (View) => (p) => React.createElement(View, { ...p, snap });
63
+ // Real, local, synchronous (agent-profiles.ts and hub-config.ts are both
64
+ // plain fs reads) -- read once per TUI launch, same freshness contract
65
+ // as the ledger snapshot every other view here already has.
66
+ const profiles = listProfiles();
67
+ const hubConfig = readHubConfig();
68
+ const launchAgentFlow = await resolveLaunchAgentFlow();
69
+ return {
70
+ // Real data, today.
71
+ "orc.tickets": ledger(TicketsView),
72
+ "orc.dispatches": ledger(DispatchesView),
73
+ "orc.journal": ledger(JournalView),
74
+ "orc.review": ledger(ReviewView),
75
+ agents: (p) => React.createElement(AgentsView, {
76
+ ...p,
77
+ profiles,
78
+ dispatches: snap.dispatches,
79
+ journal: snap.journal,
80
+ hubConnected: hubConfig !== undefined,
81
+ launchAgentFlow,
82
+ // Absent (not merely a no-op function) when there is no hub to
83
+ // dispatch through -- AgentsView hides the whole action on
84
+ // `dispatchTask === undefined`, which is what "the action is
85
+ // absent when ~/.mcpi/hub.json is absent" means concretely.
86
+ dispatchTask: hubConfig ? dispatchToProfile : undefined,
87
+ }),
88
+ // Ported V2 routes. The layout is here; the read plane is not.
89
+ monitor: checkpoint("Live agent activity"),
90
+ "monitor.access": checkpoint("Access control"),
91
+ analyze: checkpoint("Analytics"),
92
+ "agents.marketplace": checkpoint("The agent marketplace"),
93
+ projects: checkpoint("Projects"),
94
+ settings: checkpoint("Settings"),
95
+ "settings.keys": checkpoint("API keys"),
96
+ "settings.docs": checkpoint("Documentation"),
97
+ };
98
+ }
99
+ /**
100
+ * How many filter chips each view renders, keyed by nav id.
101
+ *
102
+ * Lives beside the registry because the same file already decides which
103
+ * component answers for which nav entry. A view absent here has one implicit
104
+ * "everything" filter, so `f` is a no-op rather than a key that appears to do
105
+ * something and does not.
106
+ */
107
+ export const FILTER_COUNTS = {
108
+ "orc.tickets": TICKET_FILTERS.length,
109
+ };
110
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tui/views/registry.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Retry-with-backoff for GitHub API calls made through `gh` from the
3
+ * `--watch` polling loops (`agent task --watch`, `agent review --watch`).
4
+ * Mirrors `commands/score.ts`'s `submitWithRetry` formula
5
+ * (`min(cap, base * 2^attempt)`) generalized to any `gh`-shelling call
6
+ * rather than one specific HTTP submission, and narrowed to rate-limit
7
+ * signals only — never retrying a genuine auth/scope/not-found failure,
8
+ * which a retry would just repeat identically.
9
+ */
10
+ export interface BackoffOptions {
11
+ maxRetries?: number;
12
+ baseDelayMs?: number;
13
+ capDelayMs?: number;
14
+ /** Injectable so tests never actually sleep. */
15
+ sleepImpl?: (ms: number) => Promise<void>;
16
+ }
17
+ /**
18
+ * Same narrow-match discipline as `github.ts`'s `isScopeError`: only the
19
+ * explicit HTTP 403/429 rate-limit shape counts, never a bare error message
20
+ * that happens to mention neither — a genuine auth failure or 404 must
21
+ * propagate on the first attempt, not get retried into a slower identical
22
+ * failure.
23
+ */
24
+ export declare function isRateLimitedError(error: unknown): boolean;
25
+ /**
26
+ * Run `fn`, retrying on a detected rate-limit failure with exponential
27
+ * backoff up to `maxRetries` additional attempts. Any other failure, or
28
+ * exhausting the retries, rethrows the last error untouched.
29
+ */
30
+ export declare function withGithubBackoff<T>(fn: () => Promise<T>, options?: BackoffOptions): Promise<T>;
31
+ //# sourceMappingURL=backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../../src/utils/agent/backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI1D;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,CAmBzG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Retry-with-backoff for GitHub API calls made through `gh` from the
3
+ * `--watch` polling loops (`agent task --watch`, `agent review --watch`).
4
+ * Mirrors `commands/score.ts`'s `submitWithRetry` formula
5
+ * (`min(cap, base * 2^attempt)`) generalized to any `gh`-shelling call
6
+ * rather than one specific HTTP submission, and narrowed to rate-limit
7
+ * signals only — never retrying a genuine auth/scope/not-found failure,
8
+ * which a retry would just repeat identically.
9
+ */
10
+ const DEFAULT_MAX_RETRIES = 3;
11
+ const DEFAULT_BASE_DELAY_MS = 250;
12
+ const DEFAULT_CAP_DELAY_MS = 2000;
13
+ const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
14
+ /**
15
+ * Same narrow-match discipline as `github.ts`'s `isScopeError`: only the
16
+ * explicit HTTP 403/429 rate-limit shape counts, never a bare error message
17
+ * that happens to mention neither — a genuine auth failure or 404 must
18
+ * propagate on the first attempt, not get retried into a slower identical
19
+ * failure.
20
+ */
21
+ export function isRateLimitedError(error) {
22
+ const err = error;
23
+ const message = `${err?.stderr ?? ""} ${err?.message ?? ""}`;
24
+ return /HTTP 403|HTTP 429/.test(message) || /rate limit/i.test(message);
25
+ }
26
+ /**
27
+ * Run `fn`, retrying on a detected rate-limit failure with exponential
28
+ * backoff up to `maxRetries` additional attempts. Any other failure, or
29
+ * exhausting the retries, rethrows the last error untouched.
30
+ */
31
+ export async function withGithubBackoff(fn, options = {}) {
32
+ const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
33
+ const baseDelayMs = options.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
34
+ const capDelayMs = options.capDelayMs ?? DEFAULT_CAP_DELAY_MS;
35
+ const sleep = options.sleepImpl ?? defaultSleep;
36
+ let attempt = 0;
37
+ for (;;) {
38
+ try {
39
+ return await fn();
40
+ }
41
+ catch (error) {
42
+ if (!isRateLimitedError(error) || attempt >= maxRetries) {
43
+ throw error;
44
+ }
45
+ const delayMs = Math.min(capDelayMs, baseDelayMs * 2 ** attempt);
46
+ attempt += 1;
47
+ await sleep(delayMs);
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../../src/utils/agent/backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAUlC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEtG;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,GAAG,GAAG,KAA8C,CAAC;IAC3D,MAAM,OAAO,GAAG,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;IAC7D,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAI,EAAoB,EAAE,UAA0B,EAAE;IAC3F,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qBAAqB,CAAC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,oBAAoB,CAAC;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,IAAI,YAAY,CAAC;IAEhD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBACxD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC,CAAC;YACb,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { type FixAttestation, type ReviewVerdictBody } from "@kya-os/contracts/review";
2
+ /**
3
+ * Marker-based idempotency for `kya-os agent review`'s posted verdicts,
4
+ * following review-loop P9's exact scheme: an HTML-comment marker naming
5
+ * `(repo, pr, head, reviewer)` so a replay (the `--watch` loop re-polling
6
+ * after its own post, or a re-run after a crash) can find its own prior
7
+ * post and skip rather than posting the same verdict for the same head
8
+ * twice. Mirrors `dco fix.ts`'s `buildFixAttestationCommentBody` /
9
+ * `sanitizeForMarkdownBlock` idiom for the same reason that file's doc
10
+ * comment gives: the marker and human summary render as live markdown, so
11
+ * a backtick/`-->`/`<!--` in a free-text field (here, `reviewerDid`; there,
12
+ * `agentName`/`agentDid`) must never be able to break out of the marker or
13
+ * prematurely close/open the surrounding HTML comment. The fenced JSON
14
+ * block itself is never sanitized — it is the actual signed data, and
15
+ * sanitizing it would make it not round-trip.
16
+ */
17
+ export interface VerdictMarker {
18
+ repo: string;
19
+ prNumber: number;
20
+ headSha: string;
21
+ reviewerDid: string;
22
+ }
23
+ export declare function buildVerdictMarker(marker: VerdictMarker): string;
24
+ /** Parse the first `kya-os-verdict:v1` marker out of a review/comment body, if present. */
25
+ export declare function findVerdictMarker(body: string): VerdictMarker | null;
26
+ /**
27
+ * Whether any of `bodies` already carries a marker for the exact same
28
+ * `(repo, pr, head, reviewer)` — the idempotency check `kya-os agent
29
+ * review` runs before posting a new verdict for a head it may have already
30
+ * reviewed (e.g. the hub/PR replaying events to a reconnecting consumer, or
31
+ * a `--watch` loop's own poll tick landing right after its own post).
32
+ */
33
+ export declare function hasVerdictMarker(bodies: readonly string[], target: VerdictMarker): boolean;
34
+ /**
35
+ * Find the `ReviewVerdictBody` actually posted AND cryptographically
36
+ * verified for `target`'s `(repo, pr, head, reviewer)`, if any. Used on an
37
+ * idempotent skip to recover the TRUE prior verdict instead of trusting a
38
+ * freshly recomputed one: the review-analysis pass is LLM-driven and can be
39
+ * non-deterministic, so re-running it against an already-reviewed head can
40
+ * produce a different verdict than what is actually signed and posted on
41
+ * the PR. A caller that returned the recompute instead (e.g. treating a
42
+ * recomputed "approve" as equivalent to a truly-posted one) could report
43
+ * success without a real approve ever having landed.
44
+ *
45
+ * `publicKeyRaw` MUST be this reviewer's own Ed25519 public key -- the only
46
+ * key a genuine prior post from this same `reviewerDid` could have signed
47
+ * with. This is not optional: the marker is free text and a fenced block's
48
+ * shape is Zod-checked only, so without a signature check anyone who can
49
+ * post a `COMMENT` review could plant a matching marker plus a schema-valid
50
+ * but unsigned "approve" block and have it trusted as a real prior post. The
51
+ * search keeps scanning past a marker match whose block is missing, corrupt,
52
+ * or fails verification, rather than stopping at the first one found --
53
+ * a forged comment must never be able to shadow a real, later, genuinely
54
+ * signed post. Returns `null` (never a partial/unverified value) when no
55
+ * candidate verifies, so a caller can tell "nothing genuine was posted" from
56
+ * "something was posted"; treating null the same as "not yet posted" (i.e.
57
+ * proceeding to post a real verdict) is the correct, fail-safe response to
58
+ * either a missing OR a forged prior post.
59
+ */
60
+ export declare function findPostedVerdict(bodies: readonly string[], target: VerdictMarker, publicKeyRaw: Buffer | Uint8Array): ReviewVerdictBody | null;
61
+ /**
62
+ * Build the review body posted for a signed verdict: the idempotency
63
+ * marker, a human-readable findings section, then the fenced
64
+ * `kya-os-signed-verdict` JSON block `kya-os agent verify` reads back.
65
+ * `findingsSummary` is caller-built (severity/path:line/summary lines) so
66
+ * this function stays about structure, not findings formatting.
67
+ */
68
+ export declare function buildVerdictReviewBody(verdict: ReviewVerdictBody, reviewerDid: string, findingsSummary: string): string;
69
+ export interface FencedBlock {
70
+ /** Raw text between the fences, before JSON.parse. */
71
+ raw: string;
72
+ /** Parsed JSON value, or absent when `raw` wasn't valid JSON. */
73
+ parsed?: unknown;
74
+ }
75
+ /**
76
+ * Extract every ` ```<tag> ... ``` ` fenced block from `body`, JSON-parsing
77
+ * each one. A block whose contents don't parse is still returned (with
78
+ * `parsed` absent) rather than silently dropped: `kya-os agent verify`
79
+ * needs to report "found but INVALID: schema" for a corrupted block, not
80
+ * make it disappear as if it were never posted.
81
+ */
82
+ export declare function extractFencedBlocks(body: string, tag: string): FencedBlock[];
83
+ /** Every `kya-os-signed-verdict` block in `body` that parses AND validates against the schema. */
84
+ export declare function extractSignedVerdicts(body: string): ReviewVerdictBody[];
85
+ /** Every `kya-os-fix-attestation` block in `body` that parses AND validates against the schema. */
86
+ export declare function extractFixAttestations(body: string): FixAttestation[];
87
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../../src/utils/agent/markers.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AAIlC;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAcD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAGhE;AAED,2FAA2F;AAC3F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAIpE;AAYD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAG1F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,GAAG,UAAU,GAChC,iBAAiB,GAAG,IAAI,CAe1B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CASvH;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAa5E;AAED,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAQvE;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAQrE"}