@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,873 @@
1
+ // Overflow's curated kit tools: standard pages, safe projections and narrowing fields.
2
+ import { Effect, Schema } from "effect";
3
+ import { ConnectorCallError } from "../../errors.js";
4
+ import { Refusal } from "../../http/errors.js";
5
+ import { Integer, isMinChars } from "../../http/json-schema.js";
6
+ import { read, list } from "../../http/tools.js";
7
+ import * as api from "./api.js";
8
+ function asRecord(value) {
9
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
10
+ }
11
+ function asArray(value) {
12
+ return Array.isArray(value) ? value : [];
13
+ }
14
+ function compact(value) {
15
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
16
+ }
17
+ /** A `{ id, name }` reference, or undefined when Overflow sent none. */
18
+ function reference(value) {
19
+ const record = asRecord(value);
20
+ return Object.keys(record).length === 0 ? undefined : compact({ id: record["id"], name: record["name"] });
21
+ }
22
+ const REFERENCE = Schema.Struct({ "id": Schema.optionalKey(Schema.String), "name": Schema.optionalKey(Schema.String) });
23
+ const CONTRIBUTION_SCHEMA = Schema.Struct({
24
+ "id": Schema.String,
25
+ "anonymous": Schema.optionalKey(Schema.Boolean),
26
+ "donorCoveredFees": Schema.optionalKey(Schema.Boolean),
27
+ "givingLinkId": Schema.optionalKey(Schema.String),
28
+ "pledgeId": Schema.optionalKey(Schema.String),
29
+ "dedication": Schema.optionalKey(Schema.String),
30
+ "donorNotes": Schema.optionalKey(Schema.String),
31
+ "type": Schema.Literals(["CASH", "CRYPTO", "DAF", "MANUAL_CASH", "STOCK"]),
32
+ "status": Schema.String,
33
+ "amount": Schema.Finite,
34
+ "frequency": Schema.optionalKey(Schema.String),
35
+ "contributionDate": Schema.optionalKey(Schema.String),
36
+ "donor": Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
37
+ "campaign": Schema.optionalKey(REFERENCE),
38
+ "subcampaign": Schema.optionalKey(REFERENCE),
39
+ "locationId": Schema.optionalKey(Schema.String),
40
+ "depositId": Schema.optionalKey(Schema.String),
41
+ "subscriptionId": Schema.optionalKey(Schema.String),
42
+ "paymentMethod": Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
43
+ "stocks": Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
44
+ "crypto": Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
45
+ "metadata": Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
46
+ "createdAt": Schema.optionalKey(Schema.String),
47
+ "updatedAt": Schema.optionalKey(Schema.String),
48
+ });
49
+ const DONOR_LIST_FIELDS = {
50
+ "id": Schema.String,
51
+ "firstName": Schema.optionalKey(Schema.String),
52
+ "lastName": Schema.optionalKey(Schema.String),
53
+ "email": Schema.optionalKey(Schema.String),
54
+ "locationIds": Schema.optionalKey(Schema.Array(Schema.String)),
55
+ "totalContributionsCount": Schema.optionalKey(Schema.Finite),
56
+ "activeRecurringCount": Schema.optionalKey(Schema.Finite),
57
+ "latestContributionDate": Schema.optionalKey(Schema.String),
58
+ "createdAt": Schema.optionalKey(Schema.String),
59
+ "updatedAt": Schema.optionalKey(Schema.String),
60
+ };
61
+ const DONOR_LIST_SCHEMA = Schema.Struct(DONOR_LIST_FIELDS);
62
+ const DONOR_SCHEMA = Schema.Struct({
63
+ ...DONOR_LIST_FIELDS,
64
+ phone: Schema.optionalKey(Schema.String),
65
+ address: Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
66
+ });
67
+ const DEPOSIT_SCHEMA = Schema.Struct({
68
+ "id": Schema.String,
69
+ "statementDescriptor": Schema.optionalKey(Schema.String),
70
+ "startingBalanceInCents": Schema.optionalKey(Schema.Finite),
71
+ "endingBalanceInCents": Schema.optionalKey(Schema.Finite),
72
+ "status": Schema.String,
73
+ "type": Schema.optionalKey(Schema.String),
74
+ "amountInCents": Schema.Finite,
75
+ "arrivalAt": Schema.optionalKey(Schema.String),
76
+ "name": Schema.optionalKey(Schema.String),
77
+ "bankName": Schema.optionalKey(Schema.String),
78
+ "bankLast4": Schema.optionalKey(Schema.String),
79
+ "paymentMethodTypes": Schema.optionalKey(Schema.Array(Schema.String)),
80
+ "reconciledAt": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null])),
81
+ "lineItems": Schema.optionalKey(Schema.Array(Schema.Record(Schema.String, Schema.Unknown))),
82
+ "createdAt": Schema.optionalKey(Schema.String),
83
+ "updatedAt": Schema.optionalKey(Schema.String),
84
+ });
85
+ const MONEY_ROLLUP = Schema.Struct({
86
+ "count": Schema.optionalKey(Schema.Finite),
87
+ "grossInCents": Schema.optionalKey(Schema.Finite),
88
+ "feesInCents": Schema.optionalKey(Schema.Finite),
89
+ "totalInCents": Schema.optionalKey(Schema.Finite),
90
+ });
91
+ const REFUND_SCHEMA = Schema.Struct({
92
+ "id": Schema.String,
93
+ "contributionId": Schema.String,
94
+ "status": Schema.String,
95
+ "reason": Schema.optionalKey(Schema.String),
96
+ "amountInCents": Schema.Finite,
97
+ "netValueInCents": Schema.optionalKey(Schema.Finite),
98
+ "feeValueInCents": Schema.optionalKey(Schema.Finite),
99
+ "depositId": Schema.optionalKey(Schema.String),
100
+ "createdAt": Schema.optionalKey(Schema.String),
101
+ "updatedAt": Schema.optionalKey(Schema.String),
102
+ });
103
+ const CHARGEBACK_SCHEMA = Schema.Struct({
104
+ "id": Schema.String,
105
+ "feeValueInCents": Schema.optionalKey(Schema.Finite),
106
+ "contributionId": Schema.String,
107
+ "status": Schema.String,
108
+ "type": Schema.optionalKey(Schema.String),
109
+ "reason": Schema.optionalKey(Schema.String),
110
+ "amountInCents": Schema.Finite,
111
+ "netValueInCents": Schema.optionalKey(Schema.Finite),
112
+ "depositId": Schema.optionalKey(Schema.String),
113
+ "createdAt": Schema.optionalKey(Schema.String),
114
+ "updatedAt": Schema.optionalKey(Schema.String),
115
+ });
116
+ const SUBSCRIPTION_SCHEMA = Schema.Struct({
117
+ "id": Schema.String,
118
+ "anonymous": Schema.optionalKey(Schema.Boolean),
119
+ "donorCoveredFees": Schema.optionalKey(Schema.Boolean),
120
+ "metadata": Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
121
+ "donorId": Schema.String,
122
+ "status": Schema.String,
123
+ "amount": Schema.Finite,
124
+ "frequency": Schema.String,
125
+ "startDate": Schema.optionalKey(Schema.String),
126
+ "nextPaymentDate": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null])),
127
+ "campaign": Schema.optionalKey(REFERENCE),
128
+ "subcampaign": Schema.optionalKey(REFERENCE),
129
+ "locationId": Schema.optionalKey(Schema.String),
130
+ "paymentMethod": Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
131
+ "createdAt": Schema.optionalKey(Schema.String),
132
+ "updatedAt": Schema.optionalKey(Schema.String),
133
+ });
134
+ const PAYMENT_METHOD_SCHEMA = Schema.Struct({
135
+ "id": Schema.String,
136
+ "type": Schema.String,
137
+ "last4": Schema.String,
138
+ "expirationDate": Schema.optionalKey(Schema.String),
139
+ "isExpired": Schema.optionalKey(Schema.Boolean),
140
+ "updatedAt": Schema.optionalKey(Schema.String),
141
+ });
142
+ const CAMPAIGN_SCHEMA = Schema.Struct({
143
+ "id": Schema.String,
144
+ "hideFromDonors": Schema.optionalKey(Schema.Boolean),
145
+ "archivedAt": Schema.optionalKey(Schema.String),
146
+ "name": Schema.String,
147
+ "status": Schema.String,
148
+ "isSubcampaign": Schema.optionalKey(Schema.Boolean),
149
+ "isActive": Schema.optionalKey(Schema.Boolean),
150
+ "startDate": Schema.optionalKey(Schema.String),
151
+ "endDate": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null])),
152
+ "locationIds": Schema.optionalKey(Schema.Array(Schema.String)),
153
+ "parentCampaigns": Schema.optionalKey(Schema.Array(REFERENCE)),
154
+ "subcampaigns": Schema.optionalKey(Schema.Array(REFERENCE)),
155
+ "totalContributionCount": Schema.optionalKey(Schema.Finite),
156
+ "totalContributionValue": Schema.optionalKey(Schema.Finite),
157
+ "uniqueDonorCount": Schema.optionalKey(Schema.Finite),
158
+ });
159
+ const LOCATION_SCHEMA = Schema.Struct({
160
+ "id": Schema.String,
161
+ "updatedAt": Schema.optionalKey(Schema.String),
162
+ "name": Schema.String,
163
+ "isDefaultLocation": Schema.optionalKey(Schema.Boolean),
164
+ "hideFromDonors": Schema.optionalKey(Schema.Boolean),
165
+ "archivedAt": Schema.optionalKey(Schema.Union([Schema.String, Schema.Null])),
166
+ "createdAt": Schema.optionalKey(Schema.String),
167
+ });
168
+ // --- Projections -------------------------------------------------------------
169
+ /**
170
+ * The donor as it rides inside a contribution: identity only. Overflow embeds
171
+ * the whole profile — email, phone, mailing address, giving aggregates — in
172
+ * every contribution row; `get_donor` is where that belongs.
173
+ */
174
+ function projectDonorReference(value) {
175
+ const donor = asRecord(value);
176
+ if (Object.keys(donor).length === 0)
177
+ return undefined;
178
+ return compact({
179
+ id: donor["id"],
180
+ firstName: donor["firstName"],
181
+ lastName: donor["lastName"],
182
+ });
183
+ }
184
+ function projectContribution(value) {
185
+ const contribution = asRecord(value);
186
+ const paymentMethod = asRecord(contribution["paymentMethod"]);
187
+ const stocks = asRecord(contribution["stocks"]);
188
+ const crypto = asRecord(contribution["crypto"]);
189
+ return compact({
190
+ id: contribution["id"],
191
+ type: contribution["type"],
192
+ status: contribution["status"],
193
+ amount: contribution["amount"],
194
+ frequency: contribution["frequency"] ?? undefined,
195
+ contributionDate: contribution["contributionDate"],
196
+ donor: projectDonorReference(contribution["donor"]),
197
+ anonymous: contribution["anonymous"],
198
+ donorCoveredFees: contribution["donorCoveredFees"],
199
+ campaign: reference(contribution["campaign"]),
200
+ subcampaign: reference(contribution["subcampaign"]),
201
+ locationId: contribution["locationId"],
202
+ depositId: contribution["depositId"] ?? undefined,
203
+ subscriptionId: contribution["subscriptionId"],
204
+ givingLinkId: contribution["givingLinkId"] ?? undefined,
205
+ pledgeId: contribution["pledgeId"] ?? undefined,
206
+ paymentMethod: Object.keys(paymentMethod).length === 0
207
+ ? undefined
208
+ : compact({ type: paymentMethod["type"], last4: paymentMethod["last4"] }),
209
+ stocks: Object.keys(stocks).length === 0
210
+ ? undefined
211
+ : compact({ quantity: stocks["quantity"], tickers: stocks["tickers"] }),
212
+ crypto: Object.keys(crypto).length === 0 ? undefined : compact({ quantity: crypto["quantity"], token: crypto["token"] }),
213
+ dedication: contribution["dedication"] ?? undefined,
214
+ donorNotes: contribution["donorNotes"] ?? undefined,
215
+ metadata: contribution["metadata"] ?? undefined,
216
+ createdAt: contribution["createdAt"],
217
+ updatedAt: contribution["updatedAt"],
218
+ });
219
+ }
220
+ function projectDonor(value, full) {
221
+ const donor = asRecord(value);
222
+ return compact({
223
+ id: donor["id"],
224
+ firstName: donor["firstName"],
225
+ lastName: donor["lastName"],
226
+ email: donor["email"],
227
+ phone: full ? donor["phone"] : undefined,
228
+ address: full ? (donor["address"] ?? undefined) : undefined,
229
+ locationIds: donor["locationIds"],
230
+ totalContributionsCount: donor["totalContributionsCount"],
231
+ activeRecurringCount: donor["activeRecurringCount"],
232
+ latestContributionDate: donor["latestContributionDate"],
233
+ createdAt: donor["createdAt"],
234
+ updatedAt: donor["updatedAt"],
235
+ });
236
+ }
237
+ function projectDeposit(value, withLineItems) {
238
+ const deposit = asRecord(value);
239
+ return compact({
240
+ id: deposit["id"],
241
+ status: deposit["status"],
242
+ type: deposit["type"],
243
+ amountInCents: deposit["amountInCents"],
244
+ arrivalAt: deposit["arrivalAt"],
245
+ name: deposit["name"] ?? undefined,
246
+ bankName: deposit["bankName"] ?? undefined,
247
+ bankLast4: deposit["bankLast4"] ?? undefined,
248
+ statementDescriptor: deposit["statementDescriptor"] ?? undefined,
249
+ paymentMethodTypes: deposit["paymentMethodType"],
250
+ startingBalanceInCents: deposit["startingBalanceInCents"] ?? undefined,
251
+ endingBalanceInCents: deposit["endingBalanceInCents"] ?? undefined,
252
+ reconciledAt: deposit["reconciledAt"] ?? null,
253
+ createdAt: deposit["createdAt"],
254
+ updatedAt: deposit["updatedAt"],
255
+ lineItems: withLineItems
256
+ ? asArray(deposit["lineItems"]).map((row) => {
257
+ const item = asRecord(row);
258
+ return compact({
259
+ type: item["type"],
260
+ grossValueInCents: item["grossValueInCents"],
261
+ grossFeeValueInCents: item["grossFeeValueInCents"],
262
+ referenceId: item["referenceId"],
263
+ description: item["description"],
264
+ });
265
+ })
266
+ : undefined,
267
+ });
268
+ }
269
+ function projectRefund(value) {
270
+ const refund = asRecord(value);
271
+ return compact({
272
+ id: refund["id"],
273
+ contributionId: refund["contributionId"],
274
+ status: refund["status"],
275
+ reason: refund["reason"] ?? undefined,
276
+ amountInCents: refund["amountInCents"],
277
+ netValueInCents: refund["netValueInCents"],
278
+ feeValueInCents: refund["feeValueInCents"] ?? undefined,
279
+ depositId: refund["depositId"] ?? undefined,
280
+ createdAt: refund["createdAt"],
281
+ updatedAt: refund["updatedAt"],
282
+ });
283
+ }
284
+ function projectChargeback(value) {
285
+ const chargeback = asRecord(value);
286
+ return compact({
287
+ id: chargeback["id"],
288
+ contributionId: chargeback["contributionId"],
289
+ status: chargeback["status"],
290
+ type: chargeback["type"],
291
+ reason: chargeback["reason"] ?? undefined,
292
+ amountInCents: chargeback["amountInCents"],
293
+ netValueInCents: chargeback["netValueInCents"] ?? undefined,
294
+ feeValueInCents: chargeback["feeValueInCents"] ?? undefined,
295
+ depositId: chargeback["depositId"] ?? undefined,
296
+ createdAt: chargeback["createdAt"],
297
+ updatedAt: chargeback["updatedAt"],
298
+ });
299
+ }
300
+ function projectSubscription(value) {
301
+ const subscription = asRecord(value);
302
+ const paymentMethod = asRecord(subscription["paymentMethod"]);
303
+ return compact({
304
+ id: subscription["id"],
305
+ donorId: subscription["donorId"],
306
+ status: subscription["status"],
307
+ amount: subscription["amount"],
308
+ frequency: subscription["frequency"],
309
+ startDate: subscription["startDate"],
310
+ nextPaymentDate: subscription["nextPaymentDate"] ?? null,
311
+ anonymous: subscription["anonymous"],
312
+ donorCoveredFees: subscription["donorCoveredFees"],
313
+ campaign: reference(subscription["campaign"]),
314
+ subcampaign: reference(subscription["subcampaign"]),
315
+ locationId: subscription["locationId"] ?? undefined,
316
+ paymentMethod: Object.keys(paymentMethod).length === 0
317
+ ? undefined
318
+ : compact({
319
+ id: paymentMethod["id"],
320
+ type: paymentMethod["type"],
321
+ last4: paymentMethod["last4"],
322
+ expiration: paymentMethod["expiration"],
323
+ }),
324
+ metadata: subscription["metadata"] ?? undefined,
325
+ createdAt: subscription["createdAt"],
326
+ updatedAt: subscription["updatedAt"],
327
+ });
328
+ }
329
+ function projectPaymentMethod(value) {
330
+ const method = asRecord(value);
331
+ return compact({
332
+ id: method["id"],
333
+ type: method["type"],
334
+ last4: method["last4"],
335
+ expirationDate: method["expirationDate"],
336
+ isExpired: method["isExpired"],
337
+ updatedAt: method["updatedAt"],
338
+ });
339
+ }
340
+ function projectCampaign(value) {
341
+ const campaign = asRecord(value);
342
+ const refs = (list) => {
343
+ const rows = asArray(list)
344
+ .map(reference)
345
+ .filter((row) => row !== undefined);
346
+ return rows.length === 0 ? undefined : rows;
347
+ };
348
+ return compact({
349
+ id: campaign["id"],
350
+ name: campaign["name"],
351
+ status: campaign["status"],
352
+ isSubcampaign: campaign["isSubcampaign"],
353
+ isActive: campaign["isActive"],
354
+ startDate: campaign["startDate"],
355
+ endDate: campaign["endDate"] ?? null,
356
+ hideFromDonors: campaign["hideFromDonors"],
357
+ archivedAt: campaign["archivedAt"] ?? undefined,
358
+ locationIds: campaign["locationIds"],
359
+ parentCampaigns: refs(campaign["parentCampaigns"]),
360
+ subcampaigns: refs(campaign["subcampaigns"]),
361
+ totalContributionCount: campaign["totalContributionCount"],
362
+ totalContributionValue: campaign["totalContributionValue"],
363
+ uniqueDonorCount: campaign["uniqueDonorCount"],
364
+ });
365
+ }
366
+ function projectLocation(value) {
367
+ const location = asRecord(value);
368
+ return compact({
369
+ id: location["id"],
370
+ name: location["name"],
371
+ isDefaultLocation: location["isDefaultLocation"],
372
+ hideFromDonors: location["hideFromDonors"],
373
+ archivedAt: location["archivedAt"] ?? null,
374
+ createdAt: location["createdAt"],
375
+ updatedAt: location["updatedAt"],
376
+ });
377
+ }
378
+ /** A signed numbered-list continuation also fixes limit: changing it would skip or repeat rows. */
379
+ export function overflowTools({ connection, pageSize }) {
380
+ const limit = {
381
+ default: pageSize,
382
+ max: api.MAX_PAGE_SIZE,
383
+ description: "Rows per page, at most 100. Keep limit unchanged while paging numbered lists.",
384
+ };
385
+ const numbered = (spec) => Effect.gen(function* () {
386
+ const position = yield* checked(() => {
387
+ const value = spec.cursor === undefined ? { page: 1, limit: spec.args.limit } : JSON.parse(spec.cursor);
388
+ const state = asRecord(value);
389
+ if (!Number.isSafeInteger(state["page"]) || state["page"] < 1 || state["limit"] !== spec.args.limit)
390
+ throw new ConnectorCallError("invalid_args", "This cursor requires the same limit and a valid page number.");
391
+ return state["page"];
392
+ });
393
+ const { data } = yield* spec.fetch(compact({ ...spec.query, page: position, limit: spec.args.limit }));
394
+ const rows = yield* checked(() => api.listRows(data));
395
+ const total = yield* checked(() => api.exactTotal(data));
396
+ const hasMore = total === undefined ? rows.length >= spec.args.limit : position * spec.args.limit < total;
397
+ if (hasMore && (rows.length === 0 || !Number.isSafeInteger(position + 1)))
398
+ return yield* failed("connector_call_failed", "Overflow returned paging metadata that cannot advance.");
399
+ return {
400
+ rows: rows.map(spec.project),
401
+ page: {
402
+ hasMore,
403
+ nextCursor: hasMore ? JSON.stringify({ page: position + 1, limit: spec.args.limit }) : null,
404
+ ...(total === undefined ? {} : { total }),
405
+ },
406
+ };
407
+ });
408
+ const one = (answer) => Effect.gen(function* () {
409
+ const { data } = yield* answer;
410
+ const record = asRecord(data)["data"];
411
+ if (record === undefined || record === null)
412
+ return yield* failed("connector_call_failed", "Overflow answered without the requested record.");
413
+ return asRecord(record);
414
+ });
415
+ return [
416
+ list(connection, {
417
+ name: "list_contributions",
418
+ description: "List gifts (cash, stock, crypto, DAF, manual) with status, amount, campaign, deposit, and donor name. Donor contact details stay in get_donor.",
419
+ filters: {
420
+ "minimumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
421
+ description: "Updated on or after; ISO date or date-time.",
422
+ })),
423
+ "maximumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
424
+ description: "Updated on or before; ISO date or date-time.",
425
+ })),
426
+ "minimumInitiatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
427
+ description: "Initiated on or after; ISO date or date-time.",
428
+ })),
429
+ "maximumInitiatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
430
+ description: "Initiated on or before; ISO date or date-time.",
431
+ })),
432
+ "statusBucket": Schema.optionalKey(Schema.Array(Schema.Literals(["PENDING", "CONFIRMED", "FAILED", "CANCELED"]).annotate({ description: "Status bucket." }))
433
+ .check(Schema.isMinLength(1), Schema.isUnique())
434
+ .annotate({ description: "Overflow's coarse status buckets; matches any." })),
435
+ "campaignId": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
436
+ description: "24-hex id from list_campaigns.",
437
+ })),
438
+ "subcampaignId": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
439
+ description: "24-hex id from list_campaigns with isSubcampaign.",
440
+ })),
441
+ "locationIds": Schema.optionalKey(Schema.Array(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
442
+ description: "Id from list_locations.",
443
+ }))
444
+ .check(Schema.isMinLength(1))
445
+ .annotate({ description: "Ids from list_locations; matches any." })),
446
+ "givingLinkId": Schema.optionalKey(Schema.String.check(isMinChars(1)).annotate({ description: "Giving link id." })),
447
+ "pledgeId": Schema.optionalKey(Schema.String.check(isMinChars(1)).annotate({ description: "Pledge id." })),
448
+ },
449
+ row: CONTRIBUTION_SCHEMA,
450
+ limit,
451
+ cursor: "bound",
452
+ total: true,
453
+ page: (args, cursor) => numbered({
454
+ args,
455
+ cursor,
456
+ fetch: (query) => connection.send(api.getContributions, { query }),
457
+ project: projectContribution,
458
+ query: {
459
+ minimumUpdatedDate: args["minimumUpdatedDate"],
460
+ maximumUpdatedDate: args["maximumUpdatedDate"],
461
+ minimumInitiatedDate: args["minimumInitiatedDate"],
462
+ maximumInitiatedDate: args["maximumInitiatedDate"],
463
+ "statusBucket[]": args["statusBucket"],
464
+ campaignId: args["campaignId"],
465
+ subcampaignId: args["subcampaignId"],
466
+ "locationIds[]": args["locationIds"],
467
+ givingLinkId: args["givingLinkId"],
468
+ pledgeId: args["pledgeId"],
469
+ },
470
+ }),
471
+ }),
472
+ read(connection, {
473
+ name: "get_contribution",
474
+ description: "Get one contribution by id with its status, amount, campaign, deposit, and donor name. Refunds and chargebacks are separate lists.",
475
+ input: Schema.Struct({
476
+ "contributionId": Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
477
+ description: "24-hex id from list_contributions.",
478
+ }),
479
+ }),
480
+ fields: true,
481
+ output: CONTRIBUTION_SCHEMA,
482
+ run: (args) => Effect.gen(function* () {
483
+ const record = yield* one(connection.send(api.getContributionById, { params: { contributionId: args.contributionId } }));
484
+ return projectContribution(record);
485
+ }),
486
+ }),
487
+ list(connection, {
488
+ name: "list_deposits",
489
+ description: "List deposits (payouts from Overflow to the nonprofit's bank) with status, net amount in cents, arrival date, and reconciliation state.",
490
+ filters: {
491
+ "startDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
492
+ description: "Arrived on or after; ISO date or date-time.",
493
+ })),
494
+ "endDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
495
+ description: "Arrived on or before; ISO date or date-time.",
496
+ })),
497
+ "types": Schema.optionalKey(Schema.Array(Schema.Literals(["AUTOMATED", "MANUAL", "IMPORT"]).annotate({ description: "Deposit type." }))
498
+ .check(Schema.isMinLength(1), Schema.isUnique())
499
+ .annotate({ description: "Deposit types; matches any." })),
500
+ "reconciled": Schema.optionalKey(Schema.Boolean.annotate({ description: "Filter by reconciliation state." })),
501
+ "minimumAmountInCents": Schema.optionalKey(Integer.check(Schema.isGreaterThanOrEqualTo(0)).annotate({
502
+ description: "Net amount at least this, in cents.",
503
+ })),
504
+ "maximumAmountInCents": Schema.optionalKey(Integer.check(Schema.isGreaterThanOrEqualTo(0)).annotate({
505
+ description: "Net amount at most this, in cents.",
506
+ })),
507
+ "search": Schema.optionalKey(Schema.String.check(isMinChars(1)).annotate({
508
+ description: "Overflow's free-text search across deposit fields.",
509
+ })),
510
+ "sortDirection": Schema.optionalKey(Schema.Literals(["ASC", "DESC"]).annotate({ description: "Arrival-date order. Defaults to DESC." })),
511
+ },
512
+ row: DEPOSIT_SCHEMA,
513
+ limit,
514
+ cursor: "bound",
515
+ total: true,
516
+ page: (args, cursor) => numbered({
517
+ args,
518
+ cursor,
519
+ fetch: (query) => connection.send(api.getDeposits, { query }),
520
+ project: (row) => projectDeposit(row, false),
521
+ query: {
522
+ startDate: args["startDate"],
523
+ endDate: args["endDate"],
524
+ "types[]": args["types"],
525
+ reconciled: args["reconciled"],
526
+ minimumEstimatedValueInCents: args["minimumAmountInCents"],
527
+ maximumEstimatedValueInCents: args["maximumAmountInCents"],
528
+ search: args["search"],
529
+ sortDirection: args["sortDirection"],
530
+ },
531
+ }),
532
+ }),
533
+ read(connection, {
534
+ name: "get_deposit",
535
+ description: "Get one deposit with its line items: each payment, refund, chargeback, adjustment, or transfer it settled, in cents. Totals are get_deposit_summary.",
536
+ input: Schema.Struct({
537
+ "depositId": Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
538
+ description: "24-hex id from list_deposits.",
539
+ }),
540
+ }),
541
+ fields: true,
542
+ output: DEPOSIT_SCHEMA,
543
+ run: (args) => Effect.gen(function* () {
544
+ const record = yield* one(connection.send(api.getDepositById, { params: { depositId: args.depositId } }));
545
+ return projectDeposit(record, true);
546
+ }),
547
+ }),
548
+ read(connection, {
549
+ name: "get_deposit_summary",
550
+ description: "Get one deposit's totals by kind — contributions, refunds, chargebacks, adjustments — as count, gross, fees, and net in cents.",
551
+ input: Schema.Struct({
552
+ "depositId": Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
553
+ description: "24-hex id from list_deposits.",
554
+ }),
555
+ }),
556
+ fields: true,
557
+ output: Schema.Struct({
558
+ "depositId": Schema.String,
559
+ "contributions": MONEY_ROLLUP,
560
+ "refunds": MONEY_ROLLUP,
561
+ "chargebacks": MONEY_ROLLUP,
562
+ "adjustments": MONEY_ROLLUP,
563
+ }),
564
+ run: (args) => Effect.gen(function* () {
565
+ const summary = yield* one(connection.send(api.getDepositSummary, { params: { depositId: args.depositId } }));
566
+ const rollup = (value) => {
567
+ const row = asRecord(value);
568
+ return compact({
569
+ count: row["count"] ?? 0,
570
+ grossInCents: row["grossInCents"] ?? 0,
571
+ feesInCents: row["feesInCents"] ?? 0,
572
+ totalInCents: row["totalInCents"] ?? 0,
573
+ });
574
+ };
575
+ return {
576
+ depositId: args["depositId"],
577
+ contributions: rollup(summary["contributions"]),
578
+ refunds: rollup(summary["refunds"]),
579
+ chargebacks: rollup(summary["chargebacks"]),
580
+ adjustments: rollup(summary["adjustments"]),
581
+ };
582
+ }),
583
+ }),
584
+ list(connection, {
585
+ name: "list_refunds",
586
+ description: "List refunds with status, reason, amount, and net in cents, optionally for one contribution. Reads only; issuing a refund uses overflow_api_write.",
587
+ filters: {
588
+ "contributionId": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
589
+ description: "24-hex id from list_contributions.",
590
+ })),
591
+ "minimumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
592
+ description: "Updated on or after; ISO date or date-time.",
593
+ })),
594
+ "maximumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
595
+ description: "Updated on or before; ISO date or date-time.",
596
+ })),
597
+ "sortDirection": Schema.optionalKey(Schema.Literals(["ASC", "DESC"]).annotate({ description: "Created-date order. Defaults to DESC." })),
598
+ },
599
+ row: REFUND_SCHEMA,
600
+ limit,
601
+ cursor: "bound",
602
+ total: true,
603
+ page: (args, cursor) => numbered({
604
+ args,
605
+ cursor,
606
+ fetch: (query) => connection.send(api.getRefunds, { query }),
607
+ project: projectRefund,
608
+ query: {
609
+ contributionId: args["contributionId"],
610
+ minimumUpdatedDate: args["minimumUpdatedDate"],
611
+ maximumUpdatedDate: args["maximumUpdatedDate"],
612
+ sortDirection: args["sortDirection"],
613
+ },
614
+ }),
615
+ }),
616
+ list(connection, {
617
+ name: "list_chargebacks",
618
+ description: "List chargebacks (card disputes and ACH returns) with status — pending, won, lost — and amounts in cents, optionally for one contribution.",
619
+ filters: {
620
+ "contributionId": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
621
+ description: "24-hex id from list_contributions.",
622
+ })),
623
+ "minimumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
624
+ description: "Updated on or after; ISO date or date-time.",
625
+ })),
626
+ "maximumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
627
+ description: "Updated on or before; ISO date or date-time.",
628
+ })),
629
+ "sortDirection": Schema.optionalKey(Schema.Literals(["ASC", "DESC"]).annotate({ description: "Created-date order. Defaults to DESC." })),
630
+ },
631
+ row: CHARGEBACK_SCHEMA,
632
+ limit,
633
+ cursor: "bound",
634
+ total: true,
635
+ page: (args, cursor) => numbered({
636
+ args,
637
+ cursor,
638
+ fetch: (query) => connection.send(api.getChargebacks, { query }),
639
+ project: projectChargeback,
640
+ query: {
641
+ contributionId: args["contributionId"],
642
+ minimumUpdatedDate: args["minimumUpdatedDate"],
643
+ maximumUpdatedDate: args["maximumUpdatedDate"],
644
+ sortDirection: args["sortDirection"],
645
+ },
646
+ }),
647
+ }),
648
+ list(connection, {
649
+ name: "list_donors",
650
+ description: "List donors with name, email, gift count, and recurring count. Cannot search by name or email; omits phone and address, which get_donor returns.",
651
+ filters: {
652
+ "locationIds": Schema.optionalKey(Schema.Array(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
653
+ description: "Id from list_locations.",
654
+ }))
655
+ .check(Schema.isMinLength(1))
656
+ .annotate({ description: "Ids from list_locations; matches any." })),
657
+ "minimumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
658
+ description: "Updated on or after; ISO date or date-time.",
659
+ })),
660
+ "maximumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
661
+ description: "Updated on or before; ISO date or date-time.",
662
+ })),
663
+ "sortBy": Schema.optionalKey(Schema.Literals([
664
+ "updatedAt",
665
+ "createdAt",
666
+ "lastName",
667
+ "firstName",
668
+ "email",
669
+ "totalContributionsCount",
670
+ ]).annotate({ description: "Sort field. Defaults to updatedAt." })),
671
+ "sortDirection": Schema.optionalKey(Schema.Literals(["ASC", "DESC"]).annotate({ description: "Defaults to DESC." })),
672
+ },
673
+ row: DONOR_LIST_SCHEMA,
674
+ limit,
675
+ cursor: "bound",
676
+ total: true,
677
+ page: (args, cursor) => numbered({
678
+ args,
679
+ cursor,
680
+ fetch: (query) => connection.send(api.getDonorProfiles, { query }),
681
+ project: (row) => projectDonor(row, false),
682
+ query: {
683
+ "locationIds[]": args["locationIds"],
684
+ minimumUpdatedDate: args["minimumUpdatedDate"],
685
+ maximumUpdatedDate: args["maximumUpdatedDate"],
686
+ sortBy: args["sortBy"],
687
+ sortDirection: args["sortDirection"],
688
+ },
689
+ }),
690
+ }),
691
+ read(connection, {
692
+ name: "get_donor",
693
+ description: "Get one donor's full profile: contact details, mailing address, locations, and giving counts. Their gifts are list_contributions rows.",
694
+ input: Schema.Struct({
695
+ "donorId": Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
696
+ description: "24-hex id from list_donors or a contribution's donor.id.",
697
+ }),
698
+ }),
699
+ fields: true,
700
+ output: DONOR_SCHEMA,
701
+ run: (args) => Effect.gen(function* () {
702
+ return projectDonor(yield* one(connection.send(api.getDonorProfile, { params: { donorId: args.donorId } })), true);
703
+ }),
704
+ }),
705
+ list(connection, {
706
+ name: "list_subscriptions",
707
+ description: "List recurring gifts with status, amount, frequency, next payment date, and campaign — for the nonprofit or, given donorId, one donor.",
708
+ filters: {
709
+ "donorId": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
710
+ description: "24-hex id from list_donors; omit for every donor.",
711
+ })),
712
+ "status": Schema.optionalKey(Schema.Array(Schema.Literals(["active", "paused", "pending", "failed", "inactive", "recreated"]).annotate({
713
+ description: "Recurring-gift status.",
714
+ }))
715
+ .check(Schema.isMinLength(1), Schema.isUnique())
716
+ .annotate({ description: "Statuses; matches any." })),
717
+ "locationIds": Schema.optionalKey(Schema.Array(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
718
+ description: "Id from list_locations.",
719
+ }))
720
+ .check(Schema.isMinLength(1))
721
+ .annotate({ description: "Ids from list_locations; matches any." })),
722
+ "minimumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
723
+ description: "Updated on or after; ISO date or date-time.",
724
+ })),
725
+ "maximumUpdatedDate": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^\\d{4}-\\d{2}-\\d{2}", "u"))).annotate({
726
+ description: "Updated on or before; ISO date or date-time.",
727
+ })),
728
+ "sortBy": Schema.optionalKey(Schema.Literals(["createdAt", "amount", "frequency", "nextContributionAt"]).annotate({
729
+ description: "Sort field. Defaults to createdAt.",
730
+ })),
731
+ "sortDirection": Schema.optionalKey(Schema.Literals(["ASC", "DESC"]).annotate({ description: "Defaults to DESC." })),
732
+ },
733
+ row: SUBSCRIPTION_SCHEMA,
734
+ limit,
735
+ cursor: "bound",
736
+ total: true,
737
+ page: (args, cursor) => numbered({
738
+ args,
739
+ cursor,
740
+ fetch: (query) => args.donorId === undefined
741
+ ? connection.send(api.getSubscriptions, { query })
742
+ : connection.send(api.getSubscriptionsByDonorProfile, { params: { donorId: args.donorId }, query }),
743
+ project: projectSubscription,
744
+ query: {
745
+ "status[]": args["status"],
746
+ "locationIds[]": args["locationIds"],
747
+ minimumUpdatedDate: args["minimumUpdatedDate"],
748
+ maximumUpdatedDate: args["maximumUpdatedDate"],
749
+ sortBy: args["sortBy"],
750
+ sortDirection: args["sortDirection"],
751
+ },
752
+ }),
753
+ }),
754
+ list(connection, {
755
+ name: "list_payment_methods",
756
+ description: "List a donor's saved payment-method ids, types, last four and expiry. Other nonsecret metadata comes from overflow_api_read.",
757
+ filters: {
758
+ donorId: Schema.String.check(Schema.isPattern(/^[0-9a-fA-F]{24}$/u)).annotate({
759
+ description: "Donor id from list_donors.",
760
+ }),
761
+ showExpired: Schema.optionalKey(Schema.Boolean.annotate({ description: "Include expired methods." })),
762
+ },
763
+ row: PAYMENT_METHOD_SCHEMA,
764
+ limit,
765
+ cursor: "bound",
766
+ page: (args, cursor) => Effect.gen(function* () {
767
+ const start = cursor === undefined ? 0 : Number(cursor);
768
+ if (!Number.isSafeInteger(start) || start < 0)
769
+ return yield* failed("invalid_args", "This payment-method cursor has no valid position.");
770
+ const { data } = yield* connection.send(api.getPaymentMethods, {
771
+ params: { donorId: args.donorId },
772
+ query: compact({ showExpired: args.showExpired }),
773
+ });
774
+ const rows = yield* checked(() => api.listRows(data));
775
+ if (start > rows.length)
776
+ return yield* failed("invalid_args", "This cursor no longer matches the donor's payment methods.");
777
+ const end = start + args.limit;
778
+ return {
779
+ rows: rows.slice(start, end).map(projectPaymentMethod),
780
+ page: { hasMore: end < rows.length, nextCursor: end < rows.length ? String(end) : null },
781
+ };
782
+ }),
783
+ }),
784
+ list(connection, {
785
+ name: "list_campaigns",
786
+ description: "List campaigns or subcampaigns with status, dates, and giving totals. Ids feed the campaignId filters and gift bodies.",
787
+ filters: {
788
+ "isSubcampaign": Schema.optionalKey(Schema.Boolean.annotate({ description: "True lists subcampaigns instead. Defaults to false." })),
789
+ "parentCampaignId": Schema.optionalKey(Schema.String.check(Schema.isPattern(new RegExp("^[0-9a-fA-F]{24}$", "u"))).annotate({
790
+ description: "24-hex id from list_campaigns; lists its subcampaigns.",
791
+ })),
792
+ "search": Schema.optionalKey(Schema.String.check(isMinChars(1)).annotate({ description: "Campaign-name search." })),
793
+ "includeArchived": Schema.optionalKey(Schema.Boolean.annotate({ description: "Include archived campaigns." })),
794
+ "excludeInactive": Schema.optionalKey(Schema.Boolean.annotate({ description: "Exclude campaigns that have ended." })),
795
+ "sortBy": Schema.optionalKey(Schema.Literals([
796
+ "startDate",
797
+ "endDate",
798
+ "name",
799
+ "displayOrder",
800
+ "totalContributionCount",
801
+ "totalContributionValue",
802
+ "uniqueDonorCount",
803
+ ]).annotate({ description: "Sort field. Defaults to startDate." })),
804
+ "sortDirection": Schema.optionalKey(Schema.Literals(["ASC", "DESC"]).annotate({ description: "Defaults to DESC." })),
805
+ },
806
+ row: CAMPAIGN_SCHEMA,
807
+ limit,
808
+ cursor: "bound",
809
+ total: true,
810
+ page: (args, cursor) => numbered({
811
+ args,
812
+ cursor,
813
+ fetch: (query) => connection.send(api.getCampaigns, { query }),
814
+ project: projectCampaign,
815
+ query: {
816
+ isSubcampaign: args["isSubcampaign"] === undefined
817
+ ? args["parentCampaignId"] === undefined
818
+ ? undefined
819
+ : "true"
820
+ : args["isSubcampaign"]
821
+ ? "true"
822
+ : "false",
823
+ parentCampaignId: args["parentCampaignId"],
824
+ search: args["search"],
825
+ includeArchived: args["includeArchived"],
826
+ excludeInactive: args["excludeInactive"],
827
+ sortBy: args["sortBy"],
828
+ sortDirection: args["sortDirection"],
829
+ },
830
+ }),
831
+ }),
832
+ list(connection, {
833
+ name: "list_locations",
834
+ description: "List the nonprofit's locations (campuses) with names and ids for the locationIds filters. The default location is flagged.",
835
+ filters: {
836
+ "includeArchived": Schema.optionalKey(Schema.Boolean.annotate({ description: "Include archived locations." })),
837
+ "sortBy": Schema.optionalKey(Schema.Literals(["displayOrder", "name", "createdAt"]).annotate({
838
+ description: "Sort field. Defaults to displayOrder.",
839
+ })),
840
+ "sortDirection": Schema.optionalKey(Schema.Literals(["ASC", "DESC"]).annotate({ description: "Defaults to ASC." })),
841
+ },
842
+ row: LOCATION_SCHEMA,
843
+ limit,
844
+ cursor: "bound",
845
+ total: true,
846
+ page: (args, cursor) => numbered({
847
+ args,
848
+ cursor,
849
+ fetch: (query) => connection.send(api.getLocations, { query }),
850
+ project: projectLocation,
851
+ query: {
852
+ includeArchived: args["includeArchived"],
853
+ sortBy: args["sortBy"],
854
+ sortDirection: args["sortDirection"],
855
+ },
856
+ }),
857
+ }),
858
+ ];
859
+ }
860
+ function checked(run) {
861
+ return Effect.try({ try: run, catch: (error) => error }).pipe(Effect.catch((error) => error instanceof ConnectorCallError
862
+ ? Effect.fail(new Refusal({ error }))
863
+ : error instanceof SyntaxError
864
+ ? Effect.fail(new Refusal({
865
+ error: new ConnectorCallError("invalid_args", "This cursor contains no valid paging state."),
866
+ }))
867
+ : Effect.die(error)));
868
+ }
869
+ function failed(code, message) {
870
+ return Effect.fail(new Refusal({
871
+ error: new ConnectorCallError(code, message, code === "connector_call_failed" ? { retryable: false } : {}),
872
+ }));
873
+ }