@roackb2/heddle 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +36 -5
  2. package/dist/src/__tests__/chat-compaction.test.js +39 -0
  3. package/dist/src/__tests__/chat-compaction.test.js.map +1 -1
  4. package/dist/src/__tests__/chat-format.test.js +14 -1
  5. package/dist/src/__tests__/chat-format.test.js.map +1 -1
  6. package/dist/src/__tests__/local-commands.test.js +65 -101
  7. package/dist/src/__tests__/local-commands.test.js.map +1 -1
  8. package/dist/src/__tests__/prompt-input.test.js +47 -0
  9. package/dist/src/__tests__/prompt-input.test.js.map +1 -1
  10. package/dist/src/__tests__/prompts.test.js +3 -0
  11. package/dist/src/__tests__/prompts.test.js.map +1 -1
  12. package/dist/src/__tests__/tools.test.js +78 -0
  13. package/dist/src/__tests__/tools.test.js.map +1 -1
  14. package/dist/src/cli/ask.d.ts.map +1 -1
  15. package/dist/src/cli/ask.js +5 -1
  16. package/dist/src/cli/ask.js.map +1 -1
  17. package/dist/src/cli/chat/App.d.ts.map +1 -1
  18. package/dist/src/cli/chat/App.js +5 -5
  19. package/dist/src/cli/chat/App.js.map +1 -1
  20. package/dist/src/cli/chat/components/PromptInput.d.ts +7 -0
  21. package/dist/src/cli/chat/components/PromptInput.d.ts.map +1 -1
  22. package/dist/src/cli/chat/components/PromptInput.js +48 -11
  23. package/dist/src/cli/chat/components/PromptInput.js.map +1 -1
  24. package/dist/src/cli/chat/components/SlashHintPanel.js +2 -30
  25. package/dist/src/cli/chat/components/SlashHintPanel.js.map +1 -1
  26. package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
  27. package/dist/src/cli/chat/hooks/useAgentRun.js +28 -8
  28. package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
  29. package/dist/src/cli/chat/state/compaction.d.ts +4 -0
  30. package/dist/src/cli/chat/state/compaction.d.ts.map +1 -1
  31. package/dist/src/cli/chat/state/compaction.js +21 -5
  32. package/dist/src/cli/chat/state/compaction.js.map +1 -1
  33. package/dist/src/cli/chat/state/local-commands.d.ts +6 -0
  34. package/dist/src/cli/chat/state/local-commands.d.ts.map +1 -1
  35. package/dist/src/cli/chat/state/local-commands.js +38 -45
  36. package/dist/src/cli/chat/state/local-commands.js.map +1 -1
  37. package/dist/src/cli/chat/state/storage.js +1 -0
  38. package/dist/src/cli/chat/state/storage.js.map +1 -1
  39. package/dist/src/cli/chat/state/types.d.ts +1 -0
  40. package/dist/src/cli/chat/state/types.d.ts.map +1 -1
  41. package/dist/src/cli/chat/submit.d.ts.map +1 -1
  42. package/dist/src/cli/chat/submit.js +27 -1
  43. package/dist/src/cli/chat/submit.js.map +1 -1
  44. package/dist/src/cli/chat/utils/format.d.ts +5 -0
  45. package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
  46. package/dist/src/cli/chat/utils/format.js +23 -0
  47. package/dist/src/cli/chat/utils/format.js.map +1 -1
  48. package/dist/src/cli/chat/utils/runtime.d.ts +1 -0
  49. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  50. package/dist/src/cli/chat/utils/runtime.js +1 -0
  51. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  52. package/dist/src/index.d.ts +2 -0
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/index.js +1 -0
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/prompts/system-prompt.d.ts.map +1 -1
  57. package/dist/src/prompts/system-prompt.js +10 -0
  58. package/dist/src/prompts/system-prompt.js.map +1 -1
  59. package/dist/src/tools/edit-file.d.ts +3 -7
  60. package/dist/src/tools/edit-file.d.ts.map +1 -1
  61. package/dist/src/tools/edit-file.js +16 -222
  62. package/dist/src/tools/edit-file.js.map +1 -1
  63. package/dist/src/tools/file-edit-core.d.ts +31 -0
  64. package/dist/src/tools/file-edit-core.d.ts.map +1 -0
  65. package/dist/src/tools/file-edit-core.js +231 -0
  66. package/dist/src/tools/file-edit-core.js.map +1 -0
  67. package/dist/src/tools/memory-notes.d.ts +13 -0
  68. package/dist/src/tools/memory-notes.d.ts.map +1 -0
  69. package/dist/src/tools/memory-notes.js +382 -0
  70. package/dist/src/tools/memory-notes.js.map +1 -0
  71. package/package.json +1 -1
