@snutils/snu 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 (67) hide show
  1. package/README.md +156 -0
  2. package/bin/snu.js +8 -0
  3. package/dist/cli/format.d.ts +14 -0
  4. package/dist/cli/format.d.ts.map +1 -0
  5. package/dist/cli/format.js +231 -0
  6. package/dist/cli/format.js.map +1 -0
  7. package/dist/cli/index.d.ts +4 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +296 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/stdin.d.ts +14 -0
  12. package/dist/cli/stdin.d.ts.map +1 -0
  13. package/dist/cli/stdin.js +75 -0
  14. package/dist/cli/stdin.js.map +1 -0
  15. package/dist/client.d.ts +43 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +350 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +28 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/mcp/index.d.ts +4 -0
  24. package/dist/mcp/index.d.ts.map +1 -0
  25. package/dist/mcp/index.js +185 -0
  26. package/dist/mcp/index.js.map +1 -0
  27. package/dist/registry.d.ts +5 -0
  28. package/dist/registry.d.ts.map +1 -0
  29. package/dist/registry.js +527 -0
  30. package/dist/registry.js.map +1 -0
  31. package/dist/server/canonical.d.ts +10 -0
  32. package/dist/server/canonical.d.ts.map +1 -0
  33. package/dist/server/canonical.js +72 -0
  34. package/dist/server/canonical.js.map +1 -0
  35. package/dist/server/config.d.ts +9 -0
  36. package/dist/server/config.d.ts.map +1 -0
  37. package/dist/server/config.js +117 -0
  38. package/dist/server/config.js.map +1 -0
  39. package/dist/server/dispatcher.d.ts +32 -0
  40. package/dist/server/dispatcher.d.ts.map +1 -0
  41. package/dist/server/dispatcher.js +631 -0
  42. package/dist/server/dispatcher.js.map +1 -0
  43. package/dist/server/httpBridge.d.ts +20 -0
  44. package/dist/server/httpBridge.d.ts.map +1 -0
  45. package/dist/server/httpBridge.js +219 -0
  46. package/dist/server/httpBridge.js.map +1 -0
  47. package/dist/server/pendingRegistry.d.ts +26 -0
  48. package/dist/server/pendingRegistry.d.ts.map +1 -0
  49. package/dist/server/pendingRegistry.js +76 -0
  50. package/dist/server/pendingRegistry.js.map +1 -0
  51. package/dist/server/policy.d.ts +18 -0
  52. package/dist/server/policy.d.ts.map +1 -0
  53. package/dist/server/policy.js +53 -0
  54. package/dist/server/policy.js.map +1 -0
  55. package/dist/server/standalone.d.ts +24 -0
  56. package/dist/server/standalone.d.ts.map +1 -0
  57. package/dist/server/standalone.js +152 -0
  58. package/dist/server/standalone.js.map +1 -0
  59. package/dist/server/wsBridge.d.ts +45 -0
  60. package/dist/server/wsBridge.d.ts.map +1 -0
  61. package/dist/server/wsBridge.js +321 -0
  62. package/dist/server/wsBridge.js.map +1 -0
  63. package/dist/types.d.ts +123 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +6 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +51 -0
