@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
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The next steady evidence. A settled connector takes its current row; one
3
+ * being read again keeps its previous evidence when this identity has any.
4
+ * Returns `previous` itself when nothing changed, so it can live in React
5
+ * state. A new identity starts empty.
6
+ */
7
+ export function steadyHealth(state, previous) {
8
+ const same = previous?.generation === state.generation ? previous : null;
9
+ const contract = state.contract?.role === "maintainer" && state.data ? state.contract : null;
10
+ // No contract on screen: keep what was shown until the next one arrives.
11
+ if (!contract || !state.data)
12
+ return same ?? { generation: state.generation, rows: Object.create(null) };
13
+ const reading = new Set(state.data.connectors.filter((c) => c.status === "loading").map((c) => c.id));
14
+ const held = same?.rows ?? Object.create(null);
15
+ const rows = Object.create(null);
16
+ let changed = !same || Object.keys(held).length !== contract.live.connectors.length;
17
+ for (const live of contract.live.connectors) {
18
+ const before = Object.hasOwn(held, live.id) ? held[live.id] : undefined;
19
+ if (before && reading.has(live.id)) {
20
+ rows[live.id] = before;
21
+ continue;
22
+ }
23
+ const failed = Object.hasOwn(state.connectorFailures, live.id) && Boolean(state.connectorFailures[live.id]);
24
+ if (before?.live === live && before.failed === failed)
25
+ rows[live.id] = before;
26
+ else {
27
+ rows[live.id] = { live, failed };
28
+ changed = true;
29
+ }
30
+ }
31
+ return changed ? { generation: state.generation, rows } : same;
32
+ }
33
+ /** The contract each view renders health from, with every live row replaced by its steady evidence. */
34
+ export function shownHealth(contract, health) {
35
+ const signals = Object.create(null);
36
+ if (!contract)
37
+ return { contract, signals };
38
+ let replaced = false;
39
+ const connectors = contract.live.connectors.map((live) => {
40
+ const row = Object.hasOwn(health.rows, live.id) ? health.rows[live.id] : undefined;
41
+ if (row?.failed)
42
+ signals[live.id] = { failed: true };
43
+ if (!row || row.live === live)
44
+ return live;
45
+ replaced = true;
46
+ return row.live;
47
+ });
48
+ return {
49
+ contract: replaced ? { ...contract, live: { ...contract.live, connectors } } : contract,
50
+ signals,
51
+ };
52
+ }
@@ -1,6 +1,6 @@
1
1
  import type { ConnectaConfigDescription } from "../describe-config.js";
2
+ import type { CatalogAccessObservation, ResourceTemplateRefusalCode } from "../types.js";
2
3
  import type { OperatorConnectorOverlay, OperatorTool } from "./contract.js";
3
- import type { CatalogAccessObservation, CatalogDriftReport, ResourceTemplateRefusalCode } from "../types.js";
4
4
  /** Tool verdicts, independent of whether the selected pool is read-only. */
5
5
  export type UiToolSafety = "runs_in_programs" | "needs_approval";
