@zackbart/connecta 0.34.0 → 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 (428) hide show
  1. package/CHANGELOG.md +393 -0
  2. package/README.md +62 -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 +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 +15 -7
  53. package/dist/connectors/api-connector.js +147 -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/option-shapes.js +1 -1
  58. package/dist/connectors/remote-mcp.d.ts +12 -30
  59. package/dist/connectors/remote-mcp.js +960 -564
  60. package/dist/d1.js +10 -243
  61. package/dist/derived-context.js +5 -0
  62. package/dist/describe-config.d.ts +5 -1
  63. package/dist/describe-config.js +3 -0
  64. package/dist/downstream-input.js +347 -260
  65. package/dist/errors.d.ts +87 -6
  66. package/dist/errors.js +114 -4
  67. package/dist/execute.js +87 -50
  68. package/dist/executor-admission.js +3 -0
  69. package/dist/executors/quickjs.js +163 -112
  70. package/dist/guarded-transport.js +50 -0
  71. package/dist/guest-runtime.js +1 -1
  72. package/dist/http/client.js +439 -0
  73. package/dist/http/errors.js +558 -0
  74. package/dist/http/fields.js +49 -0
  75. package/dist/http/hatch-paging.js +318 -0
  76. package/dist/http/hatch.js +1279 -0
  77. package/dist/http/json-schema.js +267 -0
  78. package/dist/http/node-transport.js +241 -0
  79. package/dist/http/oauth.js +162 -0
  80. package/dist/http/paging.js +228 -0
  81. package/dist/http/provider.js +221 -0
  82. package/dist/http/safety.js +82 -0
  83. package/dist/http/services.js +79 -0
  84. package/dist/http/tools.js +383 -0
  85. package/dist/http/vendor-index.js +138 -0
  86. package/dist/http/vendor.js +448 -0
  87. package/dist/http/write-request.js +66 -0
  88. package/dist/http-policy.d.ts +11 -0
  89. package/dist/http-policy.js +45 -0
  90. package/dist/inbound-credential.js +1 -1
  91. package/dist/index.d.ts +2 -2
  92. package/dist/index.js +4 -0
  93. package/dist/invocation-auth.js +30 -19
  94. package/dist/invocation.js +221 -87
  95. package/dist/mcp-result.js +0 -4
  96. package/dist/membership.d.ts +4 -0
  97. package/dist/meta-output.js +1 -1
  98. package/dist/meta-tools.js +534 -408
  99. package/dist/native-recovery.js +52 -0
  100. package/dist/native-tools.js +382 -0
  101. package/dist/node.d.ts +4 -3
  102. package/dist/node.js +45 -8
  103. package/dist/oauth-handoff.js +177 -104
  104. package/dist/oauth-partition.js +6 -20
  105. package/dist/oauth-sealing.js +6 -7
  106. package/dist/operation-vocabulary.js +101 -0
  107. package/dist/operator-record.d.ts +2 -2
  108. package/dist/operator-record.js +17 -4
  109. package/dist/operator-ui/agents.d.ts +5 -4
  110. package/dist/operator-ui/agents.js +17 -7
  111. package/dist/operator-ui/config-summary.js +8 -4
  112. package/dist/operator-ui/connection-map.js +9 -6
  113. package/dist/operator-ui/contract.d.ts +7 -3
  114. package/dist/operator-ui/endpoints.js +5 -14
  115. package/dist/operator-ui/fix-prompts.d.ts +1 -1
  116. package/dist/operator-ui/fix-prompts.js +0 -8
  117. package/dist/operator-ui/generated.js +3 -3
  118. package/dist/operator-ui/health.js +52 -0
  119. package/dist/operator-ui/model.d.ts +2 -3
  120. package/dist/operator-ui/overview.js +11 -19
  121. package/dist/operator-ui/setup-commands.js +0 -4
  122. package/dist/operator-ui/view.d.ts +5 -29
  123. package/dist/operator-ui/view.js +3 -59
  124. package/dist/program-writes.js +47 -26
  125. package/dist/provider-call-facts.d.ts +115 -0
  126. package/dist/provider-call-facts.js +182 -0
  127. package/dist/provider-call.d.ts +112 -0
  128. package/dist/provider-call.js +271 -0
  129. package/dist/provider.d.ts +71 -32
  130. package/dist/provider.js +134 -40
  131. package/dist/providers/_shared/google/hatch.js +91 -0
  132. package/dist/providers/_shared/google/kit.js +537 -0
  133. package/dist/providers/_shared/google/result-size.js +15 -2
  134. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  135. package/dist/providers/_shared/google/service-account.js +8 -4
  136. package/dist/providers/_shared/google/workspace.d.ts +8 -209
  137. package/dist/providers/_shared/google/workspace.js +7 -426
  138. package/dist/providers/_shared/rest/compact-index.js +86 -0
  139. package/dist/providers/_shared/rest/dispatch.js +3 -23
  140. package/dist/providers/_shared/rest/kit.js +546 -0
  141. package/dist/providers/_shared/rest/operation-index.js +230 -14
  142. package/dist/providers/_shared/rest/response-media.js +11 -0
  143. package/dist/providers/_shared/rest/tools.js +101 -78
  144. package/dist/providers/_shared/rest/value-safety.js +353 -195
  145. package/dist/providers/_shared/sensitive-fields.js +27 -0
  146. package/dist/providers/breeze/api.js +584 -0
  147. package/dist/providers/breeze/index.d.ts +3 -3
  148. package/dist/providers/breeze/index.js +67 -1420
  149. package/dist/providers/breeze/openapi.generated.js +60 -0
  150. package/dist/providers/breeze/skill.generated.js +2 -6
  151. package/dist/providers/breeze/tools.js +696 -0
  152. package/dist/providers/ccb/api.js +496 -0
  153. package/dist/providers/ccb/index.d.ts +17 -37
  154. package/dist/providers/ccb/index.js +77 -1702
  155. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  156. package/dist/providers/ccb/lib/constants.js +74 -0
  157. package/dist/providers/ccb/lib/guide.js +9 -0
  158. package/dist/providers/ccb/lib/verdicts.js +387 -0
  159. package/dist/providers/ccb/openapi.generated.js +397 -0
  160. package/dist/providers/ccb/safety.js +295 -0
  161. package/dist/providers/ccb/skill.generated.js +2 -6
  162. package/dist/providers/ccb/tools.js +853 -0
  163. package/dist/providers/cloudflare/api.js +1066 -0
  164. package/dist/providers/cloudflare/index.d.ts +7 -22
  165. package/dist/providers/cloudflare/index.js +80 -194
  166. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  167. package/dist/providers/cloudflare/lib/config.js +2 -0
  168. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  169. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  170. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  171. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  172. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  173. package/dist/providers/cloudflare/openapi.generated.js +3299 -3208
  174. package/dist/providers/cloudflare/{value-safety.js → safety.js} +538 -18
  175. package/dist/providers/cloudflare/skill.generated.js +2 -10
  176. package/dist/providers/cloudflare/tools.js +360 -0
  177. package/dist/providers/docs/api.js +51 -0
  178. package/dist/providers/docs/index.d.ts +1 -12
  179. package/dist/providers/docs/index.js +53 -1165
  180. package/dist/providers/docs/lib/constants.d.ts +18 -0
  181. package/dist/providers/docs/lib/constants.js +18 -0
  182. package/dist/providers/docs/lib/discovery.js +26 -0
  183. package/dist/providers/docs/lib/requests.js +48 -0
  184. package/dist/providers/docs/lib/schemas.js +168 -0
  185. package/dist/providers/docs/openapi.generated.js +16 -0
  186. package/dist/providers/docs/safety.js +54 -0
  187. package/dist/providers/docs/skill.generated.js +2 -6
  188. package/dist/providers/docs/tools.js +802 -0
  189. package/dist/providers/drive/api.js +177 -0
  190. package/dist/providers/drive/index.d.ts +1 -12
  191. package/dist/providers/drive/index.js +38 -1448
  192. package/dist/providers/drive/lib/constants.d.ts +6 -0
  193. package/dist/providers/drive/lib/constants.js +6 -0
  194. package/dist/providers/drive/lib/contracts.js +532 -0
  195. package/dist/providers/drive/lib/hatch.js +197 -0
  196. package/dist/providers/drive/openapi.generated.js +77 -0
  197. package/dist/providers/drive/safety.js +90 -0
  198. package/dist/providers/drive/skill.generated.js +2 -6
  199. package/dist/providers/drive/tools.js +1290 -0
  200. package/dist/providers/forms/api.js +71 -0
  201. package/dist/providers/forms/index.d.ts +1 -12
  202. package/dist/providers/forms/index.js +49 -1145
  203. package/dist/providers/forms/lib/constants.d.ts +14 -0
  204. package/dist/providers/forms/lib/constants.js +19 -0
  205. package/dist/providers/forms/lib/hatch.js +72 -0
  206. package/dist/providers/forms/openapi.generated.js +23 -0
  207. package/dist/providers/forms/safety.js +34 -0
  208. package/dist/providers/forms/skill.generated.js +2 -8
  209. package/dist/providers/forms/tools.js +1024 -0
  210. package/dist/providers/github/api.js +150 -0
  211. package/dist/providers/github/index.d.ts +4 -5
  212. package/dist/providers/github/index.js +30 -87
  213. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  214. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  215. package/dist/providers/github/lib/discovery.js +132 -0
  216. package/dist/providers/github/lib/operations.js +58 -0
  217. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  218. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  219. package/dist/providers/github/openapi.generated.js +1216 -0
  220. package/dist/providers/github/safety.js +216 -0
  221. package/dist/providers/github/skill.generated.js +2 -5
  222. package/dist/providers/github/tools.js +506 -0
  223. package/dist/providers/gmail/api.js +114 -0
  224. package/dist/providers/gmail/index.d.ts +1 -12
  225. package/dist/providers/gmail/index.js +73 -1621
  226. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  227. package/dist/providers/gmail/lib/constants.js +16 -0
  228. package/dist/providers/gmail/lib/index.js +173 -0
  229. package/dist/providers/gmail/lib/schemas.js +176 -0
  230. package/dist/providers/gmail/lib/threading.js +120 -0
  231. package/dist/providers/gmail/openapi.generated.js +92 -0
  232. package/dist/providers/gmail/safety.js +21 -0
  233. package/dist/providers/gmail/skill.generated.js +2 -6
  234. package/dist/providers/gmail/tools.js +1435 -0
  235. package/dist/providers/overflow/api.js +1008 -0
  236. package/dist/providers/overflow/index.d.ts +3 -17
  237. package/dist/providers/overflow/index.js +60 -1488
  238. package/dist/providers/overflow/skill.generated.js +2 -5
  239. package/dist/providers/overflow/tools.js +873 -0
  240. package/dist/providers/planning-center/api.js +467 -0
  241. package/dist/providers/planning-center/index.d.ts +6 -35
  242. package/dist/providers/planning-center/index.js +69 -2445
  243. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  244. package/dist/providers/planning-center/lib/constants.js +83 -0
  245. package/dist/providers/planning-center/lib/discovery.js +40 -0
  246. package/dist/providers/planning-center/lib/guide.js +39 -0
  247. package/dist/providers/planning-center/lib/json-api.js +83 -0
  248. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  249. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  250. package/dist/providers/planning-center/safety.js +188 -0
  251. package/dist/providers/planning-center/skill.generated.js +2 -27
  252. package/dist/providers/planning-center/tools.js +1010 -0
  253. package/dist/providers/sheets/api.js +133 -0
  254. package/dist/providers/sheets/index.d.ts +4 -16
  255. package/dist/providers/sheets/index.js +61 -1172
  256. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  257. package/dist/providers/sheets/lib/constants.js +14 -0
  258. package/dist/providers/sheets/lib/hatch.js +163 -0
  259. package/dist/providers/sheets/lib/requests.js +105 -0
  260. package/dist/providers/sheets/lib/schemas.js +138 -0
  261. package/dist/providers/sheets/openapi.generated.js +30 -0
  262. package/dist/providers/sheets/safety.js +27 -0
  263. package/dist/providers/sheets/skill.generated.js +2 -7
  264. package/dist/providers/sheets/tools.js +734 -0
  265. package/dist/providers/slides/api.js +147 -0
  266. package/dist/providers/slides/index.d.ts +2 -10
  267. package/dist/providers/slides/index.js +48 -2555
  268. package/dist/providers/slides/lib/constants.d.ts +11 -0
  269. package/dist/providers/slides/lib/constants.js +11 -0
  270. package/dist/providers/slides/lib/requests.js +60 -0
  271. package/dist/providers/slides/lib/schemas.js +565 -0
  272. package/dist/providers/slides/openapi.generated.js +18 -0
  273. package/dist/providers/slides/skill.generated.js +2 -6
  274. package/dist/providers/slides/tools.js +1968 -0
  275. package/dist/providers/stripe/api.js +401 -0
  276. package/dist/providers/stripe/index.d.ts +7 -27
  277. package/dist/providers/stripe/index.js +75 -191
  278. package/dist/providers/stripe/lib/config.d.ts +4 -0
  279. package/dist/providers/stripe/lib/config.js +2 -0
  280. package/dist/providers/stripe/openapi.generated.js +4 -3
  281. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  282. package/dist/providers/stripe/skill.generated.js +2 -10
  283. package/dist/providers/stripe/tools.js +77 -0
  284. package/dist/providers/tithely/api.js +531 -0
  285. package/dist/providers/tithely/index.d.ts +19 -0
  286. package/dist/providers/tithely/index.js +86 -965
  287. package/dist/providers/tithely/skill.generated.js +2 -5
  288. package/dist/providers/tithely/tools.js +426 -0
  289. package/dist/providers/vercel/api.js +551 -0
  290. package/dist/providers/vercel/index.d.ts +11 -25
  291. package/dist/providers/vercel/index.js +67 -261
  292. package/dist/providers/vercel/lib/config.d.ts +2 -0
  293. package/dist/providers/vercel/lib/config.js +2 -0
  294. package/dist/providers/vercel/lib/index.js +117 -0
  295. package/dist/providers/vercel/lib/logs.js +100 -0
  296. package/dist/providers/vercel/lib/pin.js +270 -0
  297. package/dist/providers/vercel/openapi.generated.js +398 -376
  298. package/dist/providers/vercel/{value-safety.js → safety.js} +261 -42
  299. package/dist/providers/vercel/skill.generated.js +2 -7
  300. package/dist/providers/vercel/tools.js +642 -0
  301. package/dist/redaction-identity.js +47 -0
  302. package/dist/redaction-marker.js +125 -0
  303. package/dist/registry.d.ts +30 -28
  304. package/dist/registry.js +446 -413
  305. package/dist/routes/access-tokens.js +1 -1
  306. package/dist/routes/actor-labels.js +1 -1
  307. package/dist/routes/connect.js +1 -1
  308. package/dist/routes/dispatch.js +103 -0
  309. package/dist/routes/mcp.js +170 -79
  310. package/dist/routes/oauth.js +3 -1
  311. package/dist/routes/operator.js +2 -2
  312. package/dist/routes/shared.d.ts +5 -4
  313. package/dist/routes/shared.js +244 -177
  314. package/dist/routes/skills.js +10 -8
  315. package/dist/routes/ui-config.js +27 -3
  316. package/dist/routes/ui-data.js +29 -22
  317. package/dist/routes/ui.js +1 -1
  318. package/dist/runtime/call-admission.js +0 -26
  319. package/dist/runtime/call-entry.js +30 -0
  320. package/dist/runtime/call.js +556 -0
  321. package/dist/runtime/connector-scope.js +7 -0
  322. package/dist/runtime/credential-probe.js +34 -0
  323. package/dist/runtime/executor.js +40 -0
  324. package/dist/runtime/native-storage.js +63 -0
  325. package/dist/runtime/registry.js +27 -0
  326. package/dist/runtime/request-scope.js +72 -0
  327. package/dist/runtime/run.js +15 -7
  328. package/dist/runtime/shared-read.js +34 -5
  329. package/dist/runtime/storage.js +34 -21
  330. package/dist/sent-secrets.d.ts +194 -37
  331. package/dist/sent-secrets.js +1743 -340
  332. package/dist/server.js +5 -56
  333. package/dist/skills.js +330 -224
  334. package/dist/sqlite.js +15 -14
  335. package/dist/storage/d1-copy.js +255 -0
  336. package/dist/storage/d1-driver.js +15 -0
  337. package/dist/storage/keys.js +28 -0
  338. package/dist/storage/sql-driver.js +88 -0
  339. package/dist/storage/sql-native.js +544 -0
  340. package/dist/storage/sql-schema.d.ts +6 -0
  341. package/dist/storage/sql-schema.js +15 -0
  342. package/dist/storage/sql.d.ts +14 -20
  343. package/dist/storage/sql.js +29 -535
  344. package/dist/timeout.js +0 -26
  345. package/dist/tool-safety.js +20 -10
  346. package/dist/types.d.ts +11 -99
  347. package/dist/upward.js +3 -0
  348. package/dist/usage-guide.js +3 -1
  349. package/dist/validate.d.ts +4 -2
  350. package/dist/validate.js +86 -9
  351. package/dist/version.d.ts +1 -1
  352. package/dist/version.js +1 -1
  353. package/dist/worker.js +312 -292
  354. package/dist/workspace-subject.js +5 -1
  355. package/dist/write-outcome.js +454 -34
  356. package/documentation/README.md +27 -7
  357. package/documentation/architecture.md +2550 -186
  358. package/documentation/auth.md +821 -98
  359. package/documentation/code-mode.md +56 -21
  360. package/documentation/deploying.md +164 -20
  361. package/documentation/hosted-mcp-migration.md +460 -0
  362. package/documentation/integrating.md +144 -105
  363. package/documentation/meta-tools.md +411 -34
  364. package/documentation/operating.md +28 -4
  365. package/documentation/operator-tests.md +11 -2
  366. package/documentation/operator-ui.md +103 -33
  367. package/documentation/provider-auth-migration.md +38 -63
  368. package/documentation/provider-migration-0.29.md +10 -5
  369. package/documentation/provider-migration-0.35.md +975 -0
  370. package/documentation/providers.md +965 -0
  371. package/examples/worker/AGENTS.md +23 -9
  372. package/examples/worker/README.md +254 -135
  373. package/examples/worker/alchemy.run.ts +116 -0
  374. package/examples/worker/gitignore +10 -0
  375. package/examples/worker/src/connecta.config.ts +23 -21
  376. package/examples/worker/wrangler.jsonc +14 -5
  377. package/guides/connecting-agents.md +157 -0
  378. package/guides/how-it-works.md +156 -0
  379. package/guides/safety-and-trust.md +153 -0
  380. package/package.json +27 -42
  381. package/templates/node/.env.example +3 -0
  382. package/templates/node/README.md +22 -2
  383. package/templates/node/docker-compose.yml +1 -0
  384. package/templates/node/package.json +3 -2
  385. package/templates/node/src/connecta.config.ts +8 -0
  386. package/dist/catalog-drift.d.ts +0 -134
  387. package/dist/catalog-drift.js +0 -493
  388. package/dist/providers/_shared/request-token.js +0 -83
  389. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  390. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  391. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  392. package/dist/providers/basecamp/index.d.ts +0 -43
  393. package/dist/providers/basecamp/index.js +0 -997
  394. package/dist/providers/basecamp/skill.generated.js +0 -9
  395. package/dist/providers/cloudflare/rest.d.ts +0 -37
  396. package/dist/providers/cloudflare/rest.js +0 -1078
  397. package/dist/providers/github/hosted.js +0 -218
  398. package/dist/providers/github/rest.js +0 -321
  399. package/dist/providers/infisical/index.d.ts +0 -7
  400. package/dist/providers/infisical/index.js +0 -713
  401. package/dist/providers/infisical/skill.generated.js +0 -8
  402. package/dist/providers/linear/index.d.ts +0 -55
  403. package/dist/providers/linear/index.js +0 -352
  404. package/dist/providers/linear/skill.generated.js +0 -8
  405. package/dist/providers/mixpanel/index.d.ts +0 -57
  406. package/dist/providers/mixpanel/index.js +0 -468
  407. package/dist/providers/mixpanel/operations.js +0 -20
  408. package/dist/providers/mixpanel/rest.js +0 -603
  409. package/dist/providers/mixpanel/skill.generated.js +0 -10
  410. package/dist/providers/mixpanel/value-safety.js +0 -16
  411. package/dist/providers/notion/index.d.ts +0 -65
  412. package/dist/providers/notion/index.js +0 -368
  413. package/dist/providers/notion/openapi.generated.js +0 -75
  414. package/dist/providers/notion/rest.d.ts +0 -24
  415. package/dist/providers/notion/rest.js +0 -1226
  416. package/dist/providers/notion/skill.generated.js +0 -11
  417. package/dist/providers/notion/value-safety.js +0 -56
  418. package/dist/providers/revenuecat/index.d.ts +0 -49
  419. package/dist/providers/revenuecat/index.js +0 -557
  420. package/dist/providers/revenuecat/skill.generated.js +0 -11
  421. package/dist/providers/stripe/rest.d.ts +0 -14
  422. package/dist/providers/stripe/rest.js +0 -402
  423. package/dist/providers/vercel/rest.d.ts +0 -20
  424. package/dist/providers/vercel/rest.js +0 -1020
  425. package/dist/providers/wispr-flow/index.d.ts +0 -14
  426. package/dist/providers/wispr-flow/index.js +0 -117
  427. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  428. /package/dist/providers/github/{key.js → lib/key.js} +0 -0
