daedalus-cli 0.5.24 → 1.0.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/AGENTS.md +12 -2
- package/CHANGELOG.md +54 -0
- package/CONTRIBUTING.md +3 -2
- package/README.md +4 -3
- package/dist/agents/orchestrator.js +7 -5
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/orchestrator.test.d.ts +2 -0
- package/dist/agents/orchestrator.test.d.ts.map +1 -0
- package/dist/agents/orchestrator.test.js +48 -0
- package/dist/agents/orchestrator.test.js.map +1 -0
- package/dist/agents/roles.test.d.ts +2 -0
- package/dist/agents/roles.test.d.ts.map +1 -0
- package/dist/agents/roles.test.js +108 -0
- package/dist/agents/roles.test.js.map +1 -0
- package/dist/config/index.test.d.ts +2 -0
- package/dist/config/index.test.d.ts.map +1 -0
- package/dist/config/index.test.js +220 -0
- package/dist/config/index.test.js.map +1 -0
- package/dist/extraction.test.d.ts +2 -0
- package/dist/extraction.test.d.ts.map +1 -0
- package/dist/extraction.test.js +105 -0
- package/dist/extraction.test.js.map +1 -0
- package/dist/highlight.test.d.ts +2 -0
- package/dist/highlight.test.d.ts.map +1 -0
- package/dist/highlight.test.js +56 -0
- package/dist/highlight.test.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/indexing/fts.test.d.ts +2 -0
- package/dist/indexing/fts.test.d.ts.map +1 -0
- package/dist/indexing/fts.test.js +104 -0
- package/dist/indexing/fts.test.js.map +1 -0
- package/dist/indexing/indexer.d.ts +21 -0
- package/dist/indexing/indexer.d.ts.map +1 -1
- package/dist/indexing/indexer.js +4 -4
- package/dist/indexing/indexer.js.map +1 -1
- package/dist/indexing/indexer.test.d.ts +2 -0
- package/dist/indexing/indexer.test.d.ts.map +1 -0
- package/dist/indexing/indexer.test.js +192 -0
- package/dist/indexing/indexer.test.js.map +1 -0
- package/dist/profile.d.ts.map +1 -1
- package/dist/profile.js +12 -7
- package/dist/profile.js.map +1 -1
- package/dist/profile.test.d.ts +2 -0
- package/dist/profile.test.d.ts.map +1 -0
- package/dist/profile.test.js +70 -0
- package/dist/profile.test.js.map +1 -0
- package/dist/router/health.test.d.ts +2 -0
- package/dist/router/health.test.d.ts.map +1 -0
- package/dist/router/health.test.js +87 -0
- package/dist/router/health.test.js.map +1 -0
- package/dist/router/index.test.d.ts +2 -0
- package/dist/router/index.test.d.ts.map +1 -0
- package/dist/router/index.test.js +136 -0
- package/dist/router/index.test.js.map +1 -0
- package/dist/router/rate-limiter.test.d.ts +2 -0
- package/dist/router/rate-limiter.test.d.ts.map +1 -0
- package/dist/router/rate-limiter.test.js +90 -0
- package/dist/router/rate-limiter.test.js.map +1 -0
- package/dist/session/jsonl.d.ts +0 -2
- package/dist/session/jsonl.d.ts.map +1 -1
- package/dist/session/jsonl.js +3 -7
- package/dist/session/jsonl.js.map +1 -1
- package/dist/session/jsonl.test.d.ts +2 -0
- package/dist/session/jsonl.test.d.ts.map +1 -0
- package/dist/session/jsonl.test.js +88 -0
- package/dist/session/jsonl.test.js.map +1 -0
- package/dist/session/manager.d.ts +2 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +14 -0
- package/dist/session/manager.js.map +1 -1
- package/dist/session/manager.test.d.ts +2 -0
- package/dist/session/manager.test.d.ts.map +1 -0
- package/dist/session/manager.test.js +120 -0
- package/dist/session/manager.test.js.map +1 -0
- package/dist/session/memory.test.d.ts +2 -0
- package/dist/session/memory.test.d.ts.map +1 -0
- package/dist/session/memory.test.js +100 -0
- package/dist/session/memory.test.js.map +1 -0
- package/dist/session/sqlite.test.d.ts +2 -0
- package/dist/session/sqlite.test.d.ts.map +1 -0
- package/dist/session/sqlite.test.js +151 -0
- package/dist/session/sqlite.test.js.map +1 -0
- package/dist/tools/builtin/delegation.test.d.ts +2 -0
- package/dist/tools/builtin/delegation.test.d.ts.map +1 -0
- package/dist/tools/builtin/delegation.test.js +87 -0
- package/dist/tools/builtin/delegation.test.js.map +1 -0
- package/dist/tools/builtin/eval.d.ts +7 -0
- package/dist/tools/builtin/eval.d.ts.map +1 -0
- package/dist/tools/builtin/eval.js +92 -0
- package/dist/tools/builtin/eval.js.map +1 -0
- package/dist/tools/builtin/eval.test.d.ts +2 -0
- package/dist/tools/builtin/eval.test.d.ts.map +1 -0
- package/dist/tools/builtin/eval.test.js +24 -0
- package/dist/tools/builtin/eval.test.js.map +1 -0
- package/dist/tools/builtin/git.test.d.ts +2 -0
- package/dist/tools/builtin/git.test.d.ts.map +1 -0
- package/dist/tools/builtin/git.test.js +49 -0
- package/dist/tools/builtin/git.test.js.map +1 -0
- package/dist/tools/builtin/impact.d.ts +5 -0
- package/dist/tools/builtin/impact.d.ts.map +1 -0
- package/dist/tools/builtin/impact.js +129 -0
- package/dist/tools/builtin/impact.js.map +1 -0
- package/dist/tools/builtin/impact.test.d.ts +2 -0
- package/dist/tools/builtin/impact.test.d.ts.map +1 -0
- package/dist/tools/builtin/impact.test.js +50 -0
- package/dist/tools/builtin/impact.test.js.map +1 -0
- package/dist/tools/builtin/indexing.test.d.ts +2 -0
- package/dist/tools/builtin/indexing.test.d.ts.map +1 -0
- package/dist/tools/builtin/indexing.test.js +30 -0
- package/dist/tools/builtin/indexing.test.js.map +1 -0
- package/dist/tools/builtin/lsp.d.ts +16 -0
- package/dist/tools/builtin/lsp.d.ts.map +1 -0
- package/dist/tools/builtin/lsp.js +143 -0
- package/dist/tools/builtin/lsp.js.map +1 -0
- package/dist/tools/builtin/lsp.test.d.ts +2 -0
- package/dist/tools/builtin/lsp.test.d.ts.map +1 -0
- package/dist/tools/builtin/lsp.test.js +34 -0
- package/dist/tools/builtin/lsp.test.js.map +1 -0
- package/dist/tools/builtin/process-watcher.d.ts +14 -0
- package/dist/tools/builtin/process-watcher.d.ts.map +1 -0
- package/dist/tools/builtin/process-watcher.js +87 -0
- package/dist/tools/builtin/process-watcher.js.map +1 -0
- package/dist/tools/builtin/process-watcher.test.d.ts +2 -0
- package/dist/tools/builtin/process-watcher.test.d.ts.map +1 -0
- package/dist/tools/builtin/process-watcher.test.js +53 -0
- package/dist/tools/builtin/process-watcher.test.js.map +1 -0
- package/dist/tools/builtin/project-config.test.d.ts +2 -0
- package/dist/tools/builtin/project-config.test.d.ts.map +1 -0
- package/dist/tools/builtin/project-config.test.js +81 -0
- package/dist/tools/builtin/project-config.test.js.map +1 -0
- package/dist/tools/builtin/screenshot.d.ts +8 -0
- package/dist/tools/builtin/screenshot.d.ts.map +1 -0
- package/dist/tools/builtin/screenshot.js +76 -0
- package/dist/tools/builtin/screenshot.js.map +1 -0
- package/dist/tools/builtin/todo.test.d.ts +2 -0
- package/dist/tools/builtin/todo.test.d.ts.map +1 -0
- package/dist/tools/builtin/todo.test.js +66 -0
- package/dist/tools/builtin/todo.test.js.map +1 -0
- package/dist/tools/builtin/web.test.d.ts +2 -0
- package/dist/tools/builtin/web.test.d.ts.map +1 -0
- package/dist/tools/builtin/web.test.js +78 -0
- package/dist/tools/builtin/web.test.js.map +1 -0
- package/dist/tools/definitions.d.ts +1 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +157 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/executor.test.d.ts +2 -0
- package/dist/tools/executor.test.d.ts.map +1 -0
- package/dist/tools/executor.test.js +79 -0
- package/dist/tools/executor.test.js.map +1 -0
- package/dist/tools/mcp/registry.test.d.ts +2 -0
- package/dist/tools/mcp/registry.test.d.ts.map +1 -0
- package/dist/tools/mcp/registry.test.js +18 -0
- package/dist/tools/mcp/registry.test.js.map +1 -0
- package/package.json +12 -1
- package/dist/manual-test.d.ts +0 -2
- package/dist/manual-test.d.ts.map +0 -1
- package/dist/manual-test.js.map +0 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { extractAndSave } from './extraction.js';
|
|
3
|
+
describe('Fact extraction', () => {
|
|
4
|
+
it('detects learning signals from tool calls', async () => {
|
|
5
|
+
const messages = [
|
|
6
|
+
{ role: 'user', content: 'fix the bug' },
|
|
7
|
+
{
|
|
8
|
+
role: 'assistant',
|
|
9
|
+
content: 'I will patch the file',
|
|
10
|
+
tool_calls: [
|
|
11
|
+
{ id: '1', type: 'function', function: { name: 'patch', arguments: '{}' } },
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
{ role: 'tool', content: 'patched', tool_call_id: '1' },
|
|
15
|
+
];
|
|
16
|
+
const mockRouter = {
|
|
17
|
+
chat: {
|
|
18
|
+
completions: {
|
|
19
|
+
create: vi.fn().mockResolvedValue({
|
|
20
|
+
choices: [{ message: { content: '[{"key":"test framework","value":"vitest"}]' } }],
|
|
21
|
+
}),
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const mockSessionManager = {
|
|
26
|
+
loadMemory: vi.fn().mockReturnValue({ facts: [] }),
|
|
27
|
+
addFact: vi.fn(),
|
|
28
|
+
};
|
|
29
|
+
await extractAndSave(mockRouter, mockSessionManager, messages);
|
|
30
|
+
expect(mockRouter.chat.completions.create).toHaveBeenCalled();
|
|
31
|
+
expect(mockSessionManager.addFact).toHaveBeenCalledWith('test framework', 'vitest', 'agent');
|
|
32
|
+
});
|
|
33
|
+
it('skips extraction on turn with no learning signals', async () => {
|
|
34
|
+
const messages = [
|
|
35
|
+
{ role: 'user', content: 'hello' },
|
|
36
|
+
{ role: 'assistant', content: 'hi there' },
|
|
37
|
+
];
|
|
38
|
+
const mockRouter = {
|
|
39
|
+
chat: {
|
|
40
|
+
completions: { create: vi.fn() },
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const mockSessionManager = {
|
|
44
|
+
loadMemory: vi.fn(),
|
|
45
|
+
addFact: vi.fn(),
|
|
46
|
+
};
|
|
47
|
+
await extractAndSave(mockRouter, mockSessionManager, messages);
|
|
48
|
+
expect(mockRouter.chat.completions.create).not.toHaveBeenCalled();
|
|
49
|
+
});
|
|
50
|
+
it('deduplicates against existing facts', async () => {
|
|
51
|
+
const messages = [
|
|
52
|
+
{ role: 'user', content: 'we use vitest' },
|
|
53
|
+
{
|
|
54
|
+
role: 'assistant',
|
|
55
|
+
content: 'ok',
|
|
56
|
+
tool_calls: [
|
|
57
|
+
{ id: '1', type: 'function', function: { name: 'patch', arguments: '{}' } },
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{ role: 'tool', content: 'done', tool_call_id: '1' },
|
|
61
|
+
];
|
|
62
|
+
const mockRouter = {
|
|
63
|
+
chat: {
|
|
64
|
+
completions: {
|
|
65
|
+
create: vi.fn().mockResolvedValue({
|
|
66
|
+
choices: [{ message: { content: '[{"key":"framework","value":"vitest"}]' } }],
|
|
67
|
+
}),
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
const mockSessionManager = {
|
|
72
|
+
loadMemory: vi.fn().mockReturnValue({
|
|
73
|
+
facts: [{ key: 'framework', value: 'vitest', source: 'user', created: 1 }],
|
|
74
|
+
}),
|
|
75
|
+
addFact: vi.fn(),
|
|
76
|
+
};
|
|
77
|
+
await extractAndSave(mockRouter, mockSessionManager, messages);
|
|
78
|
+
expect(mockSessionManager.addFact).not.toHaveBeenCalled();
|
|
79
|
+
});
|
|
80
|
+
it('handles router failure gracefully', async () => {
|
|
81
|
+
const messages = [
|
|
82
|
+
{ role: 'user', content: 'x' },
|
|
83
|
+
{
|
|
84
|
+
role: 'assistant',
|
|
85
|
+
content: 'y',
|
|
86
|
+
tool_calls: [
|
|
87
|
+
{ id: '1', type: 'function', function: { name: 'write_file', arguments: '{}' } },
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
const mockRouter = {
|
|
92
|
+
chat: {
|
|
93
|
+
completions: {
|
|
94
|
+
create: vi.fn().mockRejectedValue(new Error('API error')),
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
const mockSessionManager = {
|
|
99
|
+
loadMemory: vi.fn().mockReturnValue({ facts: [] }),
|
|
100
|
+
addFact: vi.fn(),
|
|
101
|
+
};
|
|
102
|
+
await expect(extractAndSave(mockRouter, mockSessionManager, messages)).resolves.not.toThrow();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=extraction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction.test.js","sourceRoot":"","sources":["../src/extraction.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.test.d.ts","sourceRoot":"","sources":["../src/highlight.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { hasCodeBlocks, countLines, highlightCodeBlocks } from './highlight.js';
|
|
3
|
+
describe('Code highlighting utilities', () => {
|
|
4
|
+
describe('hasCodeBlocks', () => {
|
|
5
|
+
it('returns true when text contains multiline code blocks', () => {
|
|
6
|
+
expect(hasCodeBlocks('some text ```\ncode\n``` more')).toBe(true);
|
|
7
|
+
});
|
|
8
|
+
it('returns false when text has no code blocks', () => {
|
|
9
|
+
expect(hasCodeBlocks('just plain text')).toBe(false);
|
|
10
|
+
});
|
|
11
|
+
it('returns true for code blocks with language', () => {
|
|
12
|
+
expect(hasCodeBlocks('text ```ts\nconst x = 1;\n``` end')).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it('returns false for empty text', () => {
|
|
15
|
+
expect(hasCodeBlocks('')).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('countLines', () => {
|
|
19
|
+
it('counts lines in a string', () => {
|
|
20
|
+
expect(countLines('a\nb\nc')).toBe(3);
|
|
21
|
+
});
|
|
22
|
+
it('returns 0 for empty string', () => {
|
|
23
|
+
expect(countLines('')).toBe(0);
|
|
24
|
+
});
|
|
25
|
+
it('handles single line', () => {
|
|
26
|
+
expect(countLines('hello')).toBe(1);
|
|
27
|
+
});
|
|
28
|
+
it('handles trailing newline', () => {
|
|
29
|
+
expect(countLines('a\nb\n')).toBe(3);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('highlightCodeBlocks', () => {
|
|
33
|
+
it('passes through text without code blocks', () => {
|
|
34
|
+
const input = 'hello world';
|
|
35
|
+
expect(highlightCodeBlocks(input)).toBe(input);
|
|
36
|
+
});
|
|
37
|
+
it('highlights a code block with language', () => {
|
|
38
|
+
const result = highlightCodeBlocks('```ts\nconst x = 1\n```');
|
|
39
|
+
expect(result).toContain('const');
|
|
40
|
+
expect(result).toContain('x');
|
|
41
|
+
});
|
|
42
|
+
it('highlights a code block without language', () => {
|
|
43
|
+
const result = highlightCodeBlocks('```\nplain text\n```');
|
|
44
|
+
expect(result).toContain('plain text');
|
|
45
|
+
});
|
|
46
|
+
it('handles multiple code blocks', () => {
|
|
47
|
+
const result = highlightCodeBlocks('a ```\none\n``` b ```\ntwo\n``` c');
|
|
48
|
+
expect(result).toContain('one');
|
|
49
|
+
expect(result).toContain('two');
|
|
50
|
+
});
|
|
51
|
+
it('returns the same text for empty input', () => {
|
|
52
|
+
expect(highlightCodeBlocks('')).toBe('');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=highlight.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.test.js","sourceRoot":"","sources":["../src/highlight.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAkBA,OAAO,EAAe,QAAQ,EAAe,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAkBA,OAAO,EAAe,QAAQ,EAAe,MAAM,YAAY,CAAC;AAsqChE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BvD;AA4BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CA+C3D"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { execSync } from 'child_process';
|
|
|
7
7
|
import readline from 'readline';
|
|
8
8
|
import os from 'os';
|
|
9
9
|
import pc from 'picocolors';
|
|
10
|
-
import { BUILTIN_TOOLS } from './tools/definitions.js';
|
|
10
|
+
import { BUILTIN_TOOLS, POWER_TOOLS } from './tools/definitions.js';
|
|
11
11
|
import { executeToolCalls } from './tools/executor.js';
|
|
12
12
|
import { setRouterClient } from './tools/builtin/delegation.js';
|
|
13
13
|
import { mcpRegistry } from './tools/mcp/registry.js';
|
|
@@ -696,7 +696,7 @@ async function callModelWithTools(userContent, imageBase64) {
|
|
|
696
696
|
}
|
|
697
697
|
}
|
|
698
698
|
// Combine built-in tools with MCP tools (stable across turns)
|
|
699
|
-
const allTools = [...BUILTIN_TOOLS, ...mcpRegistry.getToolDefinitions()];
|
|
699
|
+
const allTools = [...BUILTIN_TOOLS, ...POWER_TOOLS, ...mcpRegistry.getToolDefinitions()];
|
|
700
700
|
turnStartTime = Date.now();
|
|
701
701
|
let lastContent = '';
|
|
702
702
|
let turn = 0;
|
|
@@ -858,6 +858,22 @@ async function callModelWithTools(userContent, imageBase64) {
|
|
|
858
858
|
console.log(` ${pc.dim('┃')} ${pc.dim(`… ${lines.length - 3} more line${lines.length - 3 > 1 ? 's' : ''}`)}`);
|
|
859
859
|
}
|
|
860
860
|
}
|
|
861
|
+
if (result.success && result.name === 'screenshot_page') {
|
|
862
|
+
try {
|
|
863
|
+
const parsed = JSON.parse(result.content);
|
|
864
|
+
if (parsed.type === 'vision' && parsed.base64) {
|
|
865
|
+
messages.push({
|
|
866
|
+
role: 'user',
|
|
867
|
+
content: [
|
|
868
|
+
{ type: 'text', text: `[Screenshot of ${parsed.url}${parsed.selector ? ` > ${parsed.selector}` : ''}]` },
|
|
869
|
+
{ type: 'image_url', image_url: { url: `data:image/png;base64,${parsed.base64}` } },
|
|
870
|
+
],
|
|
871
|
+
});
|
|
872
|
+
console.log(` ${pc.cyan('[VISION]')} Screenshot injected into context (${Math.round(parsed.base64.length * 0.75 / 1024)}KB)`);
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
catch { }
|
|
876
|
+
}
|
|
861
877
|
}
|
|
862
878
|
turn++;
|
|
863
879
|
}
|
|
@@ -2136,6 +2152,7 @@ async function main() {
|
|
|
2136
2152
|
// Clean up health checks on normal exit too
|
|
2137
2153
|
process.on('exit', () => {
|
|
2138
2154
|
router.stopHealthChecks?.();
|
|
2155
|
+
import('./tools/builtin/process-watcher.js').then(m => m.killAllWatchedProcesses()).catch(() => { });
|
|
2139
2156
|
});
|
|
2140
2157
|
// Print the awesome banner first!
|
|
2141
2158
|
printBanner();
|