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.
Files changed (160) hide show
  1. package/AGENTS.md +12 -2
  2. package/CHANGELOG.md +54 -0
  3. package/CONTRIBUTING.md +3 -2
  4. package/README.md +4 -3
  5. package/dist/agents/orchestrator.js +7 -5
  6. package/dist/agents/orchestrator.js.map +1 -1
  7. package/dist/agents/orchestrator.test.d.ts +2 -0
  8. package/dist/agents/orchestrator.test.d.ts.map +1 -0
  9. package/dist/agents/orchestrator.test.js +48 -0
  10. package/dist/agents/orchestrator.test.js.map +1 -0
  11. package/dist/agents/roles.test.d.ts +2 -0
  12. package/dist/agents/roles.test.d.ts.map +1 -0
  13. package/dist/agents/roles.test.js +108 -0
  14. package/dist/agents/roles.test.js.map +1 -0
  15. package/dist/config/index.test.d.ts +2 -0
  16. package/dist/config/index.test.d.ts.map +1 -0
  17. package/dist/config/index.test.js +220 -0
  18. package/dist/config/index.test.js.map +1 -0
  19. package/dist/extraction.test.d.ts +2 -0
  20. package/dist/extraction.test.d.ts.map +1 -0
  21. package/dist/extraction.test.js +105 -0
  22. package/dist/extraction.test.js.map +1 -0
  23. package/dist/highlight.test.d.ts +2 -0
  24. package/dist/highlight.test.d.ts.map +1 -0
  25. package/dist/highlight.test.js +56 -0
  26. package/dist/highlight.test.js.map +1 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +19 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/indexing/fts.test.d.ts +2 -0
  31. package/dist/indexing/fts.test.d.ts.map +1 -0
  32. package/dist/indexing/fts.test.js +104 -0
  33. package/dist/indexing/fts.test.js.map +1 -0
  34. package/dist/indexing/indexer.d.ts +21 -0
  35. package/dist/indexing/indexer.d.ts.map +1 -1
  36. package/dist/indexing/indexer.js +4 -4
  37. package/dist/indexing/indexer.js.map +1 -1
  38. package/dist/indexing/indexer.test.d.ts +2 -0
  39. package/dist/indexing/indexer.test.d.ts.map +1 -0
  40. package/dist/indexing/indexer.test.js +192 -0
  41. package/dist/indexing/indexer.test.js.map +1 -0
  42. package/dist/profile.d.ts.map +1 -1
  43. package/dist/profile.js +12 -7
  44. package/dist/profile.js.map +1 -1
  45. package/dist/profile.test.d.ts +2 -0
  46. package/dist/profile.test.d.ts.map +1 -0
  47. package/dist/profile.test.js +70 -0
  48. package/dist/profile.test.js.map +1 -0
  49. package/dist/router/health.test.d.ts +2 -0
  50. package/dist/router/health.test.d.ts.map +1 -0
  51. package/dist/router/health.test.js +87 -0
  52. package/dist/router/health.test.js.map +1 -0
  53. package/dist/router/index.test.d.ts +2 -0
  54. package/dist/router/index.test.d.ts.map +1 -0
  55. package/dist/router/index.test.js +136 -0
  56. package/dist/router/index.test.js.map +1 -0
  57. package/dist/router/rate-limiter.test.d.ts +2 -0
  58. package/dist/router/rate-limiter.test.d.ts.map +1 -0
  59. package/dist/router/rate-limiter.test.js +90 -0
  60. package/dist/router/rate-limiter.test.js.map +1 -0
  61. package/dist/session/jsonl.d.ts +0 -2
  62. package/dist/session/jsonl.d.ts.map +1 -1
  63. package/dist/session/jsonl.js +3 -7
  64. package/dist/session/jsonl.js.map +1 -1
  65. package/dist/session/jsonl.test.d.ts +2 -0
  66. package/dist/session/jsonl.test.d.ts.map +1 -0
  67. package/dist/session/jsonl.test.js +88 -0
  68. package/dist/session/jsonl.test.js.map +1 -0
  69. package/dist/session/manager.d.ts +2 -0
  70. package/dist/session/manager.d.ts.map +1 -1
  71. package/dist/session/manager.js +14 -0
  72. package/dist/session/manager.js.map +1 -1
  73. package/dist/session/manager.test.d.ts +2 -0
  74. package/dist/session/manager.test.d.ts.map +1 -0
  75. package/dist/session/manager.test.js +120 -0
  76. package/dist/session/manager.test.js.map +1 -0
  77. package/dist/session/memory.test.d.ts +2 -0
  78. package/dist/session/memory.test.d.ts.map +1 -0
  79. package/dist/session/memory.test.js +100 -0
  80. package/dist/session/memory.test.js.map +1 -0
  81. package/dist/session/sqlite.test.d.ts +2 -0
  82. package/dist/session/sqlite.test.d.ts.map +1 -0
  83. package/dist/session/sqlite.test.js +151 -0
  84. package/dist/session/sqlite.test.js.map +1 -0
  85. package/dist/tools/builtin/delegation.test.d.ts +2 -0
  86. package/dist/tools/builtin/delegation.test.d.ts.map +1 -0
  87. package/dist/tools/builtin/delegation.test.js +87 -0
  88. package/dist/tools/builtin/delegation.test.js.map +1 -0
  89. package/dist/tools/builtin/eval.d.ts +7 -0
  90. package/dist/tools/builtin/eval.d.ts.map +1 -0
  91. package/dist/tools/builtin/eval.js +92 -0
  92. package/dist/tools/builtin/eval.js.map +1 -0
  93. package/dist/tools/builtin/eval.test.d.ts +2 -0
  94. package/dist/tools/builtin/eval.test.d.ts.map +1 -0
  95. package/dist/tools/builtin/eval.test.js +24 -0
  96. package/dist/tools/builtin/eval.test.js.map +1 -0
  97. package/dist/tools/builtin/git.test.d.ts +2 -0
  98. package/dist/tools/builtin/git.test.d.ts.map +1 -0
  99. package/dist/tools/builtin/git.test.js +49 -0
  100. package/dist/tools/builtin/git.test.js.map +1 -0
  101. package/dist/tools/builtin/impact.d.ts +5 -0
  102. package/dist/tools/builtin/impact.d.ts.map +1 -0
  103. package/dist/tools/builtin/impact.js +129 -0
  104. package/dist/tools/builtin/impact.js.map +1 -0
  105. package/dist/tools/builtin/impact.test.d.ts +2 -0
  106. package/dist/tools/builtin/impact.test.d.ts.map +1 -0
  107. package/dist/tools/builtin/impact.test.js +50 -0
  108. package/dist/tools/builtin/impact.test.js.map +1 -0
  109. package/dist/tools/builtin/indexing.test.d.ts +2 -0
  110. package/dist/tools/builtin/indexing.test.d.ts.map +1 -0
  111. package/dist/tools/builtin/indexing.test.js +30 -0
  112. package/dist/tools/builtin/indexing.test.js.map +1 -0
  113. package/dist/tools/builtin/lsp.d.ts +16 -0
  114. package/dist/tools/builtin/lsp.d.ts.map +1 -0
  115. package/dist/tools/builtin/lsp.js +143 -0
  116. package/dist/tools/builtin/lsp.js.map +1 -0
  117. package/dist/tools/builtin/lsp.test.d.ts +2 -0
  118. package/dist/tools/builtin/lsp.test.d.ts.map +1 -0
  119. package/dist/tools/builtin/lsp.test.js +34 -0
  120. package/dist/tools/builtin/lsp.test.js.map +1 -0
  121. package/dist/tools/builtin/process-watcher.d.ts +14 -0
  122. package/dist/tools/builtin/process-watcher.d.ts.map +1 -0
  123. package/dist/tools/builtin/process-watcher.js +87 -0
  124. package/dist/tools/builtin/process-watcher.js.map +1 -0
  125. package/dist/tools/builtin/process-watcher.test.d.ts +2 -0
  126. package/dist/tools/builtin/process-watcher.test.d.ts.map +1 -0
  127. package/dist/tools/builtin/process-watcher.test.js +53 -0
  128. package/dist/tools/builtin/process-watcher.test.js.map +1 -0
  129. package/dist/tools/builtin/project-config.test.d.ts +2 -0
  130. package/dist/tools/builtin/project-config.test.d.ts.map +1 -0
  131. package/dist/tools/builtin/project-config.test.js +81 -0
  132. package/dist/tools/builtin/project-config.test.js.map +1 -0
  133. package/dist/tools/builtin/screenshot.d.ts +8 -0
  134. package/dist/tools/builtin/screenshot.d.ts.map +1 -0
  135. package/dist/tools/builtin/screenshot.js +76 -0
  136. package/dist/tools/builtin/screenshot.js.map +1 -0
  137. package/dist/tools/builtin/todo.test.d.ts +2 -0
  138. package/dist/tools/builtin/todo.test.d.ts.map +1 -0
  139. package/dist/tools/builtin/todo.test.js +66 -0
  140. package/dist/tools/builtin/todo.test.js.map +1 -0
  141. package/dist/tools/builtin/web.test.d.ts +2 -0
  142. package/dist/tools/builtin/web.test.d.ts.map +1 -0
  143. package/dist/tools/builtin/web.test.js +78 -0
  144. package/dist/tools/builtin/web.test.js.map +1 -0
  145. package/dist/tools/definitions.d.ts +1 -0
  146. package/dist/tools/definitions.d.ts.map +1 -1
  147. package/dist/tools/definitions.js +157 -0
  148. package/dist/tools/definitions.js.map +1 -1
  149. package/dist/tools/executor.test.d.ts +2 -0
  150. package/dist/tools/executor.test.d.ts.map +1 -0
  151. package/dist/tools/executor.test.js +79 -0
  152. package/dist/tools/executor.test.js.map +1 -0
  153. package/dist/tools/mcp/registry.test.d.ts +2 -0
  154. package/dist/tools/mcp/registry.test.d.ts.map +1 -0
  155. package/dist/tools/mcp/registry.test.js +18 -0
  156. package/dist/tools/mcp/registry.test.js.map +1 -0
  157. package/package.json +12 -1
  158. package/dist/manual-test.d.ts +0 -2
  159. package/dist/manual-test.d.ts.map +0 -1
  160. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=highlight.test.d.ts.map
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAkBA,OAAO,EAAe,QAAQ,EAAe,MAAM,YAAY,CAAC;AAupChE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BvD;AA4BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CA+C3D"}
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();