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,132 @@
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.PlinkSerialSession = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const BaseSession_1 = require("./BaseSession");
9
+ const events_1 = require("events");
10
+ const constants_1 = require("../../shared/constants");
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ class PlinkSerialSession extends BaseSession_1.BaseSession {
13
+ comPort;
14
+ baudRate;
15
+ process = null;
16
+ buffer = '';
17
+ eventEmitter = new events_1.EventEmitter();
18
+ constructor(comPort, baudRate = 9600) {
19
+ super();
20
+ this.comPort = comPort;
21
+ this.baudRate = baudRate;
22
+ }
23
+ async connect() {
24
+ return new Promise((resolve, reject) => {
25
+ const args = ['-serial', this.comPort, '-sercfg', `${this.baudRate},8,n,1,N`];
26
+ console.log(chalk_1.default.dim(`[PlinkSerial]: Spawning plink.exe with serial port ${this.comPort}...`));
27
+ this.process = (0, child_process_1.spawn)('plink.exe', args);
28
+ this.process.stdin.setDefaultEncoding('utf-8');
29
+ this.process.stdout.on('data', (data) => this.handleData(data));
30
+ this.process.stderr.on('data', (data) => {
31
+ console.error(chalk_1.default.dim(`[Plink Stderr]: ${data.toString()}`));
32
+ });
33
+ this.process.on('error', async (err) => {
34
+ const available = await PlinkSerialSession.listAvailableComPorts();
35
+ const portMsg = available.length > 0
36
+ ? `Active COM ports detected: ${available.join(', ')}`
37
+ : 'No active COM ports detected on the system.';
38
+ reject(new Error(`Failed to start plink process: ${err.message}. ${portMsg}`));
39
+ });
40
+ this.process.on('close', (code) => {
41
+ console.log(chalk_1.default.dim(`[PlinkSerial]: plink process closed with code ${code}`));
42
+ });
43
+ setTimeout(async () => {
44
+ try {
45
+ const match = constants_1.PROMPT_REGEX.exec(this.buffer);
46
+ if (match) {
47
+ this.updateStateFromPrompt(match[1]);
48
+ console.log(chalk_1.default.dim(`[PlinkSerial]: Sending 'terminal length 0' to disable pagination...`));
49
+ await this.execute('terminal length 0').catch(err => {
50
+ console.warn(chalk_1.default.dim(`[PlinkSerial Warning]: Failed to set terminal length 0: ${err.message}`));
51
+ });
52
+ resolve();
53
+ }
54
+ else {
55
+ const available = await PlinkSerialSession.listAvailableComPorts();
56
+ const portMsg = available.length > 0
57
+ ? `Active COM ports detected: ${available.join(', ')}`
58
+ : 'No active COM ports detected on the system.';
59
+ reject(new Error(`Failed to sync serial prompt on ${this.comPort}. ${portMsg}`));
60
+ }
61
+ }
62
+ catch (e) {
63
+ const available = await PlinkSerialSession.listAvailableComPorts();
64
+ const portMsg = available.length > 0
65
+ ? `Active COM ports detected: ${available.join(', ')}`
66
+ : 'No active COM ports detected on the system.';
67
+ reject(new Error(`Connection synchronization failed: ${e.message}. ${portMsg}`));
68
+ }
69
+ }, 3000);
70
+ });
71
+ }
72
+ handleData(data) {
73
+ const chunk = data.toString('utf-8');
74
+ this.buffer += chunk;
75
+ if (constants_1.MORE_REGEX.test(this.buffer)) {
76
+ if (this.process && !this.process.killed) {
77
+ this.process.stdin.write(' ');
78
+ }
79
+ this.buffer = this.buffer.replace(constants_1.MORE_REGEX, '');
80
+ }
81
+ this.eventEmitter.emit('stream_updated');
82
+ }
83
+ async execute(command, timeoutMs = 15000) {
84
+ const proc = this.process;
85
+ if (!proc || proc.killed) {
86
+ throw new Error('Process is inactive. Cannot execute command.');
87
+ }
88
+ return new Promise((resolve, reject) => {
89
+ this.buffer = '';
90
+ const timeout = setTimeout(() => {
91
+ this.eventEmitter.removeAllListeners('stream_updated');
92
+ reject(new Error(`Command execution timed out after ${timeoutMs}ms: "${command}"`));
93
+ }, timeoutMs);
94
+ this.eventEmitter.on('stream_updated', () => {
95
+ const match = constants_1.PROMPT_REGEX.exec(this.buffer);
96
+ if (match) {
97
+ clearTimeout(timeout);
98
+ this.eventEmitter.removeAllListeners('stream_updated');
99
+ const fullOutput = this.buffer;
100
+ this.updateStateFromPrompt(match[1]);
101
+ resolve(fullOutput);
102
+ }
103
+ });
104
+ proc.stdin.write(`${command}\r\n`);
105
+ });
106
+ }
107
+ async disconnect() {
108
+ if (this.process) {
109
+ console.log(chalk_1.default.dim('[PlinkSerial]: Detaching sub-process pipelines...'));
110
+ this.process.kill('SIGTERM');
111
+ this.process = null;
112
+ }
113
+ }
114
+ getProcess() {
115
+ return this.process;
116
+ }
117
+ static async listAvailableComPorts() {
118
+ return new Promise((resolve) => {
119
+ const { exec } = require('child_process');
120
+ exec('powershell -Command "[System.IO.Ports.SerialPort]::GetPortNames()"', (error, stdout) => {
121
+ if (error) {
122
+ resolve([]);
123
+ return;
124
+ }
125
+ const ports = stdout.split(/\r?\n/).map(p => p.trim()).filter(p => p.length > 0);
126
+ resolve(ports);
127
+ });
128
+ });
129
+ }
130
+ }
131
+ exports.PlinkSerialSession = PlinkSerialSession;
132
+ //# sourceMappingURL=PlinkSerial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlinkSerial.js","sourceRoot":"","sources":["../../../src/infrastructure/protocols/PlinkSerial.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { BaseSession } from './BaseSession';
2
+ export declare class SshSession extends BaseSession {
3
+ private config;
4
+ private client;
5
+ private channel;
6
+ private buffer;
7
+ private eventEmitter;
8
+ constructor(config: {
9
+ host: string;
10
+ port?: number;
11
+ username: string;
12
+ password?: string;
13
+ privateKey?: string;
14
+ });
15
+ connect(): Promise<void>;
16
+ private handleData;
17
+ execute(command: string, timeoutMs?: number): Promise<string>;
18
+ disconnect(): Promise<void>;
19
+ }
@@ -0,0 +1,110 @@
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.SshSession = void 0;
7
+ const ssh2_1 = require("ssh2");
8
+ const BaseSession_1 = require("./BaseSession");
9
+ const events_1 = require("events");
10
+ const constants_1 = require("../../shared/constants");
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ class SshSession extends BaseSession_1.BaseSession {
13
+ config;
14
+ client = null;
15
+ channel = null;
16
+ buffer = '';
17
+ eventEmitter = new events_1.EventEmitter();
18
+ constructor(config) {
19
+ super();
20
+ this.config = config;
21
+ }
22
+ async connect() {
23
+ return new Promise((resolve, reject) => {
24
+ this.client = new ssh2_1.Client();
25
+ this.client.on('ready', () => {
26
+ console.log(chalk_1.default.dim('[SshSession]: SSH connection ready. Launching interactive shell...'));
27
+ this.client.shell((err, stream) => {
28
+ if (err) {
29
+ return reject(new Error(`Failed to open SSH shell channel: ${err.message}`));
30
+ }
31
+ this.channel = stream;
32
+ this.channel.on('data', (data) => this.handleData(data));
33
+ this.channel.on('close', () => {
34
+ console.log(chalk_1.default.dim('[SshSession]: SSH channel closed.'));
35
+ });
36
+ setTimeout(async () => {
37
+ const match = constants_1.PROMPT_REGEX.exec(this.buffer);
38
+ if (match) {
39
+ this.updateStateFromPrompt(match[1]);
40
+ }
41
+ console.log(chalk_1.default.dim(`[SshSession]: Disabling pagination with 'terminal length 0'...`));
42
+ await this.execute('terminal length 0').catch(err => {
43
+ console.warn(chalk_1.default.dim(`[SshSession Warning]: Failed to set terminal length 0: ${err.message}`));
44
+ });
45
+ resolve();
46
+ }, 2000);
47
+ });
48
+ });
49
+ this.client.on('error', (err) => {
50
+ reject(new Error(`SSH Connection Error: ${err.message}`));
51
+ });
52
+ this.client.connect({
53
+ host: this.config.host,
54
+ port: this.config.port || 22,
55
+ username: this.config.username,
56
+ password: this.config.password,
57
+ privateKey: this.config.privateKey,
58
+ readyTimeout: 15000
59
+ });
60
+ });
61
+ }
62
+ handleData(data) {
63
+ const chunk = data.toString('utf-8');
64
+ this.buffer += chunk;
65
+ if (constants_1.MORE_REGEX.test(this.buffer)) {
66
+ if (this.channel) {
67
+ this.channel.write(' ');
68
+ }
69
+ this.buffer = this.buffer.replace(constants_1.MORE_REGEX, '');
70
+ }
71
+ this.eventEmitter.emit('stream_updated');
72
+ }
73
+ async execute(command, timeoutMs = 15000) {
74
+ const chan = this.channel;
75
+ if (!chan) {
76
+ throw new Error('SSH channel is inactive. Cannot execute command.');
77
+ }
78
+ return new Promise((resolve, reject) => {
79
+ this.buffer = '';
80
+ const timeout = setTimeout(() => {
81
+ this.eventEmitter.removeAllListeners('stream_updated');
82
+ reject(new Error(`SSH Command execution timed out after ${timeoutMs}ms: "${command}"`));
83
+ }, timeoutMs);
84
+ this.eventEmitter.on('stream_updated', () => {
85
+ const match = constants_1.PROMPT_REGEX.exec(this.buffer);
86
+ if (match) {
87
+ clearTimeout(timeout);
88
+ this.eventEmitter.removeAllListeners('stream_updated');
89
+ const fullOutput = this.buffer;
90
+ this.updateStateFromPrompt(match[1]);
91
+ resolve(fullOutput);
92
+ }
93
+ });
94
+ chan.write(`${command}\r\n`);
95
+ });
96
+ }
97
+ async disconnect() {
98
+ if (this.channel) {
99
+ this.channel.end();
100
+ this.channel = null;
101
+ }
102
+ if (this.client) {
103
+ this.client.end();
104
+ this.client = null;
105
+ }
106
+ console.log(chalk_1.default.dim('[SshSession]: SSH Session disconnected cleanly.'));
107
+ }
108
+ }
109
+ exports.SshSession = SshSession;
110
+ //# sourceMappingURL=SshSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SshSession.js","sourceRoot":"","sources":["../../../src/infrastructure/protocols/SshSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseSession } from './BaseSession';
2
+ export declare class TelnetSession extends BaseSession {
3
+ private config;
4
+ private socket;
5
+ private buffer;
6
+ private eventEmitter;
7
+ constructor(config: {
8
+ host: string;
9
+ port?: number;
10
+ username?: string;
11
+ password?: string;
12
+ });
13
+ connect(): Promise<void>;
14
+ private handleRawData;
15
+ execute(command: string, timeoutMs?: number): Promise<string>;
16
+ disconnect(): Promise<void>;
17
+ }
@@ -0,0 +1,177 @@
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.TelnetSession = void 0;
40
+ const net = __importStar(require("net"));
41
+ const BaseSession_1 = require("./BaseSession");
42
+ const events_1 = require("events");
43
+ const constants_1 = require("../../shared/constants");
44
+ const chalk_1 = __importDefault(require("chalk"));
45
+ class TelnetSession extends BaseSession_1.BaseSession {
46
+ config;
47
+ socket = null;
48
+ buffer = '';
49
+ eventEmitter = new events_1.EventEmitter();
50
+ constructor(config) {
51
+ super();
52
+ this.config = config;
53
+ }
54
+ async connect() {
55
+ return new Promise((resolve, reject) => {
56
+ const port = this.config.port || 23;
57
+ console.log(chalk_1.default.dim(`[TelnetSession]: Connecting to ${this.config.host}:${port}...`));
58
+ this.socket = net.createConnection({ host: this.config.host, port }, () => {
59
+ console.log(chalk_1.default.dim('[TelnetSession]: TCP socket connection established.'));
60
+ });
61
+ this.socket.on('data', (data) => this.handleRawData(data));
62
+ this.socket.on('error', (err) => {
63
+ reject(new Error(`Telnet Socket Error: ${err.message}`));
64
+ });
65
+ this.socket.on('close', () => {
66
+ console.log(chalk_1.default.dim('[TelnetSession]: Socket connection closed.'));
67
+ });
68
+ let loginState = 'USER';
69
+ const connectTimeout = setTimeout(() => {
70
+ this.eventEmitter.removeAllListeners('stream_updated');
71
+ reject(new Error('Telnet connection attempt timed out waiting for credentials or prompt.'));
72
+ }, 15000);
73
+ const checkState = async () => {
74
+ const lowerBuf = this.buffer.toLowerCase();
75
+ if (loginState === 'USER' && (lowerBuf.includes('username:') || lowerBuf.includes('login:'))) {
76
+ console.log(chalk_1.default.dim('[TelnetSession]: Sending username...'));
77
+ this.socket?.write(`${this.config.username || ''}\r\n`);
78
+ this.buffer = '';
79
+ loginState = 'PASS';
80
+ }
81
+ else if (loginState === 'PASS' && lowerBuf.includes('password:')) {
82
+ console.log(chalk_1.default.dim('[TelnetSession]: Sending password...'));
83
+ this.socket?.write(`${this.config.password || ''}\r\n`);
84
+ this.buffer = '';
85
+ loginState = 'PROMPT';
86
+ }
87
+ else {
88
+ const match = constants_1.PROMPT_REGEX.exec(this.buffer);
89
+ if (match) {
90
+ clearTimeout(connectTimeout);
91
+ this.eventEmitter.removeListener('stream_updated', checkState);
92
+ this.updateStateFromPrompt(match[1]);
93
+ console.log(chalk_1.default.dim(`[TelnetSession]: Logged in successfully. Syncing terminal settings...`));
94
+ await this.execute('terminal length 0').catch(err => {
95
+ console.warn(chalk_1.default.dim(`[TelnetSession Warning]: Failed to set terminal length 0: ${err.message}`));
96
+ });
97
+ resolve();
98
+ }
99
+ }
100
+ };
101
+ this.eventEmitter.on('stream_updated', checkState);
102
+ });
103
+ }
104
+ handleRawData(data) {
105
+ const cleaned = [];
106
+ let i = 0;
107
+ while (i < data.length) {
108
+ const byte = data[i];
109
+ if (byte === 255) {
110
+ const command = data[i + 1];
111
+ if (command >= 251 && command <= 254) {
112
+ const option = data[i + 2];
113
+ const response = Buffer.from([255, command === 251 ? 254 : 252, option]);
114
+ if (this.socket && !this.socket.destroyed) {
115
+ this.socket.write(response);
116
+ }
117
+ i += 3;
118
+ }
119
+ else if (command === 255) {
120
+ cleaned.push(255);
121
+ i += 2;
122
+ }
123
+ else {
124
+ i += 2;
125
+ }
126
+ }
127
+ else {
128
+ cleaned.push(byte);
129
+ i++;
130
+ }
131
+ }
132
+ if (cleaned.length > 0) {
133
+ const chunk = Buffer.from(cleaned).toString('utf-8');
134
+ this.buffer += chunk;
135
+ if (constants_1.MORE_REGEX.test(this.buffer)) {
136
+ if (this.socket && !this.socket.destroyed) {
137
+ this.socket.write(' ');
138
+ }
139
+ this.buffer = this.buffer.replace(constants_1.MORE_REGEX, '');
140
+ }
141
+ this.eventEmitter.emit('stream_updated');
142
+ }
143
+ }
144
+ async execute(command, timeoutMs = 15000) {
145
+ const sock = this.socket;
146
+ if (!sock || sock.destroyed) {
147
+ throw new Error('Telnet socket is inactive. Cannot execute command.');
148
+ }
149
+ return new Promise((resolve, reject) => {
150
+ this.buffer = '';
151
+ const timeout = setTimeout(() => {
152
+ this.eventEmitter.removeAllListeners('stream_updated');
153
+ reject(new Error(`Telnet command execution timed out after ${timeoutMs}ms: "${command}"`));
154
+ }, timeoutMs);
155
+ this.eventEmitter.on('stream_updated', () => {
156
+ const match = constants_1.PROMPT_REGEX.exec(this.buffer);
157
+ if (match) {
158
+ clearTimeout(timeout);
159
+ this.eventEmitter.removeAllListeners('stream_updated');
160
+ const fullOutput = this.buffer;
161
+ this.updateStateFromPrompt(match[1]);
162
+ resolve(fullOutput);
163
+ }
164
+ });
165
+ sock.write(`${command}\r\n`);
166
+ });
167
+ }
168
+ async disconnect() {
169
+ if (this.socket) {
170
+ this.socket.destroy();
171
+ this.socket = null;
172
+ }
173
+ console.log(chalk_1.default.dim('[TelnetSession]: Telnet Session disconnected.'));
174
+ }
175
+ }
176
+ exports.TelnetSession = TelnetSession;
177
+ //# sourceMappingURL=TelnetSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelnetSession.js","sourceRoot":"","sources":["../../../src/infrastructure/protocols/TelnetSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const DESTRUCTIVE_TOKENS: string[];
2
+ export declare const IOS_ERROR_PATTERNS: {
3
+ type: string;
4
+ regex: RegExp;
5
+ }[];
6
+ export declare const PROMPT_REGEX: RegExp;
7
+ export declare const MORE_REGEX: RegExp;
8
+ export declare const DEFAULT_PROTECTED_INTERFACES: string[];
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_PROTECTED_INTERFACES = exports.MORE_REGEX = exports.PROMPT_REGEX = exports.IOS_ERROR_PATTERNS = exports.DESTRUCTIVE_TOKENS = void 0;
4
+ exports.DESTRUCTIVE_TOKENS = [
5
+ 'erase', 'reload', 'delete', 'format', 'write erase',
6
+ 'boot system', 'config-register', 'crypto key zeroize'
7
+ ];
8
+ exports.IOS_ERROR_PATTERNS = [
9
+ { type: 'AmbiguousCommand', regex: /% Ambiguous command/i },
10
+ { type: 'IncompleteCommand', regex: /% Incomplete command/i },
11
+ { type: 'InvalidInput', regex: /% Invalid input detected at/i },
12
+ { type: 'InvalidCommand', regex: /% Unrecognized command/i },
13
+ { type: 'BadInterfaceParameter', regex: /% Bad interface parameter/i },
14
+ { type: 'CommandRejected', regex: /% Command rejected/i },
15
+ { type: 'AccessDenied', regex: /% Permission denied/i }
16
+ ];
17
+ exports.PROMPT_REGEX = /[\r\n]([A-Za-z0-9_\-]+(?:\([a-z0-9\-_]+\))?[>#])\s*$/;
18
+ exports.MORE_REGEX = /--\s*More\s*--/i;
19
+ exports.DEFAULT_PROTECTED_INTERFACES = [
20
+ 'GigabitEthernet0/0',
21
+ 'GigabitEthernet0/1',
22
+ 'GigabitEthernet1/0',
23
+ 'Vlan1'
24
+ ];
25
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG;IAC9B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa;IACpD,aAAa,EAAE,iBAAiB,EAAE,oBAAoB;CACzD,CAAC;AAEW,QAAA,kBAAkB,GAAG;IAC9B,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,sBAAsB,EAAE;IAC3D,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,uBAAuB,EAAE;IAC7D,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,yBAAyB,EAAE;IAC5D,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,4BAA4B,EAAE;IACtE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,qBAAqB,EAAE;IACzD,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,sBAAsB,EAAE;CAC1D,CAAC;AAGW,QAAA,YAAY,GAAG,sDAAsD,CAAC;AAGtE,QAAA,UAAU,GAAG,iBAAiB,CAAC;AAG/B,QAAA,4BAA4B,GAAG;IACxC,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,OAAO;CACV,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type CiscoDeviceMode = 'USER_EXEC' | 'PRIVILEGED_EXEC' | 'GLOBAL_CONFIG' | 'INTERFACE_CONFIG' | 'UNKNOWN';
2
+ export interface SessionState {
3
+ currentMode: CiscoDeviceMode;
4
+ hostname: string;
5
+ prompt: string;
6
+ }
7
+ export interface ChatMessage {
8
+ role: 'system' | 'user' | 'assistant' | 'tool';
9
+ content: string;
10
+ reasoning_content?: string;
11
+ tool_calls?: ToolCall[];
12
+ tool_call_id?: string;
13
+ name?: string;
14
+ }
15
+ export interface ToolCall {
16
+ id: string;
17
+ type: 'function';
18
+ function: {
19
+ name: string;
20
+ arguments: string;
21
+ };
22
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "ciscollm-cli",
3
+ "version": "1.0.1",
4
+ "description": "Cisco IOS automation agent CLI with mock simulation, guardrails, and LLM tool-calling support.",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "ciscollm": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "package.json",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "license": "MIT",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/ThemeHackers/ciscollm-cli.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/ThemeHackers/ciscollm-cli/issues"
22
+ },
23
+ "homepage": "https://github.com/ThemeHackers/ciscollm-cli#readme",
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "start": "ts-node src/index.ts",
27
+ "test": "ts-node test/index.test.ts",
28
+ "prepack": "npm run build"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "dependencies": {
34
+ "axios": "^1.6.8",
35
+ "chalk": "^4.1.2",
36
+ "commander": "^12.0.0",
37
+ "inquirer": "^8.2.6",
38
+ "ora": "^5.4.1",
39
+ "pdf-parse": "^2.4.5",
40
+ "ssh2": "^1.15.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/inquirer": "^8.2.10",
44
+ "@types/node": "^20.12.7",
45
+ "@types/ssh2": "^1.15.0",
46
+ "ts-node": "^10.9.2",
47
+ "typescript": "^5.4.5"
48
+ }
49
+ }