@statewalker/cellb 0.0.0-stage → 0.1.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 (365) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +323 -2
  3. package/dist/adapters/files-backup.d.ts +16 -0
  4. package/dist/adapters/files-backup.js +32 -0
  5. package/dist/adapters/files-backup.js.map +1 -0
  6. package/dist/adapters/files-changelog.d.ts +33 -0
  7. package/dist/adapters/files-changelog.js +96 -0
  8. package/dist/adapters/files-changelog.js.map +1 -0
  9. package/dist/adapters/files-ltx.d.ts +35 -0
  10. package/dist/adapters/files-ltx.js +9 -0
  11. package/dist/adapters/files-ltx.js.map +1 -0
  12. package/dist/adapters/ltx-vfs.d.ts +21 -0
  13. package/dist/adapters/ltx-vfs.js +286 -0
  14. package/dist/adapters/ltx-vfs.js.map +1 -0
  15. package/dist/adapters/node-sqlite.d.ts +45 -0
  16. package/dist/adapters/node-sqlite.js +254 -0
  17. package/dist/adapters/node-sqlite.js.map +1 -0
  18. package/dist/adapters/wasm-page-hook.d.ts +26 -0
  19. package/dist/adapters/wasm-page-hook.js +55 -0
  20. package/dist/adapters/wasm-page-hook.js.map +1 -0
  21. package/dist/adapters/wasm-session.d.ts +11 -0
  22. package/dist/adapters/wasm-session.js +76 -0
  23. package/dist/adapters/wasm-session.js.map +1 -0
  24. package/dist/adapters/wasm-sqlite.d.ts +89 -0
  25. package/dist/adapters/wasm-sqlite.js +258 -0
  26. package/dist/adapters/wasm-sqlite.js.map +1 -0
  27. package/dist/bindings/assets.d.ts +26 -0
  28. package/dist/bindings/assets.js +260 -0
  29. package/dist/bindings/assets.js.map +1 -0
  30. package/dist/bindings/cache.d.ts +16 -0
  31. package/dist/bindings/cache.js +34 -0
  32. package/dist/bindings/cache.js.map +1 -0
  33. package/dist/bindings/celld-kv.d.ts +26 -0
  34. package/dist/bindings/celld-kv.js +81 -0
  35. package/dist/bindings/celld-kv.js.map +1 -0
  36. package/dist/bindings/celld-queues.d.ts +56 -0
  37. package/dist/bindings/celld-queues.js +223 -0
  38. package/dist/bindings/celld-queues.js.map +1 -0
  39. package/dist/bindings/celld-workflows.d.ts +22 -0
  40. package/dist/bindings/celld-workflows.js +54 -0
  41. package/dist/bindings/celld-workflows.js.map +1 -0
  42. package/dist/bindings/cron.d.ts +27 -0
  43. package/dist/bindings/cron.js +232 -0
  44. package/dist/bindings/cron.js.map +1 -0
  45. package/dist/bindings/d1-migrations.d.ts +22 -0
  46. package/dist/bindings/d1-migrations.js +32 -0
  47. package/dist/bindings/d1-migrations.js.map +1 -0
  48. package/dist/bindings/html-rewriter.d.ts +8 -0
  49. package/dist/bindings/html-rewriter.js +75 -0
  50. package/dist/bindings/html-rewriter.js.map +1 -0
  51. package/dist/bindings/r2-celld.d.ts +3 -0
  52. package/dist/bindings/r2-celld.js +113 -0
  53. package/dist/bindings/r2-celld.js.map +1 -0
  54. package/dist/bindings/r2.d.ts +236 -0
  55. package/dist/bindings/r2.js +419 -0
  56. package/dist/bindings/r2.js.map +1 -0
  57. package/dist/bindings/worker-loader.d.ts +83 -0
  58. package/dist/bindings/worker-loader.js +183 -0
  59. package/dist/bindings/worker-loader.js.map +1 -0
  60. package/dist/bindings/workers-ai.d.ts +39 -0
  61. package/dist/bindings/workers-ai.js +175 -0
  62. package/dist/bindings/workers-ai.js.map +1 -0
  63. package/dist/browser.d.ts +7 -0
  64. package/dist/browser.js +8 -0
  65. package/dist/browser.js.map +1 -0
  66. package/dist/bucket/celld-cells.d.ts +86 -0
  67. package/dist/bucket/celld-cells.js +273 -0
  68. package/dist/bucket/celld-cells.js.map +1 -0
  69. package/dist/bucket/celld-format.d.ts +10 -0
  70. package/dist/bucket/celld-format.js +27 -0
  71. package/dist/bucket/celld-format.js.map +1 -0
  72. package/dist/bucket/idb-object-store.d.ts +9 -0
  73. package/dist/bucket/idb-object-store.js +73 -0
  74. package/dist/bucket/idb-object-store.js.map +1 -0
  75. package/dist/bucket/ltx-log.d.ts +34 -0
  76. package/dist/bucket/ltx-log.js +289 -0
  77. package/dist/bucket/ltx-log.js.map +1 -0
  78. package/dist/bucket/object-store.d.ts +51 -0
  79. package/dist/bucket/object-store.js +114 -0
  80. package/dist/bucket/object-store.js.map +1 -0
  81. package/dist/bucket/s3-object-store.d.ts +25 -0
  82. package/dist/bucket/s3-object-store.js +151 -0
  83. package/dist/bucket/s3-object-store.js.map +1 -0
  84. package/dist/bucket/sqlite-object-store.d.ts +10 -0
  85. package/dist/bucket/sqlite-object-store.js +107 -0
  86. package/dist/bucket/sqlite-object-store.js.map +1 -0
  87. package/dist/core/alarms.d.ts +27 -0
  88. package/dist/core/alarms.js +88 -0
  89. package/dist/core/alarms.js.map +1 -0
  90. package/dist/core/async-context.d.ts +34 -0
  91. package/dist/core/async-context.js +50 -0
  92. package/dist/core/async-context.js.map +1 -0
  93. package/dist/core/celld-schema.d.ts +14 -0
  94. package/dist/core/celld-schema.js +34 -0
  95. package/dist/core/celld-schema.js.map +1 -0
  96. package/dist/core/durable-object.d.ts +28 -0
  97. package/dist/core/durable-object.js +31 -0
  98. package/dist/core/durable-object.js.map +1 -0
  99. package/dist/core/gates.d.ts +33 -0
  100. package/dist/core/gates.js +89 -0
  101. package/dist/core/gates.js.map +1 -0
  102. package/dist/core/handles.d.ts +90 -0
  103. package/dist/core/handles.js +224 -0
  104. package/dist/core/handles.js.map +1 -0
  105. package/dist/core/id.d.ts +19 -0
  106. package/dist/core/id.js +64 -0
  107. package/dist/core/id.js.map +1 -0
  108. package/dist/core/namespace.d.ts +38 -0
  109. package/dist/core/namespace.js +141 -0
  110. package/dist/core/namespace.js.map +1 -0
  111. package/dist/core/object-host.d.ts +91 -0
  112. package/dist/core/object-host.js +616 -0
  113. package/dist/core/object-host.js.map +1 -0
  114. package/dist/core/request-body.d.ts +9 -0
  115. package/dist/core/request-body.js +55 -0
  116. package/dist/core/request-body.js.map +1 -0
  117. package/dist/core/runtime.d.ts +121 -0
  118. package/dist/core/runtime.js +366 -0
  119. package/dist/core/runtime.js.map +1 -0
  120. package/dist/core/shard.d.ts +7 -0
  121. package/dist/core/shard.js +10 -0
  122. package/dist/core/shard.js.map +1 -0
  123. package/dist/core/sql-split.d.ts +15 -0
  124. package/dist/core/sql-split.js +101 -0
  125. package/dist/core/sql-split.js.map +1 -0
  126. package/dist/core/sql-storage.d.ts +53 -0
  127. package/dist/core/sql-storage.js +407 -0
  128. package/dist/core/sql-storage.js.map +1 -0
  129. package/dist/core/state.d.ts +44 -0
  130. package/dist/core/state.js +93 -0
  131. package/dist/core/state.js.map +1 -0
  132. package/dist/core/storage.d.ts +103 -0
  133. package/dist/core/storage.js +351 -0
  134. package/dist/core/storage.js.map +1 -0
  135. package/dist/core/worker-rejections.d.ts +21 -0
  136. package/dist/core/worker-rejections.js +55 -0
  137. package/dist/core/worker-rejections.js.map +1 -0
  138. package/dist/index.d.ts +22 -0
  139. package/dist/index.js +23 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/isolate/browser.d.ts +16 -0
  142. package/dist/isolate/browser.js +37 -0
  143. package/dist/isolate/browser.js.map +1 -0
  144. package/dist/isolate/host.d.ts +24 -0
  145. package/dist/isolate/host.js +74 -0
  146. package/dist/isolate/host.js.map +1 -0
  147. package/dist/isolate/isolate-worker.d.ts +1 -0
  148. package/dist/isolate/isolate-worker.js +53 -0
  149. package/dist/isolate/isolate-worker.js.map +1 -0
  150. package/dist/isolate/isolate.d.ts +10 -0
  151. package/dist/isolate/isolate.js +169 -0
  152. package/dist/isolate/isolate.js.map +1 -0
  153. package/dist/isolate/node-entry.d.ts +1 -0
  154. package/dist/isolate/node-entry.js +12 -0
  155. package/dist/isolate/node-entry.js.map +1 -0
  156. package/dist/isolate/protocol.d.ts +66 -0
  157. package/dist/isolate/protocol.js +205 -0
  158. package/dist/isolate/protocol.js.map +1 -0
  159. package/dist/ltx/crc64.d.ts +6 -0
  160. package/dist/ltx/crc64.js +46 -0
  161. package/dist/ltx/crc64.js.map +1 -0
  162. package/dist/ltx/ltx-page-server.d.ts +65 -0
  163. package/dist/ltx/ltx-page-server.js +309 -0
  164. package/dist/ltx/ltx-page-server.js.map +1 -0
  165. package/dist/ltx/ltx-pages.d.ts +81 -0
  166. package/dist/ltx/ltx-pages.js +315 -0
  167. package/dist/ltx/ltx-pages.js.map +1 -0
  168. package/dist/ltx/ltx-store-worker.d.ts +1 -0
  169. package/dist/ltx/ltx-store-worker.js +38 -0
  170. package/dist/ltx/ltx-store-worker.js.map +1 -0
  171. package/dist/ltx/ltx.d.ts +45 -0
  172. package/dist/ltx/ltx.js +203 -0
  173. package/dist/ltx/ltx.js.map +1 -0
  174. package/dist/ltx/lz4.d.ts +9 -0
  175. package/dist/ltx/lz4.js +156 -0
  176. package/dist/ltx/lz4.js.map +1 -0
  177. package/dist/ltx/opfs-sync-files.d.ts +23 -0
  178. package/dist/ltx/opfs-sync-files.js +191 -0
  179. package/dist/ltx/opfs-sync-files.js.map +1 -0
  180. package/dist/ltx/xxh32.d.ts +1 -0
  181. package/dist/ltx/xxh32.js +43 -0
  182. package/dist/ltx/xxh32.js.map +1 -0
  183. package/dist/miniflare-compat/blob-service.d.ts +13 -0
  184. package/dist/miniflare-compat/blob-service.js +66 -0
  185. package/dist/miniflare-compat/blob-service.js.map +1 -0
  186. package/dist/miniflare-compat/kv-binding.d.ts +44 -0
  187. package/dist/miniflare-compat/kv-binding.js +99 -0
  188. package/dist/miniflare-compat/kv-binding.js.map +1 -0
  189. package/dist/miniflare-compat/shims/assert.d.ts +15 -0
  190. package/dist/miniflare-compat/shims/assert.js +24 -0
  191. package/dist/miniflare-compat/shims/assert.js.map +1 -0
  192. package/dist/miniflare-compat/shims/workerd-cloudflare.d.ts +7 -0
  193. package/dist/miniflare-compat/shims/workerd-cloudflare.js +6 -0
  194. package/dist/miniflare-compat/shims/workerd-cloudflare.js.map +1 -0
  195. package/dist/miniflare-compat/shims/workerd-globals.d.ts +1 -0
  196. package/dist/miniflare-compat/shims/workerd-globals.js +30 -0
  197. package/dist/miniflare-compat/shims/workerd-globals.js.map +1 -0
  198. package/dist/miniflare-compat/shims/workerd-internal.d.ts +20 -0
  199. package/dist/miniflare-compat/shims/workerd-internal.js +23 -0
  200. package/dist/miniflare-compat/shims/workerd-internal.js.map +1 -0
  201. package/dist/miniflare-compat/shims/workerd-performance.d.ts +4 -0
  202. package/dist/miniflare-compat/shims/workerd-performance.js +17 -0
  203. package/dist/miniflare-compat/shims/workerd-performance.js.map +1 -0
  204. package/dist/miniflare-compat/simulator-fetcher.d.ts +9 -0
  205. package/dist/miniflare-compat/simulator-fetcher.js +14 -0
  206. package/dist/miniflare-compat/simulator-fetcher.js.map +1 -0
  207. package/dist/miniflare-compat/vendored.d.ts +15 -0
  208. package/dist/miniflare-compat/vendored.js +27 -0
  209. package/dist/miniflare-compat/vendored.js.map +1 -0
  210. package/dist/node-compat/async_hooks.d.ts +22 -0
  211. package/dist/node-compat/async_hooks.js +176 -0
  212. package/dist/node-compat/async_hooks.js.map +1 -0
  213. package/dist/node-compat/browser-registry.d.ts +3 -0
  214. package/dist/node-compat/browser-registry.js +39 -0
  215. package/dist/node-compat/browser-registry.js.map +1 -0
  216. package/dist/node-compat/crypto.d.ts +60 -0
  217. package/dist/node-compat/crypto.js +143 -0
  218. package/dist/node-compat/crypto.js.map +1 -0
  219. package/dist/node-compat/diagnostics_channel.d.ts +27 -0
  220. package/dist/node-compat/diagnostics_channel.js +46 -0
  221. package/dist/node-compat/diagnostics_channel.js.map +1 -0
  222. package/dist/node-compat/fs.d.ts +35 -0
  223. package/dist/node-compat/fs.js +40 -0
  224. package/dist/node-compat/fs.js.map +1 -0
  225. package/dist/node-compat/globals.d.ts +3 -0
  226. package/dist/node-compat/globals.js +4 -0
  227. package/dist/node-compat/globals.js.map +1 -0
  228. package/dist/node-compat/install.d.ts +5 -0
  229. package/dist/node-compat/install.js +12 -0
  230. package/dist/node-compat/install.js.map +1 -0
  231. package/dist/node-compat/module.d.ts +12 -0
  232. package/dist/node-compat/module.js +36 -0
  233. package/dist/node-compat/module.js.map +1 -0
  234. package/dist/node-compat/modules.d.ts +8 -0
  235. package/dist/node-compat/modules.js +23 -0
  236. package/dist/node-compat/modules.js.map +1 -0
  237. package/dist/node-compat/os.d.ts +36 -0
  238. package/dist/node-compat/os.js +36 -0
  239. package/dist/node-compat/os.js.map +1 -0
  240. package/dist/node-compat/process.d.ts +14 -0
  241. package/dist/node-compat/process.js +16 -0
  242. package/dist/node-compat/process.js.map +1 -0
  243. package/dist/node-compat/shims.d.ts +4 -0
  244. package/dist/node.d.ts +5 -0
  245. package/dist/node.js +6 -0
  246. package/dist/node.js.map +1 -0
  247. package/dist/peer/celld-peer.d.ts +53 -0
  248. package/dist/peer/celld-peer.js +555 -0
  249. package/dist/peer/celld-peer.js.map +1 -0
  250. package/dist/ports.d.ts +183 -0
  251. package/dist/ports.js +10 -0
  252. package/dist/ports.js.map +1 -0
  253. package/dist/project/browser-bundle.d.ts +17 -0
  254. package/dist/project/browser-bundle.js +125 -0
  255. package/dist/project/browser-bundle.js.map +1 -0
  256. package/dist/project/browser-cookies.d.ts +12 -0
  257. package/dist/project/browser-cookies.js +90 -0
  258. package/dist/project/browser-cookies.js.map +1 -0
  259. package/dist/project/browser-host.d.ts +173 -0
  260. package/dist/project/browser-host.js +200 -0
  261. package/dist/project/browser-host.js.map +1 -0
  262. package/dist/project/browser-modules.d.ts +17 -0
  263. package/dist/project/browser-modules.js +89 -0
  264. package/dist/project/browser-modules.js.map +1 -0
  265. package/dist/project/browser-shards.d.ts +62 -0
  266. package/dist/project/browser-shards.js +210 -0
  267. package/dist/project/browser-shards.js.map +1 -0
  268. package/dist/project/browser-tabs.d.ts +103 -0
  269. package/dist/project/browser-tabs.js +418 -0
  270. package/dist/project/browser-tabs.js.map +1 -0
  271. package/dist/project/cloudflare-email.d.ts +8 -0
  272. package/dist/project/cloudflare-email.js +11 -0
  273. package/dist/project/cloudflare-email.js.map +1 -0
  274. package/dist/project/cloudflare-workers.d.ts +12 -0
  275. package/dist/project/cloudflare-workers.js +16 -0
  276. package/dist/project/cloudflare-workers.js.map +1 -0
  277. package/dist/project/host-modules.d.ts +4 -0
  278. package/dist/project/host-modules.js +40 -0
  279. package/dist/project/host-modules.js.map +1 -0
  280. package/dist/project/jsonc.d.ts +2 -0
  281. package/dist/project/jsonc.js +27 -0
  282. package/dist/project/jsonc.js.map +1 -0
  283. package/dist/project/lower-await.d.ts +2 -0
  284. package/dist/project/lower-await.js +151 -0
  285. package/dist/project/lower-await.js.map +1 -0
  286. package/dist/project/node-project.d.ts +38 -0
  287. package/dist/project/node-project.js +362 -0
  288. package/dist/project/node-project.js.map +1 -0
  289. package/dist/project/own-module.d.ts +6 -0
  290. package/dist/project/own-module.js +13 -0
  291. package/dist/project/own-module.js.map +1 -0
  292. package/dist/project/scheduler.d.ts +2 -0
  293. package/dist/project/scheduler.js +3 -0
  294. package/dist/project/scheduler.js.map +1 -0
  295. package/dist/project/site.d.ts +74 -0
  296. package/dist/project/site.js +206 -0
  297. package/dist/project/site.js.map +1 -0
  298. package/dist/project/virtual-modules.d.ts +3 -0
  299. package/dist/project/worker-scope.d.ts +27 -0
  300. package/dist/project/worker-scope.js +46 -0
  301. package/dist/project/worker-scope.js.map +1 -0
  302. package/dist/project/workerd-message-channel.d.ts +13 -0
  303. package/dist/project/workerd-message-channel.js +137 -0
  304. package/dist/project/workerd-message-channel.js.map +1 -0
  305. package/dist/project/workers-global-names.d.ts +6 -0
  306. package/dist/project/workers-global-names.js +15 -0
  307. package/dist/project/workers-global-names.js.map +1 -0
  308. package/dist/project/workers-globals-module.d.ts +8 -0
  309. package/dist/project/workers-globals-module.js +9 -0
  310. package/dist/project/workers-globals-module.js.map +1 -0
  311. package/dist/project/workers-globals.d.ts +9 -0
  312. package/dist/project/workers-globals.js +19 -0
  313. package/dist/project/workers-globals.js.map +1 -0
  314. package/dist/project/wrangler.d.ts +116 -0
  315. package/dist/project/wrangler.js +342 -0
  316. package/dist/project/wrangler.js.map +1 -0
  317. package/dist/router/cell-router.d.ts +72 -0
  318. package/dist/router/cell-router.js +247 -0
  319. package/dist/router/cell-router.js.map +1 -0
  320. package/dist/router/shard-worker.d.ts +44 -0
  321. package/dist/router/shard-worker.js +163 -0
  322. package/dist/router/shard-worker.js.map +1 -0
  323. package/dist/transport/cells-http.d.ts +25 -0
  324. package/dist/transport/cells-http.js +141 -0
  325. package/dist/transport/cells-http.js.map +1 -0
  326. package/dist/transport/cells-link.d.ts +27 -0
  327. package/dist/transport/cells-link.js +71 -0
  328. package/dist/transport/cells-link.js.map +1 -0
  329. package/dist/transport/port.d.ts +26 -0
  330. package/dist/transport/port.js +100 -0
  331. package/dist/transport/port.js.map +1 -0
  332. package/dist/v8/codec.d.ts +6 -0
  333. package/dist/v8/codec.js +9 -0
  334. package/dist/v8/codec.js.map +1 -0
  335. package/dist/v8/serialize.d.ts +10 -0
  336. package/dist/v8/serialize.js +601 -0
  337. package/dist/v8/serialize.js.map +1 -0
  338. package/dist/ws/client.d.ts +25 -0
  339. package/dist/ws/client.js +203 -0
  340. package/dist/ws/client.js.map +1 -0
  341. package/dist/ws/control.d.ts +48 -0
  342. package/dist/ws/control.js +44 -0
  343. package/dist/ws/control.js.map +1 -0
  344. package/dist/ws/frames.d.ts +38 -0
  345. package/dist/ws/frames.js +39 -0
  346. package/dist/ws/frames.js.map +1 -0
  347. package/dist/ws/server.d.ts +99 -0
  348. package/dist/ws/server.js +295 -0
  349. package/dist/ws/server.js.map +1 -0
  350. package/dist/ws/sw-connector.d.ts +10 -0
  351. package/dist/ws/sw-connector.js +25 -0
  352. package/dist/ws/sw-connector.js.map +1 -0
  353. package/dist/ws/upgrade.d.ts +28 -0
  354. package/dist/ws/upgrade.js +75 -0
  355. package/dist/ws/upgrade.js.map +1 -0
  356. package/package.json +111 -3
  357. package/vendor/celld/LICENSE +202 -0
  358. package/vendor/celld/kv.js +1131 -0
  359. package/vendor/celld/queues.js +1656 -0
  360. package/vendor/celld/workflows.js +1610 -0
  361. package/vendor/html-rewriter-wasm/html_rewriter.js +925 -0
  362. package/vendor/html-rewriter-wasm/html_rewriter_bg.wasm +0 -0
  363. package/vendor/miniflare/d1-api.js +738 -0
  364. package/vendor/miniflare/d1-database.js +6978 -0
  365. package/vendor/miniflare/kv-namespace.js +3061 -0
