@mcp-consultant-tools/log-analytics 28.0.0 → 29.0.0-beta.1

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 (73) hide show
  1. package/build/cli/commands/function-commands.d.ts +7 -0
  2. package/build/cli/commands/function-commands.d.ts.map +1 -0
  3. package/build/cli/commands/function-commands.js +120 -0
  4. package/build/cli/commands/function-commands.js.map +1 -0
  5. package/build/cli/commands/index.d.ts +10 -0
  6. package/build/cli/commands/index.d.ts.map +1 -0
  7. package/build/cli/commands/index.js +15 -0
  8. package/build/cli/commands/index.js.map +1 -0
  9. package/build/cli/commands/query-commands.d.ts +7 -0
  10. package/build/cli/commands/query-commands.d.ts.map +1 -0
  11. package/build/cli/commands/query-commands.js +486 -0
  12. package/build/cli/commands/query-commands.js.map +1 -0
  13. package/build/cli/commands/workspace-commands.d.ts +7 -0
  14. package/build/cli/commands/workspace-commands.d.ts.map +1 -0
  15. package/build/cli/commands/workspace-commands.js +47 -0
  16. package/build/cli/commands/workspace-commands.js.map +1 -0
  17. package/build/cli/output.d.ts +11 -0
  18. package/build/cli/output.d.ts.map +1 -0
  19. package/build/cli/output.js +10 -0
  20. package/build/cli/output.js.map +1 -0
  21. package/build/cli.d.ts +9 -0
  22. package/build/cli.d.ts.map +1 -0
  23. package/build/cli.js +27 -0
  24. package/build/cli.js.map +1 -0
  25. package/build/context-factory.d.ts +4 -0
  26. package/build/context-factory.d.ts.map +1 -0
  27. package/build/context-factory.js +45 -0
  28. package/build/context-factory.js.map +1 -0
  29. package/build/index.d.ts +14 -2
  30. package/build/index.d.ts.map +1 -1
  31. package/build/index.js +35 -1121
  32. package/build/index.js.map +1 -1
  33. package/build/prompts/index.d.ts +7 -0
  34. package/build/prompts/index.d.ts.map +1 -0
  35. package/build/prompts/index.js +6 -0
  36. package/build/prompts/index.js.map +1 -0
  37. package/build/prompts/templates.d.ts +3 -0
  38. package/build/prompts/templates.d.ts.map +1 -0
  39. package/build/prompts/templates.js +195 -0
  40. package/build/prompts/templates.js.map +1 -0
  41. package/build/services/index.d.ts +3 -0
  42. package/build/services/index.d.ts.map +1 -0
  43. package/build/services/index.js +2 -0
  44. package/build/services/index.js.map +1 -0
  45. package/build/services/log-analytics-service.d.ts +117 -0
  46. package/build/services/log-analytics-service.d.ts.map +1 -0
  47. package/build/services/log-analytics-service.js +419 -0
  48. package/build/services/log-analytics-service.js.map +1 -0
  49. package/build/tool-examples.d.ts +1 -8
  50. package/build/tool-examples.d.ts.map +1 -1
  51. package/build/tool-examples.js +1 -12
  52. package/build/tool-examples.js.map +1 -1
  53. package/build/tools/function-tools.d.ts +3 -0
  54. package/build/tools/function-tools.d.ts.map +1 -0
  55. package/build/tools/function-tools.js +536 -0
  56. package/build/tools/function-tools.js.map +1 -0
  57. package/build/tools/index.d.ts +9 -0
  58. package/build/tools/index.d.ts.map +1 -0
  59. package/build/tools/index.js +12 -0
  60. package/build/tools/index.js.map +1 -0
  61. package/build/tools/query-tools.d.ts +3 -0
  62. package/build/tools/query-tools.d.ts.map +1 -0
  63. package/build/tools/query-tools.js +105 -0
  64. package/build/tools/query-tools.js.map +1 -0
  65. package/build/tools/workspace-tools.d.ts +3 -0
  66. package/build/tools/workspace-tools.d.ts.map +1 -0
  67. package/build/tools/workspace-tools.js +53 -0
  68. package/build/tools/workspace-tools.js.map +1 -0
  69. package/build/types.d.ts +9 -0
  70. package/build/types.d.ts.map +1 -0
  71. package/build/types.js +2 -0
  72. package/build/types.js.map +1 -0
  73. package/package.json +5 -3
