stitchkit 0.104.1 → 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 +381 -12
  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 +196 -56
  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 +104 -21
  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 +22 -7
  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 +305 -154
  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 +1053 -405
  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
@@ -0,0 +1,455 @@
1
+ import {
2
+ withSignalDeadline
3
+ } from "./index-9tqbxv5p.js";
4
+ import {
5
+ fetchGuarded,
6
+ PrivateAddressRefusal,
7
+ readCapped
8
+ } from "./index-3h0ztg0z.js";
9
+ import {
10
+ raceAbort
11
+ } from "./index-b0kddvzw.js";
12
+ import {
13
+ writeFileAtomicSync2
14
+ } from "./index-ef8gdaq0.js";
15
+ import {
16
+ assertPositiveSafeInteger
17
+ } from "./index-0s4xebbg.js";
18
+ import {
19
+ serializeCanonicalJson
20
+ } from "./index-zsvzhjtk.js";
21
+
22
+ // src/tools/cli/signature.ts
23
+ import {
24
+ createPrivateKey,
25
+ createPublicKey,
26
+ sign as cryptoSign,
27
+ verify as cryptoVerify
28
+ } from "node:crypto";
29
+ import { z } from "zod";
30
+ var CliBuildSignatureSchema2 = z.object({
31
+ algorithm: z.literal("ed25519"),
32
+ keyId: z.string().min(1),
33
+ signature: z.string().min(1)
34
+ });
35
+ function cliManifestSigningPayload2(manifest) {
36
+ return serializeCanonicalJson({
37
+ name: manifest.name,
38
+ version: manifest.version,
39
+ commit: manifest.commit,
40
+ builtAt: manifest.builtAt,
41
+ assets: manifest.assets.map((asset) => ({
42
+ platform: asset.platform,
43
+ arch: asset.arch,
44
+ compression: asset.compression,
45
+ size: asset.size,
46
+ sha256: asset.sha256
47
+ }))
48
+ });
49
+ }
50
+ function publicKeyOf(material) {
51
+ const trimmed = material.trim();
52
+ if (trimmed.includes("BEGIN PUBLIC KEY"))
53
+ return createPublicKey(trimmed);
54
+ const raw = Buffer.from(trimmed, "base64");
55
+ if (raw.length !== 32) {
56
+ throw new Error("[stitchkit] an Ed25519 public key is 32 bytes or SPKI PEM");
57
+ }
58
+ const spki = Buffer.concat([Buffer.from("302a300506032b6570032100", "hex"), raw]);
59
+ return createPublicKey({ key: spki, format: "der", type: "spki" });
60
+ }
61
+ function signCliManifest2(manifest, options) {
62
+ const signature = cryptoSign(null, Buffer.from(cliManifestSigningPayload2(manifest), "utf8"), createPrivateKey(typeof options.privateKey === "string" ? options.privateKey : { key: Buffer.from(options.privateKey), format: "der", type: "pkcs8" }));
63
+ return {
64
+ algorithm: "ed25519",
65
+ keyId: options.keyId,
66
+ signature: signature.toString("base64")
67
+ };
68
+ }
69
+ function verifyCliManifest2(manifest, signature, trust) {
70
+ const keys = trust?.keys;
71
+ if (!keys || Object.keys(keys).length === 0)
72
+ return "unenforced";
73
+ if (!signature)
74
+ return "missing";
75
+ const material = Object.hasOwn(keys, signature.keyId) ? keys[signature.keyId] : undefined;
76
+ if (material === undefined)
77
+ return "unknown-key";
78
+ try {
79
+ const ok = cryptoVerify(null, Buffer.from(cliManifestSigningPayload2(manifest), "utf8"), publicKeyOf(material), Buffer.from(signature.signature, "base64"));
80
+ return ok ? "valid" : "invalid";
81
+ } catch {
82
+ return "invalid";
83
+ }
84
+ }
85
+ function cliSignatureAccepted2(verdict) {
86
+ return verdict === "valid" || verdict === "unenforced";
87
+ }
88
+
89
+ // src/tools/cli/manifest.ts
90
+ import { z as z2 } from "zod";
91
+ var CliBuildTargetSchema2 = z2.object({
92
+ platform: z2.string().min(1),
93
+ arch: z2.string().min(1)
94
+ });
95
+ var CliBuildAssetSchema2 = CliBuildTargetSchema2.extend({
96
+ url: z2.url(),
97
+ compression: z2.enum(["gzip", "none"]).default("none"),
98
+ size: z2.int().positive(),
99
+ sha256: z2.string().regex(/^[0-9a-f]{64}$/, "sha256 must be 64 lowercase hex characters")
100
+ });
101
+ var CliBuildManifestSchema2 = z2.object({
102
+ name: z2.string().min(1),
103
+ version: z2.string().min(1),
104
+ commit: z2.string().min(1),
105
+ builtAt: z2.iso.datetime(),
106
+ assets: z2.array(CliBuildAssetSchema2),
107
+ signature: CliBuildSignatureSchema2.optional()
108
+ });
109
+ var CliBuildStampSchema2 = z2.object({
110
+ version: z2.string().min(1),
111
+ commit: z2.string().min(1),
112
+ builtAt: z2.iso.datetime()
113
+ });
114
+ function formatCliBuildStamp2(stamp, name) {
115
+ const prefix = name ? `${name} ` : "";
116
+ return `${prefix}${stamp.version} (${stamp.commit.slice(0, 12)}, built ${stamp.builtAt})`;
117
+ }
118
+ function currentCliBuildTarget2() {
119
+ return { platform: process.platform, arch: process.arch };
120
+ }
121
+ function selectCliBuildAsset2(manifest, target = currentCliBuildTarget2()) {
122
+ return manifest.assets.find((asset) => asset.platform === target.platform && asset.arch === target.arch);
123
+ }
124
+ function isManifestList(value) {
125
+ return Array.isArray(value);
126
+ }
127
+ function assertCliPublishable2(previous, next) {
128
+ const published = previous === undefined ? [] : isManifestList(previous) ? previous : [previous];
129
+ for (const candidate of published) {
130
+ if (candidate.version !== next.version)
131
+ continue;
132
+ if (candidate.commit === next.commit)
133
+ continue;
134
+ 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`);
135
+ }
136
+ }
137
+
138
+ // src/tools/cli/update.ts
139
+ import { createHash as createHash2, randomBytes } from "node:crypto";
140
+ import { existsSync, readFileSync, statSync, unlinkSync } from "node:fs";
141
+ import { basename, dirname, extname, join } from "node:path";
142
+
143
+ // src/tools/cli/publication-assets.ts
144
+ import { createHash } from "node:crypto";
145
+ import { Readable } from "node:stream";
146
+ import { setImmediate as nextTurn } from "node:timers/promises";
147
+ import { createGunzip, createGzip } from "node:zlib";
148
+
149
+ // src/tools/cli/publication-control.ts
150
+ function waitForPublication(operation, signal) {
151
+ return raceAbort(operation, signal, (value) => {
152
+ if (value instanceof ReadableStream && !value.locked)
153
+ value.cancel(signal.reason).catch(() => {
154
+ return;
155
+ });
156
+ });
157
+ }
158
+ function withPublicationDeadline(timeoutMs, caller, body) {
159
+ return withSignalDeadline(timeoutMs, caller, () => new Error(`CLI publication exceeded ${timeoutMs} ms`), body);
160
+ }
161
+
162
+ // src/tools/cli/publication-assets.ts
163
+ async function collectCliBytes(source, maxBytes, signal) {
164
+ assertPositiveSafeInteger("CLI asset byte cap", maxBytes, RangeError);
165
+ const blocks = [];
166
+ let total = 0;
167
+ let filled = 0;
168
+ let block;
169
+ const consume = (chunk) => {
170
+ signal?.throwIfAborted();
171
+ if (!(chunk instanceof Uint8Array))
172
+ throw new TypeError("CLI asset stream must contain Uint8Array chunks");
173
+ if (total + chunk.byteLength > maxBytes)
174
+ throw new RangeError(`CLI asset exceeds ${maxBytes} bytes`);
175
+ for (let offset = 0;offset < chunk.byteLength; ) {
176
+ if (!block || filled === block.length) {
177
+ block = new Uint8Array(Math.min(64 * 1024, maxBytes - total));
178
+ blocks.push(block);
179
+ filled = 0;
180
+ }
181
+ const count = Math.min(chunk.byteLength - offset, block.length - filled);
182
+ block.set(chunk.subarray(offset, offset + count), filled);
183
+ filled += count;
184
+ total += count;
185
+ offset += count;
186
+ }
187
+ };
188
+ if (source instanceof Uint8Array)
189
+ consume(source);
190
+ else {
191
+ const reader = source.getReader();
192
+ let chunks = 0;
193
+ try {
194
+ for (;; ) {
195
+ const next = signal ? await waitForPublication(reader.read(), signal) : await reader.read();
196
+ if (next.done)
197
+ break;
198
+ consume(next.value);
199
+ if (++chunks % 128 === 0) {
200
+ if (signal)
201
+ await waitForPublication(nextTurn(), signal);
202
+ else
203
+ await nextTurn();
204
+ }
205
+ }
206
+ } catch (error) {
207
+ reader.cancel(error).catch(() => {
208
+ return;
209
+ });
210
+ throw error;
211
+ } finally {
212
+ reader.releaseLock();
213
+ }
214
+ }
215
+ signal?.throwIfAborted();
216
+ const bytes = new Uint8Array(total);
217
+ let offset = 0;
218
+ for (const chunk of blocks) {
219
+ const count = Math.min(chunk.length, total - offset);
220
+ bytes.set(chunk.subarray(0, count), offset);
221
+ offset += count;
222
+ }
223
+ return bytes;
224
+ }
225
+ async function transformAsset(bytes, kind, maxBytes, signal) {
226
+ const codec = kind === "gzip" ? createGzip() : createGunzip();
227
+ const output = Readable.toWeb(codec);
228
+ codec.end(bytes);
229
+ try {
230
+ return await collectCliBytes(output, maxBytes, signal);
231
+ } finally {
232
+ codec.destroy();
233
+ }
234
+ }
235
+ function gzipCliAsset(bytes, maxBytes, signal) {
236
+ return transformAsset(bytes, "gzip", maxBytes, signal);
237
+ }
238
+ async function decodeCliAsset(transferred, asset, maxBytes, signal) {
239
+ assertPositiveSafeInteger("CLI asset byte cap", maxBytes, RangeError);
240
+ assertPositiveSafeInteger("CLI asset size", asset.size, RangeError);
241
+ if (asset.size > maxBytes)
242
+ throw new RangeError(`CLI asset declared size exceeds ${maxBytes} bytes`);
243
+ const bytes = asset.compression === "gzip" ? await transformAsset(transferred, "gunzip", asset.size, signal) : transferred;
244
+ if (bytes.length !== asset.size)
245
+ throw new Error(`CLI asset is ${bytes.length} bytes, manifest says ${asset.size}`);
246
+ const sha256 = createHash("sha256").update(bytes).digest("hex");
247
+ if (sha256 !== asset.sha256)
248
+ throw new Error("CLI asset digest does not match the manifest (checksum mismatch) — refusing to install it");
249
+ return { bytes, sha256 };
250
+ }
251
+
252
+ // src/tools/cli/update.ts
253
+ var DEFAULT_CHECK_TIMEOUT_MS = 2000;
254
+ var DEFAULT_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
255
+ var DEFAULT_DOWNLOAD_TIMEOUT_MS = 120000;
256
+ var DEFAULT_VERIFY_TIMEOUT_MS = 30000;
257
+ var MANIFEST_MAX_BYTES = 256 * 1024;
258
+ var DEFAULT_MAX_ASSET_BYTES = 256 * 1024 * 1024;
259
+ function parseVersion(value) {
260
+ const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/.exec(value.trim());
261
+ if (!match)
262
+ return;
263
+ const numbers = [match[1], match[2], match[3]].map((part) => Number(part));
264
+ if (numbers.some((part) => !Number.isFinite(part)))
265
+ return;
266
+ return { numbers, prerelease: match[4] };
267
+ }
268
+ function compareCliVersions2(left, right) {
269
+ const a = parseVersion(left);
270
+ const b = parseVersion(right);
271
+ if (!a || !b)
272
+ return;
273
+ for (let index = 0;index < 3; index++) {
274
+ const difference = (a.numbers[index] ?? 0) - (b.numbers[index] ?? 0);
275
+ if (difference !== 0)
276
+ return difference < 0 ? -1 : 1;
277
+ }
278
+ if (a.prerelease === b.prerelease)
279
+ return 0;
280
+ if (a.prerelease === undefined)
281
+ return 1;
282
+ if (b.prerelease === undefined)
283
+ return -1;
284
+ const leftParts = a.prerelease.split(".");
285
+ const rightParts = b.prerelease.split(".");
286
+ for (let index = 0;index < Math.max(leftParts.length, rightParts.length); index++) {
287
+ const leftPart = leftParts[index];
288
+ const rightPart = rightParts[index];
289
+ if (leftPart === rightPart)
290
+ continue;
291
+ if (leftPart === undefined)
292
+ return -1;
293
+ if (rightPart === undefined)
294
+ return 1;
295
+ const leftNumeric = /^\d+$/.test(leftPart);
296
+ const rightNumeric = /^\d+$/.test(rightPart);
297
+ if (leftNumeric !== rightNumeric)
298
+ return leftNumeric ? -1 : 1;
299
+ if (leftNumeric) {
300
+ const leftDigits = leftPart.replace(/^0+(?=\d)/, "");
301
+ const rightDigits = rightPart.replace(/^0+(?=\d)/, "");
302
+ if (leftDigits.length !== rightDigits.length)
303
+ return leftDigits.length < rightDigits.length ? -1 : 1;
304
+ if (leftDigits === rightDigits)
305
+ continue;
306
+ return leftDigits < rightDigits ? -1 : 1;
307
+ }
308
+ return leftPart < rightPart ? -1 : 1;
309
+ }
310
+ return 0;
311
+ }
312
+ async function checkCliUpdate2(config) {
313
+ const now = config.now ?? Date.now();
314
+ const interval = config.intervalMs ?? DEFAULT_CHECK_INTERVAL_MS;
315
+ if (config.lastCheckedAt !== undefined && now - config.lastCheckedAt < interval) {
316
+ return { status: "skipped", nextCheckAt: config.lastCheckedAt + interval };
317
+ }
318
+ try {
319
+ const response = await fetchGuarded(new URL(config.manifestUrl), config.allowPrivateHosts ?? false, {
320
+ timeoutMs: config.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS,
321
+ bodyTimeoutMs: config.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS
322
+ });
323
+ if (!response.ok)
324
+ return { status: "unknown", reason: `manifest responded ${response.status}` };
325
+ const body = await readCapped(response, MANIFEST_MAX_BYTES);
326
+ if (!body)
327
+ return { status: "unknown", reason: "manifest is larger than expected" };
328
+ const parsed = CliBuildManifestSchema2.safeParse(JSON.parse(body.toString("utf8")));
329
+ if (!parsed.success)
330
+ return { status: "unknown", reason: "manifest did not validate" };
331
+ const manifest = parsed.data;
332
+ const order = compareCliVersions2(config.currentVersion, manifest.version);
333
+ if (order === undefined) {
334
+ return {
335
+ status: "unknown",
336
+ reason: `cannot compare ${config.currentVersion} with ${manifest.version}`
337
+ };
338
+ }
339
+ const verdict = verifyCliManifest2(manifest, manifest.signature, config.trust);
340
+ if (order >= 0)
341
+ return { status: "current", version: manifest.version, signature: verdict };
342
+ if (!cliSignatureAccepted2(verdict)) {
343
+ return { status: "unknown", reason: `manifest signature: ${verdict}` };
344
+ }
345
+ const asset = selectCliBuildAsset2(manifest, config.target ?? currentCliBuildTarget2());
346
+ return {
347
+ status: "outdated",
348
+ version: manifest.version,
349
+ manifest,
350
+ ...asset && { asset },
351
+ signature: verdict
352
+ };
353
+ } catch (error) {
354
+ if (error instanceof PrivateAddressRefusal) {
355
+ return {
356
+ status: "unknown",
357
+ 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."
358
+ };
359
+ }
360
+ return {
361
+ status: "unknown",
362
+ reason: error instanceof Error ? error.message : String(error)
363
+ };
364
+ }
365
+ }
366
+ async function applyCliUpdate2(config) {
367
+ const target = config.targetPath ?? process.execPath;
368
+ if (config.trust) {
369
+ if (!config.manifest) {
370
+ throw new Error("[stitchkit] update: a trust root needs the manifest the asset came from");
371
+ }
372
+ const verdict = verifyCliManifest2(config.manifest, config.manifest.signature, config.trust);
373
+ if (!cliSignatureAccepted2(verdict)) {
374
+ throw new Error(`[stitchkit] update: refusing to install — manifest signature ${verdict}`);
375
+ }
376
+ if (!config.manifest.assets.some((asset) => asset.sha256 === config.asset.sha256)) {
377
+ throw new Error("[stitchkit] update: the asset is not one the signed manifest names");
378
+ }
379
+ }
380
+ const response = await fetchGuarded(new URL(config.asset.url), config.allowPrivateHosts ?? false, {
381
+ timeoutMs: config.timeoutMs ?? DEFAULT_DOWNLOAD_TIMEOUT_MS,
382
+ bodyTimeoutMs: config.timeoutMs ?? DEFAULT_DOWNLOAD_TIMEOUT_MS
383
+ });
384
+ if (!response.ok) {
385
+ throw new Error(`[stitchkit] update download responded ${response.status}`);
386
+ }
387
+ const transferred = await readCapped(response, config.maxBytes ?? DEFAULT_MAX_ASSET_BYTES);
388
+ if (!transferred)
389
+ throw new Error("[stitchkit] update download exceeded the size ceiling");
390
+ const { bytes, sha256 } = await decodeCliAsset(transferred, config.asset, config.maxBytes ?? DEFAULT_MAX_ASSET_BYTES);
391
+ if (config.verify)
392
+ await verifyCandidate(target, bytes, config.verify, config.verifyTimeoutMs);
393
+ const backup = config.backupPath ? keepReplacedBinary(target, config.backupPath) : undefined;
394
+ writeFileAtomicSync2(target, bytes, { mode: 493 });
395
+ return {
396
+ path: target,
397
+ bytes: bytes.length,
398
+ sha256,
399
+ ...backup && { backupPath: backup.path, backupSha256: backup.sha256 }
400
+ };
401
+ }
402
+ async function verifyCandidate(target, bytes, verify, timeoutMs = DEFAULT_VERIFY_TIMEOUT_MS) {
403
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
404
+ throw new RangeError("[stitchkit] update: verifyTimeoutMs must be a positive number");
405
+ }
406
+ const candidate = join(dirname(target), `.${basename(target)}.candidate-${randomBytes(8).toString("hex")}${extname(target)}`);
407
+ writeFileAtomicSync2(candidate, bytes, { mode: 493 });
408
+ const controller = new AbortController;
409
+ let timer;
410
+ const deadline = new Promise((_, reject) => {
411
+ timer = setTimeout(() => {
412
+ const error = new Error(`verification did not finish within ${timeoutMs} ms`);
413
+ controller.abort(error);
414
+ reject(error);
415
+ }, timeoutMs);
416
+ });
417
+ try {
418
+ await Promise.race([
419
+ Promise.resolve().then(() => verify(candidate, controller.signal)),
420
+ deadline
421
+ ]);
422
+ } catch (error) {
423
+ const reason = error instanceof Error ? error.message : String(error);
424
+ throw new Error(`[stitchkit] update: the new build failed verification — ${reason}`, {
425
+ cause: error
426
+ });
427
+ } finally {
428
+ clearTimeout(timer);
429
+ try {
430
+ unlinkSync(candidate);
431
+ } catch {}
432
+ }
433
+ }
434
+ function keepReplacedBinary(target, backupPath) {
435
+ if (!existsSync(target))
436
+ return;
437
+ const previous = readFileSync(target);
438
+ writeFileAtomicSync2(backupPath, previous, { mode: statSync(target).mode & 511 });
439
+ return { path: backupPath, sha256: createHash2("sha256").update(previous).digest("hex") };
440
+ }
441
+ function rollbackCliUpdate2(config) {
442
+ const target = config.targetPath ?? process.execPath;
443
+ if (!existsSync(config.backupPath)) {
444
+ throw new Error(`[stitchkit] rollback: no backup at ${config.backupPath}`);
445
+ }
446
+ const bytes = readFileSync(config.backupPath);
447
+ const sha256 = createHash2("sha256").update(bytes).digest("hex");
448
+ if (sha256 !== config.expectedSha256) {
449
+ throw new Error(`[stitchkit] rollback: backup digest ${sha256} does not match the expected ${config.expectedSha256} — refusing to restore it`);
450
+ }
451
+ writeFileAtomicSync2(target, bytes, { mode: statSync(config.backupPath).mode & 511 });
452
+ return { path: target, bytes: bytes.length, sha256 };
453
+ }
454
+
455
+ export { CliBuildSignatureSchema2, cliManifestSigningPayload2, signCliManifest2, verifyCliManifest2, cliSignatureAccepted2, CliBuildTargetSchema2, CliBuildAssetSchema2, CliBuildManifestSchema2, CliBuildStampSchema2, formatCliBuildStamp2, currentCliBuildTarget2, selectCliBuildAsset2, assertCliPublishable2, waitForPublication, withPublicationDeadline, collectCliBytes, gzipCliAsset, decodeCliAsset, compareCliVersions2, checkCliUpdate2, applyCliUpdate2, rollbackCliUpdate2 };
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  isRetryableStatus2
3
- } from "./index-x928baz2.js";
3
+ } from "./index-j9gxbztg.js";
4
4
  import {
5
5
  rebuildObject,
6
6
  mergeSchemas,
7
7
  assertToolExtensionCompatible,
8
8
  projectToolSurface
9
- } from "./index-77nxk6ay.js";
9
+ } from "./index-r393tnfp.js";
10
10
  import {
11
11
  toolErrorFromResult,
12
12
  executeToolMethod
13
- } from "./index-2vnh05w4.js";
13
+ } from "./index-2k91mewf.js";
14
14
 
15
15
  // src/tools/mount.ts
16
16
  import { z } from "zod";
@@ -2,7 +2,7 @@ import {
2
2
  AppError2,
3
3
  badRequest2,
4
4
  forbidden2
5
- } from "./index-x928baz2.js";
5
+ } from "./index-j9gxbztg.js";
6
6
  import {
7
7
  isStreamCancellation,
8
8
  ownHttpStream,
@@ -14,7 +14,7 @@ import {
14
14
  recordedErrorMessage,
15
15
  normalizeError2,
16
16
  validateDeclaredOutput
17
- } from "./index-kb8styz3.js";
17
+ } from "./index-rpzewktb.js";
18
18
  import {
19
19
  resolveTraceContext2
20
20
  } from "./index-yex7eg1v.js";
@@ -34,7 +34,10 @@ import {
34
34
  import {
35
35
  bindContract,
36
36
  mediaTypeEssence
37
- } from "./index-g2j7pnak.js";
37
+ } from "./index-cmzvhhtd.js";
38
+ import {
39
+ assertPositiveSafeInteger
40
+ } from "./index-0s4xebbg.js";
38
41
  import {
39
42
  assertCorsConfig,
40
43
  isOriginAllowed,
@@ -900,16 +903,11 @@ function throwIfRequestAborted(req) {
900
903
  if (req.signal.aborted)
901
904
  throw requestAbortReason(req);
902
905
  }
903
- function assertJsonBodyLimit(maxBytes, owner) {
904
- if (maxBytes !== undefined && (!Number.isSafeInteger(maxBytes) || maxBytes <= 0)) {
905
- throw new Error(`${owner} must be a positive safe integer, received ${maxBytes}`);
906
- }
907
- }
908
906
  async function readRequestText(req, maxBytes) {
909
907
  throwIfRequestAborted(req);
910
908
  if (maxBytes === undefined)
911
909
  return req.text();
912
- assertJsonBodyLimit(maxBytes, "maxJsonBodyBytes");
910
+ assertPositiveSafeInteger("maxJsonBodyBytes", maxBytes, Error);
913
911
  const reader = req.body?.getReader();
914
912
  if (!reader)
915
913
  return "";
@@ -1117,7 +1115,10 @@ function contractStreamResponse(request, context, source, descriptor, operationA
1117
1115
  const parsed = descriptor.item.safeParse(next.value);
1118
1116
  if (!parsed.success) {
1119
1117
  console.error("[stitchkit] contract stream item failed validation:", parsed.error);
1120
- throw new AppError2("STREAM_ITEM_INVALID", "Stream item did not match its contract", 500);
1118
+ throw new AppError2("STREAM_ITEM_INVALID", {
1119
+ message: "Stream item did not match its contract",
1120
+ status: 500
1121
+ });
1121
1122
  }
1122
1123
  const item = parsed.data;
1123
1124
  const terminal = descriptor.terminal?.safeParse(item).success ?? false;
@@ -1126,14 +1127,20 @@ function contractStreamResponse(request, context, source, descriptor, operationA
1126
1127
  const frame = descriptor.framing === "item" ? item : { type: "data", data: item };
1127
1128
  if (encodedBytes(frame, format) > maxFrameBytes) {
1128
1129
  console.error(`[stitchkit] contract stream frame exceeded its ${maxFrameBytes} byte limit`);
1129
- throw new AppError2("STREAM_FRAME_TOO_LARGE", "Stream item exceeded its declared frame limit", 500);
1130
+ throw new AppError2("STREAM_FRAME_TOO_LARGE", {
1131
+ message: "Stream item exceeded its declared frame limit",
1132
+ status: 500
1133
+ });
1130
1134
  }
1131
1135
  yield frame;
1132
1136
  if (terminal && descriptor.completion === "terminal")
1133
1137
  return;
1134
1138
  }
1135
1139
  if (!terminalSeen) {
1136
- throw new AppError2("STREAM_TERMINAL_MISSING", "Stream completed before its declared terminal item", 500);
1140
+ throw new AppError2("STREAM_TERMINAL_MISSING", {
1141
+ message: "Stream completed before its declared terminal item",
1142
+ status: 500
1143
+ });
1137
1144
  }
1138
1145
  if (descriptor.framing !== "item")
1139
1146
  yield { type: "end" };
@@ -1145,7 +1152,10 @@ function contractStreamResponse(request, context, source, descriptor, operationA
1145
1152
  return;
1146
1153
  yield {
1147
1154
  type: "error",
1148
- error: new AppError2("STREAM_LIFETIME_EXCEEDED", "Stream exceeded its declared lifetime", 408).toJSON().error
1155
+ error: new AppError2("STREAM_LIFETIME_EXCEEDED", {
1156
+ message: "Stream exceeded its declared lifetime",
1157
+ status: 408
1158
+ }).toJSON().error
1149
1159
  };
1150
1160
  return;
1151
1161
  }
@@ -1221,7 +1231,10 @@ async function endpointResponse(state, request, outcome) {
1221
1231
  }
1222
1232
  function rawEndpointResponse(state, request, { match: { method }, result }) {
1223
1233
  if (!(result instanceof Response)) {
1224
- throw new AppError2("INTERNAL_SERVER_ERROR", `Raw endpoint ${method.serviceName}.${method.key} must return a Response`, 500);
1234
+ throw new AppError2("INTERNAL_SERVER_ERROR", {
1235
+ message: `Raw endpoint ${method.serviceName}.${method.key} must return a Response`,
1236
+ status: 500
1237
+ });
1225
1238
  }
1226
1239
  const response = method.method === "HEAD" ? new Response(null, {
1227
1240
  status: result.status,
@@ -1236,7 +1249,10 @@ async function streamEndpointResponse(state, request, { match: { method, pathPar
1236
1249
  const { req, server, clientIp } = request;
1237
1250
  if (!method.stream || !streamAbort || !isAsyncIterable(result)) {
1238
1251
  streamAbort?.abort();
1239
- throw new AppError2("INTERNAL_SERVER_ERROR", `Streaming endpoint ${method.serviceName}.${method.key} must return an AsyncIterable`, 500);
1252
+ throw new AppError2("INTERNAL_SERVER_ERROR", {
1253
+ message: `Streaming endpoint ${method.serviceName}.${method.key} must return an AsyncIterable`,
1254
+ status: 500
1255
+ });
1240
1256
  }
1241
1257
  const response = await contractStreamResponse(req, { params: pathParams, server, ipAddress: clientIp.socketIp }, result, method.stream, streamAbort);
1242
1258
  const withCors = applyCors(response, state.cors, req);
@@ -1263,18 +1279,24 @@ async function dataEndpointResponse(state, request, {
1263
1279
  result = transformed;
1264
1280
  }
1265
1281
  if (result instanceof Response) {
1266
- throw new AppError2("INTERNAL_SERVER_ERROR", `${method.serviceName}.${method.key} produced a Response on the data path — only a \`rawResponse: true\` endpoint may return one (an afterHandle hook must return data)`, 500);
1282
+ throw new AppError2("INTERNAL_SERVER_ERROR", {
1283
+ message: `${method.serviceName}.${method.key} produced a Response on the data path — only a \`rawResponse: true\` endpoint may return one (an afterHandle hook must return data)`,
1284
+ status: 500
1285
+ });
1267
1286
  }
