@zackbart/connecta 0.28.1 → 0.30.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 (332) hide show
  1. package/CHANGELOG.md +855 -5
  2. package/README.md +125 -116
  3. package/bin/connecta.mjs +121 -139
  4. package/bin/meta-tool-names.d.mts +2 -0
  5. package/bin/meta-tool-names.mjs +9 -0
  6. package/bin/version.mjs +3 -0
  7. package/dist/access-tokens.js +53 -63
  8. package/dist/activity-request.js +8 -0
  9. package/dist/activity.d.ts +76 -42
  10. package/dist/activity.js +110 -42
  11. package/dist/argument-redaction.js +230 -0
  12. package/dist/auth/clerk-sdk/client.d.ts +65 -0
  13. package/dist/auth/clerk-sdk/client.js +5 -0
  14. package/dist/auth/clerk-sdk/generated.js +1845 -0
  15. package/dist/auth/clerk-transport.js +19 -0
  16. package/dist/auth/clerk.d.ts +17 -7
  17. package/dist/auth/clerk.js +189 -107
  18. package/dist/auth/cloudflare-access.js +25 -26
  19. package/dist/auth/downstream-client-metadata.d.ts +29 -0
  20. package/dist/auth/downstream-client-metadata.js +133 -0
  21. package/dist/auth/downstream-oauth.js +1584 -1580
  22. package/dist/auth/downstream-revocation.js +106 -0
  23. package/dist/auth/oauth-token-response.js +231 -0
  24. package/dist/auth/oauth-v2-migration.js +116 -0
  25. package/dist/auth/static-oauth.js +93 -71
  26. package/dist/auth-elicitation.js +288 -0
  27. package/dist/authorization-handoff.js +111 -0
  28. package/dist/branding.d.ts +8 -16
  29. package/dist/branding.js +26 -59
  30. package/dist/byte-read-response.js +39 -0
  31. package/dist/call-admission.js +12 -16
  32. package/dist/catalog-cache.js +739 -0
  33. package/dist/catalog-drift.d.ts +50 -15
  34. package/dist/catalog-drift.js +365 -128
  35. package/dist/catalog-fingerprint.js +2 -4
  36. package/dist/catalog-freshness.js +13 -0
  37. package/dist/catalog-limits.js +2 -2
  38. package/dist/catalog-service.js +409 -225
  39. package/dist/catalog.js +43 -84
  40. package/dist/concurrency.js +3 -4
  41. package/dist/config-defaults.d.ts +39 -0
  42. package/dist/config-defaults.js +46 -0
  43. package/dist/config-schema.d.ts +181 -0
  44. package/dist/config-schema.js +435 -0
  45. package/dist/config-value-sources.js +102 -0
  46. package/dist/config.d.ts +633 -0
  47. package/dist/config.js +508 -0
  48. package/dist/connector-access.d.ts +1 -0
  49. package/dist/connector-access.js +13 -15
  50. package/dist/connector-caller.d.ts +8 -0
  51. package/dist/connector-caller.js +15 -6
  52. package/dist/connector-scope.js +1 -1
  53. package/dist/connectors/api-connector.d.ts +59 -7
  54. package/dist/connectors/api-connector.js +106 -19
  55. package/dist/connectors/api.js +4 -1
  56. package/dist/connectors/guarded-fetch.d.ts +144 -0
  57. package/dist/connectors/guarded-fetch.js +87 -38
  58. package/dist/connectors/negotiation-cache.js +46 -0
  59. package/dist/connectors/option-shapes.js +27 -0
  60. package/dist/connectors/remote-mcp.d.ts +30 -4
  61. package/dist/connectors/remote-mcp.js +1774 -320
  62. package/dist/connectors/resource-uri.js +335 -0
  63. package/dist/credential-contract.d.ts +10 -0
  64. package/dist/credential-rules.js +1 -3
  65. package/dist/credential-url.js +108 -0
  66. package/dist/credentials.d.ts +6 -1
  67. package/dist/credentials.js +27 -18
  68. package/dist/d1.d.ts +130 -0
  69. package/dist/d1.js +290 -0
  70. package/dist/describe-config.d.ts +165 -0
  71. package/dist/describe-config.js +315 -0
  72. package/dist/described.js +106 -0
  73. package/dist/downstream-input-context.js +128 -0
  74. package/dist/downstream-input.js +325 -0
  75. package/dist/errors.d.ts +132 -31
  76. package/dist/errors.js +175 -87
  77. package/dist/execute.js +798 -318
  78. package/dist/executor-admission.d.ts +1 -0
  79. package/dist/executor-admission.js +11 -15
  80. package/dist/executor-contract.d.ts +20 -0
  81. package/dist/executor-contract.js +48 -0
  82. package/dist/executor-result.js +30 -13
  83. package/dist/executors/quickjs-child.js +15 -9
  84. package/dist/executors/quickjs-protocol.js +5 -6
  85. package/dist/executors/quickjs-runtime.js +152 -59
  86. package/dist/executors/quickjs.js +49 -39
  87. package/dist/favicon.js +1 -2
  88. package/dist/fix-prompt.js +1 -3
  89. package/dist/guest-runtime.js +238 -0
  90. package/dist/guest-types.d.ts +218 -0
  91. package/dist/guest-types.js +1 -0
  92. package/dist/html-security.js +24 -0
  93. package/dist/identity.js +1 -3
  94. package/dist/inbound-credential.js +52 -0
  95. package/dist/index.d.ts +24 -256
  96. package/dist/index.js +65 -478
  97. package/dist/invocation-auth.js +69 -0
  98. package/dist/invocation.js +262 -79
  99. package/dist/json-schema.d.ts +1 -1
  100. package/dist/mcp-client-context.js +35 -0
  101. package/dist/mcp-result.js +11 -7
  102. package/dist/meta-output.js +61 -0
  103. package/dist/meta-tool-names.d.ts +2 -0
  104. package/dist/meta-tool-names.js +3 -0
  105. package/dist/meta-tools.js +419 -272
  106. package/dist/module-contracts.d.ts +8 -23
  107. package/dist/node.d.ts +0 -2
  108. package/dist/node.js +2 -2
  109. package/dist/oauth-callback-outcome.js +1 -3
  110. package/dist/oauth-handoff.js +194 -0
  111. package/dist/oauth-sealing.js +20 -0
  112. package/dist/operator-record.d.ts +137 -0
  113. package/dist/operator-record.js +420 -0
  114. package/dist/operator-ui/assets.js +31 -0
  115. package/dist/operator-ui/contract.d.ts +72 -0
  116. package/dist/operator-ui/contract.js +1 -0
  117. package/dist/operator-ui/fix-prompts.d.ts +18 -0
  118. package/dist/operator-ui/generated.js +5 -4
  119. package/dist/operator-ui/model.d.ts +12 -87
  120. package/dist/operator-ui/model.js +2 -9
  121. package/dist/operator-ui/setup-commands.js +1 -3
  122. package/dist/operator-ui/view.d.ts +323 -0
  123. package/dist/operator-ui/view.js +62 -189
  124. package/dist/page-styles.js +2 -3
  125. package/dist/program-result.js +5 -0
  126. package/dist/program-source.js +14 -2
  127. package/dist/{exempt-writes.js → program-writes.js} +60 -19
  128. package/dist/provider.d.ts +142 -0
  129. package/dist/provider.js +187 -0
  130. package/dist/providers/_shared/google/result-size.js +57 -0
  131. package/dist/providers/_shared/google/service-account.d.ts +58 -0
  132. package/dist/providers/_shared/google/service-account.js +500 -0
  133. package/dist/providers/_shared/google/workspace.d.ts +276 -0
  134. package/dist/providers/_shared/google/workspace.js +518 -0
  135. package/dist/providers/_shared/request-token.js +83 -0
  136. package/dist/providers/{basecamp.d.ts → basecamp/index.d.ts} +6 -28
  137. package/dist/providers/basecamp/index.js +997 -0
  138. package/dist/providers/basecamp/skill.generated.js +9 -0
  139. package/dist/providers/{breeze.d.ts → breeze/index.d.ts} +2 -2
  140. package/dist/providers/{breeze.js → breeze/index.js} +184 -140
  141. package/dist/providers/breeze/skill.generated.js +9 -0
  142. package/dist/providers/{ccb.d.ts → ccb/index.d.ts} +2 -2
  143. package/dist/providers/{ccb.js → ccb/index.js} +271 -116
  144. package/dist/providers/ccb/skill.generated.js +9 -0
  145. package/dist/providers/{cloudflare.d.ts → cloudflare/index.d.ts} +8 -7
  146. package/dist/providers/{cloudflare.js → cloudflare/index.js} +171 -738
  147. package/dist/providers/cloudflare/skill.generated.js +10 -0
  148. package/dist/providers/docs/index.d.ts +54 -0
  149. package/dist/providers/docs/index.js +1237 -0
  150. package/dist/providers/docs/skill.generated.js +9 -0
  151. package/dist/providers/drive/index.d.ts +53 -0
  152. package/dist/providers/drive/index.js +1523 -0
  153. package/dist/providers/drive/skill.generated.js +9 -0
  154. package/dist/providers/forms/index.d.ts +54 -0
  155. package/dist/providers/forms/index.js +1217 -0
  156. package/dist/providers/forms/skill.generated.js +11 -0
  157. package/dist/providers/github/auth.d.ts +32 -0
  158. package/dist/providers/github/auth.js +361 -0
  159. package/dist/providers/github/hosted.js +218 -0
  160. package/dist/providers/github/index.d.ts +13 -0
  161. package/dist/providers/github/index.js +140 -0
  162. package/dist/providers/github/key.js +100 -0
  163. package/dist/providers/github/rest.js +321 -0
  164. package/dist/providers/github/scope.d.ts +29 -0
  165. package/dist/providers/github/scope.js +124 -0
  166. package/dist/providers/github/skill.generated.js +8 -0
  167. package/dist/providers/gmail/index.d.ts +51 -0
  168. package/dist/providers/gmail/index.js +1436 -0
  169. package/dist/providers/gmail/skill.generated.js +9 -0
  170. package/dist/providers/infisical/index.d.ts +7 -0
  171. package/dist/providers/infisical/index.js +713 -0
  172. package/dist/providers/infisical/skill.generated.js +8 -0
  173. package/dist/providers/{linear.d.ts → linear/index.d.ts} +11 -14
  174. package/dist/providers/linear/index.js +352 -0
  175. package/dist/providers/linear/skill.generated.js +8 -0
  176. package/dist/providers/{mixpanel.d.ts → mixpanel/index.d.ts} +5 -10
  177. package/dist/providers/mixpanel/index.js +416 -0
  178. package/dist/providers/mixpanel/skill.generated.js +9 -0
  179. package/dist/providers/{notion.d.ts → notion/index.d.ts} +8 -8
  180. package/dist/providers/{notion.js → notion/index.js} +226 -239
  181. package/dist/providers/notion/skill.generated.js +10 -0
  182. package/dist/providers/{overflow.d.ts → overflow/index.d.ts} +2 -2
  183. package/dist/providers/{overflow.js → overflow/index.js} +74 -111
  184. package/dist/providers/overflow/skill.generated.js +8 -0
  185. package/dist/providers/{planning-center.d.ts → planning-center/index.d.ts} +2 -2
  186. package/dist/providers/{planning-center.js → planning-center/index.js} +264 -104
  187. package/dist/providers/planning-center/skill.generated.js +10 -0
  188. package/dist/providers/{revenuecat.d.ts → revenuecat/index.d.ts} +5 -10
  189. package/dist/providers/revenuecat/index.js +557 -0
  190. package/dist/providers/revenuecat/skill.generated.js +11 -0
  191. package/dist/providers/sheets/index.d.ts +54 -0
  192. package/dist/providers/sheets/index.js +1237 -0
  193. package/dist/providers/sheets/skill.generated.js +10 -0
  194. package/dist/providers/slides/index.d.ts +53 -0
  195. package/dist/providers/slides/index.js +2645 -0
  196. package/dist/providers/slides/skill.generated.js +9 -0
  197. package/dist/providers/{stripe.d.ts → stripe/index.d.ts} +5 -12
  198. package/dist/providers/stripe/index.js +266 -0
  199. package/dist/providers/stripe/skill.generated.js +11 -0
  200. package/dist/providers/{tithely.d.ts → tithely/index.d.ts} +2 -2
  201. package/dist/providers/{tithely.js → tithely/index.js} +60 -91
  202. package/dist/providers/tithely/skill.generated.js +8 -0
  203. package/dist/providers/{vercel.d.ts → vercel/index.d.ts} +8 -8
  204. package/dist/providers/vercel/index.js +1038 -0
  205. package/dist/providers/vercel/mcp-ownership.js +212 -0
  206. package/dist/providers/vercel/skill.generated.js +11 -0
  207. package/dist/registry.d.ts +110 -171
  208. package/dist/registry.js +588 -927
  209. package/dist/request-state.js +21 -0
  210. package/dist/resource-read.js +103 -0
  211. package/dist/result-shapes.js +17 -49
  212. package/dist/retired-toolkits.js +1 -1
  213. package/dist/routes/access-tokens.js +3 -6
  214. package/dist/routes/activity-context.js +21 -0
  215. package/dist/routes/activity-disclosure.js +40 -0
  216. package/dist/routes/activity.js +59 -21
  217. package/dist/routes/actor-labels.js +3 -50
  218. package/dist/routes/connect.js +221 -0
  219. package/dist/routes/credentials.js +15 -27
  220. package/dist/routes/mcp.js +365 -130
  221. package/dist/routes/oauth-client-metadata.js +15 -0
  222. package/dist/routes/oauth-management.js +45 -107
  223. package/dist/routes/oauth.js +110 -57
  224. package/dist/routes/operator.js +3 -3
  225. package/dist/routes/shared.d.ts +25 -64
  226. package/dist/routes/shared.js +160 -80
  227. package/dist/routes/skills.js +30 -0
  228. package/dist/routes/ui-config.js +225 -0
  229. package/dist/routes/ui-data.js +40 -35
  230. package/dist/routes/ui.js +66 -56
  231. package/dist/runtime/admission.js +4 -2
  232. package/dist/runtime/call-admission.js +3 -1
  233. package/dist/runtime/connector-scope.js +1 -4
  234. package/dist/runtime/run.js +10 -39
  235. package/dist/runtime/services.js +12 -117
  236. package/dist/runtime/shared-read.js +1 -3
  237. package/dist/runtime/storage.js +8 -1
  238. package/dist/sent-secrets.d.ts +93 -0
  239. package/dist/sent-secrets.js +1013 -0
  240. package/dist/server.js +28 -71
  241. package/dist/skills.js +416 -174
  242. package/dist/sqlite.d.ts +48 -0
  243. package/dist/sqlite.js +181 -0
  244. package/dist/storage/keys.js +443 -0
  245. package/dist/storage/memory.js +16 -4
  246. package/dist/storage/sql.d.ts +66 -0
  247. package/dist/storage/sql.js +543 -0
  248. package/dist/timeout.js +4 -2
  249. package/dist/tool-name.js +17 -0
  250. package/dist/tool-safety.d.ts +9 -35
  251. package/dist/tool-safety.js +20 -40
  252. package/dist/types.d.ts +336 -56
  253. package/dist/types.js +0 -1
  254. package/dist/ui.d.ts +7 -19
  255. package/dist/ui.js +76 -90
  256. package/dist/url-safety.js +3 -6
  257. package/dist/usage-guide.js +146 -0
  258. package/dist/validate.d.ts +7 -0
  259. package/dist/validate.js +309 -47
  260. package/dist/version.d.ts +1 -7
  261. package/dist/version.js +3 -7
  262. package/dist/worker.d.ts +11 -0
  263. package/dist/worker.js +435 -0
  264. package/documentation/README.md +63 -0
  265. package/documentation/architecture.md +696 -231
  266. package/documentation/auth.md +1069 -546
  267. package/documentation/code-mode.md +662 -356
  268. package/documentation/deploying.md +146 -0
  269. package/documentation/integrating.md +159 -0
  270. package/documentation/meta-tools.md +570 -216
  271. package/documentation/operating.md +135 -0
  272. package/documentation/operator-tests.md +97 -0
  273. package/documentation/operator-ui.md +132 -0
  274. package/documentation/provider-migration-0.29.md +65 -0
  275. package/examples/worker/AGENTS.md +34 -12
  276. package/examples/worker/README.md +293 -255
  277. package/examples/worker/kv-to-d1.wrangler.jsonc +26 -0
  278. package/examples/worker/scripts/copy-kv-to-d1.mjs +162 -0
  279. package/examples/worker/src/connecta.config.ts +151 -0
  280. package/examples/worker/src/index.ts +14 -197
  281. package/examples/worker/wrangler.jsonc +15 -35
  282. package/package.json +126 -54
  283. package/templates/node/.dockerignore +1 -2
  284. package/templates/node/.env.example +20 -21
  285. package/templates/node/AGENTS.md +21 -17
  286. package/templates/node/Dockerfile +3 -5
  287. package/templates/node/README.md +140 -58
  288. package/templates/node/docker-compose.yml +11 -12
  289. package/templates/node/package.json +4 -2
  290. package/templates/node/src/connecta.config.ts +119 -0
  291. package/templates/node/src/index.ts +9 -154
  292. package/templates/node/src/provision-token.ts +17 -0
  293. package/AGENTS.md +0 -170
  294. package/dist/artifacts/connector.d.ts +0 -58
  295. package/dist/artifacts/connector.js +0 -730
  296. package/dist/artifacts/document.js +0 -86
  297. package/dist/artifacts/guide.js +0 -140
  298. package/dist/artifacts/html-scan.js +0 -329
  299. package/dist/artifacts/json.js +0 -78
  300. package/dist/artifacts/kv-store.d.ts +0 -20
  301. package/dist/artifacts/kv-store.js +0 -140
  302. package/dist/artifacts/markdown.js +0 -478
  303. package/dist/artifacts/module.d.ts +0 -37
  304. package/dist/artifacts/module.js +0 -66
  305. package/dist/artifacts/operations.d.ts +0 -197
  306. package/dist/artifacts/operations.js +0 -1002
  307. package/dist/artifacts/refresh.d.ts +0 -55
  308. package/dist/artifacts/refresh.js +0 -236
  309. package/dist/artifacts/routes.js +0 -206
  310. package/dist/artifacts/types.d.ts +0 -214
  311. package/dist/artifacts/types.js +0 -22
  312. package/dist/artifacts/validate.d.ts +0 -62
  313. package/dist/artifacts/validate.js +0 -651
  314. package/dist/artifacts.d.ts +0 -6
  315. package/dist/artifacts.js +0 -9
  316. package/dist/auth/bearer.d.ts +0 -11
  317. package/dist/auth/bearer.js +0 -50
  318. package/dist/providers/basecamp.js +0 -445
  319. package/dist/providers/linear.js +0 -217
  320. package/dist/providers/mixpanel.js +0 -247
  321. package/dist/providers/revenuecat.js +0 -317
  322. package/dist/providers/stripe.js +0 -253
  323. package/dist/providers/vercel.js +0 -1253
  324. package/dist/storage/file.d.ts +0 -15
  325. package/dist/storage/file.js +0 -455
  326. package/ethos.md +0 -93
  327. package/examples/worker/src/cloudflare-kv.ts +0 -43
  328. package/examples/worker/src/d1-activity-row.ts +0 -155
  329. package/examples/worker/src/d1-activity.ts +0 -147
  330. package/examples/worker/src/d1-storage.ts +0 -138
  331. package/examples/worker/src/r2-artifact-blobs.ts +0 -29
  332. package/templates/node/src/file-activity.ts +0 -182
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Google Workspace access as the person calling, with no per-user consent:
3
+ * a service account with domain-wide delegation mints a token *as* the user
4
+ * the deployment maps the admitted caller to. The foundation each Workspace
5
+ * product provider (`gmail()` first) builds on; never its own export.
6
+ *
7
+ * Whose account. `ConnectorContext` carries no identity, and a deployment's
8
+ * own connector never learns its caller (`src/connector-caller.ts`). A
9
+ * maintained Workspace provider is the second sanctioned reader of that
10
+ * channel (PRINCIPLES.md INV-3, #678): deployment config supplies
11
+ * `subject`, a function from the admitted `AuthenticatedIdentity` to a
12
+ * Workspace address, and the provider reads the identity core attached beside
13
+ * the context. No tool argument, header, or program can name the subject —
14
+ * every product's base URL is confined beneath `users/me`, or its product's
15
+ * equivalent, so the token's subject is the only account a request reaches.
16
+ * A call with no admitted caller, one an open deployment admitted without
17
+ * authentication (the mapping is never asked about it), or one the mapping
18
+ * answers `undefined` for, fails `auth_required` before anything leaves the
19
+ * host. Catalogs need no subject: tools are static.
20
+ *
21
+ * A product builds on three calls: `workspaceConnection(factory, options)` at
22
+ * construction, `googleWorkspaceClient({...})` once, and the client's `json`,
23
+ * `bytes`, or `text` per request — plus `googleReasonsOf(error)` where a
24
+ * product must decide on a Google reason the shared mapping leaves generic.
25
+ * Nothing else here is the products' to touch.
26
+ *
27
+ * Setup, once per Workspace, shared by every product:
28
+ *
29
+ * 1. In a Google Cloud project, enable each product's API (Gmail API, Google
30
+ * Drive API, …).
31
+ * 2. Create a service account. It needs no IAM role: delegation, not project
32
+ * permission, is what reaches user data.
33
+ * 3. Create a JSON key for it. An organization policy
34
+ * (`iam.disableServiceAccountKeyCreation`, on by default for newer
35
+ * organizations) may refuse; an org policy administrator can override it
36
+ * for this project alone.
37
+ * 4. Copy the service account's numeric client ID (Details → Advanced
38
+ * settings, or the key's `client_id`).
39
+ * 5. As a Workspace super admin: Admin console → Security → Access and data
40
+ * control → API controls → Manage Domain Wide Delegation → Add new, with
41
+ * that client ID and *exactly* the scopes each product provider lists, comma
42
+ * separated. A grant can take up to 24 hours to apply.
43
+ * 6. Pass the key to the provider from the deployment's secrets, and map the
44
+ * admitted identity to a Workspace address in `subject`.
45
+ */
46
+ import { type GuardedRequest } from "../../../connectors/guarded-fetch.js";
47
+ import type { AuthenticatedIdentity, ConnectorCallAdmissionPolicy, ConnectorContext } from "../../../types.js";
48
+ import { type GoogleServiceAccount, type ServiceAccountKey } from "./service-account.js";
49
+ export type { GoogleServiceAccount } from "./service-account.js";
50
+ /**
51
+ * Whose Workspace account a call acts as.
52
+ *
53
+ * A function receives the identity an inbound auth provider authenticated for
54
+ * this request and returns that person's Workspace address, or `undefined`
55
+ * for a caller who has none — that call then fails closed. It is never called
56
+ * for an open deployment's anonymous requests, nor for a call no request
57
+ * admitted. It may be async, for a directory lookup (a Clerk user id to an
58
+ * email, say), and receives the call's cancellation signal for that; it runs
59
+ * once per tool call and should cache what it fetches. A string is one fixed
60
+ * account for every caller who can reach the connector, for a shared mailbox
61
+ * or scheduled work with no caller; limit who reaches it with
62
+ * `identity.connectorAccess`.
63
+ */
64
+ export type GoogleWorkspaceSubject = string | ((identity: Readonly<AuthenticatedIdentity>, context: GoogleSubjectContext) => string | undefined | Promise<string | undefined>);
65
+ /** What a subject mapping is told about the call it resolves for. */
66
+ export interface GoogleSubjectContext {
67
+ /** The call's cancellation, for an async directory lookup to honor. */
68
+ readonly signal?: AbortSignal;
69
+ }
70
+ /** Options every Workspace product provider shares. */
71
+ export interface GoogleWorkspaceOptions {
72
+ /** What this connection is for, appended to the maintained guide. */
73
+ purpose: string;
74
+ /**
75
+ * The delegated service account: `{ clientEmail, privateKey }` from its
76
+ * JSON key, or the key file's whole JSON text. From deployment secrets,
77
+ * never a literal in source. One key serves every Workspace connector.
78
+ */
79
+ serviceAccount: GoogleServiceAccount | string;
80
+ /** Whose account each call acts as; see {@link GoogleWorkspaceSubject}. */
81
+ subject: GoogleWorkspaceSubject;
82
+ /** Human-readable display name. */
83
+ title?: string;
84
+ /** Organization-specific conventions appended to the maintained guide. */
85
+ instructions?: string;
86
+ /**
87
+ * Optional per-runtime call-admission policy. Google meters Workspace APIs
88
+ * per user and per project, so none is declared by default.
89
+ */
90
+ callAdmission?: ConnectorCallAdmissionPolicy;
91
+ /** Connector-specific inline result limit; omit to inherit the deployment. */
92
+ maxResultBytes?: number;
93
+ /** API base override for a proxy or test double. */
94
+ baseUrl?: string;
95
+ }
96
+ /** The closed options every Workspace provider accepts; see `assertKnownOptions`. */
97
+ export declare const GOOGLE_WORKSPACE_OPTIONS: import("../../../config-schema.js").Field<unknown, unknown, true> & {
98
+ readonly shape: {
99
+ serviceAccount: import("../../../config-schema.js").Field<unknown, unknown, true> & {
100
+ readonly shape: {
101
+ readonly clientId: import("../../../config-schema.js").Field<unknown, unknown, true>;
102
+ readonly clientEmail: import("../../../config-schema.js").Field<unknown, unknown, true>;
103
+ readonly privateKey: import("../../../config-schema.js").Field<unknown, unknown, true>;
104
+ };
105
+ };
106
+ callAdmission: import("../../../config-schema.js").Field<unknown, unknown, true> & {
107
+ readonly shape: {
108
+ rules: import("../../../config-schema.js").Field<unknown[], readonly unknown[] | undefined, true>;
109
+ maxPartitions: import("../../../config-schema.js").Field<unknown, unknown, true>;
110
+ };
111
+ };
112
+ instructions: import("../../../config-schema.js").Field<unknown, unknown, true>;
113
+ title: import("../../../config-schema.js").Field<unknown, unknown, true>;
114
+ maxResultBytes: import("../../../config-schema.js").Field<unknown, unknown, true>;
115
+ baseUrl: import("../../../config-schema.js").Field<unknown, unknown, true>;
116
+ subject: import("../../../config-schema.js").Field<unknown, unknown, true>;
117
+ purpose: import("../../../config-schema.js").Field<unknown, unknown, true>;
118
+ };
119
+ };
120
+ /** The checked, construction-time half of {@link GoogleWorkspaceOptions}. */
121
+ export interface WorkspaceConnection {
122
+ purpose: string;
123
+ account: ServiceAccountKey;
124
+ subject: GoogleWorkspaceSubject;
125
+ }
126
+ /** Validate the shared options at construction; throws on a structural mistake. */
127
+ export declare function workspaceConnection(factory: string, options: GoogleWorkspaceOptions): WorkspaceConnection;
128
+ /** How a product reads an HTTP 404 — see H11. */
129
+ type NotFoundMeaning = "absent" | "ambiguous";
130
+ /**
131
+ * Google's machine-readable reasons for a failure the shared client mapped:
132
+ * `errors[].reason`, `details[].reason`, and the canonical `status`, in that
133
+ * order, deduplicated, at most eight, and only tokens of `[A-Za-z0-9_.]` up to
134
+ * 64 characters — never a message or any other part of the payload. An empty
135
+ * array for anything else, including a failure that never reached Google.
136
+ *
137
+ * For a product that needs a decision the shared mapping does not make, such
138
+ * as Drive telling `cannotDownloadAbusiveFile` from another refusal. Classify
139
+ * on these, never on the error's message.
140
+ */
141
+ export declare function googleReasonsOf(error: unknown): readonly string[];
142
+ /**
143
+ * How far a failed request got, for a product that must decide whether its
144
+ * write may have landed:
145
+ *
146
+ * - `before-send`: nothing left connecta — no caller, no mapped account, a
147
+ * refused token, a local refusal. Nothing happened downstream.
148
+ * - `awaiting-response`: the request was sent and no HTTP status came back.
149
+ * Google may or may not have applied it.
150
+ * - `reading-body`: Google answered 2xx — it accepted the request — and the
151
+ * reply could not be used. A write probably applied.
152
+ * - `redirected`: Google answered 3xx, which is never followed. It shows
153
+ * neither that a write applied nor that it did not: outcome unknown.
154
+ * - `server-error`: Google answered a non-idempotent write with a 5xx,
155
+ * whatever reason it named. It may have committed before failing, so the
156
+ * outcome is unknown.
157
+ * - `refused`: Google answered with a 4xx, or a read or idempotent write
158
+ * with a 5xx. Nothing to repeat blindly: a 4xx applied nothing, and a
159
+ * repeated read or idempotent write is harmless.
160
+ */
161
+ interface GoogleOutcome {
162
+ /** Whether the request left connecta for Google's API. */
163
+ readonly dispatched: boolean;
164
+ /** The HTTP status Google answered with, when one arrived. */
165
+ readonly status?: number;
166
+ readonly phase: "before-send" | "awaiting-response" | "reading-body" | "redirected" | "server-error" | "refused";
167
+ }
168
+ /**
169
+ * How far the request behind a failure from `json`, `bytes`, or `text` got —
170
+ * see {@link GoogleOutcome}. `undefined` for anything the client did not
171
+ * throw. Read it beside the error, the way `googleReasonsOf` is read; the
172
+ * error itself already carries the right retry verdict.
173
+ */
174
+ export declare function googleOutcomeOf(error: unknown): GoogleOutcome | undefined;
175
+ /** What a Workspace product needs to reach its API as the calling user. */
176
+ export interface GoogleWorkspaceClientOptions {
177
+ /** Product name in messages: "Gmail", "Google Drive". */
178
+ provider: string;
179
+ /** The API's console name, for an "enable the API" message: "Gmail API". */
180
+ api: string;
181
+ /**
182
+ * Absolute base URL, confined to the delegated user's own resources — for
183
+ * Gmail, `…/gmail/v1/users/me` — so no path can address another account.
184
+ */
185
+ baseUrl: string;
186
+ /** This product's scopes, and only these; the DWD grant must list them. */
187
+ scopes: readonly string[];
188
+ /** Response ceiling in bytes. */
189
+ maxResponseBytes: number;
190
+ /** H11: whether this API's 404 means absence or may hide a permission gap. */
191
+ notFound: NotFoundMeaning;
192
+ connection: WorkspaceConnection;
193
+ }
194
+ /** A non-JSON response body, read under the product's byte ceiling. */
195
+ interface GoogleBytes {
196
+ bytes: Uint8Array;
197
+ /** The response's `Content-Type`, when it sent one. */
198
+ contentType: string | undefined;
199
+ /**
200
+ * Whether the body went on past what was kept. Only a request with
201
+ * `maxBytes` keeps less than the whole body, so without it this is false.
202
+ */
203
+ truncated: boolean;
204
+ /** The HTTP status: 200, 206 for an honored Range, 416 for an empty file. */
205
+ status: number;
206
+ /** The response's `Content-Range`, when it sent one. */
207
+ contentRange: string | undefined;
208
+ }
209
+ /** A text response body, decoded in the charset its `Content-Type` names. */
210
+ interface GoogleText {
211
+ text: string;
212
+ contentType: string | undefined;
213
+ truncated: boolean;
214
+ status: number;
215
+ contentRange: string | undefined;
216
+ }
217
+ /** {@link GoogleRequestOptions}, plus a bound on how much of the body to read. */
218
+ interface GoogleReadOptions extends GoogleRequestOptions {
219
+ /**
220
+ * Read at most this many bytes of the body: the result retains at most
221
+ * `maxBytes` (+1 to detect overflow, reported as `truncated`) and may
222
+ * consume at most one extra transport chunk from the stream; the rest is
223
+ * cancelled unread. A declared length past the client's ceiling is
224
+ * then no reason to refuse; the ceiling still bounds the read. With it set,
225
+ * a 416 carrying `Content-Range: bytes *\/0` — a Range request against an
226
+ * empty file — answers an empty result with that status, not a failure.
227
+ * A whole number of bytes, zero or more.
228
+ */
229
+ maxBytes?: number;
230
+ }
231
+ /**
232
+ * A product's request path to its API, as the calling user. Every method
233
+ * resolves the subject once per call context, sends the cached or a freshly
234
+ * minted token, maps Google's failures by what the caller does next, and
235
+ * answers a 401 with one fresh token and one replay — safe for a write too,
236
+ * since a 401 is a refusal before the request did anything. Because of that
237
+ * replay a `rawBody` must be sendable twice: a `ReadableStream` is refused
238
+ * with a `TypeError` before any request; strings, bytes, Blobs, FormData, and
239
+ * URLSearchParams are fine.
240
+ */
241
+ export interface GoogleWorkspaceClient {
242
+ /** One JSON request; the parsed body, `undefined` for an empty one. */
243
+ json(request: GuardedRequest, ctx: ConnectorContext, options?: GoogleRequestOptions): Promise<unknown>;
244
+ /**
245
+ * One request whose answer is not JSON — a download, an export — as bytes,
246
+ * bounded by `maxResponseBytes`. `accept` is sent as `Accept`.
247
+ */
248
+ bytes(request: GuardedRequest, ctx: ConnectorContext, accept?: string, options?: GoogleReadOptions): Promise<GoogleBytes>;
249
+ /**
250
+ * As {@link bytes}, decoded as text in the response's declared charset. A
251
+ * truncated prefix drops a code point the cut left incomplete.
252
+ */
253
+ text(request: GuardedRequest, ctx: ConnectorContext, accept?: string, options?: GoogleReadOptions): Promise<GoogleText>;
254
+ }
255
+ /** How one request's failures read, beyond the product's defaults. */
256
+ interface GoogleRequestOptions {
257
+ /**
258
+ * The request is a write that names the revision it was made against —
259
+ * Docs, Slides, or Forms `writeControl.requiredRevisionId`. Google answers
260
+ * a stale one with HTTP 400 or 409 carrying FAILED_PRECONDITION or
261
+ * ABORTED, which then maps to `conflict` with fixed text telling the agent
262
+ * to re-read for the current revision and retry. Without it, such a refusal
263
+ * stays `connector_call_failed`, since the same reason also means things
264
+ * like a product switched off for the user.
265
+ */
266
+ revisionGuarded?: boolean;
267
+ /**
268
+ * Sending this write twice leaves the same state as sending it once — a
269
+ * PUT of a whole resource, a Sheets `values.update` of fixed cells. Only
270
+ * then does a 5xx on a write stay a retryable `unavailable`; otherwise its
271
+ * outcome is unknown and it is not retried. Reads are always idempotent.
272
+ */
273
+ idempotent?: boolean;
274
+ }
275
+ /** Build the delegated, confined, Google-error-mapped transport for one product. */
276
+ export declare function googleWorkspaceClient(options: GoogleWorkspaceClientOptions): GoogleWorkspaceClient;