@hasna/connectors 1.1.3 → 1.1.5

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 (938) hide show
  1. package/bin/index.js +1 -1
  2. package/bin/mcp.js +1 -1
  3. package/connectors/connect-3scribe/src/utils/config.ts +2 -2
  4. package/connectors/connect-7todos/src/utils/config.ts +2 -2
  5. package/connectors/connect-ably/src/utils/config.ts +2 -2
  6. package/connectors/connect-abstract/src/utils/config.ts +2 -2
  7. package/connectors/connect-abuselpdb/src/utils/config.ts +2 -2
  8. package/connectors/connect-accelo/src/utils/config.ts +2 -2
  9. package/connectors/connect-accredible/src/utils/config.ts +2 -2
  10. package/connectors/connect-accurai/src/utils/config.ts +2 -2
  11. package/connectors/connect-accuranker/src/utils/config.ts +2 -2
  12. package/connectors/connect-acquire/src/utils/config.ts +2 -2
  13. package/connectors/connect-actionnetwork/src/utils/config.ts +2 -2
  14. package/connectors/connect-activecampaign/src/utils/config.ts +2 -2
  15. package/connectors/connect-activetrail/src/utils/config.ts +2 -2
  16. package/connectors/connect-adalo/src/utils/config.ts +2 -2
  17. package/connectors/connect-adobe/src/utils/config.ts +2 -2
  18. package/connectors/connect-adroll/src/utils/config.ts +2 -2
  19. package/connectors/connect-affinity/src/utils/config.ts +2 -2
  20. package/connectors/connect-agent/src/utils/config.ts +2 -2
  21. package/connectors/connect-agilecrm/src/utils/config.ts +2 -2
  22. package/connectors/connect-aiagenttool/src/utils/config.ts +2 -2
  23. package/connectors/connect-airbrake/src/utils/config.ts +2 -2
  24. package/connectors/connect-airnow/src/utils/config.ts +2 -2
  25. package/connectors/connect-airtable/src/utils/config.ts +2 -2
  26. package/connectors/connect-airtop/src/utils/config.ts +2 -2
  27. package/connectors/connect-aitableai/src/utils/config.ts +2 -2
  28. package/connectors/connect-alchemy/src/utils/config.ts +2 -2
  29. package/connectors/connect-alerty/src/utils/config.ts +2 -2
  30. package/connectors/connect-alienvault/src/utils/config.ts +2 -2
  31. package/connectors/connect-alphamoon/src/utils/config.ts +2 -2
  32. package/connectors/connect-alttextai/src/utils/config.ts +2 -2
  33. package/connectors/connect-amadeus/src/utils/config.ts +1 -1
  34. package/connectors/connect-amazon/src/utils/config.ts +2 -2
  35. package/connectors/connect-amilia/src/utils/config.ts +2 -2
  36. package/connectors/connect-amplitude/src/utils/config.ts +2 -2
  37. package/connectors/connect-amqpsender/src/utils/config.ts +2 -2
  38. package/connectors/connect-announcekit/src/utils/config.ts +2 -2
  39. package/connectors/connect-anyscale/src/utils/config.ts +1 -1
  40. package/connectors/connect-apiary/src/utils/config.ts +2 -2
  41. package/connectors/connect-apiflash/src/utils/config.ts +2 -2
  42. package/connectors/connect-apitemplateio/src/utils/config.ts +2 -2
  43. package/connectors/connect-apptivegrid/src/utils/config.ts +2 -2
  44. package/connectors/connect-asana/src/utils/config.ts +2 -2
  45. package/connectors/connect-assemblyai/src/utils/config.ts +1 -1
  46. package/connectors/connect-auth0/src/utils/config.ts +2 -2
  47. package/connectors/connect-autom/src/utils/config.ts +2 -2
  48. package/connectors/connect-automizy/src/utils/config.ts +2 -2
  49. package/connectors/connect-autopilot/src/utils/config.ts +2 -2
  50. package/connectors/connect-awscognito/src/utils/config.ts +2 -2
  51. package/connectors/connect-azureaisearchvectorstore/src/utils/config.ts +2 -2
  52. package/connectors/connect-azurecosmosdb/src/utils/config.ts +2 -2
  53. package/connectors/connect-azureopenaichatmodel/src/utils/config.ts +2 -2
  54. package/connectors/connect-azurestorage/src/utils/config.ts +2 -2
  55. package/connectors/connect-badgermaps/src/utils/config.ts +2 -2
  56. package/connectors/connect-bamboohr/src/utils/config.ts +2 -2
  57. package/connectors/connect-bandwidth/src/utils/config.ts +2 -2
  58. package/connectors/connect-bannerbear/src/utils/config.ts +2 -2
  59. package/connectors/connect-baserow/src/utils/config.ts +2 -2
  60. package/connectors/connect-baseten/src/utils/config.ts +1 -1
  61. package/connectors/connect-beeminder/src/utils/config.ts +2 -2
  62. package/connectors/connect-benchmarkemail/src/utils/config.ts +2 -2
  63. package/connectors/connect-betterproposals/src/utils/config.ts +2 -2
  64. package/connectors/connect-bigcartel/src/utils/config.ts +2 -2
  65. package/connectors/connect-bigdatacloud/src/utils/config.ts +2 -2
  66. package/connectors/connect-bigml/src/utils/config.ts +2 -2
  67. package/connectors/connect-bitly/src/utils/config.ts +2 -2
  68. package/connectors/connect-bitrix24/src/utils/config.ts +2 -2
  69. package/connectors/connect-bitwarden/src/utils/config.ts +2 -2
  70. package/connectors/connect-blaze/src/utils/config.ts +2 -2
  71. package/connectors/connect-blockchainexchange/src/utils/config.ts +2 -2
  72. package/connectors/connect-bloock/src/utils/config.ts +2 -2
  73. package/connectors/connect-bot9/src/utils/config.ts +2 -2
  74. package/connectors/connect-botbaba/src/utils/config.ts +2 -2
  75. package/connectors/connect-botifier/src/utils/config.ts +2 -2
  76. package/connectors/connect-botiumbox/src/utils/config.ts +2 -2
  77. package/connectors/connect-botsonic/src/utils/config.ts +2 -2
  78. package/connectors/connect-botstar/src/utils/config.ts +2 -2
  79. package/connectors/connect-box/src/utils/config.ts +2 -2
  80. package/connectors/connect-brainpodai/src/utils/config.ts +2 -2
  81. package/connectors/connect-brandblast/src/utils/config.ts +2 -2
  82. package/connectors/connect-brandfetch/src/utils/config.ts +2 -2
  83. package/connectors/connect-brandmentions/src/utils/config.ts +2 -2
  84. package/connectors/connect-breezyhr/src/utils/config.ts +2 -2
  85. package/connectors/connect-brevo/src/utils/config.ts +2 -2
  86. package/connectors/connect-brex/src/utils/config.ts +2 -2
  87. package/connectors/connect-browseai/src/utils/config.ts +2 -2
  88. package/connectors/connect-browserless/src/utils/config.ts +2 -2
  89. package/connectors/connect-browserstack/src/utils/config.ts +2 -2
  90. package/connectors/connect-browseruse/package.json +1 -1
  91. package/connectors/connect-browseruse/src/utils/config.ts +2 -2
  92. package/connectors/connect-bubble/src/utils/config.ts +2 -2
  93. package/connectors/connect-bugbug/src/utils/config.ts +2 -2
  94. package/connectors/connect-bugfender/src/utils/config.ts +2 -2
  95. package/connectors/connect-bugherd/src/utils/config.ts +2 -2
  96. package/connectors/connect-bugpilot/src/utils/config.ts +2 -2
  97. package/connectors/connect-bugreplay/src/utils/config.ts +2 -2
  98. package/connectors/connect-bugshot/src/utils/config.ts +2 -2
  99. package/connectors/connect-buildkite/src/utils/config.ts +2 -2
  100. package/connectors/connect-bunnycdn/src/utils/config.ts +2 -2
  101. package/connectors/connect-calendarhero/src/utils/config.ts +2 -2
  102. package/connectors/connect-calendly/src/utils/config.ts +2 -2
  103. package/connectors/connect-canvas/src/utils/config.ts +2 -2
  104. package/connectors/connect-capsule/src/utils/config.ts +2 -2
  105. package/connectors/connect-carbonblack/src/utils/config.ts +2 -2
  106. package/connectors/connect-cerebras/src/utils/config.ts +1 -1
  107. package/connectors/connect-chaindesk/src/utils/config.ts +2 -2
  108. package/connectors/connect-chargebee/src/utils/config.ts +2 -2
  109. package/connectors/connect-chargeover/src/utils/config.ts +2 -2
  110. package/connectors/connect-chargify/src/utils/config.ts +2 -2
  111. package/connectors/connect-chatbase/src/utils/config.ts +2 -2
  112. package/connectors/connect-chatling/src/utils/config.ts +2 -2
  113. package/connectors/connect-chatmasters/src/utils/config.ts +2 -2
  114. package/connectors/connect-chatrace/src/utils/config.ts +2 -2
  115. package/connectors/connect-chatsonic/src/utils/config.ts +2 -2
  116. package/connectors/connect-chekhub/src/utils/config.ts +2 -2
  117. package/connectors/connect-chromavectorstore/src/utils/config.ts +2 -2
  118. package/connectors/connect-circleci/src/utils/config.ts +2 -2
  119. package/connectors/connect-ciscomeraki/src/utils/config.ts +2 -2
  120. package/connectors/connect-ciscosecureendpoint/src/utils/config.ts +2 -2
  121. package/connectors/connect-ciscoumbrella/src/utils/config.ts +2 -2
  122. package/connectors/connect-ciscowebex/src/utils/config.ts +2 -2
  123. package/connectors/connect-citrixadc/src/utils/config.ts +2 -2
  124. package/connectors/connect-clappia/src/utils/config.ts +2 -2
  125. package/connectors/connect-clarifai/src/utils/config.ts +2 -2
  126. package/connectors/connect-clearbit/src/utils/config.ts +2 -2
  127. package/connectors/connect-cleverreach/src/utils/config.ts +2 -2
  128. package/connectors/connect-clickbank/scripts/publish.ts +2 -2
  129. package/connectors/connect-clickbank/src/utils/config.ts +2 -2
  130. package/connectors/connect-clicksendsms/src/utils/config.ts +2 -2
  131. package/connectors/connect-clickup/src/utils/config.ts +1 -1
  132. package/connectors/connect-clockify/src/utils/config.ts +2 -2
  133. package/connectors/connect-cloozo/src/utils/config.ts +2 -2
  134. package/connectors/connect-cloud66/src/utils/config.ts +2 -2
  135. package/connectors/connect-cloudboost/src/utils/config.ts +2 -2
  136. package/connectors/connect-cloudconvert/src/utils/config.ts +2 -2
  137. package/connectors/connect-cloudlayer/src/utils/config.ts +2 -2
  138. package/connectors/connect-cloudshare/src/utils/config.ts +2 -2
  139. package/connectors/connect-cloze/src/utils/config.ts +2 -2
  140. package/connectors/connect-cockpit/src/utils/config.ts +2 -2
  141. package/connectors/connect-coda/src/utils/config.ts +2 -2
  142. package/connectors/connect-codeclimate/src/utils/config.ts +2 -2
  143. package/connectors/connect-codefresh/src/utils/config.ts +2 -2
  144. package/connectors/connect-cody/src/utils/config.ts +2 -2
  145. package/connectors/connect-cohere/src/utils/config.ts +2 -2
  146. package/connectors/connect-coinbase/src/utils/config.ts +2 -2
  147. package/connectors/connect-coingecko/src/utils/config.ts +2 -2
  148. package/connectors/connect-collegefootballdata/src/utils/config.ts +2 -2
  149. package/connectors/connect-configcat/src/utils/config.ts +2 -2
  150. package/connectors/connect-confluence/src/utils/config.ts +2 -2
  151. package/connectors/connect-confluent/src/utils/config.ts +2 -2
  152. package/connectors/connect-contactout/src/utils/config.ts +2 -2
  153. package/connectors/connect-contentful/src/utils/config.ts +2 -2
  154. package/connectors/connect-convertapi/src/utils/config.ts +2 -2
  155. package/connectors/connect-convertkit/src/utils/config.ts +2 -2
  156. package/connectors/connect-convi/src/utils/config.ts +2 -2
  157. package/connectors/connect-copper/src/utils/config.ts +2 -2
  158. package/connectors/connect-copyai/src/utils/config.ts +2 -2
  159. package/connectors/connect-corsizio/src/utils/config.ts +2 -2
  160. package/connectors/connect-cortex/src/utils/config.ts +2 -2
  161. package/connectors/connect-cradlai/src/utils/config.ts +2 -2
  162. package/connectors/connect-craftdraft/src/utils/config.ts +2 -2
  163. package/connectors/connect-cratedb/src/utils/config.ts +2 -2
  164. package/connectors/connect-crisp/src/utils/config.ts +2 -2
  165. package/connectors/connect-cronly/src/utils/config.ts +2 -2
  166. package/connectors/connect-crossmint/src/utils/config.ts +2 -2
  167. package/connectors/connect-crowddev/src/utils/config.ts +2 -2
  168. package/connectors/connect-crowdin/src/utils/config.ts +2 -2
  169. package/connectors/connect-crowdpower/src/utils/config.ts +2 -2
  170. package/connectors/connect-crowdstrike/src/utils/config.ts +2 -2
  171. package/connectors/connect-cryptolens/src/utils/config.ts +2 -2
  172. package/connectors/connect-currents/src/utils/config.ts +2 -2
  173. package/connectors/connect-customerio/src/utils/config.ts +2 -2
  174. package/connectors/connect-customeriq/src/utils/config.ts +2 -2
  175. package/connectors/connect-daffy/src/utils/config.ts +2 -2
  176. package/connectors/connect-danteai/src/utils/config.ts +2 -2
  177. package/connectors/connect-darkskyapi/src/utils/config.ts +2 -2
  178. package/connectors/connect-dasha/src/utils/config.ts +2 -2
  179. package/connectors/connect-databox/src/utils/config.ts +2 -2
  180. package/connectors/connect-databricks/src/utils/config.ts +2 -2
  181. package/connectors/connect-datadog/src/utils/config.ts +2 -2
  182. package/connectors/connect-datarobot/src/utils/config.ts +2 -2
  183. package/connectors/connect-datasoap/src/utils/config.ts +2 -2
  184. package/connectors/connect-datumbox/src/utils/config.ts +2 -2
  185. package/connectors/connect-dayschedule/src/utils/config.ts +2 -2
  186. package/connectors/connect-deepgram/src/utils/config.ts +1 -1
  187. package/connectors/connect-deepinfra/src/utils/config.ts +1 -1
  188. package/connectors/connect-deepl/src/utils/config.ts +2 -2
  189. package/connectors/connect-deepseek/src/utils/config.ts +1 -1
  190. package/connectors/connect-demio/src/utils/config.ts +2 -2
  191. package/connectors/connect-descript/src/utils/config.ts +2 -2
  192. package/connectors/connect-detrack/src/utils/config.ts +2 -2
  193. package/connectors/connect-devcycle/src/utils/config.ts +2 -2
  194. package/connectors/connect-dhl/src/utils/config.ts +2 -2
  195. package/connectors/connect-dialzara/src/utils/config.ts +2 -2
  196. package/connectors/connect-diddoai/src/utils/config.ts +2 -2
  197. package/connectors/connect-diffy/src/utils/config.ts +2 -2
  198. package/connectors/connect-digicert/src/utils/config.ts +2 -2
  199. package/connectors/connect-digitalocean/src/utils/config.ts +2 -2
  200. package/connectors/connect-discourse/src/utils/config.ts +2 -2
  201. package/connectors/connect-disqus/src/utils/config.ts +2 -2
  202. package/connectors/connect-dockcerts/src/utils/config.ts +2 -2
  203. package/connectors/connect-docparser/src/utils/config.ts +2 -2
  204. package/connectors/connect-docsbotai/src/utils/config.ts +2 -2
  205. package/connectors/connect-docupilot/src/utils/config.ts +2 -2
  206. package/connectors/connect-docusign/src/utils/config.ts +1 -1
  207. package/connectors/connect-docuwriter/src/utils/config.ts +2 -2
  208. package/connectors/connect-dokan/src/utils/config.ts +2 -2
  209. package/connectors/connect-domo/src/utils/config.ts +2 -2
  210. package/connectors/connect-draftable/src/utils/config.ts +2 -2
  211. package/connectors/connect-drift/src/utils/config.ts +2 -2
  212. package/connectors/connect-dropbox/src/utils/config.ts +2 -2
  213. package/connectors/connect-dropcontact/src/utils/config.ts +2 -2
  214. package/connectors/connect-droxy/src/utils/config.ts +2 -2
  215. package/connectors/connect-dynatrace/src/utils/config.ts +2 -2
  216. package/connectors/connect-eartho/src/utils/config.ts +2 -2
  217. package/connectors/connect-easyship/src/utils/config.ts +2 -2
  218. package/connectors/connect-echowin/src/utils/config.ts +2 -2
  219. package/connectors/connect-ecwid/src/utils/config.ts +2 -2
  220. package/connectors/connect-edenai/src/utils/config.ts +2 -2
  221. package/connectors/connect-egoi/src/utils/config.ts +2 -2
  222. package/connectors/connect-elasticsearch/src/utils/config.ts +2 -2
  223. package/connectors/connect-elasticsecurity/src/utils/config.ts +2 -2
  224. package/connectors/connect-elmah/src/utils/config.ts +2 -2
  225. package/connectors/connect-embedai/src/utils/config.ts +2 -2
  226. package/connectors/connect-emelia/src/utils/config.ts +2 -2
  227. package/connectors/connect-empsing/src/utils/config.ts +2 -2
  228. package/connectors/connect-engati/src/utils/config.ts +2 -2
  229. package/connectors/connect-enormail/src/utils/config.ts +2 -2
  230. package/connectors/connect-enterpret/src/utils/config.ts +2 -2
  231. package/connectors/connect-envoy/src/utils/config.ts +2 -2
  232. package/connectors/connect-epo/src/utils/config.ts +2 -2
  233. package/connectors/connect-erpnext/src/utils/config.ts +2 -2
  234. package/connectors/connect-esendex/src/utils/config.ts +2 -2
  235. package/connectors/connect-evervault/src/utils/config.ts +2 -2
  236. package/connectors/connect-evolphinzoom/src/utils/config.ts +2 -2
  237. package/connectors/connect-f5bigip/src/utils/config.ts +2 -2
  238. package/connectors/connect-fal/src/utils/config.ts +1 -1
  239. package/connectors/connect-faraday/src/utils/config.ts +2 -2
  240. package/connectors/connect-faros/src/utils/config.ts +2 -2
  241. package/connectors/connect-fastbots/src/utils/config.ts +2 -2
  242. package/connectors/connect-fathom/src/utils/config.ts +2 -2
  243. package/connectors/connect-filemaker/src/utils/config.ts +2 -2
  244. package/connectors/connect-filescan/src/utils/config.ts +2 -2
  245. package/connectors/connect-fireworks/src/utils/config.ts +1 -1
  246. package/connectors/connect-firmao/src/utils/config.ts +2 -2
  247. package/connectors/connect-fitbit/src/utils/config.ts +2 -2
  248. package/connectors/connect-flagship/src/utils/config.ts +2 -2
  249. package/connectors/connect-float/src/utils/config.ts +2 -2
  250. package/connectors/connect-flotiq/src/utils/config.ts +2 -2
  251. package/connectors/connect-flow/src/utils/config.ts +2 -2
  252. package/connectors/connect-fluentsupport/src/utils/config.ts +2 -2
  253. package/connectors/connect-focuster/src/utils/config.ts +2 -2
  254. package/connectors/connect-formcarry/src/utils/config.ts +2 -2
  255. package/connectors/connect-formdesk/src/utils/config.ts +2 -2
  256. package/connectors/connect-formsite/src/utils/config.ts +2 -2
  257. package/connectors/connect-formsonfire/src/utils/config.ts +2 -2
  258. package/connectors/connect-formstackdocuments/src/utils/config.ts +2 -2
  259. package/connectors/connect-fortinetfortigate/src/utils/config.ts +2 -2
  260. package/connectors/connect-foursquare/src/utils/config.ts +2 -2
  261. package/connectors/connect-freedictionary/src/utils/config.ts +2 -2
  262. package/connectors/connect-freshdesk/src/utils/config.ts +2 -2
  263. package/connectors/connect-freshping/src/utils/config.ts +2 -2
  264. package/connectors/connect-freshservice/src/utils/config.ts +2 -2
  265. package/connectors/connect-freshworkscrm/src/utils/config.ts +2 -2
  266. package/connectors/connect-fullcontact/src/utils/config.ts +2 -2
  267. package/connectors/connect-fusioo/src/utils/config.ts +2 -2
  268. package/connectors/connect-gali/src/utils/config.ts +2 -2
  269. package/connectors/connect-gatekeeper/src/utils/config.ts +2 -2
  270. package/connectors/connect-genderapi/src/utils/config.ts +2 -2
  271. package/connectors/connect-getresponse/src/utils/config.ts +2 -2
  272. package/connectors/connect-getscreenshot/src/utils/config.ts +2 -2
  273. package/connectors/connect-ghost/src/utils/config.ts +2 -2
  274. package/connectors/connect-giphy/src/utils/config.ts +2 -2
  275. package/connectors/connect-gitea/src/utils/config.ts +2 -2
  276. package/connectors/connect-gitlab/src/utils/config.ts +2 -2
  277. package/connectors/connect-gleap/src/utils/config.ts +2 -2
  278. package/connectors/connect-gocanvas/src/utils/config.ts +2 -2
  279. package/connectors/connect-godaddy/src/utils/config.ts +2 -2
  280. package/connectors/connect-gong/src/utils/config.ts +2 -2
  281. package/connectors/connect-googleads/src/utils/config.ts +1 -1
  282. package/connectors/connect-googleanalytics/src/utils/config.ts +2 -2
  283. package/connectors/connect-googlebigquery/src/utils/config.ts +2 -2
  284. package/connectors/connect-googlebooks/src/utils/config.ts +2 -2
  285. package/connectors/connect-googlebusinessprofile/src/utils/config.ts +2 -2
  286. package/connectors/connect-googlechat/src/utils/config.ts +2 -2
  287. package/connectors/connect-googledrive/src/cli/index.ts +156 -2
  288. package/connectors/connect-googleforms/src/utils/config.ts +2 -2
  289. package/connectors/connect-googleperspective/src/utils/config.ts +2 -2
  290. package/connectors/connect-googlephotos/src/utils/config.ts +2 -2
  291. package/connectors/connect-googleslides/package.json +1 -1
  292. package/connectors/connect-googleslides/src/utils/config.ts +2 -2
  293. package/connectors/connect-googletables/package.json +1 -1
  294. package/connectors/connect-googletables/src/utils/config.ts +2 -2
  295. package/connectors/connect-googletranslate/package.json +1 -1
  296. package/connectors/connect-googletranslate/src/utils/config.ts +2 -2
  297. package/connectors/connect-googlevertexai/package.json +1 -1
  298. package/connectors/connect-googlevertexai/src/utils/config.ts +2 -2
  299. package/connectors/connect-gotify/package.json +1 -1
  300. package/connectors/connect-gotify/src/utils/config.ts +2 -2
  301. package/connectors/connect-gotowebinar/package.json +1 -1
  302. package/connectors/connect-gotowebinar/src/utils/config.ts +2 -2
  303. package/connectors/connect-gptea/package.json +1 -1
  304. package/connectors/connect-gptea/src/utils/config.ts +2 -2
  305. package/connectors/connect-grafana/src/utils/config.ts +2 -2
  306. package/connectors/connect-grain/package.json +1 -1
  307. package/connectors/connect-grain/src/utils/config.ts +2 -2
  308. package/connectors/connect-gravityforms/package.json +1 -1
  309. package/connectors/connect-gravityforms/src/utils/config.ts +2 -2
  310. package/connectors/connect-grist/package.json +1 -1
  311. package/connectors/connect-grist/src/utils/config.ts +2 -2
  312. package/connectors/connect-groq/src/utils/config.ts +1 -1
  313. package/connectors/connect-growbots/src/utils/config.ts +2 -2
  314. package/connectors/connect-gumroad/src/utils/config.ts +2 -2
  315. package/connectors/connect-gupshup/src/utils/config.ts +2 -2
  316. package/connectors/connect-guru/src/utils/config.ts +2 -2
  317. package/connectors/connect-hackernews/src/utils/config.ts +2 -2
  318. package/connectors/connect-halopsa/src/utils/config.ts +2 -2
  319. package/connectors/connect-handwrytten/src/utils/config.ts +2 -2
  320. package/connectors/connect-hansei/src/utils/config.ts +2 -2
  321. package/connectors/connect-harrypotterapi/src/utils/config.ts +2 -2
  322. package/connectors/connect-harvest/src/utils/config.ts +2 -2
  323. package/connectors/connect-headlesstesting/src/utils/config.ts +2 -2
  324. package/connectors/connect-helcim/package.json +1 -1
  325. package/connectors/connect-helcim/src/utils/config.ts +2 -2
  326. package/connectors/connect-hellosign/package.json +1 -1
  327. package/connectors/connect-hellosign/src/utils/config.ts +1 -1
  328. package/connectors/connect-helpscout/package.json +1 -1
  329. package/connectors/connect-helpscout/src/utils/config.ts +2 -2
  330. package/connectors/connect-heysummit/package.json +1 -1
  331. package/connectors/connect-heysummit/src/utils/config.ts +2 -2
  332. package/connectors/connect-highlevel/package.json +1 -1
  333. package/connectors/connect-highlevel/src/utils/config.ts +2 -2
  334. package/connectors/connect-homeassistant/src/utils/config.ts +2 -2
  335. package/connectors/connect-hubplanner/package.json +1 -1
  336. package/connectors/connect-hubplanner/src/utils/config.ts +2 -2
  337. package/connectors/connect-hubspot/src/utils/config.ts +2 -2
  338. package/connectors/connect-humanticai/package.json +1 -1
  339. package/connectors/connect-humanticai/src/utils/config.ts +2 -2
  340. package/connectors/connect-hunter/package.json +1 -1
  341. package/connectors/connect-hunter/src/utils/config.ts +2 -2
  342. package/connectors/connect-hybridanalysis/package.json +1 -1
  343. package/connectors/connect-hybridanalysis/src/utils/config.ts +2 -2
  344. package/connectors/connect-iauditorbysafetyculture/package.json +1 -1
  345. package/connectors/connect-iauditorbysafetyculture/src/utils/config.ts +2 -2
  346. package/connectors/connect-idealpostcodes/package.json +1 -1
  347. package/connectors/connect-idealpostcodes/src/utils/config.ts +2 -2
  348. package/connectors/connect-idealspot/package.json +1 -1
  349. package/connectors/connect-idealspot/src/utils/config.ts +2 -2
  350. package/connectors/connect-ideogram/package.json +2 -2
  351. package/connectors/connect-ideogram/src/utils/config.ts +1 -1
  352. package/connectors/connect-ideta/package.json +1 -1
  353. package/connectors/connect-ideta/src/utils/config.ts +2 -2
  354. package/connectors/connect-imgbb/package.json +1 -1
  355. package/connectors/connect-imgbb/src/utils/config.ts +2 -2
  356. package/connectors/connect-imgur/src/utils/config.ts +2 -2
  357. package/connectors/connect-impervawaf/package.json +1 -1
  358. package/connectors/connect-impervawaf/src/utils/config.ts +2 -2
  359. package/connectors/connect-impira/package.json +1 -1
  360. package/connectors/connect-impira/src/utils/config.ts +2 -2
  361. package/connectors/connect-industryselect/package.json +1 -1
  362. package/connectors/connect-industryselect/src/utils/config.ts +2 -2
  363. package/connectors/connect-influxdbcloud/package.json +1 -1
  364. package/connectors/connect-influxdbcloud/src/utils/config.ts +2 -2
  365. package/connectors/connect-infolobby/package.json +1 -1
  366. package/connectors/connect-infolobby/src/utils/config.ts +2 -2
  367. package/connectors/connect-instabot/package.json +1 -1
  368. package/connectors/connect-instabot/src/utils/config.ts +2 -2
  369. package/connectors/connect-instabug/package.json +1 -1
  370. package/connectors/connect-instabug/src/utils/config.ts +2 -2
  371. package/connectors/connect-intakeq/package.json +1 -1
  372. package/connectors/connect-intakeq/src/utils/config.ts +2 -2
  373. package/connectors/connect-intercom/src/utils/config.ts +1 -1
  374. package/connectors/connect-invoiced/package.json +1 -1
  375. package/connectors/connect-invoiced/src/utils/config.ts +2 -2
  376. package/connectors/connect-invoiceninja/package.json +1 -1
  377. package/connectors/connect-invoiceninja/src/utils/config.ts +2 -2
  378. package/connectors/connect-ip2location/package.json +1 -1
  379. package/connectors/connect-ip2location/src/utils/config.ts +2 -2
  380. package/connectors/connect-ipinfo/package.json +1 -1
  381. package/connectors/connect-ipinfo/src/utils/config.ts +2 -2
  382. package/connectors/connect-ipregistry/package.json +1 -1
  383. package/connectors/connect-ipregistry/src/utils/config.ts +2 -2
  384. package/connectors/connect-irisdfir/package.json +1 -1
  385. package/connectors/connect-irisdfir/src/utils/config.ts +2 -2
  386. package/connectors/connect-isn/src/utils/config.ts +2 -2
  387. package/connectors/connect-iterable/src/utils/config.ts +2 -2
  388. package/connectors/connect-jama/src/utils/config.ts +2 -2
  389. package/connectors/connect-jasper/src/utils/config.ts +2 -2
  390. package/connectors/connect-jenkins/src/utils/config.ts +2 -2
  391. package/connectors/connect-jinaai/src/utils/config.ts +2 -2
  392. package/connectors/connect-jira/src/utils/config.ts +1 -1
  393. package/connectors/connect-kadoa/src/utils/config.ts +2 -2
  394. package/connectors/connect-kafka/src/utils/config.ts +2 -2
  395. package/connectors/connect-kaggle/src/utils/config.ts +2 -2
  396. package/connectors/connect-kanbantool/src/utils/config.ts +2 -2
  397. package/connectors/connect-karbon/package.json +1 -1
  398. package/connectors/connect-karbon/src/utils/config.ts +2 -2
  399. package/connectors/connect-keap/package.json +1 -1
  400. package/connectors/connect-keap/src/utils/config.ts +2 -2
  401. package/connectors/connect-keygen/package.json +1 -1
  402. package/connectors/connect-keygen/src/utils/config.ts +2 -2
  403. package/connectors/connect-keyzy/package.json +1 -1
  404. package/connectors/connect-keyzy/src/utils/config.ts +2 -2
  405. package/connectors/connect-kibana/package.json +1 -1
  406. package/connectors/connect-kibana/src/utils/config.ts +2 -2
  407. package/connectors/connect-kitemaker/package.json +1 -1
  408. package/connectors/connect-kitemaker/src/utils/config.ts +2 -2
  409. package/connectors/connect-klaviyo/src/utils/config.ts +2 -2
  410. package/connectors/connect-klazify/package.json +1 -1
  411. package/connectors/connect-klazify/src/utils/config.ts +2 -2
  412. package/connectors/connect-kling/package.json +2 -2
  413. package/connectors/connect-kling/src/utils/config.ts +1 -1
  414. package/connectors/connect-knack/package.json +1 -1
  415. package/connectors/connect-knack/src/utils/config.ts +2 -2
  416. package/connectors/connect-knowbe4/package.json +1 -1
  417. package/connectors/connect-knowbe4/src/utils/config.ts +2 -2
  418. package/connectors/connect-kobotoolbox/package.json +1 -1
  419. package/connectors/connect-kobotoolbox/src/utils/config.ts +2 -2
  420. package/connectors/connect-kraftful/package.json +1 -1
  421. package/connectors/connect-kraftful/src/utils/config.ts +2 -2
  422. package/connectors/connect-lagrowthmachine/package.json +1 -1
  423. package/connectors/connect-lagrowthmachine/src/utils/config.ts +2 -2
  424. package/connectors/connect-lambdatest/package.json +1 -1
  425. package/connectors/connect-lambdatest/src/utils/config.ts +2 -2
  426. package/connectors/connect-landbot/package.json +1 -1
  427. package/connectors/connect-landbot/src/utils/config.ts +2 -2
  428. package/connectors/connect-laposta/package.json +1 -1
  429. package/connectors/connect-laposta/src/utils/config.ts +2 -2
  430. package/connectors/connect-launch27/package.json +1 -1
  431. package/connectors/connect-launch27/src/utils/config.ts +2 -2
  432. package/connectors/connect-launchdarkly/src/utils/config.ts +2 -2
  433. package/connectors/connect-ldap/package.json +1 -1
  434. package/connectors/connect-ldap/src/utils/config.ts +2 -2
  435. package/connectors/connect-leadboxer/package.json +1 -1
  436. package/connectors/connect-leadboxer/src/utils/config.ts +2 -2
  437. package/connectors/connect-leadpops/package.json +1 -1
  438. package/connectors/connect-leadpops/src/utils/config.ts +2 -2
  439. package/connectors/connect-lemlist/package.json +1 -1
  440. package/connectors/connect-lemlist/src/utils/config.ts +2 -2
  441. package/connectors/connect-lemonsqueezy/src/utils/config.ts +2 -2
  442. package/connectors/connect-leonardo/package.json +1 -1
  443. package/connectors/connect-leonardo/src/utils/config.ts +1 -1
  444. package/connectors/connect-lepton/package.json +1 -1
  445. package/connectors/connect-lepton/src/utils/config.ts +1 -1
  446. package/connectors/connect-letsenhance/package.json +1 -1
  447. package/connectors/connect-letsenhance/src/utils/config.ts +2 -2
  448. package/connectors/connect-libraria/package.json +1 -1
  449. package/connectors/connect-libraria/src/utils/config.ts +2 -2
  450. package/connectors/connect-lighthouse/package.json +1 -1
  451. package/connectors/connect-lighthouse/src/utils/config.ts +2 -2
  452. package/connectors/connect-limego/package.json +1 -1
  453. package/connectors/connect-limego/src/utils/config.ts +2 -2
  454. package/connectors/connect-line/package.json +1 -1
  455. package/connectors/connect-line/src/utils/config.ts +2 -2
  456. package/connectors/connect-linear/package.json +1 -5
  457. package/connectors/connect-linear/src/utils/config.ts +2 -2
  458. package/connectors/connect-lingvanex/package.json +1 -1
  459. package/connectors/connect-lingvanex/src/utils/config.ts +2 -2
  460. package/connectors/connect-linkedin/src/utils/config.ts +1 -1
  461. package/connectors/connect-linkish/src/utils/config.ts +2 -2
  462. package/connectors/connect-linode/src/utils/config.ts +2 -2
  463. package/connectors/connect-liveagent/src/utils/config.ts +2 -2
  464. package/connectors/connect-localazy/src/utils/config.ts +2 -2
  465. package/connectors/connect-loginradius/src/utils/config.ts +2 -2
  466. package/connectors/connect-lokalise/src/utils/config.ts +2 -2
  467. package/connectors/connect-lonescale/src/utils/config.ts +2 -2
  468. package/connectors/connect-lucidchart/src/utils/config.ts +2 -2
  469. package/connectors/connect-luma/src/utils/config.ts +1 -1
  470. package/connectors/connect-magento2/src/utils/config.ts +2 -2
  471. package/connectors/connect-mailcheck/src/utils/config.ts +2 -2
  472. package/connectors/connect-mailchimp/src/utils/config.ts +2 -2
  473. package/connectors/connect-mailerlite/src/utils/config.ts +2 -2
  474. package/connectors/connect-mailersend/src/utils/config.ts +2 -2
  475. package/connectors/connect-mailgun/src/utils/config.ts +2 -2
  476. package/connectors/connect-mailify/src/utils/config.ts +2 -2
  477. package/connectors/connect-mailjet/src/utils/config.ts +2 -2
  478. package/connectors/connect-mailmodo/src/utils/config.ts +2 -2
  479. package/connectors/connect-malcore/src/utils/config.ts +2 -2
  480. package/connectors/connect-mandrill/src/utils/config.ts +2 -2
  481. package/connectors/connect-marcomrobot/src/utils/config.ts +2 -2
  482. package/connectors/connect-marketingmasterio/src/utils/config.ts +2 -2
  483. package/connectors/connect-marketplacer/src/utils/config.ts +2 -2
  484. package/connectors/connect-marketstack/src/utils/config.ts +2 -2
  485. package/connectors/connect-mastodon/src/utils/config.ts +2 -2
  486. package/connectors/connect-matrix/src/utils/config.ts +2 -2
  487. package/connectors/connect-mattermost/src/utils/config.ts +2 -2
  488. package/connectors/connect-mautic/src/utils/config.ts +2 -2
  489. package/connectors/connect-mav/src/utils/config.ts +2 -2
  490. package/connectors/connect-maverick/src/utils/config.ts +2 -2
  491. package/connectors/connect-medium/src/utils/config.ts +2 -2
  492. package/connectors/connect-mem/src/utils/config.ts +2 -2
  493. package/connectors/connect-messagebird/src/utils/config.ts +2 -2
  494. package/connectors/connect-metabase/src/utils/config.ts +2 -2
  495. package/connectors/connect-mews/src/utils/config.ts +2 -2
  496. package/connectors/connect-microsoftazuremonitor/src/utils/config.ts +2 -2
  497. package/connectors/connect-microsoftdynamics365businesscentralapi/src/utils/config.ts +2 -2
  498. package/connectors/connect-microsoftdynamicscrm/src/utils/config.ts +2 -2
  499. package/connectors/connect-microsoftentraid/src/utils/config.ts +2 -2
  500. package/connectors/connect-microsoftentraidazureactivedirectory/src/utils/config.ts +2 -2
  501. package/connectors/connect-microsoftexcel/src/utils/config.ts +2 -2
  502. package/connectors/connect-microsoftgraphsecurity/src/utils/config.ts +2 -2
  503. package/connectors/connect-microsoftonedrive/src/utils/config.ts +2 -2
  504. package/connectors/connect-microsoftoutlook/src/utils/config.ts +2 -2
  505. package/connectors/connect-microsoftsharepoint/package.json +1 -1
  506. package/connectors/connect-microsoftsharepoint/src/utils/config.ts +2 -2
  507. package/connectors/connect-microsoftsql/package.json +1 -1
  508. package/connectors/connect-microsoftsql/src/utils/config.ts +2 -2
  509. package/connectors/connect-microsoftteams/package.json +1 -1
  510. package/connectors/connect-microsoftteams/src/utils/config.ts +2 -2
  511. package/connectors/connect-microsoftteamsadmin/package.json +1 -1
  512. package/connectors/connect-microsoftteamsadmin/src/utils/config.ts +2 -2
  513. package/connectors/connect-microsofttodo/package.json +1 -1
  514. package/connectors/connect-microsofttodo/src/utils/config.ts +2 -2
  515. package/connectors/connect-miestro/package.json +1 -1
  516. package/connectors/connect-miestro/src/utils/config.ts +2 -2
  517. package/connectors/connect-mindee/package.json +1 -1
  518. package/connectors/connect-mindee/src/utils/config.ts +2 -2
  519. package/connectors/connect-miro/src/utils/config.ts +2 -2
  520. package/connectors/connect-misp/package.json +1 -1
  521. package/connectors/connect-misp/src/utils/config.ts +2 -2
  522. package/connectors/connect-missive/package.json +1 -1
  523. package/connectors/connect-missive/src/utils/config.ts +2 -2
  524. package/connectors/connect-mist/package.json +1 -1
  525. package/connectors/connect-mist/src/utils/config.ts +2 -2
  526. package/connectors/connect-mocean/src/utils/config.ts +2 -2
  527. package/connectors/connect-modal/src/utils/config.ts +1 -1
  528. package/connectors/connect-monday/src/utils/config.ts +2 -2
  529. package/connectors/connect-mongodb/src/utils/config.ts +2 -2
  530. package/connectors/connect-monicacrm/src/utils/config.ts +2 -2
  531. package/connectors/connect-moonclerk/src/utils/config.ts +2 -2
  532. package/connectors/connect-moonmail/src/utils/config.ts +2 -2
  533. package/connectors/connect-morph/src/utils/config.ts +2 -2
  534. package/connectors/connect-mqtt/src/utils/config.ts +2 -2
  535. package/connectors/connect-msg91/src/utils/config.ts +2 -2
  536. package/connectors/connect-mubert/src/utils/config.ts +1 -1
  537. package/connectors/connect-murf/src/utils/config.ts +1 -1
  538. package/connectors/connect-mux/src/utils/config.ts +2 -2
  539. package/connectors/connect-mxtoolbox/src/utils/config.ts +2 -2
  540. package/connectors/connect-myaskai/src/utils/config.ts +2 -2
  541. package/connectors/connect-myphoner/src/utils/config.ts +2 -2
  542. package/connectors/connect-mysql/src/utils/config.ts +2 -2
  543. package/connectors/connect-nanonetsocr/src/utils/config.ts +2 -2
  544. package/connectors/connect-nasa/src/utils/config.ts +2 -2
  545. package/connectors/connect-ncscale/src/utils/config.ts +2 -2
  546. package/connectors/connect-netlify/src/utils/config.ts +2 -2
  547. package/connectors/connect-nextcloud/src/utils/config.ts +2 -2
  548. package/connectors/connect-nightfallai/src/utils/config.ts +2 -2
  549. package/connectors/connect-ninox/src/utils/config.ts +2 -2
  550. package/connectors/connect-nmkr/src/utils/config.ts +2 -2
  551. package/connectors/connect-nocodb/src/utils/config.ts +2 -2
  552. package/connectors/connect-notion/package.json +1 -5
  553. package/connectors/connect-npm/src/utils/config.ts +2 -2
  554. package/connectors/connect-nuclia/src/utils/config.ts +2 -2
  555. package/connectors/connect-nusiiproposals/src/utils/config.ts +2 -2
  556. package/connectors/connect-nyckel/src/utils/config.ts +2 -2
  557. package/connectors/connect-nyota/src/utils/config.ts +2 -2
  558. package/connectors/connect-occasion/src/utils/config.ts +2 -2
  559. package/connectors/connect-ocrspace/src/utils/config.ts +2 -2
  560. package/connectors/connect-octoai/src/utils/config.ts +1 -1
  561. package/connectors/connect-odoo/src/utils/config.ts +2 -2
  562. package/connectors/connect-offalerts/src/utils/config.ts +2 -2
  563. package/connectors/connect-okta/src/utils/config.ts +2 -2
  564. package/connectors/connect-ollama/src/utils/config.ts +2 -2
  565. package/connectors/connect-omeda/src/utils/config.ts +2 -2
  566. package/connectors/connect-omniconvert/src/utils/config.ts +2 -2
  567. package/connectors/connect-omnimind/src/utils/config.ts +2 -2
  568. package/connectors/connect-on2air/src/utils/config.ts +2 -2
  569. package/connectors/connect-oneai/src/utils/config.ts +2 -2
  570. package/connectors/connect-onesimpleapi/src/utils/config.ts +2 -2
  571. package/connectors/connect-onfleet/src/utils/config.ts +2 -2
  572. package/connectors/connect-opencti/src/utils/config.ts +2 -2
  573. package/connectors/connect-openthesaurus/src/utils/config.ts +2 -2
  574. package/connectors/connect-opnformerlyomise/src/utils/config.ts +2 -2
  575. package/connectors/connect-oracledatabase/src/utils/config.ts +2 -2
  576. package/connectors/connect-orbit/src/utils/config.ts +2 -2
  577. package/connectors/connect-orderdesk/src/utils/config.ts +2 -2
  578. package/connectors/connect-ortto/src/utils/config.ts +2 -2
  579. package/connectors/connect-oura/src/utils/config.ts +2 -2
  580. package/connectors/connect-paddle/src/utils/config.ts +2 -2
  581. package/connectors/connect-pagerduty/src/utils/config.ts +2 -2
  582. package/connectors/connect-paperform/src/utils/config.ts +2 -2
  583. package/connectors/connect-papyrs/src/utils/config.ts +2 -2
  584. package/connectors/connect-parsehub/src/utils/config.ts +2 -2
  585. package/connectors/connect-parseprompt/src/utils/config.ts +2 -2
  586. package/connectors/connect-passcreator/src/utils/config.ts +2 -2
  587. package/connectors/connect-passslot/src/utils/config.ts +2 -2
  588. package/connectors/connect-patentsview/src/utils/config.ts +2 -2
  589. package/connectors/connect-patreon/src/utils/config.ts +2 -2
  590. package/connectors/connect-paymo/src/utils/config.ts +2 -2
  591. package/connectors/connect-paypal/src/utils/config.ts +1 -1
  592. package/connectors/connect-peekalink/src/utils/config.ts +2 -2
  593. package/connectors/connect-perplexity/src/utils/config.ts +2 -2
  594. package/connectors/connect-persio/src/utils/config.ts +2 -2
  595. package/connectors/connect-personalai/package.json +1 -1
  596. package/connectors/connect-personalai/src/utils/config.ts +2 -2
  597. package/connectors/connect-phantombuster/package.json +1 -1
  598. package/connectors/connect-phantombuster/src/utils/config.ts +2 -2
  599. package/connectors/connect-philipshue/package.json +1 -1
  600. package/connectors/connect-philipshue/src/utils/config.ts +2 -2
  601. package/connectors/connect-phrase/package.json +1 -1
  602. package/connectors/connect-phrase/src/utils/config.ts +2 -2
  603. package/connectors/connect-pika/package.json +1 -1
  604. package/connectors/connect-pika/src/utils/config.ts +1 -1
  605. package/connectors/connect-pinata/package.json +1 -1
  606. package/connectors/connect-pinata/src/utils/config.ts +2 -2
  607. package/connectors/connect-pinboard/src/utils/config.ts +2 -2
  608. package/connectors/connect-pinterest/src/utils/config.ts +1 -1
  609. package/connectors/connect-pipedrive/src/utils/config.ts +2 -2
  610. package/connectors/connect-pipefy/package.json +1 -1
  611. package/connectors/connect-pipefy/src/utils/config.ts +2 -2
  612. package/connectors/connect-pirateweather/package.json +1 -1
  613. package/connectors/connect-pirateweather/src/utils/config.ts +2 -2
  614. package/connectors/connect-pitchly/package.json +1 -1
  615. package/connectors/connect-pitchly/src/utils/config.ts +2 -2
  616. package/connectors/connect-pivotaltracker/package.json +1 -1
  617. package/connectors/connect-pivotaltracker/src/utils/config.ts +2 -2
  618. package/connectors/connect-plaid/src/utils/config.ts +1 -1
  619. package/connectors/connect-planviewleankit/src/utils/config.ts +2 -2
  620. package/connectors/connect-planyoonlinebooking/src/utils/config.ts +2 -2
  621. package/connectors/connect-platformly/src/utils/config.ts +2 -2
  622. package/connectors/connect-playht/src/utils/config.ts +1 -1
  623. package/connectors/connect-plecto/src/utils/config.ts +2 -2
  624. package/connectors/connect-plivo/src/utils/config.ts +2 -2
  625. package/connectors/connect-postgres/src/utils/config.ts +2 -2
  626. package/connectors/connect-posthog/src/utils/config.ts +2 -2
  627. package/connectors/connect-practitest/src/utils/config.ts +2 -2
  628. package/connectors/connect-predisai/src/utils/config.ts +2 -2
  629. package/connectors/connect-prodia/src/utils/config.ts +2 -2
  630. package/connectors/connect-producthunt/src/utils/config.ts +2 -2
  631. package/connectors/connect-profitwell/src/utils/config.ts +2 -2
  632. package/connectors/connect-projectbubbleproprofsproject/src/utils/config.ts +2 -2
  633. package/connectors/connect-prompthub/src/utils/config.ts +2 -2
  634. package/connectors/connect-prospeai/src/utils/config.ts +2 -2
  635. package/connectors/connect-pulsetic/src/utils/config.ts +2 -2
  636. package/connectors/connect-pushbullet/src/utils/config.ts +2 -2
  637. package/connectors/connect-pushcut/src/utils/config.ts +2 -2
  638. package/connectors/connect-pusher/src/utils/config.ts +2 -2
  639. package/connectors/connect-pushover/src/utils/config.ts +2 -2
  640. package/connectors/connect-qradar/src/utils/config.ts +2 -2
  641. package/connectors/connect-qualaroo/src/utils/config.ts +2 -2
  642. package/connectors/connect-qualys/src/utils/config.ts +2 -2
  643. package/connectors/connect-quentn/src/utils/config.ts +2 -2
  644. package/connectors/connect-questdb/src/utils/config.ts +2 -2
  645. package/connectors/connect-quickbase/src/utils/config.ts +2 -2
  646. package/connectors/connect-quickbooksonline/src/utils/config.ts +2 -2
  647. package/connectors/connect-quickchart/src/utils/config.ts +2 -2
  648. package/connectors/connect-quintadb/src/utils/config.ts +2 -2
  649. package/connectors/connect-rabbitmq/src/utils/config.ts +2 -2
  650. package/connectors/connect-radar/src/utils/config.ts +2 -2
  651. package/connectors/connect-raindrop/src/utils/config.ts +2 -2
  652. package/connectors/connect-rapid7insightvm/src/utils/config.ts +2 -2
  653. package/connectors/connect-raventools/src/utils/config.ts +2 -2
  654. package/connectors/connect-rawgvideogamesdatabase/src/utils/config.ts +2 -2
  655. package/connectors/connect-rdstationcrm/src/utils/config.ts +2 -2
  656. package/connectors/connect-readai/src/utils/config.ts +2 -2
  657. package/connectors/connect-realphonevalidation/src/utils/config.ts +2 -2
  658. package/connectors/connect-recharge/src/utils/config.ts +2 -2
  659. package/connectors/connect-recordedfuture/src/utils/config.ts +2 -2
  660. package/connectors/connect-redash/src/utils/config.ts +2 -2
  661. package/connectors/connect-redis/src/utils/config.ts +2 -2
  662. package/connectors/connect-relevanceai/src/utils/config.ts +2 -2
  663. package/connectors/connect-relinkurlshortener/src/utils/config.ts +2 -2
  664. package/connectors/connect-relysia/src/utils/config.ts +2 -2
  665. package/connectors/connect-replicate/src/utils/config.ts +1 -1
  666. package/connectors/connect-reply/src/utils/config.ts +2 -2
  667. package/connectors/connect-replyio/src/utils/config.ts +2 -2
  668. package/connectors/connect-resemble/src/utils/config.ts +1 -1
  669. package/connectors/connect-retable/src/utils/config.ts +2 -2
  670. package/connectors/connect-reversecontact/src/utils/config.ts +2 -2
  671. package/connectors/connect-rewardful/src/utils/config.ts +2 -2
  672. package/connectors/connect-ritekit/src/utils/config.ts +2 -2
  673. package/connectors/connect-roboflow/src/utils/config.ts +2 -2
  674. package/connectors/connect-robolytix/src/utils/config.ts +2 -2
  675. package/connectors/connect-roboresponseai/src/utils/config.ts +2 -2
  676. package/connectors/connect-rocketchat/src/utils/config.ts +2 -2
  677. package/connectors/connect-rollbar/src/utils/config.ts +2 -2
  678. package/connectors/connect-rootly/src/utils/config.ts +2 -2
  679. package/connectors/connect-route4me/src/utils/config.ts +2 -2
  680. package/connectors/connect-rundeck/src/utils/config.ts +2 -2
  681. package/connectors/connect-runpod/src/utils/config.ts +1 -1
  682. package/connectors/connect-runway/src/utils/config.ts +1 -1
  683. package/connectors/connect-s3/src/utils/config.ts +2 -2
  684. package/connectors/connect-salesforce/src/utils/config.ts +2 -2
  685. package/connectors/connect-salesmaa/src/utils/config.ts +2 -2
  686. package/connectors/connect-salesmate/src/utils/config.ts +2 -2
  687. package/connectors/connect-salesmsg/src/utils/config.ts +2 -2
  688. package/connectors/connect-salesrocks/package.json +1 -1
  689. package/connectors/connect-salesrocks/src/utils/config.ts +2 -2
  690. package/connectors/connect-salessimplify/package.json +1 -1
  691. package/connectors/connect-salessimplify/src/utils/config.ts +2 -2
  692. package/connectors/connect-samsungsmartthings/package.json +1 -1
  693. package/connectors/connect-samsungsmartthings/src/utils/config.ts +2 -2
  694. package/connectors/connect-scrapeitcloud/package.json +1 -1
  695. package/connectors/connect-scrapeitcloud/src/utils/config.ts +2 -2
  696. package/connectors/connect-scrapeninja/package.json +1 -1
  697. package/connectors/connect-scrapeninja/src/utils/config.ts +2 -2
  698. package/connectors/connect-screenshotone/package.json +1 -1
  699. package/connectors/connect-screenshotone/src/utils/config.ts +2 -2
  700. package/connectors/connect-seamlessai/package.json +1 -1
  701. package/connectors/connect-seamlessai/src/utils/config.ts +2 -2
  702. package/connectors/connect-searchandsave/package.json +1 -1
  703. package/connectors/connect-searchandsave/src/utils/config.ts +2 -2
  704. package/connectors/connect-searxng/package.json +1 -1
  705. package/connectors/connect-searxng/src/utils/config.ts +2 -2
  706. package/connectors/connect-seatable/package.json +1 -1
  707. package/connectors/connect-seatable/src/utils/config.ts +2 -2
  708. package/connectors/connect-securityscorecard/src/utils/config.ts +2 -2
  709. package/connectors/connect-segment/src/utils/config.ts +2 -2
  710. package/connectors/connect-sekoia/src/utils/config.ts +2 -2
  711. package/connectors/connect-sellix/src/utils/config.ts +2 -2
  712. package/connectors/connect-semblyai/src/utils/config.ts +2 -2
  713. package/connectors/connect-sendgrid/src/utils/config.ts +2 -2
  714. package/connectors/connect-sendy/src/utils/config.ts +2 -2
  715. package/connectors/connect-servicenow/src/utils/config.ts +2 -2
  716. package/connectors/connect-sharlyai/src/utils/config.ts +2 -2
  717. package/connectors/connect-shiphero/src/utils/config.ts +2 -2
  718. package/connectors/connect-shipstation/src/utils/config.ts +2 -2
  719. package/connectors/connect-shortio/src/utils/config.ts +2 -2
  720. package/connectors/connect-shuffler/src/utils/config.ts +2 -2
  721. package/connectors/connect-sierrainteractive/src/utils/config.ts +2 -2
  722. package/connectors/connect-sifter/src/utils/config.ts +2 -2
  723. package/connectors/connect-signaturit/src/utils/config.ts +2 -2
  724. package/connectors/connect-signl4/src/utils/config.ts +2 -2
  725. package/connectors/connect-simpleem/src/utils/config.ts +2 -2
  726. package/connectors/connect-simplehash/src/utils/config.ts +2 -2
  727. package/connectors/connect-simplekpi/src/utils/config.ts +2 -2
  728. package/connectors/connect-simplelocalize/src/utils/config.ts +2 -2
  729. package/connectors/connect-simplero/src/utils/config.ts +2 -2
  730. package/connectors/connect-simpletexting/src/utils/config.ts +2 -2
  731. package/connectors/connect-sitecreatorio/src/utils/config.ts +2 -2
  732. package/connectors/connect-sitespeakai/src/utils/config.ts +2 -2
  733. package/connectors/connect-slack/package.json +1 -5
  734. package/connectors/connect-slack/src/utils/config.ts +2 -2
  735. package/connectors/connect-smaily/src/utils/config.ts +2 -2
  736. package/connectors/connect-smartreach/src/utils/config.ts +2 -2
  737. package/connectors/connect-smartsuite/src/utils/config.ts +2 -2
  738. package/connectors/connect-sms77/src/utils/config.ts +2 -2
  739. package/connectors/connect-smsit/src/utils/config.ts +2 -2
  740. package/connectors/connect-smsmagic/src/utils/config.ts +2 -2
  741. package/connectors/connect-snapdocs/src/utils/config.ts +2 -2
  742. package/connectors/connect-snatchbot/src/utils/config.ts +2 -2
  743. package/connectors/connect-snipcart/src/utils/config.ts +2 -2
  744. package/connectors/connect-snowflake/src/utils/config.ts +2 -2
  745. package/connectors/connect-solvedata/src/utils/config.ts +2 -2
  746. package/connectors/connect-specter/src/utils/config.ts +2 -2
  747. package/connectors/connect-speechify/src/utils/config.ts +1 -1
  748. package/connectors/connect-spike/src/utils/config.ts +2 -2
  749. package/connectors/connect-splunk/src/utils/config.ts +2 -2
  750. package/connectors/connect-spondyr/src/utils/config.ts +2 -2
  751. package/connectors/connect-spontit/src/utils/config.ts +2 -2
  752. package/connectors/connect-sportsdata/src/utils/config.ts +2 -2
  753. package/connectors/connect-spotify/src/utils/config.ts +2 -2
  754. package/connectors/connect-spydra/src/utils/config.ts +2 -2
  755. package/connectors/connect-square/src/utils/config.ts +2 -2
  756. package/connectors/connect-sslmatecertspotterapi/src/utils/config.ts +2 -2
  757. package/connectors/connect-stackby/src/utils/config.ts +2 -2
  758. package/connectors/connect-stammerai/src/utils/config.ts +2 -2
  759. package/connectors/connect-starton/src/utils/config.ts +2 -2
  760. package/connectors/connect-statuscake/src/utils/config.ts +2 -2
  761. package/connectors/connect-storyblok/src/utils/config.ts +2 -2
  762. package/connectors/connect-strapi/src/utils/config.ts +2 -2
  763. package/connectors/connect-strava/src/utils/config.ts +2 -2
  764. package/connectors/connect-studiobyai21labs/src/utils/config.ts +2 -2
  765. package/connectors/connect-suitedash/src/utils/config.ts +2 -2
  766. package/connectors/connect-suno/src/utils/config.ts +1 -1
  767. package/connectors/connect-supabase/src/utils/config.ts +2 -2
  768. package/connectors/connect-supernormal/src/utils/config.ts +2 -2
  769. package/connectors/connect-superpowered/src/utils/config.ts +2 -2
  770. package/connectors/connect-supportivekoala/src/utils/config.ts +2 -2
  771. package/connectors/connect-surveysparrow/src/utils/config.ts +2 -2
  772. package/connectors/connect-survicate/src/utils/config.ts +2 -2
  773. package/connectors/connect-swagup/src/utils/config.ts +2 -2
  774. package/connectors/connect-switchboard/src/utils/config.ts +2 -2
  775. package/connectors/connect-syncly/package.json +1 -1
  776. package/connectors/connect-syncly/src/utils/config.ts +2 -2
  777. package/connectors/connect-syncromsp/package.json +1 -1
  778. package/connectors/connect-syncromsp/src/utils/config.ts +2 -2
  779. package/connectors/connect-synthesia/package.json +1 -1
  780. package/connectors/connect-synthesia/src/utils/config.ts +2 -2
  781. package/connectors/connect-taiga/package.json +1 -1
  782. package/connectors/connect-taiga/src/utils/config.ts +2 -2
  783. package/connectors/connect-talentlms/package.json +1 -1
  784. package/connectors/connect-talentlms/src/utils/config.ts +2 -2
  785. package/connectors/connect-talknotes/package.json +1 -1
  786. package/connectors/connect-talknotes/src/utils/config.ts +2 -2
  787. package/connectors/connect-tapfiliate/package.json +1 -1
  788. package/connectors/connect-tapfiliate/src/utils/config.ts +2 -2
  789. package/connectors/connect-tdameritrade/package.json +1 -1
  790. package/connectors/connect-tdameritrade/src/utils/config.ts +2 -2
  791. package/connectors/connect-teachable/package.json +1 -1
  792. package/connectors/connect-teachable/src/utils/config.ts +2 -2
  793. package/connectors/connect-teamdeck/package.json +1 -1
  794. package/connectors/connect-teamdeck/src/utils/config.ts +2 -2
  795. package/connectors/connect-teamgate/src/utils/config.ts +2 -2
  796. package/connectors/connect-teamup/src/utils/config.ts +2 -2
  797. package/connectors/connect-teknoir/src/utils/config.ts +2 -2
  798. package/connectors/connect-telegram/package.json +1 -5
  799. package/connectors/connect-testmonitor/src/utils/config.ts +2 -2
  800. package/connectors/connect-textcortexai/src/utils/config.ts +2 -2
  801. package/connectors/connect-textgain/src/utils/config.ts +2 -2
  802. package/connectors/connect-textkit/src/utils/config.ts +2 -2
  803. package/connectors/connect-textmagic/src/utils/config.ts +2 -2
  804. package/connectors/connect-thankster/src/utils/config.ts +2 -2
  805. package/connectors/connect-thecustomerfactor/src/utils/config.ts +2 -2
  806. package/connectors/connect-thehive/src/utils/config.ts +2 -2
  807. package/connectors/connect-thehive5/src/utils/config.ts +2 -2
  808. package/connectors/connect-theleap/src/utils/config.ts +2 -2
  809. package/connectors/connect-thoughtfulgpt/src/utils/config.ts +2 -2
  810. package/connectors/connect-thrivecart/src/utils/config.ts +2 -2
  811. package/connectors/connect-tidbcloud/src/utils/config.ts +2 -2
  812. package/connectors/connect-tierion/src/utils/config.ts +2 -2
  813. package/connectors/connect-tilda/src/utils/config.ts +2 -2
  814. package/connectors/connect-timescaledb/src/utils/config.ts +2 -2
  815. package/connectors/connect-timetonic/src/utils/config.ts +2 -2
  816. package/connectors/connect-tinyurl/src/utils/config.ts +2 -2
  817. package/connectors/connect-tisanelabs/src/utils/config.ts +2 -2
  818. package/connectors/connect-todoist/src/utils/config.ts +1 -1
  819. package/connectors/connect-together/src/utils/config.ts +1 -1
  820. package/connectors/connect-tokenmetrics/src/utils/config.ts +2 -2
  821. package/connectors/connect-toket/src/utils/config.ts +2 -2
  822. package/connectors/connect-totango/src/utils/config.ts +2 -2
  823. package/connectors/connect-trackvia/src/utils/config.ts +2 -2
  824. package/connectors/connect-transifex/src/utils/config.ts +2 -2
  825. package/connectors/connect-travisci/src/utils/config.ts +2 -2
  826. package/connectors/connect-trellixepo/src/utils/config.ts +2 -2
  827. package/connectors/connect-trello/src/utils/config.ts +2 -2
  828. package/connectors/connect-trengo/src/utils/config.ts +2 -2
  829. package/connectors/connect-trevorio/src/utils/config.ts +2 -2
  830. package/connectors/connect-turbohire/src/utils/config.ts +2 -2
  831. package/connectors/connect-tuskr/src/utils/config.ts +2 -2
  832. package/connectors/connect-tuulio/src/utils/config.ts +2 -2
  833. package/connectors/connect-twake/src/utils/config.ts +2 -2
  834. package/connectors/connect-twist/src/utils/config.ts +2 -2
  835. package/connectors/connect-udio/src/utils/config.ts +1 -1
  836. package/connectors/connect-unbounce/src/utils/config.ts +2 -2
  837. package/connectors/connect-unisender/src/utils/config.ts +2 -2
  838. package/connectors/connect-unleashedsoftware/src/utils/config.ts +2 -2
  839. package/connectors/connect-upkeep/src/utils/config.ts +2 -2
  840. package/connectors/connect-uplead/src/utils/config.ts +2 -2
  841. package/connectors/connect-uproc/src/utils/config.ts +2 -2
  842. package/connectors/connect-uptimerobot/src/utils/config.ts +2 -2
  843. package/connectors/connect-uptimetoolbox/src/utils/config.ts +2 -2
  844. package/connectors/connect-urlscanio/src/utils/config.ts +2 -2
  845. package/connectors/connect-uservoice/src/utils/config.ts +2 -2
  846. package/connectors/connect-vercel/src/utils/config.ts +2 -2
  847. package/connectors/connect-verifalia/src/utils/config.ts +2 -2
  848. package/connectors/connect-vero/src/utils/config.ts +2 -2
  849. package/connectors/connect-vimeo/src/utils/config.ts +2 -2
  850. package/connectors/connect-virustotal/src/utils/config.ts +2 -2
  851. package/connectors/connect-vivifyscrum/package.json +1 -1
  852. package/connectors/connect-vivifyscrum/src/utils/config.ts +2 -2
  853. package/connectors/connect-voicit/package.json +1 -1
  854. package/connectors/connect-voicit/src/utils/config.ts +2 -2
  855. package/connectors/connect-vonage/src/utils/config.ts +2 -2
  856. package/connectors/connect-vowel/package.json +1 -1
  857. package/connectors/connect-vowel/src/utils/config.ts +2 -2
  858. package/connectors/connect-watchsignals/package.json +1 -1
  859. package/connectors/connect-watchsignals/src/utils/config.ts +2 -2
  860. package/connectors/connect-wavelineextract/package.json +1 -1
  861. package/connectors/connect-wavelineextract/src/utils/config.ts +2 -2
  862. package/connectors/connect-webexbycisco/package.json +1 -1
  863. package/connectors/connect-webexbycisco/src/utils/config.ts +2 -2
  864. package/connectors/connect-webinarjam/package.json +1 -1
  865. package/connectors/connect-webinarjam/src/utils/config.ts +2 -2
  866. package/connectors/connect-webscraperio/package.json +1 -1
  867. package/connectors/connect-webscraperio/src/utils/config.ts +2 -2
  868. package/connectors/connect-wekan/package.json +1 -1
  869. package/connectors/connect-wekan/src/utils/config.ts +2 -2
  870. package/connectors/connect-whal3s/package.json +1 -1
  871. package/connectors/connect-whal3s/src/utils/config.ts +2 -2
  872. package/connectors/connect-whatconverts/package.json +1 -1
  873. package/connectors/connect-whatconverts/src/utils/config.ts +2 -2
  874. package/connectors/connect-whatsapp/src/utils/config.ts +1 -1
  875. package/connectors/connect-wikipedia/package.json +1 -1
  876. package/connectors/connect-wikipedia/src/utils/config.ts +2 -2
  877. package/connectors/connect-wipo/package.json +1 -1
  878. package/connectors/connect-wipo/src/utils/config.ts +2 -2
  879. package/connectors/connect-wise/src/utils/config.ts +2 -2
  880. package/connectors/connect-wizychat/package.json +1 -1
  881. package/connectors/connect-wizychat/src/utils/config.ts +2 -2
  882. package/connectors/connect-wolframoralpha/package.json +1 -1
  883. package/connectors/connect-wolframoralpha/src/utils/config.ts +2 -2
  884. package/connectors/connect-wonderchat/package.json +1 -1
  885. package/connectors/connect-wonderchat/src/utils/config.ts +2 -2
  886. package/connectors/connect-wondercraft/package.json +1 -1
  887. package/connectors/connect-wondercraft/src/utils/config.ts +2 -2
  888. package/connectors/connect-woocommerce/package.json +1 -1
  889. package/connectors/connect-woocommerce/src/utils/config.ts +2 -2
  890. package/connectors/connect-woodpeckerco/package.json +1 -1
  891. package/connectors/connect-woodpeckerco/src/utils/config.ts +2 -2
  892. package/connectors/connect-wordpress/package.json +1 -1
  893. package/connectors/connect-wordpress/src/utils/config.ts +2 -2
  894. package/connectors/connect-workast/src/utils/config.ts +2 -2
  895. package/connectors/connect-workboard/src/utils/config.ts +2 -2
  896. package/connectors/connect-woxo/src/utils/config.ts +2 -2
  897. package/connectors/connect-writesonic/src/utils/config.ts +2 -2
  898. package/connectors/connect-wubookratechecker/src/utils/config.ts +2 -2
  899. package/connectors/connect-xata/src/utils/config.ts +2 -2
  900. package/connectors/connect-xero/src/utils/config.ts +2 -2
  901. package/connectors/connect-xtractly/src/utils/config.ts +2 -2
  902. package/connectors/connect-ybug/src/utils/config.ts +2 -2
  903. package/connectors/connect-ycode/src/utils/config.ts +2 -2
  904. package/connectors/connect-yodiz/src/utils/config.ts +2 -2
  905. package/connectors/connect-yourls/src/utils/config.ts +2 -2
  906. package/connectors/connect-zabbix/src/utils/config.ts +2 -2
  907. package/connectors/connect-zammad/src/utils/config.ts +2 -2
  908. package/connectors/connect-zendesk/src/utils/config.ts +4 -4
  909. package/connectors/connect-zenrows/src/utils/config.ts +2 -2
  910. package/connectors/connect-zohobooks/src/utils/config.ts +2 -2
  911. package/connectors/connect-zohocrm/src/utils/config.ts +2 -2
  912. package/connectors/connect-zohodesk/src/utils/config.ts +2 -2
  913. package/connectors/connect-zohoworkdrive/src/utils/config.ts +2 -2
  914. package/connectors/connect-zonkafeedback/src/utils/config.ts +2 -2
  915. package/connectors/connect-zscalerzia/src/utils/config.ts +2 -2
  916. package/connectors/connect-zulip/src/utils/config.ts +2 -2
  917. package/package.json +1 -1
  918. package/connectors/connect-gmail/src/api/attachments.ts +0 -143
  919. package/connectors/connect-gmail/src/api/bulk.ts +0 -661
  920. package/connectors/connect-gmail/src/api/client.ts +0 -131
  921. package/connectors/connect-gmail/src/api/drafts.ts +0 -198
  922. package/connectors/connect-gmail/src/api/export.ts +0 -312
  923. package/connectors/connect-gmail/src/api/filters.ts +0 -127
  924. package/connectors/connect-gmail/src/api/index.ts +0 -63
  925. package/connectors/connect-gmail/src/api/labels.ts +0 -123
  926. package/connectors/connect-gmail/src/api/messages.ts +0 -527
  927. package/connectors/connect-gmail/src/api/profile.ts +0 -72
  928. package/connectors/connect-gmail/src/api/threads.ts +0 -85
  929. package/connectors/connect-gmail/src/cli/index.ts +0 -2328
  930. package/connectors/connect-gmail/src/index.ts +0 -30
  931. package/connectors/connect-gmail/src/types/index.ts +0 -202
  932. package/connectors/connect-gmail/src/utils/auth.ts +0 -247
  933. package/connectors/connect-gmail/src/utils/config.ts +0 -466
  934. package/connectors/connect-gmail/src/utils/contacts.ts +0 -147
  935. package/connectors/connect-gmail/src/utils/markdown.ts +0 -119
  936. package/connectors/connect-gmail/src/utils/output.ts +0 -119
  937. package/connectors/connect-gmail/src/utils/settings.ts +0 -87
  938. package/connectors/connect-gmail/tsconfig.json +0 -16
