@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
@@ -1,281 +1,87 @@
1
- import { skill } from "./skill.generated.js";
2
- /**
3
- * No `@vercel/sdk` on purpose — not a dependency and not an optional peer.
4
- * Direct fetch keeps the root Workers-safe and avoids shipping the SDK's
5
- * generated model graph. The token connector reads a pinned operation index
6
- * compiled from Vercel's published OpenAPI document (https://openapi.vercel.sh/,
7
- * unversioned, so pinned by content hash in `openapi.source.json`);
8
- * `pnpm run providers:check --provider vercel` reports when the live document
9
- * moves, and `src/providers/vercel/drift.json` also records the contract digest
10
- * of every endpoint a named tool is written against.
11
- */
12
- import { apiConnector } from "../../connectors/api-connector.js";
13
- import { reviewedCatalog } from "../../catalog-drift.js";
14
1
  import { keys, optionsOf, variants } from "../../config-schema.js";
15
- import { CALL_ADMISSION, defineProvider } from "../../provider.js";
16
- import { byAuth, hostedOAuth } from "../_shared/rest/dispatch.js";
17
- import { restTools } from "../_shared/rest/tools.js";
18
- import { VERCEL_API_BASE_URL, vercelRest } from "./rest.js";
19
- export { VERCEL_API_BASE_URL } from "./rest.js";
20
- /** Vercel's official hosted MCP endpoint. */
21
- export const VERCEL_MCP_ENDPOINT = "https://mcp.vercel.com";
22
- /**
23
- * Reviewed in #705's provider audit against https://vercel.com/docs/mcp/vercel-mcp/tools.
24
- * Retains the release-reviewed inventory, including names absent from today's
25
- * public reference. Live annotations were not reverified without credentials.
26
- * No schema digest is asserted without a captured schema to review. This
27
- * classifies the hosted OAuth catalog only; the REST connector annotates each
28
- * tool it authors.
29
- */
30
- const VERCEL_MCP_CLASSIFICATION = {
31
- tools: {
32
- "request_promote": {
33
- verdict: "destructive",
34
- reason: "The rolling-releases MCP reference promotes an existing deployment to production; replaces the authored REST promotion write.",
35
- },
36
- "list_project_domains": {
37
- verdict: "read",
38
- reason: "The projects MCP reference lists project-domain metadata; formerly the named REST read.",
39
- },
40
- "add_project_domain": {
41
- verdict: "destructive",
42
- reason: "Attaches a domain to a project; preserves the former REST write classification.",
43
- },
44
- "cancel_deployment": {
45
- verdict: "destructive",
46
- reason: "Cancels an existing deployment, even if the vendor claims read-only access.",
47
- },
48
- "upload_file": { verdict: "destructive", reason: "Uploads deployment file bytes and creates vendor state." },
49
- "create_deployment": {
50
- verdict: "destructive",
51
- reason: "Creates a preview or production deployment from Git or files.",
52
- },
53
- "list_deployment_events": {
54
- verdict: "read",
55
- reason: "Reads build events using the documented deployments catalog.",
56
- },
57
- "search_vercel_documentation": {
58
- "verdict": "read",
59
- "reason": "Retrieves Vercel vercel documentation information without changing vendor state.",
60
- },
61
- "list_teams": { "verdict": "read", "reason": "Retrieves Vercel teams information without changing vendor state." },
62
- "list_projects": {
63
- "verdict": "read",
64
- "reason": "Retrieves Vercel projects information without changing vendor state.",
65
- },
66
- "get_project": {
67
- "verdict": "read",
68
- "reason": "Retrieves Vercel project information without changing vendor state.",
69
- },
70
- "list_deployments": {
71
- "verdict": "read",
72
- "reason": "Retrieves Vercel deployments information without changing vendor state.",
73
- },
74
- "get_deployment": {
75
- "verdict": "read",
76
- "reason": "Retrieves Vercel deployment information without changing vendor state.",
77
- },
78
- "get_deployment_build_logs": {
79
- "verdict": "read",
80
- "reason": "Retrieves Vercel deployment build logs information without changing vendor state.",
81
- },
82
- "get_runtime_logs": {
83
- "verdict": "read",
84
- "reason": "Retrieves Vercel runtime logs information without changing vendor state.",
85
- },
86
- "get_runtime_errors": {
87
- "verdict": "read",
88
- "reason": "Retrieves Vercel runtime errors information without changing vendor state.",
89
- },
90
- "get_web_analytics": {
91
- "verdict": "read",
92
- "reason": "Retrieves Vercel web analytics information without changing vendor state.",
93
- },
94
- "list_agent_run_projects": {
95
- "verdict": "read",
96
- "reason": "Retrieves Vercel agent run projects information without changing vendor state.",
97
- },
98
- "list_agent_runs": {
99
- "verdict": "read",
100
- "reason": "Retrieves Vercel agent runs information without changing vendor state.",
101
- },
102
- "get_agent_run": {
103
- "verdict": "read",
104
- "reason": "Retrieves Vercel agent run information without changing vendor state.",
105
- },
106
- "get_agent_run_trace": {
107
- "verdict": "read",
108
- "reason": "Retrieves Vercel agent run trace information without changing vendor state.",
109
- },
110
- "check_domain_availability_and_price": {
111
- "verdict": "read",
112
- "reason": "Retrieves Vercel check domain availability and price information without changing vendor state.",
113
- },
114
- "get_purchase_quote": {
115
- "verdict": "read",
116
- "reason": "Reads a purchase quote; billing changes require a separate purchase tool.",
117
- },
118
- "get_domain_order": {
119
- "verdict": "read",
120
- "reason": "Retrieves Vercel domain order information without changing vendor state.",
121
- },
122
- "list_toolbar_threads": {
123
- "verdict": "read",
124
- "reason": "Retrieves Vercel toolbar threads information without changing vendor state.",
125
- },
126
- "get_toolbar_thread": {
127
- "verdict": "read",
128
- "reason": "Retrieves Vercel toolbar thread information without changing vendor state.",
129
- },
130
- "use_vercel_cli": {
131
- "verdict": "read",
132
- "reason": "Returns CLI guidance only; any subsequent CLI execution is outside this tool.",
133
- },
134
- "reply_to_toolbar_thread": {
135
- "verdict": "write",
136
- "reason": "reply to toolbar thread creates or appends Vercel state; it has side effects.",
137
- },
138
- "add_toolbar_reaction": {
139
- "verdict": "write",
140
- "reason": "add toolbar reaction creates or appends Vercel state; it has side effects.",
141
- },
142
- "deploy_to_vercel": {
143
- "verdict": "destructive",
144
- "reason": "Can change a live deployment and the project serving production traffic.",
145
- },
146
- "buy_pro": { "verdict": "destructive", "reason": "buy pro changes existing Vercel state or removes it." },
147
- "buy_credits": { "verdict": "destructive", "reason": "buy credits changes existing Vercel state or removes it." },
148
- "buy_addon": { "verdict": "destructive", "reason": "buy addon changes existing Vercel state or removes it." },
149
- "buy_domain": { "verdict": "destructive", "reason": "buy domain changes existing Vercel state or removes it." },
150
- "get_access_to_vercel_url": {
151
- "verdict": "destructive",
152
- "reason": "Creates an access grant; the returned access URL is a credential.",
153
- },
154
- "web_fetch_vercel_url": {
155
- "verdict": "destructive",
156
- "reason": "Invokes application code, whose side effects cannot be established from HTTP GET alone.",
157
- },
158
- "import-claude-design-from-url": {
159
- "verdict": "destructive",
160
- "reason": "Imports into a project and can change existing live project state.",
161
- },
162
- "change_toolbar_thread_resolve_status": {
163
- "verdict": "destructive",
164
- "reason": "change toolbar thread resolve status changes existing Vercel state or removes it.",
165
- },
166
- "edit_toolbar_message": {
167
- "verdict": "destructive",
168
- "reason": "edit toolbar message changes existing Vercel state or removes it.",
169
- },
170
- "filter_project_envs": {
171
- "verdict": "write",
172
- "reason": "Lists project environment variables and can return decrypted values; reviewed as a write so a read-only endpoint refuses the disclosure (#801).",
173
- },
174
- "get_project_env": {
175
- "verdict": "write",
176
- "reason": "Returns one environment variable's decrypted value; reviewed as a write so a read-only endpoint refuses the disclosure (#801).",
177
- },
178
- "create_project_env": {
179
- "verdict": "destructive",
180
- "reason": "Creates or overwrites project environment variables that future deployments embed.",
181
- },
182
- "edit_project_env": {
183
- "verdict": "destructive",
184
- "reason": "Replaces an existing environment variable's value or targets.",
185
- },
186
- },
187
- };
188
- function instructionsSection(instructions) {
189
- const text = instructions?.trim();
190
- return text ? `\n## ${skill.instructionsHeading}\n\n${text}\n` : "";
191
- }
192
- function oauthUsageGuide(purpose, instructions) {
193
- const { oauth, shared } = skill.fragments;
194
- return `# Vercel usage
195
-
196
- Vercel's hosted MCP server over OAuth. Account purpose: ${purpose}${oauth}${shared}${instructionsSection(instructions)}`;
197
- }
198
- function tokenUsageGuide(purpose, teamId, instructions) {
199
- const { key, shared } = skill.fragments;
200
- const scope = teamId
201
- ? `This connection defaults to team \`${teamId}\`: operations that accept a team get it unless a call passes \`teamId\` (or \`slug\`), and \`teamId: null\` targets the token owner's personal account.`
202
- : "This connection defaults to the token owner's personal account. Call `list_teams`, then pass `teamId` for team-owned resources.";
203
- return `# Vercel usage
204
-
205
- Connecta's REST connector to the Vercel API with one access token. Account purpose: ${purpose}
206
-
207
- ${scope}${key}${shared}${instructionsSection(instructions)}`;
208
- }
2
+ import { defineApiProvider } from "../../http/provider.js";
3
+ import { CALL_ADMISSION } from "../../provider.js";
4
+ import { removedHostedMcp } from "../_shared/rest/dispatch.js";
5
+ import { authenticate, MAX_RESPONSE_BYTES, READ_CAP_MS, probe, result, safety, vercelErrors, VercelApi, usageGuide, transformGuide, VERCEL_VERDICTS, VERCEL_PAGES, vercelBinding, vercelIndex, } from "./api.js";
6
+ import { VERCEL_API_BASE_URL } from "./lib/config.js";
7
+ import { pinOptions, PIN_WRITE_STEPS } from "./lib/pin.js";
8
+ import { vercelTools } from "./tools.js";
9
+ import { skill } from "./skill.generated.js";
10
+ export { VERCEL_API_BASE_URL } from "./lib/config.js";
209
11
  const COMMON = {
210
- ...keys("title", "authScope", "purpose", "instructions", "maxResultBytes"),
12
+ ...keys("title", "authScope", "purpose", "instructions", "maxResultBytes", "readOnly"),
211
13
  callAdmission: CALL_ADMISSION,
212
14
  };
