stitchkit 0.104.2 → 0.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/CHANGELOG.md +372 -13
  2. package/darwin-native.cjs +4 -2
  3. package/dist/agent-runtime/browser-control-contract.d.ts +32 -2
  4. package/dist/agent-runtime/browser-control-contract.d.ts.map +1 -1
  5. package/dist/agent-runtime/browser-controller.d.ts +21 -3
  6. package/dist/agent-runtime/browser-controller.d.ts.map +1 -1
  7. package/dist/agent-runtime/coding-shell-process.d.ts.map +1 -1
  8. package/dist/agent-runtime/coding-tool-refusals.d.ts +1 -0
  9. package/dist/agent-runtime/coding-tool-refusals.d.ts.map +1 -1
  10. package/dist/agent-runtime/coding-tool-shell.d.ts.map +1 -1
  11. package/dist/agent-runtime/compaction.d.ts.map +1 -1
  12. package/dist/agent-runtime/contained-write.d.ts.map +1 -1
  13. package/dist/agent-runtime/control-schema.d.ts +48 -1
  14. package/dist/agent-runtime/control-schema.d.ts.map +1 -1
  15. package/dist/agent-runtime/deferred-tool-search.d.ts +3 -2
  16. package/dist/agent-runtime/deferred-tool-search.d.ts.map +1 -1
  17. package/dist/agent-runtime/harness-control.d.ts.map +1 -1
  18. package/dist/agent-runtime/harness-realtime.d.ts +34 -4
  19. package/dist/agent-runtime/harness-realtime.d.ts.map +1 -1
  20. package/dist/agent-runtime/runtime-recovery.d.ts.map +1 -1
  21. package/dist/agent-runtime/runtime-state.d.ts.map +1 -1
  22. package/dist/agent-runtime/sandbox-contract.d.ts.map +1 -1
  23. package/dist/agent-runtime/sandbox-process-owner.d.ts +9 -1
  24. package/dist/agent-runtime/sandbox-process-owner.d.ts.map +1 -1
  25. package/dist/agent-runtime/sandbox.d.ts +32 -1
  26. package/dist/agent-runtime/sandbox.d.ts.map +1 -1
  27. package/dist/agent-runtime/schedule-records.d.ts.map +1 -1
  28. package/dist/agent-runtime/schedules.d.ts.map +1 -1
  29. package/dist/agent-runtime/store-events.d.ts +9 -4
  30. package/dist/agent-runtime/store-events.d.ts.map +1 -1
  31. package/dist/agent-runtime/testing.d.ts.map +1 -1
  32. package/dist/application/diagnostic-journal-contract.d.ts +50 -0
  33. package/dist/application/diagnostic-journal-contract.d.ts.map +1 -1
  34. package/dist/application/diagnostic-journal-generations.d.ts +24 -0
  35. package/dist/application/diagnostic-journal-generations.d.ts.map +1 -0
  36. package/dist/application/diagnostic-journal-manager.d.ts.map +1 -1
  37. package/dist/application/diagnostic-journal-open.d.ts +10 -0
  38. package/dist/application/diagnostic-journal-open.d.ts.map +1 -0
  39. package/dist/application/diagnostic-journal-quarantine.d.ts +28 -0
  40. package/dist/application/diagnostic-journal-quarantine.d.ts.map +1 -0
  41. package/dist/application/diagnostic-journal-read-contract.d.ts +73 -3
  42. package/dist/application/diagnostic-journal-read-contract.d.ts.map +1 -1
  43. package/dist/application/diagnostic-journal-reader.d.ts +17 -2
  44. package/dist/application/diagnostic-journal-reader.d.ts.map +1 -1
  45. package/dist/application/diagnostic-journal-recovery.d.ts +18 -2
  46. package/dist/application/diagnostic-journal-recovery.d.ts.map +1 -1
  47. package/dist/application/diagnostic-journal-storage.d.ts +6 -2
  48. package/dist/application/diagnostic-journal-storage.d.ts.map +1 -1
  49. package/dist/application/diagnostic-journal-tail.d.ts +12 -0
  50. package/dist/application/diagnostic-journal-tail.d.ts.map +1 -0
  51. package/dist/application/diagnostic-journal.d.ts +3 -0
  52. package/dist/application/diagnostic-journal.d.ts.map +1 -1
  53. package/dist/application/directory-inbox-accept.d.ts +3 -3
  54. package/dist/application/directory-inbox-accept.d.ts.map +1 -1
  55. package/dist/application/directory-inbox-contract.d.ts +38 -10
  56. package/dist/application/directory-inbox-contract.d.ts.map +1 -1
  57. package/dist/application/directory-inbox-delivery.d.ts +3 -3
  58. package/dist/application/directory-inbox-delivery.d.ts.map +1 -1
  59. package/dist/application/directory-inbox-files.d.ts +17 -2
  60. package/dist/application/directory-inbox-files.d.ts.map +1 -1
  61. package/dist/application/directory-inbox-state.d.ts +1 -1
  62. package/dist/application/directory-inbox-state.d.ts.map +1 -1
  63. package/dist/application/directory-inbox.d.ts +1 -1
  64. package/dist/application/directory-inbox.d.ts.map +1 -1
  65. package/dist/application/file-state-store.d.ts +21 -1
  66. package/dist/application/file-state-store.d.ts.map +1 -1
  67. package/dist/application/grammy.d.ts.map +1 -1
  68. package/dist/application/kernel-contract.d.ts.map +1 -1
  69. package/dist/application/revision-signal.d.ts.map +1 -1
  70. package/dist/application/state-store.d.ts +3 -0
  71. package/dist/application/state-store.d.ts.map +1 -1
  72. package/dist/browser/api-error.d.ts +38 -0
  73. package/dist/browser/api-error.d.ts.map +1 -0
  74. package/dist/browser/chunked-upload.d.ts.map +1 -1
  75. package/dist/browser/client-executors.d.ts.map +1 -1
  76. package/dist/browser/client-url.d.ts.map +1 -1
  77. package/dist/browser/contract-stream.d.ts.map +1 -1
  78. package/dist/browser/http.d.ts +0 -25
  79. package/dist/browser/http.d.ts.map +1 -1
  80. package/dist/browser/resumable.d.ts.map +1 -1
  81. package/dist/contract/define-validation.d.ts +0 -1
  82. package/dist/contract/define-validation.d.ts.map +1 -1
  83. package/dist/contract/define.d.ts.map +1 -1
  84. package/dist/contract/errors-factory.d.ts.map +1 -1
  85. package/dist/contract/errors.d.ts +15 -18
  86. package/dist/contract/errors.d.ts.map +1 -1
  87. package/dist/contract/normalize.d.ts.map +1 -1
  88. package/dist/durability/effect.d.ts.map +1 -1
  89. package/dist/durability/scheduler.d.ts.map +1 -1
  90. package/dist/entrypoints/agent-runtime/browser.js +29 -18
  91. package/dist/entrypoints/agent-runtime/coding-tools.js +8 -7
  92. package/dist/entrypoints/agent-runtime/harness.js +15 -14
  93. package/dist/entrypoints/agent-runtime/realtime.d.ts +1 -1
  94. package/dist/entrypoints/agent-runtime/realtime.d.ts.map +1 -1
  95. package/dist/entrypoints/agent-runtime/realtime.js +119 -54
  96. package/dist/entrypoints/agent-runtime/sandbox.js +23 -17
  97. package/dist/entrypoints/agent-runtime/sqlite/bun.js +4 -3
  98. package/dist/entrypoints/agent-runtime/sqlite/node.js +4 -3
  99. package/dist/entrypoints/agent-runtime/testing.js +8 -6
  100. package/dist/entrypoints/agent-runtime.js +37 -38
  101. package/dist/entrypoints/application/diagnostic-journal.js +305 -111
  102. package/dist/entrypoints/application/directory-inbox.js +174 -77
  103. package/dist/entrypoints/application/grammy.js +5 -2
  104. package/dist/entrypoints/application/opentelemetry.js +2 -2
  105. package/dist/entrypoints/application.d.ts +2 -2
  106. package/dist/entrypoints/application.d.ts.map +1 -1
  107. package/dist/entrypoints/application.js +17 -8
  108. package/dist/entrypoints/cli/publish.d.ts +16 -0
  109. package/dist/entrypoints/cli/publish.d.ts.map +1 -0
  110. package/dist/entrypoints/cli/publish.js +527 -0
  111. package/dist/entrypoints/cli.d.ts +1 -2
  112. package/dist/entrypoints/cli.d.ts.map +1 -1
  113. package/dist/entrypoints/cli.js +59 -966
  114. package/dist/entrypoints/contract.js +3 -3
  115. package/dist/entrypoints/files/packaging.js +153 -64
  116. package/dist/entrypoints/files.d.ts +1 -0
  117. package/dist/entrypoints/files.d.ts.map +1 -1
  118. package/dist/entrypoints/files.js +17 -10
  119. package/dist/entrypoints/index.d.ts +2 -1
  120. package/dist/entrypoints/index.d.ts.map +1 -1
  121. package/dist/entrypoints/index.js +31 -60
  122. package/dist/entrypoints/node.js +8 -8
  123. package/dist/entrypoints/observability.js +3 -3
  124. package/dist/entrypoints/primitives.js +67 -83
  125. package/dist/entrypoints/process.d.ts +1 -1
  126. package/dist/entrypoints/process.d.ts.map +1 -1
  127. package/dist/entrypoints/process.js +2 -2
  128. package/dist/entrypoints/react.js +4 -2
  129. package/dist/entrypoints/remote.js +37 -13
  130. package/dist/entrypoints/server.js +18 -16
  131. package/dist/entrypoints/telegram/screens.js +5 -3
  132. package/dist/entrypoints/telegram.js +31 -46
  133. package/dist/entrypoints/testing.d.ts +1 -1
  134. package/dist/entrypoints/testing.d.ts.map +1 -1
  135. package/dist/entrypoints/testing.js +444 -448
  136. package/dist/entrypoints/tools/connections.js +268 -105
  137. package/dist/entrypoints/tools/contract.js +2 -2
  138. package/dist/entrypoints/tools/invoker.js +8 -7
  139. package/dist/entrypoints/tools/mcp.d.ts +2 -2
  140. package/dist/entrypoints/tools/mcp.d.ts.map +1 -1
  141. package/dist/entrypoints/tools/mcp.js +10 -9
  142. package/dist/entrypoints/tools.d.ts +0 -1
  143. package/dist/entrypoints/tools.d.ts.map +1 -1
  144. package/dist/entrypoints/tools.js +118 -53
  145. package/dist/entrypoints/tracking.js +2 -3
  146. package/dist/files/boundary.d.ts +2 -2
  147. package/dist/files/boundary.d.ts.map +1 -1
  148. package/dist/files/chunk-spool.d.ts.map +1 -1
  149. package/dist/files/file-io.d.ts +2 -2
  150. package/dist/files/file-io.d.ts.map +1 -1
  151. package/dist/files/native-packaging-layout.d.ts +50 -4
  152. package/dist/files/native-packaging-layout.d.ts.map +1 -1
  153. package/dist/files/native-packaging.d.ts +78 -17
  154. package/dist/files/native-packaging.d.ts.map +1 -1
  155. package/dist/{index-r5hsgkz5.js → index-0gs4ymfj.js} +6 -3
  156. package/dist/{index-zax7resm.js → index-0gxvns6s.js} +1 -13
  157. package/dist/index-0s4xebbg.js +8 -0
  158. package/dist/{index-r4r70zmh.js → index-12zsej7b.js} +5 -2
  159. package/dist/{index-kemm0ej5.js → index-1pwwan01.js} +65 -22
  160. package/dist/{index-vgkbcnkc.js → index-299sm5tr.js} +1 -1
  161. package/dist/{index-2vnh05w4.js → index-2k91mewf.js} +31 -74
  162. package/dist/{index-269zqj8m.js → index-2rc6jd9n.js} +28 -12
  163. package/dist/{index-wh0ecvyk.js → index-37asdw3a.js} +1 -1
  164. package/dist/index-3h0ztg0z.js +285 -0
  165. package/dist/{index-g95fk660.js → index-4vsby8n8.js} +8 -15
  166. package/dist/index-556g5hsh.js +17 -0
  167. package/dist/{index-adhgd4pe.js → index-5p55xreg.js} +2 -2
  168. package/dist/index-5w6t91ze.js +47 -0
  169. package/dist/{index-9pw0a51a.js → index-6yxhe58g.js} +40 -7
  170. package/dist/{index-6d9xaxw1.js → index-8ks9b85e.js} +33 -5
  171. package/dist/{index-bhb950qs.js → index-916yh4e2.js} +25 -12
  172. package/dist/index-9tqbxv5p.js +44 -0
  173. package/dist/{index-5csmzesf.js → index-azx12jgv.js} +4 -3
  174. package/dist/{index-mbnnw3f2.js → index-b0kddvzw.js} +15 -5
  175. package/dist/{index-n5yqxd3d.js → index-b0w7rbpt.js} +23 -2
  176. package/dist/index-b56nnscm.js +132 -0
  177. package/dist/{index-0ndk4555.js → index-c0hffcmj.js} +2 -2
  178. package/dist/{index-pptyv13k.js → index-c17xcx4k.js} +42 -6
  179. package/dist/{index-g2j7pnak.js → index-cmzvhhtd.js} +5 -2
  180. package/dist/index-cq59agna.js +51 -0
  181. package/dist/{index-ssmd41kh.js → index-d2h99n7d.js} +1 -1
  182. package/dist/{index-z94wht4y.js → index-dky0dcmf.js} +34 -5
  183. package/dist/{index-za6j7nwy.js → index-dsnjzb62.js} +104 -51
  184. package/dist/index-eemvahkc.js +21 -0
  185. package/dist/index-ef8gdaq0.js +105 -0
  186. package/dist/{index-fa4wg312.js → index-f199nfq5.js} +10 -6
  187. package/dist/{index-ck71tbcf.js → index-fsw1ybf3.js} +11 -15
  188. package/dist/{index-f330qqyg.js → index-g2vfg7ak.js} +217 -63
  189. package/dist/{index-fk18k56k.js → index-gr5g3xfw.js} +11 -18
  190. package/dist/{index-jn9g8xdt.js → index-hjvje0pf.js} +6 -4
  191. package/dist/{index-x928baz2.js → index-j9gxbztg.js} +18 -14
  192. package/dist/index-kfjkb396.js +37 -0
  193. package/dist/{index-6drst9sg.js → index-ksfagmyz.js} +45 -345
  194. package/dist/index-m616f0yz.js +120 -0
  195. package/dist/{index-fm1c1a08.js → index-m6w6jtda.js} +40 -21
  196. package/dist/{index-ptn0g0gj.js → index-ma963wz7.js} +21 -20
  197. package/dist/{index-bakgedh8.js → index-msfpyy2f.js} +2 -4
  198. package/dist/{index-ywppsaby.js → index-n1nszyk0.js} +23 -34
  199. package/dist/{index-v14qqmys.js → index-n4689krb.js} +1 -1
  200. package/dist/{index-a0zzh8ak.js → index-pz3y6b6g.js} +3 -3
  201. package/dist/{index-43p08g7t.js → index-pzb63z66.js} +12 -8
  202. package/dist/{index-h97tqqp1.js → index-qaet40b2.js} +5 -3
  203. package/dist/{index-t1sr4aks.js → index-qaqbdm7s.js} +52 -6
  204. package/dist/{index-77nxk6ay.js → index-r393tnfp.js} +16 -10
  205. package/dist/{index-kb8styz3.js → index-rpzewktb.js} +15 -5
  206. package/dist/{index-27a2pj09.js → index-sj28htvf.js} +1 -1
  207. package/dist/index-szybbezc.js +455 -0
  208. package/dist/{index-2hyavjjj.js → index-wbhdzxar.js} +3 -3
  209. package/dist/{index-4e0ah203.js → index-wdy68sh6.js} +47 -24
  210. package/dist/{index-hbd32c6a.js → index-wqmvtnkp.js} +38 -89
  211. package/dist/{index-hp9d77wk.js → index-x7w1z6pf.js} +15 -4
  212. package/dist/{index-20yvtn9a.js → index-yt7gyg5x.js} +1 -1
  213. package/dist/{index-cvda079a.js → index-yvfk3y36.js} +12 -2
  214. package/dist/{index-5z6jn897.js → index-z23rfxhj.js} +1 -1
  215. package/dist/internal/abort-race.d.ts +8 -2
  216. package/dist/internal/abort-race.d.ts.map +1 -1
  217. package/dist/internal/atomic-file.d.ts +55 -9
  218. package/dist/internal/atomic-file.d.ts.map +1 -1
  219. package/dist/internal/atomic-publication.d.ts +39 -4
  220. package/dist/internal/atomic-publication.d.ts.map +1 -1
  221. package/dist/internal/atomic-staging.d.ts +46 -0
  222. package/dist/internal/atomic-staging.d.ts.map +1 -0
  223. package/dist/internal/bounded-file-read.d.ts +19 -11
  224. package/dist/internal/bounded-file-read.d.ts.map +1 -1
  225. package/dist/internal/bounded-lines.d.ts.map +1 -1
  226. package/dist/internal/close-after.d.ts +11 -0
  227. package/dist/internal/close-after.d.ts.map +1 -0
  228. package/dist/internal/deadline.d.ts +10 -0
  229. package/dist/internal/deadline.d.ts.map +1 -1
  230. package/dist/internal/exclusive-lock-read.d.ts +10 -12
  231. package/dist/internal/exclusive-lock-read.d.ts.map +1 -1
  232. package/dist/internal/exclusive-lock.d.ts +2 -2
  233. package/dist/internal/exclusive-lock.d.ts.map +1 -1
  234. package/dist/internal/file-observation.d.ts +14 -0
  235. package/dist/internal/file-observation.d.ts.map +1 -0
  236. package/dist/internal/json-data.d.ts +22 -5
  237. package/dist/internal/json-data.d.ts.map +1 -1
  238. package/dist/internal/positive-integer.d.ts +9 -0
  239. package/dist/internal/positive-integer.d.ts.map +1 -0
  240. package/dist/internal/process-instance.d.ts +35 -5
  241. package/dist/internal/process-instance.d.ts.map +1 -1
  242. package/dist/internal/secure-fetch.d.ts.map +1 -1
  243. package/dist/internal/timers.d.ts +11 -0
  244. package/dist/internal/timers.d.ts.map +1 -0
  245. package/dist/internal/with-exclusive-lock.d.ts +5 -4
  246. package/dist/internal/with-exclusive-lock.d.ts.map +1 -1
  247. package/dist/observability/bounded-sink.d.ts.map +1 -1
  248. package/dist/primitives/canonical-json.d.ts +23 -2
  249. package/dist/primitives/canonical-json.d.ts.map +1 -1
  250. package/dist/primitives/delivery.d.ts.map +1 -1
  251. package/dist/primitives/index.d.ts +1 -1
  252. package/dist/primitives/index.d.ts.map +1 -1
  253. package/dist/primitives/money.d.ts.map +1 -1
  254. package/dist/process/cleanup.d.ts +6 -1
  255. package/dist/process/cleanup.d.ts.map +1 -1
  256. package/dist/process/command-lifetime.d.ts +4 -0
  257. package/dist/process/command-lifetime.d.ts.map +1 -1
  258. package/dist/process/command-owner.d.ts.map +1 -1
  259. package/dist/process/command.d.ts +4 -0
  260. package/dist/process/command.d.ts.map +1 -1
  261. package/dist/process/contract.d.ts +67 -2
  262. package/dist/process/contract.d.ts.map +1 -1
  263. package/dist/process/group.d.ts +40 -3
  264. package/dist/process/group.d.ts.map +1 -1
  265. package/dist/process/launch.d.ts +12 -1
  266. package/dist/process/launch.d.ts.map +1 -1
  267. package/dist/process/terminate.d.ts +39 -0
  268. package/dist/process/terminate.d.ts.map +1 -0
  269. package/dist/react/query-client.d.ts.map +1 -1
  270. package/dist/realtime/rejection.d.ts.map +1 -1
  271. package/dist/server/contract-stream.d.ts.map +1 -1
  272. package/dist/server/handler-state.d.ts.map +1 -1
  273. package/dist/server/implement.d.ts.map +1 -1
  274. package/dist/server/request-body.d.ts +0 -1
  275. package/dist/server/request-body.d.ts.map +1 -1
  276. package/dist/server/unix-client.d.ts.map +1 -1
  277. package/dist/telegram/broadcast-delivery.d.ts.map +1 -1
  278. package/dist/telegram/broadcast-failure.d.ts +10 -2
  279. package/dist/telegram/broadcast-failure.d.ts.map +1 -1
  280. package/dist/telegram/operator-channel.d.ts.map +1 -1
  281. package/dist/telegram/screens/outcome.d.ts.map +1 -1
  282. package/dist/testing/surface-conformance.d.ts +1 -1
  283. package/dist/testing/surface-conformance.d.ts.map +1 -1
  284. package/dist/testing/surface-manifest.d.ts +0 -6
  285. package/dist/testing/surface-manifest.d.ts.map +1 -1
  286. package/dist/tools/agent.d.ts +1 -1
  287. package/dist/tools/agent.d.ts.map +1 -1
  288. package/dist/tools/cli/args.d.ts +1 -1
  289. package/dist/tools/cli/args.d.ts.map +1 -1
  290. package/dist/tools/cli/help.d.ts.map +1 -1
  291. package/dist/tools/cli/invoke.d.ts +2 -2
  292. package/dist/tools/cli/invoke.d.ts.map +1 -1
  293. package/dist/tools/cli/profile.d.ts.map +1 -1
  294. package/dist/tools/cli/publication-assets.d.ts.map +1 -1
  295. package/dist/tools/cli/publication-contract.d.ts +8 -0
  296. package/dist/tools/cli/publication-contract.d.ts.map +1 -1
  297. package/dist/tools/cli/publication-control.d.ts.map +1 -1
  298. package/dist/tools/cli/publication-storage.d.ts +23 -2
  299. package/dist/tools/cli/publication-storage.d.ts.map +1 -1
  300. package/dist/tools/cli/publication.d.ts +8 -1
  301. package/dist/tools/cli/publication.d.ts.map +1 -1
  302. package/dist/tools/connections/errors.d.ts +18 -6
  303. package/dist/tools/connections/errors.d.ts.map +1 -1
  304. package/dist/tools/connections/limits.d.ts +8 -2
  305. package/dist/tools/connections/limits.d.ts.map +1 -1
  306. package/dist/tools/connections/mcp-client.d.ts.map +1 -1
  307. package/dist/tools/connections/mcp-envelope.d.ts.map +1 -1
  308. package/dist/tools/connections/openapi.d.ts.map +1 -1
  309. package/dist/tools/connections/schema-budget.d.ts +1 -1
  310. package/dist/tools/connections/schema-budget.d.ts.map +1 -1
  311. package/dist/tools/connections/sse-session.d.ts.map +1 -1
  312. package/dist/tools/execute-args.d.ts.map +1 -1
  313. package/dist/tools/execute-result.d.ts.map +1 -1
  314. package/dist/tools/internal/surface-projector.d.ts +17 -3
  315. package/dist/tools/internal/surface-projector.d.ts.map +1 -1
  316. package/dist/tools/internal/tool-error-projection.d.ts +16 -0
  317. package/dist/tools/internal/tool-error-projection.d.ts.map +1 -0
  318. package/dist/tools/internal/tool-view.d.ts.map +1 -1
  319. package/dist/tools/invoker.d.ts.map +1 -1
  320. package/dist/tools/list-names.d.ts +3 -2
  321. package/dist/tools/list-names.d.ts.map +1 -1
  322. package/dist/tools/manifest.d.ts +3 -2
  323. package/dist/tools/manifest.d.ts.map +1 -1
  324. package/dist/tools/mcp/handler.d.ts +7 -0
  325. package/dist/tools/mcp/handler.d.ts.map +1 -1
  326. package/dist/tools/mcp/mount.d.ts +18 -2
  327. package/dist/tools/mcp/mount.d.ts.map +1 -1
  328. package/dist/tools/mcp/prepare.d.ts +3 -3
  329. package/dist/tools/mcp/prepare.d.ts.map +1 -1
  330. package/dist/tools/mcp/register.d.ts.map +1 -1
  331. package/dist/tools/mcp/runtime-tools.d.ts.map +1 -1
  332. package/dist/tools/mcp/stdio-signals.d.ts +14 -0
  333. package/dist/tools/mcp/stdio-signals.d.ts.map +1 -1
  334. package/dist/tools/mcp/stdio.d.ts +7 -0
  335. package/dist/tools/mcp/stdio.d.ts.map +1 -1
  336. package/dist/tools/operations/async-operation-runtime-tools.d.ts.map +1 -1
  337. package/dist/tools/operations/async-operation-runtime-types.d.ts +3 -3
  338. package/dist/tools/operations/async-operation-runtime-types.d.ts.map +1 -1
  339. package/dist/tools/operations/define-wait-tool.d.ts +1 -1
  340. package/dist/tools/operations/define-wait-tool.d.ts.map +1 -1
  341. package/dist/tools/operations/wait-core.d.ts +0 -6
  342. package/dist/tools/operations/wait-core.d.ts.map +1 -1
  343. package/dist/tools/registry.d.ts +1 -1
  344. package/dist/tools/registry.d.ts.map +1 -1
  345. package/dist/tools/remote.d.ts +1 -1
  346. package/dist/tools/remote.d.ts.map +1 -1
  347. package/dist/tools/{runtime-tool-execution.d.ts → runtime-tool-declaration.d.ts} +32 -9
  348. package/dist/tools/runtime-tool-declaration.d.ts.map +1 -0
  349. package/dist/tools/runtime-tool-mcp.d.ts +6 -15
  350. package/dist/tools/runtime-tool-mcp.d.ts.map +1 -1
  351. package/dist/tools/runtime-tool.d.ts +14 -12
  352. package/dist/tools/runtime-tool.d.ts.map +1 -1
  353. package/dist/tools/schema/coerce.d.ts +4 -0
  354. package/dist/tools/schema/coerce.d.ts.map +1 -1
  355. package/dist/tools/schema/flatten-join.d.ts.map +1 -1
  356. package/dist/tools/surface.d.ts +7 -11
  357. package/dist/tools/surface.d.ts.map +1 -1
  358. package/dist/tools/transfer/define-download-tool.d.ts +1 -1
  359. package/dist/tools/transfer/define-download-tool.d.ts.map +1 -1
  360. package/dist/tools/transfer/define-upload-tool.d.ts +1 -1
  361. package/dist/tools/transfer/define-upload-tool.d.ts.map +1 -1
  362. package/dist/tools/transfer/define-view-file-tool.d.ts +1 -1
  363. package/dist/tools/transfer/define-view-file-tool.d.ts.map +1 -1
  364. package/dist/tools/transfer/managed-file-error.d.ts.map +1 -1
  365. package/dist/tools/transfer/view-file-contract.d.ts.map +1 -1
  366. package/dist/tools/transfer/view-file.d.ts +1 -1
  367. package/dist/tools/transfer/view-file.d.ts.map +1 -1
  368. package/dist/tools/transports.d.ts +3 -2
  369. package/dist/tools/transports.d.ts.map +1 -1
  370. package/llms/agent-runtime-browser.txt +10 -4
  371. package/llms/agent-runtime-harness.txt +32 -31
  372. package/llms/agent-runtime-react.txt +1 -1
  373. package/llms/agent-runtime-realtime.txt +14 -5
  374. package/llms/agent-runtime-sandbox.txt +3 -11
  375. package/llms/agent-runtime.3.txt +2 -2
  376. package/llms/agent-runtime.txt +0 -9
  377. package/llms/application.2.txt +3 -12
  378. package/llms/application.3.txt +7 -4
  379. package/llms/application.txt +44 -15
  380. package/llms/cli-publish.txt +29 -0
  381. package/llms/cli.2.txt +9 -11
  382. package/llms/cli.txt +26 -14
  383. package/llms/declaration.txt +0 -9
  384. package/llms/files-packaging.txt +16 -8
  385. package/llms/files.txt +4 -2
  386. package/llms/geo.txt +0 -9
  387. package/llms/live.txt +4 -13
  388. package/llms/observability.txt +31 -5
  389. package/llms/primitives.txt +38 -20
  390. package/llms/process.txt +287 -157
  391. package/llms/react-keyboard.txt +0 -9
  392. package/llms/react.txt +0 -18
  393. package/llms/server.4.txt +1 -1
  394. package/llms/server.5.txt +1 -1
  395. package/llms/server.txt +1 -1
  396. package/llms/stitchkit.txt +6 -7
  397. package/llms/telegram-screens.txt +2 -2
  398. package/llms/testing.txt +0 -1
  399. package/llms/tools-mcp.txt +2 -3
  400. package/llms/tools.2.txt +12 -0
  401. package/llms/tools.3.txt +5 -6
  402. package/llms/tools.txt +6 -4
  403. package/llms/upgrading-0.37.0-0.50.0.txt +947 -0
  404. package/llms/{upgrading-0.44.0-0.61.0.txt → upgrading-0.53.0-0.67.0.txt} +576 -506
  405. package/llms/{upgrading-0.62.0-0.80.0.txt → upgrading-0.68.0-0.94.0.txt} +562 -576
  406. package/llms/{upgrading-0.81.0-0.104.0.txt → upgrading-0.95.0-0.105.0.txt} +452 -567
  407. package/llms/upgrading.txt +4 -4
  408. package/llms-full.txt +1029 -409
  409. package/llms.txt +24 -24
  410. package/native-assets.json +11 -3
  411. package/package.json +6 -6
  412. package/dist/agent-runtime/harness-tools.d.ts +0 -11
  413. package/dist/agent-runtime/harness-tools.d.ts.map +0 -1
  414. package/dist/entrypoints/agent-runtime/harness-tools.d.ts +0 -2
  415. package/dist/entrypoints/agent-runtime/harness-tools.d.ts.map +0 -1
  416. package/dist/entrypoints/agent-runtime/harness-tools.js +0 -32
  417. package/dist/index-1a6jtnd9.js +0 -88
  418. package/dist/index-8a9ksm91.js +0 -95
  419. package/dist/index-a3wma1hk.js +0 -48
  420. package/dist/index-jd470k6q.js +0 -109
  421. package/dist/index-n1dqr7gf.js +0 -20
  422. package/dist/index-nggfa2yn.js +0 -34
  423. package/dist/index-s4evrmp5.js +0 -98
  424. package/dist/index-ze1eph1k.js +0 -20
  425. package/dist/tools/connections/error-projection.d.ts +0 -4
  426. package/dist/tools/connections/error-projection.d.ts.map +0 -1
  427. package/dist/tools/runtime-tool-execution.d.ts.map +0 -1
  428. package/llms/agent-runtime-harness-tools.txt +0 -25
  429. package/llms/upgrading-0.37.0-0.44.0.txt +0 -444