package/README.md CHANGED
@@ -16,11 +16,12 @@ It is open source, provider-agnostic, and currently supports OpenAI and Anthropi
16
16
  ## Advanced Capabilities
17
17
 
18
18
  - provider-agnostic model support across OpenAI and Anthropic
19
- - hosted web search through `web_search`
19
+ - provider-backed hosted web search through `web_search`
20
20
  - local image viewing from referenced file paths through `view_image`
21
21
  - inline `@file` mentions that tell the agent which workspace files to inspect first
22
22
  - multi-turn sessions with save, switch, continue, rename, and close flows
23
- - automatic conversation compaction for longer chats
23
+ - automatic conversation compaction for longer chats, plus manual `/compact` when needed
24
+ - persistent workspace knowledge through `.heddle/memory/`
24
25
  - lightweight working-plan tracking through `update_plan`
25
26
  - approval-gated shell execution with remembered per-project approvals
26
27
  - trace logs, persistent chat state, and project instruction loading under `.heddle/`
@@ -73,16 +74,19 @@ Heddle currently supports:
73
74
 
74
75
  - repository inspection with `list_files`, `read_file`, and `search_files`
75
76
  - code and doc changes with `edit_file`
76
- - hosted web search through `web_search`
77
+ - provider-backed hosted web search through `web_search`
77
78
  - local screenshot and image inspection through `view_image`
78
79
  - inline `@file` mentions for file-priority context without pasting file contents into the prompt
79
80
  - shell execution with inspect vs approval-gated mutate behavior
80
81
  - multi-turn chat sessions with saved history under `.heddle/`
81
82
  - session management with create, switch, continue, rename, and close flows
82
83
  - automatic conversation compaction so longer chats preserve context instead of growing unbounded
84
+ - manual `/compact` to shrink the current session transcript on demand
85
+ - persistent workspace memory notes under `.heddle/memory/`
83
86
  - short working-plan support through `update_plan` for substantial multi-step tasks
84
87
  - remembered per-project approvals for repeated commands and edits
85
88
  - interrupt and resume support for longer-running coding workflows
89
+ - request-size aware context tracking in chat so the footer reflects model input usage, not only raw history size
86
90
 
87
91
  The image workflow is intentionally simple for now: users can reference a local image path in chat, and the agent can decide whether to inspect it with `view_image`. Heddle does not require a full multimodal attachment model for this first version.
88
92
 
@@ -90,6 +94,30 @@ The file-mention workflow is also intentionally lightweight: `@path/to/file` tel
90
94
 
91
95
  The planning workflow is also intentionally lightweight: Heddle does not force a heavyweight planner or a separate "plan mode," but it can automatically record and update a short plan when a task is substantial enough to benefit from visible progress tracking.
92
96
 