213
15
  /** The closed options vercel() accepts, selected by `auth.type`; see `assertKnownOptions`. */
214
16
  const VERCEL_OPTIONS = variants(["auth", "type"], {
215
17
  // The never-typed keys stay out of the shape, so the walk refuses them by name.
216
- oauth: optionsOf()({
217
- ...COMMON,
218
- auth: optionsOf()(keys("type")),
219
- }).shape,
18
+ oauth: { ...COMMON, auth: optionsOf()(keys("type")) },
220
19
  token: optionsOf()({
221
20
  ...COMMON,
222
21
  ...keys("teamId", "baseUrl"),
22
+ pin: optionsOf()(keys("teamId")),
223
23
  auth: optionsOf()(keys("type")),
224
24
  }).shape,
225
- });
226
- function vercelOAuth(id, options, provider) {
227
- return hostedOAuth(id, provider, {
228
- url: VERCEL_MCP_ENDPOINT,
229
- title: options.title ?? "Vercel (MCP)",
230
- description: `Vercel's official hosted MCP surface: ${options.purpose}`,
231
- usageGuide: {
232
- content: oauthUsageGuide(options.purpose, options.instructions),
233
- summary: "Official MCP. Live Vercel schemas, id resolution, deployment diagnosis, purchases, and access grants.",
234
- required: true,
235
- },
236
- });
237
- }
238
- function vercelToken(id, options, provider) {
239
- const teamId = typeof options.teamId === "string" ? options.teamId.trim() || undefined : undefined;
240
- const baseUrl = options.baseUrl ?? VERCEL_API_BASE_URL;
241
- const rest = vercelRest({ baseUrl, teamId });
242
- return apiConnector(id, {
243
- ...provider.connectorOptions,
244
- title: options.title ?? "Vercel",
245
- description: `Vercel account and deployments: ${options.purpose}`,
246
- credential: {
247
- label: "Vercel access token",
248
- description: "Access token from Vercel Account Settings → Tokens. Choose the personal account or team scope this deployment needs and set an expiration date. The connector never sends it anywhere except api.vercel.com or the configured baseUrl proxy.",
249
- placeholder: "Paste Vercel access token",
250
- },
251
- testCredential: rest.testCredential,
252
- usageGuide: {
253
- content: tokenUsageGuide(options.purpose, teamId, options.instructions),
254
- summary: "One access token over REST: search operations, read details, then read or write. Value-safe env vars.",
255
- required: true,
256
- },
257
- tools: [...restTools(rest.vendor), ...rest.tools],
258
- });
259
- }
260
- /**
261
- * A maintained Vercel connection. `auth` selects the implementation: OAuth
262
- * reaches Vercel's hosted MCP server; an access token reaches Connecta's REST
263
- * connector to `api.vercel.com`.
264
- */
265
- export const vercel = defineProvider({
25
+ }, undefined, ["oauth"]);
26
+ /** Maintained API connection. Hosted MCP uses a separate generic connection. */
27
+ export const vercel = defineApiProvider({
266
28
  name: "vercel",
267
29
  title: "Vercel",
268
- kind: "dual",
269
30
  readme: "Vercel",
270
31
  bundle: {
271
- "baselineGzip": 228431,
272
- "maxGzip": 288431,
273
- "note": "./providers/vercel remeasures at 228,431 B gzip (#801), from a 143,649 B baseline recorded before the shared entry grew (shared code grew after it was recorded, as other entries measured before #801 show): auth now selects the implementation, so the entry carries the hosted MCP client and Connecta's REST connector (the shared REST module) plus the pinned Vercel operation index (445 operations; request details to depth 2, without descriptions or enums over 50 values; 26,274 B gzip as source; the reviewed value-safety table adds about 5 KB). Details were shrunk before the cap moved: descriptions alone added 15 KB gzip. The cap uses the existing baseline + 60,000 B policy.",
32
+ baselineGzip: 424345,
33
+ note: "./providers/vercel standalone gzip after decision 0011 step 2, Node 26.12.0, gzip level 9. Re-pinned response metadata, reviewed discovery prose, signed paging and bounded logs. The shared Effect kit is paid once per deployment; provider entries are reported, not capped (#899).",
274
34
  },
275
35
  skill,
36
+ blocks: { keys: ["pinned", "unpinned"], select: (options) => [options.pin ? "pinned" : "unpinned"] },
276
37
  options: VERCEL_OPTIONS,
277
- classify: VERCEL_MCP_CLASSIFICATION,
278
- create: byAuth({ oauth: vercelOAuth, token: vercelToken }),
38
+ vendor: VercelApi,
39
+ baseUrl: (options) => {
40
+ if (options.auth.type !== "token")
41
+ removedHostedMcp();
42
+ pinOptions(options);
43
+ return options.baseUrl ?? VERCEL_API_BASE_URL;
44
+ },
45
+ description: (options) => `Vercel account and deployments: ${options.purpose}`,
46
+ maxResponseBytes: MAX_RESPONSE_BYTES,
47
+ pageSize: { default: 20, max: 100 },
48
+ idempotencyKey: false,
49
+ timeoutMs: READ_CAP_MS,
50
+ headers: { Accept: "application/json" },
51
+ credential: {
52
+ label: "Vercel access token",
53
+ description: "Access token from Vercel Account Settings → Tokens. Choose the personal account or team scope this deployment needs and set an expiration date. The connector never sends it anywhere except api.vercel.com or the configured baseUrl proxy.",
54
+ placeholder: "Paste Vercel access token",
55
+ },
56
+ authenticate,
57
+ safety,
58
+ errors: vercelErrors,
59
+ result,
60
+ inBandRefusals: true,
61
+ probe,
62
+ guide: usageGuide,
63
+ transformGuide,
64
+ hatch: {
65
+ name: "vercel",
66
+ title: "Vercel",
67
+ index: vercelIndex,
68
+ verdicts: VERCEL_VERDICTS,
69
+ pages: VERCEL_PAGES,
70
+ writeSteps: PIN_WRITE_STEPS,
71
+ pathExample: "/v13/deployments/dpl_123",
72
+ named: {
73
+ "GET /v2/teams": "list_teams",
74
+ "GET /v10/projects/{idOrName}/env": "list_project_env_vars",
75
+ "POST /v10/projects/{idOrName}/env": "upsert_project_env_var",
76
+ "PATCH /v9/projects/{idOrName}/env/{id}": "update_project_env_var",
77
+ "GET /v3/deployments/{idOrUrl}/events": "get_deployment_build_logs",
78
+ "GET /v1/projects/{projectId}/deployments/{deploymentId}/runtime-logs": "get_runtime_logs",
79
+ },
80
+ binding: vercelBinding,
81
+ notes: (options) => ({
82
+ read: `Pass page.nextCursor unchanged in the query parameter page.param names. ${pinOptions(options).pin ? "The deployment team pin applies to every call; personal and foreign team selectors are refused." : "Team selectors override the routing default; token permissions enforce scope."}`,
83
+ write: "JSON writes only. Use vercel_api_upload for explicit bytes.",
84
+ }),
85
+ },
86
+ tools: vercelTools,
279
87
  });
