@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,550 @@
1
+ import { lookup as dnsLookup } from "node:dns/promises";
2
+ import { isValidDid } from "./claude-config.js";
3
+ /**
4
+ * Exported (review-loop P9 commit 3) so `review verify`'s did:web
5
+ * resolution (`../review/did-web-key.ts`) can pass the real resolver
6
+ * through to {@link checkDocumentHostIsSafe} without redefining it — same
7
+ * reasoning as that export.
8
+ */
9
+ export const defaultLookup = async (hostname) => {
10
+ const records = await dnsLookup(hostname, { all: true });
11
+ return records.map((record) => record.address);
12
+ };
13
+ /**
14
+ * The document host is chosen by the DID, which comes from a PR body we do
15
+ * not control. Without a deadline a hostile or merely unreachable host hangs
16
+ * the command for as long as it cares to hold the socket open — tolerable
17
+ * when a human can interrupt it, not when this runs unattended in CI.
18
+ */
19
+ export const RESOLVE_TIMEOUT_MS = 10000;
20
+ /**
21
+ * Captures the whole remainder of the line, not the first whitespace-free
22
+ * run. Truncating at whitespace would silently reduce a malformed value to
23
+ * whichever prefix happens to parse: `Agent DID: did:web:knowthat.ai junk`
24
+ * would become `did:web:knowthat.ai`, resolve the registry's own root
25
+ * document, match its own `id`, and report a forged line as verified.
26
+ */
27
+ const AGENT_DID_LINE = /Agent DID:[^\S\n\r]*([^\n\r]*)/g;
28
+ /**
29
+ * Pull the claimed DID out of a PR body.
30
+ *
31
+ * Returns null when the body claims two *different* DIDs. Taking the first
32
+ * match would mean an appended line could never change the verdict, but it
33
+ * would also mean a forged line prepended above the real one silently wins.
34
+ * Ambiguous attribution is a failure, not a tie to be broken.
35
+ */
36
+ export function extractAgentDid(prBody) {
37
+ const claimed = new Set();
38
+ for (const match of prBody.matchAll(AGENT_DID_LINE)) {
39
+ // The managed block wraps the line in a code span, so a trailing
40
+ // backtick is expected punctuation rather than part of the identifier.
41
+ const candidate = match[1].replace(/`+\s*$/, "").trim();
42
+ if (isValidDid(candidate)) {
43
+ claimed.add(candidate);
44
+ }
45
+ }
46
+ if (claimed.size !== 1)
47
+ return null;
48
+ return [...claimed][0];
49
+ }
50
+ /**
51
+ * Whether a piece of text already carries an `Agent DID:` attribution line
52
+ * that `extractAgentDid` would pick up. Uses the exact same line pattern and
53
+ * backtick/whitespace handling, so a caller (notably `dco dispatch`, which
54
+ * appends its own authoritative line) can reject a description that would
55
+ * otherwise put a second, conflicting DID into the PR body. Matches the
56
+ * managed CLAUDE.md block's backticked, mid-line form, not just a line-start
57
+ * one.
58
+ */
59
+ export function hasAgentDidClaim(text) {
60
+ for (const match of text.matchAll(AGENT_DID_LINE)) {
61
+ const candidate = match[1].replace(/`+\s*$/, "").trim();
62
+ if (isValidDid(candidate)) {
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ /**
69
+ * Map a `did:web` to the HTTPS URL its document must be served from, per the
70
+ * did:web method spec: the identifier's colon-separated segments *are* the
71
+ * path, and a bare domain resolves under `/.well-known/`.
72
+ *
73
+ * Segments are validated AFTER percent-decoding. `DID_PATTERN` permits `%`,
74
+ * so a crafted `%2F` would otherwise smuggle a path separator through and
75
+ * point resolution at an attacker-chosen URL on the same host.
76
+ */
77
+ export function didWebToHttpsUrl(did) {
78
+ const prefix = "did:web:";
79
+ if (!did.startsWith(prefix))
80
+ return null;
81
+ const segments = did.slice(prefix.length).split(":");
82
+ if (segments.length === 0 || segments.some((segment) => segment === "")) {
83
+ return null;
84
+ }
85
+ const decoded = [];
86
+ for (const segment of segments) {
87
+ try {
88
+ decoded.push(decodeURIComponent(segment));
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ const [host, ...path] = decoded;
95
+ // Host may carry a port (encoded as %3A in the DID) but nothing else.
96
+ if (!/^[A-Za-z0-9.-]+(:\d+)?$/.test(host))
97
+ return null;
98
+ if (path.some((segment) => segment === "" ||
99
+ segment === "." ||
100
+ segment === ".." ||
101
+ /[/\\?#]/.test(segment))) {
102
+ return null;
103
+ }
104
+ const suffix = path.length
105
+ ? `${path.join("/")}/did.json`
106
+ : ".well-known/did.json";
107
+ return `https://${host}/${suffix}`;
108
+ }
109
+ /**
110
+ * IPv4 ranges that must never be treated as a resolvable did:web host:
111
+ * loopback, all three RFC1918 private blocks, link-local (which is also
112
+ * where every major cloud's instance-metadata service lives, at
113
+ * 169.254.169.254), and the remaining reserved/special-use blocks that have
114
+ * no business serving a public DID document.
115
+ */
116
+ const BLOCKED_IPV4_RANGES = [
117
+ ["0.0.0.0", 8], // "this network"
118
+ ["10.0.0.0", 8], // RFC1918 private
119
+ ["100.64.0.0", 10], // shared address space (CGNAT)
120
+ ["127.0.0.0", 8], // loopback
121
+ ["169.254.0.0", 16], // link-local, incl. cloud metadata (169.254.169.254)
122
+ ["172.16.0.0", 12], // RFC1918 private
123
+ ["192.0.0.0", 24], // IETF protocol assignments
124
+ ["192.0.2.0", 24], // documentation (TEST-NET-1)
125
+ ["192.168.0.0", 16], // RFC1918 private
126
+ ["198.18.0.0", 15], // benchmarking
127
+ ["198.51.100.0", 24], // documentation (TEST-NET-2)
128
+ ["203.0.113.0", 24], // documentation (TEST-NET-3)
129
+ ["224.0.0.0", 4], // multicast
130
+ ["240.0.0.0", 4], // reserved, incl. the 255.255.255.255 broadcast address
131
+ ];
132
+ function ipv4ToInt(ip) {
133
+ const match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(ip);
134
+ if (!match)
135
+ return null;
136
+ const octets = match.slice(1, 5).map(Number);
137
+ if (octets.some((octet) => octet > 255))
138
+ return null;
139
+ return (((octets[0] << 24) | (octets[1] << 16) | (octets[2] << 8) | octets[3]) >>>
140
+ 0);
141
+ }
142
+ function isBlockedIpv4(ip) {
143
+ const value = ipv4ToInt(ip);
144
+ if (value === null)
145
+ return false;
146
+ return BLOCKED_IPV4_RANGES.some(([base, prefix]) => {
147
+ const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;
148
+ return (value & mask) === (ipv4ToInt(base) & mask);
149
+ });
150
+ }
151
+ /**
152
+ * The IPv6 counterparts of the ranges above: loopback, unspecified,
153
+ * link-local (`fe80::/10`), and unique-local (`fc00::/7`, the IPv6 analogue
154
+ * of RFC1918). A resolver can hand back either family, so an address that
155
+ * only checked IPv4 would wave an AAAA-only loopback/private record through.
156
+ */
157
+ function isBlockedIpv6(ip) {
158
+ const lower = ip.toLowerCase();
159
+ // A v4-mapped/v4-compatible address ends in a dotted IPv4 literal (e.g.
160
+ // "::ffff:127.0.0.1") — defer to the IPv4 check on that embedded address.
161
+ const tail = lower.slice(lower.lastIndexOf(":") + 1);
162
+ if (tail.includes(".") && isBlockedIpv4(tail))
163
+ return true;
164
+ if (lower === "::1" || lower === "::")
165
+ return true;
166
+ const firstGroup = lower.split(":")[0];
167
+ const firstHextet = firstGroup === "" ? NaN : parseInt(firstGroup, 16);
168
+ if (Number.isNaN(firstHextet))
169
+ return false;
170
+ if (firstHextet >= 0xfe80 && firstHextet <= 0xfebf)
171
+ return true; // link-local
172
+ if (firstHextet >= 0xfc00 && firstHextet <= 0xfdff)
173
+ return true; // unique-local
174
+ return false;
175
+ }
176
+ function isBlockedAddress(ip) {
177
+ return ip.includes(":") ? isBlockedIpv6(ip) : isBlockedIpv4(ip);
178
+ }
179
+ /**
180
+ * Cheap, synchronous first line of defense against the exact literals an
181
+ * attacker would put directly in a did:web host: `localhost`, or an IPv4
182
+ * literal in a private, loopback, link-local, or otherwise reserved range.
183
+ *
184
+ * Takes the hostname `new URL()` produces, not the raw did:web segment.
185
+ * `URL` canonicalizes decimal/hex/octal IPv4 shorthand (`2130706433` and
186
+ * `0x7f000001` both become `127.0.0.1`) before `fetch` ever sees it, so
187
+ * checking the pre-parse segment would miss exactly the encodings an
188
+ * attacker would reach for to slip past a naive dotted-quad check. The
189
+ * trailing dot is stripped first for the same reason: `new URL()` preserves
190
+ * a root-zone dot (`"localhost."` stays `"localhost."`), and DNS treats it
191
+ * as identical to `"localhost"` — an unstripped compare would let that
192
+ * single character walk straight past an exact-match or `endsWith` check.
193
+ *
194
+ * This is a fast-path, not the actual guarantee: it only catches literals,
195
+ * so it cannot see a normal-looking hostname whose A/AAAA record happens to
196
+ * point at an internal address. `hostResolvesToBlockedAddress` below is
197
+ * what actually closes that gap, by checking where the name resolves to
198
+ * rather than how it's spelled.
199
+ */
200
+ export function isBlockedResolutionHost(hostname) {
201
+ const lower = hostname.toLowerCase().replace(/\.$/, "");
202
+ if (lower === "localhost" || lower.endsWith(".localhost"))
203
+ return true;
204
+ return isBlockedAddress(lower);
205
+ }
206
+ /**
207
+ * The actual guarantee `isBlockedResolutionHost` can't provide on its own:
208
+ * resolve the hostname and check every address it answers to, not just
209
+ * whether the hostname string itself looks like one of the blocked
210
+ * literals. A domain an attacker controls can point an A/AAAA record at
211
+ * 169.254.169.254 (or loopback, or an RFC1918 address) just as easily as a
212
+ * did:web host can spell the address out directly — DNS is the attacker's
213
+ * to shape here just as much as the PR body text is, since the DID names
214
+ * whatever host they choose.
215
+ *
216
+ * Deliberately does not catch a lookup failure: that is "no evidence
217
+ * either way", the same as a failed fetch, and the caller already has a
218
+ * reason for that (`unresolvable`) that this must not collide with —
219
+ * mislabeling a plain NXDOMAIN as "blocked-host" would tell the CLI's user
220
+ * they hit a private address when they actually just mistyped a domain.
221
+ */
222
+ export async function hostResolvesToBlockedAddress(hostname, lookupImpl = defaultLookup) {
223
+ const addresses = await lookupImpl(hostname);
224
+ return addresses.some(isBlockedAddress);
225
+ }
226
+ /**
227
+ * Everything that has to be true about `documentUrl`'s host before it is
228
+ * worth spending a request on: it must parse, it must not be one of the
229
+ * literals `isBlockedResolutionHost` recognizes, and it must not resolve to
230
+ * one either. Pulled out on its own so `verifyPrAttribution` reads as one
231
+ * linear pipeline instead of three nested guard clauses doing the same kind
232
+ * of check.
233
+ *
234
+ * Exported (review-loop P9 commit 3): `review verify`'s did:web resolution
235
+ * fetches a DIFFERENT document (an agent's DID document, not a PR-body
236
+ * claim) from an equally untrusted, wire-supplied host, and needs the exact
237
+ * same SSRF defense before spending a request on it. Reusing this function
238
+ * keeps that defense in ONE place rather than re-deriving the blocked-range
239
+ * checks a second time.
240
+ */
241
+ export async function checkDocumentHostIsSafe(documentUrl, lookupImpl) {
242
+ let hostname;
243
+ try {
244
+ hostname = new URL(documentUrl).hostname;
245
+ }
246
+ catch {
247
+ return {
248
+ safe: false,
249
+ reason: "unresolvable",
250
+ detail: "The resolved document URL was invalid.",
251
+ };
252
+ }
253
+ if (isBlockedResolutionHost(hostname)) {
254
+ return {
255
+ safe: false,
256
+ reason: "blocked-host",
257
+ detail: "Refusing to resolve a private, loopback, link-local, or metadata address.",
258
+ };
259
+ }
260
+ let blocked;
261
+ try {
262
+ blocked = await hostResolvesToBlockedAddress(hostname, lookupImpl);
263
+ }
264
+ catch (error) {
265
+ // Same reasoning as a failed fetch: no evidence either way, so no pass.
266
+ return {
267
+ safe: false,
268
+ reason: "unresolvable",
269
+ detail: error instanceof Error ? error.message : String(error),
270
+ };
271
+ }
272
+ if (blocked) {
273
+ return {
274
+ safe: false,
275
+ reason: "blocked-host",
276
+ detail: "The claimed DID resolves to a private, loopback, link-local, or metadata address.",
277
+ };
278
+ }
279
+ return { safe: true };
280
+ }
281
+ function readServiceEndpoint(document) {
282
+ if (typeof document !== "object" || document === null)
283
+ return undefined;
284
+ const service = document.service;
285
+ if (!Array.isArray(service))
286
+ return undefined;
287
+ for (const entry of service) {
288
+ if (typeof entry !== "object" || entry === null)
289
+ continue;
290
+ const endpoint = entry.serviceEndpoint;
291
+ if (typeof endpoint === "string" && endpoint.length > 0)
292
+ return endpoint;
293
+ }
294
+ return undefined;
295
+ }
296
+ /**
297
+ * Fetch and identity-check a did:web document: map the DID to its HTTPS
298
+ * document URL, refuse an unsafe host (SSRF guard — see
299
+ * `checkDocumentHostIsSafe`'s own doc comment), fetch it without following
300
+ * redirects, and confirm the resolved document's `id` actually matches the
301
+ * DID being resolved. Shared by `verifyPrAttribution` (which only needs the
302
+ * identity check) and `resolveAgentEd25519PublicKey` (which additionally
303
+ * needs a key out of the same document) so the two never drift on what
304
+ * "resolves" means — a document that passes this step for one must pass it
305
+ * for the other too.
306
+ */
307
+ async function resolveDidWebDocument(did, fetchImpl, lookupImpl) {
308
+ const documentUrl = didWebToHttpsUrl(did);
309
+ if (!documentUrl) {
310
+ return {
311
+ ok: false,
312
+ reason: "unsupported-method",
313
+ detail: "Only did:web identities can be resolved over HTTPS.",
314
+ };
315
+ }
316
+ // The document host came from untrusted input (a PR body, or a reviewer
317
+ // DID read off a PR review — either way, not ours to control), so it is
318
+ // checked — both how it's spelled and where it actually resolves — before
319
+ // we ever make a request to it. Skipping this would let an IP literal, or
320
+ // a normal-looking domain with an A/AAAA record pointing at one, reach a
321
+ // loopback, private, link-local, or cloud-metadata address — an SSRF that
322
+ // hostile input can trigger unattended in CI.
323
+ const hostCheck = await checkDocumentHostIsSafe(documentUrl, lookupImpl);
324
+ if (!hostCheck.safe) {
325
+ return { ok: false, documentUrl, reason: hostCheck.reason, detail: hostCheck.detail };
326
+ }
327
+ let response;
328
+ try {
329
+ response = await fetchImpl(documentUrl, {
330
+ signal: AbortSignal.timeout(RESOLVE_TIMEOUT_MS),
331
+ // A redirect target is unverified: it could bounce to an internal
332
+ // address the check above never saw. Refusing to follow it, rather
333
+ // than trusting `fetch`'s default of following automatically, keeps
334
+ // this host check from being bypassable by a 3xx response.
335
+ redirect: "manual",
336
+ });
337
+ }
338
+ catch (error) {
339
+ // A transport failure is indistinguishable from a missing document as far
340
+ // as trust goes: neither produced evidence, so neither may pass.
341
+ return {
342
+ ok: false,
343
+ documentUrl,
344
+ reason: "unresolvable",
345
+ detail: error instanceof Error ? error.message : String(error),
346
+ };
347
+ }
348
+ if (!response.ok) {
349
+ return {
350
+ ok: false,
351
+ documentUrl,
352
+ reason: "unresolvable",
353
+ detail: response.type === "opaqueredirect"
354
+ ? "Server returned a redirect, which is not followed."
355
+ : `HTTP ${response.status}`,
356
+ };
357
+ }
358
+ let document;
359
+ try {
360
+ document = await response.json();
361
+ }
362
+ catch {
363
+ return {
364
+ ok: false,
365
+ documentUrl,
366
+ reason: "unresolvable",
367
+ detail: "Response was not valid JSON.",
368
+ };
369
+ }
370
+ const resolvedId = typeof document === "object" && document !== null
371
+ ? document.id
372
+ : undefined;
373
+ // A document that resolves but names a different subject proves nothing
374
+ // about the claimed identity.
375
+ if (resolvedId !== did) {
376
+ return {
377
+ ok: false,
378
+ documentUrl,
379
+ reason: "did-mismatch",
380
+ detail: `Document describes ${typeof resolvedId === "string" ? resolvedId : "no DID"}.`,
381
+ };
382
+ }
383
+ return { ok: true, document, documentUrl };
384
+ }
385
+ /**
386
+ * Resolve the DID claimed by a PR body and confirm the document describes
387
+ * that same DID.
388
+ */
389
+ export async function verifyPrAttribution(prBody, fetchImpl = (url, init) => fetch(url, init), lookupImpl = defaultLookup) {
390
+ const did = extractAgentDid(prBody);
391
+ if (!did)
392
+ return { ok: false, reason: "no-did" };
393
+ const resolved = await resolveDidWebDocument(did, fetchImpl, lookupImpl);
394
+ if (!resolved.ok) {
395
+ return {
396
+ ok: false,
397
+ did,
398
+ documentUrl: resolved.documentUrl,
399
+ reason: resolved.reason,
400
+ detail: resolved.detail,
401
+ };
402
+ }
403
+ return {
404
+ ok: true,
405
+ did,
406
+ documentUrl: resolved.documentUrl,
407
+ agentUrl: readServiceEndpoint(resolved.document),
408
+ };
409
+ }
410
+ /**
411
+ * Extract the first Ed25519 (OKP) public JWK's raw 32-byte key out of a DID
412
+ * document's `verificationMethod` array. Mirrors
413
+ * `packages/compute/src/didcomm/did-web.ts`'s `extractEd25519Jwk` (that
414
+ * module lives in `@kya-os/compute`, which the CLI must never import — see
415
+ * this feature's design doc — so the extraction logic is duplicated here
416
+ * rather than shared, not delegated).
417
+ */
418
+ // Bitcoin/base58btc alphabet, matching `@kya-os/mcp-i-core`'s `base58.ts` and
419
+ // `did-key-resolver.ts` byte for byte (reimplemented here, not imported: the
420
+ // CLI has no dependency on that package, and this decode is small enough
421
+ // that a second copy is cheaper than a new cross-package dependency for it —
422
+ // the same tradeoff this ecosystem already makes broadly, see the crypto
423
+ // utility inventory referenced in this repo's own audit notes).
424
+ const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
425
+ const BASE58_ALPHABET_MAP = new Map([...BASE58_ALPHABET].map((char, index) => [char, index]));
426
+ /** Decode a base58 (Bitcoin alphabet) string to bytes. Throws on an invalid character. */
427
+ function base58Decode(encoded) {
428
+ let num = 0n;
429
+ for (const char of encoded) {
430
+ const value = BASE58_ALPHABET_MAP.get(char);
431
+ if (value === undefined) {
432
+ throw new Error(`Invalid base58 character: ${char}`);
433
+ }
434
+ num = num * 58n + BigInt(value);
435
+ }
436
+ const bytes = [];
437
+ while (num > 0n) {
438
+ bytes.unshift(Number(num % 256n));
439
+ num /= 256n;
440
+ }
441
+ let leadingZeros = 0;
442
+ for (const char of encoded) {
443
+ if (char !== "1")
444
+ break;
445
+ leadingZeros++;
446
+ }
447
+ return Buffer.concat([Buffer.alloc(leadingZeros), Buffer.from(bytes)]);
448
+ }
449
+ /** The 2-byte varint multicodec prefix for an Ed25519 public key (0xed, 0x01). */
450
+ const ED25519_MULTICODEC_PREFIX = Buffer.from([0xed, 0x01]);
451
+ /**
452
+ * Decode a `publicKeyMultibase` value (the did:key-style encoding:
453
+ * multibase `z` prefix for base58btc, wrapping the Ed25519 multicodec
454
+ * prefix followed by the raw 32-byte key) to the raw key. Returns null on
455
+ * any malformed input — unsupported multibase prefix, invalid base58, or a
456
+ * multicodec prefix that isn't Ed25519's — rather than throwing.
457
+ */
458
+ function decodeEd25519PublicKeyMultibase(value) {
459
+ if (!value.startsWith("z"))
460
+ return null; // only base58btc is supported
461
+ let decoded;
462
+ try {
463
+ decoded = base58Decode(value.slice(1));
464
+ }
465
+ catch {
466
+ return null;
467
+ }
468
+ if (decoded.length !== ED25519_MULTICODEC_PREFIX.length + 32 ||
469
+ !decoded.subarray(0, 2).equals(ED25519_MULTICODEC_PREFIX)) {
470
+ return null;
471
+ }
472
+ return decoded.subarray(2);
473
+ }
474
+ /**
475
+ * Extract the first Ed25519 public key out of a DID document's
476
+ * `verificationMethod` array, trying both encodings production DID
477
+ * documents actually use: `publicKeyJwk` (OKP/Ed25519) and
478
+ * `publicKeyMultibase` (`Ed25519VerificationKey2020`, did:key-style
479
+ * multicodec+base58btc). Confirmed live against a real, currently
480
+ * registered `did:web:knowthat.ai:agents:*` document — it uses
481
+ * `publicKeyMultibase`, not `publicKeyJwk`; a version of this function
482
+ * checking only `publicKeyJwk` silently never resolved any real agent's
483
+ * key (mirroring `@kya-os/compute`'s `did-web.ts`'s own `publicKeyJwk`-only
484
+ * `extractEd25519Jwk`, written for a different DID document source — org
485
+ * root keys — that does use JWK).
486
+ */
487
+ function extractEd25519PublicKeyRaw(document) {
488
+ if (typeof document !== "object" || document === null)
489
+ return null;
490
+ const methods = document.verificationMethod;
491
+ if (!Array.isArray(methods))
492
+ return null;
493
+ for (const method of methods) {
494
+ if (typeof method !== "object" || method === null)
495
+ continue;
496
+ const jwk = method.publicKeyJwk;
497
+ if (typeof jwk === "object" && jwk !== null) {
498
+ const { kty, crv, x } = jwk;
499
+ if (typeof kty === "string" && kty.toUpperCase() === "OKP" && crv === "Ed25519" && typeof x === "string") {
500
+ return Buffer.from(x, "base64url");
501
+ }
502
+ }
503
+ const multibase = method.publicKeyMultibase;
504
+ if (typeof multibase === "string") {
505
+ const raw = decodeEd25519PublicKeyMultibase(multibase);
506
+ if (raw)
507
+ return raw;
508
+ }
509
+ }
510
+ return null;
511
+ }
512
+ /**
513
+ * Resolve an agent DID to its raw 32-byte Ed25519 public key, for verifying
514
+ * a signature it produced (a review verdict's or fix attestation's
515
+ * `proof`). This is `kya-os agent verify`'s "key resolution v1": scoped to
516
+ * `did:web` only, since every reviewer/maker DID in this feature is
517
+ * `did:web:knowthat.ai:agents:<slug>` — a `did:key` or other method fails
518
+ * closed with `unsupported-method` rather than half-supporting it (state
519
+ * that scope in the command's `--help`, per this feature's design doc).
520
+ *
521
+ * The DID here is read off a PR review or comment — the same
522
+ * untrusted-input shape `verifyPrAttribution` already handles — so it goes
523
+ * through the identical SSRF-hardened resolution path
524
+ * (`resolveDidWebDocument`) before this function ever looks at the document
525
+ * for a key.
526
+ */
527
+ export async function resolveAgentEd25519PublicKey(did, fetchImpl = (url, init) => fetch(url, init), lookupImpl = defaultLookup) {
528
+ const resolved = await resolveDidWebDocument(did, fetchImpl, lookupImpl);
529
+ if (!resolved.ok) {
530
+ return {
531
+ ok: false,
532
+ did,
533
+ documentUrl: resolved.documentUrl,
534
+ reason: resolved.reason,
535
+ detail: resolved.detail,
536
+ };
537
+ }
538
+ const publicKeyRaw = extractEd25519PublicKeyRaw(resolved.document);
539
+ if (!publicKeyRaw) {
540
+ return {
541
+ ok: false,
542
+ did,
543
+ documentUrl: resolved.documentUrl,
544
+ reason: "no-ed25519-key",
545
+ detail: "Document has no verificationMethod with an Ed25519 publicKeyJwk.",
546
+ };
547
+ }
548
+ return { ok: true, did, documentUrl: resolved.documentUrl, publicKeyRaw };
549
+ }
550
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/utils/dco/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Installs a project dependency (currently just `@kya-os/mcp-i`) with the
3
+ * project's own package manager, streaming output so the user sees exactly
4
+ * what ran. The exec seam is injectable so callers (and every test) can
5
+ * avoid a real install and network access.
6
+ */
7
+ export type PackageManager = "npm" | "yarn" | "pnpm";
8
+ export interface ExecStreamResult {
9
+ code: number;
10
+ }
11
+ export type ExecStreamImpl = (command: string, args: string[]) => Promise<ExecStreamResult>;
12
+ export interface InstallDependencyOptions {
13
+ packageManager: PackageManager;
14
+ packageName: string;
15
+ /** Working directory for the install; defaults to process.cwd(). */
16
+ cwd?: string;
17
+ /** Injectable exec seam; defaults to a real streaming child process. */
18
+ execImpl?: ExecStreamImpl;
19
+ }
20
+ export interface InstallDependencyResult {
21
+ success: boolean;
22
+ code: number;
23
+ command: string;
24
+ args: string[];
25
+ }
26
+ /** Build the install invocation for a package manager. */
27
+ export declare function buildInstallCommand(packageManager: PackageManager, packageName: string): {
28
+ command: string;
29
+ args: string[];
30
+ };
31
+ /**
32
+ * Install a single dependency, streaming output to the terminal. Never
33
+ * called without explicit user (or `--install`/`--yes`) consent -- that
34
+ * decision is the caller's, this function only executes it.
35
+ */
36
+ export declare function installDependency(options: InstallDependencyOptions): Promise<InstallDependencyResult>;
37
+ //# sourceMappingURL=dependency-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-installer.d.ts","sourceRoot":"","sources":["../../src/utils/dependency-installer.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAUrC;AAWD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAQlC"}
@@ -0,0 +1,32 @@
1
+ import { spawn } from "child_process";
2
+ /** Build the install invocation for a package manager. */
3
+ export function buildInstallCommand(packageManager, packageName) {
4
+ switch (packageManager) {
5
+ case "yarn":
6
+ return { command: "yarn", args: ["add", packageName] };
7
+ case "pnpm":
8
+ return { command: "pnpm", args: ["add", packageName] };
9
+ case "npm":
10
+ default:
11
+ return { command: "npm", args: ["install", packageName] };
12
+ }
13
+ }
14
+ function defaultExecStream(cwd) {
15
+ return (command, args) => new Promise((resolve) => {
16
+ const child = spawn(command, args, { stdio: "inherit", cwd });
17
+ child.on("error", () => resolve({ code: 1 }));
18
+ child.on("close", (code) => resolve({ code: code ?? 1 }));
19
+ });
20
+ }
21
+ /**
22
+ * Install a single dependency, streaming output to the terminal. Never
23
+ * called without explicit user (or `--install`/`--yes`) consent -- that
24
+ * decision is the caller's, this function only executes it.
25
+ */
26
+ export async function installDependency(options) {
27
+ const { command, args } = buildInstallCommand(options.packageManager, options.packageName);
28
+ const execImpl = options.execImpl ?? defaultExecStream(options.cwd);
29
+ const { code } = await execImpl(command, args);
30
+ return { success: code === 0, code, command, args };
31
+ }
32
+ //# sourceMappingURL=dependency-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-installer.js","sourceRoot":"","sources":["../../src/utils/dependency-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAoCtC,0DAA0D;AAC1D,MAAM,UAAU,mBAAmB,CACjC,cAA8B,EAC9B,WAAmB;IAEnB,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QACzD,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QACzD,KAAK,KAAK,CAAC;QACX;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAuB;IAChD,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CACvB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAC3C,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,WAAW,CACpB,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC"}