@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
@@ -1,12 +1,23 @@
1
+ import { Effect, Exit } from "effect";
2
+ import { registerConnectorVocabulary } from "../operation-vocabulary.js";
3
+ import { causeError, runEdge } from "../runtime/run.js";
4
+ import { credentialProbe } from "../runtime/credential-probe.js";
5
+ import { ContinuationBinding, serviceFor, setViewService, settleOnClose, duringViewEffect } from "../runtime/call.js";
6
+ import { registerCallEntry, toolEntry } from "../runtime/call-entry.js";
1
7
  import { ConnectorCallError, networkErrorCode, unavailableCallError, WithheldTextError } from "../errors.js";
2
8
  import { attachFailureFacts, carryFailureFacts, errorLabel } from "../operator-record.js";
3
- import { compileValidator, validateCatalogToolInput } from "../validate.js";
9
+ import { compileValidator, normalizeToolInput, validateCatalogToolInput } from "../validate.js";
4
10
  import { array, assertKnownOptions, instance, keys, optionsOf, strings } from "../config-schema.js";
5
11
  import { describedEndpoint, describedOrigin, describedTools } from "../described.js";
6
- import { CALL_ADMISSION, CREDENTIAL, USAGE_GUIDE } from "./option-shapes.js";
12
+ import { READ_ONLY, CALL_ADMISSION, CREDENTIAL, USAGE_GUIDE } from "./option-shapes.js";
7
13
  import { assertStaticToolNames } from "../tool-name.js";
8
14
  import { registerInvocationAuth } from "../invocation-auth.js";
9
15
  import { redactCatalog, redactSentSecrets, sentSecretsFetch, trackCredentialReads } from "../sent-secrets.js";
16
+ import { callClassification } from "../call-classification.js";
17
+ import { classifyTool } from "../tool-safety.js";
18
+ import { closeProviderCall, enterProviderBoundary, inLogicalCall, knownProviderFailure, nestedProviderRequests, providerBoundary, providerCallContext, providerFetch, providerRequests, tracksRequests, } from "../provider-call.js";
19
+ import { providerCallFailure, providerCallResult } from "../write-outcome.js";
20
+ import { deriveContext } from "../derived-context.js";
10
21
  export function defined(value) {
11
22
  return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
12
23
  }
