exponential-sdk 1.2.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -290,6 +290,36 @@ interface TrpcClient {
290
290
  }) => Promise<unknown>;
291
291
  };
292
292
  };
293
+ tag: {
294
+ list: {
295
+ query: (input?: {
296
+ workspaceId?: string;
297
+ category?: string | null;
298
+ }) => Promise<unknown>;
299
+ };
300
+ create: {
301
+ mutate: (input: {
302
+ workspaceId: string;
303
+ name: string;
304
+ color: string;
305
+ description?: string;
306
+ category?: string | null;
307
+ }) => Promise<unknown>;
308
+ };
309
+ setEntityTags: {
310
+ mutate: (input: {
311
+ entityType: 'action' | 'ticket' | 'feature' | 'epic';
312
+ entityId: string;
313
+ tagIds: string[];
314
+ }) => Promise<unknown>;
315
+ };
316
+ listForEntity: {
317
+ query: (input: {
318
+ entityType: 'action' | 'ticket' | 'feature' | 'epic';
319
+ entityId: string;
320
+ }) => Promise<unknown[]>;
321
+ };
322
+ };
293
323
  product: {
294
324
  product: {
295
325
  list: {
@@ -375,17 +405,44 @@ interface TrpcClient {
375
405
  id: string;
376
406
  }) => Promise<unknown>;
377
407
  };
408
+ addUserStory: {
409
+ mutate: (input: {
410
+ featureId: string;
411
+ scopeId?: string;
412
+ asA?: string;
413
+ iWant?: string;
414
+ soThat?: string;
415
+ acceptanceCriteria?: string;
416
+ }) => Promise<unknown>;
417
+ };
418
+ updateUserStory: {
419
+ mutate: (input: {
420
+ id: string;
421
+ scopeId?: string | null;
422
+ asA?: string;
423
+ iWant?: string;
424
+ soThat?: string;
425
+ acceptanceCriteria?: string;
426
+ }) => Promise<unknown>;
427
+ };
428
+ deleteUserStory: {
429
+ mutate: (input: {
430
+ id: string;
431
+ }) => Promise<unknown>;
432
+ };
378
433
  };
