@zackbart/connecta 0.34.1 → 0.35.0

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