@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
@@ -1,11 +1,17 @@
1
+ import { RequestScope, requestOwner } from "./runtime/request-scope.js";
2
+ import { upwardStep } from "./upward.js";
3
+ import { authAwait, authCall, authInvoke, authFlow, authMethod, registerAuthMethod, authOwnMethod, } from "./auth/native.js";
4
+ import { registryProgram } from "./runtime/registry.js";
1
5
  import { enableAuthorizationHandoffs } from "./authorization-handoff.js";
2
6
  import { createRequestStateCodec, inputRequired, ProtocolError, INVALID_PARAMS, PROTOCOL_VERSION_META_KEY, CLIENT_CAPABILITIES_META_KEY, } from "@modelcontextprotocol/server";
3
7
  import { Effect } from "effect";
4
8
  import { runEdge, withDeadlineEffect } from "./runtime/run.js";
5
9
  import { closeScope } from "./runtime/connector-scope.js";
6
10
  import { storedCredentialShape } from "./credential-rules.js";
11
+ import { isWriteLike } from "./tool-safety.js";
7
12
  import { authRecoveryFacts, bindReplayReads, classificationDigest } from "./invocation-auth.js";
8
13
  import { CatalogService } from "./catalog-service.js";
14
+ import { sentSecretsForRequest } from "./sent-secrets.js";
9
15
  import { DownstreamElicitation, MAX_RELAY_STATE_CHARS, } from "./downstream-input.js";
10
16
  import { canonicalState as canonical, requestDigest as digest, stateObject as object, invalidRequestState as invalidState, REQUEST_STATE_TTL_MS as TTL_MS, MAX_INPUT_ROUNDS as MAX_ROUNDS, } from "./request-state.js";
11
17
  const INPUT_KEY = "connecta_auth";
