@channelfactory/cliend 0.7.4 → 0.7.6
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/src/config/config-manager.d.ts.map +1 -1
- package/dist/src/config/config-manager.js +2 -1
- package/dist/src/config/config-manager.js.map +1 -1
- package/dist/src/core/orchestrator.d.ts +1 -0
- package/dist/src/core/orchestrator.d.ts.map +1 -1
- package/dist/src/core/orchestrator.js +12 -3
- package/dist/src/core/orchestrator.js.map +1 -1
- package/dist/src/repl/commands/help.d.ts.map +1 -1
- package/dist/src/repl/commands/help.js +39 -22
- package/dist/src/repl/commands/help.js.map +1 -1
- package/dist/src/repl/commands/sessions.d.ts.map +1 -1
- package/dist/src/repl/commands/sessions.js +11 -4
- package/dist/src/repl/commands/sessions.js.map +1 -1
- package/dist/src/repl/file-mentions.d.ts +18 -0
- package/dist/src/repl/file-mentions.d.ts.map +1 -0
- package/dist/src/repl/file-mentions.js +52 -0
- package/dist/src/repl/file-mentions.js.map +1 -0
- package/dist/src/repl/mention-dropdown.d.ts +34 -0
- package/dist/src/repl/mention-dropdown.d.ts.map +1 -0
- package/dist/src/repl/mention-dropdown.js +226 -0
- package/dist/src/repl/mention-dropdown.js.map +1 -0
- package/dist/src/repl/repl.d.ts +4 -0
- package/dist/src/repl/repl.d.ts.map +1 -1
- package/dist/src/repl/repl.js +91 -5
- package/dist/src/repl/repl.js.map +1 -1
- package/dist/src/session/memory-manager.d.ts.map +1 -1
- package/dist/src/session/memory-manager.js +2 -1
- package/dist/src/session/memory-manager.js.map +1 -1
- package/dist/src/session/session-manager.d.ts.map +1 -1
- package/dist/src/session/session-manager.js +2 -1
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/tools/sensitive-patterns.d.ts +2 -0
- package/dist/src/tools/sensitive-patterns.d.ts.map +1 -0
- package/dist/src/tools/sensitive-patterns.js +18 -0
- package/dist/src/tools/sensitive-patterns.js.map +1 -0
- package/dist/src/tools/tool-executor.d.ts.map +1 -1
- package/dist/src/tools/tool-executor.js +1 -17
- package/dist/src/tools/tool-executor.js.map +1 -1
- package/dist/src/ui/output-formatter.d.ts +2 -2
- package/dist/src/ui/output-formatter.d.ts.map +1 -1
- package/dist/src/ui/output-formatter.js +19 -4
- package/dist/src/ui/output-formatter.js.map +1 -1
- package/dist/src/ui/welcome.js +3 -3
- package/dist/src/ui/welcome.js.map +1 -1
- package/dist/src/utils/paths.d.ts +9 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +14 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAIpD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAE/B,UAAU,CAAC,EAAE,MAAM;IAKzB,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC;YAuBlB,WAAW;IAyCzB,OAAO,CAAC,OAAO;YAgDD,YAAY;IAU1B,OAAO,CAAC,SAAS;CAuBlB"}
|
|
@@ -5,12 +5,13 @@ import { homedir } from 'node:os';
|
|
|
5
5
|
import { appConfigSchema } from './config.schema.js';
|
|
6
6
|
import { DEFAULT_CONFIG } from './defaults.js';
|
|
7
7
|
import { SecretsStore } from '../auth/secrets-store.js';
|
|
8
|
+
import { projectStorageDir } from '../utils/paths.js';
|
|
8
9
|
export class ConfigManager {
|
|
9
10
|
globalConfigPath;
|
|
10
11
|
projectConfigPath;
|
|
11
12
|
constructor(projectDir) {
|
|
12
13
|
this.globalConfigPath = join(homedir(), '.cliend', 'config.json');
|
|
13
|
-
this.projectConfigPath = join(projectDir ?? process.cwd(), '
|
|
14
|
+
this.projectConfigPath = join(projectStorageDir(projectDir ?? process.cwd()), 'config.json');
|
|
14
15
|
}
|
|
15
16
|
async load() {
|
|
16
17
|
const globalOverrides = await this.readJsonFile(this.globalConfigPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export declare class Orchestrator {
|
|
|
16
16
|
private readonly complexityRouter;
|
|
17
17
|
private activeLoop;
|
|
18
18
|
constructor(config: AppConfig, logger: Logger);
|
|
19
|
+
abort(): void;
|
|
19
20
|
process(session: SessionInstance, userMessage: string): Promise<OrchestratorResult>;
|
|
20
21
|
}
|
|
21
22
|
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS3D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,qBAAa,YAAY;IASrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,UAAU,CAA4B;gBAG3B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAS3D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,qBAAa,YAAY;IASrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,UAAU,CAA4B;gBAG3B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM;IASjC,KAAK,IAAI,IAAI;IAIP,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsI1F"}
|
|
@@ -24,6 +24,9 @@ export class Orchestrator {
|
|
|
24
24
|
this.registry = new ProviderRegistry(config.providers);
|
|
25
25
|
this.complexityRouter = new ComplexityRouter(config.providers.claude.apiKey);
|
|
26
26
|
}
|
|
27
|
+
abort() {
|
|
28
|
+
this.activeLoop?.abort();
|
|
29
|
+
}
|
|
27
30
|
async process(session, userMessage) {
|
|
28
31
|
const providers = await this.registry.getAvailable();
|
|
29
32
|
if (providers.length === 0) {
|
|
@@ -39,9 +42,11 @@ export class Orchestrator {
|
|
|
39
42
|
const claude = this.registry.getByName('Claude');
|
|
40
43
|
if (claude) {
|
|
41
44
|
console.log(chalk.dim(' Thinking...\n'));
|
|
45
|
+
const start = Date.now();
|
|
42
46
|
const response = await claude.execute(context, session.history);
|
|
47
|
+
const elapsed = Date.now() - start;
|
|
43
48
|
if (response.success && response.output) {
|
|
44
|
-
renderResponse(response.output);
|
|
49
|
+
renderResponse(response.output, elapsed);
|
|
45
50
|
return {
|
|
46
51
|
content: response.output.code,
|
|
47
52
|
};
|
|
@@ -65,8 +70,10 @@ export class Orchestrator {
|
|
|
65
70
|
},
|
|
66
71
|
});
|
|
67
72
|
try {
|
|
73
|
+
const start = Date.now();
|
|
68
74
|
const result = await this.activeLoop.run(agenticContext.prompt, session.history, userMessage);
|
|
69
|
-
|
|
75
|
+
const elapsed = Date.now() - start;
|
|
76
|
+
renderAgenticResponse(result.content, result.toolCalls, result.totalTokens, elapsed);
|
|
70
77
|
return {
|
|
71
78
|
content: result.content,
|
|
72
79
|
metadata: {
|
|
@@ -86,6 +93,7 @@ export class Orchestrator {
|
|
|
86
93
|
}
|
|
87
94
|
const context = this.contextBuilder.build(session, userMessage);
|
|
88
95
|
console.log(chalk.dim(' Thinking...\n'));
|
|
96
|
+
const start = Date.now();
|
|
89
97
|
// Fan-out to all providers
|
|
90
98
|
const responses = await this.fanOut.execute(providers, context, session.history);
|
|
91
99
|
const successful = responses.filter((r) => r.success);
|
|
@@ -119,9 +127,10 @@ export class Orchestrator {
|
|
|
119
127
|
console.log(chalk.dim(` ${f.providerName} failed: ${f.error}`));
|
|
120
128
|
}
|
|
121
129
|
}
|
|
130
|
+
const elapsed = Date.now() - start;
|
|
122
131
|
// Compact scores + response
|
|
123
132
|
renderCompactScores(result.scores);
|
|
124
|
-
renderResponse(result.winningOutput);
|
|
133
|
+
renderResponse(result.winningOutput, elapsed);
|
|
125
134
|
return {
|
|
126
135
|
content: result.winningOutput.code,
|
|
127
136
|
metadata: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAOvD,MAAM,OAAO,YAAY;IASJ;IACA;IATF,cAAc,CAAiB;IAC/B,MAAM,CAAiB;IACvB,KAAK,CAAQ;IACb,QAAQ,CAAmB;IAC3B,gBAAgB,CAAmB;IAC5C,UAAU,GAAuB,IAAI,CAAC;IAE9C,YACmB,MAAiB,EACjB,MAAc;QADd,WAAM,GAAN,MAAM,CAAW;QACjB,WAAM,GAAN,MAAM,CAAQ;QAE/B,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB,EAAE,WAAmB;QACzD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACrD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,yFAAyF;aACnG,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEtF,4CAA4C;QAC5C,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../../src/repl/commands/help.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAC;AAE3E,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../../src/repl/commands/help.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAC;AAE3E,eAAO,MAAM,WAAW,EAAE,YAoDzB,CAAC"}
|
|
@@ -4,31 +4,48 @@ export const helpCommand = {
|
|
|
4
4
|
aliases: ['h', '?'],
|
|
5
5
|
description: 'Show available commands',
|
|
6
6
|
async execute(_args, _ctx) {
|
|
7
|
-
const commands = [
|
|
8
|
-
{ cmd: '/help', desc: 'Show this help message' },
|
|
9
|
-
{ cmd: '/ticket <ID>', desc: 'Fetch/switch Jira ticket context' },
|
|
10
|
-
{ cmd: '/obsidian', desc: 'Refresh Obsidian docs from Bitbucket' },
|
|
11
|
-
{ cmd: '/sessions', desc: 'List all chat sessions' },
|
|
12
|
-
{ cmd: '/resume <N>', desc: 'Resume a previous session' },
|
|
13
|
-
{ cmd: '/new [name]', desc: 'Start a new session' },
|
|
14
|
-
{ cmd: '/memory', desc: 'Show session memory' },
|
|
15
|
-
{ cmd: '/status', desc: 'Check auth and service connectivity' },
|
|
16
|
-
{ cmd: '/config', desc: 'View configuration' },
|
|
17
|
-
{ cmd: '/config setup', desc: 'Re-run the setup wizard' },
|
|
18
|
-
{ cmd: '/breakdown <ID>', desc: 'Break down a ticket into subtasks (via AI + Rovo)' },
|
|
19
|
-
{ cmd: '/search <query>', desc: 'Search Jira & Confluence via Rovo AI' },
|
|
20
|
-
{ cmd: '/auth', desc: 'Authenticate with Atlassian' },
|
|
21
|
-
{ cmd: '/clear', desc: 'Clear the screen' },
|
|
22
|
-
{ cmd: '/exit', desc: 'End the session' },
|
|
23
|
-
];
|
|
24
7
|
console.log('');
|
|
25
|
-
console.log(chalk.bold('
|
|
8
|
+
console.log(chalk.bold(' Commands'));
|
|
26
9
|
console.log('');
|
|
27
|
-
|
|
28
|
-
|
|
10
|
+
const sections = [
|
|
11
|
+
{
|
|
12
|
+
title: 'AI & Tools',
|
|
13
|
+
commands: [
|
|
14
|
+
{ cmd: '@file.ts', desc: 'Attach a file to your message (with autocomplete)' },
|
|
15
|
+
{ cmd: '/ticket <ID>', desc: 'Fetch Jira ticket as context' },
|
|
16
|
+
{ cmd: '/breakdown <ID>', desc: 'Break down a ticket into subtasks' },
|
|
17
|
+
{ cmd: '/search <query>', desc: 'Search Jira & Confluence' },
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
title: 'Sessions',
|
|
22
|
+
commands: [
|
|
23
|
+
{ cmd: '/sessions', desc: 'List all sessions' },
|
|
24
|
+
{ cmd: '/resume [N]', desc: 'Resume session (last used if no N)' },
|
|
25
|
+
{ cmd: '/new [name]', desc: 'Start a new session' },
|
|
26
|
+
{ cmd: '/memory', desc: 'Show session memory' },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
title: 'Admin',
|
|
31
|
+
commands: [
|
|
32
|
+
{ cmd: '/obsidian', desc: 'Refresh Obsidian docs from Bitbucket' },
|
|
33
|
+
{ cmd: '/status', desc: 'Check auth and connectivity' },
|
|
34
|
+
{ cmd: '/config', desc: 'View config | /config setup to re-run wizard' },
|
|
35
|
+
{ cmd: '/auth', desc: 'Authenticate with Atlassian' },
|
|
36
|
+
{ cmd: '/clear', desc: 'Clear screen' },
|
|
37
|
+
{ cmd: '/exit', desc: 'End session' },
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
for (const section of sections) {
|
|
42
|
+
console.log(chalk.dim(` ${section.title}`));
|
|
43
|
+
for (const { cmd, desc } of section.commands) {
|
|
44
|
+
console.log(` ${chalk.cyan(cmd.padEnd(20))} ${chalk.dim(desc)}`);
|
|
45
|
+
}
|
|
46
|
+
console.log('');
|
|
29
47
|
}
|
|
30
|
-
console.log('');
|
|
31
|
-
console.log(chalk.dim(' Or just type a message to start working with AI.'));
|
|
48
|
+
console.log(chalk.dim(' Shortcuts: Ctrl+C interrupt | Up/Down history | @file Tab to autocomplete'));
|
|
32
49
|
console.log('');
|
|
33
50
|
},
|
|
34
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../src/repl/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,yBAAyB;IACtC,KAAK,CAAC,OAAO,CAAC,KAAyB,EAAE,IAAoB;QAC3D,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../src/repl/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IACnB,WAAW,EAAE,yBAAyB;IACtC,KAAK,CAAC,OAAO,CAAC,KAAyB,EAAE,IAAoB;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAmE;YAC/E;gBACE,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE;oBACR,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,mDAAmD,EAAE;oBAC9E,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,8BAA8B,EAAE;oBAC7D,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,mCAAmC,EAAE;oBACrE,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,0BAA0B,EAAE;iBAC7D;aACF;YACD;gBACE,KAAK,EAAE,UAAU;gBACjB,QAAQ,EAAE;oBACR,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE;oBAC/C,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,oCAAoC,EAAE;oBAClE,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,qBAAqB,EAAE;oBACnD,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,EAAE;iBAChD;aACF;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE;oBACR,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,sCAAsC,EAAE;oBAClE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,6BAA6B,EAAE;oBACvD,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,gDAAgD,EAAE;oBAC1E,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE;oBACrD,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE;oBACvC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE;iBACtC;aACF;SACF,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7C,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../../src/repl/commands/sessions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAC;AAE3E,eAAO,MAAM,eAAe,EAAE,YAqB7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../../src/repl/commands/sessions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAC;AAE3E,eAAO,MAAM,eAAe,EAAE,YAqB7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAwC3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,YAS/B,CAAC"}
|
|
@@ -24,12 +24,19 @@ export const resumeCommand = {
|
|
|
24
24
|
aliases: ['r'],
|
|
25
25
|
description: 'Resume a previous session',
|
|
26
26
|
async execute(args, ctx) {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const sessions = await ctx.sessionManager.list();
|
|
28
|
+
if (sessions.length === 0) {
|
|
29
|
+
console.log(chalk.dim('\n No previous sessions to resume.\n'));
|
|
29
30
|
return;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
// No args → resume the most recent session
|
|
33
|
+
let index;
|
|
34
|
+
if (!args) {
|
|
35
|
+
index = 1;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
index = parseInt(args.trim(), 10);
|
|
39
|
+
}
|
|
33
40
|
if (isNaN(index) || index < 1 || index > sessions.length) {
|
|
34
41
|
console.log(chalk.red(`\n Invalid session number. Choose 1-${sessions.length}.\n`));
|
|
35
42
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../../src/repl/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,WAAW,EAAE,yCAAyC;IACtD,KAAK,CAAC,OAAO,CAAC,KAAyB,EAAE,GAAmB;QAC1D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACtE,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,GAAG,CAAC;IACd,WAAW,EAAE,2BAA2B;IACxC,KAAK,CAAC,OAAO,CAAC,IAAwB,EAAE,GAAmB;QACzD,IAAI,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../../src/repl/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface MentionExpansion {
|
|
2
|
+
expandedMessage: string;
|
|
3
|
+
attachments: {
|
|
4
|
+
path: string;
|
|
5
|
+
lines: number;
|
|
6
|
+
}[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extract @file mentions from text.
|
|
10
|
+
* Requires a file extension to avoid matching emails or @usernames.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractMentions(text: string): string[];
|
|
13
|
+
/**
|
|
14
|
+
* Expand @file mentions by reading file contents inline.
|
|
15
|
+
* Sensitive files and paths outside cwd are silently skipped.
|
|
16
|
+
*/
|
|
17
|
+
export declare function expandMentions(text: string, cwd: string): Promise<MentionExpansion>;
|
|
18
|
+
//# sourceMappingURL=file-mentions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-mentions.d.ts","sourceRoot":"","sources":["../../../src/repl/file-mentions.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAKD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGtD;AAOD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqCzF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve, basename } from 'node:path';
|
|
3
|
+
import { SENSITIVE_FILE_PATTERNS } from '../tools/sensitive-patterns.js';
|
|
4
|
+
const MENTION_PATTERN = /@([\w./-]+\.\w+)/g;
|
|
5
|
+
const MAX_FILE_SIZE = 100 * 1024; // 100KB
|
|
6
|
+
/**
|
|
7
|
+
* Extract @file mentions from text.
|
|
8
|
+
* Requires a file extension to avoid matching emails or @usernames.
|
|
9
|
+
*/
|
|
10
|
+
export function extractMentions(text) {
|
|
11
|
+
const matches = [...text.matchAll(MENTION_PATTERN)];
|
|
12
|
+
return matches.map((m) => m[1]);
|
|
13
|
+
}
|
|
14
|
+
function isSensitivePath(filePath) {
|
|
15
|
+
const name = basename(filePath);
|
|
16
|
+
return SENSITIVE_FILE_PATTERNS.some((p) => p.test(name) || p.test(filePath));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Expand @file mentions by reading file contents inline.
|
|
20
|
+
* Sensitive files and paths outside cwd are silently skipped.
|
|
21
|
+
*/
|
|
22
|
+
export async function expandMentions(text, cwd) {
|
|
23
|
+
const mentions = extractMentions(text);
|
|
24
|
+
if (mentions.length === 0) {
|
|
25
|
+
return { expandedMessage: text, attachments: [] };
|
|
26
|
+
}
|
|
27
|
+
let expandedMessage = text;
|
|
28
|
+
const attachments = [];
|
|
29
|
+
for (const mention of mentions) {
|
|
30
|
+
// Security: skip sensitive files
|
|
31
|
+
if (isSensitivePath(mention))
|
|
32
|
+
continue;
|
|
33
|
+
// Security: reject path traversal
|
|
34
|
+
const resolved = resolve(cwd, mention);
|
|
35
|
+
if (!resolved.startsWith(cwd))
|
|
36
|
+
continue;
|
|
37
|
+
try {
|
|
38
|
+
let content = await readFile(resolved, 'utf-8');
|
|
39
|
+
if (content.length > MAX_FILE_SIZE) {
|
|
40
|
+
content = content.slice(0, MAX_FILE_SIZE) + '\n\n... (truncated at 100KB)';
|
|
41
|
+
}
|
|
42
|
+
const lines = content.split('\n').length;
|
|
43
|
+
attachments.push({ path: mention, lines });
|
|
44
|
+
expandedMessage = expandedMessage.replace(`@${mention}`, `@${mention}\n\n<file path="${mention}">\n${content}\n</file>`);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// File doesn't exist or unreadable — leave mention as-is
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { expandedMessage, attachments };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=file-mentions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-mentions.js","sourceRoot":"","sources":["../../../src/repl/file-mentions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAOzE,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAC5C,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE1C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW;IAC5D,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,eAAe,GAAG,IAAI,CAAC;IAC3B,MAAM,WAAW,GAAsC,EAAE,CAAC;IAE1D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,iCAAiC;QACjC,IAAI,eAAe,CAAC,OAAO,CAAC;YAAE,SAAS;QAEvC,kCAAkC;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAExC,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,OAAO,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;gBACnC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,8BAA8B,CAAC;YAC7E,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACzC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3C,eAAe,GAAG,eAAe,CAAC,OAAO,CACvC,IAAI,OAAO,EAAE,EACb,IAAI,OAAO,mBAAmB,OAAO,OAAO,OAAO,WAAW,CAC/D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as readline from 'node:readline';
|
|
2
|
+
/**
|
|
3
|
+
* Interactive file-mention dropdown that hooks into readline.
|
|
4
|
+
* Activates when the user types `@`, shows matching files below the cursor,
|
|
5
|
+
* and allows arrow-key navigation + Tab/Enter to select.
|
|
6
|
+
*/
|
|
7
|
+
export declare class MentionDropdown {
|
|
8
|
+
private readonly rl;
|
|
9
|
+
private readonly getCwd;
|
|
10
|
+
private state;
|
|
11
|
+
constructor(rl: readline.Interface, getCwd: () => string);
|
|
12
|
+
get active(): boolean;
|
|
13
|
+
/** Hook into readline's internal _ttyWrite to intercept keystrokes. */
|
|
14
|
+
private hookTtyWrite;
|
|
15
|
+
/** Check if the current line has an @ mention that should trigger the dropdown. */
|
|
16
|
+
private checkActivation;
|
|
17
|
+
/** Re-evaluate the dropdown after the user types/deletes a character. */
|
|
18
|
+
private updateFromLine;
|
|
19
|
+
/** List matching files/dirs and render the dropdown. */
|
|
20
|
+
private fetchAndRender;
|
|
21
|
+
/** Draw the dropdown below the current cursor position. */
|
|
22
|
+
private render;
|
|
23
|
+
/** Erase previously rendered dropdown lines. */
|
|
24
|
+
private clearRendered;
|
|
25
|
+
/** Move selection up or down. */
|
|
26
|
+
private navigate;
|
|
27
|
+
/** Insert the selected match into the readline buffer and close dropdown. */
|
|
28
|
+
private select;
|
|
29
|
+
/** Close the dropdown without selecting. */
|
|
30
|
+
private dismiss;
|
|
31
|
+
/** Clean up on REPL exit. */
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=mention-dropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mention-dropdown.d.ts","sourceRoot":"","sources":["../../../src/repl/mention-dropdown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAa1C;;;;GAIG;AACH,qBAAa,eAAe;IAUxB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,KAAK,CAMX;gBAGiB,EAAE,EAAE,QAAQ,CAAC,SAAS,EACtB,MAAM,EAAE,MAAM,MAAM;IAKvC,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,uEAAuE;IACvE,OAAO,CAAC,YAAY;IAsCpB,mFAAmF;IACnF,OAAO,CAAC,eAAe;IAkBvB,yEAAyE;IACzE,OAAO,CAAC,cAAc;IAkBtB,wDAAwD;IACxD,OAAO,CAAC,cAAc;IAuCtB,2DAA2D;IAC3D,OAAO,CAAC,MAAM;IAkCd,gDAAgD;IAChD,OAAO,CAAC,aAAa;IAiBrB,iCAAiC;IACjC,OAAO,CAAC,QAAQ;IAMhB,6EAA6E;IAC7E,OAAO,CAAC,MAAM;IAuCd,4CAA4C;IAC5C,OAAO,CAAC,OAAO;IAOf,6BAA6B;IAC7B,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import * as readline from 'node:readline';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const MAX_VISIBLE = 8;
|
|
6
|
+
/**
|
|
7
|
+
* Interactive file-mention dropdown that hooks into readline.
|
|
8
|
+
* Activates when the user types `@`, shows matching files below the cursor,
|
|
9
|
+
* and allows arrow-key navigation + Tab/Enter to select.
|
|
10
|
+
*/
|
|
11
|
+
export class MentionDropdown {
|
|
12
|
+
rl;
|
|
13
|
+
getCwd;
|
|
14
|
+
state = {
|
|
15
|
+
active: false,
|
|
16
|
+
matches: [],
|
|
17
|
+
selectedIndex: 0,
|
|
18
|
+
mentionStart: -1,
|
|
19
|
+
renderedLines: 0,
|
|
20
|
+
};
|
|
21
|
+
constructor(rl, getCwd) {
|
|
22
|
+
this.rl = rl;
|
|
23
|
+
this.getCwd = getCwd;
|
|
24
|
+
this.hookTtyWrite();
|
|
25
|
+
}
|
|
26
|
+
get active() {
|
|
27
|
+
return this.state.active;
|
|
28
|
+
}
|
|
29
|
+
/** Hook into readline's internal _ttyWrite to intercept keystrokes. */
|
|
30
|
+
hookTtyWrite() {
|
|
31
|
+
const rlAny = this.rl;
|
|
32
|
+
const origTtyWrite = rlAny._ttyWrite.bind(rlAny);
|
|
33
|
+
rlAny._ttyWrite = (s, key) => {
|
|
34
|
+
if (this.state.active) {
|
|
35
|
+
if (key.name === 'up') {
|
|
36
|
+
this.navigate(-1);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (key.name === 'down') {
|
|
40
|
+
this.navigate(1);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (key.name === 'tab' || key.name === 'return') {
|
|
44
|
+
this.select();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (key.name === 'escape') {
|
|
48
|
+
this.dismiss();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Pass other keys to readline, then update dropdown
|
|
52
|
+
origTtyWrite(s, key);
|
|
53
|
+
this.updateFromLine();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Not in dropdown mode — pass through normally
|
|
57
|
+
origTtyWrite(s, key);
|
|
58
|
+
// Check if we should activate (user just typed @ or is typing after @)
|
|
59
|
+
this.checkActivation();
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Check if the current line has an @ mention that should trigger the dropdown. */
|
|
63
|
+
checkActivation() {
|
|
64
|
+
const rlAny = this.rl;
|
|
65
|
+
const line = rlAny.line;
|
|
66
|
+
const cursor = rlAny.cursor;
|
|
67
|
+
const beforeCursor = line.slice(0, cursor);
|
|
68
|
+
const atIndex = beforeCursor.lastIndexOf('@');
|
|
69
|
+
if (atIndex === -1)
|
|
70
|
+
return;
|
|
71
|
+
const partial = beforeCursor.slice(atIndex + 1);
|
|
72
|
+
// Don't activate if there's a space after @ (it's prose, not a file path)
|
|
73
|
+
if (partial.includes(' '))
|
|
74
|
+
return;
|
|
75
|
+
this.state.mentionStart = atIndex;
|
|
76
|
+
this.fetchAndRender(partial);
|
|
77
|
+
}
|
|
78
|
+
/** Re-evaluate the dropdown after the user types/deletes a character. */
|
|
79
|
+
updateFromLine() {
|
|
80
|
+
const rlAny = this.rl;
|
|
81
|
+
const line = rlAny.line;
|
|
82
|
+
const cursor = rlAny.cursor;
|
|
83
|
+
const beforeCursor = line.slice(0, cursor);
|
|
84
|
+
const atIndex = beforeCursor.lastIndexOf('@');
|
|
85
|
+
if (atIndex === -1 || beforeCursor.slice(atIndex + 1).includes(' ')) {
|
|
86
|
+
this.dismiss();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const partial = beforeCursor.slice(atIndex + 1);
|
|
90
|
+
this.state.mentionStart = atIndex;
|
|
91
|
+
this.fetchAndRender(partial);
|
|
92
|
+
}
|
|
93
|
+
/** List matching files/dirs and render the dropdown. */
|
|
94
|
+
fetchAndRender(partial) {
|
|
95
|
+
const cwd = this.getCwd();
|
|
96
|
+
const lastSlash = partial.lastIndexOf('/');
|
|
97
|
+
const dirPart = lastSlash >= 0 ? partial.slice(0, lastSlash + 1) : '';
|
|
98
|
+
const prefix = lastSlash >= 0 ? partial.slice(lastSlash + 1) : partial;
|
|
99
|
+
try {
|
|
100
|
+
const dirPath = join(cwd, dirPart);
|
|
101
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
102
|
+
const matches = entries
|
|
103
|
+
.filter((e) => {
|
|
104
|
+
if (e.name.startsWith('.'))
|
|
105
|
+
return false;
|
|
106
|
+
if (e.name === 'node_modules')
|
|
107
|
+
return false;
|
|
108
|
+
return e.name.toLowerCase().startsWith(prefix.toLowerCase());
|
|
109
|
+
})
|
|
110
|
+
.map((e) => {
|
|
111
|
+
const name = e.isDirectory() ? `${e.name}/` : e.name;
|
|
112
|
+
return `${dirPart}${name}`;
|
|
113
|
+
})
|
|
114
|
+
.slice(0, MAX_VISIBLE);
|
|
115
|
+
if (matches.length === 0) {
|
|
116
|
+
this.dismiss();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.state.active = true;
|
|
120
|
+
this.state.matches = matches;
|
|
121
|
+
// Keep selection in bounds
|
|
122
|
+
if (this.state.selectedIndex >= matches.length) {
|
|
123
|
+
this.state.selectedIndex = 0;
|
|
124
|
+
}
|
|
125
|
+
this.render();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
this.dismiss();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** Draw the dropdown below the current cursor position. */
|
|
132
|
+
render() {
|
|
133
|
+
const { matches, selectedIndex } = this.state;
|
|
134
|
+
if (matches.length === 0)
|
|
135
|
+
return;
|
|
136
|
+
// Clear any previous dropdown
|
|
137
|
+
this.clearRendered();
|
|
138
|
+
// Save cursor position
|
|
139
|
+
process.stdout.write('\x1b7');
|
|
140
|
+
// Move to next line and render each entry
|
|
141
|
+
for (let i = 0; i < matches.length; i++) {
|
|
142
|
+
process.stdout.write('\n');
|
|
143
|
+
readline.clearLine(process.stdout, 0);
|
|
144
|
+
readline.cursorTo(process.stdout, 2);
|
|
145
|
+
const match = matches[i];
|
|
146
|
+
const isDir = match.endsWith('/');
|
|
147
|
+
if (i === selectedIndex) {
|
|
148
|
+
process.stdout.write(chalk.bgCyan.black(` ${match} `));
|
|
149
|
+
}
|
|
150
|
+
else if (isDir) {
|
|
151
|
+
process.stdout.write(chalk.blue(` ${match} `));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
process.stdout.write(chalk.dim(` ${match} `));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
this.state.renderedLines = matches.length;
|
|
158
|
+
// Restore cursor position
|
|
159
|
+
process.stdout.write('\x1b8');
|
|
160
|
+
}
|
|
161
|
+
/** Erase previously rendered dropdown lines. */
|
|
162
|
+
clearRendered() {
|
|
163
|
+
if (this.state.renderedLines === 0)
|
|
164
|
+
return;
|
|
165
|
+
// Save cursor
|
|
166
|
+
process.stdout.write('\x1b7');
|
|
167
|
+
// Move down and clear each line
|
|
168
|
+
for (let i = 0; i < this.state.renderedLines; i++) {
|
|
169
|
+
process.stdout.write('\n');
|
|
170
|
+
readline.clearLine(process.stdout, 0);
|
|
171
|
+
}
|
|
172
|
+
// Restore cursor
|
|
173
|
+
process.stdout.write('\x1b8');
|
|
174
|
+
this.state.renderedLines = 0;
|
|
175
|
+
}
|
|
176
|
+
/** Move selection up or down. */
|
|
177
|
+
navigate(direction) {
|
|
178
|
+
const len = this.state.matches.length;
|
|
179
|
+
this.state.selectedIndex = (this.state.selectedIndex + direction + len) % len;
|
|
180
|
+
this.render();
|
|
181
|
+
}
|
|
182
|
+
/** Insert the selected match into the readline buffer and close dropdown. */
|
|
183
|
+
select() {
|
|
184
|
+
const { matches, selectedIndex, mentionStart } = this.state;
|
|
185
|
+
const selected = matches[selectedIndex];
|
|
186
|
+
this.clearRendered();
|
|
187
|
+
this.state.active = false;
|
|
188
|
+
this.state.matches = [];
|
|
189
|
+
this.state.selectedIndex = 0;
|
|
190
|
+
const rlAny = this.rl;
|
|
191
|
+
const line = rlAny.line;
|
|
192
|
+
const cursor = rlAny.cursor;
|
|
193
|
+
// Build new line: everything before @, then @selected, then everything after cursor
|
|
194
|
+
const before = line.slice(0, mentionStart + 1); // includes @
|
|
195
|
+
const after = line.slice(cursor);
|
|
196
|
+
const newLine = `${before}${selected}${after}`;
|
|
197
|
+
const newCursor = mentionStart + 1 + selected.length;
|
|
198
|
+
// Rewrite the readline buffer
|
|
199
|
+
rlAny.line = newLine;
|
|
200
|
+
rlAny.cursor = newCursor;
|
|
201
|
+
// Redraw the prompt line
|
|
202
|
+
readline.clearLine(process.stdout, 0);
|
|
203
|
+
readline.cursorTo(process.stdout, 0);
|
|
204
|
+
process.stdout.write(rlAny._prompt + newLine);
|
|
205
|
+
// Position cursor correctly if there's text after
|
|
206
|
+
if (after.length > 0) {
|
|
207
|
+
readline.moveCursor(process.stdout, -after.length, 0);
|
|
208
|
+
}
|
|
209
|
+
// If the selected item is a directory, immediately show its contents
|
|
210
|
+
if (selected.endsWith('/')) {
|
|
211
|
+
this.checkActivation();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Close the dropdown without selecting. */
|
|
215
|
+
dismiss() {
|
|
216
|
+
this.clearRendered();
|
|
217
|
+
this.state.active = false;
|
|
218
|
+
this.state.matches = [];
|
|
219
|
+
this.state.selectedIndex = 0;
|
|
220
|
+
}
|
|
221
|
+
/** Clean up on REPL exit. */
|
|
222
|
+
destroy() {
|
|
223
|
+
this.clearRendered();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=mention-dropdown.js.map
|