@hasna/connectors 0.0.1

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 (1269) hide show
  1. package/README.md +304 -0
  2. package/bin/index.js +5281 -0
  3. package/connectors/connect-anthropic/.env.example +4 -0
  4. package/connectors/connect-anthropic/.npmrc.example +2 -0
  5. package/connectors/connect-anthropic/AGENTS.md +97 -0
  6. package/connectors/connect-anthropic/CLAUDE.md +97 -0
  7. package/connectors/connect-anthropic/GEMINI.md +97 -0
  8. package/connectors/connect-anthropic/README.md +106 -0
  9. package/connectors/connect-anthropic/package.json +60 -0
  10. package/connectors/connect-anthropic/src/api/client.ts +122 -0
  11. package/connectors/connect-anthropic/src/api/index.ts +51 -0
  12. package/connectors/connect-anthropic/src/api/messages.ts +109 -0
  13. package/connectors/connect-anthropic/src/cli/index.ts +336 -0
  14. package/connectors/connect-anthropic/src/index.ts +24 -0
  15. package/connectors/connect-anthropic/src/types/index.ts +198 -0
  16. package/connectors/connect-anthropic/src/utils/config.ts +208 -0
  17. package/connectors/connect-anthropic/src/utils/output.ts +119 -0
  18. package/connectors/connect-anthropic/tsconfig.json +16 -0
  19. package/connectors/connect-aws/.env.example +11 -0
  20. package/connectors/connect-aws/.npmrc.example +2 -0
  21. package/connectors/connect-aws/AGENTS.md +145 -0
  22. package/connectors/connect-aws/CLAUDE.md +145 -0
  23. package/connectors/connect-aws/GEMINI.md +145 -0
  24. package/connectors/connect-aws/README.md +131 -0
  25. package/connectors/connect-aws/package.json +51 -0
  26. package/connectors/connect-aws/src/api/client.ts +349 -0
  27. package/connectors/connect-aws/src/api/dynamodb.ts +542 -0
  28. package/connectors/connect-aws/src/api/index.ts +71 -0
  29. package/connectors/connect-aws/src/api/lambda.ts +326 -0
  30. package/connectors/connect-aws/src/api/s3.ts +305 -0
  31. package/connectors/connect-aws/src/cli/index.ts +614 -0
  32. package/connectors/connect-aws/src/index.ts +28 -0
  33. package/connectors/connect-aws/src/types/index.ts +276 -0
  34. package/connectors/connect-aws/src/utils/config.ts +230 -0
  35. package/connectors/connect-aws/src/utils/output.ts +119 -0
  36. package/connectors/connect-aws/tsconfig.json +16 -0
  37. package/connectors/connect-brandsight/.env.example +8 -0
  38. package/connectors/connect-brandsight/.npmrc.example +2 -0
  39. package/connectors/connect-brandsight/AGENTS.md +128 -0
  40. package/connectors/connect-brandsight/CLAUDE.md +128 -0
  41. package/connectors/connect-brandsight/GEMINI.md +128 -0
  42. package/connectors/connect-brandsight/README.md +129 -0
  43. package/connectors/connect-brandsight/package.json +56 -0
  44. package/connectors/connect-brandsight/src/api/client.ts +171 -0
  45. package/connectors/connect-brandsight/src/api/domains.ts +387 -0
  46. package/connectors/connect-brandsight/src/api/example.ts +59 -0
  47. package/connectors/connect-brandsight/src/api/index.ts +50 -0
  48. package/connectors/connect-brandsight/src/cli/index.ts +775 -0
  49. package/connectors/connect-brandsight/src/index.ts +11 -0
  50. package/connectors/connect-brandsight/src/types/index.ts +197 -0
  51. package/connectors/connect-brandsight/src/utils/config.ts +244 -0
  52. package/connectors/connect-brandsight/src/utils/contacts.ts +204 -0
  53. package/connectors/connect-brandsight/src/utils/output.ts +119 -0
  54. package/connectors/connect-brandsight/tsconfig.json +29 -0
  55. package/connectors/connect-browseruse/.env.example +7 -0
  56. package/connectors/connect-browseruse/.npmrc.example +2 -0
  57. package/connectors/connect-browseruse/AGENTS.md +172 -0
  58. package/connectors/connect-browseruse/CLAUDE.md +172 -0
  59. package/connectors/connect-browseruse/GEMINI.md +172 -0
  60. package/connectors/connect-browseruse/README.md +153 -0
  61. package/connectors/connect-browseruse/package.json +52 -0
  62. package/connectors/connect-browseruse/src/api/billing.ts +32 -0
  63. package/connectors/connect-browseruse/src/api/browsers.ts +50 -0
  64. package/connectors/connect-browseruse/src/api/client.ts +168 -0
  65. package/connectors/connect-browseruse/src/api/files.ts +70 -0
  66. package/connectors/connect-browseruse/src/api/index.ts +95 -0
  67. package/connectors/connect-browseruse/src/api/profiles.ts +59 -0
  68. package/connectors/connect-browseruse/src/api/sessions.ts +88 -0
  69. package/connectors/connect-browseruse/src/api/skills.ts +194 -0
  70. package/connectors/connect-browseruse/src/api/tasks.ts +127 -0
  71. package/connectors/connect-browseruse/src/cli/index.ts +888 -0
  72. package/connectors/connect-browseruse/src/index.ts +35 -0
  73. package/connectors/connect-browseruse/src/types/index.ts +312 -0
  74. package/connectors/connect-browseruse/src/utils/config.ts +212 -0
  75. package/connectors/connect-browseruse/src/utils/output.ts +119 -0
  76. package/connectors/connect-browseruse/tsconfig.json +16 -0
  77. package/connectors/connect-cloudflare/.env.example +10 -0
  78. package/connectors/connect-cloudflare/.npmrc.example +2 -0
  79. package/connectors/connect-cloudflare/AGENTS.md +84 -0
  80. package/connectors/connect-cloudflare/CLAUDE.md +84 -0
  81. package/connectors/connect-cloudflare/GEMINI.md +84 -0
  82. package/connectors/connect-cloudflare/README.md +94 -0
  83. package/connectors/connect-cloudflare/package.json +59 -0
  84. package/connectors/connect-cloudflare/scripts/init.sh +62 -0
  85. package/connectors/connect-cloudflare/src/api/accounts.ts +352 -0
  86. package/connectors/connect-cloudflare/src/api/analytics.ts +638 -0
  87. package/connectors/connect-cloudflare/src/api/bulk.ts +1104 -0
  88. package/connectors/connect-cloudflare/src/api/cache.ts +192 -0
  89. package/connectors/connect-cloudflare/src/api/client.ts +201 -0
  90. package/connectors/connect-cloudflare/src/api/dns.ts +109 -0
  91. package/connectors/connect-cloudflare/src/api/firewall.ts +405 -0
  92. package/connectors/connect-cloudflare/src/api/index.ts +150 -0
  93. package/connectors/connect-cloudflare/src/api/kv.ts +171 -0
  94. package/connectors/connect-cloudflare/src/api/pages.ts +241 -0
  95. package/connectors/connect-cloudflare/src/api/r2.ts +270 -0
  96. package/connectors/connect-cloudflare/src/api/ssl.ts +416 -0
  97. package/connectors/connect-cloudflare/src/api/workers.ts +235 -0
  98. package/connectors/connect-cloudflare/src/api/zones.ts +121 -0
  99. package/connectors/connect-cloudflare/src/cli/index.ts +1644 -0
  100. package/connectors/connect-cloudflare/src/index.ts +21 -0
  101. package/connectors/connect-cloudflare/src/types/index.ts +754 -0
  102. package/connectors/connect-cloudflare/src/utils/config.ts +365 -0
  103. package/connectors/connect-cloudflare/src/utils/output.ts +119 -0
  104. package/connectors/connect-cloudflare/tsconfig.json +29 -0
  105. package/connectors/connect-discord/.env.example +9 -0
  106. package/connectors/connect-discord/.npmrc.example +2 -0
  107. package/connectors/connect-discord/AGENTS.md +187 -0
  108. package/connectors/connect-discord/CLAUDE.md +187 -0
  109. package/connectors/connect-discord/GEMINI.md +187 -0
  110. package/connectors/connect-discord/README.md +158 -0
  111. package/connectors/connect-discord/package.json +55 -0
  112. package/connectors/connect-discord/src/api/channels.ts +451 -0
  113. package/connectors/connect-discord/src/api/client.ts +147 -0
  114. package/connectors/connect-discord/src/api/commands.ts +212 -0
  115. package/connectors/connect-discord/src/api/gateway.ts +27 -0
  116. package/connectors/connect-discord/src/api/guilds.ts +434 -0
  117. package/connectors/connect-discord/src/api/index.ts +82 -0
  118. package/connectors/connect-discord/src/api/invites.ts +27 -0
  119. package/connectors/connect-discord/src/api/users.ts +66 -0
  120. package/connectors/connect-discord/src/api/webhooks.ts +188 -0
  121. package/connectors/connect-discord/src/cli/index.ts +788 -0
  122. package/connectors/connect-discord/src/index.ts +35 -0
  123. package/connectors/connect-discord/src/types/index.ts +545 -0
  124. package/connectors/connect-discord/src/utils/config.ts +219 -0
  125. package/connectors/connect-discord/src/utils/output.ts +119 -0
  126. package/connectors/connect-discord/tsconfig.json +16 -0
  127. package/connectors/connect-docker/.env.example +11 -0
  128. package/connectors/connect-docker/.npmrc.example +2 -0
  129. package/connectors/connect-docker/AGENTS.md +112 -0
  130. package/connectors/connect-docker/CLAUDE.md +112 -0
  131. package/connectors/connect-docker/GEMINI.md +112 -0
  132. package/connectors/connect-docker/README.md +97 -0
  133. package/connectors/connect-docker/package.json +57 -0
  134. package/connectors/connect-docker/src/api/client.ts +181 -0
  135. package/connectors/connect-docker/src/api/example.ts +79 -0
  136. package/connectors/connect-docker/src/api/index.ts +63 -0
  137. package/connectors/connect-docker/src/cli/index.ts +318 -0
  138. package/connectors/connect-docker/src/index.ts +30 -0
  139. package/connectors/connect-docker/src/types/index.ts +172 -0
  140. package/connectors/connect-docker/src/utils/config.ts +238 -0
  141. package/connectors/connect-docker/src/utils/output.ts +119 -0
  142. package/connectors/connect-docker/tsconfig.json +16 -0
  143. package/connectors/connect-e2b/.env.example +7 -0
  144. package/connectors/connect-e2b/.npmrc.example +2 -0
  145. package/connectors/connect-e2b/AGENTS.md +126 -0
  146. package/connectors/connect-e2b/CLAUDE.md +126 -0
  147. package/connectors/connect-e2b/GEMINI.md +126 -0
  148. package/connectors/connect-e2b/README.md +135 -0
  149. package/connectors/connect-e2b/package.json +51 -0
  150. package/connectors/connect-e2b/src/api/client.ts +150 -0
  151. package/connectors/connect-e2b/src/api/code.ts +188 -0
  152. package/connectors/connect-e2b/src/api/filesystem.ts +168 -0
  153. package/connectors/connect-e2b/src/api/index.ts +131 -0
  154. package/connectors/connect-e2b/src/api/sandbox.ts +91 -0
  155. package/connectors/connect-e2b/src/cli/index.ts +481 -0
  156. package/connectors/connect-e2b/src/index.ts +28 -0
  157. package/connectors/connect-e2b/src/types/index.ts +136 -0
  158. package/connectors/connect-e2b/src/utils/config.ts +231 -0
  159. package/connectors/connect-e2b/src/utils/output.ts +119 -0
  160. package/connectors/connect-e2b/tsconfig.json +16 -0
  161. package/connectors/connect-elevenlabs/.env.example +15 -0
  162. package/connectors/connect-elevenlabs/.npmrc.example +2 -0
  163. package/connectors/connect-elevenlabs/AGENTS.md +80 -0
  164. package/connectors/connect-elevenlabs/CLAUDE.md +80 -0
  165. package/connectors/connect-elevenlabs/GEMINI.md +80 -0
  166. package/connectors/connect-elevenlabs/README.md +98 -0
  167. package/connectors/connect-elevenlabs/package.json +57 -0
  168. package/connectors/connect-elevenlabs/src/api/client.ts +175 -0
  169. package/connectors/connect-elevenlabs/src/api/history.ts +103 -0
  170. package/connectors/connect-elevenlabs/src/api/index.ts +101 -0
  171. package/connectors/connect-elevenlabs/src/api/models.ts +49 -0
  172. package/connectors/connect-elevenlabs/src/api/sound-effects.ts +62 -0
  173. package/connectors/connect-elevenlabs/src/api/sts.ts +109 -0
  174. package/connectors/connect-elevenlabs/src/api/stt.ts +93 -0
  175. package/connectors/connect-elevenlabs/src/api/tts.ts +175 -0
  176. package/connectors/connect-elevenlabs/src/api/user.ts +43 -0
  177. package/connectors/connect-elevenlabs/src/api/voices.ts +169 -0
  178. package/connectors/connect-elevenlabs/src/cli/index.ts +739 -0
  179. package/connectors/connect-elevenlabs/src/index.ts +40 -0
  180. package/connectors/connect-elevenlabs/src/types/index.ts +432 -0
  181. package/connectors/connect-elevenlabs/src/utils/config.ts +242 -0
  182. package/connectors/connect-elevenlabs/src/utils/output.ts +119 -0
  183. package/connectors/connect-elevenlabs/tsconfig.json +16 -0
  184. package/connectors/connect-exa/.npmrc.example +2 -0
  185. package/connectors/connect-exa/AGENTS.md +76 -0
  186. package/connectors/connect-exa/CLAUDE.md +76 -0
  187. package/connectors/connect-exa/GEMINI.md +76 -0
  188. package/connectors/connect-exa/README.md +94 -0
  189. package/connectors/connect-exa/package.json +59 -0
  190. package/connectors/connect-exa/src/api/answer.ts +150 -0
  191. package/connectors/connect-exa/src/api/client.ts +171 -0
  192. package/connectors/connect-exa/src/api/contents.ts +150 -0
  193. package/connectors/connect-exa/src/api/context.ts +84 -0
  194. package/connectors/connect-exa/src/api/index.ts +77 -0
  195. package/connectors/connect-exa/src/api/research.ts +154 -0
  196. package/connectors/connect-exa/src/api/search.ts +153 -0
  197. package/connectors/connect-exa/src/api/similar.ts +138 -0
  198. package/connectors/connect-exa/src/api/team.ts +165 -0
  199. package/connectors/connect-exa/src/api/websets.ts +228 -0
  200. package/connectors/connect-exa/src/cli/index.ts +813 -0
  201. package/connectors/connect-exa/src/index.ts +32 -0
  202. package/connectors/connect-exa/src/types/index.ts +410 -0
  203. package/connectors/connect-exa/src/utils/config.ts +336 -0
  204. package/connectors/connect-exa/src/utils/output.ts +119 -0
  205. package/connectors/connect-exa/tsconfig.json +21 -0
  206. package/connectors/connect-figma/.npmrc.example +2 -0
  207. package/connectors/connect-figma/AGENTS.md +185 -0
  208. package/connectors/connect-figma/CLAUDE.md +185 -0
  209. package/connectors/connect-figma/GEMINI.md +185 -0
  210. package/connectors/connect-figma/README.md +164 -0
  211. package/connectors/connect-figma/package.json +50 -0
  212. package/connectors/connect-figma/src/api/client.ts +111 -0
  213. package/connectors/connect-figma/src/api/comments.ts +114 -0
  214. package/connectors/connect-figma/src/api/components.ts +82 -0
  215. package/connectors/connect-figma/src/api/devresources.ts +78 -0
  216. package/connectors/connect-figma/src/api/files.ts +132 -0
  217. package/connectors/connect-figma/src/api/index.ts +86 -0
  218. package/connectors/connect-figma/src/api/projects.ts +36 -0
  219. package/connectors/connect-figma/src/api/styles.ts +46 -0
  220. package/connectors/connect-figma/src/api/teams.ts +17 -0
  221. package/connectors/connect-figma/src/api/users.ts +16 -0
  222. package/connectors/connect-figma/src/api/variables.ts +73 -0
  223. package/connectors/connect-figma/src/api/webhooks.ts +97 -0
  224. package/connectors/connect-figma/src/cli/index.ts +960 -0
  225. package/connectors/connect-figma/src/index.ts +34 -0
  226. package/connectors/connect-figma/src/types/index.ts +593 -0
  227. package/connectors/connect-figma/src/utils/config.ts +197 -0
  228. package/connectors/connect-figma/src/utils/output.ts +119 -0
  229. package/connectors/connect-figma/tsconfig.json +16 -0
  230. package/connectors/connect-firecrawl/.env.example +7 -0
  231. package/connectors/connect-firecrawl/.npmrc.example +2 -0
  232. package/connectors/connect-firecrawl/AGENTS.md +104 -0
  233. package/connectors/connect-firecrawl/CLAUDE.md +104 -0
  234. package/connectors/connect-firecrawl/GEMINI.md +104 -0
  235. package/connectors/connect-firecrawl/README.md +95 -0
  236. package/connectors/connect-firecrawl/package.json +51 -0
  237. package/connectors/connect-firecrawl/src/api/client.ts +123 -0
  238. package/connectors/connect-firecrawl/src/api/crawl.ts +93 -0
  239. package/connectors/connect-firecrawl/src/api/index.ts +61 -0
  240. package/connectors/connect-firecrawl/src/api/map.ts +51 -0
  241. package/connectors/connect-firecrawl/src/api/scrape.ts +71 -0
  242. package/connectors/connect-firecrawl/src/api/search.ts +61 -0
  243. package/connectors/connect-firecrawl/src/cli/index.ts +432 -0
  244. package/connectors/connect-firecrawl/src/index.ts +24 -0
  245. package/connectors/connect-firecrawl/src/types/index.ts +216 -0
  246. package/connectors/connect-firecrawl/src/utils/config.ts +208 -0
  247. package/connectors/connect-firecrawl/src/utils/output.ts +119 -0
  248. package/connectors/connect-firecrawl/tsconfig.json +16 -0
  249. package/connectors/connect-github/.env.example +11 -0
  250. package/connectors/connect-github/.npmrc.example +2 -0
  251. package/connectors/connect-github/AGENTS.md +150 -0
  252. package/connectors/connect-github/CLAUDE.md +150 -0
  253. package/connectors/connect-github/GEMINI.md +150 -0
  254. package/connectors/connect-github/README.md +126 -0
  255. package/connectors/connect-github/package.json +49 -0
  256. package/connectors/connect-github/src/api/client.ts +137 -0
  257. package/connectors/connect-github/src/api/index.ts +62 -0
  258. package/connectors/connect-github/src/api/issues.ts +186 -0
  259. package/connectors/connect-github/src/api/pulls.ts +284 -0
  260. package/connectors/connect-github/src/api/repos.ts +155 -0
  261. package/connectors/connect-github/src/api/users.ts +139 -0
  262. package/connectors/connect-github/src/cli/index.ts +732 -0
  263. package/connectors/connect-github/src/index.ts +24 -0
  264. package/connectors/connect-github/src/types/index.ts +497 -0
  265. package/connectors/connect-github/src/utils/config.ts +208 -0
  266. package/connectors/connect-github/src/utils/output.ts +119 -0
  267. package/connectors/connect-github/tsconfig.json +16 -0
  268. package/connectors/connect-gmail/.env.example +8 -0
  269. package/connectors/connect-gmail/.npmrc.example +2 -0
  270. package/connectors/connect-gmail/AGENTS.md +79 -0
  271. package/connectors/connect-gmail/CLAUDE.md +79 -0
  272. package/connectors/connect-gmail/GEMINI.md +79 -0
  273. package/connectors/connect-gmail/README.md +97 -0
  274. package/connectors/connect-gmail/package.json +58 -0
  275. package/connectors/connect-gmail/src/api/attachments.ts +141 -0
  276. package/connectors/connect-gmail/src/api/bulk.ts +661 -0
  277. package/connectors/connect-gmail/src/api/client.ts +131 -0
  278. package/connectors/connect-gmail/src/api/drafts.ts +198 -0
  279. package/connectors/connect-gmail/src/api/export.ts +312 -0
  280. package/connectors/connect-gmail/src/api/filters.ts +127 -0
  281. package/connectors/connect-gmail/src/api/index.ts +63 -0
  282. package/connectors/connect-gmail/src/api/labels.ts +123 -0
  283. package/connectors/connect-gmail/src/api/messages.ts +527 -0
  284. package/connectors/connect-gmail/src/api/profile.ts +72 -0
  285. package/connectors/connect-gmail/src/api/threads.ts +85 -0
  286. package/connectors/connect-gmail/src/cli/index.ts +2143 -0
  287. package/connectors/connect-gmail/src/index.ts +30 -0
  288. package/connectors/connect-gmail/src/types/index.ts +202 -0
  289. package/connectors/connect-gmail/src/utils/auth.ts +247 -0
  290. package/connectors/connect-gmail/src/utils/config.ts +466 -0
  291. package/connectors/connect-gmail/src/utils/contacts.ts +147 -0
  292. package/connectors/connect-gmail/src/utils/markdown.ts +110 -0
  293. package/connectors/connect-gmail/src/utils/output.ts +119 -0
  294. package/connectors/connect-gmail/src/utils/settings.ts +87 -0
  295. package/connectors/connect-gmail/tsconfig.json +16 -0
  296. package/connectors/connect-google/.env.example +10 -0
  297. package/connectors/connect-google/.npmrc.example +2 -0
  298. package/connectors/connect-google/AGENTS.md +76 -0
  299. package/connectors/connect-google/CLAUDE.md +76 -0
  300. package/connectors/connect-google/GEMINI.md +76 -0
  301. package/connectors/connect-google/README.md +94 -0
  302. package/connectors/connect-google/package.json +60 -0
  303. package/connectors/connect-google/src/api/calendar.ts +339 -0
  304. package/connectors/connect-google/src/api/client.ts +201 -0
  305. package/connectors/connect-google/src/api/docs.ts +372 -0
  306. package/connectors/connect-google/src/api/drive.ts +370 -0
  307. package/connectors/connect-google/src/api/gmail.ts +338 -0
  308. package/connectors/connect-google/src/api/index.ts +66 -0
  309. package/connectors/connect-google/src/api/sheets.ts +343 -0
  310. package/connectors/connect-google/src/cli/index.ts +1232 -0
  311. package/connectors/connect-google/src/index.ts +27 -0
  312. package/connectors/connect-google/src/types/index.ts +1893 -0
  313. package/connectors/connect-google/src/utils/config.ts +248 -0
  314. package/connectors/connect-google/src/utils/output.ts +119 -0
  315. package/connectors/connect-google/tsconfig.json +21 -0
  316. package/connectors/connect-googlecalendar/.npmrc.example +2 -0
  317. package/connectors/connect-googlecalendar/AGENTS.md +117 -0
  318. package/connectors/connect-googlecalendar/CLAUDE.md +117 -0
  319. package/connectors/connect-googlecalendar/GEMINI.md +117 -0
  320. package/connectors/connect-googlecalendar/README.md +97 -0
  321. package/connectors/connect-googlecalendar/package.json +57 -0
  322. package/connectors/connect-googlecalendar/src/api/calendars.ts +106 -0
  323. package/connectors/connect-googlecalendar/src/api/client.ts +266 -0
  324. package/connectors/connect-googlecalendar/src/api/events.ts +266 -0
  325. package/connectors/connect-googlecalendar/src/api/index.ts +96 -0
  326. package/connectors/connect-googlecalendar/src/cli/index.ts +819 -0
  327. package/connectors/connect-googlecalendar/src/index.ts +30 -0
  328. package/connectors/connect-googlecalendar/src/types/index.ts +347 -0
  329. package/connectors/connect-googlecalendar/src/utils/config.ts +251 -0
  330. package/connectors/connect-googlecalendar/src/utils/output.ts +119 -0
  331. package/connectors/connect-googlecalendar/tsconfig.json +16 -0
  332. package/connectors/connect-googlecloud/.env.example +11 -0
  333. package/connectors/connect-googlecloud/.npmrc.example +2 -0
  334. package/connectors/connect-googlecloud/AGENTS.md +110 -0
  335. package/connectors/connect-googlecloud/CLAUDE.md +110 -0
  336. package/connectors/connect-googlecloud/GEMINI.md +110 -0
  337. package/connectors/connect-googlecloud/README.md +96 -0
  338. package/connectors/connect-googlecloud/package.json +56 -0
  339. package/connectors/connect-googlecloud/src/api/client.ts +208 -0
  340. package/connectors/connect-googlecloud/src/api/index.ts +53 -0
  341. package/connectors/connect-googlecloud/src/api/projects.ts +75 -0
  342. package/connectors/connect-googlecloud/src/cli/index.ts +305 -0
  343. package/connectors/connect-googlecloud/src/index.ts +28 -0
  344. package/connectors/connect-googlecloud/src/types/index.ts +100 -0
  345. package/connectors/connect-googlecloud/src/utils/config.ts +232 -0
  346. package/connectors/connect-googlecloud/src/utils/output.ts +119 -0
  347. package/connectors/connect-googlecloud/tsconfig.json +16 -0
  348. package/connectors/connect-googlecontacts/.npmrc.example +2 -0
  349. package/connectors/connect-googlecontacts/AGENTS.md +181 -0
  350. package/connectors/connect-googlecontacts/CLAUDE.md +181 -0
  351. package/connectors/connect-googlecontacts/GEMINI.md +181 -0
  352. package/connectors/connect-googlecontacts/README.md +117 -0
  353. package/connectors/connect-googlecontacts/package.json +56 -0
  354. package/connectors/connect-googlecontacts/src/api/client.ts +306 -0
  355. package/connectors/connect-googlecontacts/src/api/contacts.ts +236 -0
  356. package/connectors/connect-googlecontacts/src/api/index.ts +99 -0
  357. package/connectors/connect-googlecontacts/src/cli/index.ts +654 -0
  358. package/connectors/connect-googlecontacts/src/index.ts +34 -0
  359. package/connectors/connect-googlecontacts/src/types/index.ts +254 -0
  360. package/connectors/connect-googlecontacts/src/utils/config.ts +337 -0
  361. package/connectors/connect-googlecontacts/src/utils/output.ts +119 -0
  362. package/connectors/connect-googlecontacts/tsconfig.json +16 -0
  363. package/connectors/connect-googledocs/.env.example +11 -0
  364. package/connectors/connect-googledocs/.npmrc.example +2 -0
  365. package/connectors/connect-googledocs/AGENTS.md +130 -0
  366. package/connectors/connect-googledocs/CLAUDE.md +130 -0
  367. package/connectors/connect-googledocs/GEMINI.md +130 -0
  368. package/connectors/connect-googledocs/README.md +112 -0
  369. package/connectors/connect-googledocs/package.json +50 -0
  370. package/connectors/connect-googledocs/src/api/client.ts +159 -0
  371. package/connectors/connect-googledocs/src/api/content.ts +219 -0
  372. package/connectors/connect-googledocs/src/api/documents.ts +52 -0
  373. package/connectors/connect-googledocs/src/api/index.ts +65 -0
  374. package/connectors/connect-googledocs/src/api/styles.ts +386 -0
  375. package/connectors/connect-googledocs/src/cli/index.ts +364 -0
  376. package/connectors/connect-googledocs/src/index.ts +24 -0
  377. package/connectors/connect-googledocs/src/types/index.ts +767 -0
  378. package/connectors/connect-googledocs/src/utils/config.ts +208 -0
  379. package/connectors/connect-googledocs/src/utils/output.ts +119 -0
  380. package/connectors/connect-googledocs/tsconfig.json +16 -0
  381. package/connectors/connect-googledrive/.npmrc.example +2 -0
  382. package/connectors/connect-googledrive/AGENTS.md +76 -0
  383. package/connectors/connect-googledrive/CLAUDE.md +76 -0
  384. package/connectors/connect-googledrive/GEMINI.md +76 -0
  385. package/connectors/connect-googledrive/README.md +94 -0
  386. package/connectors/connect-googledrive/package.json +55 -0
  387. package/connectors/connect-googledrive/src/api/client.ts +216 -0
  388. package/connectors/connect-googledrive/src/api/drives.ts +186 -0
  389. package/connectors/connect-googledrive/src/api/files.ts +305 -0
  390. package/connectors/connect-googledrive/src/api/folders.ts +133 -0
  391. package/connectors/connect-googledrive/src/api/index.ts +47 -0
  392. package/connectors/connect-googledrive/src/api/storage.ts +48 -0
  393. package/connectors/connect-googledrive/src/api/trash.ts +47 -0
  394. package/connectors/connect-googledrive/src/cli/index.ts +933 -0
  395. package/connectors/connect-googledrive/src/index.ts +30 -0
  396. package/connectors/connect-googledrive/src/types/index.ts +378 -0
  397. package/connectors/connect-googledrive/src/utils/auth.ts +207 -0
  398. package/connectors/connect-googledrive/src/utils/config.ts +440 -0
  399. package/connectors/connect-googledrive/src/utils/output.ts +135 -0
  400. package/connectors/connect-googledrive/tsconfig.json +25 -0
  401. package/connectors/connect-googlegemini/.env.example +7 -0
  402. package/connectors/connect-googlegemini/.npmrc.example +2 -0
  403. package/connectors/connect-googlegemini/AGENTS.md +184 -0
  404. package/connectors/connect-googlegemini/CLAUDE.md +184 -0
  405. package/connectors/connect-googlegemini/GEMINI.md +184 -0
  406. package/connectors/connect-googlegemini/README.md +143 -0
  407. package/connectors/connect-googlegemini/package.json +55 -0
  408. package/connectors/connect-googlegemini/src/api/client.ts +219 -0
  409. package/connectors/connect-googlegemini/src/api/embeddings.ts +142 -0
  410. package/connectors/connect-googlegemini/src/api/files.ts +152 -0
  411. package/connectors/connect-googlegemini/src/api/generate.ts +187 -0
  412. package/connectors/connect-googlegemini/src/api/images.ts +216 -0
  413. package/connectors/connect-googlegemini/src/api/index.ts +103 -0
  414. package/connectors/connect-googlegemini/src/api/models.ts +102 -0
  415. package/connectors/connect-googlegemini/src/api/speech.ts +195 -0
  416. package/connectors/connect-googlegemini/src/api/video.ts +224 -0
  417. package/connectors/connect-googlegemini/src/cli/index.ts +702 -0
  418. package/connectors/connect-googlegemini/src/index.ts +34 -0
  419. package/connectors/connect-googlegemini/src/types/index.ts +324 -0
  420. package/connectors/connect-googlegemini/src/utils/config.ts +139 -0
  421. package/connectors/connect-googlegemini/src/utils/output.ts +169 -0
  422. package/connectors/connect-googlegemini/tsconfig.json +15 -0
  423. package/connectors/connect-googlemaps/.npmrc.example +2 -0
  424. package/connectors/connect-googlemaps/AGENTS.md +143 -0
  425. package/connectors/connect-googlemaps/CLAUDE.md +143 -0
  426. package/connectors/connect-googlemaps/GEMINI.md +143 -0
  427. package/connectors/connect-googlemaps/README.md +152 -0
  428. package/connectors/connect-googlemaps/package.json +29 -0
  429. package/connectors/connect-googlemaps/src/api/index.ts +315 -0
  430. package/connectors/connect-googlemaps/src/cli/index.ts +423 -0
  431. package/connectors/connect-googlemaps/src/index.ts +3 -0
  432. package/connectors/connect-googlemaps/src/types/index.ts +268 -0
  433. package/connectors/connect-googlemaps/src/utils/config.ts +59 -0
  434. package/connectors/connect-googlemaps/src/utils/output.ts +178 -0
  435. package/connectors/connect-googlemaps/tsconfig.json +17 -0
  436. package/connectors/connect-googlesheets/.env.example +15 -0
  437. package/connectors/connect-googlesheets/.npmrc.example +2 -0
  438. package/connectors/connect-googlesheets/AGENTS.md +144 -0
  439. package/connectors/connect-googlesheets/CLAUDE.md +144 -0
  440. package/connectors/connect-googlesheets/GEMINI.md +144 -0
  441. package/connectors/connect-googlesheets/README.md +124 -0
  442. package/connectors/connect-googlesheets/package.json +51 -0
  443. package/connectors/connect-googlesheets/src/api/client.ts +230 -0
  444. package/connectors/connect-googlesheets/src/api/index.ts +113 -0
  445. package/connectors/connect-googlesheets/src/api/sheets.ts +249 -0
  446. package/connectors/connect-googlesheets/src/api/spreadsheets.ts +150 -0
  447. package/connectors/connect-googlesheets/src/api/values.ts +209 -0
  448. package/connectors/connect-googlesheets/src/cli/index.ts +544 -0
  449. package/connectors/connect-googlesheets/src/index.ts +32 -0
  450. package/connectors/connect-googlesheets/src/types/index.ts +764 -0
  451. package/connectors/connect-googlesheets/src/utils/config.ts +289 -0
  452. package/connectors/connect-googlesheets/src/utils/output.ts +119 -0
  453. package/connectors/connect-googlesheets/tsconfig.json +16 -0
  454. package/connectors/connect-googletasks/.env.example +6 -0
  455. package/connectors/connect-googletasks/.npmrc.example +2 -0
  456. package/connectors/connect-googletasks/AGENTS.md +122 -0
  457. package/connectors/connect-googletasks/CLAUDE.md +122 -0
  458. package/connectors/connect-googletasks/GEMINI.md +122 -0
  459. package/connectors/connect-googletasks/README.md +131 -0
  460. package/connectors/connect-googletasks/package.json +50 -0
  461. package/connectors/connect-googletasks/src/api/index.ts +321 -0
  462. package/connectors/connect-googletasks/src/cli/index.ts +542 -0
  463. package/connectors/connect-googletasks/src/index.ts +42 -0
  464. package/connectors/connect-googletasks/src/types/index.ts +167 -0
  465. package/connectors/connect-googletasks/src/utils/config.ts +287 -0
  466. package/connectors/connect-googletasks/src/utils/output.ts +145 -0
  467. package/connectors/connect-googletasks/tsconfig.json +16 -0
  468. package/connectors/connect-hedra/.env.example +7 -0
  469. package/connectors/connect-hedra/.npmrc.example +2 -0
  470. package/connectors/connect-hedra/AGENTS.md +101 -0
  471. package/connectors/connect-hedra/CLAUDE.md +101 -0
  472. package/connectors/connect-hedra/GEMINI.md +101 -0
  473. package/connectors/connect-hedra/README.md +95 -0
  474. package/connectors/connect-hedra/package.json +57 -0
  475. package/connectors/connect-hedra/src/api/characters.ts +44 -0
  476. package/connectors/connect-hedra/src/api/client.ts +136 -0
  477. package/connectors/connect-hedra/src/api/index.ts +57 -0
  478. package/connectors/connect-hedra/src/api/projects.ts +44 -0
  479. package/connectors/connect-hedra/src/api/voices.ts +23 -0
  480. package/connectors/connect-hedra/src/cli/index.ts +314 -0
  481. package/connectors/connect-hedra/src/index.ts +24 -0
  482. package/connectors/connect-hedra/src/types/index.ts +103 -0
  483. package/connectors/connect-hedra/src/utils/config.ts +211 -0
  484. package/connectors/connect-hedra/src/utils/output.ts +119 -0
  485. package/connectors/connect-hedra/tsconfig.json +16 -0
  486. package/connectors/connect-heygen/.env.example +11 -0
  487. package/connectors/connect-heygen/.npmrc.example +2 -0
  488. package/connectors/connect-heygen/AGENTS.md +102 -0
  489. package/connectors/connect-heygen/CLAUDE.md +102 -0
  490. package/connectors/connect-heygen/GEMINI.md +102 -0
  491. package/connectors/connect-heygen/README.md +96 -0
  492. package/connectors/connect-heygen/package.json +57 -0
  493. package/connectors/connect-heygen/src/api/client.ts +134 -0
  494. package/connectors/connect-heygen/src/api/example.ts +48 -0
  495. package/connectors/connect-heygen/src/api/index.ts +49 -0
  496. package/connectors/connect-heygen/src/cli/index.ts +242 -0
  497. package/connectors/connect-heygen/src/index.ts +24 -0
  498. package/connectors/connect-heygen/src/types/index.ts +69 -0
  499. package/connectors/connect-heygen/src/utils/config.ts +209 -0
  500. package/connectors/connect-heygen/src/utils/output.ts +119 -0
  501. package/connectors/connect-heygen/tsconfig.json +16 -0
  502. package/connectors/connect-huggingface/.env.example +10 -0
  503. package/connectors/connect-huggingface/.npmrc.example +2 -0
  504. package/connectors/connect-huggingface/AGENTS.md +113 -0
  505. package/connectors/connect-huggingface/CLAUDE.md +113 -0
  506. package/connectors/connect-huggingface/GEMINI.md +113 -0
  507. package/connectors/connect-huggingface/README.md +97 -0
  508. package/connectors/connect-huggingface/package.json +57 -0
  509. package/connectors/connect-huggingface/src/api/client.ts +136 -0
  510. package/connectors/connect-huggingface/src/api/example.ts +48 -0
  511. package/connectors/connect-huggingface/src/api/index.ts +49 -0
  512. package/connectors/connect-huggingface/src/cli/index.ts +243 -0
  513. package/connectors/connect-huggingface/src/index.ts +24 -0
  514. package/connectors/connect-huggingface/src/types/index.ts +69 -0
  515. package/connectors/connect-huggingface/src/utils/config.ts +211 -0
  516. package/connectors/connect-huggingface/src/utils/output.ts +119 -0
  517. package/connectors/connect-huggingface/tsconfig.json +16 -0
  518. package/connectors/connect-icons8/.env.example +7 -0
  519. package/connectors/connect-icons8/.npmrc.example +2 -0
  520. package/connectors/connect-icons8/AGENTS.md +101 -0
  521. package/connectors/connect-icons8/CLAUDE.md +101 -0
  522. package/connectors/connect-icons8/GEMINI.md +101 -0
  523. package/connectors/connect-icons8/README.md +95 -0
  524. package/connectors/connect-icons8/package.json +55 -0
  525. package/connectors/connect-icons8/src/api/client.ts +137 -0
  526. package/connectors/connect-icons8/src/api/example.ts +64 -0
  527. package/connectors/connect-icons8/src/api/index.ts +48 -0
  528. package/connectors/connect-icons8/src/cli/index.ts +286 -0
  529. package/connectors/connect-icons8/src/index.ts +24 -0
  530. package/connectors/connect-icons8/src/types/index.ts +114 -0
  531. package/connectors/connect-icons8/src/utils/config.ts +211 -0
  532. package/connectors/connect-icons8/src/utils/output.ts +119 -0
  533. package/connectors/connect-icons8/tsconfig.json +16 -0
  534. package/connectors/connect-maropost/.env.example +13 -0
  535. package/connectors/connect-maropost/.npmrc.example +2 -0
  536. package/connectors/connect-maropost/AGENTS.md +110 -0
  537. package/connectors/connect-maropost/CLAUDE.md +110 -0
  538. package/connectors/connect-maropost/GEMINI.md +110 -0
  539. package/connectors/connect-maropost/README.md +96 -0
  540. package/connectors/connect-maropost/package.json +51 -0
  541. package/connectors/connect-maropost/src/api/campaigns.ts +129 -0
  542. package/connectors/connect-maropost/src/api/client.ts +162 -0
  543. package/connectors/connect-maropost/src/api/contacts.ts +128 -0
  544. package/connectors/connect-maropost/src/api/index.ts +91 -0
  545. package/connectors/connect-maropost/src/api/journeys.ts +60 -0
  546. package/connectors/connect-maropost/src/api/lists.ts +80 -0
  547. package/connectors/connect-maropost/src/api/reports.ts +123 -0
  548. package/connectors/connect-maropost/src/api/transactional.ts +109 -0
  549. package/connectors/connect-maropost/src/cli/index.ts +958 -0
  550. package/connectors/connect-maropost/src/index.ts +33 -0
  551. package/connectors/connect-maropost/src/types/index.ts +340 -0
  552. package/connectors/connect-maropost/src/utils/config.ts +213 -0
  553. package/connectors/connect-maropost/src/utils/output.ts +119 -0
  554. package/connectors/connect-maropost/tsconfig.json +16 -0
  555. package/connectors/connect-mercury/.env.example +5 -0
  556. package/connectors/connect-mercury/.npmrc.example +2 -0
  557. package/connectors/connect-mercury/AGENTS.md +137 -0
  558. package/connectors/connect-mercury/CLAUDE.md +137 -0
  559. package/connectors/connect-mercury/GEMINI.md +137 -0
  560. package/connectors/connect-mercury/README.md +146 -0
  561. package/connectors/connect-mercury/package.json +60 -0
  562. package/connectors/connect-mercury/src/api/accounts.ts +79 -0
  563. package/connectors/connect-mercury/src/api/attachments.ts +24 -0
  564. package/connectors/connect-mercury/src/api/categories.ts +40 -0
  565. package/connectors/connect-mercury/src/api/client.ts +134 -0
  566. package/connectors/connect-mercury/src/api/credit.ts +38 -0
  567. package/connectors/connect-mercury/src/api/customers.ts +53 -0
  568. package/connectors/connect-mercury/src/api/events.ts +63 -0
  569. package/connectors/connect-mercury/src/api/index.ts +97 -0
  570. package/connectors/connect-mercury/src/api/invoices.ts +102 -0
  571. package/connectors/connect-mercury/src/api/organization.ts +88 -0
  572. package/connectors/connect-mercury/src/api/recipients.ts +84 -0
  573. package/connectors/connect-mercury/src/api/transactions.ts +128 -0
  574. package/connectors/connect-mercury/src/api/transfers.ts +96 -0
  575. package/connectors/connect-mercury/src/api/treasury.ts +82 -0
  576. package/connectors/connect-mercury/src/api/webhooks.ts +90 -0
  577. package/connectors/connect-mercury/src/cli/index.ts +1263 -0
  578. package/connectors/connect-mercury/src/index.ts +33 -0
  579. package/connectors/connect-mercury/src/types/index.ts +505 -0
  580. package/connectors/connect-mercury/src/utils/config.ts +393 -0
  581. package/connectors/connect-mercury/src/utils/output.ts +119 -0
  582. package/connectors/connect-mercury/tsconfig.json +16 -0
  583. package/connectors/connect-meta/.npmrc.example +2 -0
  584. package/connectors/connect-meta/AGENTS.md +76 -0
  585. package/connectors/connect-meta/CLAUDE.md +76 -0
  586. package/connectors/connect-meta/GEMINI.md +76 -0
  587. package/connectors/connect-meta/README.md +94 -0
  588. package/connectors/connect-meta/package.json +61 -0
  589. package/connectors/connect-meta/src/api/accounts.ts +120 -0
  590. package/connectors/connect-meta/src/api/ads.ts +274 -0
  591. package/connectors/connect-meta/src/api/adsets.ts +263 -0
  592. package/connectors/connect-meta/src/api/audiences.ts +392 -0
  593. package/connectors/connect-meta/src/api/business.ts +495 -0
  594. package/connectors/connect-meta/src/api/campaigns.ts +191 -0
  595. package/connectors/connect-meta/src/api/catalogs.ts +500 -0
  596. package/connectors/connect-meta/src/api/client.ts +154 -0
  597. package/connectors/connect-meta/src/api/creatives.ts +357 -0
  598. package/connectors/connect-meta/src/api/index.ts +100 -0
  599. package/connectors/connect-meta/src/api/insights.ts +357 -0
  600. package/connectors/connect-meta/src/api/instagram.ts +449 -0
  601. package/connectors/connect-meta/src/api/pages.ts +330 -0
  602. package/connectors/connect-meta/src/api/pixels.ts +408 -0
  603. package/connectors/connect-meta/src/cli/index.ts +1585 -0
  604. package/connectors/connect-meta/src/index.ts +44 -0
  605. package/connectors/connect-meta/src/types/index.ts +1523 -0
  606. package/connectors/connect-meta/src/utils/config.ts +458 -0
  607. package/connectors/connect-meta/src/utils/output.ts +152 -0
  608. package/connectors/connect-meta/tsconfig.json +18 -0
  609. package/connectors/connect-midjourney/.env.example +13 -0
  610. package/connectors/connect-midjourney/.npmrc.example +2 -0
  611. package/connectors/connect-midjourney/AGENTS.md +104 -0
  612. package/connectors/connect-midjourney/CLAUDE.md +104 -0
  613. package/connectors/connect-midjourney/GEMINI.md +104 -0
  614. package/connectors/connect-midjourney/README.md +96 -0
  615. package/connectors/connect-midjourney/package.json +57 -0
  616. package/connectors/connect-midjourney/src/api/client.ts +143 -0
  617. package/connectors/connect-midjourney/src/api/imagine.ts +84 -0
  618. package/connectors/connect-midjourney/src/api/index.ts +50 -0
  619. package/connectors/connect-midjourney/src/cli/index.ts +343 -0
  620. package/connectors/connect-midjourney/src/index.ts +24 -0
  621. package/connectors/connect-midjourney/src/types/index.ts +98 -0
  622. package/connectors/connect-midjourney/src/utils/config.ts +219 -0
  623. package/connectors/connect-midjourney/src/utils/output.ts +119 -0
  624. package/connectors/connect-midjourney/tsconfig.json +16 -0
  625. package/connectors/connect-mistral/.env.example +4 -0
  626. package/connectors/connect-mistral/.npmrc.example +2 -0
  627. package/connectors/connect-mistral/AGENTS.md +100 -0
  628. package/connectors/connect-mistral/CLAUDE.md +100 -0
  629. package/connectors/connect-mistral/GEMINI.md +100 -0
  630. package/connectors/connect-mistral/README.md +109 -0
  631. package/connectors/connect-mistral/package.json +60 -0
  632. package/connectors/connect-mistral/src/api/chat.ts +113 -0
  633. package/connectors/connect-mistral/src/api/client.ts +122 -0
  634. package/connectors/connect-mistral/src/api/embeddings.ts +52 -0
  635. package/connectors/connect-mistral/src/api/index.ts +62 -0
  636. package/connectors/connect-mistral/src/cli/index.ts +371 -0
  637. package/connectors/connect-mistral/src/index.ts +24 -0
  638. package/connectors/connect-mistral/src/types/index.ts +183 -0
  639. package/connectors/connect-mistral/src/utils/config.ts +208 -0
  640. package/connectors/connect-mistral/src/utils/output.ts +119 -0
  641. package/connectors/connect-mistral/tsconfig.json +16 -0
  642. package/connectors/connect-mixpanel/.env.example +8 -0
  643. package/connectors/connect-mixpanel/.npmrc.example +2 -0
  644. package/connectors/connect-mixpanel/AGENTS.md +178 -0
  645. package/connectors/connect-mixpanel/CLAUDE.md +178 -0
  646. package/connectors/connect-mixpanel/GEMINI.md +178 -0
  647. package/connectors/connect-mixpanel/README.md +149 -0
  648. package/connectors/connect-mixpanel/package.json +54 -0
  649. package/connectors/connect-mixpanel/src/api/client.ts +352 -0
  650. package/connectors/connect-mixpanel/src/api/engage.ts +209 -0
  651. package/connectors/connect-mixpanel/src/api/export.ts +122 -0
  652. package/connectors/connect-mixpanel/src/api/funnels.ts +136 -0
  653. package/connectors/connect-mixpanel/src/api/index.ts +97 -0
  654. package/connectors/connect-mixpanel/src/api/insights.ts +198 -0
  655. package/connectors/connect-mixpanel/src/api/retention.ts +139 -0
  656. package/connectors/connect-mixpanel/src/api/track.ts +69 -0
  657. package/connectors/connect-mixpanel/src/cli/index.ts +678 -0
  658. package/connectors/connect-mixpanel/src/index.ts +32 -0
  659. package/connectors/connect-mixpanel/src/types/index.ts +262 -0
  660. package/connectors/connect-mixpanel/src/utils/config.ts +255 -0
  661. package/connectors/connect-mixpanel/src/utils/output.ts +119 -0
  662. package/connectors/connect-mixpanel/tsconfig.json +16 -0
  663. package/connectors/connect-notion/.env.example +10 -0
  664. package/connectors/connect-notion/.npmrc.example +2 -0
  665. package/connectors/connect-notion/AGENTS.md +75 -0
  666. package/connectors/connect-notion/CLAUDE.md +211 -0
  667. package/connectors/connect-notion/GEMINI.md +54 -0
  668. package/connectors/connect-notion/README.md +244 -0
  669. package/connectors/connect-notion/package.json +56 -0
  670. package/connectors/connect-notion/src/api/blocks.ts +463 -0
  671. package/connectors/connect-notion/src/api/bulk.ts +614 -0
  672. package/connectors/connect-notion/src/api/client.ts +127 -0
  673. package/connectors/connect-notion/src/api/comments.ts +142 -0
  674. package/connectors/connect-notion/src/api/databases.ts +652 -0
  675. package/connectors/connect-notion/src/api/export.ts +487 -0
  676. package/connectors/connect-notion/src/api/index.ts +72 -0
  677. package/connectors/connect-notion/src/api/pages.ts +465 -0
  678. package/connectors/connect-notion/src/api/search.ts +202 -0
  679. package/connectors/connect-notion/src/api/users.ts +99 -0
  680. package/connectors/connect-notion/src/cli/index.ts +1666 -0
  681. package/connectors/connect-notion/src/index.ts +16 -0
  682. package/connectors/connect-notion/src/types/index.ts +723 -0
  683. package/connectors/connect-notion/src/utils/auth.ts +186 -0
  684. package/connectors/connect-notion/src/utils/config.ts +434 -0
  685. package/connectors/connect-notion/src/utils/output.ts +119 -0
  686. package/connectors/connect-notion/tsconfig.json +29 -0
  687. package/connectors/connect-openai/.env.example +4 -0
  688. package/connectors/connect-openai/.npmrc.example +2 -0
  689. package/connectors/connect-openai/AGENTS.md +77 -0
  690. package/connectors/connect-openai/CLAUDE.md +77 -0
  691. package/connectors/connect-openai/GEMINI.md +77 -0
  692. package/connectors/connect-openai/README.md +95 -0
  693. package/connectors/connect-openai/package.json +61 -0
  694. package/connectors/connect-openai/src/api/chat.ts +134 -0
  695. package/connectors/connect-openai/src/api/client.ts +128 -0
  696. package/connectors/connect-openai/src/api/embeddings.ts +57 -0
  697. package/connectors/connect-openai/src/api/images.ts +75 -0
  698. package/connectors/connect-openai/src/api/index.ts +67 -0
  699. package/connectors/connect-openai/src/cli/index.ts +459 -0
  700. package/connectors/connect-openai/src/index.ts +26 -0
  701. package/connectors/connect-openai/src/types/index.ts +241 -0
  702. package/connectors/connect-openai/src/utils/config.ts +219 -0
  703. package/connectors/connect-openai/src/utils/output.ts +119 -0
  704. package/connectors/connect-openai/tsconfig.json +16 -0
  705. package/connectors/connect-openweathermap/.env.example +2 -0
  706. package/connectors/connect-openweathermap/.npmrc.example +2 -0
  707. package/connectors/connect-openweathermap/AGENTS.md +106 -0
  708. package/connectors/connect-openweathermap/CLAUDE.md +106 -0
  709. package/connectors/connect-openweathermap/GEMINI.md +106 -0
  710. package/connectors/connect-openweathermap/README.md +115 -0
  711. package/connectors/connect-openweathermap/package.json +52 -0
  712. package/connectors/connect-openweathermap/src/api/client.ts +76 -0
  713. package/connectors/connect-openweathermap/src/api/index.ts +24 -0
  714. package/connectors/connect-openweathermap/src/api/weather.ts +108 -0
  715. package/connectors/connect-openweathermap/src/cli/index.ts +470 -0
  716. package/connectors/connect-openweathermap/src/index.ts +33 -0
  717. package/connectors/connect-openweathermap/src/types/index.ts +275 -0
  718. package/connectors/connect-openweathermap/src/utils/config.ts +82 -0
  719. package/connectors/connect-openweathermap/src/utils/output.ts +106 -0
  720. package/connectors/connect-openweathermap/tsconfig.json +16 -0
  721. package/connectors/connect-pandadoc/.env.example +13 -0
  722. package/connectors/connect-pandadoc/.npmrc.example +2 -0
  723. package/connectors/connect-pandadoc/AGENTS.md +76 -0
  724. package/connectors/connect-pandadoc/CLAUDE.md +76 -0
  725. package/connectors/connect-pandadoc/GEMINI.md +76 -0
  726. package/connectors/connect-pandadoc/README.md +94 -0
  727. package/connectors/connect-pandadoc/package.json +57 -0
  728. package/connectors/connect-pandadoc/src/api/catalogs.ts +58 -0
  729. package/connectors/connect-pandadoc/src/api/client.ts +169 -0
  730. package/connectors/connect-pandadoc/src/api/contacts.ts +58 -0
  731. package/connectors/connect-pandadoc/src/api/content-library.ts +57 -0
  732. package/connectors/connect-pandadoc/src/api/documents.ts +263 -0
  733. package/connectors/connect-pandadoc/src/api/folders.ts +58 -0
  734. package/connectors/connect-pandadoc/src/api/forms.ts +37 -0
  735. package/connectors/connect-pandadoc/src/api/index.ts +83 -0
  736. package/connectors/connect-pandadoc/src/api/members.ts +42 -0
  737. package/connectors/connect-pandadoc/src/api/templates.ts +61 -0
  738. package/connectors/connect-pandadoc/src/api/webhooks.ts +81 -0
  739. package/connectors/connect-pandadoc/src/cli/index.ts +1212 -0
  740. package/connectors/connect-pandadoc/src/index.ts +39 -0
  741. package/connectors/connect-pandadoc/src/types/index.ts +454 -0
  742. package/connectors/connect-pandadoc/src/utils/config.ts +259 -0
  743. package/connectors/connect-pandadoc/src/utils/output.ts +119 -0
  744. package/connectors/connect-pandadoc/tsconfig.json +16 -0
  745. package/connectors/connect-quo/.env.example +7 -0
  746. package/connectors/connect-quo/.npmrc.example +2 -0
  747. package/connectors/connect-quo/AGENTS.md +76 -0
  748. package/connectors/connect-quo/CLAUDE.md +76 -0
  749. package/connectors/connect-quo/GEMINI.md +76 -0
  750. package/connectors/connect-quo/README.md +94 -0
  751. package/connectors/connect-quo/package.json +58 -0
  752. package/connectors/connect-quo/src/api/calls.ts +64 -0
  753. package/connectors/connect-quo/src/api/client.ts +133 -0
  754. package/connectors/connect-quo/src/api/contacts.ts +57 -0
  755. package/connectors/connect-quo/src/api/conversations.ts +45 -0
  756. package/connectors/connect-quo/src/api/custom-fields.ts +17 -0
  757. package/connectors/connect-quo/src/api/index.ts +76 -0
  758. package/connectors/connect-quo/src/api/messages.ts +50 -0
  759. package/connectors/connect-quo/src/api/phone-numbers.ts +24 -0
  760. package/connectors/connect-quo/src/api/users.ts +24 -0
  761. package/connectors/connect-quo/src/api/webhooks.ts +121 -0
  762. package/connectors/connect-quo/src/cli/index.ts +713 -0
  763. package/connectors/connect-quo/src/index.ts +32 -0
  764. package/connectors/connect-quo/src/types/index.ts +361 -0
  765. package/connectors/connect-quo/src/utils/config.ts +242 -0
  766. package/connectors/connect-quo/src/utils/output.ts +119 -0
  767. package/connectors/connect-quo/tsconfig.json +16 -0
  768. package/connectors/connect-reddit/.npmrc.example +2 -0
  769. package/connectors/connect-reddit/AGENTS.md +176 -0
  770. package/connectors/connect-reddit/CLAUDE.md +176 -0
  771. package/connectors/connect-reddit/GEMINI.md +176 -0
  772. package/connectors/connect-reddit/README.md +160 -0
  773. package/connectors/connect-reddit/package.json +50 -0
  774. package/connectors/connect-reddit/src/api/client.ts +299 -0
  775. package/connectors/connect-reddit/src/api/comments.ts +268 -0
  776. package/connectors/connect-reddit/src/api/index.ts +113 -0
  777. package/connectors/connect-reddit/src/api/posts.ts +298 -0
  778. package/connectors/connect-reddit/src/api/search.ts +235 -0
  779. package/connectors/connect-reddit/src/api/subreddits.ts +279 -0
  780. package/connectors/connect-reddit/src/api/users.ts +403 -0
  781. package/connectors/connect-reddit/src/cli/index.ts +766 -0
  782. package/connectors/connect-reddit/src/index.ts +36 -0
  783. package/connectors/connect-reddit/src/types/index.ts +295 -0
  784. package/connectors/connect-reddit/src/utils/config.ts +281 -0
  785. package/connectors/connect-reddit/src/utils/output.ts +138 -0
  786. package/connectors/connect-reddit/tsconfig.json +16 -0
  787. package/connectors/connect-reducto/.npmrc.example +2 -0
  788. package/connectors/connect-reducto/AGENTS.md +136 -0
  789. package/connectors/connect-reducto/CLAUDE.md +136 -0
  790. package/connectors/connect-reducto/GEMINI.md +136 -0
  791. package/connectors/connect-reducto/README.md +145 -0
  792. package/connectors/connect-reducto/package.json +48 -0
  793. package/connectors/connect-reducto/src/api/index.ts +362 -0
  794. package/connectors/connect-reducto/src/cli/index.ts +582 -0
  795. package/connectors/connect-reducto/src/index.ts +48 -0
  796. package/connectors/connect-reducto/src/types/index.ts +204 -0
  797. package/connectors/connect-reducto/src/utils/config.ts +144 -0
  798. package/connectors/connect-reducto/src/utils/output.ts +256 -0
  799. package/connectors/connect-reducto/tsconfig.json +18 -0
  800. package/connectors/connect-resend/.npmrc.example +2 -0
  801. package/connectors/connect-resend/AGENTS.md +76 -0
  802. package/connectors/connect-resend/CLAUDE.md +76 -0
  803. package/connectors/connect-resend/GEMINI.md +76 -0
  804. package/connectors/connect-resend/README.md +94 -0
  805. package/connectors/connect-resend/package.json +58 -0
  806. package/connectors/connect-resend/src/api/api-keys.ts +41 -0
  807. package/connectors/connect-resend/src/api/audiences.ts +46 -0
  808. package/connectors/connect-resend/src/api/broadcasts.ts +65 -0
  809. package/connectors/connect-resend/src/api/client.ts +132 -0
  810. package/connectors/connect-resend/src/api/contacts.ts +64 -0
  811. package/connectors/connect-resend/src/api/domains.ts +64 -0
  812. package/connectors/connect-resend/src/api/emails.ts +66 -0
  813. package/connectors/connect-resend/src/api/index.ts +77 -0
  814. package/connectors/connect-resend/src/api/templates.ts +65 -0
  815. package/connectors/connect-resend/src/api/webhooks.ts +55 -0
  816. package/connectors/connect-resend/src/cli/index.ts +1029 -0
  817. package/connectors/connect-resend/src/index.ts +32 -0
  818. package/connectors/connect-resend/src/types/index.ts +327 -0
  819. package/connectors/connect-resend/src/utils/config.ts +228 -0
  820. package/connectors/connect-resend/src/utils/output.ts +119 -0
  821. package/connectors/connect-resend/tsconfig.json +21 -0
  822. package/connectors/connect-revolut/.npmrc.example +2 -0
  823. package/connectors/connect-revolut/AGENTS.md +162 -0
  824. package/connectors/connect-revolut/CLAUDE.md +162 -0
  825. package/connectors/connect-revolut/GEMINI.md +162 -0
  826. package/connectors/connect-revolut/README.md +145 -0
  827. package/connectors/connect-revolut/package.json +54 -0
  828. package/connectors/connect-revolut/src/api/accounts.ts +46 -0
  829. package/connectors/connect-revolut/src/api/cards.ts +87 -0
  830. package/connectors/connect-revolut/src/api/client.ts +128 -0
  831. package/connectors/connect-revolut/src/api/counterparties.ts +64 -0
  832. package/connectors/connect-revolut/src/api/exchange.ts +87 -0
  833. package/connectors/connect-revolut/src/api/index.ts +85 -0
  834. package/connectors/connect-revolut/src/api/payments.ts +64 -0
  835. package/connectors/connect-revolut/src/api/transactions.ts +62 -0
  836. package/connectors/connect-revolut/src/cli/index.ts +674 -0
  837. package/connectors/connect-revolut/src/index.ts +32 -0
  838. package/connectors/connect-revolut/src/types/index.ts +306 -0
  839. package/connectors/connect-revolut/src/utils/config.ts +212 -0
  840. package/connectors/connect-revolut/src/utils/output.ts +77 -0
  841. package/connectors/connect-revolut/tsconfig.json +16 -0
  842. package/connectors/connect-sedo/.env.example +7 -0
  843. package/connectors/connect-sedo/.npmrc.example +2 -0
  844. package/connectors/connect-sedo/AGENTS.md +111 -0
  845. package/connectors/connect-sedo/CLAUDE.md +111 -0
  846. package/connectors/connect-sedo/GEMINI.md +111 -0
  847. package/connectors/connect-sedo/README.md +112 -0
  848. package/connectors/connect-sedo/package.json +54 -0
  849. package/connectors/connect-sedo/src/api/client.ts +139 -0
  850. package/connectors/connect-sedo/src/api/domains.ts +246 -0
  851. package/connectors/connect-sedo/src/api/index.ts +30 -0
  852. package/connectors/connect-sedo/src/cli/index.ts +490 -0
  853. package/connectors/connect-sedo/src/index.ts +18 -0
  854. package/connectors/connect-sedo/src/types/index.ts +104 -0
  855. package/connectors/connect-sedo/src/utils/config.ts +234 -0
  856. package/connectors/connect-sedo/src/utils/output.ts +62 -0
  857. package/connectors/connect-sedo/tsconfig.json +29 -0
  858. package/connectors/connect-sentry/.env.example +10 -0
  859. package/connectors/connect-sentry/.npmrc.example +2 -0
  860. package/connectors/connect-sentry/AGENTS.md +102 -0
  861. package/connectors/connect-sentry/CLAUDE.md +102 -0
  862. package/connectors/connect-sentry/GEMINI.md +102 -0
  863. package/connectors/connect-sentry/README.md +96 -0
  864. package/connectors/connect-sentry/package.json +55 -0
  865. package/connectors/connect-sentry/src/api/client.ts +136 -0
  866. package/connectors/connect-sentry/src/api/example.ts +48 -0
  867. package/connectors/connect-sentry/src/api/index.ts +49 -0
  868. package/connectors/connect-sentry/src/cli/index.ts +242 -0
  869. package/connectors/connect-sentry/src/index.ts +24 -0
  870. package/connectors/connect-sentry/src/types/index.ts +69 -0
  871. package/connectors/connect-sentry/src/utils/config.ts +210 -0
  872. package/connectors/connect-sentry/src/utils/output.ts +119 -0
  873. package/connectors/connect-sentry/tsconfig.json +16 -0
  874. package/connectors/connect-shadcn/.env.example +5 -0
  875. package/connectors/connect-shadcn/.npmrc.example +2 -0
  876. package/connectors/connect-shadcn/AGENTS.md +104 -0
  877. package/connectors/connect-shadcn/CLAUDE.md +104 -0
  878. package/connectors/connect-shadcn/GEMINI.md +104 -0
  879. package/connectors/connect-shadcn/README.md +94 -0
  880. package/connectors/connect-shadcn/package.json +55 -0
  881. package/connectors/connect-shadcn/src/api/client.ts +91 -0
  882. package/connectors/connect-shadcn/src/api/components.ts +146 -0
  883. package/connectors/connect-shadcn/src/api/index.ts +50 -0
  884. package/connectors/connect-shadcn/src/cli/index.ts +320 -0
  885. package/connectors/connect-shadcn/src/index.ts +22 -0
  886. package/connectors/connect-shadcn/src/types/index.ts +89 -0
  887. package/connectors/connect-shadcn/src/utils/config.ts +208 -0
  888. package/connectors/connect-shadcn/src/utils/output.ts +119 -0
  889. package/connectors/connect-shadcn/tsconfig.json +16 -0
  890. package/connectors/connect-shopify/.npmrc.example +2 -0
  891. package/connectors/connect-shopify/AGENTS.md +170 -0
  892. package/connectors/connect-shopify/CLAUDE.md +170 -0
  893. package/connectors/connect-shopify/GEMINI.md +170 -0
  894. package/connectors/connect-shopify/README.md +153 -0
  895. package/connectors/connect-shopify/package.json +29 -0
  896. package/connectors/connect-shopify/src/api/client.ts +163 -0
  897. package/connectors/connect-shopify/src/api/collections.ts +322 -0
  898. package/connectors/connect-shopify/src/api/customers.ts +239 -0
  899. package/connectors/connect-shopify/src/api/index.ts +89 -0
  900. package/connectors/connect-shopify/src/api/inventory.ts +236 -0
  901. package/connectors/connect-shopify/src/api/orders.ts +367 -0
  902. package/connectors/connect-shopify/src/api/products.ts +252 -0
  903. package/connectors/connect-shopify/src/api/shop.ts +50 -0
  904. package/connectors/connect-shopify/src/cli/index.ts +870 -0
  905. package/connectors/connect-shopify/src/index.ts +35 -0
  906. package/connectors/connect-shopify/src/types/index.ts +262 -0
  907. package/connectors/connect-shopify/src/utils/config.ts +240 -0
  908. package/connectors/connect-shopify/src/utils/output.ts +119 -0
  909. package/connectors/connect-shopify/tsconfig.json +17 -0
  910. package/connectors/connect-snap/.npmrc.example +2 -0
  911. package/connectors/connect-snap/AGENTS.md +76 -0
  912. package/connectors/connect-snap/CLAUDE.md +76 -0
  913. package/connectors/connect-snap/GEMINI.md +76 -0
  914. package/connectors/connect-snap/README.md +94 -0
  915. package/connectors/connect-snap/package.json +62 -0
  916. package/connectors/connect-snap/src/api/accounts.ts +81 -0
  917. package/connectors/connect-snap/src/api/ads.ts +102 -0
  918. package/connectors/connect-snap/src/api/adsquads.ts +130 -0
  919. package/connectors/connect-snap/src/api/audiences.ts +208 -0
  920. package/connectors/connect-snap/src/api/campaigns.ts +92 -0
  921. package/connectors/connect-snap/src/api/catalogs.ts +313 -0
  922. package/connectors/connect-snap/src/api/client.ts +324 -0
  923. package/connectors/connect-snap/src/api/conversions.ts +403 -0
  924. package/connectors/connect-snap/src/api/creatives.ts +232 -0
  925. package/connectors/connect-snap/src/api/index.ts +124 -0
  926. package/connectors/connect-snap/src/api/leads.ts +299 -0
  927. package/connectors/connect-snap/src/api/media.ts +246 -0
  928. package/connectors/connect-snap/src/api/organizations.ts +30 -0
  929. package/connectors/connect-snap/src/api/pixels.ts +215 -0
  930. package/connectors/connect-snap/src/api/stats.ts +305 -0
  931. package/connectors/connect-snap/src/api/targeting.ts +255 -0
  932. package/connectors/connect-snap/src/cli/index.ts +1810 -0
  933. package/connectors/connect-snap/src/index.ts +52 -0
  934. package/connectors/connect-snap/src/types/index.ts +1226 -0
  935. package/connectors/connect-snap/src/utils/config.ts +509 -0
  936. package/connectors/connect-snap/src/utils/output.ts +139 -0
  937. package/connectors/connect-snap/tsconfig.json +16 -0
  938. package/connectors/connect-stabilityai/.npmrc.example +2 -0
  939. package/connectors/connect-stabilityai/AGENTS.md +76 -0
  940. package/connectors/connect-stabilityai/CLAUDE.md +76 -0
  941. package/connectors/connect-stabilityai/GEMINI.md +76 -0
  942. package/connectors/connect-stabilityai/README.md +94 -0
  943. package/connectors/connect-stabilityai/package.json +63 -0
  944. package/connectors/connect-stabilityai/src/api/3d.ts +99 -0
  945. package/connectors/connect-stabilityai/src/api/client.ts +238 -0
  946. package/connectors/connect-stabilityai/src/api/edit.ts +130 -0
  947. package/connectors/connect-stabilityai/src/api/engines.ts +41 -0
  948. package/connectors/connect-stabilityai/src/api/image-to-image.ts +150 -0
  949. package/connectors/connect-stabilityai/src/api/index.ts +81 -0
  950. package/connectors/connect-stabilityai/src/api/inpaint.ts +153 -0
  951. package/connectors/connect-stabilityai/src/api/outpaint.ts +117 -0
  952. package/connectors/connect-stabilityai/src/api/text-to-image.ts +181 -0
  953. package/connectors/connect-stabilityai/src/api/upscale.ts +113 -0
  954. package/connectors/connect-stabilityai/src/api/user.ts +24 -0
  955. package/connectors/connect-stabilityai/src/cli/index.ts +859 -0
  956. package/connectors/connect-stabilityai/src/index.ts +37 -0
  957. package/connectors/connect-stabilityai/src/types/index.ts +315 -0
  958. package/connectors/connect-stabilityai/src/utils/config.ts +340 -0
  959. package/connectors/connect-stabilityai/src/utils/output.ts +119 -0
  960. package/connectors/connect-stabilityai/tsconfig.json +21 -0
  961. package/connectors/connect-stripe/.env.example +10 -0
  962. package/connectors/connect-stripe/.npmrc.example +2 -0
  963. package/connectors/connect-stripe/AGENTS.md +204 -0
  964. package/connectors/connect-stripe/CLAUDE.md +204 -0
  965. package/connectors/connect-stripe/GEMINI.md +204 -0
  966. package/connectors/connect-stripe/README.md +181 -0
  967. package/connectors/connect-stripe/package.json +55 -0
  968. package/connectors/connect-stripe/src/api/balance.ts +28 -0
  969. package/connectors/connect-stripe/src/api/billing-portal.ts +64 -0
  970. package/connectors/connect-stripe/src/api/charges.ts +65 -0
  971. package/connectors/connect-stripe/src/api/checkout-sessions.ts +55 -0
  972. package/connectors/connect-stripe/src/api/client.ts +190 -0
  973. package/connectors/connect-stripe/src/api/coupons.ts +52 -0
  974. package/connectors/connect-stripe/src/api/customers.ts +65 -0
  975. package/connectors/connect-stripe/src/api/events.ts +28 -0
  976. package/connectors/connect-stripe/src/api/index.ts +118 -0
  977. package/connectors/connect-stripe/src/api/invoice-items.ts +52 -0
  978. package/connectors/connect-stripe/src/api/invoices.ts +102 -0
  979. package/connectors/connect-stripe/src/api/payment-intents.ts +81 -0
  980. package/connectors/connect-stripe/src/api/payment-links.ts +57 -0
  981. package/connectors/connect-stripe/src/api/payment-methods.ts +59 -0
  982. package/connectors/connect-stripe/src/api/prices.ts +57 -0
  983. package/connectors/connect-stripe/src/api/products.ts +65 -0
  984. package/connectors/connect-stripe/src/api/promotion-codes.ts +44 -0
  985. package/connectors/connect-stripe/src/api/subscription-items.ts +53 -0
  986. package/connectors/connect-stripe/src/api/subscriptions.ts +73 -0
  987. package/connectors/connect-stripe/src/api/webhooks.ts +52 -0
  988. package/connectors/connect-stripe/src/cli/index.ts +1995 -0
  989. package/connectors/connect-stripe/src/index.ts +44 -0
  990. package/connectors/connect-stripe/src/types/index.ts +2147 -0
  991. package/connectors/connect-stripe/src/utils/config.ts +220 -0
  992. package/connectors/connect-stripe/src/utils/output.ts +119 -0
  993. package/connectors/connect-stripe/tsconfig.json +16 -0
  994. package/connectors/connect-stripeatlas/.env.example +11 -0
  995. package/connectors/connect-stripeatlas/.npmrc.example +2 -0
  996. package/connectors/connect-stripeatlas/AGENTS.md +102 -0
  997. package/connectors/connect-stripeatlas/CLAUDE.md +102 -0
  998. package/connectors/connect-stripeatlas/GEMINI.md +102 -0
  999. package/connectors/connect-stripeatlas/README.md +95 -0
  1000. package/connectors/connect-stripeatlas/package.json +57 -0
  1001. package/connectors/connect-stripeatlas/src/api/client.ts +77 -0
  1002. package/connectors/connect-stripeatlas/src/api/example.ts +60 -0
  1003. package/connectors/connect-stripeatlas/src/api/index.ts +65 -0
  1004. package/connectors/connect-stripeatlas/src/cli/index.ts +270 -0
  1005. package/connectors/connect-stripeatlas/src/index.ts +29 -0
  1006. package/connectors/connect-stripeatlas/src/types/index.ts +93 -0
  1007. package/connectors/connect-stripeatlas/src/utils/config.ts +228 -0
  1008. package/connectors/connect-stripeatlas/src/utils/output.ts +119 -0
  1009. package/connectors/connect-stripeatlas/tsconfig.json +16 -0
  1010. package/connectors/connect-substack/.env.example +4 -0
  1011. package/connectors/connect-substack/.npmrc.example +2 -0
  1012. package/connectors/connect-substack/AGENTS.md +168 -0
  1013. package/connectors/connect-substack/CLAUDE.md +168 -0
  1014. package/connectors/connect-substack/GEMINI.md +168 -0
  1015. package/connectors/connect-substack/README.md +146 -0
  1016. package/connectors/connect-substack/package.json +51 -0
  1017. package/connectors/connect-substack/src/api/client.ts +147 -0
  1018. package/connectors/connect-substack/src/api/comments.ts +68 -0
  1019. package/connectors/connect-substack/src/api/index.ts +77 -0
  1020. package/connectors/connect-substack/src/api/posts.ts +135 -0
  1021. package/connectors/connect-substack/src/api/publication.ts +126 -0
  1022. package/connectors/connect-substack/src/api/stats.ts +113 -0
  1023. package/connectors/connect-substack/src/api/subscribers.ts +97 -0
  1024. package/connectors/connect-substack/src/cli/index.ts +531 -0
  1025. package/connectors/connect-substack/src/index.ts +31 -0
  1026. package/connectors/connect-substack/src/types/index.ts +257 -0
  1027. package/connectors/connect-substack/src/utils/config.ts +208 -0
  1028. package/connectors/connect-substack/src/utils/output.ts +143 -0
  1029. package/connectors/connect-substack/tsconfig.json +16 -0
  1030. package/connectors/connect-tiktok/.npmrc.example +2 -0
  1031. package/connectors/connect-tiktok/AGENTS.md +76 -0
  1032. package/connectors/connect-tiktok/CLAUDE.md +76 -0
  1033. package/connectors/connect-tiktok/GEMINI.md +76 -0
  1034. package/connectors/connect-tiktok/README.md +94 -0
  1035. package/connectors/connect-tiktok/package.json +60 -0
  1036. package/connectors/connect-tiktok/src/api/adgroups.ts +144 -0
  1037. package/connectors/connect-tiktok/src/api/ads.ts +160 -0
  1038. package/connectors/connect-tiktok/src/api/advertisers.ts +104 -0
  1039. package/connectors/connect-tiktok/src/api/audiences.ts +246 -0
  1040. package/connectors/connect-tiktok/src/api/business.ts +273 -0
  1041. package/connectors/connect-tiktok/src/api/campaigns.ts +116 -0
  1042. package/connectors/connect-tiktok/src/api/catalogs.ts +326 -0
  1043. package/connectors/connect-tiktok/src/api/client.ts +137 -0
  1044. package/connectors/connect-tiktok/src/api/creatives.ts +293 -0
  1045. package/connectors/connect-tiktok/src/api/events.ts +314 -0
  1046. package/connectors/connect-tiktok/src/api/identity.ts +255 -0
  1047. package/connectors/connect-tiktok/src/api/index.ts +105 -0
  1048. package/connectors/connect-tiktok/src/api/pixels.ts +188 -0
  1049. package/connectors/connect-tiktok/src/api/reports.ts +290 -0
  1050. package/connectors/connect-tiktok/src/api/targeting.ts +326 -0
  1051. package/connectors/connect-tiktok/src/cli/index.ts +1329 -0
  1052. package/connectors/connect-tiktok/src/index.ts +39 -0
  1053. package/connectors/connect-tiktok/src/types/index.ts +1052 -0
  1054. package/connectors/connect-tiktok/src/utils/config.ts +419 -0
  1055. package/connectors/connect-tiktok/src/utils/output.ts +136 -0
  1056. package/connectors/connect-tiktok/tsconfig.json +16 -0
  1057. package/connectors/connect-tinker/.env.example +8 -0
  1058. package/connectors/connect-tinker/.npmrc.example +2 -0
  1059. package/connectors/connect-tinker/AGENTS.md +189 -0
  1060. package/connectors/connect-tinker/CLAUDE.md +189 -0
  1061. package/connectors/connect-tinker/GEMINI.md +189 -0
  1062. package/connectors/connect-tinker/README.md +157 -0
  1063. package/connectors/connect-tinker/package.json +55 -0
  1064. package/connectors/connect-tinker/src/api/client.ts +146 -0
  1065. package/connectors/connect-tinker/src/api/index.ts +100 -0
  1066. package/connectors/connect-tinker/src/api/sampling.ts +163 -0
  1067. package/connectors/connect-tinker/src/api/state.ts +147 -0
  1068. package/connectors/connect-tinker/src/api/training.ts +152 -0
  1069. package/connectors/connect-tinker/src/cli/index.ts +775 -0
  1070. package/connectors/connect-tinker/src/index.ts +28 -0
  1071. package/connectors/connect-tinker/src/types/index.ts +287 -0
  1072. package/connectors/connect-tinker/src/utils/config.ts +230 -0
  1073. package/connectors/connect-tinker/src/utils/output.ts +139 -0
  1074. package/connectors/connect-tinker/tsconfig.json +16 -0
  1075. package/connectors/connect-twilio/.npmrc.example +2 -0
  1076. package/connectors/connect-twilio/AGENTS.md +76 -0
  1077. package/connectors/connect-twilio/CLAUDE.md +76 -0
  1078. package/connectors/connect-twilio/GEMINI.md +76 -0
  1079. package/connectors/connect-twilio/README.md +94 -0
  1080. package/connectors/connect-twilio/package.json +72 -0
  1081. package/connectors/connect-twilio/src/api/accounts.ts +352 -0
  1082. package/connectors/connect-twilio/src/api/calls.ts +120 -0
  1083. package/connectors/connect-twilio/src/api/client.ts +181 -0
  1084. package/connectors/connect-twilio/src/api/conversations.ts +313 -0
  1085. package/connectors/connect-twilio/src/api/index.ts +91 -0
  1086. package/connectors/connect-twilio/src/api/lookup.ts +271 -0
  1087. package/connectors/connect-twilio/src/api/messages.ts +107 -0
  1088. package/connectors/connect-twilio/src/api/numbers.ts +152 -0
  1089. package/connectors/connect-twilio/src/api/verify.ts +213 -0
  1090. package/connectors/connect-twilio/src/api/video.ts +305 -0
  1091. package/connectors/connect-twilio/src/cli/index.ts +1093 -0
  1092. package/connectors/connect-twilio/src/index.ts +34 -0
  1093. package/connectors/connect-twilio/src/types/index.ts +983 -0
  1094. package/connectors/connect-twilio/src/utils/config.ts +424 -0
  1095. package/connectors/connect-twilio/src/utils/output.ts +119 -0
  1096. package/connectors/connect-twilio/tsconfig.json +16 -0
  1097. package/connectors/connect-uspto/.env.example +13 -0
  1098. package/connectors/connect-uspto/.npmrc.example +2 -0
  1099. package/connectors/connect-uspto/AGENTS.md +80 -0
  1100. package/connectors/connect-uspto/CLAUDE.md +80 -0
  1101. package/connectors/connect-uspto/GEMINI.md +80 -0
  1102. package/connectors/connect-uspto/README.md +98 -0
  1103. package/connectors/connect-uspto/package.json +54 -0
  1104. package/connectors/connect-uspto/src/api/browser.ts +335 -0
  1105. package/connectors/connect-uspto/src/api/client.ts +186 -0
  1106. package/connectors/connect-uspto/src/api/index.ts +104 -0
  1107. package/connectors/connect-uspto/src/api/patents.ts +290 -0
  1108. package/connectors/connect-uspto/src/api/ptab.ts +150 -0
  1109. package/connectors/connect-uspto/src/api/trademarks.ts +302 -0
  1110. package/connectors/connect-uspto/src/cli/index.ts +713 -0
  1111. package/connectors/connect-uspto/src/index.ts +26 -0
  1112. package/connectors/connect-uspto/src/types/index.ts +302 -0
  1113. package/connectors/connect-uspto/src/utils/config.ts +235 -0
  1114. package/connectors/connect-uspto/src/utils/output.ts +119 -0
  1115. package/connectors/connect-uspto/tsconfig.json +16 -0
  1116. package/connectors/connect-webflow/.npmrc.example +2 -0
  1117. package/connectors/connect-webflow/AGENTS.md +193 -0
  1118. package/connectors/connect-webflow/CLAUDE.md +193 -0
  1119. package/connectors/connect-webflow/GEMINI.md +193 -0
  1120. package/connectors/connect-webflow/README.md +173 -0
  1121. package/connectors/connect-webflow/package.json +29 -0
  1122. package/connectors/connect-webflow/src/api/assets.ts +89 -0
  1123. package/connectors/connect-webflow/src/api/client.ts +121 -0
  1124. package/connectors/connect-webflow/src/api/collections.ts +46 -0
  1125. package/connectors/connect-webflow/src/api/forms.ts +75 -0
  1126. package/connectors/connect-webflow/src/api/index.ts +93 -0
  1127. package/connectors/connect-webflow/src/api/items.ts +141 -0
  1128. package/connectors/connect-webflow/src/api/orders.ts +89 -0
  1129. package/connectors/connect-webflow/src/api/pages.ts +76 -0
  1130. package/connectors/connect-webflow/src/api/products.ts +160 -0
  1131. package/connectors/connect-webflow/src/api/sites.ts +41 -0
  1132. package/connectors/connect-webflow/src/api/users.ts +81 -0
  1133. package/connectors/connect-webflow/src/cli/index.ts +1048 -0
  1134. package/connectors/connect-webflow/src/index.ts +35 -0
  1135. package/connectors/connect-webflow/src/types/index.ts +488 -0
  1136. package/connectors/connect-webflow/src/utils/config.ts +208 -0
  1137. package/connectors/connect-webflow/src/utils/output.ts +119 -0
  1138. package/connectors/connect-webflow/tsconfig.json +17 -0
  1139. package/connectors/connect-wix/.npmrc.example +2 -0
  1140. package/connectors/connect-wix/AGENTS.md +181 -0
  1141. package/connectors/connect-wix/CLAUDE.md +181 -0
  1142. package/connectors/connect-wix/GEMINI.md +181 -0
  1143. package/connectors/connect-wix/README.md +163 -0
  1144. package/connectors/connect-wix/package.json +29 -0
  1145. package/connectors/connect-wix/src/api/bookings.ts +575 -0
  1146. package/connectors/connect-wix/src/api/client.ts +147 -0
  1147. package/connectors/connect-wix/src/api/contacts.ts +308 -0
  1148. package/connectors/connect-wix/src/api/index.ts +90 -0
  1149. package/connectors/connect-wix/src/api/inventory.ts +195 -0
  1150. package/connectors/connect-wix/src/api/members.ts +172 -0
  1151. package/connectors/connect-wix/src/api/orders.ts +415 -0
  1152. package/connectors/connect-wix/src/api/products.ts +453 -0
  1153. package/connectors/connect-wix/src/api/sites.ts +77 -0
  1154. package/connectors/connect-wix/src/cli/index.ts +1009 -0
  1155. package/connectors/connect-wix/src/index.ts +35 -0
  1156. package/connectors/connect-wix/src/types/index.ts +786 -0
  1157. package/connectors/connect-wix/src/utils/config.ts +219 -0
  1158. package/connectors/connect-wix/src/utils/output.ts +119 -0
  1159. package/connectors/connect-wix/tsconfig.json +17 -0
  1160. package/connectors/connect-x/.env.example +11 -0
  1161. package/connectors/connect-x/.npmrc.example +2 -0
  1162. package/connectors/connect-x/AGENTS.md +84 -0
  1163. package/connectors/connect-x/CLAUDE.md +84 -0
  1164. package/connectors/connect-x/GEMINI.md +84 -0
  1165. package/connectors/connect-x/README.md +102 -0
  1166. package/connectors/connect-x/package.json +59 -0
  1167. package/connectors/connect-x/src/api/client.ts +392 -0
  1168. package/connectors/connect-x/src/api/index.ts +171 -0
  1169. package/connectors/connect-x/src/api/media.ts +323 -0
  1170. package/connectors/connect-x/src/api/oauth.ts +408 -0
  1171. package/connectors/connect-x/src/api/oauth1.ts +351 -0
  1172. package/connectors/connect-x/src/api/tweets.ts +339 -0
  1173. package/connectors/connect-x/src/api/users.ts +259 -0
  1174. package/connectors/connect-x/src/cli/index.ts +1205 -0
  1175. package/connectors/connect-x/src/index.ts +92 -0
  1176. package/connectors/connect-x/src/types/index.ts +230 -0
  1177. package/connectors/connect-x/src/utils/config.ts +496 -0
  1178. package/connectors/connect-x/src/utils/output.ts +119 -0
  1179. package/connectors/connect-x/tsconfig.json +16 -0
  1180. package/connectors/connect-xads/.env.example +11 -0
  1181. package/connectors/connect-xads/.npmrc.example +2 -0
  1182. package/connectors/connect-xads/AGENTS.md +183 -0
  1183. package/connectors/connect-xads/CLAUDE.md +183 -0
  1184. package/connectors/connect-xads/GEMINI.md +183 -0
  1185. package/connectors/connect-xads/README.md +161 -0
  1186. package/connectors/connect-xads/package.json +52 -0
  1187. package/connectors/connect-xads/src/api/accounts.ts +70 -0
  1188. package/connectors/connect-xads/src/api/analytics.ts +165 -0
  1189. package/connectors/connect-xads/src/api/audiences.ts +143 -0
  1190. package/connectors/connect-xads/src/api/campaigns.ts +113 -0
  1191. package/connectors/connect-xads/src/api/client.ts +315 -0
  1192. package/connectors/connect-xads/src/api/index.ts +91 -0
  1193. package/connectors/connect-xads/src/api/line-items.ts +126 -0
  1194. package/connectors/connect-xads/src/api/media.ts +96 -0
  1195. package/connectors/connect-xads/src/api/promoted-tweets.ts +97 -0
  1196. package/connectors/connect-xads/src/api/targeting.ts +165 -0
  1197. package/connectors/connect-xads/src/cli/index.ts +1036 -0
  1198. package/connectors/connect-xads/src/index.ts +41 -0
  1199. package/connectors/connect-xads/src/types/index.ts +474 -0
  1200. package/connectors/connect-xads/src/utils/config.ts +176 -0
  1201. package/connectors/connect-xads/src/utils/output.ts +177 -0
  1202. package/connectors/connect-xads/tsconfig.json +15 -0
  1203. package/connectors/connect-xai/.env.example +4 -0
  1204. package/connectors/connect-xai/.npmrc.example +2 -0
  1205. package/connectors/connect-xai/AGENTS.md +97 -0
  1206. package/connectors/connect-xai/CLAUDE.md +97 -0
  1207. package/connectors/connect-xai/GEMINI.md +97 -0
  1208. package/connectors/connect-xai/README.md +106 -0
  1209. package/connectors/connect-xai/package.json +60 -0
  1210. package/connectors/connect-xai/src/api/chat.ts +114 -0
  1211. package/connectors/connect-xai/src/api/client.ts +122 -0
  1212. package/connectors/connect-xai/src/api/index.ts +58 -0
  1213. package/connectors/connect-xai/src/cli/index.ts +330 -0
  1214. package/connectors/connect-xai/src/index.ts +24 -0
  1215. package/connectors/connect-xai/src/types/index.ts +172 -0
  1216. package/connectors/connect-xai/src/utils/config.ts +208 -0
  1217. package/connectors/connect-xai/src/utils/output.ts +119 -0
  1218. package/connectors/connect-xai/tsconfig.json +16 -0
  1219. package/connectors/connect-youtube/.npmrc.example +2 -0
  1220. package/connectors/connect-youtube/AGENTS.md +76 -0
  1221. package/connectors/connect-youtube/CLAUDE.md +76 -0
  1222. package/connectors/connect-youtube/GEMINI.md +76 -0
  1223. package/connectors/connect-youtube/README.md +94 -0
  1224. package/connectors/connect-youtube/package.json +61 -0
  1225. package/connectors/connect-youtube/src/api/analytics.ts +364 -0
  1226. package/connectors/connect-youtube/src/api/captions.ts +196 -0
  1227. package/connectors/connect-youtube/src/api/categories.ts +107 -0
  1228. package/connectors/connect-youtube/src/api/channels.ts +149 -0
  1229. package/connectors/connect-youtube/src/api/client.ts +278 -0
  1230. package/connectors/connect-youtube/src/api/commentThreads.ts +215 -0
  1231. package/connectors/connect-youtube/src/api/comments.ts +179 -0
  1232. package/connectors/connect-youtube/src/api/index.ts +113 -0
  1233. package/connectors/connect-youtube/src/api/live.ts +480 -0
  1234. package/connectors/connect-youtube/src/api/members.ts +119 -0
  1235. package/connectors/connect-youtube/src/api/playlistItems.ts +184 -0
  1236. package/connectors/connect-youtube/src/api/playlists.ts +174 -0
  1237. package/connectors/connect-youtube/src/api/search.ts +222 -0
  1238. package/connectors/connect-youtube/src/api/subscriptions.ts +164 -0
  1239. package/connectors/connect-youtube/src/api/thumbnails.ts +73 -0
  1240. package/connectors/connect-youtube/src/api/videos.ts +217 -0
  1241. package/connectors/connect-youtube/src/api/watermarks.ts +110 -0
  1242. package/connectors/connect-youtube/src/cli/index.ts +1768 -0
  1243. package/connectors/connect-youtube/src/index.ts +41 -0
  1244. package/connectors/connect-youtube/src/types/index.ts +1207 -0
  1245. package/connectors/connect-youtube/src/utils/auth.ts +236 -0
  1246. package/connectors/connect-youtube/src/utils/config.ts +529 -0
  1247. package/connectors/connect-youtube/src/utils/output.ts +157 -0
  1248. package/connectors/connect-youtube/tsconfig.json +16 -0
  1249. package/connectors/connect-zoom/.npmrc.example +2 -0
  1250. package/connectors/connect-zoom/AGENTS.md +164 -0
  1251. package/connectors/connect-zoom/CLAUDE.md +164 -0
  1252. package/connectors/connect-zoom/GEMINI.md +164 -0
  1253. package/connectors/connect-zoom/README.md +145 -0
  1254. package/connectors/connect-zoom/package.json +51 -0
  1255. package/connectors/connect-zoom/src/api/client.ts +177 -0
  1256. package/connectors/connect-zoom/src/api/index.ts +81 -0
  1257. package/connectors/connect-zoom/src/api/meetings.ts +126 -0
  1258. package/connectors/connect-zoom/src/api/recordings.ts +129 -0
  1259. package/connectors/connect-zoom/src/api/reports.ts +178 -0
  1260. package/connectors/connect-zoom/src/api/users.ts +52 -0
  1261. package/connectors/connect-zoom/src/api/webinars.ts +115 -0
  1262. package/connectors/connect-zoom/src/cli/index.ts +735 -0
  1263. package/connectors/connect-zoom/src/index.ts +26 -0
  1264. package/connectors/connect-zoom/src/types/index.ts +311 -0
  1265. package/connectors/connect-zoom/src/utils/config.ts +241 -0
  1266. package/connectors/connect-zoom/src/utils/output.ts +119 -0
  1267. package/connectors/connect-zoom/tsconfig.json +16 -0
  1268. package/dist/index.js +580 -0
  1269. package/package.json +68 -0