6
6
  export interface UiTool extends Pick<OperatorTool, "name" | "address" | "description"> {
@@ -91,7 +91,6 @@ export interface UiConnector {
91
91
  * drifted — which is why the UI renders that as its own state rather than as
92
92
  * a clean one.
93
93
  */
94
- catalogDrift?: CatalogDriftReport;
95
94
  /** Last agent-facing catalog read in this runtime; never persisted. */
96
95
  catalogAccess?: CatalogAccessObservation;
97
96
  resourceTemplateRefusals?: ResourceTemplateRefusalCode[];
@@ -114,7 +113,7 @@ export interface UiData {
114
113
  */
115
114
  pools?: string[];
116
115
  }
117
- export interface FilteredUiConnector {
116
+ interface FilteredUiConnector {
118
117
  connector: UiConnector;
119
118
  tools: UiTool[];
120
119
  }
@@ -13,7 +13,7 @@ function affects(paths) {
13
13
  return paths.length ? `Affects ${joinList(paths)}` : "No endpoint serves it";
14
14
  }
15
15
  /**
16
- * One row per connector that is not healthy, failing first, then one per
16
+ * One row per connector that is not healthy, in config order, then one per
17
17
  * agent that sits in an endpoint without a working token. Each row carries
18
18
  * the fix the rest of the UI already offers for it.
19
19
  */
@@ -26,7 +26,7 @@ export function attentionItems(contract, options = {}) {
26
26
  const live = contract.live.connectors.find((c) => c.id === config.id);
27
27
  if (!live)
28
28
  continue;
29
- const signals = options.signals?.[config.id] ?? {};
29
+ const signals = options.signals && Object.hasOwn(options.signals, config.id) ? options.signals[config.id] : {};
30
30
  const verdict = connectorVerdict(live, signals);
31
31
  if ((verdict.tone !== "warn" && verdict.tone !== "danger") || !verdict.action)
32
32
  continue;
@@ -71,22 +71,16 @@ export function attentionItems(contract, options = {}) {
71
71
  fix: null,
72
72
  });
73
73
  }
74
- else {
75
- // Healthy but drifted: the live tool list differs from the reviewed one.
76
- connectors.push({
77
- ...base,
78
- problem: "has a changed tool list",
79
- body: affects(paths),
80
- fix: { kind: "catalog_drift", connectorId: config.id },
81
- });
82
- }
83
74
  }
84
75
  const agents = contract.agents
85
- .filter((agent) => agent.pools.length && agent.token.state !== "issued")
76
+ .filter((agent) => agent.pools.length &&
77
+ !agent.credentialTypes.includes("vercel_oidc") &&
78
+ agent.token &&
79
+ agent.token.state !== "issued")
86
80
  .map((agent) => {
87
81
  // An agent connects only at a pool's agent URL.
88
82
  const paths = agent.pools.map((name) => contract.pools.find((pool) => pool.name === name)?.agentPath ?? `/agent/${name}`);
89
- const revoked = agent.token.state === "revoked";
83
+ const revoked = agent.token?.state === "revoked";
90
84
  return {
91
85
  key: `agent:${agent.name}`,
92
86
  kind: "agent",
@@ -101,11 +95,9 @@ export function attentionItems(contract, options = {}) {
101
95
  fix: null,
102
96
  };
103
97
  });
104
- return [
105
- ...connectors.filter((item) => item.tone === "danger"),
106
- ...connectors.filter((item) => item.tone === "warn"),
107
- ...agents,
108
- ];
98
+ // Severity changes as individual details settle. Config order keeps surviving
99
+ // rows in place without waiting for the slowest connector's read.
100
+ return [...connectors, ...agents];
109
101
  }
110
102
  /** The numbers above the list, counted from the same map the page draws. */
111
103
  export function overviewHeadline(contract, map, items, signals = {}) {
@@ -113,7 +105,7 @@ export function overviewHeadline(contract, map, items, signals = {}) {
113
105
  const live = contract.live.connectors.find((c) => c.id === config.id);
114
106
  if (!live)
115
107
  return [];
116
- const health = connectorVerdict(live, signals[config.id]);
108
+ const health = connectorVerdict(live, Object.hasOwn(signals, config.id) ? signals[config.id] : undefined);
117
109
  return [{ id: config.id, title: config.title ?? config.id, tone: health.tone, label: health.label }];
118
110
  });
119
111
  const healthy = bar.filter((entry) => entry.tone === "ok").length;
@@ -22,10 +22,6 @@ export function clientServerName(serverName, pool) {
22
22
  .slice(0, 48) || "connecta";
23
23
  return pool ? `${base}-${pool}` : base;
24
24
  }
25
- /** The URL for a pool: `/mcp` plus its name, which config limits to `[a-z0-9_-]`. */
26
- export function poolEndpointUrl(mcpUrl, pool) {
27
- return `${mcpUrl.replace(/\/+$/, "")}/${encodeURIComponent(pool)}`;
28
- }
29
25
  /** POSIX single-quoting, only when the value needs it. */
30
26
  function shellWord(value) {
31
27
  return /^[A-Za-z0-9_./:@%+=,~-]+$/.test(value) ? value : `'${value.replace(/'/g, `'"'"'`)}'`;
@@ -1,8 +1,7 @@
1
+ import type { AgentSlot } from "./agents.js";
1
2
  import type { OperatorRole, OperatorUiContractV2 } from "./contract.js";
2
- import type { CatalogDriftReport } from "../types.js";
3
- import type { CredentialManagementCapability, UiConnector, UiData, UiProblem } from "./model.js";
4
3
  import type { FixPromptKind } from "./fix-prompts.js";
5
- import type { AgentSlot } from "./agents.js";
4
+ import type { UiConnector, UiData, UiProblem } from "./model.js";
6
5
  export declare function registrationPathLabel(path: NonNullable<UiConnector["registrationPath"]>): string;
7
6
  export type OperatorPage = "overview" | "endpoints" | "settings" | "connector" | "tokens" | "connections" | "activity";
8
7
  /** Pages the nav lists, in dashboard order. */
@@ -302,7 +301,6 @@ export declare function resetIdentity(state: OperatorState, gate?: Notice | null
302
301
  * typed credential, and the notices that answered the page just left.
303
302
  */
304
303
  export declare function withPage(state: OperatorState, page: OperatorPage): OperatorState;
305
- export declare function credentialUnavailableCopy(capability?: CredentialManagementCapability): string;
306
304
  /**
307
305
  * The status badge. An auth-needed connector is named by what it needs, so a
308
306
  * row whose fix is "Add credential" does not say "Authorization needed".
@@ -318,9 +316,8 @@ export declare function problemCopy(problem: UiProblem | undefined): string | nu
318
316
  * error. The two used to share the red box, so the row contradicted itself.
319
317
  */
320
318
  export declare function problemTone(problem: UiProblem): "warn" | "danger";
321
- /** What the page knows about a connector beyond its live status: catalog drift and a failed detail read. */
319
+ /** What the page knows about a connector beyond its live status: a failed detail read. */
322
320
  export interface ConnectorSignals {
323
- drift?: boolean;
324
321
  failed?: boolean;
325
322
  }
326
323
  /** One connector's health everywhere it is shown: badge tone, status word, and the one action beside it. */
@@ -328,12 +325,12 @@ export interface ConnectorVerdict {
328
325
  tone: "ok" | "warn" | "danger" | "neutral";
329
326
  label: string;
330
327
  /** The link to the Connection tab, or null when the connector is fine. */
331
- action: "Connect" | "Replace key" | "Inspect" | "Review" | null;
328
+ action: "Connect" | "Replace key" | "Inspect" | null;
332
329
  }
333
330
  /**
334
331
  * The verdict the Connectors list, the Overview, Endpoints and a connector's
335
332
  * page all show. The server's problem code comes first, then a failed detail
336
- * read on this page, then a non-ok status, then catalog drift. A problem
333
+ * read on this page, then a non-ok status. Catalog drift is informational. A problem
337
334
  * outranks the status, so a connector whose catalog failed is never
338
335
  * "Connected". A failed read marks its connector `connector_unavailable` in
339
336
  * the store, so that one code beside a failed read is the page's own and
@@ -343,27 +340,6 @@ export declare function connectorVerdict(live: {
343
340
  status: string;
344
341
  problem?: UiProblem;
345
342
  }, signals?: ConnectorSignals): ConnectorVerdict;
346
- /**
347
- * Hosted-provider catalog drift, as an operator reads it
348
- * ([#343](https://github.com/zackbart/connecta/issues/343)).
349
- *
350
- * - `unavailable` — no refresh has been observed in this runtime, so there is
351
- * nothing to report. Deliberately not `clean`: "we have not looked" and "we
352
- * looked and it matches" are different answers, and only one of them is a
353
- * reason to stop worrying.
354
- * - `clean` — a refresh happened and every category counted zero.
355
- * - `warning` — a refresh happened and at least one category did not.
356
- */
357
- export type DriftState = "clean" | "warning" | "unavailable";
358
- export declare function driftState(drift?: CatalogDriftReport): DriftState;
359
- /** Every category with its count, so a clean report still shows its zeros. */
360
- export declare function driftCounts(drift?: CatalogDriftReport): Array<{
361
- key: string;
362
- label: string;
363
- count: number;
364
- }>;
365
- /** One line naming the state and when it was observed. Never what drifted. */
366
- export declare function driftSummary(drift?: CatalogDriftReport): string;
367
343
  /**
368
344
  * Only http/https may become a clickable href — the browser half of the gate
369
345
  * `src/ui.ts` applies before an authorizationUrl is ever serialized. A hostile
@@ -345,15 +345,6 @@ export function withPage(state, page) {
345
345
  confirming: null,
346
346
  };
347
347
  }
348
- export function credentialUnavailableCopy(capability) {
349
- if (capability === "no_slots") {
350
- return "No connector declares a credential slot. Credentials stay in code.";
351
- }
352
- if (capability === "vault_not_configured") {
353
- return "No credential vault is configured.";
354
- }
355
- return "Managing credentials needs an interactive sign-in. A bearer token can only view them.";
356
- }
357
348
  /**
358
349
  * The status badge. An auth-needed connector is named by what it needs, so a
359
350
  * row whose fix is "Add credential" does not say "Authorization needed".
@@ -425,7 +416,7 @@ function problemAction(problem) {
425
416
  /**
426
417
  * The verdict the Connectors list, the Overview, Endpoints and a connector's
427
418
  * page all show. The server's problem code comes first, then a failed detail
428
- * read on this page, then a non-ok status, then catalog drift. A problem
419
+ * read on this page, then a non-ok status. Catalog drift is informational. A problem
429
420
  * outranks the status, so a connector whose catalog failed is never
430
421
  * "Connected". A failed read marks its connector `connector_unavailable` in
431
422
  * the store, so that one code beside a failed read is the page's own and
@@ -443,57 +434,8 @@ export function connectorVerdict(live, signals = {}) {
443
434
  const tone = connectorStatusTone(live.status) === "warn" ? "warn" : "danger";
444
435
  return { tone, label: connectorStatusLabel(live.status), action: tone === "warn" ? "Connect" : "Inspect" };
445
436
  }
446
- if (signals.drift)
447
- return { tone: "warn", label: "Catalog drift", action: "Review" };
448
437
  return { tone: "ok", label: "Connected", action: null };
449
438
  }
450
- /**
451
- * The categories, in the order an operator should read them: what the
452
- * deployment refuses to call, what it can no longer call, what contradicts a
453
- * vetted verdict, and what changed shape underneath a reviewed schema. Counts
454
- * only — a name or a schema on this path would be the payload leak the whole
455
- * drift model exists to avoid.
456
- */
457
- const DRIFT_CATEGORIES = [
458
- { key: "unclassifiedTools", label: "Unclassified" },
459
- { key: "unservedTools", label: "Unserved" },
460
- { key: "annotationConflicts", label: "Annotation conflicts" },
461
- { key: "schemaChanges", label: "Schema changes" },
462
- { key: "droppedTools", label: "Dropped tool names" },
463
- ];
464
- function driftTotal(drift) {
465
- if (!drift)
466
- return 0;
467
- return DRIFT_CATEGORIES.reduce((sum, { key }) => sum + (drift[key] || 0), 0);
468
- }
469
- export function driftState(drift) {
470
- if (!drift)
471
- return "unavailable";
472
- return driftTotal(drift) > 0 ? "warning" : "clean";
473
- }
474
- /** Every category with its count, so a clean report still shows its zeros. */
475
- export function driftCounts(drift) {
476
- if (!drift)
477
- return [];
478
- return DRIFT_CATEGORIES.filter(({ key }) => key !== "droppedTools" || drift.droppedTools !== undefined).map(({ key, label }) => ({
479
- key,
480
- label,
481
- count: drift[key] || 0,
482
- }));
483
- }
484
- /** One line naming the state and when it was observed. Never what drifted. */
485
- export function driftSummary(drift) {
486
- const state = driftState(drift);
487
- if (state === "unavailable") {
488
- return "No catalog refresh yet.";
489
- }
490
- const observed = formatDate(drift?.observedAt);
491
- const when = observed ? ` · observed ${observed}` : "";
492
- if (state === "clean")
493
- return `Matches the reviewed manifest${when}`;
494
- const total = driftTotal(drift);
495
- return `${total} difference${total === 1 ? "" : "s"} from the reviewed manifest${when}`;
496
- }
497
439
  /**
498
440
  * Only http/https may become a clickable href — the browser half of the gate
499
441
  * `src/ui.ts` applies before an authorizationUrl is ever serialized. A hostile
@@ -528,6 +470,7 @@ const ACTOR_KINDS = {
528
470
  "cloudflare-access": "Cloudflare Access",
529
471
  anonymous: "Anonymous",
530
472
  access_token: "Agent token",
473
+ vercel_oidc: "Vercel workload",
531
474
  };
532
475
  /** How a caller signed in, as a person reads it. An unknown kind is shown as sent. */
533
476
  function actorKindLabel(kind) {
@@ -610,6 +553,7 @@ export function activityOutcomeBadge(outcome) {
610
553
  return OUTCOME_BADGE[outcome] ?? { label: "Failed", tone: "danger" };
611
554
  }
612
555
  const SOURCE_LABELS = {
556
+ native: "Native tool call",
613
557
  execute_code: "In a program",
614
558
  call_tool: "Direct call",
615
559
  call_destructive_tool: "Direct call, approved by the host",
@@ -17,28 +17,38 @@ export function writeStateOf(outcome) {
17
17
  error: outcome.error,
18
18
  ...(outcome.answered !== undefined ? { answered: outcome.answered } : {}),
19
19
  });
20
- return state === "unknown" && !outcome.ok && outcome.error.uncertainCall
20
+ if (state !== "unknown" || outcome.ok)
21
+ return state;
22
+ const { error } = outcome;
23
+ const handoff = (error.code === "auth_required" || error.code === "downstream_oauth_required") &&
24
+ error.nextAction &&
25
+ "tool" in error.nextAction &&
26
+ error.nextAction.tool === "authorize_connector"
21
27
  ? {
22
- state,
23
- uncertainCall: outcome.error.uncertainCall,
24
- ...(outcome.error.details?.stage !== undefined
25
- ? {
26
- deadline: {
27
- ...(outcome.error.details.operation !== undefined
28
- ? { operation: outcome.error.details.operation }
29
- : {}),
30
- stage: outcome.error.details.stage,
31
- ...(outcome.error.details.elapsedMs !== undefined
32
- ? { elapsedMs: outcome.error.details.elapsedMs }
33
- : {}),
34
- ...(outcome.error.details.deadlineMs !== undefined
35
- ? { deadlineMs: outcome.error.details.deadlineMs }
36
- : {}),
37
- },
38
- }
39
- : {}),
28
+ code: error.code,
29
+ ...(error.connector !== undefined ? { connector: error.connector } : {}),
30
+ ...(error.recovery !== undefined ? { recovery: error.recovery } : {}),
31
+ nextAction: error.nextAction,
32
+ ...(error.retry !== undefined ? { retry: error.retry } : {}),
40
33
  }
41
- : state;
34
+ : undefined;
35
+ if (!error.uncertainCall && !handoff)
36
+ return state;
37
+ return {
38
+ state,
39
+ ...(error.uncertainCall ? { uncertainCall: error.uncertainCall } : {}),
40
+ ...(error.uncertainCall && error.details?.stage !== undefined
41
+ ? {
42
+ deadline: {
43
+ ...(error.details.operation !== undefined ? { operation: error.details.operation } : {}),
44
+ stage: error.details.stage,
45
+ ...(error.details.elapsedMs !== undefined ? { elapsedMs: error.details.elapsedMs } : {}),
46
+ ...(error.details.deadlineMs !== undefined ? { deadlineMs: error.details.deadlineMs } : {}),
47
+ },
48
+ }
49
+ : {}),
50
+ ...(handoff ? { handoff } : {}),
51
+ };
42
52
  }
43
53
  /**
44
54
  * The writes one program sends. The play closes this when the
@@ -55,6 +65,7 @@ export class ProgramWrites {
55
65
  uncertainCalls = [];
56
66
  uncertainCallsTruncated = false;
57
67
  deadlines = [];
68
+ handoff;
58
69
  /** Whether the program has settled: a write gated now is not sent. */
59
70
  get isClosed() {
60
71
  return this.closed;
@@ -80,12 +91,15 @@ export class ProgramWrites {
80
91
  recorded = true;
81
92
  const state = typeof completion === "string" ? completion : completion.state;
82
93
  if (typeof completion !== "string") {
83
- if (this.uncertainCalls.length < 10)
84
- this.uncertainCalls.push(completion.uncertainCall);
85
- else
86
- this.uncertainCallsTruncated = true;
94
+ if (completion.uncertainCall) {
95
+ if (this.uncertainCalls.length < 10)
96
+ this.uncertainCalls.push(completion.uncertainCall);
97
+ else
98
+ this.uncertainCallsTruncated = true;
99
+ }
87
100
  if (completion.deadline && this.deadlines.length < 10)
88
101
  this.deadlines.push(completion.deadline);
102
+ this.handoff ??= completion.handoff;
89
103
  }
90
104
  this.states.push(state);
91
105
  this.inFlight.delete(settled);
@@ -108,10 +122,17 @@ export class ProgramWrites {
108
122
  unknown: this.states.filter((state) => state === "unknown").length,
109
123
  };
110
124
  if (writes.unknown > 0) {
125
+ // Caught or not, an authorization verdict a write met after it left is
126
+ // the result, as a direct call reports it: its code and handoff, never
127
+ // retryable, with the write's outcome unknown.
128
+ const handoff = this.handoff;
111
129
  return errorEnvelope({
112
- code: "write_outcome_unknown",
113
- message: "A write this program sent has no known outcome, so that is the result rather than what the program returned. It will not be sent again. Check its target before doing anything that depends on it. Argument echoes may be partial or absent; use the original arguments if reconciliation requires another call.",
130
+ code: handoff?.code ?? "write_outcome_unknown",
131
+ message: handoff
132
+ ? "A write this program sent failed authorization after it left, so whether it took effect is unknown, and that is the result rather than what the program returned. It will not be sent again. Check its target before doing anything that depends on it, and give nextAction to the operator to recover the connector. Argument echoes may be partial or absent; use the original arguments if reconciliation requires another call."
133
+ : "A write this program sent has no known outcome, so that is the result rather than what the program returned. It will not be sent again. Check its target before doing anything that depends on it. Argument echoes may be partial or absent; use the original arguments if reconciliation requires another call.",
114
134
  retryable: false,
135
+ ...(handoff ? { ...handoff, reconciliationRequired: true, writeOutcome: "unknown" } : {}),
115
136
  ...(this.deadlines.length > 0 ? { details: this.deadlines[0] } : {}),
116
137
  ...(this.deadlines.length > 1 ? { timeouts: this.deadlines } : {}),
117
138
  ...(this.uncertainCalls.length === 1
@@ -0,0 +1,115 @@
1
+ import { ConnectorCallError } from "./errors.js";
2
+ import type { Connector } from "./types.js";
3
+ export interface ProviderRequest {
4
+ readonly dispatched: boolean;
5
+ readonly status?: number;
6
+ auxiliary: boolean;
7
+ /** A kit auxiliary declared as a read lacked physical GET/HEAD proof at dispatch. */
8
+ readonly blocksAuxiliaryProof?: true;
9
+ provider: string;
10
+ /** The HTTP method it was sent with, when its channel knows it. */
11
+ readonly method?: string;
12
+ /** Positive operation/tool evidence; an HTTP method alone proves no read. */
13
+ classification?: "read" | "write" | undefined;
14
+ /** Remote MCP's source class said write, recorded at physical dispatch. */
15
+ readonly sourceWrite?: true;
16
+ /** The genuine, legal idempotency key the vendor honors that it carried; nothing else. */
17
+ key?: string;
18
+ /**
19
+ * Its answer was a 401 that the transport's reviewed `authBeforeExecution`
20
+ * evidence covers: the vendor rejected the credential before it acted on
21
+ * the request. Only that makes a 401 a refusal (`servedRefusal`).
22
+ */
23
+ authBeforeExecution?: true;
24
+ /**
25
+ * Its answer was a 401, and a renewal then replaced the credential it sent
26
+ * with a different one ({@link renewedAfterUnauthorized}). The 401 no
27
+ * longer needs the operator's recovery. The single `settleWrite` decider
28
+ * still reports unknown, without the handoff (Q8).
29
+ */
30
+ readonly renewed?: true;
31
+ }
32
+ export type CallTool = Connector["callTool"];
33
+ interface Boundary {
34
+ /** The api() or remoteMcp() object whose own code enters the logical call. */
35
+ boundary: object;
36
+ own: CallTool;
37
+ }
38
+ export declare function originalCallIdentity(connector: object): object;
39
+ export declare function boundaryFor(connector: object): Boundary | undefined;
40
+ export declare function delegatorFor(connector: object): CallTool | undefined;
41
+ /** A physical send owns its fields permanently; its own answer is recorded once. */
42
+ export declare function recordRequestField(request: ProviderRequest, field: keyof ProviderRequest, value: unknown): void;
43
+ export declare function recordProviderResponse(request: ProviderRequest, status: number): void;
44
+ /**
45
+ * Declare that every request the connector's handlers send goes through a
46
+ * channel the call ledger records: a guarded transport, `ctx.fetch`, or
47
+ * `ctx.oauth.fetch`. Only then does an empty ledger prove that a failed
48
+ * write never left. Maintained providers declare it; an arbitrary `api()`
49
+ * handler can reach the network some other way, so its ledger proves nothing.
50
+ */
51
+ export declare function tracksEveryRequest<T extends object>(connector: T): T;
52
+ export declare function tracksRequests(connector: object): boolean;
53
+ /**
54
+ * Declare a maintained connector whose `callTool` hands each call to at most
55
+ * one api() or remoteMcp() boundary and sends nothing else that could apply
56
+ * it (GitHub). Only then may that boundary's verdict stand for the call. The
57
+ * object and its function are recorded now, at construction: a later
58
+ * assignment to the property, or a copy of the object, declares nothing.
59
+ */
60
+ export declare function delegatesEachCall<T extends Connector>(connector: T): T;
61
+ /**
62
+ * Record a just-built api() or remoteMcp() object as a boundary, with its
63
+ * published `callTool`. Its own code then names the same object, from its
64
+ * closure, in {@link enterProviderBoundary}.
65
+ */
66
+ export declare function providerBoundary(connector: Connector): void;
67
+ /**
68
+ * `alias` serves `base` itself (`defineProvider`'s inheriting stamp), so it
69
+ * takes `base`'s recorded identities. Only construction code calls this.
70
+ */
71
+ export declare function aliasCallIdentity(alias: object, base: object): void;
72
+ /**
73
+ * Whether a served HTTP status says the request was refused, not applied: a
74
+ * 4xx other than 408. A 408 is a timeout, whose request may have been acted
75
+ * on; a 2xx or 5xx never proves a write unapplied. A 401 passes here, and
76
+ * `servedRefusal` still asks for the vendor's reviewed evidence.
77
+ */
78
+ export declare function refusedStatus(status: number | undefined): boolean;
79
+ /**
80
+ * Refusal provenance, recorded where the answer is observed: the request was
81
+ * served a refusing status (`refusedStatus`) and the mapper failed on it. An
82
+ * error code alone is never this evidence.
83
+ */
84
+ export declare function vendorRefusal<T>(error: T, request: ProviderRequest): T;
85
+ /** An authorization verdict, the kind that keeps the `authorize_connector` handoff. */
86
+ export declare function authorizationFailure(error: unknown): error is ConnectorCallError;
87
+ /**
88
+ * The authorization verdict `request`'s own 401 answer was mapped to, as
89
+ * {@link vendorRefusal} recorded it. Undefined when nothing mapped that
90
+ * answer, such as a body past the ceiling.
91
+ */
92
+ export declare function unauthorizedAnswer(request: ProviderRequest): ConnectorCallError | undefined;
93
+ /**
94
+ * A renewal answered `request`'s own 401 (a refresh, a login, a fresh token
95
+ * minted) with `fresh`, a credential other than `sent`, the one the request
96
+ * carried: that 401 no longer needs the operator's recovery (Q8). It names
97
+ * the one request it answered and never marks another. A renewal that hands
98
+ * back the credential the request already sent (an earlier recovery reused)
99
+ * renewed nothing.
100
+ */
101
+ export declare function renewedAfterUnauthorized(request: ProviderRequest | undefined, sent: string, fresh: string): void;
102
+ export declare function refusalRequest(error: unknown): ProviderRequest | undefined;
103
+ export declare function knownProviderFailure<T>(error: T): T;
104
+ export declare function isKnownProviderFailure(error: unknown): boolean;
105
+ /** Withdraw a verdict that does not hold for the call that reports it. */
106
+ export declare function forgetProviderFailure(error: object): void;
107
+ /** Preserve internal verdicts and resend advice through redaction and provider recovery wording. */
108
+ export declare function carryProviderFailure<T>(from: unknown, to: T): T;
109
+ /** Mark a verdict that already accounts for a write's 401 in its own words. */
110
+ export declare function explainedUnauthorizedVerdict<T>(error: T): T;
111
+ export declare function explainsUnauthorized(error: unknown): boolean;
112
+ /** Mark a verdict the Q8 decision made, final for every step after it. */
113
+ export declare function settledWrite<T>(error: T): T;
114
+ export declare function isSettledWrite(error: unknown): boolean;
115
+ export {};