@zackbart/connecta 0.34.1 → 0.36.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 (441) hide show
  1. package/CHANGELOG.md +418 -0
  2. package/README.md +65 -105
  3. package/SECURITY.md +3 -2
  4. package/bin/connecta.mjs +41 -16
  5. package/bin/version.mjs +1 -1
  6. package/dist/access-tokens.d.ts +2 -1
  7. package/dist/access-tokens.js +66 -30
  8. package/dist/activity.d.ts +1 -1
  9. package/dist/activity.js +2 -0
  10. package/dist/agent-config.d.ts +23 -0
  11. package/dist/agent-config.js +59 -0
  12. package/dist/agent-description.js +16 -0
  13. package/dist/agent-identity.js +4 -4
  14. package/dist/agent-observation.js +39 -0
  15. package/dist/auth/clerk-sdk/client.d.ts +2 -0
  16. package/dist/auth/clerk-sdk/generated.js +554 -563
  17. package/dist/auth/clerk-transport.js +70 -3
  18. package/dist/auth/clerk.d.ts +13 -0
  19. package/dist/auth/clerk.js +653 -246
  20. package/dist/auth/cloudflare-access.js +46 -42
  21. package/dist/auth/downstream-client-metadata.js +2 -2
  22. package/dist/auth/downstream-oauth.js +2044 -1161
  23. package/dist/auth/downstream-revocation.js +88 -88
  24. package/dist/auth/native-call.js +20 -0
  25. package/dist/auth/native.js +184 -0
  26. package/dist/auth/oauth-start-reset.js +11 -5
  27. package/dist/auth/oauth-token-response.js +121 -102
  28. package/dist/auth/oauth-v2-migration.js +97 -78
  29. package/dist/auth/renewable-grant.js +10 -0
  30. package/dist/auth/static-oauth.js +751 -281
  31. package/dist/auth/vercel-agent.js +266 -0
  32. package/dist/auth-admission.js +204 -0
  33. package/dist/auth-elicitation.js +350 -241
  34. package/dist/authorization-handoff.js +164 -90
  35. package/dist/call-admission-context.js +3 -10
  36. package/dist/call-admission.js +2 -0
  37. package/dist/call-classification.js +9 -0
  38. package/dist/call-recovery.js +32 -13
  39. package/dist/canonical-json.js +8 -0
  40. package/dist/catalog-cache.js +369 -213
  41. package/dist/catalog-service.js +659 -530
  42. package/dist/catalog.js +5 -1
  43. package/dist/concurrency.js +0 -25
  44. package/dist/config-defaults.d.ts +1 -0
  45. package/dist/config-defaults.js +1 -0
  46. package/dist/config-schema.d.ts +3 -1
  47. package/dist/config-schema.js +13 -3
  48. package/dist/config.d.ts +40 -6
  49. package/dist/config.js +40 -26
  50. package/dist/connector-caller.d.ts +4 -0
  51. package/dist/connector-caller.js +17 -4
  52. package/dist/connectors/api-connector.d.ts +29 -7
  53. package/dist/connectors/api-connector.js +145 -57
  54. package/dist/connectors/guarded-fetch.d.ts +51 -17
  55. package/dist/connectors/guarded-fetch.js +215 -121
  56. package/dist/connectors/negotiation-cache.js +20 -10
  57. package/dist/connectors/remote-mcp.d.ts +10 -30
  58. package/dist/connectors/remote-mcp.js +955 -563
  59. package/dist/d1.js +10 -243
  60. package/dist/derived-context.js +5 -0
  61. package/dist/describe-config.d.ts +3 -1
  62. package/dist/describe-config.js +2 -0
  63. package/dist/downstream-input.js +347 -260
  64. package/dist/errors.d.ts +87 -6
  65. package/dist/errors.js +114 -4
  66. package/dist/execute.js +87 -50
  67. package/dist/executor-admission.js +3 -0
  68. package/dist/executors/quickjs.js +163 -112
  69. package/dist/guarded-transport.js +50 -0
  70. package/dist/guest-runtime.js +1 -1
  71. package/dist/http/client.js +439 -0
  72. package/dist/http/errors.js +558 -0
  73. package/dist/http/fields.js +49 -0
  74. package/dist/http/hatch-paging.js +318 -0
  75. package/dist/http/hatch.js +1279 -0
  76. package/dist/http/json-schema.js +267 -0
  77. package/dist/http/node-transport.js +241 -0
  78. package/dist/http/oauth.js +162 -0
  79. package/dist/http/paging.js +227 -0
  80. package/dist/http/provider.js +221 -0
  81. package/dist/http/safety.js +82 -0
  82. package/dist/http/services.js +79 -0
  83. package/dist/http/tools.js +379 -0
  84. package/dist/http/vendor-index.js +138 -0
  85. package/dist/http/vendor.js +448 -0
  86. package/dist/http/write-request.js +66 -0
  87. package/dist/http-policy.d.ts +11 -0
  88. package/dist/http-policy.js +45 -0
  89. package/dist/inbound-credential.js +1 -1
  90. package/dist/index.d.ts +2 -2
  91. package/dist/index.js +4 -0
  92. package/dist/invocation-auth.js +30 -19
  93. package/dist/invocation.js +218 -85
  94. package/dist/mcp-result.js +0 -4
  95. package/dist/membership.d.ts +4 -0
  96. package/dist/meta-output.js +1 -1
  97. package/dist/meta-tools.js +531 -406
  98. package/dist/native-recovery.js +52 -0
  99. package/dist/native-tools.js +382 -0
  100. package/dist/node.d.ts +4 -3
  101. package/dist/node.js +45 -8
  102. package/dist/oauth-handoff.js +177 -104
  103. package/dist/oauth-partition.js +6 -20
  104. package/dist/oauth-sealing.js +6 -7
  105. package/dist/operation-vocabulary.js +101 -0
  106. package/dist/operator-record.d.ts +2 -2
  107. package/dist/operator-record.js +17 -4
  108. package/dist/operator-ui/contract.d.ts +8 -3
  109. package/dist/operator-ui/generated.js +4 -4
  110. package/dist/operator-ui/model.d.ts +2 -3
  111. package/dist/program-writes.js +47 -26
  112. package/dist/provider-call-facts.d.ts +115 -0
  113. package/dist/provider-call-facts.js +182 -0
  114. package/dist/provider-call.d.ts +112 -0
  115. package/dist/provider-call.js +271 -0
  116. package/dist/provider.d.ts +65 -31
  117. package/dist/provider.js +116 -39
  118. package/dist/providers/_shared/google/hatch.js +91 -0
  119. package/dist/providers/_shared/google/kit.js +427 -0
  120. package/dist/providers/_shared/google/result-size.js +15 -2
  121. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  122. package/dist/providers/_shared/google/service-account.js +8 -4
  123. package/dist/providers/_shared/google/workspace.d.ts +6 -210
  124. package/dist/providers/_shared/google/workspace.js +6 -425
  125. package/dist/providers/_shared/rest/compact-index.js +86 -0
  126. package/dist/providers/_shared/rest/kit.js +146 -0
  127. package/dist/providers/_shared/rest/operation-index.js +230 -14
  128. package/dist/providers/_shared/rest/response-media.js +11 -0
  129. package/dist/providers/_shared/rest/value-safety.js +353 -195
  130. package/dist/providers/_shared/sensitive-fields.js +27 -0
  131. package/dist/providers/breeze/api.js +584 -0
  132. package/dist/providers/breeze/index.d.ts +1 -3
  133. package/dist/providers/breeze/index.js +67 -1420
  134. package/dist/providers/breeze/openapi.generated.js +60 -0
  135. package/dist/providers/breeze/skill.generated.js +2 -6
  136. package/dist/providers/breeze/tools.js +696 -0
  137. package/dist/providers/ccb/api.js +496 -0
  138. package/dist/providers/ccb/index.d.ts +15 -37
  139. package/dist/providers/ccb/index.js +77 -1702
  140. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  141. package/dist/providers/ccb/lib/constants.js +74 -0
  142. package/dist/providers/ccb/lib/guide.js +9 -0
  143. package/dist/providers/ccb/lib/verdicts.js +387 -0
  144. package/dist/providers/ccb/openapi.generated.js +397 -0
  145. package/dist/providers/ccb/safety.js +295 -0
  146. package/dist/providers/ccb/skill.generated.js +2 -6
  147. package/dist/providers/ccb/tools.js +853 -0
  148. package/dist/providers/cloudflare/api.js +1066 -0
  149. package/dist/providers/cloudflare/index.d.ts +5 -22
  150. package/dist/providers/cloudflare/index.js +79 -197
  151. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  152. package/dist/providers/cloudflare/lib/config.js +2 -0
  153. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  154. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  155. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  156. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  157. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  158. package/dist/providers/cloudflare/openapi.generated.js +4 -3
  159. package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
  160. package/dist/providers/cloudflare/skill.generated.js +2 -10
  161. package/dist/providers/cloudflare/tools.js +360 -0
  162. package/dist/providers/docs/api.js +51 -0
  163. package/dist/providers/docs/index.d.ts +1 -12
  164. package/dist/providers/docs/index.js +53 -1165
  165. package/dist/providers/docs/lib/constants.d.ts +18 -0
  166. package/dist/providers/docs/lib/constants.js +18 -0
  167. package/dist/providers/docs/lib/discovery.js +26 -0
  168. package/dist/providers/docs/lib/requests.js +48 -0
  169. package/dist/providers/docs/lib/schemas.js +168 -0
  170. package/dist/providers/docs/openapi.generated.js +16 -0
  171. package/dist/providers/docs/safety.js +54 -0
  172. package/dist/providers/docs/skill.generated.js +2 -6
  173. package/dist/providers/docs/tools.js +801 -0
  174. package/dist/providers/drive/api.js +177 -0
  175. package/dist/providers/drive/index.d.ts +1 -12
  176. package/dist/providers/drive/index.js +38 -1448
  177. package/dist/providers/drive/lib/constants.d.ts +6 -0
  178. package/dist/providers/drive/lib/constants.js +6 -0
  179. package/dist/providers/drive/lib/contracts.js +532 -0
  180. package/dist/providers/drive/lib/hatch.js +197 -0
  181. package/dist/providers/drive/openapi.generated.js +77 -0
  182. package/dist/providers/drive/safety.js +90 -0
  183. package/dist/providers/drive/skill.generated.js +2 -6
  184. package/dist/providers/drive/tools.js +1290 -0
  185. package/dist/providers/forms/api.js +71 -0
  186. package/dist/providers/forms/index.d.ts +1 -12
  187. package/dist/providers/forms/index.js +49 -1145
  188. package/dist/providers/forms/lib/constants.d.ts +14 -0
  189. package/dist/providers/forms/lib/constants.js +19 -0
  190. package/dist/providers/forms/lib/hatch.js +72 -0
  191. package/dist/providers/forms/openapi.generated.js +23 -0
  192. package/dist/providers/forms/safety.js +34 -0
  193. package/dist/providers/forms/skill.generated.js +2 -8
  194. package/dist/providers/forms/tools.js +1023 -0
  195. package/dist/providers/github/api.js +150 -0
  196. package/dist/providers/github/index.d.ts +4 -5
  197. package/dist/providers/github/index.js +30 -87
  198. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  199. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  200. package/dist/providers/github/lib/discovery.js +132 -0
  201. package/dist/providers/github/lib/operations.js +58 -0
  202. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  203. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  204. package/dist/providers/github/openapi.generated.js +1216 -0
  205. package/dist/providers/github/safety.js +216 -0
  206. package/dist/providers/github/skill.generated.js +2 -5
  207. package/dist/providers/github/tools.js +506 -0
  208. package/dist/providers/gmail/api.js +114 -0
  209. package/dist/providers/gmail/index.d.ts +1 -12
  210. package/dist/providers/gmail/index.js +73 -1621
  211. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  212. package/dist/providers/gmail/lib/constants.js +16 -0
  213. package/dist/providers/gmail/lib/index.js +173 -0
  214. package/dist/providers/gmail/lib/schemas.js +176 -0
  215. package/dist/providers/gmail/lib/threading.js +120 -0
  216. package/dist/providers/gmail/openapi.generated.js +92 -0
  217. package/dist/providers/gmail/safety.js +21 -0
  218. package/dist/providers/gmail/skill.generated.js +2 -6
  219. package/dist/providers/gmail/tools.js +1435 -0
  220. package/dist/providers/overflow/api.js +1008 -0
  221. package/dist/providers/overflow/index.d.ts +1 -17
  222. package/dist/providers/overflow/index.js +60 -1488
  223. package/dist/providers/overflow/skill.generated.js +2 -5
  224. package/dist/providers/overflow/tools.js +873 -0
  225. package/dist/providers/planning-center/api.js +467 -0
  226. package/dist/providers/planning-center/index.d.ts +4 -35
  227. package/dist/providers/planning-center/index.js +69 -2445
  228. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  229. package/dist/providers/planning-center/lib/constants.js +83 -0
  230. package/dist/providers/planning-center/lib/discovery.js +40 -0
  231. package/dist/providers/planning-center/lib/guide.js +39 -0
  232. package/dist/providers/planning-center/lib/json-api.js +83 -0
  233. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  234. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  235. package/dist/providers/planning-center/safety.js +188 -0
  236. package/dist/providers/planning-center/skill.generated.js +2 -27
  237. package/dist/providers/planning-center/tools.js +1010 -0
  238. package/dist/providers/quickbooks/api.js +299 -0
  239. package/dist/providers/quickbooks/index.d.ts +13 -0
  240. package/dist/providers/quickbooks/index.js +93 -0
  241. package/dist/providers/quickbooks/lib/query.js +118 -0
  242. package/dist/providers/quickbooks/lib/writes.js +168 -0
  243. package/dist/providers/quickbooks/safety.js +222 -0
  244. package/dist/providers/quickbooks/skill.generated.js +5 -0
  245. package/dist/providers/quickbooks/tools.js +117 -0
  246. package/dist/providers/sheets/api.js +133 -0
  247. package/dist/providers/sheets/index.d.ts +4 -16
  248. package/dist/providers/sheets/index.js +61 -1172
  249. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  250. package/dist/providers/sheets/lib/constants.js +14 -0
  251. package/dist/providers/sheets/lib/hatch.js +163 -0
  252. package/dist/providers/sheets/lib/requests.js +105 -0
  253. package/dist/providers/sheets/lib/schemas.js +138 -0
  254. package/dist/providers/sheets/openapi.generated.js +30 -0
  255. package/dist/providers/sheets/safety.js +27 -0
  256. package/dist/providers/sheets/skill.generated.js +2 -7
  257. package/dist/providers/sheets/tools.js +733 -0
  258. package/dist/providers/slides/api.js +147 -0
  259. package/dist/providers/slides/index.d.ts +2 -10
  260. package/dist/providers/slides/index.js +48 -2555
  261. package/dist/providers/slides/lib/constants.d.ts +11 -0
  262. package/dist/providers/slides/lib/constants.js +11 -0
  263. package/dist/providers/slides/lib/requests.js +60 -0
  264. package/dist/providers/slides/lib/schemas.js +565 -0
  265. package/dist/providers/slides/openapi.generated.js +18 -0
  266. package/dist/providers/slides/skill.generated.js +2 -6
  267. package/dist/providers/slides/tools.js +1968 -0
  268. package/dist/providers/stripe/api.js +401 -0
  269. package/dist/providers/stripe/index.d.ts +5 -27
  270. package/dist/providers/stripe/index.js +74 -210
  271. package/dist/providers/stripe/lib/config.d.ts +4 -0
  272. package/dist/providers/stripe/lib/config.js +2 -0
  273. package/dist/providers/stripe/openapi.generated.js +4 -3
  274. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  275. package/dist/providers/stripe/skill.generated.js +2 -11
  276. package/dist/providers/stripe/tools.js +77 -0
  277. package/dist/providers/tithely/api.js +531 -0
  278. package/dist/providers/tithely/index.d.ts +17 -0
  279. package/dist/providers/tithely/index.js +86 -965
  280. package/dist/providers/tithely/skill.generated.js +2 -5
  281. package/dist/providers/tithely/tools.js +426 -0
  282. package/dist/providers/vercel/api.js +551 -0
  283. package/dist/providers/vercel/index.d.ts +9 -25
  284. package/dist/providers/vercel/index.js +65 -260
  285. package/dist/providers/vercel/lib/config.d.ts +2 -0
  286. package/dist/providers/vercel/lib/config.js +2 -0
  287. package/dist/providers/vercel/lib/index.js +117 -0
  288. package/dist/providers/vercel/lib/logs.js +100 -0
  289. package/dist/providers/vercel/lib/pin.js +270 -0
  290. package/dist/providers/vercel/openapi.generated.js +10 -5
  291. package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
  292. package/dist/providers/vercel/skill.generated.js +2 -7
  293. package/dist/providers/vercel/tools.js +642 -0
  294. package/dist/redaction-identity.js +47 -0
  295. package/dist/redaction-marker.js +125 -0
  296. package/dist/registry.d.ts +21 -15
  297. package/dist/registry.js +409 -376
  298. package/dist/routes/access-tokens.js +1 -1
  299. package/dist/routes/actor-labels.js +1 -1
  300. package/dist/routes/connect.js +1 -1
  301. package/dist/routes/dispatch.js +103 -0
  302. package/dist/routes/mcp.js +170 -79
  303. package/dist/routes/oauth.js +6 -1
  304. package/dist/routes/operator.js +2 -2
  305. package/dist/routes/shared.d.ts +5 -4
  306. package/dist/routes/shared.js +244 -177
  307. package/dist/routes/skills.js +10 -8
  308. package/dist/routes/ui-config.js +27 -3
  309. package/dist/routes/ui-data.js +21 -20
  310. package/dist/routes/ui.js +1 -1
  311. package/dist/runtime/call-admission.js +0 -26
  312. package/dist/runtime/call-entry.js +30 -0
  313. package/dist/runtime/call.js +552 -0
  314. package/dist/runtime/connector-scope.js +7 -0
  315. package/dist/runtime/credential-probe.js +34 -0
  316. package/dist/runtime/executor.js +40 -0
  317. package/dist/runtime/native-storage.js +63 -0
  318. package/dist/runtime/registry.js +27 -0
  319. package/dist/runtime/request-scope.js +72 -0
  320. package/dist/runtime/run.js +15 -7
  321. package/dist/runtime/shared-read.js +34 -5
  322. package/dist/runtime/storage.js +34 -21
  323. package/dist/sent-secrets.d.ts +194 -37
  324. package/dist/sent-secrets.js +1743 -340
  325. package/dist/server.js +5 -56
  326. package/dist/skills.js +322 -223
  327. package/dist/sqlite.js +15 -14
  328. package/dist/storage/d1-copy.js +255 -0
  329. package/dist/storage/d1-driver.js +15 -0
  330. package/dist/storage/keys.js +28 -0
  331. package/dist/storage/sql-driver.js +88 -0
  332. package/dist/storage/sql-native.js +544 -0
  333. package/dist/storage/sql-schema.d.ts +6 -0
  334. package/dist/storage/sql-schema.js +15 -0
  335. package/dist/storage/sql.d.ts +14 -20
  336. package/dist/storage/sql.js +29 -535
  337. package/dist/timeout.js +0 -26
  338. package/dist/tool-safety.js +20 -10
  339. package/dist/types.d.ts +9 -109
  340. package/dist/ui.d.ts +1 -1
  341. package/dist/ui.js +0 -1
  342. package/dist/upward.js +3 -0
  343. package/dist/usage-guide.js +3 -1
  344. package/dist/validate.d.ts +4 -2
  345. package/dist/validate.js +86 -9
  346. package/dist/version.d.ts +1 -1
  347. package/dist/version.js +1 -1
  348. package/dist/worker.js +312 -292
  349. package/dist/workspace-subject.js +5 -1
  350. package/dist/write-outcome.js +454 -34
  351. package/documentation/README.md +28 -7
  352. package/documentation/architecture.md +2409 -255
  353. package/documentation/auth.md +867 -114
  354. package/documentation/code-mode.md +49 -16
  355. package/documentation/deploying.md +164 -20
  356. package/documentation/hosted-mcp-migration.md +460 -0
  357. package/documentation/integrating.md +129 -144
  358. package/documentation/meta-tools.md +409 -32
  359. package/documentation/operating.md +27 -3
  360. package/documentation/operator-tests.md +3 -0
  361. package/documentation/operator-ui.md +84 -48
  362. package/documentation/provider-auth-migration.md +16 -63
  363. package/documentation/provider-migration-0.29.md +10 -5
  364. package/documentation/provider-migration-0.35.md +975 -0
  365. package/documentation/providers.md +1347 -0
  366. package/examples/worker/AGENTS.md +23 -9
  367. package/examples/worker/README.md +254 -135
  368. package/examples/worker/alchemy.run.ts +116 -0
  369. package/examples/worker/gitignore +10 -0
  370. package/examples/worker/src/connecta.config.ts +23 -21
  371. package/examples/worker/wrangler.jsonc +14 -5
  372. package/guides/connecting-agents.md +157 -0
  373. package/guides/how-it-works.md +156 -0
  374. package/guides/safety-and-trust.md +153 -0
  375. package/package.json +30 -50
  376. package/templates/node/.env.example +3 -0
  377. package/templates/node/README.md +22 -2
  378. package/templates/node/docker-compose.yml +1 -0
  379. package/templates/node/package.json +3 -2
  380. package/templates/node/src/connecta.config.ts +8 -0
  381. package/dist/catalog-drift.d.ts +0 -138
  382. package/dist/catalog-drift.js +0 -578
  383. package/dist/operator-ui/agents.d.ts +0 -74
  384. package/dist/operator-ui/agents.js +0 -104
  385. package/dist/operator-ui/config-summary.js +0 -565
  386. package/dist/operator-ui/connection-map.js +0 -376
  387. package/dist/operator-ui/endpoints.js +0 -221
  388. package/dist/operator-ui/fix-prompts.d.ts +0 -18
  389. package/dist/operator-ui/fix-prompts.js +0 -87
  390. package/dist/operator-ui/health.js +0 -52
  391. package/dist/operator-ui/member-page.js +0 -97
  392. package/dist/operator-ui/overview.js +0 -123
  393. package/dist/operator-ui/setup-commands.js +0 -51
  394. package/dist/operator-ui/view.d.ts +0 -401
  395. package/dist/operator-ui/view.js +0 -705
  396. package/dist/providers/_shared/request-token.js +0 -83
  397. package/dist/providers/_shared/rest/dispatch.js +0 -41
  398. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  399. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  400. package/dist/providers/_shared/rest/tools.js +0 -569
  401. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  402. package/dist/providers/basecamp/index.d.ts +0 -45
  403. package/dist/providers/basecamp/index.js +0 -997
  404. package/dist/providers/basecamp/skill.generated.js +0 -9
  405. package/dist/providers/cloudflare/rest.d.ts +0 -37
  406. package/dist/providers/cloudflare/rest.js +0 -1097
  407. package/dist/providers/github/hosted.js +0 -218
  408. package/dist/providers/github/rest.js +0 -321
  409. package/dist/providers/infisical/index.d.ts +0 -7
  410. package/dist/providers/infisical/index.js +0 -713
  411. package/dist/providers/infisical/skill.generated.js +0 -8
  412. package/dist/providers/intercom/index.d.ts +0 -24
  413. package/dist/providers/intercom/index.js +0 -121
  414. package/dist/providers/intercom/skill.generated.js +0 -8
  415. package/dist/providers/linear/index.d.ts +0 -55
  416. package/dist/providers/linear/index.js +0 -537
  417. package/dist/providers/linear/skill.generated.js +0 -8
  418. package/dist/providers/mixpanel/index.d.ts +0 -59
  419. package/dist/providers/mixpanel/index.js +0 -472
  420. package/dist/providers/mixpanel/operations.js +0 -20
  421. package/dist/providers/mixpanel/rest.js +0 -603
  422. package/dist/providers/mixpanel/skill.generated.js +0 -10
  423. package/dist/providers/mixpanel/value-safety.js +0 -16
  424. package/dist/providers/notion/index.d.ts +0 -67
  425. package/dist/providers/notion/index.js +0 -368
  426. package/dist/providers/notion/openapi.generated.js +0 -75
  427. package/dist/providers/notion/rest.d.ts +0 -24
  428. package/dist/providers/notion/rest.js +0 -1226
  429. package/dist/providers/notion/skill.generated.js +0 -11
  430. package/dist/providers/notion/value-safety.js +0 -56
  431. package/dist/providers/revenuecat/index.d.ts +0 -51
  432. package/dist/providers/revenuecat/index.js +0 -697
  433. package/dist/providers/revenuecat/skill.generated.js +0 -11
  434. package/dist/providers/stripe/rest.d.ts +0 -14
  435. package/dist/providers/stripe/rest.js +0 -402
  436. package/dist/providers/vercel/rest.d.ts +0 -20
  437. package/dist/providers/vercel/rest.js +0 -1020
  438. package/dist/providers/wispr-flow/index.d.ts +0 -14
  439. package/dist/providers/wispr-flow/index.js +0 -117
  440. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  441. /package/dist/providers/github/{key.js → lib/key.js} +0 -0
