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