@@ -1,10 +1,7 @@
1
1
  import {
2
2
  coerceJsonArgs2
3
- } from "../index-9pw0a51a.js";
3
+ } from "../index-6yxhe58g.js";
4
4
  import {
5
- fetchGuarded,
6
- PrivateAddressRefusal,
7
- readCapped,
8
5
  defineCliCommand2,
9
6
  DEFAULT_EXIT_CODES2,
10
7
  cliExitCode2,
@@ -18,43 +15,46 @@ import {
18
15
  renderCliView2,
19
16
  pollUntilDone2,
20
17
  createCli2
21
- } from "../index-6drst9sg.js";
18
+ } from "../index-ksfagmyz.js";
19
+ import"../index-cq59agna.js";
22
20
  import {
23
21
  AppError2
24
- } from "../index-x928baz2.js";
25
- import"../index-kb8styz3.js";
26
- import"../index-2vnh05w4.js";
22
+ } from "../index-j9gxbztg.js";
23
+ import"../index-rpzewktb.js";
24
+ import"../index-556g5hsh.js";
25
+ import"../index-2k91mewf.js";
27
26
  import"../index-ct75c3at.js";
28
- import"../index-77nxk6ay.js";
27
+ import"../index-r393tnfp.js";
29
28
  import"../index-yex7eg1v.js";
