@wenathlan/saddle 1.8.7 → 1.8.9

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 (751) hide show
  1. package/README.md +18 -18
  2. package/dist/adapters/forge.d.ts +17 -0
  3. package/dist/adapters/forge.d.ts.map +1 -0
  4. package/dist/adapters/forge.js +19 -0
  5. package/dist/adapters/forge.js.map +1 -0
  6. package/dist/adapters/forgejo.d.ts +49 -0
  7. package/dist/adapters/forgejo.d.ts.map +1 -0
  8. package/{adapters → dist/adapters}/forgejo.js +1 -1
  9. package/dist/adapters/forgejo.js.map +1 -0
  10. package/dist/adapters/github.d.ts +12 -0
  11. package/dist/adapters/github.d.ts.map +1 -0
  12. package/dist/adapters/github.js +20 -0
  13. package/dist/adapters/github.js.map +1 -0
  14. package/dist/adapters/gitlab.d.ts +17 -0
  15. package/dist/adapters/gitlab.d.ts.map +1 -0
  16. package/dist/adapters/gitlab.js +10 -0
  17. package/dist/adapters/gitlab.js.map +1 -0
  18. package/dist/adapters/huggingface.d.ts +17 -0
  19. package/dist/adapters/huggingface.d.ts.map +1 -0
  20. package/{adapters → dist/adapters}/huggingface.js +1 -1
  21. package/dist/adapters/huggingface.js.map +1 -0
  22. package/dist/adapters/socket.d.ts +11 -0
  23. package/dist/adapters/socket.d.ts.map +1 -0
  24. package/dist/adapters/socket.js +17 -0
  25. package/dist/adapters/socket.js.map +1 -0
  26. package/dist/adapters/transport.d.ts +7 -0
  27. package/dist/adapters/transport.d.ts.map +1 -0
  28. package/dist/adapters/transport.js +36 -0
  29. package/dist/adapters/transport.js.map +1 -0
  30. package/dist/ai/chunk.d.ts +2 -0
  31. package/dist/ai/chunk.d.ts.map +1 -0
  32. package/dist/ai/chunk.js +36 -0
  33. package/dist/ai/chunk.js.map +1 -0
  34. package/dist/ai/llmstxt.d.ts +6 -0
  35. package/dist/ai/llmstxt.d.ts.map +1 -0
  36. package/dist/ai/llmstxt.js +12 -0
  37. package/dist/ai/llmstxt.js.map +1 -0
  38. package/dist/ai/provenance.d.ts +22 -0
  39. package/dist/ai/provenance.d.ts.map +1 -0
  40. package/dist/ai/provenance.js +25 -0
  41. package/dist/ai/provenance.js.map +1 -0
  42. package/dist/ai/rag.d.ts +26 -0
  43. package/dist/ai/rag.d.ts.map +1 -0
  44. package/dist/ai/rag.js +22 -0
  45. package/dist/ai/rag.js.map +1 -0
  46. package/dist/ai/tokens.d.ts +15 -0
  47. package/dist/ai/tokens.d.ts.map +1 -0
  48. package/{ai → dist/ai}/tokens.js +1 -1
  49. package/dist/ai/tokens.js.map +1 -0
  50. package/dist/api/auth.d.ts +16 -0
  51. package/dist/api/auth.d.ts.map +1 -0
  52. package/dist/api/auth.js +19 -0
  53. package/dist/api/auth.js.map +1 -0
  54. package/dist/api/contracts.d.ts +28 -0
  55. package/dist/api/contracts.d.ts.map +1 -0
  56. package/{api → dist/api}/contracts.js +3 -6
  57. package/dist/api/contracts.js.map +1 -0
  58. package/dist/api/control.d.ts +10 -0
  59. package/dist/api/control.d.ts.map +1 -0
  60. package/dist/api/control.js +35 -0
  61. package/dist/api/control.js.map +1 -0
  62. package/dist/api/http.d.ts +7 -0
  63. package/dist/api/http.d.ts.map +1 -0
  64. package/{api → dist/api}/http.js +5 -5
  65. package/dist/api/http.js.map +1 -0
  66. package/dist/api/rate.d.ts +28 -0
  67. package/dist/api/rate.d.ts.map +1 -0
  68. package/dist/api/rate.js +36 -0
  69. package/dist/api/rate.js.map +1 -0
  70. package/dist/api/security.d.ts +12 -0
  71. package/dist/api/security.d.ts.map +1 -0
  72. package/dist/api/security.js +56 -0
  73. package/dist/api/security.js.map +1 -0
  74. package/dist/api/service.d.ts +5 -0
  75. package/dist/api/service.d.ts.map +1 -0
  76. package/dist/api/service.js +70 -0
  77. package/dist/api/service.js.map +1 -0
  78. package/dist/apps/registry.d.ts +33 -0
  79. package/dist/apps/registry.d.ts.map +1 -0
  80. package/dist/apps/registry.js +24 -0
  81. package/dist/apps/registry.js.map +1 -0
  82. package/dist/binary/build.d.ts +29 -0
  83. package/dist/binary/build.d.ts.map +1 -0
  84. package/dist/binary/build.js +17 -0
  85. package/dist/binary/build.js.map +1 -0
  86. package/dist/bot/adapter.d.ts +5 -0
  87. package/dist/bot/adapter.d.ts.map +1 -0
  88. package/dist/bot/adapter.js +11 -0
  89. package/dist/bot/adapter.js.map +1 -0
  90. package/dist/bot/bot.d.ts +28 -0
  91. package/dist/bot/bot.d.ts.map +1 -0
  92. package/dist/bot/bot.js +52 -0
  93. package/dist/bot/bot.js.map +1 -0
  94. package/dist/bot/commands.d.ts +8 -0
  95. package/dist/bot/commands.d.ts.map +1 -0
  96. package/dist/bot/commands.js +19 -0
  97. package/dist/bot/commands.js.map +1 -0
  98. package/dist/bot/permissions.d.ts +13 -0
  99. package/dist/bot/permissions.d.ts.map +1 -0
  100. package/dist/bot/permissions.js +16 -0
  101. package/dist/bot/permissions.js.map +1 -0
  102. package/dist/browser/actions.d.ts +33 -0
  103. package/dist/browser/actions.d.ts.map +1 -0
  104. package/dist/browser/actions.js +44 -0
  105. package/dist/browser/actions.js.map +1 -0
  106. package/dist/browser/agent.d.ts +21 -0
  107. package/dist/browser/agent.d.ts.map +1 -0
  108. package/dist/browser/agent.js +13 -0
  109. package/dist/browser/agent.js.map +1 -0
  110. package/dist/browser/context.d.ts +43 -0
  111. package/dist/browser/context.d.ts.map +1 -0
  112. package/dist/browser/context.js +54 -0
  113. package/dist/browser/context.js.map +1 -0
  114. package/dist/browser/fingerprint.d.ts +4 -0
  115. package/dist/browser/fingerprint.d.ts.map +1 -0
  116. package/{browser → dist/browser}/fingerprint.js +4 -4
  117. package/dist/browser/fingerprint.js.map +1 -0
  118. package/dist/browser/index.d.ts +11 -0
  119. package/dist/browser/index.d.ts.map +1 -0
  120. package/{browser → dist/browser}/index.js +1 -0
  121. package/dist/browser/index.js.map +1 -0
  122. package/dist/browser/playwright.d.ts +11 -0
  123. package/dist/browser/playwright.d.ts.map +1 -0
  124. package/dist/browser/playwright.js +24 -0
  125. package/dist/browser/playwright.js.map +1 -0
  126. package/dist/browser/recorder.d.ts +27 -0
  127. package/dist/browser/recorder.d.ts.map +1 -0
  128. package/dist/browser/recorder.js +22 -0
  129. package/dist/browser/recorder.js.map +1 -0
  130. package/dist/browser/session.d.ts +14 -0
  131. package/dist/browser/session.d.ts.map +1 -0
  132. package/dist/browser/session.js +21 -0
  133. package/dist/browser/session.js.map +1 -0
  134. package/dist/browser/snapshot.d.ts +57 -0
  135. package/dist/browser/snapshot.d.ts.map +1 -0
  136. package/dist/browser/snapshot.js +57 -0
  137. package/dist/browser/snapshot.js.map +1 -0
  138. package/dist/captcha/contract.d.ts +35 -0
  139. package/dist/captcha/contract.d.ts.map +1 -0
  140. package/dist/captcha/contract.js +17 -0
  141. package/dist/captcha/contract.js.map +1 -0
  142. package/dist/captcha/evidence.d.ts +10 -0
  143. package/dist/captcha/evidence.d.ts.map +1 -0
  144. package/dist/captcha/evidence.js +9 -0
  145. package/dist/captcha/evidence.js.map +1 -0
  146. package/dist/captcha/guard.d.ts +23 -0
  147. package/dist/captcha/guard.d.ts.map +1 -0
  148. package/dist/captcha/guard.js +12 -0
  149. package/dist/captcha/guard.js.map +1 -0
  150. package/dist/cli/main.d.ts +4 -0
  151. package/dist/cli/main.d.ts.map +1 -0
  152. package/dist/cli/main.js +46 -0
  153. package/dist/cli/main.js.map +1 -0
  154. package/dist/core/errors.d.ts +84 -0
  155. package/dist/core/errors.d.ts.map +1 -0
  156. package/dist/core/errors.js +54 -0
  157. package/dist/core/errors.js.map +1 -0
  158. package/dist/core/events.d.ts +9 -0
  159. package/dist/core/events.d.ts.map +1 -0
  160. package/dist/core/events.js +21 -0
  161. package/dist/core/events.js.map +1 -0
  162. package/dist/core/hash.d.ts +10 -0
  163. package/dist/core/hash.d.ts.map +1 -0
  164. package/dist/core/hash.js +82 -0
  165. package/dist/core/hash.js.map +1 -0
  166. package/dist/core/ids.d.ts +10 -0
  167. package/dist/core/ids.d.ts.map +1 -0
  168. package/dist/core/ids.js +15 -0
  169. package/dist/core/ids.js.map +1 -0
  170. package/dist/deploy/index.d.ts +6 -0
  171. package/dist/deploy/index.d.ts.map +1 -0
  172. package/dist/deploy/index.js +6 -0
  173. package/dist/deploy/index.js.map +1 -0
  174. package/dist/dispatch/resumable.d.ts +85 -0
  175. package/dist/dispatch/resumable.d.ts.map +1 -0
  176. package/dist/dispatch/resumable.js +39 -0
  177. package/dist/dispatch/resumable.js.map +1 -0
  178. package/dist/dispatch/workflow.d.ts +6 -0
  179. package/dist/dispatch/workflow.d.ts.map +1 -0
  180. package/dist/dispatch/workflow.js +37 -0
  181. package/dist/dispatch/workflow.js.map +1 -0
  182. package/dist/domain/artifacts.d.ts +12 -0
  183. package/dist/domain/artifacts.d.ts.map +1 -0
  184. package/dist/domain/artifacts.js +14 -0
  185. package/dist/domain/artifacts.js.map +1 -0
  186. package/dist/domain/jobs.d.ts +12 -0
  187. package/dist/domain/jobs.d.ts.map +1 -0
  188. package/dist/domain/jobs.js +20 -0
  189. package/dist/domain/jobs.js.map +1 -0
  190. package/dist/domain/providers.d.ts +10 -0
  191. package/dist/domain/providers.d.ts.map +1 -0
  192. package/{domain → dist/domain}/providers.js +2 -2
  193. package/dist/domain/providers.js.map +1 -0
  194. package/dist/domain/runtime.d.ts +14 -0
  195. package/dist/domain/runtime.d.ts.map +1 -0
  196. package/{domain → dist/domain}/runtime.js +3 -3
  197. package/dist/domain/runtime.js.map +1 -0
  198. package/dist/domain/sessions.d.ts +12 -0
  199. package/dist/domain/sessions.d.ts.map +1 -0
  200. package/dist/domain/sessions.js +57 -0
  201. package/dist/domain/sessions.js.map +1 -0
  202. package/dist/examples/localjob.d.ts +2 -0
  203. package/dist/examples/localjob.d.ts.map +1 -0
  204. package/{examples → dist/examples}/localjob.js +1 -1
  205. package/dist/examples/localjob.js.map +1 -0
  206. package/dist/examples/publicapi.d.ts +2 -0
  207. package/dist/examples/publicapi.d.ts.map +1 -0
  208. package/{examples → dist/examples}/publicapi.js +1 -1
  209. package/dist/examples/publicapi.js.map +1 -0
  210. package/dist/extension/build.d.ts +9 -0
  211. package/dist/extension/build.d.ts.map +1 -0
  212. package/dist/extension/build.js +61 -0
  213. package/dist/extension/build.js.map +1 -0
  214. package/dist/extension/content.d.ts +6 -0
  215. package/dist/extension/content.d.ts.map +1 -0
  216. package/dist/extension/content.js +135 -0
  217. package/dist/extension/content.js.map +1 -0
  218. package/dist/extension/index.d.ts +7 -0
  219. package/dist/extension/index.d.ts.map +1 -0
  220. package/{extension → dist/extension}/index.js +1 -0
  221. package/dist/extension/index.js.map +1 -0
  222. package/dist/extension/pagebridge.d.ts +6 -0
  223. package/dist/extension/pagebridge.d.ts.map +1 -0
  224. package/dist/extension/pagebridge.js +42 -0
  225. package/dist/extension/pagebridge.js.map +1 -0
  226. package/dist/extension/permissions.d.ts +26 -0
  227. package/dist/extension/permissions.d.ts.map +1 -0
  228. package/dist/extension/permissions.js +28 -0
  229. package/dist/extension/permissions.js.map +1 -0
  230. package/dist/extension/popup.d.ts +5 -0
  231. package/dist/extension/popup.d.ts.map +1 -0
  232. package/dist/extension/popup.js +26 -0
  233. package/dist/extension/popup.js.map +1 -0
  234. package/dist/extension/protocol.d.ts +58 -0
  235. package/dist/extension/protocol.d.ts.map +1 -0
  236. package/dist/extension/protocol.js +101 -0
  237. package/dist/extension/protocol.js.map +1 -0
  238. package/dist/extension/serviceworker.d.ts +25 -0
  239. package/dist/extension/serviceworker.d.ts.map +1 -0
  240. package/dist/extension/serviceworker.js +102 -0
  241. package/dist/extension/serviceworker.js.map +1 -0
  242. package/dist/extension/worker.d.ts +28 -0
  243. package/dist/extension/worker.d.ts.map +1 -0
  244. package/dist/extension/worker.js +22 -0
  245. package/dist/extension/worker.js.map +1 -0
  246. package/dist/format/check.d.ts +8 -0
  247. package/dist/format/check.d.ts.map +1 -0
  248. package/dist/format/check.js +38 -0
  249. package/dist/format/check.js.map +1 -0
  250. package/dist/index.d.ts +117 -0
  251. package/dist/index.d.ts.map +1 -0
  252. package/{index.js → dist/index.js} +3 -7
  253. package/dist/index.js.map +1 -0
  254. package/dist/library/public.d.ts +53 -0
  255. package/dist/library/public.d.ts.map +1 -0
  256. package/dist/library/public.js +83 -0
  257. package/dist/library/public.js.map +1 -0
  258. package/dist/mcp/browser.d.ts +9 -0
  259. package/dist/mcp/browser.d.ts.map +1 -0
  260. package/dist/mcp/browser.js +13 -0
  261. package/dist/mcp/browser.js.map +1 -0
  262. package/dist/mcp/server.d.ts +35 -0
  263. package/dist/mcp/server.d.ts.map +1 -0
  264. package/dist/mcp/server.js +40 -0
  265. package/dist/mcp/server.js.map +1 -0
  266. package/dist/mcp/transport.d.ts +7 -0
  267. package/dist/mcp/transport.d.ts.map +1 -0
  268. package/dist/mcp/transport.js +17 -0
  269. package/dist/mcp/transport.js.map +1 -0
  270. package/dist/memory/bridge.d.ts +14 -0
  271. package/dist/memory/bridge.d.ts.map +1 -0
  272. package/dist/memory/bridge.js +16 -0
  273. package/dist/memory/bridge.js.map +1 -0
  274. package/dist/memory/engine.d.ts +28 -0
  275. package/dist/memory/engine.d.ts.map +1 -0
  276. package/dist/memory/engine.js +59 -0
  277. package/dist/memory/engine.js.map +1 -0
  278. package/dist/memory/modes.d.ts +43 -0
  279. package/dist/memory/modes.d.ts.map +1 -0
  280. package/dist/memory/modes.js +66 -0
  281. package/dist/memory/modes.js.map +1 -0
  282. package/dist/memory/objects.d.ts +21 -0
  283. package/dist/memory/objects.d.ts.map +1 -0
  284. package/dist/memory/objects.js +20 -0
  285. package/dist/memory/objects.js.map +1 -0
  286. package/dist/memory/targets.d.ts +78 -0
  287. package/dist/memory/targets.d.ts.map +1 -0
  288. package/dist/memory/targets.js +29 -0
  289. package/dist/memory/targets.js.map +1 -0
  290. package/dist/memory/transforms.d.ts +19 -0
  291. package/dist/memory/transforms.d.ts.map +1 -0
  292. package/dist/memory/transforms.js +14 -0
  293. package/dist/memory/transforms.js.map +1 -0
  294. package/dist/modes/matrix.d.ts +23 -0
  295. package/dist/modes/matrix.d.ts.map +1 -0
  296. package/{modes → dist/modes}/matrix.js +8 -10
  297. package/dist/modes/matrix.js.map +1 -0
  298. package/dist/modes/modes.d.ts +33 -0
  299. package/dist/modes/modes.d.ts.map +1 -0
  300. package/{modes → dist/modes}/modes.js +3 -4
  301. package/dist/modes/modes.js.map +1 -0
  302. package/dist/modes/resolve.d.ts +41 -0
  303. package/dist/modes/resolve.d.ts.map +1 -0
  304. package/dist/modes/resolve.js +39 -0
  305. package/dist/modes/resolve.js.map +1 -0
  306. package/dist/observability/metrics.d.ts +14 -0
  307. package/dist/observability/metrics.d.ts.map +1 -0
  308. package/dist/observability/metrics.js +18 -0
  309. package/dist/observability/metrics.js.map +1 -0
  310. package/dist/packager/manifest.d.ts +49 -0
  311. package/dist/packager/manifest.d.ts.map +1 -0
  312. package/dist/packager/manifest.js +49 -0
  313. package/dist/packager/manifest.js.map +1 -0
  314. package/dist/packager/publish.d.ts +51 -0
  315. package/dist/packager/publish.d.ts.map +1 -0
  316. package/dist/packager/publish.js +18 -0
  317. package/dist/packager/publish.js.map +1 -0
  318. package/dist/packager/targetcli.d.ts +7 -0
  319. package/dist/packager/targetcli.d.ts.map +1 -0
  320. package/dist/packager/targetcli.js +22 -0
  321. package/dist/packager/targetcli.js.map +1 -0
  322. package/dist/persistence/adapter.d.ts +5 -0
  323. package/dist/persistence/adapter.d.ts.map +1 -0
  324. package/dist/persistence/adapter.js +11 -0
  325. package/dist/persistence/adapter.js.map +1 -0
  326. package/dist/persistence/drizzle.d.ts +2 -0
  327. package/dist/persistence/drizzle.d.ts.map +1 -0
  328. package/dist/persistence/drizzle.js +12 -0
  329. package/dist/persistence/drizzle.js.map +1 -0
  330. package/dist/persistence/memory.d.ts +2 -0
  331. package/dist/persistence/memory.d.ts.map +1 -0
  332. package/dist/persistence/memory.js +27 -0
  333. package/dist/persistence/memory.js.map +1 -0
  334. package/dist/persistence/migrations.d.ts +19 -0
  335. package/dist/persistence/migrations.d.ts.map +1 -0
  336. package/{persistence → dist/persistence}/migrations.js +4 -5
  337. package/dist/persistence/migrations.js.map +1 -0
  338. package/dist/persistence/prisma.d.ts +2 -0
  339. package/dist/persistence/prisma.d.ts.map +1 -0
  340. package/dist/persistence/prisma.js +25 -0
  341. package/dist/persistence/prisma.js.map +1 -0
  342. package/dist/persistence/schema.d.ts +63 -0
  343. package/dist/persistence/schema.d.ts.map +1 -0
  344. package/dist/persistence/schema.js +28 -0
  345. package/dist/persistence/schema.js.map +1 -0
  346. package/dist/persistence/sql.d.ts +3 -0
  347. package/dist/persistence/sql.d.ts.map +1 -0
  348. package/dist/persistence/sql.js +37 -0
  349. package/dist/persistence/sql.js.map +1 -0
  350. package/dist/protocol/blocks.d.ts +10 -0
  351. package/dist/protocol/blocks.d.ts.map +1 -0
  352. package/dist/protocol/blocks.js +26 -0
  353. package/dist/protocol/blocks.js.map +1 -0
  354. package/dist/protocol/json.d.ts +6 -0
  355. package/dist/protocol/json.d.ts.map +1 -0
  356. package/{protocol → dist/protocol}/json.js +1 -0
  357. package/dist/protocol/json.js.map +1 -0
  358. package/dist/protocol/ndjson.d.ts +3 -0
  359. package/dist/protocol/ndjson.d.ts.map +1 -0
  360. package/dist/protocol/ndjson.js +20 -0
  361. package/dist/protocol/ndjson.js.map +1 -0
  362. package/dist/protocol/sse.d.ts +7 -0
  363. package/dist/protocol/sse.d.ts.map +1 -0
  364. package/dist/protocol/sse.js +25 -0
  365. package/dist/protocol/sse.js.map +1 -0
  366. package/dist/proxy/pool.d.ts +9 -0
  367. package/dist/proxy/pool.d.ts.map +1 -0
  368. package/dist/proxy/pool.js +27 -0
  369. package/dist/proxy/pool.js.map +1 -0
  370. package/dist/queue/idempotency.d.ts +10 -0
  371. package/dist/queue/idempotency.d.ts.map +1 -0
  372. package/dist/queue/idempotency.js +13 -0
  373. package/dist/queue/idempotency.js.map +1 -0
  374. package/dist/queue/persistent.d.ts +13 -0
  375. package/dist/queue/persistent.d.ts.map +1 -0
  376. package/dist/queue/persistent.js +49 -0
  377. package/dist/queue/persistent.js.map +1 -0
  378. package/dist/queue/queue.d.ts +7 -0
  379. package/dist/queue/queue.d.ts.map +1 -0
  380. package/dist/queue/queue.js +55 -0
  381. package/dist/queue/queue.js.map +1 -0
  382. package/dist/queue/saga.d.ts +5 -0
  383. package/dist/queue/saga.d.ts.map +1 -0
  384. package/dist/queue/saga.js +20 -0
  385. package/dist/queue/saga.js.map +1 -0
  386. package/dist/release/assets.d.ts +118 -0
  387. package/dist/release/assets.d.ts.map +1 -0
  388. package/dist/release/assets.js +69 -0
  389. package/dist/release/assets.js.map +1 -0
  390. package/dist/runners/health.d.ts +36 -0
  391. package/dist/runners/health.d.ts.map +1 -0
  392. package/dist/runners/health.js +26 -0
  393. package/dist/runners/health.js.map +1 -0
  394. package/dist/runners/heartbeat.d.ts +23 -0
  395. package/dist/runners/heartbeat.d.ts.map +1 -0
  396. package/dist/runners/heartbeat.js +29 -0
  397. package/dist/runners/heartbeat.js.map +1 -0
  398. package/dist/runners/inprocess.d.ts +17 -0
  399. package/dist/runners/inprocess.d.ts.map +1 -0
  400. package/dist/runners/inprocess.js +20 -0
  401. package/dist/runners/inprocess.js.map +1 -0
  402. package/dist/runners/scheduler.d.ts +5 -0
  403. package/dist/runners/scheduler.d.ts.map +1 -0
  404. package/dist/runners/scheduler.js +19 -0
  405. package/dist/runners/scheduler.js.map +1 -0
  406. package/dist/runtime/abort.d.ts +8 -0
  407. package/dist/runtime/abort.d.ts.map +1 -0
  408. package/dist/runtime/abort.js +13 -0
  409. package/dist/runtime/abort.js.map +1 -0
  410. package/dist/runtime/compatibility.d.ts +37 -0
  411. package/dist/runtime/compatibility.d.ts.map +1 -0
  412. package/{runtime → dist/runtime}/compatibility.js +1 -4
  413. package/dist/runtime/compatibility.js.map +1 -0
  414. package/dist/runtime/detect.d.ts +13 -0
  415. package/dist/runtime/detect.d.ts.map +1 -0
  416. package/dist/runtime/detect.js +18 -0
  417. package/dist/runtime/detect.js.map +1 -0
  418. package/dist/runtime/engine.d.ts +20 -0
  419. package/dist/runtime/engine.d.ts.map +1 -0
  420. package/dist/runtime/engine.js +61 -0
  421. package/dist/runtime/engine.js.map +1 -0
  422. package/dist/runtime/retry.d.ts +19 -0
  423. package/dist/runtime/retry.d.ts.map +1 -0
  424. package/dist/runtime/retry.js +54 -0
  425. package/dist/runtime/retry.js.map +1 -0
  426. package/dist/runtime/worker.d.ts +10 -0
  427. package/dist/runtime/worker.d.ts.map +1 -0
  428. package/dist/runtime/worker.js +25 -0
  429. package/dist/runtime/worker.js.map +1 -0
  430. package/dist/scrape/cache.d.ts +45 -0
  431. package/dist/scrape/cache.d.ts.map +1 -0
  432. package/dist/scrape/cache.js +45 -0
  433. package/dist/scrape/cache.js.map +1 -0
  434. package/dist/scrape/crawl.d.ts +47 -0
  435. package/dist/scrape/crawl.d.ts.map +1 -0
  436. package/dist/scrape/crawl.js +114 -0
  437. package/dist/scrape/crawl.js.map +1 -0
  438. package/dist/scrape/extract.d.ts +63 -0
  439. package/dist/scrape/extract.d.ts.map +1 -0
  440. package/dist/scrape/extract.js +47 -0
  441. package/dist/scrape/extract.js.map +1 -0
  442. package/dist/scrape/normalize.d.ts +52 -0
  443. package/dist/scrape/normalize.d.ts.map +1 -0
  444. package/dist/scrape/normalize.js +102 -0
  445. package/dist/scrape/normalize.js.map +1 -0
  446. package/dist/scrape/robots.d.ts +37 -0
  447. package/dist/scrape/robots.d.ts.map +1 -0
  448. package/dist/scrape/robots.js +71 -0
  449. package/dist/scrape/robots.js.map +1 -0
  450. package/dist/scrape/schema.d.ts +5 -0
  451. package/dist/scrape/schema.d.ts.map +1 -0
  452. package/dist/scrape/schema.js +25 -0
  453. package/dist/scrape/schema.js.map +1 -0
  454. package/dist/scrape/scraper.d.ts +6 -0
  455. package/dist/scrape/scraper.d.ts.map +1 -0
  456. package/dist/scrape/scraper.js +46 -0
  457. package/dist/scrape/scraper.js.map +1 -0
  458. package/dist/scrape/semantic.d.ts +25 -0
  459. package/dist/scrape/semantic.d.ts.map +1 -0
  460. package/dist/scrape/semantic.js +27 -0
  461. package/dist/scrape/semantic.js.map +1 -0
  462. package/dist/server/node.d.ts +7 -0
  463. package/dist/server/node.d.ts.map +1 -0
  464. package/dist/server/node.js +38 -0
  465. package/dist/server/node.js.map +1 -0
  466. package/dist/sessions/file.d.ts +25 -0
  467. package/dist/sessions/file.d.ts.map +1 -0
  468. package/dist/sessions/file.js +13 -0
  469. package/dist/sessions/file.js.map +1 -0
  470. package/dist/sessions/replay.d.ts +9 -0
  471. package/dist/sessions/replay.d.ts.map +1 -0
  472. package/dist/sessions/replay.js +70 -0
  473. package/dist/sessions/replay.js.map +1 -0
  474. package/dist/sessions/store.d.ts +25 -0
  475. package/dist/sessions/store.d.ts.map +1 -0
  476. package/dist/sessions/store.js +13 -0
  477. package/dist/sessions/store.js.map +1 -0
  478. package/dist/storage/adapter.d.ts +5 -0
  479. package/dist/storage/adapter.d.ts.map +1 -0
  480. package/dist/storage/adapter.js +11 -0
  481. package/dist/storage/adapter.js.map +1 -0
  482. package/dist/storage/cache.d.ts +23 -0
  483. package/dist/storage/cache.d.ts.map +1 -0
  484. package/dist/storage/cache.js +79 -0
  485. package/dist/storage/cache.js.map +1 -0
  486. package/dist/storage/checksum.d.ts +3 -0
  487. package/dist/storage/checksum.d.ts.map +1 -0
  488. package/dist/storage/checksum.js +19 -0
  489. package/dist/storage/checksum.js.map +1 -0
  490. package/dist/storage/chunked.d.ts +21 -0
  491. package/dist/storage/chunked.d.ts.map +1 -0
  492. package/dist/storage/chunked.js +67 -0
  493. package/dist/storage/chunked.js.map +1 -0
  494. package/dist/storage/content.d.ts +24 -0
  495. package/dist/storage/content.d.ts.map +1 -0
  496. package/dist/storage/content.js +44 -0
  497. package/dist/storage/content.js.map +1 -0
  498. package/dist/storage/filehosting.d.ts +2 -0
  499. package/dist/storage/filehosting.d.ts.map +1 -0
  500. package/dist/storage/filehosting.js +24 -0
  501. package/dist/storage/filehosting.js.map +1 -0
  502. package/dist/storage/githubcontents.d.ts +2 -0
  503. package/dist/storage/githubcontents.d.ts.map +1 -0
  504. package/dist/storage/githubcontents.js +29 -0
  505. package/dist/storage/githubcontents.js.map +1 -0
  506. package/dist/storage/index.d.ts +11 -0
  507. package/dist/storage/index.d.ts.map +1 -0
  508. package/{storage → dist/storage}/index.js +1 -0
  509. package/dist/storage/index.js.map +1 -0
  510. package/dist/storage/local.d.ts +2 -0
  511. package/dist/storage/local.d.ts.map +1 -0
  512. package/dist/storage/local.js +72 -0
  513. package/dist/storage/local.js.map +1 -0
  514. package/dist/storage/memory.d.ts +6 -0
  515. package/dist/storage/memory.d.ts.map +1 -0
  516. package/dist/storage/memory.js +36 -0
  517. package/dist/storage/memory.js.map +1 -0
  518. package/dist/storage/s3compatible.d.ts +2 -0
  519. package/dist/storage/s3compatible.d.ts.map +1 -0
  520. package/dist/storage/s3compatible.js +31 -0
  521. package/dist/storage/s3compatible.js.map +1 -0
  522. package/dist/storage/sync.d.ts +47 -0
  523. package/dist/storage/sync.d.ts.map +1 -0
  524. package/dist/storage/sync.js +75 -0
  525. package/dist/storage/sync.js.map +1 -0
  526. package/dist/surfaces/adapters.d.ts +97 -0
  527. package/dist/surfaces/adapters.d.ts.map +1 -0
  528. package/dist/surfaces/adapters.js +50 -0
  529. package/dist/surfaces/adapters.js.map +1 -0
  530. package/dist/surfaces/controls.d.ts +18 -0
  531. package/dist/surfaces/controls.d.ts.map +1 -0
  532. package/dist/surfaces/controls.js +45 -0
  533. package/dist/surfaces/controls.js.map +1 -0
  534. package/dist/surfaces/manifest.d.ts +68 -0
  535. package/dist/surfaces/manifest.d.ts.map +1 -0
  536. package/dist/surfaces/manifest.js +42 -0
  537. package/dist/surfaces/manifest.js.map +1 -0
  538. package/dist/surfaces/n8n.d.ts +25 -0
  539. package/dist/surfaces/n8n.d.ts.map +1 -0
  540. package/dist/surfaces/n8n.js +31 -0
  541. package/dist/surfaces/n8n.js.map +1 -0
  542. package/dist/surfaces/operations.d.ts +32 -0
  543. package/dist/surfaces/operations.d.ts.map +1 -0
  544. package/dist/surfaces/operations.js +53 -0
  545. package/dist/surfaces/operations.js.map +1 -0
  546. package/dist/surfaces/targets.d.ts +196 -0
  547. package/dist/surfaces/targets.d.ts.map +1 -0
  548. package/dist/surfaces/targets.js +27 -0
  549. package/dist/surfaces/targets.js.map +1 -0
  550. package/dist/webhook/delivery.d.ts +18 -0
  551. package/dist/webhook/delivery.d.ts.map +1 -0
  552. package/dist/webhook/delivery.js +36 -0
  553. package/dist/webhook/delivery.js.map +1 -0
  554. package/dist/webhook/receiver.d.ts +26 -0
  555. package/dist/webhook/receiver.d.ts.map +1 -0
  556. package/dist/webhook/receiver.js +24 -0
  557. package/dist/webhook/receiver.js.map +1 -0
  558. package/dist/webhook/signature.d.ts +3 -0
  559. package/dist/webhook/signature.d.ts.map +1 -0
  560. package/{webhook → dist/webhook}/signature.js +1 -1
  561. package/dist/webhook/signature.js.map +1 -0
  562. package/dist/workflow/manifest.d.ts +21 -0
  563. package/dist/workflow/manifest.d.ts.map +1 -0
  564. package/dist/workflow/manifest.js +20 -0
  565. package/dist/workflow/manifest.js.map +1 -0
  566. package/dist/workflow/registry.d.ts +7 -0
  567. package/dist/workflow/registry.d.ts.map +1 -0
  568. package/dist/workflow/registry.js +18 -0
  569. package/dist/workflow/registry.js.map +1 -0
  570. package/dist/workflow/templates.d.ts +6 -0
  571. package/dist/workflow/templates.d.ts.map +1 -0
  572. package/dist/workflow/templates.js +18 -0
  573. package/dist/workflow/templates.js.map +1 -0
  574. package/dist/workflow/triggers.d.ts +36 -0
  575. package/dist/workflow/triggers.d.ts.map +1 -0
  576. package/dist/workflow/triggers.js +33 -0
  577. package/dist/workflow/triggers.js.map +1 -0
  578. package/docs/enginearchitecture.md +5 -4
  579. package/docs/gapmatrix.md +2 -2
  580. package/docs/libraryapi.md +4 -4
  581. package/docs/release.md +5 -5
  582. package/docs/releaseassets.md +1 -1
  583. package/docs/reorganization-1.8.8.md +31 -0
  584. package/docs/reorganization-1.8.9.md +28 -0
  585. package/docs/toolchainresearch-1.8.9.md +18 -0
  586. package/extension/manifest.json +1 -1
  587. package/package.json +61 -91
  588. package/adapters/forge.js +0 -16
  589. package/adapters/github.js +0 -19
  590. package/adapters/gitlab.js +0 -10
  591. package/adapters/socket.js +0 -14
  592. package/adapters/transport.js +0 -30
  593. package/ai/chunk.js +0 -22
  594. package/ai/llmstxt.js +0 -12
  595. package/ai/provenance.js +0 -18
  596. package/ai/rag.js +0 -14
  597. package/api/auth.js +0 -13
  598. package/api/control.js +0 -33
  599. package/api/rate.js +0 -31
  600. package/api/security.js +0 -42
  601. package/api/service.js +0 -36
  602. package/binary/build.js +0 -17
  603. package/bot/adapter.js +0 -8
  604. package/bot/bot.js +0 -39
  605. package/bot/commands.js +0 -18
  606. package/bot/permissions.js +0 -16
  607. package/browser/actions.js +0 -33
  608. package/browser/agent.js +0 -9
  609. package/browser/context.js +0 -52
  610. package/browser/playwright.js +0 -22
  611. package/browser/recorder.js +0 -21
  612. package/browser/session.js +0 -19
  613. package/browser/snapshot.js +0 -57
  614. package/captcha/contract.js +0 -15
  615. package/captcha/evidence.js +0 -9
  616. package/captcha/guard.js +0 -10
  617. package/cli/main.js +0 -36
  618. package/core/errors.js +0 -37
  619. package/core/events.js +0 -21
  620. package/core/hash.js +0 -73
  621. package/core/ids.js +0 -15
  622. package/crawl/crawler.js +0 -29
  623. package/crawl/frontier.js +0 -34
  624. package/crawl/normalize.js +0 -14
  625. package/crawl/persistent.js +0 -13
  626. package/dispatch/resumable.js +0 -31
  627. package/dispatch/workflow.js +0 -33
  628. package/domain/artifacts.js +0 -13
  629. package/domain/jobs.js +0 -20
  630. package/domain/sessions.js +0 -46
  631. package/errors/taxonomy.js +0 -18
  632. package/extension/build.js +0 -46
  633. package/extension/content.js +0 -127
  634. package/extension/pagebridge.js +0 -41
  635. package/extension/permissions.js +0 -22
  636. package/extension/popup.css +0 -13
  637. package/extension/popup.html +0 -24
  638. package/extension/popup.js +0 -25
  639. package/extension/protocol.js +0 -95
  640. package/extension/serviceworker.js +0 -109
  641. package/extension/worker.js +0 -22
  642. package/format/check.js +0 -21
  643. package/library/public.js +0 -85
  644. package/mcp/browser.js +0 -12
  645. package/mcp/server.js +0 -28
  646. package/mcp/transport.js +0 -14
  647. package/memory/bridge.js +0 -16
  648. package/memory/engine.js +0 -45
  649. package/memory/modes.js +0 -55
  650. package/memory/objects.js +0 -18
  651. package/memory/targets.js +0 -21
  652. package/memory/transforms.js +0 -15
  653. package/modes/resolve.js +0 -39
  654. package/packager/manifest.js +0 -28
  655. package/packager/publish.js +0 -15
  656. package/persistence/adapter.js +0 -8
  657. package/persistence/drizzle.js +0 -10
  658. package/persistence/memory.js +0 -26
  659. package/persistence/prisma.js +0 -23
  660. package/persistence/schema.js +0 -29
  661. package/persistence/sql.js +0 -30
  662. package/protocol/blocks.js +0 -18
  663. package/protocol/ndjson.js +0 -17
  664. package/protocol/sse.js +0 -22
  665. package/proxy/pool.js +0 -12
  666. package/queue/idempotency.js +0 -12
  667. package/queue/persistent.js +0 -44
  668. package/queue/queue.js +0 -50
  669. package/queue/saga.js +0 -13
  670. package/release/assets.js +0 -70
  671. package/retry/circuit.js +0 -15
  672. package/retry/policy.js +0 -12
  673. package/runners/health.js +0 -23
  674. package/runners/heartbeat.js +0 -26
  675. package/runners/inprocess.js +0 -19
  676. package/runners/scheduler.js +0 -16
  677. package/runtime/abort.js +0 -10
  678. package/runtime/detect.js +0 -14
  679. package/runtime/engine.js +0 -56
  680. package/runtime/worker.js +0 -18
  681. package/scrape/agent.ts +0 -122
  682. package/scrape/batch.ts +0 -79
  683. package/scrape/biome.json +0 -76
  684. package/scrape/browser.ts +0 -222
  685. package/scrape/cache.js +0 -14
  686. package/scrape/cache.ts +0 -84
  687. package/scrape/chunking.ts +0 -193
  688. package/scrape/cli.ts +0 -105
  689. package/scrape/crawler.ts +0 -115
  690. package/scrape/dev-server.ts +0 -94
  691. package/scrape/errors.ts +0 -132
  692. package/scrape/events.ts +0 -26
  693. package/scrape/extract.js +0 -14
  694. package/scrape/extract.ts +0 -165
  695. package/scrape/fetch.ts +0 -105
  696. package/scrape/formats.ts +0 -85
  697. package/scrape/headers.ts +0 -71
  698. package/scrape/index.ts +0 -92
  699. package/scrape/jsdom.d.ts +0 -6
  700. package/scrape/llms-txt.ts +0 -84
  701. package/scrape/middleware.ts +0 -90
  702. package/scrape/normalize.js +0 -86
  703. package/scrape/pool.ts +0 -95
  704. package/scrape/port.ts +0 -18
  705. package/scrape/proxy.ts +0 -103
  706. package/scrape/rate-limiter.ts +0 -95
  707. package/scrape/renderer.ts +0 -194
  708. package/scrape/retry.ts +0 -64
  709. package/scrape/robots.js +0 -32
  710. package/scrape/robots.ts +0 -137
  711. package/scrape/schema.js +0 -21
  712. package/scrape/scrape.ts +0 -123
  713. package/scrape/scraper.js +0 -40
  714. package/scrape/semantic.js +0 -22
  715. package/scrape/serialize.ts +0 -310
  716. package/scrape/server.ts +0 -137
  717. package/scrape/session.ts +0 -109
  718. package/scrape/sitemap.ts +0 -131
  719. package/scrape/tokens.ts +0 -45
  720. package/scrape/tsconfig.json +0 -28
  721. package/scrape/types.ts +0 -214
  722. package/scrape/utils.ts +0 -77
  723. package/scrape/vite.config.ts +0 -55
  724. package/scrape/vitest.config.ts +0 -17
  725. package/server/node.js +0 -34
  726. package/sessions/file.js +0 -13
  727. package/sessions/replay.js +0 -61
  728. package/sessions/store.js +0 -13
  729. package/storage/adapter.js +0 -8
  730. package/storage/cache.js +0 -54
  731. package/storage/checksum.js +0 -17
  732. package/storage/chunked.js +0 -58
  733. package/storage/content.js +0 -42
  734. package/storage/filehosting.js +0 -17
  735. package/storage/githubcontents.js +0 -18
  736. package/storage/local.js +0 -35
  737. package/storage/memory.js +0 -28
  738. package/storage/s3compatible.js +0 -23
  739. package/storage/sync.js +0 -55
  740. package/surfaces/adapters.js +0 -48
  741. package/surfaces/controls.js +0 -37
  742. package/surfaces/manifest.js +0 -25
  743. package/surfaces/n8n.js +0 -24
  744. package/surfaces/operations.js +0 -43
  745. package/surfaces/targets.js +0 -16
  746. package/webhook/delivery.js +0 -26
  747. package/webhook/receiver.js +0 -20
  748. package/workflow/manifest.js +0 -20
  749. package/workflow/registry.js +0 -16
  750. package/workflow/templates.js +0 -18
  751. package/workflow/triggers.js +0 -31
