@teamnetwork-nz/ninjaone-mcp-server 0.1.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 (54) hide show
  1. package/README.md +208 -0
  2. package/dist/client.d.ts +48 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +252 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/config.d.ts +10 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +58 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/datetime.d.ts +4 -0
  11. package/dist/datetime.d.ts.map +1 -0
  12. package/dist/datetime.js +64 -0
  13. package/dist/datetime.js.map +1 -0
  14. package/dist/format.d.ts +7 -0
  15. package/dist/format.d.ts.map +1 -0
  16. package/dist/format.js +68 -0
  17. package/dist/format.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +86 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/teamlink.d.ts +2 -0
  23. package/dist/teamlink.d.ts.map +1 -0
  24. package/dist/teamlink.js +22 -0
  25. package/dist/teamlink.js.map +1 -0
  26. package/dist/tools/alerts.d.ts +3 -0
  27. package/dist/tools/alerts.d.ts.map +1 -0
  28. package/dist/tools/alerts.js +78 -0
  29. package/dist/tools/alerts.js.map +1 -0
  30. package/dist/tools/auth.d.ts +3 -0
  31. package/dist/tools/auth.d.ts.map +1 -0
  32. package/dist/tools/auth.js +24 -0
  33. package/dist/tools/auth.js.map +1 -0
  34. package/dist/tools/devices.d.ts +3 -0
  35. package/dist/tools/devices.d.ts.map +1 -0
  36. package/dist/tools/devices.js +236 -0
  37. package/dist/tools/devices.js.map +1 -0
  38. package/dist/tools/index.d.ts +3 -0
  39. package/dist/tools/index.d.ts.map +1 -0
  40. package/dist/tools/index.js +13 -0
  41. package/dist/tools/index.js.map +1 -0
  42. package/dist/tools/organizations.d.ts +3 -0
  43. package/dist/tools/organizations.d.ts.map +1 -0
  44. package/dist/tools/organizations.js +101 -0
  45. package/dist/tools/organizations.js.map +1 -0
  46. package/dist/tools/queries.d.ts +3 -0
  47. package/dist/tools/queries.d.ts.map +1 -0
  48. package/dist/tools/queries.js +137 -0
  49. package/dist/tools/queries.js.map +1 -0
  50. package/dist/types.d.ts +243 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +3 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +40 -0
