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