@sonisoft/now-sdk-ext-cli 1.1.0-alpha.3 → 2.0.0-alpha.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 (41) hide show
  1. package/README.md +1825 -34
  2. package/dist/commands/app/index.d.ts +4 -1
  3. package/dist/commands/app/index.d.ts.map +1 -1
  4. package/dist/commands/app/index.js +25 -4
  5. package/dist/commands/app/index.js.map +1 -1
  6. package/dist/commands/app/install.d.ts +4 -1
  7. package/dist/commands/app/install.d.ts.map +1 -1
  8. package/dist/commands/app/install.js +40 -6
  9. package/dist/commands/app/install.js.map +1 -1
  10. package/dist/commands/app/repo-install.d.ts +19 -0
  11. package/dist/commands/app/repo-install.d.ts.map +1 -0
  12. package/dist/commands/app/repo-install.js +173 -0
  13. package/dist/commands/app/repo-install.js.map +1 -0
  14. package/dist/commands/app/repo-list.d.ts +17 -0
  15. package/dist/commands/app/repo-list.d.ts.map +1 -0
  16. package/dist/commands/app/repo-list.js +152 -0
  17. package/dist/commands/app/repo-list.js.map +1 -0
  18. package/dist/commands/app/uninstall.d.ts +16 -0
  19. package/dist/commands/app/uninstall.d.ts.map +1 -0
  20. package/dist/commands/app/uninstall.js +70 -0
  21. package/dist/commands/app/uninstall.js.map +1 -0
  22. package/dist/commands/atf/index.d.ts +71 -0
  23. package/dist/commands/atf/index.d.ts.map +1 -0
  24. package/dist/commands/atf/index.js +256 -0
  25. package/dist/commands/atf/index.js.map +1 -0
  26. package/dist/commands/exec/index.d.ts +17 -3
  27. package/dist/commands/exec/index.d.ts.map +1 -1
  28. package/dist/commands/exec/index.js +286 -26
  29. package/dist/commands/exec/index.js.map +1 -1
  30. package/dist/commands/log/index.d.ts +46 -0
  31. package/dist/commands/log/index.d.ts.map +1 -0
  32. package/dist/commands/log/index.js +418 -0
  33. package/dist/commands/log/index.js.map +1 -0
  34. package/dist/common/authenticated-command.js +2 -2
  35. package/dist/common/authenticated-command.js.map +1 -1
  36. package/dist/common/scope-autocomplete.d.ts +20 -0
  37. package/dist/common/scope-autocomplete.d.ts.map +1 -0
  38. package/dist/common/scope-autocomplete.js +94 -0
  39. package/dist/common/scope-autocomplete.js.map +1 -0
  40. package/oclif.manifest.json +691 -12
  41. package/package.json +31 -12