@@ -0,0 +1,236 @@
1
+ import { z } from 'zod';
2
+ import { table, objectBlock, humanBytes, percentUsed, formatClock, joinList } from '../format.js';
3
+ import { fromUtc } from '../datetime.js';
4
+ const deviceFilterArgs = {
5
+ organizationId: z.number().int().optional().describe('Filter to devices in this organization'),
6
+ locationId: z.number().int().optional().describe('Filter to devices at this location'),
7
+ deviceClass: z
8
+ .string()
9
+ .optional()
10
+ .describe('Filter by node class, e.g. WINDOWS_WORKSTATION, WINDOWS_SERVER, MAC, LINUX_SERVER'),
11
+ online: z.boolean().optional().describe('true = online only, false = offline only'),
12
+ deviceFilter: z.string().optional().describe('Raw NinjaOne device-filter (df) expression, appended to the above'),
13
+ };
14
+ const pagingArgs = {
15
+ pageSize: z.number().int().min(1).max(1000).optional().describe('Max records to return (1–1000)'),
16
+ after: z.number().int().min(0).optional().describe('Cursor: last device id from the previous page'),
17
+ };
18
+ const deviceIdArg = {
19
+ deviceId: z.number().int().describe('Device id (from ninja_list_devices)'),
20
+ };
21
+ export const deviceTools = [
22
+ {
23
+ name: 'ninja_list_devices',
24
+ description: 'List managed devices (machines). Filter by organization, location, device class, online/offline, or a raw device-filter. Returns id, name, org, OS, class, status and last contact.',
25
+ inputSchema: z.object({ ...deviceFilterArgs, detailed: z.boolean().optional().describe('Include full detail (organizations-detailed style payload)'), ...pagingArgs }).strict(),
26
+ handler: async (client, args) => {
27
+ const df = client.buildDeviceFilter({
28
+ organizationId: args.organizationId,
29
+ locationId: args.locationId,
30
+ deviceClass: args.deviceClass,
31
+ online: args.online,
32
+ raw: args.deviceFilter,
33
+ });
34
+ const params = {
35
+ ...client.buildPaging({ pageSize: args.pageSize, after: args.after }),
36
+ };
37
+ if (df)
38
+ params['df'] = df;
39
+ const path = args.detailed ? '/v2/devices-detailed' : '/v2/devices';
40
+ const devices = await client.get(path, params);
41
+ if (!devices?.length)
42
+ return 'No devices found.';
43
+ const rows = await Promise.all(devices.map(async (d) => [
44
+ String(d.id ?? ''),
45
+ d.displayName ?? d.systemName ?? d.dnsName ?? '',
46
+ await client.resolveOrgName(d.organizationId),
47
+ await client.resolveTeamlinkId(d.organizationId),
48
+ d.os?.name ?? d.nodeClass ?? '',
49
+ d.nodeClass ?? '',
50
+ d.offline ? '🔴 Offline' : '🟢 Online',
51
+ fromUtc(d.lastContact),
52
+ ]));
53
+ const out = table('Devices', ['ID', 'Name', 'Org', 'TEAMlinkID', 'OS', 'Class', 'Status', 'Last Contact'], rows);
54
+ const last = devices[devices.length - 1]?.id;
55
+ return devices.length >= (args.pageSize ?? client.getDefaultPageSize())
56
+ ? `${out}\n\n_More may be available — page again with after=${last}._`
57
+ : out;
58
+ },
59
+ },
60
+ {
61
+ name: 'ninja_get_device',
62
+ description: 'Get the full record for one device: identity, org/location, OS, system, last contact & boot, IPs.',
63
+ inputSchema: z.object(deviceIdArg).strict(),
64
+ handler: async (client, args) => {
65
+ const d = await client.get(`/v2/device/${args.deviceId}`);
66
+ const summary = {
67
+ id: d.id,
68
+ displayName: d.displayName ?? d.systemName,
69
+ organization: await client.resolveOrgName(d.organizationId),
70
+ TEAMlinkID: (await client.resolveTeamlinkId(d.organizationId)) || '(none)',
71
+ location: await client.resolveLocationName(d.locationId),
72
+ nodeClass: d.nodeClass,
73
+ approvalStatus: d.approvalStatus,
74
+ status: d.offline ? 'Offline' : 'Online',
75
+ dnsName: d.dnsName,
76
+ netbiosName: d.netbiosName,
77
+ lastLoggedInUser: d.lastLoggedInUser,
78
+ publicIP: d.publicIP,
79
+ ipAddresses: d.ipAddresses,
80
+ macAddresses: d.macAddresses,
81
+ lastContact: fromUtc(d.lastContact),
82
+ lastUpdate: fromUtc(d.lastUpdate),
83
+ created: fromUtc(d.created),
84
+ 'os.name': d.os?.name,
85
+ 'os.architecture': d.os?.architecture,
86
+ 'os.buildNumber': d.os?.buildNumber,
87
+ 'os.needsReboot': d.os?.needsReboot,
88
+ 'os.lastBootTime': fromUtc(d.os?.lastBootTime),
89
+ 'system.manufacturer': d.system?.manufacturer,
90
+ 'system.model': d.system?.model,
91
+ 'system.serialNumber': d.system?.serialNumber,
92
+ 'system.totalPhysicalMemory': humanBytes(d.system?.totalPhysicalMemory),
93
+ 'system.numberOfProcessors': d.system?.numberOfProcessors,
94
+ 'system.virtualMachine': d.system?.virtualMachine,
95
+ };
96
+ return objectBlock(`Device ${d.id} — ${d.displayName ?? d.systemName ?? ''}`, summary);
97
+ },
98
+ },
99
+ {
100
+ name: 'ninja_get_device_disks',
101
+ description: 'Physical disks for a device — model, size, media/interface type and status.',
102
+ inputSchema: z.object(deviceIdArg).strict(),
103
+ handler: async (client, args) => {
104
+ const disks = await client.get(`/v2/device/${args.deviceId}/disks`);
105
+ const rows = (disks ?? []).map((d) => [
106
+ d.name ?? '',
107
+ d.model ?? '',
108
+ humanBytes(d.size),
109
+ d.mediaType ?? '',
110
+ d.interfaceType ?? '',
111
+ d.status ?? '',
112
+ ]);
113
+ return table(`Disks — device ${args.deviceId}`, ['Name', 'Model', 'Size', 'Media', 'Interface', 'Status'], rows);
114
+ },
115
+ },
116
+ {
117
+ name: 'ninja_get_device_volumes',
118
+ description: 'Logical volumes for a device — capacity, free space, % used and filesystem.',
119
+ inputSchema: z.object(deviceIdArg).strict(),
120
+ handler: async (client, args) => {
121
+ const volumes = await client.get(`/v2/device/${args.deviceId}/volumes`);
122
+ const rows = (volumes ?? []).map((v) => [
123
+ v.name ?? '',
124
+ v.label ?? '',
125
+ v.fileSystem ?? '',
126
+ humanBytes(v.capacity),
127
+ humanBytes(v.freeSpace),
128
+ percentUsed(v.freeSpace, v.capacity),
129
+ ]);
130
+ return table(`Volumes — device ${args.deviceId}`, ['Name', 'Label', 'FS', 'Capacity', 'Free', '% Used'], rows);
131
+ },
132
+ },
133
+ {
134
+ name: 'ninja_get_device_processors',
135
+ description: 'Processors for a device — model, cores, logical cores and clock speed.',
136
+ inputSchema: z.object(deviceIdArg).strict(),
137
+ handler: async (client, args) => {
138
+ const procs = await client.get(`/v2/device/${args.deviceId}/processors`);
139
+ const rows = (procs ?? []).map((p) => [
140
+ p.name ?? '',
141
+ p.architecture ?? '',
142
+ String(p.numCores ?? ''),
143
+ String(p.numLogicalCores ?? ''),
144
+ formatClock(p.maxClockSpeed),
145
+ ]);
146
+ return table(`Processors — device ${args.deviceId}`, ['Name', 'Arch', 'Cores', 'Logical', 'Max Clock'], rows);
147
+ },
148
+ },
149
+ {
150
+ name: 'ninja_get_device_network',
151
+ description: 'Network interfaces for a device — status, MAC, IPs, gateways and DNS servers.',
152
+ inputSchema: z.object(deviceIdArg).strict(),
153
+ handler: async (client, args) => {
154
+ const nics = await client.get(`/v2/device/${args.deviceId}/network-interfaces`);
155
+ const rows = (nics ?? []).map((n) => [
156
+ n.interfaceName ?? '',
157
+ n.status ?? '',
158
+ joinList(n.macAddress),
159
+ joinList(n.ipAddress),
160
+ n.defaultGateway ?? '',
161
+ joinList(n.dnsServers),
162
+ ]);
163
+ return table(`Network Interfaces — device ${args.deviceId}`, ['Name', 'Status', 'MAC', 'IPs', 'Gateways', 'DNS'], rows);
164
+ },
165
+ },
166
+ {
167
+ name: 'ninja_get_device_software',
168
+ description: 'Installed software inventory for a device.',
169
+ inputSchema: z.object(deviceIdArg).strict(),
170
+ handler: async (client, args) => {
171
+ const sw = await client.get(`/v2/device/${args.deviceId}/software`);
172
+ const rows = (sw ?? []).map((s) => [s.name ?? '', s.publisher ?? '', s.version ?? '', s.installDate ?? '']);
173
+ return table(`Installed Software — device ${args.deviceId}`, ['Name', 'Publisher', 'Version', 'Installed'], rows);
174
+ },
175
+ },
176
+ {
177
+ name: 'ninja_get_device_os_patches',
178
+ description: 'OS patches known/pending for a device, with status, severity and category.',
179
+ inputSchema: z.object(deviceIdArg).strict(),
180
+ handler: async (client, args) => {
181
+ const patches = await client.get(`/v2/device/${args.deviceId}/os-patches`);
182
+ const rows = (patches ?? []).map((p) => [
183
+ p.kbNumber ?? '',
184
+ p.name ?? '',
185
+ p.status ?? '',
186
+ p.severity ?? '',
187
+ p.category ?? '',
188
+ ]);
189
+ return table(`OS Patches — device ${args.deviceId}`, ['KB', 'Name', 'Status', 'Severity', 'Category'], rows);
190
+ },
191
+ },
192
+ {
193
+ name: 'ninja_get_device_last_user',
194
+ description: 'Last logged-on user(s) for a device.',
195
+ inputSchema: z.object(deviceIdArg).strict(),
196
+ handler: async (client, args) => {
197
+ const users = await client.get(`/v2/device/${args.deviceId}/last-logged-on-user`);
198
+ const list = Array.isArray(users) ? users : [users];
199
+ const rows = list.filter(Boolean).map((u) => [u.userName ?? '']);
200
+ return table(`Last Logged-on User — device ${args.deviceId}`, ['User'], rows);
201
+ },
202
+ },
203
+ {
204
+ name: 'ninja_get_device_activities',
205
+ description: 'Recent activity-log entries for a device.',
206
+ inputSchema: z
207
+ .object({ ...deviceIdArg, pageSize: z.number().int().min(1).max(1000).optional().describe('Max entries') })
208
+ .strict(),
209
+ handler: async (client, args) => {
210
+ const params = {};
211
+ if (args.pageSize)
212
+ params['pageSize'] = args.pageSize;
213
+ const resp = await client.get(`/v2/device/${args.deviceId}/activities`, params);
214
+ const activities = Array.isArray(resp) ? resp : resp.activities ?? [];
215
+ const rows = activities.map((a) => [
216
+ fromUtc(a.activityTime),
217
+ a.activityType ?? a.type ?? '',
218
+ a.status ?? a.statusCode ?? '',
219
+ a.message ?? '',
220
+ ]);
221
+ return table(`Activities — device ${args.deviceId}`, ['Time', 'Type', 'Status', 'Message'], rows);
222
+ },
223
+ },
224
+ {
225
+ name: 'ninja_get_device_custom_fields',
226
+ description: 'Custom field values set on a device.',
227
+ inputSchema: z.object(deviceIdArg).strict(),
228
+ handler: async (client, args) => {
229
+ const fields = await client.get(`/v2/device/${args.deviceId}/custom-fields`);
230
+ if (!fields || Object.keys(fields).length === 0)
231
+ return 'No custom fields set on this device.';
232
+ return objectBlock(`Custom Fields — device ${args.deviceId}`, fields);
233
+ },
234
+ },
235
+ ];
236
+ //# sourceMappingURL=devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/tools/devices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from '../types.js';
2
+ export declare const allTools: ToolDefinition[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,QAAQ,EAAE,cAAc,EAMpC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { authTools } from './auth.js';
2
+ import { organizationTools } from './organizations.js';
3
+ import { deviceTools } from './devices.js';
4
+ import { queryTools } from './queries.js';
5
+ import { alertTools } from './alerts.js';
6
+ export const allTools = [
7
+ ...authTools,
8
+ ...organizationTools,
9
+ ...deviceTools,
10
+ ...queryTools,
11
+ ...alertTools,
12
+ ];
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,GAAG,SAAS;IACZ,GAAG,iBAAiB;IACpB,GAAG,WAAW;IACd,GAAG,UAAU;IACb,GAAG,UAAU;CACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from '../types.js';
2
+ export declare const organizationTools: ToolDefinition[];
3
+ //# sourceMappingURL=organizations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations.d.ts","sourceRoot":"","sources":["../../src/tools/organizations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA0B,MAAM,aAAa,CAAC;AASrE,eAAO,MAAM,iBAAiB,EAAE,cAAc,EA8F7C,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { z } from 'zod';
2
+ import { table, objectBlock } from '../format.js';
3
+ import { extractTeamlinkId } from '../teamlink.js';
4
+ const pagingArgs = {
5
+ pageSize: z.number().int().min(1).max(1000).optional().describe('Max records to return (1–1000)'),
6
+ after: z.number().int().min(0).optional().describe('Cursor: last organization id from the previous page'),
7
+ };
8
+ export const organizationTools = [
9
+ {
10
+ name: 'ninja_list_organizations',
11
+ description: 'List client organizations. Optionally filter by a case-insensitive name substring (applied client-side). Supports pagination.',
12
+ inputSchema: z
13
+ .object({
14
+ nameContains: z.string().optional().describe('Case-insensitive substring match on organization name'),
15
+ detailed: z.boolean().optional().describe('Include locations & policy mappings (uses organizations-detailed)'),
16
+ ...pagingArgs,
17
+ })
18
+ .strict(),
19
+ handler: async (client, args) => {
20
+ const path = args.detailed ? '/v2/organizations-detailed' : '/v2/organizations';
21
+ const params = client.buildPaging({ pageSize: args.pageSize, after: args.after });
22
+ let orgs = await client.get(path, params);
23
+ if (!orgs?.length)
24
+ return 'No organizations found.';
25
+ if (args.nameContains) {
26
+ const needle = args.nameContains.toLowerCase();
27
+ orgs = orgs.filter((o) => (o.name ?? '').toLowerCase().includes(needle));
28
+ }
29
+ const rows = orgs.map((o) => [
30
+ String(o.id ?? ''),
31
+ extractTeamlinkId(o.name) ?? '',
32
+ o.name ?? '',
33
+ o.nodeApprovalMode ?? '',
34
+ String(o.locations?.length ?? ''),
35
+ (o.tags ?? []).join(', '),
36
+ ]);
37
+ const out = table('Organizations', ['ID', 'TEAMlinkID', 'Name', 'Approval Mode', 'Locations', 'Tags'], rows);
38
+ const last = orgs[orgs.length - 1]?.id;
39
+ return orgs.length >= (args.pageSize ?? client.getDefaultPageSize())
40
+ ? `${out}\n\n_More may be available — page again with after=${last}._`
41
+ : out;
42
+ },
43
+ },
44
+ {
45
+ name: 'ninja_get_organization',
46
+ description: 'Get full detail for one organization by id, including its locations.',
47
+ inputSchema: z
48
+ .object({ organizationId: z.number().int().describe('Organization id (from ninja_list_organizations)') })
49
+ .strict(),
50
+ handler: async (client, args) => {
51
+ const org = await client.get(`/v2/organization/${args.organizationId}`);
52
+ let locations = org.locations ?? [];
53
+ if (!locations.length) {
54
+ try {
55
+ locations = await client.get(`/v2/organization/${args.organizationId}/locations`);
56
+ }
57
+ catch {
58
+ // locations are best-effort
59
+ }
60
+ }
61
+ // Render the core fields; locations are tabled separately below, and the raw
62
+ // role→policy map is summarised to a count rather than dumped as JSON.
63
+ const { locations: _loc, policies, ...core } = org;
64
+ const summary = { TEAMlinkID: extractTeamlinkId(org.name) ?? '(none)', ...core };
65
+ if (Array.isArray(policies))
66
+ summary['policyMappings'] = `${policies.length} role/policy mappings`;
67
+ const block = objectBlock(org.name ?? `Organization ${args.organizationId}`, summary);
68
+ if (!locations?.length)
69
+ return block;
70
+ const rows = locations.map((l) => [String(l.id ?? ''), l.name ?? '', l.address ?? '']);
71
+ return `${block}\n\n${table('Locations', ['ID', 'Name', 'Address'], rows)}`;
72
+ },
73
+ },
74
+ {
75
+ name: 'ninja_list_locations',
76
+ description: 'List locations. Scope to one organization with organizationId, or omit to list all locations across the tenant.',
77
+ inputSchema: z
78
+ .object({
79
+ organizationId: z.number().int().optional().describe('Restrict to one organization'),
80
+ ...pagingArgs,
81
+ })
82
+ .strict(),
83
+ handler: async (client, args) => {
84
+ const path = args.organizationId !== undefined
85
+ ? `/v2/organization/${args.organizationId}/locations`
86
+ : '/v2/locations';
87
+ const params = client.buildPaging({ pageSize: args.pageSize, after: args.after });
88
+ const locations = await client.get(path, params);
89
+ if (!locations?.length)
90
+ return 'No locations found.';
91
+ const rows = await Promise.all(locations.map(async (l) => [
92
+ String(l.id ?? ''),
93
+ await client.resolveOrgName(l.organizationId ?? args.organizationId),
94
+ l.name ?? '',
95
+ l.address ?? '',
96
+ ]));
97
+ return table('Locations', ['ID', 'Organization', 'Name', 'Address'], rows);
98
+ },
99
+ },
100
+ ];
101
+ //# sourceMappingURL=organizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations.js","sourceRoot":"","sources":["../../src/tools/organizations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,UAAU,GAAG;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACjG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;CAC1G,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAqB;IACjD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,+HAA+H;QACjI,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YACrG,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;YAC9G,GAAG,UAAU;SACd,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClF,IAAI,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiB,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI,EAAE,MAAM;gBAAE,OAAO,yBAAyB,CAAC;YACpD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAClB,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;gBAC/B,CAAC,CAAC,IAAI,IAAI,EAAE;gBACZ,CAAC,CAAC,gBAAgB,IAAI,EAAE;gBACxB,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC;gBACjC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC1B,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7G,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAClE,CAAC,CAAC,GAAG,GAAG,sDAAsD,IAAI,IAAI;gBACtE,CAAC,CAAC,GAAG,CAAC;QACV,CAAC;KACF;IAED;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,sEAAsE;QACnF,WAAW,EAAE,CAAC;aACX,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC,EAAE,CAAC;aACxG,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAe,oBAAoB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YACtF,IAAI,SAAS,GAAe,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAa,oBAAoB,IAAI,CAAC,cAAc,YAAY,CAAC,CAAC;gBAChG,CAAC;gBAAC,MAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;YACH,CAAC;YACD,6EAA6E;YAC7E,uEAAuE;YACvE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,GAA8B,CAAC;YAC9E,MAAM,OAAO,GAA4B,EAAE,UAAU,EAAE,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;YAC1G,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,uBAAuB,CAAC;YACnG,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,gBAAgB,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;YACtF,IAAI,CAAC,SAAS,EAAE,MAAM;gBAAE,OAAO,KAAK,CAAC;YACrC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YACvF,OAAO,GAAG,KAAK,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QAC9E,CAAC;KACF;IAED;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,iHAAiH;QACnH,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YACpF,GAAG,UAAU;SACd,CAAC;aACD,MAAM,EAAE;QACX,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GACR,IAAI,CAAC,cAAc,KAAK,SAAS;gBAC/B,CAAC,CAAC,oBAAoB,IAAI,CAAC,cAAc,YAAY;gBACrD,CAAC,CAAC,eAAe,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAa,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,SAAS,EAAE,MAAM;gBAAE,OAAO,qBAAqB,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC;gBACpE,CAAC,CAAC,IAAI,IAAI,EAAE;gBACZ,CAAC,CAAC,OAAO,IAAI,EAAE;aAChB,CAAC,CACH,CAAC;YACF,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7E,CAAC;KACF;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from '../types.js';
2
+ export declare const queryTools: ToolDefinition[];
3
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/tools/queries.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EAQf,MAAM,aAAa,CAAC;AAuCrB,eAAO,MAAM,UAAU,EAAE,cAAc,EAiHtC,CAAC"}
@@ -0,0 +1,137 @@
1
+ import { z } from 'zod';
2
+ import { table, humanBytes, percentUsed } from '../format.js';
3
+ import { fromUtc } from '../datetime.js';
4
+ // Common args for the /v2/queries/* family (aggregate stats across the fleet).
5
+ const queryArgs = {
6
+ organizationId: z.number().int().optional().describe('Restrict to one organization (df: org = <id>)'),
7
+ deviceFilter: z.string().optional().describe('Raw NinjaOne device-filter (df) expression'),
8
+ pageSize: z.number().int().min(1).max(1000).optional().describe('Max rows to return (1–1000)'),
9
+ cursor: z.string().optional().describe('Cursor name from a previous query response, to fetch the next page'),
10
+ };
11
+ function queryParams(client, args) {
12
+ const params = {
13
+ pageSize: Math.min(args.pageSize ?? client.getDefaultPageSize(), 1000),
14
+ };
15
+ const df = client.buildDeviceFilter({ organizationId: args.organizationId, raw: args.deviceFilter });
16
+ if (df)
17
+ params['df'] = df;
18
+ if (args.cursor)
19
+ params['cursor'] = args.cursor;
20
+ return params;
21
+ }
22
+ // Append a "next cursor" hint when more rows remain. NinjaOne's cursor.count is the
23
+ // TOTAL matched; offset is where this page started — so more remain when
24
+ // offset + returned < count.
25
+ function withCursor(out, resp) {
26
+ const name = resp.cursor?.name;
27
+ const count = resp.cursor?.count ?? 0;
28
+ const offset = resp.cursor?.offset ?? 0;
29
+ const returned = resp.results?.length ?? 0;
30
+ if (name && offset + returned < count) {
31
+ return `${out}\n\n_${count} total; showing ${offset + 1}–${offset + returned}. Page on with cursor="${name}"._`;
32
+ }
33
+ return out;
34
+ }
35
+ export const queryTools = [
36
+ {
37
+ name: 'ninja_query_device_health',
38
+ description: 'Device health status across the fleet (HEALTHY / NEEDS_ATTENTION / UNHEALTHY / UNKNOWN), with alert, pending-patch, threat and vulnerability counts. Filterable by org or raw device-filter.',
39
+ inputSchema: z.object(queryArgs).strict(),
40
+ handler: async (client, args) => {
41
+ const resp = await client.get('/v2/queries/device-health', queryParams(client, args));
42
+ const rows = await Promise.all((resp.results ?? []).map(async (r) => [
43
+ await client.resolveDeviceLabel(r.deviceId),
44
+ r.healthStatus ?? '',
45
+ r.offline ? '🔴' : '🟢',
46
+ String(r.alertCount ?? 0),
47
+ String(r.pendingOSPatchesCount ?? 0),
48
+ String(r.activeThreatsCount ?? 0),
49
+ String(r.criticalVulnerabilityCount ?? 0),
50
+ ]));
51
+ return withCursor(table('Device Health', ['Device', 'Health', 'Status', 'Alerts', 'Pending Patches', 'Threats', 'Crit Vulns'], rows), resp);
52
+ },
53
+ },
54
+ {
55
+ name: 'ninja_query_operating_systems',
56
+ description: 'Operating-system distribution per device — name, architecture, build, needs-reboot and last boot time.',
57
+ inputSchema: z.object(queryArgs).strict(),
58
+ handler: async (client, args) => {
59
+ const resp = await client.get('/v2/queries/operating-systems', queryParams(client, args));
60
+ const rows = (resp.results ?? []).map((r) => [
61
+ String(r.deviceId ?? ''),
62
+ r.name ?? '',
63
+ r.architecture ?? '',
64
+ r.buildNumber ?? '',
65
+ r.needsReboot ? 'yes' : '',
66
+ fromUtc(r.lastBootTime),
67
+ ]);
68
+ return withCursor(table('Operating Systems', ['Device ID', 'OS', 'Arch', 'Build', 'Needs Reboot', 'Last Boot'], rows), resp);
69
+ },
70
+ },
71
+ {
72
+ name: 'ninja_query_computer_systems',
73
+ description: 'Computer-system inventory per device — make, model, serial, RAM and processor count.',
74
+ inputSchema: z.object(queryArgs).strict(),
75
+ handler: async (client, args) => {
76
+ const resp = await client.get('/v2/queries/computer-systems', queryParams(client, args));
77
+ const rows = (resp.results ?? []).map((r) => [
78
+ String(r.deviceId ?? ''),
79
+ r.manufacturer ?? '',
80
+ r.model ?? '',
81
+ r.serialNumber ?? '',
82
+ humanBytes(r.totalPhysicalMemory),
83
+ r.virtualMachine ? 'VM' : '',
84
+ ]);
85
+ return withCursor(table('Computer Systems', ['Device ID', 'Manufacturer', 'Model', 'Serial', 'RAM', 'Type'], rows), resp);
86
+ },
87
+ },
88
+ {
89
+ name: 'ninja_query_volumes',
90
+ description: 'Disk-usage / capacity reporting across the fleet — per-volume capacity, free space and % used.',
91
+ inputSchema: z.object(queryArgs).strict(),
92
+ handler: async (client, args) => {
93
+ const resp = await client.get('/v2/queries/volumes', queryParams(client, args));
94
+ const rows = (resp.results ?? []).map((v) => [
95
+ String(v.deviceId ?? ''),
96
+ v.name ?? '',
97
+ v.fileSystem ?? '',
98
+ humanBytes(v.capacity),
99
+ humanBytes(v.freeSpace),
100
+ percentUsed(v.freeSpace, v.capacity),
101
+ ]);
102
+ return withCursor(table('Volumes', ['Device ID', 'Volume', 'FS', 'Capacity', 'Free', '% Used'], rows), resp);
103
+ },
104
+ },
105
+ {
106
+ name: 'ninja_query_antivirus_status',
107
+ description: 'Antivirus product and protection status across the fleet.',
108
+ inputSchema: z.object(queryArgs).strict(),
109
+ handler: async (client, args) => {
110
+ const resp = await client.get('/v2/queries/antivirus-status', queryParams(client, args));
111
+ const rows = await Promise.all((resp.results ?? []).map(async (r) => [
112
+ await client.resolveDeviceLabel(r.deviceId),
113
+ r.productName ?? '',
114
+ r.productState ?? '',
115
+ r.definitionStatus ?? '',
116
+ ]));
117
+ return withCursor(table('Antivirus Status', ['Device', 'Product', 'State', 'Definitions'], rows), resp);
118
+ },
119
+ },
120
+ {
121
+ name: 'ninja_query_os_patches',
122
+ description: 'Pending / known OS patches across the fleet, per device.',
123
+ inputSchema: z.object(queryArgs).strict(),
124
+ handler: async (client, args) => {
125
+ const resp = await client.get('/v2/queries/os-patches', queryParams(client, args));
126
+ const rows = (resp.results ?? []).map((p) => [
127
+ String(p.deviceId ?? ''),
128
+ p.kbNumber ?? '',
129
+ p.name ?? '',
130
+ p.status ?? '',
131
+ p.severity ?? '',
132
+ ]);
133
+ return withCursor(table('OS Patches (fleet)', ['Device ID', 'KB', 'Name', 'Status', 'Severity'], rows), resp);
134
+ },
135
+ },
136
+ ];
137
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/tools/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,+EAA+E;AAC/E,MAAM,SAAS,GAAG;IAChB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACrG,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC1F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC9F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;CAC7G,CAAC;AAEF,SAAS,WAAW,CAClB,MAAmB,EACnB,IAA4F;IAE5F,MAAM,MAAM,GAA4B;QACtC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC;KACvE,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACrG,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oFAAoF;AACpF,yEAAyE;AACzE,6BAA6B;AAC7B,SAAS,UAAU,CAAI,GAAW,EAAE,IAAsB;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;IAC3C,IAAI,IAAI,IAAI,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE,CAAC;QACtC,OAAO,GAAG,GAAG,QAAQ,KAAK,mBAAmB,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,QAAQ,0BAA0B,IAAI,KAAK,CAAC;IAClH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C;QACE,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,8LAA8L;QAC3M,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAA8B,2BAA2B,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACnH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC3C,CAAC,CAAC,YAAY,IAAI,EAAE;gBACpB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;gBACvB,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;gBACzB,MAAM,CAAC,CAAC,CAAC,qBAAqB,IAAI,CAAC,CAAC;gBACpC,MAAM,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC;gBACjC,MAAM,CAAC,CAAC,CAAC,0BAA0B,IAAI,CAAC,CAAC;aAC1C,CAAC,CACH,CAAC;YACF,OAAO,UAAU,CACf,KAAK,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,EAClH,IAAI,CACL,CAAC;QACJ,CAAC;KACF;IAED;QACE,IAAI,EAAE,+BAA+B;QACrC,WAAW,EAAE,wGAAwG;QACrH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAoC,+BAA+B,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC7H,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACxB,CAAC,CAAC,IAAI,IAAI,EAAE;gBACZ,CAAC,CAAC,YAAY,IAAI,EAAE;gBACpB,CAAC,CAAC,WAAW,IAAI,EAAE;gBACnB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAC1B,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;aACxB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/H,CAAC;KACF;IAED;QACE,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,sFAAsF;QACnG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAmC,8BAA8B,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC3H,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACxB,CAAC,CAAC,YAAY,IAAI,EAAE;gBACpB,CAAC,CAAC,KAAK,IAAI,EAAE;gBACb,CAAC,CAAC,YAAY,IAAI,EAAE;gBACpB,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBACjC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;aAC7B,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5H,CAAC;KACF;IAED;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,gGAAgG;QAC7G,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAwB,qBAAqB,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACvG,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACxB,CAAC,CAAC,IAAI,IAAI,EAAE;gBACZ,CAAC,CAAC,UAAU,IAAI,EAAE;gBAClB,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACtB,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvB,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC;aACrC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/G,CAAC;KACF;IAED;QACE,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAoC,8BAA8B,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5H,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC3C,CAAC,CAAC,WAAW,IAAI,EAAE;gBACnB,CAAC,CAAC,YAAY,IAAI,EAAE;gBACpB,CAAC,CAAC,gBAAgB,IAAI,EAAE;aACzB,CAAC,CACH,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1G,CAAC;KACF;IAED;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,0DAA0D;QACvE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;QACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAyB,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC3G,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACxB,CAAC,CAAC,QAAQ,IAAI,EAAE;gBAChB,CAAC,CAAC,IAAI,IAAI,EAAE;gBACZ,CAAC,CAAC,MAAM,IAAI,EAAE;gBACd,CAAC,CAAC,QAAQ,IAAI,EAAE;aACjB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAChH,CAAC;KACF;CACF,CAAC"}