@zackbart/connecta 0.34.1 → 0.36.0

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