@wilnertech/halopsa-mcp-server 1.2.0 → 1.4.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.
Files changed (56) hide show
  1. package/README.md +43 -2
  2. package/dist/cache/memory-cache.d.ts +3 -0
  3. package/dist/cache/memory-cache.d.ts.map +1 -1
  4. package/dist/cache/memory-cache.js +4 -0
  5. package/dist/cache/memory-cache.js.map +1 -1
  6. package/dist/tools/batch-operations.d.ts +47 -0
  7. package/dist/tools/batch-operations.d.ts.map +1 -1
  8. package/dist/tools/batch-operations.js +211 -68
  9. package/dist/tools/batch-operations.js.map +1 -1
  10. package/dist/tools/budgets.d.ts +130 -0
  11. package/dist/tools/budgets.d.ts.map +1 -0
  12. package/dist/tools/budgets.js +277 -0
  13. package/dist/tools/budgets.js.map +1 -0
  14. package/dist/tools/milestones.d.ts +129 -0
  15. package/dist/tools/milestones.d.ts.map +1 -0
  16. package/dist/tools/milestones.js +281 -0
  17. package/dist/tools/milestones.js.map +1 -0
  18. package/dist/tools/registrations.d.ts +6 -2
  19. package/dist/tools/registrations.d.ts.map +1 -1
  20. package/dist/tools/registrations.js +39 -5
  21. package/dist/tools/registrations.js.map +1 -1
  22. package/dist/tools/ticket-links.d.ts +41 -0
  23. package/dist/tools/ticket-links.d.ts.map +1 -0
  24. package/dist/tools/ticket-links.js +84 -0
  25. package/dist/tools/ticket-links.js.map +1 -0
  26. package/dist/tools/tickets.d.ts +2 -0
  27. package/dist/tools/tickets.d.ts.map +1 -1
  28. package/dist/tools/tickets.js +59 -2
  29. package/dist/tools/tickets.js.map +1 -1
  30. package/dist/tools/workflows.d.ts +125 -0
  31. package/dist/tools/workflows.d.ts.map +1 -0
  32. package/dist/tools/workflows.js +355 -0
  33. package/dist/tools/workflows.js.map +1 -0
  34. package/dist/types/budgets.d.ts +45 -0
  35. package/dist/types/budgets.d.ts.map +1 -0
  36. package/dist/types/budgets.js +12 -0
  37. package/dist/types/budgets.js.map +1 -0
  38. package/dist/types/milestones.d.ts +65 -0
  39. package/dist/types/milestones.d.ts.map +1 -0
  40. package/dist/types/milestones.js +14 -0
  41. package/dist/types/milestones.js.map +1 -0
  42. package/dist/types/tickets.d.ts +4 -0
  43. package/dist/types/tickets.d.ts.map +1 -1
  44. package/dist/types/workflows.d.ts +77 -0
  45. package/dist/types/workflows.d.ts.map +1 -0
  46. package/dist/types/workflows.js +11 -0
  47. package/dist/types/workflows.js.map +1 -0
  48. package/dist/utils/concurrency.d.ts +42 -0
  49. package/dist/utils/concurrency.d.ts.map +1 -0
  50. package/dist/utils/concurrency.js +82 -0
  51. package/dist/utils/concurrency.js.map +1 -0
  52. package/dist/utils/formatter.d.ts +1 -1
  53. package/dist/utils/formatter.d.ts.map +1 -1
  54. package/dist/utils/formatter.js +30 -3
  55. package/dist/utils/formatter.js.map +1 -1
  56. package/package.json +1 -1
