@kyoji2/intercom-cli 0.1.0 → 0.1.4

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.
package/src/client.ts CHANGED
@@ -47,6 +47,8 @@ function createDryRunProxy(client: IntercomClient, logger: Logger): IntercomClie
47
47
  "away",
48
48
  "tag",
49
49
  "untag",
50
+ "reply",
51
+ "manage",
50
52
  ];
51
53
 
52
54
  const createNestedProxy = <T extends object>(target: T, path: string[]): T => {
@@ -7,7 +7,7 @@ export interface AdminGetOptions extends GlobalOptions {
7
7
  }
8
8
 
9
9
  export async function cmdAdminList(options: GlobalOptions): Promise<void> {
10
- const token = await getTokenAsync();
10
+ const token = await getTokenAsync(options.configDir);
11
11
  if (!token) {
12
12
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
13
13
  }
@@ -40,7 +40,7 @@ export async function cmdAdminList(options: GlobalOptions): Promise<void> {
40
40
  }
41
41
 
42
42
  export async function cmdAdminGet(options: AdminGetOptions): Promise<void> {
43
- const token = await getTokenAsync();
43
+ const token = await getTokenAsync(options.configDir);
44
44
  if (!token) {
45
45
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
46
46
  }
@@ -34,8 +34,8 @@ export interface ArticleDeleteOptions extends GlobalOptions {
34
34
  id: string;
35
35
  }
36
36
 
37
- async function requireToken(): Promise<string> {
38
- const token = await getTokenAsync();
37
+ async function requireToken(configDir: string): Promise<string> {
38
+ const token = await getTokenAsync(configDir);
39
39
  if (!token) {
40
40
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
41
41
  }
@@ -43,7 +43,7 @@ async function requireToken(): Promise<string> {
43
43
  }
44
44
 
45
45
  export async function cmdArticleList(options: ArticleListOptions): Promise<void> {
46
- const token = await requireToken();
46
+ const token = await requireToken(options.configDir);
47
47
  const spinner = ora("Listing articles...").start();
48
48
 
49
49
  try {
@@ -76,7 +76,7 @@ export async function cmdArticleList(options: ArticleListOptions): Promise<void>
76
76
  }
77
77
 
78
78
  export async function cmdArticleGet(options: ArticleGetOptions): Promise<void> {
79
- const token = await requireToken();
79
+ const token = await requireToken(options.configDir);
80
80
  const spinner = ora("Fetching article...").start();
81
81
 
82
82
  try {
@@ -109,7 +109,7 @@ export async function cmdArticleGet(options: ArticleGetOptions): Promise<void> {
109
109
  }
110
110
 
111
111
  export async function cmdArticleSearch(options: ArticleSearchOptions): Promise<void> {
112
- const token = await requireToken();
112
+ const token = await requireToken(options.configDir);
113
113
  const spinner = ora("Searching articles...").start();
114
114
 
115
115
  try {
@@ -146,7 +146,7 @@ export async function cmdArticleSearch(options: ArticleSearchOptions): Promise<v
146
146
  }
147
147
 
148
148
  export async function cmdArticleCreate(options: ArticleCreateOptions): Promise<void> {
149
- const token = await requireToken();
149
+ const token = await requireToken(options.configDir);
150
150
  const spinner = ora("Creating article...").start();
151
151
 
152
152
  try {
@@ -184,7 +184,7 @@ export async function cmdArticleCreate(options: ArticleCreateOptions): Promise<v
184
184
  }
185
185
 
186
186
  export async function cmdArticleUpdate(options: ArticleUpdateOptions): Promise<void> {
187
- const token = await requireToken();
187
+ const token = await requireToken(options.configDir);
188
188
  const spinner = ora("Updating article...").start();
189
189
 
190
190
  try {
@@ -212,7 +212,7 @@ export async function cmdArticleUpdate(options: ArticleUpdateOptions): Promise<v
212
212
  }
213
213
 
214
214
  export async function cmdArticleDelete(options: ArticleDeleteOptions): Promise<void> {
215
- const token = await requireToken();
215
+ const token = await requireToken(options.configDir);
216
216
  const spinner = ora("Deleting article...").start();
217
217
 
218
218
  try {
@@ -43,7 +43,7 @@ export async function cmdLogin(options: LoginOptions): Promise<void> {
43
43
  throw new CLIError("Could not verify token", 401, "The token may be invalid or expired.");
44
44
  }
45
45
 
46
- await saveConfig({ token });
46
+ await saveConfig(options.configDir, { token });
47
47
  spinner.succeed("Logged in successfully");
48
48
 
49
49
  output(
@@ -65,12 +65,12 @@ export async function cmdLogin(options: LoginOptions): Promise<void> {
65
65
  }
66
66
 
67
67
  export async function cmdLogout(options: GlobalOptions): Promise<void> {
68
- await deleteConfig();
68
+ await deleteConfig(options.configDir);
69
69
  output({ status: "success", message: "Logged out successfully" }, options.format);
70
70
  }
71
71
 
72
72
  export async function cmdWhoami(options: GlobalOptions): Promise<void> {
73
- const token = await getTokenAsync();
73
+ const token = await getTokenAsync(options.configDir);
74
74
  if (!token) {
75
75
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
76
76
  }
@@ -24,8 +24,8 @@ export interface CompanyUpdateOptions extends GlobalOptions {
24
24
  json: string;
25
25
  }
26
26
 
27
- async function requireToken(): Promise<string> {
28
- const token = await getTokenAsync();
27
+ async function requireToken(configDir: string): Promise<string> {
28
+ const token = await getTokenAsync(configDir);
29
29
  if (!token) {
30
30
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
31
31
  }
@@ -33,7 +33,7 @@ async function requireToken(): Promise<string> {
33
33
  }
34
34
 
35
35
  export async function cmdCompanyCreate(options: CompanyCreateOptions): Promise<void> {
36
- const token = await requireToken();
36
+ const token = await requireToken(options.configDir);
37
37
  const spinner = ora("Creating company...").start();
38
38
 
39
39
  try {
@@ -78,7 +78,7 @@ export async function cmdCompanyCreate(options: CompanyCreateOptions): Promise<v
78
78
  }
79
79
 
80
80
  export async function cmdCompanyGet(options: CompanyGetOptions): Promise<void> {
81
- const token = await requireToken();
81
+ const token = await requireToken(options.configDir);
82
82
  const spinner = ora("Fetching company...").start();
83
83
 
84
84
  try {
@@ -114,7 +114,7 @@ export async function cmdCompanyGet(options: CompanyGetOptions): Promise<void> {
114
114
  }
115
115
 
116
116
  export async function cmdCompanyList(options: CompanyListOptions): Promise<void> {
117
- const token = await requireToken();
117
+ const token = await requireToken(options.configDir);
118
118
  const spinner = ora("Listing companies...").start();
119
119
 
120
120
  try {
@@ -147,7 +147,7 @@ export async function cmdCompanyList(options: CompanyListOptions): Promise<void>
147
147
  }
148
148
 
149
149
  export async function cmdCompanyUpdate(options: CompanyUpdateOptions): Promise<void> {
150
- const token = await requireToken();
150
+ const token = await requireToken(options.configDir);
151
151
  const spinner = ora("Updating company...").start();
152
152
 
153
153
  try {
@@ -55,8 +55,8 @@ export interface ContactAttachCompanyOptions extends GlobalOptions {
55
55
  companyId: string;
56
56
  }
57
57
 
58
- async function requireToken(): Promise<string> {
59
- const token = await getTokenAsync();
58
+ async function requireToken(configDir: string): Promise<string> {
59
+ const token = await getTokenAsync(configDir);
60
60
  if (!token) {
61
61
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
62
62
  }
@@ -64,7 +64,7 @@ async function requireToken(): Promise<string> {
64
64
  }
65
65
 
66
66
  export async function cmdContactCreate(options: ContactCreateOptions): Promise<void> {
67
- const token = await requireToken();
67
+ const token = await requireToken(options.configDir);
68
68
  const spinner = ora("Creating contact...").start();
69
69
 
70
70
  try {
@@ -105,7 +105,7 @@ export async function cmdContactCreate(options: ContactCreateOptions): Promise<v
105
105
  }
106
106
 
107
107
  export async function cmdContactGet(options: ContactGetOptions): Promise<void> {
108
- const token = await requireToken();
108
+ const token = await requireToken(options.configDir);
109
109
  const spinner = ora("Fetching contact...").start();
110
110
 
111
111
  try {
@@ -141,7 +141,7 @@ export async function cmdContactGet(options: ContactGetOptions): Promise<void> {
141
141
  }
142
142
 
143
143
  export async function cmdContactUpdate(options: ContactUpdateOptions): Promise<void> {
144
- const token = await requireToken();
144
+ const token = await requireToken(options.configDir);
145
145
  const spinner = ora("Updating contact...").start();
146
146
 
147
147
  try {
@@ -179,7 +179,7 @@ export async function cmdContactUpdate(options: ContactUpdateOptions): Promise<v
179
179
  }
180
180
 
181
181
  export async function cmdContactDelete(options: ContactDeleteOptions): Promise<void> {
182
- const token = await requireToken();
182
+ const token = await requireToken(options.configDir);
183
183
  const spinner = ora("Deleting contact...").start();
184
184
 
185
185
  try {
@@ -196,7 +196,7 @@ export async function cmdContactDelete(options: ContactDeleteOptions): Promise<v
196
196
  }
197
197
 
198
198
  export async function cmdContactSearch(options: ContactSearchOptions): Promise<void> {
199
- const token = await requireToken();
199
+ const token = await requireToken(options.configDir);
200
200
  const spinner = ora("Searching contacts...").start();
201
201
 
202
202
  try {
@@ -246,7 +246,7 @@ export async function cmdContactSearch(options: ContactSearchOptions): Promise<v
246
246
  }
247
247
 
248
248
  export async function cmdContactList(options: ContactListOptions): Promise<void> {
249
- const token = await requireToken();
249
+ const token = await requireToken(options.configDir);
250
250
  const spinner = ora("Listing contacts...").start();
251
251
 
252
252
  try {
@@ -277,7 +277,7 @@ export async function cmdContactList(options: ContactListOptions): Promise<void>
277
277
  }
278
278
 
279
279
  export async function cmdContactNote(options: ContactNoteOptions): Promise<void> {
280
- const token = await requireToken();
280
+ const token = await requireToken(options.configDir);
281
281
  const spinner = ora("Adding note...").start();
282
282
 
283
283
  try {
@@ -305,7 +305,7 @@ export async function cmdContactNote(options: ContactNoteOptions): Promise<void>
305
305
  }
306
306
 
307
307
  export async function cmdContactNotes(options: ContactNotesListOptions): Promise<void> {
308
- const token = await requireToken();
308
+ const token = await requireToken(options.configDir);
309
309
  const spinner = ora("Fetching notes...").start();
310
310
 
311
311
  try {
@@ -332,7 +332,7 @@ export async function cmdContactNotes(options: ContactNotesListOptions): Promise
332
332
  }
333
333
 
334
334
  export async function cmdContactTag(options: ContactTagOptions): Promise<void> {
335
- const token = await requireToken();
335
+ const token = await requireToken(options.configDir);
336
336
  const spinner = ora("Tagging contact...").start();
337
337
 
338
338
  try {
@@ -358,7 +358,7 @@ export async function cmdContactTag(options: ContactTagOptions): Promise<void> {
358
358
  }
359
359
 
360
360
  export async function cmdContactUntag(options: ContactTagOptions): Promise<void> {
361
- const token = await requireToken();
361
+ const token = await requireToken(options.configDir);
362
362
  const spinner = ora("Removing tag...").start();
363
363
 
364
364
  try {
@@ -384,7 +384,7 @@ export async function cmdContactUntag(options: ContactTagOptions): Promise<void>
384
384
  }
385
385
 
386
386
  export async function cmdContactAttachCompany(options: ContactAttachCompanyOptions): Promise<void> {
387
- const token = await requireToken();
387
+ const token = await requireToken(options.configDir);
388
388
  const spinner = ora("Attaching company...").start();
389
389
 
390
390
  try {
@@ -46,8 +46,16 @@ export interface ConversationSnoozeOptions extends GlobalOptions {
46
46
  until: string;
47
47
  }
48
48
 
49
- async function requireToken(): Promise<string> {
50
- const token = await getTokenAsync();
49
+ export interface ConversationConvertOptions extends GlobalOptions {
50
+ id: string;
51
+ ticketTypeId: string;
52
+ title?: string;
53
+ description?: string;
54
+ json?: string;
55
+ }
56
+
57
+ async function requireToken(configDir: string): Promise<string> {
58
+ const token = await getTokenAsync(configDir);
51
59
  if (!token) {
52
60
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
53
61
  }
@@ -55,7 +63,7 @@ async function requireToken(): Promise<string> {
55
63
  }
56
64
 
57
65
  export async function cmdConversationList(options: ConversationListOptions): Promise<void> {
58
- const token = await requireToken();
66
+ const token = await requireToken(options.configDir);
59
67
  const spinner = ora("Listing conversations...").start();
60
68
 
61
69
  try {
@@ -91,7 +99,7 @@ export async function cmdConversationList(options: ConversationListOptions): Pro
91
99
  }
92
100
 
93
101
  export async function cmdConversationGet(options: ConversationGetOptions): Promise<void> {
94
- const token = await requireToken();
102
+ const token = await requireToken(options.configDir);
95
103
  const spinner = ora("Fetching conversation...").start();
96
104
 
97
105
  try {
@@ -132,7 +140,7 @@ export async function cmdConversationGet(options: ConversationGetOptions): Promi
132
140
  }
133
141
 
134
142
  export async function cmdConversationSearch(options: ConversationSearchOptions): Promise<void> {
135
- const token = await requireToken();
143
+ const token = await requireToken(options.configDir);
136
144
  const spinner = ora("Searching conversations...").start();
137
145
 
138
146
  try {
@@ -192,7 +200,7 @@ export async function cmdConversationSearch(options: ConversationSearchOptions):
192
200
  }
193
201
 
194
202
  export async function cmdConversationReply(options: ConversationReplyOptions): Promise<void> {
195
- const token = await requireToken();
203
+ const token = await requireToken(options.configDir);
196
204
  const spinner = ora("Sending reply...").start();
197
205
 
198
206
  try {
@@ -225,7 +233,7 @@ export async function cmdConversationReply(options: ConversationReplyOptions): P
225
233
  }
226
234
 
227
235
  export async function cmdConversationAssign(options: ConversationAssignOptions): Promise<void> {
228
- const token = await requireToken();
236
+ const token = await requireToken(options.configDir);
229
237
  const spinner = ora("Assigning conversation...").start();
230
238
 
231
239
  try {
@@ -257,7 +265,7 @@ export async function cmdConversationAssign(options: ConversationAssignOptions):
257
265
  }
258
266
 
259
267
  export async function cmdConversationClose(options: ConversationCloseOptions): Promise<void> {
260
- const token = await requireToken();
268
+ const token = await requireToken(options.configDir);
261
269
  const spinner = ora("Closing conversation...").start();
262
270
 
263
271
  try {
@@ -288,7 +296,7 @@ export async function cmdConversationClose(options: ConversationCloseOptions): P
288
296
  }
289
297
 
290
298
  export async function cmdConversationOpen(options: ConversationOpenOptions): Promise<void> {
291
- const token = await requireToken();
299
+ const token = await requireToken(options.configDir);
292
300
  const spinner = ora("Opening conversation...").start();
293
301
 
294
302
  try {
@@ -318,7 +326,7 @@ export async function cmdConversationOpen(options: ConversationOpenOptions): Pro
318
326
  }
319
327
 
320
328
  export async function cmdConversationSnooze(options: ConversationSnoozeOptions): Promise<void> {
321
- const token = await requireToken();
329
+ const token = await requireToken(options.configDir);
322
330
  const spinner = ora("Snoozing conversation...").start();
323
331
 
324
332
  try {
@@ -348,3 +356,50 @@ export async function cmdConversationSnooze(options: ConversationSnoozeOptions):
348
356
  handleIntercomError(error);
349
357
  }
350
358
  }
359
+
360
+ export async function cmdConversationConvert(options: ConversationConvertOptions): Promise<void> {
361
+ const token = await requireToken(options.configDir);
362
+ const spinner = ora("Converting conversation to ticket...").start();
363
+
364
+ try {
365
+ const client = createClient({ token, dryRun: options.dryRun });
366
+
367
+ let attributes: Record<string, unknown> | undefined;
368
+ if (options.json) {
369
+ attributes = JSON.parse(options.json);
370
+ } else if (options.title || options.description) {
371
+ attributes = {};
372
+ if (options.title) {
373
+ attributes._default_title_ = options.title;
374
+ }
375
+ if (options.description) {
376
+ attributes._default_description_ = options.description;
377
+ }
378
+ }
379
+
380
+ const ticket = await client.conversations.convertToTicket({
381
+ conversation_id: Number.parseInt(options.id, 10),
382
+ ticket_type_id: options.ticketTypeId,
383
+ attributes,
384
+ });
385
+
386
+ spinner.succeed("Conversation converted to ticket");
387
+
388
+ output(
389
+ {
390
+ id: ticket?.id,
391
+ ticket_id: ticket?.ticket_id,
392
+ category: ticket?.category,
393
+ ticket_type: ticket?.ticket_type,
394
+ ticket_state: ticket?.ticket_state,
395
+ ticket_attributes: ticket?.ticket_attributes,
396
+ open: ticket?.open,
397
+ created_at: ticket?.created_at,
398
+ },
399
+ options.format,
400
+ );
401
+ } catch (error) {
402
+ spinner.fail("Failed to convert conversation to ticket");
403
+ handleIntercomError(error);
404
+ }
405
+ }
@@ -13,8 +13,8 @@ export interface EventListOptions extends GlobalOptions {
13
13
  userId: string;
14
14
  }
15
15
 
16
- async function requireToken(): Promise<string> {
17
- const token = await getTokenAsync();
16
+ async function requireToken(configDir: string): Promise<string> {
17
+ const token = await getTokenAsync(configDir);
18
18
  if (!token) {
19
19
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
20
20
  }
@@ -22,7 +22,7 @@ async function requireToken(): Promise<string> {
22
22
  }
23
23
 
24
24
  export async function cmdEventTrack(options: EventTrackOptions): Promise<void> {
25
- const token = await requireToken();
25
+ const token = await requireToken(options.configDir);
26
26
  const spinner = ora("Tracking event...").start();
27
27
 
28
28
  try {
@@ -61,7 +61,7 @@ export async function cmdEventTrack(options: EventTrackOptions): Promise<void> {
61
61
  }
62
62
 
63
63
  export async function cmdEventList(options: EventListOptions): Promise<void> {
64
- const token = await requireToken();
64
+ const token = await requireToken(options.configDir);
65
65
  const spinner = ora("Fetching events...").start();
66
66
 
67
67
  try {
@@ -1,7 +1,4 @@
1
- // Auth commands
2
-
3
1
  export type { AdminGetOptions } from "./admins.ts";
4
- // Admin commands
5
2
  export { cmdAdminGet, cmdAdminList } from "./admins.ts";
6
3
  export type {
7
4
  ArticleCreateOptions,
@@ -11,7 +8,6 @@ export type {
11
8
  ArticleSearchOptions,
12
9
  ArticleUpdateOptions,
13
10
  } from "./articles.ts";
14
- // Article commands
15
11
  export {
16
12
  cmdArticleCreate,
17
13
  cmdArticleDelete,
@@ -23,7 +19,6 @@ export {
23
19
  export type { LoginOptions } from "./auth.ts";
24
20
  export { cmdLogin, cmdLogout, cmdWhoami } from "./auth.ts";
25
21
  export type { CompanyCreateOptions, CompanyGetOptions, CompanyListOptions, CompanyUpdateOptions } from "./companies.ts";
26
- // Company commands
27
22
  export { cmdCompanyCreate, cmdCompanyGet, cmdCompanyList, cmdCompanyUpdate } from "./companies.ts";
28
23
  export type {
29
24
  ContactAttachCompanyOptions,
@@ -37,7 +32,6 @@ export type {
37
32
  ContactTagOptions,
38
33
  ContactUpdateOptions,
39
34
  } from "./contacts.ts";
40
- // Contact commands
41
35
  export {
42
36
  cmdContactAttachCompany,
43
37
  cmdContactCreate,
@@ -54,6 +48,7 @@ export {
54
48
  export type {
55
49
  ConversationAssignOptions,
56
50
  ConversationCloseOptions,
51
+ ConversationConvertOptions,
57
52
  ConversationGetOptions,
58
53
  ConversationListOptions,
59
54
  ConversationOpenOptions,
@@ -61,10 +56,10 @@ export type {
61
56
  ConversationSearchOptions,
62
57
  ConversationSnoozeOptions,
63
58
  } from "./conversations.ts";
64
- // Conversation commands
65
59
  export {
66
60
  cmdConversationAssign,
67
61
  cmdConversationClose,
62
+ cmdConversationConvert,
68
63
  cmdConversationGet,
69
64
  cmdConversationList,
70
65
  cmdConversationOpen,
@@ -73,10 +68,29 @@ export {
73
68
  cmdConversationSnooze,
74
69
  } from "./conversations.ts";
75
70
  export type { EventListOptions, EventTrackOptions } from "./events.ts";
76
- // Event commands
77
71
  export { cmdEventList, cmdEventTrack } from "./events.ts";
78
- // Overview commands
79
72
  export { cmdContext, cmdSchema } from "./overview.ts";
80
73
  export type { TagCreateOptions, TagDeleteOptions, TagGetOptions } from "./tags.ts";
81
- // Tag commands
82
74
  export { cmdTagCreate, cmdTagDelete, cmdTagGet, cmdTagList } from "./tags.ts";
75
+ export type {
76
+ TicketAssignOptions,
77
+ TicketCloseOptions,
78
+ TicketCreateOptions,
79
+ TicketDeleteOptions,
80
+ TicketGetOptions,
81
+ TicketReplyOptions,
82
+ TicketSearchOptions,
83
+ TicketUpdateOptions,
84
+ } from "./tickets.ts";
85
+ export {
86
+ cmdTicketAssign,
87
+ cmdTicketClose,
88
+ cmdTicketCreate,
89
+ cmdTicketDelete,
90
+ cmdTicketGet,
91
+ cmdTicketReply,
92
+ cmdTicketSearch,
93
+ cmdTicketUpdate,
94
+ } from "./tickets.ts";
95
+ export type { TicketTypeGetOptions, TicketTypeListOptions } from "./ticketTypes.ts";
96
+ export { cmdTicketTypeGet, cmdTicketTypeList } from "./ticketTypes.ts";
@@ -3,7 +3,7 @@ import { createClient, handleIntercomError } from "../client.ts";
3
3
  import { CLIError, type GlobalOptions, getTokenAsync, output } from "../utils/index.ts";
4
4
 
5
5
  export async function cmdContext(options: GlobalOptions): Promise<void> {
6
- const token = await getTokenAsync();
6
+ const token = await getTokenAsync(options.configDir);
7
7
  if (!token) {
8
8
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
9
9
  }
@@ -14,8 +14,8 @@ export interface TagDeleteOptions extends GlobalOptions {
14
14
  id: string;
15
15
  }
16
16
 
17
- async function requireToken(): Promise<string> {
18
- const token = await getTokenAsync();
17
+ async function requireToken(configDir: string): Promise<string> {
18
+ const token = await getTokenAsync(configDir);
19
19
  if (!token) {
20
20
  throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
21
21
  }
@@ -23,7 +23,7 @@ async function requireToken(): Promise<string> {
23
23
  }
24
24
 
25
25
  export async function cmdTagList(options: GlobalOptions): Promise<void> {
26
- const token = await requireToken();
26
+ const token = await requireToken(options.configDir);
27
27
  const spinner = ora("Fetching tags...").start();
28
28
 
29
29
  try {
@@ -49,7 +49,7 @@ export async function cmdTagList(options: GlobalOptions): Promise<void> {
49
49
  }
50
50
 
51
51
  export async function cmdTagCreate(options: TagCreateOptions): Promise<void> {
52
- const token = await requireToken();
52
+ const token = await requireToken(options.configDir);
53
53
  const spinner = ora("Creating tag...").start();
54
54
 
55
55
  try {
@@ -72,7 +72,7 @@ export async function cmdTagCreate(options: TagCreateOptions): Promise<void> {
72
72
  }
73
73
 
74
74
  export async function cmdTagGet(options: TagGetOptions): Promise<void> {
75
- const token = await requireToken();
75
+ const token = await requireToken(options.configDir);
76
76
  const spinner = ora("Fetching tag...").start();
77
77
 
78
78
  try {
@@ -95,7 +95,7 @@ export async function cmdTagGet(options: TagGetOptions): Promise<void> {
95
95
  }
96
96
 
97
97
  export async function cmdTagDelete(options: TagDeleteOptions): Promise<void> {
98
- const token = await requireToken();
98
+ const token = await requireToken(options.configDir);
99
99
  const spinner = ora("Deleting tag...").start();
100
100
 
101
101
  try {
@@ -0,0 +1,76 @@
1
+ import ora from "ora";
2
+ import { createClient, handleIntercomError } from "../client.ts";
3
+ import { CLIError, type GlobalOptions, getTokenAsync, output } from "../utils/index.ts";
4
+
5
+ export interface TicketTypeListOptions extends GlobalOptions {}
6
+
7
+ export interface TicketTypeGetOptions extends GlobalOptions {
8
+ id: string;
9
+ }
10
+
11
+ async function requireToken(configDir: string): Promise<string> {
12
+ const token = await getTokenAsync(configDir);
13
+ if (!token) {
14
+ throw new CLIError("Not logged in", 401, "Run 'intercom login' to authenticate.");
15
+ }
16
+ return token;
17
+ }
18
+
19
+ export async function cmdTicketTypeList(options: TicketTypeListOptions): Promise<void> {
20
+ const token = await requireToken(options.configDir);
21
+ const spinner = ora("Listing ticket types...").start();
22
+
23
+ try {
24
+ const client = createClient({ token, dryRun: options.dryRun });
25
+ const result = await client.ticketTypes.list();
26
+
27
+ spinner.stop();
28
+
29
+ const ticketTypes = (result.data ?? [])
30
+ .filter((tt): tt is NonNullable<typeof tt> => tt !== undefined)
31
+ .map((tt) => ({
32
+ id: tt.id,
33
+ name: tt.name,
34
+ description: tt.description,
35
+ category: tt.category,
36
+ icon: tt.icon,
37
+ archived: tt.archived,
38
+ created_at: tt.created_at,
39
+ updated_at: tt.updated_at,
40
+ }));
41
+
42
+ output({ total: ticketTypes.length, ticket_types: ticketTypes }, options.format);
43
+ } catch (error) {
44
+ spinner.fail("Failed to list ticket types");
45
+ handleIntercomError(error);
46
+ }
47
+ }
48
+
49
+ export async function cmdTicketTypeGet(options: TicketTypeGetOptions): Promise<void> {
50
+ const token = await requireToken(options.configDir);
51
+ const spinner = ora("Fetching ticket type...").start();
52
+
53
+ try {
54
+ const client = createClient({ token, dryRun: options.dryRun });
55
+ const ticketType = await client.ticketTypes.get({ ticket_type_id: options.id });
56
+
57
+ spinner.stop();
58
+
59
+ output(
60
+ {
61
+ id: ticketType?.id,
62
+ name: ticketType?.name,
63
+ description: ticketType?.description,
64
+ category: ticketType?.category,
65
+ icon: ticketType?.icon,
66
+ archived: ticketType?.archived,
67
+ created_at: ticketType?.created_at,
68
+ updated_at: ticketType?.updated_at,
69
+ },
70
+ options.format,
71
+ );
72
+ } catch (error) {
73
+ spinner.fail("Failed to fetch ticket type");
74
+ handleIntercomError(error);
75
+ }
76
+ }