@zackbart/connecta 0.34.1 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/CHANGELOG.md +363 -0
  2. package/README.md +62 -106
  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 +2051 -1160
  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 +663 -271
  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 +12 -7
  53. package/dist/connectors/api-connector.js +142 -56
  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 +228 -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 +383 -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/agents.d.ts +5 -4
  109. package/dist/operator-ui/agents.js +17 -7
  110. package/dist/operator-ui/config-summary.js +5 -4
  111. package/dist/operator-ui/connection-map.js +7 -5
  112. package/dist/operator-ui/contract.d.ts +7 -3
  113. package/dist/operator-ui/endpoints.js +4 -13
  114. package/dist/operator-ui/fix-prompts.d.ts +1 -1
  115. package/dist/operator-ui/fix-prompts.js +0 -8
  116. package/dist/operator-ui/generated.js +3 -3
  117. package/dist/operator-ui/model.d.ts +2 -3
  118. package/dist/operator-ui/overview.js +5 -2
  119. package/dist/operator-ui/setup-commands.js +0 -4
  120. package/dist/operator-ui/view.d.ts +2 -25
  121. package/dist/operator-ui/view.js +2 -76
  122. package/dist/program-writes.js +47 -26
  123. package/dist/provider-call-facts.d.ts +115 -0
  124. package/dist/provider-call-facts.js +182 -0
  125. package/dist/provider-call.d.ts +112 -0
  126. package/dist/provider-call.js +271 -0
  127. package/dist/provider.d.ts +65 -31
  128. package/dist/provider.js +116 -39
  129. package/dist/providers/_shared/google/hatch.js +91 -0
  130. package/dist/providers/_shared/google/kit.js +537 -0
  131. package/dist/providers/_shared/google/result-size.js +15 -2
  132. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  133. package/dist/providers/_shared/google/service-account.js +8 -4
  134. package/dist/providers/_shared/google/workspace.d.ts +6 -210
  135. package/dist/providers/_shared/google/workspace.js +6 -425
  136. package/dist/providers/_shared/rest/compact-index.js +86 -0
  137. package/dist/providers/_shared/rest/dispatch.js +3 -23
  138. package/dist/providers/_shared/rest/kit.js +546 -0
  139. package/dist/providers/_shared/rest/operation-index.js +230 -14
  140. package/dist/providers/_shared/rest/response-media.js +11 -0
  141. package/dist/providers/_shared/rest/tools.js +101 -78
  142. package/dist/providers/_shared/rest/value-safety.js +353 -195
  143. package/dist/providers/_shared/sensitive-fields.js +27 -0
  144. package/dist/providers/breeze/api.js +584 -0
  145. package/dist/providers/breeze/index.d.ts +1 -3
  146. package/dist/providers/breeze/index.js +67 -1420
  147. package/dist/providers/breeze/openapi.generated.js +60 -0
  148. package/dist/providers/breeze/skill.generated.js +2 -6
  149. package/dist/providers/breeze/tools.js +696 -0
  150. package/dist/providers/ccb/api.js +496 -0
  151. package/dist/providers/ccb/index.d.ts +15 -37
  152. package/dist/providers/ccb/index.js +77 -1702
  153. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  154. package/dist/providers/ccb/lib/constants.js +74 -0
  155. package/dist/providers/ccb/lib/guide.js +9 -0
  156. package/dist/providers/ccb/lib/verdicts.js +387 -0
  157. package/dist/providers/ccb/openapi.generated.js +397 -0
  158. package/dist/providers/ccb/safety.js +295 -0
  159. package/dist/providers/ccb/skill.generated.js +2 -6
  160. package/dist/providers/ccb/tools.js +853 -0
  161. package/dist/providers/cloudflare/api.js +1066 -0
  162. package/dist/providers/cloudflare/index.d.ts +5 -22
  163. package/dist/providers/cloudflare/index.js +79 -197
  164. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  165. package/dist/providers/cloudflare/lib/config.js +2 -0
  166. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  167. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  168. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  169. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  170. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  171. package/dist/providers/cloudflare/openapi.generated.js +4 -3
  172. package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
  173. package/dist/providers/cloudflare/skill.generated.js +2 -10
  174. package/dist/providers/cloudflare/tools.js +360 -0
  175. package/dist/providers/docs/api.js +51 -0
  176. package/dist/providers/docs/index.d.ts +1 -12
  177. package/dist/providers/docs/index.js +53 -1165
  178. package/dist/providers/docs/lib/constants.d.ts +18 -0
  179. package/dist/providers/docs/lib/constants.js +18 -0
  180. package/dist/providers/docs/lib/discovery.js +26 -0
  181. package/dist/providers/docs/lib/requests.js +48 -0
  182. package/dist/providers/docs/lib/schemas.js +168 -0
  183. package/dist/providers/docs/openapi.generated.js +16 -0
  184. package/dist/providers/docs/safety.js +54 -0
  185. package/dist/providers/docs/skill.generated.js +2 -6
  186. package/dist/providers/docs/tools.js +802 -0
  187. package/dist/providers/drive/api.js +177 -0
  188. package/dist/providers/drive/index.d.ts +1 -12
  189. package/dist/providers/drive/index.js +38 -1448
  190. package/dist/providers/drive/lib/constants.d.ts +6 -0
  191. package/dist/providers/drive/lib/constants.js +6 -0
  192. package/dist/providers/drive/lib/contracts.js +532 -0
  193. package/dist/providers/drive/lib/hatch.js +197 -0
  194. package/dist/providers/drive/openapi.generated.js +77 -0
  195. package/dist/providers/drive/safety.js +90 -0
  196. package/dist/providers/drive/skill.generated.js +2 -6
  197. package/dist/providers/drive/tools.js +1290 -0
  198. package/dist/providers/forms/api.js +71 -0
  199. package/dist/providers/forms/index.d.ts +1 -12
  200. package/dist/providers/forms/index.js +49 -1145
  201. package/dist/providers/forms/lib/constants.d.ts +14 -0
  202. package/dist/providers/forms/lib/constants.js +19 -0
  203. package/dist/providers/forms/lib/hatch.js +72 -0
  204. package/dist/providers/forms/openapi.generated.js +23 -0
  205. package/dist/providers/forms/safety.js +34 -0
  206. package/dist/providers/forms/skill.generated.js +2 -8
  207. package/dist/providers/forms/tools.js +1024 -0
  208. package/dist/providers/github/api.js +150 -0
  209. package/dist/providers/github/index.d.ts +4 -5
  210. package/dist/providers/github/index.js +30 -87
  211. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  212. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  213. package/dist/providers/github/lib/discovery.js +132 -0
  214. package/dist/providers/github/lib/operations.js +58 -0
  215. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  216. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  217. package/dist/providers/github/openapi.generated.js +1216 -0
  218. package/dist/providers/github/safety.js +216 -0
  219. package/dist/providers/github/skill.generated.js +2 -5
  220. package/dist/providers/github/tools.js +506 -0
  221. package/dist/providers/gmail/api.js +114 -0
  222. package/dist/providers/gmail/index.d.ts +1 -12
  223. package/dist/providers/gmail/index.js +73 -1621
  224. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  225. package/dist/providers/gmail/lib/constants.js +16 -0
  226. package/dist/providers/gmail/lib/index.js +173 -0
  227. package/dist/providers/gmail/lib/schemas.js +176 -0
  228. package/dist/providers/gmail/lib/threading.js +120 -0
  229. package/dist/providers/gmail/openapi.generated.js +92 -0
  230. package/dist/providers/gmail/safety.js +21 -0
  231. package/dist/providers/gmail/skill.generated.js +2 -6
  232. package/dist/providers/gmail/tools.js +1435 -0
  233. package/dist/providers/overflow/api.js +1008 -0
  234. package/dist/providers/overflow/index.d.ts +1 -17
  235. package/dist/providers/overflow/index.js +60 -1488
  236. package/dist/providers/overflow/skill.generated.js +2 -5
  237. package/dist/providers/overflow/tools.js +873 -0
  238. package/dist/providers/planning-center/api.js +467 -0
  239. package/dist/providers/planning-center/index.d.ts +4 -35
  240. package/dist/providers/planning-center/index.js +69 -2445
  241. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  242. package/dist/providers/planning-center/lib/constants.js +83 -0
  243. package/dist/providers/planning-center/lib/discovery.js +40 -0
  244. package/dist/providers/planning-center/lib/guide.js +39 -0
  245. package/dist/providers/planning-center/lib/json-api.js +83 -0
  246. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  247. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  248. package/dist/providers/planning-center/safety.js +188 -0
  249. package/dist/providers/planning-center/skill.generated.js +2 -27
  250. package/dist/providers/planning-center/tools.js +1010 -0
  251. package/dist/providers/sheets/api.js +133 -0
  252. package/dist/providers/sheets/index.d.ts +4 -16
  253. package/dist/providers/sheets/index.js +61 -1172
  254. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  255. package/dist/providers/sheets/lib/constants.js +14 -0
  256. package/dist/providers/sheets/lib/hatch.js +163 -0
  257. package/dist/providers/sheets/lib/requests.js +105 -0
  258. package/dist/providers/sheets/lib/schemas.js +138 -0
  259. package/dist/providers/sheets/openapi.generated.js +30 -0
  260. package/dist/providers/sheets/safety.js +27 -0
  261. package/dist/providers/sheets/skill.generated.js +2 -7
  262. package/dist/providers/sheets/tools.js +734 -0
  263. package/dist/providers/slides/api.js +147 -0
  264. package/dist/providers/slides/index.d.ts +2 -10
  265. package/dist/providers/slides/index.js +48 -2555
  266. package/dist/providers/slides/lib/constants.d.ts +11 -0
  267. package/dist/providers/slides/lib/constants.js +11 -0
  268. package/dist/providers/slides/lib/requests.js +60 -0
  269. package/dist/providers/slides/lib/schemas.js +565 -0
  270. package/dist/providers/slides/openapi.generated.js +18 -0
  271. package/dist/providers/slides/skill.generated.js +2 -6
  272. package/dist/providers/slides/tools.js +1968 -0
  273. package/dist/providers/stripe/api.js +401 -0
  274. package/dist/providers/stripe/index.d.ts +5 -27
  275. package/dist/providers/stripe/index.js +74 -210
  276. package/dist/providers/stripe/lib/config.d.ts +4 -0
  277. package/dist/providers/stripe/lib/config.js +2 -0
  278. package/dist/providers/stripe/openapi.generated.js +4 -3
  279. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  280. package/dist/providers/stripe/skill.generated.js +2 -11
  281. package/dist/providers/stripe/tools.js +77 -0
  282. package/dist/providers/tithely/api.js +531 -0
  283. package/dist/providers/tithely/index.d.ts +17 -0
  284. package/dist/providers/tithely/index.js +86 -965
  285. package/dist/providers/tithely/skill.generated.js +2 -5
  286. package/dist/providers/tithely/tools.js +426 -0
  287. package/dist/providers/vercel/api.js +551 -0
  288. package/dist/providers/vercel/index.d.ts +9 -25
  289. package/dist/providers/vercel/index.js +66 -260
  290. package/dist/providers/vercel/lib/config.d.ts +2 -0
  291. package/dist/providers/vercel/lib/config.js +2 -0
  292. package/dist/providers/vercel/lib/index.js +117 -0
  293. package/dist/providers/vercel/lib/logs.js +100 -0
  294. package/dist/providers/vercel/lib/pin.js +270 -0
  295. package/dist/providers/vercel/openapi.generated.js +10 -5
  296. package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
  297. package/dist/providers/vercel/skill.generated.js +2 -7
  298. package/dist/providers/vercel/tools.js +642 -0
  299. package/dist/redaction-identity.js +47 -0
  300. package/dist/redaction-marker.js +125 -0
  301. package/dist/registry.d.ts +21 -15
  302. package/dist/registry.js +409 -376
  303. package/dist/routes/access-tokens.js +1 -1
  304. package/dist/routes/actor-labels.js +1 -1
  305. package/dist/routes/connect.js +1 -1
  306. package/dist/routes/dispatch.js +103 -0
  307. package/dist/routes/mcp.js +170 -79
  308. package/dist/routes/oauth.js +3 -1
  309. package/dist/routes/operator.js +2 -2
  310. package/dist/routes/shared.d.ts +5 -4
  311. package/dist/routes/shared.js +244 -177
  312. package/dist/routes/skills.js +10 -8
  313. package/dist/routes/ui-config.js +27 -3
  314. package/dist/routes/ui-data.js +21 -20
  315. package/dist/routes/ui.js +1 -1
  316. package/dist/runtime/call-admission.js +0 -26
  317. package/dist/runtime/call-entry.js +30 -0
  318. package/dist/runtime/call.js +556 -0
  319. package/dist/runtime/connector-scope.js +7 -0
  320. package/dist/runtime/credential-probe.js +34 -0
  321. package/dist/runtime/executor.js +40 -0
  322. package/dist/runtime/native-storage.js +63 -0
  323. package/dist/runtime/registry.js +27 -0
  324. package/dist/runtime/request-scope.js +72 -0
  325. package/dist/runtime/run.js +15 -7
  326. package/dist/runtime/shared-read.js +34 -5
  327. package/dist/runtime/storage.js +34 -21
  328. package/dist/sent-secrets.d.ts +194 -37
  329. package/dist/sent-secrets.js +1743 -340
  330. package/dist/server.js +5 -56
  331. package/dist/skills.js +322 -222
  332. package/dist/sqlite.js +15 -14
  333. package/dist/storage/d1-copy.js +255 -0
  334. package/dist/storage/d1-driver.js +15 -0
  335. package/dist/storage/keys.js +28 -0
  336. package/dist/storage/sql-driver.js +88 -0
  337. package/dist/storage/sql-native.js +544 -0
  338. package/dist/storage/sql-schema.d.ts +6 -0
  339. package/dist/storage/sql-schema.js +15 -0
  340. package/dist/storage/sql.d.ts +14 -20
  341. package/dist/storage/sql.js +29 -535
  342. package/dist/timeout.js +0 -26
  343. package/dist/tool-safety.js +20 -10
  344. package/dist/types.d.ts +7 -109
  345. package/dist/upward.js +3 -0
  346. package/dist/usage-guide.js +3 -1
  347. package/dist/validate.d.ts +4 -2
  348. package/dist/validate.js +86 -9
  349. package/dist/version.d.ts +1 -1
  350. package/dist/version.js +1 -1
  351. package/dist/worker.js +312 -292
  352. package/dist/workspace-subject.js +5 -1
  353. package/dist/write-outcome.js +454 -34
  354. package/documentation/README.md +27 -7
  355. package/documentation/architecture.md +2547 -226
  356. package/documentation/auth.md +821 -98
  357. package/documentation/code-mode.md +49 -16
  358. package/documentation/deploying.md +164 -20
  359. package/documentation/hosted-mcp-migration.md +460 -0
  360. package/documentation/integrating.md +129 -144
  361. package/documentation/meta-tools.md +409 -32
  362. package/documentation/operating.md +27 -3
  363. package/documentation/operator-tests.md +3 -0
  364. package/documentation/operator-ui.md +68 -45
  365. package/documentation/provider-auth-migration.md +16 -63
  366. package/documentation/provider-migration-0.29.md +10 -5
  367. package/documentation/provider-migration-0.35.md +975 -0
  368. package/documentation/providers.md +965 -0
  369. package/examples/worker/AGENTS.md +23 -9
  370. package/examples/worker/README.md +254 -135
  371. package/examples/worker/alchemy.run.ts +116 -0
  372. package/examples/worker/gitignore +10 -0
  373. package/examples/worker/src/connecta.config.ts +23 -21
  374. package/examples/worker/wrangler.jsonc +14 -5
  375. package/guides/connecting-agents.md +157 -0
  376. package/guides/how-it-works.md +156 -0
  377. package/guides/safety-and-trust.md +153 -0
  378. package/package.json +27 -46
  379. package/templates/node/.env.example +3 -0
  380. package/templates/node/README.md +22 -2
  381. package/templates/node/docker-compose.yml +1 -0
  382. package/templates/node/package.json +3 -2
  383. package/templates/node/src/connecta.config.ts +8 -0
  384. package/dist/catalog-drift.d.ts +0 -138
  385. package/dist/catalog-drift.js +0 -578
  386. package/dist/providers/_shared/request-token.js +0 -83
  387. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  388. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  389. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  390. package/dist/providers/basecamp/index.d.ts +0 -45
  391. package/dist/providers/basecamp/index.js +0 -997
  392. package/dist/providers/basecamp/skill.generated.js +0 -9
  393. package/dist/providers/cloudflare/rest.d.ts +0 -37
  394. package/dist/providers/cloudflare/rest.js +0 -1097
  395. package/dist/providers/github/hosted.js +0 -218
  396. package/dist/providers/github/rest.js +0 -321
  397. package/dist/providers/infisical/index.d.ts +0 -7
  398. package/dist/providers/infisical/index.js +0 -713
  399. package/dist/providers/infisical/skill.generated.js +0 -8
  400. package/dist/providers/intercom/index.d.ts +0 -24
  401. package/dist/providers/intercom/index.js +0 -121
  402. package/dist/providers/intercom/skill.generated.js +0 -8
  403. package/dist/providers/linear/index.d.ts +0 -55
  404. package/dist/providers/linear/index.js +0 -537
  405. package/dist/providers/linear/skill.generated.js +0 -8
  406. package/dist/providers/mixpanel/index.d.ts +0 -59
  407. package/dist/providers/mixpanel/index.js +0 -472
  408. package/dist/providers/mixpanel/operations.js +0 -20
  409. package/dist/providers/mixpanel/rest.js +0 -603
  410. package/dist/providers/mixpanel/skill.generated.js +0 -10
  411. package/dist/providers/mixpanel/value-safety.js +0 -16
  412. package/dist/providers/notion/index.d.ts +0 -67
  413. package/dist/providers/notion/index.js +0 -368
  414. package/dist/providers/notion/openapi.generated.js +0 -75
  415. package/dist/providers/notion/rest.d.ts +0 -24
  416. package/dist/providers/notion/rest.js +0 -1226
  417. package/dist/providers/notion/skill.generated.js +0 -11
  418. package/dist/providers/notion/value-safety.js +0 -56
  419. package/dist/providers/revenuecat/index.d.ts +0 -51
  420. package/dist/providers/revenuecat/index.js +0 -697
  421. package/dist/providers/revenuecat/skill.generated.js +0 -11
  422. package/dist/providers/stripe/rest.d.ts +0 -14
  423. package/dist/providers/stripe/rest.js +0 -402
  424. package/dist/providers/vercel/rest.d.ts +0 -20
  425. package/dist/providers/vercel/rest.js +0 -1020
  426. package/dist/providers/wispr-flow/index.d.ts +0 -14
  427. package/dist/providers/wispr-flow/index.js +0 -117
  428. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  429. /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
  }