package/dist/worker.js CHANGED
@@ -1,5 +1,9 @@
1
1
  // The upstream sandbox, with request-owned loader/RPC handles. A guest's
2
2
  // deadline cannot clean up after the parent response has already ended.
3
+ import { Deferred, Effect, Exit, Scope } from "effect";
4
+ import { admit } from "./runtime/admission.js";
5
+ import { detach, runEdge } from "./runtime/run.js";
6
+ import { awaitExecutorLease, provideExecutorProgram, executorProgram } from "./runtime/executor.js";
3
7
  import { DynamicWorkerExecutor, normalizeCode } from "@cloudflare/codemode";
4
8
  import { AdmissionController, ExecutorExecutionError } from "./executor-admission.js";
5
9
  import { brandExecutor } from "./executor-contract.js";
@@ -48,110 +52,90 @@ export function workerExecutor(options) {
48
52
  retryAfterMs: 1_000,
49
53
  });
50
54
  const active = new Set();
51
- return brandExecutor({
52
- name: "DynamicWorkerExecutor",
53
- async acquire(request = {}) {
54
- const permit = await admission.acquire(request);
55
- const disposers = [];
56
- let released = false;
57
- let executed = false;
58
- let runEnded = false;
59
- let cancel;
60
- let hostProviders;
61
- const hostFailures = new Map();
62
- // An upstream evaluation can remain pending after disposal. Its
63
- // dispatchers retain only these forwarders, detached on lease release.
64
- const forward = (index, name) => async (...args) => {
55
+ const acquire = (request = {}) => Effect.gen(function* () {
56
+ const permit = yield* admit(admission, request);
57
+ const resources = Scope.makeUnsafe();
58
+ const stopped = Deferred.makeUnsafe();
59
+ let released = false;
60
+ let executed = false;
61
+ let runEnded = false;
62
+ let hostProviders;
63
+ const hostFailures = new Map();
64
+ // An upstream evaluation can remain pending after disposal. Its
65
+ // dispatchers retain only these forwarders, detached on lease release.
66
+ const forward = (index, name) => (...args) => runEdge(Effect.raceFirst(Effect.tryPromise({
67
+ try: () => {
65
68
  const fn = hostProviders?.[index]?.fns[name];
66
- try {
67
- if (!fn)
68
- throw new Error("The Worker run ended.");
69
- return { ok: true, value: await fn(...args) };
70
- }
71
- catch (error) {
72
- const message = error instanceof Error ? error.message : "Host call failed.";
73
- if (error instanceof InvocationFailure && !released && !runEnded) {
74
- const failureId = crypto.randomUUID();
75
- hostFailures.set(failureId, error.details);
76
- // The codec may expose the copy to guest hooks. The authoritative
77
- // record never leaves this host-side map.
78
- return {
79
- ok: false,
80
- error: {
81
- message,
82
- code: error.details.code,
83
- retryable: error.details.retryable,
84
- details: structuredClone(error.details),
85
- },
86
- failureId,
87
- };
88
- }
89
- return { ok: false, error: { message } };
69
+ if (!fn || released || runEnded)
70
+ throw new Error("The Worker run ended.");
71
+ return Promise.resolve(fn(...args));
72
+ },
73
+ catch: (error) => error,
74
+ }), Deferred.await(stopped)).pipe(Effect.match({
75
+ onSuccess: (value) => ({ ok: true, value }),
76
+ onFailure: (error) => {
77
+ const message = error instanceof Error ? error.message : "Host call failed.";
78
+ if (error instanceof InvocationFailure && !released && !runEnded) {
79
+ const failureId = crypto.randomUUID();
80
+ hostFailures.set(failureId, error.details);
81
+ // Guest hooks receive a copy; authority remains in this map.
82
+ return {
83
+ ok: false,
84
+ error: {
85
+ message,
86
+ code: error.details.code,
87
+ retryable: error.details.retryable,
88
+ details: structuredClone(error.details),
89
+ },
90
+ failureId,
91
+ };
90
92
  }
91
- };
92
- let rpcOutcome;
93
- // Keep each native method's receiver and make upstream's later finally
94
- // harmless. Release RPC stubs before the Worker Loader handle.
95
- const track = (resource, entrypoint = false) => {
96
- let disposed = false;
97
- const dispose = () => {
98
- if (disposed)
99
- return;
100
- disposed = true;
101
- const method = Reflect.get(resource, Symbol.dispose);
102
- if (typeof method === "function")
103
- method.call(resource);
104
- };
105
- disposers.push(dispose);
106
- return new Proxy(resource, {
107
- get(target, key) {
108
- if (key === Symbol.dispose)
109
- return dispose;
110
- if (key === "getEntrypoint" && !entrypoint) {
111
- return (...args) => track(Reflect.apply(Reflect.get(target, key), target, args), true);
112
- }
113
- if (key === "evaluate" && entrypoint)
114
- return async (...args) => {
115
- const result = (await Reflect.apply(Reflect.get(target, key), target, args));
116
- // Only the native RPC return channel supplies executor facts.
117
- rpcOutcome = result;
118
- return result;
119
- };
120
- const value = Reflect.get(target, key);
121
- return typeof value === "function" ? (...args) => Reflect.apply(value, target, args) : value;
122
- },
123
- });
124
- };
125
- let executableCode;
126
- let guestProgram;
127
- let normalizationLines = 0;
128
- const loader = new Proxy(options.loader, {
129
- get(target, key) {
130
- if (key === "load")
131
- return (...args) => {
132
- if (released)
133
- throw new Error("Executor lease was already released.");
134
- const definition = args[0];
135
- const source = definition?.modules?.["executor.js"];
136
- // Keep guest source in its own module, outside the lexical scope of
137
- // RPC dispatchers and retained host-failure identities.
138
- if (typeof source !== "string" || !executableCode || !hostProviders)
139
- throw new Error("Worker executable module was unavailable.");
140
- const index = source.indexOf(executableCode);
141
- if (index < 0)
142
- throw new Error("Worker executable module did not contain the program.");
143
- const guest = guestProgram;
144
- if (guest)
145
- normalizationLines = 0;
146
- const names = hostProviders.map((provider) => provider.name).join(", ");
147
- const globals = hostProviders
148
- .map((provider) => `globalThis[${JSON.stringify(provider.name)}] = ${provider.name};`)
149
- .join("\n");
150
- let isolated = source.slice(0, index) + "__connecta_program" + source.slice(index + executableCode.length);
151
- const bridge = `if (data.error) throw new Error(data.error);\n return data.result;`;
152
- if (hostProviders.length > 0 && !isolated.includes(bridge))
153
- throw new Error("Worker bridge contract changed.");
154
- isolated = isolated.replaceAll(bridge, `if (data.error) throw new NativeError(data.error);
93
+ return { ok: false, error: { message } };
94
+ },
95
+ })));
96
+ // The SDK prepares its source/dispatchers against this inert loader.
97
+ // Actual Loader and RPC acquisition belongs to the native program below.
98
+ let prepared;
99
+ const dispose = (resource) => Effect.sync(() => {
100
+ try {
101
+ const method = Reflect.get(resource, Symbol.dispose);
102
+ if (typeof method === "function")
103
+ method.call(resource);
104
+ }
105
+ catch {
106
+ /* A failed RPC disposer cannot skip the Loader cleanup. */
107
+ }
108
+ });
109
+ let executableCode;
110
+ let guestProgram;
111
+ let normalizationLines = 0;
112
+ const loader = new Proxy(options.loader, {
113
+ get(target, key) {
114
+ if (key === "load")
115
+ return (...args) => {
116
+ if (released)
117
+ throw new Error("Executor lease was already released.");
118
+ const definition = args[0];
119
+ const source = definition?.modules?.["executor.js"];
120
+ // Keep guest source in its own module, outside the lexical scope of
121
+ // RPC dispatchers and retained host-failure identities.
122
+ if (typeof source !== "string" || !executableCode || !hostProviders)
123
+ throw new Error("Worker executable module was unavailable.");
124
+ const index = source.indexOf(executableCode);
125
+ if (index < 0)
126
+ throw new Error("Worker executable module did not contain the program.");
127
+ const guest = guestProgram;
128
+ if (guest)
129
+ normalizationLines = 0;
130
+ const names = hostProviders.map((provider) => provider.name).join(", ");
131
+ const globals = hostProviders
132
+ .map((provider) => `globalThis[${JSON.stringify(provider.name)}] = ${provider.name};`)
133
+ .join("\n");
134
+ let isolated = source.slice(0, index) + "__connecta_program" + source.slice(index + executableCode.length);
135
+ const bridge = `if (data.error) throw new Error(data.error);\n return data.result;`;
136
+ if (hostProviders.length > 0 && !isolated.includes(bridge))
137
+ throw new Error("Worker bridge contract changed.");
138
+ isolated = isolated.replaceAll(bridge, `if (data.error) throw new NativeError(data.error);
155
139
  const reply = data.result;
156
140
  if (!reply.ok) {
157
141
  const error = new NativeError(reply.error.message);
@@ -167,14 +151,14 @@ export function workerExecutor(options) {
167
151
  throw error;
168
152
  }
169
153
  return reply.value;`);
170
- isolated = isolated.replace(" const __logs = [];", ` if (initialized) throw new NativeError("Worker initialization is single-use.");
154
+ isolated = isolated.replace(" const __logs = [];", ` if (initialized) throw new NativeError("Worker initialization is single-use.");
171
155
  initialized = true;
172
156
  const failures = new NativeWeakMap();
173
157
  const timeoutError = new NativeError("Execution timed out");
174
158
  const __logs = [];`);
175
- isolated = isolated.replace('new Error("Execution timed out")', "timeoutError");
176
- isolated = isolated.replace("setTimeout(() => reject(timeoutError)", "nativeSetTimeout(() => reject(timeoutError)");
177
- isolated = isolated.replace("return { result: undefined, error: err.message, logs: __logs };", `
159
+ isolated = isolated.replace('new Error("Execution timed out")', "timeoutError");
160
+ isolated = isolated.replace("setTimeout(() => reject(timeoutError)", "nativeSetTimeout(() => reject(timeoutError)");
161
+ isolated = isolated.replace("return { result: undefined, error: err.message, logs: __logs };", `
178
162
  const failureId = lookup(failures, err);
179
163
  let name = "Error", message = "Program threw a value.", stack = "";
180
164
  try {
@@ -190,29 +174,29 @@ export function workerExecutor(options) {
190
174
  name, ...(failureId ? { failureId } : {}), ...(location ? { line: toNumber(location[1]) - 1 } : {}),
191
175
  ...(err === timeoutError ? { timeout: { elapsedMs: ${options.timeout ?? 60_000}, deadlineMs: ${options.timeout ?? 60_000} } } : {})
192
176
  } };`);
193
- const preludes = [];
194
- let firstInitializer;
195
- for (const provider of hostProviders) {
196
- if (!provider.prelude)
197
- continue;
198
- if (!isolated.includes(provider.prelude))
199
- throw new Error("Worker provider setup was unavailable.");
200
- preludes.push(provider.prelude);
201
- const call = firstInitializer ? "" : `__connecta_initialize(${names});`;
202
- isolated = isolated.replace(provider.prelude, call);
203
- firstInitializer ||= call;
204
- }
205
- // Successive preludes share lexical bindings in both executors.
206
- const captureGuest = preludes.includes(guestPrelude());
207
- const initializer = preludes.length
208
- ? `const __connecta_initialize = (${names}) => {\n${preludes.map((prelude) => (prelude === guestPrelude() ? "__connecta_guest_initialize(connecta);" : prelude)).join("\n")}\n};\n`
209
- : "";
210
- // Runner modules are inaccessible to guest imports. The callback has
211
- // no lexical access to initialization or RPC dispatchers.
212
- const programName = guest ? "__connecta_user_program" : "__connecta_program";
213
- const imports = 'import Runner from "./connecta-runner.js";\n' + `import program from "./connecta-guest.js";\n`;
214
- const wrapper = guest ? ` const __connecta_program = (${guest.wrapper});\n` : "";
215
- const hardening = `
177
+ const preludes = [];
178
+ let firstInitializer;
179
+ for (const provider of hostProviders) {
180
+ if (!provider.prelude)
181
+ continue;
182
+ if (!isolated.includes(provider.prelude))
183
+ throw new Error("Worker provider setup was unavailable.");
184
+ preludes.push(provider.prelude);
185
+ const call = firstInitializer ? "" : `__connecta_initialize(${names});`;
186
+ isolated = isolated.replace(provider.prelude, call);
187
+ firstInitializer ||= call;
188
+ }
189
+ // Successive preludes share lexical bindings in both executors.
190
+ const captureGuest = preludes.includes(guestPrelude());
191
+ const initializer = preludes.length
192
+ ? `const __connecta_initialize = (${names}) => {\n${preludes.map((prelude) => (prelude === guestPrelude() ? "__connecta_guest_initialize(connecta);" : prelude)).join("\n")}\n};\n`
193
+ : "";
194
+ // Runner modules are inaccessible to guest imports. The callback has
195
+ // no lexical access to initialization or RPC dispatchers.
196
+ const programName = guest ? "__connecta_user_program" : "__connecta_program";
197
+ const imports = 'import Runner from "./connecta-runner.js";\n' + `import program from "./connecta-guest.js";\n`;
198
+ const wrapper = guest ? ` const __connecta_program = (${guest.wrapper});\n` : "";
199
+ const hardening = `
216
200
  const builtinAllowed = name => typeof name === "string" && name !== "module" && name !== "node:module" && name !== "process" && name !== "node:process";
217
201
  if (typeof process !== "undefined" && typeof process.getBuiltinModule === "function") {
218
202
  const getBuiltin = process.getBuiltinModule.bind(process);
@@ -220,10 +204,10 @@ if (typeof process !== "undefined" && typeof process.getBuiltinModule === "funct
220
204
  value: name => builtinAllowed(name) ? getBuiltin(name) : undefined });
221
205
  }
222
206
  `;
223
- // ESM evaluates the first dependency completely before the next.
224
- // This module has no guest dependency; its references and retained
225
- // failures stay private, and guest imports cannot reach its export.
226
- const captures = `
207
+ // ESM evaluates the first dependency completely before the next.
208
+ // This module has no guest dependency; its references and retained
209
+ // failures stay private, and guest imports cannot reach its export.
210
+ const captures = `
227
211
  const {
228
212
  NativeError, NativeWeakMap, NativeProxy, NativePromise, NativeUint8Array, NativeArrayBuffer,
229
213
  defineProperties, freeze, clone, retain, lookup, slice, nativeSetTimeout, toNumber, exec,
@@ -251,58 +235,59 @@ const {
251
235
  nativeConsole: console
252
236
  });
253
237
  `;
254
- const binaryTagCheck = "(__CODEMODE_BINARY_TAG in value)";
255
- const binaryDataCheck = 'typeof value.data !== "string"';
256
- if (!isolated.includes(binaryTagCheck) || !isolated.includes(binaryDataCheck)) {
257
- throw new Error("Worker binary codec contract changed.");
258
- }
259
- isolated = isolated
260
- .replace("async evaluate(__dispatchers = {}, __connectors = {}) {", `async evaluate(__dispatchers = {}, __connectors = {}, ${programName}) {\n${wrapper}`)
261
- .replaceAll("JSON.parse(", "jsonParse(")
262
- .replaceAll("JSON.stringify(", "jsonStringify(")
263
- .replaceAll(binaryTagCheck, "hasOwn(value, __CODEMODE_BINARY_TAG)")
264
- .replaceAll(binaryDataCheck, '!hasOwn(value, "data") || typeof value.data !== "string"')
265
- .replaceAll("console.", "nativeConsole.")
266
- .replaceAll("new Proxy(", "new NativeProxy(")
267
- .replaceAll("Object.prototype.hasOwnProperty.call(target, toolName)", "hasOwn(target, toolName)")
268
- .replaceAll("String(toolName)", "toString(toolName)")
269
- .replaceAll('a.map(String).join(" ")', 'join(map(a, toString), " ")')
270
- .replaceAll("__logs.push(", "push(__logs, ")
271
- .replaceAll("String.fromCharCode(", "fromCharCode(")
272
- .replaceAll("bytes.subarray(i, Math.min(i + chunkSize, bytes.byteLength))", "subarray(bytes, i, min(i + chunkSize, bytes.byteLength))")
273
- .replaceAll("btoa(binary)", "nativeBtoa(binary)")
274
- .replaceAll("atob(b64)", "nativeAtob(b64)")
275
- .replaceAll("new Uint8Array(", "new NativeUint8Array(")
276
- .replaceAll("instanceof Uint8Array", "instanceof NativeUint8Array")
277
- .replaceAll("instanceof ArrayBuffer", "instanceof NativeArrayBuffer")
278
- .replaceAll("ArrayBuffer.isView(", "isView(")
279
- .replaceAll("binary.charCodeAt(i)", "charCodeAt(binary, i)")
280
- .replaceAll("bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)", "bufferSlice(bytes.buffer, bytes.byteOffset, bytes.byteOffset + bytes.byteLength)")
281
- .replaceAll("Promise.race(", "race(")
282
- .replaceAll("new Promise(", "new NativePromise(");
283
- // Recompute the insertion point after changing the generated runner.
284
- const setup = firstInitializer
285
- ? isolated.indexOf(firstInitializer)
286
- : isolated.indexOf(" try {\n const result = await race");
287
- if (setup < 0)
288
- throw new Error("Worker provider setup was unavailable.");
289
- const runner = hardening +
290
- (captureGuest
291
- ? `const __connecta_guest_initialize = ${guestInitializer()};\n`
292
- : `${guestPromiseInitializer()};\n`) +
293
- captures +
294
- "let initialized = false;\n" +
295
- initializer +
296
- isolated.slice(0, setup) +
297
- globals +
298
- "\n" +
299
- isolated.slice(setup);
300
- const main = imports +
301
- `export default class CodeExecutor extends Runner {
238
+ const binaryTagCheck = "(__CODEMODE_BINARY_TAG in value)";
239
+ const binaryDataCheck = 'typeof value.data !== "string"';
240
+ if (!isolated.includes(binaryTagCheck) || !isolated.includes(binaryDataCheck)) {
241
+ throw new Error("Worker binary codec contract changed.");
242
+ }
243
+ isolated = isolated
244
+ .replace("async evaluate(__dispatchers = {}, __connectors = {}) {", `async evaluate(__dispatchers = {}, __connectors = {}, ${programName}) {\n${wrapper}`)
245
+ .replaceAll("JSON.parse(", "jsonParse(")
246
+ .replaceAll("JSON.stringify(", "jsonStringify(")
247
+ .replaceAll(binaryTagCheck, "hasOwn(value, __CODEMODE_BINARY_TAG)")
248
+ .replaceAll(binaryDataCheck, '!hasOwn(value, "data") || typeof value.data !== "string"')
249
+ .replaceAll("console.", "nativeConsole.")
250
+ .replaceAll("new Proxy(", "new NativeProxy(")
251
+ .replaceAll("Object.prototype.hasOwnProperty.call(target, toolName)", "hasOwn(target, toolName)")
252
+ .replaceAll("String(toolName)", "toString(toolName)")
253
+ .replaceAll('a.map(String).join(" ")', 'join(map(a, toString), " ")')
254
+ .replaceAll("__logs.push(", "push(__logs, ")
255
+ .replaceAll("String.fromCharCode(", "fromCharCode(")
256
+ .replaceAll("bytes.subarray(i, Math.min(i + chunkSize, bytes.byteLength))", "subarray(bytes, i, min(i + chunkSize, bytes.byteLength))")
257
+ .replaceAll("btoa(binary)", "nativeBtoa(binary)")
258
+ .replaceAll("atob(b64)", "nativeAtob(b64)")
259
+ .replaceAll("new Uint8Array(", "new NativeUint8Array(")
260
+ .replaceAll("instanceof Uint8Array", "instanceof NativeUint8Array")
261
+ .replaceAll("instanceof ArrayBuffer", "instanceof NativeArrayBuffer")
262
+ .replaceAll("ArrayBuffer.isView(", "isView(")
263
+ .replaceAll("binary.charCodeAt(i)", "charCodeAt(binary, i)")
264
+ .replaceAll("bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)", "bufferSlice(bytes.buffer, bytes.byteOffset, bytes.byteOffset + bytes.byteLength)")
265
+ .replaceAll("Promise.race(", "race(")
266
+ .replaceAll("new Promise(", "new NativePromise(");
267
+ // Recompute the insertion point after changing the generated runner.
268
+ const setup = firstInitializer
269
+ ? isolated.indexOf(firstInitializer)
270
+ : isolated.indexOf(" try {\n const result = await race");
271
+ if (setup < 0)
272
+ throw new Error("Worker provider setup was unavailable.");
273
+ const runner = hardening +
274
+ (captureGuest
275
+ ? `const __connecta_guest_initialize = ${guestInitializer()};\n`
276
+ : `${guestPromiseInitializer()};\n`) +
277
+ captures +
278
+ "let initialized = false;\n" +
279
+ initializer +
280
+ isolated.slice(0, setup) +
281
+ globals +
282
+ "\n" +
283
+ isolated.slice(setup);
284
+ const main = imports +
285
+ `export default class CodeExecutor extends Runner {
302
286
  evaluate(dispatchers, connectors) { return super.evaluate(dispatchers, connectors, program); }
303
287
  }`;
304
- const routed = routeGuestImports(guest?.program ?? executableCode);
305
- return track(Reflect.apply(Reflect.get(target, key), target, [
288
+ const routed = routeGuestImports(guest?.program ?? executableCode);
289
+ const acquisition = {
290
+ load: () => Reflect.apply(Reflect.get(target, key), target, [
306
291
  {
307
292
  ...definition,
308
293
  modules: {
@@ -313,123 +298,158 @@ const {
313
298
  },
314
299
  },
315
300
  ...args.slice(1),
316
- ]));
301
+ ]),
302
+ args: undefined,
303
+ };
304
+ prepared = acquisition;
305
+ return {
306
+ getEntrypoint: () => ({
307
+ evaluate: (...evaluateArgs) => {
308
+ acquisition.args = evaluateArgs;
309
+ return Promise.resolve({ result: undefined });
310
+ },
311
+ }),
317
312
  };
318
- const value = Reflect.get(target, key);
319
- return typeof value === "function" ? (...args) => Reflect.apply(value, target, args) : value;
320
- },
321
- });
322
- const lease = {
323
- waitMs: permit.waitMs,
324
- async execute(code, providers) {
325
- if (released)
326
- throw new Error("Executor lease was already released.");
327
- if (executed)
328
- throw new Error("Executor lease may execute only once.");
329
- executed = true;
330
- hostProviders = providers;
331
- // Extract the fixed wrapper from the original source. Upstream may
332
- // wrap invalid syntax as a bare body; that must not turn an attempted
333
- // module escape into runnable statements or shift guest locations.
334
- guestProgram = isolateGuestProgram(code.trim());
335
- executableCode = normalizeCode(code);
336
- const original = executableCode.indexOf(code.trim());
337
- if (original >= 0)
338
- normalizationLines = executableCode.slice(0, original).split("\n").length - 1;
339
- const detached = providers.map((provider, index) => ({
340
- name: provider.name,
341
- ...(provider.prelude ? { prelude: provider.prelude } : {}),
342
- fns: Object.fromEntries(Object.keys(provider.fns).map((name) => [name, forward(index, name)])),
343
- }));
344
- const stopped = new Promise((_resolve, reject) => {
345
- cancel = () => reject(new ExecutorExecutionError("executor_cancelled", "Worker executor lease was released during execution."));
313
+ };
314
+ const value = Reflect.get(target, key);
315
+ return typeof value === "function" ? (...args) => Reflect.apply(value, target, args) : value;
316
+ },
317
+ });
318
+ const execute = (code, providers) => Effect.suspend(() => {
319
+ if (released)
320
+ return Effect.fail(new Error("Executor lease was already released."));
321
+ if (executed)
322
+ return Effect.fail(new Error("Executor lease may execute only once."));
323
+ executed = true;
324
+ return Effect.gen(function* () {
325
+ hostProviders = providers;
326
+ // Extract the fixed wrapper from the original source. Upstream may
327
+ // wrap invalid syntax as a bare body; that must not turn an attempted
328
+ // module escape into runnable statements or shift guest locations.
329
+ guestProgram = isolateGuestProgram(code.trim());
330
+ executableCode = normalizeCode(code);
331
+ const original = executableCode.indexOf(code.trim());
332
+ if (original >= 0)
333
+ normalizationLines = executableCode.slice(0, original).split("\n").length - 1;
334
+ const detached = providers.map((provider, index) => ({
335
+ name: provider.name,
336
+ ...(provider.prelude ? { prelude: provider.prelude } : {}),
337
+ fns: Object.fromEntries(Object.keys(provider.fns).map((name) => [name, forward(index, name)])),
338
+ }));
339
+ const started = Date.now();
340
+ const operation = Effect.gen(function* () {
341
+ const setup = yield* Effect.tryPromise({
342
+ try: () => new DynamicWorkerExecutor({
343
+ loader,
344
+ ...(options.timeout !== undefined ? { timeout: options.timeout } : {}),
345
+ }).execute(code, detached),
346
+ catch: (error) => error,
346
347
  });
347
- const started = Date.now();
348
- try {
349
- const result = await Promise.race([
350
- new DynamicWorkerExecutor({
351
- loader,
352
- ...(options.timeout !== undefined ? { timeout: options.timeout } : {}),
353
- }).execute(code, detached),
354
- stopped,
355
- ]);
356
- const outcome = rpcOutcome ?? result;
357
- if (outcome.failure) {
358
- const failure = { ...outcome.failure };
359
- const call = typeof failure.failureId === "string" ? hostFailures.get(failure.failureId) : undefined;
360
- // Neither an unknown id nor a guest/RPC-supplied call record
361
- // supplies typed host details. Strip the private id at the edge.
362
- delete failure.call;
363
- delete failure.failureId;
364
- outcome.failure = { ...failure, ...(call ? { call } : {}) };
365
- }
366
- if (outcome.failure?.timeout)
367
- outcome.failure.timeout.elapsedMs = Date.now() - started;
368
- return outcome;
369
- }
370
- catch (error) {
371
- const message = error instanceof Error ? error.message : "";
372
- // Worker Loader erases the native SyntaxError type at its RPC edge.
373
- // Match its startup diagnostic only; guest/downstream failures return normally.
374
- const syntax = /^Failed to start Worker:\nUncaught SyntaxError: ([^\n]*)\n\s+at connecta-guest\.js:(\d+):\d+$/.exec(message);
375
- if (error instanceof SyntaxError || syntax) {
376
- const location = error instanceof SyntaxError && "loc" in error ? error.loc : undefined;
377
- const line = syntax
378
- ? Math.max(1, Number(syntax[2]) - normalizationLines - 1)
379
- : location?.line !== undefined
380
- ? Math.max(1, location.line)
381
- : undefined;
382
- return {
383
- result: undefined,
384
- error: (syntax?.[1] ?? message) || "Invalid JavaScript program.",
385
- failure: { name: "SyntaxError", ...(line !== undefined ? { line } : {}) },
386
- };
387
- }
388
- throw error;
389
- }
390
- finally {
391
- runEnded = true;
392
- cancel = undefined;
393
- hostFailures.clear();
348
+ // Provider validation can return before the SDK reaches its loader.
349
+ if (!prepared)
350
+ return setup;
351
+ const load = prepared.load;
352
+ const args = prepared.args;
353
+ const open = () => Effect.suspend(() => released || resources.state._tag === "Closed"
354
+ ? Effect.fail(new ExecutorExecutionError("executor_cancelled", "Worker executor lease was released during execution."))
355
+ : Effect.void);
356
+ const evaluation = Effect.gen(function* () {
357
+ yield* open();
358
+ const worker = yield* Effect.acquireRelease(Effect.try({ try: load, catch: (error) => error }), dispose);
359
+ yield* open();
360
+ const entrypoint = yield* Effect.acquireRelease(Effect.try({
361
+ try: () => Reflect.apply(Reflect.get(worker, "getEntrypoint"), worker, []),
362
+ catch: (error) => error,
363
+ }), dispose);
364
+ yield* open();
365
+ return yield* Effect.tryPromise({
366
+ try: () => Reflect.apply(Reflect.get(entrypoint, "evaluate"), entrypoint, args ?? []),
367
+ catch: (error) => error,
368
+ });
369
+ }).pipe(Scope.provide(resources));
370
+ const result = yield* evaluation;
371
+ const outcome = result;
372
+ if (outcome.failure) {
373
+ const failure = { ...outcome.failure };
374
+ const call = typeof failure.failureId === "string" ? hostFailures.get(failure.failureId) : undefined;
375
+ // Neither an unknown id nor a guest/RPC-supplied call record
376
+ // supplies typed host details. Strip the private id at the edge.
377
+ delete failure.call;
378
+ delete failure.failureId;
379
+ outcome.failure = { ...failure, ...(call ? { call } : {}) };
394
380
  }
395
- },
396
- release() {
397
- if (released)
398
- return;
399
- released = true;
400
- hostProviders = undefined;
401
- hostFailures.clear();
402
- cancel?.();
403
- for (const dispose of disposers.reverse()) {
404
- try {
405
- dispose();
406
- }
407
- catch {
408
- /* Release every handle and the permit. */
409
- }
381
+ if (outcome.failure?.timeout)
382
+ outcome.failure.timeout.elapsedMs = Date.now() - started;
383
+ return outcome;
384
+ });
385
+ return yield* operation.pipe(Effect.catch((error) => {
386
+ const message = error instanceof Error ? error.message : "";
387
+ // Worker Loader erases the native SyntaxError type at its RPC edge.
388
+ // Match its startup diagnostic only; guest/downstream failures return normally.
389
+ const syntax = /^Failed to start Worker:\nUncaught SyntaxError: ([^\n]*)\n\s+at connecta-guest\.js:(\d+):\d+$/.exec(message);
390
+ if (error instanceof SyntaxError || syntax) {
391
+ const location = error instanceof SyntaxError && "loc" in error ? error.loc : undefined;
392
+ const line = syntax
393
+ ? Math.max(1, Number(syntax[2]) - normalizationLines - 1)
394
+ : location?.line !== undefined
395
+ ? Math.max(1, location.line)
396
+ : undefined;
397
+ return Effect.succeed({
398
+ result: undefined,
399
+ error: (syntax?.[1] ?? message) || "Invalid JavaScript program.",
400
+ failure: { name: "SyntaxError", ...(line !== undefined ? { line } : {}) },
401
+ });
410
402
  }
411
- disposers.length = 0;
412
- active.delete(lease);
413
- permit.release();
414
- },
415
- };
416
- active.add(lease);
417
- return lease;
418
- },
419
- async execute(code, providers) {
420
- const lease = await this.acquire();
421
- try {
422
- return await lease.execute(code, providers);
423
- }
424
- finally {
425
- lease.release();
426
- }
427
- },
403
+ return Effect.fail(error);
404
+ }));
405
+ }).pipe(Effect.raceFirst(Deferred.await(stopped)), Effect.catchDefect((error) => Effect.fail(error)), Effect.ensuring(Effect.sync(() => {
406
+ runEnded = true;
407
+ hostProviders = undefined;
408
+ prepared = undefined;
409
+ hostFailures.clear();
410
+ Deferred.doneUnsafe(stopped, Exit.fail(new ExecutorExecutionError("executor_cancelled", "The Worker run ended.")));
411
+ })), Effect.ensuring(Scope.close(resources, Exit.void)));
412
+ });
413
+ const lease = {
414
+ waitMs: permit.waitMs,
415
+ execute: (code, providers) => runEdge(execute(code, providers)),
416
+ release() {
417
+ if (released)
418
+ return;
419
+ released = true;
420
+ hostProviders = undefined;
421
+ prepared = undefined;
422
+ hostFailures.clear();
423
+ // Only synchronous SDK disposers inhabit this scope. They run before
424
+ // release returns, even if evaluate never settles or a disposer throws.
425
+ void detach(Scope.close(resources, Exit.void));
426
+ Deferred.doneUnsafe(stopped, Exit.fail(new ExecutorExecutionError("executor_cancelled", "Worker executor lease was released during execution.")));
427
+ active.delete(lease);
428
+ permit.release();
429
+ },
430
+ };
431
+ provideExecutorProgram(lease, execute);
432
+ active.add(lease);
433
+ return lease;
434
+ });
435
+ const acquireShell = (request) => runEdge(acquire(request));
436
+ const executor = {
437
+ name: "DynamicWorkerExecutor",
438
+ acquire: acquireShell,
439
+ execute: (code, providers) => runEdge(execute(code, providers)),
428
440
  admissionSnapshot: () => admission.snapshot(),
429
441
  close() {
430
442
  admission.close();
431
443
  for (const lease of active)
432
444
  lease.release();
433
445
  },
434
- }, "leased");
446
+ };
447
+ const execute = (code, providers) => Effect.scoped(Effect.gen(function* () {
448
+ const lease = yield* Effect.acquireRelease(Effect.suspend(() => executor.acquire !== acquireShell || admission.activeCount >= admission.concurrency
449
+ ? awaitExecutorLease((signal) => executor.acquire({ signal }))
450
+ : acquire()), (lease) => Effect.sync(() => lease.release()), { interruptible: true });
451
+ return yield* executorProgram(lease, code, providers);
452
+ }));
453
+ provideExecutorProgram(executor, execute);
454
+ return brandExecutor(executor, "leased");
435
455
  }