1268
1287
  const checked = validateDeclaredOutput(method.outputSchema, result, config.warnOnOutputStrip && method.outputSchema ? (paths) => {
1269
1288
  warn(`[stitchkit] output strip ${method.serviceName}.${method.key}: ${paths.join(", ")}`);
1270
1289
  } : undefined);
1271
1290
  if (!checked.ok) {
1272
- throw new AppError2("INTERNAL_SERVER_ERROR", checked.message, 500);
1291
+ throw new AppError2("INTERNAL_SERVER_ERROR", { message: checked.message, status: 500 });
1273
1292
  }
1274
1293
  result = checked.data;
1275
1294
  const responseStatus = method.responseMeta?.status ?? (method.outputSchema ? 200 : 204);
1276
1295
  if (method.outputSchema && (responseStatus === 204 || responseStatus === 205)) {
1277
- throw new AppError2("INTERNAL_SERVER_ERROR", `${method.serviceName}.${method.key} cannot combine output with bodyless status ${responseStatus}`, 500);
1296
+ throw new AppError2("INTERNAL_SERVER_ERROR", {
1297
+ message: `${method.serviceName}.${method.key} cannot combine output with bodyless status ${responseStatus}`,
1298
+ status: 500
1299
+ });
1278
1300
  }
1279
1301
  const responseHeaders = new Headers(requestCorsHeaders(cors, req));