@@ -0,0 +1,486 @@
1
+ /**
2
+ * Query CLI Commands - 6 commands for KQL queries, log search, and investigation
3
+ */
4
+ import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
5
+ import { outputResult } from '../output.js';
6
+ import { formatTableAsMarkdown, filterColumns, resolveColumnPreset, } from '../../utils/loganalytics-formatters.js';
7
+ export function registerQueryCommands(program, ctx) {
8
+ const query = program.command('query').description('KQL query and log search operations');
9
+ query
10
+ .command('execute')
11
+ .description('Execute a custom KQL query against Log Analytics workspace')
12
+ .argument('<resourceId>', 'Resource ID')
13
+ .argument('<kql>', 'KQL query string')
14
+ .option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
15
+ .option('-p, --preset <preset>', 'Column preset: minimal, investigation, full')
16
+ .option('-c, --columns <columns>', 'Custom columns (comma-separated)')
17
+ .option('-f, --format <format>', 'Output format: json, markdown', 'json')
18
+ .action(async (resourceId, kql, opts) => {
19
+ try {
20
+ const result = await ctx.logAnalytics.executeQuery(resourceId, kql, opts.timespan);
21
+ // Apply column filtering
22
+ const columns = opts.columns ? opts.columns.split(',').map((c) => c.trim()) : undefined;
23
+ const columnsToInclude = resolveColumnPreset(opts.preset, columns);
24
+ const filteredTables = result.tables.map((t) => filterColumns(t, columnsToInclude));
25
+ const filteredResult = { ...result, tables: filteredTables };
26
+ // Format output
27
+ let data = filteredResult;
28
+ if (opts.format === 'markdown' && filteredTables.length > 0) {
29
+ data = filteredTables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
30
+ }
31
+ const rowCount = filteredTables.reduce((acc, t) => acc + (t.rows?.length || 0), 0);
32
+ outputResult({ fileName: `query-${resourceId}`, data, summary: `Query returned ${rowCount} row(s)` }, getGlobalFlags(program));
33
+ }
34
+ catch (error) {
35
+ handleCliError(error, 'execute query');
36
+ }
37
+ });
38
+ query
39
+ .command('recent')
40
+ .description('Get recent events from a specific Log Analytics table')
41
+ .argument('<resourceId>', 'Resource ID')
42
+ .argument('<tableName>', 'Table name (e.g., AppTraces, AppExceptions, FunctionAppLogs)')
43
+ .option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
44
+ .option('-l, --limit <n>', 'Maximum results', '100')
45
+ .option('-p, --preset <preset>', 'Column preset: minimal, investigation, full')
46
+ .option('-c, --columns <columns>', 'Custom columns (comma-separated)')
47
+ .option('-f, --format <format>', 'Output format: json, markdown', 'json')
48
+ .action(async (resourceId, tableName, opts) => {
49
+ try {
50
+ const result = await ctx.logAnalytics.getRecentEvents(resourceId, tableName, opts.timespan, parseInt(opts.limit));
51
+ const columns = opts.columns ? opts.columns.split(',').map((c) => c.trim()) : undefined;
52
+ const columnsToInclude = resolveColumnPreset(opts.preset, columns);
53
+ const filteredTables = result.tables.map((t) => filterColumns(t, columnsToInclude));
54
+ const filteredResult = { ...result, tables: filteredTables };
55
+ let data = filteredResult;
56
+ if (opts.format === 'markdown' && filteredTables.length > 0) {
57
+ data = filteredTables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
58
+ }
59
+ const rowCount = filteredTables.reduce((acc, t) => acc + (t.rows?.length || 0), 0);
60
+ outputResult({ fileName: `recent-${resourceId}-${tableName}`, data, summary: `Found ${rowCount} recent event(s) in ${tableName}` }, getGlobalFlags(program));
61
+ }
62
+ catch (error) {
63
+ handleCliError(error, 'get recent events');
64
+ }
65
+ });
66
+ query
67
+ .command('search')
68
+ .description('Search logs by text content across tables or a specific table')
69
+ .argument('<resourceId>', 'Resource ID')
70
+ .argument('<searchText>', 'Text to search for (case-insensitive)')
71
+ .option('--table <tableName>', 'Table name to search in (searches all if not specified)')
72
+ .option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
73
+ .option('-l, --limit <n>', 'Maximum results', '100')
74
+ .option('-p, --preset <preset>', 'Column preset: minimal, investigation, full')
75
+ .option('-c, --columns <columns>', 'Custom columns (comma-separated)')
76
+ .option('-f, --format <format>', 'Output format: json, markdown', 'json')
77
+ .action(async (resourceId, searchText, opts) => {
78
+ try {
79
+ const result = await ctx.logAnalytics.searchLogs(resourceId, searchText, opts.table, opts.timespan, parseInt(opts.limit));
80
+ const columns = opts.columns ? opts.columns.split(',').map((c) => c.trim()) : undefined;
81
+ const columnsToInclude = resolveColumnPreset(opts.preset, columns);
82
+ const filteredTables = result.tables.map((t) => filterColumns(t, columnsToInclude));
83
+ const filteredResult = { ...result, tables: filteredTables };
84
+ let data = filteredResult;
85
+ if (opts.format === 'markdown' && filteredTables.length > 0) {
86
+ data = filteredTables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
87
+ }
88
+ const rowCount = filteredTables.reduce((acc, t) => acc + (t.rows?.length || 0), 0);
89
+ outputResult({ fileName: `search-${resourceId}-${searchText.replace(/\s+/g, '-')}`, data, summary: `Found ${rowCount} result(s) matching '${searchText}'` }, getGlobalFlags(program));
90
+ }
91
+ catch (error) {
92
+ handleCliError(error, 'search logs');
93
+ }
94
+ });
95
+ query
96
+ .command('error-summary')
97
+ .description('Get aggregated error summary by type - ideal for starting investigations')
98
+ .argument('<resourceId>', 'Resource ID')
99
+ .option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
100
+ .option('--table <tableName>', 'Table to analyze: AppExceptions, AppTraces, FunctionAppLogs', 'AppExceptions')
101
+ .option('--min-count <n>', 'Minimum error count to include', '1')
102
+ .option('--no-deduplicate', 'Disable retry deduplication (grouped by OperationId by default)')
103
+ .option('-f, --format <format>', 'Output format: json, markdown', 'markdown')
104
+ .action(async (resourceId, opts) => {
105
+ try {
106
+ const table = opts.table || 'AppExceptions';
107
+ const timespanValue = opts.timespan || 'PT1H';
108
+ const minCountValue = parseInt(opts.minCount) || 1;
109
+ const dedupe = opts.deduplicate !== false;
110
+ let kql;
111
+ if (table === 'AppExceptions') {
112
+ if (dedupe) {
113
+ kql = `
114
+ AppExceptions
115
+ | summarize
116
+ RetryCount = count(),
117
+ FirstSeen = min(TimeGenerated),
118
+ LastSeen = max(TimeGenerated),
119
+ SampleMessage = take_any(OuterMessage)
120
+ by OperationId, ExceptionType, AppRoleName
121
+ | summarize
122
+ UniqueErrors = count(),
123
+ TotalRetries = sum(RetryCount),
124
+ FirstSeen = min(FirstSeen),
125
+ LastSeen = max(LastSeen),
126
+ SampleMessage = take_any(SampleMessage)
127
+ by ExceptionType, AppRoleName
128
+ | where UniqueErrors >= ${minCountValue}
129
+ | order by UniqueErrors desc
130
+ `;
131
+ }
132
+ else {
133
+ kql = `
134
+ AppExceptions
135
+ | summarize
136
+ Count = count(),
137
+ FirstSeen = min(TimeGenerated),
138
+ LastSeen = max(TimeGenerated),
139
+ SampleMessage = take_any(OuterMessage)
140
+ by ExceptionType, AppRoleName
141
+ | where Count >= ${minCountValue}
142
+ | order by Count desc
143
+ `;
144
+ }
145
+ }
146
+ else if (table === 'AppTraces') {
147
+ if (dedupe) {
148
+ kql = `
149
+ AppTraces
150
+ | where SeverityLevel >= 3
151
+ | summarize
152
+ RetryCount = count(),
153
+ FirstSeen = min(TimeGenerated),
154
+ LastSeen = max(TimeGenerated),
155
+ SampleMessage = take_any(Message)
156
+ by OperationId, AppRoleName, SeverityLevel
157
+ | summarize
158
+ UniqueErrors = count(),
159
+ TotalRetries = sum(RetryCount),
160
+ FirstSeen = min(FirstSeen),
161
+ LastSeen = max(LastSeen),
162
+ SampleMessage = take_any(SampleMessage)
163
+ by AppRoleName, SeverityLevel
164
+ | where UniqueErrors >= ${minCountValue}
165
+ | order by UniqueErrors desc
166
+ `;
167
+ }
168
+ else {
169
+ kql = `
170
+ AppTraces
171
+ | where SeverityLevel >= 3
172
+ | summarize
173
+ Count = count(),
174
+ FirstSeen = min(TimeGenerated),
175
+ LastSeen = max(TimeGenerated),
176
+ SampleMessage = take_any(Message)
177
+ by AppRoleName, SeverityLevel
178
+ | where Count >= ${minCountValue}
179
+ | order by Count desc
180
+ `;
181
+ }
182
+ }
183
+ else {
184
+ if (dedupe) {
185
+ kql = `
186
+ FunctionAppLogs
187
+ | where ExceptionDetails != ''
188
+ | summarize
189
+ RetryCount = count(),
190
+ FirstSeen = min(TimeGenerated),
191
+ LastSeen = max(TimeGenerated),
192
+ SampleMessage = take_any(Message)
193
+ by InvocationId, FunctionName
194
+ | summarize
195
+ UniqueErrors = count(),
196
+ TotalRetries = sum(RetryCount),
197
+ FirstSeen = min(FirstSeen),
198
+ LastSeen = max(LastSeen),
199
+ SampleMessage = take_any(SampleMessage)
200
+ by FunctionName
201
+ | where UniqueErrors >= ${minCountValue}
202
+ | order by UniqueErrors desc
203
+ `;
204
+ }
205
+ else {
206
+ kql = `
207
+ FunctionAppLogs
208
+ | where ExceptionDetails != ''
209
+ | summarize
210
+ Count = count(),
211
+ FirstSeen = min(TimeGenerated),
212
+ LastSeen = max(TimeGenerated),
213
+ SampleMessage = take_any(Message)
214
+ by FunctionName
215
+ | where Count >= ${minCountValue}
216
+ | order by Count desc
217
+ `;
218
+ }
219
+ }
220
+ const result = await ctx.logAnalytics.executeQuery(resourceId, kql, timespanValue);
221
+ const format = opts.format || 'markdown';
222
+ let data = result;
223
+ if (format === 'markdown' && result.tables && result.tables.length > 0) {
224
+ const dedupeNote = dedupe ? ' (deduplicated by OperationId)' : '';
225
+ data = `## Error Summary (${table})${dedupeNote}\n\n**Time range:** ${timespanValue}\n\n` +
226
+ result.tables.map((t) => formatTableAsMarkdown(t)).join('\n\n');
227
+ }
228
+ const rowCount = result.tables?.reduce((acc, t) => acc + (t.rows?.length || 0), 0) || 0;
229
+ outputResult({ fileName: `error-summary-${resourceId}`, data, summary: `Error summary: ${rowCount} error type(s) found in ${table}` }, getGlobalFlags(program));
230
+ }
231
+ catch (error) {
232
+ handleCliError(error, 'get error summary');
233
+ }
234
+ });
235
+ query
236
+ .command('investigate-app')
237
+ .description('Combined investigation: exceptions + traces + recent errors (deduplicated)')
238
+ .argument('<resourceId>', 'Resource ID')
239
+ .option('--app-name <pattern>', 'Filter by app name (searches AppRoleName, partial match)')
240
+ .option('-t, --timespan <timespan>', 'Time range (e.g., PT1H, P1D)', 'PT1H')
241
+ .option('--no-details', 'Exclude recent error details')
242
+ .option('--details-limit <n>', 'Max recent errors to include', '20')
243
+ .option('--no-deduplicate', 'Disable retry deduplication (grouped by OperationId by default)')
244
+ .action(async (resourceId, opts) => {
245
+ try {
246
+ const timespanValue = opts.timespan || 'PT1H';
247
+ const showDetails = opts.details !== false;
248
+ const limit = parseInt(opts.detailsLimit) || 20;
249
+ const dedupe = opts.deduplicate !== false;
250
+ const appNamePattern = opts.appName;
251
+ const appFilter = appNamePattern
252
+ ? `| where AppRoleName contains "${appNamePattern}"`
253
+ : '';
254
+ const exceptionSummaryQuery = dedupe ? `
255
+ AppExceptions
256
+ ${appFilter}
257
+ | summarize
258
+ RetryCount = count(),
259
+ FirstSeen = min(TimeGenerated),
260
+ LastSeen = max(TimeGenerated)
261
+ by OperationId, ExceptionType, AppRoleName
262
+ | summarize
263
+ UniqueErrors = count(),
264
+ TotalRetries = sum(RetryCount),
265
+ FirstSeen = min(FirstSeen),
266
+ LastSeen = max(LastSeen)
267
+ by ExceptionType, AppRoleName
268
+ | order by UniqueErrors desc
269
+ | take 20
270
+ ` : `
271
+ AppExceptions
272
+ ${appFilter}
273
+ | summarize
274
+ Count = count(),
275
+ FirstSeen = min(TimeGenerated),
276
+ LastSeen = max(TimeGenerated)
277
+ by ExceptionType, AppRoleName
278
+ | order by Count desc
279
+ | take 20
280
+ `;
281
+ const traceSeverityQuery = dedupe ? `
282
+ AppTraces
283
+ ${appFilter}
284
+ | summarize RetryCount = count() by OperationId, SeverityLevel, AppRoleName
285
+ | summarize UniqueTraces = count(), TotalCount = sum(RetryCount) by SeverityLevel, AppRoleName
286
+ | order by SeverityLevel desc
287
+ ` : `
288
+ AppTraces
289
+ ${appFilter}
290
+ | summarize Count = count() by SeverityLevel, AppRoleName
291
+ | order by SeverityLevel desc
292
+ `;
293
+ const recentErrorsQuery = showDetails ? (dedupe ? `
294
+ AppExceptions
295
+ ${appFilter}
296
+ | summarize
297
+ TimeGenerated = max(TimeGenerated),
298
+ RetryCount = count(),
299
+ OuterMessage = take_any(OuterMessage)
300
+ by OperationId, AppRoleName, ExceptionType
301
+ | project TimeGenerated, AppRoleName, ExceptionType, OuterMessage, RetryCount
302
+ | order by TimeGenerated desc
303
+ | take ${limit}
304
+ ` : `
305
+ AppExceptions
306
+ ${appFilter}
307
+ | project TimeGenerated, AppRoleName, ExceptionType, OuterMessage
308
+ | order by TimeGenerated desc
309
+ | take ${limit}
310
+ `) : null;
311
+ const [exceptionSummary, traceSeverity, recentErrors] = await Promise.all([
312
+ ctx.logAnalytics.executeQuery(resourceId, exceptionSummaryQuery, timespanValue),
313
+ ctx.logAnalytics.executeQuery(resourceId, traceSeverityQuery, timespanValue),
314
+ recentErrorsQuery ? ctx.logAnalytics.executeQuery(resourceId, recentErrorsQuery, timespanValue) : null,
315
+ ]);
316
+ let markdown = `# App Investigation Report\n\n`;
317
+ markdown += `**Filter:** ${appNamePattern || '(all apps)'}\n`;
318
+ markdown += `**Time range:** ${timespanValue}\n`;
319
+ markdown += dedupe ? `**Deduplication:** enabled (grouped by OperationId)\n\n` : '\n';
320
+ markdown += `## Exception Summary\n\n`;
321
+ if (exceptionSummary.tables && exceptionSummary.tables.length > 0 && exceptionSummary.tables[0].rows.length > 0) {
322
+ markdown += formatTableAsMarkdown(exceptionSummary.tables[0]);
323
+ }
324
+ else {
325
+ markdown += '*No exceptions found*';
326
+ }
327
+ markdown += '\n\n';
328
+ markdown += `## Trace Severity Distribution\n\n`;
329
+ if (traceSeverity.tables && traceSeverity.tables.length > 0 && traceSeverity.tables[0].rows.length > 0) {
330
+ markdown += formatTableAsMarkdown(traceSeverity.tables[0]);
331
+ }
332
+ else {
333
+ markdown += '*No traces found*';
334
+ }
335
+ markdown += '\n\n';
336
+ if (showDetails && recentErrors) {
337
+ markdown += `## Recent Errors (${limit} max)\n\n`;
338
+ if (recentErrors.tables && recentErrors.tables.length > 0 && recentErrors.tables[0].rows.length > 0) {
339
+ markdown += formatTableAsMarkdown(recentErrors.tables[0]);
340
+ }
341
+ else {
342
+ markdown += '*No recent errors*';
343
+ }
344
+ }
345
+ outputResult({ fileName: `investigate-app-${resourceId}`, data: markdown, summary: `App investigation report for '${appNamePattern || 'all apps'}' (${timespanValue})` }, getGlobalFlags(program));
346
+ }
347
+ catch (error) {
348
+ handleCliError(error, 'investigate app');
349
+ }
350
+ });
351
+ query
352
+ .command('investigate-sync')
353
+ .description('Investigate SmartConnectorCloud (SCC) sync failures. Auto-derives sync app from workspace ID.')
354
+ .argument('<resourceId>', 'Resource ID (e.g., log-dev-rtpi-uks-01)')
355
+ .option('-t, --timespan <timespan>', 'Time range (default: PT8H - typical work day)', 'PT8H')
356
+ .option('--no-details', 'Exclude recent error details')
357
+ .option('--details-limit <n>', 'Max recent errors to include', '10')
358
+ .action(async (resourceId, opts) => {
359
+ try {
360
+ const timespanValue = opts.timespan || 'PT8H';
361
+ const showDetails = opts.details !== false;
362
+ const limit = parseInt(opts.detailsLimit) || 10;
363
+ const match = resourceId.match(/^log-([^-]+)-([^-]+)/);
364
+ if (!match) {
365
+ console.error(`Could not parse environment/client from resourceId '${resourceId}'. Expected format: log-{environment}-{client}-...`);
366
+ process.exit(1);
367
+ }
368
+ const environment = match[1];
369
+ const client = match[2];
370
+ const syncAppPattern = `func-${environment}-${client}-sc-sync`;
371
+ const errorsByFunctionQuery = `
372
+ AppExceptions
373
+ | where AppRoleName contains "${syncAppPattern}"
374
+ | extend FunctionName = tostring(Properties.AzureFunctions_FunctionName)
375
+ | summarize
376
+ RetryCount = count(),
377
+ FirstSeen = min(TimeGenerated),
378
+ LastSeen = max(TimeGenerated),
379
+ SampleMessage = take_any(OuterMessage)
380
+ by OperationId, FunctionName, ExceptionType
381
+ | summarize
382
+ UniqueErrors = count(),
383
+ TotalRetries = sum(RetryCount),
384
+ FirstSeen = min(FirstSeen),
385
+ LastSeen = max(LastSeen),
386
+ SampleMessage = take_any(SampleMessage)
387
+ by FunctionName, ExceptionType
388
+ | order by UniqueErrors desc
389
+ `;
390
+ const errorCategoryQuery = `
391
+ AppExceptions
392
+ | where AppRoleName contains "${syncAppPattern}"
393
+ | extend ErrorCategory = case(
394
+ ExceptionType contains "FaultException" or ExceptionType contains "OrganizationService", "Dataverse",
395
+ ExceptionType contains "ServiceBus", "ServiceBus",
396
+ ExceptionType contains "Sql", "Database",
397
+ ExceptionType contains "Timeout", "Timeout",
398
+ ExceptionType contains "Socket" or ExceptionType contains "Http", "Network",
399
+ "Other"
400
+ )
401
+ | summarize
402
+ RetryCount = count(),
403
+ UniqueOps = dcount(OperationId)
404
+ by ErrorCategory
405
+ | order by UniqueOps desc
406
+ `;
407
+ const recentErrorsQuery = showDetails ? `
408
+ AppExceptions
409
+ | where AppRoleName contains "${syncAppPattern}"
410
+ | extend FunctionName = tostring(Properties.AzureFunctions_FunctionName)
411
+ | summarize
412
+ TimeGenerated = max(TimeGenerated),
413
+ RetryCount = count(),
414
+ OuterMessage = take_any(OuterMessage)
415
+ by OperationId, FunctionName, ExceptionType
416
+ | project TimeGenerated, FunctionName, ExceptionType, OuterMessage, RetryCount
417
+ | order by TimeGenerated desc
418
+ | take ${limit}
419
+ ` : null;
420
+ const errorTracesQuery = `
421
+ AppTraces
422
+ | where AppRoleName contains "${syncAppPattern}"
423
+ | where SeverityLevel >= 3
424
+ | summarize
425
+ RetryCount = count()
426
+ by OperationId, Message
427
+ | summarize
428
+ UniqueErrors = count(),
429
+ TotalCount = sum(RetryCount)
430
+ by Message
431
+ | order by UniqueErrors desc
432
+ | take 10
433
+ `;
434
+ const [errorsByFunction, errorCategory, recentErrors, errorTraces] = await Promise.all([
435
+ ctx.logAnalytics.executeQuery(resourceId, errorsByFunctionQuery, timespanValue),
436
+ ctx.logAnalytics.executeQuery(resourceId, errorCategoryQuery, timespanValue),
437
+ recentErrorsQuery ? ctx.logAnalytics.executeQuery(resourceId, recentErrorsQuery, timespanValue) : null,
438
+ ctx.logAnalytics.executeQuery(resourceId, errorTracesQuery, timespanValue),
439
+ ]);
440
+ let markdown = `# SmartConnector Sync Investigation\n\n`;
441
+ markdown += `**Environment:** ${environment}\n`;
442
+ markdown += `**Client:** ${client}\n`;
443
+ markdown += `**Sync App:** ${syncAppPattern}-*\n`;
444
+ markdown += `**Time range:** ${timespanValue}\n`;
445
+ markdown += `**Deduplication:** enabled (grouped by OperationId)\n\n`;
446
+ markdown += `## Error Categories\n\n`;
447
+ if (errorCategory.tables?.[0]?.rows?.length > 0) {
448
+ markdown += formatTableAsMarkdown(errorCategory.tables[0]);
449
+ }
450
+ else {
451
+ markdown += '*No errors found*';
452
+ }
453
+ markdown += '\n\n';
454
+ markdown += `## Errors by Sync Operation\n\n`;
455
+ if (errorsByFunction.tables?.[0]?.rows?.length > 0) {
456
+ markdown += formatTableAsMarkdown(errorsByFunction.tables[0]);
457
+ }
458
+ else {
459
+ markdown += '*No errors found*';
460
+ }
461
+ markdown += '\n\n';
462
+ markdown += `## Error Traces (Severity 3+)\n\n`;
463
+ if (errorTraces.tables?.[0]?.rows?.length > 0) {
464
+ markdown += formatTableAsMarkdown(errorTraces.tables[0]);
465
+ }
466
+ else {
467
+ markdown += '*No error traces found*';
468
+ }
469
+ markdown += '\n\n';
470
+ if (showDetails && recentErrors) {
471
+ markdown += `## Recent Errors (${limit} max)\n\n`;
472
+ if (recentErrors.tables?.[0]?.rows?.length > 0) {
473
+ markdown += formatTableAsMarkdown(recentErrors.tables[0]);
474
+ }
475
+ else {
476
+ markdown += '*No recent errors*';
477
+ }
478
+ }
479
+ outputResult({ fileName: `investigate-sync-${resourceId}`, data: markdown, summary: `SCC sync investigation for ${syncAppPattern}-* (${timespanValue})` }, getGlobalFlags(program));
480
+ }
481
+ catch (error) {
482
+ handleCliError(error, 'investigate sync');
483
+ }
484
+ });
485
+ }
486
+ //# sourceMappingURL=query-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/query-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Workspace CLI Commands - 3 commands for workspace management
3
+ */
4
+ import type { Command } from 'commander';
5
+ import type { ServiceContext } from '../../context-factory.js';
6
+ export declare function registerWorkspaceCommands(program: Command, ctx: ServiceContext): void;
7
+ //# sourceMappingURL=workspace-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workspace-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CA2CrF"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Workspace CLI Commands - 3 commands for workspace management
3
+ */
4
+ import { getGlobalFlags, handleCliError } from '@mcp-consultant-tools/core';
5
+ import { outputResult } from '../output.js';
6
+ export function registerWorkspaceCommands(program, ctx) {
7
+ const workspace = program.command('workspace').description('Workspace operations');
8
+ workspace
9
+ .command('list')
10
+ .description('List all configured Log Analytics workspaces (active and inactive)')
11
+ .action(async () => {
12
+ try {
13
+ const resources = ctx.logAnalytics.getAllResources();
14
+ outputResult({ fileName: 'workspaces', data: resources, summary: `Found ${resources.length} configured workspace(s)` }, getGlobalFlags(program));
15
+ }
16
+ catch (error) {
17
+ handleCliError(error, 'list workspaces');
18
+ }
19
+ });
20
+ workspace
21
+ .command('metadata')
22
+ .description('Get schema metadata (tables and columns) for a workspace')
23
+ .argument('<resourceId>', 'Resource ID (use workspace list to find IDs)')
24
+ .action(async (resourceId) => {
25
+ try {
26
+ const metadata = await ctx.logAnalytics.getMetadata(resourceId);
27
+ outputResult({ fileName: `metadata-${resourceId}`, data: metadata, summary: `Metadata for workspace '${resourceId}'` }, getGlobalFlags(program));
28
+ }
29
+ catch (error) {
30
+ handleCliError(error, 'get metadata');
31
+ }
32
+ });
33
+ workspace
34
+ .command('test')
35
+ .description('Test access to a Log Analytics workspace')
36
+ .argument('<resourceId>', 'Resource ID')
37
+ .action(async (resourceId) => {
38
+ try {
39
+ const result = await ctx.logAnalytics.testWorkspaceAccess(resourceId);
40
+ outputResult({ fileName: `test-${resourceId}`, data: result, summary: result.success ? `Access OK: ${result.message}` : `Access FAILED: ${result.message}` }, getGlobalFlags(program));
41
+ }
42
+ catch (error) {
43
+ handleCliError(error, 'test access');
44
+ }
45
+ });
46
+ }
47
+ //# sourceMappingURL=workspace-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/workspace-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,UAAU,yBAAyB,CAAC,OAAgB,EAAE,GAAmB;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEnF,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;YACrD,YAAY,CACV,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,SAAS,CAAC,MAAM,0BAA0B,EAAE,EACzG,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CAAC,cAAc,EAAE,8CAA8C,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YAChE,YAAY,CACV,EAAE,QAAQ,EAAE,YAAY,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,UAAU,GAAG,EAAE,EACzG,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACtE,YAAY,CACV,EAAE,QAAQ,EAAE,QAAQ,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,kBAAkB,MAAM,CAAC,OAAO,EAAE,EAAE,EAC/I,cAAc,CAAC,OAAO,CAAC,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CLI output helper for log-analytics package.
3
+ * Thin wrapper setting the package-specific cache directory.
4
+ */
5
+ import { type GlobalFlags } from '@mcp-consultant-tools/core';
6
+ export declare function outputResult(opts: {
7
+ fileName: string;
8
+ data: unknown;
9
+ summary: string;
10
+ }, flags: GlobalFlags): void;
11
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIhG,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC1D,KAAK,EAAE,WAAW,GACjB,IAAI,CAEN"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI output helper for log-analytics package.
3
+ * Thin wrapper setting the package-specific cache directory.
4
+ */
5
+ import { outputResult as coreOutputResult } from '@mcp-consultant-tools/core';
6
+ const CACHE_DIR = '.mcp-loganalytics-cache';
7
+ export function outputResult(opts, flags) {
8
+ coreOutputResult({ ...opts, cacheDir: CACHE_DIR }, flags);
9
+ }
10
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAoB,MAAM,4BAA4B,CAAC;AAEhG,MAAM,SAAS,GAAG,yBAAyB,CAAC;AAE5C,MAAM,UAAU,YAAY,CAC1B,IAA0D,EAC1D,KAAkB;IAElB,gBAAgB,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC"}
package/build/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @mcp-consultant-tools/log-analytics CLI
4
+ *
5
+ * Command-line interface for Azure Log Analytics operations.
6
+ * Reuses the same ServiceContext and services as the MCP server.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/build/cli.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @mcp-consultant-tools/log-analytics CLI
4
+ *
5
+ * Command-line interface for Azure Log Analytics operations.
6
+ * Reuses the same ServiceContext and services as the MCP server.
7
+ */
8
+ import { createCliProgram, loadEnvForCli } from '@mcp-consultant-tools/core';
9
+ import { createServiceContext } from './context-factory.js';
10
+ import { registerAllCommands } from './cli/commands/index.js';
11
+ const program = createCliProgram({
12
+ name: 'mcp-loganalytics-cli',
13
+ description: 'Azure Log Analytics CLI - workspace queries and Azure Functions monitoring',
14
+ version: '27.0.0',
15
+ });
16
+ // Load env before parsing (--env-file handled by commander hook)
17
+ program.hook('preAction', (thisCommand) => {
18
+ const opts = thisCommand.opts();
19
+ loadEnvForCli(opts.envFile);
20
+ });
21
+ const ctx = createServiceContext();
22
+ registerAllCommands(program, ctx);
23
+ program.parseAsync(process.argv).catch((error) => {
24
+ console.error('CLI error:', error.message);
25
+ process.exit(1);
26
+ });
27
+ //# sourceMappingURL=cli.js.map