@@ -0,0 +1,281 @@
1
+ /**
2
+ * HaloPSA milestone management tools.
3
+ *
4
+ * Milestones are stored as a nested `milestones[]` array on the ticket
5
+ * itself — there is no top-level /Milestone endpoint (GET /Milestone
6
+ * returns 404). All reads use GET /Tickets/{id}?includedetails=true
7
+ * and all writes use POST /Tickets with a read-before-write merge,
8
+ * replacing the milestones array in its entirety (same pattern as
9
+ * customfields).
10
+ *
11
+ * Discovery note (2026-05-11): confirmed `milestones: []` (empty array)
12
+ * on ticket 22541; Swagger declares `MileStone` schema with 24 props.
13
+ */
14
+ import { z } from 'zod';
15
+ import { formatResponse, stripWriteResponse } from '../utils/formatter.js';
16
+ import { TTL } from '../cache/memory-cache.js';
17
+ import { FormatOptionsSchema } from '../schemas/common.js';
18
+ // =============================================================================
19
+ // Schemas
20
+ // =============================================================================
21
+ /**
22
+ * Single milestone input — reused by set (array element) and add (single).
23
+ */
24
+ const MilestoneInputSchema = z.object({
25
+ name: z.string().min(1)
26
+ .describe('Milestone name (required)'),
27
+ target_date: z.string()
28
+ .describe('Target completion date — ISO 8601 (required)'),
29
+ start_date: z.string().optional()
30
+ .describe('Start date — ISO 8601'),
31
+ sequence: z.number().int().optional()
32
+ .describe('Ordering sequence number'),
33
+ billing_amount: z.number().optional()
34
+ .describe('Billing amount associated with this milestone'),
35
+ status_id: z.number().int().optional()
36
+ .describe('Milestone status ID'),
37
+ state: z.number().int().optional()
38
+ .describe('Milestone state. Halo enum: 0=upcoming (default), 2=complete. State=1 may be in-progress (unverified; probe via UI if needed).'),
39
+ });
40
+ export const ListTicketMilestonesArgsSchema = z.object({
41
+ ticket_id: z.number().int()
42
+ .describe('HaloPSA project ticket ID to read milestones from'),
43
+ format_options: FormatOptionsSchema,
44
+ });
45
+ export const SetTicketMilestonesArgsSchema = z.object({
46
+ ticket_id: z.number().int()
47
+ .describe('HaloPSA project ticket ID'),
48
+ milestones: z.array(MilestoneInputSchema).min(1)
49
+ .describe('Full replacement array of milestones. This REPLACES all existing milestones on the ticket.'),
50
+ format_options: FormatOptionsSchema,
51
+ });
52
+ export const AddTicketMilestoneArgsSchema = z.object({
53
+ ticket_id: z.number().int()
54
+ .describe('HaloPSA project ticket ID'),
55
+ milestone: MilestoneInputSchema
56
+ .describe('Milestone to append to the existing list'),
57
+ format_options: FormatOptionsSchema,
58
+ });
59
+ export const RemoveTicketMilestoneArgsSchema = z.object({
60
+ ticket_id: z.number().int()
61
+ .describe('HaloPSA project ticket ID'),
62
+ milestone_id: z.number().int()
63
+ .describe('ID of the milestone to remove'),
64
+ format_options: FormatOptionsSchema,
65
+ });
66
+ export const GetCurrentMilestoneArgsSchema = z.object({
67
+ parent_ticket_id: z.number().int()
68
+ .describe('HaloPSA project ticket ID whose milestones[] will be inspected'),
69
+ format_options: FormatOptionsSchema,
70
+ });
71
+ // =============================================================================
72
+ // Helpers
73
+ // =============================================================================
74
+ /**
75
+ * Halo write endpoints sometimes return `[{...}]` and sometimes `{...}`.
76
+ * Normalize to a single object so handlers don't have to branch.
77
+ */
78
+ function unwrapWriteResponse(response) {
79
+ return Array.isArray(response) ? response[0] : response;
80
+ }
81
+ /**
82
+ * Fetch ticket with includedetails=true, bypassing cache so we always
83
+ * have a fresh baseline before a write.
84
+ */
85
+ async function fetchTicketFresh(client, ticketId) {
86
+ return client.get(`/Tickets/${ticketId}`, { includedetails: true });
87
+ }
88
+ /**
89
+ * POST the merged ticket payload to Halo and return the stripped, formatted
90
+ * milestones array from the response.
91
+ */
92
+ async function writeMilestones(client, ticketId, existing, newMilestones, format) {
93
+ const payload = { ...existing, id: ticketId, milestones: newMilestones };
94
+ const response = unwrapWriteResponse(await client.post('/Tickets', [payload]));
95
+ client.invalidateCache(`ticket-milestones:${ticketId}*`);
96
+ client.invalidateCache(`ticket:${ticketId}*`);
97
+ client.invalidateCache('tickets:*');
98
+ // Return the milestones array from the written ticket.
99
+ const strippedTicket = stripWriteResponse(response, format, 'ticket');
100
+ const milestones = strippedTicket['milestones'] ?? [];
101
+ const resolvedFormat = format ?? 'compact';
102
+ return formatResponse(milestones, { format: resolvedFormat }, {
103
+ ticket_id: ticketId,
104
+ milestone_count: milestones.length,
105
+ });
106
+ }
107
+ // =============================================================================
108
+ // linkTicketToMilestone — exported orchestration helper (Bug 1)
109
+ // =============================================================================
110
+ /**
111
+ * Link (or unlink) a child ticket to a milestone on its parent project ticket.
112
+ *
113
+ * Halo's Project Task tickettype (id=20) has NO milestone field on the child
114
+ * side — writing milestone_id to the child's own record is a no-op (silently
115
+ * dropped). Milestone membership is stored exclusively in the parent's
116
+ * milestones[].tickets[] array. This helper:
117
+ *
118
+ * 1. Optionally fetches the child to discover its parent_id.
119
+ * 2. Fetches the parent (fresh, includedetails=true).
120
+ * 3. Walks every milestone, removing childTicketId from both tickets[] and
121
+ * the runtime-only tickets_list[] (int array sometimes returned by Halo
122
+ * but not declared in the swagger schema — handled defensively).
123
+ * 4. Appends the child to the target milestone's arrays (unless
124
+ * milestoneId === 0 or null — "unlink" mode, step 3 only).
125
+ * 5. POSTs the parent back with the mutated milestones[] (read-before-write
126
+ * merge preserving all other parent fields).
127
+ * 6. Invalidates relevant caches.
128
+ *
129
+ * Throws a descriptive Error for common mis-configurations so the caller
130
+ * surface (createTicket / updateTicket) can surface a clear message.
131
+ */
132
+ export async function linkTicketToMilestone(client, childTicketId, milestoneId, parentTicketId) {
133
+ void parentTicketId;
134
+ // Halo's write-side milestone field on a child ticket is `update_milestone_id`
135
+ // (not `milestone_id` — that's read-only on the child). Posting
136
+ // `update_milestone_id` causes Halo to set `milestone_id` on the child AND
137
+ // auto-create the FaultsMileStone link on the parent. Empirically confirmed
138
+ // 2026-05-11 against the live tenant: `milestone_id` write is a no-op;
139
+ // `update_milestone_id` write persists. Value 0 unlinks.
140
+ const writeValue = milestoneId === null ? 0 : milestoneId;
141
+ await client.post('/Tickets', [
142
+ { id: childTicketId, update_milestone_id: writeValue },
143
+ ]);
144
+ client.invalidateCache(`ticket:${childTicketId}*`);
145
+ client.invalidateCache('tickets:*');
146
+ client.invalidateCache('ticket-milestones:*');
147
+ }
148
+ // =============================================================================
149
+ // Implementations
150
+ // =============================================================================
151
+ export async function listTicketMilestones(client, args) {
152
+ const response = await client.getCached(`/Tickets/${args.ticket_id}`, { includedetails: true }, {
153
+ enabled: true,
154
+ ttl: TTL.TICKET_LIST,
155
+ keyPrefix: `ticket-milestones:${args.ticket_id}`,
156
+ });
157
+ const milestones = response.milestones ?? [];
158
+ // Compact-by-default projection that preserves the fields callers actually
159
+ // need from a milestone listing — including the `state` enum (0=upcoming,
160
+ // 2=complete, 1=possible-in-progress) which formatter.ts's generic compact
161
+ // projection would otherwise strip.
162
+ const compactProjection = (m) => ({
163
+ id: m.id,
164
+ name: m.name,
165
+ sequence: m.sequence,
166
+ start_date: m.start_date,
167
+ target_date: m.target_date,
168
+ state: m.state,
169
+ ticket_count: Array.isArray(m.tickets) ? m.tickets.length : 0,
170
+ });
171
+ const formatOpts = args.format_options ?? { format: 'compact' };
172
+ const fmt = formatOpts.format ?? 'compact';
173
+ const projected = (fmt === 'detailed') ? milestones : milestones.map(compactProjection);
174
+ // Pass explicit fields so formatResponse's compact projection doesn't strip
175
+ // our preserved `state` field (Bug 5). If the caller already supplied
176
+ // `fields`, respect that.
177
+ const finalOpts = (formatOpts.fields && formatOpts.fields.length > 0) ? formatOpts : {
178
+ ...formatOpts,
179
+ fields: ['id', 'name', 'sequence', 'start_date', 'target_date', 'state', 'ticket_count'],
180
+ };
181
+ return formatResponse(projected, finalOpts, {
182
+ ticket_id: args.ticket_id,
183
+ milestone_count: milestones.length,
184
+ });
185
+ }
186
+ export async function setTicketMilestones(client, args) {
187
+ const existing = await fetchTicketFresh(client, args.ticket_id);
188
+ const format = args.format_options?.format;
189
+ return writeMilestones(client, args.ticket_id, existing, args.milestones, format);
190
+ }
191
+ export async function addTicketMilestone(client, args) {
192
+ const existing = await fetchTicketFresh(client, args.ticket_id);
193
+ const format = args.format_options?.format;
194
+ const currentMilestones = existing.milestones ?? [];
195
+ const merged = [...currentMilestones, args.milestone];
196
+ return writeMilestones(client, args.ticket_id, existing, merged, format);
197
+ }
198
+ export async function removeTicketMilestone(client, args) {
199
+ const existing = await fetchTicketFresh(client, args.ticket_id);
200
+ const format = args.format_options?.format;
201
+ const currentMilestones = existing.milestones ?? [];
202
+ const filtered = currentMilestones.filter((m) => m.id !== args.milestone_id);
203
+ if (filtered.length === currentMilestones.length) {
204
+ return JSON.stringify({
205
+ removed: false,
206
+ ticket_id: args.ticket_id,
207
+ milestone_id: args.milestone_id,
208
+ message: `Milestone id=${args.milestone_id} not found on ticket ${args.ticket_id}.`,
209
+ }, null, 2);
210
+ }
211
+ return writeMilestones(client, args.ticket_id, existing, filtered, format);
212
+ }
213
+ export async function getCurrentMilestone(client, args) {
214
+ const response = await client.getCached(`/Tickets/${args.parent_ticket_id}`, { includedetails: true }, {
215
+ enabled: true,
216
+ ttl: TTL.TICKET_LIST,
217
+ keyPrefix: `ticket-milestones:${args.parent_ticket_id}`,
218
+ });
219
+ const milestones = response.milestones ?? [];
220
+ const formatOpts = args.format_options ?? { format: 'standard' };
221
+ // Selection logic:
222
+ // 1. First milestone with state === 1 (in-progress), if any.
223
+ // 2. Else: lowest-sequence milestone with state === 0 (upcoming).
224
+ // 3. Else: null (all complete or no milestones).
225
+ const inProgress = milestones.find((m) => m.state === 1) ?? null;
226
+ if (inProgress !== null) {
227
+ return formatResponse(inProgress, formatOpts, {
228
+ parent_ticket_id: args.parent_ticket_id,
229
+ selection: 'in-progress (state=1)',
230
+ });
231
+ }
232
+ const upcoming = milestones
233
+ .filter((m) => m.state === 0 || m.state === undefined)
234
+ .sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0));
235
+ if (upcoming.length > 0) {
236
+ return formatResponse(upcoming[0], formatOpts, {
237
+ parent_ticket_id: args.parent_ticket_id,
238
+ selection: 'lowest-sequence upcoming (state=0)',
239
+ });
240
+ }
241
+ return JSON.stringify({
242
+ current_milestone: null,
243
+ parent_ticket_id: args.parent_ticket_id,
244
+ message: 'No in-progress or upcoming milestones found. All milestones may be complete.',
245
+ milestone_count: milestones.length,
246
+ }, null, 2);
247
+ }
248
+ // =============================================================================
249
+ // Tool Definitions
250
+ // =============================================================================
251
+ export const listTicketMilestonesTool = {
252
+ name: 'list_halopsa_ticket_milestones',
253
+ description: 'Read the milestones[] array from a HaloPSA project ticket. Milestones are nested on the ticket — GET /Ticket/{id}?includedetails=true. Returns [] if none defined. Cached 1 min.',
254
+ schema: ListTicketMilestonesArgsSchema,
255
+ handler: listTicketMilestones,
256
+ };
257
+ export const setTicketMilestonesTool = {
258
+ name: 'set_halopsa_ticket_milestones',
259
+ description: 'Replace ALL milestones on a HaloPSA project ticket with the provided array. Uses read-before-write merge via POST /Tickets (REPLACE semantics). Returns updated milestones[].',
260
+ schema: SetTicketMilestonesArgsSchema,
261
+ handler: setTicketMilestones,
262
+ };
263
+ export const addTicketMilestoneTool = {
264
+ name: 'add_halopsa_ticket_milestone',
265
+ description: 'Append a single milestone to a HaloPSA project ticket. Reads existing milestones, appends the new one, then writes the full array via POST /Tickets. Returns updated milestones[].',
266
+ schema: AddTicketMilestoneArgsSchema,
267
+ handler: addTicketMilestone,
268
+ };
269
+ export const removeTicketMilestoneTool = {
270
+ name: 'remove_halopsa_ticket_milestone',
271
+ description: 'Remove a single milestone (by ID) from a HaloPSA project ticket. Reads existing milestones, filters out the target, then writes the remaining array via POST /Tickets. Returns updated milestones[] or a not-found message.',
272
+ schema: RemoveTicketMilestoneArgsSchema,
273
+ handler: removeTicketMilestone,
274
+ };
275
+ export const getCurrentMilestoneTool = {
276
+ name: 'get_halopsa_current_milestone',
277
+ description: 'Returns the "current" milestone for a HaloPSA project ticket. Selection: (1) first milestone with state=1 (in-progress); else (2) lowest-sequence milestone with state=0 (upcoming); else null. Useful for dashboards and progress queries. Cached 1 min.',
278
+ schema: GetCurrentMilestoneArgsSchema,
279
+ handler: getCurrentMilestone,
280
+ };
281
+ //# sourceMappingURL=milestones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestones.js","sourceRoot":"","sources":["../../src/tools/milestones.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,15 @@
2
2
  * Central tool registration — imports all ZodToolDefinition exports