1280
1302
  applyResponseMetadata(responseHeaders, responseMetadata, `${method.serviceName}.${method.key}`);
@@ -1784,7 +1806,7 @@ function createHandlerState(config) {
1784
1806
  const { cors, hooks, logging = false, observability } = config;
1785
1807
  if (cors)
1786
1808
  assertCorsConfig(cors);
1787
- assertJsonBodyLimit(config.maxJsonBodyBytes, "HandlerConfig.maxJsonBodyBytes");
1809
+ assertPositiveSafeInteger("HandlerConfig.maxJsonBodyBytes", config.maxJsonBodyBytes, Error);
1788
1810
  const logConfig = resolveLoggingConfig(logging);
1789
1811
  const customLogger = logConfig?.logger ?? null;
1790
1812
  const useDefaultLog = logConfig !== null && !logConfig.logger;
@@ -2151,11 +2173,14 @@ async function dispatch(state, req, url, traceId, server, clientIp, startedAt) {
2151
2173
  if (!match) {
2152
2174
  const allow = allowedMethods(routeMap, url.pathname);
2153
2175
  if (allow.length > 0) {
2154
- const res = await respondError(new AppError2("METHOD_NOT_ALLOWED", `Method ${req.method} not allowed`, 405));
2176
+ const res = await respondError(new AppError2("METHOD_NOT_ALLOWED", {
2177
+ message: `Method ${req.method} not allowed`,
2178
+ status: 405
2179
+ }));
2155
2180
  res.headers.set("Allow", allow.join(", "));
2156
2181
  return res;
2157
2182
  }
2158
- return respondError(new AppError2("NOT_FOUND", "Not found", 404));
2183
+ return respondError(new AppError2("NOT_FOUND", { message: "Not found", status: 404 }));
2159
2184
  }
2160
2185
  return dispatchEndpoint(state, request, match);
2161
2186
  }
@@ -3175,9 +3200,7 @@ var DEFAULT_MAX_REDIRECTS = 5;
3175
3200
  var DEFAULT_MAX_HEADER_BYTES2 = 64 * 1024;
3176
3201
  function positiveInteger(value, fallback, name) {
3177
3202
  const resolved = value ?? fallback;
3178
- if (!Number.isSafeInteger(resolved) || resolved <= 0) {
3179
- throw new TypeError(`${name} must be a positive safe integer`);
3180
- }
3203
+ assertPositiveSafeInteger(name, resolved);
3181
3204
  return resolved;
3182
3205
  }
3183
3206
  function nonNegativeInteger(value, fallback, name) {