97
+ The web-search workflow is provider-backed rather than crawler-backed: OpenAI models use OpenAI-hosted web search, and Anthropic models use Anthropic-hosted web search when available through the selected model/tool path.
98
+
99
+ ## Knowledge Persistence
100
+
101
+ Heddle can maintain durable workspace knowledge under `.heddle/memory/`.
102
+
103
+ The goal is to help Heddle learn from real project work over time instead of rediscovering the same stable facts every session.
104
+
105
+ Typical examples:
106
+
107
+ - architecture notes that future sessions should reuse
108
+ - recurring build, test, or environment quirks
109
+ - important repo conventions and command patterns
110
+ - durable findings from completed implementation work
111
+
112
+ The memory model is intentionally simple:
113
+
114
+ - memory is stored as readable markdown files in the project state directory
115
+ - Heddle can list, read, search, and edit those notes
116
+ - shell tools are still available when flexible retrieval or editing is needed
117
+ - memory is meant for stable, reusable knowledge, not scratch notes or speculative plans
118
+
119
+ This is one of Heddle's more distinctive host-side capabilities: the aim is not just to answer the current prompt, but to let the runtime accumulate project understanding from your operations and become more useful across sessions.
120
+
93
121
  ## What Heddle Does
94
122
 
95
123
  Heddle runs an agent loop against your workspace:
@@ -125,9 +153,9 @@ Typical chat use cases:
125
153
  - ask Heddle to explain architecture, code paths, tests, or build setup
126
154
  - iterate on a fix over multiple prompts instead of fitting everything into one request
127
155
  - inspect files, search the repo, and edit code inside one persistent session
128
- - keep a long coding conversation usable through saved sessions, `/continue`, and automatic history compaction
156
+ - keep a long coding conversation usable through saved sessions, `/continue`, automatic history compaction, and manual `/compact`
129
157
  - let the agent create and update a short working plan for a multi-step implementation
130
- - search official docs or other current external references with `web_search`
158
+ - search official docs or other current external references with provider-backed `web_search`
131
159
  - mention important repo files with `@path/to/file` so the agent treats them as first-pass context
132
160
  - reference a local screenshot path and have the agent inspect it with `view_image`
133
161
  - run direct shell commands from chat with `!<command>`
@@ -149,6 +177,7 @@ Useful chat commands:
149
177
  - `/session rename <name>`: rename the current session
150
178
  - `/session close <id>`: remove a saved session
151
179
  - `/clear`: clear the current transcript
180
+ - `/compact`: compact older session history immediately
152
181
  - `!<command>`: run a shell command directly in chat
153
182
 
154
183
  Direct shell in chat:
@@ -161,6 +190,8 @@ Direct shell in chat:
161
190
 
162
191
  Read-oriented commands stay in inspect mode when possible. Workspace-changing or unclassified commands fall back to approval-gated execution.
163
192
 
193
+ Chat state is stored under `.heddle/`, including saved sessions, traces, approvals, and memory notes. The footer context indicator is an estimate of total request input against the active model's context window, not only the raw chat history length.
194
+
164
195
  ## CLI Usage
165
196
 
166
197
  Supported commands:
@@ -20,5 +20,44 @@ describe('chat history compaction', () => {
20
20
  const visibleMessages = buildConversationMessages(compacted.history);
21
21
  expect(visibleMessages[0]?.text).toContain('Earlier conversation history was compacted');
22
22
  });