@@ -0,0 +1,183 @@
1
+ import { classHandle, cross, ctxExports, entrypointStub, ISOLATED, pipeTo, REFUSE, rpcPromise, } from "../core/handles.js";
2
+ /** workerd's refusal of a loaded Worker's entrypoint passed on to another Worker. */
3
+ const DYNAMIC_ENTRYPOINT = "Entrypoints to dynamically-loaded workers cannot be transferred to other Workers, because the system does not know how to reload this Worker from scratch. Instead, have the parent Worker expose an entrypoint which constructs the dynamic worker and forwards to it.";
4
+ /**
5
+ * One `WorkerCode.modules` entry as ES module source; text and JSON become a default export,
6
+ * wasm bytes a compiled `WebAssembly.Module`.
7
+ */
8
+ export function moduleText(entry) {
9
+ if (typeof entry === "string")
10
+ return entry;
11
+ const m = entry; // workerLoader refuses data
12
+ if (m.wasm) {
13
+ const bytes = ArrayBuffer.isView(m.wasm)
14
+ ? new Uint8Array(m.wasm.buffer, m.wasm.byteOffset, m.wasm.byteLength)
15
+ : new Uint8Array(m.wasm);
16
+ let bin = "";
17
+ for (const b of bytes)
18
+ bin += String.fromCharCode(b);
19
+ return `export default new WebAssembly.Module(Uint8Array.from(atob("${btoa(bin)}"), (c) => c.charCodeAt(0)));`;
20
+ }
21
+ return m.js ?? m.esModule ?? `export default ${JSON.stringify(m.text ?? m.json)};`;
22
+ }
23
+ /**
24
+ * The `fetch` loaded code sees, from `WorkerCode.globalOutbound`: omitted → the loader's own
25
+ * (undefined: no override); `null` → every fetch throws; a Fetcher → each fetch goes through it.
26
+ */
27
+ export function outboundFetch(code) {
28
+ const o = code.globalOutbound;
29
+ if (o === undefined)
30
+ return undefined;
31
+ if (o === null)
32
+ return (async () => {
33
+ throw new Error("This worker is not permitted to access the internet via global functions like fetch(). It must use capabilities (such as bindings in 'env') to talk to the outside world.");
34
+ });
35
+ if (typeof o.fetch === "function")
36
+ return ((input, init) => o.fetch(input, init));
37
+ throw new TypeError("globalOutbound must be null or a Fetcher");
38
+ }
39
+ /**
40
+ * The Worker Loader binding (`worker_loaders` in wrangler config): runtime-loaded code,
41
+ * cached by id; the callback runs only when the id is not loaded yet.
42
+ */
43
+ export function workerLoader(load, opts = {}) {
44
+ // With isolated loading, Durable Object classes (facets) still load in this realm.
45
+ const classCache = new Map();
46
+ const cache = new Map();
47
+ let anonymous = 0;
48
+ const loader = {
49
+ /** Compiles and runs code without the id cache (a fresh Worker per call). */
50
+ load(code) {
51
+ return loader.get(`__load-${++anonymous}-${Math.random().toString(36).slice(2)}`, () => code, false);
52
+ },
53
+ get(id, getCode, cached = true) {
54
+ let own; // load(): memoized per handle, not in the id cache
55
+ const loaded = () => {
56
+ let p = cached ? cache.get(id) : own;
57
+ if (!p) {
58
+ p = (async () => {
59
+ const code = await getCode();
60
+ // celld takes module source and wasm bytes only, not `data` modules.
61
+ for (const [name, m] of Object.entries(code.modules))
62
+ if (typeof m === "object" && "data" in m)
63
+ throw new Error(`worker loader: module "${name}" must be a string or wasm bytes`);
64
+ const logs = [];
65
+ const sink = (level, message) => logs.push({ level, message, timestamp: Date.now() });
66
+ const module = await load(id, code, sink);
67
+ const env = code.env ?? {};
68
+ return { module, env, exports: ctxExports(module, env), code, logs };
69
+ })();
70
+ p.catch(() => cache.delete(id));
71
+ if (cached)
72
+ cache.set(id, p);
73
+ else
74
+ own = p;
75
+ }
76
+ return p;
77
+ };
78
+ /**
79
+ * Runs one invocation of loaded code, then hands its logs/exceptions to the Tail Workers.
80
+ * Returns the run's result as is (an RpcPromise stays one, for pipelining).
81
+ */
82
+ const traced = (l, request, run) => {
83
+ const from = l.logs.length;
84
+ const t0 = Date.now();
85
+ let r;
86
+ try {
87
+ r = run();
88
+ }
89
+ catch (e) {
90
+ r = Promise.reject(e);
91
+ }
92
+ const report = (exceptions) => {
93
+ const event = {
94
+ scriptName: id,
95
+ outcome: exceptions.length ? "exception" : "ok",
96
+ eventTimestamp: t0,
97
+ event: request ? { request: { url: request.url, method: request.method } } : null,
98
+ logs: l.logs.splice(from),
99
+ exceptions,
100
+ diagnosticsChannelEvents: [],
101
+ };
102
+ for (const t of l.code.tails ?? [])
103
+ void Promise.resolve(t.tail([event])).catch(() => { });
104
+ };
105
+ Promise.resolve(r).then(() => report([]), (e) => report([
106
+ {
107
+ name: e?.name ?? "Error",
108
+ message: String(e?.message ?? e),
109
+ timestamp: Date.now(),
110
+ },
111
+ ]));
112
+ return r;
113
+ };
114
+ return {
115
+ getDurableObjectClass(name) {
116
+ const classesLoaded = () => {
117
+ let p = classCache.get(id);
118
+ if (!p) {
119
+ p = (async () => {
120
+ const code = await getCode();
121
+ return { module: await opts.classes(id, code), env: code.env ?? {} };
122
+ })();
123
+ classCache.set(id, p);
124
+ }
125
+ return p;
126
+ };
127
+ return classHandle(async () => {
128
+ if (!opts.classes) {
129
+ const iso = (await loaded()).module[ISOLATED];
130
+ if (iso)
131
+ return { isolated: iso(name) };
132
+ }
133
+ const { module, env } = opts.classes ? await classesLoaded() : await loaded();
134
+ const cls = module[name];
135
+ if (typeof cls !== "function")
136
+ throw new Error(`Loaded worker "${id}" does not export class "${name}"`);
137
+ return { cls: cls, env };
138
+ });
139
+ },
140
+ /** Releases the loaded Worker: the id leaves the cache; a later get() loads again. */
141
+ dispose() {
142
+ cache.delete(id);
143
+ },
144
+ getEntrypoint(name = "default", options = {}) {
145
+ // Props cross now (workerd serializes them here): a refusal is a rejected promise,
146
+ // so `await` and `assert.rejects` see it.
147
+ try {
148
+ cross(options.props);
149
+ }
150
+ catch (e) {
151
+ const refused = Promise.reject(e);
152
+ refused.catch(() => { });
153
+ return refused;
154
+ }
155
+ return new Proxy({}, {
156
+ get(_t, prop) {
157
+ if (prop === REFUSE)
158
+ return DYNAMIC_ENTRYPOINT;
159
+ if (prop === "then" || typeof prop === "symbol")
160
+ return undefined;
161
+ return (...args) => {
162
+ // Boxed, so awaiting the load does not await the call: calls on its
163
+ // RpcPromise are pipelined.
164
+ const run = loaded().then((l) => {
165
+ const stub = entrypointStub(l.module[name], l.env, options.props, l.exports);
166
+ const request = prop === "fetch"
167
+ ? new Request(args[0], args[1])
168
+ : undefined;
169
+ return {
170
+ r: traced(l, request, () => stub[prop](...(request ? [request] : args))),
171
+ };
172
+ });
173
+ return rpcPromise(run.then((b) => b.r), (path, a) => run.then((b) => pipeTo(b.r, path, a)));
174
+ };
175
+ },
176
+ });
177
+ },
178
+ };
179
+ },
180
+ };
181
+ return loader;
182
+ }
183
+ //# sourceMappingURL=worker-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-loader.js","sourceRoot":"","sources":["../../src/bindings/worker-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n classHandle,\n cross,\n ctxExports,\n type DurableObjectClass,\n entrypointStub,\n ISOLATED,\n type IsolatedClass,\n pipeTo,\n REFUSE,\n rpcPromise,\n} from \"../core/handles.js\";\n\n/** workerd's refusal of a loaded Worker's entrypoint passed on to another Worker. */\nconst DYNAMIC_ENTRYPOINT =\n \"Entrypoints to dynamically-loaded workers cannot be transferred to other Workers, because the system does not know how to reload this Worker from scratch. Instead, have the parent Worker expose an entrypoint which constructs the dynamic worker and forwards to it.\";\n\n/** What `env.LOADER.get(id, () => code)` returns from its callback (workerd's WorkerCode). */\nexport interface WorkerCode {\n compatibilityDate?: string;\n compatibilityFlags?: string[];\n mainModule: string;\n modules: Record<\n string,\n | string\n | { js?: string; esModule?: string; text?: string; json?: unknown; wasm?: BufferSource }\n | { data: BufferSource }\n >;\n env?: Record<string, unknown>;\n globalOutbound?: unknown;\n /** Tail Workers: stubs whose `tail(events)` receives each invocation's logs and exceptions. */\n tails?: { tail(events: TailEvent[]): unknown }[];\n}\n\nexport interface TailLog {\n message: unknown[];\n level: string;\n timestamp: number;\n}\n\nexport interface TailEvent {\n scriptName: string;\n outcome: \"ok\" | \"exception\";\n eventTimestamp: number;\n event: { request?: { url: string; method: string } } | null;\n logs: TailLog[];\n exceptions: { name: string; message: string; timestamp: number }[];\n diagnosticsChannelEvents: unknown[];\n}\n\n/**\n * One `WorkerCode.modules` entry as ES module source; text and JSON become a default export,\n * wasm bytes a compiled `WebAssembly.Module`.\n */\nexport function moduleText(entry: WorkerCode[\"modules\"][string]): string {\n if (typeof entry === \"string\") return entry;\n const m = entry as Exclude<typeof entry, { data: BufferSource }>; // workerLoader refuses data\n if (m.wasm) {\n const bytes = ArrayBuffer.isView(m.wasm)\n ? new Uint8Array(m.wasm.buffer, m.wasm.byteOffset, m.wasm.byteLength)\n : new Uint8Array(m.wasm);\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n return `export default new WebAssembly.Module(Uint8Array.from(atob(\"${btoa(bin)}\"), (c) => c.charCodeAt(0)));`;\n }\n return m.js ?? m.esModule ?? `export default ${JSON.stringify(m.text ?? m.json)};`;\n}\n\n/**\n * The `fetch` loaded code sees, from `WorkerCode.globalOutbound`: omitted → the loader's own\n * (undefined: no override); `null` → every fetch throws; a Fetcher → each fetch goes through it.\n */\nexport function outboundFetch(code: WorkerCode): typeof fetch | undefined {\n const o = code.globalOutbound as { fetch?: typeof fetch } | null | undefined;\n if (o === undefined) return undefined;\n if (o === null)\n return (async () => {\n throw new Error(\n \"This worker is not permitted to access the internet via global functions like fetch(). It must use capabilities (such as bindings in 'env') to talk to the outside world.\",\n );\n }) as typeof fetch;\n if (typeof o.fetch === \"function\")\n return ((input: RequestInfo | URL, init?: RequestInit) =>\n o.fetch!(input, init)) as typeof fetch;\n throw new TypeError(\"globalOutbound must be null or a Fetcher\");\n}\n\n/** Where the `console` of loaded code writes (the host forwards to the real console too). */\nexport type LogSink = (level: string, args: unknown[]) => void;\n\n/** Compiles a WorkerCode into a module namespace (host specific: esbuild on Node, webrun-modules in browsers). */\nexport type ModuleLoader = (\n id: string,\n code: WorkerCode,\n logs?: LogSink,\n) => Promise<Record<string, unknown>>;\n\n/**\n * The Worker Loader binding (`worker_loaders` in wrangler config): runtime-loaded code,\n * cached by id; the callback runs only when the id is not loaded yet.\n */\nexport function workerLoader(load: ModuleLoader, opts: { classes?: ModuleLoader } = {}) {\n // With isolated loading, Durable Object classes (facets) still load in this realm.\n const classCache = new Map<string, Promise<{ module: Record<string, unknown>; env: unknown }>>();\n type Loaded = {\n module: Record<string, unknown>;\n env: unknown;\n /** ctx.exports of the loaded code (empty for an isolated module: the isolate builds its own). */\n exports: Record<string, unknown>;\n code: WorkerCode;\n logs: TailLog[];\n };\n const cache = new Map<string, Promise<Loaded>>();\n let anonymous = 0;\n const loader = {\n /** Compiles and runs code without the id cache (a fresh Worker per call). */\n load(code: WorkerCode) {\n return loader.get(\n `__load-${++anonymous}-${Math.random().toString(36).slice(2)}`,\n () => code,\n false,\n );\n },\n get(id: string, getCode: () => WorkerCode | Promise<WorkerCode>, cached = true) {\n let own: Promise<Loaded> | undefined; // load(): memoized per handle, not in the id cache\n const loaded = () => {\n let p = cached ? cache.get(id) : own;\n if (!p) {\n p = (async () => {\n const code = await getCode();\n // celld takes module source and wasm bytes only, not `data` modules.\n for (const [name, m] of Object.entries(code.modules))\n if (typeof m === \"object\" && \"data\" in m)\n throw new Error(`worker loader: module \"${name}\" must be a string or wasm bytes`);\n const logs: TailLog[] = [];\n const sink: LogSink = (level, message) =>\n logs.push({ level, message, timestamp: Date.now() });\n const module = await load(id, code, sink);\n const env = code.env ?? {};\n return { module, env, exports: ctxExports(module, env), code, logs };\n })();\n p.catch(() => cache.delete(id));\n if (cached) cache.set(id, p);\n else own = p;\n }\n return p;\n };\n /**\n * Runs one invocation of loaded code, then hands its logs/exceptions to the Tail Workers.\n * Returns the run's result as is (an RpcPromise stays one, for pipelining).\n */\n const traced = (l: Loaded, request: Request | undefined, run: () => unknown): unknown => {\n const from = l.logs.length;\n const t0 = Date.now();\n let r: unknown;\n try {\n r = run();\n } catch (e) {\n r = Promise.reject(e);\n }\n const report = (exceptions: TailEvent[\"exceptions\"]) => {\n const event: TailEvent = {\n scriptName: id,\n outcome: exceptions.length ? \"exception\" : \"ok\",\n eventTimestamp: t0,\n event: request ? { request: { url: request.url, method: request.method } } : null,\n logs: l.logs.splice(from),\n exceptions,\n diagnosticsChannelEvents: [],\n };\n for (const t of l.code.tails ?? []) void Promise.resolve(t.tail([event])).catch(() => {});\n };\n Promise.resolve(r).then(\n () => report([]),\n (e) =>\n report([\n {\n name: (e as Error)?.name ?? \"Error\",\n message: String((e as Error)?.message ?? e),\n timestamp: Date.now(),\n },\n ]),\n );\n return r;\n };\n return {\n getDurableObjectClass(name: string) {\n const classesLoaded = () => {\n let p = classCache.get(id);\n if (!p) {\n p = (async () => {\n const code = await getCode();\n return { module: await opts.classes!(id, code), env: code.env ?? {} };\n })();\n classCache.set(id, p);\n }\n return p;\n };\n return classHandle(async () => {\n if (!opts.classes) {\n const iso = (await loaded()).module[ISOLATED as unknown as string] as\n | ((name: string) => IsolatedClass)\n | undefined;\n if (iso) return { isolated: iso(name) };\n }\n const { module, env } = opts.classes ? await classesLoaded() : await loaded();\n const cls = module[name];\n if (typeof cls !== \"function\")\n throw new Error(`Loaded worker \"${id}\" does not export class \"${name}\"`);\n return { cls: cls as DurableObjectClass, env };\n });\n },\n /** Releases the loaded Worker: the id leaves the cache; a later get() loads again. */\n dispose() {\n cache.delete(id);\n },\n getEntrypoint(name = \"default\", options: { props?: unknown } = {}) {\n // Props cross now (workerd serializes them here): a refusal is a rejected promise,\n // so `await` and `assert.rejects` see it.\n try {\n cross(options.props);\n } catch (e) {\n const refused = Promise.reject(e);\n refused.catch(() => {});\n return refused as never;\n }\n return new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === REFUSE) return DYNAMIC_ENTRYPOINT;\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n return (...args: unknown[]) => {\n // Boxed, so awaiting the load does not await the call: calls on its\n // RpcPromise are pipelined.\n const run = loaded().then((l) => {\n const stub = entrypointStub(l.module[name], l.env, options.props, l.exports);\n const request =\n prop === \"fetch\"\n ? new Request(args[0] as RequestInfo, args[1] as RequestInit)\n : undefined;\n return {\n r: traced(l, request, () =>\n stub[prop as string](...(request ? [request] : args)),\n ),\n };\n });\n return rpcPromise(\n run.then((b) => b.r),\n (path, a) => run.then((b) => pipeTo(b.r, path, a)),\n );\n };\n },\n },\n );\n },\n };\n },\n };\n return loader;\n}\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Workers AI (`env.AI`, wrangler `ai: { binding }`) served by an OpenAI-compatible endpoint:
3
+ * a local llama.cpp or Ollama server, a hosted API, or a test's fake. Text generation and
4
+ * embeddings; other model kinds (images, speech) are refused.
5
+ *
6
+ * env.AI.run(model, { prompt } | { messages, tools?, stream?, ... }, options?)
7
+ * → { response, tool_calls?, usage } (Workers AI's shape)
8
+ * → ReadableStream of `data: {"response": …}` (with `stream: true`)
9
+ * → the endpoint's Response as is (with `returnRawResponse`: Flue's path)
10
+ * env.AI.run(model, { text }) → { shape, data, pooling } (embeddings)
11
+ */
12
+ /** Plain data, so that it can travel to a browser worker with the rest of a project's options. */
13
+ export interface WorkersAiOptions {
14
+ /** The endpoint's base URL, up to `/v1` (e.g. `http://127.0.0.1:8080/v1`). */
15
+ baseUrl: string;
16
+ /** Sent as `Authorization: Bearer …`. */
17
+ apiKey?: string;
18
+ /**
19
+ * Workers AI model id (`@cf/meta/llama-3.1-8b-instruct`) → the endpoint's model name; `"*"`
20
+ * names the model for every id not listed. Ids that map to nothing are sent as they are.
21
+ */
22
+ models?: Record<string, string>;
23
+ }
24
+ /** `env.AI.run`'s third argument (the parts cellb honours; `gateway` is accepted and ignored). */
25
+ export interface AiRunOptions {
26
+ returnRawResponse?: boolean;
27
+ signal?: AbortSignal;
28
+ extraHeaders?: Record<string, string>;
29
+ gateway?: unknown;
30
+ }
31
+ /** Workers AI's error: `run` rejects with it when the endpoint answers with an error status. */
32
+ export declare class AiError extends Error {
33
+ constructor(message: string);
34
+ }
35
+ export declare function workersAi(opts: WorkersAiOptions, fetchImpl?: typeof fetch): {
36
+ run(model: string, inputs: unknown, options?: AiRunOptions): Promise<unknown>;
37
+ /** Workers AI's AI Gateway: not available, `run` ignores its `gateway` option. */
38
+ gateway(): never;
39
+ };
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Workers AI (`env.AI`, wrangler `ai: { binding }`) served by an OpenAI-compatible endpoint:
3
+ * a local llama.cpp or Ollama server, a hosted API, or a test's fake. Text generation and
4
+ * embeddings; other model kinds (images, speech) are refused.
5
+ *
6
+ * env.AI.run(model, { prompt } | { messages, tools?, stream?, ... }, options?)
7
+ * → { response, tool_calls?, usage } (Workers AI's shape)
8
+ * → ReadableStream of `data: {"response": …}` (with `stream: true`)
9
+ * → the endpoint's Response as is (with `returnRawResponse`: Flue's path)
10
+ * env.AI.run(model, { text }) → { shape, data, pooling } (embeddings)
11
+ */
12
+ /** Workers AI's error: `run` rejects with it when the endpoint answers with an error status. */
13
+ export class AiError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = "AiError";
17
+ }
18
+ }
19
+ export function workersAi(opts, fetchImpl = (r, i) => fetch(r, i)) {
20
+ const base = opts.baseUrl.replace(/\/+$/, "");
21
+ const modelOf = (id) => opts.models?.[id] ?? opts.models?.["*"] ?? id;
22
+ const post = (path, body, o) => fetchImpl(`${base}/${path}`, {
23
+ method: "POST",
24
+ headers: {
25
+ "content-type": "application/json",
26
+ ...(opts.apiKey ? { authorization: `Bearer ${opts.apiKey}` } : {}),
27
+ ...o.extraHeaders,
28
+ },
29
+ body: JSON.stringify(body),
30
+ signal: o.signal,
31
+ });
32
+ const failed = async (res) => new AiError(`Workers AI: the model endpoint answered ${res.status}: ${await res.text()}`);
33
+ async function chat(model, inputs, o) {
34
+ const { prompt, messages, tools, stream, raw: _raw, lora: _lora, ...rest } = inputs;
35
+ const body = {
36
+ ...rest,
37
+ model: modelOf(model),
38
+ messages: messages ?? [{ role: "user", content: String(prompt) }],
39
+ stream: !!stream,
40
+ };
41
+ // Workers AI tools are { name, description, parameters }; OpenAI's are wrapped in `function`.
42
+ if (Array.isArray(tools))
43
+ body.tools = tools.map((t) => t.type === "function"
44
+ ? t
45
+ : {
46
+ type: "function",
47
+ function: { name: t.name, description: t.description, parameters: t.parameters },
48
+ });
49
+ const res = await post("chat/completions", body, o);
50
+ if (o.returnRawResponse)
51
+ return res;
52
+ if (!res.ok)
53
+ throw await failed(res);
54
+ if (stream && res.body)
55
+ return res.body.pipeThrough(toWorkersAiStream());
56
+ const json = (await res.json());
57
+ const message = json.choices?.[0]?.message ?? {};
58
+ const out = { response: message.content ?? "" };
59
+ if (message.tool_calls?.length)
60
+ out.tool_calls = message.tool_calls.map(toWorkersAiToolCall);
61
+ if (json.usage)
62
+ out.usage = json.usage;
63
+ return out;
64
+ }
65
+ async function embed(model, inputs, o) {
66
+ const res = await post("embeddings", { model: modelOf(model), input: inputs.text }, o);
67
+ if (o.returnRawResponse)
68
+ return res;
69
+ if (!res.ok)
70
+ throw await failed(res);
71
+ const json = (await res.json());
72
+ const data = json.data.map((d) => d.embedding);
73
+ return { shape: [data.length, data[0]?.length ?? 0], data, pooling: "mean" };
74
+ }
75
+ return {
76
+ async run(model, inputs, options = {}) {
77
+ if (!inputs || typeof inputs !== "object")
78
+ throw new TypeError("Workers AI: run(model, inputs) takes an inputs object");
79
+ const i = inputs;
80
+ if ("messages" in i || "prompt" in i)
81
+ return chat(model, i, options);
82
+ if ("text" in i)
83
+ return embed(model, i, options);
84
+ throw new AiError(`Workers AI: cellb serves text generation ({ prompt } or { messages }) and embeddings ({ text }) only; ${model} got neither`);
85
+ },
86
+ /** Workers AI's AI Gateway: not available, `run` ignores its `gateway` option. */
87
+ gateway() {
88
+ throw new AiError("Workers AI: AI Gateway is not supported by cellb");
89
+ },
90
+ };
91
+ }
92
+ /** Workers AI's tool call: `{ name, arguments }`, with the arguments parsed. */
93
+ function toWorkersAiToolCall(tc) {
94
+ let args = tc.function?.arguments ?? {};
95
+ if (typeof args === "string")
96
+ try {
97
+ args = JSON.parse(args || "{}");
98
+ }
99
+ catch {
100
+ // not JSON: passed on as the model wrote it
101
+ }
102
+ return { name: tc.function?.name ?? "", arguments: args };
103
+ }
104
+ /**
105
+ * OpenAI chat-completion chunks (`data: {"choices":[{"delta":…}]}`) → Workers AI's stream
106
+ * (`data: {"response":"…"}`, then `data: [DONE]`), usage riding along. Tool calls stream in
107
+ * fragments (a name, then pieces of the arguments' JSON, keyed by `index`): they are gathered and
108
+ * sent whole, once, before `[DONE]`, as `{ response: "", tool_calls: [{ name, arguments }] }`.
109
+ */
110
+ function toWorkersAiStream() {
111
+ const decoder = new TextDecoder();
112
+ const encoder = new TextEncoder();
113
+ let buffer = "";
114
+ let done = false;
115
+ const calls = new Map();
116
+ const emit = (c, data) => c.enqueue(encoder.encode(`data: ${data}\n\n`));
117
+ const finish = (c) => {
118
+ if (done)
119
+ return;
120
+ done = true;
121
+ if (calls.size) {
122
+ const toolCalls = [...calls.entries()]
123
+ .sort(([a], [b]) => a - b)
124
+ .map(([, call]) => toWorkersAiToolCall({ function: call }));
125
+ emit(c, JSON.stringify({ response: "", tool_calls: toolCalls }));
126
+ }
127
+ emit(c, "[DONE]");
128
+ };
129
+ const line = (c, l) => {
130
+ if (!l.startsWith("data:"))
131
+ return;
132
+ const data = l.slice(5).trim();
133
+ if (data === "[DONE]")
134
+ return finish(c);
135
+ let chunk;
136
+ try {
137
+ chunk = JSON.parse(data);
138
+ }
139
+ catch {
140
+ return;
141
+ }
142
+ const delta = chunk.choices?.[0]?.delta;
143
+ for (const [i, tc] of (delta?.tool_calls ?? []).entries()) {
144
+ const index = tc.index ?? i;
145
+ const call = calls.get(index) ?? { name: "", arguments: "" };
146
+ call.name += tc.function?.name ?? "";
147
+ call.arguments += tc.function?.arguments ?? "";
148
+ calls.set(index, call);
149
+ }
150
+ const out = { response: delta?.content ?? "" };
151
+ if (chunk.usage)
152
+ out.usage = chunk.usage;
153
+ if (out.response === "" && !out.usage)
154
+ return;
155
+ emit(c, JSON.stringify(out));
156
+ };
157
+ return new TransformStream({
158
+ transform(bytes, c) {
159
+ buffer += decoder.decode(bytes, { stream: true });
160
+ let nl = buffer.indexOf("\n");
161
+ while (nl >= 0) {
162
+ line(c, buffer.slice(0, nl).replace(/\r$/, ""));
163
+ buffer = buffer.slice(nl + 1);
164
+ nl = buffer.indexOf("\n");
165
+ }
166
+ },
167
+ flush(c) {
168
+ buffer += decoder.decode();
169
+ if (buffer)
170
+ line(c, buffer.trim());
171
+ finish(c);
172
+ },
173
+ });
174
+ }
175
+ //# sourceMappingURL=workers-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers-ai.js","sourceRoot":"","sources":["../../src/bindings/workers-ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyBH,gGAAgG;AAChG,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAChC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,IAAsB,EAAE,SAAS,GAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAU,EAAE,CAAe,EAAE,EAAE,CACzD,SAAS,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,CAAC,YAAY;SAClB;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC,CAAC;IACL,MAAM,MAAM,GAAG,KAAK,EAAE,GAAa,EAAE,EAAE,CACrC,IAAI,OAAO,CAAC,2CAA2C,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE5F,KAAK,UAAU,IAAI,CAAC,KAAa,EAAE,MAAY,EAAE,CAAe;QAC9D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACpF,MAAM,IAAI,GAAS;YACjB,GAAG,IAAI;YACP,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;YACrB,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC;QACF,8FAA8F;QAC9F,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAO,EAAE,EAAE,CACjC,CAAC,CAAC,IAAI,KAAK,UAAU;gBACnB,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC;oBACE,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE;iBACjF,CACN,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,iBAAiB;YAAE,OAAO,GAAG,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QACjD,MAAM,GAAG,GAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM;YAAE,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,KAAK;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,UAAU,KAAK,CAAC,KAAa,EAAE,MAAY,EAAE,CAAe;QAC/D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,CAAC,iBAAiB;YAAE,OAAO,GAAG,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwC,CAAC;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,MAAe,EAAE,OAAO,GAAiB,EAAE;YAClE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBACvC,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;YAC/E,MAAM,CAAC,GAAG,MAAc,CAAC;YACzB,IAAI,UAAU,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACrE,IAAI,MAAM,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,OAAO,CACf,yGAAyG,KAAK,cAAc,CAC7H,CAAC;QACJ,CAAC;QACD,kFAAkF;QAClF,OAAO;YACL,MAAM,IAAI,OAAO,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;KACF,CAAC;AACJ,CAAC;AASD,gFAAgF;AAChF,SAAS,mBAAmB,CAAC,EAAkB;IAC7C,IAAI,IAAI,GAAY,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAC1B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+C,CAAC;IACrE,MAAM,IAAI,GAAG,CAAC,CAA+C,EAAE,IAAY,EAAE,EAAE,CAC7E,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,CAA+C,EAAE,EAAE;QACjE,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;iBACnC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;iBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,CAA+C,EAAE,CAAS,EAAE,EAAE;QAC1E,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,KAGH,CAAC;QACF,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC7D,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;YAC/C,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,GAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QACrD,IAAI,KAAK,CAAC,KAAK;YAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzC,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QAC9C,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,OAAO,IAAI,eAAe,CAAC;QACzB,SAAS,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC9B,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,KAAK,CAAC,CAAC;YACL,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,MAAM;gBAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Workers AI (`env.AI`, wrangler `ai: { binding }`) served by an OpenAI-compatible endpoint:\n * a local llama.cpp or Ollama server, a hosted API, or a test's fake. Text generation and\n * embeddings; other model kinds (images, speech) are refused.\n *\n * env.AI.run(model, { prompt } | { messages, tools?, stream?, ... }, options?)\n * → { response, tool_calls?, usage } (Workers AI's shape)\n * → ReadableStream of `data: {\"response\": …}` (with `stream: true`)\n * → the endpoint's Response as is (with `returnRawResponse`: Flue's path)\n * env.AI.run(model, { text }) → { shape, data, pooling } (embeddings)\n */\n\n/** Plain data, so that it can travel to a browser worker with the rest of a project's options. */\nexport interface WorkersAiOptions {\n /** The endpoint's base URL, up to `/v1` (e.g. `http://127.0.0.1:8080/v1`). */\n baseUrl: string;\n /** Sent as `Authorization: Bearer …`. */\n apiKey?: string;\n /**\n * Workers AI model id (`@cf/meta/llama-3.1-8b-instruct`) → the endpoint's model name; `\"*\"`\n * names the model for every id not listed. Ids that map to nothing are sent as they are.\n */\n models?: Record<string, string>;\n}\n\n/** `env.AI.run`'s third argument (the parts cellb honours; `gateway` is accepted and ignored). */\nexport interface AiRunOptions {\n returnRawResponse?: boolean;\n signal?: AbortSignal;\n extraHeaders?: Record<string, string>;\n gateway?: unknown;\n}\n\ntype Json = Record<string, unknown>;\n\n/** Workers AI's error: `run` rejects with it when the endpoint answers with an error status. */\nexport class AiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AiError\";\n }\n}\n\nexport function workersAi(opts: WorkersAiOptions, fetchImpl: typeof fetch = (r, i) => fetch(r, i)) {\n const base = opts.baseUrl.replace(/\\/+$/, \"\");\n const modelOf = (id: string) => opts.models?.[id] ?? opts.models?.[\"*\"] ?? id;\n const post = (path: string, body: Json, o: AiRunOptions) =>\n fetchImpl(`${base}/${path}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(opts.apiKey ? { authorization: `Bearer ${opts.apiKey}` } : {}),\n ...o.extraHeaders,\n },\n body: JSON.stringify(body),\n signal: o.signal,\n });\n const failed = async (res: Response) =>\n new AiError(`Workers AI: the model endpoint answered ${res.status}: ${await res.text()}`);\n\n async function chat(model: string, inputs: Json, o: AiRunOptions) {\n const { prompt, messages, tools, stream, raw: _raw, lora: _lora, ...rest } = inputs;\n const body: Json = {\n ...rest,\n model: modelOf(model),\n messages: messages ?? [{ role: \"user\", content: String(prompt) }],\n stream: !!stream,\n };\n // Workers AI tools are { name, description, parameters }; OpenAI's are wrapped in `function`.\n if (Array.isArray(tools))\n body.tools = tools.map((t: Json) =>\n t.type === \"function\"\n ? t\n : {\n type: \"function\",\n function: { name: t.name, description: t.description, parameters: t.parameters },\n },\n );\n const res = await post(\"chat/completions\", body, o);\n if (o.returnRawResponse) return res;\n if (!res.ok) throw await failed(res);\n if (stream && res.body) return res.body.pipeThrough(toWorkersAiStream());\n const json = (await res.json()) as {\n choices?: { message?: { content?: string | null; tool_calls?: OpenAiToolCall[] } }[];\n usage?: unknown;\n };\n const message = json.choices?.[0]?.message ?? {};\n const out: Json = { response: message.content ?? \"\" };\n if (message.tool_calls?.length) out.tool_calls = message.tool_calls.map(toWorkersAiToolCall);\n if (json.usage) out.usage = json.usage;\n return out;\n }\n\n async function embed(model: string, inputs: Json, o: AiRunOptions) {\n const res = await post(\"embeddings\", { model: modelOf(model), input: inputs.text }, o);\n if (o.returnRawResponse) return res;\n if (!res.ok) throw await failed(res);\n const json = (await res.json()) as { data: { embedding: number[] }[] };\n const data = json.data.map((d) => d.embedding);\n return { shape: [data.length, data[0]?.length ?? 0], data, pooling: \"mean\" };\n }\n\n return {\n async run(model: string, inputs: unknown, options: AiRunOptions = {}): Promise<unknown> {\n if (!inputs || typeof inputs !== \"object\")\n throw new TypeError(\"Workers AI: run(model, inputs) takes an inputs object\");\n const i = inputs as Json;\n if (\"messages\" in i || \"prompt\" in i) return chat(model, i, options);\n if (\"text\" in i) return embed(model, i, options);\n throw new AiError(\n `Workers AI: cellb serves text generation ({ prompt } or { messages }) and embeddings ({ text }) only; ${model} got neither`,\n );\n },\n /** Workers AI's AI Gateway: not available, `run` ignores its `gateway` option. */\n gateway(): never {\n throw new AiError(\"Workers AI: AI Gateway is not supported by cellb\");\n },\n };\n}\n\ninterface OpenAiToolCall {\n /** In a streamed chunk: which call a fragment belongs to. */\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\n/** Workers AI's tool call: `{ name, arguments }`, with the arguments parsed. */\nfunction toWorkersAiToolCall(tc: OpenAiToolCall) {\n let args: unknown = tc.function?.arguments ?? {};\n if (typeof args === \"string\")\n try {\n args = JSON.parse(args || \"{}\");\n } catch {\n // not JSON: passed on as the model wrote it\n }\n return { name: tc.function?.name ?? \"\", arguments: args };\n}\n\n/**\n * OpenAI chat-completion chunks (`data: {\"choices\":[{\"delta\":…}]}`) → Workers AI's stream\n * (`data: {\"response\":\"…\"}`, then `data: [DONE]`), usage riding along. Tool calls stream in\n * fragments (a name, then pieces of the arguments' JSON, keyed by `index`): they are gathered and\n * sent whole, once, before `[DONE]`, as `{ response: \"\", tool_calls: [{ name, arguments }] }`.\n */\nfunction toWorkersAiStream(): TransformStream<Uint8Array, Uint8Array> {\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let buffer = \"\";\n let done = false;\n const calls = new Map<number, { name: string; arguments: string }>();\n const emit = (c: TransformStreamDefaultController<Uint8Array>, data: string) =>\n c.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n const finish = (c: TransformStreamDefaultController<Uint8Array>) => {\n if (done) return;\n done = true;\n if (calls.size) {\n const toolCalls = [...calls.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, call]) => toWorkersAiToolCall({ function: call }));\n emit(c, JSON.stringify({ response: \"\", tool_calls: toolCalls }));\n }\n emit(c, \"[DONE]\");\n };\n const line = (c: TransformStreamDefaultController<Uint8Array>, l: string) => {\n if (!l.startsWith(\"data:\")) return;\n const data = l.slice(5).trim();\n if (data === \"[DONE]\") return finish(c);\n let chunk: {\n choices?: { delta?: { content?: string | null; tool_calls?: OpenAiToolCall[] } }[];\n usage?: unknown;\n };\n try {\n chunk = JSON.parse(data);\n } catch {\n return;\n }\n const delta = chunk.choices?.[0]?.delta;\n for (const [i, tc] of (delta?.tool_calls ?? []).entries()) {\n const index = tc.index ?? i;\n const call = calls.get(index) ?? { name: \"\", arguments: \"\" };\n call.name += tc.function?.name ?? \"\";\n call.arguments += tc.function?.arguments ?? \"\";\n calls.set(index, call);\n }\n const out: Json = { response: delta?.content ?? \"\" };\n if (chunk.usage) out.usage = chunk.usage;\n if (out.response === \"\" && !out.usage) return;\n emit(c, JSON.stringify(out));\n };\n return new TransformStream({\n transform(bytes, c) {\n buffer += decoder.decode(bytes, { stream: true });\n let nl = buffer.indexOf(\"\\n\");\n while (nl >= 0) {\n line(c, buffer.slice(0, nl).replace(/\\r$/, \"\"));\n buffer = buffer.slice(nl + 1);\n nl = buffer.indexOf(\"\\n\");\n }\n },\n flush(c) {\n buffer += decoder.decode();\n if (buffer) line(c, buffer.trim());\n finish(c);\n },\n });\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export { sahpoolOpener } from "./adapters/wasm-sqlite.js";
2
+ export { idbObjectStore } from "./bucket/idb-object-store.js";
3
+ export { type BrowserBucket, type BrowserProjectOptions, browserProjectRuntime, } from "./project/browser-host.js";
4
+ export { type ProjectShards, serveProjectShard, startProjectShards, } from "./project/browser-shards.js";
5
+ export { installProjectRouter, joinProjectShards, type ProjectTabs, type ProjectTabsOptions, type ServiceWorkerScope, shardOwner, } from "./project/browser-tabs.js";
6
+ export { createProjectSite } from "./project/site.js";
7
+ export { serviceWorkerConnector } from "./ws/sw-connector.js";
@@ -0,0 +1,8 @@
1
+ export { sahpoolOpener } from "./adapters/wasm-sqlite.js";
2
+ export { idbObjectStore } from "./bucket/idb-object-store.js";
3
+ export { browserProjectRuntime, } from "./project/browser-host.js";
4
+ export { serveProjectShard, startProjectShards, } from "./project/browser-shards.js";
5
+ export { installProjectRouter, joinProjectShards, shardOwner, } from "./project/browser-tabs.js";
6
+ export { createProjectSite } from "./project/site.js";
7
+ export { serviceWorkerConnector } from "./ws/sw-connector.js";
8
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAGL,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EAIjB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export { sahpoolOpener } from \"./adapters/wasm-sqlite.js\";\nexport { idbObjectStore } from \"./bucket/idb-object-store.js\";\nexport {\n type BrowserBucket,\n type BrowserProjectOptions,\n browserProjectRuntime,\n} from \"./project/browser-host.js\";\nexport {\n type ProjectShards,\n serveProjectShard,\n startProjectShards,\n} from \"./project/browser-shards.js\";\nexport {\n installProjectRouter,\n joinProjectShards,\n type ProjectTabs,\n type ProjectTabsOptions,\n type ServiceWorkerScope,\n shardOwner,\n} from \"./project/browser-tabs.js\";\nexport { createProjectSite } from \"./project/site.js\";\nexport { serviceWorkerConnector } from \"./ws/sw-connector.js\";\n"]}
@@ -0,0 +1,86 @@
1
+ import type { CellBackup, CellDurability } from "../ports.js";
2
+ import { type ObjectStore } from "./object-store.js";
3
+ /**
4
+ * Cells stored the way celld stores them (docs/guarantees.md, and the keys celld dev writes
5
+ * in `.celld/dev/objects.sqlite3`), on any ObjectStore:
6
+ *
7
+ * cells/<Class>:<idHex>/own.json {"node","epoch"}: ownership record
8
+ * cells/<Class>:<idHex>/ltx/e<epoch>/0000/<min>-<max>.ltx LTX v3, legacy LZ4 frames
9
+ * nodes/<node>.json {"node","expires_ms","addr",…}: node lease
10
+ *
11
+ * Ownership: an activation creates the record (If-None-Match) or advances its epoch with a
12
+ * compare-and-swap (If-Match), taking over only from a node whose lease expired. Durability:
13
+ * each committed transaction becomes an LTX file in the cell's current epoch prefix — the
14
+ * first one a snapshot (TXID 1), then the changed pages — and the output gate waits for the
15
+ * PUT. Restore: the newest epoch that starts with a snapshot, its files in TXID order.
16
+ */
17
+ export interface CelldBucketOptions {
18
+ /** This node's name (celld: `dev-…` / the fleet node name). */
19
+ node: string;
20
+ addr?: string;
21
+ leaseTtlMs?: number;
22
+ now?: () => number;
23
+ /** The waker-role lease (celld: 3 × its due-scan tick); match 3 × the runtime's wakePollMs. */
24
+ wakerTtlMs?: number;
25
+ }
26
+ /** celld 0.6.3: how long a node refuses a cell whose ownership record it found lost. */
27
+ export declare const LOST_RECORD_RECHECK_MS = 10000;
28
+ /** The bucket's `close()` also closes `store` (when it has a `close`): pass a store of its own. */
29
+ export declare function celldBucket(store: ObjectStore & {
30
+ close?(): void;
31
+ }, opts: CelldBucketOptions): {
32
+ ownership: {
33
+ tryAcquire(cellKey: string): Promise<{
34
+ name: string;
35
+ epoch: number;
36
+ lost: AbortSignal;
37
+ release: () => Promise<void>;
38
+ } | undefined>;
39
+ };
40
+ durability: CellDurability & CellBackup & {
41
+ logCommit: CellDurability["committed"];
42
+ } & {
43
+ begin(cellKey: string, epoch: number): void;
44
+ forget(cellKey: string): void;
45
+ } & {
46
+ wakes(): Promise<{
47
+ cellKey: string;
48
+ className: string;
49
+ at: number;
50
+ }[]>;
51
+ };
52
+ backup: CellDurability & CellBackup & {
53
+ logCommit: CellDurability["committed"];
54
+ } & {
55
+ begin(cellKey: string, epoch: number): void;
56
+ forget(cellKey: string): void;
57
+ } & {
58
+ wakes(): Promise<{
59
+ cellKey: string;
60
+ className: string;
61
+ at: number;
62
+ }[]>;
63
+ };
64
+ /** The fleet bucket itself (R2 objects live directly in it, under `r2/<bucket>/`). */
65
+ objects: ObjectStore & {
66
+ close?(): void;
67
+ };
68
+ /**
69
+ * The address celld nodes reach this node at (its celld peer server): published in the
70
+ * node record now, so celld routes requests for our cells here instead of refusing them.
71
+ */
72
+ /**
73
+ * Answers celld's signed peer probe (peer_probe.rs): an Ed25519 signature over
74
+ * "cells-peer-probe-v1\n<node>\n<advertised addr>\n<challenge>" by this node's probe key.
75
+ */
76
+ probe(challenge: string): Promise<{
77
+ version: number;
78
+ node: string;
79
+ advertise: string;
80
+ challenge: string;
81
+ signature: string;
82
+ }>;
83
+ advertise(address: string): Promise<void>;
84
+ /** Clean shutdown: stop renewing, remove this node's lease record, close the store. */
85
+ close(): Promise<void>;
86
+ };