@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.
- package/README.md +43 -2
- package/dist/cache/memory-cache.d.ts +3 -0
- package/dist/cache/memory-cache.d.ts.map +1 -1
- package/dist/cache/memory-cache.js +4 -0
- package/dist/cache/memory-cache.js.map +1 -1
- package/dist/tools/batch-operations.d.ts +47 -0
- package/dist/tools/batch-operations.d.ts.map +1 -1
- package/dist/tools/batch-operations.js +211 -68
- package/dist/tools/batch-operations.js.map +1 -1
- package/dist/tools/budgets.d.ts +130 -0
- package/dist/tools/budgets.d.ts.map +1 -0
- package/dist/tools/budgets.js +277 -0
- package/dist/tools/budgets.js.map +1 -0
- package/dist/tools/milestones.d.ts +129 -0
- package/dist/tools/milestones.d.ts.map +1 -0
- package/dist/tools/milestones.js +281 -0
- package/dist/tools/milestones.js.map +1 -0
- package/dist/tools/registrations.d.ts +6 -2
- package/dist/tools/registrations.d.ts.map +1 -1
- package/dist/tools/registrations.js +39 -5
- package/dist/tools/registrations.js.map +1 -1
- package/dist/tools/ticket-links.d.ts +41 -0
- package/dist/tools/ticket-links.d.ts.map +1 -0
- package/dist/tools/ticket-links.js +84 -0
- package/dist/tools/ticket-links.js.map +1 -0
- package/dist/tools/tickets.d.ts +2 -0
- package/dist/tools/tickets.d.ts.map +1 -1
- package/dist/tools/tickets.js +59 -2
- package/dist/tools/tickets.js.map +1 -1
- package/dist/tools/workflows.d.ts +125 -0
- package/dist/tools/workflows.d.ts.map +1 -0
- package/dist/tools/workflows.js +355 -0
- package/dist/tools/workflows.js.map +1 -0
- package/dist/types/budgets.d.ts +45 -0
- package/dist/types/budgets.d.ts.map +1 -0
- package/dist/types/budgets.js +12 -0
- package/dist/types/budgets.js.map +1 -0
- package/dist/types/milestones.d.ts +65 -0
- package/dist/types/milestones.d.ts.map +1 -0
- package/dist/types/milestones.js +14 -0
- package/dist/types/milestones.js.map +1 -0
- package/dist/types/tickets.d.ts +4 -0
- package/dist/types/tickets.d.ts.map +1 -1
- package/dist/types/workflows.d.ts +77 -0
- package/dist/types/workflows.d.ts.map +1 -0
- package/dist/types/workflows.js +11 -0
- package/dist/types/workflows.js.map +1 -0
- package/dist/utils/concurrency.d.ts +42 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +82 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/formatter.d.ts +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +30 -3
- package/dist/utils/formatter.js.map +1 -1
- 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 (
|
|
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 (
|
|
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
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
1
|
+
{"version":3,"file":"registrations.js","sourceRoot":"","sources":["../../src/tools/registrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/tools/tickets.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|