30
- import"../index-2hyavjjj.js";
31
- import"../index-xqhede6x.js";
29
+ import"../index-wbhdzxar.js";
32
30
  import {
33
- ManagedFileError2,
34
- createManagedFileBoundary2
35
- } from "../index-hbd32c6a.js";
36
- import"../index-za6j7nwy.js";
37
- import"../index-5csmzesf.js";
38
- import"../index-v5ee8ath.js";
31
+ CliBuildSignatureSchema2,
32
+ cliManifestSigningPayload2,
33
+ signCliManifest2,
34
+ verifyCliManifest2,
35
+ cliSignatureAccepted2,
36
+ CliBuildTargetSchema2,
37
+ CliBuildAssetSchema2,
38
+ CliBuildManifestSchema2,
39
+ CliBuildStampSchema2,
40
+ formatCliBuildStamp2,
41
+ currentCliBuildTarget2,
42
+ selectCliBuildAsset2,
43
+ assertCliPublishable2,
44
+ compareCliVersions2,
45
+ checkCliUpdate2,
46
+ applyCliUpdate2,
47
+ rollbackCliUpdate2
48
+ } from "../index-szybbezc.js";
39
49
  import {
40
- withExclusiveLock2
41
- } from "../index-g95fk660.js";
42
- import {
43
- writeFileAtomic2,
44
50
  writeFileAtomicSync2
45
- } from "../index-s4evrmp5.js";
46
- import {
47
- AtomicFilePublicationError2
48
- } from "../index-8a9ksm91.js";
49
- import"../index-a0zzh8ak.js";
50
- import"../index-cvda079a.js";
51
+ } from "../index-ef8gdaq0.js";
52
+ import"../index-pz3y6b6g.js";
53
+ import"../index-yvfk3y36.js";
51
54
  import {
52
55
  argumentsDigest
53
56
  } from "../index-r7a7r7ha.js";
