ciscollm-cli 1.0.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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/cli/ui/ui.d.ts +10 -0
  4. package/dist/cli/ui/ui.js +25 -0
  5. package/dist/cli/ui/ui.js.map +1 -0
  6. package/dist/core/agent/AgentLoop.d.ts +38 -0
  7. package/dist/core/agent/AgentLoop.js +562 -0
  8. package/dist/core/agent/AgentLoop.js.map +1 -0
  9. package/dist/core/agent/CommandReferenceEngine.d.ts +43 -0
  10. package/dist/core/agent/CommandReferenceEngine.js +366 -0
  11. package/dist/core/agent/CommandReferenceEngine.js.map +1 -0
  12. package/dist/core/agent/MultiAgentCoordinator.d.ts +12 -0
  13. package/dist/core/agent/MultiAgentCoordinator.js +57 -0
  14. package/dist/core/agent/MultiAgentCoordinator.js.map +1 -0
  15. package/dist/core/agent/PromptEngine.d.ts +3 -0
  16. package/dist/core/agent/PromptEngine.js +57 -0
  17. package/dist/core/agent/PromptEngine.js.map +1 -0
  18. package/dist/core/guardrails/CommandFirewall.d.ts +10 -0
  19. package/dist/core/guardrails/CommandFirewall.js +108 -0
  20. package/dist/core/guardrails/CommandFirewall.js.map +1 -0
  21. package/dist/core/guardrails/ErrorAnalyzer.d.ts +7 -0
  22. package/dist/core/guardrails/ErrorAnalyzer.js +16 -0
  23. package/dist/core/guardrails/ErrorAnalyzer.js.map +1 -0
  24. package/dist/core/rollback/TransactionManager.d.ts +13 -0
  25. package/dist/core/rollback/TransactionManager.js +144 -0
  26. package/dist/core/rollback/TransactionManager.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +578 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/infrastructure/llm/LLMClient.d.ts +11 -0
  31. package/dist/infrastructure/llm/LLMClient.js +94 -0
  32. package/dist/infrastructure/llm/LLMClient.js.map +1 -0
  33. package/dist/infrastructure/llm/LocalLLMClient.d.ts +7 -0
  34. package/dist/infrastructure/llm/LocalLLMClient.js +39 -0
  35. package/dist/infrastructure/llm/LocalLLMClient.js.map +1 -0
  36. package/dist/infrastructure/llm/ToolDefinitions.d.ts +179 -0
  37. package/dist/infrastructure/llm/ToolDefinitions.js +150 -0
  38. package/dist/infrastructure/llm/ToolDefinitions.js.map +1 -0
  39. package/dist/infrastructure/protocols/BaseSession.d.ts +10 -0
  40. package/dist/infrastructure/protocols/BaseSession.js +39 -0
  41. package/dist/infrastructure/protocols/BaseSession.js.map +1 -0
  42. package/dist/infrastructure/protocols/MockSession.d.ts +43 -0
  43. package/dist/infrastructure/protocols/MockSession.js +505 -0
  44. package/dist/infrastructure/protocols/MockSession.js.map +1 -0
  45. package/dist/infrastructure/protocols/PlinkSerial.d.ts +16 -0
  46. package/dist/infrastructure/protocols/PlinkSerial.js +132 -0
  47. package/dist/infrastructure/protocols/PlinkSerial.js.map +1 -0
  48. package/dist/infrastructure/protocols/SshSession.d.ts +19 -0
  49. package/dist/infrastructure/protocols/SshSession.js +110 -0
  50. package/dist/infrastructure/protocols/SshSession.js.map +1 -0
  51. package/dist/infrastructure/protocols/TelnetSession.d.ts +17 -0
  52. package/dist/infrastructure/protocols/TelnetSession.js +177 -0
  53. package/dist/infrastructure/protocols/TelnetSession.js.map +1 -0
  54. package/dist/shared/constants.d.ts +8 -0
  55. package/dist/shared/constants.js +25 -0
  56. package/dist/shared/constants.js.map +1 -0
  57. package/dist/shared/types.d.ts +22 -0
  58. package/dist/shared/types.js +3 -0
  59. package/dist/shared/types.js.map +1 -0
  60. package/package.json +49 -0