@@ -20,7 +20,9 @@ import { msg } from "../errors.js";
20
20
  import { InvocationFailure } from "../invocation.js";
21
21
  import { brandExecutor } from "../executor-contract.js";
22
22
  import { MAX_EXECUTE_LOG_CHARS } from "../executor-result.js";
23
- import { detach, fromSignal, runEdge } from "../runtime/run.js";
23
+ import { admit } from "../runtime/admission.js";
24
+ import { awaitExecutorLease, executorProgram, provideExecutorProgram } from "../runtime/executor.js";
25
+ import { detach, forkOwned, fromSignal, runEdge } from "../runtime/run.js";
24
26
  import { hostCallLabel, MAX_QUICKJS_IPC_BYTES, MAX_QUICKJS_RESULT_BYTES, QUICKJS_RESULT_CHUNK_CHARS, MAX_QUICKJS_HOST_RPC_BYTES, serializedBytes, stringifyBounded, } from "./quickjs-protocol.js";
25
27
  export { normalizeCode } from "./quickjs-runtime.js";
26
28
  const DEFAULT_TIMEOUT_MS = 30_000;
@@ -114,6 +116,7 @@ function terminate(child) {
114
116
  ]);
115
117
  });
116
118
  }
119
+ let providePoolProgram;
117
120
  class QuickJsChildPool {
118
121
  /** What `/health` and `connecta doctor` call this sandbox (#368). */
119
122
  name = "QuickJS";
@@ -147,66 +150,87 @@ class QuickJsChildPool {
147
150
  }));
