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
@@ -3,19 +3,27 @@ import {
3
3
  ProcessInstanceSchema2,
4
4
  readProcessInstance,
5
5
  probeProcessOwner2
6
- } from "./index-5csmzesf.js";
6
+ } from "./index-azx12jgv.js";
7
+ import {
8
+ BoundedFileReadError,
9
+ readBoundedFile
10
+ } from "./index-m616f0yz.js";
11
+ import {
12
+ AtomicFilePublicationError2,
13
+ publishAtomicFile
14
+ } from "./index-b56nnscm.js";
7
15
  import {
8
16
  isRecord
9
17
  } from "./index-9jfdm5tg.js";
10
18
 
11
19
  // src/internal/exclusive-lock.ts
12
- import { lstat, open as open2, unlink } from "node:fs/promises";
20
+ import { randomUUID } from "node:crypto";
21
+ import { lstat, open, readdir, unlink } from "node:fs/promises";
13
22
  import { hostname } from "node:os";
23
+ import { dirname, join } from "node:path";
14
24
  import { z } from "zod";
15
25
 
16
26
  // src/internal/exclusive-lock-read.ts
17
- import { constants } from "node:fs";
18
- import { open } from "node:fs/promises";
19
27
  var OWNER_RECORD_BYTES = 16 * 1024;
20
28
 
21
29
  class LockRecordError extends Error {
@@ -26,42 +34,28 @@ class LockRecordError extends Error {
26
34
  this.code = code;
27
35
  }
28
36
  }