280
- /** @deprecated Read `vercel.definition.classify` instead. Kept for existing imports. */
281
- export const VERCEL_MCP_VETTED_CATALOG = reviewedCatalog(vercel.definition.classify, 'defineProvider("vercel")');
@@ -0,0 +1,2 @@
1
+ /** Vercel's public REST origin. Override only for a proxy or test double. */
2
+ export declare const VERCEL_API_BASE_URL = "https://api.vercel.com";
@@ -0,0 +1,2 @@
1
+ /** Vercel's public REST origin. Override only for a proxy or test double. */
2
+ export const VERCEL_API_BASE_URL = "https://api.vercel.com";
@@ -0,0 +1,117 @@
1
+ const SUMMARIES = {
2
+ "POST /api-keys": "Create an AI Gateway API key (credential minting is refused).",
3
+ "GET /domains/records/{recordId}": "Read one DNS record by its observed record id.",
4
+ "PUT /domains/{domain}/records": "Replace a domain's DNS records.",
5
+ "POST /speed-insights/toggle": "Enable or disable Speed Insights for a project.",
6
+ "POST /web/insights/toggle": "Enable or disable Web Analytics insights for a project.",
7
+ "POST /v2/observability/query": "Query observability metrics without persisting changes.",
8
+ "GET /v2/observability/schema": "List the observability metrics and their query schema.",
9
+ "GET /v2/observability/schema/{metricId}": "Read the query schema for one observability metric.",
10
+ "GET /v3/deployments/{idOrUrl}/events": "Get deployment build logs and events without following live output.",
11
+ "GET /v1/projects/{projectId}/deployments/{deploymentId}/runtime-logs": "Get deployment runtime request logs through the bounded named reader.",
12
+ "POST /v13/deployments": "Create deployment or redeploy an existing deployment for a project.",
13
+ "POST /v10/projects/{idOrName}/env": "Create environment variable, add environment variable, or replace a project env var.",
14
+ "GET /v10/projects/{idOrName}/env": "List project environment variables (env vars); use the metadata-only named reader.",
15
+ "PATCH /v9/projects/{idOrName}/env/{id}": "Update environment variable by id in a project (env var).",
16
+ "DELETE /v9/projects/{idOrName}/env/{id}": "Delete environment variable by id in a project; remove env var.",
17
+ };
18
+ const PARAMETERS = {
19
+ teamId: "Team identifier for this call; overrides the connection's routing default. Token permissions enforce access.",
20
+ slug: "Human-readable team slug for this call; overrides the routing default when teamId is omitted.",
21
+ domain: "Domain hostname, without a scheme or URL path.",
22
+ tld: "Top-level domain suffix used by the registrar operation.",
23
+ limit: "Maximum records requested in one vendor page; obey the declared integer bounds.",
24
+ n: "Maximum records requested for this operation.",
25
+ cursor: "Opaque vendor continuation; for paged hatch reads pass the signed page.nextCursor unchanged.",
26
+ next: "Next-page continuation; pass the signed hatch page.nextCursor unchanged.",
27
+ page: "Vendor page number; use the declared paging protocol when a continuation is returned.",
28
+ per_page: "Vendor rows per page; obey the declared numeric bounds.",
29
+ since: "Lower timestamp boundary for this list; use the operation's documented time unit.",
30
+ startTimestamp: "Start of the requested observation interval.",
31
+ endTimestamp: "End of the requested observation interval.",
32
+ createdAfter: "Include records created after this timestamp.",
33
+ createdBefore: "Include records created before this timestamp.",
34
+ includeDisabled: "Include disabled records in the response.",
35
+ includeArchived: "Include archived records in the response.",
36
+ includeMetadata: "Include the operation's optional record metadata.",
37
+ "skip-metadata": "Omit optional metadata from the response.",
38
+ "include-guides": "Include integration guide metadata in the response.",
39
+ metadata: "Metadata selection for the requested record.",
40
+ updatedBy: "Filter by the identity that last updated the records.",
41
+ actingIp: "IP address associated with the acting request for this operation.",
42
+ actingUserAgent: "User-agent string associated with the acting request.",
43
+ q: "Vendor search expression for this resource.",
44
+ query: "Vendor search expression for this resource.",
45
+ search: "Search text to match against the listed resource.",
46
+ diff: "Select a comparison of the requested configuration versions.",
47
+ sort_by: "Record property used for sorting.",
48
+ sort_order: "Sorting direction, using the declared vendor values.",
49
+ sort: "Sorting choice, using the declared vendor values.",
50
+ connector: "Connect connector identifier, resolved from connector metadata.",
51
+ action: "Integration resource action to perform, using the documented action name.",
52
+ dryRun: "Validate or preview this operation without applying its requested change where supported.",
53
+ token: "Existing token selector. Credential-returning operations remain refused.",
54
+ edgeConfigItemKey: "Edge Config item name; stored item-value reads remain refused.",
55
+ view: "Response view supported by this operation.",
56
+ installationType: "Filter by the integration installation type.",
57
+ provider: "Vendor provider choice for this resource.",
58
+ source: "Source selection for the requested resource.",
59
+ entityKind: "Feature-flag entity kind whose attributes are being queried.",
60
+ attributeKey: "Feature-flag entity attribute name whose labels are being queried.",
61
+ filter: "Vendor filter expression for this collection.",
62
+ hosts: "Hostnames to include in the requested observations.",
63
+ ip: "IP address to match in the requested observations.",
64
+ isActive: "Select active or inactive records.",
65
+ actionType: "Filter events by their action type.",
66
+ ruleKind: "Filter rules by their documented kind.",
67
+ untagged: "Include or select records without a tag.",
68
+ tag: "Tag used to select records or image versions.",
69
+ attempt: "Invocation attempt number, distinct from the invocation identifier.",
70
+ runAttempt: "Job run attempt number.",
71
+ taskRunAttempt: "Task run attempt number.",
72
+ follow: "Live-follow choice; Connecta refuses following unbounded streams through the hatch.",
73
+ repository: "Repository identifier used by this Vercel CI operation.",
74
+ deprecated: "Include or select deprecated records.",
75
+ status: "Filter by the record's current status.",
76
+ conclusion: "Filter by the check's reported conclusion.",
77
+ blocks: "Select blocking checks for this operation.",
78
+ delimiter: "Delimiter used to group the returned resource keys.",
79
+ builds: "Select build-related records or include build information.",
80
+ };
81
+ export function discoveryIndex(data) {
82
+ const details = JSON.parse(data.details);
83
+ for (const row of details.o)
84
+ if (row)
85
+ for (const parameter of row[0]) {
86
+ // A record-count limit is a positive whole number even where the pin
87
+ // says only "number". Preserve a documented maximum; invent none.
88
+ if (parameter[0] === "limit") {
89
+ let node = parameter[3];
90
+ while (typeof node["$"] === "number")
91
+ node = details.d[node["$"]];
92
+ parameter[3] = { ...node, t: "integer", l: Math.max(1, typeof node["l"] === "number" ? node["l"] : 1) };
93
+ }
94
+ if (parameter[4])
95
+ continue;
96
+ const name = parameter[0];
97
+ const description = PARAMETERS[name] ??
98
+ (/(?:Id|ID|IdOrName|IdOrSlug|Slug)$/.test(name) || name === "id" || name === "idOrName"
99
+ ? "Observed identifier (or documented name/slug) of this path's resource; resolve it from the matching collection and encode it as one URI segment."
100
+ : undefined);
101
+ if (!description)
102
+ throw new Error(`Vercel parameter ${name} needs a reviewed discovery description.`);
103
+ parameter[4] = description;
104
+ }
105
+ return {
106
+ ...data,
107
+ details: JSON.stringify(details),
108
+ ops: data.ops.map((row) => {
109
+ const summary = SUMMARIES[`${row[0]} ${row[1]}`] ?? row[3];
110
+ if (!summary)
111
+ throw new Error(`Vercel operation ${row[0]} ${row[1]} needs a reviewed summary.`);
112
+ return row[5] === undefined
113
+ ? [row[0], row[1], row[2], summary, row[4]]
114
+ : [row[0], row[1], row[2], summary, row[4], row[5]];
115
+ }),
116
+ };
117
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Items of a possibly cut-off JSON array, or complete NDJSON lines: a bounded
3
+ * log read stops mid-body, and the rows it finished are still the answer.
4
+ */
5
+ export function completeRows(body) {
6
+ const trimmed = body.trimStart();
7
+ if (!trimmed.startsWith("[")) {
8
+ const rows = [];
9
+ for (const line of body.split("\n")) {
10
+ if (line.trim() === "")
11
+ continue;
12
+ try {
13
+ rows.push(JSON.parse(line));
14
+ }
15
+ catch {
16
+ // A line the read cut off, or one Vercel did not finish.
17
+ }
18
+ }
19
+ return rows;
20
+ }
21
+ try {
22
+ const whole = JSON.parse(trimmed);
23
+ if (Array.isArray(whole))
24
+ return whole;
25
+ }
26
+ catch {
27
+ // Cut off: scan for the complete top-level items below.
28
+ }
29
+ const rows = [];
30
+ let depth = 0;
31
+ let start = -1;
32
+ let quoted = false;
33
+ let escaped = false;
34
+ for (let at = 1; at < trimmed.length; at += 1) {
35
+ const character = trimmed[at];
36
+ if (quoted) {
37
+ if (escaped)
38
+ escaped = false;
39
+ else if (character === "\\")
40
+ escaped = true;
41
+ else if (character === '"')
42
+ quoted = false;
43
+ continue;
44
+ }
45
+ if (character === '"') {
46
+ quoted = true;
47
+ if (depth === 0 && start < 0)
48
+ start = at;
49
+ }
50
+ else if (character === "{" || character === "[") {
51
+ if (depth === 0)
52
+ start = at;
53
+ depth += 1;
54
+ }
55
+ else if (character === "}" || character === "]") {
56
+ depth -= 1;
57
+ if (depth < 0)
58
+ break;
59
+ if (depth === 0 && start >= 0) {
60
+ try {
61
+ rows.push(JSON.parse(trimmed.slice(start, at + 1)));
62
+ }
63
+ catch {
64
+ // Not a complete item.
65
+ }
66
+ start = -1;
67
+ }
68
+ }
69
+ }
70
+ return rows;
71
+ }
72
+ /** Count completed rows only; retained text is just the unfinished line. */
73
+ export function rowStop(limits) {
74
+ const decoder = new TextDecoder();
75
+ let pending = "";
76
+ let rows = 0;
77
+ return (chunk) => {
78
+ if (limits.maxRows === undefined)
79
+ return false;
80
+ pending += decoder.decode(chunk, { stream: true });
81
+ const lines = pending.split("\n");
82
+ pending = lines.pop() ?? "";
83
+ for (const line of lines) {
84
+ if (line.trim() === "")
85
+ continue;
86
+ let row;
87
+ try {
88
+ row = JSON.parse(line);
89
+ }
90
+ catch {
91
+ continue;
92
+ }
93
+ if (limits.accept && !limits.accept(row))
94
+ continue;
95
+ if (++rows >= limits.maxRows)
96
+ return true;
97
+ }
98
+ return false;
99
+ };
100
+ }