@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
@@ -0,0 +1,642 @@
1
+ // Curated Vercel metadata and bounded logs through kit-owned call services.
2
+ import { Effect, Schema } from "effect";
3
+ import { ConnectorCallError } from "../../errors.js";
4
+ import { Refusal } from "../../http/errors.js";
5
+ import { read, write, list } from "../../http/tools.js";
6
+ import { fieldsProblem, selectFields } from "../../http/fields.js";
7
+ import { vercelPage } from "../../http/hatch-paging.js";
8
+ import { schema, typedParams } from "../_shared/rest/kit.js";
9
+ import { refuseWithheldUpload } from "../_shared/rest/value-safety.js";
10
+ import { rowStop } from "./lib/logs.js";
11
+ import { checked } from "../_shared/rest/kit.js";
12
+ import { admit, compact, defaultTeam, isRecord, invalid, named, queryOf, queryPairs, record, reviewedCode, restCall, text, vercelIndex, refuse, checkServer, } from "./api.js";
13
+ import { pinOptions, readPinnedTeam, PIN_WRITE_STEPS } from "./lib/pin.js";
14
+ const MAX_LOG_BYTES = 1024 * 1024;
15
+ const MAX_LOG_TEXT = 4_000;
16
+ const MAX_UPLOAD_BYTES = 8 * 1024 * 1024;
17
+ function promise(run) {
18
+ return Effect.tryPromise({ try: run, catch: (error) => error }).pipe(Effect.catch((error) => error instanceof ConnectorCallError ? Effect.fail(new Refusal({ error })) : Effect.die(error)));
19
+ }
20
+ function clamp(value) {
21
+ if (typeof value !== "string")
22
+ return {};
23
+ return value.length > MAX_LOG_TEXT ? { text: value.slice(0, MAX_LOG_TEXT) } : { text: value };
24
+ }
25
+ const TEAM_ID = {
26
+ type: ["string", "null"],
27
+ minLength: 1,
28
+ description: "Vercel team id. Omit for the connection's default; null for the token owner's personal account.",
29
+ };
30
+ const PROJECT_ID = { type: "string", minLength: 1, description: "Project id or name." };
31
+ const ENV_VAR_ID = {
32
+ type: "string",
33
+ minLength: 1,
34
+ description: "Environment-variable id from list_project_env_vars.",
35
+ };
36
+ const TARGETS = {
37
+ type: "array",
38
+ minItems: 1,
39
+ uniqueItems: true,
40
+ items: {
41
+ type: "string",
42
+ enum: ["production", "preview", "development"],
43
+ description: "A default Vercel environment.",
44
+ },
45
+ description: "Default Vercel environments that receive this value.",
46
+ };
47
+ const CUSTOM_ENVIRONMENT_IDS = {
48
+ type: "array",
49
+ uniqueItems: true,
50
+ items: { type: "string", minLength: 1, description: "A custom environment id." },
51
+ description: "Custom environment ids that receive this value.",
52
+ };
53
+ const ENV_SCHEMA = {
54
+ type: "object",
55
+ properties: {
56
+ id: { type: "string" },
57
+ key: { type: "string" },
58
+ type: { type: "string" },
59
+ target: { type: ["array", "string"], items: { type: "string" } },
60
+ gitBranch: { type: ["string", "null"] },
61
+ customEnvironmentIds: { type: "array", items: { type: "string" } },
62
+ comment: { type: "string" },
63
+ createdAt: { type: "number" },
64
+ updatedAt: { type: "number" },
65
+ },
66
+ required: ["id", "key", "type"],
67
+ };
68
+ /** Deliberately omits `value`, even though redaction already removed it. */
69
+ function envMetadata(value) {
70
+ const variable = record(value);
71
+ return compact({
72
+ id: variable["id"],
73
+ key: variable["key"],
74
+ type: variable["type"],
75
+ target: variable["target"],
76
+ gitBranch: variable["gitBranch"],
77
+ customEnvironmentIds: variable["customEnvironmentIds"],
78
+ comment: variable["comment"],
79
+ createdAt: variable["createdAt"],
80
+ updatedAt: variable["updatedAt"],
81
+ });
82
+ }
83
+ function closed(properties, required) {
84
+ return { type: "object", properties, required, additionalProperties: false };
85
+ }
86
+ function segment(value) {
87
+ return encodeURIComponent(String(value));
88
+ }
89
+ function decodeUpload(args) {
90
+ const hasText = typeof args["textBody"] === "string";
91
+ const hasBase64 = typeof args["base64Body"] === "string";
92
+ if (hasText === hasBase64)
93
+ invalid("Provide exactly one of textBody or base64Body for a Vercel upload.");
94
+ let bytes;
95
+ if (hasText)
96
+ bytes = new TextEncoder().encode(args["textBody"]);
97
+ else {
98
+ try {
99
+ bytes = Uint8Array.from(atob(args["base64Body"]), (character) => character.charCodeAt(0));
100
+ }
101
+ catch {
102
+ return invalid("base64Body is not valid base64.");
103
+ }
104
+ }
105
+ if (bytes.length > MAX_UPLOAD_BYTES)
106
+ invalid(`A Vercel upload through Connecta is at most ${MAX_UPLOAD_BYTES} bytes.`);
107
+ return bytes;
108
+ }
109
+ async function sha1(bytes) {
110
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-1", bytes));
111
+ return [...digest].map((byte) => byte.toString(16).padStart(2, "0")).join("");
112
+ }
113
+ export function vercelTools({ connection, options, }) {
114
+ options = pinOptions(options);
115
+ const teamId = defaultTeam(options);
116
+ const makeCall = (method, path, input = {}) => restCall(method, path, input, teamId, options.pin);
117
+ const send = (method, path, input = {}) => checked(() => makeCall(method, path, input)).pipe(Effect.flatMap((call) => {
118
+ const operation = named.find((op) => op.method === call.method && op.path.replace(/:([^/]+)/g, "{$1}") === call.op.path);
119
+ if (!operation)
120
+ throw new Error("A named Vercel call has no declared operation.");
121
+ return admit(call, connection, options).pipe(Effect.flatMap(() => connection.send(operation, {
122
+ params: typedParams(call.params),
123
+ query: queryOf(call),
124
+ payload: call.body,
125
+ })), Effect.map((answer) => {
126
+ return { ...answer, data: answer.data ?? null };
127
+ }));
128
+ }));
129
+ const boundedRows = (call, limits) => {
130
+ const operation = named.find((op) => op.method === call.method && op.path.replace(/:([^/]+)/g, "{$1}") === call.op.path);
131
+ return admit(call, connection, options).pipe(Effect.flatMap(() => connection
132
+ .send(operation, { params: typedParams(call.params), query: queryOf(call), payload: undefined }, {
133
+ flags: { log: true },
134
+ prefix: { maxBytes: MAX_LOG_BYTES, timeoutMs: limits.waitMs, stop: rowStop(limits) },
135
+ })
136
+ .pipe(Effect.map((answer) => ({
137
+ rows: Array.isArray(answer.data) ? answer.data : [],
138
+ stopped: answer.prefix?.stopped === "stop" ? "rows" : (answer.prefix?.stopped ?? "end"),
139
+ })))));
140
+ };
141
+ const declarations = [
142
+ {
143
+ name: "list_project_env_vars",
144
+ description: "List a project's environment-variable metadata without decrypting or returning values: keys, types, targets, branches, and custom environments.",
145
+ annotations: { readOnlyHint: true },
146
+ inputSchema: closed({
147
+ projectId: PROJECT_ID,
148
+ teamId: TEAM_ID,
149
+ slug: {
150
+ type: "string",
151
+ minLength: 1,
152
+ description: "Team slug; overrides the routing default when teamId is omitted.",
153
+ },
154
+ gitBranch: { type: "string", description: "Preview branch filter." },
155
+ customEnvironmentId: { type: "string", description: "Custom environment filter." },
156
+ fields: {
157
+ type: "array",
158
+ maxItems: 50,
159
+ items: { type: "string", minLength: 1, maxLength: 200 },
160
+ description: "Dot paths to keep in each metadata item; values cannot be restored.",
161
+ },
162
+ }, ["projectId"]),
163
+ outputSchema: {
164
+ type: "object",
165
+ properties: {
166
+ items: { type: "array", items: { ...ENV_SCHEMA, required: [] } },
167
+ page: { type: "object", properties: { hasMore: { enum: [false], type: "boolean" } }, required: ["hasMore"] },
168
+ },
169
+ required: ["items", "page"],
170
+ },
171
+ run: (args) => Effect.gen(function* () {
172
+ const fields = args["fields"];
173
+ const problem = fieldsProblem(fields, new Set(Object.keys(ENV_SCHEMA.properties)), "an environment metadata item");
174
+ if (problem)
175
+ throw problem;
176
+ const { data } = yield* send("GET", `/v10/projects/${segment(args["projectId"])}/env`, {
177
+ query: compact({
178
+ teamId: args["teamId"],
179
+ slug: args["slug"],
180
+ gitBranch: args["gitBranch"],
181
+ customEnvironmentId: args["customEnvironmentId"],
182
+ decrypt: "false",
183
+ }),
184
+ });
185
+ const envs = record(data)["envs"];
186
+ return {
187
+ items: selectFields((Array.isArray(envs) ? envs : []).map(envMetadata), fields),
188
+ page: { hasMore: false },
189
+ };
190
+ }),
191
+ },
192
+ {
193
+ name: "upsert_project_env_var",
194
+ description: "Create or replace one Vercel project environment variable. Changes affect only future deployments; returns metadata without the value.",
195
+ annotations: { readOnlyHint: false, destructiveHint: true },
196
+ inputSchema: closed({
197
+ projectId: PROJECT_ID,
198
+ teamId: TEAM_ID,
199
+ slug: {
200
+ type: "string",
201
+ minLength: 1,
202
+ description: "Team slug; overrides the routing default when teamId is omitted.",
203
+ },
204
+ key: { type: "string", minLength: 1, maxLength: 256, description: "Environment variable name." },
205
+ value: {
206
+ type: "string",
207
+ writeOnly: true,
208
+ maxLength: 65536,
209
+ description: "New value; write input only. Vercel caps a project's environment at 64 KB.",
210
+ },
211
+ type: {
212
+ type: "string",
213
+ enum: ["plain", "encrypted", "sensitive"],
214
+ description: "Storage type. Sensitive values cannot be read back.",
215
+ },
216
+ targets: TARGETS,
217
+ gitBranch: { type: "string", description: "Optional preview-only Git branch." },
218
+ customEnvironmentIds: CUSTOM_ENVIRONMENT_IDS,
219
+ comment: { type: "string", maxLength: 500, description: "Operator-facing note explaining the variable." },
220
+ upsert: {
221
+ type: "boolean",
222
+ description: "Defaults to true. False refuses to overwrite an existing variable.",
223
+ },
224
+ }, ["projectId", "key", "value", "type", "targets"]),
225
+ outputSchema: ENV_SCHEMA,
226
+ run: (args) => Effect.gen(function* () {
227
+ const { data } = yield* send("POST", `/v10/projects/${segment(args["projectId"])}/env`, {
228
+ query: compact({
229
+ slug: args["slug"],
230
+ teamId: args["teamId"],
231
+ upsert: args["upsert"] === false ? "false" : "true",
232
+ }),
233
+ body: compact({
234
+ key: args["key"],
235
+ value: args["value"],
236
+ type: args["type"],
237
+ target: args["targets"],
238
+ gitBranch: args["gitBranch"],
239
+ customEnvironmentIds: args["customEnvironmentIds"],
240
+ comment: args["comment"],
241
+ }),
242
+ });
243
+ const payload = record(data);
244
+ if (Array.isArray(payload["failed"]) && payload["failed"].length) {
245
+ const created = (Array.isArray(payload["created"]) ? payload["created"] : [payload["created"]]).map((item) => compact({ id: text(record(item)["id"]), key: text(record(item)["key"]) }));
246
+ const failed = payload["failed"].map((item) => compact({
247
+ key: text(record(item)["key"] ?? record(record(item)["error"])["key"]),
248
+ code: reviewedCode(record(record(item)["error"])["code"]) ?? "unclassified",
249
+ }));
250
+ return yield* Effect.fail(new Refusal({
251
+ error: new ConnectorCallError("connector_call_failed", `Vercel partially accepted the environment-variable write for sent key ${JSON.stringify(args["key"])}. Created entries: ${JSON.stringify(created)}. Failed entries: ${JSON.stringify(failed)}. Check the target before repeating it.`, { retryable: false, writeOutcome: "unknown" }),
252
+ }));
253
+ }
254
+ const created = Array.isArray(payload["created"]) ? payload["created"][0] : payload["created"];
255
+ return envMetadata(created ?? payload);
256
+ }),
257
+ },
258
+ {
259
+ name: "update_project_env_var",
260
+ description: "Update one Vercel project environment variable by id, sending only the fields that change. Deployments keep their previous values.",
261
+ annotations: { readOnlyHint: false, destructiveHint: true },
262
+ inputSchema: closed({
263
+ projectId: PROJECT_ID,
264
+ teamId: TEAM_ID,
265
+ slug: {
266
+ type: "string",
267
+ minLength: 1,
268
+ description: "Team slug; overrides the routing default when teamId is omitted.",
269
+ },
270
+ envVarId: ENV_VAR_ID,
271
+ key: { type: "string", minLength: 1, maxLength: 256, description: "Replacement variable name." },
272
+ value: {
273
+ type: "string",
274
+ writeOnly: true,
275
+ maxLength: 65536,
276
+ description: "Replacement value; write input only.",
277
+ },
278
+ type: { type: "string", enum: ["plain", "encrypted", "sensitive"], description: "Replacement storage type." },
279
+ targets: { ...TARGETS, description: "Replacement default environments." },
280
+ gitBranch: { type: ["string", "null"], description: "Replacement preview branch, or null to clear it." },
281
+ customEnvironmentIds: { ...CUSTOM_ENVIRONMENT_IDS, description: "Replacement custom environment ids." },
282
+ comment: { type: "string", maxLength: 500, description: "Replacement operator-facing note." },
283
+ }, ["projectId", "envVarId"]),
284
+ outputSchema: ENV_SCHEMA,
285
+ run: (args) => Effect.gen(function* () {
286
+ const body = compact({
287
+ key: args["key"],
288
+ value: args["value"],
289
+ type: args["type"],
290
+ target: args["targets"],
291
+ gitBranch: args["gitBranch"],
292
+ customEnvironmentIds: args["customEnvironmentIds"],
293
+ comment: args["comment"],
294
+ });
295
+ if (Object.keys(body).length === 0) {
296
+ invalid("Nothing to update: provide key, value, type, targets, gitBranch, customEnvironmentIds, or comment.");
297
+ }
298
+ const { data } = yield* send("PATCH", `/v9/projects/${segment(args["projectId"])}/env/${segment(args["envVarId"])}`, { query: compact({ slug: args["slug"], teamId: args["teamId"] }), body });
299
+ return envMetadata(data);
300
+ }),
301
+ },
302
+ {
303
+ name: "get_deployment_build_logs",
304
+ description: "Read a deployment's build events and log lines, without following live output. Bounded by limit and 1 MB; filter by build, time, or direction.",
305
+ annotations: { readOnlyHint: true },
306
+ inputSchema: closed({
307
+ deploymentId: { type: "string", minLength: 1, description: "Deployment id (dpl_…) or hostname." },
308
+ teamId: TEAM_ID,
309
+ slug: {
310
+ type: "string",
311
+ minLength: 1,
312
+ description: "Team slug; overrides the routing default when teamId is omitted.",
313
+ },
314
+ buildId: { type: "string", minLength: 1, description: "Only this build's events (bld_…)." },
315
+ direction: {
316
+ type: "string",
317
+ enum: ["forward", "backward"],
318
+ description: "forward (default) reads oldest first; backward reads the newest first.",
319
+ },
320
+ limit: { type: "integer", minimum: 1, maximum: 2000, description: "Most events; default 200." },
321
+ since: { type: "number", description: "Only events at or after this millisecond timestamp." },
322
+ until: { type: "number", description: "Only events at or before this millisecond timestamp." },
323
+ }, ["deploymentId"]),
324
+ outputSchema: {
325
+ type: "object",
326
+ properties: {
327
+ events: {
328
+ type: "array",
329
+ items: {
330
+ type: "object",
331
+ properties: {
332
+ created: { type: "number" },
333
+ type: { type: "string", description: "stdout, stderr, command, exit, deployment-state, and so on." },
334
+ text: { type: "string" },
335
+ info: {
336
+ type: "object",
337
+ properties: Object.fromEntries(["type", "name", "step", "entrypoint", "path", "readyState"].map((name) => [
338
+ name,
339
+ { type: "string" },
340
+ ])),
341
+ description: "Build step, entrypoint, and path when Vercel sends them.",
342
+ },
343
+ },
344
+ },
345
+ },
346
+ truncated: {
347
+ type: "array",
348
+ items: { type: "string" },
349
+ description: "Dot paths cut for size or by the bounded prefix, including events[] and events[].text.",
350
+ },
351
+ },
352
+ required: ["events", "truncated"],
353
+ },
354
+ run: (args) => Effect.gen(function* () {
355
+ const call = makeCall("GET", `/v3/deployments/${segment(args["deploymentId"])}/events`, {
356
+ query: compact({
357
+ teamId: args["teamId"],
358
+ slug: args["slug"],
359
+ name: args["buildId"],
360
+ direction: args["direction"],
361
+ limit: args["limit"] ?? 200,
362
+ since: args["since"],
363
+ until: args["until"],
364
+ follow: 0,
365
+ }),
366
+ });
367
+ const { rows, stopped } = yield* boundedRows(call, { waitMs: 20_000 });
368
+ return {
369
+ events: rows.map((row) => {
370
+ const event = record(row);
371
+ const payload = record(event["payload"]);
372
+ const raw = isRecord(payload["info"])
373
+ ? payload["info"]
374
+ : isRecord(event["info"])
375
+ ? event["info"]
376
+ : undefined;
377
+ const info = raw
378
+ ? compact({
379
+ type: text(raw["type"]),
380
+ name: text(raw["name"]),
381
+ step: text(raw["step"]),
382
+ entrypoint: text(raw["entrypoint"]),
383
+ path: text(raw["path"]),
384
+ readyState: text(raw["readyState"]),
385
+ })
386
+ : undefined;
387
+ return compact({
388
+ created: event["created"] ?? payload["created"] ?? payload["date"],
389
+ type: event["type"],
390
+ ...clamp(payload["text"] ?? event["text"]),
391
+ info,
392
+ });
393
+ }),
394
+ truncated: [
395
+ ...(stopped !== "end" ? ["events[]"] : []),
396
+ ...(rows.some((row) => {
397
+ const e = record(row);
398
+ return String(record(e["payload"])["text"] ?? e["text"] ?? "").length > MAX_LOG_TEXT;
399
+ })
400
+ ? ["events[].text"]
401
+ : []),
402
+ ],
403
+ };
404
+ }),
405
+ },
406
+ {
407
+ name: "get_runtime_logs",
408
+ description: "Collect a deployment's runtime log stream for at most waitMs or limit, then stop. Returns level, message, request path, and status per row.",
409
+ annotations: { readOnlyHint: true },
410
+ inputSchema: closed({
411
+ projectId: PROJECT_ID,
412
+ deploymentId: { type: "string", minLength: 1, description: "Deployment id (dpl_…)." },
413
+ teamId: TEAM_ID,
414
+ slug: {
415
+ type: "string",
416
+ minLength: 1,
417
+ description: "Team slug; overrides the routing default when teamId is omitted.",
418
+ },
419
+ waitMs: {
420
+ type: "integer",
421
+ minimum: 1000,
422
+ maximum: 20000,
423
+ description: "How long to collect the stream; default 5000.",
424
+ },
425
+ limit: { type: "integer", minimum: 1, maximum: 1000, description: "Most rows returned; default 200." },
426
+ levels: {
427
+ type: "array",
428
+ uniqueItems: true,
429
+ items: {
430
+ type: "string",
431
+ enum: ["debug", "info", "warning", "error", "fatal", "trace"],
432
+ description: "A log level to keep.",
433
+ },
434
+ description: "Keep only these levels.",
435
+ },
436
+ }, ["projectId", "deploymentId"]),
437
+ outputSchema: {
438
+ type: "object",
439
+ properties: {
440
+ logs: {
441
+ type: "array",
442
+ items: {
443
+ type: "object",
444
+ properties: {
445
+ timestampInMs: { type: "number" },
446
+ level: { type: "string" },
447
+ source: { type: "string" },
448
+ text: { type: "string" },
449
+ requestMethod: { type: "string" },
450
+ requestPath: { type: "string" },
451
+ responseStatusCode: { type: "number" },
452
+ domain: { type: "string" },
453
+ },
454
+ },
455
+ },
456
+ truncated: {
457
+ type: "array",
458
+ items: { type: "string" },
459
+ description: "Dot paths cut for size, including logs[] and logs[].text.",
460
+ },
461
+ stopped: {
462
+ type: "string",
463
+ enum: ["end", "time", "bytes", "rows"],
464
+ description: "Why collection stopped.",
465
+ },
466
+ },
467
+ required: ["logs", "stopped"],
468
+ },
469
+ run: (args) => Effect.gen(function* () {
470
+ const call = makeCall("GET", `/v1/projects/${segment(args["projectId"])}/deployments/${segment(args["deploymentId"])}/runtime-logs`, { query: compact({ slug: args["slug"], teamId: args["teamId"] }) });
471
+ const waitMs = typeof args["waitMs"] === "number" ? args["waitMs"] : 5_000;
472
+ const maxRows = typeof args["limit"] === "number" ? args["limit"] : 200;
473
+ const levels = Array.isArray(args["levels"]) ? new Set(args["levels"]) : undefined;
474
+ const keep = (row) => !levels || levels.has(record(row)["level"]);
475
+ const { rows, stopped } = yield* boundedRows(call, { waitMs, maxRows, accept: keep });
476
+ const logs = rows
477
+ .map(record)
478
+ .filter(keep)
479
+ .map((row) => compact({
480
+ timestampInMs: row["timestampInMs"],
481
+ level: row["level"],
482
+ source: row["source"],
483
+ ...clamp(row["message"]),
484
+ requestMethod: row["requestMethod"],
485
+ requestPath: row["requestPath"],
486
+ responseStatusCode: row["responseStatusCode"],
487
+ domain: row["domain"],
488
+ }));
489
+ return {
490
+ logs: logs.slice(0, maxRows),
491
+ stopped: logs.length > maxRows ? "rows" : stopped,
492
+ truncated: [
493
+ ...(logs.length > maxRows || stopped === "rows" || stopped === "bytes" ? ["logs[]"] : []),
494
+ ...(rows.some((row) => String(record(row)["message"] ?? "").length > MAX_LOG_TEXT)
495
+ ? ["logs[].text"]
496
+ : []),
497
+ ],
498
+ };
499
+ }),
500
+ },
501
+ {
502
+ name: "vercel_api_upload",
503
+ description: "Upload explicit text or base64 bytes to a Vercel octet-stream operation, such as POST /v2/files for deployment files. Reads no local files.",
504
+ annotations: { readOnlyHint: false, destructiveHint: true },
505
+ inputSchema: closed({
506
+ method: { type: "string", enum: ["POST", "PUT"], description: "The operation's HTTP method." },
507
+ path: {
508
+ type: "string",
509
+ minLength: 2,
510
+ maxLength: 2048,
511
+ description: "Concrete path of an octet-stream operation from vercel_api_search, e.g. /v2/files.",
512
+ },
513
+ query: { type: "object", description: "Query parameters as JSON, named as vercel_api_details lists them." },
514
+ contentType: {
515
+ type: "string",
516
+ minLength: 1,
517
+ maxLength: 200,
518
+ description: "Content-Type of the bytes; default application/octet-stream.",
519
+ },
520
+ textBody: { type: "string", description: "Raw UTF-8 body. Exclusive with base64Body." },
521
+ base64Body: { type: "string", description: "Base64-encoded bytes. Exclusive with textBody." },
522
+ }, ["method", "path"]),
523
+ outputSchema: {
524
+ type: "object",
525
+ properties: {
526
+ status: { type: "integer", description: "HTTP status." },
527
+ data: { description: "Vercel's response body." },
528
+ digest: { type: "string", description: "SHA-1 of the bytes, sent as x-vercel-digest for /v2/files." },
529
+ },
530
+ required: ["status", "data"],
531
+ },
532
+ run: (args) => Effect.gen(function* () {
533
+ const call = makeCall(args["method"], String(args["path"]), {
534
+ query: isRecord(args["query"]) ? args["query"] : {},
535
+ });
536
+ const server = checkServer(call.op.server);
537
+ if (server)
538
+ invalid(server);
539
+ const framing = vercelIndex.bodyType(call.op) ?? "";
540
+ if (!/octet-stream|^multipart\//.test(framing))
541
+ invalid(`${call.method} ${call.op.path} is not an upload; call it with vercel_api_write.`);
542
+ const refusal = refuse(call);
543
+ if (refusal)
544
+ invalid(refusal);
545
+ const bytes = decodeUpload(args);
546
+ yield* admit(call, connection, options);
547
+ yield* promise(() => refuseWithheldUpload(bytes, "Vercel"));
548
+ vercelIndex.check(call.op, call.query, String(args["base64Body"] ?? args["textBody"]));
549
+ const digest = call.op.path === "/v2/files" ? yield* promise(() => sha1(bytes)) : undefined;
550
+ const answer = yield* connection.sendPath({
551
+ method: call.method,
552
+ path: call.path,
553
+ template: call.op.path,
554
+ query: queryPairs(call),
555
+ headers: {
556
+ "Content-Type": typeof args["contentType"] === "string" ? args["contentType"] : "application/octet-stream",
557
+ ...(digest ? { "x-vercel-digest": digest } : {}),
558
+ },
559
+ rawBody: new Uint8Array(bytes),
560
+ }, { flags: { upload: true } });
561
+ return { status: answer.status, data: answer.data ?? null, ...(digest ? { digest } : {}) };
562
+ }),
563
+ },
564
+ ];
565
+ return [
566
+ list(connection, {
567
+ name: "list_teams",
568
+ description: options.pin
569
+ ? "Read the deployment's pinned team with its id and slug; returns one terminal item."
570
+ : "List the teams this token can reach, with ids/slugs for project joins. A configured team is a routing default, not a restriction.",
571
+ filters: {},
572
+ row: Schema.Struct({
573
+ id: Schema.String,
574
+ slug: Schema.String,
575
+ name: Schema.NullOr(Schema.String),
576
+ role: Schema.optionalKey(Schema.String),
577
+ }),
578
+ limit: { default: 20, max: 100, description: "Teams per page, default 20, maximum 100." },
579
+ cursor: "bound",
580
+ ...(options.pin ? { cursorScope: Object.freeze({ vercelTeamPin: options.pin.teamId }) } : {}),
581
+ page: (_args, cursor) => Effect.gen(function* () {
582
+ if (options.pin) {
583
+ if (cursor)
584
+ invalid("A pinned team list is terminal; omit cursor.");
585
+ const team = yield* readPinnedTeam(connection, options.pin);
586
+ return {
587
+ rows: [
588
+ {
589
+ id: options.pin.teamId,
590
+ slug: team["slug"],
591
+ name: text(team["name"]) ?? null,
592
+ ...(text(record(team["membership"])["role"])
593
+ ? { role: text(record(team["membership"])["role"]) }
594
+ : {}),
595
+ },
596
+ ],
597
+ page: { hasMore: false, nextCursor: null },
598
+ };
599
+ }
600
+ const result = yield* send("GET", "/v2/teams", {
601
+ query: { limit: _args.limit, ...(cursor ? { until: JSON.parse(cursor) } : {}) },
602
+ });
603
+ const body = record(result.data), next = vercelPage.next(body, { path: "/v2/teams", query: {}, headers: {} });
604
+ const rows = Array.isArray(body["teams"]) ? body["teams"] : [];
605
+ return {
606
+ rows: rows.map((team) => {
607
+ const e = record(team);
608
+ return {
609
+ id: String(e["id"]),
610
+ slug: String(e["slug"]),
611
+ name: text(e["name"]) ?? null,
612
+ ...(text(record(e["membership"])["role"]) ? { role: text(record(e["membership"])["role"]) } : {}),
613
+ };
614
+ }),
615
+ page: {
616
+ hasMore: next !== null && next !== undefined,
617
+ nextCursor: next === null || next === undefined || typeof next === "object" ? null : JSON.stringify(next),
618
+ },
619
+ };
620
+ }),
621
+ }),
622
+ ...declarations.map((declaration) => {
623
+ const spec = {
624
+ writeSteps: PIN_WRITE_STEPS,
625
+ name: declaration.name,
626
+ description: declaration.description,
627
+ input: schema(declaration.inputSchema),
628
+ output: schema(declaration.outputSchema),
629
+ run: (args) => declaration
630
+ .run(args)
631
+ .pipe(Effect.catchDefect((error) => error instanceof ConnectorCallError ? Effect.fail(new Refusal({ error })) : Effect.die(error))),
632
+ };
633
+ const tool = declaration.annotations.readOnlyHint
634
+ ? read(connection, {
635
+ ...spec,
636
+ ...(declaration.name === "list_project_env_vars" ? {} : { fields: true }),
637
+ })
638
+ : write(connection, { ...spec, destructive: true });
639
+ return tool;
640
+ }),
641
+ ];
642
+ }