@hasna/connectors 0.4.0 → 0.4.2

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 (390) hide show
  1. package/bin/index.js +189 -2
  2. package/bin/mcp.js +176 -1
  3. package/bin/serve.js +175 -0
  4. package/connectors/connect-airtable/.env.example +11 -0
  5. package/connectors/connect-airtable/CLAUDE.md +121 -0
  6. package/connectors/connect-airtable/README.md +193 -0
  7. package/connectors/connect-airtable/package.json +50 -0
  8. package/connectors/connect-airtable/src/api/client.ts +139 -0
  9. package/connectors/connect-airtable/src/api/index.ts +405 -0
  10. package/connectors/connect-airtable/src/cli/index.ts +637 -0
  11. package/connectors/connect-airtable/src/index.ts +20 -0
  12. package/connectors/connect-airtable/src/types/index.ts +349 -0
  13. package/connectors/connect-airtable/src/utils/config.ts +197 -0
  14. package/connectors/connect-airtable/tsconfig.json +16 -0
  15. package/connectors/connect-amplitude/.env.example +11 -0
  16. package/connectors/connect-amplitude/CLAUDE.md +121 -0
  17. package/connectors/connect-amplitude/README.md +193 -0
  18. package/connectors/connect-amplitude/package.json +51 -0
  19. package/connectors/connect-amplitude/src/api/client.ts +144 -0
  20. package/connectors/connect-amplitude/src/api/index.ts +215 -0
  21. package/connectors/connect-amplitude/src/cli/index.ts +532 -0
  22. package/connectors/connect-amplitude/src/index.ts +22 -0
  23. package/connectors/connect-amplitude/src/types/index.ts +329 -0
  24. package/connectors/connect-amplitude/src/utils/config.ts +208 -0
  25. package/connectors/connect-amplitude/tsconfig.json +16 -0
  26. package/connectors/connect-calendly/.env.example +11 -0
  27. package/connectors/connect-calendly/CLAUDE.md +272 -0
  28. package/connectors/connect-calendly/README.md +193 -0
  29. package/connectors/connect-calendly/package.json +51 -0
  30. package/connectors/connect-calendly/scripts/release.ts +179 -0
  31. package/connectors/connect-calendly/src/api/client.ts +213 -0
  32. package/connectors/connect-calendly/src/api/example.ts +48 -0
  33. package/connectors/connect-calendly/src/api/index.ts +51 -0
  34. package/connectors/connect-calendly/src/cli/index.ts +254 -0
  35. package/connectors/connect-calendly/src/index.ts +103 -0
  36. package/connectors/connect-calendly/src/types/index.ts +237 -0
  37. package/connectors/connect-calendly/src/utils/auth.ts +274 -0
  38. package/connectors/connect-calendly/src/utils/bulk.ts +212 -0
  39. package/connectors/connect-calendly/src/utils/config.ts +326 -0
  40. package/connectors/connect-calendly/src/utils/output.ts +175 -0
  41. package/connectors/connect-calendly/src/utils/settings.ts +114 -0
  42. package/connectors/connect-calendly/src/utils/storage.ts +198 -0
  43. package/connectors/connect-calendly/tsconfig.json +16 -0
  44. package/connectors/connect-convertkit/.env.example +11 -0
  45. package/connectors/connect-convertkit/CLAUDE.md +272 -0
  46. package/connectors/connect-convertkit/README.md +193 -0
  47. package/connectors/connect-convertkit/package.json +51 -0
  48. package/connectors/connect-convertkit/scripts/release.ts +179 -0
  49. package/connectors/connect-convertkit/src/api/client.ts +213 -0
  50. package/connectors/connect-convertkit/src/api/example.ts +48 -0
  51. package/connectors/connect-convertkit/src/api/index.ts +51 -0
  52. package/connectors/connect-convertkit/src/cli/index.ts +254 -0
  53. package/connectors/connect-convertkit/src/index.ts +103 -0
  54. package/connectors/connect-convertkit/src/types/index.ts +237 -0
  55. package/connectors/connect-convertkit/src/utils/auth.ts +274 -0
  56. package/connectors/connect-convertkit/src/utils/bulk.ts +212 -0
  57. package/connectors/connect-convertkit/src/utils/config.ts +326 -0
  58. package/connectors/connect-convertkit/src/utils/output.ts +175 -0
  59. package/connectors/connect-convertkit/src/utils/settings.ts +114 -0
  60. package/connectors/connect-convertkit/src/utils/storage.ts +198 -0
  61. package/connectors/connect-convertkit/tsconfig.json +16 -0
  62. package/connectors/connect-crisp/.env.example +11 -0
  63. package/connectors/connect-crisp/CLAUDE.md +272 -0
  64. package/connectors/connect-crisp/README.md +193 -0
  65. package/connectors/connect-crisp/package.json +51 -0
  66. package/connectors/connect-crisp/scripts/release.ts +179 -0
  67. package/connectors/connect-crisp/src/api/client.ts +213 -0
  68. package/connectors/connect-crisp/src/api/example.ts +48 -0
  69. package/connectors/connect-crisp/src/api/index.ts +51 -0
  70. package/connectors/connect-crisp/src/cli/index.ts +254 -0
  71. package/connectors/connect-crisp/src/index.ts +103 -0
  72. package/connectors/connect-crisp/src/types/index.ts +237 -0
  73. package/connectors/connect-crisp/src/utils/auth.ts +274 -0
  74. package/connectors/connect-crisp/src/utils/bulk.ts +212 -0
  75. package/connectors/connect-crisp/src/utils/config.ts +326 -0
  76. package/connectors/connect-crisp/src/utils/output.ts +175 -0
  77. package/connectors/connect-crisp/src/utils/settings.ts +114 -0
  78. package/connectors/connect-crisp/src/utils/storage.ts +198 -0
  79. package/connectors/connect-crisp/tsconfig.json +16 -0
  80. package/connectors/connect-docusign/.env.example +11 -0
  81. package/connectors/connect-docusign/CLAUDE.md +128 -0
  82. package/connectors/connect-docusign/README.md +193 -0
  83. package/connectors/connect-docusign/package.json +52 -0
  84. package/connectors/connect-docusign/src/api/client.ts +133 -0
  85. package/connectors/connect-docusign/src/api/index.ts +178 -0
  86. package/connectors/connect-docusign/src/cli/index.ts +381 -0
  87. package/connectors/connect-docusign/src/index.ts +23 -0
  88. package/connectors/connect-docusign/src/types/index.ts +208 -0
  89. package/connectors/connect-docusign/src/utils/config.ts +125 -0
  90. package/connectors/connect-docusign/src/utils/output.ts +119 -0
  91. package/connectors/connect-docusign/tsconfig.json +16 -0
  92. package/connectors/connect-drift/.env.example +11 -0
  93. package/connectors/connect-drift/CLAUDE.md +272 -0
  94. package/connectors/connect-drift/README.md +193 -0
  95. package/connectors/connect-drift/package.json +51 -0
  96. package/connectors/connect-drift/scripts/release.ts +179 -0
  97. package/connectors/connect-drift/src/api/client.ts +213 -0
  98. package/connectors/connect-drift/src/api/example.ts +48 -0
  99. package/connectors/connect-drift/src/api/index.ts +51 -0
  100. package/connectors/connect-drift/src/cli/index.ts +254 -0
  101. package/connectors/connect-drift/src/index.ts +103 -0
  102. package/connectors/connect-drift/src/types/index.ts +237 -0
  103. package/connectors/connect-drift/src/utils/auth.ts +274 -0
  104. package/connectors/connect-drift/src/utils/bulk.ts +212 -0
  105. package/connectors/connect-drift/src/utils/config.ts +326 -0
  106. package/connectors/connect-drift/src/utils/output.ts +175 -0
  107. package/connectors/connect-drift/src/utils/settings.ts +114 -0
  108. package/connectors/connect-drift/src/utils/storage.ts +198 -0
  109. package/connectors/connect-drift/tsconfig.json +16 -0
  110. package/connectors/connect-freshdesk/.env.example +11 -0
  111. package/connectors/connect-freshdesk/CLAUDE.md +272 -0
  112. package/connectors/connect-freshdesk/README.md +193 -0
  113. package/connectors/connect-freshdesk/package.json +51 -0
  114. package/connectors/connect-freshdesk/scripts/release.ts +179 -0
  115. package/connectors/connect-freshdesk/src/api/client.ts +213 -0
  116. package/connectors/connect-freshdesk/src/api/example.ts +48 -0
  117. package/connectors/connect-freshdesk/src/api/index.ts +51 -0
  118. package/connectors/connect-freshdesk/src/cli/index.ts +254 -0
  119. package/connectors/connect-freshdesk/src/index.ts +103 -0
  120. package/connectors/connect-freshdesk/src/types/index.ts +237 -0
  121. package/connectors/connect-freshdesk/src/utils/auth.ts +274 -0
  122. package/connectors/connect-freshdesk/src/utils/bulk.ts +212 -0
  123. package/connectors/connect-freshdesk/src/utils/config.ts +326 -0
  124. package/connectors/connect-freshdesk/src/utils/output.ts +175 -0
  125. package/connectors/connect-freshdesk/src/utils/settings.ts +114 -0
  126. package/connectors/connect-freshdesk/src/utils/storage.ts +198 -0
  127. package/connectors/connect-freshdesk/tsconfig.json +16 -0
  128. package/connectors/connect-gumroad/.env.example +11 -0
  129. package/connectors/connect-gumroad/CLAUDE.md +272 -0
  130. package/connectors/connect-gumroad/README.md +193 -0
  131. package/connectors/connect-gumroad/package.json +51 -0
  132. package/connectors/connect-gumroad/scripts/release.ts +179 -0
  133. package/connectors/connect-gumroad/src/api/client.ts +213 -0
  134. package/connectors/connect-gumroad/src/api/example.ts +48 -0
  135. package/connectors/connect-gumroad/src/api/index.ts +51 -0
  136. package/connectors/connect-gumroad/src/cli/index.ts +254 -0
  137. package/connectors/connect-gumroad/src/index.ts +103 -0
  138. package/connectors/connect-gumroad/src/types/index.ts +237 -0
  139. package/connectors/connect-gumroad/src/utils/auth.ts +274 -0
  140. package/connectors/connect-gumroad/src/utils/bulk.ts +212 -0
  141. package/connectors/connect-gumroad/src/utils/config.ts +326 -0
  142. package/connectors/connect-gumroad/src/utils/output.ts +175 -0
  143. package/connectors/connect-gumroad/src/utils/settings.ts +114 -0
  144. package/connectors/connect-gumroad/src/utils/storage.ts +198 -0
  145. package/connectors/connect-gumroad/tsconfig.json +16 -0
  146. package/connectors/connect-hubspot/.env.example +11 -0
  147. package/connectors/connect-hubspot/CLAUDE.md +128 -0
  148. package/connectors/connect-hubspot/README.md +193 -0
  149. package/connectors/connect-hubspot/package.json +52 -0
  150. package/connectors/connect-hubspot/src/api/client.ts +136 -0
  151. package/connectors/connect-hubspot/src/api/index.ts +379 -0
  152. package/connectors/connect-hubspot/src/cli/index.ts +589 -0
  153. package/connectors/connect-hubspot/src/index.ts +21 -0
  154. package/connectors/connect-hubspot/src/types/index.ts +285 -0
  155. package/connectors/connect-hubspot/src/utils/config.ts +205 -0
  156. package/connectors/connect-hubspot/src/utils/output.ts +119 -0
  157. package/connectors/connect-hubspot/tsconfig.json +16 -0
  158. package/connectors/connect-intercom/.env.example +11 -0
  159. package/connectors/connect-intercom/CLAUDE.md +131 -0
  160. package/connectors/connect-intercom/README.md +193 -0
  161. package/connectors/connect-intercom/package.json +52 -0
  162. package/connectors/connect-intercom/src/api/client.ts +132 -0
  163. package/connectors/connect-intercom/src/api/index.ts +366 -0
  164. package/connectors/connect-intercom/src/cli/index.ts +831 -0
  165. package/connectors/connect-intercom/src/index.ts +21 -0
  166. package/connectors/connect-intercom/src/types/index.ts +650 -0
  167. package/connectors/connect-intercom/src/utils/config.ts +157 -0
  168. package/connectors/connect-intercom/src/utils/output.ts +119 -0
  169. package/connectors/connect-intercom/tsconfig.json +16 -0
  170. package/connectors/connect-lemonsqueezy/.env.example +11 -0
  171. package/connectors/connect-lemonsqueezy/CLAUDE.md +128 -0
  172. package/connectors/connect-lemonsqueezy/README.md +193 -0
  173. package/connectors/connect-lemonsqueezy/package.json +52 -0
  174. package/connectors/connect-lemonsqueezy/src/api/client.ts +133 -0
  175. package/connectors/connect-lemonsqueezy/src/api/index.ts +502 -0
  176. package/connectors/connect-lemonsqueezy/src/cli/index.ts +723 -0
  177. package/connectors/connect-lemonsqueezy/src/index.ts +21 -0
  178. package/connectors/connect-lemonsqueezy/src/types/index.ts +353 -0
  179. package/connectors/connect-lemonsqueezy/src/utils/config.ts +205 -0
  180. package/connectors/connect-lemonsqueezy/src/utils/output.ts +119 -0
  181. package/connectors/connect-lemonsqueezy/tsconfig.json +16 -0
  182. package/connectors/connect-linkedin/.env.example +11 -0
  183. package/connectors/connect-linkedin/CLAUDE.md +124 -0
  184. package/connectors/connect-linkedin/README.md +193 -0
  185. package/connectors/connect-linkedin/package.json +52 -0
  186. package/connectors/connect-linkedin/src/api/client.ts +132 -0
  187. package/connectors/connect-linkedin/src/api/index.ts +313 -0
  188. package/connectors/connect-linkedin/src/cli/index.ts +548 -0
  189. package/connectors/connect-linkedin/src/index.ts +21 -0
  190. package/connectors/connect-linkedin/src/types/index.ts +472 -0
  191. package/connectors/connect-linkedin/src/utils/config.ts +157 -0
  192. package/connectors/connect-linkedin/src/utils/output.ts +119 -0
  193. package/connectors/connect-linkedin/tsconfig.json +16 -0
  194. package/connectors/connect-mailchimp/.env.example +11 -0
  195. package/connectors/connect-mailchimp/CLAUDE.md +127 -0
  196. package/connectors/connect-mailchimp/README.md +193 -0
  197. package/connectors/connect-mailchimp/package.json +52 -0
  198. package/connectors/connect-mailchimp/src/api/client.ts +162 -0
  199. package/connectors/connect-mailchimp/src/api/index.ts +580 -0
  200. package/connectors/connect-mailchimp/src/cli/index.ts +822 -0
  201. package/connectors/connect-mailchimp/src/index.ts +23 -0
  202. package/connectors/connect-mailchimp/src/types/index.ts +585 -0
  203. package/connectors/connect-mailchimp/src/utils/config.ts +208 -0
  204. package/connectors/connect-mailchimp/src/utils/output.ts +119 -0
  205. package/connectors/connect-mailchimp/tsconfig.json +16 -0
  206. package/connectors/connect-mongodb/.env.example +11 -0
  207. package/connectors/connect-mongodb/CLAUDE.md +272 -0
  208. package/connectors/connect-mongodb/README.md +193 -0
  209. package/connectors/connect-mongodb/package.json +51 -0
  210. package/connectors/connect-mongodb/scripts/release.ts +179 -0
  211. package/connectors/connect-mongodb/src/api/client.ts +213 -0
  212. package/connectors/connect-mongodb/src/api/example.ts +48 -0
  213. package/connectors/connect-mongodb/src/api/index.ts +51 -0
  214. package/connectors/connect-mongodb/src/cli/index.ts +254 -0
  215. package/connectors/connect-mongodb/src/index.ts +103 -0
  216. package/connectors/connect-mongodb/src/types/index.ts +237 -0
  217. package/connectors/connect-mongodb/src/utils/auth.ts +274 -0
  218. package/connectors/connect-mongodb/src/utils/bulk.ts +212 -0
  219. package/connectors/connect-mongodb/src/utils/config.ts +326 -0
  220. package/connectors/connect-mongodb/src/utils/output.ts +175 -0
  221. package/connectors/connect-mongodb/src/utils/settings.ts +114 -0
  222. package/connectors/connect-mongodb/src/utils/storage.ts +198 -0
  223. package/connectors/connect-mongodb/tsconfig.json +16 -0
  224. package/connectors/connect-netlify/.env.example +11 -0
  225. package/connectors/connect-netlify/CLAUDE.md +170 -0
  226. package/connectors/connect-netlify/README.md +193 -0
  227. package/connectors/connect-netlify/package.json +53 -0
  228. package/connectors/connect-netlify/src/api/client.ts +132 -0
  229. package/connectors/connect-netlify/src/api/index.ts +533 -0
  230. package/connectors/connect-netlify/src/cli/index.ts +985 -0
  231. package/connectors/connect-netlify/src/index.ts +22 -0
  232. package/connectors/connect-netlify/src/types/index.ts +423 -0
  233. package/connectors/connect-netlify/src/utils/config.ts +171 -0
  234. package/connectors/connect-netlify/src/utils/output.ts +119 -0
  235. package/connectors/connect-netlify/tsconfig.json +16 -0
  236. package/connectors/connect-paypal/.env.example +11 -0
  237. package/connectors/connect-paypal/CLAUDE.md +128 -0
  238. package/connectors/connect-paypal/README.md +193 -0
  239. package/connectors/connect-paypal/package.json +51 -0
  240. package/connectors/connect-paypal/src/api/client.ts +182 -0
  241. package/connectors/connect-paypal/src/api/index.ts +235 -0
  242. package/connectors/connect-paypal/src/cli/index.ts +559 -0
  243. package/connectors/connect-paypal/src/index.ts +23 -0
  244. package/connectors/connect-paypal/src/types/index.ts +377 -0
  245. package/connectors/connect-paypal/src/utils/config.ts +125 -0
  246. package/connectors/connect-paypal/src/utils/output.ts +119 -0
  247. package/connectors/connect-paypal/tsconfig.json +16 -0
  248. package/connectors/connect-pinterest/.env.example +11 -0
  249. package/connectors/connect-pinterest/CLAUDE.md +115 -0
  250. package/connectors/connect-pinterest/README.md +193 -0
  251. package/connectors/connect-pinterest/package.json +52 -0
  252. package/connectors/connect-pinterest/src/api/client.ts +125 -0
  253. package/connectors/connect-pinterest/src/api/index.ts +203 -0
  254. package/connectors/connect-pinterest/src/cli/index.ts +653 -0
  255. package/connectors/connect-pinterest/src/index.ts +21 -0
  256. package/connectors/connect-pinterest/src/types/index.ts +268 -0
  257. package/connectors/connect-pinterest/src/utils/config.ts +157 -0
  258. package/connectors/connect-pinterest/src/utils/output.ts +119 -0
  259. package/connectors/connect-pinterest/tsconfig.json +16 -0
  260. package/connectors/connect-posthog/.env.example +11 -0
  261. package/connectors/connect-posthog/CLAUDE.md +272 -0
  262. package/connectors/connect-posthog/README.md +193 -0
  263. package/connectors/connect-posthog/package.json +51 -0
  264. package/connectors/connect-posthog/scripts/release.ts +179 -0
  265. package/connectors/connect-posthog/src/api/client.ts +213 -0
  266. package/connectors/connect-posthog/src/api/example.ts +48 -0
  267. package/connectors/connect-posthog/src/api/index.ts +51 -0
  268. package/connectors/connect-posthog/src/cli/index.ts +254 -0
  269. package/connectors/connect-posthog/src/index.ts +103 -0
  270. package/connectors/connect-posthog/src/types/index.ts +237 -0
  271. package/connectors/connect-posthog/src/utils/auth.ts +274 -0
  272. package/connectors/connect-posthog/src/utils/bulk.ts +212 -0
  273. package/connectors/connect-posthog/src/utils/config.ts +326 -0
  274. package/connectors/connect-posthog/src/utils/output.ts +175 -0
  275. package/connectors/connect-posthog/src/utils/settings.ts +114 -0
  276. package/connectors/connect-posthog/src/utils/storage.ts +198 -0
  277. package/connectors/connect-posthog/tsconfig.json +16 -0
  278. package/connectors/connect-salesforce/.env.example +11 -0
  279. package/connectors/connect-salesforce/CLAUDE.md +128 -0
  280. package/connectors/connect-salesforce/README.md +193 -0
  281. package/connectors/connect-salesforce/package.json +53 -0
  282. package/connectors/connect-salesforce/src/api/client.ts +150 -0
  283. package/connectors/connect-salesforce/src/api/index.ts +367 -0
  284. package/connectors/connect-salesforce/src/cli/index.ts +594 -0
  285. package/connectors/connect-salesforce/src/index.ts +21 -0
  286. package/connectors/connect-salesforce/src/types/index.ts +292 -0
  287. package/connectors/connect-salesforce/src/utils/config.ts +208 -0
  288. package/connectors/connect-salesforce/src/utils/output.ts +119 -0
  289. package/connectors/connect-salesforce/tsconfig.json +16 -0
  290. package/connectors/connect-segment/.env.example +11 -0
  291. package/connectors/connect-segment/CLAUDE.md +272 -0
  292. package/connectors/connect-segment/README.md +193 -0
  293. package/connectors/connect-segment/package.json +51 -0
  294. package/connectors/connect-segment/scripts/release.ts +179 -0
  295. package/connectors/connect-segment/src/api/client.ts +213 -0
  296. package/connectors/connect-segment/src/api/example.ts +48 -0
  297. package/connectors/connect-segment/src/api/index.ts +51 -0
  298. package/connectors/connect-segment/src/cli/index.ts +254 -0
  299. package/connectors/connect-segment/src/index.ts +103 -0
  300. package/connectors/connect-segment/src/types/index.ts +237 -0
  301. package/connectors/connect-segment/src/utils/auth.ts +274 -0
  302. package/connectors/connect-segment/src/utils/bulk.ts +212 -0
  303. package/connectors/connect-segment/src/utils/config.ts +326 -0
  304. package/connectors/connect-segment/src/utils/output.ts +175 -0
  305. package/connectors/connect-segment/src/utils/settings.ts +114 -0
  306. package/connectors/connect-segment/src/utils/storage.ts +198 -0
  307. package/connectors/connect-segment/tsconfig.json +16 -0
  308. package/connectors/connect-sendgrid/.env.example +11 -0
  309. package/connectors/connect-sendgrid/CLAUDE.md +125 -0
  310. package/connectors/connect-sendgrid/README.md +193 -0
  311. package/connectors/connect-sendgrid/package.json +53 -0
  312. package/connectors/connect-sendgrid/src/api/client.ts +137 -0
  313. package/connectors/connect-sendgrid/src/api/index.ts +588 -0
  314. package/connectors/connect-sendgrid/src/cli/index.ts +764 -0
  315. package/connectors/connect-sendgrid/src/index.ts +21 -0
  316. package/connectors/connect-sendgrid/src/types/index.ts +403 -0
  317. package/connectors/connect-sendgrid/src/utils/config.ts +197 -0
  318. package/connectors/connect-sendgrid/src/utils/output.ts +119 -0
  319. package/connectors/connect-sendgrid/tsconfig.json +16 -0
  320. package/connectors/connect-supabase/.env.example +11 -0
  321. package/connectors/connect-supabase/CLAUDE.md +132 -0
  322. package/connectors/connect-supabase/README.md +193 -0
  323. package/connectors/connect-supabase/package.json +52 -0
  324. package/connectors/connect-supabase/src/api/client.ts +231 -0
  325. package/connectors/connect-supabase/src/api/index.ts +439 -0
  326. package/connectors/connect-supabase/src/cli/index.ts +691 -0
  327. package/connectors/connect-supabase/src/index.ts +24 -0
  328. package/connectors/connect-supabase/src/types/index.ts +215 -0
  329. package/connectors/connect-supabase/src/utils/config.ts +219 -0
  330. package/connectors/connect-supabase/tsconfig.json +16 -0
  331. package/connectors/connect-vercel/.env.example +11 -0
  332. package/connectors/connect-vercel/CLAUDE.md +142 -0
  333. package/connectors/connect-vercel/README.md +193 -0
  334. package/connectors/connect-vercel/package.json +52 -0
  335. package/connectors/connect-vercel/src/api/client.ts +139 -0
  336. package/connectors/connect-vercel/src/api/index.ts +384 -0
  337. package/connectors/connect-vercel/src/cli/index.ts +740 -0
  338. package/connectors/connect-vercel/src/index.ts +24 -0
  339. package/connectors/connect-vercel/src/types/index.ts +350 -0
  340. package/connectors/connect-vercel/src/utils/config.ts +182 -0
  341. package/connectors/connect-vercel/src/utils/output.ts +119 -0
  342. package/connectors/connect-vercel/tsconfig.json +16 -0
  343. package/connectors/connect-zendesk/.env.example +10 -0
  344. package/connectors/connect-zendesk/.github/workflows/deploy.yml +51 -0
  345. package/connectors/connect-zendesk/CLAUDE.md +78 -0
  346. package/connectors/connect-zendesk/Makefile +129 -0
  347. package/connectors/connect-zendesk/README.md +295 -0
  348. package/connectors/connect-zendesk/SCAFFOLD.md +178 -0
  349. package/connectors/connect-zendesk/nginx-connector.conf +218 -0
  350. package/connectors/connect-zendesk/nginx.conf +61 -0
  351. package/connectors/connect-zendesk/package.json +71 -0
  352. package/connectors/connect-zendesk/scripts/init.sh +62 -0
  353. package/connectors/connect-zendesk/scripts/publish.ts +210 -0
  354. package/connectors/connect-zendesk/server/index.js +142 -0
  355. package/connectors/connect-zendesk/src/api/automations.ts +95 -0
  356. package/connectors/connect-zendesk/src/api/brands.ts +80 -0
  357. package/connectors/connect-zendesk/src/api/bulk.ts +838 -0
  358. package/connectors/connect-zendesk/src/api/client.test.ts +315 -0
  359. package/connectors/connect-zendesk/src/api/client.ts +173 -0
  360. package/connectors/connect-zendesk/src/api/example.ts +59 -0
  361. package/connectors/connect-zendesk/src/api/groups.ts +60 -0
  362. package/connectors/connect-zendesk/src/api/index.test.ts +111 -0
  363. package/connectors/connect-zendesk/src/api/index.ts +131 -0
  364. package/connectors/connect-zendesk/src/api/macros.ts +124 -0
  365. package/connectors/connect-zendesk/src/api/organizations.ts +85 -0
  366. package/connectors/connect-zendesk/src/api/slas.ts +80 -0
  367. package/connectors/connect-zendesk/src/api/ticket-fields.ts +98 -0
  368. package/connectors/connect-zendesk/src/api/tickets.test.ts +215 -0
  369. package/connectors/connect-zendesk/src/api/tickets.ts +103 -0
  370. package/connectors/connect-zendesk/src/api/triggers.test.ts +204 -0
  371. package/connectors/connect-zendesk/src/api/triggers.ts +125 -0
  372. package/connectors/connect-zendesk/src/api/users.test.ts +180 -0
  373. package/connectors/connect-zendesk/src/api/users.ts +108 -0
  374. package/connectors/connect-zendesk/src/api/views.test.ts +223 -0
  375. package/connectors/connect-zendesk/src/api/views.ts +145 -0
  376. package/connectors/connect-zendesk/src/api/webhooks.test.ts +208 -0
  377. package/connectors/connect-zendesk/src/api/webhooks.ts +118 -0
  378. package/connectors/connect-zendesk/src/cli/index.ts +1478 -0
  379. package/connectors/connect-zendesk/src/index.ts +36 -0
  380. package/connectors/connect-zendesk/src/server/index.ts +204 -0
  381. package/connectors/connect-zendesk/src/types/index.ts +910 -0
  382. package/connectors/connect-zendesk/src/utils/config.test.ts +193 -0
  383. package/connectors/connect-zendesk/src/utils/config.ts +526 -0
  384. package/connectors/connect-zendesk/src/utils/export.ts +338 -0
  385. package/connectors/connect-zendesk/src/utils/logger.ts +105 -0
  386. package/connectors/connect-zendesk/src/utils/output.test.ts +137 -0
  387. package/connectors/connect-zendesk/src/utils/output.ts +119 -0
  388. package/connectors/connect-zendesk/tsconfig.json +31 -0
  389. package/dist/index.js +175 -0
  390. package/package.json +1 -1