379
434
  ticket: {
380
435
  list: {
381
436
  query: (input: {
382
- productId: string;
437
+ productId?: string;
383
438
  status?: string;
384
439
  type?: string;
385
440
  featureId?: string;
386
441
  epicId?: string;
387
442
  cycleId?: string;
388
443
  assigneeId?: string;
444
+ prUrl?: string;
445
+ branchName?: string;
389
446
  }) => Promise<unknown[]>;
390
447
  };
391
448
  getById: {
@@ -1059,13 +1116,23 @@ interface TicketDetail extends Ticket {
1059
1116
  }
1060
1117
 
1061
1118
  interface TicketListOptions {
1062
- productId: string;
1119
+ /**
1120
+ * Required for product-scoped queries. Optional when `prUrl` or `branchName`
1121
+ * is supplied — those filters are workspace-global (a PR URL or branch name
1122
+ * uniquely identifies a Ticket across all products in the workspace), so the
1123
+ * server resolves scope from the caller's auth context instead.
1124
+ */
1125
+ productId?: string;
1063
1126
  status?: TicketStatus;
1064
1127
  type?: TicketType;
1065
1128
  featureId?: string;
1066
1129
  epicId?: string;
1067
1130
  cycleId?: string;
1068
1131
  assigneeId?: string;
1132
+ /** Workspace-scoped lookup by `Ticket.prUrl` (exact match). */
1133
+ prUrl?: string;
1134
+ /** Workspace-scoped lookup by `Ticket.branchName` (exact match). */
1135
+ branchName?: string;
1069
1136
  }
1070
1137
  interface TicketCreateInput {
1071
1138
  productId: string;
@@ -1277,6 +1344,57 @@ declare class FeaturesApi {
1277
1344
  }>;
1278
1345
  }
1279
1346
 
1347
+ interface UserStory {
1348
+ id: string;
1349
+ featureId: string;
1350
+ scopeId: string | null;
1351
+ asA: string | null;
1352
+ iWant: string | null;
1353
+ soThat: string | null;
1354
+ acceptanceCriteria: string | null;
1355
+ displayOrder: number;
1356
+ createdAt: Date;
1357
+ updatedAt: Date;
1358
+ }
1359
+
1360
+ interface UserStoryListOptions {
1361
+ featureId: string;
1362
+ }
1363
+ interface UserStoryCreateInput {
1364
+ featureId: string;
1365
+ asA?: string;
1366
+ iWant?: string;
1367
+ soThat?: string;
1368
+ acceptanceCriteria?: string;
1369
+ scopeId?: string;
1370
+ }
1371
+ interface UserStoryUpdateInput {
1372
+ id: string;
1373
+ asA?: string;
1374
+ iWant?: string;
1375
+ soThat?: string;
1376
+ acceptanceCriteria?: string;
1377
+ scopeId?: string | null;
1378
+ }
1379
+ /**
1380
+ * Native, structured user stories on a feature (As a / I want / So that).
1381
+ *
1382
+ * Mirrors the existing `FeaturesApi` shape and the `client.product.feature.*`
1383
+ * call style. `list` derives from the feature's `getById` payload, which
1384
+ * already includes `userStories` ordered by `displayOrder` — there is no
1385
+ * dedicated list procedure.
1386
+ */
1387
+ declare class UserStoriesApi {
1388
+ private client;
1389
+ constructor(client: TrpcClient);
1390
+ list(options: UserStoryListOptions): Promise<UserStory[]>;
1391
+ create(input: UserStoryCreateInput): Promise<UserStory>;
1392
+ update(input: UserStoryUpdateInput): Promise<UserStory>;
1393
+ delete(id: string): Promise<{
1394
+ success: boolean;
1395
+ }>;
1396
+ }
1397
+
1280
1398
  type EpicStatus = 'OPEN' | 'IN_PROGRESS' | 'DONE' | 'CANCELLED';
1281
1399
  type EpicPriority = 'HIGH' | 'MEDIUM' | 'LOW' | 'NONE';
1282
1400
  interface Epic {
@@ -1336,6 +1454,64 @@ declare class EpicsApi {
1336
1454
  }>;
1337
1455
  }
1338
1456
 
1457
+ type TagEntityType = 'action' | 'ticket' | 'feature' | 'epic';
1458
+ interface Tag {
1459
+ id: string;
1460
+ name: string;
1461
+ slug: string;
1462
+ color: string;
1463
+ description: string | null;
1464
+ category: string | null;
1465
+ isSystem: boolean;
1466
+ workspaceId: string | null;
1467
+ createdById: string | null;
1468
+ createdAt: Date;
1469
+ updatedAt: Date;
1470
+ }
1471
+ interface TagListResult {
1472
+ globalTags: Tag[];
1473
+ workspaceTags: Tag[];
1474
+ allTags: Tag[];
1475
+ }
1476
+
1477
+ interface LabelListOptions {
1478
+ workspaceId?: string;
1479
+ category?: string | null;
1480
+ }
1481
+ interface LabelCreateInput {
1482
+ workspaceId: string;
1483
+ name: string;
1484
+ color: string;
1485
+ description?: string;
1486
+ category?: string | null;
1487
+ }
1488
+ interface SetEntityTagsInput {
1489
+ entityType: TagEntityType;
1490
+ entityId: string;
1491
+ tagIds: string[];
1492
+ }
1493
+ interface ListForEntityInput {
1494
+ entityType: TagEntityType;
1495
+ entityId: string;
1496
+ }
1497
+ interface SetEntityTagsResult {
1498
+ entityType: TagEntityType;
1499
+ entityId: string;
1500
+ tags: Tag[];
1501
+ }
1502
+ /**
1503
+ * Labels API. Backed by the server's `tag.*` tRPC procedures. "Label" is the
1504
+ * user-facing word for a Tag (specifically when `category` is null).
1505
+ */
1506
+ declare class LabelsApi {
1507
+ private client;
1508
+ constructor(client: TrpcClient);
1509
+ list(options?: LabelListOptions): Promise<TagListResult>;
1510
+ create(input: LabelCreateInput): Promise<Tag>;
1511
+ setEntityTags(input: SetEntityTagsInput): Promise<SetEntityTagsResult>;
1512
+ listForEntity(input: ListForEntityInput): Promise<Tag[]>;
1513
+ }
1514
+
1339
1515
  interface ExponentialConfig {
1340
1516
  apiUrl: string;
1341
1517
  token: string;
@@ -1370,11 +1546,13 @@ declare class ExponentialClient {
1370
1546
  tickets: TicketsApi;
1371
1547
  products: ProductsApi;
1372
1548
  features: FeaturesApi;
1549
+ userStories: UserStoriesApi;
1373
1550
  epics: EpicsApi;
1551
+ labels: LabelsApi;
1374
1552
  constructor(config: {
1375
1553
  token: string;
1376
1554
  apiUrl: string;
1377
1555
  });
1378
1556
  }
1379
1557
 
1380
- export { type Action, type ActionComment, type ActionCommentAddInput, type ActionCommentUpdateInput, type ActionCreateInput, type ActionOutput, type ActionStatus, type ActionUpdateInput, type ActionsListOutput, type AddInteractionInput, type CommentAuthor, type Contact, type ContactCreateInput, type ContactInteraction, type ContactListOutput, type ContactUpdateInput, type ContactsListOptions, type Deal, type DealActivity, type DealCreateInput, type DealMoveInput, type DealUpdateInput, type Epic, type EpicCreateInput, type EpicListOptions, type EpicPriority, type EpicStatus, type EpicUpdateInput, ExponentialClient, type ExponentialConfig, type Feature, type FeatureCreateInput, type FeatureListOptions, type FeatureScope, type FeatureScopeStatus, type FeatureStatus, type FeatureUpdateInput, type InteractionDirection, type InteractionType, type KanbanStatus, type Pipeline, type PipelineStage, type Priority, type Product, type ProductCreateInput, type ProductUpdateInput, type Project, type ProjectOutput, type ProjectsListOutput, type Ticket, type TicketAssignee, type TicketComment, type TicketCommentAddInput, type TicketCreateInput, type TicketDependencyEdge, type TicketDetail, type TicketListOptions, type TicketSearchOptions, type TicketStatus, type TicketType, type TicketUpdateInput, type Workspace, type WorkspaceOutput, type WorkspacesListOutput, clearConfig, createConfigStore, getConfigPath, isAuthenticated, isTRPCError, loadConfig, saveConfig };
1558
+ export { type Action, type ActionComment, type ActionCommentAddInput, type ActionCommentUpdateInput, type ActionCreateInput, type ActionOutput, type ActionStatus, type ActionUpdateInput, type ActionsListOutput, type AddInteractionInput, type CommentAuthor, type Contact, type ContactCreateInput, type ContactInteraction, type ContactListOutput, type ContactUpdateInput, type ContactsListOptions, type Deal, type DealActivity, type DealCreateInput, type DealMoveInput, type DealUpdateInput, type Epic, type EpicCreateInput, type EpicListOptions, type EpicPriority, type EpicStatus, type EpicUpdateInput, ExponentialClient, type ExponentialConfig, type Feature, type FeatureCreateInput, type FeatureListOptions, type FeatureScope, type FeatureScopeStatus, type FeatureStatus, type FeatureUpdateInput, type InteractionDirection, type InteractionType, type KanbanStatus, type LabelCreateInput, type LabelListOptions, type ListForEntityInput, type Pipeline, type PipelineStage, type Priority, type Product, type ProductCreateInput, type ProductUpdateInput, type Project, type ProjectOutput, type ProjectsListOutput, type SetEntityTagsInput, type SetEntityTagsResult, type Tag, type TagEntityType, type TagListResult, type Ticket, type TicketAssignee, type TicketComment, type TicketCommentAddInput, type TicketCreateInput, type TicketDependencyEdge, type TicketDetail, type TicketListOptions, type TicketSearchOptions, type TicketStatus, type TicketType, type TicketUpdateInput, type UserStory, type UserStoryCreateInput, type UserStoryListOptions, type UserStoryUpdateInput, type Workspace, type WorkspaceOutput, type WorkspacesListOutput, clearConfig, createConfigStore, getConfigPath, isAuthenticated, isTRPCError, loadConfig, saveConfig };
package/dist/index.js CHANGED
@@ -325,6 +325,34 @@ var FeaturesApi = class {
325
325
  }
326
326
  };
327
327
 
328
+ // src/userStories.ts
329
+ var UserStoriesApi = class {
330
+ constructor(client) {
331
+ this.client = client;
332
+ }
333
+ async list(options) {
334
+ const feature = await this.client.product.feature.getById.query({
335
+ id: options.featureId
336
+ });
337
+ return feature.userStories ?? [];
338
+ }
339
+ async create(input) {
340
+ return await this.client.product.feature.addUserStory.mutate(
341
+ input
342
+ );
343
+ }
344
+ async update(input) {
345
+ return await this.client.product.feature.updateUserStory.mutate(
346
+ input
347
+ );
348
+ }
349
+ async delete(id) {
350
+ return await this.client.product.feature.deleteUserStory.mutate({
351
+ id
352
+ });
353
+ }
354
+ };
355
+
328
356
  // src/epics.ts
329
357
  var EpicsApi = class {
330
358
  constructor(client) {
@@ -350,6 +378,34 @@ var EpicsApi = class {
350
378
  }
351
379
  };
352
380
 
381
+ // src/labels.ts
382
+ var LabelsApi = class {
383
+ constructor(client) {
384
+ this.client = client;
385
+ }
386
+ async list(options = {}) {
387
+ return await this.client.tag.list.query({
388
+ workspaceId: options.workspaceId,
389
+ category: options.category
390
+ });
391
+ }
392
+ async create(input) {
393
+ return await this.client.tag.create.mutate({
394
+ workspaceId: input.workspaceId,
395
+ name: input.name,
396
+ color: input.color,
397
+ description: input.description,
398
+ category: input.category
399
+ });
400
+ }
401
+ async setEntityTags(input) {
402
+ return await this.client.tag.setEntityTags.mutate(input);
403
+ }
404
+ async listForEntity(input) {
405
+ return await this.client.tag.listForEntity.query(input);
406
+ }
407
+ };
408
+
353
409
  // src/config.ts
354
410
  import Conf from "conf";
355
411
  var schema = {
@@ -441,7 +497,9 @@ var ExponentialClient = class {
441
497
  this.tickets = new TicketsApi(this.client);
442
498
  this.products = new ProductsApi(this.client);
443
499
  this.features = new FeaturesApi(this.client);
500
+ this.userStories = new UserStoriesApi(this.client);
444
501
  this.epics = new EpicsApi(this.client);
502
+ this.labels = new LabelsApi(this.client);
445
503
  }
446
504
  client;
447
505
  actions;
@@ -453,7 +511,9 @@ var ExponentialClient = class {
453
511
  tickets;
454
512
  products;
455
513
  features;
514
+ userStories;
456
515
  epics;
516
+ labels;
457
517
  };
458
518
  export {
459
519
  ExponentialClient,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/actions.ts","../src/actionComments.ts","../src/projects.ts","../src/workspaces.ts","../src/contacts.ts","../src/pipelines.ts","../src/tickets.ts","../src/products.ts","../src/features.ts","../src/epics.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["import { createTRPCClient, httpBatchLink, TRPCClientError } from '@trpc/client';\nimport superjson from 'superjson';\n\ntype ActionInput = {\n assigneeId?: string;\n};\n\ntype KanbanInput = {\n projectId?: string;\n assigneeId?: string;\n kanbanStatus?: 'BACKLOG' | 'TODO' | 'IN_PROGRESS' | 'IN_REVIEW' | 'DONE' | 'CANCELLED';\n};\n\ntype TodayInput = {\n workspaceId?: string;\n};\n\ntype DateRangeInput = {\n startDate: Date;\n endDate: Date;\n workspaceId?: string;\n};\n\ntype ProjectInput = {\n include?: {\n actions?: boolean;\n };\n workspaceId?: string;\n};\n\ntype ActionStatus = 'ACTIVE' | 'COMPLETED' | 'CANCELLED' | 'DELETED' | 'DRAFT';\ntype ActionKanbanStatus = 'BACKLOG' | 'TODO' | 'IN_PROGRESS' | 'IN_REVIEW' | 'DONE' | 'CANCELLED';\ntype ActionPriority = 'Quick' | 'Scheduled' | '1st Priority' | '2nd Priority' | '3rd Priority' | '4th Priority' | '5th Priority' | 'Errand' | 'Remember' | 'Watch' | 'Someday Maybe';\n\ntype ActionCreateInput = {\n name: string;\n description?: string;\n projectId?: string;\n workspaceId?: string;\n dueDate?: Date;\n scheduledStart?: Date;\n scheduledEnd?: Date;\n duration?: number;\n priority?: ActionPriority;\n status?: ActionStatus;\n epicId?: string;\n effortEstimate?: number;\n blockedByIds?: string[];\n};\n\ntype ActionUpdateInput = {\n id: string;\n name?: string;\n description?: string;\n projectId?: string;\n workspaceId?: string | null;\n dueDate?: Date | null;\n scheduledStart?: Date | null;\n scheduledEnd?: Date | null;\n duration?: number | null;\n priority?: ActionPriority;\n status?: ActionStatus;\n kanbanStatus?: ActionKanbanStatus;\n epicId?: string | null;\n effortEstimate?: number | null;\n blockedByIds?: string[];\n};\n\nexport interface TrpcClient {\n action: {\n getAll: { query: (input?: ActionInput) => Promise<unknown[]> };\n getKanbanActions: { query: (input?: KanbanInput) => Promise<unknown[]> };\n getToday: { query: (input?: TodayInput) => Promise<unknown[]> };\n getByDateRange: { query: (input: DateRangeInput) => Promise<unknown[]> };\n getProjectActions: { query: (input: { projectId: string; assigneeId?: string }) => Promise<unknown[]> };\n create: { mutate: (input: ActionCreateInput) => Promise<unknown> };\n update: { mutate: (input: ActionUpdateInput) => Promise<unknown> };\n };\n project: {\n getAll: { query: (input?: ProjectInput) => Promise<unknown[]> };\n };\n workspace: {\n list: { query: () => Promise<unknown[]> };\n };\n crmApi: {\n contactList: { query: (input: { workspaceId: string; search?: string; tags?: string[]; organizationId?: string; limit?: number; cursor?: string }) => Promise<unknown> };\n contactGet: { query: (input: { id: string; includeInteractions?: boolean }) => Promise<unknown> };\n contactCreate: { mutate: (input: { workspaceId: string; firstName?: string; lastName?: string; email?: string | null; phone?: string; linkedIn?: string; telegram?: string; twitter?: string; github?: string; bluesky?: string; about?: string; profileType?: string; skills?: string[]; tags?: string[]; organizationId?: string }) => Promise<unknown> };\n contactUpdate: { mutate: (input: { id: string; firstName?: string; lastName?: string; email?: string | null; phone?: string | null; linkedIn?: string | null; telegram?: string | null; twitter?: string | null; github?: string | null; bluesky?: string | null; about?: string; profileType?: string; skills?: string[]; tags?: string[]; organizationId?: string | null }) => Promise<unknown> };\n contactDelete: { mutate: (input: { id: string }) => Promise<unknown> };\n contactAddInteraction: { mutate: (input: { contactId: string; type: string; direction: string; subject?: string; notes?: string; metadata?: unknown }) => Promise<unknown> };\n pipelineGet: { query: (input: { workspaceId: string }) => Promise<unknown> };\n pipelineGetStages: { query: (input: { workspaceId: string }) => Promise<unknown[]> };\n dealList: { query: (input: { workspaceId: string }) => Promise<unknown[]> };\n dealGet: { query: (input: { id: string }) => Promise<unknown> };\n dealCreate: { mutate: (input: { workspaceId: string; stageId: string; title: string; description?: string; value?: number; currency?: string; probability?: number; expectedCloseDate?: Date; contactId?: string; organizationId?: string; assignedToId?: string }) => Promise<unknown> };\n dealUpdate: { mutate: (input: { id: string; title?: string; description?: string | null; value?: number | null; currency?: string; probability?: number | null; expectedCloseDate?: Date | null; contactId?: string | null; organizationId?: string | null; assignedToId?: string | null }) => Promise<unknown> };\n dealMove: { mutate: (input: { id: string; stageId: string; stageOrder: number }) => Promise<unknown> };\n dealDelete: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n actionComment: {\n getComments: { query: (input: { actionId: string }) => Promise<unknown[]> };\n addComment: { mutate: (input: { actionId: string; content: string }) => Promise<unknown> };\n updateComment: { mutate: (input: { commentId: string; content: string }) => Promise<unknown> };\n deleteComment: { mutate: (input: { commentId: string }) => Promise<unknown> };\n };\n epic: {\n list: { query: (input: { workspaceId: string; status?: 'OPEN' | 'IN_PROGRESS' | 'DONE' | 'CANCELLED' }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n create: { mutate: (input: { workspaceId: string; name: string; description?: string; priority?: 'HIGH' | 'MEDIUM' | 'LOW' | 'NONE'; startDate?: Date; targetDate?: Date }) => Promise<unknown> };\n update: { mutate: (input: { id: string; name?: string; description?: string | null; status?: 'OPEN' | 'IN_PROGRESS' | 'DONE' | 'CANCELLED'; priority?: 'HIGH' | 'MEDIUM' | 'LOW' | 'NONE'; startDate?: Date | null; targetDate?: Date | null }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n product: {\n product: {\n list: { query: (input: { workspaceId: string }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n getBySlug: { query: (input: { workspaceId: string; slug: string }) => Promise<unknown> };\n create: { mutate: (input: { workspaceId: string; name: string; slug: string; description?: string; icon?: string; color?: string }) => Promise<unknown> };\n update: { mutate: (input: { id: string; name?: string; description?: string; icon?: string; color?: string; funTicketIds?: boolean }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n feature: {\n list: { query: (input: { productId: string; status?: 'IDEA' | 'DEFINED' | 'IN_PROGRESS' | 'SHIPPED' | 'ARCHIVED' }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n create: { mutate: (input: { productId: string; name: string; description?: string; vision?: string; status?: 'IDEA' | 'DEFINED' | 'IN_PROGRESS' | 'SHIPPED' | 'ARCHIVED'; effort?: number; priority?: number; goalId?: number }) => Promise<unknown> };\n update: { mutate: (input: { id: string; name?: string; description?: string; vision?: string; status?: 'IDEA' | 'DEFINED' | 'IN_PROGRESS' | 'SHIPPED' | 'ARCHIVED'; effort?: number; priority?: number; goalId?: number | null }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n ticket: {\n list: { query: (input: { productId: string; status?: string; type?: string; featureId?: string; epicId?: string; cycleId?: string; assigneeId?: string }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n create: { mutate: (input: { productId: string; title: string; body?: string; type?: string; status?: string; priority?: number; points?: number; branchName?: string; prUrl?: string; designUrl?: string; specUrl?: string; links?: Record<string, string>; epicId?: string; featureId?: string; cycleId?: string; scopeId?: string; assigneeId?: string; templateId?: string }) => Promise<unknown> };\n update: { mutate: (input: { id: string; title?: string; body?: string; type?: string; status?: string; priority?: number | null; points?: number | null; branchName?: string | null; prUrl?: string | null; designUrl?: string | null; specUrl?: string | null; links?: Record<string, string> | null; epicId?: string | null; featureId?: string | null; cycleId?: string | null; scopeId?: string | null; assigneeId?: string | null }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n search: { query: (input: { productId: string; query?: string; excludeTicketId?: string; limit?: number }) => Promise<unknown[]> };\n addDependency: { mutate: (input: { ticketId: string; dependsOnId: string }) => Promise<unknown> };\n removeDependency: { mutate: (input: { ticketId: string; dependsOnId: string }) => Promise<unknown> };\n addComment: { mutate: (input: { ticketId: string; content: string }) => Promise<unknown> };\n deleteComment: { mutate: (input: { id: string }) => Promise<unknown> };\n linkAction: { mutate: (input: { ticketId: string; actionId: string }) => Promise<unknown> };\n unlinkAction: { mutate: (input: { actionId: string }) => Promise<unknown> };\n };\n };\n}\n\nexport function createClient(config: { token: string; apiUrl: string }): TrpcClient {\n const apiUrl = config.apiUrl.replace(/\\/+$/, '');\n\n return createTRPCClient<any>({\n links: [\n httpBatchLink({\n url: `${apiUrl}/api/trpc`,\n headers() {\n return {\n Authorization: `Bearer ${config.token}`,\n };\n },\n transformer: superjson,\n }),\n ],\n }) as unknown as TrpcClient;\n}\n\nexport function isTRPCError(error: unknown): error is TRPCClientError<any> {\n return error instanceof TRPCClientError;\n}\n\nexport { TRPCClientError };\n","import type { TrpcClient } from './client.js';\nimport type { Action, KanbanStatus, Priority } from './types/action.js';\n\nexport interface ActionsListOptions {\n projectId?: string;\n status?: KanbanStatus;\n assigneeId?: string;\n}\n\nexport interface ActionsKanbanOptions {\n projectId?: string;\n status?: KanbanStatus;\n assigneeId?: string;\n}\n\nexport type ActionStatus = 'ACTIVE' | 'COMPLETED' | 'CANCELLED' | 'DELETED' | 'DRAFT';\n\nexport interface ActionCreateInput {\n name: string;\n description?: string;\n projectId?: string;\n workspaceId?: string;\n dueDate?: Date;\n scheduledStart?: Date;\n scheduledEnd?: Date;\n duration?: number;\n priority?: Priority;\n status?: ActionStatus;\n epicId?: string;\n effortEstimate?: number;\n blockedByIds?: string[];\n}\n\nexport interface ActionUpdateInput {\n id: string;\n name?: string;\n description?: string;\n projectId?: string;\n workspaceId?: string | null;\n dueDate?: Date | null;\n scheduledStart?: Date | null;\n scheduledEnd?: Date | null;\n duration?: number | null;\n priority?: Priority;\n status?: ActionStatus;\n kanbanStatus?: KanbanStatus;\n epicId?: string | null;\n effortEstimate?: number | null;\n blockedByIds?: string[];\n}\n\nexport class ActionsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: ActionsListOptions = {}): Promise<Action[]> {\n const { projectId, status, assigneeId } = options;\n let actions: Action[];\n\n if (projectId) {\n actions = await this.client.action.getProjectActions.query({\n projectId,\n assigneeId,\n }) as Action[];\n } else if (status) {\n actions = await this.client.action.getKanbanActions.query({\n kanbanStatus: status,\n assigneeId,\n }) as Action[];\n } else {\n actions = await this.client.action.getAll.query({\n assigneeId,\n }) as Action[];\n }\n\n // Match CLI behavior: hide completed/cancelled unless status specified\n if (!status) {\n actions = actions.filter(action =>\n action.status !== 'COMPLETED' &&\n action.status !== 'CANCELLED' &&\n action.kanbanStatus !== 'DONE' &&\n action.kanbanStatus !== 'CANCELLED'\n );\n }\n\n return actions;\n }\n\n async getToday(workspaceId?: string): Promise<Action[]> {\n return await this.client.action.getToday.query({\n workspaceId,\n }) as Action[];\n }\n\n async getByDateRange(start: Date, end: Date, workspaceId?: string): Promise<Action[]> {\n return await this.client.action.getByDateRange.query({\n startDate: start,\n endDate: end,\n workspaceId,\n }) as Action[];\n }\n\n async getKanban(options: ActionsKanbanOptions = {}): Promise<Action[]> {\n const { projectId, status, assigneeId } = options;\n\n return await this.client.action.getKanbanActions.query({\n projectId,\n kanbanStatus: status,\n assigneeId,\n }) as Action[];\n }\n\n async getProjectActions(projectId: string, assigneeId?: string): Promise<Action[]> {\n return await this.client.action.getProjectActions.query({\n projectId,\n assigneeId,\n }) as Action[];\n }\n\n async create(input: ActionCreateInput): Promise<Action> {\n return await this.client.action.create.mutate(input) as Action;\n }\n\n async update(input: ActionUpdateInput): Promise<Action> {\n return await this.client.action.update.mutate(input) as Action;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { ActionComment } from './types/comment.js';\n\nexport interface ActionCommentAddInput {\n actionId: string;\n content: string;\n}\n\nexport interface ActionCommentUpdateInput {\n commentId: string;\n content: string;\n}\n\nexport class ActionCommentsApi {\n constructor(private client: TrpcClient) {}\n\n async list(actionId: string): Promise<ActionComment[]> {\n return await this.client.actionComment.getComments.query({\n actionId,\n }) as ActionComment[];\n }\n\n async add(input: ActionCommentAddInput): Promise<ActionComment> {\n return await this.client.actionComment.addComment.mutate(input) as ActionComment;\n }\n\n async update(input: ActionCommentUpdateInput): Promise<ActionComment> {\n return await this.client.actionComment.updateComment.mutate(input) as ActionComment;\n }\n\n async delete(commentId: string): Promise<ActionComment> {\n return await this.client.actionComment.deleteComment.mutate({\n commentId,\n }) as ActionComment;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Project } from './types/project.js';\n\nexport interface ProjectsListOptions {\n workspaceId?: string;\n includeActions?: boolean;\n}\n\nexport class ProjectsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: ProjectsListOptions = {}): Promise<Project[]> {\n const { workspaceId, includeActions } = options;\n\n return await this.client.project.getAll.query({\n workspaceId,\n include: includeActions ? { actions: true } : undefined,\n }) as Project[];\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Workspace } from './types/workspace.js';\n\nexport class WorkspacesApi {\n constructor(private client: TrpcClient) {}\n\n async list(): Promise<Workspace[]> {\n return await this.client.workspace.list.query() as Workspace[];\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Contact, ContactInteraction, ContactListOutput, InteractionType, InteractionDirection } from './types/contact.js';\n\nexport interface ContactsListOptions {\n workspaceId: string;\n search?: string;\n tags?: string[];\n organizationId?: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface ContactCreateInput {\n workspaceId: string;\n firstName?: string;\n lastName?: string;\n email?: string | null;\n phone?: string;\n linkedIn?: string;\n telegram?: string;\n twitter?: string;\n github?: string;\n bluesky?: string;\n about?: string;\n profileType?: string;\n skills?: string[];\n tags?: string[];\n organizationId?: string;\n}\n\nexport interface ContactUpdateInput {\n id: string;\n firstName?: string;\n lastName?: string;\n email?: string | null;\n phone?: string | null;\n linkedIn?: string | null;\n telegram?: string | null;\n twitter?: string | null;\n github?: string | null;\n bluesky?: string | null;\n about?: string;\n profileType?: string;\n skills?: string[];\n tags?: string[];\n organizationId?: string | null;\n}\n\nexport interface AddInteractionInput {\n contactId: string;\n type: InteractionType;\n direction: InteractionDirection;\n subject?: string;\n notes?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class ContactsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: ContactsListOptions): Promise<ContactListOutput> {\n return await this.client.crmApi.contactList.query(options) as ContactListOutput;\n }\n\n async get(id: string, options?: { includeInteractions?: boolean }): Promise<Contact> {\n return await this.client.crmApi.contactGet.query({\n id,\n includeInteractions: options?.includeInteractions,\n }) as Contact;\n }\n\n async create(input: ContactCreateInput): Promise<Contact> {\n return await this.client.crmApi.contactCreate.mutate(input) as Contact;\n }\n\n async update(input: ContactUpdateInput): Promise<Contact> {\n return await this.client.crmApi.contactUpdate.mutate(input) as Contact;\n }\n\n async delete(id: string): Promise<void> {\n await this.client.crmApi.contactDelete.mutate({ id });\n }\n\n async addInteraction(input: AddInteractionInput): Promise<ContactInteraction> {\n return await this.client.crmApi.contactAddInteraction.mutate(input) as ContactInteraction;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Pipeline, PipelineStage, Deal } from './types/pipeline.js';\n\nexport interface DealCreateInput {\n workspaceId: string;\n stageId: string;\n title: string;\n description?: string;\n value?: number;\n currency?: string;\n probability?: number;\n expectedCloseDate?: Date;\n contactId?: string;\n organizationId?: string;\n assignedToId?: string;\n}\n\nexport interface DealUpdateInput {\n id: string;\n title?: string;\n description?: string | null;\n value?: number | null;\n currency?: string;\n probability?: number | null;\n expectedCloseDate?: Date | null;\n contactId?: string | null;\n organizationId?: string | null;\n assignedToId?: string | null;\n}\n\nexport interface DealMoveInput {\n id: string;\n stageId: string;\n stageOrder: number;\n}\n\nexport class PipelinesApi {\n constructor(private client: TrpcClient) {}\n\n async get(workspaceId: string): Promise<Pipeline | null> {\n return await this.client.crmApi.pipelineGet.query({ workspaceId }) as Pipeline | null;\n }\n\n async getStages(workspaceId: string): Promise<PipelineStage[]> {\n return await this.client.crmApi.pipelineGetStages.query({ workspaceId }) as PipelineStage[];\n }\n\n async listDeals(workspaceId: string): Promise<Deal[]> {\n return await this.client.crmApi.dealList.query({ workspaceId }) as Deal[];\n }\n\n async getDeal(id: string): Promise<Deal> {\n return await this.client.crmApi.dealGet.query({ id }) as Deal;\n }\n\n async createDeal(input: DealCreateInput): Promise<Deal> {\n return await this.client.crmApi.dealCreate.mutate(input) as Deal;\n }\n\n async updateDeal(input: DealUpdateInput): Promise<Deal> {\n return await this.client.crmApi.dealUpdate.mutate(input) as Deal;\n }\n\n async moveDeal(input: DealMoveInput): Promise<Deal> {\n return await this.client.crmApi.dealMove.mutate(input) as Deal;\n }\n\n async deleteDeal(id: string): Promise<void> {\n await this.client.crmApi.dealDelete.mutate({ id });\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { TicketComment } from './types/comment.js';\nimport type {\n Ticket,\n TicketDetail,\n TicketDependencyEdge,\n TicketStatus,\n TicketType,\n} from './types/ticket.js';\nimport type { Action } from './types/action.js';\n\nexport interface TicketListOptions {\n productId: string;\n status?: TicketStatus;\n type?: TicketType;\n featureId?: string;\n epicId?: string;\n cycleId?: string;\n assigneeId?: string;\n}\n\nexport interface TicketCreateInput {\n productId: string;\n title: string;\n body?: string;\n type?: TicketType;\n status?: TicketStatus;\n /** 0–4; lower is higher priority. */\n priority?: number;\n points?: number;\n branchName?: string;\n prUrl?: string;\n designUrl?: string;\n specUrl?: string;\n links?: Record<string, string>;\n epicId?: string;\n featureId?: string;\n cycleId?: string;\n scopeId?: string;\n assigneeId?: string;\n templateId?: string;\n}\n\nexport interface TicketUpdateInput {\n id: string;\n title?: string;\n body?: string;\n type?: TicketType;\n status?: TicketStatus;\n priority?: number | null;\n points?: number | null;\n branchName?: string | null;\n prUrl?: string | null;\n designUrl?: string | null;\n specUrl?: string | null;\n links?: Record<string, string> | null;\n epicId?: string | null;\n featureId?: string | null;\n cycleId?: string | null;\n scopeId?: string | null;\n assigneeId?: string | null;\n}\n\nexport interface TicketCommentAddInput {\n ticketId: string;\n content: string;\n}\n\nexport interface TicketSearchOptions {\n productId: string;\n query?: string;\n excludeTicketId?: string;\n limit?: number;\n}\n\nexport class TicketsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: TicketListOptions): Promise<Ticket[]> {\n return await this.client.product.ticket.list.query(options) as Ticket[];\n }\n\n async get(id: string): Promise<TicketDetail> {\n return await this.client.product.ticket.getById.query({\n id,\n }) as TicketDetail;\n }\n\n async create(input: TicketCreateInput): Promise<Ticket> {\n return await this.client.product.ticket.create.mutate(input) as Ticket;\n }\n\n async update(input: TicketUpdateInput): Promise<Ticket> {\n return await this.client.product.ticket.update.mutate(input) as Ticket;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.product.ticket.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n\n async search(options: TicketSearchOptions): Promise<TicketDependencyEdge[]> {\n return await this.client.product.ticket.search.query(\n options,\n ) as TicketDependencyEdge[];\n }\n\n /** Mark `ticketId` as blocked by `dependsOnId`. */\n async addDependency(\n ticketId: string,\n dependsOnId: string,\n ): Promise<{ id: string; dependsOn: TicketDependencyEdge }> {\n return await this.client.product.ticket.addDependency.mutate({\n ticketId,\n dependsOnId,\n }) as { id: string; dependsOn: TicketDependencyEdge };\n }\n\n async removeDependency(\n ticketId: string,\n dependsOnId: string,\n ): Promise<{ success: boolean }> {\n return await this.client.product.ticket.removeDependency.mutate({\n ticketId,\n dependsOnId,\n }) as { success: boolean };\n }\n\n async addComment(input: TicketCommentAddInput): Promise<TicketComment> {\n return await this.client.product.ticket.addComment.mutate(\n input,\n ) as TicketComment;\n }\n\n async deleteComment(id: string): Promise<{ success: boolean }> {\n return await this.client.product.ticket.deleteComment.mutate({\n id,\n }) as { success: boolean };\n }\n\n /** Attach an existing action to a ticket. */\n async linkAction(ticketId: string, actionId: string): Promise<Action> {\n return await this.client.product.ticket.linkAction.mutate({\n ticketId,\n actionId,\n }) as Action;\n }\n\n /** Detach an action from whatever ticket it's linked to. */\n async unlinkAction(actionId: string): Promise<Action> {\n return await this.client.product.ticket.unlinkAction.mutate({\n actionId,\n }) as Action;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Product } from './types/product.js';\n\nexport interface ProductCreateInput {\n workspaceId: string;\n name: string;\n /** Kebab-case slug; must match `/^[a-z0-9-]+$/`. */\n slug: string;\n description?: string;\n icon?: string;\n color?: string;\n}\n\nexport interface ProductUpdateInput {\n id: string;\n name?: string;\n description?: string;\n icon?: string;\n color?: string;\n funTicketIds?: boolean;\n}\n\nexport class ProductsApi {\n constructor(private client: TrpcClient) {}\n\n async list(workspaceId: string): Promise<Product[]> {\n return await this.client.product.product.list.query({\n workspaceId,\n }) as Product[];\n }\n\n async get(id: string): Promise<Product> {\n return await this.client.product.product.getById.query({ id }) as Product;\n }\n\n async getBySlug(workspaceId: string, slug: string): Promise<Product> {\n return await this.client.product.product.getBySlug.query({\n workspaceId,\n slug,\n }) as Product;\n }\n\n /**\n * Resolve a product reference (slug or CUID) to a full Product. Falls back\n * to slug lookup if the bare CUID lookup fails — callers can pass either.\n */\n async resolve(workspaceId: string, slugOrId: string): Promise<Product> {\n // Heuristic: CUIDs from Prisma start with 'c' and are 25 chars; otherwise\n // try slug first. We try both to stay forgiving.\n const looksLikeId = /^c[a-z0-9]{20,}$/.test(slugOrId);\n if (looksLikeId) {\n try {\n return await this.get(slugOrId);\n } catch {\n // fall through to slug\n }\n }\n return await this.getBySlug(workspaceId, slugOrId);\n }\n\n async create(input: ProductCreateInput): Promise<Product> {\n return await this.client.product.product.create.mutate(input) as Product;\n }\n\n async update(input: ProductUpdateInput): Promise<Product> {\n return await this.client.product.product.update.mutate(input) as Product;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.product.product.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Feature, FeatureStatus } from './types/feature.js';\n\nexport interface FeatureListOptions {\n productId: string;\n status?: FeatureStatus;\n}\n\nexport interface FeatureCreateInput {\n productId: string;\n name: string;\n description?: string;\n vision?: string;\n status?: FeatureStatus;\n effort?: number;\n /** 0–4; lower is higher priority. */\n priority?: number;\n goalId?: number;\n}\n\nexport interface FeatureUpdateInput {\n id: string;\n name?: string;\n description?: string;\n vision?: string;\n status?: FeatureStatus;\n effort?: number;\n priority?: number;\n goalId?: number | null;\n}\n\nexport class FeaturesApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: FeatureListOptions): Promise<Feature[]> {\n return await this.client.product.feature.list.query({\n productId: options.productId,\n status: options.status,\n }) as Feature[];\n }\n\n async get(id: string): Promise<Feature> {\n return await this.client.product.feature.getById.query({ id }) as Feature;\n }\n\n async create(input: FeatureCreateInput): Promise<Feature> {\n return await this.client.product.feature.create.mutate(input) as Feature;\n }\n\n async update(input: FeatureUpdateInput): Promise<Feature> {\n return await this.client.product.feature.update.mutate(input) as Feature;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.product.feature.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Epic, EpicPriority, EpicStatus } from './types/epic.js';\n\nexport interface EpicListOptions {\n workspaceId: string;\n status?: EpicStatus;\n}\n\nexport interface EpicCreateInput {\n workspaceId: string;\n name: string;\n description?: string;\n priority?: EpicPriority;\n startDate?: Date;\n targetDate?: Date;\n}\n\nexport interface EpicUpdateInput {\n id: string;\n name?: string;\n description?: string | null;\n status?: EpicStatus;\n priority?: EpicPriority;\n startDate?: Date | null;\n targetDate?: Date | null;\n}\n\nexport class EpicsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: EpicListOptions): Promise<Epic[]> {\n return await this.client.epic.list.query({\n workspaceId: options.workspaceId,\n status: options.status,\n }) as Epic[];\n }\n\n async get(id: string): Promise<Epic> {\n return await this.client.epic.getById.query({ id }) as Epic;\n }\n\n async create(input: EpicCreateInput): Promise<Epic> {\n return await this.client.epic.create.mutate(input) as Epic;\n }\n\n async update(input: EpicUpdateInput): Promise<Epic> {\n return await this.client.epic.update.mutate(input) as Epic;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.epic.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n}\n","import Conf from 'conf';\n\nexport interface ExponentialConfig {\n apiUrl: string;\n token: string;\n tokenExpiry?: string;\n defaultWorkspaceId?: string;\n defaultWorkspaceSlug?: string;\n}\n\nconst schema = {\n apiUrl: {\n type: 'string' as const,\n default: '',\n },\n token: {\n type: 'string' as const,\n default: '',\n },\n tokenExpiry: {\n type: 'string' as const,\n default: '',\n },\n defaultWorkspaceId: {\n type: 'string' as const,\n default: '',\n },\n defaultWorkspaceSlug: {\n type: 'string' as const,\n default: '',\n },\n};\n\nfunction createStore(projectName: string) {\n return new Conf<ExponentialConfig>({\n projectName,\n schema,\n });\n}\n\nfunction readConfig(store: Conf<ExponentialConfig>): ExponentialConfig {\n return {\n apiUrl: store.get('apiUrl'),\n token: store.get('token'),\n tokenExpiry: store.get('tokenExpiry'),\n defaultWorkspaceId: store.get('defaultWorkspaceId'),\n defaultWorkspaceSlug: store.get('defaultWorkspaceSlug'),\n };\n}\n\nfunction writeConfig(store: Conf<ExponentialConfig>, values: Partial<ExponentialConfig>): void {\n if (values.apiUrl !== undefined) store.set('apiUrl', values.apiUrl);\n if (values.token !== undefined) store.set('token', values.token);\n if (values.tokenExpiry !== undefined) store.set('tokenExpiry', values.tokenExpiry);\n if (values.defaultWorkspaceId !== undefined) store.set('defaultWorkspaceId', values.defaultWorkspaceId);\n if (values.defaultWorkspaceSlug !== undefined) store.set('defaultWorkspaceSlug', values.defaultWorkspaceSlug);\n}\n\nconst defaultStore = createStore('exponential-sdk');\n\nexport function createConfigStore(options?: { projectName?: string }) {\n const store = createStore(options?.projectName ?? 'exponential-sdk');\n\n return {\n loadConfig: () => readConfig(store),\n saveConfig: (values: Partial<ExponentialConfig>) => writeConfig(store, values),\n clearConfig: () => store.clear(),\n isAuthenticated: () => {\n const cfg = readConfig(store);\n return Boolean(cfg.token && cfg.apiUrl);\n },\n getConfigPath: () => store.path,\n };\n}\n\nexport function loadConfig(): ExponentialConfig {\n return readConfig(defaultStore);\n}\n\nexport function saveConfig(values: Partial<ExponentialConfig>): void {\n writeConfig(defaultStore, values);\n}\n\nexport function clearConfig(): void {\n defaultStore.clear();\n}\n\nexport function isAuthenticated(): boolean {\n const cfg = readConfig(defaultStore);\n return Boolean(cfg.token && cfg.apiUrl);\n}\n\nexport function getConfigPath(): string {\n return defaultStore.path;\n}\n","import { createClient, isTRPCError, TRPCClientError, type TrpcClient } from './client.js';\nimport { ActionsApi } from './actions.js';\nimport { ActionCommentsApi } from './actionComments.js';\nimport { ProjectsApi } from './projects.js';\nimport { WorkspacesApi } from './workspaces.js';\nimport { ContactsApi } from './contacts.js';\nimport { PipelinesApi } from './pipelines.js';\nimport { TicketsApi } from './tickets.js';\nimport { ProductsApi } from './products.js';\nimport { FeaturesApi } from './features.js';\nimport { EpicsApi } from './epics.js';\n\nexport class ExponentialClient {\n private client: TrpcClient;\n actions: ActionsApi;\n actionComments: ActionCommentsApi;\n projects: ProjectsApi;\n workspaces: WorkspacesApi;\n contacts: ContactsApi;\n pipelines: PipelinesApi;\n tickets: TicketsApi;\n products: ProductsApi;\n features: FeaturesApi;\n epics: EpicsApi;\n\n constructor(private config: { token: string; apiUrl: string }) {\n this.client = createClient(this.config);\n this.actions = new ActionsApi(this.client);\n this.actionComments = new ActionCommentsApi(this.client);\n this.projects = new ProjectsApi(this.client);\n this.workspaces = new WorkspacesApi(this.client);\n this.contacts = new ContactsApi(this.client);\n this.pipelines = new PipelinesApi(this.client);\n this.tickets = new TicketsApi(this.client);\n this.products = new ProductsApi(this.client);\n this.features = new FeaturesApi(this.client);\n this.epics = new EpicsApi(this.client);\n }\n}\n\nexport {\n createConfigStore,\n loadConfig,\n saveConfig,\n clearConfig,\n isAuthenticated,\n getConfigPath,\n} from './config.js';\n\nexport type { ExponentialConfig } from './config.js';\nexport type {\n Action,\n ActionOutput,\n ActionsListOutput,\n KanbanStatus,\n Priority,\n} from './types/action.js';\nexport type {\n ActionCreateInput,\n ActionUpdateInput,\n ActionStatus,\n} from './actions.js';\nexport type { Project, ProjectOutput, ProjectsListOutput } from './types/project.js';\nexport type { Workspace, WorkspaceOutput, WorkspacesListOutput } from './types/workspace.js';\nexport type {\n Contact,\n ContactInteraction,\n ContactListOutput,\n InteractionType,\n InteractionDirection,\n} from './types/contact.js';\nexport type {\n ContactCreateInput,\n ContactUpdateInput,\n AddInteractionInput,\n ContactsListOptions,\n} from './contacts.js';\nexport type {\n Pipeline,\n PipelineStage,\n Deal,\n DealActivity,\n} from './types/pipeline.js';\nexport type {\n DealCreateInput,\n DealUpdateInput,\n DealMoveInput,\n} from './pipelines.js';\nexport type {\n ActionComment,\n TicketComment,\n CommentAuthor,\n} from './types/comment.js';\nexport type {\n ActionCommentAddInput,\n ActionCommentUpdateInput,\n} from './actionComments.js';\nexport type { Product } from './types/product.js';\nexport type { ProductCreateInput, ProductUpdateInput } from './products.js';\nexport type {\n Feature,\n FeatureScope,\n FeatureScopeStatus,\n FeatureStatus,\n} from './types/feature.js';\nexport type {\n FeatureCreateInput,\n FeatureUpdateInput,\n FeatureListOptions,\n} from './features.js';\nexport type {\n Ticket,\n TicketDetail,\n TicketAssignee,\n TicketDependencyEdge,\n TicketStatus,\n TicketType,\n} from './types/ticket.js';\nexport type {\n TicketListOptions,\n TicketCreateInput,\n TicketUpdateInput,\n TicketCommentAddInput,\n TicketSearchOptions,\n} from './tickets.js';\nexport type { Epic, EpicStatus, EpicPriority } from './types/epic.js';\nexport type {\n EpicCreateInput,\n EpicUpdateInput,\n EpicListOptions,\n} from './epics.js';\nexport { isTRPCError, TRPCClientError };\n"],"mappings":";AAAA,SAAS,kBAAkB,eAAe,uBAAuB;AACjE,OAAO,eAAe;AAiJf,SAAS,aAAa,QAAuD;AAClF,QAAM,SAAS,OAAO,OAAO,QAAQ,QAAQ,EAAE;AAE/C,SAAO,iBAAsB;AAAA,IAC3B,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,KAAK,GAAG,MAAM;AAAA,QACd,UAAU;AACR,iBAAO;AAAA,YACL,eAAe,UAAU,OAAO,KAAK;AAAA,UACvC;AAAA,QACF;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEO,SAAS,YAAY,OAA+C;AACzE,SAAO,iBAAiB;AAC1B;;;ACnHO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,UAA8B,CAAC,GAAsB;AAC9D,UAAM,EAAE,WAAW,QAAQ,WAAW,IAAI;AAC1C,QAAI;AAEJ,QAAI,WAAW;AACb,gBAAU,MAAM,KAAK,OAAO,OAAO,kBAAkB,MAAM;AAAA,QACzD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,WAAW,QAAQ;AACjB,gBAAU,MAAM,KAAK,OAAO,OAAO,iBAAiB,MAAM;AAAA,QACxD,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,gBAAU,MAAM,KAAK,OAAO,OAAO,OAAO,MAAM;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,QAAQ;AACX,gBAAU,QAAQ;AAAA,QAAO,YACvB,OAAO,WAAW,eAClB,OAAO,WAAW,eAClB,OAAO,iBAAiB,UACxB,OAAO,iBAAiB;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,aAAyC;AACtD,WAAO,MAAM,KAAK,OAAO,OAAO,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,OAAa,KAAW,aAAyC;AACpF,WAAO,MAAM,KAAK,OAAO,OAAO,eAAe,MAAM;AAAA,MACnD,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,UAAgC,CAAC,GAAsB;AACrE,UAAM,EAAE,WAAW,QAAQ,WAAW,IAAI;AAE1C,WAAO,MAAM,KAAK,OAAO,OAAO,iBAAiB,MAAM;AAAA,MACrD;AAAA,MACA,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,WAAmB,YAAwC;AACjF,WAAO,MAAM,KAAK,OAAO,OAAO,kBAAkB,MAAM;AAAA,MACtD;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,OAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,EACrD;AAAA,EAEA,MAAM,OAAO,OAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,EACrD;AACF;;;AChHO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,UAA4C;AACrD,WAAO,MAAM,KAAK,OAAO,cAAc,YAAY,MAAM;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,OAAsD;AAC9D,WAAO,MAAM,KAAK,OAAO,cAAc,WAAW,OAAO,KAAK;AAAA,EAChE;AAAA,EAEA,MAAM,OAAO,OAAyD;AACpE,WAAO,MAAM,KAAK,OAAO,cAAc,cAAc,OAAO,KAAK;AAAA,EACnE;AAAA,EAEA,MAAM,OAAO,WAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,cAAc,cAAc,OAAO;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC3BO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,UAA+B,CAAC,GAAuB;AAChE,UAAM,EAAE,aAAa,eAAe,IAAI;AAExC,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,MAAM;AAAA,MAC5C;AAAA,MACA,SAAS,iBAAiB,EAAE,SAAS,KAAK,IAAI;AAAA,IAChD,CAAC;AAAA,EACH;AACF;;;AChBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,OAA6B;AACjC,WAAO,MAAM,KAAK,OAAO,UAAU,KAAK,MAAM;AAAA,EAChD;AACF;;;ACgDO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,SAA0D;AACnE,WAAO,MAAM,KAAK,OAAO,OAAO,YAAY,MAAM,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAM,IAAI,IAAY,SAA+D;AACnF,WAAO,MAAM,KAAK,OAAO,OAAO,WAAW,MAAM;AAAA,MAC/C;AAAA,MACA,qBAAqB,SAAS;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,OAA6C;AACxD,WAAO,MAAM,KAAK,OAAO,OAAO,cAAc,OAAO,KAAK;AAAA,EAC5D;AAAA,EAEA,MAAM,OAAO,OAA6C;AACxD,WAAO,MAAM,KAAK,OAAO,OAAO,cAAc,OAAO,KAAK;AAAA,EAC5D;AAAA,EAEA,MAAM,OAAO,IAA2B;AACtC,UAAM,KAAK,OAAO,OAAO,cAAc,OAAO,EAAE,GAAG,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,eAAe,OAAyD;AAC5E,WAAO,MAAM,KAAK,OAAO,OAAO,sBAAsB,OAAO,KAAK;AAAA,EACpE;AACF;;;AClDO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,IAAI,aAA+C;AACvD,WAAO,MAAM,KAAK,OAAO,OAAO,YAAY,MAAM,EAAE,YAAY,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,UAAU,aAA+C;AAC7D,WAAO,MAAM,KAAK,OAAO,OAAO,kBAAkB,MAAM,EAAE,YAAY,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,UAAU,aAAsC;AACpD,WAAO,MAAM,KAAK,OAAO,OAAO,SAAS,MAAM,EAAE,YAAY,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,QAAQ,IAA2B;AACvC,WAAO,MAAM,KAAK,OAAO,OAAO,QAAQ,MAAM,EAAE,GAAG,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,WAAW,OAAuC;AACtD,WAAO,MAAM,KAAK,OAAO,OAAO,WAAW,OAAO,KAAK;AAAA,EACzD;AAAA,EAEA,MAAM,WAAW,OAAuC;AACtD,WAAO,MAAM,KAAK,OAAO,OAAO,WAAW,OAAO,KAAK;AAAA,EACzD;AAAA,EAEA,MAAM,SAAS,OAAqC;AAClD,WAAO,MAAM,KAAK,OAAO,OAAO,SAAS,OAAO,KAAK;AAAA,EACvD;AAAA,EAEA,MAAM,WAAW,IAA2B;AAC1C,UAAM,KAAK,OAAO,OAAO,WAAW,OAAO,EAAE,GAAG,CAAC;AAAA,EACnD;AACF;;;ACKO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,SAA+C;AACxD,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,KAAK,MAAM,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAM,IAAI,IAAmC;AAC3C,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,QAAQ,MAAM;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,OAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,OAAO,OAAO,KAAK;AAAA,EAC7D;AAAA,EAEA,MAAM,OAAO,OAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,OAAO,OAAO,KAAK;AAAA,EAC7D;AAAA,EAEA,MAAM,OAAO,IAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,OAAO,OAAO,EAAE,GAAG,CAAC;AAAA,EAG9D;AAAA,EAEA,MAAM,OAAO,SAA+D;AAC1E,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,OAAO;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cACJ,UACA,aAC0D;AAC1D,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,cAAc,OAAO;AAAA,MAC3D;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBACJ,UACA,aAC+B;AAC/B,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,iBAAiB,OAAO;AAAA,MAC9D;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,OAAsD;AACrE,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,WAAW;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,IAA2C;AAC7D,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,cAAc,OAAO;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WAAW,UAAkB,UAAmC;AACpE,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,WAAW,OAAO;AAAA,MACxD;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAa,UAAmC;AACpD,WAAO,MAAM,KAAK,OAAO,QAAQ,OAAO,aAAa,OAAO;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACrIO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,aAAyC;AAClD,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,KAAK,MAAM;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,IAA8B;AACtC,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,QAAQ,MAAM,EAAE,GAAG,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,UAAU,aAAqB,MAAgC;AACnE,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,UAAU,MAAM;AAAA,MACvD;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,aAAqB,UAAoC;AAGrE,UAAM,cAAc,mBAAmB,KAAK,QAAQ;AACpD,QAAI,aAAa;AACf,UAAI;AACF,eAAO,MAAM,KAAK,IAAI,QAAQ;AAAA,MAChC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO,MAAM,KAAK,UAAU,aAAa,QAAQ;AAAA,EACnD;AAAA,EAEA,MAAM,OAAO,OAA6C;AACxD,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,OAA6C;AACxD,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,IAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,EAAE,GAAG,CAAC;AAAA,EAG/D;AACF;;;AC1CO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,SAAiD;AAC1D,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,KAAK,MAAM;AAAA,MAClD,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,IAA8B;AACtC,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,QAAQ,MAAM,EAAE,GAAG,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,OAAO,OAA6C;AACxD,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,OAA6C;AACxD,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,KAAK;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,IAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,QAAQ,QAAQ,OAAO,OAAO,EAAE,GAAG,CAAC;AAAA,EAG/D;AACF;;;AC/BO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAEzC,MAAM,KAAK,SAA2C;AACpD,WAAO,MAAM,KAAK,OAAO,KAAK,KAAK,MAAM;AAAA,MACvC,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,IAA2B;AACnC,WAAO,MAAM,KAAK,OAAO,KAAK,QAAQ,MAAM,EAAE,GAAG,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,OAAO,OAAuC;AAClD,WAAO,MAAM,KAAK,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,EACnD;AAAA,EAEA,MAAM,OAAO,OAAuC;AAClD,WAAO,MAAM,KAAK,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,EACnD;AAAA,EAEA,MAAM,OAAO,IAA2C;AACtD,WAAO,MAAM,KAAK,OAAO,KAAK,OAAO,OAAO,EAAE,GAAG,CAAC;AAAA,EAGpD;AACF;;;ACtDA,OAAO,UAAU;AAUjB,IAAM,SAAS;AAAA,EACb,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEA,SAAS,YAAY,aAAqB;AACxC,SAAO,IAAI,KAAwB;AAAA,IACjC;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,WAAW,OAAmD;AACrE,SAAO;AAAA,IACL,QAAQ,MAAM,IAAI,QAAQ;AAAA,IAC1B,OAAO,MAAM,IAAI,OAAO;AAAA,IACxB,aAAa,MAAM,IAAI,aAAa;AAAA,IACpC,oBAAoB,MAAM,IAAI,oBAAoB;AAAA,IAClD,sBAAsB,MAAM,IAAI,sBAAsB;AAAA,EACxD;AACF;AAEA,SAAS,YAAY,OAAgC,QAA0C;AAC7F,MAAI,OAAO,WAAW,OAAW,OAAM,IAAI,UAAU,OAAO,MAAM;AAClE,MAAI,OAAO,UAAU,OAAW,OAAM,IAAI,SAAS,OAAO,KAAK;AAC/D,MAAI,OAAO,gBAAgB,OAAW,OAAM,IAAI,eAAe,OAAO,WAAW;AACjF,MAAI,OAAO,uBAAuB,OAAW,OAAM,IAAI,sBAAsB,OAAO,kBAAkB;AACtG,MAAI,OAAO,yBAAyB,OAAW,OAAM,IAAI,wBAAwB,OAAO,oBAAoB;AAC9G;AAEA,IAAM,eAAe,YAAY,iBAAiB;AAE3C,SAAS,kBAAkB,SAAoC;AACpE,QAAM,QAAQ,YAAY,SAAS,eAAe,iBAAiB;AAEnE,SAAO;AAAA,IACL,YAAY,MAAM,WAAW,KAAK;AAAA,IAClC,YAAY,CAAC,WAAuC,YAAY,OAAO,MAAM;AAAA,IAC7E,aAAa,MAAM,MAAM,MAAM;AAAA,IAC/B,iBAAiB,MAAM;AACrB,YAAM,MAAM,WAAW,KAAK;AAC5B,aAAO,QAAQ,IAAI,SAAS,IAAI,MAAM;AAAA,IACxC;AAAA,IACA,eAAe,MAAM,MAAM;AAAA,EAC7B;AACF;AAEO,SAAS,aAAgC;AAC9C,SAAO,WAAW,YAAY;AAChC;AAEO,SAAS,WAAW,QAA0C;AACnE,cAAY,cAAc,MAAM;AAClC;AAEO,SAAS,cAAoB;AAClC,eAAa,MAAM;AACrB;AAEO,SAAS,kBAA2B;AACzC,QAAM,MAAM,WAAW,YAAY;AACnC,SAAO,QAAQ,IAAI,SAAS,IAAI,MAAM;AACxC;AAEO,SAAS,gBAAwB;AACtC,SAAO,aAAa;AACtB;;;AClFO,IAAM,oBAAN,MAAwB;AAAA,EAa7B,YAAoB,QAA2C;AAA3C;AAClB,SAAK,SAAS,aAAa,KAAK,MAAM;AACtC,SAAK,UAAU,IAAI,WAAW,KAAK,MAAM;AACzC,SAAK,iBAAiB,IAAI,kBAAkB,KAAK,MAAM;AACvD,SAAK,WAAW,IAAI,YAAY,KAAK,MAAM;AAC3C,SAAK,aAAa,IAAI,cAAc,KAAK,MAAM;AAC/C,SAAK,WAAW,IAAI,YAAY,KAAK,MAAM;AAC3C,SAAK,YAAY,IAAI,aAAa,KAAK,MAAM;AAC7C,SAAK,UAAU,IAAI,WAAW,KAAK,MAAM;AACzC,SAAK,WAAW,IAAI,YAAY,KAAK,MAAM;AAC3C,SAAK,WAAW,IAAI,YAAY,KAAK,MAAM;AAC3C,SAAK,QAAQ,IAAI,SAAS,KAAK,MAAM;AAAA,EACvC;AAAA,EAxBQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAeF;","names":[]}
1
+ {"version":3,"sources":["../src/client.ts","../src/actions.ts","../src/actionComments.ts","../src/projects.ts","../src/workspaces.ts","../src/contacts.ts","../src/pipelines.ts","../src/tickets.ts","../src/products.ts","../src/features.ts","../src/userStories.ts","../src/epics.ts","../src/labels.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["import { createTRPCClient, httpBatchLink, TRPCClientError } from '@trpc/client';\nimport superjson from 'superjson';\n\ntype ActionInput = {\n assigneeId?: string;\n};\n\ntype KanbanInput = {\n projectId?: string;\n assigneeId?: string;\n kanbanStatus?: 'BACKLOG' | 'TODO' | 'IN_PROGRESS' | 'IN_REVIEW' | 'DONE' | 'CANCELLED';\n};\n\ntype TodayInput = {\n workspaceId?: string;\n};\n\ntype DateRangeInput = {\n startDate: Date;\n endDate: Date;\n workspaceId?: string;\n};\n\ntype ProjectInput = {\n include?: {\n actions?: boolean;\n };\n workspaceId?: string;\n};\n\ntype ActionStatus = 'ACTIVE' | 'COMPLETED' | 'CANCELLED' | 'DELETED' | 'DRAFT';\ntype ActionKanbanStatus = 'BACKLOG' | 'TODO' | 'IN_PROGRESS' | 'IN_REVIEW' | 'DONE' | 'CANCELLED';\ntype ActionPriority = 'Quick' | 'Scheduled' | '1st Priority' | '2nd Priority' | '3rd Priority' | '4th Priority' | '5th Priority' | 'Errand' | 'Remember' | 'Watch' | 'Someday Maybe';\n\ntype ActionCreateInput = {\n name: string;\n description?: string;\n projectId?: string;\n workspaceId?: string;\n dueDate?: Date;\n scheduledStart?: Date;\n scheduledEnd?: Date;\n duration?: number;\n priority?: ActionPriority;\n status?: ActionStatus;\n epicId?: string;\n effortEstimate?: number;\n blockedByIds?: string[];\n};\n\ntype ActionUpdateInput = {\n id: string;\n name?: string;\n description?: string;\n projectId?: string;\n workspaceId?: string | null;\n dueDate?: Date | null;\n scheduledStart?: Date | null;\n scheduledEnd?: Date | null;\n duration?: number | null;\n priority?: ActionPriority;\n status?: ActionStatus;\n kanbanStatus?: ActionKanbanStatus;\n epicId?: string | null;\n effortEstimate?: number | null;\n blockedByIds?: string[];\n};\n\nexport interface TrpcClient {\n action: {\n getAll: { query: (input?: ActionInput) => Promise<unknown[]> };\n getKanbanActions: { query: (input?: KanbanInput) => Promise<unknown[]> };\n getToday: { query: (input?: TodayInput) => Promise<unknown[]> };\n getByDateRange: { query: (input: DateRangeInput) => Promise<unknown[]> };\n getProjectActions: { query: (input: { projectId: string; assigneeId?: string }) => Promise<unknown[]> };\n create: { mutate: (input: ActionCreateInput) => Promise<unknown> };\n update: { mutate: (input: ActionUpdateInput) => Promise<unknown> };\n };\n project: {\n getAll: { query: (input?: ProjectInput) => Promise<unknown[]> };\n };\n workspace: {\n list: { query: () => Promise<unknown[]> };\n };\n crmApi: {\n contactList: { query: (input: { workspaceId: string; search?: string; tags?: string[]; organizationId?: string; limit?: number; cursor?: string }) => Promise<unknown> };\n contactGet: { query: (input: { id: string; includeInteractions?: boolean }) => Promise<unknown> };\n contactCreate: { mutate: (input: { workspaceId: string; firstName?: string; lastName?: string; email?: string | null; phone?: string; linkedIn?: string; telegram?: string; twitter?: string; github?: string; bluesky?: string; about?: string; profileType?: string; skills?: string[]; tags?: string[]; organizationId?: string }) => Promise<unknown> };\n contactUpdate: { mutate: (input: { id: string; firstName?: string; lastName?: string; email?: string | null; phone?: string | null; linkedIn?: string | null; telegram?: string | null; twitter?: string | null; github?: string | null; bluesky?: string | null; about?: string; profileType?: string; skills?: string[]; tags?: string[]; organizationId?: string | null }) => Promise<unknown> };\n contactDelete: { mutate: (input: { id: string }) => Promise<unknown> };\n contactAddInteraction: { mutate: (input: { contactId: string; type: string; direction: string; subject?: string; notes?: string; metadata?: unknown }) => Promise<unknown> };\n pipelineGet: { query: (input: { workspaceId: string }) => Promise<unknown> };\n pipelineGetStages: { query: (input: { workspaceId: string }) => Promise<unknown[]> };\n dealList: { query: (input: { workspaceId: string }) => Promise<unknown[]> };\n dealGet: { query: (input: { id: string }) => Promise<unknown> };\n dealCreate: { mutate: (input: { workspaceId: string; stageId: string; title: string; description?: string; value?: number; currency?: string; probability?: number; expectedCloseDate?: Date; contactId?: string; organizationId?: string; assignedToId?: string }) => Promise<unknown> };\n dealUpdate: { mutate: (input: { id: string; title?: string; description?: string | null; value?: number | null; currency?: string; probability?: number | null; expectedCloseDate?: Date | null; contactId?: string | null; organizationId?: string | null; assignedToId?: string | null }) => Promise<unknown> };\n dealMove: { mutate: (input: { id: string; stageId: string; stageOrder: number }) => Promise<unknown> };\n dealDelete: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n actionComment: {\n getComments: { query: (input: { actionId: string }) => Promise<unknown[]> };\n addComment: { mutate: (input: { actionId: string; content: string }) => Promise<unknown> };\n updateComment: { mutate: (input: { commentId: string; content: string }) => Promise<unknown> };\n deleteComment: { mutate: (input: { commentId: string }) => Promise<unknown> };\n };\n epic: {\n list: { query: (input: { workspaceId: string; status?: 'OPEN' | 'IN_PROGRESS' | 'DONE' | 'CANCELLED' }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n create: { mutate: (input: { workspaceId: string; name: string; description?: string; priority?: 'HIGH' | 'MEDIUM' | 'LOW' | 'NONE'; startDate?: Date; targetDate?: Date }) => Promise<unknown> };\n update: { mutate: (input: { id: string; name?: string; description?: string | null; status?: 'OPEN' | 'IN_PROGRESS' | 'DONE' | 'CANCELLED'; priority?: 'HIGH' | 'MEDIUM' | 'LOW' | 'NONE'; startDate?: Date | null; targetDate?: Date | null }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n tag: {\n list: { query: (input?: { workspaceId?: string; category?: string | null }) => Promise<unknown> };\n create: { mutate: (input: { workspaceId: string; name: string; color: string; description?: string; category?: string | null }) => Promise<unknown> };\n setEntityTags: { mutate: (input: { entityType: 'action' | 'ticket' | 'feature' | 'epic'; entityId: string; tagIds: string[] }) => Promise<unknown> };\n listForEntity: { query: (input: { entityType: 'action' | 'ticket' | 'feature' | 'epic'; entityId: string }) => Promise<unknown[]> };\n };\n product: {\n product: {\n list: { query: (input: { workspaceId: string }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n getBySlug: { query: (input: { workspaceId: string; slug: string }) => Promise<unknown> };\n create: { mutate: (input: { workspaceId: string; name: string; slug: string; description?: string; icon?: string; color?: string }) => Promise<unknown> };\n update: { mutate: (input: { id: string; name?: string; description?: string; icon?: string; color?: string; funTicketIds?: boolean }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n feature: {\n list: { query: (input: { productId: string; status?: 'IDEA' | 'DEFINED' | 'IN_PROGRESS' | 'SHIPPED' | 'ARCHIVED' }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n create: { mutate: (input: { productId: string; name: string; description?: string; vision?: string; status?: 'IDEA' | 'DEFINED' | 'IN_PROGRESS' | 'SHIPPED' | 'ARCHIVED'; effort?: number; priority?: number; goalId?: number }) => Promise<unknown> };\n update: { mutate: (input: { id: string; name?: string; description?: string; vision?: string; status?: 'IDEA' | 'DEFINED' | 'IN_PROGRESS' | 'SHIPPED' | 'ARCHIVED'; effort?: number; priority?: number; goalId?: number | null }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n addUserStory: { mutate: (input: { featureId: string; scopeId?: string; asA?: string; iWant?: string; soThat?: string; acceptanceCriteria?: string }) => Promise<unknown> };\n updateUserStory: { mutate: (input: { id: string; scopeId?: string | null; asA?: string; iWant?: string; soThat?: string; acceptanceCriteria?: string }) => Promise<unknown> };\n deleteUserStory: { mutate: (input: { id: string }) => Promise<unknown> };\n };\n ticket: {\n list: { query: (input: { productId?: string; status?: string; type?: string; featureId?: string; epicId?: string; cycleId?: string; assigneeId?: string; prUrl?: string; branchName?: string }) => Promise<unknown[]> };\n getById: { query: (input: { id: string }) => Promise<unknown> };\n create: { mutate: (input: { productId: string; title: string; body?: string; type?: string; status?: string; priority?: number; points?: number; branchName?: string; prUrl?: string; designUrl?: string; specUrl?: string; links?: Record<string, string>; epicId?: string; featureId?: string; cycleId?: string; scopeId?: string; assigneeId?: string; templateId?: string }) => Promise<unknown> };\n update: { mutate: (input: { id: string; title?: string; body?: string; type?: string; status?: string; priority?: number | null; points?: number | null; branchName?: string | null; prUrl?: string | null; designUrl?: string | null; specUrl?: string | null; links?: Record<string, string> | null; epicId?: string | null; featureId?: string | null; cycleId?: string | null; scopeId?: string | null; assigneeId?: string | null }) => Promise<unknown> };\n delete: { mutate: (input: { id: string }) => Promise<unknown> };\n search: { query: (input: { productId: string; query?: string; excludeTicketId?: string; limit?: number }) => Promise<unknown[]> };\n addDependency: { mutate: (input: { ticketId: string; dependsOnId: string }) => Promise<unknown> };\n removeDependency: { mutate: (input: { ticketId: string; dependsOnId: string }) => Promise<unknown> };\n addComment: { mutate: (input: { ticketId: string; content: string }) => Promise<unknown> };\n deleteComment: { mutate: (input: { id: string }) => Promise<unknown> };\n linkAction: { mutate: (input: { ticketId: string; actionId: string }) => Promise<unknown> };\n unlinkAction: { mutate: (input: { actionId: string }) => Promise<unknown> };\n };\n };\n}\n\nexport function createClient(config: { token: string; apiUrl: string }): TrpcClient {\n const apiUrl = config.apiUrl.replace(/\\/+$/, '');\n\n return createTRPCClient<any>({\n links: [\n httpBatchLink({\n url: `${apiUrl}/api/trpc`,\n headers() {\n return {\n Authorization: `Bearer ${config.token}`,\n };\n },\n transformer: superjson,\n }),\n ],\n }) as unknown as TrpcClient;\n}\n\nexport function isTRPCError(error: unknown): error is TRPCClientError<any> {\n return error instanceof TRPCClientError;\n}\n\nexport { TRPCClientError };\n","import type { TrpcClient } from './client.js';\nimport type { Action, KanbanStatus, Priority } from './types/action.js';\n\nexport interface ActionsListOptions {\n projectId?: string;\n status?: KanbanStatus;\n assigneeId?: string;\n}\n\nexport interface ActionsKanbanOptions {\n projectId?: string;\n status?: KanbanStatus;\n assigneeId?: string;\n}\n\nexport type ActionStatus = 'ACTIVE' | 'COMPLETED' | 'CANCELLED' | 'DELETED' | 'DRAFT';\n\nexport interface ActionCreateInput {\n name: string;\n description?: string;\n projectId?: string;\n workspaceId?: string;\n dueDate?: Date;\n scheduledStart?: Date;\n scheduledEnd?: Date;\n duration?: number;\n priority?: Priority;\n status?: ActionStatus;\n epicId?: string;\n effortEstimate?: number;\n blockedByIds?: string[];\n}\n\nexport interface ActionUpdateInput {\n id: string;\n name?: string;\n description?: string;\n projectId?: string;\n workspaceId?: string | null;\n dueDate?: Date | null;\n scheduledStart?: Date | null;\n scheduledEnd?: Date | null;\n duration?: number | null;\n priority?: Priority;\n status?: ActionStatus;\n kanbanStatus?: KanbanStatus;\n epicId?: string | null;\n effortEstimate?: number | null;\n blockedByIds?: string[];\n}\n\nexport class ActionsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: ActionsListOptions = {}): Promise<Action[]> {\n const { projectId, status, assigneeId } = options;\n let actions: Action[];\n\n if (projectId) {\n actions = await this.client.action.getProjectActions.query({\n projectId,\n assigneeId,\n }) as Action[];\n } else if (status) {\n actions = await this.client.action.getKanbanActions.query({\n kanbanStatus: status,\n assigneeId,\n }) as Action[];\n } else {\n actions = await this.client.action.getAll.query({\n assigneeId,\n }) as Action[];\n }\n\n // Match CLI behavior: hide completed/cancelled unless status specified\n if (!status) {\n actions = actions.filter(action =>\n action.status !== 'COMPLETED' &&\n action.status !== 'CANCELLED' &&\n action.kanbanStatus !== 'DONE' &&\n action.kanbanStatus !== 'CANCELLED'\n );\n }\n\n return actions;\n }\n\n async getToday(workspaceId?: string): Promise<Action[]> {\n return await this.client.action.getToday.query({\n workspaceId,\n }) as Action[];\n }\n\n async getByDateRange(start: Date, end: Date, workspaceId?: string): Promise<Action[]> {\n return await this.client.action.getByDateRange.query({\n startDate: start,\n endDate: end,\n workspaceId,\n }) as Action[];\n }\n\n async getKanban(options: ActionsKanbanOptions = {}): Promise<Action[]> {\n const { projectId, status, assigneeId } = options;\n\n return await this.client.action.getKanbanActions.query({\n projectId,\n kanbanStatus: status,\n assigneeId,\n }) as Action[];\n }\n\n async getProjectActions(projectId: string, assigneeId?: string): Promise<Action[]> {\n return await this.client.action.getProjectActions.query({\n projectId,\n assigneeId,\n }) as Action[];\n }\n\n async create(input: ActionCreateInput): Promise<Action> {\n return await this.client.action.create.mutate(input) as Action;\n }\n\n async update(input: ActionUpdateInput): Promise<Action> {\n return await this.client.action.update.mutate(input) as Action;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { ActionComment } from './types/comment.js';\n\nexport interface ActionCommentAddInput {\n actionId: string;\n content: string;\n}\n\nexport interface ActionCommentUpdateInput {\n commentId: string;\n content: string;\n}\n\nexport class ActionCommentsApi {\n constructor(private client: TrpcClient) {}\n\n async list(actionId: string): Promise<ActionComment[]> {\n return await this.client.actionComment.getComments.query({\n actionId,\n }) as ActionComment[];\n }\n\n async add(input: ActionCommentAddInput): Promise<ActionComment> {\n return await this.client.actionComment.addComment.mutate(input) as ActionComment;\n }\n\n async update(input: ActionCommentUpdateInput): Promise<ActionComment> {\n return await this.client.actionComment.updateComment.mutate(input) as ActionComment;\n }\n\n async delete(commentId: string): Promise<ActionComment> {\n return await this.client.actionComment.deleteComment.mutate({\n commentId,\n }) as ActionComment;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Project } from './types/project.js';\n\nexport interface ProjectsListOptions {\n workspaceId?: string;\n includeActions?: boolean;\n}\n\nexport class ProjectsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: ProjectsListOptions = {}): Promise<Project[]> {\n const { workspaceId, includeActions } = options;\n\n return await this.client.project.getAll.query({\n workspaceId,\n include: includeActions ? { actions: true } : undefined,\n }) as Project[];\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Workspace } from './types/workspace.js';\n\nexport class WorkspacesApi {\n constructor(private client: TrpcClient) {}\n\n async list(): Promise<Workspace[]> {\n return await this.client.workspace.list.query() as Workspace[];\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Contact, ContactInteraction, ContactListOutput, InteractionType, InteractionDirection } from './types/contact.js';\n\nexport interface ContactsListOptions {\n workspaceId: string;\n search?: string;\n tags?: string[];\n organizationId?: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface ContactCreateInput {\n workspaceId: string;\n firstName?: string;\n lastName?: string;\n email?: string | null;\n phone?: string;\n linkedIn?: string;\n telegram?: string;\n twitter?: string;\n github?: string;\n bluesky?: string;\n about?: string;\n profileType?: string;\n skills?: string[];\n tags?: string[];\n organizationId?: string;\n}\n\nexport interface ContactUpdateInput {\n id: string;\n firstName?: string;\n lastName?: string;\n email?: string | null;\n phone?: string | null;\n linkedIn?: string | null;\n telegram?: string | null;\n twitter?: string | null;\n github?: string | null;\n bluesky?: string | null;\n about?: string;\n profileType?: string;\n skills?: string[];\n tags?: string[];\n organizationId?: string | null;\n}\n\nexport interface AddInteractionInput {\n contactId: string;\n type: InteractionType;\n direction: InteractionDirection;\n subject?: string;\n notes?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class ContactsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: ContactsListOptions): Promise<ContactListOutput> {\n return await this.client.crmApi.contactList.query(options) as ContactListOutput;\n }\n\n async get(id: string, options?: { includeInteractions?: boolean }): Promise<Contact> {\n return await this.client.crmApi.contactGet.query({\n id,\n includeInteractions: options?.includeInteractions,\n }) as Contact;\n }\n\n async create(input: ContactCreateInput): Promise<Contact> {\n return await this.client.crmApi.contactCreate.mutate(input) as Contact;\n }\n\n async update(input: ContactUpdateInput): Promise<Contact> {\n return await this.client.crmApi.contactUpdate.mutate(input) as Contact;\n }\n\n async delete(id: string): Promise<void> {\n await this.client.crmApi.contactDelete.mutate({ id });\n }\n\n async addInteraction(input: AddInteractionInput): Promise<ContactInteraction> {\n return await this.client.crmApi.contactAddInteraction.mutate(input) as ContactInteraction;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Pipeline, PipelineStage, Deal } from './types/pipeline.js';\n\nexport interface DealCreateInput {\n workspaceId: string;\n stageId: string;\n title: string;\n description?: string;\n value?: number;\n currency?: string;\n probability?: number;\n expectedCloseDate?: Date;\n contactId?: string;\n organizationId?: string;\n assignedToId?: string;\n}\n\nexport interface DealUpdateInput {\n id: string;\n title?: string;\n description?: string | null;\n value?: number | null;\n currency?: string;\n probability?: number | null;\n expectedCloseDate?: Date | null;\n contactId?: string | null;\n organizationId?: string | null;\n assignedToId?: string | null;\n}\n\nexport interface DealMoveInput {\n id: string;\n stageId: string;\n stageOrder: number;\n}\n\nexport class PipelinesApi {\n constructor(private client: TrpcClient) {}\n\n async get(workspaceId: string): Promise<Pipeline | null> {\n return await this.client.crmApi.pipelineGet.query({ workspaceId }) as Pipeline | null;\n }\n\n async getStages(workspaceId: string): Promise<PipelineStage[]> {\n return await this.client.crmApi.pipelineGetStages.query({ workspaceId }) as PipelineStage[];\n }\n\n async listDeals(workspaceId: string): Promise<Deal[]> {\n return await this.client.crmApi.dealList.query({ workspaceId }) as Deal[];\n }\n\n async getDeal(id: string): Promise<Deal> {\n return await this.client.crmApi.dealGet.query({ id }) as Deal;\n }\n\n async createDeal(input: DealCreateInput): Promise<Deal> {\n return await this.client.crmApi.dealCreate.mutate(input) as Deal;\n }\n\n async updateDeal(input: DealUpdateInput): Promise<Deal> {\n return await this.client.crmApi.dealUpdate.mutate(input) as Deal;\n }\n\n async moveDeal(input: DealMoveInput): Promise<Deal> {\n return await this.client.crmApi.dealMove.mutate(input) as Deal;\n }\n\n async deleteDeal(id: string): Promise<void> {\n await this.client.crmApi.dealDelete.mutate({ id });\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { TicketComment } from './types/comment.js';\nimport type {\n Ticket,\n TicketDetail,\n TicketDependencyEdge,\n TicketStatus,\n TicketType,\n} from './types/ticket.js';\nimport type { Action } from './types/action.js';\n\nexport interface TicketListOptions {\n /**\n * Required for product-scoped queries. Optional when `prUrl` or `branchName`\n * is supplied — those filters are workspace-global (a PR URL or branch name\n * uniquely identifies a Ticket across all products in the workspace), so the\n * server resolves scope from the caller's auth context instead.\n */\n productId?: string;\n status?: TicketStatus;\n type?: TicketType;\n featureId?: string;\n epicId?: string;\n cycleId?: string;\n assigneeId?: string;\n /** Workspace-scoped lookup by `Ticket.prUrl` (exact match). */\n prUrl?: string;\n /** Workspace-scoped lookup by `Ticket.branchName` (exact match). */\n branchName?: string;\n}\n\nexport interface TicketCreateInput {\n productId: string;\n title: string;\n body?: string;\n type?: TicketType;\n status?: TicketStatus;\n /** 0–4; lower is higher priority. */\n priority?: number;\n points?: number;\n branchName?: string;\n prUrl?: string;\n designUrl?: string;\n specUrl?: string;\n links?: Record<string, string>;\n epicId?: string;\n featureId?: string;\n cycleId?: string;\n scopeId?: string;\n assigneeId?: string;\n templateId?: string;\n}\n\nexport interface TicketUpdateInput {\n id: string;\n title?: string;\n body?: string;\n type?: TicketType;\n status?: TicketStatus;\n priority?: number | null;\n points?: number | null;\n branchName?: string | null;\n prUrl?: string | null;\n designUrl?: string | null;\n specUrl?: string | null;\n links?: Record<string, string> | null;\n epicId?: string | null;\n featureId?: string | null;\n cycleId?: string | null;\n scopeId?: string | null;\n assigneeId?: string | null;\n}\n\nexport interface TicketCommentAddInput {\n ticketId: string;\n content: string;\n}\n\nexport interface TicketSearchOptions {\n productId: string;\n query?: string;\n excludeTicketId?: string;\n limit?: number;\n}\n\nexport class TicketsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: TicketListOptions): Promise<Ticket[]> {\n return await this.client.product.ticket.list.query(options) as Ticket[];\n }\n\n async get(id: string): Promise<TicketDetail> {\n return await this.client.product.ticket.getById.query({\n id,\n }) as TicketDetail;\n }\n\n async create(input: TicketCreateInput): Promise<Ticket> {\n return await this.client.product.ticket.create.mutate(input) as Ticket;\n }\n\n async update(input: TicketUpdateInput): Promise<Ticket> {\n return await this.client.product.ticket.update.mutate(input) as Ticket;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.product.ticket.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n\n async search(options: TicketSearchOptions): Promise<TicketDependencyEdge[]> {\n return await this.client.product.ticket.search.query(\n options,\n ) as TicketDependencyEdge[];\n }\n\n /** Mark `ticketId` as blocked by `dependsOnId`. */\n async addDependency(\n ticketId: string,\n dependsOnId: string,\n ): Promise<{ id: string; dependsOn: TicketDependencyEdge }> {\n return await this.client.product.ticket.addDependency.mutate({\n ticketId,\n dependsOnId,\n }) as { id: string; dependsOn: TicketDependencyEdge };\n }\n\n async removeDependency(\n ticketId: string,\n dependsOnId: string,\n ): Promise<{ success: boolean }> {\n return await this.client.product.ticket.removeDependency.mutate({\n ticketId,\n dependsOnId,\n }) as { success: boolean };\n }\n\n async addComment(input: TicketCommentAddInput): Promise<TicketComment> {\n return await this.client.product.ticket.addComment.mutate(\n input,\n ) as TicketComment;\n }\n\n async deleteComment(id: string): Promise<{ success: boolean }> {\n return await this.client.product.ticket.deleteComment.mutate({\n id,\n }) as { success: boolean };\n }\n\n /** Attach an existing action to a ticket. */\n async linkAction(ticketId: string, actionId: string): Promise<Action> {\n return await this.client.product.ticket.linkAction.mutate({\n ticketId,\n actionId,\n }) as Action;\n }\n\n /** Detach an action from whatever ticket it's linked to. */\n async unlinkAction(actionId: string): Promise<Action> {\n return await this.client.product.ticket.unlinkAction.mutate({\n actionId,\n }) as Action;\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Product } from './types/product.js';\n\nexport interface ProductCreateInput {\n workspaceId: string;\n name: string;\n /** Kebab-case slug; must match `/^[a-z0-9-]+$/`. */\n slug: string;\n description?: string;\n icon?: string;\n color?: string;\n}\n\nexport interface ProductUpdateInput {\n id: string;\n name?: string;\n description?: string;\n icon?: string;\n color?: string;\n funTicketIds?: boolean;\n}\n\nexport class ProductsApi {\n constructor(private client: TrpcClient) {}\n\n async list(workspaceId: string): Promise<Product[]> {\n return await this.client.product.product.list.query({\n workspaceId,\n }) as Product[];\n }\n\n async get(id: string): Promise<Product> {\n return await this.client.product.product.getById.query({ id }) as Product;\n }\n\n async getBySlug(workspaceId: string, slug: string): Promise<Product> {\n return await this.client.product.product.getBySlug.query({\n workspaceId,\n slug,\n }) as Product;\n }\n\n /**\n * Resolve a product reference (slug or CUID) to a full Product. Falls back\n * to slug lookup if the bare CUID lookup fails — callers can pass either.\n */\n async resolve(workspaceId: string, slugOrId: string): Promise<Product> {\n // Heuristic: CUIDs from Prisma start with 'c' and are 25 chars; otherwise\n // try slug first. We try both to stay forgiving.\n const looksLikeId = /^c[a-z0-9]{20,}$/.test(slugOrId);\n if (looksLikeId) {\n try {\n return await this.get(slugOrId);\n } catch {\n // fall through to slug\n }\n }\n return await this.getBySlug(workspaceId, slugOrId);\n }\n\n async create(input: ProductCreateInput): Promise<Product> {\n return await this.client.product.product.create.mutate(input) as Product;\n }\n\n async update(input: ProductUpdateInput): Promise<Product> {\n return await this.client.product.product.update.mutate(input) as Product;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.product.product.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Feature, FeatureStatus } from './types/feature.js';\n\nexport interface FeatureListOptions {\n productId: string;\n status?: FeatureStatus;\n}\n\nexport interface FeatureCreateInput {\n productId: string;\n name: string;\n description?: string;\n vision?: string;\n status?: FeatureStatus;\n effort?: number;\n /** 0–4; lower is higher priority. */\n priority?: number;\n goalId?: number;\n}\n\nexport interface FeatureUpdateInput {\n id: string;\n name?: string;\n description?: string;\n vision?: string;\n status?: FeatureStatus;\n effort?: number;\n priority?: number;\n goalId?: number | null;\n}\n\nexport class FeaturesApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: FeatureListOptions): Promise<Feature[]> {\n return await this.client.product.feature.list.query({\n productId: options.productId,\n status: options.status,\n }) as Feature[];\n }\n\n async get(id: string): Promise<Feature> {\n return await this.client.product.feature.getById.query({ id }) as Feature;\n }\n\n async create(input: FeatureCreateInput): Promise<Feature> {\n return await this.client.product.feature.create.mutate(input) as Feature;\n }\n\n async update(input: FeatureUpdateInput): Promise<Feature> {\n return await this.client.product.feature.update.mutate(input) as Feature;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.product.feature.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Feature } from './types/feature.js';\nimport type { UserStory } from './types/userStory.js';\n\nexport interface UserStoryListOptions {\n featureId: string;\n}\n\nexport interface UserStoryCreateInput {\n featureId: string;\n asA?: string;\n iWant?: string;\n soThat?: string;\n acceptanceCriteria?: string;\n scopeId?: string;\n}\n\nexport interface UserStoryUpdateInput {\n id: string;\n asA?: string;\n iWant?: string;\n soThat?: string;\n acceptanceCriteria?: string;\n scopeId?: string | null;\n}\n\n/**\n * Native, structured user stories on a feature (As a / I want / So that).\n *\n * Mirrors the existing `FeaturesApi` shape and the `client.product.feature.*`\n * call style. `list` derives from the feature's `getById` payload, which\n * already includes `userStories` ordered by `displayOrder` — there is no\n * dedicated list procedure.\n */\nexport class UserStoriesApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: UserStoryListOptions): Promise<UserStory[]> {\n const feature = await this.client.product.feature.getById.query({\n id: options.featureId,\n }) as Feature & { userStories?: UserStory[] };\n return feature.userStories ?? [];\n }\n\n async create(input: UserStoryCreateInput): Promise<UserStory> {\n return await this.client.product.feature.addUserStory.mutate(\n input,\n ) as UserStory;\n }\n\n async update(input: UserStoryUpdateInput): Promise<UserStory> {\n return await this.client.product.feature.updateUserStory.mutate(\n input,\n ) as UserStory;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.product.feature.deleteUserStory.mutate({\n id,\n }) as { success: boolean };\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Epic, EpicPriority, EpicStatus } from './types/epic.js';\n\nexport interface EpicListOptions {\n workspaceId: string;\n status?: EpicStatus;\n}\n\nexport interface EpicCreateInput {\n workspaceId: string;\n name: string;\n description?: string;\n priority?: EpicPriority;\n startDate?: Date;\n targetDate?: Date;\n}\n\nexport interface EpicUpdateInput {\n id: string;\n name?: string;\n description?: string | null;\n status?: EpicStatus;\n priority?: EpicPriority;\n startDate?: Date | null;\n targetDate?: Date | null;\n}\n\nexport class EpicsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: EpicListOptions): Promise<Epic[]> {\n return await this.client.epic.list.query({\n workspaceId: options.workspaceId,\n status: options.status,\n }) as Epic[];\n }\n\n async get(id: string): Promise<Epic> {\n return await this.client.epic.getById.query({ id }) as Epic;\n }\n\n async create(input: EpicCreateInput): Promise<Epic> {\n return await this.client.epic.create.mutate(input) as Epic;\n }\n\n async update(input: EpicUpdateInput): Promise<Epic> {\n return await this.client.epic.update.mutate(input) as Epic;\n }\n\n async delete(id: string): Promise<{ success: boolean }> {\n return await this.client.epic.delete.mutate({ id }) as {\n success: boolean;\n };\n }\n}\n","import type { TrpcClient } from './client.js';\nimport type { Tag, TagEntityType, TagListResult } from './types/tag.js';\n\nexport interface LabelListOptions {\n workspaceId?: string;\n category?: string | null;\n}\n\nexport interface LabelCreateInput {\n workspaceId: string;\n name: string;\n color: string;\n description?: string;\n category?: string | null;\n}\n\nexport interface SetEntityTagsInput {\n entityType: TagEntityType;\n entityId: string;\n tagIds: string[];\n}\n\nexport interface ListForEntityInput {\n entityType: TagEntityType;\n entityId: string;\n}\n\nexport interface SetEntityTagsResult {\n entityType: TagEntityType;\n entityId: string;\n tags: Tag[];\n}\n\n/**\n * Labels API. Backed by the server's `tag.*` tRPC procedures. \"Label\" is the\n * user-facing word for a Tag (specifically when `category` is null).\n */\nexport class LabelsApi {\n constructor(private client: TrpcClient) {}\n\n async list(options: LabelListOptions = {}): Promise<TagListResult> {\n return (await this.client.tag.list.query({\n workspaceId: options.workspaceId,\n category: options.category,\n })) as TagListResult;\n }\n\n async create(input: LabelCreateInput): Promise<Tag> {\n return (await this.client.tag.create.mutate({\n workspaceId: input.workspaceId,\n name: input.name,\n color: input.color,\n description: input.description,\n category: input.category,\n })) as Tag;\n }\n\n async setEntityTags(input: SetEntityTagsInput): Promise<SetEntityTagsResult> {\n return (await this.client.tag.setEntityTags.mutate(input)) as SetEntityTagsResult;\n }\n\n async listForEntity(input: ListForEntityInput): Promise<Tag[]> {\n return (await this.client.tag.listForEntity.query(input)) as Tag[];\n }\n}\n","import Conf from 'conf';\n\nexport interface ExponentialConfig {\n apiUrl: string;\n token: string;\n tokenExpiry?: string;\n defaultWorkspaceId?: string;\n defaultWorkspaceSlug?: string;\n}\n\nconst schema = {\n apiUrl: {\n type: 'string' as const,\n default: '',\n },\n token: {\n type: 'string' as const,\n default: '',\n },\n tokenExpiry: {\n type: 'string' as const,\n default: '',\n },\n defaultWorkspaceId: {\n type: 'string' as const,\n default: '',\n },\n defaultWorkspaceSlug: {\n type: 'string' as const,\n default: '',\n },\n};\n\nfunction createStore(projectName: string) {\n return new Conf<ExponentialConfig>({\n projectName,\n schema,\n });\n}\n\nfunction readConfig(store: Conf<ExponentialConfig>): ExponentialConfig {\n return {\n apiUrl: store.get('apiUrl'),\n token: store.get('token'),\n tokenExpiry: store.get('tokenExpiry'),\n defaultWorkspaceId: store.get('defaultWorkspaceId'),\n defaultWorkspaceSlug: store.get('defaultWorkspaceSlug'),\n };\n}\n\nfunction writeConfig(store: Conf<ExponentialConfig>, values: Partial<ExponentialConfig>): void {\n if (values.apiUrl !== undefined) store.set('apiUrl', values.apiUrl);\n if (values.token !== undefined) store.set('token', values.token);\n if (values.tokenExpiry !== undefined) store.set('tokenExpiry', values.tokenExpiry);\n if (values.defaultWorkspaceId !== undefined) store.set('defaultWorkspaceId', values.defaultWorkspaceId);\n if (values.defaultWorkspaceSlug !== undefined) store.set('defaultWorkspaceSlug', values.defaultWorkspaceSlug);\n}\n\nconst defaultStore = createStore('exponential-sdk');\n\nexport function createConfigStore(options?: { projectName?: string }) {\n const store = createStore(options?.projectName ?? 'exponential-sdk');\n\n return {\n loadConfig: () => readConfig(store),\n saveConfig: (values: Partial<ExponentialConfig>) => writeConfig(store, values),\n clearConfig: () => store.clear(),\n isAuthenticated: () => {\n const cfg = readConfig(store);\n return Boolean(cfg.token && cfg.apiUrl);\n },\n getConfigPath: () => store.path,\n };\n}\n\nexport function loadConfig(): ExponentialConfig {\n return readConfig(defaultStore);\n}\n\nexport function saveConfig(values: Partial<ExponentialConfig>): void {\n writeConfig(defaultStore, values);\n}\n\nexport function clearConfig(): void {\n defaultStore.clear();\n}\n\nexport function isAuthenticated(): boolean {\n const cfg = readConfig(defaultStore);\n return Boolean(cfg.token && cfg.apiUrl);\n}\n\nexport function getConfigPath(): string {\n return defaultStore.path;\n}\n","import { createClient, isTRPCError, TRPCClientError, type TrpcClient } from './client.js';\nimport { ActionsApi } from './actions.js';\nimport { ActionCommentsApi } from './actionComments.js';\nimport { ProjectsApi } from './projects.js';\nimport { WorkspacesApi } from './workspaces.js';\nimport { ContactsApi } from './contacts.js';\nimport { PipelinesApi } from './pipelines.js';\nimport { TicketsApi } from './tickets.js';\nimport { ProductsApi } from './products.js';\nimport { FeaturesApi } from './features.js';\nimport { UserStoriesApi } from './userStories.js';\nimport { EpicsApi } from './epics.js';\nimport { LabelsApi } from './labels.js';\n\nexport class ExponentialClient {\n private client: TrpcClient;\n actions: ActionsApi;\n actionComments: ActionCommentsApi;\n projects: ProjectsApi;\n workspaces: WorkspacesApi;\n contacts: ContactsApi;\n pipelines: PipelinesApi;\n tickets: TicketsApi;\n products: ProductsApi;\n features: FeaturesApi;\n userStories: UserStoriesApi;\n epics: EpicsApi;\n labels: LabelsApi;\n\n constructor(private config: { token: string; apiUrl: string }) {\n this.client = createClient(this.config);\n this.actions = new ActionsApi(this.client);\n this.actionComments = new ActionCommentsApi(this.client);\n this.projects = new ProjectsApi(this.client);\n this.workspaces = new WorkspacesApi(this.client);\n this.contacts = new ContactsApi(this.client);\n this.pipelines = new PipelinesApi(this.client);\n this.tickets = new TicketsApi(this.client);\n this.products = new ProductsApi(this.client);\n this.features = new FeaturesApi(this.client);\n this.userStories = new UserStoriesApi(this.client);\n this.epics = new EpicsApi(this.client);\n this.labels = new LabelsApi(this.client);\n }\n}\n\nexport {\n createConfigStore,\n loadConfig,\n saveConfig,\n clearConfig,\n isAuthenticated,\n getConfigPath,\n} from './config.js';\n\nexport type { ExponentialConfig } from './config.js';\nexport type {\n Action,\n ActionOutput,\n ActionsListOutput,\n KanbanStatus,\n Priority,\n} from './types/action.js';\nexport type {\n ActionCreateInput,\n ActionUpdateInput,\n ActionStatus,\n} from './actions.js';\nexport type { Project, ProjectOutput, ProjectsListOutput } from './types/project.js';\nexport type { Workspace, WorkspaceOutput, WorkspacesListOutput } from './types/workspace.js';\nexport type {\n Contact,\n ContactInteraction,\n ContactListOutput,\n InteractionType,\n InteractionDirection,\n} from './types/contact.js';\nexport type {\n ContactCreateInput,\n ContactUpdateInput,\n AddInteractionInput,\n ContactsListOptions,\n} from './contacts.js';\nexport type {\n Pipeline,\n PipelineStage,\n Deal,\n DealActivity,\n} from './types/pipeline.js';\nexport type {\n DealCreateInput,\n DealUpdateInput,\n DealMoveInput,\n} from './pipelines.js';\nexport type {\n ActionComment,\n TicketComment,\n CommentAuthor,\n} from './types/comment.js';\nexport type {\n ActionCommentAddInput,\n ActionCommentUpdateInput,\n} from './actionComments.js';\nexport type { Product } from './types/product.js';\nexport type { ProductCreateInput, ProductUpdateInput } from './products.js';\nexport type {\n Feature,\n FeatureScope,\n FeatureScopeStatus,\n FeatureStatus,\n} from './types/feature.js';\nexport type {\n FeatureCreateInput,\n FeatureUpdateInput,\n FeatureListOptions,\n} from './features.js';\nexport type { UserStory } from './types/userStory.js';\nexport type {\n UserStoryCreateInput,\n UserStoryUpdateInput,\n UserStoryListOptions,\n} from './userStories.js';\nexport type {\n Ticket,\n TicketDetail,\n TicketAssignee,\n TicketDependencyEdge,\n TicketStatus,\n TicketType,\n} from './types/ticket.js';\nexport type {\n TicketListOptions,\n TicketCreateInput,\n TicketUpdateInput,\n TicketCommentAddInput,\n TicketSearchOptions,\n} from './tickets.js';\nexport type { Epic, EpicStatus, EpicPriority } from './types/epic.js';\nexport type {\n EpicCreateInput,\n EpicUpdateInput,\n EpicListOptions,\n} from './epics.js';\nexport type { Tag, TagEntityType, TagListResult } from './types/tag.js';\nexport type {\n LabelListOptions,\n LabelCreateInput,\n SetEntityTagsInput,\n ListForEntityInput,\n SetEntityTagsResult,\n} from './labels.js';\nexport { isTRPCError, TRPCClientError };\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exponential-sdk",
3
- "version": "1.2.0",
3
+ "version": "1.5.0",
4
4
  "description": "SDK for interacting with the Exponential API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,7 +14,8 @@
14
14
  "scripts": {
15
15
  "build": "tsup",
16
16
  "dev": "tsup --watch",
17
- "typecheck": "tsc --noEmit"
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "vitest run"
18
19
  },
19
20
  "engines": {
20
21
  "node": ">=18.0.0"
@@ -27,7 +28,8 @@
27
28
  "devDependencies": {
28
29
  "@types/node": "^20.14.10",
29
30
  "tsup": "^8.3.5",
30
- "typescript": "^5.7.2"
31
+ "typescript": "^5.7.2",
32
+ "vitest": "^2.1.8"
31
33
  },
32
34
  "license": "MIT"
33
35
  }