@zackbart/connecta 0.34.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/CHANGELOG.md +418 -0
  2. package/README.md +65 -105
  3. package/SECURITY.md +3 -2
  4. package/bin/connecta.mjs +41 -16
  5. package/bin/version.mjs +1 -1
  6. package/dist/access-tokens.d.ts +2 -1
  7. package/dist/access-tokens.js +66 -30
  8. package/dist/activity.d.ts +1 -1
  9. package/dist/activity.js +2 -0
  10. package/dist/agent-config.d.ts +23 -0
  11. package/dist/agent-config.js +59 -0
  12. package/dist/agent-description.js +16 -0
  13. package/dist/agent-identity.js +4 -4
  14. package/dist/agent-observation.js +39 -0
  15. package/dist/auth/clerk-sdk/client.d.ts +2 -0
  16. package/dist/auth/clerk-sdk/generated.js +554 -563
  17. package/dist/auth/clerk-transport.js +70 -3
  18. package/dist/auth/clerk.d.ts +13 -0
  19. package/dist/auth/clerk.js +653 -246
  20. package/dist/auth/cloudflare-access.js +46 -42
  21. package/dist/auth/downstream-client-metadata.js +2 -2
  22. package/dist/auth/downstream-oauth.js +2044 -1161
  23. package/dist/auth/downstream-revocation.js +88 -88
  24. package/dist/auth/native-call.js +20 -0
  25. package/dist/auth/native.js +184 -0
  26. package/dist/auth/oauth-start-reset.js +11 -5
  27. package/dist/auth/oauth-token-response.js +121 -102
  28. package/dist/auth/oauth-v2-migration.js +97 -78
  29. package/dist/auth/renewable-grant.js +10 -0
  30. package/dist/auth/static-oauth.js +751 -281
  31. package/dist/auth/vercel-agent.js +266 -0
  32. package/dist/auth-admission.js +204 -0
  33. package/dist/auth-elicitation.js +350 -241
  34. package/dist/authorization-handoff.js +164 -90
  35. package/dist/call-admission-context.js +3 -10
  36. package/dist/call-admission.js +2 -0
  37. package/dist/call-classification.js +9 -0
  38. package/dist/call-recovery.js +32 -13
  39. package/dist/canonical-json.js +8 -0
  40. package/dist/catalog-cache.js +369 -213
  41. package/dist/catalog-service.js +659 -530
  42. package/dist/catalog.js +5 -1
  43. package/dist/concurrency.js +0 -25
  44. package/dist/config-defaults.d.ts +1 -0
  45. package/dist/config-defaults.js +1 -0
  46. package/dist/config-schema.d.ts +3 -1
  47. package/dist/config-schema.js +13 -3
  48. package/dist/config.d.ts +40 -6
  49. package/dist/config.js +40 -26
  50. package/dist/connector-caller.d.ts +4 -0
  51. package/dist/connector-caller.js +17 -4
  52. package/dist/connectors/api-connector.d.ts +29 -7
  53. package/dist/connectors/api-connector.js +145 -57
  54. package/dist/connectors/guarded-fetch.d.ts +51 -17
  55. package/dist/connectors/guarded-fetch.js +215 -121
  56. package/dist/connectors/negotiation-cache.js +20 -10
  57. package/dist/connectors/remote-mcp.d.ts +10 -30
  58. package/dist/connectors/remote-mcp.js +955 -563
  59. package/dist/d1.js +10 -243
  60. package/dist/derived-context.js +5 -0
  61. package/dist/describe-config.d.ts +3 -1
  62. package/dist/describe-config.js +2 -0
  63. package/dist/downstream-input.js +347 -260
  64. package/dist/errors.d.ts +87 -6
  65. package/dist/errors.js +114 -4
  66. package/dist/execute.js +87 -50
  67. package/dist/executor-admission.js +3 -0
  68. package/dist/executors/quickjs.js +163 -112
  69. package/dist/guarded-transport.js +50 -0
  70. package/dist/guest-runtime.js +1 -1
  71. package/dist/http/client.js +439 -0
  72. package/dist/http/errors.js +558 -0
  73. package/dist/http/fields.js +49 -0
  74. package/dist/http/hatch-paging.js +318 -0
  75. package/dist/http/hatch.js +1279 -0
  76. package/dist/http/json-schema.js +267 -0
  77. package/dist/http/node-transport.js +241 -0
  78. package/dist/http/oauth.js +162 -0
  79. package/dist/http/paging.js +227 -0
  80. package/dist/http/provider.js +221 -0
  81. package/dist/http/safety.js +82 -0
  82. package/dist/http/services.js +79 -0
  83. package/dist/http/tools.js +379 -0
  84. package/dist/http/vendor-index.js +138 -0
  85. package/dist/http/vendor.js +448 -0
  86. package/dist/http/write-request.js +66 -0
  87. package/dist/http-policy.d.ts +11 -0
  88. package/dist/http-policy.js +45 -0
  89. package/dist/inbound-credential.js +1 -1
  90. package/dist/index.d.ts +2 -2
  91. package/dist/index.js +4 -0
  92. package/dist/invocation-auth.js +30 -19
  93. package/dist/invocation.js +218 -85
  94. package/dist/mcp-result.js +0 -4
  95. package/dist/membership.d.ts +4 -0
  96. package/dist/meta-output.js +1 -1
  97. package/dist/meta-tools.js +531 -406
  98. package/dist/native-recovery.js +52 -0
  99. package/dist/native-tools.js +382 -0
  100. package/dist/node.d.ts +4 -3
  101. package/dist/node.js +45 -8
  102. package/dist/oauth-handoff.js +177 -104
  103. package/dist/oauth-partition.js +6 -20
  104. package/dist/oauth-sealing.js +6 -7
  105. package/dist/operation-vocabulary.js +101 -0
  106. package/dist/operator-record.d.ts +2 -2
  107. package/dist/operator-record.js +17 -4
  108. package/dist/operator-ui/contract.d.ts +8 -3
  109. package/dist/operator-ui/generated.js +4 -4
  110. package/dist/operator-ui/model.d.ts +2 -3
  111. package/dist/program-writes.js +47 -26
  112. package/dist/provider-call-facts.d.ts +115 -0
  113. package/dist/provider-call-facts.js +182 -0
  114. package/dist/provider-call.d.ts +112 -0
  115. package/dist/provider-call.js +271 -0
  116. package/dist/provider.d.ts +65 -31
  117. package/dist/provider.js +116 -39
  118. package/dist/providers/_shared/google/hatch.js +91 -0
  119. package/dist/providers/_shared/google/kit.js +427 -0
  120. package/dist/providers/_shared/google/result-size.js +15 -2
  121. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  122. package/dist/providers/_shared/google/service-account.js +8 -4
  123. package/dist/providers/_shared/google/workspace.d.ts +6 -210
  124. package/dist/providers/_shared/google/workspace.js +6 -425
  125. package/dist/providers/_shared/rest/compact-index.js +86 -0
  126. package/dist/providers/_shared/rest/kit.js +146 -0
  127. package/dist/providers/_shared/rest/operation-index.js +230 -14
  128. package/dist/providers/_shared/rest/response-media.js +11 -0
  129. package/dist/providers/_shared/rest/value-safety.js +353 -195
  130. package/dist/providers/_shared/sensitive-fields.js +27 -0
  131. package/dist/providers/breeze/api.js +584 -0
  132. package/dist/providers/breeze/index.d.ts +1 -3
  133. package/dist/providers/breeze/index.js +67 -1420
  134. package/dist/providers/breeze/openapi.generated.js +60 -0
  135. package/dist/providers/breeze/skill.generated.js +2 -6
  136. package/dist/providers/breeze/tools.js +696 -0
  137. package/dist/providers/ccb/api.js +496 -0
  138. package/dist/providers/ccb/index.d.ts +15 -37
  139. package/dist/providers/ccb/index.js +77 -1702
  140. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  141. package/dist/providers/ccb/lib/constants.js +74 -0
  142. package/dist/providers/ccb/lib/guide.js +9 -0
  143. package/dist/providers/ccb/lib/verdicts.js +387 -0
  144. package/dist/providers/ccb/openapi.generated.js +397 -0
  145. package/dist/providers/ccb/safety.js +295 -0
  146. package/dist/providers/ccb/skill.generated.js +2 -6
  147. package/dist/providers/ccb/tools.js +853 -0
  148. package/dist/providers/cloudflare/api.js +1066 -0
  149. package/dist/providers/cloudflare/index.d.ts +5 -22
  150. package/dist/providers/cloudflare/index.js +79 -197
  151. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  152. package/dist/providers/cloudflare/lib/config.js +2 -0
  153. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  154. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  155. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  156. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  157. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  158. package/dist/providers/cloudflare/openapi.generated.js +4 -3
  159. package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
  160. package/dist/providers/cloudflare/skill.generated.js +2 -10
  161. package/dist/providers/cloudflare/tools.js +360 -0
  162. package/dist/providers/docs/api.js +51 -0
  163. package/dist/providers/docs/index.d.ts +1 -12
  164. package/dist/providers/docs/index.js +53 -1165
  165. package/dist/providers/docs/lib/constants.d.ts +18 -0
  166. package/dist/providers/docs/lib/constants.js +18 -0
  167. package/dist/providers/docs/lib/discovery.js +26 -0
  168. package/dist/providers/docs/lib/requests.js +48 -0
  169. package/dist/providers/docs/lib/schemas.js +168 -0
  170. package/dist/providers/docs/openapi.generated.js +16 -0
  171. package/dist/providers/docs/safety.js +54 -0
  172. package/dist/providers/docs/skill.generated.js +2 -6
  173. package/dist/providers/docs/tools.js +801 -0
  174. package/dist/providers/drive/api.js +177 -0
  175. package/dist/providers/drive/index.d.ts +1 -12
  176. package/dist/providers/drive/index.js +38 -1448
  177. package/dist/providers/drive/lib/constants.d.ts +6 -0
  178. package/dist/providers/drive/lib/constants.js +6 -0
  179. package/dist/providers/drive/lib/contracts.js +532 -0
  180. package/dist/providers/drive/lib/hatch.js +197 -0
  181. package/dist/providers/drive/openapi.generated.js +77 -0
  182. package/dist/providers/drive/safety.js +90 -0
  183. package/dist/providers/drive/skill.generated.js +2 -6
  184. package/dist/providers/drive/tools.js +1290 -0
  185. package/dist/providers/forms/api.js +71 -0
  186. package/dist/providers/forms/index.d.ts +1 -12
  187. package/dist/providers/forms/index.js +49 -1145
  188. package/dist/providers/forms/lib/constants.d.ts +14 -0
  189. package/dist/providers/forms/lib/constants.js +19 -0
  190. package/dist/providers/forms/lib/hatch.js +72 -0
  191. package/dist/providers/forms/openapi.generated.js +23 -0
  192. package/dist/providers/forms/safety.js +34 -0
  193. package/dist/providers/forms/skill.generated.js +2 -8
  194. package/dist/providers/forms/tools.js +1023 -0
  195. package/dist/providers/github/api.js +150 -0
  196. package/dist/providers/github/index.d.ts +4 -5
  197. package/dist/providers/github/index.js +30 -87
  198. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  199. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  200. package/dist/providers/github/lib/discovery.js +132 -0
  201. package/dist/providers/github/lib/operations.js +58 -0
  202. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  203. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  204. package/dist/providers/github/openapi.generated.js +1216 -0
  205. package/dist/providers/github/safety.js +216 -0
  206. package/dist/providers/github/skill.generated.js +2 -5
  207. package/dist/providers/github/tools.js +506 -0
  208. package/dist/providers/gmail/api.js +114 -0
  209. package/dist/providers/gmail/index.d.ts +1 -12
  210. package/dist/providers/gmail/index.js +73 -1621
  211. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  212. package/dist/providers/gmail/lib/constants.js +16 -0
  213. package/dist/providers/gmail/lib/index.js +173 -0
  214. package/dist/providers/gmail/lib/schemas.js +176 -0
  215. package/dist/providers/gmail/lib/threading.js +120 -0
  216. package/dist/providers/gmail/openapi.generated.js +92 -0
  217. package/dist/providers/gmail/safety.js +21 -0
  218. package/dist/providers/gmail/skill.generated.js +2 -6
  219. package/dist/providers/gmail/tools.js +1435 -0
  220. package/dist/providers/overflow/api.js +1008 -0
  221. package/dist/providers/overflow/index.d.ts +1 -17
  222. package/dist/providers/overflow/index.js +60 -1488
  223. package/dist/providers/overflow/skill.generated.js +2 -5
  224. package/dist/providers/overflow/tools.js +873 -0
  225. package/dist/providers/planning-center/api.js +467 -0
  226. package/dist/providers/planning-center/index.d.ts +4 -35
  227. package/dist/providers/planning-center/index.js +69 -2445
  228. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  229. package/dist/providers/planning-center/lib/constants.js +83 -0
  230. package/dist/providers/planning-center/lib/discovery.js +40 -0
  231. package/dist/providers/planning-center/lib/guide.js +39 -0
  232. package/dist/providers/planning-center/lib/json-api.js +83 -0
  233. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  234. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  235. package/dist/providers/planning-center/safety.js +188 -0
  236. package/dist/providers/planning-center/skill.generated.js +2 -27
  237. package/dist/providers/planning-center/tools.js +1010 -0
  238. package/dist/providers/quickbooks/api.js +299 -0
  239. package/dist/providers/quickbooks/index.d.ts +13 -0
  240. package/dist/providers/quickbooks/index.js +93 -0
  241. package/dist/providers/quickbooks/lib/query.js +118 -0
  242. package/dist/providers/quickbooks/lib/writes.js +168 -0
  243. package/dist/providers/quickbooks/safety.js +222 -0
  244. package/dist/providers/quickbooks/skill.generated.js +5 -0
  245. package/dist/providers/quickbooks/tools.js +117 -0
  246. package/dist/providers/sheets/api.js +133 -0
  247. package/dist/providers/sheets/index.d.ts +4 -16
  248. package/dist/providers/sheets/index.js +61 -1172
  249. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  250. package/dist/providers/sheets/lib/constants.js +14 -0
  251. package/dist/providers/sheets/lib/hatch.js +163 -0
  252. package/dist/providers/sheets/lib/requests.js +105 -0
  253. package/dist/providers/sheets/lib/schemas.js +138 -0
  254. package/dist/providers/sheets/openapi.generated.js +30 -0
  255. package/dist/providers/sheets/safety.js +27 -0
  256. package/dist/providers/sheets/skill.generated.js +2 -7
  257. package/dist/providers/sheets/tools.js +733 -0
  258. package/dist/providers/slides/api.js +147 -0
  259. package/dist/providers/slides/index.d.ts +2 -10
  260. package/dist/providers/slides/index.js +48 -2555
  261. package/dist/providers/slides/lib/constants.d.ts +11 -0
  262. package/dist/providers/slides/lib/constants.js +11 -0
  263. package/dist/providers/slides/lib/requests.js +60 -0
  264. package/dist/providers/slides/lib/schemas.js +565 -0
  265. package/dist/providers/slides/openapi.generated.js +18 -0
  266. package/dist/providers/slides/skill.generated.js +2 -6
  267. package/dist/providers/slides/tools.js +1968 -0
  268. package/dist/providers/stripe/api.js +401 -0
  269. package/dist/providers/stripe/index.d.ts +5 -27
  270. package/dist/providers/stripe/index.js +74 -210
  271. package/dist/providers/stripe/lib/config.d.ts +4 -0
  272. package/dist/providers/stripe/lib/config.js +2 -0
  273. package/dist/providers/stripe/openapi.generated.js +4 -3
  274. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  275. package/dist/providers/stripe/skill.generated.js +2 -11
  276. package/dist/providers/stripe/tools.js +77 -0
  277. package/dist/providers/tithely/api.js +531 -0
  278. package/dist/providers/tithely/index.d.ts +17 -0
  279. package/dist/providers/tithely/index.js +86 -965
  280. package/dist/providers/tithely/skill.generated.js +2 -5
  281. package/dist/providers/tithely/tools.js +426 -0
  282. package/dist/providers/vercel/api.js +551 -0
  283. package/dist/providers/vercel/index.d.ts +9 -25
  284. package/dist/providers/vercel/index.js +65 -260
  285. package/dist/providers/vercel/lib/config.d.ts +2 -0
  286. package/dist/providers/vercel/lib/config.js +2 -0
  287. package/dist/providers/vercel/lib/index.js +117 -0
  288. package/dist/providers/vercel/lib/logs.js +100 -0
  289. package/dist/providers/vercel/lib/pin.js +270 -0
  290. package/dist/providers/vercel/openapi.generated.js +10 -5
  291. package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
  292. package/dist/providers/vercel/skill.generated.js +2 -7
  293. package/dist/providers/vercel/tools.js +642 -0
  294. package/dist/redaction-identity.js +47 -0
  295. package/dist/redaction-marker.js +125 -0
  296. package/dist/registry.d.ts +21 -15
  297. package/dist/registry.js +409 -376
  298. package/dist/routes/access-tokens.js +1 -1
  299. package/dist/routes/actor-labels.js +1 -1
  300. package/dist/routes/connect.js +1 -1
  301. package/dist/routes/dispatch.js +103 -0
  302. package/dist/routes/mcp.js +170 -79
  303. package/dist/routes/oauth.js +6 -1
  304. package/dist/routes/operator.js +2 -2
  305. package/dist/routes/shared.d.ts +5 -4
  306. package/dist/routes/shared.js +244 -177
  307. package/dist/routes/skills.js +10 -8
  308. package/dist/routes/ui-config.js +27 -3
  309. package/dist/routes/ui-data.js +21 -20
  310. package/dist/routes/ui.js +1 -1
  311. package/dist/runtime/call-admission.js +0 -26
  312. package/dist/runtime/call-entry.js +30 -0
  313. package/dist/runtime/call.js +552 -0
  314. package/dist/runtime/connector-scope.js +7 -0
  315. package/dist/runtime/credential-probe.js +34 -0
  316. package/dist/runtime/executor.js +40 -0
  317. package/dist/runtime/native-storage.js +63 -0
  318. package/dist/runtime/registry.js +27 -0
  319. package/dist/runtime/request-scope.js +72 -0
  320. package/dist/runtime/run.js +15 -7
  321. package/dist/runtime/shared-read.js +34 -5
  322. package/dist/runtime/storage.js +34 -21
  323. package/dist/sent-secrets.d.ts +194 -37
  324. package/dist/sent-secrets.js +1743 -340
  325. package/dist/server.js +5 -56
  326. package/dist/skills.js +322 -223
  327. package/dist/sqlite.js +15 -14
  328. package/dist/storage/d1-copy.js +255 -0
  329. package/dist/storage/d1-driver.js +15 -0
  330. package/dist/storage/keys.js +28 -0
  331. package/dist/storage/sql-driver.js +88 -0
  332. package/dist/storage/sql-native.js +544 -0
  333. package/dist/storage/sql-schema.d.ts +6 -0
  334. package/dist/storage/sql-schema.js +15 -0
  335. package/dist/storage/sql.d.ts +14 -20
  336. package/dist/storage/sql.js +29 -535
  337. package/dist/timeout.js +0 -26
  338. package/dist/tool-safety.js +20 -10
  339. package/dist/types.d.ts +9 -109
  340. package/dist/ui.d.ts +1 -1
  341. package/dist/ui.js +0 -1
  342. package/dist/upward.js +3 -0
  343. package/dist/usage-guide.js +3 -1
  344. package/dist/validate.d.ts +4 -2
  345. package/dist/validate.js +86 -9
  346. package/dist/version.d.ts +1 -1
  347. package/dist/version.js +1 -1
  348. package/dist/worker.js +312 -292
  349. package/dist/workspace-subject.js +5 -1
  350. package/dist/write-outcome.js +454 -34
  351. package/documentation/README.md +28 -7
  352. package/documentation/architecture.md +2409 -255
  353. package/documentation/auth.md +867 -114
  354. package/documentation/code-mode.md +49 -16
  355. package/documentation/deploying.md +164 -20
  356. package/documentation/hosted-mcp-migration.md +460 -0
  357. package/documentation/integrating.md +129 -144
  358. package/documentation/meta-tools.md +409 -32
  359. package/documentation/operating.md +27 -3
  360. package/documentation/operator-tests.md +3 -0
  361. package/documentation/operator-ui.md +84 -48
  362. package/documentation/provider-auth-migration.md +16 -63
  363. package/documentation/provider-migration-0.29.md +10 -5
  364. package/documentation/provider-migration-0.35.md +975 -0
  365. package/documentation/providers.md +1347 -0
  366. package/examples/worker/AGENTS.md +23 -9
  367. package/examples/worker/README.md +254 -135
  368. package/examples/worker/alchemy.run.ts +116 -0
  369. package/examples/worker/gitignore +10 -0
  370. package/examples/worker/src/connecta.config.ts +23 -21
  371. package/examples/worker/wrangler.jsonc +14 -5
  372. package/guides/connecting-agents.md +157 -0
  373. package/guides/how-it-works.md +156 -0
  374. package/guides/safety-and-trust.md +153 -0
  375. package/package.json +30 -50
  376. package/templates/node/.env.example +3 -0
  377. package/templates/node/README.md +22 -2
  378. package/templates/node/docker-compose.yml +1 -0
  379. package/templates/node/package.json +3 -2
  380. package/templates/node/src/connecta.config.ts +8 -0
  381. package/dist/catalog-drift.d.ts +0 -138
  382. package/dist/catalog-drift.js +0 -578
  383. package/dist/operator-ui/agents.d.ts +0 -74
  384. package/dist/operator-ui/agents.js +0 -104
  385. package/dist/operator-ui/config-summary.js +0 -565
  386. package/dist/operator-ui/connection-map.js +0 -376
  387. package/dist/operator-ui/endpoints.js +0 -221
  388. package/dist/operator-ui/fix-prompts.d.ts +0 -18
  389. package/dist/operator-ui/fix-prompts.js +0 -87
  390. package/dist/operator-ui/health.js +0 -52
  391. package/dist/operator-ui/member-page.js +0 -97
  392. package/dist/operator-ui/overview.js +0 -123
  393. package/dist/operator-ui/setup-commands.js +0 -51
  394. package/dist/operator-ui/view.d.ts +0 -401
  395. package/dist/operator-ui/view.js +0 -705
  396. package/dist/providers/_shared/request-token.js +0 -83
  397. package/dist/providers/_shared/rest/dispatch.js +0 -41
  398. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  399. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  400. package/dist/providers/_shared/rest/tools.js +0 -569
  401. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  402. package/dist/providers/basecamp/index.d.ts +0 -45
  403. package/dist/providers/basecamp/index.js +0 -997
  404. package/dist/providers/basecamp/skill.generated.js +0 -9
  405. package/dist/providers/cloudflare/rest.d.ts +0 -37
  406. package/dist/providers/cloudflare/rest.js +0 -1097
  407. package/dist/providers/github/hosted.js +0 -218
  408. package/dist/providers/github/rest.js +0 -321
  409. package/dist/providers/infisical/index.d.ts +0 -7
  410. package/dist/providers/infisical/index.js +0 -713
  411. package/dist/providers/infisical/skill.generated.js +0 -8
  412. package/dist/providers/intercom/index.d.ts +0 -24
  413. package/dist/providers/intercom/index.js +0 -121
  414. package/dist/providers/intercom/skill.generated.js +0 -8
  415. package/dist/providers/linear/index.d.ts +0 -55
  416. package/dist/providers/linear/index.js +0 -537
  417. package/dist/providers/linear/skill.generated.js +0 -8
  418. package/dist/providers/mixpanel/index.d.ts +0 -59
  419. package/dist/providers/mixpanel/index.js +0 -472
  420. package/dist/providers/mixpanel/operations.js +0 -20
  421. package/dist/providers/mixpanel/rest.js +0 -603
  422. package/dist/providers/mixpanel/skill.generated.js +0 -10
  423. package/dist/providers/mixpanel/value-safety.js +0 -16
  424. package/dist/providers/notion/index.d.ts +0 -67
  425. package/dist/providers/notion/index.js +0 -368
  426. package/dist/providers/notion/openapi.generated.js +0 -75
  427. package/dist/providers/notion/rest.d.ts +0 -24
  428. package/dist/providers/notion/rest.js +0 -1226
  429. package/dist/providers/notion/skill.generated.js +0 -11
  430. package/dist/providers/notion/value-safety.js +0 -56
  431. package/dist/providers/revenuecat/index.d.ts +0 -51
  432. package/dist/providers/revenuecat/index.js +0 -697
  433. package/dist/providers/revenuecat/skill.generated.js +0 -11
  434. package/dist/providers/stripe/rest.d.ts +0 -14
  435. package/dist/providers/stripe/rest.js +0 -402
  436. package/dist/providers/vercel/rest.d.ts +0 -20
  437. package/dist/providers/vercel/rest.js +0 -1020
  438. package/dist/providers/wispr-flow/index.d.ts +0 -14
  439. package/dist/providers/wispr-flow/index.js +0 -117
  440. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  441. /package/dist/providers/github/{key.js → lib/key.js} +0 -0
