ciscollm-cli 1.0.1 → 1.0.3

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 (59) hide show
  1. package/README.md +169 -74
  2. package/dist/cli/ui/ui.d.ts +1 -0
  3. package/dist/cli/ui/ui.js +19 -4
  4. package/dist/cli/ui/ui.js.map +1 -1
  5. package/dist/core/agent/AgentLoop.d.ts +7 -0
  6. package/dist/core/agent/AgentLoop.js +177 -18
  7. package/dist/core/agent/AgentLoop.js.map +1 -1
  8. package/dist/core/agent/CommandReferenceEngine.d.ts +2 -0
  9. package/dist/core/agent/CommandReferenceEngine.js +73 -4
  10. package/dist/core/agent/CommandReferenceEngine.js.map +1 -1
  11. package/dist/core/agent/HierarchicalAgentManager.d.ts +11 -0
  12. package/dist/core/agent/HierarchicalAgentManager.js +70 -0
  13. package/dist/core/agent/HierarchicalAgentManager.js.map +1 -0
  14. package/dist/core/agent/MultiAgentCoordinator.d.ts +5 -1
  15. package/dist/core/agent/MultiAgentCoordinator.js +64 -5
  16. package/dist/core/agent/MultiAgentCoordinator.js.map +1 -1
  17. package/dist/core/agent/PromptEngine.d.ts +1 -1
  18. package/dist/core/agent/PromptEngine.js +64 -48
  19. package/dist/core/agent/PromptEngine.js.map +1 -1
  20. package/dist/core/guardrails/AuditLogger.d.ts +15 -0
  21. package/dist/core/guardrails/AuditLogger.js +66 -0
  22. package/dist/core/guardrails/AuditLogger.js.map +1 -0
  23. package/dist/core/guardrails/CommandFirewall.js +24 -0
  24. package/dist/core/guardrails/CommandFirewall.js.map +1 -1
  25. package/dist/core/guardrails/PreExecutionValidator.d.ts +9 -0
  26. package/dist/core/guardrails/PreExecutionValidator.js +58 -0
  27. package/dist/core/guardrails/PreExecutionValidator.js.map +1 -0
  28. package/dist/core/rollback/StateDiff.d.ts +47 -0
  29. package/dist/core/rollback/StateDiff.js +121 -0
  30. package/dist/core/rollback/StateDiff.js.map +1 -0
  31. package/dist/core/rollback/TransactionManager.d.ts +2 -0
  32. package/dist/core/rollback/TransactionManager.js +130 -54
  33. package/dist/core/rollback/TransactionManager.js.map +1 -1
  34. package/dist/core/topology/TopologyDiscovery.d.ts +5 -0
  35. package/dist/core/topology/TopologyDiscovery.js +54 -0
  36. package/dist/core/topology/TopologyDiscovery.js.map +1 -0
  37. package/dist/index.js +247 -31
  38. package/dist/index.js.map +1 -1
  39. package/dist/infrastructure/llm/LLMClient.js +52 -2
  40. package/dist/infrastructure/llm/LLMClient.js.map +1 -1
  41. package/dist/infrastructure/protocols/BaseSession.js +1 -1
  42. package/dist/infrastructure/protocols/BaseSession.js.map +1 -1
  43. package/dist/infrastructure/protocols/CmlSession.d.ts +26 -0
  44. package/dist/infrastructure/protocols/CmlSession.js +448 -0
  45. package/dist/infrastructure/protocols/CmlSession.js.map +1 -0
  46. package/dist/infrastructure/protocols/MockSession.d.ts +33 -0
  47. package/dist/infrastructure/protocols/MockSession.js +433 -35
  48. package/dist/infrastructure/protocols/MockSession.js.map +1 -1
  49. package/dist/infrastructure/protocols/NetconfSession.d.ts +72 -0
  50. package/dist/infrastructure/protocols/NetconfSession.js +489 -0
  51. package/dist/infrastructure/protocols/NetconfSession.js.map +1 -0
  52. package/dist/infrastructure/protocols/PlinkSerial.js +112 -28
  53. package/dist/infrastructure/protocols/PlinkSerial.js.map +1 -1
  54. package/dist/infrastructure/protocols/SshSession.js +5 -5
  55. package/dist/infrastructure/protocols/SshSession.js.map +1 -1
  56. package/dist/infrastructure/protocols/TelnetSession.js +8 -8
  57. package/dist/infrastructure/protocols/TelnetSession.js.map +1 -1
  58. package/dist/shared/types.d.ts +12 -0
  59. package/package.json +5 -3
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StateDiff = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ class StateDiff {
9
+ static diff(before, after) {
10
+ const result = {
11
+ modifiedInterfaces: [],
12
+ addedRoutes: [],
13
+ removedRoutes: [],
14
+ addedVlans: [],
15
+ removedVlans: [],
16
+ hostnameChanged: null
17
+ };
18
+ if (before.sessionState.hostname !== after.sessionState.hostname) {
19
+ result.hostnameChanged = {
20
+ before: before.sessionState.hostname,
21
+ after: after.sessionState.hostname
22
+ };
23
+ }
24
+ for (const afterIntf of after.interfaces) {
25
+ const beforeIntf = before.interfaces.find(i => i.name === afterIntf.name);
26
+ if (!beforeIntf) {
27
+ result.modifiedInterfaces.push({
28
+ name: afterIntf.name,
29
+ changes: [{ field: 'created', before: null, after: true }]
30
+ });
31
+ continue;
32
+ }
33
+ const changes = [];
34
+ if (beforeIntf.ip !== afterIntf.ip)
35
+ changes.push({ field: 'ip', before: beforeIntf.ip, after: afterIntf.ip });
36
+ if (beforeIntf.subnet !== afterIntf.subnet)
37
+ changes.push({ field: 'subnet', before: beforeIntf.subnet, after: afterIntf.subnet });
38
+ if (beforeIntf.adminShutdown !== afterIntf.adminShutdown)
39
+ changes.push({ field: 'adminShutdown', before: beforeIntf.adminShutdown, after: afterIntf.adminShutdown });
40
+ if (beforeIntf.description !== afterIntf.description)
41
+ changes.push({ field: 'description', before: beforeIntf.description, after: afterIntf.description });
42
+ if (changes.length > 0) {
43
+ result.modifiedInterfaces.push({ name: afterIntf.name, changes });
44
+ }
45
+ }
46
+ for (const afterRoute of after.routes) {
47
+ const exists = before.routes.some(r => r.network === afterRoute.network && r.mask === afterRoute.mask && r.nextHop === afterRoute.nextHop);
48
+ if (!exists) {
49
+ result.addedRoutes.push(afterRoute);
50
+ }
51
+ }
52
+ for (const beforeRoute of before.routes) {
53
+ const exists = after.routes.some(r => r.network === beforeRoute.network && r.mask === beforeRoute.mask && r.nextHop === beforeRoute.nextHop);
54
+ if (!exists) {
55
+ result.removedRoutes.push(beforeRoute);
56
+ }
57
+ }
58
+ for (const vlan of after.vlans) {
59
+ if (!before.vlans.includes(vlan)) {
60
+ result.addedVlans.push(vlan);
61
+ }
62
+ }
63
+ for (const vlan of before.vlans) {
64
+ if (!after.vlans.includes(vlan)) {
65
+ result.removedVlans.push(vlan);
66
+ }
67
+ }
68
+ return result;
69
+ }
70
+ /**
71
+ * Helper to render the diff output as a readable table/string.
72
+ */
73
+ static renderDiff(diff) {
74
+ const lines = [];
75
+ if (diff.hostnameChanged) {
76
+ lines.push(chalk_1.default.cyan(` Device Hostname Changed: `) + chalk_1.default.red(`"${diff.hostnameChanged.before}"`) + chalk_1.default.gray(' ➔ ') + chalk_1.default.green(`"${diff.hostnameChanged.after}"`));
77
+ }
78
+ if (diff.modifiedInterfaces.length > 0) {
79
+ lines.push(chalk_1.default.cyan(' Interface State Changes:'));
80
+ for (const item of diff.modifiedInterfaces) {
81
+ lines.push(chalk_1.default.bold.yellow(` * ${item.name}:`));
82
+ for (const change of item.changes) {
83
+ const beforeVal = change.before ?? 'unassigned';
84
+ const afterVal = change.after ?? 'unassigned';
85
+ let formattedLine = '';
86
+ if (change.field === 'adminShutdown') {
87
+ formattedLine = ` - shutdown: ` + (change.before ? chalk_1.default.red('YES') : chalk_1.default.green('NO')) + chalk_1.default.gray(' ➔ ') + (change.after ? chalk_1.default.red('YES') : chalk_1.default.green('NO'));
88
+ }
89
+ else {
90
+ formattedLine = ` - ${change.field}: ` + chalk_1.default.red(`"${beforeVal}"`) + chalk_1.default.gray(' ➔ ') + chalk_1.default.green(`"${afterVal}"`);
91
+ }
92
+ lines.push(formattedLine);
93
+ }
94
+ }
95
+ }
96
+ if (diff.addedRoutes.length > 0) {
97
+ lines.push(chalk_1.default.green(' Routes Added (+)'));
98
+ for (const r of diff.addedRoutes) {
99
+ lines.push(chalk_1.default.green(` + ip route ${r.network} ${r.mask} ${r.nextHop || ''}`));
100
+ }
101
+ }
102
+ if (diff.removedRoutes.length > 0) {
103
+ lines.push(chalk_1.default.red(' Routes Removed (-)'));
104
+ for (const r of diff.removedRoutes) {
105
+ lines.push(chalk_1.default.red(` - ip route ${r.network} ${r.mask} ${r.nextHop || ''}`));
106
+ }
107
+ }
108
+ if (diff.addedVlans.length > 0) {
109
+ lines.push(chalk_1.default.green(` VLANs Added (+): ${diff.addedVlans.join(', ')}`));
110
+ }
111
+ if (diff.removedVlans.length > 0) {
112
+ lines.push(chalk_1.default.red(` VLANs Removed (-): ${diff.removedVlans.join(', ')}`));
113
+ }
114
+ if (lines.length === 0) {
115
+ return ' No configuration differences detected.';
116
+ }
117
+ return lines.join('\n');
118
+ }
119
+ }
120
+ exports.StateDiff = StateDiff;
121
+ //# sourceMappingURL=StateDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateDiff.js","sourceRoot":"","sources":["../../../src/core/rollback/StateDiff.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { BaseSession } from '../../infrastructure/protocols/BaseSession';
2
2
  export declare class TransactionManager {
3
3
  private configChangeLog;
4
+ private mutationsWithContext;
5
+ private contextStack;
4
6
  private targetInterface;
5
7
  private backupCreated;
6
8
  private readonly backupFilename;
@@ -1,50 +1,101 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.TransactionManager = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
4
8
  class TransactionManager {
5
9
  configChangeLog = [];
10
+ mutationsWithContext = [];
11
+ contextStack = [];
6
12
  targetInterface = null;
7
13
  backupCreated = false;
8
14
  backupFilename = 'flash:backup-agent.cfg';
9
15
  async initializeBackup(session) {
10
16
  const state = session.getState();
11
17
  if (state.currentMode === 'USER_EXEC') {
12
- console.log('[TransactionManager]: Elevating to privileged mode for backup...');
18
+ console.log(chalk_1.default.cyan(' Elevating to privileged mode for backup...'));
13
19
  await session.execute('enable');
14
20
  }
15
21
  try {
16
- console.log('[TransactionManager]: Creating device running-config backup on flash...');
22
+ console.log(chalk_1.default.cyan(' Checking flash storage reachability...'));
23
+ const flashCheck = await session.execute('dir flash:');
24
+ if (flashCheck.includes('% Invalid') || flashCheck.includes('No such file') || flashCheck.includes('Error')) {
25
+ console.warn(chalk_1.default.yellow('⚠ Flash storage is not accessible or not found. Skipping backup creation.'));
26
+ return;
27
+ }
28
+ console.log(chalk_1.default.cyan('❯ Creating device running-config backup on flash...'));
17
29
  const rawOutput = await session.execute(`copy running-config ${this.backupFilename}`);
18
30
  if (rawOutput.includes('Destination filename') || rawOutput.includes('?')) {
19
31
  const confirmOutput = await session.execute('');
20
32
  if (confirmOutput.includes('copied') || confirmOutput.includes('OK')) {
21
33
  this.backupCreated = true;
22
- console.log('[TransactionManager]: Running configuration backup successfully created.');
34
+ console.log(chalk_1.default.green(' Running configuration backup successfully created.'));
23
35
  }
24
36
  else {
25
- console.warn('[TransactionManager Warning]: Backup confirmation response did not confirm copy completion.');
37
+ console.warn(chalk_1.default.yellow(' Backup confirmation response did not confirm copy completion.'));
26
38
  }
27
39
  }
28
40
  else if (rawOutput.includes('copied') || rawOutput.includes('OK')) {
29
41
  this.backupCreated = true;
30
- console.log('[TransactionManager]: Running configuration backup successfully created.');
42
+ console.log(chalk_1.default.green(' Running configuration backup successfully created.'));
31
43
  }
32
44
  else {
33
- console.warn('[TransactionManager Warning]: Failed to backup running-config. Flash may be missing or read-only.');
45
+ console.warn(chalk_1.default.yellow(' Failed to backup running-config. Flash may be missing or read-only.'));
34
46
  }
35
47
  }
36
48
  catch (err) {
37
- console.warn(`[TransactionManager Warning]: Backup creation skipped/failed: ${err.message}`);
49
+ console.warn(chalk_1.default.yellow(`⚠ Backup creation skipped/failed: ${err.message}`));
38
50
  }
39
51
  }
40
52
  trackMutation(command) {
41
- const cleanCmd = command.trim();
42
- const interfaceMatch = /^interface\s+([A-Za-z0-9\/\.\-]+)/i.exec(cleanCmd);
43
- if (interfaceMatch) {
44
- this.targetInterface = interfaceMatch[1];
53
+ const clean = command.trim();
54
+ const lower = clean.toLowerCase();
55
+ if (lower.startsWith('interface ') || lower.startsWith('int ')) {
56
+ const parts = clean.split(/\s+/);
57
+ if (parts.length >= 2) {
58
+ if (this.contextStack.length > 0 && this.contextStack[this.contextStack.length - 1].startsWith('interface')) {
59
+ this.contextStack.pop();
60
+ }
61
+ this.contextStack.push(`interface ${parts[1]}`);
62
+ this.targetInterface = parts[1];
63
+ }
64
+ }
65
+ else if (lower.startsWith('router ')) {
66
+ if (this.contextStack.length > 0 && this.contextStack[this.contextStack.length - 1].startsWith('router')) {
67
+ this.contextStack.pop();
68
+ }
69
+ this.contextStack.push(clean);
70
+ }
71
+ else if (lower.startsWith('line ')) {
72
+ if (this.contextStack.length > 0 && this.contextStack[this.contextStack.length - 1].startsWith('line')) {
73
+ this.contextStack.pop();
74
+ }
75
+ this.contextStack.push(clean);
76
+ }
77
+ else if (lower.startsWith('vlan ') && !lower.startsWith('no vlan ')) {
78
+ if (this.contextStack.length > 0 && this.contextStack[this.contextStack.length - 1].startsWith('vlan')) {
79
+ this.contextStack.pop();
80
+ }
81
+ this.contextStack.push(clean);
82
+ }
83
+ else if (lower === 'exit') {
84
+ this.contextStack.pop();
85
+ if (this.contextStack.length === 0 || !this.contextStack[this.contextStack.length - 1].startsWith('interface')) {
86
+ this.targetInterface = null;
87
+ }
88
+ }
89
+ else if (lower === 'end') {
90
+ this.contextStack = [];
91
+ this.targetInterface = null;
45
92
  }
46
- if (this.isMutational(cleanCmd)) {
47
- this.configChangeLog.push(cleanCmd);
93
+ if (this.isMutational(clean)) {
94
+ this.configChangeLog.push(clean);
95
+ this.mutationsWithContext.push({
96
+ command: clean,
97
+ contextStack: [...this.contextStack]
98
+ });
48
99
  }
49
100
  }
50
101
  isMutational(command) {
@@ -56,13 +107,28 @@ class TransactionManager {
56
107
  !lower.startsWith('configure terminal') &&
57
108
  !lower.startsWith('conf t') &&
58
109
  !lower.startsWith('copy') &&
59
- !lower.startsWith('interface');
110
+ !lower.startsWith('interface') &&
111
+ !lower.startsWith('int ') &&
112
+ !lower.startsWith('router ') &&
113
+ !lower.startsWith('line ') &&
114
+ !lower.startsWith('vlan ');
60
115
  }
61
116
  async executeRollback(session) {
62
- console.warn('[TransactionManager]: Safety rollback triggered!');
117
+ console.warn(chalk_1.default.red(' Safety rollback triggered!'));
118
+ const snapshotCapableSession = session;
119
+ if (snapshotCapableSession.restoreBackupSnapshot?.()) {
120
+ console.log(chalk_1.default.green('✔ Mock backup restore completed successfully.'));
121
+ this.clear();
122
+ return 'Mock backup restore completed successfully.';
123
+ }
124
+ if (snapshotCapableSession.hasSnapshots?.() && snapshotCapableSession.restoreToInitialSnapshot?.()) {
125
+ console.log(chalk_1.default.green('✔ Mock snapshot restore completed successfully.'));
126
+ this.clear();
127
+ return 'Mock snapshot restore completed successfully.';
128
+ }
63
129
  if (this.backupCreated) {
64
130
  try {
65
- console.warn(`[TransactionManager]: Restoring running configuration atomically using ${this.backupFilename}...`);
131
+ console.warn(chalk_1.default.cyan(`❯ Restoring running configuration atomically using ${this.backupFilename}...`));
66
132
  const state = session.getState();
67
133
  if (state.currentMode === 'USER_EXEC') {
68
134
  await session.execute('enable');
@@ -72,61 +138,69 @@ class TransactionManager {
72
138
  }
73
139
  const restoreOutput = await session.execute(`configure replace ${this.backupFilename} force`);
74
140
  if (!restoreOutput.includes('% Invalid') && !restoreOutput.includes('Unrecognized')) {
75
- console.log('[TransactionManager]: Atomic restore completed successfully.');
141
+ console.log(chalk_1.default.green(' Atomic restore completed successfully.'));
76
142
  this.clear();
77
143
  return restoreOutput;
78
144
  }
79
- console.warn('[TransactionManager]: configure replace failed/unsupported. Falling back to command inversion.');
145
+ console.warn(chalk_1.default.yellow(' configure replace failed/unsupported. Falling back to command inversion.'));
80
146
  }
81
147
  catch (err) {
82
- console.warn(`[TransactionManager Warning]: Atomic replace failed: ${err.message}. Falling back to command inversion.`);
148
+ console.warn(chalk_1.default.yellow(`⚠ Atomic replace failed: ${err.message}. Falling back to command inversion.`));
83
149
  }
84
150
  }
85
- console.warn(`[TransactionManager]: Executing manual inversion for ${this.configChangeLog.length} mutations...`);
151
+ console.warn(chalk_1.default.cyan(`❯ Executing manual inversion for ${this.mutationsWithContext.length} mutations...`));
86
152
  let rollbackSequence = ['configure terminal'];
87
- if (this.targetInterface) {
88
- rollbackSequence.push(`interface ${this.targetInterface}`);
89
- for (const cmd of [...this.configChangeLog].reverse()) {
90
- const clean = cmd.trim();
91
- const lower = clean.toLowerCase();
92
- if (lower.startsWith('ip address') || lower.startsWith('ip add')) {
93
- rollbackSequence.push('no ip address');
94
- }
95
- else if (lower.startsWith('shutdown')) {
96
- rollbackSequence.push('no shutdown');
97
- }
98
- else if (lower.startsWith('no shutdown')) {
99
- rollbackSequence.push('shutdown');
100
- }
101
- else if (lower.startsWith('description')) {
102
- rollbackSequence.push('no description');
103
- }
104
- else {
105
- if (lower.startsWith('no ')) {
106
- rollbackSequence.push(clean.substring(3));
107
- }
108
- else {
109
- rollbackSequence.push(`no ${clean}`);
153
+ let currentRollbackContext = [];
154
+ for (const item of [...this.mutationsWithContext].reverse()) {
155
+ const targetStack = item.contextStack;
156
+ let needsReentry = false;
157
+ if (currentRollbackContext.length !== targetStack.length) {
158
+ needsReentry = true;
159
+ }
160
+ else {
161
+ for (let i = 0; i < targetStack.length; i++) {
162
+ if (currentRollbackContext[i] !== targetStack[i]) {
163
+ needsReentry = true;
164
+ break;
110
165
  }
111
166
  }
112
167
  }
113
- }
114
- else {
115
- for (const cmd of [...this.configChangeLog].reverse()) {
116
- const clean = cmd.trim();
117
- const lower = clean.toLowerCase();
118
- if (lower.startsWith('no ')) {
119
- rollbackSequence.push(clean.substring(3));
168
+ if (needsReentry) {
169
+ if (currentRollbackContext.length > 0) {
170
+ rollbackSequence.push('exit');
120
171
  }
121
- else {
122
- rollbackSequence.push(`no ${clean}`);
172
+ for (const submode of targetStack) {
173
+ rollbackSequence.push(submode);
123
174
  }
175
+ currentRollbackContext = [...targetStack];
176
+ }
177
+ const clean = item.command;
178
+ const lower = clean.toLowerCase();
179
+ let inverseCmd = '';
180
+ if (lower.startsWith('ip address') || lower.startsWith('ip add')) {
181
+ inverseCmd = 'no ip address';
182
+ }
183
+ else if (lower.startsWith('shutdown')) {
184
+ inverseCmd = 'no shutdown';
185
+ }
186
+ else if (lower.startsWith('no shutdown')) {
187
+ inverseCmd = 'shutdown';
188
+ }
189
+ else if (lower.startsWith('description')) {
190
+ inverseCmd = 'no description';
191
+ }
192
+ else if (lower.startsWith('no ')) {
193
+ inverseCmd = clean.substring(3);
194
+ }
195
+ else {
196
+ inverseCmd = `no ${clean}`;
124
197
  }
198
+ rollbackSequence.push(inverseCmd);
125
199
  }
126
200
  rollbackSequence.push('end');
127
201
  let summary = '';
128
202
  for (const rollbackCmd of rollbackSequence) {
129
- console.log(`[TransactionManager Rollback]: Executing "${rollbackCmd}"`);
203
+ console.log(chalk_1.default.gray(`❯ Rollback: Executing "${rollbackCmd}"`));
130
204
  summary += await session.execute(rollbackCmd);
131
205
  }
132
206
  this.clear();
@@ -134,10 +208,12 @@ class TransactionManager {
134
208
  }
135
209
  clear() {
136
210
  this.configChangeLog = [];
211
+ this.mutationsWithContext = [];
212
+ this.contextStack = [];
137
213
  this.targetInterface = null;
138
214
  }
139
215
  hasMutations() {
140
- return this.configChangeLog.length > 0;
216
+ return this.configChangeLog.length > 0 || this.mutationsWithContext.length > 0;
141
217
  }
142
218
  }
143
219
  exports.TransactionManager = TransactionManager;
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionManager.js","sourceRoot":"","sources":["../../../src/core/rollback/TransactionManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TransactionManager.js","sourceRoot":"","sources":["../../../src/core/rollback/TransactionManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { TopologyLink } from '../../shared/types';
2
+ export declare class TopologyDiscovery {
3
+ static parseCdpNeighbors(localDeviceId: string, output: string): TopologyLink[];
4
+ static parseLldpNeighbors(localDeviceId: string, output: string): TopologyLink[];
5
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TopologyDiscovery = void 0;
4
+ class TopologyDiscovery {
5
+ static parseCdpNeighbors(localDeviceId, output) {
6
+ const links = [];
7
+ const lines = output.split(/\r?\n/);
8
+ for (const line of lines) {
9
+ const trimmed = line.trim();
10
+ if (!trimmed || /^Device\s+ID/i.test(trimmed) || /^-+/.test(trimmed)) {
11
+ continue;
12
+ }
13
+ const match = trimmed.match(/^(\S+)\s+(\S+\s+\S+)\s+\d+\s+\S+\s+\S+\s+(\S+\s+\S+)$/);
14
+ if (!match) {
15
+ continue;
16
+ }
17
+ const remoteDeviceId = match[1];
18
+ const localInterface = match[2].replace(/\s+/g, ' ').trim();
19
+ const remoteInterface = match[3].replace(/\s+/g, ' ').trim();
20
+ links.push({
21
+ localDeviceId,
22
+ localInterface,
23
+ remoteDeviceId,
24
+ remoteInterface,
25
+ protocol: 'cdp'
26
+ });
27
+ }
28
+ return links;
29
+ }
30
+ static parseLldpNeighbors(localDeviceId, output) {
31
+ const links = [];
32
+ const lines = output.split(/\r?\n/);
33
+ for (const line of lines) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed || /^Device ID/i.test(trimmed) || /^Total entries displayed/i.test(trimmed)) {
36
+ continue;
37
+ }
38
+ const match = trimmed.match(/^(\S+)\s+(\S+)\s+\d+\s+\S+\s+(\S+)$/);
39
+ if (!match) {
40
+ continue;
41
+ }
42
+ links.push({
43
+ localDeviceId,
44
+ remoteDeviceId: match[1],
45
+ localInterface: match[2],
46
+ remoteInterface: match[3],
47
+ protocol: 'lldp'
48
+ });
49
+ }
50
+ return links;
51
+ }
52
+ }
53
+ exports.TopologyDiscovery = TopologyDiscovery;
54
+ //# sourceMappingURL=TopologyDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopologyDiscovery.js","sourceRoot":"","sources":["../../../src/core/topology/TopologyDiscovery.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAiB;IACnB,MAAM,CAAC,iBAAiB,CAAC,aAAqB,EAAE,MAAc;QACjE,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnE,SAAS;YACb,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACrF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,SAAS;YACb,CAAC;YAED,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAE7D,KAAK,CAAC,IAAI,CAAC;gBACP,aAAa;gBACb,cAAc;gBACd,cAAc;gBACd,eAAe;gBACf,QAAQ,EAAE,KAAK;aAClB,CAAC,CAAC;QACP,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,kBAAkB,CAAC,aAAqB,EAAE,MAAc;QAClE,MAAM,KAAK,GAAmB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvF,SAAS;YACb,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACnE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,SAAS;YACb,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACP,aAAa;gBACb,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;gBACxB,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;gBACxB,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;gBACzB,QAAQ,EAAE,MAAM;aACnB,CAAC,CAAC;QACP,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AA1DD,8CA0DC"}