@roackb2/heddle 0.0.7 → 0.0.8

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 (203) hide show
  1. package/README.md +120 -2
  2. package/dist/examples/heartbeat.d.ts +2 -0
  3. package/dist/examples/heartbeat.d.ts.map +1 -0
  4. package/dist/examples/heartbeat.js +61 -0
  5. package/dist/examples/heartbeat.js.map +1 -0
  6. package/dist/examples/programmatic-loop.d.ts +2 -0
  7. package/dist/examples/programmatic-loop.d.ts.map +1 -0
  8. package/dist/examples/programmatic-loop.js +126 -0
  9. package/dist/examples/programmatic-loop.js.map +1 -0
  10. package/dist/src/cli/ask.d.ts.map +1 -1
  11. package/dist/src/cli/ask.js +10 -41
  12. package/dist/src/cli/ask.js.map +1 -1
  13. package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
  14. package/dist/src/cli/chat/hooks/useAgentRun.js +14 -25
  15. package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
  16. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  17. package/dist/src/cli/chat/utils/runtime.js +3 -19
  18. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  19. package/dist/src/cli/main.js +0 -0
  20. package/dist/src/index.d.ts +12 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +6 -0
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/llm/factory.d.ts +1 -1
  25. package/dist/src/llm/factory.d.ts.map +1 -1
  26. package/dist/src/llm/factory.js +2 -19
  27. package/dist/src/llm/factory.js.map +1 -1
  28. package/dist/src/llm/providers.d.ts +3 -0
  29. package/dist/src/llm/providers.d.ts.map +1 -0
  30. package/dist/src/llm/providers.js +21 -0
  31. package/dist/src/llm/providers.js.map +1 -0
  32. package/dist/src/runtime/agent-loop.d.ts +42 -0
  33. package/dist/src/runtime/agent-loop.d.ts.map +1 -0
  34. package/dist/src/runtime/agent-loop.js +118 -0
  35. package/dist/src/runtime/agent-loop.js.map +1 -0
  36. package/dist/src/runtime/api-keys.d.ts +8 -0
  37. package/dist/src/runtime/api-keys.d.ts.map +1 -0
  38. package/dist/src/runtime/api-keys.js +25 -0
  39. package/dist/src/runtime/api-keys.js.map +1 -0
  40. package/dist/src/runtime/default-tools.d.ts +12 -0
  41. package/dist/src/runtime/default-tools.d.ts.map +1 -0
  42. package/dist/src/runtime/default-tools.js +40 -0
  43. package/dist/src/runtime/default-tools.js.map +1 -0
  44. package/dist/src/runtime/events.d.ts +62 -0
  45. package/dist/src/runtime/events.d.ts.map +1 -0
  46. package/dist/src/runtime/events.js +30 -0
  47. package/dist/src/runtime/events.js.map +1 -0
  48. package/dist/src/runtime/heartbeat-store.d.ts +20 -0
  49. package/dist/src/runtime/heartbeat-store.d.ts.map +1 -0
  50. package/dist/src/runtime/heartbeat-store.js +42 -0
  51. package/dist/src/runtime/heartbeat-store.js.map +1 -0
  52. package/dist/src/runtime/heartbeat.d.ts +39 -0
  53. package/dist/src/runtime/heartbeat.d.ts.map +1 -0
  54. package/dist/src/runtime/heartbeat.js +72 -0
  55. package/dist/src/runtime/heartbeat.js.map +1 -0
  56. package/dist/src/utils/logger.d.ts.map +1 -1
  57. package/dist/src/utils/logger.js +2 -2
  58. package/dist/src/utils/logger.js.map +1 -1
  59. package/package.json +18 -2
  60. package/dist/src/__tests__/chat-activity-format.test.d.ts +0 -2
  61. package/dist/src/__tests__/chat-activity-format.test.d.ts.map +0 -1
  62. package/dist/src/__tests__/chat-activity-format.test.js +0 -41
  63. package/dist/src/__tests__/chat-activity-format.test.js.map +0 -1
  64. package/dist/src/__tests__/chat-compaction.test.d.ts +0 -2
  65. package/dist/src/__tests__/chat-compaction.test.d.ts.map +0 -1
  66. package/dist/src/__tests__/chat-compaction.test.js +0 -63
  67. package/dist/src/__tests__/chat-compaction.test.js.map +0 -1
  68. package/dist/src/__tests__/chat-format.test.d.ts +0 -2
  69. package/dist/src/__tests__/chat-format.test.d.ts.map +0 -1
  70. package/dist/src/__tests__/chat-format.test.js +0 -137
  71. package/dist/src/__tests__/chat-format.test.js.map +0 -1
  72. package/dist/src/__tests__/chat-runtime.test.d.ts +0 -2
  73. package/dist/src/__tests__/chat-runtime.test.d.ts.map +0 -1
  74. package/dist/src/__tests__/chat-runtime.test.js +0 -39
  75. package/dist/src/__tests__/chat-runtime.test.js.map +0 -1
  76. package/dist/src/__tests__/core-utils.test.d.ts +0 -2
  77. package/dist/src/__tests__/core-utils.test.d.ts.map +0 -1
  78. package/dist/src/__tests__/core-utils.test.js +0 -87
  79. package/dist/src/__tests__/core-utils.test.js.map +0 -1
  80. package/dist/src/__tests__/file-mentions.test.d.ts +0 -2
  81. package/dist/src/__tests__/file-mentions.test.d.ts.map +0 -1
  82. package/dist/src/__tests__/file-mentions.test.js +0 -29
  83. package/dist/src/__tests__/file-mentions.test.js.map +0 -1
  84. package/dist/src/__tests__/llm-factory.test.d.ts +0 -2
  85. package/dist/src/__tests__/llm-factory.test.d.ts.map +0 -1
  86. package/dist/src/__tests__/llm-factory.test.js +0 -45
  87. package/dist/src/__tests__/llm-factory.test.js.map +0 -1
  88. package/dist/src/__tests__/local-commands.test.d.ts +0 -2
  89. package/dist/src/__tests__/local-commands.test.d.ts.map +0 -1
  90. package/dist/src/__tests__/local-commands.test.js +0 -153
  91. package/dist/src/__tests__/local-commands.test.js.map +0 -1
  92. package/dist/src/__tests__/project-approval-rules.test.d.ts +0 -2
  93. package/dist/src/__tests__/project-approval-rules.test.d.ts.map +0 -1
  94. package/dist/src/__tests__/project-approval-rules.test.js +0 -135
  95. package/dist/src/__tests__/project-approval-rules.test.js.map +0 -1
  96. package/dist/src/__tests__/prompt-input.test.d.ts +0 -2
  97. package/dist/src/__tests__/prompt-input.test.d.ts.map +0 -1
  98. package/dist/src/__tests__/prompt-input.test.js +0 -57
  99. package/dist/src/__tests__/prompt-input.test.js.map +0 -1
  100. package/dist/src/__tests__/prompts.test.d.ts +0 -2
  101. package/dist/src/__tests__/prompts.test.d.ts.map +0 -1
  102. package/dist/src/__tests__/prompts.test.js +0 -46
  103. package/dist/src/__tests__/prompts.test.js.map +0 -1
  104. package/dist/src/__tests__/run-agent.test.d.ts +0 -2
  105. package/dist/src/__tests__/run-agent.test.d.ts.map +0 -1
  106. package/dist/src/__tests__/run-agent.test.js +0 -1276
  107. package/dist/src/__tests__/run-agent.test.js.map +0 -1
  108. package/dist/src/__tests__/run-shell.command.test.d.ts +0 -2
  109. package/dist/src/__tests__/run-shell.command.test.d.ts.map +0 -1
  110. package/dist/src/__tests__/run-shell.command.test.js +0 -188
  111. package/dist/src/__tests__/run-shell.command.test.js.map +0 -1
  112. package/dist/src/__tests__/smoke.test.d.ts +0 -2
  113. package/dist/src/__tests__/smoke.test.d.ts.map +0 -1
  114. package/dist/src/__tests__/smoke.test.js +0 -314
  115. package/dist/src/__tests__/smoke.test.js.map +0 -1
  116. package/dist/src/__tests__/tools.test.d.ts +0 -2
  117. package/dist/src/__tests__/tools.test.d.ts.map +0 -1
  118. package/dist/src/__tests__/tools.test.js +0 -698
  119. package/dist/src/__tests__/tools.test.js.map +0 -1
  120. package/dist/src/__tests__/trace-format.test.d.ts +0 -2
  121. package/dist/src/__tests__/trace-format.test.d.ts.map +0 -1
  122. package/dist/src/__tests__/trace-format.test.js +0 -148
  123. package/dist/src/__tests__/trace-format.test.js.map +0 -1
  124. package/dist/src/cli/chat/actions.d.ts +0 -47
  125. package/dist/src/cli/chat/actions.d.ts.map +0 -1
  126. package/dist/src/cli/chat/actions.js +0 -215
  127. package/dist/src/cli/chat/actions.js.map +0 -1
  128. package/dist/src/cli/chat/format.d.ts +0 -23
  129. package/dist/src/cli/chat/format.d.ts.map +0 -1
  130. package/dist/src/cli/chat/format.js +0 -243
  131. package/dist/src/cli/chat/format.js.map +0 -1
  132. package/dist/src/cli/chat/local-commands.d.ts +0 -17
  133. package/dist/src/cli/chat/local-commands.d.ts.map +0 -1
  134. package/dist/src/cli/chat/local-commands.js +0 -180
  135. package/dist/src/cli/chat/local-commands.js.map +0 -1
  136. package/dist/src/cli/chat/panels.d.ts +0 -37
  137. package/dist/src/cli/chat/panels.d.ts.map +0 -1
  138. package/dist/src/cli/chat/panels.js +0 -142
  139. package/dist/src/cli/chat/panels.js.map +0 -1
  140. package/dist/src/cli/chat/runtime.d.ts +0 -26
  141. package/dist/src/cli/chat/runtime.d.ts.map +0 -1
  142. package/dist/src/cli/chat/runtime.js +0 -28
  143. package/dist/src/cli/chat/runtime.js.map +0 -1
  144. package/dist/src/cli/chat/storage.d.ts +0 -13
  145. package/dist/src/cli/chat/storage.d.ts.map +0 -1
  146. package/dist/src/cli/chat/storage.js +0 -126
  147. package/dist/src/cli/chat/storage.js.map +0 -1
  148. package/dist/src/cli/chat/types.d.ts +0 -51
  149. package/dist/src/cli/chat/types.d.ts.map +0 -1
  150. package/dist/src/cli/chat/types.js +0 -2
  151. package/dist/src/cli/chat/types.js.map +0 -1
  152. package/dist/src/cli/chat/use-run-state.d.ts +0 -23
  153. package/dist/src/cli/chat/use-run-state.d.ts.map +0 -1
  154. package/dist/src/cli/chat/use-run-state.js +0 -118
  155. package/dist/src/cli/chat/use-run-state.js.map +0 -1
  156. package/dist/src/cli/chat/use-sessions.d.ts +0 -21
  157. package/dist/src/cli/chat/use-sessions.d.ts.map +0 -1
  158. package/dist/src/cli/chat/use-sessions.js +0 -111
  159. package/dist/src/cli/chat/use-sessions.js.map +0 -1
  160. package/dist/src/cli/chat-actions.d.ts +0 -47
  161. package/dist/src/cli/chat-actions.d.ts.map +0 -1
  162. package/dist/src/cli/chat-actions.js +0 -215
  163. package/dist/src/cli/chat-actions.js.map +0 -1
  164. package/dist/src/cli/chat-format.d.ts +0 -23
  165. package/dist/src/cli/chat-format.d.ts.map +0 -1
  166. package/dist/src/cli/chat-format.js +0 -243
  167. package/dist/src/cli/chat-format.js.map +0 -1
  168. package/dist/src/cli/chat-local-commands.d.ts +0 -17
  169. package/dist/src/cli/chat-local-commands.d.ts.map +0 -1
  170. package/dist/src/cli/chat-local-commands.js +0 -180
  171. package/dist/src/cli/chat-local-commands.js.map +0 -1
  172. package/dist/src/cli/chat-panels.d.ts +0 -37
  173. package/dist/src/cli/chat-panels.d.ts.map +0 -1
  174. package/dist/src/cli/chat-panels.js +0 -142
  175. package/dist/src/cli/chat-panels.js.map +0 -1
  176. package/dist/src/cli/chat-runtime.d.ts +0 -26
  177. package/dist/src/cli/chat-runtime.d.ts.map +0 -1
  178. package/dist/src/cli/chat-runtime.js +0 -28
  179. package/dist/src/cli/chat-runtime.js.map +0 -1
  180. package/dist/src/cli/chat-storage.d.ts +0 -13
  181. package/dist/src/cli/chat-storage.d.ts.map +0 -1
  182. package/dist/src/cli/chat-storage.js +0 -126
  183. package/dist/src/cli/chat-storage.js.map +0 -1
  184. package/dist/src/cli/chat-submit.d.ts +0 -28
  185. package/dist/src/cli/chat-submit.d.ts.map +0 -1
  186. package/dist/src/cli/chat-submit.js +0 -90
  187. package/dist/src/cli/chat-submit.js.map +0 -1
  188. package/dist/src/cli/chat-types.d.ts +0 -51
  189. package/dist/src/cli/chat-types.d.ts.map +0 -1
  190. package/dist/src/cli/chat-types.js +0 -2
  191. package/dist/src/cli/chat-types.js.map +0 -1
  192. package/dist/src/cli/chat.d.ts +0 -4
  193. package/dist/src/cli/chat.d.ts.map +0 -1
  194. package/dist/src/cli/chat.js +0 -153
  195. package/dist/src/cli/chat.js.map +0 -1
  196. package/dist/src/cli/useChatRunState.d.ts +0 -23
  197. package/dist/src/cli/useChatRunState.d.ts.map +0 -1
  198. package/dist/src/cli/useChatRunState.js +0 -118
  199. package/dist/src/cli/useChatRunState.js.map +0 -1
  200. package/dist/src/cli/useChatSessions.d.ts +0 -21
  201. package/dist/src/cli/useChatSessions.d.ts.map +0 -1
  202. package/dist/src/cli/useChatSessions.js +0 -111
  203. package/dist/src/cli/useChatSessions.js.map +0 -1