23
+ it('can force a single manual compaction pass even before the auto threshold is exceeded', () => {
24
+ const history = Array.from({ length: 6 }).flatMap((_, index) => [
25
+ { role: 'user', content: `User prompt ${index}: ${'u'.repeat(60)}` },
26
+ { role: 'assistant', content: `Assistant reply ${index}: ${'a'.repeat(60)}` },
27
+ ]);
28
+ const autoCompacted = compactChatHistory({
29
+ history,
30
+ model: 'gpt-5.1',
31
+ });
32
+ const manuallyCompacted = compactChatHistory({
33
+ history,
34
+ model: 'gpt-5.1',
35
+ force: true,
36
+ });
37
+ expect(autoCompacted.history).toEqual(history);
38
+ expect(isCompactedHistorySummary(manuallyCompacted.history[0])).toBe(true);
39
+ expect(manuallyCompacted.history.length).toBeLessThan(history.length);
40
+ expect(manuallyCompacted.context.compactedMessages).toBeGreaterThan(0);
41
+ });
42
+ it('can re-compact an already compacted short session when forced manually', () => {
43
+ const history = [
44
+ {
45
+ role: 'system',
46
+ content: 'Heddle compacted earlier conversation history.\n\nMore recent archived turns:\nAssistant: Earlier summary.',
47
+ },
48
+ { role: 'system', content: 'Host reminder: use the evidence you already gathered.' },
49
+ { role: 'tool', toolCallId: 'tool-1', content: '{"ok":true,"output":"git diff --stat HEAD"}' },
50
+ { role: 'user', content: 'can you try again' },
51
+ { role: 'user', content: 'try again' },
52
+ ];
53
+ const compacted = compactChatHistory({
54
+ history,
55
+ model: 'gpt-5.1',
56
+ force: true,
57
+ });
58
+ expect(compacted.history.length).toBeLessThan(history.length);
59
+ expect(isCompactedHistorySummary(compacted.history[0])).toBe(true);
60
+ expect(compacted.context.compactedMessages).toBeGreaterThan(0);
61
+ });
23
62
  });
24
63
  //# sourceMappingURL=chat-compaction.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-compaction.test.js","sourceRoot":"","sources":["../../../src/__tests__/chat-compaction.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAChG,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,OAAO,GAAkB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9E,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,eAAe,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE;YAC/E,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,mBAAmB,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE;SACzF,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,kBAAkB,CAAC;YACnC,OAAO;YACP,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,eAAe,GAAG,yBAAyB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"chat-compaction.test.js","sourceRoot":"","sources":["../../../src/__tests__/chat-compaction.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { buildConversationMessages, formatEditPreviewHistoryMessage, formatPlanHistoryMessage } from '../cli/chat/utils/format.js';