3
3
  * and registers them with a ToolRegistry instance.
4
4
  *
5
- * Tool inventory (49 total):
5
+ * Tool inventory (67 total):
6
6
  * Assets (11), Users (7), Sites (4), Clients (3),
7
7
  * Reference data (4), Ticket reference data (5),
8
8
  * Tickets (7), Ticket actions (2), Ticket custom fields (2),
9
- * Batch operations (4 — assets, users, sites, tickets)
9
+ * Batch operations (5 — assets, users, sites, tickets, bulk-update),
10
+ * Ticket links (1 — read-side only),
11
+ * Workflows (6 — list/get/list-steps/create/update/delete),
12
+ * Ticket milestones (5 — list/set/add/remove + get-current),
13
+ * Budgets (5 — list/create/delete BudgetType, get/set per-ticket)
10
14
  */
11
15
  import type { ToolRegistry } from './registry.js';
12
16
  export declare function registerAllTools(registry: ToolRegistry): void;
@@ -1 +1 @@
1
- {"version":3,"file":"registrations.d.ts","sourceRoot":"","sources":["../../src/tools/registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAyJlD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAI7D"}
1
+ {"version":3,"file":"registrations.d.ts","sourceRoot":"","sources":["../../src/tools/registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAiNlD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAI7D"}
@@ -2,11 +2,15 @@
2
2
  * Central tool registration — imports all ZodToolDefinition exports
3
3
  * and registers them with a ToolRegistry instance.
4
4
  *
5
- * Tool inventory (49 total):
5
+ * Tool inventory (67 total):
6
6
  * Assets (11), Users (7), Sites (4), Clients (3),
7
7
  * Reference data (4), Ticket reference data (5),
8
8
  * Tickets (7), Ticket actions (2), Ticket custom fields (2),
9
- * Batch operations (4 — assets, users, sites, tickets)
9
+ * Batch operations (5 — assets, users, sites, tickets, bulk-update),
10
+ * Ticket links (1 — read-side only),
11
+ * Workflows (6 — list/get/list-steps/create/update/delete),
12
+ * Ticket milestones (5 — list/set/add/remove + get-current),
13
+ * Budgets (5 — list/create/delete BudgetType, get/set per-ticket)
10
14
  */
11
15
  // Asset tools (11)
12
16
  import { listAssetsTool, getAssetTool, searchAssetsBySerialTool, searchAssetsByHostnameTool, createAssetTool, updateAssetTool, deleteAssetTool, listAssetCustomFieldsTool, getAssetFieldSchemaTool, findAssetMatchTool, scanAssetDuplicatesTool, } from './assets.js';
@@ -26,8 +30,16 @@ import { listTicketsTool, getTicketTool, searchTicketsTool, createTicketTool, up
26
30
  import { addTicketActionTool, listTicketActionsTool, } from './ticket-actions.js';
27
31
  // Ticket custom field tools (2)
28
32
  import { listTicketCustomFieldsTool, getTicketFieldSchemaTool, } from './ticket-custom-fields.js';
29
- // Batch operations tools (4)
30
- import { getAssetsBatchTool, getUsersBatchTool, getSitesBatchTool, getTicketsBatchTool, } from './batch-operations.js';
33
+ // Batch operations tools (5)
34
+ import { getAssetsBatchTool, getUsersBatchTool, getSitesBatchTool, getTicketsBatchTool, bulkUpdateTicketsTool, } from './batch-operations.js';
35
+ // Ticket links tools (1)
36
+ import { listLinkedTicketsTool, } from './ticket-links.js';
37
+ // Workflow tools (6)
38
+ import { listWorkflowsTool, getWorkflowTool, listWorkflowStepsTool, createWorkflowTool, updateWorkflowTool, deleteWorkflowTool, } from './workflows.js';
39
+ // Ticket milestone tools (5)
40
+ import { listTicketMilestonesTool, setTicketMilestonesTool, addTicketMilestoneTool, removeTicketMilestoneTool, getCurrentMilestoneTool, } from './milestones.js';
41
+ // Budget tools (5)
42
+ import { listBudgetTypesTool, createBudgetTypeTool, deleteBudgetTypeTool, getTicketBudgetTool, setTicketBudgetTool, } from './budgets.js';
31
43
  const allTools = [
32
44
  // Assets (11)
33
45
  listAssetsTool,
@@ -83,11 +95,33 @@ const allTools = [
83
95
  // Ticket custom fields (2)
84
96
  listTicketCustomFieldsTool,
85
97
  getTicketFieldSchemaTool,
86
- // Batch operations (4)
98
+ // Batch operations (5)
87
99
  getAssetsBatchTool,
88
100
  getUsersBatchTool,
89
101
  getSitesBatchTool,
90
102
  getTicketsBatchTool,
103
+ bulkUpdateTicketsTool,
104
+ // Ticket links (1)
105
+ listLinkedTicketsTool,
106
+ // Workflows (6)
107
+ listWorkflowsTool,
108
+ getWorkflowTool,
109
+ listWorkflowStepsTool,
110
+ createWorkflowTool,
111
+ updateWorkflowTool,
112
+ deleteWorkflowTool,
113
+ // Ticket milestones (5)
114
+ listTicketMilestonesTool,
115
+ setTicketMilestonesTool,
116
+ addTicketMilestoneTool,
117
+ removeTicketMilestoneTool,
118
+ getCurrentMilestoneTool,
119
+ // Budgets (5)
120
+ listBudgetTypesTool,
121
+ createBudgetTypeTool,
122
+ deleteBudgetTypeTool,
123
+ getTicketBudgetTool,
124
+ setTicketBudgetTool,
91
125
  ];
92
126
  export function registerAllTools(registry) {
93
127
  for (const tool of allTools) {
@@ -1 +1 @@
1
- {"version":3,"file":"registrations.js","sourceRoot":"","sources":["../../src/tools/registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,YAAY,EACZ,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,2BAA2B;AAC3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,kCAAkC;AAClC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AAEpC,yFAAyF;AACzF,OAAO,EACL,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,0BAA0B;AAC1B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,gCAAgC;AAChC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,6BAA6B;AAC7B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,QAAQ,GAAG;IACf,cAAc;IACd,cAAc;IACd,YAAY;IACZ,wBAAwB;IACxB,0BAA0B;IAC1B,eAAe;IACf,eAAe;IACf,eAAe;IACf,yBAAyB;IACzB,uBAAuB;IACvB,kBAAkB;IAClB,uBAAuB;IACvB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,sBAAsB;IACtB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,qBAAqB;IACrB,kBAAkB;IAClB,qBAAqB;IACrB,oBAAoB;IACpB,cAAc;IACd,4BAA4B;IAC5B,mBAAmB;IACnB,iBAAiB;IACjB,sBAAsB;IACtB,wBAAwB;IACxB,wBAAwB;IACxB,cAAc;IACd,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,qBAAqB;IACrB,mBAAmB;IACnB,qBAAqB;IACrB,2BAA2B;IAC3B,0BAA0B;IAC1B,wBAAwB;IACxB,uBAAuB;IACvB,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,QAAsB;IACrD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"registrations.js","sourceRoot":"","sources":["../../src/tools/registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,YAAY,EACZ,wBAAwB,EACxB,0BAA0B,EAC1B,eAAe,EACf,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,2BAA2B;AAC3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,kCAAkC;AAClC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AAEpC,yFAAyF;AACzF,OAAO,EACL,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,0BAA0B;AAC1B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,gCAAgC;AAChC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,6BAA6B;AAC7B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,yBAAyB;AACzB,OAAO,EACL,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,qBAAqB;AACrB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,6BAA6B;AAC7B,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,MAAM,QAAQ,GAAG;IACf,cAAc;IACd,cAAc;IACd,YAAY;IACZ,wBAAwB;IACxB,0BAA0B;IAC1B,eAAe;IACf,eAAe;IACf,eAAe;IACf,yBAAyB;IACzB,uBAAuB;IACvB,kBAAkB;IAClB,uBAAuB;IACvB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,sBAAsB;IACtB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,qBAAqB;IACrB,kBAAkB;IAClB,qBAAqB;IACrB,oBAAoB;IACpB,cAAc;IACd,4BAA4B;IAC5B,mBAAmB;IACnB,iBAAiB;IACjB,sBAAsB;IACtB,wBAAwB;IACxB,wBAAwB;IACxB,cAAc;IACd,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,qBAAqB;IACrB,mBAAmB;IACnB,qBAAqB;IACrB,2BAA2B;IAC3B,0BAA0B;IAC1B,wBAAwB;IACxB,uBAAuB;IACvB,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,qBAAqB;IACrB,mBAAmB;IACnB,qBAAqB;IACrB,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;IACf,qBAAqB;IACrB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,sBAAsB;IACtB,yBAAyB;IACzB,uBAAuB;IACvB,cAAc;IACd,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;CACpB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,QAAsB;IACrD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * HaloPSA Ticket Links tools (read-side only).
3
+ *
4
+ * The dedicated /IntegrationData/Get/HaloLink endpoint returned HTTP 400 on
5
+ * empirical testing against the live tenant (2026-05-11) with naive params —
6
+ * the correct invocation parameters have not yet been isolated. Deferred to
7
+ * v1.4. This file ships the read-side only via the ticket's nested
8
+ * `linked_tickets` array returned by GET /Tickets/{id}?includedetails=true.
9
+ *
10
+ * TODO(v1.4): probe /IntegrationData/Get/HaloLink with corrected params and
11
+ * implement create_halopsa_ticket_link / delete_halopsa_ticket_link.
12
+ */
13
+ import { z } from 'zod';
14
+ import type { HaloPSAAPIClient } from '../api/client.js';
15
+ import type { ZodToolDefinition } from './registry.js';
16
+ export declare const ListLinkedTicketsArgsSchema: z.ZodObject<{
17
+ ticket_id: z.ZodNumber;
18
+ format_options: z.ZodOptional<z.ZodObject<{
19
+ format: z.ZodOptional<z.ZodEnum<{
20
+ compact: "compact";
21
+ standard: "standard";
22
+ detailed: "detailed";
23
+ }>>;
24
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
25
+ omit_empty: z.ZodOptional<z.ZodBoolean>;
26
+ }, z.core.$strip>>;
27
+ }, z.core.$strip>;
28
+ /**
29
+ * Retrieve linked tickets for a given ticket ID.
30
+ *
31
+ * Fetches GET /Tickets/{id}?includedetails=true and surfaces:
32
+ * - linked_tickets[] (or [] if absent) — compact shape: {linked_ticket_id, link_type?, summary?}
33
+ * - parent_id (canonical "depends on / blocks" link)
34
+ * - child_count
35
+ * - linked_halo_ticket_count
36
+ *
37
+ * Cache key: 'ticket-links:{id}', TTL 1 min (same cadence as TICKET_LIST).
38
+ */
39
+ export declare function listLinkedTickets(client: HaloPSAAPIClient, args: z.infer<typeof ListLinkedTicketsArgsSchema>): Promise<string>;
40
+ export declare const listLinkedTicketsTool: ZodToolDefinition;
41
+ //# sourceMappingURL=ticket-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-links.d.ts","sourceRoot":"","sources":["../../src/tools/ticket-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAiDvD,eAAO,MAAM,2BAA2B;;;;;;;;;;;iBAItC,CAAC;AAMH;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAMD,eAAO,MAAM,qBAAqB,EAAE,iBAUnC,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * HaloPSA Ticket Links tools (read-side only).
3
+ *
4
+ * The dedicated /IntegrationData/Get/HaloLink endpoint returned HTTP 400 on
5
+ * empirical testing against the live tenant (2026-05-11) with naive params —
6
+ * the correct invocation parameters have not yet been isolated. Deferred to
7
+ * v1.4. This file ships the read-side only via the ticket's nested
8
+ * `linked_tickets` array returned by GET /Tickets/{id}?includedetails=true.
9
+ *
10
+ * TODO(v1.4): probe /IntegrationData/Get/HaloLink with corrected params and
11
+ * implement create_halopsa_ticket_link / delete_halopsa_ticket_link.
12
+ */
13
+ import { z } from 'zod';
14
+ import { formatResponse } from '../utils/formatter.js';
15
+ import { TTL } from '../cache/memory-cache.js';
16
+ import { FormatOptionsSchema } from '../schemas/common.js';
17
+ // =============================================================================
18
+ // Schema
19
+ // =============================================================================
20
+ export const ListLinkedTicketsArgsSchema = z.object({
21
+ ticket_id: z.number().int()
22
+ .describe('HaloPSA ticket ID whose linked tickets to retrieve'),
23
+ format_options: FormatOptionsSchema,
24
+ });
25
+ // =============================================================================
26
+ // Implementation
27
+ // =============================================================================
28
+ /**
29
+ * Retrieve linked tickets for a given ticket ID.
30
+ *
31
+ * Fetches GET /Tickets/{id}?includedetails=true and surfaces:
32
+ * - linked_tickets[] (or [] if absent) — compact shape: {linked_ticket_id, link_type?, summary?}
33
+ * - parent_id (canonical "depends on / blocks" link)
34
+ * - child_count
35
+ * - linked_halo_ticket_count
36
+ *
37
+ * Cache key: 'ticket-links:{id}', TTL 1 min (same cadence as TICKET_LIST).
38
+ */
39
+ export async function listLinkedTickets(client, args) {
40
+ const formatOptions = args.format_options || {};
41
+ const ticket = await client.getCached(`/Tickets/${args.ticket_id}`, { includedetails: true }, {
42
+ enabled: true,
43
+ ttl: TTL.TICKET_LIST,
44
+ keyPrefix: `ticket-links:${args.ticket_id}`,
45
+ });
46
+ // Surface the link-context fields from the ticket.
47
+ const rawLinks = ticket.linked_tickets ?? [];
48
+ // Compact shape: strip to {linked_ticket_id, link_type?, summary?} per entry.
49
+ const compactLinks = rawLinks.map((entry) => {
50
+ const slim = {
51
+ linked_ticket_id: entry.linked_ticket_id,
52
+ };
53
+ if (entry.link_type !== undefined)
54
+ slim.link_type = entry.link_type;
55
+ if (entry.summary !== undefined)
56
+ slim.summary = entry.summary;
57
+ return slim;
58
+ });
59
+ const context = {
60
+ ticket_id: args.ticket_id,
61
+ ...(ticket.parent_id !== undefined && { parent_id: ticket.parent_id }),
62
+ ...(ticket.child_count !== undefined && { child_count: ticket.child_count }),
63
+ ...(ticket.linked_halo_ticket_count !== undefined && {
64
+ linked_halo_ticket_count: ticket.linked_halo_ticket_count,
65
+ }),
66
+ linked_tickets: compactLinks,
67
+ };
68
+ const meta = { total_linked: compactLinks.length };
69
+ return formatResponse(context, formatOptions, meta);
70
+ }
71
+ // =============================================================================
72
+ // Tool Definition
73
+ // =============================================================================
74
+ export const listLinkedTicketsTool = {
75
+ name: 'list_halopsa_linked_tickets',
76
+ description: 'Return the linked_tickets[] array for a HaloPSA ticket (read-side only). ' +
77
+ 'Fetches GET /Tickets/{id}?includedetails=true and surfaces linked_tickets[], ' +
78
+ 'parent_id, child_count, and linked_halo_ticket_count. ' +
79
+ 'Compact response shape per entry: {linked_ticket_id, link_type?, summary?}. ' +
80
+ 'Cache key ticket-links:{id}, TTL 1 min.',
81
+ schema: ListLinkedTicketsArgsSchema,
82
+ handler: listLinkedTickets,
83
+ };
84
+ //# sourceMappingURL=ticket-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-links.js","sourceRoot":"","sources":["../../src/tools/ticket-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAsB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AA0C3D,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;SACxB,QAAQ,CAAC,oDAAoD,CAAC;IACjE,cAAc,EAAE,mBAAmB;CACpC,CAAC,CAAC;AAEH,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAwB,EACxB,IAAiD;IAEjD,MAAM,aAAa,GAAkB,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;IAE/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CACnC,YAAY,IAAI,CAAC,SAAS,EAAE,EAC5B,EAAE,cAAc,EAAE,IAAI,EAAE,EACxB;QACE,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,GAAG,CAAC,WAAW;QACpB,SAAS,EAAE,gBAAgB,IAAI,CAAC,SAAS,EAAE;KAC5C,CACF,CAAC;IAEF,mDAAmD;IACnD,MAAM,QAAQ,GAA0B,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;IAEpE,8EAA8E;IAC9E,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,IAAI,GAA4B;YACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;SACzC,CAAC;QACF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACpE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAyB;QACpC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QACtE,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5E,GAAG,CAAC,MAAM,CAAC,wBAAwB,KAAK,SAAS,IAAI;YACnD,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;SAC1D,CAAC;QACF,cAAc,EAAE,YAAY;KAC7B,CAAC;IAEF,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;IAEnD,OAAO,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACT,2EAA2E;QAC3E,+EAA+E;QAC/E,wDAAwD;QACxD,8EAA8E;QAC9E,yCAAyC;IAC3C,MAAM,EAAE,2BAA2B;IACnC,OAAO,EAAE,iBAAiB;CAC3B,CAAC"}
@@ -97,6 +97,7 @@ export declare const CreateTicketArgsSchema: z.ZodObject<{
97
97
  }, z.core.$strip>>>;
98
98
  estimate: z.ZodOptional<z.ZodNumber>;
99
99
  estimatedays: z.ZodOptional<z.ZodNumber>;
100
+ milestone_id: z.ZodOptional<z.ZodNumber>;
100
101
  format_options: z.ZodOptional<z.ZodObject<{
101
102
  format: z.ZodOptional<z.ZodEnum<{
102
103
  compact: "compact";
@@ -130,6 +131,7 @@ export declare const UpdateTicketArgsSchema: z.ZodObject<{
130
131
  }, z.core.$strip>>>;
131
132
  estimate: z.ZodOptional<z.ZodNumber>;
132
133
  estimatedays: z.ZodOptional<z.ZodNumber>;
134
+ milestone_id: z.ZodOptional<z.ZodNumber>;
133
135
  format_options: z.ZodOptional<z.ZodObject<{
134
136
  format: z.ZodOptional<z.ZodEnum<{
135
137
  compact: "compact";
@@ -1 +1 @@
1
- {"version":3,"file":"tickets.d.ts","sourceRoot":"","sources":["../../src/tools/tickets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA+BvD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwChC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAI9B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;iBAUlC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCjC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4BjC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;iBAKhC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;iBAQjC,CAAC;AAoGH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,GAC1C,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,CA8CjB;AAgBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,CA0HjB;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,GAC1C,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAMD,eAAO,MAAM,eAAe,EAAE,iBAK7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,iBAK3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,iBAK/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,iBAK9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,iBAK9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,iBAK7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,iBAK9B,CAAC"}
1
+ {"version":3,"file":"tickets.d.ts","sourceRoot":"","sources":["../../src/tools/tickets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAgCvD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwChC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAI9B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;iBAUlC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwCjC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8BjC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;iBAKhC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;iBAQjC,CAAC;AAoGH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,GAC1C,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,CAqGjB;AAgBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,CA8HjB;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,GAC1C,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAMD,eAAO,MAAM,eAAe,EAAE,iBAK7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,iBAK3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,iBAK/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,iBAK9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,iBAK9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,iBAK7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,iBAK9B,CAAC"}