@@ -1,137 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildConversationMessages, formatChatFailureMessage, formatEditPreviewHistoryMessage, formatPlanHistoryMessage, } from '../cli/chat/utils/format.js';
3
- describe('buildConversationMessages', () => {
4
- it('renders successful edit_file tool results into visible conversation history', () => {
5
- const history = [
6
- { role: 'user', content: 'Update the file.' },
7
- {
8
- role: 'assistant',
9
- content: 'I will update the file.',
10
- toolCalls: [{ id: 'call-1', tool: 'edit_file', input: { path: 'src/example.ts', oldText: 'old', newText: 'new' } }],
11
- },
12
- {
13
- role: 'tool',
14
- toolCallId: 'call-1',
15
- content: JSON.stringify({
16
- ok: true,
17
- output: {
18
- path: 'src/example.ts',
19
- action: 'replaced',
20
- matchCount: 1,
21
- bytesWritten: 42,
22
- diff: {
23
- path: 'src/example.ts',
24
- action: 'replaced',
25
- diff: ['--- a/src/example.ts', '+++ b/src/example.ts', '@@ -1 +1 @@', '-const value = "old";', '+const value = "new";'].join('\n'),
26
- truncated: false,
27
- },
28
- },
29
- }),
30
- },
31
- { role: 'assistant', content: 'Done.' },
32
- ];
33
- const messages = buildConversationMessages(history);
34
- expect(messages).toHaveLength(4);
35
- expect(messages[2]).toMatchObject({
36
- role: 'assistant',
37
- text: expect.stringContaining('## Edited `src/example.ts`'),
38
- });
39
- expect(messages[2]?.text).toContain('Action: replaced');
40
- expect(messages[2]?.text).toContain('Matches changed: 1');
41
- expect(messages[2]?.text).toContain('```diff');
42
- expect(messages[2]?.text).toContain('+const value = "new";');
43
- });
44
- it('does not render non-edit tool results into conversation history', () => {
45
- const history = [
46
- { role: 'user', content: 'Inspect the repo.' },
47
- {
48
- role: 'assistant',
49
- content: 'I will inspect.',
50
- toolCalls: [{ id: 'call-1', tool: 'list_files', input: { path: '.' } }],
51
- },
52
- {
53
- role: 'tool',
54
- toolCallId: 'call-1',
55
- content: JSON.stringify({ ok: true, output: 'README.md\nsrc/' }),
56
- },
57
- ];
58
- const messages = buildConversationMessages(history);
59
- expect(messages).toEqual([
60
- { id: 'user-0-Inspect the repo.', role: 'user', text: 'Inspect the repo.' },
61
- { id: 'assistant-1-I will inspect.', role: 'assistant', text: 'I will inspect.' },
62
- ]);
63
- });
64
- it('renders update_plan tool results into visible checklist history', () => {
65
- const history = [
66
- { role: 'user', content: 'Move the project forward.' },
67
- {
68
- role: 'assistant',
69
- content: 'I will plan the work first.',
70
- toolCalls: [{ id: 'call-1', tool: 'update_plan', input: { plan: [{ step: 'Inspect roadmap', status: 'completed' }] } }],
71
- },
72
- {
73
- role: 'tool',
74
- toolCallId: 'call-1',
75
- content: JSON.stringify({
76
- ok: true,
77
- output: {
78
- explanation: 'Tracking the next implementation slice.',
79
- plan: [
80
- { step: 'Inspect roadmap and runtime state', status: 'completed' },
81
- { step: 'Implement the next bounded capability', status: 'in_progress' },
82
- { step: 'Verify with tests and build', status: 'pending' },
83
- ],
84
- },
85
- }),
86
- },
87
- ];
88
- const messages = buildConversationMessages(history);
89
- expect(messages).toHaveLength(3);
90
- expect(messages[2]?.text).toContain('## Plan');
91
- expect(messages[2]?.text).toContain('Tracking the next implementation slice.');
92
- expect(messages[2]?.text).toContain('- [x] Inspect roadmap and runtime state');
93
- expect(messages[2]?.text).toContain('- [-] Implement the next bounded capability');
94
- expect(messages[2]?.text).toContain('- [ ] Verify with tests and build');
95
- });
96
- it('formats a live edit preview into the same visible diff block shape', () => {
97
- const rendered = formatEditPreviewHistoryMessage({
98
- path: 'src/example.ts',
99
- action: 'replaced',
100
- diff: ['--- a/src/example.ts', '+++ b/src/example.ts', '@@ -1 +1 @@', '-old', '+new'].join('\n'),
101
- truncated: false,
102
- });
103
- expect(rendered).toContain('## Edited `src/example.ts`');
104
- expect(rendered).toContain('Action: replaced');
105
- expect(rendered).toContain('```diff');
106
- expect(rendered).toContain('+new');
107
- });
108
- it('formats a live plan update into the same visible checklist block shape', () => {
109
- const rendered = formatPlanHistoryMessage({
110
- explanation: 'Tracking the current implementation slice.',
111
- plan: [
112
- { step: 'Inspect runtime behavior', status: 'completed' },
113
- { step: 'Implement the fix', status: 'in_progress' },
114
- { step: 'Verify with tests', status: 'pending' },
115
- ],
116
- });
117
- expect(rendered).toContain('## Plan');
118
- expect(rendered).toContain('Tracking the current implementation slice.');
119
- expect(rendered).toContain('- [x] Inspect runtime behavior');
120
- expect(rendered).toContain('- [-] Implement the fix');
121
- expect(rendered).toContain('- [ ] Verify with tests');
122
- });
123
- });
124
- describe('formatChatFailureMessage', () => {
125
- it('adds manual compaction guidance for likely input-size TPM failures', () => {
126
- const formatted = formatChatFailureMessage(`429 {"type":"error","error":{"type":"rate_limit_error","message":"This request would exceed your organization's rate limit of 30,000 input tokens per minute. Please reduce the prompt length or the maximum tokens requested."}}`, { model: 'claude-sonnet-4-6', estimatedHistoryTokens: 18234 });
127
- expect(formatted).toContain('input-token-per-minute limit');
128
- expect(formatted).toContain('18,234 tokens');
129
- expect(formatted).toContain('/compact, /clear, or /session new');
130
- });
131
- it('distinguishes OpenAI quota exhaustion from prompt-size issues', () => {
132
- const formatted = formatChatFailureMessage('You exceeded your current quota, please check your plan and billing details.', { model: 'gpt-5.4' });
133
- expect(formatted).toContain('quota or billing limit');
134
- expect(formatted).toContain('not a transient prompt-size issue');
135
- });
136
- });
137
- //# sourceMappingURL=chat-format.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat-format.test.js","sourceRoot":"","sources":["../../../src/__tests__/chat-format.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=chat-runtime.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat-runtime.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/chat-runtime.test.ts"],"names":[],"mappings":""}
@@ -1,39 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import { resolveApiKeyForModel, resolveChatRuntimeConfig } from '../cli/chat/utils/runtime.js';
3
- describe('resolveChatRuntimeConfig', () => {
4
- afterEach(() => {
5
- vi.unstubAllEnvs();
6
- });
7
- it('does not fall back to OpenAI keys for Anthropic models', () => {
8
- vi.stubEnv('OPENAI_API_KEY', 'openai-key');
9
- vi.stubEnv('PERSONAL_OPENAI_API_KEY', '');
10
- vi.stubEnv('ANTHROPIC_API_KEY', '');
11
- vi.stubEnv('PERSONAL_ANTHROPIC_API_KEY', '');
12
- const runtime = resolveChatRuntimeConfig({
13
- workspaceRoot: '/tmp/heddle-test',
14
- model: 'claude-sonnet-4-6',
15
- });
16
- expect(runtime.apiKey).toBeUndefined();
17
- });
18
- it('uses Anthropic keys for Anthropic models', () => {
19
- vi.stubEnv('OPENAI_API_KEY', 'openai-key');
20
- vi.stubEnv('ANTHROPIC_API_KEY', 'anthropic-key');
21
- const runtime = resolveChatRuntimeConfig({
22
- workspaceRoot: '/tmp/heddle-test',
23
- model: 'claude-sonnet-4-6',
24
- });
25
- expect(runtime.apiKey).toBe('anthropic-key');
26
- });
27
- it('resolves the correct provider key for a session model even if startup used another provider', () => {
28
- vi.stubEnv('OPENAI_API_KEY', 'openai-key');
29
- vi.stubEnv('ANTHROPIC_API_KEY', 'anthropic-key');
30
- const runtime = resolveChatRuntimeConfig({
31
- workspaceRoot: '/tmp/heddle-test',
32
- model: 'gpt-5.4',
33
- });
34
- expect(runtime.apiKey).toBe('openai-key');
35
- expect(runtime.apiKeyProvider).toBe('openai');
36
- expect(resolveApiKeyForModel('claude-sonnet-4-6', runtime)).toBe('anthropic-key');
37
- });
38
- });
39
- //# sourceMappingURL=chat-runtime.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat-runtime.test.js","sourceRoot":"","sources":["../../../src/__tests__/chat-runtime.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE/F,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAC3C,EAAE,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QAC1C,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACpC,EAAE,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,wBAAwB,CAAC;YACvC,aAAa,EAAE,kBAAkB;YACjC,KAAK,EAAE,mBAAmB;SAC3B,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAC3C,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,wBAAwB,CAAC;YACvC,aAAa,EAAE,kBAAkB;YACjC,KAAK,EAAE,mBAAmB;SAC3B,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACrG,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAC3C,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,wBAAwB,CAAC;YACvC,aAAa,EAAE,kBAAkB;YACjC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=core-utils.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-utils.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/core-utils.test.ts"],"names":[],"mappings":""}
@@ -1,87 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { createToolRegistry } from '../tools/registry.js';
3
- import { createBudget } from '../utils/budget.js';
4
- import { createTraceRecorder } from '../trace/recorder.js';
5
- import { isRepoReviewCommand } from '../run-agent/mutation-tracking.js';
6
- describe('createToolRegistry', () => {
7
- const fakeTool = {
8
- name: 'test_tool',
9
- description: 'A test tool',
10
- parameters: { type: 'object', properties: {} },
11
- execute: async () => ({ ok: true, output: 'hello' }),
12
- };
13
- it('registers and retrieves a tool by name', () => {
14
- const registry = createToolRegistry([fakeTool]);
15
- expect(registry.get('test_tool')).toBe(fakeTool);
16
- });
17
- it('returns undefined for unknown tools', () => {
18
- const registry = createToolRegistry([fakeTool]);
19
- expect(registry.get('nonexistent')).toBeUndefined();
20
- });
21
- it('lists all tool names', () => {
22
- const another = { ...fakeTool, name: 'another' };
23
- const registry = createToolRegistry([fakeTool, another]);
24
- expect(registry.names()).toEqual(['test_tool', 'another']);
25
- });
26
- it('throws on duplicate tool names', () => {
27
- expect(() => createToolRegistry([fakeTool, fakeTool])).toThrow('Duplicate tool name');
28
- });
29
- });
30
- describe('createBudget', () => {
31
- it('counts steps and reports exhaustion', () => {
32
- const budget = createBudget(3);
33
- expect(budget.remaining()).toBe(3);
34
- expect(budget.exhausted()).toBe(false);
35
- budget.step();
36
- expect(budget.remaining()).toBe(2);
37
- budget.step();
38
- budget.step();
39
- expect(budget.remaining()).toBe(0);
40
- expect(budget.exhausted()).toBe(true);
41
- });
42
- });
43
- describe('createTraceRecorder', () => {
44
- it('records events and exports them', () => {
45
- const recorder = createTraceRecorder();
46
- const event1 = { type: 'run.started', goal: 'test', timestamp: '2024-01-01T00:00:00Z' };
47
- const event2 = {
48
- type: 'run.finished',
49
- outcome: 'done',
50
- summary: 'all good',
51
- step: 1,
52
- timestamp: '2024-01-01T00:00:01Z',
53
- };
54
- recorder.record(event1);
55
- recorder.record(event2);
56
- const trace = recorder.getTrace();
57
- expect(trace).toHaveLength(2);
58
- expect(trace[0]).toEqual(event1);
59
- expect(trace[1]).toEqual(event2);
60
- });
61
- it('exports valid JSON', () => {
62
- const recorder = createTraceRecorder();
63
- recorder.record({ type: 'run.started', goal: 'test', timestamp: '2024-01-01T00:00:00Z' });
64
- const json = recorder.toJSON();
65
- const parsed = JSON.parse(json);
66
- expect(parsed).toHaveLength(1);
67
- expect(parsed[0].type).toBe('run.started');
68
- });
69
- it('returns a copy from getTrace so mutations do not affect the recorder', () => {
70
- const recorder = createTraceRecorder();
71
- recorder.record({ type: 'run.started', goal: 'test', timestamp: '2024-01-01T00:00:00Z' });
72
- const trace = recorder.getTrace();
73
- trace.pop();
74
- expect(recorder.getTrace()).toHaveLength(1);
75
- });
76
- });
77
- describe('isRepoReviewCommand', () => {
78
- it('only accepts the stricter git evidence commands', () => {
79
- expect(isRepoReviewCommand('git diff --stat')).toBe(true);
80
- expect(isRepoReviewCommand('git diff --stat=10')).toBe(true);
81
- expect(isRepoReviewCommand('git status --short')).toBe(true);
82
- expect(isRepoReviewCommand('git diff')).toBe(false);
83
- expect(isRepoReviewCommand('git status')).toBe(false);
84
- expect(isRepoReviewCommand('git status --long')).toBe(false);
85
- });
86
- });
87
- //# sourceMappingURL=core-utils.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-utils.test.js","sourceRoot":"","sources":["../../../src/__tests__/core-utils.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=file-mentions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-mentions.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/file-mentions.test.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildPromptWithFileMentions, filterMentionableFiles, getMentionQuery, insertMentionSelection, } from '../cli/chat/utils/file-mentions.js';
3
- describe('file mentions', () => {
4
- it('detects a trailing mention query', () => {
5
- expect(getMentionQuery('Compare @REA')).toBe('REA');
6
- expect(getMentionQuery('hello world')).toBeUndefined();
7
- expect(getMentionQuery('test@example.com')).toBeUndefined();
8
- });
9
- it('inserts a selected file mention into the trailing token', () => {
10
- expect(insertMentionSelection('Compare @REA', 'README.md')).toBe('Compare @README.md');
11
- });
12
- it('ranks basename matches ahead of generic path substring matches', () => {
13
- const results = filterMentionableFiles(['src/README-helper.ts', 'README.md', 'docs/guide.md'], 'readme');
14
- expect(results[0]).toBe('README.md');
15
- });
16
- it('builds a host note for resolved mentioned files without expanding file contents', () => {
17
- const result = buildPromptWithFileMentions('Compare @README.md and @src/run-agent.ts', process.cwd(), ['README.md', 'src/run-agent.ts']);
18
- expect(result.mentions).toEqual([
19
- { token: '@README.md', path: 'README.md', index: 8 },
20
- { token: '@src/run-agent.ts', path: 'src/run-agent.ts', index: 23 },
21
- ]);
22
- expect(result.runPrompt).toContain('Host note: the user referenced files inline with @mentions.');
23
- expect(result.runPrompt).toContain('1. @README.md -> README.md');
24
- expect(result.runPrompt).toContain('2. @src/run-agent.ts -> src/run-agent.ts');
25
- expect(result.runPrompt).toContain('Original user prompt:');
26
- expect(result.runPrompt).toContain('Compare @README.md and @src/run-agent.ts');
27
- });
28
- });
29
- //# sourceMappingURL=file-mentions.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-mentions.test.js","sourceRoot":"","sources":["../../../src/__tests__/file-mentions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,eAAe,EACf,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,sBAAsB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,OAAO,GAAG,sBAAsB,CACpC,CAAC,sBAAsB,EAAE,WAAW,EAAE,eAAe,CAAC,EACtD,QAAQ,CACT,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,MAAM,GAAG,2BAA2B,CACxC,0CAA0C,EAC1C,OAAO,CAAC,GAAG,EAAE,EACb,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAClC,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YAC9B,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE;YACpD,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,EAAE;SACpE,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,6DAA6D,CAAC,CAAC;QAClG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=llm-factory.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm-factory.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/llm-factory.test.ts"],"names":[],"mappings":""}
@@ -1,45 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { createAnthropicAdapter } from '../llm/anthropic.js';
3
- import { createLlmAdapter, inferProviderFromModel, resolveLlmProvider } from '../llm/factory.js';
4
- describe('llm adapter factory', () => {
5
- it('infers provider from known model prefixes', () => {
6
- expect(inferProviderFromModel('gpt-5.1-codex')).toBe('openai');
7
- expect(inferProviderFromModel('claude-sonnet-4-6')).toBe('anthropic');
8
- expect(inferProviderFromModel('gemini-2.5-pro')).toBe('google');
9
- });
10
- it('prefers an explicit provider over model inference', () => {
11
- expect(resolveLlmProvider({ provider: 'openai', model: 'claude-sonnet-4-6' })).toBe('openai');
12
- });
13
- it('returns an OpenAI adapter with provider metadata for OpenAI models', () => {
14
- const adapter = createLlmAdapter({ model: 'gpt-5.1-codex', apiKey: 'test-key' });
15
- expect(adapter.info).toEqual({
16
- provider: 'openai',
17
- model: 'gpt-5.1-codex',
18
- capabilities: {
19
- toolCalls: true,
20
- systemMessages: true,
21
- reasoningSummaries: true,
22
- parallelToolCalls: true,
23
- },
24
- });
25
- });
26
- it('returns an Anthropic adapter with provider metadata for Claude models', () => {
27
- const adapter = createLlmAdapter({ model: 'claude-sonnet-4-6', apiKey: 'test-key' });
28
- expect(adapter.info).toEqual({
29
- provider: 'anthropic',
30
- model: 'claude-sonnet-4-6',
31
- capabilities: {
32
- toolCalls: true,
33
- systemMessages: true,
34
- reasoningSummaries: false,
35
- parallelToolCalls: false,
36
- },
37
- });
38
- });
39
- it('exports a direct Anthropic adapter constructor', () => {
40
- const adapter = createAnthropicAdapter({ model: 'claude-sonnet-4-6', apiKey: 'test-key' });
41
- expect(adapter.info?.provider).toBe('anthropic');
42
- expect(adapter.info?.model).toBe('claude-sonnet-4-6');
43
- });
44
- });
45
- //# sourceMappingURL=llm-factory.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm-factory.test.js","sourceRoot":"","sources":["../../../src/__tests__/llm-factory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEjG,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAEjF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YAC3B,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,eAAe;YACtB,YAAY,EAAE;gBACZ,SAAS,EAAE,IAAI;gBACf,cAAc,EAAE,IAAI;gBACpB,kBAAkB,EAAE,IAAI;gBACxB,iBAAiB,EAAE,IAAI;aACxB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAErF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YAC3B,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,mBAAmB;YAC1B,YAAY,EAAE;gBACZ,SAAS,EAAE,IAAI;gBACf,cAAc,EAAE,IAAI;gBACpB,kBAAkB,EAAE,KAAK;gBACzB,iBAAiB,EAAE,KAAK;aACzB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=local-commands.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-commands.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/local-commands.test.ts"],"names":[],"mappings":""}
@@ -1,153 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { getLocalCommandHints, isLikelyLocalCommand, runLocalCommand } from '../cli/chat/state/local-commands.js';
3
- function createCommandArgs(overrides = {}) {
4
- return {
5
- prompt: '/help',
6
- activeModel: 'gpt-5.1-codex',
7
- setActiveModel: vi.fn(),
8
- sessions: [],
9
- recentSessions: [],
10
- activeSessionId: 'session-1',
11
- switchSession: vi.fn(),
12
- createSession: vi.fn(),
13
- renameSession: vi.fn(),
14
- removeSession: vi.fn(),
15
- clearConversation: vi.fn(),
16
- compactConversation: vi.fn(() => 'Compacted earlier session history to reduce context size.'),
17
- listRecentSessionsMessage: [],
18
- ...overrides,
19
- };
20
- }
21
- describe('runLocalCommand', () => {
22
- it('treats bare and partial slash command roots as local commands for hints', () => {
23
- expect(isLikelyLocalCommand('/')).toBe(true);
24
- expect(isLikelyLocalCommand('/h')).toBe(true);
25
- expect(isLikelyLocalCommand('/mo')).toBe(true);
26
- expect(isLikelyLocalCommand('/sess')).toBe(true);
27
- expect(isLikelyLocalCommand('/comp')).toBe(true);
28
- });
29
- it('does not treat absolute unix paths as slash commands', () => {
30
- expect(isLikelyLocalCommand('/Users/roackb2/Desktop/screenshot.png')).toBe(false);
31
- });
32
- it('lists grouped common built-in model choices with multi-line formatting', () => {
33
- const result = runLocalCommand(createCommandArgs({ prompt: '/model list' }));
34
- expect(result).toMatchObject({
35
- handled: true,
36
- kind: 'message',
37
- });
38
- if (!result.handled || result.kind !== 'message') {
39
- throw new Error('expected /model list to return a message result');
40
- }
41
- expect(result.message).toContain('Common built-in model choices');
42
- expect(result.message).toContain('OpenAI · GPT-5.4\n - gpt-5.4\n - gpt-5.4-pro\n - gpt-5.4-mini\n - gpt-5.4-nano');
43
- expect(result.message).toContain('OpenAI · GPT-4.1\n - gpt-4.1\n - gpt-4.1-mini\n - gpt-4.1-nano');
44
- expect(result.message).toContain('Anthropic · Claude 4\n - claude-opus-4-6\n - claude-sonnet-4-6\n - claude-haiku-4-5');
45
- expect(result.message).toContain('Anthropic · Earlier Claude 4\n - claude-opus-4-1\n - claude-opus-4-0\n - claude-sonnet-4-0');
46
- expect(result.message).toContain('Anthropic · Claude 3.5\n - claude-3-5-sonnet-latest\n - claude-3-5-haiku-latest');
47
- });
48
- it('keeps /models as a compatibility alias for /model list', () => {
49
- const result = runLocalCommand(createCommandArgs({ prompt: '/models' }));
50
- expect(result).toMatchObject({
51
- handled: true,
52
- kind: 'message',
53
- });
54
- if (!result.handled || result.kind !== 'message') {
55
- throw new Error('expected /models to return a message result');
56
- }
57
- expect(result.message).toContain('Common built-in model choices');
58
- expect(result.message).toContain('OpenAI · GPT-5.4\n - gpt-5.4');
59
- expect(result.message).toContain('Anthropic · Claude 4\n - claude-opus-4-6');
60
- });
61
- it('recognizes supported shortlist models when switching', () => {
62
- const setActiveModel = vi.fn();
63
- const result = runLocalCommand(createCommandArgs({
64
- prompt: '/model gpt-5.4-mini',
65
- setActiveModel,
66
- }));
67
- expect(setActiveModel).toHaveBeenCalledWith('gpt-5.4-mini');
68
- expect(result).toEqual({
69
- handled: true,
70
- kind: 'message',
71
- message: 'Switched model to gpt-5.4-mini',
72
- });
73
- });
74
- it('does not treat /model set as a literal model name', () => {
75
- const setActiveModel = vi.fn();
76
- const result = runLocalCommand(createCommandArgs({
77
- prompt: '/model set',
78
- setActiveModel,
79
- }));
80
- expect(setActiveModel).not.toHaveBeenCalled();
81
- expect(result).toEqual({
82
- handled: true,
83
- kind: 'message',
84
- message: 'Use /model set <query> to filter models, then use arrows and Enter to choose one.',
85
- });
86
- });
87
- it('allows switching sessions by recent-session index', () => {
88
- const switchSession = vi.fn();
89
- const sessions = [
90
- { id: 'session-a', name: 'A', history: [], messages: [], turns: [], createdAt: '2024-01-01', updatedAt: '2024-01-01' },
91
- { id: 'session-b', name: 'B', history: [], messages: [], turns: [], createdAt: '2024-01-02', updatedAt: '2024-01-02' },
92
- ];
93
- const result = runLocalCommand(createCommandArgs({
94
- prompt: '/session switch 2',
95
- sessions,
96
- recentSessions: sessions,
97
- activeSessionId: 'session-a',
98
- switchSession,
99
- }));
100
- expect(switchSession).toHaveBeenCalledWith('session-b');
101
- expect(result).toEqual({
102
- handled: true,
103
- kind: 'message',
104
- message: 'Switched to session-b (B).\n0 turns • no turns yet',
105
- });
106
- });
107
- it('allows continuing sessions by recent-session index', () => {
108
- const sessions = [
109
- { id: 'session-a', name: 'A', history: [], messages: [], turns: [], createdAt: '2024-01-01', updatedAt: '2024-01-01' },
110
- { id: 'session-b', name: 'B', history: [], messages: [], turns: [], createdAt: '2024-01-02', updatedAt: '2024-01-02' },
111
- ];
112
- const result = runLocalCommand(createCommandArgs({
113
- prompt: '/session continue 2',
114
- sessions,
115
- recentSessions: sessions,
116
- activeSessionId: 'session-a',
117
- }));
118
- expect(result).toEqual({
119
- handled: true,
120
- kind: 'continue',
121
- sessionId: 'session-b',
122
- message: 'Switched to session-b (B).\nContinuing from that session transcript.',
123
- });
124
- });
125
- it('passes through absolute unix paths as normal prompts', () => {
126
- const result = runLocalCommand(createCommandArgs({
127
- prompt: '/Users/roackb2/Desktop/screenshot.png can you describe this image',
128
- }));
129
- expect(result).toEqual({ handled: false });
130
- });
131
- it('runs manual compaction when requested', () => {
132
- const compactConversation = vi.fn(() => 'Compacted earlier session history to reduce context size (24 messages summarized).');
133
- const result = runLocalCommand(createCommandArgs({
134
- prompt: '/compact',
135
- activeModel: 'claude-sonnet-4-6',
136
- compactConversation,
137
- }));
138
- expect(compactConversation).toHaveBeenCalledTimes(1);
139
- expect(result).toEqual({
140
- handled: true,
141
- kind: 'message',
142
- message: 'Compacted earlier session history to reduce context size (24 messages summarized).',
143
- });
144
- });
145
- it('includes /compact in shared slash-command hints', () => {
146
- const hints = getLocalCommandHints('/', 'session-1', []);
147
- expect(hints).toContainEqual({
148
- command: '/compact',
149
- description: 'compact earlier session history for the next run',
150
- });
151
- });
152
- });
153
- //# sourceMappingURL=local-commands.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-commands.test.js","sourceRoot":"","sources":["../../../src/__tests__/local-commands.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=project-approval-rules.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-approval-rules.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/project-approval-rules.test.ts"],"names":[],"mappings":""}