@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
@@ -1,9 +1,6 @@
1
- import type { ConnectorCallAdmissionPolicy } from "../../types.js";
2
- import { type CloudflarePin } from "./rest.js";
3
- export { CLOUDFLARE_API_BASE } from "./rest.js";
4
- export type { CloudflarePin } from "./rest.js";
5
- /** Cloudflare's official whole-API hosted MCP endpoint. */
6
- export declare const CLOUDFLARE_MCP_ENDPOINT = "https://mcp.cloudflare.com/mcp";
1
+ import type { CloudflarePin } from "./lib/config.js";
2
+ export { CLOUDFLARE_API_BASE } from "./lib/config.js";
3
+ export type { CloudflarePin } from "./lib/config.js";
7
4
  interface CloudflareCommonOptions {
8
5
  /** Human-readable display name; defaults identify the implementation. */
9
6
  title?: string;
@@ -18,14 +15,6 @@ interface CloudflareCommonOptions {
18
15
  /** Serve only read-classified tools on every endpoint. Defaults to false. */
19
16
  readOnly?: boolean;
20
17
  }
21
- /** Cloudflare's hosted MCP server (`search` and `execute`) over OAuth. */
22
- export interface CloudflareOAuthOptions extends CloudflareCommonOptions {
23
- auth: {
24
- type: "oauth";
25
- };
26
- /** Optional per-runtime downstream call-admission policy. */
27
- callAdmission?: ConnectorCallAdmissionPolicy;
28
- }
29
18
  interface CloudflareKeyOptions extends CloudflareCommonOptions {
30
19
  /**
31
20
  * Default account id: fills `{account_id}` in paths and verifies an
@@ -64,12 +53,6 @@ export interface CloudflareGlobalApiKeyOptions extends CloudflareKeyOptions {
64
53
  /** Accept every account and zone the key's user can reach. */
65
54
  unpinned?: true;
66
55
  }
67
- export type CloudflareOptions = CloudflareOAuthOptions | CloudflareApiTokenOptions | CloudflareGlobalApiKeyOptions;
68
- /**
69
- * A maintained Cloudflare connection. `auth` selects the implementation:
70
- * OAuth reaches Cloudflare's hosted MCP server; an API token or a Global API
71
- * Key reaches Connecta's REST connector to the v4 API.
72
- */
56
+ export type CloudflareOptions = CloudflareApiTokenOptions | CloudflareGlobalApiKeyOptions;
57
+ /** Maintained API connection. Hosted MCP uses a separate generic remoteMcp entry. */
73
58
  export declare const cloudflare: import("../../provider.js").ProviderFactory<CloudflareOptions>;
74
- /** @deprecated Read `cloudflare.definition.classify` instead. Kept for existing imports. */
75
- export declare const CLOUDFLARE_MCP_VETTED_CATALOG: import("../../catalog-drift.js").VettedCatalog;
@@ -1,22 +1,11 @@
1
1
  import { skill } from "./skill.generated.js";
2
- /**
3
- * No official `cloudflare` SDK on purpose. Cloudflare's v4 API is
4
- * authenticated `fetch` over a uniform `{ success, errors, result,
5
- * result_info }` envelope, and the key connector validates every call against
6
- * a pinned operation index instead of typed wrappers, so Web APIs alone keep
7
- * this provider Workers-clean. `test/package-surface.node.test.ts` pins it: no
8
- * `cloudflare` package in any dependency field, every import relative.
9
- */
10
- import { apiConnector } from "../../connectors/api-connector.js";
11
- import { reviewedCatalog } from "../../catalog-drift.js";
12
2
  import { keys, optionsOf, variants } from "../../config-schema.js";
13
- import { CALL_ADMISSION, defineProvider } from "../../provider.js";
14
- import { byAuth, hostedOAuth } from "../_shared/rest/dispatch.js";
15
- import { restTools } from "../_shared/rest/tools.js";
16
- import { CLOUDFLARE_API_BASE, cloudflareRest } from "./rest.js";
17
- export { CLOUDFLARE_API_BASE } from "./rest.js";
18
- /** Cloudflare's official whole-API hosted MCP endpoint. */
19
- export const CLOUDFLARE_MCP_ENDPOINT = "https://mcp.cloudflare.com/mcp";
3
+ import { CALL_ADMISSION } from "../../provider.js";
4
+ import { defineApiProvider } from "../../http/provider.js";
5
+ import { CloudflareApi, authenticate, cloudflareErrors, cloudflareRuntime, MAX_RESPONSE_BYTES, READ_CAP_MS, safety, result, describeProbe, settings, cloudflareIndex, WRITE_STEPS, UPLOADS, } from "./api.js";
6
+ import { cloudflareTools } from "./tools.js";
7
+ import { CLOUDFLARE_VERDICTS, CLOUDFLARE_PAGES, CLOUDFLARE_HEADERS, cloudflareBinding } from "./lib/hatch.js";
8
+ export { CLOUDFLARE_API_BASE } from "./lib/config.js";
20
9
  /**
21
10
  * Cloudflare documents a global limit of 1,200 requests per five minutes per
22
11
  * user, counted cumulatively across the dashboard, API keys, and API tokens
@@ -61,75 +50,12 @@ const GLOBAL_API_KEY_CREDENTIAL = {
61
50
  },
62
51
  ],
63
52
  };
64
- /**
65
- * Reviewed in #705's provider audit against https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/.
66
- * Classifies the hosted OAuth catalog only; the REST connector annotates
67
- * each tool it authors.
68
- */
69
- const CLOUDFLARE_MCP_CLASSIFICATION = {
70
- tools: {
71
- docs: {
72
- verdict: "read",
73
- reason: "Searches Cloudflare documentation without executing API methods.",
74
- },
75
- search: {
76
- verdict: "read",
77
- reason: "Searches the Cloudflare OpenAPI contract without executing API methods.",
78
- },
79
- execute: {
80
- verdict: "destructive",
81
- reason: "Can mix HTTP methods across the Cloudflare API; no input schema proves a program only reads.",
82
- },
83
- },
84
- };
85
- function instructionsSection(instructions) {
86
- const text = instructions?.trim();
87
- return text ? `\n## ${skill.instructionsHeading}\n\n${text}\n` : "";
88
- }
89
- function oauthUsageGuide(purpose, instructions) {
90
- const { oauth, shared, oauth_tail } = skill.fragments;
91
- return `# Cloudflare usage
92
-
93
- Hosted MCP over OAuth: \`search\` and \`execute\`. Connector purpose: ${purpose}${oauth}${shared}${oauth_tail}${instructionsSection(instructions)}`;
94
- }
95
- function idList(ids) {
96
- return ids?.length ? ids.map((id) => `\`${id}\``).join(", ") : "none";
97
- }
98
- function keyUsageGuide(auth, options) {
99
- const { key, global_warning, shared, key_tail } = skill.fragments;
100
- const scheme = auth === "apiToken" ? "a scoped API token" : "a Global API Key";
101
- const pinned = options.pin
102
- ? [
103
- options.pin.accountIds?.length ? `accounts ${idList(options.pin.accountIds)} and every zone in them` : "",
104
- options.pin.zoneIds?.length ? `zones ${idList(options.pin.zoneIds)}` : "",
105
- ].filter(Boolean)
106
- : [];
107
- const pin = options.pin
108
- ? `\n\nPinned to ${pinned.join(", plus ")}. Calls naming any other account or zone are refused before they are sent, and so is every operation that names neither, except the credential's own user, the filtered account, zone, and membership lists, zone creation in a pinned account, and public data.`
109
- : auth === "globalApiKey"
110
- ? "\n\nUnpinned: this connector reaches every account and zone the key's user can."
111
- : "";
112
- const defaults = [
113
- options.accountId ? `\`{account_id}\` in a path fills with \`${options.accountId}\`` : "",
114
- options.zoneId ? `\`{zone_id}\` fills with \`${options.zoneId}\`` : "",
115
- ].filter(Boolean);
116
- const defaultLine = defaults.length
117
- ? `\n\nDefaults: ${defaults.join("; ")}. Pass another id in the path when the request names a different one.`
118
- : "";
119
- return `# Cloudflare usage
120
-
121
- REST with ${scheme}. Connector purpose: ${options.purpose}${auth === "globalApiKey" ? global_warning.trimEnd() : ""}${pin}${defaultLine}${key}${shared}${key_tail}${instructionsSection(options.instructions)}`;
122
- }
123
53
  const COMMON = keys("title", "authScope", "purpose", "instructions", "maxResultBytes", "readOnly");
124
54
  const KEY_COMMON = keys("accountId", "zoneId", "baseUrl", "maxConcurrency");
125
55
  const PIN = optionsOf()(keys("accountIds", "zoneIds"));
126
56
  /** The closed options cloudflare() accepts, selected by `auth.type`; see `assertKnownOptions`. */
127
57
  const CLOUDFLARE_OPTIONS = variants(["auth", "type"], {
128
- oauth: optionsOf()({
129
- ...COMMON,
130
- callAdmission: CALL_ADMISSION,
131
- auth: optionsOf()(keys("type")),
132
- }).shape,
58
+ oauth: { ...COMMON, callAdmission: CALL_ADMISSION, auth: optionsOf()(keys("type")) },
133
59
  apiToken: optionsOf()({
134
60
  ...COMMON,
135
61
  ...KEY_COMMON,
@@ -143,130 +69,86 @@ const CLOUDFLARE_OPTIONS = variants(["auth", "type"], {
143
69
  pin: PIN,
144
70
  auth: optionsOf()(keys("type")),
145
71
  }).shape,
146
- });
147
- function cloudflareOAuth(id, options, provider) {
148
- return hostedOAuth(id, provider, {
149
- url: CLOUDFLARE_MCP_ENDPOINT,
150
- title: options.title ?? "Cloudflare (MCP)",
151
- description: `Cloudflare's official whole-API MCP interface: ${options.purpose.trim()}`,
152
- ...(options.callAdmission !== undefined ? { callAdmission: options.callAdmission } : {}),
153
- usageGuide: {
154
- content: oauthUsageGuide(options.purpose.trim(), options.instructions),
155
- summary: "Hosted MCP over OAuth. Search the OpenAPI document; execute programs always classify as writes.",
156
- required: true,
157
- },
158
- });
159
- }
160
- function idsOf(id, value, path) {
161
- if (value === undefined)
162
- return undefined;
163
- if (!Array.isArray(value) ||
164
- value.length === 0 ||
165
- !value.every((item) => typeof item === "string" && item.trim() !== "")) {
166
- throw new Error(`cloudflare("${id}") ${path} must be a non-empty list of ids.`);
167
- }
168
- return value.map((item) => item.trim());
169
- }
170
- function optionalId(id, value, path) {
171
- if (value === undefined)
172
- return undefined;
173
- if (typeof value !== "string" || value.trim() === "" || /[/?#\s]/.test(value.trim())) {
174
- throw new Error(`cloudflare("${id}") ${path} must be a Cloudflare id.`);
175
- }
176
- return value.trim();
177
- }
178
- function cloudflareKey(auth) {
179
- return (id, options, provider) => {
180
- const maxConcurrency = options.maxConcurrency ?? 6;
181
- if (!Number.isInteger(maxConcurrency) || maxConcurrency < 1) {
182
- throw new Error(`cloudflare("${id}") maxConcurrency must be a positive integer.`);
183
- }
184
- let pin;
185
- if (options.pin !== undefined) {
186
- const accountIds = idsOf(id, options.pin.accountIds, "pin.accountIds");
187
- const zoneIds = idsOf(id, options.pin.zoneIds, "pin.zoneIds");
188
- if (!accountIds && !zoneIds)
189
- throw new Error(`cloudflare("${id}") pin names accountIds, zoneIds, or both.`);
190
- pin = {
191
- ...(accountIds ? { accountIds } : {}),
192
- ...(zoneIds ? { zoneIds } : {}),
193
- };
194
- }
195
- if (auth === "globalApiKey") {
196
- const unpinned = options.unpinned;
197
- if (unpinned !== undefined && unpinned !== true) {
198
- throw new Error(`cloudflare("${id}") unpinned must be true when set.`);
199
- }
200
- if (pin && unpinned)
201
- throw new Error(`cloudflare("${id}") takes pin or unpinned: true, not both.`);
202
- if (!pin && !unpinned) {
203
- throw new Error(`cloudflare("${id}") requires pin: { accountIds, zoneIds } with globalApiKey auth, or unpinned: true: a Global API Key reaches every account and zone its user can.`);
204
- }
205
- }
206
- const accountId = optionalId(id, options.accountId, "accountId");
207
- const zoneId = optionalId(id, options.zoneId, "zoneId");
208
- if (pin && accountId && pin.accountIds && !pin.accountIds.includes(accountId)) {
209
- throw new Error(`cloudflare("${id}") accountId ${accountId} is outside its pin.`);
210
- }
211
- if (pin && zoneId && pin.zoneIds && !pin.accountIds && !pin.zoneIds.includes(zoneId)) {
212
- throw new Error(`cloudflare("${id}") zoneId ${zoneId} is outside its pin.`);
213
- }
214
- const purpose = options.purpose.trim();
215
- const rest = cloudflareRest({
216
- auth,
217
- baseUrl: options.baseUrl?.trim() || CLOUDFLARE_API_BASE,
218
- accountId,
219
- zoneId,
220
- pin,
221
- });
222
- return apiConnector(id, {
223
- ...provider.connectorOptions,
224
- title: options.title ?? (auth === "globalApiKey" ? "Cloudflare (Global API Key)" : "Cloudflare"),
225
- description: `Cloudflare v4 API over REST (${auth === "globalApiKey" ? "Global API Key" : "API token"}${pin ? ", pinned" : ""}) — ${purpose}`,
226
- credential: auth === "globalApiKey" ? GLOBAL_API_KEY_CREDENTIAL : API_TOKEN_CREDENTIAL,
72
+ }, undefined, ["oauth"]);
73
+ function usageGuide(options) {
74
+ const { auth, accountId, zoneId, pin } = settings(options);
75
+ return {
76
+ heading: "Cloudflare usage",
77
+ summary: "Configured Cloudflare REST credential: resolve domain/account ids, then inspect DNS, Workers, R2, KV or analytics.",
78
+ context: [
79
+ `Connector purpose: ${options.purpose}`,
80
+ `This connection already has an operator-configured ${auth === "apiToken" ? "scoped API token" : "Global API Key"}; there is no sign-in step.`,
227
81
  ...(auth === "globalApiKey"
228
- ? { testCredentials: rest.testCredentials }
229
- : { testCredential: rest.testCredential }),
230
- callAdmission: admissionPolicy(maxConcurrency),
231
- usageGuide: {
232
- content: keyUsageGuide(auth, {
233
- purpose,
234
- ...(accountId ? { accountId } : {}),
235
- ...(zoneId ? { zoneId } : {}),
236
- ...(pin ? { pin } : {}),
237
- ...(options.instructions !== undefined ? { instructions: options.instructions } : {}),
238
- }),
239
- summary: auth === "globalApiKey"
240
- ? "GLOBAL API KEY: the user's whole estate, limited by pin. Search operations, read details, then read or write."
241
- : "Scoped API token over REST. Search operations, read details, then read or write; uploads and GraphQL are named tools.",
242
- },
243
- tools: [...restTools(rest.vendor), ...rest.tools],
244
- });
82
+ ? [
83
+ "A Global API Key acts as its user across the user's estate. R2 requires an API token; user-setting and membership writes are refused.",
84
+ ]
85
+ : []),
86
+ ...(pin
87
+ ? [
88
+ `Pin: account ids ${pin.accountIds?.join(", ") || "none"}; zone ids ${pin.zoneIds?.join(", ") || "none"}. A pinned account includes its zones. Calls outside this boundary are refused.`,
89
+ ]
90
+ : ["No additional deployment pin: the credential's vendor permissions define its reachable estate."]),
91
+ ...(accountId ? [`Default account id: ${accountId}.`] : []),
92
+ ...(zoneId ? [`Default zone id: ${zoneId}.`] : []),
93
+ ...(options.readOnly ? ["This connection is read-only: every write is refused."] : []),
94
+ ],
95
+ required: true,
245
96
  };
246
97
  }
247
- /**
248
- * A maintained Cloudflare connection. `auth` selects the implementation:
249
- * OAuth reaches Cloudflare's hosted MCP server; an API token or a Global API
250
- * Key reaches Connecta's REST connector to the v4 API.
251
- */
252
- export const cloudflare = defineProvider({
98
+ /** Maintained API connection. Hosted MCP uses a separate generic remoteMcp entry. */
99
+ export const cloudflare = defineApiProvider({
253
100
  name: "cloudflare",
254
101
  title: "Cloudflare",
255
- kind: "dual",
256
102
  readme: "Cloudflare",
257
103
  bundle: {
258
- baselineGzip: 334055,
259
- maxGzip: 394055,
260
- note: "./providers/cloudflare remeasures at 334,055 B gzip (#801), from 151,186 B on main: auth now selects the implementation, so the entry carries the hosted MCP client and Connecta's REST connector (api(), the schema validator, the shared REST module, about 22 KB gzip as in ./providers/stripe) plus the pinned Cloudflare operation index: 3,336 non-deprecated operations from a 27 MB document. The index was shrunk before the cap moved, from 157 KB to 125 KB gzip as source: request details to depth 2 without descriptions or enums over 50 values, no operation ids (they restate summaries), no plain-string path parameters (the template names them), and a 6,000-character per-operation budget that lowers one sprawling operation's depth. Depth 1 would save about 18 KB more at the cost of nested validation such as DNS record alternatives. Removing 23 hand-written reads offsets part of the growth; the reviewed value-safety table adds about 12 KB. The value-safety consolidation (#801) moved the spec-derived candidate record out of the index and grew the table by 259 verdicts, a net +3,646 B (337,701 B), inside the cap. The cap uses the existing baseline + 60,000 B policy.",
104
+ baselineGzip: 597127,
105
+ note: "./providers/cloudflare merged GitHub/Cloudflare/CCB step-2 snapshot measures 597,127 B gzip standalone before recording these bundle facts, versus 528,947 B on main ce0c7492 (Node 26.12.0, zlib-ng 1.3.1, gzip level 9). The standard hatch, response-field metadata, retained 120-character parameter descriptions and numeric bounds account for this reviewed growth. The shared Effect kit is paid once per deployment; provider entries are report-only, not capped (#899).",
261
106
  },
262
107
  skill,
263
108
  options: CLOUDFLARE_OPTIONS,
264
- classify: CLOUDFLARE_MCP_CLASSIFICATION,
265
- create: byAuth({
266
- oauth: cloudflareOAuth,
267
- apiToken: cloudflareKey("apiToken"),
268
- globalApiKey: cloudflareKey("globalApiKey"),
269
- }),
109
+ vendor: CloudflareApi,
110
+ baseUrl: (options) => settings(options).baseUrl,
111
+ displayTitle: (options) => (options.auth.type === "globalApiKey" ? "Cloudflare (Global API Key)" : "Cloudflare"),
112
+ description: (options) => `Cloudflare v4 API over REST (${options.auth.type === "globalApiKey" ? "Global API Key" : "API token"}${settings(options).pin ? ", pinned" : ""}) — ${options.purpose}`,
113
+ maxResponseBytes: MAX_RESPONSE_BYTES,
114
+ timeoutMs: READ_CAP_MS,
115
+ defaultCallAdmission: (options) => admissionPolicy(options.maxConcurrency ?? 6),
116
+ credential: (options) => (options.auth.type === "globalApiKey" ? GLOBAL_API_KEY_CREDENTIAL : API_TOKEN_CREDENTIAL),
117
+ authenticate,
118
+ errors: cloudflareErrors,
119
+ inBandRefusals: true,
120
+ idempotencyKey: false,
121
+ pageSize: { default: 20, max: 50 },
122
+ safety,
123
+ result,
124
+ probe: {
125
+ run: (connection, options) => cloudflareRuntime(connection, settings(options)).verify(),
126
+ describe: describeProbe,
127
+ },
128
+ guide: usageGuide,
129
+ hatch: {
130
+ name: "cloudflare",
131
+ title: "Cloudflare",
132
+ index: cloudflareIndex,
133
+ verdicts: CLOUDFLARE_VERDICTS,
134
+ named: {
135
+ ...Object.fromEntries(UPLOADS.map(([method, path]) => [`${method} ${path}`, "cloudflare_api_upload"])),
136
+ "GET /accounts": "list_accounts",
137
+ "GET /zones": "list_zones",
138
+ "GET /user/tokens/verify": "verify_credential",
139
+ },
140
+ fieldsRoot: "result",
141
+ pageCursor: "parameter",
142
+ headers: CLOUDFLARE_HEADERS,
143
+ textBodies: true,
144
+ writeSteps: WRITE_STEPS,
145
+ pages: CLOUDFLARE_PAGES,
146
+ binding: cloudflareBinding,
147
+ pathExample: "/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records",
148
+ notes: () => ({
149
+ read: 'DNS records, zones, Workers scripts, R2 buckets and objects, KV namespaces and keys are covered. Data retains the Cloudflare envelope; use fields:["result.id","result.name"]. Pass page.nextCursor in page.param within page.in, preserving the other arguments. Text/SQL reads take a string body.',
150
+ write: "Create, update or delete DNS records, purge cache URLs, deploy Workers and change KV/R2 state here. Reviewed uploads use cloudflare_api_upload; JSON, text/SQL and NDJSON writes retain their documented wire formats.",
151
+ }),
152
+ },
153
+ tools: cloudflareTools,
270
154
  });
271
- /** @deprecated Read `cloudflare.definition.classify` instead. Kept for existing imports. */
272
- export const CLOUDFLARE_MCP_VETTED_CATALOG = reviewedCatalog(cloudflare.definition.classify, 'defineProvider("cloudflare")');
@@ -0,0 +1,16 @@
1
+ /** Cloudflare's v4 REST base. Override only for a proxy or a test double. */
2
+ export declare const CLOUDFLARE_API_BASE = "https://api.cloudflare.com/client/v4";
3
+ /** The two key schemes Cloudflare's v4 API accepts. */
4
+ export type CloudflareKeyAuth = "apiToken" | "globalApiKey";
5
+ /** Accounts and zones a connector may touch; everything else is refused. */
6
+ export interface CloudflarePin {
7
+ accountIds?: readonly string[];
8
+ zoneIds?: readonly string[];
9
+ }
10
+ export interface CloudflareRestOptions {
11
+ auth: CloudflareKeyAuth;
12
+ baseUrl: string;
13
+ accountId: string | undefined;
14
+ zoneId: string | undefined;
15
+ pin: CloudflarePin | undefined;
16
+ }
@@ -0,0 +1,2 @@
1
+ /** Cloudflare's v4 REST base. Override only for a proxy or a test double. */
2
+ export const CLOUDFLARE_API_BASE = "https://api.cloudflare.com/client/v4";
@@ -0,0 +1,29 @@
1
+ // Reviewed workflow synonyms supplement, rather than replace, every pinned action/resource word.
2
+ const summaries = {
3
+ "GET /zones": "Find domains and zones by name or account",
4
+ "GET /zones/{zone_id}": "Get zone details and domain configuration",
5
+ "GET /accounts/{account_id}/r2/buckets": "List R2 buckets for an account",
6
+ "PATCH /zones/{zone_id}/dns_records/{dns_record_id}": "Update DNS record: set DNS TTL, content, name or proxy status",
7
+ "POST /zones/{zone_id}/purge_cache": "Clear cache for a file or URL: purge cache files, tags, hosts or prefixes",
8
+ "PUT /accounts/{account_id}/workers/scripts/{script_name}": "Deploy a Worker script: upload source and bindings",
9
+ "GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/keys": "List KV keys and expiration metadata by prefix",
10
+ };
11
+ export function cloudflareDiscovery(data) {
12
+ const tags = [...data.tags];
13
+ return {
14
+ ...data,
15
+ tags,
16
+ ops: data.ops.map(([method, path, id, summary, tag, server]) => {
17
+ const reviewed = summaries[`${method} ${path}`];
18
+ const combined = reviewed ? `${reviewed} (${summary})` : summary;
19
+ // The vendor calls deployment "upload"; keep that action and add the
20
+ // reviewed deployment category beside the original resource category.
21
+ const category = method === "PUT" && path === "/accounts/{account_id}/workers/scripts/{script_name}"
22
+ ? tags.push(`${data.tags[tag]} (Worker deploy)`) - 1
23
+ : tag;
24
+ return server === undefined
25
+ ? [method, path, id, combined, category]
26
+ : [method, path, id, combined, category, server];
27
+ }),
28
+ };
29
+ }
@@ -4,7 +4,7 @@
4
4
  // definitions are walked, so a `mutation` hidden in a string, a comment, or
5
5
  // after an anonymous query is still found, and anything that is not a query
6
6
  // or a fragment is refused. Nothing here does I/O.
7
- import { ConnectorCallError } from "../../errors.js";
7
+ import { ConnectorCallError } from "../../../errors.js";
8
8
  const SCOPED_FIELDS = new Set(["accounts", "zones"]);
9
9
  function refuse(message) {
10
10
  throw new ConnectorCallError("invalid_args", message);
@@ -0,0 +1,103 @@
1
+ // Cloudflare's reviewed standard hatch binding; the kit owns discovery and admission.
2
+ import { Effect } from "effect";
3
+ import { ConnectorCallError } from "../../../errors.js";
4
+ import { cloudflarePage } from "../../../http/hatch-paging.js";
5
+ import { cloudflareIndex, SAFETY, READ_POSTS, HEADERS, cloudflareRuntime, settings, record, invalid } from "../api.js";
6
+ import { withholdEmbeddedUrlsIn } from "../../_shared/rest/value-safety.js";
7
+ export const CLOUDFLARE_VERDICTS = Object.fromEntries(cloudflareIndex.ops.map((op) => [
8
+ `${op.method} ${op.path}`,
9
+ SAFETY.refusal(op.method, op.path) || op.server
10
+ ? "refuse"
11
+ : op.method === "GET" || READ_POSTS.some(([method, path]) => method === op.method && path === op.path)
12
+ ? "read"
13
+ : "destructive",
14
+ ]));
15
+ const badPage = (message) => {
16
+ throw new ConnectorCallError("connector_call_failed", message, { retryable: false });
17
+ };
18
+ const tokenPage = (param) => ({
19
+ param,
20
+ in: "query",
21
+ cursorInputMessage: `Pass page.nextCursor as cursor in query.${param}; do not send the vendor raw cursor.`,
22
+ decode: (value) => typeof value === "string" && value ? value : invalid("This paging cursor contains no valid Cloudflare token."),
23
+ next(data) {
24
+ const info = record(record(data)["result_info"]);
25
+ const value = info["cursor"] ?? record(info["cursors"])["after"];
26
+ if (value === undefined && !("cursor" in info) && !("cursors" in info))
27
+ return undefined;
28
+ if (info["is_truncated"] === false || info["is_truncated"] === "false")
29
+ return null;
30
+ if (value === null || value === undefined || value === "") {
31
+ if (info["is_truncated"] === true || info["is_truncated"] === "true")
32
+ badPage("Cloudflare reported another page without a cursor.");
33
+ return null;
34
+ }
35
+ if (typeof value !== "string")
36
+ return badPage("Cloudflare returned invalid cursor metadata.");
37
+ if (withholdEmbeddedUrlsIn(value) !== value || /\[redacted\]/i.test(value))
38
+ return { hasMore: true };
39
+ return value;
40
+ },
41
+ });
42
+ export const CLOUDFLARE_PAGES = Object.fromEntries(cloudflareIndex.ops.flatMap((op) => {
43
+ if (CLOUDFLARE_VERDICTS[`${op.method} ${op.path}`] !== "read")
44
+ return [];
45
+ const params = cloudflareIndex.contract(op).parameters.filter((p) => p.in === "query");
46
+ const token = params.find((p) => p.name === "cursor" || p.name === "after");
47
+ // Only bind a continuation whose response envelope and query location are
48
+ // established by the pin. Mixed page/cursor APIs can use nonstandard
49
+ // pagination envelopes; retain their vendor query protocol until reviewed.
50
+ if (!cloudflareIndex.responseRoots(op)?.has("result_info") || (token && params.some((p) => p.name === "page")))
51
+ return [];
52
+ const adapter = token
53
+ ? tokenPage(token.name)
54
+ : params.some((p) => p.name === "page")
55
+ ? {
56
+ ...cloudflarePage,
57
+ cursorInputMessage: "Omit page on the first call; to continue, pass page.nextCursor unchanged as the cursor in query.page.",
58
+ }
59
+ : undefined;
60
+ return adapter ? [[`${op.method} ${op.path}`, adapter]] : [];
61
+ }));
62
+ export const CLOUDFLARE_HEADERS = Object.fromEntries(Object.entries(HEADERS).map(([key, description]) => [
63
+ key,
64
+ {
65
+ description,
66
+ values: key === "cf-r2-jurisdiction"
67
+ ? ["default", "eu", "us", "fedramp", "fedramp-high"]
68
+ : ["Standard", "InfrequentAccess"],
69
+ },
70
+ ]));
71
+ export function cloudflareBinding({ connection, options, }) {
72
+ const runtime = cloudflareRuntime(connection, settings(options));
73
+ return {
74
+ review: "Cloudflare's indexed text, SQL, NDJSON and SCIM framing, closed R2 headers and configured defaults retain the same confined Connection, scoped admission and value safety.",
75
+ allowOtherBodyTypes: true,
76
+ path: runtime.fillDefaults,
77
+ prepareBody: (body, op) => runtime.scope({ method: op.method, path: op.path, op, params: {}, query: {}, body }).body,
78
+ refusal: (op) => SAFETY.refusal(op.method, op.path) ?? runtime.checkServer(op.server),
79
+ refuse: (call) => {
80
+ runtime.scope(call);
81
+ for (const parameter of cloudflareIndex.contract(call.op).parameters) {
82
+ if (parameter.in !== "query" ||
83
+ !["page", "per_page", "limit"].includes(parameter.name) ||
84
+ !["integer", "number"].includes(String(parameter.schema.type)))
85
+ continue;
86
+ const value = call.query[parameter.name];
87
+ if (value === undefined)
88
+ continue;
89
+ if (!(typeof value === "number" && Number.isSafeInteger(value) && value >= 0) &&
90
+ !(typeof value === "string" && /^\d+$/.test(value) && Number.isSafeInteger(Number(value))))
91
+ invalid(`${parameter.name} must be a whole number within the operation's declared bounds.`);
92
+ }
93
+ const policy = SAFETY.refusal(call.method, call.op.path);
94
+ if (policy)
95
+ return policy;
96
+ const type = cloudflareIndex.bodyType(call.op)?.toLowerCase() ?? "";
97
+ if (/multipart|octet-stream|image\//.test(type))
98
+ return "Use cloudflare_api_upload for this reviewed binary or multipart operation.";
99
+ return SAFETY.refusal(call.method, call.op.path) ?? runtime.checkServer(call.op.server) ?? runtime.refuse(call);
100
+ },
101
+ send: (call) => runtime.sendEnvelope(runtime.scope(call)).pipe(Effect.map(({ status, data }) => ({ status, data }))),
102
+ };
103
+ }
@@ -0,0 +1,28 @@
1
+ // Exact pin 843eae2f: these 16 integer path parameters declare minimum: 0
2
+ // with exclusiveMinimum: true. Enforce the strict bound locally; the pin and
3
+ // compiled index remain unchanged.
4
+ export const EXCLUSIVE_PATH_IDS = {
5
+ "POST /accounts/{account_id}/cloudforce-one/v2/brand-protection/queries/{query_id}/matches/{domain_id}/dismiss": [
6
+ "query_id",
7
+ "domain_id",
8
+ ],
9
+ "POST /accounts/{account_id}/cloudforce-one/v2/brand-protection/queries/{query_id}/matches/{domain_id}/undismiss": [
10
+ "query_id",
11
+ "domain_id",
12
+ ],
13
+ "DELETE /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}": ["notice_id"],
14
+ "GET /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}": ["notice_id"],
15
+ "PUT /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}": ["notice_id"],
16
+ "GET /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}/letters": ["notice_id"],
17
+ "POST /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}/letters": ["notice_id"],
18
+ "DELETE /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}/letters/{letter_id}": [
19
+ "notice_id",
20
+ "letter_id",
21
+ ],
22
+ "GET /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}/letters/{letter_id}": [
23
+ "notice_id",
24
+ "letter_id",
25
+ ],
26
+ "GET /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}/letters/{letter_id}/pdf": ["notice_id", "letter_id"],
27
+ "DELETE /accounts/{account_id}/cloudforce-one/v2/credential-monitor/domains/{id}": ["id"],
28
+ };
@@ -0,0 +1,75 @@
1
+ // Reviewed non-JSON success media from evidence/openapi.json.
2
+ // Reproduce against the exact pin with scripts/audit-provider-media.mjs.
3
+ export const RESPONSE_MEDIA = {
4
+ "GET /accounts/{account_id}/access/saml_certificates/{saml_cert_set_id}/pem": ["application/x-pem-file"],
5
+ "GET /accounts/{account_id}/addressing/loa_documents/{loa_document_id}/download": ["application/pdf"],
6
+ "GET /accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items/{item_id}/download": [
7
+ "application/octet-stream",
8
+ ],
9
+ "GET /accounts/{account_id}/alerting/v3/policies/{policy_id}/email/unsubscribe": ["text/html"],
10
+ "POST /accounts/{account_id}/alerting/v3/policies/{policy_id}/email/unsubscribe": ["text/html"],
11
+ "GET /accounts/{account_id}/analytics_engine/sql": ["application/x-ndjson"],
12
+ "POST /accounts/{account_id}/analytics_engine/sql": ["application/x-ndjson"],
13
+ "GET /accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/blob/{hash}": ["application/octet-stream"],
14
+ "GET /accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/file": ["application/octet-stream"],
15
+ "GET /accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/raw/{ref}/{path}": [
16
+ "application/octet-stream",
17
+ "text/html",
18
+ "text/plain",
19
+ ],
20
+ "POST /accounts/{account_id}/browser-rendering/pdf": ["application/pdf"],
21
+ "POST /accounts/{account_id}/browser-rendering/screenshot": ["image/jpg", "image/png", "image/webp", "text/plain"],
22
+ "POST /accounts/{account_id}/cloudforce-one/v2/brand-protection/letter/generate": ["application/pdf"],
23
+ "GET /accounts/{account_id}/cloudforce-one/v2/brand-protection/takedown-notices/{notice_id}/letters/{letter_id}/pdf": ["application/pdf"],
24
+ "GET /accounts/{account_id}/cloudforce-one/v2/collections/{collection_id}/export": [
25
+ "application/x-ndjson",
26
+ "text/csv",
27
+ "text/markdown",
28
+ ],
29
+ "GET /accounts/{account_id}/cloudforce-one/v2/requests/{project_type}/{request_id}/assets/{asset_id}/download": [
30
+ "application/octet-stream",
31
+ ],
32
+ "GET /accounts/{account_id}/cloudforce-one/v2/threat-signals/articles/{article_id}/content": [
33
+ "text/html",
34
+ "text/plain",
35
+ ],
36
+ "GET /accounts/{account_id}/cloudforce-one/v2/threat-signals/feeds/{feed_id}/raw": ["application/xml", "text/plain"],
37
+ "GET /accounts/{account_id}/dex/commands/{command_id}/downloads/{filename}": ["application/zip"],
38
+ "GET /accounts/{account_id}/email/sending/messages/{message_id}": ["message/rfc822"],
39
+ "GET /accounts/{account_id}/images/v1/{image_id}/blob": ["image/*"],
40
+ "GET /accounts/{account_id}/intel/indicator-feeds/{feed_id}/data": ["text/csv"],
41
+ "POST /accounts/{account_id}/magic/cloud/onramps/{onramp_id}/export": ["application/zip"],
42
+ "GET /accounts/{account_id}/magic/cloud/resources/export": ["application/octet-stream"],
43
+ "GET /accounts/{account_id}/pcaps/{pcap_id}/download": ["application/vnd.tcpdump.pcap"],
44
+ "GET /accounts/{account_id}/queues/{queue_id}/metrics": ["text/event-stream"],
45
+ "GET /accounts/{account_id}/r2/buckets/{bucket_name}/objects/{object_key}": ["application/octet-stream"],
46
+ "GET /accounts/{account_id}/receipts/{receipt_id}/pdf": ["application/pdf"],
47
+ "GET /accounts/{account_id}/security-center/partners/{partner}/shadow-zones": ["text/csv"],
48
+ "GET /accounts/{account_id}/security-center/partners/{partner}/shadow-zones/{domain}/hosts": ["text/csv"],
49
+ "GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/values/{key_name}": ["application/octet-stream"],
50
+ "GET /accounts/{account_id}/stream/{identifier}/captions/{language}/vtt": ["text/vtt"],
51
+ "GET /accounts/{account_id}/stream/{identifier}/embed": ["text/html"],
52
+ "GET /accounts/{account_id}/urlscanner/response/{response_id}": ["text/plain"],
53
+ "GET /accounts/{account_id}/urlscanner/scan/{scan_id}/screenshot": ["image/png"],
54
+ "GET /accounts/{account_id}/urlscanner/v2/dom/{scan_id}": ["text/plain"],
55
+ "GET /accounts/{account_id}/urlscanner/v2/responses/{response_id}": ["text/plain"],
56
+ "GET /accounts/{account_id}/urlscanner/v2/screenshots/{scan_id}.png": ["image/png"],
57
+ "GET /accounts/{account_id}/workers/dispatch/namespaces/{dispatch_namespace}/scripts/{script_name}/content": [
58
+ "string",
59
+ ],
60
+ "GET /accounts/{account_id}/workers/scripts/{script_name}": ["application/javascript", "multipart/form-data"],
61
+ "GET /accounts/{account_id}/workers/scripts/{script_name}/content/v2": ["string"],
62
+ "GET /accounts/{account_id}/workers/services/{service_name}/environments/{environment_name}/content": ["string"],
63
+ "POST /accounts/{account_id}/workers/workers/{worker_id}/versions/{version_id}/profile": [
64
+ "application/vnd.google.protobuf",
65
+ ],
66
+ "GET /accounts/{account_id}/workflows/{workflow_name}/instances/{instance_id}/step": ["application/octet-stream"],
67
+ "GET /accounts/{account_tag}/analytics/sql": ["application/x-ndjson", "text/tab-separated-values"],
68
+ "POST /accounts/{account_tag}/analytics/sql": ["application/x-ndjson", "text/tab-separated-values"],
69
+ "GET /analytics/sql": ["application/x-ndjson", "text/tab-separated-values"],
70
+ "POST /analytics/sql": ["application/x-ndjson", "text/tab-separated-values"],
71
+ "GET /radar/datasets/{alias}": ["text/csv"],
72
+ "GET /zones/{zone_id}/dns_records/export": ["text/plain"],
73
+ "GET /zones/{zone_id}/security-center/partners/{partner}/shadow-hosts": ["text/csv"],
74
+ "GET /zones/{zone_id}/snippets/{snippet_name}/content": ["multipart/form-data"],
75
+ };