@@ -20,269 +26,372 @@ export class AuthElicitation {
20
26
  codec;
21
27
  downstream;
22
28
  stateCodec() {
23
- const key = this.options.vault?.requestStateKey;
24
- if (!key)
25
- return invalidState();
26
- return (this.codec ??= key.call(this.options.vault).then((bytes) => createRequestStateCodec({
27
- key: bytes,
28
- ttlSeconds: TTL_MS / 1000,
29
- bind: () => canonical({ principal: this.options.principal, endpoint: this.options.endpoint }),
30
- })));
29
+ return runEdge(authOwnMethod(AuthElicitation.prototype, this, "stateCodec", []));
31
30
  }
32
31
  constructor(options) {
33
32
  this.options = options;
34
33
  this.downstream = new DownstreamElicitation({
35
34
  ...options,
36
- mint: async (state, context) => (await this.stateCodec()).mint(state, context),
35
+ mint: authMethod((state, context) => Effect.gen({ self: this }, function* () {
36
+ const codec = yield* authInvoke(this, "stateCodec", []);
37
+ return yield* authInvoke(codec, "mint", [state, context]);
38
+ })),
37
39
  });
38
40
  }
39
41
  /** The SDK runs this before any tool handler, including non-auth tools. */
40
- async verify(wire, context) {
41
- const { vault, endpoint, principal, registry, canManage } = this.options;
42
- if (!vault?.requestStateKey || wire.length > MAX_RELAY_STATE_CHARS)
43
- return invalidState();
44
- const state = await (await this.stateCodec()).verify(wire, context);
45
- if (object(state) && state.version === 2 && state.kind === "downstream")
46
- return this.downstream.verify(state, context);
47
- if (wire.length > 8192)
48
- return invalidState();
49
- if (!object(state) ||
50
- state.version !== 1 ||
51
- !principal ||
52
- state.principal !== principal ||
53
- state.endpoint !== endpoint ||
54
- typeof state.connector !== "string" ||
55
- !registry.getConnector(state.connector) ||
56
- !canManage(state.connector) ||
57
- !Number.isSafeInteger(state.expiresAt) ||
58
- state.expiresAt <= Date.now() ||
59
- state.expiresAt > Date.now() + TTL_MS ||
60
- !Number.isInteger(state.round) ||
61
- state.round < 1 ||
62
- state.round > MAX_ROUNDS ||
63
- !["call_tool", "call_destructive_tool", "execute_code", "authorize_connector"].includes(String(state.tool)) ||
64
- typeof state.digest !== "string" ||
65
- !/^[a-f0-9]{64}$/.test(state.digest) ||
66
- !Array.isArray(state.browserNonces) ||
67
- state.browserNonces.length !== state.round ||
68
- !state.browserNonces.every((nonce) => typeof nonce === "string" && /^[a-f0-9-]{36}$/.test(nonce)) ||
69
- !Array.isArray(state.reads) ||
70
- !state.reads.every((read) => object(read) &&
71
- typeof read.address === "string" &&
72
- typeof read.digest === "string" &&
73
- /^[a-f0-9]{64}$/.test(read.digest)) ||
74
- (state.address !== undefined && typeof state.address !== "string"))
75
- return invalidState();
76
- if (context.mcpReq.method !== "tools/call" || context.http?.req?.headers.get("Mcp-Name") !== state.tool)
77
- return invalidState();
78
- return state;
42
+ verify(wire, context) {
43
+ return runEdge(authOwnMethod(AuthElicitation.prototype, this, "verify", [
44
+ wire,
45
+ context,
46
+ ]));
79
47
  }
80
- async browserProgress(state) {
81
- let started;
82
- let claimed;
83
- let completed = false;
84
- let pending = false;
85
- for (const nonce of state.browserNonces) {
86
- const progress = await this.options.linkProgress(state.connector, nonce);
87
- if (progress === "started")
88
- started = nonce;
89
- if (progress === "claimed")
90
- claimed = nonce;
91
- completed ||= progress === "started";
92
- pending ||= progress === "claimed";
93
- }
94
- const predecessor = started ?? claimed;
95
- return { ...(predecessor ? { predecessor } : {}), completed: completed && !pending };
48
+ browserProgress(state) {
49
+ return runEdge(authOwnMethod(AuthElicitation.prototype, this, "browserProgress", [
50
+ state,
51
+ ]));
96
52
  }
97
- async connected(id, context) {
98
- const { registry, publicUrl, vault, principal, defer } = this.options;
99
- const connector = registry.getConnector(id);
100
- const scope = {};
101
- const signal = AbortSignal.any([context.mcpReq.signal, this.options.requestSignal]);
102
- try {
103
- return await runEdge(withDeadlineEffect((deadline) => Effect.gen(function* () {
104
- const ctx = registry.contextFor(id, publicUrl, scope, { signal: deadline });
105
- yield* Effect.addFinalizer(() => closeScope(connector, ctx, defer));
106
- if (connector.credential) {
107
- const metadata = yield* Effect.promise(() => vault.metadata(id, connector.authScope === "personal" ? principal : undefined));
108
- if (storedCredentialShape(connector.credential, metadata?.fields ?? null).state !== "valid")
109
- return false;
110
- }
111
- if (!connector.status)
112
- return Boolean(connector.credential);
113
- return ((yield* Effect.promise(() => registry.statusFor(id, publicUrl, scope, { signal: deadline }))).state ===
114
- "ok");
115
- }).pipe(Effect.scoped), { signal, timeoutMs: 5000, timeoutError: new Error("Auth status check timed out") }));
116
- }
117
- catch {
118
- return false;
119
- }
53
+ connected(id, context) {
54
+ return runEdge(authOwnMethod(AuthElicitation.prototype, this, "connected", [id, context]));
120
55
  }
121
- async run(tool, args, context, operation) {
56
+ bind(context) {
122
57
  this.downstream.bind(context);
123
- const prior = context.mcpReq.requestState();
124
- if (prior?.version === 2)
125
- return this.downstream.resume(prior, tool, args, context, operation);
126
- const previous = prior;
127
- const requestDigest = previous ? await digest(tool, args) : undefined;
128
- if (previous && (previous.tool !== tool || previous.digest !== requestDigest || previous.address !== args.address))
129
- return failure("invalid_request_state", "Invalid or expired requestState");
130
- const response = context.mcpReq.inputResponses?.[INPUT_KEY];
131
- if (previous && object(response) && !["accept", "decline", "cancel"].includes(String(response.action))) {
132
- throw new ProtocolError(INVALID_PARAMS, "Invalid auth elicitation response", {
133
- reason: "invalid_input_response",
134
- });
135
- }
136
- if (previous && !(await this.options.claimRetry(previous.connector, previous.browserNonces.at(-1)))) {
137
- return failure("invalid_request_state", "Invalid or expired requestState");
138
- }
139
- if (previous && object(response)) {
140
- if (response.action === "decline")
141
- return failure("auth_declined", "Connection was declined. The request was not retried.");
142
- if (response.action === "cancel")
143
- return failure("auth_cancelled", "Connection was cancelled. The request was not retried.");
144
- }
145
- if (previous?.reads.length) {
146
- const catalog = new CatalogService(this.options.registry, this.options.publicUrl, {
147
- requestScope: this.options.requestScope,
148
- requestSignal: AbortSignal.any([context.mcpReq.signal, this.options.requestSignal]),
149
- });
150
- // Recheck every entered read before restarting any part of a program.
151
- // A writable endpoint cannot authorize replay of a newly classified write.
152
- for (const read of previous.reads) {
153
- const current = await catalog.resolveTool(read.address, { signal: context.mcpReq.signal });
154
- if (!current.ok ||
155
- current.resolved.classificationFresh !== true ||
156
- current.resolved.definition.classification !== "read" ||
157
- (await classificationDigest(current.resolved.definition)) !== read.digest) {
58
+ }
59
+ run(tool, args, context, operation) {
60
+ return runEdge(authOwnMethod(AuthElicitation.prototype, this, "run", [
61
+ tool,
62
+ args,
63
+ context,
64
+ operation,
65
+ ]));
66
+ }
67
+ static {
68
+ registerAuthMethod(this.prototype, "stateCodec", function () {
69
+ const self = this;
70
+ return authAwait(Effect.gen(function* () {
71
+ const key = self.options.vault?.requestStateKey;
72
+ if (!key)
73
+ return invalidState();
74
+ self.codec ??= yield* Effect.cached(authCall(key, [], self.options.vault).pipe(Effect.map((bytes) => createRequestStateCodec({
75
+ key: bytes,
76
+ ttlSeconds: TTL_MS / 1000,
77
+ bind: () => canonical({ principal: self.options.principal, endpoint: self.options.endpoint }),
78
+ }))));
79
+ return yield* self.codec;
80
+ }), this.options.requestSignal).pipe(Effect.provideService(RequestScope, requestOwner(this.options.requestScope)));
81
+ }, this.prototype.stateCodec);
82
+ registerAuthMethod(AuthElicitation.prototype, "run", function (tool, args, context, operation) {
83
+ const self = this;
84
+ return authAwait(authFlow(function* () {
85
+ self.bind(context);
86
+ const prior = context.mcpReq.requestState();
87
+ if (prior?.version === 2)
88
+ return yield* upwardStep(authInvoke(self.downstream, "resume", [
89
+ prior,
90
+ tool,
91
+ args,
92
+ context,
93
+ operation,
94
+ ]));
95
+ const previous = prior;
96
+ const requestDigest = previous ? yield* upwardStep(authCall(digest, [tool, args])) : undefined;
97
+ if (previous &&
98
+ (previous.wireTool !== context.http?.req?.headers.get("Mcp-Name") ||
99
+ previous.tool !== tool ||
100
+ previous.digest !== requestDigest ||
101
+ previous.address !== args.address))
102
+ return failure("invalid_request_state", "Invalid or expired requestState");
103
+ const response = context.mcpReq.inputResponses?.[INPUT_KEY];
104
+ if (previous && object(response) && !["accept", "decline", "cancel"].includes(String(response.action))) {
105
+ throw new ProtocolError(INVALID_PARAMS, "Invalid auth elicitation response", {
106
+ reason: "invalid_input_response",
107
+ });
108
+ }
109
+ if (previous &&
110
+ !(yield* upwardStep(authInvoke(self.options, "claimRetry", [previous.connector, previous.browserNonces.at(-1)])))) {
111
+ return failure("invalid_request_state", "Invalid or expired requestState");
112
+ }
113
+ if (previous && object(response)) {
114
+ if (response.action === "decline")
115
+ return failure("auth_declined", "Connection was declined. The request was not retried.");
116
+ if (response.action === "cancel")
117
+ return failure("auth_cancelled", "Connection was cancelled. The request was not retried.");
118
+ }
119
+ if (previous?.reads.length) {
120
+ const catalog = new CatalogService(self.options.registry, self.options.publicUrl, {
121
+ requestScope: self.options.requestScope,
122
+ requestSignal: AbortSignal.any([context.mcpReq.signal, self.options.requestSignal]),
123
+ });
124
+ // Recheck every entered read before restarting any part of a program.
125
+ // A writable endpoint cannot authorize replay of a newly classified write.
126
+ for (const read of previous.reads) {
127
+ const current = yield* upwardStep(authInvoke(catalog, "resolveTool", [
128
+ read.address,
129
+ { signal: context.mcpReq.signal },
130
+ ]));
131
+ if (!current.ok ||
132
+ current.resolved.classificationFresh !== true ||
133
+ isWriteLike(current.resolved.definition) ||
134
+ (yield* upwardStep(authCall(classificationDigest, [current.resolved.definition]))) !==
135
+ read.digest) {
136
+ const structuredContent = {
137
+ ok: false,
138
+ error: {
139
+ code: "auth_replay_refused",
140
+ retryable: false,
141
+ reconciliationRequired: true,
142
+ message: "An entered read no longer has the same fresh classification. Reconcile its target before starting a new request.",
143
+ authorizationUrl: (yield* upwardStep(authInvoke(self.options, "connectLink", [previous.connector]))).url,
144
+ },
145
+ };
146
+ return {
147
+ isError: true,
148
+ structuredContent,
149
+ content: [{ type: "text", text: JSON.stringify(structuredContent) }],
150
+ };
151
+ }
152
+ }
153
+ bindReplayReads(self.options.requestScope, previous.reads);
154
+ }
155
+ const browser = previous && tool === "authorize_connector"
156
+ ? yield* upwardStep(authInvoke(self, "browserProgress", [previous]))
157
+ : undefined;
158
+ if (browser?.completed && previous) {
159
+ // Retire unspent links before the status read. A browser claim racing
160
+ // these CASes either wins and is observed as pending, or is refused.
161
+ yield* upwardStep(authInvoke(self.options, "closeLinks", [previous.connector, previous.browserNonces]));
162
+ if ((yield* upwardStep(authInvoke(self, "browserProgress", [previous]))).completed &&
163
+ (yield* upwardStep(authInvoke(self, "connected", [previous.connector, context])))) {
164
+ const structuredContent = { connector: previous.connector, status: "ok" };
165
+ return { structuredContent, content: [{ type: "text", text: JSON.stringify(structuredContent) }] };
166
+ }
167
+ }
168
+ const envelope = context.mcpReq.envelope;
169
+ const capabilities = envelope?.[CLIENT_CAPABILITIES_META_KEY];
170
+ const elicitation = object(capabilities) ? capabilities.elicitation : undefined;
171
+ const capable = envelope?.[PROTOCOL_VERSION_META_KEY] === "2026-07-28" &&
172
+ object(elicitation) &&
173
+ Object.hasOwn(elicitation, "url") &&
174
+ object(elicitation.url);
175
+ enableAuthorizationHandoffs(self.options.requestScope, !capable);
176
+ let result = yield* upwardStep(authCall(operation, []));
177
+ const relayed = yield* upwardStep(authInvoke(self.downstream, "finish", [
178
+ tool,
179
+ args,
180
+ context,
181
+ result,
182
+ previous,
183
+ ]));
184
+ if (relayed !== result)
185
+ return relayed;
186
+ const error = result.structuredContent?.error;
187
+ const authFailure = result.isError &&
188
+ object(error) &&
189
+ (error.code === "auth_required" || error.code === "downstream_oauth_required");
190
+ const explicit = tool === "authorize_connector" &&
191
+ ["oauth", "operator_config"].includes(String(result.structuredContent?.recovery));
192
+ if (!authFailure && !explicit)
193
+ return result;
194
+ const id = authFailure ? error.connector : explicit ? args.connector : undefined;
195
+ // Every accepted retry owns new request-local facts. Handler-authored
196
+ // errors and program write summaries cannot establish replay eligibility.
197
+ const facts = yield* upwardStep(authCall(authRecoveryFacts, [self.options.requestScope, String(id)]));
198
+ const blocked = !explicit && (!facts.eligible || facts.writeEntered);
199
+ if (authFailure && (facts.unsafeEntered || (tool !== "call_tool" && !facts.eligible))) {
158
200
  const structuredContent = {
159
- ok: false,
201
+ ...result.structuredContent,
160
202
  error: {
161
- code: "auth_replay_refused",
203
+ ...error,
162
204
  retryable: false,
163
205
  reconciliationRequired: true,
164
- message: "An entered read no longer has the same fresh classification. Reconcile its target before starting a new request.",
165
- authorizationUrl: (await this.options.connectLink(previous.connector)).url,
206
+ retry: "This call may have partially run. Reconcile its target before retrying after the operator completes recovery.",
207
+ },
208
+ };
209
+ result = {
210
+ ...result,
211
+ structuredContent,
212
+ content: [{ type: "text", text: JSON.stringify(structuredContent) }],
213
+ };
214
+ }
215
+ const { registry, vault, principal, publicUrl, canManage, unavailable } = self.options;
216
+ const connector = typeof id === "string" ? registry.getConnector(id) : undefined;
217
+ const recoverable = connector?.startAuth || (connector?.credential && self.options.credentialUi);
218
+ if (typeof id !== "string" ||
219
+ !/^[a-z0-9_-]+$/.test(id) ||
220
+ !recoverable ||
221
+ !principal ||
222
+ !publicUrl ||
223
+ unavailable ||
224
+ !canManage(id))
225
+ return result;
226
+ // Incapable hosts already received the shared explicit-authorization handoff.
227
+ if (!capable)
228
+ return result;
229
+ if (blocked || !vault?.requestStateKey || !vault.seal || !vault.open) {
230
+ if (!authFailure)
231
+ return result;
232
+ const structuredContent = {
233
+ ...result.structuredContent,
234
+ error: {
235
+ ...result.structuredContent?.error,
236
+ authorizationUrl: error.authorizationUrl ??
237
+ (yield* upwardStep(authInvoke(self.options, "connectLink", [id])))
238
+ .url,
166
239
  },
167
240
  };
168
241
  return {
169
- isError: true,
242
+ ...result,
170
243
  structuredContent,
171
244
  content: [{ type: "text", text: JSON.stringify(structuredContent) }],
172
245
  };
173
246
  }
174
- }
175
- bindReplayReads(this.options.requestScope, previous.reads);
176
- }
177
- const browser = previous && tool === "authorize_connector" ? await this.browserProgress(previous) : undefined;
178
- if (browser?.completed && previous) {
179
- // Retire unspent links before the status read. A browser claim racing
180
- // these CASes either wins and is observed as pending, or is refused.
181
- await this.options.closeLinks(previous.connector, previous.browserNonces);
182
- if ((await this.browserProgress(previous)).completed && (await this.connected(previous.connector, context))) {
183
- const structuredContent = { connector: previous.connector, status: "ok" };
184
- return { structuredContent, content: [{ type: "text", text: JSON.stringify(structuredContent) }] };
185
- }
186
- }
187
- const envelope = context.mcpReq.envelope;
188
- const capabilities = envelope?.[CLIENT_CAPABILITIES_META_KEY];
189
- const elicitation = object(capabilities) ? capabilities.elicitation : undefined;
190
- const capable = envelope?.[PROTOCOL_VERSION_META_KEY] === "2026-07-28" &&
191
- object(elicitation) &&
192
- Object.hasOwn(elicitation, "url") &&
193
- object(elicitation.url);
194
- enableAuthorizationHandoffs(this.options.requestScope, !capable);
195
- let result = await operation();
196
- const relayed = await this.downstream.finish(tool, args, context, result, previous);
197
- if (relayed !== result)
198
- return relayed;
199
- const error = result.structuredContent?.error;
200
- const authFailure = result.isError && object(error) && (error.code === "auth_required" || error.code === "downstream_oauth_required");
201
- const explicit = tool === "authorize_connector" &&
202
- ["oauth", "operator_config"].includes(String(result.structuredContent?.recovery));
203
- if (!authFailure && !explicit)
204
- return result;
205
- const id = authFailure ? error.connector : explicit ? args.connector : undefined;
206
- // Every accepted retry owns new request-local facts. Handler-authored
207
- // errors and program write summaries cannot establish replay eligibility.
208
- const facts = await authRecoveryFacts(this.options.requestScope, String(id));
209
- const blocked = !explicit && (!facts.eligible || facts.writeEntered);
210
- if (authFailure && (facts.unsafeEntered || (tool !== "call_tool" && !facts.eligible))) {
211
- const structuredContent = {
212
- ...result.structuredContent,
213
- error: {
214
- ...error,
215
- retryable: false,
216
- reconciliationRequired: true,
217
- retry: "This call may have partially run. Reconcile its target before retrying after the operator completes recovery.",
218
- },
219
- };
220
- result = { ...result, structuredContent, content: [{ type: "text", text: JSON.stringify(structuredContent) }] };
221
- }
222
- const { registry, vault, principal, publicUrl, canManage, unavailable } = this.options;
223
- const connector = typeof id === "string" ? registry.getConnector(id) : undefined;
224
- const recoverable = connector?.startAuth || (connector?.credential && this.options.credentialUi);
225
- if (typeof id !== "string" ||
226
- !/^[a-z0-9_-]+$/.test(id) ||
227
- !recoverable ||
228
- !principal ||
229
- !publicUrl ||
230
- unavailable ||
231
- !canManage(id))
232
- return result;
233
- // Incapable hosts already received the shared explicit-authorization handoff.
234
- if (!capable)
235
- return result;
236
- if (blocked || !vault?.requestStateKey || !vault.seal || !vault.open) {
237
- if (!authFailure)
238
- return result;
239
- const structuredContent = {
240
- ...result.structuredContent,
241
- error: {
242
- ...result.structuredContent?.error,
243
- authorizationUrl: error.authorizationUrl ?? (await this.options.connectLink(id)).url,
244
- },
245
- };
246
- return { ...result, structuredContent, content: [{ type: "text", text: JSON.stringify(structuredContent) }] };
247
- }
248
- if (previous && previous.round >= MAX_ROUNDS)
249
- return failure("auth_round_limit", "Connection is still required after three prompts. Connect explicitly, then start a new request.");
250
- // Once a verified browser has started this attempt, retries continue it.
251
- // A pending consent must never be reset by another force=true prompt.
252
- const forced = explicit && args.force === true;
253
- const link = await this.options.connectLink(id, forced && !browser?.predecessor, forced ? browser?.predecessor : undefined);
254
- const state = {
255
- version: 1,
256
- principal,
257
- endpoint: this.options.endpoint,
258
- connector: id,
259
- tool,
260
- ...(typeof args.address === "string" ? { address: args.address } : {}),
261
- digest: requestDigest ?? (await digest(tool, args)),
262
- round: (previous?.round ?? 0) + 1,
263
- expiresAt: previous?.expiresAt ?? Date.now() + TTL_MS,
264
- browserNonces: [...(previous?.browserNonces ?? []), link.nonce],
265
- reads: [...new Map([...(previous?.reads ?? []), ...facts.reads].map((read) => [read.address, read])).values()],
266
- };
267
- const wire = await (await this.stateCodec()).mint(state, context);
268
- if (wire.length > 8192) {
269
- const structuredContent = {
270
- ...result.structuredContent,
271
- error: {
272
- ...result.structuredContent?.error,
273
- authorizationUrl: link.url,
274
- },
275
- };
276
- return { ...result, structuredContent, content: [{ type: "text", text: JSON.stringify(structuredContent) }] };
277
- }
278
- return inputRequired({
279
- inputRequests: {
280
- [INPUT_KEY]: inputRequired.elicitUrl({
281
- message: MESSAGE,
282
- url: link.url,
283
- }),
284
- },
285
- requestState: wire,
286
- });
247
+ if (previous && previous.round >= MAX_ROUNDS)
248
+ return failure("auth_round_limit", "Connection is still required after three prompts. Connect explicitly, then start a new request.");
249
+ // Once a verified browser has started this attempt, retries continue it.
250
+ // A pending consent must never be reset by another force=true prompt.
251
+ const forced = explicit && args.force === true;
252
+ const link = yield* upwardStep(authInvoke(self.options, "connectLink", [
253
+ id,
254
+ forced && !browser?.predecessor,
255
+ forced ? browser?.predecessor : undefined,
256
+ ]));
257
+ const state = {
258
+ version: 1,
259
+ principal,
260
+ endpoint: self.options.endpoint,
261
+ connector: id,
262
+ tool,
263
+ ...(typeof args.address === "string" ? { address: args.address } : {}),
264
+ wireTool: context.http?.req?.headers.get("Mcp-Name") ?? tool,
265
+ digest: requestDigest ?? (yield* upwardStep(authCall(digest, [tool, args]))),
266
+ round: (previous?.round ?? 0) + 1,
267
+ expiresAt: previous?.expiresAt ?? Date.now() + TTL_MS,
268
+ browserNonces: [...(previous?.browserNonces ?? []), link.nonce],
269
+ reads: [
270
+ ...new Map([...(previous?.reads ?? []), ...facts.reads].map((read) => [read.address, read])).values(),
271
+ ],
272
+ };
273
+ const wire = yield* upwardStep(authInvoke(yield* upwardStep(authInvoke(self, "stateCodec", [])), "mint", [state, context]));
274
+ // Signed state and its connect link carry only Connecta's facts: a coincidental match must
275
+ // not corrupt them.
276
+ sentSecretsForRequest(self.options.requestScope).mintedState(wire);
277
+ sentSecretsForRequest(self.options.requestScope).mintedState(link.url);
278
+ if (wire.length > 8192) {
279
+ const structuredContent = {
280
+ ...result.structuredContent,
281
+ error: {
282
+ ...result.structuredContent?.error,
283
+ authorizationUrl: link.url,
284
+ },
285
+ };
286
+ return {
287
+ ...result,
288
+ structuredContent,
289
+ content: [{ type: "text", text: JSON.stringify(structuredContent) }],
290
+ };
291
+ }
292
+ return inputRequired({
293
+ inputRequests: {
294
+ [INPUT_KEY]: inputRequired.elicitUrl({
295
+ message: MESSAGE,
296
+ url: link.url,
297
+ }),
298
+ },
299
+ requestState: wire,
300
+ });
301
+ }), this.options.requestSignal).pipe(Effect.provideService(RequestScope, requestOwner(this.options.requestScope)));
302
+ }, AuthElicitation.prototype.run);
303
+ registerAuthMethod(AuthElicitation.prototype, "connected", function (id, context) {
304
+ const self = this;
305
+ return authAwait(authFlow(function* () {
306
+ const { registry, publicUrl, vault, principal, defer } = self.options;
307
+ const connector = registry.getConnector(id);
308
+ const scope = {};
309
+ const signal = AbortSignal.any([context.mcpReq.signal, self.options.requestSignal]);
310
+ try {
311
+ return yield* upwardStep(withDeadlineEffect((deadline) => Effect.gen(function* () {
312
+ const ctx = registry.contextFor(id, publicUrl, scope, { signal: deadline });
313
+ yield* upwardStep(Effect.addFinalizer(() => closeScope(connector, ctx, defer)));
314
+ if (connector.credential) {
315
+ const metadata = yield* upwardStep(Effect.promise(() => vault.metadata(id, connector.authScope === "personal" ? principal : undefined)));
316
+ if (storedCredentialShape(connector.credential, metadata?.fields ?? null).state !== "valid")
317
+ return false;
318
+ }
319
+ if (!connector.status)
320
+ return Boolean(connector.credential);
321
+ return ((yield* upwardStep(registryProgram(registry, "statusFor", id, publicUrl, scope, { signal: deadline }))).state === "ok");
322
+ }).pipe(Effect.scoped), { signal, timeoutMs: 5000, timeoutError: new Error("Auth status check timed out") }));
323
+ }
324
+ catch {
325
+ return false;
326
+ }
327
+ }), this.options.requestSignal).pipe(Effect.provideService(RequestScope, requestOwner(this.options.requestScope)));
328
+ }, AuthElicitation.prototype.connected);
329
+ registerAuthMethod(AuthElicitation.prototype, "browserProgress", function (state) {
330
+ const self = this;
331
+ return authAwait(authFlow(function* () {
332
+ let started;
333
+ let claimed;
334
+ let completed = false;
335
+ let pending = false;
336
+ for (const nonce of state.browserNonces) {
337
+ const progress = yield* upwardStep(authInvoke(self.options, "linkProgress", [
338
+ state.connector,
339
+ nonce,
340
+ ]));
341
+ if (progress === "started")
342
+ started = nonce;
343
+ if (progress === "claimed")
344
+ claimed = nonce;
345
+ completed ||= progress === "started";
346
+ pending ||= progress === "claimed";
347
+ }
348
+ const predecessor = started ?? claimed;
349
+ return { ...(predecessor ? { predecessor } : {}), completed: completed && !pending };
350
+ }), this.options.requestSignal).pipe(Effect.provideService(RequestScope, requestOwner(this.options.requestScope)));
351
+ }, AuthElicitation.prototype.browserProgress);
352
+ registerAuthMethod(AuthElicitation.prototype, "verify", function (wire, context) {
353
+ const self = this;
354
+ return authAwait(authFlow(function* () {
355
+ const { vault, endpoint, principal, registry, canManage } = self.options;
356
+ if (!vault?.requestStateKey || wire.length > MAX_RELAY_STATE_CHARS)
357
+ return invalidState();
358
+ const state = yield* upwardStep(authInvoke(yield* upwardStep(authInvoke(self, "stateCodec", [])), "verify", [wire, context]));
359
+ if (object(state) && state.version === 2 && state.kind === "downstream")
360
+ return yield* upwardStep(authInvoke(self.downstream, "verify", [state, context]));
361
+ if (wire.length > 8192)
362
+ return invalidState();
363
+ if (!object(state) ||
364
+ state.version !== 1 ||
365
+ !principal ||
366
+ state.principal !== principal ||
367
+ state.endpoint !== endpoint ||
368
+ typeof state.connector !== "string" ||
369
+ !registry.getConnector(state.connector) ||
370
+ !canManage(state.connector) ||
371
+ !Number.isSafeInteger(state.expiresAt) ||
372
+ state.expiresAt <= Date.now() ||
373
+ state.expiresAt > Date.now() + TTL_MS ||
374
+ !Number.isInteger(state.round) ||
375
+ state.round < 1 ||
376
+ state.round > MAX_ROUNDS ||
377
+ !["call_tool", "call_destructive_tool", "execute_code", "authorize_connector"].includes(String(state.tool)) ||
378
+ typeof state.wireTool !== "string" ||
379
+ typeof state.digest !== "string" ||
380
+ !/^[a-f0-9]{64}$/.test(state.digest) ||
381
+ !Array.isArray(state.browserNonces) ||
382
+ state.browserNonces.length !== state.round ||
383
+ !state.browserNonces.every((nonce) => typeof nonce === "string" && /^[a-f0-9-]{36}$/.test(nonce)) ||
384
+ !Array.isArray(state.reads) ||
385
+ !state.reads.every((read) => object(read) &&
386
+ typeof read.address === "string" &&
387
+ typeof read.digest === "string" &&
388
+ /^[a-f0-9]{64}$/.test(read.digest)) ||
389
+ (state.address !== undefined && typeof state.address !== "string"))
390
+ return invalidState();
391
+ if (context.mcpReq.method !== "tools/call" || context.http?.req?.headers.get("Mcp-Name") !== state.wireTool)
392
+ return invalidState();
393
+ return state;
394
+ }), this.options.requestSignal).pipe(Effect.provideService(RequestScope, requestOwner(this.options.requestScope)));
395
+ }, AuthElicitation.prototype.verify);
287
396
  }
288
397
  }