@@ -1,28 +0,0 @@
1
- /**
2
- * distribution manifests describe targets without executing a platform command.
3
- */
4
- export function distributionmanifest(options = {}) {
5
- if (!options.name || !options.version || !options.entry) throw new TypeError("distribution manifest requires name version and entry");
6
- return {
7
- name: options.name,
8
- version: options.version,
9
- entry: options.entry,
10
- modes: options.modes ?? ["library", "cli", "binary"],
11
- targets: options.targets ?? ["node", "container"],
12
- files: options.files ?? [],
13
- metadata: options.metadata ?? {}
14
- };
15
- }
16
-
17
- export function binaryplan(manifest, options = {}) {
18
- return { tool: options.tool ?? "node", command: options.command ?? `node --experimental-sea-config ${options.config ?? "sea.config.json"}`, entry: manifest.entry, targets: options.targets ?? ["linux", "windows", "macos"] };
19
- }
20
-
21
- export function containerplan(manifest, options = {}) {
22
- const base = options.base ?? "node:26.7.0-alpine";
23
- const workdir = options.workdir ?? "/app";
24
- const command = options.command ?? ["node", manifest.entry];
25
- const lines = [`from ${base}`, `workdir ${workdir}`, "copy package.json package-lock.json ./", "run npm ci --omit=dev", "copy . .", `cmd ${JSON.stringify(command)}`];
26
- if (options.port) lines.splice(3, 0, `expose ${options.port}`);
27
- return { base, workdir, command, dockerfile: `${lines.join("\n")}\n` };
28
- }
@@ -1,15 +0,0 @@
1
- /**
2
- * publish plans describe registry targets without executing a publish or requiring credentials.
3
- */
4
- export function publishplan(manifest, options = {}) {
5
- const version = manifest.version;
6
- const packageName = manifest.name;
7
- return {
8
- package: { registry: options.npm ?? "npm", name: packageName, version, command: "npm publish --access public" },
9
- github: { repository: options.repository ?? "", packages: true, command: "git push --follow-tags" },
10
- container: { registry: options.ghcr ?? "ghcr.io", image: options.image ?? packageName, version, command: "docker push" },
11
- cdn: [{ name: "jsdelivr", url: `https://cdn.jsdelivr.net/npm/${packageName}@${version}/index.js` }, { name: "unpkg", url: `https://unpkg.com/${packageName}@${version}/index.js` }, { name: "esm", url: `https://esm.sh/${packageName}@${version}` }]
12
- };
13
- }
14
-
15
- export function registrymanifest(manifest, options = {}) { return { name: manifest.name, version: manifest.version, surfaces: ["library", "cli", "binary", "container", ...(options.surfaces ?? [])], registries: ["npm", "github", "ghcr", "jsdelivr", "unpkg", "esm.sh"] }; }
@@ -1,8 +0,0 @@
1
- /**
2
- * persistence adapters keep database and remote state outside the runtime core.
3
- */
4
- export function persistenceadapter(methods) {
5
- const required = ["savejob", "getjob", "updatejob", "listjobs", "saveevent", "listevents", "savesession", "readsession", "saveartifact", "getartifact", "savechunk", "getchunks"];
6
- for (const name of required) if (typeof methods?.[name] !== "function") throw new TypeError(`persistence adapter requires ${name}`);
7
- return methods;
8
- }
@@ -1,10 +0,0 @@
1
- /**
2
- * drizzle persistence accepts a small repository object generated by the caller's schema.
3
- */
4
- import { persistenceadapter } from "./adapter.js";
5
-
6
- export function drizzlepersistence(repository) {
7
- const required = ["savejob", "getjob", "updatejob", "listjobs", "saveevent", "listevents", "savesession", "readsession", "saveartifact", "getartifact", "savechunk", "getchunks"];
8
- for (const name of required) if (typeof repository?.[name] !== "function") throw new TypeError(`drizzle repository requires ${name}`);
9
- return persistenceadapter(repository);
10
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * memory persistence is the local baseline for tests and offline operation.
3
- */
4
- import { persistenceadapter } from "./adapter.js";
5
-
6
- export function memorypersistence() {
7
- const jobs = new Map();
8
- const events = new Map();
9
- const sessions = new Map();
10
- const artifacts = new Map();
11
- const chunks = new Map();
12
- return persistenceadapter({
13
- async savejob(job) { jobs.set(job.id, structuredClone(job)); return jobs.get(job.id); },
14
- async getjob(id) { return jobs.get(id) ? structuredClone(jobs.get(id)) : null; },
15
- async updatejob(id, patch) { const current = jobs.get(id); if (!current) return null; const next = { ...current, ...patch, updatedat: Date.now() }; jobs.set(id, next); return structuredClone(next); },
16
- async listjobs(filter = {}) { return [...jobs.values()].filter((job) => Object.entries(filter).every(([key, value]) => job[key] === value)).map((job) => structuredClone(job)); },
17
- async saveevent(event) { const list = events.get(event.jobid) ?? []; list.push(structuredClone(event)); events.set(event.jobid, list); return event; },
18
- async listevents(jobid) { return (events.get(jobid) ?? []).map((event) => structuredClone(event)); },
19
- async savesession(session) { sessions.set(session.id, structuredClone(session)); return structuredClone(session); },
20
- async readsession(id) { return sessions.get(id) ? structuredClone(sessions.get(id)) : null; },
21
- async saveartifact(artifact) { artifacts.set(artifact.key, structuredClone(artifact)); return structuredClone(artifact); },
22
- async getartifact(key) { return artifacts.get(key) ? structuredClone(artifacts.get(key)) : null; },
23
- async savechunk(chunk) { chunks.set(chunk.id, structuredClone(chunk)); return structuredClone(chunk); },
24
- async getchunks(artifactkey) { return [...chunks.values()].filter((chunk) => chunk.artifactkey === artifactkey).sort((left, right) => left.index - right.index).map((chunk) => structuredClone(chunk)); }
25
- });
26
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * prisma persistence maps model delegates through an explicit model configuration.
3
- */
4
- import { persistenceadapter } from "./adapter.js";
5
-
6
- export function prismapersistence(client, options = {}) {
7
- const models = { jobs: options.jobs ?? client?.job, events: options.events ?? client?.event, sessions: options.sessions ?? client?.session, artifacts: options.artifacts ?? client?.artifact, chunks: options.chunks ?? client?.chunk };
8
- for (const [name, model] of Object.entries(models)) if (!model) throw new TypeError(`prisma model is missing: ${name}`);
9
- return persistenceadapter({
10
- async savejob(job) { return models.jobs.upsert({ where: { id: job.id }, create: job, update: job }); },
11
- async getjob(id) { return models.jobs.findUnique({ where: { id } }); },
12
- async updatejob(id, patch) { return models.jobs.update({ where: { id }, data: { ...patch, updatedat: Date.now() } }); },
13
- async listjobs(filter = {}) { return models.jobs.findMany({ where: filter, orderBy: { createdat: "desc" } }); },
14
- async saveevent(event) { return models.events.create({ data: event }); },
15
- async listevents(jobid) { return models.events.findMany({ where: { jobid }, orderBy: { at: "asc" } }); },
16
- async savesession(session) { return models.sessions.upsert({ where: { id: session.id }, create: session, update: session }); },
17
- async readsession(id) { return models.sessions.findUnique({ where: { id } }); },
18
- async saveartifact(artifact) { return models.artifacts.upsert({ where: { key: artifact.key }, create: artifact, update: artifact }); },
19
- async getartifact(key) { return models.artifacts.findUnique({ where: { key } }); },
20
- async savechunk(chunk) { return models.chunks.upsert({ where: { id: chunk.id }, create: chunk, update: chunk }); },
21
- async getchunks(artifactkey) { return models.chunks.findMany({ where: { artifactkey }, orderBy: { index: "asc" } }); }
22
- });
23
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * the schema descriptor is neutral so prisma drizzle mysql2 or another driver can map it.
3
- */
4
- export const schemadefinition = Object.freeze({
5
- jobs: { id: "text primary key", name: "text", status: "text", priority: "integer", input: "json", outputkey: "text", createdat: "integer", updatedat: "integer" },
6
- events: { id: "text primary key", jobid: "text", type: "text", at: "integer", data: "json" },
7
- sessions: { id: "text primary key", version: "integer", agentname: "text", originurl: "text", seed: "text", status: "text", startedat: "integer", finishedat: "integer", events: "json" },
8
- artifacts: { key: "text primary key", sizebytes: "bigint", sha256: "text", contenttype: "text", createdat: "integer", metadata: "json" },
9
- chunks: { id: "text primary key", artifactkey: "text", index: "integer", offset: "bigint", sizebytes: "integer", sha256: "text", storagekey: "text" }
10
- ,queueitems: { id: "text primary key", status: "text", attempts: "integer", payload: "json", result: "json", error: "json", createdat: "bigint", updatedat: "bigint" }
11
- });
12
-
13
- export function schemasql(options = {}) {
14
- const dialect = options.dialect ?? "mysql";
15
- const json = dialect === "postgres" ? "jsonb" : "json";
16
- const bigint = dialect === "sqlite" ? "integer" : "bigint";
17
- return [
18
- `create table if not exists jobs (id text primary key, name text not null, status text not null, priority integer not null, input ${json}, outputkey text, createdat ${bigint} not null, updatedat ${bigint} not null)`,
19
- `create table if not exists events (id text primary key, jobid text not null, type text not null, at ${bigint} not null, data ${json} not null)`,
20
- `create table if not exists sessions (id text primary key, version integer not null, agentname text not null, originurl text not null, seed text not null, status text not null, startedat ${bigint} not null, finishedat ${bigint}, events ${json} not null)`,
21
- `create table if not exists artifacts (key text primary key, sizebytes ${bigint} not null, sha256 text not null, contenttype text not null, createdat ${bigint} not null, metadata ${json} not null)`,
22
- `create table if not exists chunks (id text primary key, artifactkey text not null, chunkindex integer not null, byteoffset ${bigint} not null, sizebytes integer not null, sha256 text not null, storagekey text not null)`
23
- ,`create table if not exists queueitems (id text primary key, status text not null, attempts integer not null, payload ${json} not null, result ${json}, error ${json}, createdat ${bigint} not null, updatedat ${bigint} not null)`
24
- ];
25
- }
26
-
27
- export function prismaschema() {
28
- return `model job { id String @id name String status String priority Int input Json? outputkey String? createdat BigInt updatedat BigInt }\nmodel event { id String @id jobid String type String at BigInt data Json }\nmodel session { id String @id version Int agentname String originurl String seed String status String startedat BigInt finishedat BigInt? events Json }\nmodel artifact { key String @id sizebytes BigInt sha256 String contenttype String createdat BigInt metadata Json }\nmodel chunk { id String @id artifactkey String chunkindex Int byteoffset BigInt sizebytes Int sha256 String storagekey String }`;
29
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * sql persistence keeps query execution injected for mysql2 drizzle or another sql client.
3
- */
4
- import { persistenceadapter } from "./adapter.js";
5
-
6
- export function sqlpersistence(options = {}) {
7
- if (typeof options.query !== "function") throw new TypeError("sql persistence requires query");
8
- const table = options.table ?? { jobs: "jobs", events: "events", sessions: "sessions", artifacts: "artifacts", chunks: "chunks" };
9
- async function one(statement, values = []) { const result = await options.query(statement, values); return result?.rows?.[0] ?? result?.[0]?.[0] ?? result?.[0] ?? null; }
10
- async function many(statement, values = []) { const result = await options.query(statement, values); return result?.rows ?? result?.[0] ?? result ?? []; }
11
- return persistenceadapter({
12
- async savejob(job) { await options.query(`insert into ${table.jobs} (id,name,status,priority,input,outputkey,createdat,updatedat) values (?,?,?,?,?,?,?,?)`, [job.id, job.name, job.status, job.priority, JSON.stringify(job.input ?? null), job.outputkey ?? null, job.createdat, job.updatedat ?? job.createdat]); return job; },
13
- async getjob(id) { const row = await one(`select * from ${table.jobs} where id = ?`, [id]); return row ? normalizejob(row) : null; },
14
- async updatejob(id, patch) { const current = await this.getjob(id); if (!current) return null; const next = { ...current, ...patch, updatedat: Date.now() }; await options.query(`update ${table.jobs} set status = ?, priority = ?, input = ?, outputkey = ?, updatedat = ? where id = ?`, [next.status, next.priority, JSON.stringify(next.input ?? null), next.outputkey ?? null, next.updatedat, id]); return next; },
15
- async listjobs(filter = {}) { const rows = await many(`select * from ${table.jobs} order by createdat desc`, []); return rows.map(normalizejob).filter((job) => Object.entries(filter).every(([key, value]) => job[key] === value)); },
16
- async saveevent(event) { await options.query(`insert into ${table.events} (id,jobid,type,at,data) values (?,?,?,?,?)`, [event.id, event.jobid, event.type, event.at, JSON.stringify(event.data ?? {})]); return event; },
17
- async listevents(jobid) { return (await many(`select * from ${table.events} where jobid = ? order by at asc`, [jobid])).map((row) => ({ ...row, data: parsejson(row.data) })); },
18
- async savesession(session) { await options.query(`insert into ${table.sessions} (id,version,agentname,originurl,seed,status,startedat,finishedat,events) values (?,?,?,?,?,?,?,?,?)`, [session.id, session.version, session.agentname, session.originurl, session.seed, session.status, session.startedat, session.finishedat ?? null, JSON.stringify(session.events ?? [])]); return session; },
19
- async readsession(id) { const row = await one(`select * from ${table.sessions} where id = ?`, [id]); return row ? { ...row, events: parsejson(row.events) } : null; },
20
- async saveartifact(artifact) { await options.query(`insert into ${table.artifacts} (key,sizebytes,sha256,contenttype,createdat,metadata) values (?,?,?,?,?,?)`, [artifact.key, artifact.sizebytes, artifact.sha256, artifact.contenttype, artifact.createdat, JSON.stringify(artifact.metadata ?? {})]); return artifact; },
21
- async getartifact(key) { const row = await one(`select * from ${table.artifacts} where key = ?`, [key]); return row ? { ...row, metadata: parsejson(row.metadata) } : null; },
22
- async savechunk(chunk) { await options.query(`insert into ${table.chunks} (id,artifactkey,chunkindex,byteoffset,sizebytes,sha256,storagekey) values (?,?,?,?,?,?,?)`, [chunk.id, chunk.artifactkey, chunk.index, chunk.offset, chunk.sizebytes, chunk.sha256, chunk.storagekey]); return chunk; },
23
- async getchunks(artifactkey) { return (await many(`select * from ${table.chunks} where artifactkey = ? order by chunkindex asc`, [artifactkey])).map((row) => ({ ...row, index: row.index ?? row.chunkindex, offset: row.offset ?? row.byteoffset })); }
24
- });
25
- }
26
-
27
- export function mysql2persistence(pool, options = {}) { if (typeof pool?.execute !== "function") throw new TypeError("mysql2 pool requires execute"); return sqlpersistence({ ...options, query: async (statement, values) => pool.execute(statement, values) }); }
28
-
29
- function normalizejob(row) { return { ...row, input: parsejson(row.input) }; }
30
- function parsejson(value) { if (value == null || typeof value === "object") return value; try { return JSON.parse(value); } catch { return value; } }
@@ -1,18 +0,0 @@
1
- /**
2
- * block streaming yields bounded chunks and lets the consumer control backpressure.
3
- */
4
- export async function* blockstream(input, options = {}) {
5
- const blockbytes = options.blockbytes;
6
- if (!Number.isInteger(blockbytes) || blockbytes < 1) throw new TypeError("blockbytes must be a positive integer");
7
- let index = 0;
8
- let offset = 0;
9
- let pending = new Uint8Array(0);
10
- for await (const part of input instanceof Uint8Array ? [input] : input) {
11
- const data = part instanceof Uint8Array ? part : new TextEncoder().encode(String(part));
12
- pending = concat(pending, data);
13
- while (pending.byteLength > blockbytes) { const block = pending.slice(0, blockbytes); pending = pending.slice(blockbytes); yield { index, offset, data: block, final: false }; index += 1; offset += block.byteLength; }
14
- }
15
- if (pending.byteLength) yield { index, offset, data: pending, final: true };
16
- }
17
-
18
- function concat(left, right) { const output = new Uint8Array(left.byteLength + right.byteLength); output.set(left); output.set(right, left.byteLength); return output; }
@@ -1,17 +0,0 @@
1
- /**
2
- * ndjson supports append only records and incremental parsing.
3
- */
4
- import { jsondecode, jsonencode } from "./json.js";
5
-
6
- export async function* ndjsonencode(values) { for await (const value of values) yield `${jsonencode(value)}\n`; }
7
-
8
- export async function* ndjsondecode(input) {
9
- let buffer = "";
10
- for await (const chunk of input) {
11
- buffer += typeof chunk === "string" ? chunk : new TextDecoder().decode(chunk);
12
- const lines = buffer.split(/\r?\n/);
13
- buffer = lines.pop() ?? "";
14
- for (const line of lines) if (line.trim()) yield jsondecode(line);
15
- }
16
- if (buffer.trim()) yield jsondecode(buffer);
17
- }
package/protocol/sse.js DELETED
@@ -1,22 +0,0 @@
1
- /**
2
- * sse helpers encode typed events without requiring a web framework.
3
- */
4
- import { jsondecode, jsonencode } from "./json.js";
5
-
6
- export function sseencode(event) {
7
- const lines = [];
8
- if (event.id !== undefined) lines.push(`id: ${event.id}`);
9
- if (event.event) lines.push(`event: ${event.event}`);
10
- for (const line of jsonencode(event.data ?? {}).split("\n")) lines.push(`data: ${line}`);
11
- return `${lines.join("\n")}\n\n`;
12
- }
13
-
14
- export function ssedecode(chunk) {
15
- const fields = {};
16
- for (const line of String(chunk).split(/\r?\n/)) {
17
- const index = line.indexOf(":");
18
- if (index < 0) continue;
19
- fields[line.slice(0, index)] = line.slice(index + 1).trimStart();
20
- }
21
- return { id: fields.id, event: fields.event, data: fields.data ? jsondecode(fields.data) : undefined };
22
- }
package/proxy/pool.js DELETED
@@ -1,12 +0,0 @@
1
- /**
2
- * proxy pool chooses healthy least used entries and never rotates blindly.
3
- */
4
- export function proxypool(options = {}) {
5
- const entries = (options.proxies ?? []).map((proxy) => ({ ...proxy, failures: 0, uses: 0, status: "active", lastused: 0 }));
6
- const threshold = options.failurethreshold ?? 3;
7
- const recovery = options.recoverytime ?? 300000;
8
- function revive() { const now = Date.now(); for (const entry of entries) if (entry.status === "graveyard" && now - entry.failedat >= recovery) { entry.status = "active"; entry.failures = 0; } }
9
- function choose() { revive(); const available = entries.filter((entry) => entry.status === "active"); if (!available.length) throw new Error("proxy pool has no healthy entries"); const selected = [...available].sort((left, right) => left.uses - right.uses || left.lastused - right.lastused)[0]; selected.uses += 1; selected.lastused = Date.now(); return { ...selected }; }
10
- function report(id, result = {}) { const entry = entries.find((value) => value.id === id); if (!entry) return null; if (result.ok) { entry.failures = 0; entry.status = "active"; } else { entry.failures += 1; entry.status = entry.failures >= threshold ? "graveyard" : "active"; entry.failedat = Date.now(); } return { ...entry }; }
11
- return { choose, report, list() { revive(); return entries.map((entry) => ({ ...entry })); } };
12
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * idempotency keys prevent duplicate delivery from at least once transports.
3
- */
4
- export function idempotency() {
5
- const results = new Map();
6
- return {
7
- has(key) { return results.has(key); },
8
- get(key) { return results.get(key); },
9
- set(key, value) { results.set(key, value); return value; },
10
- delete(key) { results.delete(key); }
11
- };
12
- }
@@ -1,44 +0,0 @@
1
- /**
2
- * persistent queue stores job state in a caller selected file.
3
- * running items return to queued when a process restores after a crash.
4
- */
5
- import { readFile, writeFile } from "node:fs/promises";
6
-
7
- /** Creates a crash recoverable queue with idempotent item identifiers. */
8
- export function persistentqueue(options = {}) {
9
- if (!options.path) throw new TypeError("persistent queue requires path");
10
- const maxattempts = options.maxattempts ?? 3;
11
- let state = { version: 1, items: [] };
12
- let loaded = false;
13
-
14
- /** Reads the queue once and returns running jobs to the waiting state. */
15
- async function restore() {
16
- if (loaded) return state;
17
- try { state = JSON.parse(await readFile(options.path, "utf8")); } catch (error) { if (error.code !== "ENOENT") throw error; }
18
- for (const item of state.items ?? []) if (item.status === "running") item.status = "queued";
19
- state.items ??= [];
20
- loaded = true;
21
- await persist();
22
- return state;
23
- }
24
-
25
- /** Appends a queued job and persists the new state. */
26
- async function enqueue(payload, metadata = {}) { await restore(); const id = metadata.id ?? `persistentjob${Date.now()}${state.items.length}`; if (state.items.some((item) => item.id === id)) return state.items.find((item) => item.id === id); const item = { id, payload, status: "queued", attempts: 0, createdat: Date.now(), updatedat: Date.now(), metadata }; state.items.push(item); await persist(); return { ...item }; }
27
-
28
- /** Claims the first queued job with stable ordering. */
29
- async function claim() { await restore(); const item = state.items.find((entry) => entry.status === "queued"); if (!item) return null; item.status = "running"; item.attempts += 1; item.updatedat = Date.now(); await persist(); return { ...item }; }
30
-
31
- /** Commits a successful result. */
32
- async function complete(id, result) { await restore(); const item = find(id); item.status = "completed"; item.result = result; item.updatedat = Date.now(); await persist(); return { ...item }; }
33
-
34
- /** Records an error and either retries or closes the item as failed. */
35
- async function fail(id, error) { await restore(); const item = find(id); item.error = { message: error?.message ?? String(error), code: error?.code }; item.status = item.attempts < maxattempts && error?.retryable !== false ? "queued" : "failed"; item.updatedat = Date.now(); await persist(); return { ...item }; }
36
-
37
- /** Lists queue items for status and diagnostics. */
38
- async function list(filter) { await restore(); return state.items.filter((item) => !filter || item.status === filter).map((item) => ({ ...item })); }
39
-
40
- return { restore, enqueue, claim, complete, fail, list };
41
-
42
- function find(id) { const item = state.items.find((entry) => entry.id === id); if (!item) throw new Error(`persistent queue item not found: ${id}`); return item; }
43
- async function persist() { await writeFile(options.path, `${JSON.stringify(state, null, 2)}\n`, "utf8"); }
44
- }
package/queue/queue.js DELETED
@@ -1,50 +0,0 @@
1
- /**
2
- * job queue groups concurrency retry timeout and idempotency at one boundary.
3
- */
4
- import { idempotency } from "./idempotency.js";
5
-
6
- export function jobqueue(options = {}) {
7
- const limit = options.concurrency ?? 1;
8
- const attempts = options.maxattempts ?? 3;
9
- const retryall = options.retryall ?? false;
10
- const keys = options.idempotency ?? idempotency();
11
- const pending = [];
12
- let active = 0;
13
- let sequence = 0;
14
- async function drain() {
15
- while (active < limit && pending.length) {
16
- const item = pending.shift();
17
- active += 1;
18
- execute(item).then(item.resolve, item.reject).finally(() => { active -= 1; void drain(); });
19
- }
20
- }
21
- async function execute(item) {
22
- if (item.key && keys.has(item.key)) return keys.get(item.key);
23
- let last;
24
- for (let attempt = 1; attempt <= attempts; attempt += 1) {
25
- try {
26
- const result = await item.handler({ id: item.id, payload: item.payload, attempt });
27
- if (item.key) keys.set(item.key, result);
28
- return result;
29
- } catch (error) {
30
- last = error;
31
- const retryable = retryall || error?.retryable === true || error?.code === "RUNNER_UNAVAILABLE";
32
- if (!retryable || attempt === attempts) throw error;
33
- await delay((options.backoff ?? 250) * 2 ** (attempt - 1));
34
- }
35
- }
36
- throw last;
37
- }
38
- return {
39
- add(payload, handler, options = {}) {
40
- if (typeof handler !== "function") return Promise.reject(new TypeError("queue handler is required"));
41
- const id = options.id ?? `queuejob${sequence++}`;
42
- return new Promise((resolve, reject) => { pending.push({ id, payload, handler, key: options.key, resolve, reject }); void drain(); });
43
- },
44
- size() { return pending.length; },
45
- active() { return active; },
46
- async idle() { while (pending.length || active) await delay(10); }
47
- };
48
- }
49
-
50
- function delay(milliseconds) { return new Promise((resolve) => setTimeout(resolve, milliseconds)); }
package/queue/saga.js DELETED
@@ -1,13 +0,0 @@
1
- /**
2
- * saga executes compensations in reverse order when a multi step operation fails.
3
- */
4
- export async function saga(steps, context = {}) {
5
- const completed = [];
6
- try {
7
- for (const step of steps) { const value = await step.run(context); completed.push({ step, value }); }
8
- return completed.map((item) => item.value);
9
- } catch (error) {
10
- for (const item of completed.reverse()) if (typeof item.step.compensate === "function") await item.step.compensate(context, item.value);
11
- throw error;
12
- }
13
- }
package/release/assets.js DELETED
@@ -1,70 +0,0 @@
1
- /**
2
- * release assets create deterministic checksums, SBOM data and provenance statements.
3
- * The adapter reads caller-selected artifacts and never publishes or handles credentials.
4
- */
5
-
6
- import { createHash } from "node:crypto";
7
- import { mkdir, readFile, writeFile } from "node:fs/promises";
8
- import { dirname, join, relative, resolve } from "node:path";
9
- import { fileURLToPath } from "node:url";
10
-
11
- const rootpath = resolve(dirname(fileURLToPath(import.meta.url)), "..");
12
-
13
- /** Builds deterministic release metadata files for caller-selected artifacts. */
14
- export async function createassets(options = {}) {
15
- const packagefile = resolve(options.packagefile ?? join(rootpath, "package.json"));
16
- const lockfile = resolve(options.lockfile ?? join(rootpath, "package-lock.json"));
17
- const output = resolve(options.output ?? join(rootpath, "build", "release"));
18
- const artifactroot = resolve(options.artifactroot ?? rootpath);
19
- const packagejson = JSON.parse(await readFile(packagefile, "utf8"));
20
- const lockjson = JSON.parse(await readFile(lockfile, "utf8"));
21
- const artifacts = [...new Set((options.artifacts ?? []).map((artifact) => resolve(String(artifact))))].sort();
22
- const subjects = await Promise.all(artifacts.map(async (artifact) => ({ name: relative(artifactroot, artifact).replaceAll("\\", "/"), digest: await sha256(artifact) })));
23
- await mkdir(output, { recursive: true });
24
- const checksums = `${subjects.map((subject) => `${subject.digest} ${subject.name}`).join("\n")}${subjects.length ? "\n" : ""}`;
25
- const sbom = createsbom(packagejson, lockjson);
26
- const provenance = createprovenance(packagejson, subjects, options);
27
- const files = { checksums: join(output, "SHA256SUMS"), sbom: join(output, "sbom.cdx.json"), provenance: join(output, "provenance.intoto.jsonl") };
28
- await writeFile(files.checksums, checksums);
29
- await writeFile(files.sbom, `${JSON.stringify(sbom, null, 2)}\n`);
30
- await writeFile(files.provenance, `${JSON.stringify(provenance)}\n`);
31
- return { output, files, subjects, sbom, provenance };
32
- }
33
-
34
- /** Creates a compact CycloneDX component list from the root lockfile dependencies. */
35
- export function createsbom(packagejson, lockjson = {}) {
36
- const root = lockjson.packages?.[""] ?? {};
37
- const dependencies = { ...(root.dependencies ?? {}), ...(root.devDependencies ?? {}) };
38
- const components = Object.keys(dependencies).map((name) => {
39
- const entry = lockjson.packages?.[`node_modules/${name}`] ?? {};
40
- const version = String(entry.version ?? dependencies[name]).replace(/^[^0-9]*/, "");
41
- return { "bom-ref": `pkg:npm/${name}@${version}`, name, version, purl: `pkg:npm/${name}@${version}`, scope: root.devDependencies?.[name] ? "optional" : "required", type: "library" };
42
- }).sort((left, right) => left.name.localeCompare(right.name));
43
- return { bomFormat: "CycloneDX", specVersion: "1.5", serialNumber: `urn:uuid:${stableuuid(`${packagejson.name}@${packagejson.version}`)}`, version: 1, metadata: { component: { type: "application", name: String(packagejson.name), version: String(packagejson.version) } }, components };
44
- }
45
-
46
- /** Creates an in-toto statement whose subjects are the caller-selected release artifacts. */
47
- export function createprovenance(packagejson, subjects = [], options = {}) {
48
- const normalized = subjects.map((subject) => ({ name: String(subject.name), digest: { sha256: String(subject.digest) } })).sort((left, right) => left.name.localeCompare(right.name));
49
- return { _type: "https://in-toto.io/Statement/v1", subject: normalized, predicateType: "https://slsa.dev/provenance/v1", predicate: { buildDefinition: { buildType: String(options.buildtype ?? "caller-defined"), externalParameters: { package: String(packagejson.name), version: String(options.version ?? packagejson.version) }, internalParameters: {} }, runDetails: { builder: { id: String(options.builder ?? "caller-defined") }, metadata: { invocationId: stableuuid(`${packagejson.name}@${options.version ?? packagejson.version}:${normalized.map((subject) => subject.name).join(",")}`) } } } };
50
- }
51
-
52
- async function sha256(path) { const hash = createHash("sha256"); hash.update(await readFile(path)); return hash.digest("hex"); }
53
-
54
- function stableuuid(value) { const hex = createHash("sha256").update(String(value)).digest("hex").slice(0, 32); return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-${(8 + (Number.parseInt(hex.slice(16, 17), 16) % 4).toString(16))}${hex.slice(17, 20)}-${hex.slice(20)}`; }
55
-
56
- function parsearguments(argumentslist) {
57
- const options = { artifacts: [] };
58
- for (let index = 0; index < argumentslist.length; index += 1) {
59
- const argument = argumentslist[index];
60
- if (argument === "--output") options.output = argumentslist[++index];
61
- else if (argument === "--version") options.version = argumentslist[++index];
62
- else if (argument === "--artifact") options.artifacts.push(argumentslist[++index]);
63
- else if (argument === "--build-type") options.buildtype = argumentslist[++index];
64
- else if (argument === "--builder") options.builder = argumentslist[++index];
65
- else throw new TypeError(`unsupported release asset argument: ${argument}`);
66
- }
67
- return options;
68
- }
69
-
70
- if (process.argv[1] === fileURLToPath(import.meta.url)) createassets(parsearguments(process.argv.slice(2))).then(({ output }) => { console.log(`release assets: ${output}`); }).catch((error) => { console.error(error.message); process.exitCode = 1; });
package/retry/circuit.js DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * circuit breaker protects providers from repeated failure storms.
3
- */
4
- export function circuitbreaker(options = {}) {
5
- const threshold = options.failurethreshold ?? 5;
6
- const resettimeout = options.resettimeout ?? 60000;
7
- let failures = 0;
8
- let openedat = 0;
9
- let state = "closed";
10
- async function execute(handler) {
11
- if (state === "open") { if (Date.now() - openedat < resettimeout) throw new Error("circuit breaker is open"); state = "halfopen"; }
12
- try { const result = await handler(); failures = 0; state = "closed"; return result; } catch (error) { failures += 1; if (failures >= threshold) { state = "open"; openedat = Date.now(); } throw error; }
13
- }
14
- return { execute, status() { return { state, failures, openedat }; }, reset() { failures = 0; openedat = 0; state = "closed"; } };
15
- }
package/retry/policy.js DELETED
@@ -1,12 +0,0 @@
1
- /**
2
- * retry policy handles transient errors and keeps non retryable failures terminal.
3
- */
4
- export function retrypolicy(options = {}) {
5
- const maxattempts = options.maxattempts ?? 3;
6
- const base = options.base ?? 1000;
7
- const factor = options.factor ?? 2;
8
- const cap = options.cap ?? 30000;
9
- return { async run(handler) { let last; for (let attempt = 1; attempt <= maxattempts; attempt += 1) { try { return await handler(attempt); } catch (error) { last = error; if (error?.retryable !== true || attempt === maxattempts) throw error; const wait = Math.min(cap, base * factor ** (attempt - 1)) + Math.floor(Math.random() * (options.jitter ?? 0)); options.onretry?.({ attempt, wait, error }); await delay(wait); } } throw last; } };
10
- }
11
-
12
- function delay(milliseconds) { return milliseconds ? new Promise((resolve) => setTimeout(resolve, milliseconds)) : Promise.resolve(); }
package/runners/health.js DELETED
@@ -1,23 +0,0 @@
1
- /**
2
- * runner health checks describe provider capacity without selecting infrastructure.
3
- */
4
-
5
- /** Checks provider readiness and returns a serializable health report. */
6
- export async function runnerhealth(provider, job = {}) {
7
- if (typeof provider?.descriptor !== "function" || typeof provider?.canrun !== "function") throw new TypeError("runner health requires a provider");
8
- const descriptor = provider.descriptor();
9
- try {
10
- const available = await provider.canrun(job);
11
- return { id: String(descriptor.id), status: available ? descriptor.status ?? "available" : "busy", healthy: Boolean(available), checkedat: Date.now(), capacity: { maxconcurrent: descriptor.maxconcurrent, capabilities: [...(descriptor.capabilities ?? [])] } };
12
- } catch (error) {
13
- return { id: String(descriptor.id), status: "offline", healthy: false, checkedat: Date.now(), capacity: { maxconcurrent: descriptor.maxconcurrent, capabilities: [...(descriptor.capabilities ?? [])] }, error: { code: String(error.code ?? "RUNNER_HEALTH_FAILED"), message: String(error.message ?? error) } };
14
- }
15
- }
16
-
17
- /** Checks a provider list in stable order and summarizes available capacity. */
18
- export async function runnerhealthall(providers = [], job = {}) {
19
- if (!Array.isArray(providers)) throw new TypeError("runner health providers must be an array");
20
- const reports = [];
21
- for (const provider of providers) reports.push(await runnerhealth(provider, job));
22
- return { checkedat: Date.now(), reports, available: reports.filter((report) => report.healthy).length, total: reports.length };
23
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * heartbeat manages cooperative liveness signals for long-running local or remote jobs.
3
- */
4
-
5
- /** Creates a heartbeat controller with manual ticks and optional interval execution. */
6
- export function heartbeat(options = {}) {
7
- const interval = Number(options.interval ?? 30000);
8
- if (!Number.isFinite(interval) || interval < 1) throw new TypeError("heartbeat interval must be positive");
9
- let timer;
10
- let sequence = 0;
11
- let last;
12
- const listeners = new Set();
13
-
14
- async function tick(input = {}) {
15
- const signal = { id: String(input.id ?? options.id ?? "job"), sequence: ++sequence, at: Date.now(), status: String(input.status ?? "running"), metadata: { ...(input.metadata ?? {}) } };
16
- last = signal;
17
- for (const listener of listeners) await listener({ ...signal, metadata: { ...signal.metadata } });
18
- return signal;
19
- }
20
-
21
- function on(listener) { if (typeof listener !== "function") throw new TypeError("heartbeat listener must be a function"); listeners.add(listener); return () => listeners.delete(listener); }
22
- function start(input = {}) { if (timer) return false; const run = () => tick(input).catch(() => undefined); timer = setInterval(run, interval); return true; }
23
- function stop() { if (!timer) return false; clearInterval(timer); timer = undefined; return true; }
24
- function status() { return { running: Boolean(timer), interval, sequence, last: last ? { ...last, metadata: { ...last.metadata } } : undefined }; }
25
- return { tick, on, start, stop, status };
26
- }
@@ -1,19 +0,0 @@
1
- /**
2
- * the in process runner is the deterministic baseline for local execution.
3
- */
4
- export function inprocess(options = {}) {
5
- let available = options.status !== "offline";
6
- const runner = {
7
- id: options.id ?? "runnerlocal",
8
- name: options.name ?? "local in process runner",
9
- priority: options.priority ?? 0,
10
- maxconcurrent: options.maxconcurrent ?? 1,
11
- capabilities: options.capabilities ?? ["node", "local"]
12
- };
13
- return {
14
- descriptor() { return { ...runner, status: available ? "available" : "offline" }; },
15
- setavailable(value) { available = Boolean(value); },
16
- async canrun() { return available; },
17
- async execute(context, handler) { return handler(context); }
18
- };
19
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * scheduling uses stable priority order and selects the first available runner.
3
- */
4
- import { runnerunavailable } from "../core/errors.js";
5
-
6
- export function scheduler(providers) {
7
- if (!Array.isArray(providers) || providers.length === 0) throw new TypeError("scheduler requires providers");
8
- const ordered = [...providers].sort((left, right) => left.descriptor().priority - right.descriptor().priority);
9
- return {
10
- async select(job) {
11
- for (const provider of ordered) if (provider.descriptor().status === "available" && await provider.canrun(job)) return provider;
12
- throw runnerunavailable(job.id);
13
- },
14
- list() { return [...ordered]; }
15
- };
16
- }
package/runtime/abort.js DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * abort helpers unify deadlines without depending on a server framework.
3
- */
4
- export function deadline(milliseconds, parent) {
5
- if (!Number.isFinite(milliseconds) || milliseconds < 1) throw new TypeError("deadline must be positive");
6
- const controller = new AbortController();
7
- const timer = setTimeout(() => controller.abort(new Error("deadline exceeded")), milliseconds);
8
- if (parent) parent.addEventListener("abort", () => controller.abort(parent.reason), { once: true });
9
- return { signal: controller.signal, cancel() { clearTimeout(timer); controller.abort(); } };
10
- }
package/runtime/detect.js DELETED
@@ -1,14 +0,0 @@
1
- /**
2
- * runtime detection uses standard globals and keeps node specific modules outside the core.
3
- */
4
- export function runtimename(scope = globalThis) {
5
- if (scope.Deno) return "deno";
6
- if (scope.Bun) return "bun";
7
- if (scope.process?.versions?.node) return "node";
8
- if (scope.window?.document) return "browser";
9
- return "unknown";
10
- }
11
-
12
- export function runtimefeatures(scope = globalThis) {
13
- return { runtime: runtimename(scope), fetch: typeof scope.fetch === "function", streams: typeof scope.ReadableStream === "function" && typeof scope.WritableStream === "function", crypto: Boolean(scope.crypto), websocket: typeof scope.WebSocket === "function", filesystem: Boolean(scope.process?.versions?.node || scope.Deno) };
14
- }