@@ -0,0 +1,366 @@
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.CommandReferenceEngine = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const pdf_parse_1 = require("pdf-parse");
10
+ class CommandReferenceEngine {
11
+ static CACHE_VERSION = 1;
12
+ static CACHE_DIR = '.cache';
13
+ static CACHE_FILE = 'cf_command_ref.index.json';
14
+ static instance = null;
15
+ loaded = false;
16
+ loadError = null;
17
+ commands = [];
18
+ pdfPath = null;
19
+ strictMode = /^(1|true|yes|on)$/i.test(process.env.CISCOLLM_STRICT_COMMAND_REF || '');
20
+ lastWarmupTelemetry = {
21
+ source: 'error',
22
+ commandCount: 0,
23
+ durationMs: 0,
24
+ strictMode: this.strictMode,
25
+ cachePath: this.getCachePath(),
26
+ error: 'Reference warmup has not run yet.'
27
+ };
28
+ static getInstance() {
29
+ if (!CommandReferenceEngine.instance) {
30
+ CommandReferenceEngine.instance = new CommandReferenceEngine();
31
+ }
32
+ return CommandReferenceEngine.instance;
33
+ }
34
+ async warmup(pdfFileName = 'cf_command_ref.pdf') {
35
+ const startedAt = Date.now();
36
+ if (this.loaded) {
37
+ this.lastWarmupTelemetry = {
38
+ source: 'memory',
39
+ commandCount: this.commands.length,
40
+ durationMs: Date.now() - startedAt,
41
+ strictMode: this.strictMode,
42
+ cachePath: this.getCachePath(),
43
+ error: this.loadError || undefined
44
+ };
45
+ return;
46
+ }
47
+ const pdfPath = path_1.default.resolve(process.cwd(), pdfFileName);
48
+ this.pdfPath = pdfPath;
49
+ if (!fs_1.default.existsSync(pdfPath)) {
50
+ this.loadError = `Reference file not found: ${pdfPath}`;
51
+ this.loaded = true;
52
+ this.lastWarmupTelemetry = {
53
+ source: 'error',
54
+ commandCount: 0,
55
+ durationMs: Date.now() - startedAt,
56
+ strictMode: this.strictMode,
57
+ cachePath: this.getCachePath(),
58
+ error: this.loadError
59
+ };
60
+ return;
61
+ }
62
+ const stat = fs_1.default.statSync(pdfPath);
63
+ const cachePayload = this.loadCache(stat.mtimeMs, stat.size);
64
+ if (cachePayload) {
65
+ this.commands = cachePayload.commands;
66
+ this.loaded = true;
67
+ this.lastWarmupTelemetry = {
68
+ source: 'cache',
69
+ commandCount: this.commands.length,
70
+ durationMs: Date.now() - startedAt,
71
+ strictMode: this.strictMode,
72
+ cachePath: this.getCachePath(),
73
+ error: this.loadError || undefined
74
+ };
75
+ return;
76
+ }
77
+ const parser = new pdf_parse_1.PDFParse({ data: fs_1.default.readFileSync(pdfPath) });
78
+ try {
79
+ const result = await parser.getText();
80
+ this.commands = this.extractCommands(result.text || '');
81
+ if (!this.commands.length) {
82
+ this.loadError = 'No command candidates were extracted from cf_command_ref.pdf.';
83
+ }
84
+ else {
85
+ this.saveCache(stat.mtimeMs, stat.size, this.commands);
86
+ }
87
+ }
88
+ catch (err) {
89
+ this.loadError = `Failed to parse cf_command_ref.pdf: ${err.message}`;
90
+ }
91
+ finally {
92
+ await parser.destroy();
93
+ this.loaded = true;
94
+ this.lastWarmupTelemetry = {
95
+ source: this.loadError ? 'error' : 'pdf',
96
+ commandCount: this.commands.length,
97
+ durationMs: Date.now() - startedAt,
98
+ strictMode: this.strictMode,
99
+ cachePath: this.getCachePath(),
100
+ error: this.loadError || undefined
101
+ };
102
+ }
103
+ }
104
+ async getPromptHints(goal, limit = 12) {
105
+ await this.warmup();
106
+ if (this.loadError) {
107
+ return `Reference status: unavailable (${this.loadError}).`;
108
+ }
109
+ const matches = this.search(goal, limit);
110
+ if (!matches.length) {
111
+ return 'Reference status: loaded, but no close command matches found for this request.';
112
+ }
113
+ return matches
114
+ .map((m, idx) => `${idx + 1}. ${m.command}${m.context ? ` | context: ${m.context}` : ''}`)
115
+ .join('\n');
116
+ }
117
+ isStrictModeEnabled() {
118
+ return this.strictMode;
119
+ }
120
+ setStrictMode(enabled) {
121
+ this.strictMode = enabled;
122
+ this.lastWarmupTelemetry = {
123
+ ...this.lastWarmupTelemetry,
124
+ strictMode: enabled
125
+ };
126
+ }
127
+ getWarmupTelemetry() {
128
+ return this.lastWarmupTelemetry;
129
+ }
130
+ async validateCommand(command) {
131
+ await this.warmup();
132
+ const clean = command.trim();
133
+ if (!clean) {
134
+ return {
135
+ allowed: false,
136
+ reason: 'Command is empty.',
137
+ suggestions: []
138
+ };
139
+ }
140
+ if (!this.strictMode) {
141
+ return {
142
+ allowed: true,
143
+ reason: 'Strict command reference mode is disabled.',
144
+ suggestions: []
145
+ };
146
+ }
147
+ if (this.loadError) {
148
+ return {
149
+ allowed: false,
150
+ reason: `Strict mode is enabled but command reference is unavailable (${this.loadError}).`,
151
+ suggestions: []
152
+ };
153
+ }
154
+ const normalizedInput = this.normalizeCommand(clean);
155
+ const exact = this.commands.find(c => this.normalizeCommand(c.command) === normalizedInput);
156
+ if (exact) {
157
+ return {
158
+ allowed: true,
159
+ reason: 'Command matched reference exactly.',
160
+ suggestions: []
161
+ };
162
+ }
163
+ const best = this.search(clean, 5).map(c => c.command);
164
+ const allowedByPrefix = this.commands.some(c => this.isLikelySameCommandFamily(clean, c.command));
165
+ if (allowedByPrefix) {
166
+ return {
167
+ allowed: true,
168
+ reason: 'Command matched reference by command-family prefix.',
169
+ suggestions: best
170
+ };
171
+ }
172
+ return {
173
+ allowed: false,
174
+ reason: `Command "${clean}" was not found in cf_command_ref.pdf index.`,
175
+ suggestions: best
176
+ };
177
+ }
178
+ search(goal, limit) {
179
+ const tokens = this.tokenize(goal);
180
+ if (!tokens.length) {
181
+ return this.commands.slice(0, limit);
182
+ }
183
+ const scored = this.commands
184
+ .map(candidate => {
185
+ const haystack = `${candidate.command} ${candidate.context}`.toLowerCase();
186
+ let score = 0;
187
+ for (const token of tokens) {
188
+ if (candidate.command.toLowerCase().includes(token)) {
189
+ score += 4;
190
+ }
191
+ if (haystack.includes(token)) {
192
+ score += 1;
193
+ }
194
+ }
195
+ if (score === 0) {
196
+ return null;
197
+ }
198
+ score += Math.max(0, 6 - candidate.command.split(/\s+/).length) * 0.05;
199
+ return { candidate, score };
200
+ })
201
+ .filter((item) => !!item)
202
+ .sort((a, b) => b.score - a.score);
203
+ const unique = [];
204
+ const seen = new Set();
205
+ for (const item of scored) {
206
+ const key = item.candidate.command.toLowerCase();
207
+ if (!seen.has(key)) {
208
+ unique.push(item.candidate);
209
+ seen.add(key);
210
+ }
211
+ if (unique.length >= limit) {
212
+ break;
213
+ }
214
+ }
215
+ return unique;
216
+ }
217
+ normalizeCommand(command) {
218
+ return command
219
+ .toLowerCase()
220
+ .replace(/\s+/g, ' ')
221
+ .trim();
222
+ }
223
+ isLikelySameCommandFamily(input, reference) {
224
+ const inputTokens = this.normalizeCommand(input).split(' ');
225
+ const refTokens = this.normalizeCommand(reference).split(' ');
226
+ if (!inputTokens.length || !refTokens.length) {
227
+ return false;
228
+ }
229
+ const compareCount = Math.min(3, inputTokens.length, refTokens.length);
230
+ for (let i = 0; i < compareCount; i++) {
231
+ if (inputTokens[i] !== refTokens[i]) {
232
+ return false;
233
+ }
234
+ }
235
+ return true;
236
+ }
237
+ loadCache(pdfMtimeMs, pdfSize) {
238
+ try {
239
+ const cachePath = this.getCachePath();
240
+ if (!fs_1.default.existsSync(cachePath)) {
241
+ return null;
242
+ }
243
+ const raw = fs_1.default.readFileSync(cachePath, 'utf8');
244
+ const data = JSON.parse(raw);
245
+ if (data.version !== CommandReferenceEngine.CACHE_VERSION ||
246
+ data.pdfMtimeMs !== pdfMtimeMs ||
247
+ data.pdfSize !== pdfSize ||
248
+ !Array.isArray(data.commands)) {
249
+ return null;
250
+ }
251
+ return data;
252
+ }
253
+ catch {
254
+ return null;
255
+ }
256
+ }
257
+ saveCache(pdfMtimeMs, pdfSize, commands) {
258
+ try {
259
+ const cachePath = this.getCachePath();
260
+ const cacheDir = path_1.default.dirname(cachePath);
261
+ if (!fs_1.default.existsSync(cacheDir)) {
262
+ fs_1.default.mkdirSync(cacheDir, { recursive: true });
263
+ }
264
+ const payload = {
265
+ version: CommandReferenceEngine.CACHE_VERSION,
266
+ pdfMtimeMs,
267
+ pdfSize,
268
+ generatedAt: new Date().toISOString(),
269
+ commands
270
+ };
271
+ fs_1.default.writeFileSync(cachePath, JSON.stringify(payload, null, 2), 'utf8');
272
+ }
273
+ catch {
274
+ }
275
+ }
276
+ getCachePath() {
277
+ return path_1.default.resolve(process.cwd(), CommandReferenceEngine.CACHE_DIR, CommandReferenceEngine.CACHE_FILE);
278
+ }
279
+ tokenize(text) {
280
+ const stopWords = new Set([
281
+ 'the', 'and', 'for', 'from', 'with', 'that', 'this', 'then', 'into',
282
+ 'user', 'goal', 'please', 'need', 'want', 'configure', 'configuration',
283
+ 'device', 'devices', 'switch', 'router', 'cisco', 'ios', 'show', 'set'
284
+ ]);
285
+ return text
286
+ .toLowerCase()
287
+ .split(/[^a-z0-9_\/-]+/)
288
+ .map(t => t.trim())
289
+ .filter(t => t.length >= 3 && !stopWords.has(t));
290
+ }
291
+ extractCommands(text) {
292
+ const lines = text
293
+ .split(/\r?\n/)
294
+ .map(line => line.trim())
295
+ .filter(Boolean);
296
+ const candidates = [];
297
+ for (let i = 0; i < lines.length; i++) {
298
+ const line = lines[i];
299
+ if (!this.isCommandLine(line)) {
300
+ continue;
301
+ }
302
+ const contextParts = [];
303
+ for (let j = i + 1; j < Math.min(i + 4, lines.length); j++) {
304
+ const next = lines[j];
305
+ if (this.isStructuralNoise(next) || this.isCommandLine(next)) {
306
+ break;
307
+ }
308
+ contextParts.push(next);
309
+ }
310
+ candidates.push({
311
+ command: line,
312
+ context: contextParts.join(' ').slice(0, 180)
313
+ });
314
+ }
315
+ const unique = new Map();
316
+ for (const candidate of candidates) {
317
+ const key = candidate.command.toLowerCase();
318
+ if (!unique.has(key)) {
319
+ unique.set(key, candidate);
320
+ }
321
+ }
322
+ return Array.from(unique.values());
323
+ }
324
+ isStructuralNoise(line) {
325
+ if (!line)
326
+ return true;
327
+ if (/^--\s*\d+\s+of\s+\d+\s*--$/i.test(line))
328
+ return true;
329
+ if (/^chapter\s+\d+/i.test(line))
330
+ return true;
331
+ if (/^cisco\s+ios\s+/i.test(line))
332
+ return true;
333
+ if (/^(table|figure)\s+\d+/i.test(line))
334
+ return true;
335
+ if (/^\d+\s*$/.test(line))
336
+ return true;
337
+ return false;
338
+ }
339
+ isCommandLine(line) {
340
+ if (this.isStructuralNoise(line)) {
341
+ return false;
342
+ }
343
+ if (line.length < 3 || line.length > 90) {
344
+ return false;
345
+ }
346
+ if (!/^[a-z][a-z0-9\-\s<>\[\]\{\}\/_\.,:()]*$/i.test(line)) {
347
+ return false;
348
+ }
349
+ if (/[A-Z]{4,}/.test(line)) {
350
+ return false;
351
+ }
352
+ if (/\b(the|this|that|when|where|example|configuration|command reference)\b/i.test(line)) {
353
+ return false;
354
+ }
355
+ if (/[.!?]$/.test(line)) {
356
+ return false;
357
+ }
358
+ const words = line.split(/\s+/);
359
+ if (words.length > 9) {
360
+ return false;
361
+ }
362
+ return true;
363
+ }
364
+ }
365
+ exports.CommandReferenceEngine = CommandReferenceEngine;
366
+ //# sourceMappingURL=CommandReferenceEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandReferenceEngine.js","sourceRoot":"","sources":["../../../src/core/agent/CommandReferenceEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { BaseSession } from '../../infrastructure/protocols/BaseSession';
2
+ import { SessionState } from '../../shared/types';
3
+ export declare class MultiAgentCoordinator {
4
+ private sessions;
5
+ registerSession(deviceId: string, session: BaseSession): void;
6
+ connectAll(): Promise<void>;
7
+ executeCommand(deviceId: string, command: string): Promise<string>;
8
+ getSessions(): Map<string, BaseSession>;
9
+ getSession(deviceId: string): BaseSession | undefined;
10
+ getAllStates(): Record<string, SessionState>;
11
+ disconnectAll(): Promise<void>;
12
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiAgentCoordinator = void 0;
4
+ class MultiAgentCoordinator {
5
+ sessions = new Map();
6
+ registerSession(deviceId, session) {
7
+ this.sessions.set(deviceId, session);
8
+ }
9
+ async connectAll() {
10
+ console.log(`[MultiAgentCoordinator]: Establishing connections to ${this.sessions.size} devices in parallel...`);
11
+ const promises = Array.from(this.sessions.entries()).map(async ([id, session]) => {
12
+ try {
13
+ await session.connect();
14
+ console.log(`[MultiAgentCoordinator]: Device "${id}" connected successfully.`);
15
+ }
16
+ catch (err) {
17
+ throw new Error(`Device "${id}" failed to connect: ${err.message}`);
18
+ }
19
+ });
20
+ await Promise.all(promises);
21
+ }
22
+ async executeCommand(deviceId, command) {
23
+ const session = this.sessions.get(deviceId);
24
+ if (!session) {
25
+ throw new Error(`Device "${deviceId}" is not registered in this coordinator session.`);
26
+ }
27
+ return await session.execute(command);
28
+ }
29
+ getSessions() {
30
+ return this.sessions;
31
+ }
32
+ getSession(deviceId) {
33
+ return this.sessions.get(deviceId);
34
+ }
35
+ getAllStates() {
36
+ const states = {};
37
+ for (const [id, session] of this.sessions.entries()) {
38
+ states[id] = session.getState();
39
+ }
40
+ return states;
41
+ }
42
+ async disconnectAll() {
43
+ console.log('[MultiAgentCoordinator]: Terminating all device connection channels...');
44
+ for (const [id, session] of this.sessions.entries()) {
45
+ try {
46
+ await session.disconnect();
47
+ console.log(`[MultiAgentCoordinator]: Device "${id}" disconnected cleanly.`);
48
+ }
49
+ catch (err) {
50
+ console.error(`[MultiAgentCoordinator Warning]: Device "${id}" failed to close cleanly: ${err.message}`);
51
+ }
52
+ }
53
+ this.sessions.clear();
54
+ }
55
+ }
56
+ exports.MultiAgentCoordinator = MultiAgentCoordinator;
57
+ //# sourceMappingURL=MultiAgentCoordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiAgentCoordinator.js","sourceRoot":"","sources":["../../../src/core/agent/MultiAgentCoordinator.ts"],"names":[],"mappings":";;;AAGA,MAAa,qBAAqB;IACtB,QAAQ,GAA6B,IAAI,GAAG,EAAE,CAAC;IAEhD,eAAe,CAAC,QAAgB,EAAE,OAAoB;QACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,UAAU;QACnB,OAAO,CAAC,GAAG,CAAC,wDAAwD,IAAI,CAAC,QAAQ,CAAC,IAAI,yBAAyB,CAAC,CAAC;QACjH,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;YAC7E,IAAI,CAAC;gBACD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,2BAA2B,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,OAAe;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,kDAAkD,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEM,WAAW;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,UAAU,CAAC,QAAgB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAEM,YAAY;QACf,MAAM,MAAM,GAAiC,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,aAAa;QACtB,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACtF,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC;gBACD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,yBAAyB,CAAC,CAAC;YACjF,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7G,CAAC;QACL,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACJ;AAxDD,sDAwDC"}
@@ -0,0 +1,3 @@
1
+ export declare class PromptEngine {
2
+ static getSystemPrompt(stateInfo: string, commandReferenceHints?: string, strictReferenceMode?: boolean): string;
3
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromptEngine = void 0;
4
+ class PromptEngine {
5
+ static getSystemPrompt(stateInfo, commandReferenceHints = 'Reference status: not loaded.', strictReferenceMode = false) {
6
+ return `You are a Senior Network Automation Engineer Agent executing operations on Cisco Enterprise Hardware (Switches & Routers).
7
+ Your objective is to accomplish the user's network configuration and troubleshooting goals safely, using step-by-step tool calls.
8
+
9
+ =========================================
10
+ CURRENT CONNECTED DEVICES & MODE CONTEXT:
11
+ =========================================
12
+ ${stateInfo}
13
+
14
+ =========================================
15
+ CF COMMAND REFERENCE (cf_command_ref.pdf):
16
+ =========================================
17
+ The following hints were extracted from the official command reference and ranked for the current request. Prefer these exact command forms and syntax whenever relevant.
18
+ Strict reference enforcement: ${strictReferenceMode ? 'ENABLED (unsupported commands will be blocked)' : 'DISABLED (advisory mode)'}
19
+ ${commandReferenceHints}
20
+
21
+ =========================================
22
+ CISCO IOS SHELL (IOS.sh) AUTOMATION GUIDE:
23
+ =========================================
24
+ 1. Capabilities: The connected Cisco devices support Cisco IOS Shell. You can utilize:
25
+ - Variables: E.g., "TARGET_IP=10.0.1.5", and reference them as "$TARGET_IP" in commands.
26
+ - Loop Constructs: E.g., "for i in 1 2; do ping 10.0.1.$i; done" to check connectivity.
27
+ - Piping & Output Filtering: E.g., "| include GigabitEthernet" or "| grep ip" to filter CLI outputs.
28
+ - Functions: E.g., "my_ping() { ping 10.0.1.1; }" to bind commands.
29
+ 2. Activation:
30
+ - Session-wide: Execute "terminal shell" in Privileged EXEC mode (Switch#).
31
+ - Global Config: Execute "shell processing full" in Global Configuration mode (Switch(config)#).
32
+ - Use the specialized tool "enable_ios_shell" to activate the shell instead of running raw activation commands.
33
+
34
+ =========================================
35
+ OPERATIONAL COMPLIANCE RULES:
36
+ =========================================
37
+ 1. Navigational Awareness: Verify the current device access level (e.g., USER_EXEC ">", PRIVILEGED_EXEC "#", GLOBAL_CONFIG "(config)#", INTERFACE_CONFIG "(config-if)#"). Change modes appropriately before running commands (e.g., issue "enable", "configure terminal").
38
+ 2. Multi-Device Scope: When multiple target devices are connected, you must specify the "device" parameter in all tool calls to designate the destination.
39
+ 3. Chaining Constraint: Issue commands step-by-step. Do not combine multiple unrelated configuration actions into a single tool call.
40
+ 4. Validation Requirement: Always verify any configuration changes immediately by calling "execute_ios_command" with inspection commands (e.g., "show running-config", "show ip interface brief") or by executing a "ping_test".
41
+ 5. Error Diagnostics: If a command fails or returns error markers (e.g., "% Unrecognized command", "% Invalid input"), stop. Do not repeat failed commands. Troubleshooting the cause (such as port state, interface context, or syntax) and correct it.
42
+ 6. Language Policy: All reasoning blocks, arguments, tool calls, and output explanations must be written strictly in English.
43
+
44
+ =========================================
45
+ RESPONSE FORMAT PROTOCOL (CRITICAL):
46
+ =========================================
47
+ - You MUST always populate the "content" field of your response with a detailed, step-by-step Chain-of-Thought (CoT) reasoning block BEFORE proposing any tool calls.
48
+ - You MUST format your thoughts by explicitly structuring them into these three sections:
49
+ 1. CURRENT STATE ANALYSIS: [What is the current device status, context, and access level?]
50
+ 2. TECHNICAL PLAN: [What is the detailed sequential plan, variables, loops, or shell configurations needed to achieve the goal?]
51
+ 3. NEXT ACTION DETAILS: [What specific tool are you calling right now, what arguments/commands are you sending, and why?]
52
+ - NEVER return an empty or whitespace-only "content" string when generating tool calls. The user must see your structured thoughts before execution occurs.
53
+ - When you are done and no additional tool call is required, your final response must be a direct user-facing outcome summary with concrete results and next actions (if any). Do not end with meta statements such as "I should" or "I will".`;
54
+ }
55
+ }
56
+ exports.PromptEngine = PromptEngine;
57
+ //# sourceMappingURL=PromptEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptEngine.js","sourceRoot":"","sources":["../../../src/core/agent/PromptEngine.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAY;IACf,MAAM,CAAC,eAAe,CACvB,SAAiB,EACjB,wBAAgC,+BAA+B,EAC/D,sBAA+B,KAAK;QAErC,OAAO;;;;;;EAMb,SAAS;;;;;;gCAMqB,mBAAmB,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,0BAA0B;EACjI,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+OAkCwN,CAAC;IAC5O,CAAC;CACJ;AAvDD,oCAuDC"}
@@ -0,0 +1,10 @@
1
+ export declare class CommandFirewall {
2
+ private protectedInterfaces;
3
+ constructor(protectedInterfaces?: string[]);
4
+ checkCommand(command: string, currentInterfaceContext: string | null): {
5
+ dangerous: boolean;
6
+ reason?: string;
7
+ };
8
+ private isProtected;
9
+ verifyWithHuman(command: string, reason: string): Promise<boolean>;
10
+ }
@@ -0,0 +1,108 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.CommandFirewall = void 0;
40
+ const readline = __importStar(require("readline"));
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const constants_1 = require("../../shared/constants");
43
+ class CommandFirewall {
44
+ protectedInterfaces;
45
+ constructor(protectedInterfaces = constants_1.DEFAULT_PROTECTED_INTERFACES) {
46
+ this.protectedInterfaces = protectedInterfaces.map(i => i.toLowerCase().trim());
47
+ }
48
+ checkCommand(command, currentInterfaceContext) {
49
+ const normalized = command.toLowerCase().trim();
50
+ const matchedDestructive = constants_1.DESTRUCTIVE_TOKENS.find(token => normalized.startsWith(token) || normalized.includes(` ${token}`));
51
+ if (matchedDestructive) {
52
+ return {
53
+ dangerous: true,
54
+ reason: `Destructive keyword detected ("${matchedDestructive}")`
55
+ };
56
+ }
57
+ const interfaceMatch = /^interface\s+([A-Za-z0-9\/\.\-]+)/i.exec(command.trim());
58
+ if (interfaceMatch) {
59
+ const targetedInterface = interfaceMatch[1].toLowerCase().trim();
60
+ if (this.isProtected(targetedInterface) && normalized.includes('shutdown')) {
61
+ return {
62
+ dangerous: true,
63
+ reason: `Attempting to shutdown protected management interface: ${interfaceMatch[1]}`
64
+ };
65
+ }
66
+ }
67
+ if (currentInterfaceContext) {
68
+ const activeIntf = currentInterfaceContext.toLowerCase().trim();
69
+ if (this.isProtected(activeIntf)) {
70
+ if (normalized === 'shutdown') {
71
+ return {
72
+ dangerous: true,
73
+ reason: `Cannot shutdown active protected management interface: ${currentInterfaceContext}`
74
+ };
75
+ }
76
+ if (normalized.startsWith('no ip address') || normalized.startsWith('no ip add')) {
77
+ return {
78
+ dangerous: true,
79
+ reason: `Cannot remove IP address configuration from protected interface: ${currentInterfaceContext}`
80
+ };
81
+ }
82
+ }
83
+ }
84
+ return { dangerous: false };
85
+ }
86
+ isProtected(interfaceName) {
87
+ return this.protectedInterfaces.some(p => p === interfaceName ||
88
+ interfaceName.startsWith(p) ||
89
+ p.startsWith(interfaceName));
90
+ }
91
+ async verifyWithHuman(command, reason) {
92
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
93
+ return new Promise((resolve) => {
94
+ console.warn('\n' + chalk_1.default.bold.red('⚠️ [GUARDRAIL WARNING]: High-Risk Command Blocked'));
95
+ console.warn(chalk_1.default.bold.red('============================================================'));
96
+ console.warn(`- The Agent requested to run: ${chalk_1.default.bold.yellow(`"${command}"`)}`);
97
+ console.warn(`- Protection Rule Match: ${chalk_1.default.cyan(reason)}`);
98
+ console.warn(chalk_1.default.bold.red('============================================================'));
99
+ rl.question(chalk_1.default.bold.white('Do you want to authorize the execution of this command? (y/N): '), (answer) => {
100
+ rl.close();
101
+ console.log('');
102
+ resolve(answer.toLowerCase() === 'y');
103
+ });
104
+ });
105
+ }
106
+ }
107
+ exports.CommandFirewall = CommandFirewall;
108
+ //# sourceMappingURL=CommandFirewall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandFirewall.js","sourceRoot":"","sources":["../../../src/core/guardrails/CommandFirewall.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAqC;AACrC,kDAA0B;AAC1B,sDAA0F;AAE1F,MAAa,eAAe;IAChB,mBAAmB,CAAW;IAEtC,YAAY,sBAAgC,wCAA4B;QACpE,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;IAGM,YAAY,CAAC,OAAe,EAAE,uBAAsC;QACvE,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAGhD,MAAM,kBAAkB,GAAG,8BAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACvD,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,CACnE,CAAC;QACF,IAAI,kBAAkB,EAAE,CAAC;YACrB,OAAO;gBACH,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,kCAAkC,kBAAkB,IAAI;aACnE,CAAC;QACN,CAAC;QAGD,MAAM,cAAc,GAAG,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,cAAc,EAAE,CAAC;YACjB,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAEjE,IAAI,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzE,OAAO;oBACH,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,0DAA0D,cAAc,CAAC,CAAC,CAAC,EAAE;iBACxF,CAAC;YACN,CAAC;QACL,CAAC;QAGD,IAAI,uBAAuB,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,uBAAuB,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAChE,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;oBAC5B,OAAO;wBACH,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,0DAA0D,uBAAuB,EAAE;qBAC9F,CAAC;gBACN,CAAC;gBACD,IAAI,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC/E,OAAO;wBACH,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,oEAAoE,uBAAuB,EAAE;qBACxG,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAEO,WAAW,CAAC,aAAqB;QAErC,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,KAAK,aAAa;YACnB,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3B,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAC9B,CAAC;IACN,CAAC;IAGM,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,MAAc;QACxD,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC,iCAAiC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,iCAAiC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAC;YAE7F,EAAE,CAAC,QAAQ,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iEAAiE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;gBACxG,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AApFD,0CAoFC"}