daedalus-cli 1.81.0 → 1.83.0
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/CHANGELOG.md +14 -0
- package/README.md +9 -3
- package/dist/bot/commands.d.ts +3 -0
- package/dist/bot/commands.d.ts.map +1 -0
- package/dist/bot/commands.js +99 -0
- package/dist/bot/commands.js.map +1 -0
- package/dist/bot/handlers.d.ts +4 -0
- package/dist/bot/handlers.d.ts.map +1 -0
- package/dist/bot/handlers.js +651 -0
- package/dist/bot/handlers.js.map +1 -0
- package/dist/bot/index.d.ts +2 -0
- package/dist/bot/index.d.ts.map +1 -0
- package/dist/bot/index.js +43 -0
- package/dist/bot/index.js.map +1 -0
- package/dist/bot/prompt.d.ts +2 -0
- package/dist/bot/prompt.d.ts.map +1 -0
- package/dist/bot/prompt.js +40 -0
- package/dist/bot/prompt.js.map +1 -0
- package/dist/bot/responses.d.ts +8 -0
- package/dist/bot/responses.d.ts.map +1 -0
- package/dist/bot/responses.js +60 -0
- package/dist/bot/responses.js.map +1 -0
- package/dist/config/hello.d.ts +2 -0
- package/dist/config/hello.d.ts.map +1 -0
- package/dist/config/hello.js +3 -0
- package/dist/config/hello.js.map +1 -0
- package/dist/config/index.d.ts +13 -12
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +6 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/validate.d.ts +8 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +49 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/config/validate.test.d.ts +2 -0
- package/dist/config/validate.test.d.ts.map +1 -0
- package/dist/config/validate.test.js +49 -0
- package/dist/config/validate.test.js.map +1 -0
- package/dist/tools/daedalus-spinner.test.d.ts +2 -0
- package/dist/tools/daedalus-spinner.test.d.ts.map +1 -0
- package/dist/tools/daedalus-spinner.test.js +75 -0
- package/dist/tools/daedalus-spinner.test.js.map +1 -0
- package/dist/tools/deps.d.ts +22 -0
- package/dist/tools/deps.d.ts.map +1 -0
- package/dist/tools/deps.js +70 -0
- package/dist/tools/deps.js.map +1 -0
- package/dist/tools/logger.d.ts +19 -0
- package/dist/tools/logger.d.ts.map +1 -0
- package/dist/tools/logger.js +30 -0
- package/dist/tools/logger.js.map +1 -0
- package/dist/tools/logger.test.d.ts +2 -0
- package/dist/tools/logger.test.d.ts.map +1 -0
- package/dist/tools/logger.test.js +59 -0
- package/dist/tools/logger.test.js.map +1 -0
- package/dist/tools/repl.d.ts +24 -0
- package/dist/tools/repl.d.ts.map +1 -0
- package/dist/tools/repl.js +170 -0
- package/dist/tools/repl.js.map +1 -0
- package/dist/tools/telemetry.d.ts +24 -0
- package/dist/tools/telemetry.d.ts.map +1 -0
- package/dist/tools/telemetry.js +55 -0
- package/dist/tools/telemetry.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { validateConfig, ConfigValidationError } from './validate.js';
|
|
3
|
+
import { DEFAULT_CONFIG } from './index.js';
|
|
4
|
+
describe('validateConfig', () => {
|
|
5
|
+
it('accepts a valid default config', () => {
|
|
6
|
+
const result = validateConfig(DEFAULT_CONFIG);
|
|
7
|
+
expect(result).toBeDefined();
|
|
8
|
+
expect(result.version).toBe(1);
|
|
9
|
+
});
|
|
10
|
+
it('rejects null config', () => {
|
|
11
|
+
expect(() => validateConfig(null)).toThrow(ConfigValidationError);
|
|
12
|
+
expect(() => validateConfig(null)).toThrow('Config must be a non-null object');
|
|
13
|
+
});
|
|
14
|
+
it('rejects non-object config', () => {
|
|
15
|
+
expect(() => validateConfig('string')).toThrow(ConfigValidationError);
|
|
16
|
+
expect(() => validateConfig([])).toThrow(ConfigValidationError);
|
|
17
|
+
expect(() => validateConfig(123)).toThrow(ConfigValidationError);
|
|
18
|
+
});
|
|
19
|
+
it('rejects invalid router strategy', () => {
|
|
20
|
+
expect(() => validateConfig({
|
|
21
|
+
router: { strategy: 'invalid', chain: [] },
|
|
22
|
+
})).toThrow(ConfigValidationError);
|
|
23
|
+
});
|
|
24
|
+
it('rejects invalid endpoint format', () => {
|
|
25
|
+
expect(() => validateConfig({
|
|
26
|
+
router: {
|
|
27
|
+
strategy: 'priority',
|
|
28
|
+
chain: [{ name: 'test', endpoint: 'not-a-url', model: 'auto', priority: 1, enabled: true }],
|
|
29
|
+
},
|
|
30
|
+
})).toThrow(ConfigValidationError);
|
|
31
|
+
});
|
|
32
|
+
it('rejects negative priority', () => {
|
|
33
|
+
expect(() => validateConfig({
|
|
34
|
+
router: {
|
|
35
|
+
strategy: 'priority',
|
|
36
|
+
chain: [{ name: 'test', endpoint: 'http://localhost:1234/v1', model: 'auto', priority: -1, enabled: true }],
|
|
37
|
+
},
|
|
38
|
+
})).toThrow(ConfigValidationError);
|
|
39
|
+
});
|
|
40
|
+
it('accepts minimal valid config', () => {
|
|
41
|
+
const result = validateConfig({
|
|
42
|
+
router: { strategy: 'priority', chain: [] },
|
|
43
|
+
});
|
|
44
|
+
expect(result.version).toBe(1);
|
|
45
|
+
expect(result.router.healthCheckInterval).toBe(30000);
|
|
46
|
+
expect(result.indexing.enabled).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=validate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../src/config/validate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daedalus-spinner.test.d.ts","sourceRoot":"","sources":["../../src/tools/daedalus-spinner.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { DaedalusSpinner } from './daedalus-spinner.js';
|
|
3
|
+
describe('DaedalusSpinner', () => {
|
|
4
|
+
let spinner;
|
|
5
|
+
let stdoutWriteSpy;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
// Mock stdout.write and isTTY
|
|
8
|
+
stdoutWriteSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
9
|
+
Object.defineProperty(process.stdout, 'isTTY', {
|
|
10
|
+
value: true,
|
|
11
|
+
writable: true,
|
|
12
|
+
});
|
|
13
|
+
// Reset global state
|
|
14
|
+
globalThis.isTui = false;
|
|
15
|
+
globalThis.tuiLogBox = undefined;
|
|
16
|
+
globalThis.tuiScreen = undefined;
|
|
17
|
+
spinner = new DaedalusSpinner();
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
stdoutWriteSpy.mockRestore();
|
|
21
|
+
});
|
|
22
|
+
it('creates a spinner with default options', () => {
|
|
23
|
+
expect(spinner).toBeInstanceOf(DaedalusSpinner);
|
|
24
|
+
expect(spinner).toHaveProperty('frames', DaedalusSpinner.GEAR_FRAMES);
|
|
25
|
+
expect(spinner).toHaveProperty('interval', 100);
|
|
26
|
+
expect(spinner).toHaveProperty('text', 'Daedalus thinking');
|
|
27
|
+
});
|
|
28
|
+
it('creates a spinner with custom options', () => {
|
|
29
|
+
const customSpinner = new DaedalusSpinner({
|
|
30
|
+
text: 'Custom text',
|
|
31
|
+
frames: DaedalusSpinner.MAZE_FRAMES,
|
|
32
|
+
interval: 200,
|
|
33
|
+
});
|
|
34
|
+
expect(customSpinner).toHaveProperty('text', 'Custom text');
|
|
35
|
+
expect(customSpinner).toHaveProperty('frames', DaedalusSpinner.MAZE_FRAMES);
|
|
36
|
+
expect(customSpinner).toHaveProperty('interval', 200);
|
|
37
|
+
});
|
|
38
|
+
it('starts the spinner', () => {
|
|
39
|
+
spinner.start();
|
|
40
|
+
expect(spinner).toHaveProperty('running', true);
|
|
41
|
+
});
|
|
42
|
+
it('does not start if already running', () => {
|
|
43
|
+
spinner.start();
|
|
44
|
+
const initialRunning = spinner['running'];
|
|
45
|
+
spinner.start();
|
|
46
|
+
expect(spinner).toHaveProperty('running', initialRunning);
|
|
47
|
+
});
|
|
48
|
+
it('stops the spinner', () => {
|
|
49
|
+
spinner.start();
|
|
50
|
+
spinner.stop();
|
|
51
|
+
expect(spinner).toHaveProperty('running', false);
|
|
52
|
+
});
|
|
53
|
+
it('succeeds and stops with success message', () => {
|
|
54
|
+
spinner.start();
|
|
55
|
+
spinner.succeed('Operation completed');
|
|
56
|
+
expect(spinner).toHaveProperty('running', false);
|
|
57
|
+
expect(stdoutWriteSpy).toHaveBeenCalledWith('\x1b[32m\u2714\x1b[0m Operation completed\n');
|
|
58
|
+
});
|
|
59
|
+
it('fails and stops with error message', () => {
|
|
60
|
+
spinner.start();
|
|
61
|
+
spinner.fail('Operation failed');
|
|
62
|
+
expect(spinner).toHaveProperty('running', false);
|
|
63
|
+
expect(stdoutWriteSpy).toHaveBeenCalledWith('\x1b[31m\u2718\x1b[0m Operation failed\n');
|
|
64
|
+
});
|
|
65
|
+
it('updates text correctly', () => {
|
|
66
|
+
spinner.updateText('New text');
|
|
67
|
+
expect(spinner).toHaveProperty('text', 'New text');
|
|
68
|
+
});
|
|
69
|
+
it('handles TUI mode correctly', () => {
|
|
70
|
+
globalThis.isTui = true;
|
|
71
|
+
spinner.start();
|
|
72
|
+
expect(stdoutWriteSpy).not.toHaveBeenCalled();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=daedalus-spinner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daedalus-spinner.test.js","sourceRoot":"","sources":["../../src/tools/daedalus-spinner.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Logger } from './logger.js';
|
|
2
|
+
export declare class MissingDependencyError extends Error {
|
|
3
|
+
dependency?: string | undefined;
|
|
4
|
+
constructor(message: string, dependency?: string | undefined);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Checks if a command is available in the system PATH
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkCommand(command: string, logger?: Logger): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Ensures a required dependency is available, throwing if not found
|
|
12
|
+
*/
|
|
13
|
+
export declare function ensureCommand(command: string, logger?: Logger): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Checks multiple dependencies and returns any that are missing
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkDependencies(commands: string[], logger?: Logger): Promise<string[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Provides a friendly error message when a dependency is missing
|
|
20
|
+
*/
|
|
21
|
+
export declare function getDependencyHelp(command: string): string;
|
|
22
|
+
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/tools/deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,qBAAa,sBAAuB,SAAQ,KAAK;IACX,UAAU,CAAC,EAAE,MAAM;gBAA3C,OAAO,EAAE,MAAM,EAAS,UAAU,CAAC,EAAE,MAAM,YAAA;CAIxD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBrF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOzD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as child from 'child_process';
|
|
2
|
+
export class MissingDependencyError extends Error {
|
|
3
|
+
dependency;
|
|
4
|
+
constructor(message, dependency) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.dependency = dependency;
|
|
7
|
+
this.name = 'MissingDependencyError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Checks if a command is available in the system PATH
|
|
12
|
+
*/
|
|
13
|
+
export async function checkCommand(command, logger) {
|
|
14
|
+
try {
|
|
15
|
+
// On Windows, we need to handle .exe extensions
|
|
16
|
+
const platform = process.platform;
|
|
17
|
+
const commandsToTry = [command];
|
|
18
|
+
if (platform === 'win32') {
|
|
19
|
+
commandsToTry.push(`${command}.exe`);
|
|
20
|
+
}
|
|
21
|
+
for (const cmd of commandsToTry) {
|
|
22
|
+
await new Promise((resolve) => {
|
|
23
|
+
child.exec(cmd + ' --version', (err) => {
|
|
24
|
+
resolve(err ? false : true);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
if (logger) {
|
|
32
|
+
logger.debug(`Command '${command}' not found or failed version check`);
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Ensures a required dependency is available, throwing if not found
|
|
39
|
+
*/
|
|
40
|
+
export async function ensureCommand(command, logger) {
|
|
41
|
+
const available = await checkCommand(command, logger);
|
|
42
|
+
if (!available) {
|
|
43
|
+
throw new MissingDependencyError(`Required command '${command}' is not available in your PATH.\nPlease install ${command} and ensure it's accessible from the command line.`, command);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Checks multiple dependencies and returns any that are missing
|
|
48
|
+
*/
|
|
49
|
+
export async function checkDependencies(commands, logger) {
|
|
50
|
+
const missing = [];
|
|
51
|
+
for (const cmd of commands) {
|
|
52
|
+
const available = await checkCommand(cmd, logger);
|
|
53
|
+
if (!available) {
|
|
54
|
+
missing.push(cmd);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return missing;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Provides a friendly error message when a dependency is missing
|
|
61
|
+
*/
|
|
62
|
+
export function getDependencyHelp(command) {
|
|
63
|
+
const helpMap = {
|
|
64
|
+
git: 'Install Git from https://git-scm.com/',
|
|
65
|
+
node: 'Node.js is required. Download from https://nodejs.org/',
|
|
66
|
+
npm: 'npm comes with Node.js. Install Node.js first.',
|
|
67
|
+
};
|
|
68
|
+
return helpMap[command] || `Please install ${command}.`;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/tools/deps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,eAAe,CAAC;AAGvC,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACX;IAApC,YAAY,OAAe,EAAS,UAAmB;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,eAAU,GAAV,UAAU,CAAS;QAErD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,MAAe;IACjE,IAAI,CAAC;QACH,gDAAgD;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;oBACrC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,qCAAqC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,MAAe;IAEf,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,sBAAsB,CAC9B,qBAAqB,OAAO,oDAAoD,OAAO,oDAAoD,EAC3I,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAkB,EAClB,MAAe;IAEf,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,OAAO,GAA2B;QACtC,GAAG,EAAE,uCAAuC;QAC5C,IAAI,EAAE,wDAAwD;QAC9D,GAAG,EAAE,gDAAgD;KACtD,CAAC;IACF,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,kBAAkB,OAAO,GAAG,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DaedalusConfig } from '../config/index.js';
|
|
2
|
+
export interface Logger {
|
|
3
|
+
log(...args: any[]): void;
|
|
4
|
+
error(...args: any[]): void;
|
|
5
|
+
debug(...args: any[]): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class ConsoleLogger implements Logger {
|
|
8
|
+
log(...args: any[]): void;
|
|
9
|
+
error(...args: any[]): void;
|
|
10
|
+
debug(...args: any[]): void;
|
|
11
|
+
}
|
|
12
|
+
export declare class SilentLogger implements Logger {
|
|
13
|
+
log(...args: any[]): void;
|
|
14
|
+
error(...args: any[]): void;
|
|
15
|
+
debug(...args: any[]): void;
|
|
16
|
+
}
|
|
17
|
+
export declare function createLogger(useColors?: boolean, silent?: boolean): Logger;
|
|
18
|
+
export declare function configureLogger(config: DaedalusConfig): Logger;
|
|
19
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/tools/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,MAAM,WAAW,MAAM;IACrB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;CAC7B;AAED,qBAAa,aAAc,YAAW,MAAM;IAC1C,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;CAK5B;AAED,qBAAa,YAAa,YAAW,MAAM;IACzC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IACzB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAC3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;CAC5B;AAED,wBAAgB,YAAY,CAAC,SAAS,UAAO,EAAE,MAAM,UAAQ,GAAG,MAAM,CAKrE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI9D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class ConsoleLogger {
|
|
2
|
+
log(...args) {
|
|
3
|
+
console.log(...args);
|
|
4
|
+
}
|
|
5
|
+
error(...args) {
|
|
6
|
+
console.error(...args);
|
|
7
|
+
}
|
|
8
|
+
debug(...args) {
|
|
9
|
+
if (process.env.DAedalus_DEBUG === 'true') {
|
|
10
|
+
console.log('[DEBUG]', ...args);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class SilentLogger {
|
|
15
|
+
log(...args) { }
|
|
16
|
+
error(...args) { }
|
|
17
|
+
debug(...args) { }
|
|
18
|
+
}
|
|
19
|
+
export function createLogger(useColors = true, silent = false) {
|
|
20
|
+
if (silent) {
|
|
21
|
+
return new SilentLogger();
|
|
22
|
+
}
|
|
23
|
+
return new ConsoleLogger();
|
|
24
|
+
}
|
|
25
|
+
export function configureLogger(config) {
|
|
26
|
+
const { tui = false } = config.ui || {};
|
|
27
|
+
const silent = config.ui?.tui === true;
|
|
28
|
+
return createLogger(!silent, silent);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/tools/logger.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,aAAa;IACxB,GAAG,CAAC,GAAG,IAAW;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,IAAW;QAClB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,IAAW;QAClB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACvB,GAAG,CAAC,GAAG,IAAW,IAAS,CAAC;IAC5B,KAAK,CAAC,GAAG,IAAW,IAAS,CAAC;IAC9B,KAAK,CAAC,GAAG,IAAW,IAAS,CAAC;CAC/B;AAED,MAAM,UAAU,YAAY,CAAC,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,KAAK;IAC3D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,YAAY,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,MAAM,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,OAAO,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../../src/tools/logger.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { ConsoleLogger, SilentLogger, createLogger, configureLogger } from './logger.js';
|
|
3
|
+
describe('Logger', () => {
|
|
4
|
+
it('creates a ConsoleLogger that logs to console', () => {
|
|
5
|
+
const logger = new ConsoleLogger();
|
|
6
|
+
const logSpy = vi.spyOn(console, 'log');
|
|
7
|
+
logger.log('test message');
|
|
8
|
+
expect(logSpy).toHaveBeenCalledWith('test message');
|
|
9
|
+
});
|
|
10
|
+
it('creates a ConsoleLogger that errors to console.error', () => {
|
|
11
|
+
const logger = new ConsoleLogger();
|
|
12
|
+
const errorSpy = vi.spyOn(console, 'error');
|
|
13
|
+
logger.error('test error');
|
|
14
|
+
expect(errorSpy).toHaveBeenCalledWith('test error');
|
|
15
|
+
});
|
|
16
|
+
it('ConsoleLogger debug only logs when DAedalus_DEBUG is true', () => {
|
|
17
|
+
const originalDebug = process.env.DAedalus_DEBUG;
|
|
18
|
+
// Test with debug enabled
|
|
19
|
+
process.env.DAedalus_DEBUG = 'true';
|
|
20
|
+
const logger = new ConsoleLogger();
|
|
21
|
+
const debugSpy = vi.spyOn(console, 'log');
|
|
22
|
+
logger.debug('debug message');
|
|
23
|
+
expect(debugSpy).toHaveBeenCalledWith('[DEBUG]', 'debug message');
|
|
24
|
+
// Test with debug disabled (restore original)
|
|
25
|
+
process.env.DAedalus_DEBUG = originalDebug;
|
|
26
|
+
debugSpy.mockClear();
|
|
27
|
+
logger.debug('should not appear');
|
|
28
|
+
expect(debugSpy).not.toHaveBeenCalled();
|
|
29
|
+
});
|
|
30
|
+
it('creates a SilentLogger that does nothing', () => {
|
|
31
|
+
const logger = new SilentLogger();
|
|
32
|
+
const logSpy = vi.spyOn(console, 'log');
|
|
33
|
+
const errorSpy = vi.spyOn(console, 'error');
|
|
34
|
+
logger.log('this should not be logged');
|
|
35
|
+
logger.error('this should not be logged');
|
|
36
|
+
logger.debug('this should not be logged');
|
|
37
|
+
expect(logSpy).not.toHaveBeenCalled();
|
|
38
|
+
expect(errorSpy).not.toHaveBeenCalled();
|
|
39
|
+
});
|
|
40
|
+
it('createLogger returns SilentLogger when silent=true', () => {
|
|
41
|
+
const logger = createLogger(true, true);
|
|
42
|
+
expect(logger instanceof SilentLogger).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('createLogger returns ConsoleLogger when silent=false', () => {
|
|
45
|
+
const logger = createLogger(false, false);
|
|
46
|
+
expect(logger instanceof ConsoleLogger).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('configureLogger creates SilentLogger when tui=true', () => {
|
|
49
|
+
const config = { ui: { tui: true } };
|
|
50
|
+
const logger = configureLogger(config);
|
|
51
|
+
expect(logger instanceof SilentLogger).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it('configureLogger creates ConsoleLogger when tui=false', () => {
|
|
54
|
+
const config = { ui: { tui: false } };
|
|
55
|
+
const logger = configureLogger(config);
|
|
56
|
+
expect(logger instanceof ConsoleLogger).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=logger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../src/tools/logger.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare class REPL {
|
|
2
|
+
private rl;
|
|
3
|
+
private context;
|
|
4
|
+
private logger;
|
|
5
|
+
constructor(projectRoot?: string);
|
|
6
|
+
private setupCommands;
|
|
7
|
+
private executeCommand;
|
|
8
|
+
private showHelp;
|
|
9
|
+
private showLast;
|
|
10
|
+
private editFile;
|
|
11
|
+
private detectEditor;
|
|
12
|
+
private listActiveFiles;
|
|
13
|
+
private clearScreen;
|
|
14
|
+
private showHistory;
|
|
15
|
+
private showContext;
|
|
16
|
+
prompt(): void;
|
|
17
|
+
close(): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Starts the interactive REPL environment
|
|
21
|
+
*/
|
|
22
|
+
export declare function startRepl(projectRoot?: string): REPL;
|
|
23
|
+
export default startRepl;
|
|
24
|
+
//# sourceMappingURL=repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/tools/repl.ts"],"names":[],"mappings":"AAYA,qBAAa,IAAI;IACf,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAC;gBAEH,WAAW,GAAE,MAAsB;IAiB/C,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,QAAQ;IAuBhB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;IAYZ,MAAM,IAAI,IAAI;IAId,KAAK,IAAI,IAAI;CAGrB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,GAAE,MAAsB,GAAG,IAAI,CAKnE;AAGD,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import readline from 'readline';
|
|
3
|
+
import { createLogger } from './logger.js';
|
|
4
|
+
export class REPL {
|
|
5
|
+
rl;
|
|
6
|
+
context;
|
|
7
|
+
logger;
|
|
8
|
+
constructor(projectRoot = process.cwd()) {
|
|
9
|
+
this.context = {
|
|
10
|
+
history: [],
|
|
11
|
+
activeFiles: new Set(),
|
|
12
|
+
};
|
|
13
|
+
this.logger = createLogger();
|
|
14
|
+
this.rl = readline.createInterface({
|
|
15
|
+
input: process.stdin,
|
|
16
|
+
output: process.stdout,
|
|
17
|
+
prompt: 'daedalus> ',
|
|
18
|
+
});
|
|
19
|
+
this.setupCommands();
|
|
20
|
+
this.prompt();
|
|
21
|
+
}
|
|
22
|
+
setupCommands() {
|
|
23
|
+
this.rl.on('line', (input) => {
|
|
24
|
+
const trimmed = input.trim();
|
|
25
|
+
if (!trimmed)
|
|
26
|
+
return;
|
|
27
|
+
// Add to history
|
|
28
|
+
this.context.history.push(trimmed);
|
|
29
|
+
if (this.context.history.length > 50) {
|
|
30
|
+
this.context.history.shift();
|
|
31
|
+
}
|
|
32
|
+
this.context.lastCommand = trimmed;
|
|
33
|
+
this.executeCommand(trimmed);
|
|
34
|
+
}).on('close', () => {
|
|
35
|
+
this.logger.log('REPL session ended.');
|
|
36
|
+
process.exit(0);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
executeCommand(command) {
|
|
40
|
+
const parts = command.split(' ');
|
|
41
|
+
const cmd = parts[0].toLowerCase();
|
|
42
|
+
const args = parts.slice(1);
|
|
43
|
+
switch (cmd) {
|
|
44
|
+
case 'help':
|
|
45
|
+
this.showHelp();
|
|
46
|
+
break;
|
|
47
|
+
case 'last':
|
|
48
|
+
this.showLast();
|
|
49
|
+
break;
|
|
50
|
+
case 'edit':
|
|
51
|
+
this.editFile(args[0]);
|
|
52
|
+
break;
|
|
53
|
+
case 'files':
|
|
54
|
+
this.listActiveFiles();
|
|
55
|
+
break;
|
|
56
|
+
case 'clear':
|
|
57
|
+
this.clearScreen();
|
|
58
|
+
break;
|
|
59
|
+
case 'history':
|
|
60
|
+
this.showHistory();
|
|
61
|
+
break;
|
|
62
|
+
case 'context':
|
|
63
|
+
this.showContext();
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
this.logger.error(`Unknown command: ${command}. Type 'help' for available commands.`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
showHelp() {
|
|
70
|
+
this.logger.log('Available commands:');
|
|
71
|
+
this.logger.log(' help - Show this help message');
|
|
72
|
+
this.logger.log(' last - Show last edited file and command');
|
|
73
|
+
this.logger.log(' edit <file> - Open the specified file in your editor');
|
|
74
|
+
this.logger.log(' files - List active files in context');
|
|
75
|
+
this.logger.log(' clear - Clear screen');
|
|
76
|
+
this.logger.log(' history - Show command history');
|
|
77
|
+
this.logger.log(' context - Show current context');
|
|
78
|
+
this.logger.log(' exit - Exit REPL');
|
|
79
|
+
}
|
|
80
|
+
showLast() {
|
|
81
|
+
if (this.context.lastFile) {
|
|
82
|
+
this.logger.log(`Last edited file: ${this.context.lastFile}`);
|
|
83
|
+
}
|
|
84
|
+
if (this.context.lastCommand) {
|
|
85
|
+
this.logger.log(`Last command: ${this.context.lastCommand}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
editFile(filePath) {
|
|
89
|
+
if (!filePath) {
|
|
90
|
+
this.logger.error('Please specify a file path: edit <file>');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const absolutePath = path.resolve(filePath);
|
|
94
|
+
this.context.lastFile = filePath;
|
|
95
|
+
this.context.activeFiles.add(filePath);
|
|
96
|
+
this.logger.log(`Opening ${filePath} in editor...`);
|
|
97
|
+
// Try to detect common editors and open them
|
|
98
|
+
const editor = this.detectEditor();
|
|
99
|
+
if (editor) {
|
|
100
|
+
this.logger.log(`Using editor: ${editor}`);
|
|
101
|
+
// In a real implementation, you would spawn the editor here
|
|
102
|
+
// For now, we just log what would happen
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.logger.log('Could not detect editor. Please open the file manually.');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
detectEditor() {
|
|
109
|
+
// Simple editor detection (would be more comprehensive in production)
|
|
110
|
+
const editors = ['code', 'vim', 'nano', 'notepad++'];
|
|
111
|
+
for (const editor of editors) {
|
|
112
|
+
// This would check if editor is in PATH
|
|
113
|
+
// For demo purposes, we'll just return a placeholder
|
|
114
|
+
}
|
|
115
|
+
return 'code'; // VS Code as default assumption
|
|
116
|
+
}
|
|
117
|
+
listActiveFiles() {
|
|
118
|
+
if (this.context.activeFiles.size === 0) {
|
|
119
|
+
this.logger.log('No active files.');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.logger.log('Active files:');
|
|
123
|
+
for (const file of this.context.activeFiles) {
|
|
124
|
+
this.logger.log(` - ${file}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
clearScreen() {
|
|
128
|
+
process.stdout.write('\x1b[2J\x1b[0f'); // ANSI clear screen
|
|
129
|
+
this.logger.log('Screen cleared.');
|
|
130
|
+
}
|
|
131
|
+
showHistory() {
|
|
132
|
+
if (this.context.history.length === 0) {
|
|
133
|
+
this.logger.log('No command history.');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.logger.log('Command history:');
|
|
137
|
+
this.context.history.forEach((cmd, idx) => {
|
|
138
|
+
this.logger.log(` ${idx + 1}. ${cmd}`);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
showContext() {
|
|
142
|
+
this.logger.log('=== REPL Context ===');
|
|
143
|
+
this.logger.log(`History size: ${this.context.history.length}`);
|
|
144
|
+
this.logger.log(`Active files: ${this.context.activeFiles.size}`);
|
|
145
|
+
if (this.context.lastFile) {
|
|
146
|
+
this.logger.log(`Last file: ${this.context.lastFile}`);
|
|
147
|
+
}
|
|
148
|
+
if (this.context.lastCommand) {
|
|
149
|
+
this.logger.log(`Last command: ${this.context.lastCommand}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
prompt() {
|
|
153
|
+
this.rl.prompt();
|
|
154
|
+
}
|
|
155
|
+
close() {
|
|
156
|
+
this.rl.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Starts the interactive REPL environment
|
|
161
|
+
*/
|
|
162
|
+
export function startRepl(projectRoot = process.cwd()) {
|
|
163
|
+
const repl = new REPL(projectRoot);
|
|
164
|
+
const logger = createLogger();
|
|
165
|
+
logger.log('Daedalus REPL started. Type "help" for available commands.');
|
|
166
|
+
return repl;
|
|
167
|
+
}
|
|
168
|
+
// Export for direct use
|
|
169
|
+
export default startRepl;
|
|
170
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/tools/repl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Logger } from './logger.js';
|
|
2
|
+
export interface Timer {
|
|
3
|
+
start(): void;
|
|
4
|
+
stop(): number;
|
|
5
|
+
reset(): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class ExecutionTimer implements Timer {
|
|
8
|
+
private startTime?;
|
|
9
|
+
private elapsed;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(logger: Logger);
|
|
12
|
+
start(): void;
|
|
13
|
+
stop(): number;
|
|
14
|
+
reset(): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Wraps an async function and logs its execution time
|
|
18
|
+
*/
|
|
19
|
+
export declare function timed<T>(fn: () => Promise<T>, label: string, logger: Logger): Promise<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Wraps a synchronous function and logs its execution time
|
|
22
|
+
*/
|
|
23
|
+
export declare function timedSync<T>(fn: () => T, label: string, logger: Logger): T;
|
|
24
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/tools/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,KAAK;IACpB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,IAAI,IAAI,CAAC;CACf;AAED,qBAAa,cAAe,YAAW,KAAK;IAC1C,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAI1B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,MAAM;IAWd,KAAK,IAAI,IAAI;CAId;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,CAAC,CASZ;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,EAAE,EAAE,MAAM,CAAC,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,CAAC,CASH"}
|