@@ -0,0 +1,2143 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import open from 'open';
5
+ import { Gmail } from '../api';
6
+ import {
7
+ getClientId,
8
+ getClientSecret,
9
+ setCredentials,
10
+ clearConfig,
11
+ isAuthenticated,
12
+ loadTokens,
13
+ saveTokens,
14
+ getUserEmail,
15
+ setUserEmail,
16
+ getUserName,
17
+ setUserName,
18
+ getConfigDir,
19
+ getBaseConfigDir,
20
+ setProfileOverride,
21
+ getCurrentProfile,
22
+ setCurrentProfile,
23
+ listProfiles,
24
+ createProfile,
25
+ deleteProfile,
26
+ profileExists,
27
+ } from '../utils/config';
28
+ import {
29
+ getAuthUrl,
30
+ startCallbackServer,
31
+ } from '../utils/auth';
32
+ import {
33
+ saveContact,
34
+ getContact,
35
+ getAllContacts,
36
+ deleteContact,
37
+ searchContacts,
38
+ type Contact,
39
+ } from '../utils/contacts';
40
+ import {
41
+ loadSettings,
42
+ saveSettings,
43
+ setSetting,
44
+ setSignature,
45
+ type Settings,
46
+ } from '../utils/settings';
47
+ import type { OutputFormat } from '../utils/output';
48
+ import { success, error, info, print, warn } from '../utils/output';
49
+
50
+ const program = new Command();
51
+
52
+ program
53
+ .name('connect-gmail')
54
+ .description('Gmail API connector CLI - Send, read, and manage Gmail with ease')
55
+ .version('0.1.0')
56
+ .option('-f, --format <format>', 'Output format (json, table, pretty)', 'pretty')
57
+ .option('-p, --profile <profile>', 'Use a specific profile')
58
+ .hook('preAction', (thisCommand) => {
59
+ // Set profile override before any command runs
60
+ const opts = thisCommand.opts();
61
+ if (opts.profile) {
62
+ if (!profileExists(opts.profile)) {
63
+ error(`Profile "${opts.profile}" does not exist. Create it with "connect-gmail profiles create ${opts.profile}"`);
64
+ process.exit(1);
65
+ }
66
+ setProfileOverride(opts.profile);
67
+ }
68
+ });
69
+
70
+ // Helper to get output format
71
+ function getFormat(cmd: Command): OutputFormat {
72
+ const parent = cmd.parent;
73
+ return (parent?.opts().format || 'pretty') as OutputFormat;
74
+ }
75
+
76
+ // Helper to check authentication
77
+ function requireAuth(): Gmail {
78
+ if (!isAuthenticated()) {
79
+ error('Not authenticated. Run "connect-gmail auth login" first.');
80
+ process.exit(1);
81
+ }
82
+ return Gmail.create();
83
+ }
84
+
85
+ // ============================================
86
+ // Auth Commands
87
+ // ============================================
88
+ const authCmd = program
89
+ .command('auth')
90
+ .description('Authentication commands');
91
+
92
+ authCmd
93
+ .command('login')
94
+ .description('Login to Gmail via OAuth2 (opens browser) - auto-creates profile from email')
95
+ .action(async () => {
96
+ const clientId = getClientId();
97
+ const clientSecret = getClientSecret();
98
+
99
+ if (!clientId || !clientSecret) {
100
+ error('OAuth credentials not configured.');
101
+ info('Run "connect-gmail config set-credentials <client-id> <client-secret>" first.');
102
+ info('Or set GMAIL_CLIENT_ID and GMAIL_CLIENT_SECRET environment variables.');
103
+ process.exit(1);
104
+ }
105
+
106
+ info('Starting OAuth2 authentication flow...');
107
+ info('A browser window will open for you to authorize the application.');
108
+
109
+ // Start callback server first
110
+ const serverPromise = startCallbackServer();
111
+
112
+ // Open browser to auth URL
113
+ const authUrl = getAuthUrl();
114
+ await open(authUrl);
115
+
116
+ info('Waiting for authentication...');
117
+
118
+ const result = await serverPromise;
119
+
120
+ if (result.success) {
121
+ success('Successfully authenticated!');
122
+
123
+ // Get user profile and create/switch to profile named after email
124
+ try {
125
+ // Temporarily switch to default profile to avoid overwriting other profiles
126
+ setProfileOverride('default');
127
+
128
+ // Save tokens to default profile first so Gmail.create() can use them
129
+ if (result.tokens) {
130
+ saveTokens(result.tokens);
131
+ }
132
+
133
+ const gmail = Gmail.create();
134
+ const profile = await gmail.profile.get();
135
+ const email = profile.emailAddress;
136
+
137
+ // Convert email to profile slug: user@example.com → andreihasnacom
138
+ const profileSlug = email.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
139
+
140
+ // Create profile if it doesn't exist
141
+ if (!profileExists(profileSlug)) {
142
+ createProfile(profileSlug);
143
+ info(`Created profile: ${profileSlug}`);
144
+ }
145
+
146
+ // Switch to the profile and save credentials there
147
+ setCurrentProfile(profileSlug);
148
+ setProfileOverride(profileSlug);
149
+
150
+ // Save tokens and email to the new profile
151
+ setUserEmail(email);
152
+
153
+ // Re-save tokens to the correct profile
154
+ if (result.tokens) {
155
+ saveTokens(result.tokens);
156
+ }
157
+
158
+ success(`Profile: ${profileSlug}`);
159
+ info(`Email: ${email}`);
160
+ } catch (err) {
161
+ // Profile fetch failed but auth succeeded
162
+ warn(`Could not auto-create profile: ${err}`);
163
+ }
164
+ } else {
165
+ error(`Authentication failed: ${result.error}`);
166
+ process.exit(1);
167
+ }
168
+ });
169
+
170
+ authCmd
171
+ .command('status')
172
+ .description('Check authentication status')
173
+ .action(async () => {
174
+ if (isAuthenticated()) {
175
+ const tokens = loadTokens();
176
+ const email = getUserEmail();
177
+ success('Authenticated');
178
+ if (email) {
179
+ info(`Email: ${email}`);
180
+ }
181
+ if (tokens) {
182
+ const expiresIn = Math.max(0, Math.floor((tokens.expiresAt - Date.now()) / 1000 / 60));
183
+ info(`Access token expires in: ${expiresIn} minutes`);
184
+ info(`Has refresh token: ${tokens.refreshToken ? 'Yes' : 'No'}`);
185
+ }
186
+ } else {
187
+ warn('Not authenticated');
188
+ info('Run "connect-gmail auth login" to authenticate.');
189
+ }
190
+ });
191
+
192
+ authCmd
193
+ .command('logout')
194
+ .description('Clear stored authentication tokens')
195
+ .action(() => {
196
+ clearConfig();
197
+ success('Logged out successfully');
198
+ });
199
+
200
+ // ============================================
201
+ // Config Commands
202
+ // ============================================
203
+ const configCmd = program
204
+ .command('config')
205
+ .description('Manage CLI configuration');
206
+
207
+ configCmd
208
+ .command('set-credentials <clientId> <clientSecret>')
209
+ .description('Set OAuth2 client credentials')
210
+ .action((clientId: string, clientSecret: string) => {
211
+ setCredentials(clientId, clientSecret);
212
+ success('OAuth credentials saved successfully');
213
+ info(`Config stored in: ${getConfigDir()}`);
214
+ });
215
+
216
+ configCmd
217
+ .command('set-name <name>')
218
+ .description('Set your display name for sending emails (e.g., "John Doe")')
219
+ .action((name: string) => {
220
+ setUserName(name);
221
+ success(`Display name set to: ${name}`);
222
+ });
223
+
224
+ configCmd
225
+ .command('show')
226
+ .description('Show current configuration')
227
+ .action(() => {
228
+ const clientId = getClientId();
229
+ const clientSecret = getClientSecret();
230
+ const email = getUserEmail();
231
+ const name = getUserName();
232
+ const tokens = loadTokens();
233
+ const settings = loadSettings();
234
+
235
+ info(`Config directory: ${getConfigDir()}`);
236
+ info(`Client ID: ${clientId ? `${clientId.substring(0, 20)}...` : chalk.gray('not set')}`);
237
+ info(`Client Secret: ${clientSecret ? '********' : chalk.gray('not set')}`);
238
+ info(`Authenticated: ${isAuthenticated() ? chalk.green('Yes') : chalk.red('No')}`);
239
+ if (email) {
240
+ info(`Email: ${email}`);
241
+ }
242
+ if (name) {
243
+ info(`Display Name: ${name}`);
244
+ }
245
+ if (tokens) {
246
+ info(`Token expires: ${new Date(tokens.expiresAt).toLocaleString()}`);
247
+ }
248
+ info(`Markdown enabled: ${settings.markdownEnabled ? 'Yes' : 'No'}`);
249
+ info(`Append signature: ${settings.appendSignature ? 'Yes' : 'No'}`);
250
+ });
251
+
252
+ configCmd
253
+ .command('clear')
254
+ .description('Clear all configuration and tokens')
255
+ .action(() => {
256
+ clearConfig();
257
+ success('Configuration cleared');
258
+ });
259
+
260
+ // ============================================
261
+ // Me Command (Gmail profile info)
262
+ // ============================================
263
+ program
264
+ .command('me')
265
+ .description('Get your Gmail profile information')
266
+ .action(async () => {
267
+ try {
268
+ const gmail = requireAuth();
269
+ const profile = await gmail.profile.get();
270
+ print(profile, getFormat(program));
271
+ } catch (err) {
272
+ error(String(err));
273
+ process.exit(1);
274
+ }
275
+ });
276
+
277
+ // ============================================
278
+ // Profiles Management Commands
279
+ // ============================================
280
+ const profilesCmd = program
281
+ .command('profiles')
282
+ .description('Manage multiple Gmail profiles');
283
+
284
+ profilesCmd
285
+ .command('list')
286
+ .description('List all profiles')
287
+ .action(() => {
288
+ try {
289
+ const profiles = listProfiles();
290
+ const current = getCurrentProfile();
291
+
292
+ if (profiles.length === 0) {
293
+ info('No profiles found');
294
+ return;
295
+ }
296
+
297
+ success(`${profiles.length} profile(s):`);
298
+ for (const p of profiles) {
299
+ if (p === current) {
300
+ info(` ${chalk.green('→')} ${p} ${chalk.gray('(current)')}`);
301
+ } else {
302
+ info(` ${p}`);
303
+ }
304
+ }
305
+ } catch (err) {
306
+ error(String(err));
307
+ process.exit(1);
308
+ }
309
+ });
310
+
311
+ profilesCmd
312
+ .command('current')
313
+ .description('Show current profile')
314
+ .action(() => {
315
+ const current = getCurrentProfile();
316
+ info(`Current profile: ${chalk.green(current)}`);
317
+ info(`Config directory: ${getConfigDir()}`);
318
+ });
319
+
320
+ profilesCmd
321
+ .command('create <name>')
322
+ .description('Create a new profile')
323
+ .action((name: string) => {
324
+ try {
325
+ createProfile(name);
326
+ success(`Profile "${name}" created`);
327
+ info(`Switch to it with: connect-gmail profiles switch ${name}`);
328
+ } catch (err) {
329
+ error(String(err));
330
+ process.exit(1);
331
+ }
332
+ });
333
+
334
+ profilesCmd
335
+ .command('switch <name>')
336
+ .alias('use')
337
+ .description('Switch to a different profile')
338
+ .action((name: string) => {
339
+ try {
340
+ setCurrentProfile(name);
341
+ success(`Switched to profile "${name}"`);
342
+ info(`Config directory: ${getConfigDir()}`);
343
+
344
+ // Show auth status for the new profile
345
+ if (isAuthenticated()) {
346
+ const email = getUserEmail();
347
+ if (email) {
348
+ info(`Logged in as: ${email}`);
349
+ }
350
+ } else {
351
+ warn('Profile not authenticated. Run "connect-gmail auth login"');
352
+ }
353
+ } catch (err) {
354
+ error(String(err));
355
+ process.exit(1);
356
+ }
357
+ });
358
+
359
+ profilesCmd
360
+ .command('delete <name>')
361
+ .description('Delete a profile')
362
+ .action((name: string) => {
363
+ try {
364
+ deleteProfile(name);
365
+ success(`Profile "${name}" deleted`);
366
+ } catch (err) {
367
+ error(String(err));
368
+ process.exit(1);
369
+ }
370
+ });
371
+
372
+ profilesCmd
373
+ .command('show')
374
+ .description('Show all profiles with their status')
375
+ .action(async () => {
376
+ try {
377
+ const profiles = listProfiles();
378
+ const current = getCurrentProfile();
379
+
380
+ if (profiles.length === 0) {
381
+ info('No profiles found');
382
+ return;
383
+ }
384
+
385
+ success(`${profiles.length} profile(s):\n`);
386
+
387
+ for (const p of profiles) {
388
+ // Temporarily switch to profile to check status
389
+ setProfileOverride(p);
390
+ const authenticated = isAuthenticated();
391
+ const email = authenticated ? getUserEmail() : null;
392
+ setProfileOverride(undefined);
393
+
394
+ const isCurrent = p === current;
395
+ const marker = isCurrent ? chalk.green('→') : ' ';
396
+ const status = authenticated ? chalk.green('authenticated') : chalk.yellow('not authenticated');
397
+ const emailStr = email ? chalk.gray(`(${email})`) : '';
398
+ const currentStr = isCurrent ? chalk.gray(' [current]') : '';
399
+
400
+ info(` ${marker} ${p}${currentStr}`);
401
+ info(` Status: ${status} ${emailStr}`);
402
+ }
403
+ } catch (err) {
404
+ error(String(err));
405
+ process.exit(1);
406
+ }
407
+ });
408
+
409
+ // ============================================
410
+ // Messages Commands
411
+ // ============================================
412
+ const messagesCmd = program
413
+ .command('messages')
414
+ .description('Email message commands');
415
+
416
+ messagesCmd
417
+ .command('list')
418
+ .description('List messages in your mailbox')
419
+ .option('-n, --max <number>', 'Maximum messages to return', '10')
420
+ .option('-q, --query <query>', 'Gmail search query (e.g., "is:unread", "from:someone@example.com")')
421
+ .option('-l, --label <label>', 'Filter by label ID')
422
+ .action(async (opts) => {
423
+ try {
424
+ const gmail = requireAuth();
425
+ const result = await gmail.messages.list({
426
+ maxResults: parseInt(opts.max),
427
+ q: opts.query,
428
+ labelIds: opts.label ? [opts.label] : undefined,
429
+ });
430
+
431
+ if (!result.messages || result.messages.length === 0) {
432
+ info('No messages found');
433
+ return;
434
+ }
435
+
436
+ success(`Found ${result.messages.length} messages:`);
437
+
438
+ // Fetch details for each message
439
+ const messages = await Promise.all(
440
+ result.messages.slice(0, 10).map(async (m) => {
441
+ const msg = await gmail.messages.get(m.id, 'metadata');
442
+ const headers = msg.payload?.headers || [];
443
+ const getHeader = (name: string) =>
444
+ headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
445
+
446
+ return {
447
+ id: m.id,
448
+ from: getHeader('From'),
449
+ subject: getHeader('Subject'),
450
+ date: getHeader('Date'),
451
+ snippet: msg.snippet?.substring(0, 50) + '...',
452
+ };
453
+ })
454
+ );
455
+
456
+ print(messages, getFormat(messagesCmd));
457
+ } catch (err) {
458
+ error(String(err));
459
+ process.exit(1);
460
+ }
461
+ });
462
+
463
+ messagesCmd
464
+ .command('read <messageId>')
465
+ .description('Read a specific message')
466
+ .option('--body', 'Include full message body')
467
+ .option('--html', 'Show HTML body instead of plain text')
468
+ .option('--structure', 'Show message MIME structure (for debugging)')
469
+ .action(async (messageId: string, opts) => {
470
+ try {
471
+ const gmail = requireAuth();
472
+ const message = await gmail.messages.get(messageId);
473
+
474
+ const headers = message.payload?.headers || [];
475
+ const getHeader = (name: string) =>
476
+ headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
477
+
478
+ // Extract body from message parts
479
+ let body = '';
480
+ if (opts.body && message.payload) {
481
+ const targetType = opts.html ? 'text/html' : 'text/plain';
482
+
483
+ // Helper to check MIME type (handles charset params like "text/html; charset=utf-8")
484
+ const mimeMatches = (mimeType: string | undefined, target: string): boolean => {
485
+ if (!mimeType) return false;
486
+ const baseMime = mimeType.split(';')[0].trim().toLowerCase();
487
+ return baseMime === target.toLowerCase();
488
+ };
489
+
490
+ // Collect all text parts from the message structure
491
+ const collectTextParts = (part: typeof message.payload, results: Array<{mimeType: string, data: string}> = []): Array<{mimeType: string, data: string}> => {
492
+ if (part.body?.data && part.mimeType) {
493
+ const baseMime = part.mimeType.split(';')[0].trim().toLowerCase();
494
+ if (baseMime.startsWith('text/')) {
495
+ results.push({
496
+ mimeType: baseMime,
497
+ data: Buffer.from(part.body.data, 'base64url').toString('utf-8')
498
+ });
499
+ }
500
+ }
501
+ if (part.parts) {
502
+ for (const p of part.parts) {
503
+ collectTextParts(p, results);
504
+ }
505
+ }
506
+ return results;
507
+ };
508
+
509
+ const textParts = collectTextParts(message.payload);
510
+
511
+ // First, try to find exact target type
512
+ const exactMatch = textParts.find(p => p.mimeType === targetType);
513
+ if (exactMatch) {
514
+ body = exactMatch.data;
515
+ } else {
516
+ // Fallback: if looking for text/plain but only text/html exists, use that
517
+ // Or if looking for text/html but only text/plain exists, use that
518
+ const altMatch = textParts.find(p => p.mimeType.startsWith('text/'));
519
+ if (altMatch) {
520
+ body = altMatch.data;
521
+ }
522
+ }
523
+ }
524
+
525
+ const output: Record<string, unknown> = {
526
+ id: message.id,
527
+ threadId: message.threadId,
528
+ from: getHeader('From'),
529
+ to: getHeader('To'),
530
+ subject: getHeader('Subject'),
531
+ date: getHeader('Date'),
532
+ labels: message.labelIds,
533
+ };
534
+
535
+ if (opts.structure) {
536
+ output.structure = gmail.messages.getMessageStructure(message);
537
+ }
538
+
539
+ if (opts.body) {
540
+ output.body = body;
541
+ } else if (!opts.structure) {
542
+ output.snippet = message.snippet;
543
+ }
544
+
545
+ print(output, getFormat(messagesCmd));
546
+ } catch (err) {
547
+ error(String(err));
548
+ process.exit(1);
549
+ }
550
+ });
551
+
552
+ messagesCmd
553
+ .command('send')
554
+ .description('Send an email')
555
+ .requiredOption('-t, --to <email>', 'Recipient email address')
556
+ .requiredOption('-s, --subject <subject>', 'Email subject')
557
+ .requiredOption('-b, --body <body>', 'Email body')
558
+ .option('--cc <emails>', 'CC recipients (comma-separated)')
559
+ .option('--bcc <emails>', 'BCC recipients (comma-separated)')
560
+ .option('--html', 'Send as HTML email')
561
+ .action(async (opts) => {
562
+ try {
563
+ const gmail = requireAuth();
564
+ const result = await gmail.messages.send({
565
+ to: opts.to,
566
+ subject: opts.subject,
567
+ body: opts.body,
568
+ cc: opts.cc?.split(',').map((e: string) => e.trim()),
569
+ bcc: opts.bcc?.split(',').map((e: string) => e.trim()),
570
+ isHtml: opts.html,
571
+ });
572
+
573
+ success(`Email sent successfully!`);
574
+ info(`Message ID: ${result.id}`);
575
+ } catch (err) {
576
+ error(String(err));
577
+ process.exit(1);
578
+ }
579
+ });
580
+
581
+ messagesCmd
582
+ .command('trash <messageId>')
583
+ .description('Move a message to trash')
584
+ .action(async (messageId: string) => {
585
+ try {
586
+ const gmail = requireAuth();
587
+ await gmail.messages.trash(messageId);
588
+ success(`Message ${messageId} moved to trash`);
589
+ } catch (err) {
590
+ error(String(err));
591
+ process.exit(1);
592
+ }
593
+ });
594
+
595
+ messagesCmd
596
+ .command('delete <messageId>')
597
+ .description('Permanently delete a message')
598
+ .action(async (messageId: string) => {
599
+ try {
600
+ const gmail = requireAuth();
601
+ await gmail.messages.delete(messageId);
602
+ success(`Message ${messageId} permanently deleted`);
603
+ } catch (err) {
604
+ error(String(err));
605
+ process.exit(1);
606
+ }
607
+ });
608
+
609
+ messagesCmd
610
+ .command('mark-read <messageId>')
611
+ .description('Mark a message as read')
612
+ .action(async (messageId: string) => {
613
+ try {
614
+ const gmail = requireAuth();
615
+ await gmail.messages.markAsRead(messageId);
616
+ success(`Message ${messageId} marked as read`);
617
+ } catch (err) {
618
+ error(String(err));
619
+ process.exit(1);
620
+ }
621
+ });
622
+
623
+ messagesCmd
624
+ .command('mark-unread <messageId>')
625
+ .description('Mark a message as unread')
626
+ .action(async (messageId: string) => {
627
+ try {
628
+ const gmail = requireAuth();
629
+ await gmail.messages.markAsUnread(messageId);
630
+ success(`Message ${messageId} marked as unread`);
631
+ } catch (err) {
632
+ error(String(err));
633
+ process.exit(1);
634
+ }
635
+ });
636
+
637
+ messagesCmd
638
+ .command('star <messageId>')
639
+ .description('Star a message')
640
+ .action(async (messageId: string) => {
641
+ try {
642
+ const gmail = requireAuth();
643
+ await gmail.messages.star(messageId);
644
+ success(`Message ${messageId} starred`);
645
+ } catch (err) {
646
+ error(String(err));
647
+ process.exit(1);
648
+ }
649
+ });
650
+
651
+ messagesCmd
652
+ .command('archive <messageId>')
653
+ .description('Archive a message')
654
+ .action(async (messageId: string) => {
655
+ try {
656
+ const gmail = requireAuth();
657
+ await gmail.messages.archive(messageId);
658
+ success(`Message ${messageId} archived`);
659
+ } catch (err) {
660
+ error(String(err));
661
+ process.exit(1);
662
+ }
663
+ });
664
+
665
+ messagesCmd
666
+ .command('reply <messageId>')
667
+ .description('Reply to a message (stays in the same thread)')
668
+ .requiredOption('-b, --body <body>', 'Reply body (supports markdown)')
669
+ .option('--cc <emails>', 'CC recipients (comma-separated)')
670
+ .option('--html', 'Send as HTML email')
671
+ .action(async (messageId: string, opts) => {
672
+ try {
673
+ const gmail = requireAuth();
674
+ const result = await gmail.messages.reply(messageId, {
675
+ body: opts.body,
676
+ cc: opts.cc?.split(',').map((e: string) => e.trim()),
677
+ isHtml: opts.html,
678
+ });
679
+
680
+ success(`Reply sent!`);
681
+ info(`Message ID: ${result.id}`);
682
+ info(`Thread ID: ${result.threadId}`);
683
+ } catch (err) {
684
+ error(String(err));
685
+ process.exit(1);
686
+ }
687
+ });
688
+
689
+ messagesCmd
690
+ .command('add-label <messageId> <labelId>')
691
+ .description('Add a label to a message')
692
+ .action(async (messageId: string, labelId: string) => {
693
+ try {
694
+ const gmail = requireAuth();
695
+ await gmail.messages.addLabel(messageId, labelId);
696
+ success(`Label ${labelId} added to message ${messageId}`);
697
+ } catch (err) {
698
+ error(String(err));
699
+ process.exit(1);
700
+ }
701
+ });
702
+
703
+ messagesCmd
704
+ .command('remove-label <messageId> <labelId>')
705
+ .description('Remove a label from a message')
706
+ .action(async (messageId: string, labelId: string) => {
707
+ try {
708
+ const gmail = requireAuth();
709
+ await gmail.messages.removeLabel(messageId, labelId);
710
+ success(`Label ${labelId} removed from message ${messageId}`);
711
+ } catch (err) {
712
+ error(String(err));
713
+ process.exit(1);
714
+ }
715
+ });
716
+
717
+ // ============================================
718
+ // Labels Commands
719
+ // ============================================
720
+ const labelsCmd = program
721
+ .command('labels')
722
+ .description('Label management commands');
723
+
724
+ labelsCmd
725
+ .command('list')
726
+ .description('List all labels')
727
+ .action(async () => {
728
+ try {
729
+ const gmail = requireAuth();
730
+ const result = await gmail.labels.list();
731
+
732
+ if (!result.labels || result.labels.length === 0) {
733
+ info('No labels found');
734
+ return;
735
+ }
736
+
737
+ success(`Found ${result.labels.length} labels:`);
738
+
739
+ const labels = result.labels.map(l => ({
740
+ id: l.id,
741
+ name: l.name,
742
+ type: l.type,
743
+ messagesTotal: l.messagesTotal,
744
+ messagesUnread: l.messagesUnread,
745
+ }));
746
+
747
+ print(labels, getFormat(labelsCmd));
748
+ } catch (err) {
749
+ error(String(err));
750
+ process.exit(1);
751
+ }
752
+ });
753
+
754
+ labelsCmd
755
+ .command('create <name>')
756
+ .description('Create a new label')
757
+ .action(async (name: string) => {
758
+ try {
759
+ const gmail = requireAuth();
760
+ const label = await gmail.labels.create({ name });
761
+ success(`Label "${name}" created`);
762
+ info(`Label ID: ${label.id}`);
763
+ } catch (err) {
764
+ error(String(err));
765
+ process.exit(1);
766
+ }
767
+ });
768
+
769
+ labelsCmd
770
+ .command('delete <labelId>')
771
+ .description('Delete a label')
772
+ .action(async (labelId: string) => {
773
+ try {
774
+ const gmail = requireAuth();
775
+ await gmail.labels.delete(labelId);
776
+ success(`Label ${labelId} deleted`);
777
+ } catch (err) {
778
+ error(String(err));
779
+ process.exit(1);
780
+ }
781
+ });
782
+
783
+ // ============================================
784
+ // Threads Commands
785
+ // ============================================
786
+ const threadsCmd = program
787
+ .command('threads')
788
+ .description('Email thread commands');
789
+
790
+ threadsCmd
791
+ .command('list')
792
+ .description('List threads in your mailbox')
793
+ .option('-n, --max <number>', 'Maximum threads to return', '10')
794
+ .option('-q, --query <query>', 'Gmail search query')
795
+ .action(async (opts) => {
796
+ try {
797
+ const gmail = requireAuth();
798
+ const result = await gmail.threads.list({
799
+ maxResults: parseInt(opts.max),
800
+ q: opts.query,
801
+ });
802
+
803
+ if (!result.threads || result.threads.length === 0) {
804
+ info('No threads found');
805
+ return;
806
+ }
807
+
808
+ success(`Found ${result.threads.length} threads:`);
809
+ print(result.threads, getFormat(threadsCmd));
810
+ } catch (err) {
811
+ error(String(err));
812
+ process.exit(1);
813
+ }
814
+ });
815
+
816
+ threadsCmd
817
+ .command('read <threadId>')
818
+ .description('Read a specific thread')
819
+ .action(async (threadId: string) => {
820
+ try {
821
+ const gmail = requireAuth();
822
+ const thread = await gmail.threads.get(threadId);
823
+
824
+ const output = {
825
+ id: thread.id,
826
+ messagesCount: thread.messages?.length || 0,
827
+ messages: thread.messages?.map(m => {
828
+ const headers = m.payload?.headers || [];
829
+ const getHeader = (name: string) =>
830
+ headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
831
+
832
+ return {
833
+ id: m.id,
834
+ from: getHeader('From'),
835
+ subject: getHeader('Subject'),
836
+ date: getHeader('Date'),
837
+ snippet: m.snippet?.substring(0, 50) + '...',
838
+ };
839
+ }),
840
+ };
841
+
842
+ print(output, getFormat(threadsCmd));
843
+ } catch (err) {
844
+ error(String(err));
845
+ process.exit(1);
846
+ }
847
+ });
848
+
849
+ // ============================================
850
+ // Drafts Commands
851
+ // ============================================
852
+ const draftsCmd = program
853
+ .command('drafts')
854
+ .description('Draft management commands');
855
+
856
+ draftsCmd
857
+ .command('list')
858
+ .description('List drafts')
859
+ .option('-n, --max <number>', 'Maximum drafts to return', '10')
860
+ .action(async (opts) => {
861
+ try {
862
+ const gmail = requireAuth();
863
+ const result = await gmail.drafts.list(parseInt(opts.max));
864
+
865
+ if (!result.drafts || result.drafts.length === 0) {
866
+ info('No drafts found');
867
+ return;
868
+ }
869
+
870
+ success(`Found ${result.drafts.length} drafts:`);
871
+ print(result.drafts, getFormat(draftsCmd));
872
+ } catch (err) {
873
+ error(String(err));
874
+ process.exit(1);
875
+ }
876
+ });
877
+
878
+ draftsCmd
879
+ .command('create')
880
+ .description('Create a new draft')
881
+ .requiredOption('-t, --to <email>', 'Recipient email address')
882
+ .requiredOption('-s, --subject <subject>', 'Email subject')
883
+ .requiredOption('-b, --body <body>', 'Email body')
884
+ .option('--cc <emails>', 'CC recipients (comma-separated)')
885
+ .option('--html', 'Send as HTML email')
886
+ .action(async (opts) => {
887
+ try {
888
+ const gmail = requireAuth();
889
+ const draft = await gmail.drafts.create({
890
+ to: opts.to,
891
+ subject: opts.subject,
892
+ body: opts.body,
893
+ cc: opts.cc?.split(',').map((e: string) => e.trim()),
894
+ isHtml: opts.html,
895
+ });
896
+
897
+ success(`Draft created!`);
898
+ info(`Draft ID: ${draft.id}`);
899
+ } catch (err) {
900
+ error(String(err));
901
+ process.exit(1);
902
+ }
903
+ });
904
+
905
+ draftsCmd
906
+ .command('send <draftId>')
907
+ .description('Send a draft')
908
+ .action(async (draftId: string) => {
909
+ try {
910
+ const gmail = requireAuth();
911
+ const result = await gmail.drafts.send(draftId);
912
+ success(`Draft sent!`);
913
+ info(`Message ID: ${result.id}`);
914
+ } catch (err) {
915
+ error(String(err));
916
+ process.exit(1);
917
+ }
918
+ });
919
+
920
+ draftsCmd
921
+ .command('delete <draftId>')
922
+ .description('Delete a draft')
923
+ .action(async (draftId: string) => {
924
+ try {
925
+ const gmail = requireAuth();
926
+ await gmail.drafts.delete(draftId);
927
+ success(`Draft ${draftId} deleted`);
928
+ } catch (err) {
929
+ error(String(err));
930
+ process.exit(1);
931
+ }
932
+ });
933
+
934
+ draftsCmd
935
+ .command('update <draftId>')
936
+ .description('Update an existing draft')
937
+ .requiredOption('-t, --to <email>', 'Recipient email address')
938
+ .requiredOption('-s, --subject <subject>', 'Email subject')
939
+ .requiredOption('-b, --body <body>', 'Email body')
940
+ .option('--cc <emails>', 'CC recipients (comma-separated)')
941
+ .option('--html', 'Send as HTML email')
942
+ .action(async (draftId: string, opts) => {
943
+ try {
944
+ const gmail = requireAuth();
945
+ const draft = await gmail.drafts.update(draftId, {
946
+ to: opts.to,
947
+ subject: opts.subject,
948
+ body: opts.body,
949
+ cc: opts.cc?.split(',').map((e: string) => e.trim()),
950
+ isHtml: opts.html,
951
+ });
952
+
953
+ success(`Draft updated!`);
954
+ info(`Draft ID: ${draft.id}`);
955
+ } catch (err) {
956
+ error(String(err));
957
+ process.exit(1);
958
+ }
959
+ });
960
+
961
+ // ============================================
962
+ // Filters Commands
963
+ // ============================================
964
+ const filtersCmd = program
965
+ .command('filters')
966
+ .description('Email filter management commands');
967
+
968
+ filtersCmd
969
+ .command('list')
970
+ .description('List all email filters')
971
+ .action(async () => {
972
+ try {
973
+ const gmail = requireAuth();
974
+ const result = await gmail.filters.list();
975
+
976
+ if (!result.filter || result.filter.length === 0) {
977
+ info('No filters found');
978
+ return;
979
+ }
980
+
981
+ success(`Found ${result.filter.length} filters:`);
982
+ const output = result.filter.map(f => ({
983
+ id: f.id,
984
+ from: f.criteria?.from || '-',
985
+ to: f.criteria?.to || '-',
986
+ subject: f.criteria?.subject || '-',
987
+ query: f.criteria?.query || '-',
988
+ actions: Object.keys(f.action || {}).join(', '),
989
+ }));
990
+ print(output, getFormat(filtersCmd));
991
+ } catch (err) {
992
+ error(String(err));
993
+ process.exit(1);
994
+ }
995
+ });
996
+
997
+ filtersCmd
998
+ .command('get <filterId>')
999
+ .description('Get details of a specific filter')
1000
+ .action(async (filterId: string) => {
1001
+ try {
1002
+ const gmail = requireAuth();
1003
+ const filter = await gmail.filters.get(filterId);
1004
+ print(filter, getFormat(filtersCmd));
1005
+ } catch (err) {
1006
+ error(String(err));
1007
+ process.exit(1);
1008
+ }
1009
+ });
1010
+
1011
+ filtersCmd
1012
+ .command('create')
1013
+ .description('Create a new filter')
1014
+ .option('--from <email>', 'Match emails from this address')
1015
+ .option('--to <email>', 'Match emails to this address')
1016
+ .option('--subject <text>', 'Match emails with this subject')
1017
+ .option('--query <query>', 'Match emails matching this Gmail search query')
1018
+ .option('--has-attachment', 'Match emails with attachments')
1019
+ .option('--add-label <labelId>', 'Add this label to matching emails')
1020
+ .option('--remove-label <labelId>', 'Remove this label from matching emails')
1021
+ .option('--archive', 'Archive matching emails')
1022
+ .option('--mark-read', 'Mark matching emails as read')
1023
+ .option('--star', 'Star matching emails')
1024
+ .option('--trash', 'Move matching emails to trash')
1025
+ .option('--important', 'Mark matching emails as important')
1026
+ .option('--never-spam', 'Never send matching emails to spam')
1027
+ .action(async (opts) => {
1028
+ try {
1029
+ // Build criteria
1030
+ const criteria: Record<string, unknown> = {};
1031
+ if (opts.from) criteria.from = opts.from;
1032
+ if (opts.to) criteria.to = opts.to;
1033
+ if (opts.subject) criteria.subject = opts.subject;
1034
+ if (opts.query) criteria.query = opts.query;
1035
+ if (opts.hasAttachment) criteria.hasAttachment = true;
1036
+
1037
+ if (Object.keys(criteria).length === 0) {
1038
+ error('At least one filter criteria is required (--from, --to, --subject, --query, or --has-attachment)');
1039
+ process.exit(1);
1040
+ }
1041
+
1042
+ // Build action
1043
+ const action: Record<string, unknown> = {};
1044
+ if (opts.addLabel) action.addLabelIds = [opts.addLabel];
1045
+ if (opts.removeLabel) action.removeLabelIds = [opts.removeLabel];
1046
+ if (opts.archive) action.archive = true;
1047
+ if (opts.markRead) action.markRead = true;
1048
+ if (opts.star) action.star = true;
1049
+ if (opts.trash) action.trash = true;
1050
+ if (opts.important) action.markImportant = true;
1051
+ if (opts.neverSpam) action.neverSpam = true;
1052
+
1053
+ if (Object.keys(action).length === 0) {
1054
+ error('At least one filter action is required (--add-label, --archive, --mark-read, --star, --trash, --important, --never-spam)');
1055
+ process.exit(1);
1056
+ }
1057
+
1058
+ const gmail = requireAuth();
1059
+ const filter = await gmail.filters.create({ criteria, action });
1060
+
1061
+ success(`Filter created!`);
1062
+ info(`Filter ID: ${filter.id}`);
1063
+ } catch (err) {
1064
+ error(String(err));
1065
+ process.exit(1);
1066
+ }
1067
+ });
1068
+
1069
+ filtersCmd
1070
+ .command('delete <filterId>')
1071
+ .description('Delete a filter')
1072
+ .action(async (filterId: string) => {
1073
+ try {
1074
+ const gmail = requireAuth();
1075
+ await gmail.filters.delete(filterId);
1076
+ success(`Filter ${filterId} deleted`);
1077
+ } catch (err) {
1078
+ error(String(err));
1079
+ process.exit(1);
1080
+ }
1081
+ });
1082
+
1083
+ // ============================================
1084
+ // Attachments Commands
1085
+ // ============================================
1086
+ const attachmentsCmd = program
1087
+ .command('attachments')
1088
+ .description('Email attachment commands');
1089
+
1090
+ attachmentsCmd
1091
+ .command('list <messageId>')
1092
+ .description('List attachments in a message')
1093
+ .action(async (messageId: string) => {
1094
+ try {
1095
+ const gmail = requireAuth();
1096
+ const attachments = await gmail.attachments.list(messageId);
1097
+
1098
+ if (attachments.length === 0) {
1099
+ info('No attachments found in this message');
1100
+ return;
1101
+ }
1102
+
1103
+ success(`Found ${attachments.length} attachment(s):`);
1104
+ const output = attachments.map(a => ({
1105
+ filename: a.filename,
1106
+ mimeType: a.mimeType,
1107
+ size: `${Math.round(a.size / 1024)} KB`,
1108
+ attachmentId: a.attachmentId.substring(0, 20) + '...',
1109
+ }));
1110
+ print(output, getFormat(attachmentsCmd));
1111
+ } catch (err) {
1112
+ error(String(err));
1113
+ process.exit(1);
1114
+ }
1115
+ });
1116
+
1117
+ attachmentsCmd
1118
+ .command('download <messageId>')
1119
+ .description('Download all attachments from a message')
1120
+ .option('-a, --attachment-id <id>', 'Download specific attachment by ID')
1121
+ .action(async (messageId: string, opts) => {
1122
+ try {
1123
+ const gmail = requireAuth();
1124
+
1125
+ if (opts.attachmentId) {
1126
+ // Download specific attachment
1127
+ const attachments = await gmail.attachments.list(messageId);
1128
+ const attachment = attachments.find(a => a.attachmentId === opts.attachmentId);
1129
+
1130
+ if (!attachment) {
1131
+ error('Attachment not found');
1132
+ process.exit(1);
1133
+ }
1134
+
1135
+ info(`Downloading ${attachment.filename}...`);
1136
+ const result = await gmail.attachments.download(
1137
+ messageId,
1138
+ attachment.attachmentId,
1139
+ attachment.filename,
1140
+ attachment.mimeType
1141
+ );
1142
+
1143
+ success(`Downloaded: ${result.filename}`);
1144
+ info(`Saved to: ${result.path}`);
1145
+ info(`Size: ${Math.round(result.size / 1024)} KB`);
1146
+ } else {
1147
+ // Download all attachments
1148
+ info('Downloading all attachments...');
1149
+ const results = await gmail.attachments.downloadAll(messageId);
1150
+
1151
+ if (results.length === 0) {
1152
+ info('No attachments found in this message');
1153
+ return;
1154
+ }
1155
+
1156
+ success(`Downloaded ${results.length} attachment(s):`);
1157
+ for (const result of results) {
1158
+ info(` • ${result.filename} (${Math.round(result.size / 1024)} KB)`);
1159
+ }
1160
+ info(`\nSaved to: ${gmail.attachments.getStoragePath(messageId)}`);
1161
+ }
1162
+ } catch (err) {
1163
+ error(String(err));
1164
+ process.exit(1);
1165
+ }
1166
+ });
1167
+
1168
+ attachmentsCmd
1169
+ .command('path <messageId>')
1170
+ .description('Show where attachments are/would be stored')
1171
+ .action(async (messageId: string) => {
1172
+ const gmail = requireAuth();
1173
+ const path = gmail.attachments.getStoragePath(messageId);
1174
+ info(`Attachments path: ${path}`);
1175
+ });
1176
+
1177
+ // ============================================
1178
+ // Search Command (shortcut)
1179
+ // ============================================
1180
+ program
1181
+ .command('search <query>')
1182
+ .description('Search messages (shortcut for "messages list -q")')
1183
+ .option('-n, --max <number>', 'Maximum messages to return', '10')
1184
+ .action(async (query: string, opts) => {
1185
+ try {
1186
+ const gmail = requireAuth();
1187
+ const result = await gmail.messages.list({
1188
+ maxResults: parseInt(opts.max),
1189
+ q: query,
1190
+ });
1191
+
1192
+ if (!result.messages || result.messages.length === 0) {
1193
+ info(`No messages found for query: ${query}`);
1194
+ return;
1195
+ }
1196
+
1197
+ success(`Found ${result.messages.length} messages:`);
1198
+
1199
+ const messages = await Promise.all(
1200
+ result.messages.slice(0, 10).map(async (m) => {
1201
+ const msg = await gmail.messages.get(m.id, 'metadata');
1202
+ const headers = msg.payload?.headers || [];
1203
+ const getHeader = (name: string) =>
1204
+ headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
1205
+
1206
+ return {
1207
+ id: m.id,
1208
+ from: getHeader('From'),
1209
+ subject: getHeader('Subject'),
1210
+ date: getHeader('Date'),
1211
+ };
1212
+ })
1213
+ );
1214
+
1215
+ print(messages, getFormat(program));
1216
+ } catch (err) {
1217
+ error(String(err));
1218
+ process.exit(1);
1219
+ }
1220
+ });
1221
+
1222
+ // ============================================
1223
+ // Contacts Commands
1224
+ // ============================================
1225
+ const contactsCmd = program
1226
+ .command('contacts')
1227
+ .description('Contact management commands');
1228
+
1229
+ contactsCmd
1230
+ .command('list')
1231
+ .description('List all saved contacts')
1232
+ .action(() => {
1233
+ try {
1234
+ const contacts = getAllContacts();
1235
+ if (contacts.length === 0) {
1236
+ info('No contacts saved');
1237
+ return;
1238
+ }
1239
+ success(`Found ${contacts.length} contacts:`);
1240
+ const output = contacts.map(c => ({
1241
+ email: c.email,
1242
+ name: c.name || `${c.firstName || ''} ${c.lastName || ''}`.trim() || '-',
1243
+ company: c.company || '-',
1244
+ }));
1245
+ print(output, getFormat(contactsCmd));
1246
+ } catch (err) {
1247
+ error(String(err));
1248
+ process.exit(1);
1249
+ }
1250
+ });
1251
+
1252
+ contactsCmd
1253
+ .command('add <email>')
1254
+ .description('Add a new contact')
1255
+ .option('-n, --name <name>', 'Full name')
1256
+ .option('-f, --first <firstName>', 'First name')
1257
+ .option('-l, --last <lastName>', 'Last name')
1258
+ .option('-c, --company <company>', 'Company name')
1259
+ .option('--notes <notes>', 'Notes')
1260
+ .action((email: string, opts) => {
1261
+ try {
1262
+ const contact: Partial<Contact> = {
1263
+ email,
1264
+ name: opts.name,
1265
+ firstName: opts.first,
1266
+ lastName: opts.last,
1267
+ company: opts.company,
1268
+ notes: opts.notes,
1269
+ };
1270
+ saveContact(contact as Contact);
1271
+ success(`Contact ${email} saved!`);
1272
+ } catch (err) {
1273
+ error(String(err));
1274
+ process.exit(1);
1275
+ }
1276
+ });
1277
+
1278
+ contactsCmd
1279
+ .command('show <email>')
1280
+ .description('Show a contact\'s details')
1281
+ .action((email: string) => {
1282
+ try {
1283
+ const contact = getContact(email);
1284
+ if (!contact) {
1285
+ warn(`Contact ${email} not found`);
1286
+ return;
1287
+ }
1288
+ print(contact, getFormat(contactsCmd));
1289
+ } catch (err) {
1290
+ error(String(err));
1291
+ process.exit(1);
1292
+ }
1293
+ });
1294
+
1295
+ contactsCmd
1296
+ .command('delete <email>')
1297
+ .description('Delete a contact')
1298
+ .action((email: string) => {
1299
+ try {
1300
+ const deleted = deleteContact(email);
1301
+ if (deleted) {
1302
+ success(`Contact ${email} deleted`);
1303
+ } else {
1304
+ warn(`Contact ${email} not found`);
1305
+ }
1306
+ } catch (err) {
1307
+ error(String(err));
1308
+ process.exit(1);
1309
+ }
1310
+ });
1311
+
1312
+ contactsCmd
1313
+ .command('search <query>')
1314
+ .description('Search contacts by name or email')
1315
+ .action((query: string) => {
1316
+ try {
1317
+ const results = searchContacts(query);
1318
+ if (results.length === 0) {
1319
+ info(`No contacts found matching "${query}"`);
1320
+ return;
1321
+ }
1322
+ success(`Found ${results.length} contacts:`);
1323
+ const output = results.map(c => ({
1324
+ email: c.email,
1325
+ name: c.name || `${c.firstName || ''} ${c.lastName || ''}`.trim() || '-',
1326
+ company: c.company || '-',
1327
+ }));
1328
+ print(output, getFormat(contactsCmd));
1329
+ } catch (err) {
1330
+ error(String(err));
1331
+ process.exit(1);
1332
+ }
1333
+ });
1334
+
1335
+ contactsCmd
1336
+ .command('import <query>')
1337
+ .description('Import contacts from email search results (e.g., "from:@company.com")')
1338
+ .option('-n, --max <number>', 'Maximum emails to search', '50')
1339
+ .action(async (query: string, opts) => {
1340
+ try {
1341
+ const gmail = requireAuth();
1342
+ info(`Searching for emails matching: ${query}`);
1343
+
1344
+ const result = await gmail.messages.list({
1345
+ maxResults: parseInt(opts.max),
1346
+ q: query,
1347
+ });
1348
+
1349
+ if (!result.messages || result.messages.length === 0) {
1350
+ info('No messages found');
1351
+ return;
1352
+ }
1353
+
1354
+ info(`Found ${result.messages.length} messages, extracting contacts...`);
1355
+
1356
+ // Extract unique contacts from messages
1357
+ const contactsMap = new Map<string, { email: string; name?: string }>();
1358
+
1359
+ for (const m of result.messages) {
1360
+ const msg = await gmail.messages.get(m.id, 'metadata');
1361
+ const headers = msg.payload?.headers || [];
1362
+ const fromHeader = headers.find(h => h.name.toLowerCase() === 'from')?.value || '';
1363
+
1364
+ // Parse "Name <email>" or just "email" format
1365
+ const match = fromHeader.match(/^(?:"?([^"<]+)"?\s*)?<?([^>]+@[^>]+)>?$/);
1366
+ if (match) {
1367
+ const name = match[1]?.trim();
1368
+ const email = match[2]?.trim().toLowerCase();
1369
+ if (email && !contactsMap.has(email)) {
1370
+ contactsMap.set(email, { email, name });
1371
+ }
1372
+ }
1373
+ }
1374
+
1375
+ if (contactsMap.size === 0) {
1376
+ info('No contacts found in messages');
1377
+ return;
1378
+ }
1379
+
1380
+ // Save contacts
1381
+ let savedCount = 0;
1382
+ for (const contact of contactsMap.values()) {
1383
+ // Extract domain for company name
1384
+ const domain = contact.email.split('@')[1];
1385
+ const company = domain?.split('.')[0];
1386
+
1387
+ saveContact({
1388
+ email: contact.email,
1389
+ name: contact.name,
1390
+ company: company ? company.charAt(0).toUpperCase() + company.slice(1) : undefined,
1391
+ } as Contact);
1392
+ savedCount++;
1393
+ info(` + ${contact.name || contact.email} <${contact.email}>`);
1394
+ }
1395
+
1396
+ success(`Imported ${savedCount} contacts!`);
1397
+ } catch (err) {
1398
+ error(String(err));
1399
+ process.exit(1);
1400
+ }
1401
+ });
1402
+
1403
+ contactsCmd
1404
+ .command('from-message <messageId>')
1405
+ .description('Save the sender of a specific message as a contact')
1406
+ .action(async (messageId: string) => {
1407
+ try {
1408
+ const gmail = requireAuth();
1409
+ const msg = await gmail.messages.get(messageId, 'metadata');
1410
+ const headers = msg.payload?.headers || [];
1411
+ const fromHeader = headers.find(h => h.name.toLowerCase() === 'from')?.value || '';
1412
+
1413
+ // Parse "Name <email>" or just "email" format
1414
+ const match = fromHeader.match(/^(?:"?([^"<]+)"?\s*)?<?([^>]+@[^>]+)>?$/);
1415
+ if (!match) {
1416
+ error('Could not parse sender from message');
1417
+ process.exit(1);
1418
+ }
1419
+
1420
+ const name = match[1]?.trim();
1421
+ const email = match[2]?.trim().toLowerCase();
1422
+ const domain = email.split('@')[1];
1423
+ const company = domain?.split('.')[0];
1424
+
1425
+ saveContact({
1426
+ email,
1427
+ name,
1428
+ company: company ? company.charAt(0).toUpperCase() + company.slice(1) : undefined,
1429
+ } as Contact);
1430
+
1431
+ success(`Contact saved: ${name || email} <${email}>`);
1432
+ } catch (err) {
1433
+ error(String(err));
1434
+ process.exit(1);
1435
+ }
1436
+ });
1437
+
1438
+ // ============================================
1439
+ // Settings Commands
1440
+ // ============================================
1441
+ const settingsCmd = program
1442
+ .command('settings')
1443
+ .description('Manage CLI settings');
1444
+
1445
+ settingsCmd
1446
+ .command('show')
1447
+ .description('Show current settings')
1448
+ .action(() => {
1449
+ const settings = loadSettings();
1450
+ print(settings, getFormat(settingsCmd));
1451
+ });
1452
+
1453
+ settingsCmd
1454
+ .command('set <key> <value>')
1455
+ .description('Set a setting value (e.g., "markdownEnabled true")')
1456
+ .action((key: string, value: string) => {
1457
+ try {
1458
+ const settings = loadSettings();
1459
+ const validKeys = Object.keys(settings);
1460
+ if (!validKeys.includes(key)) {
1461
+ error(`Invalid setting: ${key}`);
1462
+ info(`Valid settings: ${validKeys.join(', ')}`);
1463
+ process.exit(1);
1464
+ }
1465
+
1466
+ // Parse value based on type
1467
+ let parsedValue: string | boolean;
1468
+ if (value === 'true') parsedValue = true;
1469
+ else if (value === 'false') parsedValue = false;
1470
+ else parsedValue = value;
1471
+
1472
+ setSetting(key as keyof Settings, parsedValue as Settings[keyof Settings]);
1473
+ success(`Setting ${key} = ${parsedValue}`);
1474
+ } catch (err) {
1475
+ error(String(err));
1476
+ process.exit(1);
1477
+ }
1478
+ });
1479
+
1480
+ settingsCmd
1481
+ .command('set-signature <signature>')
1482
+ .description('Set a custom email signature')
1483
+ .action((signature: string) => {
1484
+ setSignature(signature);
1485
+ success('Signature saved');
1486
+ });
1487
+
1488
+ settingsCmd
1489
+ .command('sync-signature')
1490
+ .description('Fetch and save your Gmail signature')
1491
+ .action(async () => {
1492
+ try {
1493
+ const gmail = requireAuth();
1494
+ const signature = await gmail.profile.getSignature();
1495
+ if (signature) {
1496
+ setSignature(signature);
1497
+ success('Gmail signature synced!');
1498
+ info(`Signature: ${signature.substring(0, 50)}${signature.length > 50 ? '...' : ''}`);
1499
+ } else {
1500
+ warn('No signature found in Gmail settings');
1501
+ }
1502
+ } catch (err) {
1503
+ error(String(err));
1504
+ process.exit(1);
1505
+ }
1506
+ });
1507
+
1508
+ // ============================================
1509
+ // Export Commands
1510
+ // ============================================
1511
+ const exportCmd = program
1512
+ .command('export')
1513
+ .description('Export emails to EML or MBOX format');
1514
+
1515
+ exportCmd
1516
+ .command('messages')
1517
+ .description('Export messages to EML or MBOX format')
1518
+ .option('-q, --query <query>', 'Gmail search query')
1519
+ .option('-l, --label <labelId>', 'Filter by label ID')
1520
+ .option('-n, --max <number>', 'Maximum messages to export', '100')
1521
+ .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1522
+ .option('-o, --output <dir>', 'Output directory')
1523
+ .option('-f, --filename <name>', 'Output filename')
1524
+ .action(async (opts) => {
1525
+ try {
1526
+ const gmail = requireAuth();
1527
+ info(`Exporting messages${opts.query ? ` matching "${opts.query}"` : ''}...`);
1528
+
1529
+ const result = await gmail.export.exportMessages({
1530
+ query: opts.query,
1531
+ labelIds: opts.label ? [opts.label] : undefined,
1532
+ maxResults: parseInt(opts.max),
1533
+ format: opts.format,
1534
+ outputDir: opts.output,
1535
+ filename: opts.filename,
1536
+ });
1537
+
1538
+ success(`Exported ${result.messageCount} message(s)`);
1539
+ info(`Format: ${result.format.toUpperCase()}`);
1540
+ info(`File: ${result.filePath}`);
1541
+ } catch (err) {
1542
+ error(String(err));
1543
+ process.exit(1);
1544
+ }
1545
+ });
1546
+
1547
+ exportCmd
1548
+ .command('inbox')
1549
+ .description('Export inbox messages')
1550
+ .option('-n, --max <number>', 'Maximum messages to export', '100')
1551
+ .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1552
+ .option('-o, --output <dir>', 'Output directory')
1553
+ .option('-f, --filename <name>', 'Output filename')
1554
+ .action(async (opts) => {
1555
+ try {
1556
+ const gmail = requireAuth();
1557
+ info('Exporting inbox messages...');
1558
+
1559
+ const result = await gmail.export.exportInbox({
1560
+ maxResults: parseInt(opts.max),
1561
+ format: opts.format,
1562
+ outputDir: opts.output,
1563
+ filename: opts.filename,
1564
+ });
1565
+
1566
+ success(`Exported ${result.messageCount} inbox message(s)`);
1567
+ info(`Format: ${result.format.toUpperCase()}`);
1568
+ info(`File: ${result.filePath}`);
1569
+ } catch (err) {
1570
+ error(String(err));
1571
+ process.exit(1);
1572
+ }
1573
+ });
1574
+
1575
+ exportCmd
1576
+ .command('sent')
1577
+ .description('Export sent messages')
1578
+ .option('-n, --max <number>', 'Maximum messages to export', '100')
1579
+ .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1580
+ .option('-o, --output <dir>', 'Output directory')
1581
+ .option('-f, --filename <name>', 'Output filename')
1582
+ .action(async (opts) => {
1583
+ try {
1584
+ const gmail = requireAuth();
1585
+ info('Exporting sent messages...');
1586
+
1587
+ const result = await gmail.export.exportSent({
1588
+ maxResults: parseInt(opts.max),
1589
+ format: opts.format,
1590
+ outputDir: opts.output,
1591
+ filename: opts.filename,
1592
+ });
1593
+
1594
+ success(`Exported ${result.messageCount} sent message(s)`);
1595
+ info(`Format: ${result.format.toUpperCase()}`);
1596
+ info(`File: ${result.filePath}`);
1597
+ } catch (err) {
1598
+ error(String(err));
1599
+ process.exit(1);
1600
+ }
1601
+ });
1602
+
1603
+ exportCmd
1604
+ .command('starred')
1605
+ .description('Export starred messages')
1606
+ .option('-n, --max <number>', 'Maximum messages to export', '100')
1607
+ .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1608
+ .option('-o, --output <dir>', 'Output directory')
1609
+ .option('-f, --filename <name>', 'Output filename')
1610
+ .action(async (opts) => {
1611
+ try {
1612
+ const gmail = requireAuth();
1613
+ info('Exporting starred messages...');
1614
+
1615
+ const result = await gmail.export.exportStarred({
1616
+ maxResults: parseInt(opts.max),
1617
+ format: opts.format,
1618
+ outputDir: opts.output,
1619
+ filename: opts.filename,
1620
+ });
1621
+
1622
+ success(`Exported ${result.messageCount} starred message(s)`);
1623
+ info(`Format: ${result.format.toUpperCase()}`);
1624
+ info(`File: ${result.filePath}`);
1625
+ } catch (err) {
1626
+ error(String(err));
1627
+ process.exit(1);
1628
+ }
1629
+ });
1630
+
1631
+ exportCmd
1632
+ .command('label <labelId>')
1633
+ .description('Export messages from a specific label')
1634
+ .option('-n, --max <number>', 'Maximum messages to export', '100')
1635
+ .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1636
+ .option('-o, --output <dir>', 'Output directory')
1637
+ .option('-f, --filename <name>', 'Output filename')
1638
+ .action(async (labelId: string, opts) => {
1639
+ try {
1640
+ const gmail = requireAuth();
1641
+ info(`Exporting messages from label "${labelId}"...`);
1642
+
1643
+ const result = await gmail.export.exportLabel(labelId, {
1644
+ maxResults: parseInt(opts.max),
1645
+ format: opts.format,
1646
+ outputDir: opts.output,
1647
+ filename: opts.filename,
1648
+ });
1649
+
1650
+ success(`Exported ${result.messageCount} message(s)`);
1651
+ info(`Format: ${result.format.toUpperCase()}`);
1652
+ info(`File: ${result.filePath}`);
1653
+ } catch (err) {
1654
+ error(String(err));
1655
+ process.exit(1);
1656
+ }
1657
+ });
1658
+
1659
+ exportCmd
1660
+ .command('message <messageId>')
1661
+ .description('Export a single message to EML format')
1662
+ .option('-o, --output <dir>', 'Output directory')
1663
+ .option('-f, --filename <name>', 'Output filename')
1664
+ .action(async (messageId: string, opts) => {
1665
+ try {
1666
+ const gmail = requireAuth();
1667
+ info(`Exporting message ${messageId}...`);
1668
+
1669
+ const result = await gmail.export.exportMessage(messageId, {
1670
+ outputDir: opts.output,
1671
+ filename: opts.filename,
1672
+ });
1673
+
1674
+ success(`Message exported`);
1675
+ info(`File: ${result.filePath}`);
1676
+ } catch (err) {
1677
+ error(String(err));
1678
+ process.exit(1);
1679
+ }
1680
+ });
1681
+
1682
+ exportCmd
1683
+ .command('thread <threadId>')
1684
+ .description('Export an entire thread (conversation)')
1685
+ .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1686
+ .option('-o, --output <dir>', 'Output directory')
1687
+ .option('-f, --filename <name>', 'Output filename')
1688
+ .action(async (threadId: string, opts) => {
1689
+ try {
1690
+ const gmail = requireAuth();
1691
+ info(`Exporting thread ${threadId}...`);
1692
+
1693
+ const result = await gmail.export.exportThread(threadId, {
1694
+ format: opts.format,
1695
+ outputDir: opts.output,
1696
+ filename: opts.filename,
1697
+ });
1698
+
1699
+ success(`Exported ${result.messageCount} message(s) from thread`);
1700
+ info(`Format: ${result.format.toUpperCase()}`);
1701
+ info(`File: ${result.filePath}`);
1702
+ } catch (err) {
1703
+ error(String(err));
1704
+ process.exit(1);
1705
+ }
1706
+ });
1707
+
1708
+ // ============================================
1709
+ // Bulk Operations Commands
1710
+ // ============================================
1711
+ const bulkCmd = program
1712
+ .command('bulk')
1713
+ .description('Bulk operations on messages (using Gmail search queries)');
1714
+
1715
+ bulkCmd
1716
+ .command('preview <query>')
1717
+ .description('Preview messages matching a Gmail search query')
1718
+ .option('-n, --max <number>', 'Maximum messages to preview', '20')
1719
+ .action(async (query: string, opts) => {
1720
+ try {
1721
+ const gmail = requireAuth();
1722
+ info(`Searching for messages matching: ${query}`);
1723
+
1724
+ const result = await gmail.bulk.preview(query, parseInt(opts.max));
1725
+
1726
+ if (result.messages.length === 0) {
1727
+ info('No messages found matching the query');
1728
+ return;
1729
+ }
1730
+
1731
+ success(`Found ${result.total} message(s):`);
1732
+ const output = result.messages.map(m => ({
1733
+ id: m.id,
1734
+ from: m.from || '-',
1735
+ subject: m.subject || '(no subject)',
1736
+ date: m.date || '-',
1737
+ }));
1738
+ print(output, getFormat(bulkCmd));
1739
+ } catch (err) {
1740
+ error(String(err));
1741
+ process.exit(1);
1742
+ }
1743
+ });
1744
+
1745
+ bulkCmd
1746
+ .command('label <query>')
1747
+ .description('Add or remove labels from messages matching a query')
1748
+ .option('-a, --add <labels>', 'Labels to add (comma-separated names or IDs)')
1749
+ .option('-r, --remove <labels>', 'Labels to remove (comma-separated names or IDs)')
1750
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
1751
+ .option('--dry-run', 'Preview changes without applying them')
1752
+ .option('--batch', 'Use Gmail batch API for faster processing (recommended for large batches)')
1753
+ .action(async (query: string, opts) => {
1754
+ try {
1755
+ if (!opts.add && !opts.remove) {
1756
+ error('At least one of --add or --remove is required');
1757
+ process.exit(1);
1758
+ }
1759
+
1760
+ const gmail = requireAuth();
1761
+ const addLabels = opts.add ? opts.add.split(',').map((l: string) => l.trim()) : [];
1762
+ const removeLabels = opts.remove ? opts.remove.split(',').map((l: string) => l.trim()) : [];
1763
+
1764
+ info(`${opts.dryRun ? '[DRY RUN] ' : ''}Modifying labels for messages matching: ${query}`);
1765
+ if (addLabels.length > 0) info(` Adding: ${addLabels.join(', ')}`);
1766
+ if (removeLabels.length > 0) info(` Removing: ${removeLabels.join(', ')}`);
1767
+
1768
+ let result;
1769
+ if (opts.batch) {
1770
+ result = await gmail.bulk.batchModifyLabels({
1771
+ query,
1772
+ maxResults: parseInt(opts.max),
1773
+ addLabels,
1774
+ removeLabels,
1775
+ dryRun: opts.dryRun,
1776
+ });
1777
+ } else {
1778
+ result = await gmail.bulk.modifyLabels({
1779
+ query,
1780
+ maxResults: parseInt(opts.max),
1781
+ addLabels,
1782
+ removeLabels,
1783
+ dryRun: opts.dryRun,
1784
+ onProgress: (current, total) => {
1785
+ process.stdout.write(`\r Progress: ${current}/${total}`);
1786
+ },
1787
+ });
1788
+ console.log(); // New line after progress
1789
+ }
1790
+
1791
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk label modification complete:`);
1792
+ info(` Total: ${result.total}`);
1793
+ info(` Success: ${result.success}`);
1794
+ if (result.failed > 0) {
1795
+ warn(` Failed: ${result.failed}`);
1796
+ for (const err of result.errors.slice(0, 5)) {
1797
+ info(` - ${err.messageId}: ${err.error}`);
1798
+ }
1799
+ if (result.errors.length > 5) {
1800
+ info(` ... and ${result.errors.length - 5} more errors`);
1801
+ }
1802
+ }
1803
+ } catch (err) {
1804
+ error(String(err));
1805
+ process.exit(1);
1806
+ }
1807
+ });
1808
+
1809
+ bulkCmd
1810
+ .command('archive <query>')
1811
+ .description('Archive messages matching a query (remove from INBOX)')
1812
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
1813
+ .option('--dry-run', 'Preview changes without applying them')
1814
+ .option('--batch', 'Use Gmail batch API for faster processing')
1815
+ .action(async (query: string, opts) => {
1816
+ try {
1817
+ const gmail = requireAuth();
1818
+ info(`${opts.dryRun ? '[DRY RUN] ' : ''}Archiving messages matching: ${query}`);
1819
+
1820
+ let result;
1821
+ if (opts.batch) {
1822
+ result = await gmail.bulk.batchModifyLabels({
1823
+ query,
1824
+ maxResults: parseInt(opts.max),
1825
+ removeLabelIds: ['INBOX'],
1826
+ dryRun: opts.dryRun,
1827
+ });
1828
+ } else {
1829
+ result = await gmail.bulk.archive({
1830
+ query,
1831
+ maxResults: parseInt(opts.max),
1832
+ dryRun: opts.dryRun,
1833
+ onProgress: (current, total) => {
1834
+ process.stdout.write(`\r Progress: ${current}/${total}`);
1835
+ },
1836
+ });
1837
+ console.log();
1838
+ }
1839
+
1840
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk archive complete:`);
1841
+ info(` Total: ${result.total}`);
1842
+ info(` Success: ${result.success}`);
1843
+ if (result.failed > 0) warn(` Failed: ${result.failed}`);
1844
+ } catch (err) {
1845
+ error(String(err));
1846
+ process.exit(1);
1847
+ }
1848
+ });
1849
+
1850
+ bulkCmd
1851
+ .command('trash <query>')
1852
+ .description('Move messages matching a query to trash')
1853
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
1854
+ .option('--dry-run', 'Preview changes without applying them')
1855
+ .action(async (query: string, opts) => {
1856
+ try {
1857
+ const gmail = requireAuth();
1858
+ info(`${opts.dryRun ? '[DRY RUN] ' : ''}Moving to trash messages matching: ${query}`);
1859
+
1860
+ const result = await gmail.bulk.trash({
1861
+ query,
1862
+ maxResults: parseInt(opts.max),
1863
+ dryRun: opts.dryRun,
1864
+ onProgress: (current, total) => {
1865
+ process.stdout.write(`\r Progress: ${current}/${total}`);
1866
+ },
1867
+ });
1868
+ console.log();
1869
+
1870
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk trash complete:`);
1871
+ info(` Total: ${result.total}`);
1872
+ info(` Success: ${result.success}`);
1873
+ if (result.failed > 0) warn(` Failed: ${result.failed}`);
1874
+ } catch (err) {
1875
+ error(String(err));
1876
+ process.exit(1);
1877
+ }
1878
+ });
1879
+
1880
+ bulkCmd
1881
+ .command('delete <query>')
1882
+ .description('Permanently delete messages matching a query (DANGER!)')
1883
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
1884
+ .option('--dry-run', 'Preview changes without applying them')
1885
+ .option('--batch', 'Use Gmail batch API for faster processing')
1886
+ .option('--confirm', 'Confirm permanent deletion')
1887
+ .action(async (query: string, opts) => {
1888
+ try {
1889
+ if (!opts.dryRun && !opts.confirm) {
1890
+ error('Permanent deletion requires --confirm flag');
1891
+ info('Use --dry-run to preview what would be deleted');
1892
+ process.exit(1);
1893
+ }
1894
+
1895
+ const gmail = requireAuth();
1896
+ warn(`${opts.dryRun ? '[DRY RUN] ' : ''}PERMANENTLY DELETING messages matching: ${query}`);
1897
+
1898
+ let result;
1899
+ if (opts.batch) {
1900
+ result = await gmail.bulk.batchDelete({
1901
+ query,
1902
+ maxResults: parseInt(opts.max),
1903
+ dryRun: opts.dryRun,
1904
+ });
1905
+ } else {
1906
+ result = await gmail.bulk.delete({
1907
+ query,
1908
+ maxResults: parseInt(opts.max),
1909
+ dryRun: opts.dryRun,
1910
+ onProgress: (current, total) => {
1911
+ process.stdout.write(`\r Progress: ${current}/${total}`);
1912
+ },
1913
+ });
1914
+ console.log();
1915
+ }
1916
+
1917
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk delete complete:`);
1918
+ info(` Total: ${result.total}`);
1919
+ info(` Success: ${result.success}`);
1920
+ if (result.failed > 0) warn(` Failed: ${result.failed}`);
1921
+ } catch (err) {
1922
+ error(String(err));
1923
+ process.exit(1);
1924
+ }
1925
+ });
1926
+
1927
+ bulkCmd
1928
+ .command('mark-read <query>')
1929
+ .description('Mark messages matching a query as read')
1930
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
1931
+ .option('--dry-run', 'Preview changes without applying them')
1932
+ .option('--batch', 'Use Gmail batch API for faster processing')
1933
+ .action(async (query: string, opts) => {
1934
+ try {
1935
+ const gmail = requireAuth();
1936
+ info(`${opts.dryRun ? '[DRY RUN] ' : ''}Marking as read messages matching: ${query}`);
1937
+
1938
+ let result;
1939
+ if (opts.batch) {
1940
+ result = await gmail.bulk.batchModifyLabels({
1941
+ query,
1942
+ maxResults: parseInt(opts.max),
1943
+ removeLabelIds: ['UNREAD'],
1944
+ dryRun: opts.dryRun,
1945
+ });
1946
+ } else {
1947
+ result = await gmail.bulk.markAsRead({
1948
+ query,
1949
+ maxResults: parseInt(opts.max),
1950
+ dryRun: opts.dryRun,
1951
+ onProgress: (current, total) => {
1952
+ process.stdout.write(`\r Progress: ${current}/${total}`);
1953
+ },
1954
+ });
1955
+ console.log();
1956
+ }
1957
+
1958
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk mark-read complete:`);
1959
+ info(` Total: ${result.total}`);
1960
+ info(` Success: ${result.success}`);
1961
+ if (result.failed > 0) warn(` Failed: ${result.failed}`);
1962
+ } catch (err) {
1963
+ error(String(err));
1964
+ process.exit(1);
1965
+ }
1966
+ });
1967
+
1968
+ bulkCmd
1969
+ .command('mark-unread <query>')
1970
+ .description('Mark messages matching a query as unread')
1971
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
1972
+ .option('--dry-run', 'Preview changes without applying them')
1973
+ .option('--batch', 'Use Gmail batch API for faster processing')
1974
+ .action(async (query: string, opts) => {
1975
+ try {
1976
+ const gmail = requireAuth();
1977
+ info(`${opts.dryRun ? '[DRY RUN] ' : ''}Marking as unread messages matching: ${query}`);
1978
+
1979
+ let result;
1980
+ if (opts.batch) {
1981
+ result = await gmail.bulk.batchModifyLabels({
1982
+ query,
1983
+ maxResults: parseInt(opts.max),
1984
+ addLabelIds: ['UNREAD'],
1985
+ dryRun: opts.dryRun,
1986
+ });
1987
+ } else {
1988
+ result = await gmail.bulk.markAsUnread({
1989
+ query,
1990
+ maxResults: parseInt(opts.max),
1991
+ dryRun: opts.dryRun,
1992
+ onProgress: (current, total) => {
1993
+ process.stdout.write(`\r Progress: ${current}/${total}`);
1994
+ },
1995
+ });
1996
+ console.log();
1997
+ }
1998
+
1999
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk mark-unread complete:`);
2000
+ info(` Total: ${result.total}`);
2001
+ info(` Success: ${result.success}`);
2002
+ if (result.failed > 0) warn(` Failed: ${result.failed}`);
2003
+ } catch (err) {
2004
+ error(String(err));
2005
+ process.exit(1);
2006
+ }
2007
+ });
2008
+
2009
+ bulkCmd
2010
+ .command('star <query>')
2011
+ .description('Star messages matching a query')
2012
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
2013
+ .option('--dry-run', 'Preview changes without applying them')
2014
+ .option('--batch', 'Use Gmail batch API for faster processing')
2015
+ .action(async (query: string, opts) => {
2016
+ try {
2017
+ const gmail = requireAuth();
2018
+ info(`${opts.dryRun ? '[DRY RUN] ' : ''}Starring messages matching: ${query}`);
2019
+
2020
+ let result;
2021
+ if (opts.batch) {
2022
+ result = await gmail.bulk.batchModifyLabels({
2023
+ query,
2024
+ maxResults: parseInt(opts.max),
2025
+ addLabelIds: ['STARRED'],
2026
+ dryRun: opts.dryRun,
2027
+ });
2028
+ } else {
2029
+ result = await gmail.bulk.star({
2030
+ query,
2031
+ maxResults: parseInt(opts.max),
2032
+ dryRun: opts.dryRun,
2033
+ onProgress: (current, total) => {
2034
+ process.stdout.write(`\r Progress: ${current}/${total}`);
2035
+ },
2036
+ });
2037
+ console.log();
2038
+ }
2039
+
2040
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk star complete:`);
2041
+ info(` Total: ${result.total}`);
2042
+ info(` Success: ${result.success}`);
2043
+ if (result.failed > 0) warn(` Failed: ${result.failed}`);
2044
+ } catch (err) {
2045
+ error(String(err));
2046
+ process.exit(1);
2047
+ }
2048
+ });
2049
+
2050
+ bulkCmd
2051
+ .command('unstar <query>')
2052
+ .description('Remove stars from messages matching a query')
2053
+ .option('-n, --max <number>', 'Maximum messages to process', '100')
2054
+ .option('--dry-run', 'Preview changes without applying them')
2055
+ .option('--batch', 'Use Gmail batch API for faster processing')
2056
+ .action(async (query: string, opts) => {
2057
+ try {
2058
+ const gmail = requireAuth();
2059
+ info(`${opts.dryRun ? '[DRY RUN] ' : ''}Removing stars from messages matching: ${query}`);
2060
+
2061
+ let result;
2062
+ if (opts.batch) {
2063
+ result = await gmail.bulk.batchModifyLabels({
2064
+ query,
2065
+ maxResults: parseInt(opts.max),
2066
+ removeLabelIds: ['STARRED'],
2067
+ dryRun: opts.dryRun,
2068
+ });
2069
+ } else {
2070
+ result = await gmail.bulk.unstar({
2071
+ query,
2072
+ maxResults: parseInt(opts.max),
2073
+ dryRun: opts.dryRun,
2074
+ onProgress: (current, total) => {
2075
+ process.stdout.write(`\r Progress: ${current}/${total}`);
2076
+ },
2077
+ });
2078
+ console.log();
2079
+ }
2080
+
2081
+ success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk unstar complete:`);
2082
+ info(` Total: ${result.total}`);
2083
+ info(` Success: ${result.success}`);
2084
+ if (result.failed > 0) warn(` Failed: ${result.failed}`);
2085
+ } catch (err) {
2086
+ error(String(err));
2087
+ process.exit(1);
2088
+ }
2089
+ });
2090
+
2091
+ bulkCmd
2092
+ .command('help-query')
2093
+ .description('Show Gmail search query syntax examples')
2094
+ .action(() => {
2095
+ info(chalk.bold('\nGmail Search Query Syntax:\n'));
2096
+
2097
+ info(chalk.cyan('Basic filters:'));
2098
+ info(' from:user@example.com - Messages from a specific sender');
2099
+ info(' to:user@example.com - Messages to a specific recipient');
2100
+ info(' subject:invoice - Messages with "invoice" in subject');
2101
+ info(' "exact phrase" - Messages containing exact phrase\n');
2102
+
2103
+ info(chalk.cyan('Date filters:'));
2104
+ info(' after:2024/01/01 - Messages after a date');
2105
+ info(' before:2024/12/31 - Messages before a date');
2106
+ info(' older_than:7d - Messages older than 7 days');
2107
+ info(' newer_than:1m - Messages newer than 1 month\n');
2108
+
2109
+ info(chalk.cyan('Label filters:'));
2110
+ info(' label:work - Messages with a specific label');
2111
+ info(' in:inbox - Messages in inbox');
2112
+ info(' in:sent - Messages in sent');
2113
+ info(' in:trash - Messages in trash');
2114
+ info(' in:spam - Messages in spam\n');
2115
+
2116
+ info(chalk.cyan('Status filters:'));
2117
+ info(' is:unread - Unread messages');
2118
+ info(' is:read - Read messages');
2119
+ info(' is:starred - Starred messages');
2120
+ info(' is:important - Important messages');
2121
+ info(' has:attachment - Messages with attachments\n');
2122
+
2123
+ info(chalk.cyan('Size filters:'));
2124
+ info(' larger:10M - Messages larger than 10MB');
2125
+ info(' smaller:1K - Messages smaller than 1KB\n');
2126
+
2127
+ info(chalk.cyan('Combining filters:'));
2128
+ info(' from:boss@company.com is:unread');
2129
+ info(' subject:report after:2024/01/01 before:2024/06/01');
2130
+ info(' from:@newsletter.com older_than:30d');
2131
+ info(' {from:alice@ex.com from:bob@ex.com} - OR operator');
2132
+ info(' -from:spam@ex.com - NOT operator (exclude)\n');
2133
+
2134
+ info(chalk.cyan('Examples:'));
2135
+ info(' bulk preview "from:newsletter@company.com older_than:30d"');
2136
+ info(' bulk archive "from:@notifications.com is:read"');
2137
+ info(' bulk trash "subject:unsubscribe older_than:90d" --dry-run');
2138
+ info(' bulk label "from:@client.com" --add "Work/Clients"');
2139
+ info(' bulk mark-read "is:unread older_than:7d" --batch');
2140
+ });
2141
+
2142
+ // Parse and execute
2143
+ program.parse();