@@ -41,6 +52,7 @@ function checkToolContract(id, tool) {
41
52
  /** The closed options api() accepts; see `assertKnownOptions`. */
42
53
  export const API_OPTIONS = optionsOf()({
43
54
  ...keys("title", "description", "authScope", "maxResultBytes", "testCredential", "testCredentials", "validateArgs"),
55
+ readOnly: READ_ONLY,
44
56
  callAdmission: CALL_ADMISSION,
45
57
  usageGuide: USAGE_GUIDE,
46
58
  credential: CREDENTIAL,
@@ -90,6 +102,8 @@ function describedApiAuth(opts) {
90
102
  */
91
103
  export function apiConnector(id, opts, oauth) {
92
104
  opts = assertKnownOptions(opts, `api(${JSON.stringify(id)})`, API_OPTIONS);
105
+ if (opts.readOnly !== undefined)
106
+ READ_ONLY.parse(opts.readOnly, `Connector(${JSON.stringify(id)}).readOnly`);
93
107
  if (opts.callAdmission !== undefined)
94
108
  CALL_ADMISSION.parse(opts.callAdmission, `api(${JSON.stringify(id)}).callAdmission`);
95
109
  assertStaticToolNames(opts.tools, `api(${JSON.stringify(id)}).tools`);
@@ -124,35 +138,67 @@ export function apiConnector(id, opts, oauth) {
124
138
  ...defined({
125
139
  description: opts.description,
126
140
  authScope: opts.authScope,
141
+ readOnly: opts.readOnly,
127
142
  maxResultBytes: opts.maxResultBytes,
128
143
  callAdmission: opts.callAdmission,
129
144
  usageGuide: opts.usageGuide,
130
145
  credential: opts.credential,
131
- testCredential: opts.testCredential,
132
- testCredentials: opts.testCredentials,
146
+ testCredential: opts.testCredential
147
+ ? (value, ctx) => credentialProbe(ctx, { value }, (view) => settleOnClose(view, () => opts.testCredential(value, view)))
148
+ : undefined,
149
+ testCredentials: opts.testCredentials
150
+ ? (values, ctx) => credentialProbe(ctx, values, (view) => settleOnClose(view, () => opts.testCredentials(values, view)))
151
+ : undefined,
133
152
  }),
134
153
  ...(oauth
135
154
  ? {
136
- status: oauth.status,
137
- startAuth: oauth.startAuth,
138
- disconnectAuth: oauth.disconnectAuth,
139
- verifyState: oauth.verifyState,
140
- verifyCallbackIssuer: oauth.verifyCallbackIssuer,
141
- consumeAuthError: oauth.consumeAuthError,
142
- finishAuth: oauth.finishAuth,
155
+ status: (ctx) => settleOnClose(ctx, () => oauth.status(ctx)),
156
+ startAuth: (ctx, options) => settleOnClose(ctx, () => oauth.startAuth(ctx, options)),
157
+ disconnectAuth: (ctx) => settleOnClose(ctx, () => oauth.disconnectAuth(ctx)),
158
+ // Callback work belongs to its request, including the route's
159
+ // uninterruptible exchange, rather than any resource call.
160
+ verifyState: (state, ctx) => settleOnClose(ctx, () => oauth.verifyState(state, ctx), true),
161
+ verifyCallbackIssuer: (issuer, ctx) => settleOnClose(ctx, () => oauth.verifyCallbackIssuer(issuer, ctx), true),
162
+ consumeAuthError: (ctx) => settleOnClose(ctx, () => oauth.consumeAuthError(ctx), true),
163
+ finishAuth: (code, ctx, callbackParams) => settleOnClose(ctx, () => oauth.finishAuth(code, ctx, callbackParams), true),
143
164
  }
144
165
  : {}),
145
166
  staticTools: defs,
146
167
  async listTools(ctx) {
147
- return redactCatalog(ctx, defs);
168
+ return settleOnClose(ctx, async () => redactCatalog(ctx, defs));
148
169
  },
149
- async callTool(name, args, ctx) {
150
- trackCredentialReads(ctx);
151
- const tool = byName.get(name);
152
- if (!tool) {
153
- throw new Error(`Unknown tool "${name}" on connector "${id}"`);
154
- }
155
- const input = args ?? {};
170
+ callTool: (name, args, ctx, options) => runEdge(core(name, args, ctx, options)),
171
+ };
172
+ const core = (name, args, ctx) => Effect.gen(function* () {
173
+ trackCredentialReads(ctx);
174
+ enterProviderBoundary(ctx, connector);
175
+ const tool = byName.get(name);
176
+ // Refusals before the handler runs are known failures: nothing was sent.
177
+ if (!tool) {
178
+ throw knownProviderFailure(new Error(`Unknown tool "${name}" on connector "${id}"`));
179
+ }
180
+ // `await` (not a bare promise return) so a handler that throws before
181
+ // its first await never sits handler-less for the thenable-adoption
182
+ // microtask — workerd and vitest both report that gap as an unhandled
183
+ // rejection even though the caller catches the failure.
184
+ // Derived, never mutated: the registry's context stays as it was, and
185
+ // the call state beside it (caller, admission permit, recovery facts,
186
+ // sent secrets) resolves through the handler's copy. The grant sends a
187
+ // write once: the registry's classification of this call decides, else
188
+ // the rule the registry would apply to the tool (INV-1).
189
+ const write = (callClassification(ctx) ?? classifyTool(tool)) === "write";
190
+ const callCtx = providerCallContext(ctx, providerRequests(ctx) ? classifyTool(tool) : write ? "write" : "read");
191
+ const handlerCtx = deriveContext(callCtx, {
192
+ fetch: providerFetch(callCtx, opts.title ?? id, false, sentSecretsFetch(ctx)),
193
+ ...(oauth ? { oauth: oauth.access(callCtx, { write }) } : {}),
194
+ });
195
+ setViewService(handlerCtx, ContinuationBinding, {
196
+ connection: serviceFor(ctx, ContinuationBinding)?.connection || id,
197
+ principal: serviceFor(ctx, ContinuationBinding)?.principal ?? null,
198
+ });
199
+ let handlerStarted = false;
200
+ const handled = yield* Effect.exit(Effect.gen(function* () {
201
+ const input = normalizeToolInput(args ?? {});
156
202
  if (validateArgs && tool.inputSchema) {
157
203
  const invalid = validateCatalogToolInput(tool.inputSchema, input, {
158
204
  address: `${id}.${name}`,
@@ -163,54 +209,98 @@ export function apiConnector(id, opts, oauth) {
163
209
  failClosed: true,
164
210
  }, { connector: id, tool });
165
211
  if (invalid)
166
- throw invalid;
212
+ throw knownProviderFailure(invalid);
167
213
  }
168
- // `await` (not a bare promise return) so a handler that throws before
169
- // its first await never sits handler-less for the thenable-adoption
170
- // microtask — workerd and vitest both report that gap as an unhandled
171
- // rejection even though the caller catches the failure.
172
- // Preserve the registry's context identity: private caller/provenance
173
- // markers belong to it, as does the grant its accessor reaches.
174
- const handlerCtx = Object.assign(ctx, {
175
- fetch: sentSecretsFetch(ctx),
176
- ...(oauth ? { oauth: oauth.access(ctx) } : {}),
177
- });
178
- try {
179
- return redactSentSecrets(ctx, await tool.handler(input, handlerCtx));
214
+ handlerStarted = true;
215
+ // The opaque handler may await a helper, swallow its rejection, or
216
+ // wait elsewhere. Its boundary remains call-owned; auxiliary helpers
217
+ // retain their separate request ownership. Ledger settlement below
218
+ // must see the close reason before this call's Promise rejects.
219
+ const native = toolEntry(tool);
220
+ return yield* native
221
+ ? duringViewEffect(callCtx, () => native(input, handlerCtx))
222
+ : Effect.tryPromise({
223
+ // Custom handlers retain their Promise revocation bridge and
224
+ // synchronous entry, including their helpers' fact ordering.
225
+ try: () => settleOnClose(callCtx, () => Promise.resolve(tool.handler(input, handlerCtx))),
226
+ catch: (error) => error,
227
+ });
228
+ }));
229
+ if (Exit.isFailure(handled)) {
230
+ const error = causeError(handled.cause, callCtx.signal);
231
+ // Settled before anything is decided or reported: a request that has
232
+ // not left by now (a sibling awaiting its credential) never will.
233
+ closeProviderCall(callCtx);
234
+ if (!handlerStarted) {
235
+ throw knownProviderFailure(error instanceof ConnectorCallError
236
+ ? error
237
+ : new ConnectorCallError("invalid_args", `Cannot validate arguments for "${id}.${name}": its inputSchema could not be evaluated`));
180
238
  }
181
- catch (error) {
182
- // The request's own abort reason, by identity, is the caller's.
183
- if (ctx.signal?.aborted === true && error === ctx.signal.reason)
239
+ // A handler owns its destinations. ctx.baseUrl is Connecta's inbound
240
+ // URL, so it must never masquerade as the failed downstream host.
241
+ const settle = (failure) => redactSentSecrets(ctx, providerCallFailure(handlerCtx, { title: opts.title ?? id }, failure, {
242
+ dispatched: true,
243
+ fallback: write ? "write" : "read",
244
+ finalize: true,
245
+ // Only a declared provider's ledger can see every request.
246
+ untracked: !tracksRequests(connector),
247
+ }));
248
+ // The request's own abort reason, by identity, is the caller's. The
249
+ // invocation reports it for its logical call; any other write's is
250
+ // settled like any other failure: it may have left.
251
+ if (ctx.signal?.aborted === true && error === ctx.signal.reason) {
252
+ if (!write || inLogicalCall(ctx))
184
253
  throw error;
185
- // A handler owns its destinations. ctx.baseUrl is Connecta's inbound
186
- // URL, so it must never masquerade as the failed downstream host.
187
- if (error instanceof ConnectorCallError)
188
- throw redactSentSecrets(ctx, error);
189
- if (!networkErrorCode(error)) {
190
- // Anything else is a runtime's, parser's, or stream's account of
191
- // what the handler read (a JSON parser quotes the reply it choked
192
- // on; a body stream rejects with whatever the runtime says), so it
193
- // is told in connecta's words, classified as the original would
194
- // have been, and rebuilt without its cause or nested errors. A
195
- // handler that means the agent to read its words throws a
196
- // ConnectorCallError. No host is named: connecta does not know
197
- // which destination the handler read.
198
- const kind = errorLabel(error);
199
- throw attachFailureFacts(carryFailureFacts(error, new WithheldTextError(`Connector "${id}" tool "${name}" handler failed` +
200
- `${kind ? ` (${kind})` : ""}. Its text is withheld because it ` +
201
- "can quote what the downstream sent.", error)), { step: "handler" });
202
- }
203
- throw unavailableCallError(error, undefined, undefined, ctx.signal);
254
+ throw settle(error);
204
255
  }
205
- },
206
- };
256
+ if (error instanceof ConnectorCallError)
257
+ throw settle(error);
258
+ if (!networkErrorCode(error)) {
259
+ // Anything else is a runtime's, parser's, or stream's account of
260
+ // what the handler read (a JSON parser quotes the reply it choked
261
+ // on; a body stream rejects with whatever the runtime says), so it
262
+ // is told in connecta's words, classified as the original would
263
+ // have been, and rebuilt without its cause or nested errors. A
264
+ // handler that means the agent to read its words throws a
265
+ // ConnectorCallError. No host is named: connecta does not know
266
+ // which destination the handler read.
267
+ const kind = errorLabel(error);
268
+ throw settle(attachFailureFacts(carryFailureFacts(error, new WithheldTextError(`Connector "${id}" tool "${name}" handler failed` +
269
+ `${kind ? ` (${kind})` : ""}. Its text is withheld because it ` +
270
+ "can quote what the downstream sent.", error)), { step: "handler" }));
271
+ }
272
+ // A handler is opaque: by the time its fetch failed it may already
273
+ // have sent the write, so no network code proves a write unsent.
274
+ const unreachable = unavailableCallError(error, undefined, undefined, ctx.signal);
275
+ // A raw handler with no tracked requests remains opaque, as before.
276
+ // Once guarded requests exist, its own or a nested api() boundary's,
277
+ // the ledgers supply the dispatch proof.
278
+ if (providerRequests(handlerCtx)?.length || nestedProviderRequests(handlerCtx).length)
279
+ throw settle(unreachable);
280
+ throw providerCallFailure(ctx, { title: opts.title ?? id }, unreachable, {
281
+ dispatched: true,
282
+ fallback: classifyTool(tool),
283
+ });
284
+ }
285
+ closeProviderCall(callCtx);
286
+ // A write an undeclared 401 left unknown fails however its handler returned.
287
+ const unknown = providerCallResult(handlerCtx, write ? "write" : "read");
288
+ if (unknown)
289
+ throw redactSentSecrets(ctx, unknown);
290
+ return redactSentSecrets(ctx, handled.value);
291
+ }).pipe(Effect.catchDefect((error) => Effect.fail(error)));
292
+ // This boundary's identity in a logical call, fixed now: this object with
293
+ // this function, never whatever the property or a copy holds by then.
294
+ providerBoundary(connector);
295
+ registerCallEntry(connector, core);
207
296
  if (oauth)
208
297
  registerInvocationAuth(connector, async (ctx) => {
209
298
  // The built-in static OAuth status only reads the stored grant. It never
210
299
  // refreshes, invokes a handler, or sends a downstream request.
211
- if ((await oauth.status(ctx)).state === "auth_required") {
300
+ if ((await settleOnClose(ctx, () => oauth.status(ctx))).state === "auth_required") {
212
301
  throw new ConnectorCallError("downstream_oauth_required", `Connector "${id}" requires authorization. Call authorize_connector.`);
213
302
  }
214
303
  });
304
+ registerConnectorVocabulary(connector, opts.tools);
215
305
  return connector;
216
306
  }
@@ -1,3 +1,5 @@
1
+ export { retryAfterMs } from "../http-policy.js";
2
+ import { type ProviderRequest } from "../provider-call.js";
1
3
  import type { ConnectorContext } from "../types.js";
2
4
  /** The methods a hand-written provider surface actually uses. */
3
5
  type GuardedMethod = "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE";
@@ -43,6 +45,18 @@ export interface GuardedRequest {
43
45
  * up front: the ceiling still bounds what is read, never what is sent.
44
46
  */
45
47
  prefixOnly?: boolean;
48
+ /** Trusted per-operation evidence (e.g. Breeze writes use GET); otherwise the tool's verdict applies. */
49
+ classification?: "read" | "write";
50
+ /** Provider-declared request that cannot perform the logical resource write. */
51
+ auxiliary?: boolean;
52
+ /**
53
+ * Replay proof for direct transport users: the genuine, legal idempotency
54
+ * key its vendor honors that this request carries (among `visibleHeaders`),
55
+ * set only then. An operation hint (a PUT, a content address) is never
56
+ * this proof. Never overrides a served write, and recorded on the logical
57
+ * call so key-reuse advice can name it (`keyProtectsCall`).
58
+ */
59
+ idempotencyKey?: string;
46
60
  }
47
61
  /**
48
62
  * One downstream response, read under the connector's byte ceiling.
@@ -84,8 +98,6 @@ interface GuardedResponse {
84
98
  truncated: boolean;
85
99
  }>;
86
100
  }
87
- /** Parse delta-seconds or an HTTP-date into a non-negative wait window. */
88
- export declare function retryAfterMs(headers: Headers): number | undefined;
89
101
  /**
90
102
  * Turn one response into the provider's own result, or throw the provider's
91
103
  * own typed failure. This is where status codes acquire meaning, and it is
@@ -95,9 +107,11 @@ type GuardedResponseMapper<T> = (response: GuardedResponse, ctx: ConnectorContex
95
107
  export interface GuardedFetchOptions {
96
108
  /**
97
109
  * Provider name as it appears in normalized failure prose — "Cloudflare",
98
- * "Notion". Used for messages only; it is never parsed.
110
+ * "Vercel". Used for messages only; it is never parsed.
99
111
  */
100
112
  provider: string;
113
+ /** Provider-declared auth/metadata work that cannot perform the logical write. */
114
+ auxiliary?: boolean;
101
115
  /**
102
116
  * Absolute base URL. Its origin and path prefix are the confinement: every
103
117
  * request resolves beneath it or is refused.
@@ -133,29 +147,49 @@ export interface GuardedFetchOptions {
133
147
  * authentication, so a refused request never resolves a credential.
134
148
  */
135
149
  admit?: (url: URL, request: GuardedRequest) => void;
150
+ /**
151
+ * Reviewed vendor evidence that the vendor authenticates a request before
152
+ * it acts on it. Without it, a write answered 401 has an unknown outcome:
153
+ * a server may act on a request before it rejects the credential. With it,
154
+ * a 401 that `matches` is that write's refusal. Declare it only where the
155
+ * vendor's documentation says so, cite that documentation in `evidence` and
156
+ * in the provider's evidence review, and keep `matches` narrow. Of the
157
+ * maintained providers only Stripe declares it. Checked at construction.
158
+ */
159
+ authBeforeExecution?: AuthBeforeExecution;
136
160
  }
137
- /** Sends one already-guarded request on behalf of one call's context. */
138
- type GuardedFetcher = (url: string, init: RequestInit, ctx: ConnectorContext) => Promise<Response>;
139
161
  /**
140
- * The transport half of a guarded connector that authenticates through its
141
- * own `api()` OAuth grant: no header of the helper's making, and every request
142
- * sent through `ctx.oauth.fetch`, which adds the calling owner's bearer token,
143
- * refuses any origin outside the grant's `apiOrigins`, and spends one
144
- * coordinated refresh and one replay on a 401 before answering
145
- * `auth_required`. Spread it into the options:
146
- * `guardedFetch({ provider, baseUrl, maxResponseBytes, ...oauthBearer(provider) })`.
147
- *
148
- * Confinement still happens here first, so a request reaches the grant only
149
- * once it is provably beneath `baseUrl`; the grant's origin check is the second
150
- * fence, not the only one.
162
+ * A trusted per-vendor review: types cannot verify what a vendor does, so the
163
+ * reviewer checks the cited documentation and the predicate against it.
151
164
  */
165
+ interface AuthBeforeExecution {
166
+ /** The vendor's documented guarantee: its URL and what it says. Never empty. */
167
+ evidence: string;
168
+ /**
169
+ * Whether this raw 401 is one the evidence covers, from its status and
170
+ * headers and the request's method and provider-relative path only: never a
171
+ * mapped code or prose.
172
+ */
173
+ matches: (answer: {
174
+ status: 401;
175
+ headers: Headers;
176
+ method: string;
177
+ path: string;
178
+ }) => boolean;
179
+ }
180
+ /** Sends one already-guarded request on behalf of one call's context. */
181
+ type GuardedFetcher = (url: string, init: RequestInit, ctx: ConnectorContext) => Promise<Response>;
152
182
  export declare function oauthBearer(provider: string): Pick<GuardedFetchOptions, "authenticate" | "fetch">;
153
183
  /** Send one guarded request and map its response with provider knowledge. */
154
184
  export type GuardedTransport = <T>(request: GuardedRequest, ctx: ConnectorContext, map: GuardedResponseMapper<T>) => Promise<T>;
185
+ /**
186
+ * Test-only legacy response lookup for renewal-provenance fixtures outside
187
+ * the kit. Production renewal uses the kit ledger. Undefined for other objects.
188
+ */
189
+ export declare function answeredRequest(response: object): ProviderRequest | undefined;
155
190
  /**
156
191
  * Build the transport a connector sends every request through. `maxResponseBytes`
157
192
  * is required rather than defaulted: what counts as an absurd response is a fact
158
193
  * about the API, not about HTTP.
159
194
  */
160
195
  export declare function guardedFetch(options: GuardedFetchOptions): GuardedTransport;
161
- export {};