54
57
  import"../index-7n68nmc6.js";
55
- import {
56
- serializeCanonicalJson
57
- } from "../index-zsvzhjtk.js";
58
58
  import {
59
59
  safeJsonParse
60
60
  } from "../index-zsarb5xp.js";
@@ -214,123 +214,6 @@ ${cases}
214
214
  ;;
215
215
  esac`;
216
216
  }
217
- // src/tools/cli/manifest.ts
218
- import { z as z2 } from "zod";
219
-
220
- // src/tools/cli/signature.ts
221
- import {
222
- createPrivateKey,
223
- createPublicKey,
224
- sign as cryptoSign,
225
- verify as cryptoVerify
226
- } from "node:crypto";
227
- import { z } from "zod";
228
- var CliBuildSignatureSchema = z.object({
229
- algorithm: z.literal("ed25519"),
230
- keyId: z.string().min(1),
231
- signature: z.string().min(1)
232
- });
233
- function cliManifestSigningPayload(manifest) {
234
- return serializeCanonicalJson({
235
- name: manifest.name,
236
- version: manifest.version,
237
- commit: manifest.commit,
238
- builtAt: manifest.builtAt,
239
- assets: manifest.assets.map((asset) => ({
240
- platform: asset.platform,
241
- arch: asset.arch,
242
- compression: asset.compression,
243
- size: asset.size,
244
- sha256: asset.sha256
245
- }))
246
- });
247
- }
248
- function publicKeyOf(material) {
249
- const trimmed = material.trim();
250
- if (trimmed.includes("BEGIN PUBLIC KEY"))
251
- return createPublicKey(trimmed);
252
- const raw = Buffer.from(trimmed, "base64");
253
- if (raw.length !== 32) {
254
- throw new Error("[stitchkit] an Ed25519 public key is 32 bytes or SPKI PEM");
255
- }
256
- const spki = Buffer.concat([Buffer.from("302a300506032b6570032100", "hex"), raw]);
257
- return createPublicKey({ key: spki, format: "der", type: "spki" });
258
- }
259
- function signCliManifest(manifest, options) {
260
- const signature = cryptoSign(null, Buffer.from(cliManifestSigningPayload(manifest), "utf8"), createPrivateKey(typeof options.privateKey === "string" ? options.privateKey : { key: Buffer.from(options.privateKey), format: "der", type: "pkcs8" }));
261
- return {
262
- algorithm: "ed25519",
263
- keyId: options.keyId,
264
- signature: signature.toString("base64")
265
- };
266
- }
267
- function verifyCliManifest(manifest, signature, trust) {
268
- const keys = trust?.keys;
269
- if (!keys || Object.keys(keys).length === 0)
270
- return "unenforced";
271
- if (!signature)
272
- return "missing";
273
- const material = Object.hasOwn(keys, signature.keyId) ? keys[signature.keyId] : undefined;
274
- if (material === undefined)
275
- return "unknown-key";
276
- try {
277
- const ok = cryptoVerify(null, Buffer.from(cliManifestSigningPayload(manifest), "utf8"), publicKeyOf(material), Buffer.from(signature.signature, "base64"));
278
- return ok ? "valid" : "invalid";
279
- } catch {
280
- return "invalid";
281
- }
282
- }
283
- function cliSignatureAccepted(verdict) {
284
- return verdict === "valid" || verdict === "unenforced";
285
- }
286
-
287
- // src/tools/cli/manifest.ts
288
- var CliBuildTargetSchema = z2.object({
289
- platform: z2.string().min(1),
290
- arch: z2.string().min(1)
291
- });
292
- var CliBuildAssetSchema = CliBuildTargetSchema.extend({
293
- url: z2.url(),
294
- compression: z2.enum(["gzip", "none"]).default("none"),
295
- size: z2.int().positive(),
296
- sha256: z2.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex characters")
297
- });
298
- var CliBuildManifestSchema = z2.object({
299
- name: z2.string().min(1),
300
- version: z2.string().min(1),
301
- commit: z2.string().min(1),
302
- builtAt: z2.iso.datetime(),
303
- assets: z2.array(CliBuildAssetSchema),
304
- signature: CliBuildSignatureSchema.optional()
305
- });
306
- var CliBuildStampSchema = z2.object({
307
- version: z2.string().min(1),
308
- commit: z2.string().min(1),
309
- builtAt: z2.iso.datetime()
310
- });
311
- function formatCliBuildStamp(stamp, name) {
312
- const prefix = name ? `${name} ` : "";
313
- return `${prefix}${stamp.version} (${stamp.commit.slice(0, 12)}, built ${stamp.builtAt})`;
314
- }
315
- function currentCliBuildTarget() {
316
- return { platform: process.platform, arch: process.arch };
317
- }
318
- function selectCliBuildAsset(manifest, target = currentCliBuildTarget()) {
319
- return manifest.assets.find((asset) => asset.platform === target.platform && asset.arch === target.arch);
320
- }
321
- function isManifestList(value) {
322
- return Array.isArray(value);
323
- }
324
- function assertCliPublishable(previous, next) {
325
- const published = previous === undefined ? [] : isManifestList(previous) ? previous : [previous];
326
- for (const candidate of published) {
327
- if (candidate.version !== next.version)
328
- continue;
329
- if (candidate.commit === next.commit)
330
- continue;
331
- throw new Error(`[stitchkit] ${next.name} ${next.version} was already published from commit ${candidate.commit}; ` + `refusing to republish it from ${next.commit} — bump the version instead`);
332
- }
333
- }
334
217
  // src/tools/cli/profile.ts
335
218
  import {
336
219
  chmodSync,
@@ -348,7 +231,10 @@ var DIRECTORY_MODE = 448;
348
231
 
349
232
  class CliProfileError extends AppError2 {
350
233
  constructor(message, code = "NOT_FOUND") {
351
- super(code, message, code === "NOT_FOUND" ? 404 : code === "FORBIDDEN" ? 403 : 400);
234
+ super(code, {
235
+ message,
236
+ status: code === "NOT_FOUND" ? 404 : code === "FORBIDDEN" ? 403 : 400
237
+ });
352
238
  this.name = "CliProfileError";
353
239
  }
354
240
  }
@@ -424,804 +310,12 @@ function missingMessage(name, path, config) {
424
310
  const hint = config.createHint ? ` — ${config.createHint(name, path)}` : "";
425
311
  return `profile "${name}" is not configured; expected ${path}${hint}`;
426
312
  }
427
- // src/tools/cli/publication.ts
428
- import { createHash as createHash3 } from "node:crypto";
429
- import { lstat as lstat2, mkdtemp, rename, rm as rm2 } from "node:fs/promises";
430
- import { join as join4 } from "node:path";
431
- import { z as z5 } from "zod";
432
-
433
- // src/tools/cli/publication-assets.ts
434
- import { createHash } from "node:crypto";
435
- import { Readable } from "node:stream";
436
- import { setImmediate as nextTurn } from "node:timers/promises";
437
- import { createGunzip, createGzip } from "node:zlib";
438
-
439
- // src/tools/cli/publication-control.ts
440
- function waitForPublication(operation, signal) {
441
- return new Promise((resolve, reject) => {
442
- const abort = () => {
443
- signal.removeEventListener("abort", abort);
444
- reject(signal.reason);
445
- };
446
- signal.addEventListener("abort", abort, { once: true });
447
- operation.then((value) => {
448
- signal.removeEventListener("abort", abort);
449
- if (signal.aborted) {
450
- if (value instanceof ReadableStream && !value.locked)
451
- value.cancel(signal.reason).catch(() => {
452
- return;
453
- });
454
- reject(signal.reason);
455
- } else
456
- resolve(value);
457
- }, (error) => {
458
- signal.removeEventListener("abort", abort);
459
- reject(error);
460
- });
461
- if (signal.aborted)
462
- abort();
463
- });
464
- }
465
- async function withPublicationDeadline(timeoutMs, caller, body) {
466
- caller?.throwIfAborted();
467
- const controller = new AbortController;
468
- const abort = () => controller.abort(caller?.reason);
469
- caller?.addEventListener("abort", abort, { once: true });
470
- const timer = setTimeout(() => controller.abort(new Error(`CLI publication exceeded ${timeoutMs} ms`)), timeoutMs);
471
- try {
472
- return await body(controller.signal);
473
- } finally {
474
- clearTimeout(timer);
475
- caller?.removeEventListener("abort", abort);
476
- }
477
- }
478
-
479
- // src/tools/cli/publication-assets.ts
480
- async function collectCliBytes(source, maxBytes, signal) {
481
- if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0)
482
- throw new RangeError("CLI asset byte cap must be a positive safe integer");
483
- const blocks = [];
484
- let total = 0;
485
- let filled = 0;
486
- let block;
487
- const consume = (chunk) => {
488
- signal?.throwIfAborted();
489
- if (!(chunk instanceof Uint8Array))
490
- throw new TypeError("CLI asset stream must contain Uint8Array chunks");
491
- if (total + chunk.byteLength > maxBytes)
492
- throw new RangeError(`CLI asset exceeds ${maxBytes} bytes`);
493
- for (let offset = 0;offset < chunk.byteLength; ) {
494
- if (!block || filled === block.length) {
495
- block = new Uint8Array(Math.min(64 * 1024, maxBytes - total));
496
- blocks.push(block);
497
- filled = 0;
498
- }
499
- const count = Math.min(chunk.byteLength - offset, block.length - filled);
500
- block.set(chunk.subarray(offset, offset + count), filled);
501
- filled += count;
502
- total += count;
503
- offset += count;
504
- }
505
- };
506
- if (source instanceof Uint8Array)
507
- consume(source);
508
- else {
509
- const reader = source.getReader();
510
- let chunks = 0;
511
- try {
512
- for (;; ) {
513
- const next = signal ? await waitForPublication(reader.read(), signal) : await reader.read();
514
- if (next.done)
515
- break;
516
- consume(next.value);
517
- if (++chunks % 128 === 0) {
518
- if (signal)
519
- await waitForPublication(nextTurn(), signal);
520
- else
521
- await nextTurn();
522
- }
523
- }
524
- } catch (error) {
525
- reader.cancel(error).catch(() => {
526
- return;
527
- });
528
- throw error;
529
- } finally {
530
- reader.releaseLock();
531
- }
532
- }
533
- signal?.throwIfAborted();
534
- const bytes = new Uint8Array(total);
535
- let offset = 0;
536
- for (const chunk of blocks) {
537
- const count = Math.min(chunk.length, total - offset);
538
- bytes.set(chunk.subarray(0, count), offset);
539
- offset += count;
540
- }
541
- return bytes;
542
- }
543
- async function transformAsset(bytes, kind, maxBytes, signal) {
544
- const codec = kind === "gzip" ? createGzip() : createGunzip();
545
- const output = Readable.toWeb(codec);
546
- codec.end(bytes);
547
- try {
548
- return await collectCliBytes(output, maxBytes, signal);
549
- } finally {
550
- codec.destroy();
551
- }
552
- }
553
- function gzipCliAsset(bytes, maxBytes, signal) {
554
- return transformAsset(bytes, "gzip", maxBytes, signal);
555
- }
556
- async function decodeCliAsset(transferred, asset, maxBytes, signal) {
557
- if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0 || !Number.isSafeInteger(asset.size) || asset.size <= 0)
558
- throw new RangeError("CLI asset size and cap must be positive safe integers");
559
- if (asset.size > maxBytes)
560
- throw new RangeError(`CLI asset declared size exceeds ${maxBytes} bytes`);
561
- const bytes = asset.compression === "gzip" ? await transformAsset(transferred, "gunzip", asset.size, signal) : transferred;
562
- if (bytes.length !== asset.size)
563
- throw new Error(`CLI asset is ${bytes.length} bytes, manifest says ${asset.size}`);
564
- const sha256 = createHash("sha256").update(bytes).digest("hex");
565
- if (sha256 !== asset.sha256)
566
- throw new Error("CLI asset digest does not match the manifest (checksum mismatch) — refusing to install it");
567
- return { bytes, sha256 };
568
- }
569
-
570
- // src/tools/cli/publication-contract.ts
571
- import { isAbsolute } from "node:path";
572
- import { z as z3 } from "zod";
573
- var positive = z3.int().positive().max(Number.MAX_SAFE_INTEGER);
574
- var timer = positive.max(2147483647);
575
- var component = z3.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/);
576
- var PublicationTargetSchema = CliBuildTargetSchema.extend({
577
- platform: component,
578
- arch: component
579
- });
580
- var PublicationVersionSchema = z3.string().max(128).regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z]+(?:[.-][0-9A-Za-z]+)*)?(?:\+[0-9A-Za-z]+(?:[.-][0-9A-Za-z]+)*)?$/).refine((value) => {
581
- const core = value.split(/[+-]/)[0];
582
- if (!core || core.split(".").some((part) => !Number.isSafeInteger(Number(part))))
583
- return false;
584
- const prerelease = value.split("+")[0]?.split("-").slice(1).join("-");
585
- return !prerelease || prerelease.split(".").every((part) => !/^\d+$/.test(part) || part === "0" || !part.startsWith("0"));
586
- }, "version must use finite canonical semver numbers");
587
- var limitsSchema = z3.object({
588
- maxTargets: positive.default(16),
589
- maxManifestBytes: positive.default(256 * 1024),
590
- maxAssetBytes: positive.default(256 * 1024 * 1024),
591
- maxCompressedBytes: positive.default(256 * 1024 * 1024),
592
- maxDirectoryEntries: positive.default(128),
593
- maxStoredVersions: positive.min(3).default(16),
594
- lockTimeoutMs: timer.default(1e4),
595
- timeoutMs: timer.default(600000)
596
- });
597
- var dataSchema = CliBuildManifestSchema.pick({
598
- name: true,
599
- version: true,
600
- commit: true
601
- }).extend({
602
- name: component,
603
- version: PublicationVersionSchema,
604
- commit: z3.string().min(1).max(128),
605
- storageRoot: z3.string().min(1).refine(isAbsolute, "storageRoot must be absolute"),
606
- baseUrl: z3.url().refine((raw) => {
607
- const url = new URL(raw);
608
- return ["http:", "https:"].includes(url.protocol) && !url.username && !url.password && !url.search && !url.hash;
609
- }, "baseUrl must be an http(s) directory URL without credentials/query/fragment"),
610
- targets: z3.array(PublicationTargetSchema).min(1),
611
- limits: limitsSchema.prefault({}),
612
- retention: positive.min(2).default(2)
613
- });
614
- var phaseSchema = z3.enum(["prepare", "build", "commit", "promote"]);
615
- function publicationData(options) {
616
- const data = dataSchema.parse(options);
617
- if (data.targets.length > data.limits.maxTargets)
618
- throw new RangeError("CLI publication target cap exceeded");
619
- if (data.targets.length + 1 > data.limits.maxDirectoryEntries)
620
- throw new RangeError("CLI version layout exceeds directory entry cap");
621
- if (data.retention >= data.limits.maxStoredVersions)
622
- throw new RangeError("retention must leave one recovery slot below maxStoredVersions");
623
- const names = data.targets.map((target) => assetFilename(data.name, target));
624
- if (new Set(names).size !== names.length)
625
- throw new TypeError("CLI publication targets must be unique");
626
- if (typeof options.admit !== "function" || typeof options.build !== "function")
627
- throw new TypeError("CLI publication needs build and admit callbacks");
628
- return data;
629
- }
630
- function assetFilename(name, target) {
631
- return `${name}-${target.platform}-${target.arch}.gz`;
632
- }
633
- function assetUrl(baseUrl, version, filename) {
634
- return new URL(`${encodeURIComponent(version)}/${encodeURIComponent(filename)}`, `${baseUrl.replace(/\/+$/, "")}/`).toString();
635
- }
636
-
637
- // src/tools/cli/publication-storage.ts
638
- import { lstat, mkdir, open, opendir, realpath, rm } from "node:fs/promises";
639
- import { join as join2, resolve } from "node:path";
640
- import { z as z4 } from "zod";
641
- async function directoryGeneration(path) {
642
- const info = await lstat(path);
643
- if (!info.isDirectory() || info.isSymbolicLink())
644
- throw new Error("CLI storage directory must not be a link or non-directory");
645
- return { dev: info.dev, ino: info.ino };
646
- }
647
- async function assertDirectory(path, generation) {
648
- const current = await directoryGeneration(path);
649
- if (current.dev !== generation.dev || current.ino !== generation.ino)
650
- throw new Error("CLI storage directory generation changed");
651
- }
652
- async function bindPublicationStorage(data, signal) {
653
- signal.throwIfAborted();
654
- if (process.platform === "win32")
655
- throw new Error("CLI publication needs directory durability, unsupported on Windows");
656
- const requested = resolve(data.storageRoot);
657
- try {
658
- await mkdir(requested, { mode: 448 });
659
- } catch (error) {
660
- if (!(error instanceof Error && ("code" in error) && error.code === "EEXIST"))
661
- throw error;
662
- }
663
- await directoryGeneration(requested);
664
- const root = await realpath(requested);
665
- const generation = await directoryGeneration(root);
666
- const files = await createManagedFileBoundary2({
667
- root,
668
- maxReadBytes: Math.max(data.limits.maxManifestBytes, data.limits.maxCompressedBytes),
669
- maxWriteBytes: Math.max(data.limits.maxManifestBytes, data.limits.maxCompressedBytes)
670
- });
671
- return {
672
- root,
673
- files,
674
- async assertRoot() {
675
- await assertDirectory(requested, generation);
676
- await assertDirectory(root, generation);
677
- }
678
- };
679
- }
680
- async function directoryNames(path, maxEntries, signal) {
681
- const names = [];
682
- const directory = await opendir(path);
683
- try {
684
- for await (const entry of directory) {
685
- signal.throwIfAborted();
686
- names.push(entry.name);
687
- if (names.length > maxEntries)
688
- throw new RangeError("CLI publication directory entry cap exceeded");
689
- }
690
- } finally {
691
- await directory.close().catch(() => {
692
- return;
693
- });
694
- }
695
- return names.sort();
696
- }
697
- async function readPublicationManifest(storage, path, data, signal) {
698
- try {
699
- const read = await storage.files.read(path, {
700
- rejectSymlinks: true,
701
- singleLink: true,
702
- stable: true,
703
- maxBytes: data.limits.maxManifestBytes,
704
- signal
705
- });
706
- return {
707
- manifest: CliBuildManifestSchema.parse(JSON.parse(new TextDecoder().decode(read.bytes))),
708
- bytes: read.bytes
709
- };
710
- } catch (error) {
711
- if (error instanceof ManagedFileError2 && error.code === "FILE_NOT_FOUND")
712
- return;
713
- throw error;
714
- }
715
- }
716
- async function verifyPublicationVersion(storage, record, data, signal, exactTargets) {
717
- const { manifest } = record;
718
- PublicationVersionSchema.parse(manifest.version);
719
- if (manifest.name !== data.name || manifest.assets.length === 0 || manifest.assets.length > data.limits.maxTargets)
720
- throw new Error("CLI version identity or target count is invalid");
721
- const directory = join2(storage.root, manifest.version);
722
- const generation = await directoryGeneration(directory);
723
- const expected = manifest.assets.map((asset) => assetFilename(data.name, asset));
724
- if (new Set(expected).size !== expected.length || manifest.assets.some((asset) => !PublicationTargetSchema.safeParse(asset).success || asset.compression !== "gzip"))
725
- throw new Error("CLI version targets or compression do not match publisher layout");
726
- if (exactTargets) {
727
- const requested = data.targets.map((target) => assetFilename(data.name, target)).sort();
728
- if (JSON.stringify(requested) !== JSON.stringify([...expected].sort()))
729
- throw new Error("CLI publication target set differs from existing version");
730
- }
731
- const names = await directoryNames(directory, data.limits.maxDirectoryEntries, signal);
732
- if (JSON.stringify(names) !== JSON.stringify([...expected, "manifest.json"].sort()))
733
- throw new Error("CLI version has unknown or missing files");
734
- const saved = await readPublicationManifest(storage, `${manifest.version}/manifest.json`, data, signal);
735
- if (!saved || !Buffer.from(saved.bytes).equals(Buffer.from(record.bytes)))
736
- throw new Error("CLI version manifest differs from publication");
737
- for (const asset of manifest.assets) {
738
- const file = assetFilename(data.name, asset);
739
- const url = new URL(asset.url);
740
- const suffix = `/${encodeURIComponent(manifest.version)}/${encodeURIComponent(file)}`;
741
- if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || !url.pathname.endsWith(suffix) || url.search || url.hash || exactTargets && asset.url !== assetUrl(data.baseUrl, manifest.version, file))
742
- throw new Error("CLI asset URL differs from owned version layout");
743
- const archived = await storage.files.read(`${manifest.version}/${file}`, {
744
- rejectSymlinks: true,
745
- singleLink: true,
746
- stable: true,
747
- maxBytes: data.limits.maxCompressedBytes,
748
- signal
749
- });
750
- await decodeCliAsset(archived.bytes, asset, data.limits.maxAssetBytes, signal);
751
- }
752
- await assertDirectory(directory, generation);
753
- }
754
- async function publicationHistory(storage, data, signal) {
755
- const history = [];
756
- for (const name of await directoryNames(storage.root, data.limits.maxDirectoryEntries, signal)) {
757
- if (!PublicationVersionSchema.safeParse(name).success)
758
- continue;
759
- const path = join2(storage.root, name);
760
- const info = await lstat(path);
761
- if (!info.isDirectory() || info.isSymbolicLink())
762
- continue;
763
- let record;
764
- try {
765
- record = await readPublicationManifest(storage, `${name}/manifest.json`, data, signal);
766
- } catch (error) {
767
- if (error instanceof SyntaxError || error instanceof z4.ZodError)
768
- continue;
769
- throw error;
770
- }
771
- if (!record || record.manifest.name !== data.name || record.manifest.version !== name)
772
- continue;
773
- await verifyPublicationVersion(storage, record, data, signal, false);
774
- history.push({ ...record, directory: path });
775
- if (history.length > data.limits.maxStoredVersions)
776
- throw new RangeError("CLI publication stored version cap exceeded");
777
- }
778
- return history;
779
- }
780
- async function syncPublicationDirectory(path) {
781
- const handle = await open(path, "r");
782
- try {
783
- await handle.sync();
784
- } finally {
785
- await handle.close();
786
- }
787
- }
788
- async function removePublicationVersion(storage, version, data, signal) {
789
- await storage.assertRoot();
790
- await verifyPublicationVersion(storage, version, data, signal, false);
791
- await rm(version.directory, { recursive: true });
792
- await syncPublicationDirectory(storage.root);
793
- }
794
-
795
- // src/tools/cli/update.ts
796
- import { createHash as createHash2, randomBytes } from "node:crypto";
797
- import { existsSync as existsSync3, readFileSync as readFileSync3, statSync as statSync2, unlinkSync } from "node:fs";
798
- import { basename, dirname, extname, join as join3 } from "node:path";
799
- var DEFAULT_CHECK_TIMEOUT_MS = 2000;
800
- var DEFAULT_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
801
- var DEFAULT_DOWNLOAD_TIMEOUT_MS = 120000;
802
- var DEFAULT_VERIFY_TIMEOUT_MS = 30000;
803
- var MANIFEST_MAX_BYTES = 256 * 1024;
804
- var DEFAULT_MAX_ASSET_BYTES = 256 * 1024 * 1024;
805
- function parseVersion(value) {
806
- const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/.exec(value.trim());
807
- if (!match)
808
- return;
809
- const numbers = [match[1], match[2], match[3]].map((part) => Number(part));
810
- if (numbers.some((part) => !Number.isFinite(part)))
811
- return;
812
- return { numbers, prerelease: match[4] };
813
- }
814
- function compareCliVersions(left, right) {
815
- const a = parseVersion(left);
816
- const b = parseVersion(right);
817
- if (!a || !b)
818
- return;
819
- for (let index = 0;index < 3; index++) {
820
- const difference = (a.numbers[index] ?? 0) - (b.numbers[index] ?? 0);
821
- if (difference !== 0)
822
- return difference < 0 ? -1 : 1;
823
- }
824
- if (a.prerelease === b.prerelease)
825
- return 0;
826
- if (a.prerelease === undefined)
827
- return 1;
828
- if (b.prerelease === undefined)
829
- return -1;
830
- const leftParts = a.prerelease.split(".");
831
- const rightParts = b.prerelease.split(".");
832
- for (let index = 0;index < Math.max(leftParts.length, rightParts.length); index++) {
833
- const leftPart = leftParts[index];
834
- const rightPart = rightParts[index];
835
- if (leftPart === rightPart)
836
- continue;
837
- if (leftPart === undefined)
838
- return -1;
839
- if (rightPart === undefined)
840
- return 1;
841
- const leftNumeric = /^\d+$/.test(leftPart);
842
- const rightNumeric = /^\d+$/.test(rightPart);
843
- if (leftNumeric !== rightNumeric)
844
- return leftNumeric ? -1 : 1;
845
- if (leftNumeric) {
846
- const leftDigits = leftPart.replace(/^0+(?=\d)/, "");
847
- const rightDigits = rightPart.replace(/^0+(?=\d)/, "");
848
- if (leftDigits.length !== rightDigits.length)
849
- return leftDigits.length < rightDigits.length ? -1 : 1;
850
- if (leftDigits === rightDigits)
851
- continue;
852
- return leftDigits < rightDigits ? -1 : 1;
853
- }
854
- return leftPart < rightPart ? -1 : 1;
855
- }
856
- return 0;
857
- }
858
- async function checkCliUpdate(config) {
859
- const now = config.now ?? Date.now();
860
- const interval = config.intervalMs ?? DEFAULT_CHECK_INTERVAL_MS;
861
- if (config.lastCheckedAt !== undefined && now - config.lastCheckedAt < interval) {
862
- return { status: "skipped", nextCheckAt: config.lastCheckedAt + interval };
863
- }
864
- try {
865
- const response = await fetchGuarded(new URL(config.manifestUrl), config.allowPrivateHosts ?? false, {
866
- timeoutMs: config.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS,
867
- bodyTimeoutMs: config.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS
868
- });
869
- if (!response.ok)
870
- return { status: "unknown", reason: `manifest responded ${response.status}` };
871
- const body = await readCapped(response, MANIFEST_MAX_BYTES);
872
- if (!body)
873
- return { status: "unknown", reason: "manifest is larger than expected" };
874
- const parsed = CliBuildManifestSchema.safeParse(JSON.parse(body.toString("utf8")));
875
- if (!parsed.success)
876
- return { status: "unknown", reason: "manifest did not validate" };
877
- const manifest = parsed.data;
878
- const order = compareCliVersions(config.currentVersion, manifest.version);
879
- if (order === undefined) {
880
- return {
881
- status: "unknown",
882
- reason: `cannot compare ${config.currentVersion} with ${manifest.version}`
883
- };
884
- }
885
- const verdict = verifyCliManifest(manifest, manifest.signature, config.trust);
886
- if (order >= 0)
887
- return { status: "current", version: manifest.version, signature: verdict };
888
- if (!cliSignatureAccepted(verdict)) {
889
- return { status: "unknown", reason: `manifest signature: ${verdict}` };
890
- }
891
- const asset = selectCliBuildAsset(manifest, config.target ?? currentCliBuildTarget());
892
- return {
893
- status: "outdated",
894
- version: manifest.version,
895
- manifest,
896
- ...asset && { asset },
897
- signature: verdict
898
- };
899
- } catch (error) {
900
- if (error instanceof PrivateAddressRefusal) {
901
- return {
902
- status: "unknown",
903
- reason: `${error.message} — the manifest endpoint is not public. Set ` + "`allowPrivateHosts` if it is your own deployment; the download keeps " + "its own setting, because an asset URL comes from the document."
904
- };
905
- }
906
- return {
907
- status: "unknown",
908
- reason: error instanceof Error ? error.message : String(error)
909
- };
910
- }
911
- }
912
- async function applyCliUpdate(config) {
913
- const target = config.targetPath ?? process.execPath;
914
- if (config.trust) {
915
- if (!config.manifest) {
916
- throw new Error("[stitchkit] update: a trust root needs the manifest the asset came from");
917
- }
918
- const verdict = verifyCliManifest(config.manifest, config.manifest.signature, config.trust);
919
- if (!cliSignatureAccepted(verdict)) {
920
- throw new Error(`[stitchkit] update: refusing to install — manifest signature ${verdict}`);
921
- }
922
- if (!config.manifest.assets.some((asset) => asset.sha256 === config.asset.sha256)) {
923
- throw new Error("[stitchkit] update: the asset is not one the signed manifest names");
924
- }
925
- }
926
- const response = await fetchGuarded(new URL(config.asset.url), config.allowPrivateHosts ?? false, {
927
- timeoutMs: config.timeoutMs ?? DEFAULT_DOWNLOAD_TIMEOUT_MS,
928
- bodyTimeoutMs: config.timeoutMs ?? DEFAULT_DOWNLOAD_TIMEOUT_MS
929
- });
930
- if (!response.ok) {
931
- throw new Error(`[stitchkit] update download responded ${response.status}`);
932
- }
933
- const transferred = await readCapped(response, config.maxBytes ?? DEFAULT_MAX_ASSET_BYTES);
934
- if (!transferred)
935
- throw new Error("[stitchkit] update download exceeded the size ceiling");
936
- const { bytes, sha256 } = await decodeCliAsset(transferred, config.asset, config.maxBytes ?? DEFAULT_MAX_ASSET_BYTES);
937
- if (config.verify)
938
- await verifyCandidate(target, bytes, config.verify, config.verifyTimeoutMs);
939
- const backup = config.backupPath ? keepReplacedBinary(target, config.backupPath) : undefined;
940
- writeFileAtomicSync2(target, bytes, { mode: 493 });
941
- return {
942
- path: target,
943
- bytes: bytes.length,
944
- sha256,
945
- ...backup && { backupPath: backup.path, backupSha256: backup.sha256 }
946
- };
947
- }
948
- async function verifyCandidate(target, bytes, verify, timeoutMs = DEFAULT_VERIFY_TIMEOUT_MS) {
949
- if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
950
- throw new RangeError("[stitchkit] update: verifyTimeoutMs must be a positive number");
951
- }
952
- const candidate = join3(dirname(target), `.${basename(target)}.candidate-${randomBytes(8).toString("hex")}${extname(target)}`);
953
- writeFileAtomicSync2(candidate, bytes, { mode: 493 });
954
- const controller = new AbortController;
955
- let timer;
956
- const deadline = new Promise((_, reject) => {
957
- timer = setTimeout(() => {
958
- const error = new Error(`verification did not finish within ${timeoutMs} ms`);
959
- controller.abort(error);
960
- reject(error);
961
- }, timeoutMs);
962
- });
963
- try {
964
- await Promise.race([
965
- Promise.resolve().then(() => verify(candidate, controller.signal)),
966
- deadline
967
- ]);
968
- } catch (error) {
969
- const reason = error instanceof Error ? error.message : String(error);
970
- throw new Error(`[stitchkit] update: the new build failed verification — ${reason}`, {
971
- cause: error
972
- });
973
- } finally {
974
- clearTimeout(timer);
975
- try {
976
- unlinkSync(candidate);
977
- } catch {}
978
- }
979
- }
980
- function keepReplacedBinary(target, backupPath) {
981
- if (!existsSync3(target))
982
- return;
983
- const previous = readFileSync3(target);
984
- writeFileAtomicSync2(backupPath, previous, { mode: statSync2(target).mode & 511 });
985
- return { path: backupPath, sha256: createHash2("sha256").update(previous).digest("hex") };
986
- }
987
- function rollbackCliUpdate(config) {
988
- const target = config.targetPath ?? process.execPath;
989
- if (!existsSync3(config.backupPath)) {
990
- throw new Error(`[stitchkit] rollback: no backup at ${config.backupPath}`);
991
- }
992
- const bytes = readFileSync3(config.backupPath);
993
- const sha256 = createHash2("sha256").update(bytes).digest("hex");
994
- if (sha256 !== config.expectedSha256) {
995
- throw new Error(`[stitchkit] rollback: backup digest ${sha256} does not match the expected ${config.expectedSha256} — refusing to restore it`);
996
- }
997
- writeFileAtomicSync2(target, bytes, { mode: statSync2(config.backupPath).mode & 511 });
998
- return { path: target, bytes: bytes.length, sha256 };
999
- }
1000
-
1001
- // src/tools/cli/publication.ts
1002
- var resultSchema = z5.object({
1003
- outcome: z5.enum(["published", "existing"]),
1004
- manifest: CliBuildManifestSchema
1005
- });
1006
- function trustPublication(manifest, options) {
1007
- const verdict = verifyCliManifest(manifest, manifest.signature, options.trust);
1008
- if (!cliSignatureAccepted(verdict))
1009
- throw new Error(`CLI publication manifest signature ${verdict}`);
1010
- if (options.signing && !manifest.signature)
1011
- throw new Error("CLI publication requires a signed manifest");
1012
- }
1013
- function sameManifest(left, right) {
1014
- return left === undefined ? right === undefined : right !== undefined && Buffer.from(left.bytes).equals(Buffer.from(right.bytes));
1015
- }
1016
- async function admission(options, data, phase, signal) {
1017
- signal.throwIfAborted();
1018
- await waitForPublication(Promise.resolve().then(() => {
1019
- signal.throwIfAborted();
1020
- return options.admit({
1021
- phase,
1022
- identity: Object.freeze({
1023
- name: data.name,
1024
- version: data.version,
1025
- commit: data.commit
1026
- }),
1027
- signal
1028
- });
1029
- }), signal);
1030
- }
1031
- async function unchanged(storage, prior, data, lock, signal) {
1032
- signal.throwIfAborted();
1033
- await lock.assertHeld();
1034
- await storage.assertRoot();
1035
- if (!sameManifest(prior, await readPublicationManifest(storage, "manifest.json", data, signal)))
1036
- throw new Error("CLI public manifest changed during publication");
1037
- }
1038
- function newest(versions) {
1039
- return [...versions].sort((a, b) => compareCliVersions(b.manifest.version, a.manifest.version) ?? 0);
1040
- }
1041
- async function retainVersions(storage, history, keep, count, data, lock, signal) {
1042
- const retained = newest(history).filter((item) => !keep.has(item.manifest.version));
1043
- const spare = Math.max(0, count - keep.size);
1044
- for (const version of retained.slice(spare)) {
1045
- await lock.assertHeld();
1046
- await removePublicationVersion(storage, version, data, signal);
1047
- }
1048
- }
1049
- async function promote(storage, record, prior, data, options, lock, signal) {
1050
- await admission(options, data, "promote", signal);
1051
- await verifyPublicationVersion(storage, record, data, signal, true);
1052
- trustPublication(record.manifest, options);
1053
- await unchanged(storage, prior, data, lock, signal);
1054
- const names = await directoryNames(storage.root, data.limits.maxDirectoryEntries, signal);
1055
- if (names.length + 1 > data.limits.maxDirectoryEntries)
1056
- throw new RangeError("CLI publication directory entry cap leaves no pointer space");
1057
- signal.throwIfAborted();
1058
- await writeFileAtomic2(join4(storage.root, "manifest.json"), record.bytes, {
1059
- mode: 420,
1060
- durability: "directory"
1061
- });
1062
- const current = await readPublicationManifest(storage, "manifest.json", data, signal);
1063
- if (!sameManifest(record, current))
1064
- throw new Error("CLI public manifest readback differs after promotion");
1065
- }
1066
- async function buildVersion(storage, data, options, lock, prior, signal) {
1067
- const names = await directoryNames(storage.root, data.limits.maxDirectoryEntries, signal);
1068
- if (names.length + 2 > data.limits.maxDirectoryEntries)
1069
- throw new RangeError("CLI publication directory entry cap leaves no commit space");
1070
- const staged = await mkdtemp(join4(storage.root, ".publish-"));
1071
- const generation = await directoryGeneration(staged);
1072
- let committed = false;
1073
- try {
1074
- const files = await createManagedFileBoundary2({
1075
- root: staged,
1076
- maxWriteBytes: Math.max(data.limits.maxCompressedBytes, data.limits.maxManifestBytes)
1077
- });
1078
- const stamp = Object.freeze({
1079
- version: data.version,
1080
- commit: data.commit,
1081
- builtAt: new Date().toISOString()
1082
- });
1083
- const assets = [];
1084
- for (const target of data.targets) {
1085
- await admission(options, data, "build", signal);
1086
- signal.throwIfAborted();
1087
- const source = await waitForPublication(Promise.resolve().then(() => {
1088
- signal.throwIfAborted();
1089
- return options.build({ target: Object.freeze({ ...target }), stamp, signal });
1090
- }), signal);
1091
- if (!(source instanceof Uint8Array) && !(source instanceof ReadableStream))
1092
- throw new TypeError("CLI builder must return bytes or a stream");
1093
- const bytes = await collectCliBytes(source, data.limits.maxAssetBytes, signal);
1094
- if (bytes.byteLength === 0)
1095
- throw new Error("CLI asset must not be empty");
1096
- const archived = await gzipCliAsset(bytes, data.limits.maxCompressedBytes, signal);
1097
- await lock.assertHeld();
1098
- await storage.assertRoot();
1099
- await assertDirectory(staged, generation);
1100
- const file = assetFilename(data.name, target);
1101
- await files.write(file, archived, { durable: true, signal });
1102
- assets.push({
1103
- ...target,
1104
- compression: "gzip",
1105
- size: bytes.byteLength,
1106
- sha256: createHash3("sha256").update(bytes).digest("hex"),
1107
- url: assetUrl(data.baseUrl, data.version, file)
1108
- });
1109
- }
1110
- const manifest = CliBuildManifestSchema.parse({ name: data.name, ...stamp, assets });
1111
- if (options.signing)
1112
- manifest.signature = signCliManifest(manifest, options.signing);
1113
- trustPublication(manifest, options);
1114
- const bytes = new TextEncoder().encode(`${JSON.stringify(manifest)}
1115
- `);
1116
- if (bytes.byteLength > data.limits.maxManifestBytes)
1117
- throw new RangeError("CLI publication manifest byte cap exceeded");
1118
- await assertDirectory(staged, generation);
1119
- await files.write("manifest.json", bytes, {
1120
- durable: true,
1121
- maxBytes: data.limits.maxManifestBytes,
1122
- signal
1123
- });
1124
- await admission(options, data, "commit", signal);
1125
- await unchanged(storage, prior, data, lock, signal);
1126
- await assertDirectory(staged, generation);
1127
- try {
1128
- await lstat2(join4(storage.root, data.version));
1129
- throw new Error("CLI version directory already exists");
1130
- } catch (error) {
1131
- if (!(error instanceof Error && ("code" in error) && error.code === "ENOENT"))
1132
- throw error;
1133
- }
1134
- signal.throwIfAborted();
1135
- await rename(staged, join4(storage.root, data.version));
1136
- committed = true;
1137
- await syncPublicationDirectory(storage.root);
1138
- return { manifest, bytes };
1139
- } catch (error) {
1140
- if (!committed) {
1141
- try {
1142
- await storage.assertRoot();
1143
- await assertDirectory(staged, generation);
1144
- await rm2(staged, { recursive: true });
1145
- } catch (cleanupError) {
1146
- throw new AggregateError([error, cleanupError], "CLI publication failed and safe staging cleanup was refused");
1147
- }
1148
- }
1149
- if (committed && !(error instanceof AtomicFilePublicationError2))
1150
- throw new Error("CLI version committed; publication outcome must be checked", {
1151
- cause: error
1152
- });
1153
- throw error;
1154
- }
1155
- }
1156
- async function publishLocked(storage, data, options, lock, signal) {
1157
- await lock.assertHeld();
1158
- await admission(options, data, "prepare", signal);
1159
- const prior = await readPublicationManifest(storage, "manifest.json", data, signal);
1160
- if (prior && prior.manifest.name !== data.name)
1161
- throw new Error("CLI public manifest belongs to another CLI");
1162
- const history = await publicationHistory(storage, data, signal);
1163
- const candidate = {
1164
- name: data.name,
1165
- version: data.version,
1166
- commit: data.commit,
1167
- builtAt: new Date().toISOString(),
1168
- assets: []
1169
- };
1170
- assertCliPublishable([...prior ? [prior.manifest] : [], ...history.map((item) => item.manifest)], candidate);
1171
- if (prior) {
1172
- await verifyPublicationVersion(storage, prior, data, signal, prior.manifest.version === data.version);
1173
- trustPublication(prior.manifest, options);
1174
- const order = compareCliVersions(data.version, prior.manifest.version) ?? -1;
1175
- if (order < 0 || order === 0 && data.version !== prior.manifest.version)
1176
- throw new Error("CLI publication downgrade or non-advancing version refused");
1177
- if (prior.manifest.version === data.version) {
1178
- await admission(options, data, "promote", signal);
1179
- await verifyPublicationVersion(storage, prior, data, signal, true);
1180
- await unchanged(storage, prior, data, lock, signal);
1181
- return { outcome: "existing", manifest: prior.manifest };
1182
- }
1183
- }
1184
- let record = history.find((item) => item.manifest.version === data.version);
1185
- if (record) {
1186
- await verifyPublicationVersion(storage, record, data, signal, true);
1187
- trustPublication(record.manifest, options);
1188
- } else {
1189
- const protect = new Set(prior ? [prior.manifest.version] : []);
1190
- const previous = newest(history).find((item) => prior && (compareCliVersions(item.manifest.version, prior.manifest.version) ?? 0) < 0);
1191
- if (previous)
1192
- protect.add(previous.manifest.version);
1193
- await retainVersions(storage, history, protect, data.limits.maxStoredVersions - 1, data, lock, signal);
1194
- record = {
1195
- ...await buildVersion(storage, data, options, lock, prior, signal),
1196
- directory: join4(storage.root, data.version)
1197
- };
1198
- }
1199
- try {
1200
- await promote(storage, record, prior, data, options, lock, signal);
1201
- const updated = await publicationHistory(storage, data, signal);
1202
- await retainVersions(storage, updated, new Set([data.version, ...prior ? [prior.manifest.version] : []]), data.retention, data, lock, signal);
1203
- } catch (error) {
1204
- if (error instanceof AtomicFilePublicationError2)
1205
- throw error;
1206
- throw new Error("CLI version committed; publication outcome must be checked", {
1207
- cause: error
1208
- });
1209
- }
1210
- return { outcome: "published", manifest: record.manifest };
1211
- }
1212
- async function publishCli(options) {
1213
- const data = publicationData(options);
1214
- return withPublicationDeadline(data.limits.timeoutMs, options.signal, async (signal) => {
1215
- const storage = await bindPublicationStorage(data, signal);
1216
- return withExclusiveLock2(join4(storage.root, ".publication.lock"), (lock) => publishLocked(storage, data, options, lock, signal), { timeoutMs: data.limits.lockTimeoutMs, signal, label: "CLI publication" });
1217
- });
1218
- }
1219
313
  // src/tools/cli/stream.ts
1220
- import { z as z6 } from "zod";
1221
- var LineSchema = z6.object({
1222
- id: z6.string().min(1),
1223
- command: z6.string().min(1),
1224
- args: z6.record(z6.string(), z6.unknown()).default({})
314
+ import { z } from "zod";
315
+ var LineSchema = z.object({
316
+ id: z.string().min(1),
317
+ command: z.string().min(1),
318
+ args: z.record(z.string(), z.unknown()).default({})
1225
319
  });
1226
320
  async function* readStdinLines(source = process.stdin) {
1227
321
  const decoder = new TextDecoder;
@@ -1293,7 +387,7 @@ function defineCliStreamCommand(config) {
1293
387
  return defineCliCommand2({
1294
388
  name: config.name ?? "stream",
1295
389
  description: config.description ?? "Run one operation per JSON line of stdin, answering each",
1296
- input: z6.object({}),
390
+ input: z.object({}),
1297
391
  handler: async (context) => {
1298
392
  const invoker = typeof config.invoker === "function" ? await config.invoker() : config.invoker;
1299
393
  await runCliStream(invoker, (config.readLines ?? readStdinLines)(), (answer) => {
@@ -1307,8 +401,8 @@ function defineCliBatchCommand(config) {
1307
401
  return defineCliCommand2({
1308
402
  name: config.name ?? "batch",
1309
403
  description: config.description ?? "Run one operation per JSON line of stdin, resuming from a checkpoint",
1310
- input: z6.object({
1311
- checkpoint: z6.string().optional()
404
+ input: z.object({
405
+ checkpoint: z.string().optional()
1312
406
  }),
1313
407
  handler: async (context) => {
1314
408
  const invoker = typeof config.invoker === "function" ? await config.invoker() : config.invoker;
@@ -1349,43 +443,42 @@ function defineCliBatchCommand(config) {
1349
443
  }
1350
444
  export {
1351
445
  CliArgumentError2 as CliArgumentError,
1352
- CliBuildAssetSchema,
1353
- CliBuildManifestSchema,
1354
- CliBuildSignatureSchema,
1355
- CliBuildStampSchema,
1356
- CliBuildTargetSchema,
446
+ CliBuildAssetSchema2 as CliBuildAssetSchema,
447
+ CliBuildManifestSchema2 as CliBuildManifestSchema,
448
+ CliBuildSignatureSchema2 as CliBuildSignatureSchema,
449
+ CliBuildStampSchema2 as CliBuildStampSchema,
450
+ CliBuildTargetSchema2 as CliBuildTargetSchema,
1357
451
  CliProfileError,
1358
452
  DEFAULT_EXIT_CODES2 as DEFAULT_EXIT_CODES,
1359
- applyCliUpdate,
1360
- assertCliPublishable,
1361
- checkCliUpdate,
453
+ applyCliUpdate2 as applyCliUpdate,
454
+ assertCliPublishable2 as assertCliPublishable,
455
+ checkCliUpdate2 as checkCliUpdate,
1362
456
  cliExitCode2 as cliExitCode,
1363
457
  cliInvocationResult2 as cliInvocationResult,
1364
- cliManifestSigningPayload,
1365
- cliSignatureAccepted,
458
+ cliManifestSigningPayload2 as cliManifestSigningPayload,
459
+ cliSignatureAccepted2 as cliSignatureAccepted,
1366
460
  coerceJsonArgs2 as coerceJsonArgs,
1367
- compareCliVersions,
461
+ compareCliVersions2 as compareCliVersions,
1368
462
  createCli2 as createCli,
1369
463
  createCliInvoker2 as createCliInvoker,
1370
464
  createCliProfileStore,
1371
- currentCliBuildTarget,
465
+ currentCliBuildTarget2 as currentCliBuildTarget,
1372
466
  defineCliBatchCommand,
1373
467
  defineCliCommand2 as defineCliCommand,
1374
468
  defineCliStreamCommand,
1375
469
  emitResult2 as emitResult,
1376
470
  extractCliGlobalOptions2 as extractCliGlobalOptions,
1377
- formatCliBuildStamp,
471
+ formatCliBuildStamp2 as formatCliBuildStamp,
1378
472
  parseCliArgs2 as parseCliArgs,
1379
473
  pollUntilDone2 as pollUntilDone,
1380
- publishCli,
1381
474
  readCliCheckpoint,
1382
475
  renderCliInstaller,
1383
476
  renderCliView2 as renderCliView,
1384
- rollbackCliUpdate,
477
+ rollbackCliUpdate2 as rollbackCliUpdate,
1385
478
  routeCliArgv2 as routeCliArgv,
1386
479
  runCliStream,
1387
- selectCliBuildAsset,
1388
- signCliManifest,
1389
- verifyCliManifest,
480
+ selectCliBuildAsset2 as selectCliBuildAsset,
481
+ signCliManifest2 as signCliManifest,
482
+ verifyCliManifest2 as verifyCliManifest,
1390
483
  writeCliCheckpoint
1391
484
  };