@@ -1,2328 +0,0 @@
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
- import { existsSync, mkdirSync, writeFileSync } from 'fs';
50
- import { join, resolve } from 'path';
51
-
52
- const program = new Command();
53
-
54
- program
55
- .name('connect-gmail')
56
- .description('Gmail API connector CLI - Send, read, and manage Gmail with ease')
57
- .version('0.1.0')
58
- .option('-f, --format <format>', 'Output format (json, table, pretty)', 'pretty')
59
- .option('-p, --profile <profile>', 'Use a specific profile')
60
- .hook('preAction', (thisCommand) => {
61
- // Set profile override before any command runs
62
- const opts = thisCommand.opts();
63
- if (opts.profile) {
64
- if (!profileExists(opts.profile)) {
65
- error(`Profile "${opts.profile}" does not exist. Create it with "connect-gmail profiles create ${opts.profile}"`);
66
- process.exit(1);
67
- }
68
- setProfileOverride(opts.profile);
69
- }
70
- });
71
-
72
- // Helper to get output format
73
- function getFormat(cmd: Command): OutputFormat {
74
- const parent = cmd.parent;
75
- return (parent?.opts().format || 'pretty') as OutputFormat;
76
- }
77
-
78
- // Helper to check authentication
79
- function requireAuth(): Gmail {
80
- // isAuthenticated() checks for both accessToken and refreshToken.
81
- // If accessToken is missing/expired but refreshToken exists, the client's
82
- // getValidAccessToken() will handle the refresh automatically.
83
- const tokens = loadTokens();
84
- if (!tokens || (!tokens.accessToken && !tokens.refreshToken)) {
85
- error('Not authenticated. Run "connect-gmail auth login" first.');
86
- process.exit(1);
87
- }
88
- return Gmail.create();
89
- }
90
-
91
- // ============================================
92
- // Auth Commands
93
- // ============================================
94
- const authCmd = program
95
- .command('auth')
96
- .description('Authentication commands');
97
-
98
- authCmd
99
- .command('login')
100
- .description('Login to Gmail via OAuth2 (opens browser) - auto-creates profile from email')
101
- .action(async () => {
102
- const clientId = getClientId();
103
- const clientSecret = getClientSecret();
104
-
105
- if (!clientId || !clientSecret) {
106
- error('OAuth credentials not configured.');
107
- info('Run "connect-gmail config set-credentials <client-id> <client-secret>" first.');
108
- info('Or set GMAIL_CLIENT_ID and GMAIL_CLIENT_SECRET environment variables.');
109
- process.exit(1);
110
- }
111
-
112
- info('Starting OAuth2 authentication flow...');
113
- info('A browser window will open for you to authorize the application.');
114
-
115
- // Start callback server first
116
- const serverPromise = startCallbackServer();
117
-
118
- // Open browser to auth URL
119
- const authUrl = getAuthUrl();
120
- await open(authUrl);
121
-
122
- info('Waiting for authentication...');
123
-
124
- const result = await serverPromise;
125
-
126
- if (result.success) {
127
- success('Successfully authenticated!');
128
-
129
- // Get user profile and create/switch to profile named after email
130
- try {
131
- // Temporarily switch to default profile to avoid overwriting other profiles
132
- setProfileOverride('default');
133
-
134
- // Save tokens to default profile first so Gmail.create() can use them
135
- if (result.tokens) {
136
- saveTokens(result.tokens);
137
- }
138
-
139
- const gmail = Gmail.create();
140
- const profile = await gmail.profile.get();
141
- const email = profile.emailAddress;
142
-
143
- // Convert email to profile slug: user@example.com → andreihasnacom
144
- const profileSlug = email.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
145
-
146
- // Create profile if it doesn't exist
147
- if (!profileExists(profileSlug)) {
148
- createProfile(profileSlug);
149
- info(`Created profile: ${profileSlug}`);
150
- }
151
-
152
- // Switch to the profile and save credentials there
153
- setCurrentProfile(profileSlug);
154
- setProfileOverride(profileSlug);
155
-
156
- // Save tokens and email to the new profile
157
- setUserEmail(email);
158
-
159
- // Re-save tokens to the correct profile
160
- if (result.tokens) {
161
- saveTokens(result.tokens);
162
- }
163
-
164
- success(`Profile: ${profileSlug}`);
165
- info(`Email: ${email}`);
166
- } catch (err) {
167
- // Profile fetch failed but auth succeeded
168
- warn(`Could not auto-create profile: ${err}`);
169
- }
170
- } else {
171
- error(`Authentication failed: ${result.error}`);
172
- process.exit(1);
173
- }
174
- });
175
-
176
- authCmd
177
- .command('status')
178
- .description('Check authentication status')
179
- .action(async () => {
180
- if (isAuthenticated()) {
181
- const tokens = loadTokens();
182
- const email = getUserEmail();
183
- success('Authenticated');
184
- if (email) {
185
- info(`Email: ${email}`);
186
- }
187
- if (tokens) {
188
- const expiresIn = Math.max(0, Math.floor((tokens.expiresAt - Date.now()) / 1000 / 60));
189
- info(`Access token expires in: ${expiresIn} minutes`);
190
- info(`Has refresh token: ${tokens.refreshToken ? 'Yes' : 'No'}`);
191
- }
192
- } else {
193
- warn('Not authenticated');
194
- info('Run "connect-gmail auth login" to authenticate.');
195
- }
196
- });
197
-
198
- authCmd
199
- .command('logout')
200
- .description('Clear stored authentication tokens')
201
- .action(() => {
202
- clearConfig();
203
- success('Logged out successfully');
204
- });
205
-
206
- // ============================================
207
- // Config Commands
208
- // ============================================
209
- const configCmd = program
210
- .command('config')
211
- .description('Manage CLI configuration');
212
-
213
- configCmd
214
- .command('set-credentials <clientId> <clientSecret>')
215
- .description('Set OAuth2 client credentials')
216
- .action((clientId: string, clientSecret: string) => {
217
- setCredentials(clientId, clientSecret);
218
- success('OAuth credentials saved successfully');
219
- info(`Config stored in: ${getConfigDir()}`);
220
- });
221
-
222
- configCmd
223
- .command('set-name <name>')
224
- .description('Set your display name for sending emails (e.g., "John Doe")')
225
- .action((name: string) => {
226
- setUserName(name);
227
- success(`Display name set to: ${name}`);
228
- });
229
-
230
- configCmd
231
- .command('show')
232
- .description('Show current configuration')
233
- .action(() => {
234
- const clientId = getClientId();
235
- const clientSecret = getClientSecret();
236
- const email = getUserEmail();
237
- const name = getUserName();
238
- const tokens = loadTokens();
239
- const settings = loadSettings();
240
-
241
- info(`Config directory: ${getConfigDir()}`);
242
- info(`Client ID: ${clientId ? `${clientId.substring(0, 20)}...` : chalk.gray('not set')}`);
243
- info(`Client Secret: ${clientSecret ? '********' : chalk.gray('not set')}`);
244
- info(`Authenticated: ${isAuthenticated() ? chalk.green('Yes') : chalk.red('No')}`);
245
- if (email) {
246
- info(`Email: ${email}`);
247
- }
248
- if (name) {
249
- info(`Display Name: ${name}`);
250
- }
251
- if (tokens) {
252
- info(`Token expires: ${new Date(tokens.expiresAt).toLocaleString()}`);
253
- }
254
- info(`Markdown enabled: ${settings.markdownEnabled ? 'Yes' : 'No'}`);
255
- info(`Append signature: ${settings.appendSignature ? 'Yes' : 'No'}`);
256
- });
257
-
258
- configCmd
259
- .command('clear')
260
- .description('Clear all configuration and tokens')
261
- .action(() => {
262
- clearConfig();
263
- success('Configuration cleared');
264
- });
265
-
266
- // ============================================
267
- // Me Command (Gmail profile info)
268
- // ============================================
269
- program
270
- .command('me')
271
- .description('Get your Gmail profile information')
272
- .action(async () => {
273
- try {
274
- const gmail = requireAuth();
275
- const profile = await gmail.profile.get();
276
- print(profile, getFormat(program));
277
- } catch (err) {
278
- error(String(err));
279
- process.exit(1);
280
- }
281
- });
282
-
283
- // ============================================
284
- // Profiles Management Commands
285
- // ============================================
286
- const profilesCmd = program
287
- .command('profiles')
288
- .description('Manage multiple Gmail profiles');
289
-
290
- profilesCmd
291
- .command('list')
292
- .description('List all profiles')
293
- .action(() => {
294
- try {
295
- const profiles = listProfiles();
296
- const current = getCurrentProfile();
297
-
298
- if (profiles.length === 0) {
299
- info('No profiles found');
300
- return;
301
- }
302
-
303
- success(`${profiles.length} profile(s):`);
304
- for (const p of profiles) {
305
- if (p === current) {
306
- info(` ${chalk.green('→')} ${p} ${chalk.gray('(current)')}`);
307
- } else {
308
- info(` ${p}`);
309
- }
310
- }
311
- } catch (err) {
312
- error(String(err));
313
- process.exit(1);
314
- }
315
- });
316
-
317
- profilesCmd
318
- .command('current')
319
- .description('Show current profile')
320
- .action(() => {
321
- const current = getCurrentProfile();
322
- info(`Current profile: ${chalk.green(current)}`);
323
- info(`Config directory: ${getConfigDir()}`);
324
- });
325
-
326
- profilesCmd
327
- .command('create <name>')
328
- .description('Create a new profile')
329
- .action((name: string) => {
330
- try {
331
- createProfile(name);
332
- success(`Profile "${name}" created`);
333
- info(`Switch to it with: connect-gmail profiles switch ${name}`);
334
- } catch (err) {
335
- error(String(err));
336
- process.exit(1);
337
- }
338
- });
339
-
340
- profilesCmd
341
- .command('switch <name>')
342
- .alias('use')
343
- .description('Switch to a different profile')
344
- .action((name: string) => {
345
- try {
346
- setCurrentProfile(name);
347
- success(`Switched to profile "${name}"`);
348
- info(`Config directory: ${getConfigDir()}`);
349
-
350
- // Show auth status for the new profile
351
- if (isAuthenticated()) {
352
- const email = getUserEmail();
353
- if (email) {
354
- info(`Logged in as: ${email}`);
355
- }
356
- } else {
357
- warn('Profile not authenticated. Run "connect-gmail auth login"');
358
- }
359
- } catch (err) {
360
- error(String(err));
361
- process.exit(1);
362
- }
363
- });
364
-
365
- profilesCmd
366
- .command('delete <name>')
367
- .description('Delete a profile')
368
- .action((name: string) => {
369
- try {
370
- deleteProfile(name);
371
- success(`Profile "${name}" deleted`);
372
- } catch (err) {
373
- error(String(err));
374
- process.exit(1);
375
- }
376
- });
377
-
378
- profilesCmd
379
- .command('show')
380
- .description('Show all profiles with their status')
381
- .action(async () => {
382
- try {
383
- const profiles = listProfiles();
384
- const current = getCurrentProfile();
385
-
386
- if (profiles.length === 0) {
387
- info('No profiles found');
388
- return;
389
- }
390
-
391
- success(`${profiles.length} profile(s):\n`);
392
-
393
- for (const p of profiles) {
394
- // Temporarily switch to profile to check status
395
- setProfileOverride(p);
396
- const authenticated = isAuthenticated();
397
- const email = authenticated ? getUserEmail() : null;
398
- setProfileOverride(undefined);
399
-
400
- const isCurrent = p === current;
401
- const marker = isCurrent ? chalk.green('→') : ' ';
402
- const status = authenticated ? chalk.green('authenticated') : chalk.yellow('not authenticated');
403
- const emailStr = email ? chalk.gray(`(${email})`) : '';
404
- const currentStr = isCurrent ? chalk.gray(' [current]') : '';
405
-
406
- info(` ${marker} ${p}${currentStr}`);
407
- info(` Status: ${status} ${emailStr}`);
408
- }
409
- } catch (err) {
410
- error(String(err));
411
- process.exit(1);
412
- }
413
- });
414
-
415
- // ============================================
416
- // Messages Commands
417
- // ============================================
418
- const messagesCmd = program
419
- .command('messages')
420
- .description('Email message commands');
421
-
422
- messagesCmd
423
- .command('list')
424
- .description('List messages in your mailbox')
425
- .option('-n, --max <number>', 'Maximum messages to return', '10')
426
- .option('-q, --query <query>', 'Gmail search query (e.g., "is:unread", "from:someone@example.com")')
427
- .option('-l, --label <label>', 'Filter by label ID')
428
- .action(async (opts) => {
429
- try {
430
- const gmail = requireAuth();
431
- const result = await gmail.messages.list({
432
- maxResults: parseInt(opts.max),
433
- q: opts.query,
434
- labelIds: opts.label ? [opts.label] : undefined,
435
- });
436
-
437
- if (!result.messages || result.messages.length === 0) {
438
- info('No messages found');
439
- return;
440
- }
441
-
442
- success(`Found ${result.messages.length} messages:`);
443
-
444
- // Fetch details for each message
445
- const messages = await Promise.all(
446
- result.messages.slice(0, 10).map(async (m) => {
447
- const msg = await gmail.messages.get(m.id, 'metadata');
448
- const headers = msg.payload?.headers || [];
449
- const getHeader = (name: string) =>
450
- headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
451
-
452
- return {
453
- id: m.id,
454
- from: getHeader('From'),
455
- subject: getHeader('Subject'),
456
- date: getHeader('Date'),
457
- snippet: msg.snippet?.substring(0, 50) + '...',
458
- };
459
- })
460
- );
461
-
462
- print(messages, getFormat(messagesCmd));
463
- } catch (err) {
464
- error(String(err));
465
- process.exit(1);
466
- }
467
- });
468
-
469
- messagesCmd
470
- .command('read <messageId>')
471
- .alias('get')
472
- .description('Read a specific message')
473
- .option('--body', 'Include full message body')
474
- .option('--html', 'Show HTML body instead of plain text')
475
- .option('--structure', 'Show message MIME structure (for debugging)')
476
- .action(async (messageId: string, opts) => {
477
- try {
478
- const gmail = requireAuth();
479
- const message = await gmail.messages.get(messageId);
480
-
481
- const headers = message.payload?.headers || [];
482
- const getHeader = (name: string) =>
483
- headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
484
-
485
- // Extract body from message parts
486
- let body = '';
487
- if (opts.body && message.payload) {
488
- const targetType = opts.html ? 'text/html' : 'text/plain';
489
-
490
- // Helper to check MIME type (handles charset params like "text/html; charset=utf-8")
491
- const mimeMatches = (mimeType: string | undefined, target: string): boolean => {
492
- if (!mimeType) return false;
493
- const baseMime = mimeType.split(';')[0].trim().toLowerCase();
494
- return baseMime === target.toLowerCase();
495
- };
496
-
497
- // Collect all text parts from the message structure
498
- const collectTextParts = (part: typeof message.payload, results: Array<{mimeType: string, data: string}> = []): Array<{mimeType: string, data: string}> => {
499
- if (part.body?.data && part.mimeType) {
500
- const baseMime = part.mimeType.split(';')[0].trim().toLowerCase();
501
- if (baseMime.startsWith('text/')) {
502
- results.push({
503
- mimeType: baseMime,
504
- data: Buffer.from(part.body.data, 'base64url').toString('utf-8')
505
- });
506
- }
507
- }
508
- if (part.parts) {
509
- for (const p of part.parts) {
510
- collectTextParts(p, results);
511
- }
512
- }
513
- return results;
514
- };
515
-
516
- const textParts = collectTextParts(message.payload);
517
-
518
- // First, try to find exact target type
519
- const exactMatch = textParts.find(p => p.mimeType === targetType);
520
- if (exactMatch) {
521
- body = exactMatch.data;
522
- } else {
523
- // Fallback: if looking for text/plain but only text/html exists, use that
524
- // Or if looking for text/html but only text/plain exists, use that
525
- const altMatch = textParts.find(p => p.mimeType.startsWith('text/'));
526
- if (altMatch) {
527
- body = altMatch.data;
528
- }
529
- }
530
- }
531
-
532
- const output: Record<string, unknown> = {
533
- id: message.id,
534
- threadId: message.threadId,
535
- from: getHeader('From'),
536
- to: getHeader('To'),
537
- subject: getHeader('Subject'),
538
- date: getHeader('Date'),
539
- labels: message.labelIds,
540
- };
541
-
542
- if (opts.structure) {
543
- output.structure = gmail.messages.getMessageStructure(message);
544
- }
545
-
546
- if (opts.body) {
547
- output.body = body;
548
- } else if (!opts.structure) {
549
- output.snippet = message.snippet;
550
- }
551
-
552
- print(output, getFormat(messagesCmd));
553
- } catch (err) {
554
- error(String(err));
555
- process.exit(1);
556
- }
557
- });
558
-
559
- messagesCmd
560
- .command('send')
561
- .description('Send an email')
562
- .requiredOption('-t, --to <email>', 'Recipient email address')
563
- .requiredOption('-s, --subject <subject>', 'Email subject')
564
- .requiredOption('-b, --body <body>', 'Email body')
565
- .option('--cc <emails>', 'CC recipients (comma-separated)')
566
- .option('--bcc <emails>', 'BCC recipients (comma-separated)')
567
- .option('--html', 'Send as HTML email')
568
- .action(async (opts) => {
569
- try {
570
- const gmail = requireAuth();
571
- const result = await gmail.messages.send({
572
- to: opts.to,
573
- subject: opts.subject,
574
- body: opts.body,
575
- cc: opts.cc?.split(',').map((e: string) => e.trim()),
576
- bcc: opts.bcc?.split(',').map((e: string) => e.trim()),
577
- isHtml: opts.html,
578
- });
579
-
580
- success(`Email sent successfully!`);
581
- info(`Message ID: ${result.id}`);
582
- } catch (err) {
583
- error(String(err));
584
- process.exit(1);
585
- }
586
- });
587
-
588
- messagesCmd
589
- .command('trash <messageId>')
590
- .description('Move a message to trash')
591
- .action(async (messageId: string) => {
592
- try {
593
- const gmail = requireAuth();
594
- await gmail.messages.trash(messageId);
595
- success(`Message ${messageId} moved to trash`);
596
- } catch (err) {
597
- error(String(err));
598
- process.exit(1);
599
- }
600
- });
601
-
602
- messagesCmd
603
- .command('delete <messageId>')
604
- .description('Permanently delete a message')
605
- .action(async (messageId: string) => {
606
- try {
607
- const gmail = requireAuth();
608
- await gmail.messages.delete(messageId);
609
- success(`Message ${messageId} permanently deleted`);
610
- } catch (err) {
611
- error(String(err));
612
- process.exit(1);
613
- }
614
- });
615
-
616
- messagesCmd
617
- .command('mark-read <messageId>')
618
- .description('Mark a message as read')
619
- .action(async (messageId: string) => {
620
- try {
621
- const gmail = requireAuth();
622
- await gmail.messages.markAsRead(messageId);
623
- success(`Message ${messageId} marked as read`);
624
- } catch (err) {
625
- error(String(err));
626
- process.exit(1);
627
- }
628
- });
629
-
630
- messagesCmd
631
- .command('mark-unread <messageId>')
632
- .description('Mark a message as unread')
633
- .action(async (messageId: string) => {
634
- try {
635
- const gmail = requireAuth();
636
- await gmail.messages.markAsUnread(messageId);
637
- success(`Message ${messageId} marked as unread`);
638
- } catch (err) {
639
- error(String(err));
640
- process.exit(1);
641
- }
642
- });
643
-
644
- messagesCmd
645
- .command('star <messageId>')
646
- .description('Star a message')
647
- .action(async (messageId: string) => {
648
- try {
649
- const gmail = requireAuth();
650
- await gmail.messages.star(messageId);
651
- success(`Message ${messageId} starred`);
652
- } catch (err) {
653
- error(String(err));
654
- process.exit(1);
655
- }
656
- });
657
-
658
- messagesCmd
659
- .command('archive <messageId>')
660
- .description('Archive a message')
661
- .action(async (messageId: string) => {
662
- try {
663
- const gmail = requireAuth();
664
- await gmail.messages.archive(messageId);
665
- success(`Message ${messageId} archived`);
666
- } catch (err) {
667
- error(String(err));
668
- process.exit(1);
669
- }
670
- });
671
-
672
- messagesCmd
673
- .command('reply <messageId>')
674
- .description('Reply to a message (stays in the same thread)')
675
- .requiredOption('-b, --body <body>', 'Reply body (supports markdown)')
676
- .option('--cc <emails>', 'CC recipients (comma-separated)')
677
- .option('--html', 'Send as HTML email')
678
- .action(async (messageId: string, opts) => {
679
- try {
680
- const gmail = requireAuth();
681
- const result = await gmail.messages.reply(messageId, {
682
- body: opts.body,
683
- cc: opts.cc?.split(',').map((e: string) => e.trim()),
684
- isHtml: opts.html,
685
- });
686
-
687
- success(`Reply sent!`);
688
- info(`Message ID: ${result.id}`);
689
- info(`Thread ID: ${result.threadId}`);
690
- } catch (err) {
691
- error(String(err));
692
- process.exit(1);
693
- }
694
- });
695
-
696
- messagesCmd
697
- .command('add-label <messageId> <labelId>')
698
- .description('Add a label to a message')
699
- .action(async (messageId: string, labelId: string) => {
700
- try {
701
- const gmail = requireAuth();
702
- await gmail.messages.addLabel(messageId, labelId);
703
- success(`Label ${labelId} added to message ${messageId}`);
704
- } catch (err) {
705
- error(String(err));
706
- process.exit(1);
707
- }
708
- });
709
-
710
- messagesCmd
711
- .command('remove-label <messageId> <labelId>')
712
- .description('Remove a label from a message')
713
- .action(async (messageId: string, labelId: string) => {
714
- try {
715
- const gmail = requireAuth();
716
- await gmail.messages.removeLabel(messageId, labelId);
717
- success(`Label ${labelId} removed from message ${messageId}`);
718
- } catch (err) {
719
- error(String(err));
720
- process.exit(1);
721
- }
722
- });
723
-
724
- // ============================================
725
- // Labels Commands
726
- // ============================================
727
- const labelsCmd = program
728
- .command('labels')
729
- .description('Label management commands');
730
-
731
- labelsCmd
732
- .command('list')
733
- .description('List all labels')
734
- .action(async () => {
735
- try {
736
- const gmail = requireAuth();
737
- const result = await gmail.labels.list();
738
-
739
- if (!result.labels || result.labels.length === 0) {
740
- info('No labels found');
741
- return;
742
- }
743
-
744
- success(`Found ${result.labels.length} labels:`);
745
-
746
- const labels = result.labels.map(l => ({
747
- id: l.id,
748
- name: l.name,
749
- type: l.type,
750
- messagesTotal: l.messagesTotal,
751
- messagesUnread: l.messagesUnread,
752
- ...(l.color ? { backgroundColor: l.color.backgroundColor, textColor: l.color.textColor } : {}),
753
- }));
754
-
755
- print(labels, getFormat(labelsCmd));
756
- } catch (err) {
757
- error(String(err));
758
- process.exit(1);
759
- }
760
- });
761
-
762
- labelsCmd
763
- .command('create <name>')
764
- .description('Create a new label')
765
- .option('--bg-color <hex>', 'Background color (e.g. #16a765)')
766
- .option('--text-color <hex>', 'Text color (e.g. #ffffff)')
767
- .action(async (name: string, opts: { bgColor?: string; textColor?: string }) => {
768
- try {
769
- const gmail = requireAuth();
770
- const label = await gmail.labels.create({
771
- name,
772
- backgroundColor: opts.bgColor,
773
- textColor: opts.textColor,
774
- });
775
- success(`Label "${name}" created`);
776
- info(`Label ID: ${label.id}`);
777
- if (label.color) {
778
- info(`Color: bg=${label.color.backgroundColor} text=${label.color.textColor}`);
779
- }
780
- } catch (err) {
781
- error(String(err));
782
- process.exit(1);
783
- }
784
- });
785
-
786
- labelsCmd
787
- .command('update <labelId>')
788
- .description('Update a label name and/or color')
789
- .option('--name <name>', 'New label name')
790
- .option('--bg-color <hex>', 'Background color (e.g. #16a765)')
791
- .option('--text-color <hex>', 'Text color (e.g. #ffffff)')
792
- .action(async (labelId: string, opts: { name?: string; bgColor?: string; textColor?: string }) => {
793
- try {
794
- if (!opts.name && !opts.bgColor && !opts.textColor) {
795
- error('At least one of --name, --bg-color, or --text-color is required');
796
- process.exit(1);
797
- }
798
- const gmail = requireAuth();
799
- const label = await gmail.labels.update(labelId, {
800
- name: opts.name,
801
- backgroundColor: opts.bgColor,
802
- textColor: opts.textColor,
803
- });
804
- success(`Label ${labelId} updated`);
805
- if (label.name) {
806
- info(`Name: ${label.name}`);
807
- }
808
- if (label.color) {
809
- info(`Color: bg=${label.color.backgroundColor} text=${label.color.textColor}`);
810
- }
811
- } catch (err) {
812
- error(String(err));
813
- process.exit(1);
814
- }
815
- });
816
-
817
- labelsCmd
818
- .command('rename <labelId> <newName>')
819
- .description('Rename a label')
820
- .action(async (labelId: string, newName: string) => {
821
- try {
822
- const gmail = requireAuth();
823
- const label = await gmail.labels.update(labelId, { name: newName });
824
- success(`Renamed to: ${label.name}`);
825
- } catch (err) {
826
- error(String(err));
827
- process.exit(1);
828
- }
829
- });
830
-
831
- labelsCmd
832
- .command('delete <labelId>')
833
- .description('Delete a label')
834
- .action(async (labelId: string) => {
835
- try {
836
- const gmail = requireAuth();
837
- await gmail.labels.delete(labelId);
838
- success(`Label ${labelId} deleted`);
839
- } catch (err) {
840
- error(String(err));
841
- process.exit(1);
842
- }
843
- });
844
-
845
- // ============================================
846
- // Threads Commands
847
- // ============================================
848
- const threadsCmd = program
849
- .command('threads')
850
- .description('Email thread commands');
851
-
852
- threadsCmd
853
- .command('list')
854
- .description('List threads in your mailbox')
855
- .option('-n, --max <number>', 'Maximum threads to return', '10')
856
- .option('-q, --query <query>', 'Gmail search query')
857
- .action(async (opts) => {
858
- try {
859
- const gmail = requireAuth();
860
- const result = await gmail.threads.list({
861
- maxResults: parseInt(opts.max),
862
- q: opts.query,
863
- });
864
-
865
- if (!result.threads || result.threads.length === 0) {
866
- info('No threads found');
867
- return;
868
- }
869
-
870
- success(`Found ${result.threads.length} threads:`);
871
- print(result.threads, getFormat(threadsCmd));
872
- } catch (err) {
873
- error(String(err));
874
- process.exit(1);
875
- }
876
- });
877
-
878
- threadsCmd
879
- .command('read <threadId>')
880
- .description('Read a specific thread')
881
- .action(async (threadId: string) => {
882
- try {
883
- const gmail = requireAuth();
884
- const thread = await gmail.threads.get(threadId);
885
-
886
- const output = {
887
- id: thread.id,
888
- messagesCount: thread.messages?.length || 0,
889
- messages: thread.messages?.map(m => {
890
- const headers = m.payload?.headers || [];
891
- const getHeader = (name: string) =>
892
- headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
893
-
894
- return {
895
- id: m.id,
896
- from: getHeader('From'),
897
- subject: getHeader('Subject'),
898
- date: getHeader('Date'),
899
- snippet: m.snippet?.substring(0, 50) + '...',
900
- };
901
- }),
902
- };
903
-
904
- print(output, getFormat(threadsCmd));
905
- } catch (err) {
906
- error(String(err));
907
- process.exit(1);
908
- }
909
- });
910
-
911
- // ============================================
912
- // Drafts Commands
913
- // ============================================
914
- const draftsCmd = program
915
- .command('drafts')
916
- .description('Draft management commands');
917
-
918
- draftsCmd
919
- .command('list')
920
- .description('List drafts')
921
- .option('-n, --max <number>', 'Maximum drafts to return', '10')
922
- .action(async (opts) => {
923
- try {
924
- const gmail = requireAuth();
925
- const result = await gmail.drafts.list(parseInt(opts.max));
926
-
927
- if (!result.drafts || result.drafts.length === 0) {
928
- info('No drafts found');
929
- return;
930
- }
931
-
932
- success(`Found ${result.drafts.length} drafts:`);
933
- print(result.drafts, getFormat(draftsCmd));
934
- } catch (err) {
935
- error(String(err));
936
- process.exit(1);
937
- }
938
- });
939
-
940
- draftsCmd
941
- .command('create')
942
- .description('Create a new draft')
943
- .requiredOption('-t, --to <email>', 'Recipient email address')
944
- .requiredOption('-s, --subject <subject>', 'Email subject')
945
- .requiredOption('-b, --body <body>', 'Email body')
946
- .option('--cc <emails>', 'CC recipients (comma-separated)')
947
- .option('--html', 'Send as HTML email')
948
- .action(async (opts) => {
949
- try {
950
- const gmail = requireAuth();
951
- const draft = await gmail.drafts.create({
952
- to: opts.to,
953
- subject: opts.subject,
954
- body: opts.body,
955
- cc: opts.cc?.split(',').map((e: string) => e.trim()),
956
- isHtml: opts.html,
957
- });
958
-
959
- success(`Draft created!`);
960
- info(`Draft ID: ${draft.id}`);
961
- } catch (err) {
962
- error(String(err));
963
- process.exit(1);
964
- }
965
- });
966
-
967
- draftsCmd
968
- .command('send <draftId>')
969
- .description('Send a draft')
970
- .action(async (draftId: string) => {
971
- try {
972
- const gmail = requireAuth();
973
- const result = await gmail.drafts.send(draftId);
974
- success(`Draft sent!`);
975
- info(`Message ID: ${result.id}`);
976
- } catch (err) {
977
- error(String(err));
978
- process.exit(1);
979
- }
980
- });
981
-
982
- draftsCmd
983
- .command('delete <draftId>')
984
- .description('Delete a draft')
985
- .action(async (draftId: string) => {
986
- try {
987
- const gmail = requireAuth();
988
- await gmail.drafts.delete(draftId);
989
- success(`Draft ${draftId} deleted`);
990
- } catch (err) {
991
- error(String(err));
992
- process.exit(1);
993
- }
994
- });
995
-
996
- draftsCmd
997
- .command('update <draftId>')
998
- .description('Update an existing draft')
999
- .requiredOption('-t, --to <email>', 'Recipient email address')
1000
- .requiredOption('-s, --subject <subject>', 'Email subject')
1001
- .requiredOption('-b, --body <body>', 'Email body')
1002
- .option('--cc <emails>', 'CC recipients (comma-separated)')
1003
- .option('--html', 'Send as HTML email')
1004
- .action(async (draftId: string, opts) => {
1005
- try {
1006
- const gmail = requireAuth();
1007
- const draft = await gmail.drafts.update(draftId, {
1008
- to: opts.to,
1009
- subject: opts.subject,
1010
- body: opts.body,
1011
- cc: opts.cc?.split(',').map((e: string) => e.trim()),
1012
- isHtml: opts.html,
1013
- });
1014
-
1015
- success(`Draft updated!`);
1016
- info(`Draft ID: ${draft.id}`);
1017
- } catch (err) {
1018
- error(String(err));
1019
- process.exit(1);
1020
- }
1021
- });
1022
-
1023
- // ============================================
1024
- // Filters Commands
1025
- // ============================================
1026
- const filtersCmd = program
1027
- .command('filters')
1028
- .description('Email filter management commands');
1029
-
1030
- filtersCmd
1031
- .command('list')
1032
- .description('List all email filters')
1033
- .action(async () => {
1034
- try {
1035
- const gmail = requireAuth();
1036
- const result = await gmail.filters.list();
1037
-
1038
- if (!result.filter || result.filter.length === 0) {
1039
- info('No filters found');
1040
- return;
1041
- }
1042
-
1043
- success(`Found ${result.filter.length} filters:`);
1044
- const output = result.filter.map(f => ({
1045
- id: f.id,
1046
- from: f.criteria?.from || '-',
1047
- to: f.criteria?.to || '-',
1048
- subject: f.criteria?.subject || '-',
1049
- query: f.criteria?.query || '-',
1050
- actions: Object.keys(f.action || {}).join(', '),
1051
- }));
1052
- print(output, getFormat(filtersCmd));
1053
- } catch (err) {
1054
- error(String(err));
1055
- process.exit(1);
1056
- }
1057
- });
1058
-
1059
- filtersCmd
1060
- .command('get <filterId>')
1061
- .description('Get details of a specific filter')
1062
- .action(async (filterId: string) => {
1063
- try {
1064
- const gmail = requireAuth();
1065
- const filter = await gmail.filters.get(filterId);
1066
- print(filter, getFormat(filtersCmd));
1067
- } catch (err) {
1068
- error(String(err));
1069
- process.exit(1);
1070
- }
1071
- });
1072
-
1073
- filtersCmd
1074
- .command('create')
1075
- .description('Create a new filter')
1076
- .option('--from <email>', 'Match emails from this address')
1077
- .option('--to <email>', 'Match emails to this address')
1078
- .option('--subject <text>', 'Match emails with this subject')
1079
- .option('--query <query>', 'Match emails matching this Gmail search query')
1080
- .option('--has-attachment', 'Match emails with attachments')
1081
- .option('--add-label <labelId>', 'Add this label to matching emails')
1082
- .option('--remove-label <labelId>', 'Remove this label from matching emails')
1083
- .option('--archive', 'Archive matching emails')
1084
- .option('--mark-read', 'Mark matching emails as read')
1085
- .option('--star', 'Star matching emails')
1086
- .option('--trash', 'Move matching emails to trash')
1087
- .option('--important', 'Mark matching emails as important')
1088
- .option('--never-spam', 'Never send matching emails to spam')
1089
- .action(async (opts) => {
1090
- try {
1091
- // Build criteria
1092
- const criteria: Record<string, unknown> = {};
1093
- if (opts.from) criteria.from = opts.from;
1094
- if (opts.to) criteria.to = opts.to;
1095
- if (opts.subject) criteria.subject = opts.subject;
1096
- if (opts.query) criteria.query = opts.query;
1097
- if (opts.hasAttachment) criteria.hasAttachment = true;
1098
-
1099
- if (Object.keys(criteria).length === 0) {
1100
- error('At least one filter criteria is required (--from, --to, --subject, --query, or --has-attachment)');
1101
- process.exit(1);
1102
- }
1103
-
1104
- // Build action
1105
- const action: Record<string, unknown> = {};
1106
- if (opts.addLabel) action.addLabelIds = [opts.addLabel];
1107
- if (opts.removeLabel) action.removeLabelIds = [opts.removeLabel];
1108
- if (opts.archive) action.archive = true;
1109
- if (opts.markRead) action.markRead = true;
1110
- if (opts.star) action.star = true;
1111
- if (opts.trash) action.trash = true;
1112
- if (opts.important) action.markImportant = true;
1113
- if (opts.neverSpam) action.neverSpam = true;
1114
-
1115
- if (Object.keys(action).length === 0) {
1116
- error('At least one filter action is required (--add-label, --archive, --mark-read, --star, --trash, --important, --never-spam)');
1117
- process.exit(1);
1118
- }
1119
-
1120
- const gmail = requireAuth();
1121
- const filter = await gmail.filters.create({ criteria, action });
1122
-
1123
- success(`Filter created!`);
1124
- info(`Filter ID: ${filter.id}`);
1125
- } catch (err) {
1126
- error(String(err));
1127
- process.exit(1);
1128
- }
1129
- });
1130
-
1131
- filtersCmd
1132
- .command('delete <filterId>')
1133
- .description('Delete a filter')
1134
- .action(async (filterId: string) => {
1135
- try {
1136
- const gmail = requireAuth();
1137
- await gmail.filters.delete(filterId);
1138
- success(`Filter ${filterId} deleted`);
1139
- } catch (err) {
1140
- error(String(err));
1141
- process.exit(1);
1142
- }
1143
- });
1144
-
1145
- // ============================================
1146
- // Attachments Commands
1147
- // ============================================
1148
- const attachmentsCmd = program
1149
- .command('attachments')
1150
- .description('Email attachment commands');
1151
-
1152
- attachmentsCmd
1153
- .command('list <messageId>')
1154
- .description('List attachments in a message')
1155
- .action(async (messageId: string) => {
1156
- try {
1157
- const gmail = requireAuth();
1158
- const attachments = await gmail.attachments.list(messageId);
1159
-
1160
- if (attachments.length === 0) {
1161
- info('No attachments found in this message');
1162
- return;
1163
- }
1164
-
1165
- success(`Found ${attachments.length} attachment(s):`);
1166
- const output = attachments.map(a => ({
1167
- filename: a.filename,
1168
- mimeType: a.mimeType,
1169
- size: `${Math.round(a.size / 1024)} KB`,
1170
- attachmentId: a.attachmentId.substring(0, 20) + '...',
1171
- }));
1172
- print(output, getFormat(attachmentsCmd));
1173
- } catch (err) {
1174
- error(String(err));
1175
- process.exit(1);
1176
- }
1177
- });
1178
-
1179
- attachmentsCmd
1180
- .command('download <messageId>')
1181
- .description('Download all attachments from a message')
1182
- .option('-a, --attachment-id <id>', 'Download specific attachment by ID')
1183
- .action(async (messageId: string, opts) => {
1184
- try {
1185
- const gmail = requireAuth();
1186
-
1187
- if (opts.attachmentId) {
1188
- // Download specific attachment
1189
- const attachments = await gmail.attachments.list(messageId);
1190
- const attachment = attachments.find(a => a.attachmentId === opts.attachmentId);
1191
-
1192
- if (!attachment) {
1193
- error('Attachment not found');
1194
- process.exit(1);
1195
- }
1196
-
1197
- info(`Downloading ${attachment.filename}...`);
1198
- const result = await gmail.attachments.download(
1199
- messageId,
1200
- attachment.attachmentId,
1201
- attachment.filename,
1202
- attachment.mimeType
1203
- );
1204
-
1205
- success(`Downloaded: ${result.filename}`);
1206
- info(`Saved to: ${result.path}`);
1207
- info(`Size: ${Math.round(result.size / 1024)} KB`);
1208
- } else {
1209
- // Download all attachments
1210
- info('Downloading all attachments...');
1211
- const results = await gmail.attachments.downloadAll(messageId);
1212
-
1213
- if (results.length === 0) {
1214
- info('No attachments found in this message');
1215
- return;
1216
- }
1217
-
1218
- success(`Downloaded ${results.length} attachment(s):`);
1219
- for (const result of results) {
1220
- info(` • ${result.filename} (${Math.round(result.size / 1024)} KB)`);
1221
- }
1222
- info(`\nSaved to: ${gmail.attachments.getStoragePath(messageId)}`);
1223
- }
1224
- } catch (err) {
1225
- error(String(err));
1226
- process.exit(1);
1227
- }
1228
- });
1229
-
1230
- attachmentsCmd
1231
- .command('path <messageId>')
1232
- .description('Show where attachments are/would be stored')
1233
- .action(async (messageId: string) => {
1234
- const gmail = requireAuth();
1235
- const path = gmail.attachments.getStoragePath(messageId);
1236
- info(`Attachments path: ${path}`);
1237
- });
1238
-
1239
-
1240
- attachmentsCmd
1241
- .command('bulk-download <query>')
1242
- .description('Bulk-download attachments from messages matching a Gmail search query')
1243
- .option('-o, --output <dir>', 'Output directory', './gmail-attachments')
1244
- .option('--organize-by-date', 'Organize files into subdirs by email date (YYYY/MM/)')
1245
- .option('-n, --max <number>', 'Maximum messages to process', '100')
1246
- .action(async (query: string, opts) => {
1247
- try {
1248
- const gmail = requireAuth();
1249
- const outputDir = resolve(opts.output);
1250
- const organizeByDate = !!opts.organizeByDate;
1251
- const maxMessages = parseInt(opts.max);
1252
-
1253
- info(`Searching for messages matching: ${chalk.cyan(query)}`);
1254
- info(`Output directory: ${chalk.cyan(outputDir)}`);
1255
- if (organizeByDate) info('Organizing by date: enabled');
1256
-
1257
- // Paginate through matching messages
1258
- const allMessageIds: string[] = [];
1259
- let pageToken: string | undefined;
1260
-
1261
- do {
1262
- const result = await gmail.messages.list({
1263
- q: query,
1264
- maxResults: Math.min(maxMessages - allMessageIds.length, 500),
1265
- pageToken,
1266
- });
1267
-
1268
- if (result.messages) {
1269
- for (const m of result.messages) {
1270
- if (m.id) allMessageIds.push(m.id);
1271
- }
1272
- }
1273
-
1274
- pageToken = result.nextPageToken;
1275
- } while (pageToken && allMessageIds.length < maxMessages);
1276
-
1277
- if (allMessageIds.length === 0) {
1278
- info('No messages found matching the query.');
1279
- return;
1280
- }
1281
-
1282
- info(`Found ${allMessageIds.length} message(s). Scanning for attachments...`);
1283
-
1284
- let totalDownloaded = 0;
1285
- let totalSkipped = 0;
1286
- let totalErrors = 0;
1287
-
1288
- for (let i = 0; i < allMessageIds.length; i++) {
1289
- const messageId = allMessageIds[i];
1290
- const progress = `[${i + 1}/${allMessageIds.length}]`;
1291
-
1292
- try {
1293
- const attachments = await gmail.attachments.list(messageId);
1294
-
1295
- if (attachments.length === 0) continue;
1296
-
1297
- // Determine destination directory
1298
- let destDir = outputDir;
1299
- if (organizeByDate) {
1300
- // Fetch minimal message metadata to get internalDate
1301
- const fullMsg = await (gmail as any).client.get(
1302
- `/users/me/messages/${messageId}`,
1303
- { format: 'minimal' }
1304
- );
1305
- const msgDate = fullMsg?.internalDate
1306
- ? new Date(parseInt(fullMsg.internalDate))
1307
- : new Date();
1308
- const year = msgDate.getFullYear().toString();
1309
- const month = (msgDate.getMonth() + 1).toString().padStart(2, '0');
1310
- destDir = join(outputDir, year, month);
1311
- }
1312
-
1313
- if (!existsSync(destDir)) {
1314
- mkdirSync(destDir, { recursive: true });
1315
- }
1316
-
1317
- for (const attachment of attachments) {
1318
- try {
1319
- const data = await gmail.attachments.get(messageId, attachment.attachmentId);
1320
- const cleanFilename = attachment.filename.replace(/[\u00A0\u2000-\u200B\u202F\u205F\u3000]/g, ' ');
1321
-
1322
- // Avoid overwriting existing files
1323
- let finalFilename = cleanFilename;
1324
- let destPath = join(destDir, finalFilename);
1325
- if (existsSync(destPath)) {
1326
- const dotIdx = cleanFilename.lastIndexOf('.');
1327
- const suffix = '_' + messageId.slice(-6);
1328
- finalFilename = dotIdx !== -1
1329
- ? cleanFilename.slice(0, dotIdx) + suffix + cleanFilename.slice(dotIdx)
1330
- : cleanFilename + suffix;
1331
- destPath = join(destDir, finalFilename);
1332
- }
1333
-
1334
- const buffer = Buffer.from(data.data, 'base64url');
1335
- writeFileSync(destPath, buffer);
1336
-
1337
- info(`${progress} ${chalk.green('✓')} ${finalFilename} (${(buffer.length / 1024).toFixed(1)} KB)`);
1338
- totalDownloaded++;
1339
- } catch (attachErr) {
1340
- warn(`${progress} ${chalk.red('✗')} ${attachment.filename}: ${String(attachErr)}`);
1341
- totalErrors++;
1342
- }
1343
- }
1344
- } catch (msgErr) {
1345
- warn(`${progress} ${chalk.yellow('!')} Message ${messageId}: ${String(msgErr)}`);
1346
- totalSkipped++;
1347
- }
1348
- }
1349
-
1350
- info('');
1351
- success('Bulk download complete:');
1352
- info(` Downloaded: ${totalDownloaded} attachment(s)`);
1353
- if (totalSkipped > 0) info(` Skipped: ${totalSkipped} message(s) with errors`);
1354
- if (totalErrors > 0) info(` Failed: ${totalErrors} attachment(s)`);
1355
- info(` Saved to: ${outputDir}`);
1356
- } catch (err) {
1357
- error(String(err));
1358
- process.exit(1);
1359
- }
1360
- });
1361
-
1362
- // ============================================
1363
- // Search Command (shortcut)
1364
- // ============================================
1365
- program
1366
- .command('search <query>')
1367
- .description('Search messages (shortcut for "messages list -q")')
1368
- .option('-n, --max <number>', 'Maximum messages to return', '10')
1369
- .action(async (query: string, opts) => {
1370
- try {
1371
- const gmail = requireAuth();
1372
- const result = await gmail.messages.list({
1373
- maxResults: parseInt(opts.max),
1374
- q: query,
1375
- });
1376
-
1377
- if (!result.messages || result.messages.length === 0) {
1378
- info(`No messages found for query: ${query}`);
1379
- return;
1380
- }
1381
-
1382
- success(`Found ${result.messages.length} messages:`);
1383
-
1384
- const messages = await Promise.all(
1385
- result.messages.slice(0, 10).map(async (m) => {
1386
- const msg = await gmail.messages.get(m.id, 'metadata');
1387
- const headers = msg.payload?.headers || [];
1388
- const getHeader = (name: string) =>
1389
- headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value || '';
1390
-
1391
- return {
1392
- id: m.id,
1393
- from: getHeader('From'),
1394
- subject: getHeader('Subject'),
1395
- date: getHeader('Date'),
1396
- };
1397
- })
1398
- );
1399
-
1400
- print(messages, getFormat(program));
1401
- } catch (err) {
1402
- error(String(err));
1403
- process.exit(1);
1404
- }
1405
- });
1406
-
1407
- // ============================================
1408
- // Contacts Commands
1409
- // ============================================
1410
- const contactsCmd = program
1411
- .command('contacts')
1412
- .description('Contact management commands');
1413
-
1414
- contactsCmd
1415
- .command('list')
1416
- .description('List all saved contacts')
1417
- .action(() => {
1418
- try {
1419
- const contacts = getAllContacts();
1420
- if (contacts.length === 0) {
1421
- info('No contacts saved');
1422
- return;
1423
- }
1424
- success(`Found ${contacts.length} contacts:`);
1425
- const output = contacts.map(c => ({
1426
- email: c.email,
1427
- name: c.name || `${c.firstName || ''} ${c.lastName || ''}`.trim() || '-',
1428
- company: c.company || '-',
1429
- }));
1430
- print(output, getFormat(contactsCmd));
1431
- } catch (err) {
1432
- error(String(err));
1433
- process.exit(1);
1434
- }
1435
- });
1436
-
1437
- contactsCmd
1438
- .command('add <email>')
1439
- .description('Add a new contact')
1440
- .option('-n, --name <name>', 'Full name')
1441
- .option('-f, --first <firstName>', 'First name')
1442
- .option('-l, --last <lastName>', 'Last name')
1443
- .option('-c, --company <company>', 'Company name')
1444
- .option('--notes <notes>', 'Notes')
1445
- .action((email: string, opts) => {
1446
- try {
1447
- const contact: Partial<Contact> = {
1448
- email,
1449
- name: opts.name,
1450
- firstName: opts.first,
1451
- lastName: opts.last,
1452
- company: opts.company,
1453
- notes: opts.notes,
1454
- };
1455
- saveContact(contact as Contact);
1456
- success(`Contact ${email} saved!`);
1457
- } catch (err) {
1458
- error(String(err));
1459
- process.exit(1);
1460
- }
1461
- });
1462
-
1463
- contactsCmd
1464
- .command('show <email>')
1465
- .description('Show a contact\'s details')
1466
- .action((email: string) => {
1467
- try {
1468
- const contact = getContact(email);
1469
- if (!contact) {
1470
- warn(`Contact ${email} not found`);
1471
- return;
1472
- }
1473
- print(contact, getFormat(contactsCmd));
1474
- } catch (err) {
1475
- error(String(err));
1476
- process.exit(1);
1477
- }
1478
- });
1479
-
1480
- contactsCmd
1481
- .command('delete <email>')
1482
- .description('Delete a contact')
1483
- .action((email: string) => {
1484
- try {
1485
- const deleted = deleteContact(email);
1486
- if (deleted) {
1487
- success(`Contact ${email} deleted`);
1488
- } else {
1489
- warn(`Contact ${email} not found`);
1490
- }
1491
- } catch (err) {
1492
- error(String(err));
1493
- process.exit(1);
1494
- }
1495
- });
1496
-
1497
- contactsCmd
1498
- .command('search <query>')
1499
- .description('Search contacts by name or email')
1500
- .action((query: string) => {
1501
- try {
1502
- const results = searchContacts(query);
1503
- if (results.length === 0) {
1504
- info(`No contacts found matching "${query}"`);
1505
- return;
1506
- }
1507
- success(`Found ${results.length} contacts:`);
1508
- const output = results.map(c => ({
1509
- email: c.email,
1510
- name: c.name || `${c.firstName || ''} ${c.lastName || ''}`.trim() || '-',
1511
- company: c.company || '-',
1512
- }));
1513
- print(output, getFormat(contactsCmd));
1514
- } catch (err) {
1515
- error(String(err));
1516
- process.exit(1);
1517
- }
1518
- });
1519
-
1520
- contactsCmd
1521
- .command('import <query>')
1522
- .description('Import contacts from email search results (e.g., "from:@company.com")')
1523
- .option('-n, --max <number>', 'Maximum emails to search', '50')
1524
- .action(async (query: string, opts) => {
1525
- try {
1526
- const gmail = requireAuth();
1527
- info(`Searching for emails matching: ${query}`);
1528
-
1529
- const result = await gmail.messages.list({
1530
- maxResults: parseInt(opts.max),
1531
- q: query,
1532
- });
1533
-
1534
- if (!result.messages || result.messages.length === 0) {
1535
- info('No messages found');
1536
- return;
1537
- }
1538
-
1539
- info(`Found ${result.messages.length} messages, extracting contacts...`);
1540
-
1541
- // Extract unique contacts from messages
1542
- const contactsMap = new Map<string, { email: string; name?: string }>();
1543
-
1544
- for (const m of result.messages) {
1545
- const msg = await gmail.messages.get(m.id, 'metadata');
1546
- const headers = msg.payload?.headers || [];
1547
- const fromHeader = headers.find(h => h.name.toLowerCase() === 'from')?.value || '';
1548
-
1549
- // Parse "Name <email>" or just "email" format
1550
- const match = fromHeader.match(/^(?:"?([^"<]+)"?\s*)?<?([^>]+@[^>]+)>?$/);
1551
- if (match) {
1552
- const name = match[1]?.trim();
1553
- const email = match[2]?.trim().toLowerCase();
1554
- if (email && !contactsMap.has(email)) {
1555
- contactsMap.set(email, { email, name });
1556
- }
1557
- }
1558
- }
1559
-
1560
- if (contactsMap.size === 0) {
1561
- info('No contacts found in messages');
1562
- return;
1563
- }
1564
-
1565
- // Save contacts
1566
- let savedCount = 0;
1567
- for (const contact of contactsMap.values()) {
1568
- // Extract domain for company name
1569
- const domain = contact.email.split('@')[1];
1570
- const company = domain?.split('.')[0];
1571
-
1572
- saveContact({
1573
- email: contact.email,
1574
- name: contact.name,
1575
- company: company ? company.charAt(0).toUpperCase() + company.slice(1) : undefined,
1576
- } as Contact);
1577
- savedCount++;
1578
- info(` + ${contact.name || contact.email} <${contact.email}>`);
1579
- }
1580
-
1581
- success(`Imported ${savedCount} contacts!`);
1582
- } catch (err) {
1583
- error(String(err));
1584
- process.exit(1);
1585
- }
1586
- });
1587
-
1588
- contactsCmd
1589
- .command('from-message <messageId>')
1590
- .description('Save the sender of a specific message as a contact')
1591
- .action(async (messageId: string) => {
1592
- try {
1593
- const gmail = requireAuth();
1594
- const msg = await gmail.messages.get(messageId, 'metadata');
1595
- const headers = msg.payload?.headers || [];
1596
- const fromHeader = headers.find(h => h.name.toLowerCase() === 'from')?.value || '';
1597
-
1598
- // Parse "Name <email>" or just "email" format
1599
- const match = fromHeader.match(/^(?:"?([^"<]+)"?\s*)?<?([^>]+@[^>]+)>?$/);
1600
- if (!match) {
1601
- error('Could not parse sender from message');
1602
- process.exit(1);
1603
- }
1604
-
1605
- const name = match[1]?.trim();
1606
- const email = match[2]?.trim().toLowerCase();
1607
- const domain = email.split('@')[1];
1608
- const company = domain?.split('.')[0];
1609
-
1610
- saveContact({
1611
- email,
1612
- name,
1613
- company: company ? company.charAt(0).toUpperCase() + company.slice(1) : undefined,
1614
- } as Contact);
1615
-
1616
- success(`Contact saved: ${name || email} <${email}>`);
1617
- } catch (err) {
1618
- error(String(err));
1619
- process.exit(1);
1620
- }
1621
- });
1622
-
1623
- // ============================================
1624
- // Settings Commands
1625
- // ============================================
1626
- const settingsCmd = program
1627
- .command('settings')
1628
- .description('Manage CLI settings');
1629
-
1630
- settingsCmd
1631
- .command('show')
1632
- .description('Show current settings')
1633
- .action(() => {
1634
- const settings = loadSettings();
1635
- print(settings, getFormat(settingsCmd));
1636
- });
1637
-
1638
- settingsCmd
1639
- .command('set <key> <value>')
1640
- .description('Set a setting value (e.g., "markdownEnabled true")')
1641
- .action((key: string, value: string) => {
1642
- try {
1643
- const settings = loadSettings();
1644
- const validKeys = Object.keys(settings);
1645
- if (!validKeys.includes(key)) {
1646
- error(`Invalid setting: ${key}`);
1647
- info(`Valid settings: ${validKeys.join(', ')}`);
1648
- process.exit(1);
1649
- }
1650
-
1651
- // Parse value based on type
1652
- let parsedValue: string | boolean;
1653
- if (value === 'true') parsedValue = true;
1654
- else if (value === 'false') parsedValue = false;
1655
- else parsedValue = value;
1656
-
1657
- setSetting(key as keyof Settings, parsedValue as Settings[keyof Settings]);
1658
- success(`Setting ${key} = ${parsedValue}`);
1659
- } catch (err) {
1660
- error(String(err));
1661
- process.exit(1);
1662
- }
1663
- });
1664
-
1665
- settingsCmd
1666
- .command('set-signature <signature>')
1667
- .description('Set a custom email signature')
1668
- .action((signature: string) => {
1669
- setSignature(signature);
1670
- success('Signature saved');
1671
- });
1672
-
1673
- settingsCmd
1674
- .command('sync-signature')
1675
- .description('Fetch and save your Gmail signature')
1676
- .action(async () => {
1677
- try {
1678
- const gmail = requireAuth();
1679
- const signature = await gmail.profile.getSignature();
1680
- if (signature) {
1681
- setSignature(signature);
1682
- success('Gmail signature synced!');
1683
- info(`Signature: ${signature.substring(0, 50)}${signature.length > 50 ? '...' : ''}`);
1684
- } else {
1685
- warn('No signature found in Gmail settings');
1686
- }
1687
- } catch (err) {
1688
- error(String(err));
1689
- process.exit(1);
1690
- }
1691
- });
1692
-
1693
- // ============================================
1694
- // Export Commands
1695
- // ============================================
1696
- const exportCmd = program
1697
- .command('export')
1698
- .description('Export emails to EML or MBOX format');
1699
-
1700
- exportCmd
1701
- .command('messages')
1702
- .description('Export messages to EML or MBOX format')
1703
- .option('-q, --query <query>', 'Gmail search query')
1704
- .option('-l, --label <labelId>', 'Filter by label ID')
1705
- .option('-n, --max <number>', 'Maximum messages to export', '100')
1706
- .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1707
- .option('-o, --output <dir>', 'Output directory')
1708
- .option('-f, --filename <name>', 'Output filename')
1709
- .action(async (opts) => {
1710
- try {
1711
- const gmail = requireAuth();
1712
- info(`Exporting messages${opts.query ? ` matching "${opts.query}"` : ''}...`);
1713
-
1714
- const result = await gmail.export.exportMessages({
1715
- query: opts.query,
1716
- labelIds: opts.label ? [opts.label] : undefined,
1717
- maxResults: parseInt(opts.max),
1718
- format: opts.format,
1719
- outputDir: opts.output,
1720
- filename: opts.filename,
1721
- });
1722
-
1723
- success(`Exported ${result.messageCount} message(s)`);
1724
- info(`Format: ${result.format.toUpperCase()}`);
1725
- info(`File: ${result.filePath}`);
1726
- } catch (err) {
1727
- error(String(err));
1728
- process.exit(1);
1729
- }
1730
- });
1731
-
1732
- exportCmd
1733
- .command('inbox')
1734
- .description('Export inbox messages')
1735
- .option('-n, --max <number>', 'Maximum messages to export', '100')
1736
- .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1737
- .option('-o, --output <dir>', 'Output directory')
1738
- .option('-f, --filename <name>', 'Output filename')
1739
- .action(async (opts) => {
1740
- try {
1741
- const gmail = requireAuth();
1742
- info('Exporting inbox messages...');
1743
-
1744
- const result = await gmail.export.exportInbox({
1745
- maxResults: parseInt(opts.max),
1746
- format: opts.format,
1747
- outputDir: opts.output,
1748
- filename: opts.filename,
1749
- });
1750
-
1751
- success(`Exported ${result.messageCount} inbox message(s)`);
1752
- info(`Format: ${result.format.toUpperCase()}`);
1753
- info(`File: ${result.filePath}`);
1754
- } catch (err) {
1755
- error(String(err));
1756
- process.exit(1);
1757
- }
1758
- });
1759
-
1760
- exportCmd
1761
- .command('sent')
1762
- .description('Export sent messages')
1763
- .option('-n, --max <number>', 'Maximum messages to export', '100')
1764
- .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1765
- .option('-o, --output <dir>', 'Output directory')
1766
- .option('-f, --filename <name>', 'Output filename')
1767
- .action(async (opts) => {
1768
- try {
1769
- const gmail = requireAuth();
1770
- info('Exporting sent messages...');
1771
-
1772
- const result = await gmail.export.exportSent({
1773
- maxResults: parseInt(opts.max),
1774
- format: opts.format,
1775
- outputDir: opts.output,
1776
- filename: opts.filename,
1777
- });
1778
-
1779
- success(`Exported ${result.messageCount} sent message(s)`);
1780
- info(`Format: ${result.format.toUpperCase()}`);
1781
- info(`File: ${result.filePath}`);
1782
- } catch (err) {
1783
- error(String(err));
1784
- process.exit(1);
1785
- }
1786
- });
1787
-
1788
- exportCmd
1789
- .command('starred')
1790
- .description('Export starred messages')
1791
- .option('-n, --max <number>', 'Maximum messages to export', '100')
1792
- .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1793
- .option('-o, --output <dir>', 'Output directory')
1794
- .option('-f, --filename <name>', 'Output filename')
1795
- .action(async (opts) => {
1796
- try {
1797
- const gmail = requireAuth();
1798
- info('Exporting starred messages...');
1799
-
1800
- const result = await gmail.export.exportStarred({
1801
- maxResults: parseInt(opts.max),
1802
- format: opts.format,
1803
- outputDir: opts.output,
1804
- filename: opts.filename,
1805
- });
1806
-
1807
- success(`Exported ${result.messageCount} starred message(s)`);
1808
- info(`Format: ${result.format.toUpperCase()}`);
1809
- info(`File: ${result.filePath}`);
1810
- } catch (err) {
1811
- error(String(err));
1812
- process.exit(1);
1813
- }
1814
- });
1815
-
1816
- exportCmd
1817
- .command('label <labelId>')
1818
- .description('Export messages from a specific label')
1819
- .option('-n, --max <number>', 'Maximum messages to export', '100')
1820
- .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1821
- .option('-o, --output <dir>', 'Output directory')
1822
- .option('-f, --filename <name>', 'Output filename')
1823
- .action(async (labelId: string, opts) => {
1824
- try {
1825
- const gmail = requireAuth();
1826
- info(`Exporting messages from label "${labelId}"...`);
1827
-
1828
- const result = await gmail.export.exportLabel(labelId, {
1829
- maxResults: parseInt(opts.max),
1830
- format: opts.format,
1831
- outputDir: opts.output,
1832
- filename: opts.filename,
1833
- });
1834
-
1835
- success(`Exported ${result.messageCount} message(s)`);
1836
- info(`Format: ${result.format.toUpperCase()}`);
1837
- info(`File: ${result.filePath}`);
1838
- } catch (err) {
1839
- error(String(err));
1840
- process.exit(1);
1841
- }
1842
- });
1843
-
1844
- exportCmd
1845
- .command('message <messageId>')
1846
- .description('Export a single message to EML format')
1847
- .option('-o, --output <dir>', 'Output directory')
1848
- .option('-f, --filename <name>', 'Output filename')
1849
- .action(async (messageId: string, opts) => {
1850
- try {
1851
- const gmail = requireAuth();
1852
- info(`Exporting message ${messageId}...`);
1853
-
1854
- const result = await gmail.export.exportMessage(messageId, {
1855
- outputDir: opts.output,
1856
- filename: opts.filename,
1857
- });
1858
-
1859
- success(`Message exported`);
1860
- info(`File: ${result.filePath}`);
1861
- } catch (err) {
1862
- error(String(err));
1863
- process.exit(1);
1864
- }
1865
- });
1866
-
1867
- exportCmd
1868
- .command('thread <threadId>')
1869
- .description('Export an entire thread (conversation)')
1870
- .option('--format <format>', 'Output format: eml or mbox', 'mbox')
1871
- .option('-o, --output <dir>', 'Output directory')
1872
- .option('-f, --filename <name>', 'Output filename')
1873
- .action(async (threadId: string, opts) => {
1874
- try {
1875
- const gmail = requireAuth();
1876
- info(`Exporting thread ${threadId}...`);
1877
-
1878
- const result = await gmail.export.exportThread(threadId, {
1879
- format: opts.format,
1880
- outputDir: opts.output,
1881
- filename: opts.filename,
1882
- });
1883
-
1884
- success(`Exported ${result.messageCount} message(s) from thread`);
1885
- info(`Format: ${result.format.toUpperCase()}`);
1886
- info(`File: ${result.filePath}`);
1887
- } catch (err) {
1888
- error(String(err));
1889
- process.exit(1);
1890
- }
1891
- });
1892
-
1893
- // ============================================
1894
- // Bulk Operations Commands
1895
- // ============================================
1896
- const bulkCmd = program
1897
- .command('bulk')
1898
- .description('Bulk operations on messages (using Gmail search queries)');
1899
-
1900
- bulkCmd
1901
- .command('preview <query>')
1902
- .description('Preview messages matching a Gmail search query')
1903
- .option('-n, --max <number>', 'Maximum messages to preview', '20')
1904
- .action(async (query: string, opts) => {
1905
- try {
1906
- const gmail = requireAuth();
1907
- info(`Searching for messages matching: ${query}`);
1908
-
1909
- const result = await gmail.bulk.preview(query, parseInt(opts.max));
1910
-
1911
- if (result.messages.length === 0) {
1912
- info('No messages found matching the query');
1913
- return;
1914
- }
1915
-
1916
- success(`Found ${result.total} message(s):`);
1917
- const output = result.messages.map(m => ({
1918
- id: m.id,
1919
- from: m.from || '-',
1920
- subject: m.subject || '(no subject)',
1921
- date: m.date || '-',
1922
- }));
1923
- print(output, getFormat(bulkCmd));
1924
- } catch (err) {
1925
- error(String(err));
1926
- process.exit(1);
1927
- }
1928
- });
1929
-
1930
- bulkCmd
1931
- .command('label <query>')
1932
- .description('Add or remove labels from messages matching a query')
1933
- .option('-a, --add <labels>', 'Labels to add (comma-separated names or IDs)')
1934
- .option('-r, --remove <labels>', 'Labels to remove (comma-separated names or IDs)')
1935
- .option('-n, --max <number>', 'Maximum messages to process', '100')
1936
- .option('--dry-run', 'Preview changes without applying them')
1937
- .option('--batch', 'Use Gmail batch API for faster processing (recommended for large batches)')
1938
- .action(async (query: string, opts) => {
1939
- try {
1940
- if (!opts.add && !opts.remove) {
1941
- error('At least one of --add or --remove is required');
1942
- process.exit(1);
1943
- }
1944
-
1945
- const gmail = requireAuth();
1946
- const addLabels = opts.add ? opts.add.split(',').map((l: string) => l.trim()) : [];
1947
- const removeLabels = opts.remove ? opts.remove.split(',').map((l: string) => l.trim()) : [];
1948
-
1949
- info(`${opts.dryRun ? '[DRY RUN] ' : ''}Modifying labels for messages matching: ${query}`);
1950
- if (addLabels.length > 0) info(` Adding: ${addLabels.join(', ')}`);
1951
- if (removeLabels.length > 0) info(` Removing: ${removeLabels.join(', ')}`);
1952
-
1953
- let result;
1954
- if (opts.batch) {
1955
- result = await gmail.bulk.batchModifyLabels({
1956
- query,
1957
- maxResults: parseInt(opts.max),
1958
- addLabels,
1959
- removeLabels,
1960
- dryRun: opts.dryRun,
1961
- });
1962
- } else {
1963
- result = await gmail.bulk.modifyLabels({
1964
- query,
1965
- maxResults: parseInt(opts.max),
1966
- addLabels,
1967
- removeLabels,
1968
- dryRun: opts.dryRun,
1969
- onProgress: (current, total) => {
1970
- process.stdout.write(`\r Progress: ${current}/${total}`);
1971
- },
1972
- });
1973
- console.log(); // New line after progress
1974
- }
1975
-
1976
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk label modification complete:`);
1977
- info(` Total: ${result.total}`);
1978
- info(` Success: ${result.success}`);
1979
- if (result.failed > 0) {
1980
- warn(` Failed: ${result.failed}`);
1981
- for (const err of result.errors.slice(0, 5)) {
1982
- info(` - ${err.messageId}: ${err.error}`);
1983
- }
1984
- if (result.errors.length > 5) {
1985
- info(` ... and ${result.errors.length - 5} more errors`);
1986
- }
1987
- }
1988
- } catch (err) {
1989
- error(String(err));
1990
- process.exit(1);
1991
- }
1992
- });
1993
-
1994
- bulkCmd
1995
- .command('archive <query>')
1996
- .description('Archive messages matching a query (remove from INBOX)')
1997
- .option('-n, --max <number>', 'Maximum messages to process', '100')
1998
- .option('--dry-run', 'Preview changes without applying them')
1999
- .option('--batch', 'Use Gmail batch API for faster processing')
2000
- .action(async (query: string, opts) => {
2001
- try {
2002
- const gmail = requireAuth();
2003
- info(`${opts.dryRun ? '[DRY RUN] ' : ''}Archiving messages matching: ${query}`);
2004
-
2005
- let result;
2006
- if (opts.batch) {
2007
- result = await gmail.bulk.batchModifyLabels({
2008
- query,
2009
- maxResults: parseInt(opts.max),
2010
- removeLabelIds: ['INBOX'],
2011
- dryRun: opts.dryRun,
2012
- });
2013
- } else {
2014
- result = await gmail.bulk.archive({
2015
- query,
2016
- maxResults: parseInt(opts.max),
2017
- dryRun: opts.dryRun,
2018
- onProgress: (current, total) => {
2019
- process.stdout.write(`\r Progress: ${current}/${total}`);
2020
- },
2021
- });
2022
- console.log();
2023
- }
2024
-
2025
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk archive complete:`);
2026
- info(` Total: ${result.total}`);
2027
- info(` Success: ${result.success}`);
2028
- if (result.failed > 0) warn(` Failed: ${result.failed}`);
2029
- } catch (err) {
2030
- error(String(err));
2031
- process.exit(1);
2032
- }
2033
- });
2034
-
2035
- bulkCmd
2036
- .command('trash <query>')
2037
- .description('Move messages matching a query to trash')
2038
- .option('-n, --max <number>', 'Maximum messages to process', '100')
2039
- .option('--dry-run', 'Preview changes without applying them')
2040
- .action(async (query: string, opts) => {
2041
- try {
2042
- const gmail = requireAuth();
2043
- info(`${opts.dryRun ? '[DRY RUN] ' : ''}Moving to trash messages matching: ${query}`);
2044
-
2045
- const result = await gmail.bulk.trash({
2046
- query,
2047
- maxResults: parseInt(opts.max),
2048
- dryRun: opts.dryRun,
2049
- onProgress: (current, total) => {
2050
- process.stdout.write(`\r Progress: ${current}/${total}`);
2051
- },
2052
- });
2053
- console.log();
2054
-
2055
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk trash complete:`);
2056
- info(` Total: ${result.total}`);
2057
- info(` Success: ${result.success}`);
2058
- if (result.failed > 0) warn(` Failed: ${result.failed}`);
2059
- } catch (err) {
2060
- error(String(err));
2061
- process.exit(1);
2062
- }
2063
- });
2064
-
2065
- bulkCmd
2066
- .command('delete <query>')
2067
- .description('Permanently delete messages matching a query (DANGER!)')
2068
- .option('-n, --max <number>', 'Maximum messages to process', '100')
2069
- .option('--dry-run', 'Preview changes without applying them')
2070
- .option('--batch', 'Use Gmail batch API for faster processing')
2071
- .option('--confirm', 'Confirm permanent deletion')
2072
- .action(async (query: string, opts) => {
2073
- try {
2074
- if (!opts.dryRun && !opts.confirm) {
2075
- error('Permanent deletion requires --confirm flag');
2076
- info('Use --dry-run to preview what would be deleted');
2077
- process.exit(1);
2078
- }
2079
-
2080
- const gmail = requireAuth();
2081
- warn(`${opts.dryRun ? '[DRY RUN] ' : ''}PERMANENTLY DELETING messages matching: ${query}`);
2082
-
2083
- let result;
2084
- if (opts.batch) {
2085
- result = await gmail.bulk.batchDelete({
2086
- query,
2087
- maxResults: parseInt(opts.max),
2088
- dryRun: opts.dryRun,
2089
- });
2090
- } else {
2091
- result = await gmail.bulk.delete({
2092
- query,
2093
- maxResults: parseInt(opts.max),
2094
- dryRun: opts.dryRun,
2095
- onProgress: (current, total) => {
2096
- process.stdout.write(`\r Progress: ${current}/${total}`);
2097
- },
2098
- });
2099
- console.log();
2100
- }
2101
-
2102
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk delete complete:`);
2103
- info(` Total: ${result.total}`);
2104
- info(` Success: ${result.success}`);
2105
- if (result.failed > 0) warn(` Failed: ${result.failed}`);
2106
- } catch (err) {
2107
- error(String(err));
2108
- process.exit(1);
2109
- }
2110
- });
2111
-
2112
- bulkCmd
2113
- .command('mark-read <query>')
2114
- .description('Mark messages matching a query as read')
2115
- .option('-n, --max <number>', 'Maximum messages to process', '100')
2116
- .option('--dry-run', 'Preview changes without applying them')
2117
- .option('--batch', 'Use Gmail batch API for faster processing')
2118
- .action(async (query: string, opts) => {
2119
- try {
2120
- const gmail = requireAuth();
2121
- info(`${opts.dryRun ? '[DRY RUN] ' : ''}Marking as read messages matching: ${query}`);
2122
-
2123
- let result;
2124
- if (opts.batch) {
2125
- result = await gmail.bulk.batchModifyLabels({
2126
- query,
2127
- maxResults: parseInt(opts.max),
2128
- removeLabelIds: ['UNREAD'],
2129
- dryRun: opts.dryRun,
2130
- });
2131
- } else {
2132
- result = await gmail.bulk.markAsRead({
2133
- query,
2134
- maxResults: parseInt(opts.max),
2135
- dryRun: opts.dryRun,
2136
- onProgress: (current, total) => {
2137
- process.stdout.write(`\r Progress: ${current}/${total}`);
2138
- },
2139
- });
2140
- console.log();
2141
- }
2142
-
2143
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk mark-read complete:`);
2144
- info(` Total: ${result.total}`);
2145
- info(` Success: ${result.success}`);
2146
- if (result.failed > 0) warn(` Failed: ${result.failed}`);
2147
- } catch (err) {
2148
- error(String(err));
2149
- process.exit(1);
2150
- }
2151
- });
2152
-
2153
- bulkCmd
2154
- .command('mark-unread <query>')
2155
- .description('Mark messages matching a query as unread')
2156
- .option('-n, --max <number>', 'Maximum messages to process', '100')
2157
- .option('--dry-run', 'Preview changes without applying them')
2158
- .option('--batch', 'Use Gmail batch API for faster processing')
2159
- .action(async (query: string, opts) => {
2160
- try {
2161
- const gmail = requireAuth();
2162
- info(`${opts.dryRun ? '[DRY RUN] ' : ''}Marking as unread messages matching: ${query}`);
2163
-
2164
- let result;
2165
- if (opts.batch) {
2166
- result = await gmail.bulk.batchModifyLabels({
2167
- query,
2168
- maxResults: parseInt(opts.max),
2169
- addLabelIds: ['UNREAD'],
2170
- dryRun: opts.dryRun,
2171
- });
2172
- } else {
2173
- result = await gmail.bulk.markAsUnread({
2174
- query,
2175
- maxResults: parseInt(opts.max),
2176
- dryRun: opts.dryRun,
2177
- onProgress: (current, total) => {
2178
- process.stdout.write(`\r Progress: ${current}/${total}`);
2179
- },
2180
- });
2181
- console.log();
2182
- }
2183
-
2184
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk mark-unread complete:`);
2185
- info(` Total: ${result.total}`);
2186
- info(` Success: ${result.success}`);
2187
- if (result.failed > 0) warn(` Failed: ${result.failed}`);
2188
- } catch (err) {
2189
- error(String(err));
2190
- process.exit(1);
2191
- }
2192
- });
2193
-
2194
- bulkCmd
2195
- .command('star <query>')
2196
- .description('Star messages matching a query')
2197
- .option('-n, --max <number>', 'Maximum messages to process', '100')
2198
- .option('--dry-run', 'Preview changes without applying them')
2199
- .option('--batch', 'Use Gmail batch API for faster processing')
2200
- .action(async (query: string, opts) => {
2201
- try {
2202
- const gmail = requireAuth();
2203
- info(`${opts.dryRun ? '[DRY RUN] ' : ''}Starring messages matching: ${query}`);
2204
-
2205
- let result;
2206
- if (opts.batch) {
2207
- result = await gmail.bulk.batchModifyLabels({
2208
- query,
2209
- maxResults: parseInt(opts.max),
2210
- addLabelIds: ['STARRED'],
2211
- dryRun: opts.dryRun,
2212
- });
2213
- } else {
2214
- result = await gmail.bulk.star({
2215
- query,
2216
- maxResults: parseInt(opts.max),
2217
- dryRun: opts.dryRun,
2218
- onProgress: (current, total) => {
2219
- process.stdout.write(`\r Progress: ${current}/${total}`);
2220
- },
2221
- });
2222
- console.log();
2223
- }
2224
-
2225
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk star complete:`);
2226
- info(` Total: ${result.total}`);
2227
- info(` Success: ${result.success}`);
2228
- if (result.failed > 0) warn(` Failed: ${result.failed}`);
2229
- } catch (err) {
2230
- error(String(err));
2231
- process.exit(1);
2232
- }
2233
- });
2234
-
2235
- bulkCmd
2236
- .command('unstar <query>')
2237
- .description('Remove stars from messages matching a query')
2238
- .option('-n, --max <number>', 'Maximum messages to process', '100')
2239
- .option('--dry-run', 'Preview changes without applying them')
2240
- .option('--batch', 'Use Gmail batch API for faster processing')
2241
- .action(async (query: string, opts) => {
2242
- try {
2243
- const gmail = requireAuth();
2244
- info(`${opts.dryRun ? '[DRY RUN] ' : ''}Removing stars from messages matching: ${query}`);
2245
-
2246
- let result;
2247
- if (opts.batch) {
2248
- result = await gmail.bulk.batchModifyLabels({
2249
- query,
2250
- maxResults: parseInt(opts.max),
2251
- removeLabelIds: ['STARRED'],
2252
- dryRun: opts.dryRun,
2253
- });
2254
- } else {
2255
- result = await gmail.bulk.unstar({
2256
- query,
2257
- maxResults: parseInt(opts.max),
2258
- dryRun: opts.dryRun,
2259
- onProgress: (current, total) => {
2260
- process.stdout.write(`\r Progress: ${current}/${total}`);
2261
- },
2262
- });
2263
- console.log();
2264
- }
2265
-
2266
- success(`${opts.dryRun ? '[DRY RUN] ' : ''}Bulk unstar complete:`);
2267
- info(` Total: ${result.total}`);
2268
- info(` Success: ${result.success}`);
2269
- if (result.failed > 0) warn(` Failed: ${result.failed}`);
2270
- } catch (err) {
2271
- error(String(err));
2272
- process.exit(1);
2273
- }
2274
- });
2275
-
2276
- bulkCmd
2277
- .command('help-query')
2278
- .description('Show Gmail search query syntax examples')
2279
- .action(() => {
2280
- info(chalk.bold('\nGmail Search Query Syntax:\n'));
2281
-
2282
- info(chalk.cyan('Basic filters:'));
2283
- info(' from:user@example.com - Messages from a specific sender');
2284
- info(' to:user@example.com - Messages to a specific recipient');
2285
- info(' subject:invoice - Messages with "invoice" in subject');
2286
- info(' "exact phrase" - Messages containing exact phrase\n');
2287
-
2288
- info(chalk.cyan('Date filters:'));
2289
- info(' after:2024/01/01 - Messages after a date');
2290
- info(' before:2024/12/31 - Messages before a date');
2291
- info(' older_than:7d - Messages older than 7 days');
2292
- info(' newer_than:1m - Messages newer than 1 month\n');
2293
-
2294
- info(chalk.cyan('Label filters:'));
2295
- info(' label:work - Messages with a specific label');
2296
- info(' in:inbox - Messages in inbox');
2297
- info(' in:sent - Messages in sent');
2298
- info(' in:trash - Messages in trash');
2299
- info(' in:spam - Messages in spam\n');
2300
-
2301
- info(chalk.cyan('Status filters:'));
2302
- info(' is:unread - Unread messages');
2303
- info(' is:read - Read messages');
2304
- info(' is:starred - Starred messages');
2305
- info(' is:important - Important messages');
2306
- info(' has:attachment - Messages with attachments\n');
2307
-
2308
- info(chalk.cyan('Size filters:'));
2309
- info(' larger:10M - Messages larger than 10MB');
2310
- info(' smaller:1K - Messages smaller than 1KB\n');
2311
-
2312
- info(chalk.cyan('Combining filters:'));
2313
- info(' from:boss@company.com is:unread');
2314
- info(' subject:report after:2024/01/01 before:2024/06/01');
2315
- info(' from:@newsletter.com older_than:30d');
2316
- info(' {from:alice@ex.com from:bob@ex.com} - OR operator');
2317
- info(' -from:spam@ex.com - NOT operator (exclude)\n');
2318
-
2319
- info(chalk.cyan('Examples:'));
2320
- info(' bulk preview "from:newsletter@company.com older_than:30d"');
2321
- info(' bulk archive "from:@notifications.com is:read"');
2322
- info(' bulk trash "subject:unsubscribe older_than:90d" --dry-run');
2323
- info(' bulk label "from:@client.com" --add "Work/Clients"');
2324
- info(' bulk mark-read "is:unread older_than:7d" --batch');
2325
- });
2326
-
2327
- // Parse and execute
2328
- program.parse();