@@ -1,11 +0,0 @@
1
- // Generated by scripts/generate-providers.mjs; do not edit.
2
- export const skill = {
3
- "content": "\n- Inspect result framing before accessing fields. A text result is not automatically an object; parse it only if the returned text is valid JSON. Do not iterate fields that the response does not contain.\n- Resolve ids before acting; never guess one. `list-projects` yields the `project_id` every project-scoped call takes. `list-apps`, `list-products`, `list-entitlements`, `list-offerings`, `list-paywalls`, `list-audiences`, and `list-customers` yield the ids their `get-`, `update-`, `archive-`, and `delete-` counterparts expect. A plausible-looking id belongs to another project or to nobody.\n- Customers are addressed by the app user id your SDK set, not by an internal key. Find one with `list-customers` before `get-customer`, and carry the id it returned unchanged.\n- Customer and subscription objects are large, and a customer's history is larger. Page with the cursor the list returned rather than raising the page size, and reduce inside `execute_code` — select the fields the question needs and return those, not the whole object.\n- Whether a customer should have access is `gives_access` on each subscription from `list-subscriptions`, which RevenueCat calls the authoritative flag. `status` and `expires_date` describe the store-side state and disagree with it during grace periods, billing retries, and promotional grants — answer access questions from `gives_access` and say which subscription it came from.\n- `get-chart-data` is the metrics path: read `get-chart-options-schema` for the chart you want before calling it, rather than guessing an option name. `get-overview-metrics` and `get-revenue-metric` answer the summary questions in one call.\n- `create-paywall-ai` and `edit-paywall-ai` are asynchronous. Poll the task id they return with `get-paywall-ai-task` rather than assuming the work finished when the call returned.\n- The documented `get-product-store-state-operation`, `create-product-prices`, `equalize-subscription-prices`, `set-product-store-state`, and `upload-product-store-state-screenshot` tools are deprecated; they remain supported when the server exposes them. Store changes use the plan workflow: `create-product-store-state-plan`, then `plan-product-store-state-plan`, then `apply-product-store-state-plan`. Every step past the create is asynchronous — read the plan back with `get-product-store-state-plan` between steps instead of assuming the last one finished.\n- This connection's tool list is not a fixed set. The reviewed catalog is a superset, not a promise that every reviewed tool is available. RevenueCat gates parts of its MCP catalog by API key permissions, plan, platform, and beta enrollment — paywall AI editing, benchmarks, experiments, virtual currencies, and the account-billing tools are the usual absentees — so search this connector for what it actually exposes rather than assuming a documented tool is here.\n- `list-app-subscription-groups`, `preview-audience`, and `render-paywall-screenshot` are reviewed reads. Audience preview uses an observational POST that returns matching customers without creating an audience; screenshot rendering previews a paywall without editing or publishing it.\n- `validate-app-credentials` stays classified as write conservatively: the MCP reference labels it Read and says credentials are unchanged, but the live annotation says otherwise and the public API v2 app contract does not establish whether validation status or results persist. Do not infer permission to call it from its presence under a read-only API key.\n- RevenueCat meters API v2 per minute and per domain, and the domains differ: 480 requests per minute for customer information and virtual currencies, 60 for project configuration and audiences, 25 for charts and metrics. It answers a breach with `429`, a `Retry-After` header, and a `backoff_ms` field. Back off on that rather than retrying immediately, and expect chart sweeps to hit the ceiling long before customer reads do.\n- Use discovery's effective classification for routing rather than inferring safety from a name or HTTP method. Creates, updates, archives, grants, publishes, and store changes are writes; audience previews and screenshot rendering are reads. For guest calls, classification, and routing, fetch `skills({ name: \"usage\" })`.\n- An `auth_required` failure means this connector's RevenueCat authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged. A rejected argument, a permission gap, or a plan restriction comes back in RevenueCat's own words instead — read it rather than re-authorizing.\n# RevenueCat usage\n\nAccount-scoped connection: this OAuth session reaches every RevenueCat project the account can see. Connector purpose: \n\nCall `list-projects` first and carry the exact `project_id` it returned into every project-scoped call. Connecta does not pick a project, and the connector id, title, and purpose are routing hints rather than proof of which project a call will land in. If more than one project fits the request, stop and ask; never guess a `project_id`.\n. RevenueCat secret API keys are project-wide, so this key reaches exactly one project and nothing outside it. A second project is a second connector with its own key and its own id — never a `project_id` argument pointed somewhere else.\n\nConfirm the project on first use: `list-projects` returns the one project this key can see, and its `project_id` is the one every project-scoped call takes. An empty or unexpected result means wrong connector, not missing data.\n\nA RevenueCat secret key has per-resource permissions. RevenueCat can omit tools this key cannot use from its live catalog; Connecta serves the returned catalog rather than adding missing tools from its reviewed superset. Catalog presence alone does not prove a call is permitted. A served tool can still fail at RevenueCat for missing permissions; read that refusal and route the call to a connector with the required permissions. A read-only Connecta endpoint independently omits and blocks tools classified as writes.\n",
4
- "instructionsHeading": "Project instructions",
5
- "fragments": {
6
- "guide_0": "\n- Inspect result framing before accessing fields. A text result is not automatically an object; parse it only if the returned text is valid JSON. Do not iterate fields that the response does not contain.\n- Resolve ids before acting; never guess one. `list-projects` yields the `project_id` every project-scoped call takes. `list-apps`, `list-products`, `list-entitlements`, `list-offerings`, `list-paywalls`, `list-audiences`, and `list-customers` yield the ids their `get-`, `update-`, `archive-`, and `delete-` counterparts expect. A plausible-looking id belongs to another project or to nobody.\n- Customers are addressed by the app user id your SDK set, not by an internal key. Find one with `list-customers` before `get-customer`, and carry the id it returned unchanged.\n- Customer and subscription objects are large, and a customer's history is larger. Page with the cursor the list returned rather than raising the page size, and reduce inside `execute_code` — select the fields the question needs and return those, not the whole object.\n- Whether a customer should have access is `gives_access` on each subscription from `list-subscriptions`, which RevenueCat calls the authoritative flag. `status` and `expires_date` describe the store-side state and disagree with it during grace periods, billing retries, and promotional grants — answer access questions from `gives_access` and say which subscription it came from.\n- `get-chart-data` is the metrics path: read `get-chart-options-schema` for the chart you want before calling it, rather than guessing an option name. `get-overview-metrics` and `get-revenue-metric` answer the summary questions in one call.\n- `create-paywall-ai` and `edit-paywall-ai` are asynchronous. Poll the task id they return with `get-paywall-ai-task` rather than assuming the work finished when the call returned.\n- The documented `get-product-store-state-operation`, `create-product-prices`, `equalize-subscription-prices`, `set-product-store-state`, and `upload-product-store-state-screenshot` tools are deprecated; they remain supported when the server exposes them. Store changes use the plan workflow: `create-product-store-state-plan`, then `plan-product-store-state-plan`, then `apply-product-store-state-plan`. Every step past the create is asynchronous — read the plan back with `get-product-store-state-plan` between steps instead of assuming the last one finished.\n- This connection's tool list is not a fixed set. The reviewed catalog is a superset, not a promise that every reviewed tool is available. RevenueCat gates parts of its MCP catalog by API key permissions, plan, platform, and beta enrollment — paywall AI editing, benchmarks, experiments, virtual currencies, and the account-billing tools are the usual absentees — so search this connector for what it actually exposes rather than assuming a documented tool is here.\n- `list-app-subscription-groups`, `preview-audience`, and `render-paywall-screenshot` are reviewed reads. Audience preview uses an observational POST that returns matching customers without creating an audience; screenshot rendering previews a paywall without editing or publishing it.\n- `validate-app-credentials` stays classified as write conservatively: the MCP reference labels it Read and says credentials are unchanged, but the live annotation says otherwise and the public API v2 app contract does not establish whether validation status or results persist. Do not infer permission to call it from its presence under a read-only API key.\n- RevenueCat meters API v2 per minute and per domain, and the domains differ: 480 requests per minute for customer information and virtual currencies, 60 for project configuration and audiences, 25 for charts and metrics. It answers a breach with `429`, a `Retry-After` header, and a `backoff_ms` field. Back off on that rather than retrying immediately, and expect chart sweeps to hit the ceiling long before customer reads do.\n- Use discovery's effective classification for routing rather than inferring safety from a name or HTTP method. Creates, updates, archives, grants, publishes, and store changes are writes; audience previews and screenshot rendering are reads. For guest calls, classification, and routing, fetch `skills({ name: \"usage\" })`.\n- An `auth_required` failure means this connector's RevenueCat authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged. A rejected argument, a permission gap, or a plan restriction comes back in RevenueCat's own words instead — read it rather than re-authorizing.\n",
7
- "guide_1": "# RevenueCat usage\n\nAccount-scoped connection: this OAuth session reaches every RevenueCat project the account can see. Connector purpose: ",
8
- "guide_2": "\n\nCall `list-projects` first and carry the exact `project_id` it returned into every project-scoped call. Connecta does not pick a project, and the connector id, title, and purpose are routing hints rather than proof of which project a call will land in. If more than one project fits the request, stop and ask; never guess a `project_id`.\n",
9
- "guide_3": ". RevenueCat secret API keys are project-wide, so this key reaches exactly one project and nothing outside it. A second project is a second connector with its own key and its own id — never a `project_id` argument pointed somewhere else.\n\nConfirm the project on first use: `list-projects` returns the one project this key can see, and its `project_id` is the one every project-scoped call takes. An empty or unexpected result means wrong connector, not missing data.\n\nA RevenueCat secret key has per-resource permissions. RevenueCat can omit tools this key cannot use from its live catalog; Connecta serves the returned catalog rather than adding missing tools from its reviewed superset. Catalog presence alone does not prove a call is permitted. A served tool can still fail at RevenueCat for missing permissions; read that refusal and route the call to a connector with the required permissions. A read-only Connecta endpoint independently omits and blocks tools classified as writes.\n"
10
- }
11
- };
@@ -1,14 +0,0 @@
1
- import type { ApiTool } from "../../connectors/api-connector.js";
2
- import type { ConnectorContext, CredentialTestResult } from "../../types.js";
3
- import { type RestVendor } from "../_shared/rest/tools.js";
4
- /** Which Stripe environment a key reaches. */
5
- export type StripeMode = "production" | "sandbox";
6
- /** Stripe's REST origin. */
7
- export declare const STRIPE_API_BASE_URL = "https://api.stripe.com";
8
- export interface StripeRest {
9
- vendor: RestVendor;
10
- tools: ApiTool[];
11
- testCredential(value: string, ctx: ConnectorContext): Promise<CredentialTestResult>;
12
- }
13
- /** Stripe's REST vendor, its named tools, and its credential test, for one mode. */
14
- export declare function stripeRest(mode: StripeMode, connectedAccount: string | undefined): StripeRest;
@@ -1,402 +0,0 @@
1
- import { retryAfterMs } from "../../connectors/guarded-fetch.js";
2
- import { ConnectorCallError } from "../../errors.js";
3
- import { OperationIndex } from "../_shared/rest/operation-index.js";
4
- import { callRest, restCall, restTransport, } from "../_shared/rest/tools.js";
5
- import { valueSafety, withholdEmbeddedUrlsIn, refuseWithheldLinks } from "../_shared/rest/value-safety.js";
6
- import { openapi } from "./openapi.generated.js";
7
- import { STRIPE_VALUE_SAFETY } from "./value-safety.js";
8
- /** Stripe's REST origin. */
9
- export const STRIPE_API_BASE_URL = "https://api.stripe.com";
10
- const FILES_ORIGIN = "https://files.stripe.com";
11
- const METER_EVENTS_ORIGIN = "https://meter-events.stripe.com";
12
- const MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
13
- const READ_CAP_MS = 60_000;
14
- /**
15
- * POSTs that only read, admitted by `stripe_api_read`. `POST
16
- * /v1/tax/calculations` is deliberately absent: it persists a Calculation
17
- * object a later Tax Transaction can reference, and Stripe bills each call.
18
- */
19
- const READ_POSTS = [
20
- ["POST", "/v1/invoices/create_preview", "Computes an upcoming invoice; Stripe persists nothing."],
21
- ];
22
- function record(value) {
23
- return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
24
- }
25
- function text(value) {
26
- return typeof value === "string" && value.trim() !== "" ? value : undefined;
27
- }
28
- function invalid(message) {
29
- throw new ConnectorCallError("invalid_args", message);
30
- }
31
- /**
32
- * Why this key cannot serve a connector declared for `mode`, or undefined.
33
- * The key's own prefix carries its mode, so a live key in a sandbox
34
- * connector (or the reverse) is refused before any request leaves.
35
- */
36
- function stripeKeyProblem(key, mode) {
37
- if (/^(?:sk|rk)_org_/.test(key)) {
38
- return "This is a Stripe organization key, which needs a Stripe-Context header this connector does not send. Use one account's secret or restricted key.";
39
- }
40
- if (key.startsWith("pk_")) {
41
- return "This is a publishable key; the Stripe API needs a secret (sk_) or restricted (rk_) key.";
42
- }
43
- const prefix = /^(?:sk|rk)_(live|test)_\S+$/.exec(key);
44
- if (!prefix)
45
- return "This is not a Stripe secret (sk_…) or restricted (rk_…) key.";
46
- const keyMode = prefix[1] === "live" ? "production" : "sandbox";
47
- if (keyMode !== mode) {
48
- return `This connector is declared ${mode}, but the configured key is a ${prefix[1]}-mode key.`;
49
- }
50
- return undefined;
51
- }
52
- /** Flatten one value Stripe's way: `a[b]=`, indexed arrays, `""` to unset. */
53
- function flatten(key, value, emit, emptyArrays) {
54
- if (value === undefined)
55
- return;
56
- if (value === null || value === "")
57
- return emit(key, "");
58
- if (Array.isArray(value)) {
59
- if (value.length === 0) {
60
- if (emptyArrays)
61
- emit(key, "");
62
- return;
63
- }
64
- value.forEach((item, index) => flatten(`${key}[${index}]`, item, emit, emptyArrays));
65
- return;
66
- }
67
- if (typeof value === "object") {
68
- for (const [name, item] of Object.entries(value))
69
- flatten(`${key}[${name}]`, item, emit, emptyArrays);
70
- return;
71
- }
72
- if (typeof value === "boolean")
73
- return emit(key, value ? "true" : "false");
74
- if (typeof value === "number" && Number.isFinite(value))
75
- return emit(key, String(value));
76
- if (typeof value === "string")
77
- return emit(key, value);
78
- invalid(`Stripe parameter ${key} must be a string, number, boolean, object, list, or null.`);
79
- }
80
- /**
81
- * A v1 form body: nested objects as `a[b]`, arrays indexed `a[0]`, booleans
82
- * as `true`/`false`, and `null`, `""`, or `[]` as an empty value, which is
83
- * how Stripe unsets a field.
84
- */
85
- function stripeForm(body) {
86
- const form = new URLSearchParams();
87
- for (const [key, value] of Object.entries(body))
88
- flatten(key, value, (name, item) => form.append(name, item), true);
89
- return form.toString();
90
- }
91
- /**
92
- * Query parameters. v1 indexes arrays (`expand[0]=…`) like its bodies; v2
93
- * repeats the key for a list of scalars (`include=a&include=b`), as Stripe's
94
- * own libraries do. Objects use brackets in both.
95
- */
96
- function stripeQuery(query, v2) {
97
- const out = {};
98
- for (const [key, value] of Object.entries(query)) {
99
- const scalars = Array.isArray(value) && value.every((item) => ["string", "number", "boolean"].includes(typeof item));
100
- if (v2 && scalars && value.length > 0) {
101
- out[key] = value.map((item) => (typeof item === "boolean" ? (item ? "true" : "false") : String(item)));
102
- continue;
103
- }
104
- flatten(key, value, (name, item) => (out[name] = item), false);
105
- }
106
- return out;
107
- }
108
- function expansions(call) {
109
- const read = (value) => typeof value === "string"
110
- ? [value]
111
- : Array.isArray(value)
112
- ? value.filter((item) => typeof item === "string")
113
- : [];
114
- return [...read(call.query["expand"]), ...read(record(call.body)["expand"])];
115
- }
116
- /**
117
- * Reviewed refusals that depend on arguments; the value-safety table
118
- * (`value-safety.ts`) refuses whole operations. Each expansion returns a
119
- * secret the caller could not otherwise read through Connecta: a Stripe Apps
120
- * secret's value, or a full Issuing card number or CVC, which an Issuing
121
- * authorization, transaction, or token can embed as well as the card itself.
122
- */
123
- function refuse(call) {
124
- const expanded = expansions(call);
125
- if (/^\/v1\/apps\/secrets(?:\/|$)/.test(call.path) && expanded.some((path) => /(?:^|\.)payload$/.test(path))) {
126
- return "Stripe Apps secret values are not returned through Connecta. Read the secret's metadata without expanding payload.";
127
- }
128
- if (/^\/v1\/(?:test_helpers\/)?issuing\//.test(call.path) &&
129
- expanded.some((path) => /(?:^|\.)(?:number|cvc)$/.test(path))) {
130
- return "Issuing card numbers and CVCs are not expanded through Connecta. Use the card id and last4, or the Stripe Dashboard.";
131
- }
132
- return undefined;
133
- }
134
- /**
135
- * Map a Stripe failure by the caller's next move (H11). For an operation the
136
- * value-safety review withholds (`withheld`), Stripe's message is replaced:
137
- * the type, code, decline code, and param still route.
138
- */
139
- function stripeFailure(status, headers, body, withheld = false) {
140
- const error = record(record(withholdEmbeddedUrlsIn(body))["error"]);
141
- const code = text(error["code"]);
142
- const kind = [text(error["type"]), code, text(error["decline_code"])].filter(Boolean).join(" ");
143
- const param = text(error["param"]);
144
- const requestId = headers.get("request-id");
145
- const message = withheld
146
- ? "Stripe's message is withheld because this operation handles credentials."
147
- : (text(error["message"]) ?? `Stripe returned HTTP ${status}.`);
148
- const detail = `Stripe ${kind || `HTTP ${status}`}${param ? ` (param ${param})` : ""}: ` +
149
- `${message}${requestId ? ` Request ${requestId}.` : ""}`;
150
- if (status === 429) {
151
- if (code === "lock_timeout") {
152
- // Stripe did not process the request (docs.stripe.com/rate-limits#object-lock-timeouts):
153
- // a definite conflict, safe to retry once the other request finishes.
154
- return new ConnectorCallError("conflict", `${detail} Another request is changing this object and Stripe did not process this one; retry after it finishes. This is a lock conflict, not a rate limit.`, { retryable: true, retryAfterMs: 1_000 });
155
- }
156
- const reason = headers.get("stripe-rate-limited-reason");
157
- return new ConnectorCallError("rate_limited", `${detail}${reason ? ` Limited by ${reason}.` : ""} Back off before retrying.`, { retryAfterMs: retryAfterMs(headers) ?? 1_000 });
158
- }
159
- if (status === 401) {
160
- return new ConnectorCallError("auth_required", `${detail} The configured Stripe key was rejected; an operator must replace it in this connection.`);
161
- }
162
- if (status === 403) {
163
- return new ConnectorCallError("provider_permission_denied", `${detail} A restricted key lacks this permission; an operator must grant it on the key or use another key.`);
164
- }
165
- if (status === 404)
166
- return new ConnectorCallError("not_found", `${detail} Resolve the id with a list or search read.`);
167
- if (status === 400 || status === 409 || status === 422)
168
- return new ConnectorCallError("invalid_args", detail);
169
- if (status === 402)
170
- return new ConnectorCallError("connector_call_failed", detail, { retryable: false });
171
- if (status === 424 || status >= 500)
172
- return new ConnectorCallError("unavailable", detail);
173
- return new ConnectorCallError("connector_call_failed", detail, { retryable: false });
174
- }
175
- /** Cursors: v1 lists, search results, and v2 lists each spell the next page differently. */
176
- function page(data, call) {
177
- const body = record(data);
178
- if (body["object"] === "list" && Array.isArray(body["data"])) {
179
- const backward = call.query["ending_before"] !== undefined;
180
- const items = body["data"];
181
- const edge = record(backward ? items[0] : items[items.length - 1])["id"];
182
- const hasMore = body["has_more"] === true;
183
- return {
184
- hasMore,
185
- ...(hasMore && typeof edge === "string"
186
- ? { next: edge, param: backward ? "ending_before" : "starting_after" }
187
- : {}),
188
- };
189
- }
190
- if (body["object"] === "search_result") {
191
- const next = text(body["next_page"]);
192
- return { hasMore: body["has_more"] === true, ...(next ? { next, param: "page" } : {}) };
193
- }
194
- if (Array.isArray(body["data"]) && "next_page_url" in body) {
195
- const url = text(body["next_page_url"]);
196
- let next = null;
197
- try {
198
- next = url ? new URL(url, STRIPE_API_BASE_URL).searchParams.get("page") : null;
199
- }
200
- catch {
201
- next = null;
202
- }
203
- return { hasMore: url !== undefined, ...(next ? { next, param: "page" } : {}) };
204
- }
205
- return undefined;
206
- }
207
- /** The pinned index, shared by every Stripe REST connector in the deployment. */
208
- let index;
209
- function stripeIndex() {
210
- index ??= new OperationIndex(openapi, { vendor: "stripe", title: "Stripe" });
211
- return index;
212
- }
213
- /** The reviewed value-safety table over the pinned index. */
214
- const SAFETY = valueSafety(STRIPE_VALUE_SAFETY, () => stripeIndex());
215
- /** Stripe's REST vendor, its named tools, and its credential test, for one mode. */
216
- export function stripeRest(mode, connectedAccount) {
217
- const operations = stripeIndex();
218
- const transports = new Map();
219
- const transport = (origin) => {
220
- let send = transports.get(origin);
221
- if (!send) {
222
- send = restTransport({
223
- provider: "Stripe",
224
- baseUrl: origin,
225
- maxResponseBytes: MAX_RESPONSE_BYTES,
226
- timeoutMs: READ_CAP_MS,
227
- authenticate: async (ctx) => {
228
- const key = (await ctx.credential?.get())?.trim();
229
- if (!key) {
230
- throw new ConnectorCallError("auth_required", "No Stripe key is configured for this connector. An operator must add one in this connection in the operator UI.");
231
- }
232
- const problem = stripeKeyProblem(key, mode);
233
- if (problem) {
234
- throw new ConnectorCallError("auth_required", `${problem} An operator must replace this connector's key.`);
235
- }
236
- return { Authorization: `Bearer ${key}` };
237
- },
238
- });
239
- transports.set(origin, send);
240
- }
241
- return send;
242
- };
243
- const encode = (call) => {
244
- const v2 = call.path.startsWith("/v2/");
245
- const headers = { "Stripe-Version": operations.version };
246
- // v2 names the acting account with Stripe-Context; v1 with Stripe-Account.
247
- if (connectedAccount)
248
- headers[v2 ? "Stripe-Context" : "Stripe-Account"] = connectedAccount;
249
- const query = stripeQuery(call.query, v2);
250
- if (call.body === undefined)
251
- return { query, headers };
252
- if (v2)
253
- return { query, headers, body: call.body };
254
- if (typeof call.body !== "object" || call.body === null || Array.isArray(call.body)) {
255
- invalid("A Stripe v1 body is an object of parameters.");
256
- }
257
- return {
258
- query,
259
- headers: { ...headers, "Content-Type": "application/x-www-form-urlencoded" },
260
- rawBody: stripeForm(call.body),
261
- };
262
- };
263
- const vendor = {
264
- vendor: "stripe",
265
- title: "Stripe",
266
- index: operations,
267
- transport(server) {
268
- if (server === undefined)
269
- return transport(STRIPE_API_BASE_URL);
270
- if (server === FILES_ORIGIN)
271
- return transport(FILES_ORIGIN);
272
- if (server === METER_EVENTS_ORIGIN) {
273
- return "The meter event stream takes a short-lived meter event session token, not an API key. Send single events with POST /v2/billing/meter_events.";
274
- }
275
- return `This operation is served from ${server}, which this connector does not reach.`;
276
- },
277
- failure: (status, headers, body, call) => stripeFailure(status, headers, body, call ? SAFETY.withholdsErrors(call.op) : false),
278
- readPosts: READ_POSTS,
279
- valueSafety: SAFETY,
280
- admit(call) {
281
- if (call.method === "GET" ||
282
- call.method === "HEAD" ||
283
- READ_POSTS.some(([method, path]) => method === call.method && path === call.op.path))
284
- return;
285
- refuseWithheldLinks([call.body, call.query, call.path], "Stripe");
286
- },
287
- refuse,
288
- encode,
289
- page,
290
- idempotencyHeader: "Idempotency-Key",
291
- upload: "Upload files in the Stripe Dashboard; this connector sends no multipart bodies.",
292
- bodyHint: "v1 bodies are form-encoded for you, v2 bodies sent as JSON",
293
- };
294
- const livemode = mode === "production";
295
- const tools = [
296
- {
297
- name: "get_stripe_account_info",
298
- description: "Read the Stripe account this key reaches: id, name, country, default currency, mode, and connected account. Use it to confirm scope first.",
299
- annotations: { readOnlyHint: true },
300
- inputSchema: { type: "object", properties: {}, required: [], additionalProperties: false },
301
- outputSchema: {
302
- type: "object",
303
- properties: {
304
- accountId: { type: "string" },
305
- name: { type: ["string", "null"] },
306
- country: { type: ["string", "null"] },
307
- defaultCurrency: { type: ["string", "null"] },
308
- mode: { type: "string", enum: ["production", "sandbox"] },
309
- livemode: { type: "boolean" },
310
- connectedAccount: { type: ["string", "null"], description: "Set when every call acts as this account." },
311
- chargesEnabled: { type: ["boolean", "null"] },
312
- payoutsEnabled: { type: ["boolean", "null"] },
313
- },
314
- required: ["accountId", "mode", "livemode", "connectedAccount"],
315
- },
316
- handler: async (_args, ctx) => {
317
- const { data } = await callRest(vendor, restCall(vendor, "GET", "/v1/account"), ctx);
318
- const account = record(data);
319
- const profile = record(account["business_profile"]);
320
- const dashboard = record(record(account["settings"])["dashboard"]);
321
- return {
322
- accountId: String(account["id"] ?? ""),
323
- name: text(profile["name"]) ?? text(dashboard["display_name"]) ?? null,
324
- country: text(account["country"]) ?? null,
325
- defaultCurrency: text(account["default_currency"]) ?? null,
326
- mode,
327
- livemode,
328
- connectedAccount: connectedAccount ?? null,
329
- chargesEnabled: typeof account["charges_enabled"] === "boolean" ? account["charges_enabled"] : null,
330
- payoutsEnabled: typeof account["payouts_enabled"] === "boolean" ? account["payouts_enabled"] : null,
331
- };
332
- },
333
- },
334
- {
335
- name: "get_balance_summary",
336
- description: "Read the account's available and pending Stripe balance per currency, in minor units. Excludes balance transactions; list those with stripe_api_read.",
337
- annotations: { readOnlyHint: true },
338
- inputSchema: { type: "object", properties: {}, required: [], additionalProperties: false },
339
- outputSchema: {
340
- type: "object",
341
- properties: {
342
- livemode: { type: "boolean" },
343
- available: { type: "array", description: "Funds available to pay out, per currency." },
344
- pending: { type: "array", description: "Funds not yet available, per currency." },
345
- instantAvailable: { type: "array" },
346
- connectReserved: { type: "array" },
347
- },
348
- required: ["livemode", "available", "pending"],
349
- },
350
- handler: async (_args, ctx) => {
351
- const { data } = await callRest(vendor, restCall(vendor, "GET", "/v1/balance"), ctx);
352
- const balance = record(data);
353
- const amounts = (value) => Array.isArray(value)
354
- ? value.map((entry) => ({ amount: record(entry)["amount"], currency: record(entry)["currency"] }))
355
- : [];
356
- return {
357
- livemode: balance["livemode"] === true,
358
- available: amounts(balance["available"]),
359
- pending: amounts(balance["pending"]),
360
- ...(Array.isArray(balance["instant_available"])
361
- ? { instantAvailable: amounts(balance["instant_available"]) }
362
- : {}),
363
- ...(Array.isArray(balance["connect_reserved"])
364
- ? { connectReserved: amounts(balance["connect_reserved"]) }
365
- : {}),
366
- };
367
- },
368
- },
369
- ];
370
- return {
371
- vendor,
372
- tools,
373
- async testCredential(value, ctx) {
374
- const key = value.trim();
375
- const problem = stripeKeyProblem(key, mode);
376
- if (problem)
377
- return { ok: false, message: problem };
378
- try {
379
- const { data } = await callRest(vendor, restCall(vendor, "GET", "/v1/account"), {
380
- ...ctx,
381
- credential: { get: async () => key, getAll: async () => ({ value: key }) },
382
- });
383
- const account = record(data);
384
- const name = text(record(account["business_profile"])["name"]);
385
- return {
386
- ok: true,
387
- message: `Authenticated to ${String(account["id"] ?? "the Stripe account")}${name ? ` (${name})` : ""} with a ${livemode ? "live" : "test"}-mode key.`,
388
- };
389
- }
390
- catch (error) {
391
- if (error instanceof ConnectorCallError && error.code === "provider_permission_denied") {
392
- // Stripe authenticated the key; only the account read is outside its permissions.
393
- return {
394
- ok: true,
395
- message: `Stripe accepted the ${livemode ? "live" : "test"}-mode key; it cannot read the account object, which only get_stripe_account_info needs.`,
396
- };
397
- }
398
- return { ok: false, message: error instanceof ConnectorCallError ? error.message : "Stripe rejected the key." };
399
- }
400
- },
401
- };
402
- }
@@ -1,20 +0,0 @@
1
- import type { ApiTool } from "../../connectors/api-connector.js";
2
- import type { ConnectorContext, CredentialTestResult } from "../../types.js";
3
- import { type RestVendor } from "../_shared/rest/tools.js";
4
- /** Vercel's public REST origin. Override only for a proxy or test double. */
5
- export declare const VERCEL_API_BASE_URL = "https://api.vercel.com";
6
- /**
7
- * Items of a possibly cut-off JSON array, or complete NDJSON lines: a bounded
8
- * log read stops mid-body, and the rows it finished are still the answer.
9
- */
10
- export declare function completeRows(body: string): unknown[];
11
- export interface VercelRest {
12
- vendor: RestVendor;
13
- tools: ApiTool[];
14
- testCredential(value: string, ctx: ConnectorContext): Promise<CredentialTestResult>;
15
- }
16
- /** Vercel's REST vendor, its named tools, and its credential test, for one connection. */
17
- export declare function vercelRest(options: {
18
- baseUrl: string;
19
- teamId: string | undefined;
20
- }): VercelRest;