@@ -0,0 +1,831 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { Intercom } from '../api';
5
+ import {
6
+ getAccessToken,
7
+ setAccessToken,
8
+ clearConfig,
9
+ getConfigDir,
10
+ setProfileOverride,
11
+ getCurrentProfile,
12
+ setCurrentProfile,
13
+ listProfiles,
14
+ createProfile,
15
+ deleteProfile,
16
+ profileExists,
17
+ loadProfile,
18
+ } from '../utils/config';
19
+ import type { OutputFormat } from '../utils/output';
20
+ import { success, error, info, print } from '../utils/output';
21
+
22
+ const CONNECTOR_NAME = 'connect-intercom';
23
+ const VERSION = '0.0.1';
24
+
25
+ const program = new Command();
26
+
27
+ program
28
+ .name(CONNECTOR_NAME)
29
+ .description('Intercom connector - Manage contacts, conversations, companies, and customer engagement')
30
+ .version(VERSION)
31
+ .option('-t, --token <token>', 'Access token (overrides config)')
32
+ .option('-f, --format <format>', 'Output format (json, pretty)', 'pretty')
33
+ .option('-p, --profile <profile>', 'Use a specific profile')
34
+ .hook('preAction', (thisCommand) => {
35
+ const opts = thisCommand.opts();
36
+ if (opts.profile) {
37
+ if (!profileExists(opts.profile)) {
38
+ error(`Profile "${opts.profile}" does not exist. Create it with "${CONNECTOR_NAME} profile create ${opts.profile}"`);
39
+ process.exit(1);
40
+ }
41
+ setProfileOverride(opts.profile);
42
+ }
43
+ if (opts.token) {
44
+ process.env.INTERCOM_ACCESS_TOKEN = opts.token;
45
+ }
46
+ });
47
+
48
+ function getFormat(cmd: Command): OutputFormat {
49
+ const parent = cmd.parent;
50
+ return (parent?.opts().format || 'pretty') as OutputFormat;
51
+ }
52
+
53
+ function getClient(): Intercom {
54
+ const accessToken = getAccessToken();
55
+ if (!accessToken) {
56
+ error(`No access token configured. Run "${CONNECTOR_NAME} config set-token <token>" or set INTERCOM_ACCESS_TOKEN environment variable.`);
57
+ process.exit(1);
58
+ }
59
+ return new Intercom({ accessToken });
60
+ }
61
+
62
+ // ============================================
63
+ // Profile Commands
64
+ // ============================================
65
+ const profileCmd = program
66
+ .command('profile')
67
+ .description('Manage configuration profiles');
68
+
69
+ profileCmd
70
+ .command('list')
71
+ .description('List all profiles')
72
+ .action(() => {
73
+ const profiles = listProfiles();
74
+ const current = getCurrentProfile();
75
+
76
+ if (profiles.length === 0) {
77
+ info('No profiles found. Use "profile create <name>" to create one.');
78
+ return;
79
+ }
80
+
81
+ success(`Profiles:`);
82
+ profiles.forEach(p => {
83
+ const isActive = p === current ? chalk.green(' (active)') : '';
84
+ console.log(` ${p}${isActive}`);
85
+ });
86
+ });
87
+
88
+ profileCmd
89
+ .command('use <name>')
90
+ .description('Switch to a profile')
91
+ .action((name: string) => {
92
+ if (!profileExists(name)) {
93
+ error(`Profile "${name}" does not exist. Create it with "profile create ${name}"`);
94
+ process.exit(1);
95
+ }
96
+ setCurrentProfile(name);
97
+ success(`Switched to profile: ${name}`);
98
+ });
99
+
100
+ profileCmd
101
+ .command('create <name>')
102
+ .description('Create a new profile')
103
+ .option('--token <token>', 'Access token')
104
+ .option('--use', 'Switch to this profile after creation')
105
+ .action((name: string, opts) => {
106
+ if (profileExists(name)) {
107
+ error(`Profile "${name}" already exists`);
108
+ process.exit(1);
109
+ }
110
+
111
+ createProfile(name, {
112
+ accessToken: opts.token,
113
+ });
114
+ success(`Profile "${name}" created`);
115
+
116
+ if (opts.use) {
117
+ setCurrentProfile(name);
118
+ info(`Switched to profile: ${name}`);
119
+ }
120
+ });
121
+
122
+ profileCmd
123
+ .command('delete <name>')
124
+ .description('Delete a profile')
125
+ .action((name: string) => {
126
+ if (name === 'default') {
127
+ error('Cannot delete the default profile');
128
+ process.exit(1);
129
+ }
130
+ if (deleteProfile(name)) {
131
+ success(`Profile "${name}" deleted`);
132
+ } else {
133
+ error(`Profile "${name}" not found`);
134
+ process.exit(1);
135
+ }
136
+ });
137
+
138
+ profileCmd
139
+ .command('show [name]')
140
+ .description('Show profile configuration')
141
+ .action((name?: string) => {
142
+ const profileName = name || getCurrentProfile();
143
+ const config = loadProfile(profileName);
144
+ const active = getCurrentProfile();
145
+
146
+ console.log(chalk.bold(`Profile: ${profileName}${profileName === active ? chalk.green(' (active)') : ''}`));
147
+ info(`Access Token: ${config.accessToken ? `${config.accessToken.substring(0, 8)}...` : chalk.gray('not set')}`);
148
+ });
149
+
150
+ // ============================================
151
+ // Config Commands
152
+ // ============================================
153
+ const configCmd = program
154
+ .command('config')
155
+ .description('Manage CLI configuration');
156
+
157
+ configCmd
158
+ .command('set-token <token>')
159
+ .description('Set access token')
160
+ .action((token: string) => {
161
+ setAccessToken(token);
162
+ success(`Access token saved to profile: ${getCurrentProfile()}`);
163
+ });
164
+
165
+ configCmd
166
+ .command('show')
167
+ .description('Show current configuration')
168
+ .action(() => {
169
+ const profileName = getCurrentProfile();
170
+ const accessToken = getAccessToken();
171
+
172
+ console.log(chalk.bold(`Active Profile: ${profileName}`));
173
+ info(`Config directory: ${getConfigDir()}`);
174
+ info(`Access Token: ${accessToken ? `${accessToken.substring(0, 8)}...` : chalk.gray('not set')}`);
175
+ });
176
+
177
+ configCmd
178
+ .command('clear')
179
+ .description('Clear configuration')
180
+ .action(() => {
181
+ clearConfig();
182
+ success(`Configuration cleared for profile: ${getCurrentProfile()}`);
183
+ });
184
+
185
+ // ============================================
186
+ // Contact Commands
187
+ // ============================================
188
+ const contactCmd = program
189
+ .command('contact')
190
+ .description('Manage contacts (users and leads)');
191
+
192
+ contactCmd
193
+ .command('list')
194
+ .description('List contacts')
195
+ .option('-n, --per-page <number>', 'Results per page', '20')
196
+ .option('--starting-after <cursor>', 'Pagination cursor')
197
+ .action(async (opts) => {
198
+ try {
199
+ const client = getClient();
200
+ const result = await client.listContacts({
201
+ per_page: parseInt(opts.perPage),
202
+ starting_after: opts.startingAfter,
203
+ });
204
+ print(result, getFormat(contactCmd));
205
+ } catch (err) {
206
+ error(String(err));
207
+ process.exit(1);
208
+ }
209
+ });
210
+
211
+ contactCmd
212
+ .command('get <id>')
213
+ .description('Get a contact by ID')
214
+ .action(async (id: string) => {
215
+ try {
216
+ const client = getClient();
217
+ const result = await client.getContact(id);
218
+ print(result, getFormat(contactCmd));
219
+ } catch (err) {
220
+ error(String(err));
221
+ process.exit(1);
222
+ }
223
+ });
224
+
225
+ contactCmd
226
+ .command('create')
227
+ .description('Create a new contact')
228
+ .option('--email <email>', 'Email address')
229
+ .option('--name <name>', 'Contact name')
230
+ .option('--phone <phone>', 'Phone number')
231
+ .option('--role <role>', 'Role (user or lead)', 'user')
232
+ .option('--external-id <id>', 'External ID')
233
+ .action(async (opts) => {
234
+ try {
235
+ const client = getClient();
236
+ const result = await client.createContact({
237
+ email: opts.email,
238
+ name: opts.name,
239
+ phone: opts.phone,
240
+ role: opts.role,
241
+ external_id: opts.externalId,
242
+ });
243
+ success('Contact created!');
244
+ print(result, getFormat(contactCmd));
245
+ } catch (err) {
246
+ error(String(err));
247
+ process.exit(1);
248
+ }
249
+ });
250
+
251
+ contactCmd
252
+ .command('update <id>')
253
+ .description('Update a contact')
254
+ .option('--email <email>', 'Email address')
255
+ .option('--name <name>', 'Contact name')
256
+ .option('--phone <phone>', 'Phone number')
257
+ .action(async (id: string, opts) => {
258
+ try {
259
+ const client = getClient();
260
+ const result = await client.updateContact(id, {
261
+ email: opts.email,
262
+ name: opts.name,
263
+ phone: opts.phone,
264
+ });
265
+ success('Contact updated!');
266
+ print(result, getFormat(contactCmd));
267
+ } catch (err) {
268
+ error(String(err));
269
+ process.exit(1);
270
+ }
271
+ });
272
+
273
+ contactCmd
274
+ .command('delete <id>')
275
+ .description('Delete a contact')
276
+ .action(async (id: string) => {
277
+ try {
278
+ const client = getClient();
279
+ await client.deleteContact(id);
280
+ success('Contact deleted!');
281
+ } catch (err) {
282
+ error(String(err));
283
+ process.exit(1);
284
+ }
285
+ });
286
+
287
+ contactCmd
288
+ .command('search')
289
+ .description('Search contacts')
290
+ .requiredOption('--field <field>', 'Field to search (email, name, phone, etc.)')
291
+ .requiredOption('--value <value>', 'Value to search for')
292
+ .option('--operator <op>', 'Search operator (=, !=, ~, etc.)', '=')
293
+ .action(async (opts) => {
294
+ try {
295
+ const client = getClient();
296
+ const result = await client.searchContacts({
297
+ query: {
298
+ field: opts.field,
299
+ operator: opts.operator,
300
+ value: opts.value,
301
+ },
302
+ });
303
+ print(result, getFormat(contactCmd));
304
+ } catch (err) {
305
+ error(String(err));
306
+ process.exit(1);
307
+ }
308
+ });
309
+
310
+ // ============================================
311
+ // Conversation Commands
312
+ // ============================================
313
+ const conversationCmd = program
314
+ .command('conversation')
315
+ .description('Manage conversations');
316
+
317
+ conversationCmd
318
+ .command('list')
319
+ .description('List conversations')
320
+ .option('-n, --per-page <number>', 'Results per page', '20')
321
+ .option('--starting-after <cursor>', 'Pagination cursor')
322
+ .action(async (opts) => {
323
+ try {
324
+ const client = getClient();
325
+ const result = await client.listConversations({
326
+ per_page: parseInt(opts.perPage),
327
+ starting_after: opts.startingAfter,
328
+ });
329
+ print(result, getFormat(conversationCmd));
330
+ } catch (err) {
331
+ error(String(err));
332
+ process.exit(1);
333
+ }
334
+ });
335
+
336
+ conversationCmd
337
+ .command('get <id>')
338
+ .description('Get a conversation by ID')
339
+ .option('--plaintext', 'Return body as plaintext')
340
+ .action(async (id: string, opts) => {
341
+ try {
342
+ const client = getClient();
343
+ const result = await client.getConversation(id, opts.plaintext ? 'plaintext' : undefined);
344
+ print(result, getFormat(conversationCmd));
345
+ } catch (err) {
346
+ error(String(err));
347
+ process.exit(1);
348
+ }
349
+ });
350
+
351
+ conversationCmd
352
+ .command('reply <id>')
353
+ .description('Reply to a conversation')
354
+ .requiredOption('--body <body>', 'Reply body')
355
+ .requiredOption('--admin-id <id>', 'Admin ID')
356
+ .option('--note', 'Send as internal note instead of reply')
357
+ .action(async (id: string, opts) => {
358
+ try {
359
+ const client = getClient();
360
+ const result = await client.replyToConversation(id, {
361
+ message_type: opts.note ? 'note' : 'comment',
362
+ type: 'admin',
363
+ body: opts.body,
364
+ admin_id: opts.adminId,
365
+ });
366
+ success('Reply sent!');
367
+ print(result, getFormat(conversationCmd));
368
+ } catch (err) {
369
+ error(String(err));
370
+ process.exit(1);
371
+ }
372
+ });
373
+
374
+ conversationCmd
375
+ .command('close <id>')
376
+ .description('Close a conversation')
377
+ .requiredOption('--admin-id <id>', 'Admin ID')
378
+ .option('--body <body>', 'Optional closing message')
379
+ .action(async (id: string, opts) => {
380
+ try {
381
+ const client = getClient();
382
+ const result = await client.closeConversation(id, opts.adminId, opts.body);
383
+ success('Conversation closed!');
384
+ print(result, getFormat(conversationCmd));
385
+ } catch (err) {
386
+ error(String(err));
387
+ process.exit(1);
388
+ }
389
+ });
390
+
391
+ conversationCmd
392
+ .command('open <id>')
393
+ .description('Reopen a conversation')
394
+ .requiredOption('--admin-id <id>', 'Admin ID')
395
+ .action(async (id: string, opts) => {
396
+ try {
397
+ const client = getClient();
398
+ const result = await client.openConversation(id, opts.adminId);
399
+ success('Conversation reopened!');
400
+ print(result, getFormat(conversationCmd));
401
+ } catch (err) {
402
+ error(String(err));
403
+ process.exit(1);
404
+ }
405
+ });
406
+
407
+ conversationCmd
408
+ .command('assign <id>')
409
+ .description('Assign a conversation')
410
+ .requiredOption('--admin-id <id>', 'Admin ID performing the action')
411
+ .option('--assignee-id <id>', 'Admin ID to assign to')
412
+ .option('--team-id <id>', 'Team ID to assign to')
413
+ .action(async (id: string, opts) => {
414
+ try {
415
+ const client = getClient();
416
+ const result = await client.assignConversation(id, opts.adminId, opts.assigneeId, opts.teamId);
417
+ success('Conversation assigned!');
418
+ print(result, getFormat(conversationCmd));
419
+ } catch (err) {
420
+ error(String(err));
421
+ process.exit(1);
422
+ }
423
+ });
424
+
425
+ // ============================================
426
+ // Company Commands
427
+ // ============================================
428
+ const companyCmd = program
429
+ .command('company')
430
+ .description('Manage companies');
431
+
432
+ companyCmd
433
+ .command('list')
434
+ .description('List companies')
435
+ .option('-n, --per-page <number>', 'Results per page', '20')
436
+ .option('--page <number>', 'Page number')
437
+ .action(async (opts) => {
438
+ try {
439
+ const client = getClient();
440
+ const result = await client.listCompanies({
441
+ per_page: parseInt(opts.perPage),
442
+ page: opts.page ? parseInt(opts.page) : undefined,
443
+ });
444
+ print(result, getFormat(companyCmd));
445
+ } catch (err) {
446
+ error(String(err));
447
+ process.exit(1);
448
+ }
449
+ });
450
+
451
+ companyCmd
452
+ .command('get <id>')
453
+ .description('Get a company by ID')
454
+ .action(async (id: string) => {
455
+ try {
456
+ const client = getClient();
457
+ const result = await client.getCompany(id);
458
+ print(result, getFormat(companyCmd));
459
+ } catch (err) {
460
+ error(String(err));
461
+ process.exit(1);
462
+ }
463
+ });
464
+
465
+ companyCmd
466
+ .command('create')
467
+ .description('Create or update a company')
468
+ .requiredOption('--company-id <id>', 'Company ID (your internal ID)')
469
+ .option('--name <name>', 'Company name')
470
+ .option('--website <url>', 'Website URL')
471
+ .option('--industry <industry>', 'Industry')
472
+ .option('--size <size>', 'Number of employees')
473
+ .action(async (opts) => {
474
+ try {
475
+ const client = getClient();
476
+ const result = await client.createOrUpdateCompany({
477
+ company_id: opts.companyId,
478
+ name: opts.name,
479
+ website: opts.website,
480
+ industry: opts.industry,
481
+ size: opts.size ? parseInt(opts.size) : undefined,
482
+ });
483
+ success('Company created/updated!');
484
+ print(result, getFormat(companyCmd));
485
+ } catch (err) {
486
+ error(String(err));
487
+ process.exit(1);
488
+ }
489
+ });
490
+
491
+ companyCmd
492
+ .command('delete <id>')
493
+ .description('Delete a company')
494
+ .action(async (id: string) => {
495
+ try {
496
+ const client = getClient();
497
+ await client.deleteCompany(id);
498
+ success('Company deleted!');
499
+ } catch (err) {
500
+ error(String(err));
501
+ process.exit(1);
502
+ }
503
+ });
504
+
505
+ companyCmd
506
+ .command('contacts <id>')
507
+ .description('List contacts for a company')
508
+ .option('-n, --per-page <number>', 'Results per page', '20')
509
+ .action(async (id: string, opts) => {
510
+ try {
511
+ const client = getClient();
512
+ const result = await client.listCompanyContacts(id, {
513
+ per_page: parseInt(opts.perPage),
514
+ });
515
+ print(result, getFormat(companyCmd));
516
+ } catch (err) {
517
+ error(String(err));
518
+ process.exit(1);
519
+ }
520
+ });
521
+
522
+ // ============================================
523
+ // Tag Commands
524
+ // ============================================
525
+ const tagCmd = program
526
+ .command('tag')
527
+ .description('Manage tags');
528
+
529
+ tagCmd
530
+ .command('list')
531
+ .description('List all tags')
532
+ .action(async () => {
533
+ try {
534
+ const client = getClient();
535
+ const result = await client.listTags();
536
+ print(result, getFormat(tagCmd));
537
+ } catch (err) {
538
+ error(String(err));
539
+ process.exit(1);
540
+ }
541
+ });
542
+
543
+ tagCmd
544
+ .command('create <name>')
545
+ .description('Create a new tag')
546
+ .action(async (name: string) => {
547
+ try {
548
+ const client = getClient();
549
+ const result = await client.createTag({ name });
550
+ success('Tag created!');
551
+ print(result, getFormat(tagCmd));
552
+ } catch (err) {
553
+ error(String(err));
554
+ process.exit(1);
555
+ }
556
+ });
557
+
558
+ tagCmd
559
+ .command('delete <id>')
560
+ .description('Delete a tag')
561
+ .action(async (id: string) => {
562
+ try {
563
+ const client = getClient();
564
+ await client.deleteTag(id);
565
+ success('Tag deleted!');
566
+ } catch (err) {
567
+ error(String(err));
568
+ process.exit(1);
569
+ }
570
+ });
571
+
572
+ // ============================================
573
+ // Admin Commands
574
+ // ============================================
575
+ const adminCmd = program
576
+ .command('admin')
577
+ .description('Manage admins');
578
+
579
+ adminCmd
580
+ .command('list')
581
+ .description('List all admins')
582
+ .action(async () => {
583
+ try {
584
+ const client = getClient();
585
+ const result = await client.listAdmins();
586
+ print(result, getFormat(adminCmd));
587
+ } catch (err) {
588
+ error(String(err));
589
+ process.exit(1);
590
+ }
591
+ });
592
+
593
+ adminCmd
594
+ .command('get <id>')
595
+ .description('Get an admin by ID')
596
+ .action(async (id: string) => {
597
+ try {
598
+ const client = getClient();
599
+ const result = await client.getAdmin(id);
600
+ print(result, getFormat(adminCmd));
601
+ } catch (err) {
602
+ error(String(err));
603
+ process.exit(1);
604
+ }
605
+ });
606
+
607
+ adminCmd
608
+ .command('me')
609
+ .description('Get current admin')
610
+ .action(async () => {
611
+ try {
612
+ const client = getClient();
613
+ const result = await client.getCurrentAdmin();
614
+ print(result, getFormat(adminCmd));
615
+ } catch (err) {
616
+ error(String(err));
617
+ process.exit(1);
618
+ }
619
+ });
620
+
621
+ // ============================================
622
+ // Team Commands
623
+ // ============================================
624
+ const teamCmd = program
625
+ .command('team')
626
+ .description('Manage teams');
627
+
628
+ teamCmd
629
+ .command('list')
630
+ .description('List all teams')
631
+ .action(async () => {
632
+ try {
633
+ const client = getClient();
634
+ const result = await client.listTeams();
635
+ print(result, getFormat(teamCmd));
636
+ } catch (err) {
637
+ error(String(err));
638
+ process.exit(1);
639
+ }
640
+ });
641
+
642
+ teamCmd
643
+ .command('get <id>')
644
+ .description('Get a team by ID')
645
+ .action(async (id: string) => {
646
+ try {
647
+ const client = getClient();
648
+ const result = await client.getTeam(id);
649
+ print(result, getFormat(teamCmd));
650
+ } catch (err) {
651
+ error(String(err));
652
+ process.exit(1);
653
+ }
654
+ });
655
+
656
+ // ============================================
657
+ // Article Commands
658
+ // ============================================
659
+ const articleCmd = program
660
+ .command('article')
661
+ .description('Manage help center articles');
662
+
663
+ articleCmd
664
+ .command('list')
665
+ .description('List articles')
666
+ .option('-n, --per-page <number>', 'Results per page', '20')
667
+ .option('--page <number>', 'Page number')
668
+ .action(async (opts) => {
669
+ try {
670
+ const client = getClient();
671
+ const result = await client.listArticles({
672
+ per_page: parseInt(opts.perPage),
673
+ page: opts.page ? parseInt(opts.page) : undefined,
674
+ });
675
+ print(result, getFormat(articleCmd));
676
+ } catch (err) {
677
+ error(String(err));
678
+ process.exit(1);
679
+ }
680
+ });
681
+
682
+ articleCmd
683
+ .command('get <id>')
684
+ .description('Get an article by ID')
685
+ .action(async (id: string) => {
686
+ try {
687
+ const client = getClient();
688
+ const result = await client.getArticle(id);
689
+ print(result, getFormat(articleCmd));
690
+ } catch (err) {
691
+ error(String(err));
692
+ process.exit(1);
693
+ }
694
+ });
695
+
696
+ articleCmd
697
+ .command('create')
698
+ .description('Create a new article')
699
+ .requiredOption('--title <title>', 'Article title')
700
+ .requiredOption('--body <body>', 'Article body (HTML)')
701
+ .requiredOption('--author-id <id>', 'Author admin ID')
702
+ .option('--description <desc>', 'Article description')
703
+ .option('--state <state>', 'State (draft or published)', 'draft')
704
+ .action(async (opts) => {
705
+ try {
706
+ const client = getClient();
707
+ const result = await client.createArticle({
708
+ title: opts.title,
709
+ body: opts.body,
710
+ author_id: parseInt(opts.authorId),
711
+ description: opts.description,
712
+ state: opts.state,
713
+ });
714
+ success('Article created!');
715
+ print(result, getFormat(articleCmd));
716
+ } catch (err) {
717
+ error(String(err));
718
+ process.exit(1);
719
+ }
720
+ });
721
+
722
+ articleCmd
723
+ .command('delete <id>')
724
+ .description('Delete an article')
725
+ .action(async (id: string) => {
726
+ try {
727
+ const client = getClient();
728
+ await client.deleteArticle(id);
729
+ success('Article deleted!');
730
+ } catch (err) {
731
+ error(String(err));
732
+ process.exit(1);
733
+ }
734
+ });
735
+
736
+ // ============================================
737
+ // Event Commands
738
+ // ============================================
739
+ const eventCmd = program
740
+ .command('event')
741
+ .description('Track data events');
742
+
743
+ eventCmd
744
+ .command('track')
745
+ .description('Track a data event')
746
+ .requiredOption('--name <name>', 'Event name')
747
+ .option('--email <email>', 'User email')
748
+ .option('--user-id <id>', 'User ID')
749
+ .option('--metadata <json>', 'Event metadata as JSON')
750
+ .action(async (opts) => {
751
+ try {
752
+ const client = getClient();
753
+ await client.createDataEvent({
754
+ event_name: opts.name,
755
+ email: opts.email,
756
+ user_id: opts.userId,
757
+ metadata: opts.metadata ? JSON.parse(opts.metadata) : undefined,
758
+ });
759
+ success('Event tracked!');
760
+ } catch (err) {
761
+ error(String(err));
762
+ process.exit(1);
763
+ }
764
+ });
765
+
766
+ eventCmd
767
+ .command('list')
768
+ .description('List events for a user')
769
+ .requiredOption('--type <type>', 'Event type')
770
+ .option('--email <email>', 'User email')
771
+ .option('--user-id <id>', 'User ID')
772
+ .option('--intercom-user-id <id>', 'Intercom user ID')
773
+ .action(async (opts) => {
774
+ try {
775
+ const client = getClient();
776
+ const result = await client.listDataEvents({
777
+ type: opts.type,
778
+ email: opts.email,
779
+ user_id: opts.userId,
780
+ intercom_user_id: opts.intercomUserId,
781
+ });
782
+ print(result, getFormat(eventCmd));
783
+ } catch (err) {
784
+ error(String(err));
785
+ process.exit(1);
786
+ }
787
+ });
788
+
789
+ // ============================================
790
+ // Message Commands
791
+ // ============================================
792
+ const messageCmd = program
793
+ .command('message')
794
+ .description('Send outbound messages');
795
+
796
+ messageCmd
797
+ .command('send')
798
+ .description('Send an outbound message')
799
+ .requiredOption('--type <type>', 'Message type (email or inapp)')
800
+ .requiredOption('--body <body>', 'Message body')
801
+ .requiredOption('--from-id <id>', 'Admin ID to send from')
802
+ .option('--to-email <email>', 'Recipient email')
803
+ .option('--to-user-id <id>', 'Recipient user ID')
804
+ .option('--subject <subject>', 'Email subject (for email type)')
805
+ .action(async (opts) => {
806
+ try {
807
+ const client = getClient();
808
+ const result = await client.createMessage({
809
+ message_type: opts.type,
810
+ body: opts.body,
811
+ subject: opts.subject,
812
+ from: {
813
+ type: 'admin',
814
+ id: opts.fromId,
815
+ },
816
+ to: {
817
+ type: 'user',
818
+ email: opts.toEmail,
819
+ user_id: opts.toUserId,
820
+ },
821
+ });
822
+ success('Message sent!');
823
+ print(result, getFormat(messageCmd));
824
+ } catch (err) {
825
+ error(String(err));
826
+ process.exit(1);
827
+ }
828
+ });
829
+
830
+ // Parse and execute
831
+ program.parse();