@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
package/dist/catalog.js CHANGED
@@ -155,9 +155,13 @@ const CONVERSATIONAL_QUERY_WORDS = new Set([
155
155
  * search into an unfiltered catalog browse.
156
156
  */
157
157
  export function lexicalSearchQuery(query) {
158
+ return lexicalSearchContent(query) || query;
159
+ }
160
+ /** Normalized content only; empty means every query word was framing. */
161
+ export function lexicalSearchContent(query) {
158
162
  const terms = normalized(query).split(/\s+/).filter(Boolean);
159
163
  const contentTerms = terms.filter((term) => !CONVERSATIONAL_QUERY_WORDS.has(term));
160
- return contentTerms.length > 0 ? contentTerms.join(" ") : query;
164
+ return contentTerms.join(" ");
161
165
  }
162
166
  const searchIndexes = new WeakMap();
163
167
  function indexFor(tools) {
@@ -1,30 +1,5 @@
1
1
  import { CONFIG_DEFAULTS } from "./config-defaults.js";
2
- import { Effect } from "effect";
3
- import { runEdge } from "./runtime/run.js";
4
2
  const DEFAULT_DISCOVERY_CONCURRENCY = CONFIG_DEFAULTS.discovery.concurrency;
5
3
  export function resolveDiscoveryConcurrency(value) {
6
4
  return value !== undefined && Number.isInteger(value) && value > 0 ? value : DEFAULT_DISCOVERY_CONCURRENCY;
7
5
  }
8
- /**
9
- * Run `fn` over `items` with at most `limit` operations in flight, settling
10
- * every one: a rejection lands in its slot instead of cancelling the rest.
11
- * Results keep input order whatever order the work finishes in. A limit below
12
- * one runs the items one at a time.
13
- */
14
- export function mapSettledWithConcurrency(items, limit, fn) {
15
- return runEdge(Effect.forEach(items, (item, index) => Effect.tryPromise({
16
- // Promise.resolve keeps a non-promise return from `fn` working, as
17
- // `await` did; a synchronous throw is caught either way.
18
- try: () => Promise.resolve(fn(item, index)),
19
- catch: (reason) => reason,
20
- }).pipe(Effect.match({
21
- onSuccess: (value) => ({
22
- status: "fulfilled",
23
- value,
24
- }),
25
- onFailure: (reason) => ({
26
- status: "rejected",
27
- reason,
28
- }),
29
- })), { concurrency: limit >= 1 ? Math.floor(limit) : 1 }));
30
- }
@@ -28,6 +28,7 @@ export declare const CONFIG_DEFAULTS: {
28
28
  readonly queueTimeoutMs: 5000;
29
29
  readonly retryAfterMs: 1000;
30
30
  readonly maxDurationMs: 300000;
31
+ readonly maxBodyBytes: number;
31
32
  };
32
33
  readonly code: {
33
34
  readonly concurrency: 2;
@@ -35,6 +35,7 @@ export const CONFIG_DEFAULTS = {
35
35
  queueTimeoutMs: 5_000,
36
36
  retryAfterMs: 1_000,
37
37
  maxDurationMs: 300_000,
38
+ maxBodyBytes: 4 * 1024 * 1024,
38
39
  },
39
40
  code: {
40
41
  concurrency: 2,
@@ -34,6 +34,8 @@ interface Variants {
34
34
  readonly key: readonly string[];
35
35
  readonly cases: Readonly<Record<string, Shape>>;
36
36
  readonly otherwise?: string;
37
+ /** Migration guards that throw rather than construct; omit them from valid choices. */
38
+ readonly rejected?: readonly string[];
37
39
  }
38
40
  type InputOf<F> = F extends Field<infer In, unknown, boolean> ? In : never;
39
41
  type OutputOf<F> = F extends Field<unknown, infer Out, boolean> ? Out : never;
@@ -129,7 +131,7 @@ export declare function instance<F extends AnyField>(field: F): F & {
129
131
  * its path and the valid values, so no union falls through to "no case". Only
130
132
  * the walk reads variants; the factory validates the remaining values itself.
131
133
  */
132
- export declare function variants(key: string | readonly string[], cases: Readonly<Record<string, Shape>>, otherwise?: string): Field<unknown, unknown, true>;
134
+ export declare function variants(key: string | readonly string[], cases: Readonly<Record<string, Shape>>, otherwise?: string, rejected?: readonly string[]): Field<unknown, unknown, true>;
133
135
  /**
134
136
  * A closed object for the unknown-key walk only: each named key may hold
135
137
  * anything, which its factory validates. For the options of a built-in
@@ -11,10 +11,12 @@
11
11
  // Deliberately small. Opaque fields (connectors, modules, functions) are
12
12
  // checked by identity or shape and passed through untouched, never cloned, so
13
13
  // a private-field receiver or a frozen object reaches core as configured.
14
+ import { keepErrorName } from "./redaction-identity.js";
14
15
  /** A structural configuration mistake, thrown before construction does work. */
15
16
  export class ConfigError extends TypeError {
16
17
  name = "ConfigError";
17
18
  }
19
+ keepErrorName(ConfigError, "ConfigError");
18
20
  function fail(message) {
19
21
  throw new ConfigError(message);
20
22
  }
@@ -192,13 +194,18 @@ export function instance(field) {
192
194
  * its path and the valid values, so no union falls through to "no case". Only
193
195
  * the walk reads variants; the factory validates the remaining values itself.
194
196
  */
195
- export function variants(key, cases, otherwise) {
197
+ export function variants(key, cases, otherwise, rejected) {
196
198
  const path = typeof key === "string" ? [key] : [...key];
197
199
  if (path.length === 0)
198
200
  throw new Error("variants() requires a discriminant key.");
199
201
  return {
200
202
  ...opaque(),
201
- variants: { key: path, cases, ...(otherwise !== undefined ? { otherwise } : {}) },
203
+ variants: {
204
+ key: path,
205
+ cases,
206
+ ...(otherwise !== undefined ? { otherwise } : {}),
207
+ ...(rejected ? { rejected } : {}),
208
+ },
202
209
  };
203
210
  }
204
211
  /**
@@ -233,7 +240,9 @@ export function assertKnownOptions(value, path, field) {
233
240
  if (read.unknown.length === 0)
234
241
  return read.value;
235
242
  return fail(`Unknown option${read.unknown.length === 1 ? "" : "s"}: ${read.unknown.join(", ")}. ` +
236
- "Check the spelling against the factory's options type.");
243
+ (read.unknown.some((key) => key.endsWith(".classify"))
244
+ ? "classify was removed; use ConnectaConfig.classification."
245
+ : "Check the spelling against the factory's options type."));
237
246
  }
238
247
  /**
239
248
  * Own property descriptors, read without invoking any accessor. A config
@@ -317,6 +326,7 @@ function inspectRecord(value, path, field) {
317
326
  function selectShape(inspected, path, variants) {
318
327
  const at = `${path}.${variants.key.join(".")}`;
319
328
  const valid = Object.keys(variants.cases)
329
+ .filter((name) => !variants.rejected?.includes(name))
320
330
  .map((name) => JSON.stringify(name))
321
331
  .join(", ");
322
332
  // Walk the key path one plain object at a time, reading descriptors only.
package/dist/config.d.ts CHANGED
@@ -90,6 +90,8 @@ declare const codeAdmission: {
90
90
  retryAfterMs: import("./config-schema.js").Field<number, number, true>;
91
91
  };
92
92
  declare const requestAdmission: {
93
+ /** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
94
+ maxBodyBytes: import("./config-schema.js").Field<number, number, true>;
93
95
  /** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
94
96
  maxDurationMs: import("./config-schema.js").Field<number, number, true>;
95
97
  /** Simultaneous work admitted to this pool. */
@@ -107,12 +109,14 @@ declare const admission: {
107
109
  * 5-second maximum wait.
108
110
  */
109
111
  requests: import("./config-schema.js").Field<{
112
+ maxBodyBytes?: number | undefined;
110
113
  maxDurationMs?: number | undefined;
111
114
  concurrency?: number | undefined;
112
115
  maxQueueSize?: number | undefined;
113
116
  queueTimeoutMs?: number | undefined;
114
117
  retryAfterMs?: number | undefined;
115
118
  }, {
119
+ readonly maxBodyBytes: number;
116
120
  readonly maxDurationMs: number;
117
121
  readonly concurrency: number;
118
122
  readonly maxQueueSize: number;
@@ -120,6 +124,8 @@ declare const admission: {
120
124
  readonly retryAfterMs: number;
121
125
  }, true> & {
122
126
  readonly shape: {
127
+ /** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
128
+ maxBodyBytes: import("./config-schema.js").Field<number, number, true>;
123
129
  /** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
124
130
  maxDurationMs: import("./config-schema.js").Field<number, number, true>;
125
131
  /** Simultaneous work admitted to this pool. */
@@ -194,6 +200,19 @@ declare const pool: {
194
200
  * `/mcp` never shows it.
195
201
  */
196
202
  description: import("./config-schema.js").Field<string, string | undefined, true>;
203
+ /**
204
+ * The tools this pool's endpoints list. `"meta"`, the default, is the six
205
+ * meta-tools. `"native"` lists each downstream tool directly, named
206
+ * `<connector>__<tool>` and annotated from its classification, for clients
207
+ * that run their own tool search; calls take the same invocation path.
208
+ */
209
+ surface: import("./config-schema.js").Field<"native" | "meta", "native" | "meta" | undefined, true>;
210
+ /**
211
+ * `false` drops `execute_code` from a native pool and lists `read_result`
212
+ * for paging instead. Only valid with `surface: "native"`: the meta surface
213
+ * always includes it.
214
+ */
215
+ executeCode: import("./config-schema.js").Field<boolean, boolean | undefined, true>;
197
216
  };
198
217
  declare const connectaConfig: {
199
218
  connectors: import("./config-schema.js").Field<Connector[], readonly Connector[], false>;
@@ -201,13 +220,16 @@ declare const connectaConfig: {
201
220
  auth: import("./config-schema.js").Field<InboundAuth | InboundAuth[], readonly InboundAuth[], true>;
202
221
  /**
203
222
  * Agents, declared by name: lowercase letters, digits, `_` and `-`, each
204
- * unique. Each has one `cta_` token slot that operators issue, rotate, and
223
+ * unique. With `accessTokens`, each has one `cta_` slot operators issue, rotate, and
205
224
  * revoke; nothing outside code adds, renames, or rebinds an agent. Removing
206
- * a name stops its token on the next request. Requires `accessTokens`.
225
+ * a name stops its credentials on the next request. A string name requires
226
+ * `accessTokens`; `{ name, vercel: { team, project, environments? } }` also
227
+ * accepts Vercel OIDC. Requires an immutable team_ ID; prefer a prj_ ID for the project. Environments
228
+ * default to production. Both credential types may coexist.
207
229
  * An admitted agent carries `identity.agent` and has no principal, so
208
230
  * personal connectors are absent for it. Defaults to none.
209
231
  */
210
- agents: import("./config-schema.js").Field<readonly string[], readonly string[], true>;
232
+ agents: import("./config-schema.js").Field<readonly import("./agent-config.js").AgentConfig[], readonly import("./agent-config.js").ResolvedAgent[], true>;
211
233
  /**
212
234
  * The people who may use plain `/mcp`, which serves the whole catalog with
213
235
  * the deployment's `readOnly`, and who administer the deployment. Same
@@ -220,6 +242,8 @@ declare const connectaConfig: {
220
242
  readOnly?: boolean | undefined;
221
243
  owner?: string | undefined;
222
244
  description?: string | undefined;
245
+ surface?: "native" | "meta" | undefined;
246
+ executeCode?: boolean | undefined;
223
247
  tools: readonly string[];
224
248
  members: readonly MemberRef[];
225
249
  }>, Readonly<Record<string, {
@@ -228,9 +252,12 @@ declare const connectaConfig: {
228
252
  readonly members: readonly MemberRef[];
229
253
  readonly owner: string | undefined;
230
254
  readonly description: string | undefined;
255
+ readonly surface: "native" | "meta" | undefined;
256
+ readonly executeCode: boolean | undefined;
231
257
  }>> | undefined, true>;
232
- /** Exact connector id -> tool name -> verdict. Unknown names fail at catalog publication. */
233
- classification: import("./config-schema.js").Field<Record<string, Record<string, "read" | "write">>, Readonly<Record<string, Readonly<Record<string, "read" | "write">>>> | undefined, true>;
258
+ /** Exact connector id -> tool name -> verdict. Hidden tools cannot be discovered or called.
259
+ * Unknown static names fail construction; absent runtime names stay dormant and are reported. */
260
+ classification: import("./config-schema.js").Field<Record<string, Record<string, "read" | "write" | "hidden">>, Readonly<Record<string, Readonly<Record<string, "read" | "write" | "hidden">>>> | undefined, true>;
234
261
  /**
235
262
  * The deployment's one store: `d1Storage(env.CONNECTA_DB)` from
236
263
  * `@zackbart/connecta/d1` on Workers, `sqliteStorage(path)` from
@@ -391,6 +418,7 @@ declare const connectaConfig: {
391
418
  */
392
419
  admission: import("./config-schema.js").Field<{
393
420
  requests?: {
421
+ maxBodyBytes?: number | undefined;
394
422
  maxDurationMs?: number | undefined;
395
423
  concurrency?: number | undefined;
396
424
  maxQueueSize?: number | undefined;
@@ -405,6 +433,7 @@ declare const connectaConfig: {
405
433
  } | undefined;
406
434
  }, {
407
435
  readonly requests: {
436
+ readonly maxBodyBytes: number;
408
437
  readonly maxDurationMs: number;
409
438
  readonly concurrency: number;
410
439
  readonly maxQueueSize: number;
@@ -424,12 +453,14 @@ declare const connectaConfig: {
424
453
  * 5-second maximum wait.
425
454
  */
426
455
  requests: import("./config-schema.js").Field<{
456
+ maxBodyBytes?: number | undefined;
427
457
  maxDurationMs?: number | undefined;
428
458
  concurrency?: number | undefined;
429
459
  maxQueueSize?: number | undefined;
430
460
  queueTimeoutMs?: number | undefined;
431
461
  retryAfterMs?: number | undefined;
432
462
  }, {
463
+ readonly maxBodyBytes: number;
433
464
  readonly maxDurationMs: number;
434
465
  readonly concurrency: number;
435
466
  readonly maxQueueSize: number;
@@ -437,6 +468,8 @@ declare const connectaConfig: {
437
468
  readonly retryAfterMs: number;
438
469
  }, true> & {
439
470
  readonly shape: {
471
+ /** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
472
+ maxBodyBytes: import("./config-schema.js").Field<number, number, true>;
440
473
  /** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
441
474
  maxDurationMs: import("./config-schema.js").Field<number, number, true>;
442
475
  /** Simultaneous work admitted to this pool. */
@@ -566,7 +599,8 @@ type Parsed = ConfigOutput<typeof connectaConfig>;
566
599
  * The configuration a Connecta runs with: validated, every default applied,
567
600
  * auth ordered, and `serverInfo` named and versioned. Built once by createConnecta; nothing downstream re-derives it.
568
601
  */
569
- export interface ResolvedConfig extends Omit<Parsed, "serverInfo"> {
602
+ export interface ResolvedConfig extends Omit<Parsed, "serverInfo" | "agents"> {
603
+ readonly agents: readonly string[];
570
604
  /** `serverInfo` with its name and version defaults applied. */
571
605
  readonly serverInfo: {
572
606
  readonly name: string;
package/dist/config.js CHANGED
@@ -1,19 +1,8 @@
1
- // ConnectaConfig as one schema.
2
- //
3
- // The schema below is the canonical record of the configuration surface. It
4
- // produces the TypeScript type a deployment writes (`ConnectaConfig`), the
5
- // unknown-key rejection createConnecta runs before reading anything, every
6
- // default (src/config-defaults.ts), and one validation policy: a present value
7
- // that is wrong throws with its path at construction (INV-11). Each field's
8
- // default and operator-facing meaning belongs in its doc comment here, where a
9
- // deployment author reads it from the editor.
10
- //
11
- // `resolveConfig` turns an accepted config into the `ResolvedConfig` core
12
- // reads, with defaults applied once, so no later layer re-derives a value or
13
- // re-plumbs a field.
1
+ import { registerAgentDescriptions } from "./agent-description.js";
14
2
  import { CONFIG_DEFAULTS as D } from "./config-defaults.js";
15
3
  import { array, ConfigError, object, opaque, record, required, seconds, readPlain, text, whole, } from "./config-schema.js";
16
- import { assertAgentNames } from "./agent-identity.js";
4
+ import { agentConfig } from "./agent-config.js";
5
+ import { vercelAgentAuth } from "./auth/vercel-agent.js";
17
6
  import { assertExecutor } from "./executor-contract.js";
18
7
  import { memoryStorage } from "./storage/memory.js";
19
8
  import { CONNECTA_VERSION } from "./version.js";
@@ -156,6 +145,8 @@ function admissionPool(defaults) {
156
145
  const codeAdmission = admissionPool(D.admission.code);
157
146
  const requestAdmission = {
158
147
  ...admissionPool(D.admission.requests),
148
+ /** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
149
+ maxBodyBytes: whole({ min: 1, default: D.admission.requests.maxBodyBytes }),
159
150
  /** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
160
151
  maxDurationMs: whole({
161
152
  min: 1,
@@ -261,6 +252,24 @@ const pool = {
261
252
  * `/mcp` never shows it.
262
253
  */
263
254
  description: opaque({ check: assertPoolDescription }),
255
+ /**
256
+ * The tools this pool's endpoints list. `"meta"`, the default, is the six
257
+ * meta-tools. `"native"` lists each downstream tool directly, named
258
+ * `<connector>__<tool>` and annotated from its classification, for clients
259
+ * that run their own tool search; calls take the same invocation path.
260
+ */
261
+ surface: opaque({
262
+ check: (value, path) => {
263
+ if (value !== "meta" && value !== "native")
264
+ throw new ConfigError(`${path} must be "meta" or "native".`);
265
+ },
266
+ }),
267
+ /**
268
+ * `false` drops `execute_code` from a native pool and lists `read_result`
269
+ * for paging instead. Only valid with `surface: "native"`: the meta surface
270
+ * always includes it.
271
+ */
272
+ executeCode: opaque({ check: assertFlag }),
264
273
  };
265
274
  const icon = {
266
275
  src: required(text()),
@@ -315,16 +324,16 @@ const connectaConfig = {
315
324
  }),
316
325
  /**
317
326
  * Agents, declared by name: lowercase letters, digits, `_` and `-`, each
318
- * unique. Each has one `cta_` token slot that operators issue, rotate, and
327
+ * unique. With `accessTokens`, each has one `cta_` slot operators issue, rotate, and
319
328
  * revoke; nothing outside code adds, renames, or rebinds an agent. Removing
320
- * a name stops its token on the next request. Requires `accessTokens`.
329
+ * a name stops its credentials on the next request. A string name requires
330
+ * `accessTokens`; `{ name, vercel: { team, project, environments? } }` also
331
+ * accepts Vercel OIDC. Requires an immutable team_ ID; prefer a prj_ ID for the project. Environments
332
+ * default to production. Both credential types may coexist.
321
333
  * An admitted agent carries `identity.agent` and has no principal, so
322
334
  * personal connectors are absent for it. Defaults to none.
323
335
  */
324
- agents: opaque({
325
- check: (value, path) => assertAgentNames(value, path),
326
- resolve: (value) => Object.freeze([...(value ?? [])]),
327
- }),
336
+ agents: agentConfig,
328
337
  /**
329
338
  * The people who may use plain `/mcp`, which serves the whole catalog with
330
339
  * the deployment's `readOnly`, and who administer the deployment. Same
@@ -334,11 +343,12 @@ const connectaConfig = {
334
343
  maintainers: opaque({ check: assertMemberList }),
335
344
  /** Named tool pools, each served at `/mcp/<name>` to its members only. */
336
345
  pools: record(object(pool)),
337
- /** Exact connector id -> tool name -> verdict. Unknown names fail at catalog publication. */
346
+ /** Exact connector id -> tool name -> verdict. Hidden tools cannot be discovered or called.
347
+ * Unknown static names fail construction; absent runtime names stay dormant and are reported. */
338
348
  classification: record(record(opaque({
339
349
  check: (value, path) => {
340
- if (value !== "read" && value !== "write") {
341
- throw new ConfigError(`${path} must be "read" or "write".`);
350
+ if (value !== "read" && value !== "write" && value !== "hidden") {
351
+ throw new ConfigError(`${path} must be "read", "write", or "hidden".`);
342
352
  }
343
353
  },
344
354
  }))),
@@ -566,7 +576,7 @@ function assertCoherent(config) {
566
576
  config.discovery.catalogMaxTtlSeconds > 86_400) {
567
577
  throw new ConfigError("ConnectaConfig.discovery requires catalogMinTtlSeconds <= catalogMaxTtlSeconds <= 86400.");
568
578
  }
569
- if (config.agents.length > 0 && !config.accessTokens) {
579
+ if (config.agents.some((agent) => !agent.vercel) && !config.accessTokens) {
570
580
  throw new ConfigError("ConnectaConfig.agents needs accessTokens: accessTokens(storage) from @zackbart/connecta/auth/access-tokens " +
571
581
  "holds each agent's token slot.");
572
582
  }
@@ -598,14 +608,18 @@ export function readConfig(config) {
598
608
  version: parsed.serverInfo.version ?? CONNECTA_VERSION,
599
609
  };
600
610
  // The token module admits exactly the agents this configuration declares.
601
- const accessTokens = parsed.accessTokens?.forAgents(parsed.agents);
611
+ const agents = Object.freeze(parsed.agents.map((agent) => agent.name));
612
+ const accessTokens = parsed.accessTokens?.forAgents(agents);
613
+ const vercel = vercelAgentAuth(parsed.agents, parsed.logger);
602
614
  const resolved = Object.freeze({
603
615
  ...parsed,
616
+ agents,
604
617
  accessTokens,
605
618
  // A managed-token module contributes one more provider, ordered with the rest.
606
- auth: accessTokens ? normalizeAuth([accessTokens.auth, ...parsed.auth]) : parsed.auth,
619
+ auth: normalizeAuth([...(accessTokens ? [accessTokens.auth] : []), ...(vercel ? [vercel] : []), ...parsed.auth]),
607
620
  serverInfo: Object.freeze(info),
608
621
  });
622
+ registerAgentDescriptions(resolved, parsed.agents, accessTokens !== undefined);
609
623
  return { input, resolved };
610
624
  }
611
625
  /**
@@ -18,5 +18,9 @@ export interface ConnectorCaller {
18
18
  */
19
19
  poolOwner?: string;
20
20
  }
21
+ /** Mark a connector whose downstream identity depends on the admitted caller. */
22
+ export declare function tagCallerIdentity<C extends object>(connector: C): C;
23
+ /** Provider construction may wrap a connector in an inheriting object. */
24
+ export declare function usesCallerIdentity(connector: object): boolean;
21
25
  export declare function attachCaller(ctx: ConnectorContext, caller: ConnectorCaller | undefined): ConnectorContext;
22
26
  export declare function callerOf(ctx: ConnectorContext): ConnectorCaller | undefined;
@@ -19,12 +19,25 @@
19
19
  // through an inbound-auth provider configured to read one (a bearer's asserted
20
20
  // principal). A context no request admitted, such as an operator probe, has no caller, and a delegated provider fails closed on it,
21
21
  // as it does on the anonymous caller an open deployment admits.
22
- const callers = new WeakMap();
22
+ import { Caller, serviceFor, setViewService } from "./runtime/call.js";
23
+ const callerIdentities = new WeakSet();
24
+ /** Mark a connector whose downstream identity depends on the admitted caller. */
25
+ export function tagCallerIdentity(connector) {
26
+ callerIdentities.add(connector);
27
+ return connector;
28
+ }
29
+ /** Provider construction may wrap a connector in an inheriting object. */
30
+ export function usesCallerIdentity(connector) {
31
+ for (let current = connector; current; current = Object.getPrototypeOf(current)) {
32
+ if (callerIdentities.has(current))
33
+ return true;
34
+ }
35
+ return false;
36
+ }
23
37
  export function attachCaller(ctx, caller) {
24
- if (caller)
25
- callers.set(ctx, caller);
38
+ setViewService(ctx, Caller, caller);
26
39
  return ctx;
27
40
  }
28
41
  export function callerOf(ctx) {
29
- return callers.get(ctx);
42
+ return serviceFor(ctx, Caller);
30
43
  }
@@ -42,6 +42,10 @@ export interface ApiOAuthConfig {
42
42
  authorizationEndpoint: string;
43
43
  /** Where codes are exchanged and refresh tokens redeemed. Absolute https URL. */
44
44
  tokenEndpoint: string;
45
+ /** Trusted RFC 7009 endpoint; disconnect removes the local grant then attempts revocation once. */
46
+ revocationEndpoint?: string;
47
+ /** Revocation body encoding, default form. JSON omits the RFC 7009 token_type_hint. */
48
+ revocationRequestFormat?: "form" | "json";
45
49
  /** The client id the provider issued for this deployment. */
46
50
  clientId: string;
47
51
  /**
@@ -64,6 +68,15 @@ export interface ApiOAuthConfig {
64
68
  * `access_type`. The grant's own parameters cannot be overridden.
65
69
  */
66
70
  authorizationParams?: Record<string, string>;
71
+ /**
72
+ * Fixed provider callback parameters, such as a configured company id.
73
+ * After pending-state verification, each must occur exactly once with this
74
+ * exact value, before issuer validation or code exchange. OAuth response
75
+ * fields (code, state, iss, error, error_description, error_uri) are reserved.
76
+ * Names must be nonempty ASCII letters, digits, dots, underscores or hyphens;
77
+ * values must be nonempty strings. Values are never described or returned.
78
+ */
79
+ expectedCallbackParameters?: Readonly<Record<string, string>>;
67
80
  /**
68
81
  * Headers added to every token-endpoint request — the code exchange and
69
82
  * each refresh — for a provider whose token endpoint demands its own
@@ -85,9 +98,12 @@ export interface ApiOAuthAccess {
85
98
  /**
86
99
  * `fetch` with the calling owner's access token as `Authorization: Bearer`.
87
100
  * Only to `apiOrigins`; redirects are returned unfollowed. A 401 earns one
88
- * coordinated refresh and one replay; a second 401, a refused refresh, or
89
- * no grant at all throws `auth_required`, and an authorization-server
90
- * outage throws a retryable `unavailable`.
101
+ * coordinated refresh. Only a positively read-classified GET/HEAD without
102
+ * method-override headers is sent once more; a write's never is, and the call fails with `connector_call_failed`
103
+ * whose outcome is unknown, so the agent checks the target before
104
+ * repeating it. A second 401, a refused refresh, or no grant at all throws
105
+ * `auth_required`, and an authorization-server outage throws a retryable
106
+ * `unavailable`.
91
107
  */
92
108
  fetch(input: string | URL, init?: RequestInit): Promise<Response>;
93
109
  }
@@ -196,6 +212,7 @@ export declare const API_OPTIONS: import("../config-schema.js").Field<unknown, u
196
212
  oauth: import("../config-schema.js").Field<unknown, unknown, true> & {
197
213
  readonly shape: {
198
214
  authorizationParams: import("../config-schema.js").Field<Record<string, string>, Readonly<Record<string, string>> | undefined, true>;
215
+ expectedCallbackParameters: import("../config-schema.js").Field<Record<string, string>, Readonly<Record<string, string>> | undefined, true>;
199
216
  tokenRequestHeaders: import("../config-schema.js").Field<Record<string, string>, Readonly<Record<string, string>> | undefined, true>;
200
217
  scope: import("../config-schema.js").Field<unknown, unknown, true>;
201
218
  authorizationEndpoint: import("../config-schema.js").Field<unknown, unknown, true>;
@@ -205,15 +222,17 @@ export declare const API_OPTIONS: import("../config-schema.js").Field<unknown, u
205
222
  pkce: import("../config-schema.js").Field<unknown, unknown, true>;
206
223
  clientId: import("../config-schema.js").Field<unknown, unknown, true>;
207
224
  clientSecret: import("../config-schema.js").Field<unknown, unknown, true>;
225
+ revocationEndpoint: import("../config-schema.js").Field<unknown, unknown, true>;
226
+ revocationRequestFormat: import("../config-schema.js").Field<unknown, unknown, true>;
208
227
  };
209
228
  };
210
229
  tools: import("../config-schema.js").Field<unknown[], readonly unknown[] | undefined, true>;
211
230
  title: import("../config-schema.js").Field<unknown, unknown, true>;
231
+ authScope: import("../config-schema.js").Field<unknown, unknown, true>;
232
+ maxResultBytes: import("../config-schema.js").Field<unknown, unknown, true>;
212
233
  description: import("../config-schema.js").Field<unknown, unknown, true>;
213
234
  testCredential: import("../config-schema.js").Field<unknown, unknown, true>;
214
235
  testCredentials: import("../config-schema.js").Field<unknown, unknown, true>;
215
- authScope: import("../config-schema.js").Field<unknown, unknown, true>;
216
- maxResultBytes: import("../config-schema.js").Field<unknown, unknown, true>;
217
236
  validateArgs: import("../config-schema.js").Field<unknown, unknown, true>;
218
237
  };
219
238
  };
@@ -230,12 +249,15 @@ export interface ApiOAuthHooks {
230
249
  }): Promise<ConnectorStatus>;
231
250
  disconnectAuth(ctx: ConnectorContext): Promise<void>;
232
251
  verifyState(state: string | null, ctx: ConnectorContext): Promise<boolean>;
252
+ verifyCallbackParameters(params: URLSearchParams, ctx: ConnectorContext): Promise<boolean>;
233
253
  verifyCallbackIssuer(issuer: string | null, ctx: ConnectorContext): Promise<boolean>;
234
254
  consumeAuthError(ctx: ConnectorContext): Promise<void>;
235
255
  /** Requires callbackParams with a nonempty state, including without PKCE. */
236
256
  finishAuth(code: string, ctx: ConnectorContext, callbackParams: URLSearchParams): Promise<void>;
237
- /** The handler-facing accessor for one call's context. */
238
- access(ctx: ConnectorContext): ApiOAuthAccess;
257
+ /** The handler-facing accessor for one call's context; a write's request is never resent. */
258
+ access(ctx: ConnectorContext, call: {
259
+ write: boolean;
260
+ }): ApiOAuthAccess;
239
261
  }
240
262
  /**
241
263
  * A static connector; every tool passes {@link checkToolContract} first.