@@ -0,0 +1,418 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /* eslint-disable perfectionist/sort-objects */
3
+ import { Flags } from '@oclif/core';
4
+ import { Logger, SyslogReader } from '@sonisoft/now-sdk-ext-core';
5
+ import chalk from 'chalk';
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import { AuthenticatedCommand } from '../../common/authenticated-command.js';
9
+ export class Log extends AuthenticatedCommand {
10
+ static args = {};
11
+ static description = 'Tail and monitor ServiceNow system logs in real-time with beautiful formatting.\n\n' +
12
+ 'This command provides real-time log monitoring with enhanced visual formatting using color-coded ' +
13
+ 'output that makes logs easy to scan and understand at a glance. Automatically highlights errors, ' +
14
+ 'warnings, success messages, and important keywords.\n\n' +
15
+ 'Key Features:\n' +
16
+ ' • Real-time log tailing (like Unix tail -f)\n' +
17
+ ' • Powerful filtering with multiple operators (CONTAINS, REGEX, EQUALS, etc.)\n' +
18
+ ' • Smart keyword highlighting (errors in red, warnings in yellow, etc.)\n' +
19
+ ' • Beautiful color-coded console output with chalk\n' +
20
+ ' • Export logs to file with automatic appending\n' +
21
+ ' • Fast 1-second default polling interval\n' +
22
+ ' • Timestamps and sequence numbers for each log\n' +
23
+ ' • Graceful shutdown with Ctrl+C\n' +
24
+ ' • Clean output without colors (--no-color flag)\n\n' +
25
+ 'Smart Highlighting:\n' +
26
+ ' • Error terms (error, exception, failed) - highlighted in RED\n' +
27
+ ' • Warning terms (warn, warning, deprecated) - highlighted in YELLOW\n' +
28
+ ' • Success terms (success, completed, done) - highlighted in GREEN\n' +
29
+ ' • System terms (system, user, transaction) - highlighted in BLUE\n\n' +
30
+ 'Filtering:\n' +
31
+ ' • Apply filters using --filter flag with syntax: "field OPERATOR value"\n' +
32
+ ' • Supports case-sensitive and case-insensitive operations\n' +
33
+ ' • Multiple filters are combined with AND logic\n' +
34
+ ' • Operators: CONTAINS, CONTAINS_CI, EQUALS, EQUALS_CI, STARTS_WITH, STARTS_WITH_CI,\n' +
35
+ ' ENDS_WITH, ENDS_WITH_CI, REGEX, NOT_CONTAINS, NOT_CONTAINS_CI, NOT_EQUALS, NOT_EQUALS_CI\n\n' +
36
+ 'Use Cases:\n' +
37
+ ' • Monitor logs during application development\n' +
38
+ ' • Debug issues in real-time\n' +
39
+ ' • Track system events during deployments\n' +
40
+ ' • Filter logs for specific application or component\n' +
41
+ ' • Quickly spot errors and warnings\n' +
42
+ ' • Collect logs for analysis or audit trails\n\n' +
43
+ '⚠️ IMPORTANT NOTES:\n' +
44
+ ' • Press Ctrl+C to stop tailing and exit gracefully\n' +
45
+ ' • Log files are created/appended automatically\n' +
46
+ ' • Uses ChannelAjax when available for better performance\n' +
47
+ ' • Default poll interval is 1 second for real-time monitoring';
48
+ static examples = [
49
+ {
50
+ description: 'Tail all logs in real-time',
51
+ command: '<%= config.bin %> <%= command.id %> --auth dev-instance',
52
+ },
53
+ {
54
+ description: 'Tail logs and save to a file',
55
+ command: '<%= config.bin %> <%= command.id %> --output ./logs/instance-logs.txt --auth dev-instance',
56
+ },
57
+ {
58
+ description: 'Tail logs with custom polling interval (500ms for faster updates)',
59
+ command: '<%= config.bin %> <%= command.id %> --interval 500 --auth dev-instance',
60
+ },
61
+ {
62
+ description: 'Filter logs containing specific text (case-insensitive)',
63
+ command: '<%= config.bin %> <%= command.id %> --filter "message CONTAINS_CI error" --auth dev-instance',
64
+ },
65
+ {
66
+ description: 'Filter logs with multiple conditions (AND logic)',
67
+ command: '<%= config.bin %> <%= command.id %> --filter "message CONTAINS x_taniu_tan_core" --filter "message CONTAINS error" --auth dev-instance',
68
+ },
69
+ {
70
+ description: 'Filter logs using regex pattern',
71
+ command: '<%= config.bin %> <%= command.id %> --filter "message REGEX .*exception.*" --auth dev-instance',
72
+ },
73
+ {
74
+ description: 'Filter logs by message starting with a pattern',
75
+ command: '<%= config.bin %> <%= command.id %> --filter "message STARTS_WITH [ERROR]" --auth dev-instance',
76
+ },
77
+ {
78
+ description: 'Tail logs without colored output',
79
+ command: '<%= config.bin %> <%= command.id %> --no-color --auth dev-instance',
80
+ },
81
+ ];
82
+ static flags = {
83
+ 'output': Flags.string({
84
+ char: 'o',
85
+ description: 'Output file path to save logs. Creates parent directories if needed.',
86
+ required: false
87
+ }),
88
+ 'interval': Flags.integer({
89
+ char: 'i',
90
+ description: 'Polling interval in milliseconds',
91
+ required: false,
92
+ default: 1000
93
+ }),
94
+ 'no-color': Flags.boolean({
95
+ description: 'Disable colored output',
96
+ required: false,
97
+ default: false
98
+ }),
99
+ 'filter': Flags.string({
100
+ char: 'f',
101
+ description: 'Filter logs by field and value. Syntax: field OPERATOR value. ' +
102
+ 'Operators: CONTAINS, CONTAINS_CI (case-insensitive), EQUALS, EQUALS_CI, ' +
103
+ 'STARTS_WITH, STARTS_WITH_CI, ENDS_WITH, ENDS_WITH_CI, REGEX, NOT_CONTAINS, NOT_EQUALS. ' +
104
+ 'Field defaults to "message" if omitted. Multiple filters are combined with AND logic.',
105
+ required: false,
106
+ multiple: true
107
+ }),
108
+ };
109
+ _logger = new Logger("LogCommand");
110
+ filterRules = [];
111
+ syslogReader;
112
+ async run() {
113
+ const { args, flags } = await this.parse(Log);
114
+ try {
115
+ // Parse filter rules if provided
116
+ if (flags.filter && flags.filter.length > 0) {
117
+ this.filterRules = flags.filter.map(f => this.parseFilter(f));
118
+ this._logger.info(`Applied ${this.filterRules.length} filter(s)`);
119
+ }
120
+ // Create SyslogReader instance
121
+ this.syslogReader = new SyslogReader(this.instance);
122
+ // Ensure output directory exists if output file is specified
123
+ if (flags.output) {
124
+ const outputDir = path.dirname(flags.output);
125
+ if (!fs.existsSync(outputDir)) {
126
+ fs.mkdirSync(outputDir, { recursive: true });
127
+ this._logger.info(`Created output directory: ${outputDir}`);
128
+ }
129
+ }
130
+ // Display header
131
+ this.displayHeader(flags);
132
+ // Handle Ctrl+C gracefully
133
+ process.on('SIGINT', () => {
134
+ this.handleExit();
135
+ });
136
+ // Start tailing logs
137
+ let logCount = 0;
138
+ let filteredCount = 0;
139
+ // Check if the new ChannelAjax method is available, otherwise fall back to regular tailing
140
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
141
+ const reader = this.syslogReader;
142
+ await (
143
+ // Use ChannelAjax method if available
144
+ reader.startTailingWithChannelAjax({
145
+ append: true,
146
+ interval: flags.interval,
147
+ onLog: (log) => {
148
+ // Apply filters before displaying
149
+ if (this.matchesFilters(log)) {
150
+ filteredCount++;
151
+ this.displayLog(log, filteredCount, flags);
152
+ }
153
+ logCount++;
154
+ },
155
+ outputFile: flags.output,
156
+ }));
157
+ }
158
+ catch (error) {
159
+ this._logger.error("Error occurred while tailing logs.", error);
160
+ this.error(error);
161
+ }
162
+ }
163
+ displayHeader(flags) {
164
+ const width = 80;
165
+ if (flags['no-color']) {
166
+ const line = '═'.repeat(width);
167
+ console.log(`\n${line}`);
168
+ console.log(` ServiceNow Log Tail (ChannelAjax)`.padEnd(width - 2) + ' ');
169
+ console.log(line);
170
+ console.log(`\n Instance: ${this.instance.getHost()}`);
171
+ console.log(` Method: ChannelAjax logtail`);
172
+ console.log(` Poll Interval: ${flags.interval}ms`);
173
+ if (flags.output) {
174
+ console.log(` Output File: ${flags.output}`);
175
+ }
176
+ if (this.filterRules.length > 0) {
177
+ console.log(` Filters: ${this.filterRules.length} active`);
178
+ for (const rule of this.filterRules) {
179
+ console.log(` - ${rule.field} ${rule.operator} "${rule.value}"`);
180
+ }
181
+ }
182
+ console.log(`\n${line}`);
183
+ console.log(' Tailing logs... (Press Ctrl+C to stop)');
184
+ console.log(`${line}\n`);
185
+ }
186
+ else {
187
+ const line = chalk.cyan('═'.repeat(width));
188
+ console.log(`\n${line}`);
189
+ console.log(chalk.bold.white(` 🚀 ServiceNow Log Tail ${chalk.cyan('(ChannelAjax)')}`));
190
+ console.log(line);
191
+ console.log(`\n ${chalk.gray('Instance:')} ${chalk.green(this.instance.getHost())}`);
192
+ console.log(` ${chalk.gray('Method:')} ${chalk.yellow('ChannelAjax logtail')}`);
193
+ console.log(` ${chalk.gray('Poll Interval:')} ${chalk.cyan(`${flags.interval}ms`)}`);
194
+ if (flags.output) {
195
+ console.log(` ${chalk.gray('Output File:')} ${chalk.blue(flags.output)}`);
196
+ }
197
+ if (this.filterRules.length > 0) {
198
+ console.log(` ${chalk.gray('Filters:')} ${chalk.magenta(`${this.filterRules.length} active`)}`);
199
+ for (const rule of this.filterRules) {
200
+ console.log(` ${chalk.gray('•')} ${chalk.cyan(rule.field)} ${chalk.yellow(rule.operator)} ${chalk.green(`"${rule.value}"`)}`);
201
+ }
202
+ }
203
+ console.log(`\n${line}`);
204
+ console.log(chalk.yellow(' 📡 Tailing logs... ') + chalk.gray('(Press Ctrl+C to stop)'));
205
+ console.log(`${line}\n`);
206
+ }
207
+ }
208
+ displayLog(log, count, flags) {
209
+ // Format timestamp
210
+ const date = new Date(log.sys_created_on);
211
+ const timestamp = date.toLocaleString();
212
+ // Get message and detect keywords for highlighting
213
+ const message = log.message;
214
+ const lowerMessage = message.toLowerCase();
215
+ if (flags['no-color']) {
216
+ // No color mode - simple clean output
217
+ const divider = '─'.repeat(80);
218
+ console.log(divider);
219
+ console.log(`⏰ ${timestamp}`);
220
+ if (log.sequence) {
221
+ console.log(`🔢 Sequence: ${log.sequence}`);
222
+ }
223
+ console.log(`💬 ${message}`);
224
+ console.log(`#${count}\n`);
225
+ }
226
+ else {
227
+ // Enhanced color mode with chalk
228
+ console.log(chalk.gray('─'.repeat(80)));
229
+ // Timestamp with icon
230
+ console.log(chalk.gray('⏰ ') +
231
+ chalk.dim(timestamp) +
232
+ chalk.gray(' │ ') +
233
+ (log.sequence ? chalk.cyan(`#${log.sequence}`) : chalk.gray('#N/A')) +
234
+ chalk.gray(' │ ') +
235
+ chalk.dim(`log ${count}`));
236
+ // Message with smart highlighting based on content
237
+ let formattedMessage = message;
238
+ // Highlight error-related terms in red
239
+ if (lowerMessage.includes('error') || lowerMessage.includes('exception') ||
240
+ lowerMessage.includes('failed') || lowerMessage.includes('failure')) {
241
+ formattedMessage = this.highlightKeywords(message, ['error', 'exception', 'failed', 'failure', 'ERROR', 'Exception', 'Failed', 'Failure'], chalk.bold.red);
242
+ }
243
+ // Highlight warning terms in yellow
244
+ else if (lowerMessage.includes('warn') || lowerMessage.includes('warning') ||
245
+ lowerMessage.includes('deprecated')) {
246
+ formattedMessage = this.highlightKeywords(message, ['warn', 'warning', 'deprecated', 'Warning', 'WARN', 'Deprecated'], chalk.bold.yellow);
247
+ }
248
+ // Highlight success terms in green
249
+ else if (lowerMessage.includes('success') || lowerMessage.includes('completed') ||
250
+ lowerMessage.includes('finished') || lowerMessage.includes('done')) {
251
+ formattedMessage = this.highlightKeywords(message, ['success', 'completed', 'finished', 'done', 'Success', 'Completed', 'Finished', 'Done'], chalk.bold.green);
252
+ }
253
+ // Highlight important system terms in blue
254
+ else if (lowerMessage.includes('system') || lowerMessage.includes('user') ||
255
+ lowerMessage.includes('transaction') || lowerMessage.includes('request')) {
256
+ formattedMessage = chalk.blue(message);
257
+ }
258
+ // Display the formatted message
259
+ console.log(chalk.white('💬 ') + formattedMessage);
260
+ console.log('');
261
+ }
262
+ }
263
+ handleExit() {
264
+ if (this.flags['no-color']) {
265
+ console.log('\n\n⏹️ Stopping tail...');
266
+ console.log('✅ Stopped. Goodbye!\n');
267
+ }
268
+ else {
269
+ console.log(chalk.yellow('\n\n⏹️ Stopping tail...'));
270
+ console.log(chalk.green('✅ Stopped. ') + chalk.gray('Goodbye!\n'));
271
+ }
272
+ if (this.syslogReader) {
273
+ this.syslogReader.stopTailing();
274
+ }
275
+ // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
276
+ process.exit(0);
277
+ }
278
+ highlightKeywords(text, keywords, formatter) {
279
+ let result = text;
280
+ for (const keyword of keywords) {
281
+ // Use a regex to find and replace the keyword while preserving the original case
282
+ const regex = new RegExp(`\\b(${keyword})\\b`, 'gi');
283
+ result = result.replace(regex, (match) => formatter(match));
284
+ }
285
+ return result;
286
+ }
287
+ /**
288
+ * Check if a log record matches a single filter rule
289
+ * @param log The log record to check
290
+ * @param rule The filter rule to apply
291
+ * @returns true if the log matches the filter, false otherwise
292
+ */
293
+ matchesFilter(log, rule) {
294
+ // Get the field value from the log
295
+ const fieldValue = log[rule.field];
296
+ // Convert to string for comparison
297
+ const strValue = String(fieldValue ?? '');
298
+ switch (rule.operator) {
299
+ case 'CONTAINS': {
300
+ return strValue.includes(rule.value);
301
+ }
302
+ case 'CONTAINS_CI': {
303
+ return strValue.toLowerCase().includes(rule.value.toLowerCase());
304
+ }
305
+ case 'ENDS_WITH': {
306
+ return strValue.endsWith(rule.value);
307
+ }
308
+ case 'ENDS_WITH_CI': {
309
+ return strValue.toLowerCase().endsWith(rule.value.toLowerCase());
310
+ }
311
+ case 'EQUALS': {
312
+ return strValue === rule.value;
313
+ }
314
+ case 'EQUALS_CI': {
315
+ return strValue.toLowerCase() === rule.value.toLowerCase();
316
+ }
317
+ case 'NOT_CONTAINS': {
318
+ return !strValue.includes(rule.value);
319
+ }
320
+ case 'NOT_CONTAINS_CI': {
321
+ return !strValue.toLowerCase().includes(rule.value.toLowerCase());
322
+ }
323
+ case 'NOT_EQUALS': {
324
+ return strValue !== rule.value;
325
+ }
326
+ case 'NOT_EQUALS_CI': {
327
+ return strValue.toLowerCase() !== rule.value.toLowerCase();
328
+ }
329
+ case 'REGEX': {
330
+ try {
331
+ const regex = new RegExp(rule.value);
332
+ return regex.test(strValue);
333
+ }
334
+ catch (error) {
335
+ this._logger.error(`Invalid regex pattern: ${rule.value}`, error);
336
+ return false;
337
+ }
338
+ }
339
+ case 'STARTS_WITH': {
340
+ return strValue.startsWith(rule.value);
341
+ }
342
+ case 'STARTS_WITH_CI': {
343
+ return strValue.toLowerCase().startsWith(rule.value.toLowerCase());
344
+ }
345
+ default: {
346
+ this._logger.warn(`Unknown filter operator: ${rule.operator}`);
347
+ return true;
348
+ }
349
+ }
350
+ }
351
+ /**
352
+ * Check if a log record matches all filter rules
353
+ * @param log The log record to check
354
+ * @returns true if the log matches all filters (AND logic), false otherwise
355
+ */
356
+ matchesFilters(log) {
357
+ this._logger.debug(`Checking if log matches filters: ${this.filterRules.length}`);
358
+ this._logger.debug(`Filter rules: ${JSON.stringify(this.filterRules)}`);
359
+ this._logger.debug(`Log: ${JSON.stringify(log)}`);
360
+ // If no filters are set, all logs match
361
+ if (this.filterRules.length === 0) {
362
+ return true;
363
+ }
364
+ // All filters must match (AND logic)
365
+ return this.filterRules.every(rule => this.matchesFilter(log, rule));
366
+ }
367
+ /**
368
+ * Parse a filter string into a FilterRule object
369
+ * Supports formats:
370
+ * - "field OPERATOR value"
371
+ * - "OPERATOR value" (defaults to message field)
372
+ * @param filterStr The filter string to parse
373
+ * @returns A FilterRule object
374
+ */
375
+ parseFilter(filterStr) {
376
+ const validOperators = [
377
+ 'CONTAINS', 'CONTAINS_CI',
378
+ 'ENDS_WITH', 'ENDS_WITH_CI',
379
+ 'EQUALS', 'EQUALS_CI',
380
+ 'NOT_CONTAINS', 'NOT_CONTAINS_CI',
381
+ 'NOT_EQUALS', 'NOT_EQUALS_CI',
382
+ 'REGEX',
383
+ 'STARTS_WITH', 'STARTS_WITH_CI'
384
+ ];
385
+ // Sort operators by length (longest first) to match most specific operator first
386
+ const sortedOperators = [...validOperators].sort((a, b) => b.length - a.length);
387
+ // Try to find an operator in the filter string
388
+ let foundOperator = null;
389
+ let operatorIndex = -1;
390
+ for (const op of sortedOperators) {
391
+ const index = filterStr.indexOf(op);
392
+ if (index !== -1) {
393
+ foundOperator = op;
394
+ operatorIndex = index;
395
+ break;
396
+ }
397
+ }
398
+ if (!foundOperator) {
399
+ throw new Error(`Invalid filter format: "${filterStr}". ` +
400
+ `Must include one of the following operators: ${validOperators.join(', ')}`);
401
+ }
402
+ const beforeOperator = filterStr.slice(0, operatorIndex).trim();
403
+ const afterOperator = filterStr.slice(operatorIndex + foundOperator.length).trim();
404
+ // If there's text before the operator, use it as the field; otherwise default to "message"
405
+ const field = beforeOperator || 'message';
406
+ const value = afterOperator;
407
+ if (!value) {
408
+ throw new Error(`Invalid filter format: "${filterStr}". ` +
409
+ `Value after operator "${foundOperator}" cannot be empty.`);
410
+ }
411
+ return {
412
+ field,
413
+ operator: foundOperator,
414
+ value
415
+ };
416
+ }
417
+ }
418
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/log/index.ts"],"names":[],"mappings":"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"}
@@ -42,8 +42,8 @@ export class AuthenticatedCommand extends Command {
42
42
  this.args = args;
43
43
  // const wrapper:CredentialWrapper = new CredentialWrapper();
44
44
  // const credential:Creds = await (flags.auth ? wrapper.getStoredCredentialsByAlias(flags.auth) : wrapper.getStoredCredentialsByAlias( 'fluent-default'));
45
- const credentialArgs = { "_": "get-credentials", auth: flags.auth || "fluent-default" };
46
- const credential = await getCredentials(credentialArgs);
45
+ // const credentialArgs = {"_": "get-credentials", auth: flags.auth || "fluent-default"};
46
+ const credential = await getCredentials(flags.auth || "fluent-default");
47
47
  this.authLogger.debug("Credentials Received: ", credential);
48
48
  if (credential) {
49
49
  const snSettings = {
@@ -1 +1 @@
1
- {"version":3,"file":"authenticated-command.js","sourceRoot":"","sources":["../../src/common/authenticated-command.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAc,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAA8B,MAAM,4BAA4B,CAAC;AAOpG,MAAM,OAAgB,oBAA+C,SAAQ,OAAO;IACpF,kFAAkF;IAChF,MAAM,CAAC,SAAS,GAAG;QACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC;QACrF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU;YAC7D,OAAO,EAAE,4BAA4B;SAEtC,CAAC,EAAE;KACL,CAAA;IAEC,sBAAsB;IACtB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IAElB,IAAI,CAAW;IACf,UAAU,GAAU,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvD,KAAK,CAAY;IAGjB,QAAQ,CAAqB;IAE/B,KAAK,CAAC,KAAK,CAAC,GAAgC;QACpD,yDAAyD;QACzD,mDAAmD;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAElE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,CAAoB;QAC1C,8EAA8E;QAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,SAAS,EAAG,KAAK,CAAC,IAAoC,CAAC,SAAS;YAChE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc;YACxC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;SACzB,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,GAAG,KAAiB,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAe,CAAA;QAG3B,6DAA6D;QAC7D,0JAA0J;QAC1J,MAAM,cAAc,GAAG,EAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,gBAAgB,EAAC,CAAC;QAEtF,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAG,UAAU,EAAC,CAAC;YACZ,MAAM,UAAU,GAA8B;gBACzC,KAAK,EAAE,KAAK,CAAC,IAAI;gBAClB,UAAU;aACZ,CAAA;YACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,6DAA6D,EAAE,UAAU,CAAC,CAAC;YACjG,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC;aAAI,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,wDAAwD,EAAE,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC,CAAC;QAC1H,CAAC;IAEH,CAAC"}
1
+ {"version":3,"file":"authenticated-command.js","sourceRoot":"","sources":["../../src/common/authenticated-command.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAc,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAA8B,MAAM,4BAA4B,CAAC;AAOpG,MAAM,OAAgB,oBAA+C,SAAQ,OAAO;IACpF,kFAAkF;IAChF,MAAM,CAAC,SAAS,GAAG;QACjB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC;QACrF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU;YAC7D,OAAO,EAAE,4BAA4B;SAEtC,CAAC,EAAE;KACL,CAAA;IAEC,sBAAsB;IACtB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAA;IAElB,IAAI,CAAW;IACf,UAAU,GAAU,IAAI,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvD,KAAK,CAAY;IAGjB,QAAQ,CAAqB;IAE/B,KAAK,CAAC,KAAK,CAAC,GAAgC;QACpD,yDAAyD;QACzD,mDAAmD;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAElE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAES,KAAK,CAAC,OAAO,CAAC,CAAoB;QAC1C,8EAA8E;QAC9E,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,SAAS,EAAG,KAAK,CAAC,IAAoC,CAAC,SAAS;YAChE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc;YACxC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;YACtB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;SACzB,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,GAAG,KAAiB,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAe,CAAA;QAG3B,6DAA6D;QAC7D,0JAA0J;QAC1J,yFAAyF;QAEzF,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,IAAI,gBAAgB,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAG,UAAU,EAAC,CAAC;YACZ,MAAM,UAAU,GAA8B;gBACzC,KAAK,EAAE,KAAK,CAAC,IAAI;gBAClB,UAAU;aACZ,CAAA;YACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,6DAA6D,EAAE,UAAU,CAAC,CAAC;YACjG,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC;aAAI,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,wDAAwD,EAAE,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAC,CAAC,CAAC;QAC1H,CAAC;IAEH,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface ScopeInfo {
2
+ name: string;
3
+ scope: string;
4
+ }
5
+ /**
6
+ * Query ServiceNow for available scopes matching a prefix
7
+ * @param authAlias - Authentication alias to use
8
+ * @param prefix - Prefix to filter scopes by
9
+ * @returns Promise resolving to array of scope names
10
+ */
11
+ export declare function queryScopes(authAlias: string | undefined, prefix?: string): Promise<string[]>;
12
+ /**
13
+ * Get cached scopes or query if needed
14
+ * This provides a simple caching mechanism to speed up autocomplete
15
+ * @param authAlias - Authentication alias to use
16
+ * @param prefix - Prefix to filter scopes by
17
+ * @returns Promise resolving to array of scope names
18
+ */
19
+ export declare function getCachedScopes(authAlias: string | undefined, prefix?: string): Promise<string[]>;
20
+ //# sourceMappingURL=scope-autocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-autocomplete.d.ts","sourceRoot":"","sources":["../../src/common/scope-autocomplete.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AA6BD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsDvG;AAQD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY3G"}
@@ -0,0 +1,94 @@
1
+ /* eslint-disable camelcase */
2
+ import { getCredentials } from "@servicenow/sdk-cli/dist/auth/index.js";
3
+ import { ServiceNowInstance } from '@sonisoft/now-sdk-ext-core';
4
+ /**
5
+ * Get authorization header based on credential type
6
+ * @param credential - ServiceNow credential object
7
+ * @param username - Username for basic auth
8
+ * @returns Authorization header string
9
+ */
10
+ function getAuthHeader(credential, username) {
11
+ if (credential.type === 'basic' && 'password' in credential) {
12
+ return `Basic ${Buffer.from(`${username}:${credential.password}`).toString('base64')}`;
13
+ }
14
+ if (credential.type === 'oauth' && 'access_token' in credential) {
15
+ return `Bearer ${credential.access_token}`;
16
+ }
17
+ throw new Error('Unsupported authentication type');
18
+ }
19
+ /**
20
+ * Query ServiceNow for available scopes matching a prefix
21
+ * @param authAlias - Authentication alias to use
22
+ * @param prefix - Prefix to filter scopes by
23
+ * @returns Promise resolving to array of scope names
24
+ */
25
+ export async function queryScopes(authAlias, prefix = '') {
26
+ try {
27
+ // Get credentials
28
+ const credential = await getCredentials(authAlias || "fluent-default");
29
+ if (!credential) {
30
+ return [];
31
+ }
32
+ // Create ServiceNow instance
33
+ const snSettings = {
34
+ alias: authAlias,
35
+ credential
36
+ };
37
+ const instance = new ServiceNowInstance(snSettings);
38
+ // Query sys_scope table via REST API
39
+ const url = `${instance.getHost()}/api/now/table/sys_scope`;
40
+ const params = new URLSearchParams({
41
+ sysparm_fields: 'scope,name',
42
+ sysparm_limit: '50',
43
+ sysparm_query: prefix ? `scopeSTARTSWITH${prefix}^ORnameSTARTSWITH${prefix}` : ''
44
+ });
45
+ const response = await fetch(`${url}?${params.toString()}`, {
46
+ headers: {
47
+ 'Accept': 'application/json',
48
+ 'Authorization': getAuthHeader(credential, instance.getUserName()),
49
+ 'Content-Type': 'application/json'
50
+ },
51
+ method: 'GET'
52
+ });
53
+ if (!response.ok) {
54
+ return [];
55
+ }
56
+ const data = await response.json();
57
+ const scopes = [];
58
+ if (data.result && Array.isArray(data.result)) {
59
+ for (const record of data.result) {
60
+ if (record.scope) {
61
+ scopes.push(record.scope);
62
+ }
63
+ }
64
+ }
65
+ return scopes;
66
+ }
67
+ catch {
68
+ // Silently fail for autocomplete
69
+ return [];
70
+ }
71
+ }
72
+ /**
73
+ * Cache for storing scope query results
74
+ */
75
+ const scopeCache = new Map();
76
+ const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
77
+ /**
78
+ * Get cached scopes or query if needed
79
+ * This provides a simple caching mechanism to speed up autocomplete
80
+ * @param authAlias - Authentication alias to use
81
+ * @param prefix - Prefix to filter scopes by
82
+ * @returns Promise resolving to array of scope names
83
+ */
84
+ export async function getCachedScopes(authAlias, prefix = '') {
85
+ const cacheKey = `${authAlias || 'default'}:${prefix}`;
86
+ const cached = scopeCache.get(cacheKey);
87
+ if (cached && (Date.now() - cached.timestamp) < CACHE_TTL) {
88
+ return cached.scopes;
89
+ }
90
+ const scopes = await queryScopes(authAlias, prefix);
91
+ scopeCache.set(cacheKey, { scopes, timestamp: Date.now() });
92
+ return scopes;
93
+ }
94
+ //# sourceMappingURL=scope-autocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-autocomplete.js","sourceRoot":"","sources":["../../src/common/scope-autocomplete.ts"],"names":[],"mappings":"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"}