2
+ import { buildConversationMessages, formatChatFailureMessage, formatEditPreviewHistoryMessage, formatPlanHistoryMessage, } from '../cli/chat/utils/format.js';
3
3
  describe('buildConversationMessages', () => {
4
4
  it('renders successful edit_file tool results into visible conversation history', () => {
5
5
  const history = [
@@ -121,4 +121,17 @@ describe('buildConversationMessages', () => {
121
121
  expect(rendered).toContain('- [ ] Verify with tests');
122
122
  });
123
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
+ });
124
137
  //# sourceMappingURL=chat-format.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-format.test.js","sourceRoot":"","sources":["../../../src/__tests__/chat-format.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-format.test.js","sourceRoot":"","sources":["../../../src/__tests__/chat-format.test.ts"],"names":[],"mappings":"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"}
@@ -1,30 +1,36 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
- import { isLikelyLocalCommand, runLocalCommand } from '../cli/chat/state/local-commands.js';
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
+ }
3
21
  describe('runLocalCommand', () => {
4
22
  it('treats bare and partial slash command roots as local commands for hints', () => {
5
23
  expect(isLikelyLocalCommand('/')).toBe(true);
6
24
  expect(isLikelyLocalCommand('/h')).toBe(true);
7
25
  expect(isLikelyLocalCommand('/mo')).toBe(true);
8
26
  expect(isLikelyLocalCommand('/sess')).toBe(true);
27
+ expect(isLikelyLocalCommand('/comp')).toBe(true);
9
28
  });
10
29
  it('does not treat absolute unix paths as slash commands', () => {
11
30
  expect(isLikelyLocalCommand('/Users/roackb2/Desktop/screenshot.png')).toBe(false);
12
31
  });
13
32
  it('lists grouped common built-in model choices with multi-line formatting', () => {
14
- const result = runLocalCommand({
15
- prompt: '/model list',
16
- activeModel: 'gpt-5.1-codex',
17
- setActiveModel: vi.fn(),
18
- sessions: [],
19
- recentSessions: [],
20
- activeSessionId: 'session-1',
21
- switchSession: vi.fn(),
22
- createSession: vi.fn(),
23
- renameSession: vi.fn(),
24
- removeSession: vi.fn(),
25
- clearConversation: vi.fn(),
26
- listRecentSessionsMessage: [],
27
- });
33
+ const result = runLocalCommand(createCommandArgs({ prompt: '/model list' }));
28
34
  expect(result).toMatchObject({
29
35
  handled: true,
30
36
  kind: 'message',
@@ -40,20 +46,7 @@ describe('runLocalCommand', () => {
40
46
  expect(result.message).toContain('Anthropic · Claude 3.5\n - claude-3-5-sonnet-latest\n - claude-3-5-haiku-latest');
41
47
  });
42
48
  it('keeps /models as a compatibility alias for /model list', () => {
43
- const result = runLocalCommand({
44
- prompt: '/models',
45
- activeModel: 'gpt-5.1-codex',
46
- setActiveModel: vi.fn(),
47
- sessions: [],
48
- recentSessions: [],
49
- activeSessionId: 'session-1',
50
- switchSession: vi.fn(),
51
- createSession: vi.fn(),
52
- renameSession: vi.fn(),
53
- removeSession: vi.fn(),
54
- clearConversation: vi.fn(),
55
- listRecentSessionsMessage: [],
56
- });
49
+ const result = runLocalCommand(createCommandArgs({ prompt: '/models' }));
57
50
  expect(result).toMatchObject({
58
51
  handled: true,
59
52
  kind: 'message',
@@ -67,20 +60,10 @@ describe('runLocalCommand', () => {
67
60
  });
68
61
  it('recognizes supported shortlist models when switching', () => {
69
62
  const setActiveModel = vi.fn();
70
- const result = runLocalCommand({
63
+ const result = runLocalCommand(createCommandArgs({
71
64
  prompt: '/model gpt-5.4-mini',
72
- activeModel: 'gpt-5.1-codex',
73
65
  setActiveModel,
74
- sessions: [],
75
- recentSessions: [],
76
- activeSessionId: 'session-1',
77
- switchSession: vi.fn(),
78
- createSession: vi.fn(),
79
- renameSession: vi.fn(),
80
- removeSession: vi.fn(),
81
- clearConversation: vi.fn(),
82
- listRecentSessionsMessage: [],
83
- });
66
+ }));
84
67
  expect(setActiveModel).toHaveBeenCalledWith('gpt-5.4-mini');
85
68
  expect(result).toEqual({
86
69
  handled: true,
@@ -90,20 +73,10 @@ describe('runLocalCommand', () => {
90
73
  });
91
74
  it('does not treat /model set as a literal model name', () => {
92
75
  const setActiveModel = vi.fn();
93
- const result = runLocalCommand({
76
+ const result = runLocalCommand(createCommandArgs({
94
77
  prompt: '/model set',
95
- activeModel: 'gpt-5.1-codex',
96
78
  setActiveModel,
97
- sessions: [],
98
- recentSessions: [],
99
- activeSessionId: 'session-1',
100
- switchSession: vi.fn(),
101
- createSession: vi.fn(),
102
- renameSession: vi.fn(),
103
- removeSession: vi.fn(),
104
- clearConversation: vi.fn(),
105
- listRecentSessionsMessage: [],
106
- });
79
+ }));
107
80
  expect(setActiveModel).not.toHaveBeenCalled();
108
81
  expect(result).toEqual({
109
82
  handled: true,
@@ -113,26 +86,17 @@ describe('runLocalCommand', () => {
113
86
  });
114
87
  it('allows switching sessions by recent-session index', () => {
115
88
  const switchSession = vi.fn();
116
- const result = runLocalCommand({
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({
117
94
  prompt: '/session switch 2',
118
- activeModel: 'gpt-5.1-codex',
119
- setActiveModel: vi.fn(),
120
- sessions: [
121
- { id: 'session-a', name: 'A', history: [], messages: [], turns: [], createdAt: '2024-01-01', updatedAt: '2024-01-01' },
122
- { id: 'session-b', name: 'B', history: [], messages: [], turns: [], createdAt: '2024-01-02', updatedAt: '2024-01-02' },
123
- ],
124
- recentSessions: [
125
- { id: 'session-a', name: 'A', history: [], messages: [], turns: [], createdAt: '2024-01-01', updatedAt: '2024-01-01' },
126
- { id: 'session-b', name: 'B', history: [], messages: [], turns: [], createdAt: '2024-01-02', updatedAt: '2024-01-02' },
127
- ],
95
+ sessions,
96
+ recentSessions: sessions,
128
97
  activeSessionId: 'session-a',
129
98
  switchSession,
130
- createSession: vi.fn(),
131
- renameSession: vi.fn(),
132
- removeSession: vi.fn(),
133
- clearConversation: vi.fn(),
134
- listRecentSessionsMessage: [],
135
- });
99
+ }));
136
100
  expect(switchSession).toHaveBeenCalledWith('session-b');
137
101
  expect(result).toEqual({
138
102
  handled: true,
@@ -141,26 +105,16 @@ describe('runLocalCommand', () => {
141
105
  });
142
106
  });
143
107
  it('allows continuing sessions by recent-session index', () => {
144
- const result = runLocalCommand({
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({
145
113
  prompt: '/session continue 2',
146
- activeModel: 'gpt-5.1-codex',
147
- setActiveModel: vi.fn(),
148
- sessions: [
149
- { id: 'session-a', name: 'A', history: [], messages: [], turns: [], createdAt: '2024-01-01', updatedAt: '2024-01-01' },
150
- { id: 'session-b', name: 'B', history: [], messages: [], turns: [], createdAt: '2024-01-02', updatedAt: '2024-01-02' },
151
- ],
152
- recentSessions: [
153
- { id: 'session-a', name: 'A', history: [], messages: [], turns: [], createdAt: '2024-01-01', updatedAt: '2024-01-01' },
154
- { id: 'session-b', name: 'B', history: [], messages: [], turns: [], createdAt: '2024-01-02', updatedAt: '2024-01-02' },
155
- ],
114
+ sessions,
115
+ recentSessions: sessions,
156
116
  activeSessionId: 'session-a',
157
- switchSession: vi.fn(),
158
- createSession: vi.fn(),
159
- renameSession: vi.fn(),
160
- removeSession: vi.fn(),
161
- clearConversation: vi.fn(),
162
- listRecentSessionsMessage: [],
163
- });
117
+ }));
164
118
  expect(result).toEqual({
165
119
  handled: true,
166
120
  kind: 'continue',
@@ -169,21 +123,31 @@ describe('runLocalCommand', () => {
169
123
  });
170
124
  });
171
125
  it('passes through absolute unix paths as normal prompts', () => {
172
- const result = runLocalCommand({
126
+ const result = runLocalCommand(createCommandArgs({
173
127
  prompt: '/Users/roackb2/Desktop/screenshot.png can you describe this image',
174
- activeModel: 'gpt-5.1-codex',
175
- setActiveModel: vi.fn(),
176
- sessions: [],
177
- recentSessions: [],
178
- activeSessionId: 'session-1',
179
- switchSession: vi.fn(),
180
- createSession: vi.fn(),
181
- renameSession: vi.fn(),
182
- removeSession: vi.fn(),
183
- clearConversation: vi.fn(),
184
- listRecentSessionsMessage: [],
185
- });
128
+ }));
186
129
  expect(result).toEqual({ handled: false });
187
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
+ });
188
152
  });
189
153
  //# sourceMappingURL=local-commands.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-commands.test.js","sourceRoot":"","sources":["../../../src/__tests__/local-commands.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-commands.test.js","sourceRoot":"","sources":["../../../src/__tests__/local-commands.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,57 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { insertMentionSelection } from '../cli/chat/utils/file-mentions.js';
3
+ import { buildPromptRenderLines } from '../cli/chat/components/PromptInput.js';
3
4
  describe('prompt input related helpers', () => {
4
5
  it('places the inserted mention at the end of the current trailing mention token', () => {
5
6
  const nextDraft = insertMentionSelection('take a look at @REA', 'README.md');
6
7
  expect(nextDraft).toBe('take a look at @README.md');
7
8
  expect(nextDraft.length).toBe('take a look at @README.md'.length);
8
9
  });
10
+ it('renders the cursor at the end of the line after the last typed character', () => {
11
+ expect(buildPromptRenderLines('asdf', 4, 8, 80)).toEqual([
12
+ {
13
+ before: 'asdf',
14
+ cursor: ' ',
15
+ after: '',
16
+ hasCursor: true,
17
+ },
18
+ ]);
19
+ });
20
+ it('renders the cursor at the current insertion point within a line', () => {
21
+ expect(buildPromptRenderLines('asdf', 2, 8, 80)).toEqual([
22
+ {
23
+ before: 'as',
24
+ cursor: 'd',
25
+ after: 'f',
26
+ hasCursor: true,
27
+ },
28
+ ]);
29
+ });
30
+ it('places a wrapped-line boundary cursor at the start of the next visual segment', () => {
31
+ expect(buildPromptRenderLines('abcd', 2, 8, 2)).toEqual([
32
+ {
33
+ before: 'ab',
34
+ cursor: '',
35
+ after: '',
36
+ hasCursor: false,
37
+ },
38
+ {
39
+ before: '',
40
+ cursor: 'c',
41
+ after: 'd',
42
+ hasCursor: true,
43
+ },
44
+ ]);
45
+ });
46
+ it('renders an empty line cursor as a highlighted blank cell', () => {
47
+ expect(buildPromptRenderLines('', 0, 8, 80)).toEqual([
48
+ {
49
+ before: '',
50
+ cursor: ' ',
51
+ after: '',
52
+ hasCursor: true,
53
+ },
54
+ ]);
55
+ });
9
56
  });
10
57
  //# sourceMappingURL=prompt-input.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-input.test.js","sourceRoot":"","sources":["../../../src/__tests__/prompt-input.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,SAAS,GAAG,sBAAsB,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;QAC7E,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"prompt-input.test.js","sourceRoot":"","sources":["../../../src/__tests__/prompt-input.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,SAAS,GAAG,sBAAsB,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;QAC7E,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD;gBACE,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD;gBACE,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACtD;gBACE,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,KAAK;aACjB;YACD;gBACE,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD;gBACE,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -21,6 +21,9 @@ describe('buildSystemPrompt', () => {
21
21
  expect(prompt).toContain('prefer carrying the task through implementation and verification instead of stopping at analysis or a plan unless you are blocked');
22
22
  expect(prompt).toContain('If the user asks to improve tests or coverage');
23
23
  expect(prompt).toContain('Prefer the first-class file editing tool for creating or changing file contents');
24
+ expect(prompt).toContain('## Knowledge Persistence');
25
+ expect(prompt).toContain('Maintain useful memory proactively');
26
+ expect(prompt).toContain('Memory writes do not require user approval');
24
27
  expect(prompt).toContain('If a shell command is arbitrary, uses inline scripts, needs redirects/heredocs, or inspect rejects it, switch to run_shell_mutate');
25
28
  expect(prompt).toContain('do not stop at "inspect is blocked."');
26
29
  expect(prompt).toContain('Do not ask unnecessary questions when the answer can be discovered from the workspace');
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../../src/__tests__/prompts.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../../src/__tests__/prompts.test.ts"],"names":[],"mappings":"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"}