29
- async function readLockRecord(path, openDescriptor = open, signal) {
30
- signal?.throwIfAborted();
31
- if (!constants.O_NOFOLLOW || !constants.O_NONBLOCK) {
32
- throw new LockRecordError("LOCK_UNSAFE_RECORD", "Safe lock descriptor flags are unavailable");
33
- }
34
- const handle = await openDescriptor(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
37
+ var LOCK_CODE = {
38
+ FILE_UNSUPPORTED: "LOCK_UNSAFE_RECORD",
39
+ FILE_NOT_REGULAR: "LOCK_UNSAFE_RECORD",
40
+ FILE_UNSAFE_LINK: "LOCK_UNSAFE_RECORD",
41
+ FILE_TOO_LARGE: "LOCK_RECORD_TOO_LARGE",
42
+ FILE_CHANGED: "LOCK_RECORD_CHANGED"
43
+ };
44
+ async function readLockRecord(path, {
45
+ openDescriptor,
46
+ signal,
47
+ singleLink = true
48
+ } = {}) {
35
49
  try {
36
- signal?.throwIfAborted();
37
- const before = await handle.stat();
38
- signal?.throwIfAborted();
39
- if (!before.isFile() || before.nlink !== 1) {
40
- throw new LockRecordError("LOCK_UNSAFE_RECORD", "Lock record must be a regular file with one link");
41
- }
42
- if (before.size > OWNER_RECORD_BYTES) {
43
- throw new LockRecordError("LOCK_RECORD_TOO_LARGE", "Lock owner record exceeds its byte cap");
44
- }
45
- const bytes = Buffer.alloc(OWNER_RECORD_BYTES + 1);
46
- let length = 0;
47
- while (length < bytes.length) {
48
- signal?.throwIfAborted();
49
- const read = await handle.read(bytes, length, bytes.length - length, length);
50
- if (read.bytesRead === 0)
51
- break;
52
- length += read.bytesRead;
53
- }
54
- if (length > OWNER_RECORD_BYTES) {
55
- throw new LockRecordError("LOCK_RECORD_TOO_LARGE", "Lock owner record grew beyond its byte cap");
56
- }
57
- const after = await handle.stat();
58
- signal?.throwIfAborted();
59
- if (before.dev !== after.dev || before.ino !== after.ino || before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs || before.nlink !== after.nlink || length !== after.size) {
60
- throw new LockRecordError("LOCK_RECORD_CHANGED", "Lock owner record changed during its read");
61
- }
62
- return { text: bytes.subarray(0, length).toString("utf8"), info: after };
63
- } finally {
64
- await handle.close();
50
+ const { bytes, observation } = await readBoundedFile(path, OWNER_RECORD_BYTES, { rejectSymlinks: true, singleLink, stable: true, ...signal && { signal } }, openDescriptor);
51
+ return {
52
+ text: new TextDecoder("utf-8", { ignoreBOM: true }).decode(bytes),
53
+ info: observation
54
+ };
55
+ } catch (error) {
56
+ if (error instanceof BoundedFileReadError)
57
+ throw new LockRecordError(LOCK_CODE[error.code], error.message);
58
+ throw error;
65
59
  }
66
60
  }
67
61
 
@@ -104,14 +98,43 @@ async function diagnose(owner, declaredIdentity) {
104
98
  return { attribution, ...await probeProcessOwner2(owner.pid, owner.process), owner };
105
99
  }
106
100
  var MAX_RECLAIM_DEPTH = 16;
101
+ var STALE_GUARD_GRACE_MS = 5000;
102
+ var STAGED_NAME = /^\.lock-[0-9a-f-]{36}\.tmp$/;
103
+ async function stagedSibling(path, ino, dev) {
104
+ const directory = dirname(path);
105
+ for (const name of await readdir(directory)) {
106
+ if (!STAGED_NAME.test(name))
107
+ continue;
108
+ const candidate = join(directory, name);
109
+ const info = await lstat(candidate).catch(() => {
110
+ return;
111
+ });
112
+ if (info?.isFile() && info.ino === ino && info.dev === dev)
113
+ return candidate;
114
+ }
115
+ return;
116
+ }
107
117
  async function readLockFile(path, onFailure, signal) {
108
118
  try {
109
- const record = await readLockRecord(path, undefined, signal);
119
+ let stagedName;
120
+ let record;
121
+ try {
122
+ record = await readLockRecord(path, { signal });
123
+ } catch (cause) {
124
+ if (!(cause instanceof LockRecordError) || cause.code !== "LOCK_UNSAFE_RECORD")
125
+ throw cause;
126
+ const info = await lstat(path);
127
+ stagedName = info.nlink === 2 ? await stagedSibling(path, info.ino, info.dev) : undefined;
128
+ if (stagedName === undefined)
129
+ throw cause;
130
+ record = await readLockRecord(path, { signal, singleLink: false });
131
+ }
110
132
  return {
111
133
  ...readOwner(record.text),
112
134
  ino: record.info.ino,
113
135
  dev: record.info.dev,
114
- mtimeMs: record.info.mtimeMs
136
+ mtimeMs: record.info.mtimeMs,
137
+ ...stagedName !== undefined && { stagedName }
115
138
  };
116
139
  } catch (cause) {
117
140
  if (!isCode(cause, "ENOENT"))
@@ -119,10 +142,23 @@ async function readLockFile(path, onFailure, signal) {
119
142
  return;
120
143
  }
121
144
  }
122
- async function unlinkIfSame(path, ino, dev) {
145
+ async function sweepStagedLocks(directory, machine, signal) {
146
+ for (const name of await readdir(directory).catch(() => [])) {
147
+ if (!STAGED_NAME.test(name))
148
+ continue;
149
+ const candidate = join(directory, name);
150
+ const state = await readLockFile(candidate, undefined, signal);
151
+ if (!state?.owner)
152
+ continue;
153
+ if ((await diagnose(state.owner, machine)).liveness !== "gone")
154
+ continue;
155
+ await unlinkIfSame(candidate, state.ino, state.dev, state.stagedName === undefined ? 1 : 2);
156
+ }
157
+ }
158
+ async function unlinkIfSame(path, ino, dev, links = 1) {
123
159
  try {
124
160
  const current = await lstat(path);
125
- if (current.ino !== ino || current.dev !== dev || !current.isFile() || current.nlink !== 1)
161
+ if (current.ino !== ino || current.dev !== dev || !current.isFile() || current.nlink !== links)
126
162
  return;
127
163
  await unlink(path);
128
164
  } catch (error) {
@@ -133,7 +169,6 @@ async function unlinkIfSame(path, ino, dev) {
133
169
  async function createOwned(path, options, reclaimed) {
134
170
  const identity = await machineIdentity(options.machineIdentity);
135
171
  const instance = await readProcessInstance(process.pid);
136
- const handle = await open2(path, "wx", options.mode);
137
172
  const owner = {
138
173
  pid: process.pid,
139
174
  process: instance,
@@ -141,29 +176,41 @@ async function createOwned(path, options, reclaimed) {
141
176
  acquiredAt: new Date().toISOString(),
142
177
  ...identity !== null && { machine: identity }
143
178
  };
179
+ const ownedRecord = `${JSON.stringify(owner)}
180
+ `;
181
+ const staged = join(dirname(path), `.lock-${randomUUID()}.tmp`);
182
+ const handle = await open(staged, "wx", options.mode);
144
183
  let ino;
145
184
  let dev;
185
+ let published = false;
146
186
  try {
147
187
  const info = await handle.stat();
148
188
  ino = info.ino;
149
189
  dev = info.dev;
150
190
  await handle.chmod(options.mode);
151
- await handle.writeFile(`${JSON.stringify(owner)}
152
- `, "utf8");
191
+ await handle.writeFile(ownedRecord, "utf8");
192
+ try {
193
+ await publishAtomicFile(staged, path, { replace: false, durability: "file" });
194
+ published = true;
195
+ } catch (error) {
196
+ published = error instanceof AtomicFilePublicationError2;
197
+ throw error;
198
+ }
153
199
  } catch (error) {
154
200
  await handle.close().catch(() => {
155
201
  return;
156
202
  });
157
- if (ino !== undefined && dev !== undefined)
158
- await unlinkIfSame(path, ino, dev).catch(() => {
203
+ if (published && ino !== undefined && dev !== undefined)
204
+ await unlinkIfSame(path, ino, dev, 2).catch(() => {
159
205
  return;
160
206
  });
207
+ await unlink(staged).catch(() => {
208
+ return;
209
+ });
161
210
  throw error;
162
211
  }
163
212
  const ownedInode = ino;
164
213
  const ownedDevice = dev;
165
- const ownedRecord = `${JSON.stringify(owner)}
166
- `;
167
214
  let released = false;
168
215
  return {
169
216
  path,
@@ -206,7 +253,7 @@ async function reclaimUnderGuard(path, options, depth) {
206
253
  try {
207
254
  acquired = await attemptExclusiveLock(guardPath, {
208
255
  ...options,
209
- ownerlessGraceMs: options.ownerlessGraceMs === undefined ? 5000 : options.ownerlessGraceMs
256
+ ownerlessGraceMs: options.ownerlessGraceMs === undefined ? STALE_GUARD_GRACE_MS : options.ownerlessGraceMs
210
257
  }, depth + 1);
211
258
  } catch (cause) {
212
259
  if (!isCode(cause, "ENAMETOOLONG"))
@@ -229,8 +276,14 @@ async function reclaimUnderGuard(path, options, depth) {
229
276
  return { refused: true };
230
277
  if (!reclaimable(state, diagnosis, options.ownerlessGraceMs))
231
278
  return { refused: true, cause: diagnosis.cause };
279
+ if (state.stagedName !== undefined)
280
+ await unlink(state.stagedName).catch((error) => {
281
+ if (!isCode(error, "ENOENT"))
282
+ throw error;
283
+ });
232
284
  await unlinkIfSame(path, state.ino, state.dev);
233
285
  }
286
+ await sweepStagedLocks(dirname(path), options.machineIdentity, options.signal);
234
287
  return await createOwned(path, options, state !== undefined).catch((error) => {
235
288
  if (isCode(error, "EEXIST"))
236
289
  return { refused: true, cause: error };
@@ -0,0 +1,21 @@
1
+ // src/internal/timers.ts
2
+ var MAX_TIMER_MS = 2147483647;
3
+ function sleep(ms, signal) {
4
+ return new Promise((resolve, reject) => {
5
+ if (signal?.aborted) {
6
+ reject(signal.reason);
7
+ return;
8
+ }
9
+ const abort = () => {
10
+ clearTimeout(timer);
11
+ reject(signal?.reason);
12
+ };
13
+ const timer = setTimeout(() => {
14
+ signal?.removeEventListener("abort", abort);
15
+ resolve();
16
+ }, ms);
17
+ signal?.addEventListener("abort", abort, { once: true });
18
+ });
19
+ }
20
+
21
+ export { MAX_TIMER_MS, sleep };
@@ -0,0 +1,105 @@
1
+ import {
2
+ stagingPath
3
+ } from "./index-cq59agna.js";
4
+ import {
5
+ closeAfter,
6
+ closeAfterSync,
7
+ publishAtomicFile,
8
+ publishAtomicFileSync
9
+ } from "./index-b56nnscm.js";
10
+
11
+ // src/internal/atomic-file.ts
12
+ import { closeSync, fchmodSync, fsyncSync, openSync, unlinkSync, writeSync } from "node:fs";
13
+ import { open, unlink } from "node:fs/promises";
14
+ var DEFAULT_MODE = 384;
15
+ function bytesOf(data) {
16
+ return typeof data === "string" ? new TextEncoder().encode(data) : data;
17
+ }
18
+ async function writeAllBytes(file, bytes) {
19
+ for (let offset = 0;offset < bytes.byteLength; ) {
20
+ const { bytesWritten } = await file.write(bytes, offset, bytes.byteLength - offset);
21
+ if (bytesWritten === 0)
22
+ throw new Error("zero-byte atomic-file write");
23
+ offset += bytesWritten;
24
+ }
25
+ }
26
+ async function writeFileAtomic2(target, data, options = {}) {
27
+ return writeAtomicFileData(target, data, options);
28
+ }
29
+ function isMissing(error) {
30
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
31
+ }
32
+ async function writeAtomicFileStaged(target, stage, options, io = { open, unlink, publish: publishAtomicFile }) {
33
+ const mode = options.mode ?? DEFAULT_MODE;
34
+ const staged = stagingPath(target);
35
+ const file = await io.open(staged, "wx", mode);
36
+ try {
37
+ const value = await closeAfter(file, async () => {
38
+ const filled = await stage.fill(file);
39
+ await file.chmod(mode);
40
+ if (options.durability !== "none")
41
+ await file.sync();
42
+ return filled;
43
+ });
44
+ await io.publish(staged, target, {
45
+ replace: options.replace ?? true,
46
+ durability: options.durability ?? "file"
47
+ });
48
+ return value;
49
+ } catch (error) {
50
+ await io.unlink(staged).catch((cleanup) => {
51
+ if (!isMissing(cleanup))
52
+ stage.onCleanupError?.(cleanup);
53
+ });
54
+ throw error;
55
+ }
56
+ }
57
+ async function writeAtomicFileData(target, data, options, io) {
58
+ await writeAtomicFileStaged(target, { fill: (file) => writeAllBytes(file, bytesOf(data)) }, options, io);
59
+ }
60
+ var nativeSync = {
61
+ open(path, flags, mode) {
62
+ const descriptor = openSync(path, flags, mode);
63
+ return {
64
+ write: (bytes, offset, length) => writeSync(descriptor, bytes, offset, length),
65
+ chmod: (bits) => fchmodSync(descriptor, bits),
66
+ sync: () => fsyncSync(descriptor),
67
+ close: () => closeSync(descriptor)
68
+ };
69
+ },
70
+ unlink: unlinkSync,
71
+ publish: publishAtomicFileSync
72
+ };
73
+ function writeAtomicFileDataSync(target, data, options, io = nativeSync) {
74
+ const mode = options.mode ?? DEFAULT_MODE;
75
+ const bytes = bytesOf(data);
76
+ const staged = stagingPath(target);
77
+ const file = io.open(staged, "wx", mode);
78
+ try {
79
+ closeAfterSync(() => file.close(), () => {
80
+ for (let offset = 0;offset < bytes.byteLength; ) {
81
+ const written = file.write(bytes, offset, bytes.byteLength - offset);
82
+ if (written === 0)
83
+ throw new Error("zero-byte atomic-file write");
84
+ offset += written;
85
+ }
86
+ file.chmod(mode);
87
+ if (options.durability !== "none")
88
+ file.sync();
89
+ });
90
+ io.publish(staged, target, {
91
+ replace: options.replace ?? true,
92
+ durability: options.durability ?? "file"
93
+ });
94
+ } catch (error) {
95
+ try {
96
+ io.unlink(staged);
97
+ } catch {}
98
+ throw error;
99
+ }
100
+ }
101
+ function writeFileAtomicSync2(target, data, options = {}) {
102
+ writeAtomicFileDataSync(target, data, options);
103
+ }
104
+
105
+ export { writeAllBytes, writeFileAtomic2, writeAtomicFileStaged, writeAtomicFileData, writeFileAtomicSync2 };
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  AppError2
3
- } from "./index-x928baz2.js";
3
+ } from "./index-j9gxbztg.js";
4
4
  import {
5
5
  toolErrorFromResult
6
- } from "./index-2vnh05w4.js";
6
+ } from "./index-2k91mewf.js";
7
7
  import {
8
8
  assertUniqueToolName
9
- } from "./index-77nxk6ay.js";
9
+ } from "./index-r393tnfp.js";
10
10
  import {
11
11
  collectTools2,
12
12
  createToolRunner
13
- } from "./index-2hyavjjj.js";
13
+ } from "./index-wbhdzxar.js";
14
14
 
15
15
  // src/tools/invoker.ts
16
16
  function createToolInvoker2(services, config) {
@@ -30,8 +30,12 @@ function createToolInvoker2(services, config) {
30
30
  const tool = tools.get(name);
31
31
  if (tool)
32
32
  return tool;
33
- throw new AppError2("NOT_FOUND", `Unknown tool: ${name}`, 404, {
34
- available: names
33
+ throw new AppError2("NOT_FOUND", {
34
+ message: `Unknown tool: ${name}`,
35
+ status: 404,
36
+ details: {
37
+ available: names
38
+ }
35
39
  });
36
40
  };
37
41
  const run = (name, args, options = {}) => {
@@ -1,6 +1,9 @@
1
1
  import {
2
2
  resolveRouteParamsSchema
3
3
  } from "./index-m38ej7e5.js";
4
+ import {
5
+ assertPositiveSafeInteger
6
+ } from "./index-0s4xebbg.js";
4
7
  import {
5
8
  isUnsafeKey
6
9
  } from "./index-zsarb5xp.js";
@@ -71,11 +74,6 @@ function assertToolView(prefix, key, ep) {
71
74
  }
72
75
 
73
76
  // src/contract/define-validation.ts
74
- function assertPositiveLimit(where, name, value) {
75
- if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {
76
- throw new Error(`${where} ${name} must be a positive safe integer, received ${value}`);
77
- }
78
- }
79
77
  function assertMultipartEndpoint(prefix, key, ep) {
80
78
  const where = `Contract "${prefix}": multipart endpoint "${key}"`;
81
79
  if (ep.method !== "POST" && ep.method !== "PUT" && ep.method !== "PATCH") {
@@ -85,16 +83,16 @@ function assertMultipartEndpoint(prefix, key, ep) {
85
83
  if (!multipart || typeof multipart !== "object") {
86
84
  throw new Error(`${where} must declare a multipart descriptor`);
87
85
  }
88
- assertPositiveLimit(where, "maxRequestBytes", multipart.maxRequestBytes);
89
- assertPositiveLimit(where, "maxFieldBytes", multipart.maxFieldBytes);
86
+ assertPositiveSafeInteger(`${where} maxRequestBytes`, multipart.maxRequestBytes, Error);
87
+ assertPositiveSafeInteger(`${where} maxFieldBytes`, multipart.maxFieldBytes, Error);
90
88
  const entries = Object.entries(multipart.files);
91
89
  if (entries.length === 0)
92
90
  throw new Error(`${where} must declare at least one file field`);
93
91
  for (const [field, policy] of entries) {
94
92
  if (!field || isUnsafeKey(field))
95
93
  throw new Error(`${where} has an invalid file field name`);
96
- assertPositiveLimit(`${where} field "${field}"`, "maxBytes", policy.maxBytes);
97
- assertPositiveLimit(`${where} field "${field}"`, "maxFiles", policy.maxFiles);
94
+ assertPositiveSafeInteger(`${where} field "${field}" maxBytes`, policy.maxBytes, Error);
95
+ assertPositiveSafeInteger(`${where} field "${field}" maxFiles`, policy.maxFiles, Error);
98
96
  if (policy.multiple !== true && policy.maxFiles !== undefined) {
99
97
  throw new Error(`${where} field "${field}" may set maxFiles only with multiple: true`);
100
98
  }
@@ -142,9 +140,9 @@ function assertStreamingResponseEndpoint(prefix, key, ep) {
142
140
  if (runtimeFinalLine === "require-newline" && runtimeFormat === "sse") {
143
141
  throw new Error(`${where} finalLine applies only to ndjson`);
144
142
  }
145
- assertPositiveLimit(where, "maxFrameBytes", ep.stream.maxFrameBytes);
146
- assertPositiveLimit(where, "lifetimeMs", ep.stream.lifetimeMs);
147
- assertPositiveLimit(where, "heartbeatMs", ep.stream.heartbeatMs);
143
+ assertPositiveSafeInteger(`${where} maxFrameBytes`, ep.stream.maxFrameBytes, Error);
144
+ assertPositiveSafeInteger(`${where} lifetimeMs`, ep.stream.lifetimeMs, Error);
145
+ assertPositiveSafeInteger(`${where} heartbeatMs`, ep.stream.heartbeatMs, Error);
148
146
  if (ep.stream.idleTimeoutSeconds !== undefined && (!Number.isSafeInteger(ep.stream.idleTimeoutSeconds) || ep.stream.idleTimeoutSeconds < 0)) {
149
147
  throw new Error(`${where} idleTimeoutSeconds must be a non-negative safe integer`);
150
148
  }
@@ -267,9 +265,7 @@ function defineContract2(meta, endpoints) {
267
265
  if (ep.desc.trim() === "") {
268
266
  throw new Error(`Contract "${meta.prefix}": endpoint "${key}" has an empty desc`);
269
267
  }
270
- if (ep.maxJsonBodyBytes !== undefined && (!Number.isSafeInteger(ep.maxJsonBodyBytes) || ep.maxJsonBodyBytes <= 0)) {
271
- throw new Error(`Contract "${meta.prefix}": endpoint "${key}" maxJsonBodyBytes must be a positive safe integer, received ${ep.maxJsonBodyBytes}`);
272
- }
268
+ assertPositiveSafeInteger(`Contract "${meta.prefix}": endpoint "${key}" maxJsonBodyBytes`, ep.maxJsonBodyBytes, Error);
273
269
  if (ep.multipart)
274
270
  assertMultipartEndpoint(meta.prefix, key, ep);
275
271
  if (ep.rawResponse)