@zackbart/connecta 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/CHANGELOG.md +393 -0
  2. package/README.md +62 -105
  3. package/SECURITY.md +3 -2
  4. package/bin/connecta.mjs +41 -16
  5. package/bin/version.mjs +1 -1
  6. package/dist/access-tokens.d.ts +2 -1
  7. package/dist/access-tokens.js +66 -30
  8. package/dist/activity.d.ts +1 -1
  9. package/dist/activity.js +2 -0
  10. package/dist/agent-config.d.ts +23 -0
  11. package/dist/agent-config.js +59 -0
  12. package/dist/agent-description.js +16 -0
  13. package/dist/agent-identity.js +4 -4
  14. package/dist/agent-observation.js +39 -0
  15. package/dist/auth/clerk-sdk/client.d.ts +2 -0
  16. package/dist/auth/clerk-sdk/generated.js +554 -563
  17. package/dist/auth/clerk-transport.js +70 -3
  18. package/dist/auth/clerk.d.ts +13 -0
  19. package/dist/auth/clerk.js +653 -246
  20. package/dist/auth/cloudflare-access.js +46 -42
  21. package/dist/auth/downstream-client-metadata.js +2 -2
  22. package/dist/auth/downstream-oauth.js +2051 -1160
  23. package/dist/auth/downstream-revocation.js +88 -88
  24. package/dist/auth/native-call.js +20 -0
  25. package/dist/auth/native.js +184 -0
  26. package/dist/auth/oauth-start-reset.js +11 -5
  27. package/dist/auth/oauth-token-response.js +121 -102
  28. package/dist/auth/oauth-v2-migration.js +97 -78
  29. package/dist/auth/renewable-grant.js +10 -0
  30. package/dist/auth/static-oauth.js +663 -271
  31. package/dist/auth/vercel-agent.js +266 -0
  32. package/dist/auth-admission.js +204 -0
  33. package/dist/auth-elicitation.js +350 -241
  34. package/dist/authorization-handoff.js +164 -90
  35. package/dist/call-admission-context.js +3 -10
  36. package/dist/call-admission.js +2 -0
  37. package/dist/call-classification.js +9 -0
  38. package/dist/call-recovery.js +32 -13
  39. package/dist/canonical-json.js +8 -0
  40. package/dist/catalog-cache.js +369 -213
  41. package/dist/catalog-service.js +659 -530
  42. package/dist/catalog.js +5 -1
  43. package/dist/concurrency.js +0 -25
  44. package/dist/config-defaults.d.ts +1 -0
  45. package/dist/config-defaults.js +1 -0
  46. package/dist/config-schema.d.ts +3 -1
  47. package/dist/config-schema.js +13 -3
  48. package/dist/config.d.ts +40 -6
  49. package/dist/config.js +40 -26
  50. package/dist/connector-caller.d.ts +4 -0
  51. package/dist/connector-caller.js +17 -4
  52. package/dist/connectors/api-connector.d.ts +15 -7
  53. package/dist/connectors/api-connector.js +147 -57
  54. package/dist/connectors/guarded-fetch.d.ts +51 -17
  55. package/dist/connectors/guarded-fetch.js +215 -121
  56. package/dist/connectors/negotiation-cache.js +20 -10
  57. package/dist/connectors/option-shapes.js +1 -1
  58. package/dist/connectors/remote-mcp.d.ts +12 -30
  59. package/dist/connectors/remote-mcp.js +960 -564
  60. package/dist/d1.js +10 -243
  61. package/dist/derived-context.js +5 -0
  62. package/dist/describe-config.d.ts +5 -1
  63. package/dist/describe-config.js +3 -0
  64. package/dist/downstream-input.js +347 -260
  65. package/dist/errors.d.ts +87 -6
  66. package/dist/errors.js +114 -4
  67. package/dist/execute.js +87 -50
  68. package/dist/executor-admission.js +3 -0
  69. package/dist/executors/quickjs.js +163 -112
  70. package/dist/guarded-transport.js +50 -0
  71. package/dist/guest-runtime.js +1 -1
  72. package/dist/http/client.js +439 -0
  73. package/dist/http/errors.js +558 -0
  74. package/dist/http/fields.js +49 -0
  75. package/dist/http/hatch-paging.js +318 -0
  76. package/dist/http/hatch.js +1279 -0
  77. package/dist/http/json-schema.js +267 -0
  78. package/dist/http/node-transport.js +241 -0
  79. package/dist/http/oauth.js +162 -0
  80. package/dist/http/paging.js +228 -0
  81. package/dist/http/provider.js +221 -0
  82. package/dist/http/safety.js +82 -0
  83. package/dist/http/services.js +79 -0
  84. package/dist/http/tools.js +383 -0
  85. package/dist/http/vendor-index.js +138 -0
  86. package/dist/http/vendor.js +448 -0
  87. package/dist/http/write-request.js +66 -0
  88. package/dist/http-policy.d.ts +11 -0
  89. package/dist/http-policy.js +45 -0
  90. package/dist/inbound-credential.js +1 -1
  91. package/dist/index.d.ts +2 -2
  92. package/dist/index.js +4 -0
  93. package/dist/invocation-auth.js +30 -19
  94. package/dist/invocation.js +221 -87
  95. package/dist/mcp-result.js +0 -4
  96. package/dist/membership.d.ts +4 -0
  97. package/dist/meta-output.js +1 -1
  98. package/dist/meta-tools.js +534 -408
  99. package/dist/native-recovery.js +52 -0
  100. package/dist/native-tools.js +382 -0
  101. package/dist/node.d.ts +4 -3
  102. package/dist/node.js +45 -8
  103. package/dist/oauth-handoff.js +177 -104
  104. package/dist/oauth-partition.js +6 -20
  105. package/dist/oauth-sealing.js +6 -7
  106. package/dist/operation-vocabulary.js +101 -0
  107. package/dist/operator-record.d.ts +2 -2
  108. package/dist/operator-record.js +17 -4
  109. package/dist/operator-ui/agents.d.ts +5 -4
  110. package/dist/operator-ui/agents.js +17 -7
  111. package/dist/operator-ui/config-summary.js +8 -4
  112. package/dist/operator-ui/connection-map.js +9 -6
  113. package/dist/operator-ui/contract.d.ts +7 -3
  114. package/dist/operator-ui/endpoints.js +5 -14
  115. package/dist/operator-ui/fix-prompts.d.ts +1 -1
  116. package/dist/operator-ui/fix-prompts.js +0 -8
  117. package/dist/operator-ui/generated.js +3 -3
  118. package/dist/operator-ui/health.js +52 -0
  119. package/dist/operator-ui/model.d.ts +2 -3
  120. package/dist/operator-ui/overview.js +11 -19
  121. package/dist/operator-ui/setup-commands.js +0 -4
  122. package/dist/operator-ui/view.d.ts +5 -29
  123. package/dist/operator-ui/view.js +3 -59
  124. package/dist/program-writes.js +47 -26
  125. package/dist/provider-call-facts.d.ts +115 -0
  126. package/dist/provider-call-facts.js +182 -0
  127. package/dist/provider-call.d.ts +112 -0
  128. package/dist/provider-call.js +271 -0
  129. package/dist/provider.d.ts +71 -32
  130. package/dist/provider.js +134 -40
  131. package/dist/providers/_shared/google/hatch.js +91 -0
  132. package/dist/providers/_shared/google/kit.js +537 -0
  133. package/dist/providers/_shared/google/result-size.js +15 -2
  134. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  135. package/dist/providers/_shared/google/service-account.js +8 -4
  136. package/dist/providers/_shared/google/workspace.d.ts +8 -209
  137. package/dist/providers/_shared/google/workspace.js +7 -426
  138. package/dist/providers/_shared/rest/compact-index.js +86 -0
  139. package/dist/providers/_shared/rest/dispatch.js +3 -23
  140. package/dist/providers/_shared/rest/kit.js +546 -0
  141. package/dist/providers/_shared/rest/operation-index.js +230 -14
  142. package/dist/providers/_shared/rest/response-media.js +11 -0
  143. package/dist/providers/_shared/rest/tools.js +101 -78
  144. package/dist/providers/_shared/rest/value-safety.js +353 -195
  145. package/dist/providers/_shared/sensitive-fields.js +27 -0
  146. package/dist/providers/breeze/api.js +584 -0
  147. package/dist/providers/breeze/index.d.ts +3 -3
  148. package/dist/providers/breeze/index.js +67 -1420
  149. package/dist/providers/breeze/openapi.generated.js +60 -0
  150. package/dist/providers/breeze/skill.generated.js +2 -6
  151. package/dist/providers/breeze/tools.js +696 -0
  152. package/dist/providers/ccb/api.js +496 -0
  153. package/dist/providers/ccb/index.d.ts +17 -37
  154. package/dist/providers/ccb/index.js +77 -1702
  155. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  156. package/dist/providers/ccb/lib/constants.js +74 -0
  157. package/dist/providers/ccb/lib/guide.js +9 -0
  158. package/dist/providers/ccb/lib/verdicts.js +387 -0
  159. package/dist/providers/ccb/openapi.generated.js +397 -0
  160. package/dist/providers/ccb/safety.js +295 -0
  161. package/dist/providers/ccb/skill.generated.js +2 -6
  162. package/dist/providers/ccb/tools.js +853 -0
  163. package/dist/providers/cloudflare/api.js +1066 -0
  164. package/dist/providers/cloudflare/index.d.ts +7 -22
  165. package/dist/providers/cloudflare/index.js +80 -194
  166. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  167. package/dist/providers/cloudflare/lib/config.js +2 -0
  168. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  169. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  170. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  171. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  172. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  173. package/dist/providers/cloudflare/openapi.generated.js +3299 -3208
  174. package/dist/providers/cloudflare/{value-safety.js → safety.js} +538 -18
  175. package/dist/providers/cloudflare/skill.generated.js +2 -10
  176. package/dist/providers/cloudflare/tools.js +360 -0
  177. package/dist/providers/docs/api.js +51 -0
  178. package/dist/providers/docs/index.d.ts +1 -12
  179. package/dist/providers/docs/index.js +53 -1165
  180. package/dist/providers/docs/lib/constants.d.ts +18 -0
  181. package/dist/providers/docs/lib/constants.js +18 -0
  182. package/dist/providers/docs/lib/discovery.js +26 -0
  183. package/dist/providers/docs/lib/requests.js +48 -0
  184. package/dist/providers/docs/lib/schemas.js +168 -0
  185. package/dist/providers/docs/openapi.generated.js +16 -0
  186. package/dist/providers/docs/safety.js +54 -0
  187. package/dist/providers/docs/skill.generated.js +2 -6
  188. package/dist/providers/docs/tools.js +802 -0
  189. package/dist/providers/drive/api.js +177 -0
  190. package/dist/providers/drive/index.d.ts +1 -12
  191. package/dist/providers/drive/index.js +38 -1448
  192. package/dist/providers/drive/lib/constants.d.ts +6 -0
  193. package/dist/providers/drive/lib/constants.js +6 -0
  194. package/dist/providers/drive/lib/contracts.js +532 -0
  195. package/dist/providers/drive/lib/hatch.js +197 -0
  196. package/dist/providers/drive/openapi.generated.js +77 -0
  197. package/dist/providers/drive/safety.js +90 -0
  198. package/dist/providers/drive/skill.generated.js +2 -6
  199. package/dist/providers/drive/tools.js +1290 -0
  200. package/dist/providers/forms/api.js +71 -0
  201. package/dist/providers/forms/index.d.ts +1 -12
  202. package/dist/providers/forms/index.js +49 -1145
  203. package/dist/providers/forms/lib/constants.d.ts +14 -0
  204. package/dist/providers/forms/lib/constants.js +19 -0
  205. package/dist/providers/forms/lib/hatch.js +72 -0
  206. package/dist/providers/forms/openapi.generated.js +23 -0
  207. package/dist/providers/forms/safety.js +34 -0
  208. package/dist/providers/forms/skill.generated.js +2 -8
  209. package/dist/providers/forms/tools.js +1024 -0
  210. package/dist/providers/github/api.js +150 -0
  211. package/dist/providers/github/index.d.ts +4 -5
  212. package/dist/providers/github/index.js +30 -87
  213. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  214. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  215. package/dist/providers/github/lib/discovery.js +132 -0
  216. package/dist/providers/github/lib/operations.js +58 -0
  217. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  218. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  219. package/dist/providers/github/openapi.generated.js +1216 -0
  220. package/dist/providers/github/safety.js +216 -0
  221. package/dist/providers/github/skill.generated.js +2 -5
  222. package/dist/providers/github/tools.js +506 -0
  223. package/dist/providers/gmail/api.js +114 -0
  224. package/dist/providers/gmail/index.d.ts +1 -12
  225. package/dist/providers/gmail/index.js +73 -1621
  226. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  227. package/dist/providers/gmail/lib/constants.js +16 -0
  228. package/dist/providers/gmail/lib/index.js +173 -0
  229. package/dist/providers/gmail/lib/schemas.js +176 -0
  230. package/dist/providers/gmail/lib/threading.js +120 -0
  231. package/dist/providers/gmail/openapi.generated.js +92 -0
  232. package/dist/providers/gmail/safety.js +21 -0
  233. package/dist/providers/gmail/skill.generated.js +2 -6
  234. package/dist/providers/gmail/tools.js +1435 -0
  235. package/dist/providers/overflow/api.js +1008 -0
  236. package/dist/providers/overflow/index.d.ts +3 -17
  237. package/dist/providers/overflow/index.js +60 -1488
  238. package/dist/providers/overflow/skill.generated.js +2 -5
  239. package/dist/providers/overflow/tools.js +873 -0
  240. package/dist/providers/planning-center/api.js +467 -0
  241. package/dist/providers/planning-center/index.d.ts +6 -35
  242. package/dist/providers/planning-center/index.js +69 -2445
  243. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  244. package/dist/providers/planning-center/lib/constants.js +83 -0
  245. package/dist/providers/planning-center/lib/discovery.js +40 -0
  246. package/dist/providers/planning-center/lib/guide.js +39 -0
  247. package/dist/providers/planning-center/lib/json-api.js +83 -0
  248. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  249. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  250. package/dist/providers/planning-center/safety.js +188 -0
  251. package/dist/providers/planning-center/skill.generated.js +2 -27
  252. package/dist/providers/planning-center/tools.js +1010 -0
  253. package/dist/providers/sheets/api.js +133 -0
  254. package/dist/providers/sheets/index.d.ts +4 -16
  255. package/dist/providers/sheets/index.js +61 -1172
  256. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  257. package/dist/providers/sheets/lib/constants.js +14 -0
  258. package/dist/providers/sheets/lib/hatch.js +163 -0
  259. package/dist/providers/sheets/lib/requests.js +105 -0
  260. package/dist/providers/sheets/lib/schemas.js +138 -0
  261. package/dist/providers/sheets/openapi.generated.js +30 -0
  262. package/dist/providers/sheets/safety.js +27 -0
  263. package/dist/providers/sheets/skill.generated.js +2 -7
  264. package/dist/providers/sheets/tools.js +734 -0
  265. package/dist/providers/slides/api.js +147 -0
  266. package/dist/providers/slides/index.d.ts +2 -10
  267. package/dist/providers/slides/index.js +48 -2555
  268. package/dist/providers/slides/lib/constants.d.ts +11 -0
  269. package/dist/providers/slides/lib/constants.js +11 -0
  270. package/dist/providers/slides/lib/requests.js +60 -0
  271. package/dist/providers/slides/lib/schemas.js +565 -0
  272. package/dist/providers/slides/openapi.generated.js +18 -0
  273. package/dist/providers/slides/skill.generated.js +2 -6
  274. package/dist/providers/slides/tools.js +1968 -0
  275. package/dist/providers/stripe/api.js +401 -0
  276. package/dist/providers/stripe/index.d.ts +7 -27
  277. package/dist/providers/stripe/index.js +75 -191
  278. package/dist/providers/stripe/lib/config.d.ts +4 -0
  279. package/dist/providers/stripe/lib/config.js +2 -0
  280. package/dist/providers/stripe/openapi.generated.js +4 -3
  281. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  282. package/dist/providers/stripe/skill.generated.js +2 -10
  283. package/dist/providers/stripe/tools.js +77 -0
  284. package/dist/providers/tithely/api.js +531 -0
  285. package/dist/providers/tithely/index.d.ts +19 -0
  286. package/dist/providers/tithely/index.js +86 -965
  287. package/dist/providers/tithely/skill.generated.js +2 -5
  288. package/dist/providers/tithely/tools.js +426 -0
  289. package/dist/providers/vercel/api.js +551 -0
  290. package/dist/providers/vercel/index.d.ts +11 -25
  291. package/dist/providers/vercel/index.js +67 -261
  292. package/dist/providers/vercel/lib/config.d.ts +2 -0
  293. package/dist/providers/vercel/lib/config.js +2 -0
  294. package/dist/providers/vercel/lib/index.js +117 -0
  295. package/dist/providers/vercel/lib/logs.js +100 -0
  296. package/dist/providers/vercel/lib/pin.js +270 -0
  297. package/dist/providers/vercel/openapi.generated.js +398 -376
  298. package/dist/providers/vercel/{value-safety.js → safety.js} +261 -42
  299. package/dist/providers/vercel/skill.generated.js +2 -7
  300. package/dist/providers/vercel/tools.js +642 -0
  301. package/dist/redaction-identity.js +47 -0
  302. package/dist/redaction-marker.js +125 -0
  303. package/dist/registry.d.ts +30 -28
  304. package/dist/registry.js +446 -413
  305. package/dist/routes/access-tokens.js +1 -1
  306. package/dist/routes/actor-labels.js +1 -1
  307. package/dist/routes/connect.js +1 -1
  308. package/dist/routes/dispatch.js +103 -0
  309. package/dist/routes/mcp.js +170 -79
  310. package/dist/routes/oauth.js +3 -1
  311. package/dist/routes/operator.js +2 -2
  312. package/dist/routes/shared.d.ts +5 -4
  313. package/dist/routes/shared.js +244 -177
  314. package/dist/routes/skills.js +10 -8
  315. package/dist/routes/ui-config.js +27 -3
  316. package/dist/routes/ui-data.js +29 -22
  317. package/dist/routes/ui.js +1 -1
  318. package/dist/runtime/call-admission.js +0 -26
  319. package/dist/runtime/call-entry.js +30 -0
  320. package/dist/runtime/call.js +556 -0
  321. package/dist/runtime/connector-scope.js +7 -0
  322. package/dist/runtime/credential-probe.js +34 -0
  323. package/dist/runtime/executor.js +40 -0
  324. package/dist/runtime/native-storage.js +63 -0
  325. package/dist/runtime/registry.js +27 -0
  326. package/dist/runtime/request-scope.js +72 -0
  327. package/dist/runtime/run.js +15 -7
  328. package/dist/runtime/shared-read.js +34 -5
  329. package/dist/runtime/storage.js +34 -21
  330. package/dist/sent-secrets.d.ts +194 -37
  331. package/dist/sent-secrets.js +1743 -340
  332. package/dist/server.js +5 -56
  333. package/dist/skills.js +330 -224
  334. package/dist/sqlite.js +15 -14
  335. package/dist/storage/d1-copy.js +255 -0
  336. package/dist/storage/d1-driver.js +15 -0
  337. package/dist/storage/keys.js +28 -0
  338. package/dist/storage/sql-driver.js +88 -0
  339. package/dist/storage/sql-native.js +544 -0
  340. package/dist/storage/sql-schema.d.ts +6 -0
  341. package/dist/storage/sql-schema.js +15 -0
  342. package/dist/storage/sql.d.ts +14 -20
  343. package/dist/storage/sql.js +29 -535
  344. package/dist/timeout.js +0 -26
  345. package/dist/tool-safety.js +20 -10
  346. package/dist/types.d.ts +11 -99
  347. package/dist/upward.js +3 -0
  348. package/dist/usage-guide.js +3 -1
  349. package/dist/validate.d.ts +4 -2
  350. package/dist/validate.js +86 -9
  351. package/dist/version.d.ts +1 -1
  352. package/dist/version.js +1 -1
  353. package/dist/worker.js +312 -292
  354. package/dist/workspace-subject.js +5 -1
  355. package/dist/write-outcome.js +454 -34
  356. package/documentation/README.md +27 -7
  357. package/documentation/architecture.md +2550 -186
  358. package/documentation/auth.md +821 -98
  359. package/documentation/code-mode.md +56 -21
  360. package/documentation/deploying.md +164 -20
  361. package/documentation/hosted-mcp-migration.md +460 -0
  362. package/documentation/integrating.md +144 -105
  363. package/documentation/meta-tools.md +411 -34
  364. package/documentation/operating.md +28 -4
  365. package/documentation/operator-tests.md +11 -2
  366. package/documentation/operator-ui.md +103 -33
  367. package/documentation/provider-auth-migration.md +38 -63
  368. package/documentation/provider-migration-0.29.md +10 -5
  369. package/documentation/provider-migration-0.35.md +975 -0
  370. package/documentation/providers.md +965 -0
  371. package/examples/worker/AGENTS.md +23 -9
  372. package/examples/worker/README.md +254 -135
  373. package/examples/worker/alchemy.run.ts +116 -0
  374. package/examples/worker/gitignore +10 -0
  375. package/examples/worker/src/connecta.config.ts +23 -21
  376. package/examples/worker/wrangler.jsonc +14 -5
  377. package/guides/connecting-agents.md +157 -0
  378. package/guides/how-it-works.md +156 -0
  379. package/guides/safety-and-trust.md +153 -0
  380. package/package.json +27 -42
  381. package/templates/node/.env.example +3 -0
  382. package/templates/node/README.md +22 -2
  383. package/templates/node/docker-compose.yml +1 -0
  384. package/templates/node/package.json +3 -2
  385. package/templates/node/src/connecta.config.ts +8 -0
  386. package/dist/catalog-drift.d.ts +0 -134
  387. package/dist/catalog-drift.js +0 -493
  388. package/dist/providers/_shared/request-token.js +0 -83
  389. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  390. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  391. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  392. package/dist/providers/basecamp/index.d.ts +0 -43
  393. package/dist/providers/basecamp/index.js +0 -997
  394. package/dist/providers/basecamp/skill.generated.js +0 -9
  395. package/dist/providers/cloudflare/rest.d.ts +0 -37
  396. package/dist/providers/cloudflare/rest.js +0 -1078
  397. package/dist/providers/github/hosted.js +0 -218
  398. package/dist/providers/github/rest.js +0 -321
  399. package/dist/providers/infisical/index.d.ts +0 -7
  400. package/dist/providers/infisical/index.js +0 -713
  401. package/dist/providers/infisical/skill.generated.js +0 -8
  402. package/dist/providers/linear/index.d.ts +0 -55
  403. package/dist/providers/linear/index.js +0 -352
  404. package/dist/providers/linear/skill.generated.js +0 -8
  405. package/dist/providers/mixpanel/index.d.ts +0 -57
  406. package/dist/providers/mixpanel/index.js +0 -468
  407. package/dist/providers/mixpanel/operations.js +0 -20
  408. package/dist/providers/mixpanel/rest.js +0 -603
  409. package/dist/providers/mixpanel/skill.generated.js +0 -10
  410. package/dist/providers/mixpanel/value-safety.js +0 -16
  411. package/dist/providers/notion/index.d.ts +0 -65
  412. package/dist/providers/notion/index.js +0 -368
  413. package/dist/providers/notion/openapi.generated.js +0 -75
  414. package/dist/providers/notion/rest.d.ts +0 -24
  415. package/dist/providers/notion/rest.js +0 -1226
  416. package/dist/providers/notion/skill.generated.js +0 -11
  417. package/dist/providers/notion/value-safety.js +0 -56
  418. package/dist/providers/revenuecat/index.d.ts +0 -49
  419. package/dist/providers/revenuecat/index.js +0 -557
  420. package/dist/providers/revenuecat/skill.generated.js +0 -11
  421. package/dist/providers/stripe/rest.d.ts +0 -14
  422. package/dist/providers/stripe/rest.js +0 -402
  423. package/dist/providers/vercel/rest.d.ts +0 -20
  424. package/dist/providers/vercel/rest.js +0 -1020
  425. package/dist/providers/wispr-flow/index.d.ts +0 -14
  426. package/dist/providers/wispr-flow/index.js +0 -117
  427. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  428. /package/dist/providers/github/{key.js → lib/key.js} +0 -0
@@ -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
+ }