148
151
  this.available = [...this.slots];
149
152
  }
150
- async acquire(options = {}) {
151
- const admission = await this.admission.acquire(options);
152
- const slot = this.available.shift();
153
- if (!slot) {
154
- admission.release();
155
- throw new Error("Executor admission invariant failed: no child slot.");
156
- }
157
- let released = false;
158
- let executed = false;
159
- return {
160
- waitMs: admission.waitMs,
161
- execute: async (code, providers) => {
153
+ acquire(options = {}) {
154
+ return runEdge(this.acquireProgram(options));
155
+ }
156
+ acquireProgram(options = {}) {
157
+ return Effect.gen({ self: this }, function* () {
158
+ const admission = yield* admit(this.admission, options);
159
+ const slot = this.available.shift();
160
+ if (!slot) {
161
+ admission.release();
162
+ return yield* Effect.fail(new Error("Executor admission invariant failed: no child slot."));
163
+ }
164
+ let released = false;
165
+ let executed = false;
166
+ const logs = [];
167
+ const stopped = Deferred.makeUnsafe();
168
+ const execute = (code, providers) => Effect.suspend(() => {
162
169
  if (released)
163
- throw new Error("Executor lease was already released.");
170
+ return Effect.fail(new Error("Executor lease was already released."));
164
171
  if (executed)
165
- throw new Error("Executor lease may execute only once.");
172
+ return Effect.fail(new Error("Executor lease may execute only once."));
166
173
  executed = true;
167
- return runEdge(this.run(slot, code, providers, options.signal));
168
- },
169
- release: () => {
170
- if (released)
171
- return;
172
- released = true;
173
- // A lease let go mid-run takes its child with it: the program is
174
- // abandoned, and the next lease must not inherit its leftovers.
175
- if (slot.active) {
176
- this.rejectActive(slot, new Error("Executor lease was released during execution."));
177
- this.recycle(slot);
178
- }
179
- this.available.push(slot);
180
- admission.release();
181
- },
182
- };
174
+ return Effect.raceFirst(this.run(slot, code, providers, options.signal, logs), Deferred.await(stopped));
175
+ });
176
+ const lease = {
177
+ waitMs: admission.waitMs,
178
+ execute: (code, providers) => runEdge(execute(code, providers)),
179
+ release: () => {
180
+ if (released)
181
+ return;
182
+ released = true;
183
+ // Revoke ownership before a successor can see the slot. A release
184
+ // during readiness/backoff also interrupts the old run, even though
185
+ // slot.active does not exist yet; the warm child may keep starting.
186
+ if (slot.active) {
187
+ this.rejectActive(slot, new Error("Executor lease was released during execution."));
188
+ this.recycle(slot);
189
+ }
190
+ Deferred.doneUnsafe(stopped, Exit.fail(new Error("Executor lease was released during execution.")));
191
+ this.available.push(slot);
192
+ admission.release();
193
+ },
194
+ };
195
+ provideExecutorProgram(lease, execute, () => logs);
196
+ return lease;
197
+ });
183
198
  }
184
199
  admissionSnapshot() {
185
200
  return this.admission.snapshot();
186
201
  }
187
- async execute(code, providers) {
188
- const lease = await this.acquire();
189
- try {
190
- return await lease.execute(code, providers);
191
- }
192
- finally {
193
- lease.release();
194
- }
202
+ execute(code, providers) {
203
+ return runEdge(this.executeProgram(code, providers));
195
204
  }
196
- async close() {
197
- if (this.closed)
198
- return;
199
- this.closed = true;
200
- this.admission.close();
201
- for (const slot of this.slots)
202
- this.stopSlot(slot);
203
- await Promise.allSettled(this.retiring);
205
+ executeProgram(code, providers) {
206
+ return Effect.scoped(Effect.gen({ self: this }, function* () {
207
+ const lease = yield* Effect.acquireRelease(Effect.suspend(() => this.acquire !== QuickJsChildPool.prototype.acquire ||
208
+ this.admission.activeCount >= this.admission.concurrency
209
+ ? awaitExecutorLease((signal) => this.acquire({ signal }))
210
+ : this.acquireProgram()), (lease) => Effect.sync(() => lease.release()), { interruptible: true });
211
+ return yield* executorProgram(lease, code, providers);
212
+ }));
213
+ }
214
+ close() {
215
+ return runEdge(Effect.gen({ self: this }, function* () {
216
+ if (this.closed)
217
+ return;
218
+ this.closed = true;
219
+ this.admission.close();
220
+ for (const slot of this.slots)
221
+ this.stopSlot(slot);
222
+ yield* Effect.forEach([...this.retiring], (finished) => Deferred.await(finished), { discard: true });
223
+ }));
224
+ }
225
+ static {
226
+ // Register each instance without publishing native methods or Effect types.
227
+ providePoolProgram = (pool) => provideExecutorProgram(pool, (code, providers) => pool.executeProgram(code, providers));
204
228
  }
205
229
  // One execution on a leased slot: a ready child, the run message, then the
206
230
  // outcome raced against the wall deadline and the caller's abort. Either of
207
231
  // those settles the outcome and recycles the child; the race's losers are
208
232
  // interrupted, which clears their timer and abort listener.
209
- run(slot, code, providers, signal) {
233
+ run(slot, code, providers, signal, logs = []) {
210
234
  return Effect.gen({ self: this }, function* () {
211
235
  if (signal?.aborted) {
212
236
  return yield* Effect.fail(cancelled("Execution was cancelled before it started."));
@@ -242,12 +266,13 @@ class QuickJsChildPool {
242
266
  child.channel?.ref();
243
267
  const active = {
244
268
  id,
245
- logs: [],
269
+ logs,
246
270
  logChars: 0,
247
271
  resultChunks: [],
248
272
  resultBytes: 0,
249
273
  providers: providerMap,
250
274
  outcome: Deferred.makeUnsafe(),
275
+ hosts: Scope.makeUnsafe(),
251
276
  };
252
277
  slot.active = active;
253
278
  try {
@@ -288,7 +313,12 @@ class QuickJsChildPool {
288
313
  if (signal) {
289
314
  contenders.push(fromSignal(signal).pipe(Effect.catch(() => endWith(cancelled("Execution was cancelled.")))));
290
315
  }
291
- return yield* Effect.raceAllFirst(contenders);
316
+ return yield* Effect.raceAllFirst(contenders).pipe(Effect.onInterrupt(() => Effect.sync(() => {
317
+ if (slot.active !== active)
318
+ return;
319
+ this.rejectActive(slot, new Error("Executor execution was interrupted."));
320
+ this.recycle(slot);
321
+ })));
292
322
  });
293
323
  }
294
324
  // A ready child on the slot: the warm one, or a new one once any crash
@@ -341,7 +371,7 @@ class QuickJsChildPool {
341
371
  "@zackbart/connecta/quickjs) when bundling the server."));
342
372
  }
343
373
  const scope = Scope.makeUnsafe();
344
- return Effect.acquireRelease(Effect.sync(() => this.forkChild(slot, scope, childPath, sourceMode)).pipe(Effect.tap((child) => Effect.forkIn(this.startupWatchdog(slot, child), scope))), terminate).pipe(Scope.provide(scope));
374
+ return Effect.acquireRelease(Effect.sync(() => this.forkChild(slot, scope, childPath, sourceMode)).pipe(Effect.tap((child) => forkOwned(this.startupWatchdog(slot, child), scope))), terminate).pipe(Scope.provide(scope));
345
375
  });
346
376
  }
347
377
  // Fails a child that never reports ready. It lives in the child's Scope,
@@ -375,7 +405,7 @@ class QuickJsChildPool {
375
405
  subprocess.stderr?.unref?.();
376
406
  slot.child = child;
377
407
  subprocess.on("message", (message) => {
378
- void this.onMessage(slot, child, message);
408
+ this.onMessage(slot, child, message);
379
409
  });
380
410
  subprocess.on("error", (error) => {
381
411
  if (slot.child !== child)
@@ -411,7 +441,7 @@ class QuickJsChildPool {
411
441
  subprocess.channel?.unref();
412
442
  return child;
413
443
  }
414
- async onMessage(slot, child, message) {
444
+ onMessage(slot, child, message) {
415
445
  // A compromised child is exactly the adversary this process boundary
416
446
  // contains, and this handler's rejection would crash the serving process.
417
447
  // Refuse malformed intake before touching any field.
@@ -455,7 +485,7 @@ class QuickJsChildPool {
455
485
  if (message.type === "host-call") {
456
486
  if (message.jobId !== active.id)
457
487
  return;
458
- await this.handleHostCall(slot, child.process, active, message);
488
+ void detach(forkOwned(this.handleHostCall(slot, child.process, active, message), active.hosts));
459
489
  return;
460
490
  }
461
491
  if ((message.type !== "result" && message.type !== "result-chunk") || message.jobId !== active.id)
@@ -499,66 +529,78 @@ class QuickJsChildPool {
499
529
  this.recycle(slot);
500
530
  }
501
531
  }
502
- async handleHostCall(slot, child, active, message) {
503
- let payloadJson;
504
- try {
505
- if (serializedBytes(message.payloadJson) > MAX_QUICKJS_HOST_RPC_BYTES) {
506
- // Refused before parsing, so there is no address to name here: parsing
507
- // an over-limit payload to improve its error message would spend the
508
- // work the limit exists to refuse.
509
- throw new RangeError("Host call arguments exceeded the IPC limit.");
532
+ handleHostCall(slot, child, active, message) {
533
+ return Effect.gen({ self: this }, function* () {
534
+ let payloadJson;
535
+ try {
536
+ if (serializedBytes(message.payloadJson) > MAX_QUICKJS_HOST_RPC_BYTES) {
537
+ // Refused before parsing, so there is no address to name here: parsing
538
+ // an over-limit payload to improve its error message would spend the
539
+ // work the limit exists to refuse.
540
+ throw new RangeError("Host call arguments exceeded the IPC limit.");
541
+ }
542
+ const payload = JSON.parse(message.payloadJson);
543
+ const provider = active.providers.get(payload.namespace);
544
+ const fn = provider && Object.hasOwn(provider.fns, payload.functionName)
545
+ ? provider.fns[payload.functionName]
546
+ : undefined;
547
+ if (!fn) {
548
+ throw new Error(`Unknown function ${payload.namespace}.${payload.functionName}`);
549
+ }
550
+ // The provider is an ordinary Promise leaf. Its host fiber belongs to
551
+ // this run and is interrupted when the child settles or is recycled.
552
+ const result = yield* Effect.result(Effect.tryPromise({ try: () => Promise.resolve(fn(...payload.args)), catch: (error) => error }));
553
+ if (result._tag === "Failure") {
554
+ payloadJson = errorPayload(result.failure);
555
+ }
556
+ else {
557
+ const value = result.success;
558
+ try {
559
+ payloadJson = stringifyBounded({ ok: true, value }, `Host result from ${hostCallLabel(payload)}`, MAX_QUICKJS_HOST_RPC_BYTES);
560
+ }
561
+ catch (err) {
562
+ // The guest reads this text, so it names the address the program called
563
+ // rather than only the generic connecta.call bridge function.
564
+ const label = hostCallLabel(payload);
565
+ const detail = err instanceof RangeError
566
+ ? `Host result from ${label} exceeds the ${MAX_QUICKJS_HOST_RPC_BYTES}-byte serialized bridge limit.`
567
+ : `Host result from ${label} could not be serialized: ${msg(err)}`;
568
+ payloadJson = errorPayload(detail);
569
+ }
570
+ }
571
+ }
572
+ catch (err) {
573
+ payloadJson = errorPayload(err);
574
+ }
575
+ if (!child.connected || slot.active !== active)
576
+ return;
577
+ const response = {
578
+ type: "host-result",
579
+ jobId: message.jobId,
580
+ callId: message.callId,
581
+ payloadJson,
582
+ };
583
+ try {
584
+ stringifyBounded(response, "QuickJS host-result IPC envelope");
510
585
  }
511
- const payload = JSON.parse(message.payloadJson);
512
- const provider = active.providers.get(payload.namespace);
513
- const fn = provider && Object.hasOwn(provider.fns, payload.functionName) ? provider.fns[payload.functionName] : undefined;
514
- if (!fn) {
515
- throw new Error(`Unknown function ${payload.namespace}.${payload.functionName}`);
586
+ catch {
587
+ // L6/X10: settle the rejected call even if the outer encoding overflows.
588
+ response.payloadJson = errorPayload(`QuickJS host-result IPC envelope could not be serialized within the ${MAX_QUICKJS_IPC_BYTES}-byte IPC limit.`);
516
589
  }
517
- const value = await fn(...payload.args);
590
+ const failedSend = (error) => {
591
+ if (!error || slot.active !== active)
592
+ return;
593
+ this.rejectActive(slot, error);
594
+ this.recycle(slot);
595
+ };
518
596
  try {
519
- payloadJson = stringifyBounded({ ok: true, value }, `Host result from ${hostCallLabel(payload)}`, MAX_QUICKJS_HOST_RPC_BYTES);
597
+ stringifyBounded(response, "QuickJS host-result IPC envelope");
598
+ child.send(response, failedSend);
520
599
  }
521
600
  catch (err) {
522
- // The guest reads this text, so it names the address the program called
523
- // rather than only the generic connecta.call bridge function.
524
- const label = hostCallLabel(payload);
525
- const detail = err instanceof RangeError
526
- ? `Host result from ${label} exceeds the ${MAX_QUICKJS_HOST_RPC_BYTES}-byte serialized bridge limit.`
527
- : `Host result from ${label} could not be serialized: ${msg(err)}`;
528
- payloadJson = errorPayload(detail);
601
+ failedSend(err instanceof Error ? err : new Error(msg(err)));
529
602
  }
530
- }
531
- catch (err) {
532
- payloadJson = errorPayload(err);
533
- }
534
- if (!child.connected || slot.active !== active)
535
- return;
536
- const response = {
537
- type: "host-result",
538
- jobId: message.jobId,
539
- callId: message.callId,
540
- payloadJson,
541
- };
542
- try {
543
- stringifyBounded(response, "QuickJS host-result IPC envelope");
544
- }
545
- catch {
546
- // L6/X10: settle the rejected call even if the outer encoding overflows.
547
- response.payloadJson = errorPayload(`QuickJS host-result IPC envelope could not be serialized within the ${MAX_QUICKJS_IPC_BYTES}-byte IPC limit.`);
548
- }
549
- const failedSend = (error) => {
550
- if (!error || slot.active !== active)
551
- return;
552
- this.rejectActive(slot, error);
553
- this.recycle(slot);
554
- };
555
- try {
556
- stringifyBounded(response, "QuickJS host-result IPC envelope");
557
- child.send(response, failedSend);
558
- }
559
- catch (err) {
560
- failedSend(err instanceof Error ? err : new Error(msg(err)));
561
- }
603
+ }).pipe(Effect.catchDefect(() => Effect.void));
562
604
  }
563
605
  resolveActive(slot, outcome) {
564
606
  const active = slot.active;
@@ -580,7 +622,11 @@ class QuickJsChildPool {
580
622
  Deferred.doneUnsafe(active.outcome, Exit.fail(error));
581
623
  }
582
624
  clearActive(slot) {
625
+ const active = slot.active;
583
626
  slot.active = undefined;
627
+ active?.providers.clear();
628
+ if (active)
629
+ void detach(Scope.close(active.hosts, Exit.void));
584
630
  slot.child?.process.unref();
585
631
  slot.child?.process.channel?.unref();
586
632
  }
@@ -617,9 +663,12 @@ class QuickJsChildPool {
617
663
  slot.child = undefined;
618
664
  if (!child.retired) {
619
665
  child.retired = true;
620
- const closing = detach(Scope.close(child.scope, Exit.void));
621
- this.retiring.add(closing);
622
- void closing.then(() => this.retiring.delete(closing));
666
+ const finished = Deferred.makeUnsafe();
667
+ this.retiring.add(finished);
668
+ void detach(Scope.close(child.scope, Exit.void).pipe(Effect.ensuring(Effect.sync(() => {
669
+ this.retiring.delete(finished);
670
+ Deferred.doneUnsafe(finished, Exit.void);
671
+ }))));
623
672
  }
624
673
  if (readyError)
625
674
  Deferred.doneUnsafe(child.ready, Exit.fail(readyError));
@@ -631,5 +680,7 @@ class QuickJsChildPool {
631
680
  * double-acquire deadlock at concurrency 1.
632
681
  */
633
682
  export function quickJsExecutor(options = {}) {
634
- return brandExecutor(new QuickJsChildPool(options), "leased");
683
+ const pool = new QuickJsChildPool(options);
684
+ providePoolProgram(pool);
685
+ return brandExecutor(pool, "leased");
635
686
  }
@@ -0,0 +1,50 @@
1
+ // The plain runtime slot keeps the HTTP kit and Node sender off the root
2
+ // and Worker graphs. /node installs its sender when listen() starts serving.
3
+ import { ConnectorCallError } from "./errors.js";
4
+ let owned;
5
+ /** Runtime configuration, never request data. Returns the previous slot for isolated fixtures. */
6
+ export function configureGuardedTransport(transport) {
7
+ const previous = owned;
8
+ owned = transport;
9
+ return previous;
10
+ }
11
+ export function guardedTransport(write) {
12
+ if (owned)
13
+ return owned;
14
+ const node = typeof globalThis.WebSocketPair === "undefined" &&
15
+ typeof process !== "undefined" &&
16
+ process.versions?.node !== undefined;
17
+ if (node && write) {
18
+ throw new ConnectorCallError("connector_call_failed", "Guarded writes on Node require the owned transport: serve with listen from @zackbart/connecta/node.", { retryable: false });
19
+ }
20
+ // workerd supplies its native network implementation, with manual redirects.
21
+ // Node reads can use native fetch without claiming a single physical attempt.
22
+ return { send: (url, init) => globalThis.fetch(url, init) };
23
+ }
24
+ /** Legacy/fake senders dispatch immediately; the owned sender may first establish a tunnel. */
25
+ export function sendGuarded(transport, url, init, beforeDispatch) {
26
+ if (transport.delaysDispatch)
27
+ return transport.send(url, init, beforeDispatch);
28
+ beforeDispatch();
29
+ return transport.send(url, init);
30
+ }
31
+ /** SDK-authenticated token/registration/revocation POST, with no physical replay or redirect. */
32
+ export async function sendCredentialPost(input, init, beforeDispatch = () => { }) {
33
+ const transport = guardedTransport(true);
34
+ try {
35
+ if ((init.method ?? "GET").toUpperCase() !== "POST")
36
+ throw new Error("Expected credential POST.");
37
+ return await sendGuarded(transport, new URL(input), { ...init, redirect: "manual" }, beforeDispatch);
38
+ }
39
+ catch (error) {
40
+ if (init.signal?.aborted)
41
+ throw init.signal.reason;
42
+ if (error instanceof ConnectorCallError)
43
+ throw error;
44
+ // SDKs may log transport errors. No native exception/cause can quote a form,
45
+ // client secret, grant, request header or credential-bearing endpoint here.
46
+ throw new ConnectorCallError("connector_call_failed", "OAuth credential request did not return a confirmed response.", {
47
+ retryable: false,
48
+ });
49
+ }
50
+ }
@@ -224,7 +224,7 @@ export function programError(raw, code) {
224
224
  /(?:const|let|var|function|\()\s*connecta\b/.test(code)) {
225
225
  hint = "Do not shadow connecta. Use the host-provided connecta global.";
226
226
  }
227
- else if (/callTool|mixpanel|\bskills\b|connecta\.(?:guide|skills)/.test(message) ||
227
+ else if (/callTool|\bskills\b|connecta\.(?:guide|skills)/.test(message) ||
228
228
  (["TypeError", "ReferenceError"].includes(name) && /connecta\.(?:guide|skills)\b/.test(code))) {
229
229
  hint =
230
230
  "Use connecta.call(address, args), connecta.search, connecta.describe, connecta.result, and connecta.skill(name). Services are addressed by connector.tool, never guest globals.";