@zackbart/connecta 0.34.0 → 0.35.0

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