proofscan 0.5.11 → 0.6.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.
- package/dist/cli.js +9 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/shell.d.ts +6 -0
- package/dist/commands/shell.d.ts.map +1 -0
- package/dist/commands/shell.js +33 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/shell/completer.d.ts +18 -0
- package/dist/shell/completer.d.ts.map +1 -0
- package/dist/shell/completer.js +136 -0
- package/dist/shell/completer.js.map +1 -0
- package/dist/shell/history.d.ts +20 -0
- package/dist/shell/history.d.ts.map +1 -0
- package/dist/shell/history.js +75 -0
- package/dist/shell/history.js.map +1 -0
- package/dist/shell/index.d.ts +11 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +10 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/prompt.d.ts +34 -0
- package/dist/shell/prompt.d.ts.map +1 -0
- package/dist/shell/prompt.js +87 -0
- package/dist/shell/prompt.js.map +1 -0
- package/dist/shell/repl.d.ts +76 -0
- package/dist/shell/repl.d.ts.map +1 -0
- package/dist/shell/repl.js +486 -0
- package/dist/shell/repl.js.map +1 -0
- package/dist/shell/selector.d.ts +23 -0
- package/dist/shell/selector.d.ts.map +1 -0
- package/dist/shell/selector.js +86 -0
- package/dist/shell/selector.js.map +1 -0
- package/dist/shell/types.d.ts +47 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +71 -0
- package/dist/shell/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell REPL implementation
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Validate an argument for safe command execution.
|
|
6
|
+
* Since we use shell: false, most injection vectors are blocked.
|
|
7
|
+
* We only reject the most dangerous shell metacharacters as defense-in-depth.
|
|
8
|
+
*
|
|
9
|
+
* Blocked characters: & | ; ` $ (command chaining and substitution)
|
|
10
|
+
* \n \r (newline injection)
|
|
11
|
+
* \0 (null byte injection)
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidArg(arg: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Shell REPL class
|
|
16
|
+
*/
|
|
17
|
+
export declare class ShellRepl {
|
|
18
|
+
private context;
|
|
19
|
+
private rl;
|
|
20
|
+
private history;
|
|
21
|
+
private configPath;
|
|
22
|
+
private running;
|
|
23
|
+
private connectorsCache;
|
|
24
|
+
private sessionsCache;
|
|
25
|
+
private rpcsCache;
|
|
26
|
+
constructor(configPath: string);
|
|
27
|
+
/**
|
|
28
|
+
* Invalidate all caches (called after data-modifying commands)
|
|
29
|
+
*/
|
|
30
|
+
private invalidateCache;
|
|
31
|
+
/**
|
|
32
|
+
* Get data provider for completions with caching
|
|
33
|
+
*/
|
|
34
|
+
private getDataProvider;
|
|
35
|
+
/**
|
|
36
|
+
* Start the REPL
|
|
37
|
+
*/
|
|
38
|
+
start(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Process a line of input
|
|
41
|
+
*/
|
|
42
|
+
private processLine;
|
|
43
|
+
/**
|
|
44
|
+
* Handle built-in shell commands
|
|
45
|
+
*/
|
|
46
|
+
private handleBuiltin;
|
|
47
|
+
/**
|
|
48
|
+
* Show help
|
|
49
|
+
*/
|
|
50
|
+
private showHelp;
|
|
51
|
+
/**
|
|
52
|
+
* Show current context
|
|
53
|
+
*/
|
|
54
|
+
private showContext;
|
|
55
|
+
/**
|
|
56
|
+
* Handle 'use' command
|
|
57
|
+
*/
|
|
58
|
+
private handleUse;
|
|
59
|
+
/**
|
|
60
|
+
* Reset context
|
|
61
|
+
*/
|
|
62
|
+
private resetContext;
|
|
63
|
+
/**
|
|
64
|
+
* Execute a pfscan command
|
|
65
|
+
*/
|
|
66
|
+
private executeCommand;
|
|
67
|
+
/**
|
|
68
|
+
* Build command arguments with context applied
|
|
69
|
+
*/
|
|
70
|
+
private buildCommandArgs;
|
|
71
|
+
/**
|
|
72
|
+
* Check if command has a positional connector argument
|
|
73
|
+
*/
|
|
74
|
+
private hasPositionalConnector;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/shell/repl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/C;AAUD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,SAAS,CAAgD;gBAErD,UAAU,EAAE,MAAM;IAY9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwDvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D5B;;OAEG;YACW,WAAW;IAwBzB;;OAEG;YACW,aAAa;IAiC3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IA0BhB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;YACW,SAAS;IA+IvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;YACW,cAAc;IA+C5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAO/B"}
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell REPL implementation
|
|
3
|
+
*/
|
|
4
|
+
import * as readline from 'readline';
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import { SHELL_BUILTINS, TOP_LEVEL_COMMANDS } from './types.js';
|
|
7
|
+
import { generatePrompt, printSuccess, printError, printInfo, shortenSessionId } from './prompt.js';
|
|
8
|
+
import { loadHistory, saveHistory, addToHistory } from './history.js';
|
|
9
|
+
import { createCompleter } from './completer.js';
|
|
10
|
+
import { selectConnector, selectSession, canInteract } from './selector.js';
|
|
11
|
+
import { EventLineStore } from '../eventline/store.js';
|
|
12
|
+
import { ConfigManager } from '../config/index.js';
|
|
13
|
+
import { getCurrentSession, setCurrentSession, clearCurrentSession, } from '../utils/state.js';
|
|
14
|
+
// Cache TTL in milliseconds (5 seconds)
|
|
15
|
+
const CACHE_TTL_MS = 5000;
|
|
16
|
+
/**
|
|
17
|
+
* Validate an argument for safe command execution.
|
|
18
|
+
* Since we use shell: false, most injection vectors are blocked.
|
|
19
|
+
* We only reject the most dangerous shell metacharacters as defense-in-depth.
|
|
20
|
+
*
|
|
21
|
+
* Blocked characters: & | ; ` $ (command chaining and substitution)
|
|
22
|
+
* \n \r (newline injection)
|
|
23
|
+
* \0 (null byte injection)
|
|
24
|
+
*/
|
|
25
|
+
export function isValidArg(arg) {
|
|
26
|
+
const dangerousPattern = /[&|;`$\n\r\0]/;
|
|
27
|
+
return !dangerousPattern.test(arg);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Shell REPL class
|
|
31
|
+
*/
|
|
32
|
+
export class ShellRepl {
|
|
33
|
+
context;
|
|
34
|
+
rl = null;
|
|
35
|
+
history = [];
|
|
36
|
+
configPath;
|
|
37
|
+
running = false;
|
|
38
|
+
// Caches for completion data
|
|
39
|
+
connectorsCache = null;
|
|
40
|
+
sessionsCache = new Map();
|
|
41
|
+
rpcsCache = new Map();
|
|
42
|
+
constructor(configPath) {
|
|
43
|
+
this.configPath = configPath;
|
|
44
|
+
this.context = {};
|
|
45
|
+
// Load existing session state
|
|
46
|
+
const currentSession = getCurrentSession();
|
|
47
|
+
if (currentSession) {
|
|
48
|
+
this.context.session = currentSession.sessionId;
|
|
49
|
+
this.context.connector = currentSession.connectorId;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Invalidate all caches (called after data-modifying commands)
|
|
54
|
+
*/
|
|
55
|
+
invalidateCache() {
|
|
56
|
+
this.connectorsCache = null;
|
|
57
|
+
this.sessionsCache.clear();
|
|
58
|
+
this.rpcsCache.clear();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get data provider for completions with caching
|
|
62
|
+
*/
|
|
63
|
+
getDataProvider() {
|
|
64
|
+
const manager = new ConfigManager(this.configPath);
|
|
65
|
+
const configDir = manager.getConfigDir();
|
|
66
|
+
return {
|
|
67
|
+
getConnectorIds: () => {
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
if (this.connectorsCache && this.connectorsCache.expiry > now) {
|
|
70
|
+
return this.connectorsCache.data;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const store = new EventLineStore(configDir);
|
|
74
|
+
const ids = store.getConnectors().map(c => c.id);
|
|
75
|
+
this.connectorsCache = { data: ids, expiry: now + CACHE_TTL_MS };
|
|
76
|
+
return ids;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
getSessionPrefixes: (connectorId, limit = 10) => {
|
|
83
|
+
const now = Date.now();
|
|
84
|
+
const cacheKey = `${connectorId || '*'}:${limit}`;
|
|
85
|
+
const cached = this.sessionsCache.get(cacheKey);
|
|
86
|
+
if (cached && cached.expiry > now) {
|
|
87
|
+
return cached.data;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const store = new EventLineStore(configDir);
|
|
91
|
+
const sessions = store.getSessions(connectorId, limit);
|
|
92
|
+
const prefixes = sessions.map(s => shortenSessionId(s.session_id));
|
|
93
|
+
this.sessionsCache.set(cacheKey, { data: prefixes, expiry: now + CACHE_TTL_MS });
|
|
94
|
+
return prefixes;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
getRpcIds: (sessionId) => {
|
|
101
|
+
if (!sessionId)
|
|
102
|
+
return [];
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
const cached = this.rpcsCache.get(sessionId);
|
|
105
|
+
if (cached && cached.expiry > now) {
|
|
106
|
+
return cached.data;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
const store = new EventLineStore(configDir);
|
|
110
|
+
const rpcs = store.getRpcCalls(sessionId);
|
|
111
|
+
const ids = rpcs.map((_, i) => String(i + 1));
|
|
112
|
+
this.rpcsCache.set(sessionId, { data: ids, expiry: now + CACHE_TTL_MS });
|
|
113
|
+
return ids;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Start the REPL
|
|
123
|
+
*/
|
|
124
|
+
async start() {
|
|
125
|
+
// Load history
|
|
126
|
+
this.history = loadHistory();
|
|
127
|
+
// Create completer
|
|
128
|
+
const dataProvider = this.getDataProvider();
|
|
129
|
+
const completer = createCompleter(this.context, dataProvider);
|
|
130
|
+
// Create readline interface
|
|
131
|
+
this.rl = readline.createInterface({
|
|
132
|
+
input: process.stdin,
|
|
133
|
+
output: process.stdout,
|
|
134
|
+
prompt: generatePrompt(this.context),
|
|
135
|
+
completer: (line, callback) => {
|
|
136
|
+
const [completions, prefix] = completer(line);
|
|
137
|
+
callback(null, [completions, prefix]);
|
|
138
|
+
},
|
|
139
|
+
history: this.history,
|
|
140
|
+
historySize: 1000,
|
|
141
|
+
});
|
|
142
|
+
this.running = true;
|
|
143
|
+
// Print welcome message
|
|
144
|
+
console.log();
|
|
145
|
+
printInfo('proofscan shell - Type "help" for available commands, "exit" to quit');
|
|
146
|
+
console.log();
|
|
147
|
+
// Start prompt loop
|
|
148
|
+
this.rl.prompt();
|
|
149
|
+
this.rl.on('line', async (line) => {
|
|
150
|
+
const trimmed = line.trim();
|
|
151
|
+
if (trimmed) {
|
|
152
|
+
this.history = addToHistory(this.history, trimmed);
|
|
153
|
+
await this.processLine(trimmed);
|
|
154
|
+
}
|
|
155
|
+
if (this.running) {
|
|
156
|
+
// Update prompt (context may have changed)
|
|
157
|
+
this.rl.setPrompt(generatePrompt(this.context));
|
|
158
|
+
this.rl.prompt();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
this.rl.on('close', () => {
|
|
162
|
+
this.running = false;
|
|
163
|
+
saveHistory(this.history);
|
|
164
|
+
console.log();
|
|
165
|
+
printInfo('Goodbye!');
|
|
166
|
+
});
|
|
167
|
+
// Handle SIGINT (Ctrl+C)
|
|
168
|
+
this.rl.on('SIGINT', () => {
|
|
169
|
+
console.log();
|
|
170
|
+
this.rl.prompt();
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Process a line of input
|
|
175
|
+
*/
|
|
176
|
+
async processLine(line) {
|
|
177
|
+
const tokens = line.trim().split(/\s+/).filter(t => t !== '');
|
|
178
|
+
if (tokens.length === 0)
|
|
179
|
+
return;
|
|
180
|
+
const command = tokens[0];
|
|
181
|
+
const args = tokens.slice(1);
|
|
182
|
+
// Handle built-in commands
|
|
183
|
+
if (SHELL_BUILTINS.includes(command)) {
|
|
184
|
+
await this.handleBuiltin(command, args);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// Handle pfscan commands
|
|
188
|
+
if (TOP_LEVEL_COMMANDS.includes(command)) {
|
|
189
|
+
await this.executeCommand(tokens);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// Unknown command
|
|
193
|
+
printError(`Unknown command: ${command}`);
|
|
194
|
+
printInfo('Type "help" for available commands');
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Handle built-in shell commands
|
|
198
|
+
*/
|
|
199
|
+
async handleBuiltin(command, args) {
|
|
200
|
+
switch (command) {
|
|
201
|
+
case 'exit':
|
|
202
|
+
case 'quit':
|
|
203
|
+
this.running = false;
|
|
204
|
+
this.rl?.close();
|
|
205
|
+
break;
|
|
206
|
+
case 'help':
|
|
207
|
+
this.showHelp(args[0]);
|
|
208
|
+
break;
|
|
209
|
+
case 'clear':
|
|
210
|
+
console.clear();
|
|
211
|
+
break;
|
|
212
|
+
case 'pwd':
|
|
213
|
+
this.showContext();
|
|
214
|
+
break;
|
|
215
|
+
case 'use':
|
|
216
|
+
await this.handleUse(args);
|
|
217
|
+
break;
|
|
218
|
+
case 'reset':
|
|
219
|
+
this.resetContext();
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
printError(`Unknown builtin: ${command}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Show help
|
|
227
|
+
*/
|
|
228
|
+
showHelp(topic) {
|
|
229
|
+
if (topic) {
|
|
230
|
+
printInfo(`Help for "${topic}" - run "pfscan ${topic} --help" for details`);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
console.log(`
|
|
234
|
+
Shell Commands:
|
|
235
|
+
use <connector> Set current connector context
|
|
236
|
+
use session <prefix> Set current session context
|
|
237
|
+
reset Clear context (connector and session)
|
|
238
|
+
pwd Show current context
|
|
239
|
+
help [command] Show help
|
|
240
|
+
clear Clear screen
|
|
241
|
+
exit, quit Exit shell
|
|
242
|
+
|
|
243
|
+
Available Commands:
|
|
244
|
+
${TOP_LEVEL_COMMANDS.join(', ')}
|
|
245
|
+
|
|
246
|
+
Tips:
|
|
247
|
+
- Press TAB for auto-completion
|
|
248
|
+
- Current context is shown in the prompt
|
|
249
|
+
- Commands run with current context applied
|
|
250
|
+
`);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Show current context
|
|
254
|
+
*/
|
|
255
|
+
showContext() {
|
|
256
|
+
console.log();
|
|
257
|
+
console.log('Current context:');
|
|
258
|
+
console.log(` Connector: ${this.context.connector || '(not set)'}`);
|
|
259
|
+
console.log(` Session: ${this.context.session ? shortenSessionId(this.context.session) : '(not set)'}`);
|
|
260
|
+
console.log();
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Handle 'use' command
|
|
264
|
+
*/
|
|
265
|
+
async handleUse(args) {
|
|
266
|
+
if (args.length === 0) {
|
|
267
|
+
// Show interactive connector selection
|
|
268
|
+
if (!canInteract()) {
|
|
269
|
+
printError('Usage: use <connector> or use session <prefix>');
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const dataProvider = this.getDataProvider();
|
|
273
|
+
const connectors = dataProvider.getConnectorIds();
|
|
274
|
+
if (connectors.length === 0) {
|
|
275
|
+
printError('No connectors found. Run a scan first.');
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const selected = await selectConnector(connectors);
|
|
279
|
+
if (selected) {
|
|
280
|
+
this.context.connector = selected;
|
|
281
|
+
this.context.session = undefined;
|
|
282
|
+
setCurrentSession('', selected); // Save connector only
|
|
283
|
+
printSuccess(`Connector set to: ${selected}`);
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (args[0] === 'session') {
|
|
288
|
+
if (args.length < 2) {
|
|
289
|
+
// Show interactive session selection
|
|
290
|
+
if (!canInteract()) {
|
|
291
|
+
printError('Usage: use session <prefix>');
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
try {
|
|
295
|
+
const manager = new ConfigManager(this.configPath);
|
|
296
|
+
const store = new EventLineStore(manager.getConfigDir());
|
|
297
|
+
const sessions = store.getSessions(this.context.connector, 10);
|
|
298
|
+
if (sessions.length === 0) {
|
|
299
|
+
printError('No sessions found. Run a scan first.');
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const selected = await selectSession(sessions.map(s => ({ id: s.session_id, connector_id: s.connector_id })));
|
|
303
|
+
if (selected) {
|
|
304
|
+
this.context.session = selected;
|
|
305
|
+
// Also set connector from session
|
|
306
|
+
const session = sessions.find(s => s.session_id === selected);
|
|
307
|
+
if (session) {
|
|
308
|
+
this.context.connector = session.connector_id;
|
|
309
|
+
}
|
|
310
|
+
setCurrentSession(selected, this.context.connector);
|
|
311
|
+
printSuccess(`Session set to: ${shortenSessionId(selected)}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
printError(`Failed to load sessions: ${err instanceof Error ? err.message : String(err)}`);
|
|
316
|
+
}
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
// Find session by prefix
|
|
320
|
+
const prefix = args[1];
|
|
321
|
+
try {
|
|
322
|
+
const manager = new ConfigManager(this.configPath);
|
|
323
|
+
const store = new EventLineStore(manager.getConfigDir());
|
|
324
|
+
const sessions = store.getSessions(this.context.connector, 100);
|
|
325
|
+
const matches = sessions.filter(s => s.session_id.startsWith(prefix));
|
|
326
|
+
if (matches.length === 0) {
|
|
327
|
+
printError(`Session not found: ${prefix}`);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (matches.length > 1) {
|
|
331
|
+
// Ambiguous prefix - offer interactive selection if possible
|
|
332
|
+
if (canInteract()) {
|
|
333
|
+
printInfo(`Multiple sessions match "${prefix}". Select one:`);
|
|
334
|
+
const selected = await selectSession(matches.slice(0, 20).map(s => ({ id: s.session_id, connector_id: s.connector_id })));
|
|
335
|
+
if (selected) {
|
|
336
|
+
this.context.session = selected;
|
|
337
|
+
const session = matches.find(s => s.session_id === selected);
|
|
338
|
+
if (session) {
|
|
339
|
+
this.context.connector = session.connector_id;
|
|
340
|
+
}
|
|
341
|
+
setCurrentSession(selected, this.context.connector);
|
|
342
|
+
printSuccess(`Session set to: ${shortenSessionId(selected)} (${this.context.connector})`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
printError(`Ambiguous session prefix: ${prefix}`);
|
|
347
|
+
printInfo('Matching sessions:');
|
|
348
|
+
matches.slice(0, 10).forEach(s => {
|
|
349
|
+
console.log(` ${shortenSessionId(s.session_id)} (${s.connector_id})`);
|
|
350
|
+
});
|
|
351
|
+
if (matches.length > 10) {
|
|
352
|
+
printInfo(` ... and ${matches.length - 10} more`);
|
|
353
|
+
}
|
|
354
|
+
printInfo('Provide a longer prefix to disambiguate.');
|
|
355
|
+
}
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
const match = matches[0];
|
|
359
|
+
this.context.session = match.session_id;
|
|
360
|
+
this.context.connector = match.connector_id;
|
|
361
|
+
setCurrentSession(match.session_id, match.connector_id);
|
|
362
|
+
printSuccess(`Session set to: ${shortenSessionId(match.session_id)} (${match.connector_id})`);
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
printError(`Failed to load sessions: ${err instanceof Error ? err.message : String(err)}`);
|
|
366
|
+
}
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
// Set connector
|
|
370
|
+
const connectorId = args[0];
|
|
371
|
+
const dataProvider = this.getDataProvider();
|
|
372
|
+
const connectors = dataProvider.getConnectorIds();
|
|
373
|
+
if (!connectors.includes(connectorId)) {
|
|
374
|
+
// Try partial match
|
|
375
|
+
const match = connectors.find(c => c.startsWith(connectorId));
|
|
376
|
+
if (match) {
|
|
377
|
+
this.context.connector = match;
|
|
378
|
+
this.context.session = undefined;
|
|
379
|
+
printSuccess(`Connector set to: ${match}`);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
printError(`Connector not found: ${connectorId}`);
|
|
383
|
+
printInfo(`Available: ${connectors.join(', ')}`);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
this.context.connector = connectorId;
|
|
387
|
+
this.context.session = undefined;
|
|
388
|
+
printSuccess(`Connector set to: ${connectorId}`);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Reset context
|
|
392
|
+
*/
|
|
393
|
+
resetContext() {
|
|
394
|
+
this.context.connector = undefined;
|
|
395
|
+
this.context.session = undefined;
|
|
396
|
+
clearCurrentSession();
|
|
397
|
+
printSuccess('Context cleared');
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Execute a pfscan command
|
|
401
|
+
*/
|
|
402
|
+
async executeCommand(tokens) {
|
|
403
|
+
// Build command line with context
|
|
404
|
+
const cmdArgs = this.buildCommandArgs(tokens);
|
|
405
|
+
const command = tokens[0];
|
|
406
|
+
// Validate all arguments for safety (defense-in-depth with shell: false)
|
|
407
|
+
const invalidArgs = cmdArgs.filter(arg => !isValidArg(arg));
|
|
408
|
+
if (invalidArgs.length > 0) {
|
|
409
|
+
printError(`Invalid characters in arguments: ${invalidArgs.join(', ')}`);
|
|
410
|
+
printInfo('Arguments cannot contain shell metacharacters: & | ; ` $');
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
// Spawn pfscan process
|
|
414
|
+
// Windows requires shell: true for .cmd wrapper scripts (npm global installs)
|
|
415
|
+
// Security is ensured by isValidArg() validation above which blocks dangerous characters
|
|
416
|
+
const isWindows = process.platform === 'win32';
|
|
417
|
+
return new Promise((resolve) => {
|
|
418
|
+
const proc = spawn('pfscan', cmdArgs, {
|
|
419
|
+
stdio: 'inherit',
|
|
420
|
+
shell: isWindows,
|
|
421
|
+
});
|
|
422
|
+
proc.on('error', (err) => {
|
|
423
|
+
printError(`Failed to run command: ${err.message}`);
|
|
424
|
+
resolve();
|
|
425
|
+
});
|
|
426
|
+
proc.on('close', (code) => {
|
|
427
|
+
// Invalidate cache after data-modifying commands
|
|
428
|
+
const dataModifyingCommands = [
|
|
429
|
+
'scan', 's', // Creates new sessions/events
|
|
430
|
+
'archive', 'a', // Removes old data
|
|
431
|
+
'connectors', 'connector', // Adds/removes connectors
|
|
432
|
+
'config', 'c', // Config changes may affect connectors
|
|
433
|
+
];
|
|
434
|
+
if (dataModifyingCommands.includes(command)) {
|
|
435
|
+
this.invalidateCache();
|
|
436
|
+
}
|
|
437
|
+
if (code !== 0 && code !== null) {
|
|
438
|
+
printError(`Command exited with code ${code}`);
|
|
439
|
+
}
|
|
440
|
+
resolve();
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Build command arguments with context applied
|
|
446
|
+
*/
|
|
447
|
+
buildCommandArgs(tokens) {
|
|
448
|
+
const args = [...tokens];
|
|
449
|
+
const command = tokens[0];
|
|
450
|
+
// Add --connector if context has connector and command supports it
|
|
451
|
+
const connectorCommands = ['view', 'v', 'tree', 't'];
|
|
452
|
+
if (this.context.connector && connectorCommands.includes(command)) {
|
|
453
|
+
if (!args.includes('--connector') && !this.hasPositionalConnector(args)) {
|
|
454
|
+
args.push('--connector', this.context.connector);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// Add --session if context has session and command supports it
|
|
458
|
+
const sessionCommands = ['rpc', 'summary', 'permissions', 'view', 'v'];
|
|
459
|
+
if (this.context.session && sessionCommands.includes(command)) {
|
|
460
|
+
if (!args.includes('--session')) {
|
|
461
|
+
args.push('--session', this.context.session);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
// Add --id for scan start if context has connector
|
|
465
|
+
if (command === 'scan' || command === 's') {
|
|
466
|
+
if (args.includes('start') && !args.includes('--id') && this.context.connector) {
|
|
467
|
+
const hasPositional = args.length > 2 && !args[2].startsWith('-');
|
|
468
|
+
if (!hasPositional) {
|
|
469
|
+
args.push('--id', this.context.connector);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return args;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Check if command has a positional connector argument
|
|
477
|
+
*/
|
|
478
|
+
hasPositionalConnector(args) {
|
|
479
|
+
// For tree command, check if there's a positional argument
|
|
480
|
+
if (args[0] === 'tree' || args[0] === 't') {
|
|
481
|
+
return args.length > 1 && !args[1].startsWith('-');
|
|
482
|
+
}
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/shell/repl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive selector for missing arguments
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if interactive selection is available
|
|
6
|
+
*/
|
|
7
|
+
export declare function canInteract(): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Show a simple numbered list and get selection
|
|
10
|
+
*/
|
|
11
|
+
export declare function selectFromList(items: string[], prompt: string): Promise<string | null>;
|
|
12
|
+
/**
|
|
13
|
+
* Show connector selection UI
|
|
14
|
+
*/
|
|
15
|
+
export declare function selectConnector(connectors: string[]): Promise<string | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Show session selection UI
|
|
18
|
+
*/
|
|
19
|
+
export declare function selectSession(sessions: Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
connector_id: string;
|
|
22
|
+
}>): Promise<string | null>;
|
|
23
|
+
//# sourceMappingURL=selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../../src/shell/selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqDxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAElF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWjH"}
|