@@ -0,0 +1,527 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TOOLS = void 0;
4
+ exports.getToolByName = getToolByName;
5
+ exports.getToolByCliCommand = getToolByCliCommand;
6
+ function formatOrderBy(orderBy) {
7
+ if (!orderBy)
8
+ return undefined;
9
+ const trimmed = orderBy.trim();
10
+ if (!trimmed)
11
+ return undefined;
12
+ if (trimmed.startsWith('ORDERBY'))
13
+ return trimmed;
14
+ return `ORDERBY${trimmed}`;
15
+ }
16
+ exports.TOOLS = [
17
+ // 1. Code Search
18
+ {
19
+ name: 'snu_code_search',
20
+ agentCommand: 'code_search',
21
+ description: 'Fast SN Utils GraphQL field-index code search across Script Includes, Business Rules, Client Scripts, UI Actions, and Flow Actions. Requires SN Utils Pro.',
22
+ cliCommand: 'search',
23
+ cliUsage: 'snu search <term> [--tables <t1,t2>] [--limit <n>] [--active-only] [--instance <i>] [--json]',
24
+ cliOptions: {
25
+ tables: { type: 'string', short: 't', description: 'Comma-separated table filter' },
26
+ limit: { type: 'string', short: 'l', description: 'Max results (default: 50)' },
27
+ 'active-only': { type: 'boolean', short: 'a', description: 'Search active records only' },
28
+ },
29
+ inputSchema: {
30
+ type: 'object',
31
+ properties: {
32
+ term: { type: 'string', description: 'Search keyword or phrase (min 2 chars)' },
33
+ tables: { type: 'string', description: 'Optional comma-separated table names to filter search' },
34
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 50, description: 'Max hits to return' },
35
+ activeOnly: { type: 'boolean', default: false, description: 'Only search active records' },
36
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
37
+ },
38
+ required: ['term'],
39
+ additionalProperties: false,
40
+ },
41
+ mapInput: (input) => ({
42
+ command: 'code_search',
43
+ instance: input.instance,
44
+ params: {
45
+ term: input.term,
46
+ tables: input.tables,
47
+ limit: typeof input.limit === 'number' ? input.limit : input.limit ? parseInt(input.limit, 10) : 50,
48
+ activeOnly: input.activeOnly === true || input['active-only'] === true,
49
+ },
50
+ }),
51
+ },
52
+ // 2. Schema
53
+ {
54
+ name: 'snu_get_schema',
55
+ agentCommand: 'get_table_metadata',
56
+ description: 'Fetch column dictionary metadata for a table (types, labels, references, choice lists, mandatory/read-only flags).',
57
+ cliCommand: 'schema',
58
+ cliUsage: 'snu schema <table> [--instance <i>] [--json]',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ table: { type: 'string', description: 'ServiceNow table name (e.g. incident, sys_user)' },
63
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
64
+ },
65
+ required: ['table'],
66
+ additionalProperties: false,
67
+ },
68
+ mapInput: (input) => ({
69
+ command: 'get_table_metadata',
70
+ instance: input.instance,
71
+ params: {
72
+ table: input.table,
73
+ },
74
+ }),
75
+ },
76
+ // 3. Context
77
+ {
78
+ name: 'snu_get_context',
79
+ agentCommand: 'get_context',
80
+ description: 'Inspect active ServiceNow connection status, helper tab state, license tier, available instances, and permission gates.',
81
+ cliCommand: 'context',
82
+ cliUsage: 'snu context [--instance <i>] [--json]',
83
+ inputSchema: {
84
+ type: 'object',
85
+ properties: {
86
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
87
+ },
88
+ additionalProperties: false,
89
+ },
90
+ mapInput: (input) => ({
91
+ command: 'get_context',
92
+ instance: input.instance,
93
+ params: {},
94
+ }),
95
+ },
96
+ // 4. Query Records
97
+ {
98
+ name: 'snu_query_records',
99
+ agentCommand: 'query_records',
100
+ description: 'Query records from any ServiceNow table with an encoded query string, projection fields, and limit.',
101
+ cliCommand: 'query',
102
+ cliUsage: 'snu query <table> [query] [--fields <f1,f2>] [--limit <n>] [--order-by <field>] [--instance <i>] [--json]',
103
+ cliOptions: {
104
+ fields: { type: 'string', short: 'f', description: 'Fields to project (default: sys_id,number,short_description,sys_created_on)' },
105
+ limit: { type: 'string', short: 'l', description: 'Max records to return (default: 10)' },
106
+ 'order-by': { type: 'string', short: 'o', description: 'Order by field expression' },
107
+ },
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ table: { type: 'string', description: 'Table name to query' },
112
+ query: { type: 'string', description: 'ServiceNow encoded query string (e.g. active=true^priority=1)' },
113
+ fields: { type: 'string', description: 'Comma-separated field list to project' },
114
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 10, description: 'Max records to return' },
115
+ orderBy: { type: 'string', description: 'Order by field expression (e.g. sys_created_on or ORDERBYDESCsys_created_on)' },
116
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
117
+ },
118
+ required: ['table'],
119
+ additionalProperties: false,
120
+ },
121
+ mapInput: (input) => ({
122
+ command: 'query_records',
123
+ instance: input.instance,
124
+ params: {
125
+ table: input.table,
126
+ query: input.query || '',
127
+ fields: input.fields || 'sys_id,number,short_description,sys_created_on',
128
+ limit: typeof input.limit === 'number' ? input.limit : input.limit ? parseInt(input.limit, 10) : 10,
129
+ orderBy: formatOrderBy(input.orderBy || input['order-by']),
130
+ },
131
+ }),
132
+ },
133
+ // 5. Get Record
134
+ {
135
+ name: 'snu_get_record',
136
+ agentCommand: 'get_record',
137
+ description: 'Fetch a single record by sys_id with optional field projection.',
138
+ cliCommand: 'record get',
139
+ cliUsage: 'snu record get <table> <sys_id> [--fields <f1,f2>] [--instance <i>] [--json]',
140
+ cliOptions: {
141
+ fields: { type: 'string', short: 'f', description: 'Comma-separated field list' },
142
+ },
143
+ inputSchema: {
144
+ type: 'object',
145
+ properties: {
146
+ table: { type: 'string', description: 'Table name' },
147
+ sys_id: { type: 'string', description: '32-character record sys_id' },
148
+ fields: { type: 'string', description: 'Comma-separated field list (optional)' },
149
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
150
+ },
151
+ required: ['table', 'sys_id'],
152
+ additionalProperties: false,
153
+ },
154
+ mapInput: (input) => ({
155
+ command: 'get_record',
156
+ instance: input.instance,
157
+ params: {
158
+ table: input.table,
159
+ sys_id: input.sys_id,
160
+ fields: input.fields,
161
+ },
162
+ }),
163
+ },
164
+ // 6. Create Artifact
165
+ {
166
+ name: 'snu_create_artifact',
167
+ agentCommand: 'create_artifact',
168
+ description: 'Create a new scriptable artifact (Script Include, Business Rule, etc.) in ServiceNow and track it locally. Requires fields.name and createArtifacts.enabled gate. Note: If review mode is enabled in VS Code settings, the write is staged for manual approval rather than applied immediately.',
169
+ cliCommand: 'artifact create',
170
+ cliUsage: 'snu artifact create <table> <name> [--fields <json>] [--scope <scope>] [--instance <i>] [--json]',
171
+ cliOptions: {
172
+ fields: { type: 'string', short: 'f', description: 'JSON payload dictionary' },
173
+ scope: { type: 'string', short: 's', description: 'Application scope' },
174
+ },
175
+ inputSchema: {
176
+ type: 'object',
177
+ properties: {
178
+ table: { type: 'string', description: 'Target ServiceNow artifact table (e.g. sys_script_include)' },
179
+ name: { type: 'string', description: 'Artifact name (will be mapped into fields.name)' },
180
+ fields: { type: 'object', description: 'Additional field-value dictionary' },
181
+ scope: { type: 'string', description: 'Application scope (optional)' },
182
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
183
+ },
184
+ required: ['table', 'name'],
185
+ additionalProperties: false,
186
+ },
187
+ mapInput: (input) => {
188
+ let fields = {};
189
+ if (input.fields) {
190
+ fields = typeof input.fields === 'string' ? JSON.parse(input.fields) : input.fields;
191
+ }
192
+ return {
193
+ command: 'create_artifact',
194
+ instance: input.instance,
195
+ params: {
196
+ table: input.table,
197
+ fields: { ...fields, name: input.name },
198
+ scope: input.scope,
199
+ await: true,
200
+ },
201
+ };
202
+ },
203
+ },
204
+ // 7. Update Record
205
+ {
206
+ name: 'snu_update_record',
207
+ agentCommand: 'update_record',
208
+ description: 'Update a field on an existing ServiceNow record with synchronous persistence verification. Note: If review mode is enabled in VS Code settings, the write is staged for manual approval rather than applied immediately.',
209
+ cliCommand: 'record update',
210
+ cliUsage: 'snu record update <table> <sys_id> <field> (--value <v> | --file <path> | stdin) [--instance <i>] [--json]',
211
+ cliOptions: {
212
+ value: { type: 'string', short: 'v', description: 'New field content' },
213
+ file: { type: 'string', short: 'f', description: 'Read new field content from local file' },
214
+ },
215
+ inputSchema: {
216
+ type: 'object',
217
+ properties: {
218
+ table: { type: 'string', description: 'Table name' },
219
+ sys_id: { type: 'string', description: 'Record sys_id' },
220
+ field: { type: 'string', description: 'Field name to update (e.g. script, short_description)' },
221
+ value: { type: 'string', description: 'New field content' },
222
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
223
+ },
224
+ required: ['table', 'sys_id', 'field', 'value'],
225
+ additionalProperties: false,
226
+ },
227
+ mapInput: (input) => {
228
+ const content = input.content !== undefined ? input.content : input.value;
229
+ if (content === undefined) {
230
+ throw new Error('Missing required field content (value)');
231
+ }
232
+ return {
233
+ command: 'update_record',
234
+ instance: input.instance,
235
+ params: {
236
+ table: input.table,
237
+ sys_id: input.sys_id,
238
+ field: input.field,
239
+ content,
240
+ await: true,
241
+ },
242
+ };
243
+ },
244
+ },
245
+ // 8. Delete Record
246
+ {
247
+ name: 'snu_delete_record',
248
+ agentCommand: 'delete_record',
249
+ description: 'Delete a single record from ServiceNow by sys_id. Destructive: disabled by default (deleteRecords.enabled) and requires confirm: true or dryRun: true.',
250
+ cliCommand: 'record delete',
251
+ cliUsage: 'snu record delete <table> <sys_id> [--confirm] [--dry-run] [--instance <i>] [--json]',
252
+ cliOptions: {
253
+ confirm: { type: 'boolean', description: 'Must be set to true to execute deletion' },
254
+ 'dry-run': { type: 'boolean', description: 'Return target record without deleting' },
255
+ },
256
+ inputSchema: {
257
+ type: 'object',
258
+ properties: {
259
+ table: { type: 'string', description: 'Table name' },
260
+ sys_id: { type: 'string', description: 'Record sys_id' },
261
+ confirm: { type: 'boolean', const: true, description: 'Must be set to true to execute deletion' },
262
+ dryRun: { type: 'boolean', description: 'When true, returns the record that would be deleted without deleting it' },
263
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
264
+ },
265
+ required: ['table', 'sys_id'],
266
+ additionalProperties: false,
267
+ },
268
+ mapInput: (input) => {
269
+ const isDryRun = input.dryRun === true || input['dry-run'] === true;
270
+ if (!isDryRun && input.confirm !== true) {
271
+ throw new Error('snu_delete_record is destructive: pass --confirm to execute or --dry-run to inspect the target record.');
272
+ }
273
+ return {
274
+ command: 'delete_record',
275
+ instance: input.instance,
276
+ params: {
277
+ table: input.table,
278
+ sys_id: input.sys_id,
279
+ dryRun: isDryRun,
280
+ },
281
+ };
282
+ },
283
+ },
284
+ // 9. Run Background Script
285
+ {
286
+ name: 'snu_run_background_script',
287
+ agentCommand: 'run_background_script',
288
+ description: 'Execute server-side JavaScript on the instance via Background Scripts and return captured output. Gated by backgroundScripts.enabled.',
289
+ cliCommand: 'run',
290
+ cliUsage: 'snu run [script] [--file <path>] [--instance <i>] [--json]',
291
+ cliOptions: {
292
+ file: { type: 'string', short: 'f', description: 'Path to local JS script file' },
293
+ },
294
+ inputSchema: {
295
+ type: 'object',
296
+ properties: {
297
+ script: { type: 'string', description: 'JavaScript code to execute on the instance' },
298
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
299
+ },
300
+ required: ['script'],
301
+ additionalProperties: false,
302
+ },
303
+ mapInput: (input) => {
304
+ if (!input.script) {
305
+ throw new Error('Missing required parameter: script');
306
+ }
307
+ return {
308
+ command: 'run_background_script',
309
+ instance: input.instance,
310
+ params: {
311
+ script: input.script,
312
+ },
313
+ };
314
+ },
315
+ },
316
+ // 10. Get Form State
317
+ {
318
+ name: 'snu_get_form_state',
319
+ agentCommand: 'get_form_state',
320
+ description: 'Read live form table, sys_id, new-record state, and field values from the active connected ServiceNow browser tab.',
321
+ cliCommand: 'browser form',
322
+ cliUsage: 'snu browser form [--fields <f1,f2>] [--url <u>] [--tab <id>] [--instance <i>] [--json]',
323
+ cliOptions: {
324
+ fields: { type: 'string', short: 'f', description: 'Comma-separated field names to read' },
325
+ url: { type: 'string', description: 'Target tab URL pattern' },
326
+ tab: { type: 'string', description: 'Browser tab ID' },
327
+ },
328
+ inputSchema: {
329
+ type: 'object',
330
+ properties: {
331
+ fields: { type: 'array', items: { type: 'string' }, description: 'Optional list of specific field names to read' },
332
+ url: { type: 'string', description: 'Target tab URL pattern (optional)' },
333
+ tabId: { type: 'integer', description: 'Specific browser tab ID (optional)' },
334
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
335
+ },
336
+ additionalProperties: false,
337
+ },
338
+ mapInput: (input) => {
339
+ let fields = input.fields;
340
+ if (typeof fields === 'string') {
341
+ fields = fields.split(',').map((f) => f.trim()).filter(Boolean);
342
+ }
343
+ const tabId = input.tabId ?? (input.tab ? parseInt(input.tab, 10) : undefined);
344
+ return {
345
+ command: 'get_form_state',
346
+ instance: input.instance,
347
+ params: {
348
+ fields,
349
+ url: input.url,
350
+ tabId,
351
+ },
352
+ };
353
+ },
354
+ },
355
+ // 11. Set Form Field
356
+ {
357
+ name: 'snu_set_form_field',
358
+ agentCommand: 'set_field',
359
+ description: 'Set a field value on the active ServiceNow form via g_form.setValue (triggers client scripts and UI policies).',
360
+ cliCommand: 'browser set',
361
+ cliUsage: 'snu browser set <field> <value> [--display-value <v>] [--url <u>] [--tab <id>] [--instance <i>] [--json]',
362
+ cliOptions: {
363
+ 'display-value': { type: 'string', short: 'd', description: 'Display value for reference fields' },
364
+ url: { type: 'string', description: 'Target tab URL pattern' },
365
+ tab: { type: 'string', description: 'Browser tab ID' },
366
+ },
367
+ inputSchema: {
368
+ type: 'object',
369
+ properties: {
370
+ field: { type: 'string', description: 'Field name to set' },
371
+ value: { type: 'string', description: 'New value to set' },
372
+ displayValue: { type: 'string', description: 'Optional display value for reference fields' },
373
+ url: { type: 'string', description: 'Target tab URL pattern (optional)' },
374
+ tabId: { type: 'integer', description: 'Specific browser tab ID (optional)' },
375
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
376
+ },
377
+ required: ['field', 'value'],
378
+ additionalProperties: false,
379
+ },
380
+ mapInput: (input) => {
381
+ const tabId = input.tabId ?? (input.tab ? parseInt(input.tab, 10) : undefined);
382
+ return {
383
+ command: 'set_field',
384
+ instance: input.instance,
385
+ params: {
386
+ field: input.field,
387
+ value: input.value,
388
+ displayValue: input.displayValue || input['display-value'],
389
+ url: input.url,
390
+ tabId,
391
+ },
392
+ };
393
+ },
394
+ },
395
+ // 12. Run UI Action
396
+ {
397
+ name: 'snu_run_ui_action',
398
+ agentCommand: 'run_ui_action',
399
+ description: 'Trigger a UI action on the active form (e.g. "save", "submit", "sysverb_update").',
400
+ cliCommand: 'browser action',
401
+ cliUsage: 'snu browser action <action> [--no-suppress-dialogs] [--url <u>] [--tab <id>] [--instance <i>] [--json]',
402
+ cliOptions: {
403
+ 'no-suppress-dialogs': { type: 'boolean', description: 'Do not auto-confirm browser dialogs' },
404
+ url: { type: 'string', description: 'Target tab URL pattern' },
405
+ tab: { type: 'string', description: 'Browser tab ID' },
406
+ },
407
+ inputSchema: {
408
+ type: 'object',
409
+ properties: {
410
+ uiAction: { type: 'string', description: 'Action name or sysverb verb (e.g. save, sysverb_update)' },
411
+ suppressDialogs: { type: 'boolean', default: true, description: 'Auto-confirm browser dialogs' },
412
+ url: { type: 'string', description: 'Target tab URL pattern (optional)' },
413
+ tabId: { type: 'integer', description: 'Specific browser tab ID (optional)' },
414
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
415
+ },
416
+ required: ['uiAction'],
417
+ additionalProperties: false,
418
+ },
419
+ mapInput: (input) => {
420
+ const tabId = input.tabId ?? (input.tab ? parseInt(input.tab, 10) : undefined);
421
+ const suppress = input.suppressDialogs !== false && input['no-suppress-dialogs'] !== true;
422
+ return {
423
+ command: 'run_ui_action',
424
+ instance: input.instance,
425
+ params: {
426
+ uiAction: input.uiAction || input.action,
427
+ suppressDialogs: suppress,
428
+ url: input.url,
429
+ tabId,
430
+ },
431
+ };
432
+ },
433
+ },
434
+ // 13. Navigate
435
+ {
436
+ name: 'snu_navigate',
437
+ agentCommand: 'navigate',
438
+ description: 'Navigate connected ServiceNow browser tab to a URL and wait for page load to finish.',
439
+ cliCommand: 'browser nav',
440
+ cliUsage: 'snu browser nav <url> [--new-tab] [--no-wait] [--instance <i>] [--json]',
441
+ cliOptions: {
442
+ 'new-tab': { type: 'boolean', short: 'n', description: 'Open in new tab' },
443
+ 'no-wait': { type: 'boolean', description: 'Do not wait for page load' },
444
+ 'no-discard-unsaved': { type: 'boolean', description: 'Do not bypass unsaved changes warnings' },
445
+ tab: { type: 'string', description: 'Browser tab ID' },
446
+ },
447
+ inputSchema: {
448
+ type: 'object',
449
+ properties: {
450
+ url: { type: 'string', description: 'ServiceNow URL to navigate to' },
451
+ tabId: { type: 'integer', description: 'Specific tab ID to navigate (optional)' },
452
+ newTab: { type: 'boolean', default: false, description: 'Open in a new tab instead of active tab' },
453
+ waitForLoad: { type: 'boolean', default: true, description: 'Wait for page load event before returning' },
454
+ discardUnsaved: { type: 'boolean', default: true, description: 'Bypass unsaved changes warnings' },
455
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
456
+ },
457
+ required: ['url'],
458
+ additionalProperties: false,
459
+ },
460
+ mapInput: (input) => {
461
+ const tabId = input.tabId ?? (input.tab ? parseInt(input.tab, 10) : undefined);
462
+ return {
463
+ command: 'navigate',
464
+ instance: input.instance,
465
+ params: {
466
+ url: input.url,
467
+ tabId,
468
+ newTab: input.newTab === true || input['new-tab'] === true,
469
+ waitForLoad: input.waitForLoad !== false && input['no-wait'] !== true,
470
+ discardUnsaved: input.discardUnsaved !== false && input['no-discard-unsaved'] !== true,
471
+ },
472
+ };
473
+ },
474
+ },
475
+ // 14. Take Screenshot
476
+ {
477
+ name: 'snu_take_screenshot',
478
+ agentCommand: 'take_screenshot',
479
+ description: 'Capture a screenshot of a ServiceNow page tab (auto-routes between standard capture and debugger if available). Saves under workspace screenshots/.',
480
+ cliCommand: 'screenshot',
481
+ cliUsage: 'snu screenshot [--url <u>] [--tab <id>] [--file <name>] [--exact] [--instance <i>] [--json]',
482
+ cliOptions: {
483
+ url: { type: 'string', short: 'u', description: 'URL pattern of tab to capture' },
484
+ tab: { type: 'string', short: 't', description: 'Tab ID to capture' },
485
+ file: { type: 'string', short: 'f', description: 'Custom PNG filename' },
486
+ exact: { type: 'boolean', description: 'Require exact URL match' },
487
+ },
488
+ inputSchema: {
489
+ type: 'object',
490
+ properties: {
491
+ url: { type: 'string', description: 'URL pattern of the tab to capture' },
492
+ tabId: { type: 'integer', description: 'Specific tab ID to capture' },
493
+ fileName: { type: 'string', description: 'Optional custom filename (defaults to timestamped PNG)' },
494
+ exactUrl: { type: 'boolean', default: false, description: 'Require exact URL match' },
495
+ instance: { type: 'string', description: 'Target instance name/folder (optional)' },
496
+ },
497
+ anyOf: [{ required: ['url'] }, { required: ['tabId'] }],
498
+ additionalProperties: false,
499
+ },
500
+ mapInput: (input) => {
501
+ const tabId = input.tabId ?? (input.tab ? parseInt(input.tab, 10) : undefined);
502
+ return {
503
+ command: 'take_screenshot',
504
+ instance: input.instance,
505
+ params: {
506
+ url: input.url,
507
+ tabId,
508
+ fileName: input.fileName || input.file,
509
+ exactUrl: input.exactUrl === true || input.exact === true,
510
+ },
511
+ };
512
+ },
513
+ },
514
+ ];
515
+ const toolMap = new Map();
516
+ const cliMap = new Map();
517
+ for (const t of exports.TOOLS) {
518
+ toolMap.set(t.name, t);
519
+ cliMap.set(t.cliCommand, t);
520
+ }
521
+ function getToolByName(name) {
522
+ return toolMap.get(name);
523
+ }
524
+ function getToolByCliCommand(cliCmd) {
525
+ return cliMap.get(cliCmd);
526
+ }
527
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Deterministically serialize a JavaScript value to canonical JSON.
3
+ * Object keys are sorted alphabetically at every level.
4
+ */
5
+ export declare function canonicalJson(obj: any): string;
6
+ /**
7
+ * Compute SHA-256 payload hash over [protocolVersion, instanceOrigin, command, canonicalParams].
8
+ */
9
+ export declare function computePayloadHash(protocolVersion: number, instanceOrigin: string, command: string, params: any): string;
10
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/server/canonical.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAS9C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,GAAG,GACV,MAAM,CAeR"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.canonicalJson = canonicalJson;
37
+ exports.computePayloadHash = computePayloadHash;
38
+ const crypto = __importStar(require("crypto"));
39
+ /**
40
+ * Deterministically serialize a JavaScript value to canonical JSON.
41
+ * Object keys are sorted alphabetically at every level.
42
+ */
43
+ function canonicalJson(obj) {
44
+ if (obj === null || typeof obj !== 'object') {
45
+ return JSON.stringify(obj);
46
+ }
47
+ if (Array.isArray(obj)) {
48
+ return '[' + obj.map(canonicalJson).join(',') + ']';
49
+ }
50
+ const keys = Object.keys(obj).sort();
51
+ return '{' + keys.map((k) => JSON.stringify(k) + ':' + canonicalJson(obj[k])).join(',') + '}';
52
+ }
53
+ /**
54
+ * Compute SHA-256 payload hash over [protocolVersion, instanceOrigin, command, canonicalParams].
55
+ */
56
+ function computePayloadHash(protocolVersion, instanceOrigin, command, params) {
57
+ let origin = (instanceOrigin || '').toLowerCase().trim();
58
+ try {
59
+ origin = new URL(origin).origin.toLowerCase();
60
+ }
61
+ catch {
62
+ origin = origin.replace(/\/+$/, '');
63
+ }
64
+ const canonicalString = canonicalJson([
65
+ protocolVersion,
66
+ origin,
67
+ command,
68
+ params || {},
69
+ ]);
70
+ return crypto.createHash('sha256').update(canonicalString, 'utf8').digest('hex');
71
+ }
72
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/server/canonical.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,sCASC;AAKD,gDAoBC;AAxCD,+CAAiC;AAEjC;;;GAGG;AACH,SAAgB,aAAa,CAAC,GAAQ;IACpC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAChG,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,eAAuB,EACvB,cAAsB,EACtB,OAAe,EACf,MAAW;IAEX,IAAI,MAAM,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,eAAe,GAAG,aAAa,CAAC;QACpC,eAAe;QACf,MAAM;QACN,OAAO;QACP,MAAM,IAAI,EAAE;KACb,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnF,CAAC"}