shennian 0.1.34 → 0.1.35

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 (55) hide show
  1. package/dist/src/__tests__/codex-adapter.test.js +22 -0
  2. package/dist/src/__tests__/codex-adapter.test.js.map +1 -1
  3. package/dist/src/__tests__/model-discovery.test.d.ts +2 -0
  4. package/dist/src/__tests__/model-discovery.test.d.ts.map +1 -0
  5. package/dist/src/__tests__/model-discovery.test.js +47 -0
  6. package/dist/src/__tests__/model-discovery.test.js.map +1 -0
  7. package/dist/src/__tests__/native-fusion-parsers.test.d.ts +2 -0
  8. package/dist/src/__tests__/native-fusion-parsers.test.d.ts.map +1 -0
  9. package/dist/src/__tests__/native-fusion-parsers.test.js +216 -0
  10. package/dist/src/__tests__/native-fusion-parsers.test.js.map +1 -0
  11. package/dist/src/__tests__/native-fusion-service.test.d.ts +2 -0
  12. package/dist/src/__tests__/native-fusion-service.test.d.ts.map +1 -0
  13. package/dist/src/__tests__/native-fusion-service.test.js +157 -0
  14. package/dist/src/__tests__/native-fusion-service.test.js.map +1 -0
  15. package/dist/src/__tests__/session-manager.test.js +26 -0
  16. package/dist/src/__tests__/session-manager.test.js.map +1 -1
  17. package/dist/src/agents/codex.d.ts.map +1 -1
  18. package/dist/src/agents/codex.js +23 -9
  19. package/dist/src/agents/codex.js.map +1 -1
  20. package/dist/src/agents/model-registry/discovery.d.ts.map +1 -1
  21. package/dist/src/agents/model-registry/discovery.js +16 -3
  22. package/dist/src/agents/model-registry/discovery.js.map +1 -1
  23. package/dist/src/index.js +6 -1
  24. package/dist/src/index.js.map +1 -1
  25. package/dist/src/native-fusion/parsers.d.ts +13 -0
  26. package/dist/src/native-fusion/parsers.d.ts.map +1 -0
  27. package/dist/src/native-fusion/parsers.js +324 -0
  28. package/dist/src/native-fusion/parsers.js.map +1 -0
  29. package/dist/src/native-fusion/service.d.ts +26 -0
  30. package/dist/src/native-fusion/service.d.ts.map +1 -0
  31. package/dist/src/native-fusion/service.js +170 -0
  32. package/dist/src/native-fusion/service.js.map +1 -0
  33. package/dist/src/native-fusion/state.d.ts +4 -0
  34. package/dist/src/native-fusion/state.d.ts.map +1 -0
  35. package/dist/src/native-fusion/state.js +23 -0
  36. package/dist/src/native-fusion/state.js.map +1 -0
  37. package/dist/src/native-fusion/types.d.ts +25 -0
  38. package/dist/src/native-fusion/types.d.ts.map +1 -0
  39. package/dist/src/native-fusion/types.js +2 -0
  40. package/dist/src/native-fusion/types.js.map +1 -0
  41. package/dist/src/session/handlers/chat.d.ts.map +1 -1
  42. package/dist/src/session/handlers/chat.js +22 -2
  43. package/dist/src/session/handlers/chat.js.map +1 -1
  44. package/dist/src/session/handlers/queue.d.ts +4 -0
  45. package/dist/src/session/handlers/queue.d.ts.map +1 -0
  46. package/dist/src/session/handlers/queue.js +66 -0
  47. package/dist/src/session/handlers/queue.js.map +1 -0
  48. package/dist/src/session/manager.d.ts +3 -1
  49. package/dist/src/session/manager.d.ts.map +1 -1
  50. package/dist/src/session/manager.js +4 -1
  51. package/dist/src/session/manager.js.map +1 -1
  52. package/dist/src/session/types.d.ts +2 -0
  53. package/dist/src/session/types.d.ts.map +1 -1
  54. package/dist/tsconfig.tsbuildinfo +1 -1
  55. package/package.json +1 -1
@@ -108,6 +108,28 @@ describe('CodexAdapter', () => {
108
108
  }),
109
109
  ]);
110
110
  });
111
+ it('strips git directives from completed agent messages', () => {
112
+ const { internal, events } = createHarness();
113
+ internal.handleStreamEvent({
114
+ type: 'item.completed',
115
+ item: {
116
+ type: 'agent_message',
117
+ text: [
118
+ '已提交并推送到 origin/main。',
119
+ '',
120
+ '::git-stage{cwd="/Users/lichen/Documents/code/projects/shennian"}',
121
+ '::git-commit{cwd="/Users/lichen/Documents/code/projects/shennian"}',
122
+ '::git-push{cwd="/Users/lichen/Documents/code/projects/shennian" branch="main"}',
123
+ ].join('\n'),
124
+ },
125
+ });
126
+ expect(events.filter((event) => event.state === 'delta')).toEqual([
127
+ expect.objectContaining({
128
+ state: 'delta',
129
+ text: '已提交并推送到 origin/main。',
130
+ }),
131
+ ]);
132
+ });
111
133
  it('emits final on turn.completed with usage and agent session id', () => {
112
134
  const { internal, events } = createHarness();
113
135
  internal.agentSessionId = 'thread-123';
@@ -1 +1 @@
1
- {"version":3,"file":"codex-adapter.test.js","sourceRoot":"","sources":["../../../src/__tests__/codex-adapter.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-adapter.test.js","sourceRoot":"","sources":["../../../src/__tests__/codex-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-discovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-discovery.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/model-discovery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Claude model discovery compatibility fallbacks.
3
+ * @covers src/agents/model-registry/discovery.ts
4
+ */
5
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
6
+ const mockResolveBuiltinCommand = vi.hoisted(() => vi.fn());
7
+ const mockRunPtyCommand = vi.hoisted(() => vi.fn());
8
+ vi.mock('../agents/command-spec.js', () => ({
9
+ resolveBuiltinCommand: mockResolveBuiltinCommand,
10
+ }));
11
+ vi.mock('../agents/model-registry/runner.js', () => ({
12
+ runCommand: vi.fn(),
13
+ runPtyCommand: mockRunPtyCommand,
14
+ }));
15
+ import { discoverModelsForAgent } from '../agents/model-registry/discovery.js';
16
+ describe('discoverClaudeModels', () => {
17
+ beforeEach(() => {
18
+ vi.clearAllMocks();
19
+ mockResolveBuiltinCommand.mockReturnValue({ command: 'claude', args: [], display: 'claude' });
20
+ });
21
+ it('retries without --bare when Claude rejects that startup flag', async () => {
22
+ mockRunPtyCommand
23
+ .mockResolvedValueOnce("error: unknown option '--bare'")
24
+ .mockResolvedValueOnce(`
25
+ 1.Default(recommended)Use the default model (currently Sonnet 4.6)
26
+ 2.Sonnet Sonnet 4.6
27
+ 3.Opus Opus 4.6
28
+ 4.Haiku Haiku 4.5
29
+ `);
30
+ const models = await discoverModelsForAgent({ type: 'claude', command: 'claude', args: [], version: '2.1.72' }, {});
31
+ expect(mockRunPtyCommand).toHaveBeenCalledTimes(2);
32
+ expect(mockRunPtyCommand).toHaveBeenNthCalledWith(1, { command: 'claude', args: [], display: 'claude' }, expect.objectContaining({
33
+ startupArgs: ['--bare', '--dangerously-skip-permissions'],
34
+ }));
35
+ expect(mockRunPtyCommand).toHaveBeenNthCalledWith(2, { command: 'claude', args: [], display: 'claude' }, expect.objectContaining({
36
+ startupArgs: ['--dangerously-skip-permissions'],
37
+ }));
38
+ expect(models.map((model) => model.id).sort()).toEqual(['default', 'haiku', 'opus', 'sonnet']);
39
+ });
40
+ it('does not retry when discovery simply returns no models without a bare-flag error', async () => {
41
+ mockRunPtyCommand.mockResolvedValueOnce('');
42
+ const models = await discoverModelsForAgent({ type: 'claude', command: 'claude', args: [], version: '2.1.72' }, {});
43
+ expect(mockRunPtyCommand).toHaveBeenCalledTimes(1);
44
+ expect(models).toEqual([]);
45
+ });
46
+ });
47
+ //# sourceMappingURL=model-discovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-discovery.test.js","sourceRoot":"","sources":["../../../src/__tests__/model-discovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=native-fusion-parsers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-fusion-parsers.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/native-fusion-parsers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,216 @@
1
+ // @covers packages/cli/src/native-fusion/parsers.ts
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { afterEach, describe, expect, it, vi } from 'vitest';
6
+ import { lookupClaudeTranscriptCwd, parseClaudeTranscriptChunk, parseCodexRolloutChunk, } from '../native-fusion/parsers.js';
7
+ const tempDirs = [];
8
+ function writeTempFile(name, content) {
9
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'native-fusion-test-'));
10
+ tempDirs.push(dir);
11
+ const filePath = path.join(dir, name);
12
+ fs.writeFileSync(filePath, content);
13
+ return filePath;
14
+ }
15
+ describe('native-fusion parsers', () => {
16
+ afterEach(() => {
17
+ for (const dir of tempDirs.splice(0)) {
18
+ fs.rmSync(dir, { recursive: true, force: true });
19
+ }
20
+ });
21
+ it('parses codex rollout user and agent messages', () => {
22
+ const filePath = writeTempFile('rollout.jsonl', [
23
+ JSON.stringify({
24
+ timestamp: '2026-04-23T10:00:00.000Z',
25
+ type: 'session_meta',
26
+ payload: { id: 'thread-1', cwd: '/tmp/demo', model_provider: 'openai' },
27
+ }),
28
+ JSON.stringify({
29
+ timestamp: '2026-04-23T10:00:01.000Z',
30
+ type: 'event_msg',
31
+ payload: { type: 'user_message', message: 'hello codex' },
32
+ }),
33
+ JSON.stringify({
34
+ timestamp: '2026-04-23T10:00:02.000Z',
35
+ type: 'event_msg',
36
+ payload: { type: 'agent_message', message: 'hello human' },
37
+ }),
38
+ '',
39
+ ].join('\n'));
40
+ const parsed = parseCodexRolloutChunk(filePath, 0);
41
+ expect(parsed.events).toHaveLength(2);
42
+ expect(parsed.events[0]).toMatchObject({
43
+ agentType: 'codex',
44
+ sourceSessionKey: 'thread-1',
45
+ role: 'user',
46
+ payload: 'hello codex',
47
+ workDir: '/tmp/demo',
48
+ });
49
+ expect(parsed.events[1]).toMatchObject({
50
+ role: 'agent',
51
+ payload: 'hello human',
52
+ });
53
+ });
54
+ it('parses appended codex agent messages after the initial chunk', () => {
55
+ const filePath = writeTempFile('rollout.jsonl', [
56
+ JSON.stringify({
57
+ timestamp: '2026-04-23T10:00:00.000Z',
58
+ type: 'session_meta',
59
+ payload: { id: 'thread-append-1', cwd: '/tmp/demo', model_provider: 'OpenAI' },
60
+ }),
61
+ JSON.stringify({
62
+ timestamp: '2026-04-23T10:00:01.000Z',
63
+ type: 'event_msg',
64
+ payload: { type: 'user_message', message: 'hello once' },
65
+ }),
66
+ '',
67
+ ].join('\n'));
68
+ const first = parseCodexRolloutChunk(filePath, 0);
69
+ expect(first.events).toHaveLength(1);
70
+ expect(first.events[0]).toMatchObject({
71
+ sourceSessionKey: 'thread-append-1',
72
+ role: 'user',
73
+ payload: 'hello once',
74
+ });
75
+ fs.appendFileSync(filePath, `${JSON.stringify({
76
+ timestamp: '2026-04-23T10:00:03.000Z',
77
+ type: 'event_msg',
78
+ payload: { type: 'agent_message', message: 'hello twice' },
79
+ })}\n`);
80
+ const second = parseCodexRolloutChunk(filePath, first.nextOffset);
81
+ expect(second.events).toHaveLength(1);
82
+ expect(second.events[0]).toMatchObject({
83
+ sourceSessionKey: 'thread-append-1',
84
+ role: 'agent',
85
+ payload: 'hello twice',
86
+ modelId: 'OpenAI',
87
+ workDir: '/tmp/demo',
88
+ });
89
+ });
90
+ it('parses appended codex agent messages when session_meta exceeds 8KB', () => {
91
+ const hugeInstructions = 'x'.repeat(12 * 1024);
92
+ const filePath = writeTempFile('rollout-long-meta.jsonl', [
93
+ JSON.stringify({
94
+ timestamp: '2026-04-23T10:00:00.000Z',
95
+ type: 'session_meta',
96
+ payload: {
97
+ id: 'thread-long-meta-1',
98
+ cwd: '/tmp/demo',
99
+ model_provider: 'OpenAI',
100
+ base_instructions: { text: hugeInstructions },
101
+ },
102
+ }),
103
+ JSON.stringify({
104
+ timestamp: '2026-04-23T10:00:01.000Z',
105
+ type: 'event_msg',
106
+ payload: { type: 'user_message', message: 'hello long meta' },
107
+ }),
108
+ '',
109
+ ].join('\n'));
110
+ const first = parseCodexRolloutChunk(filePath, 0);
111
+ expect(first.events).toHaveLength(1);
112
+ fs.appendFileSync(filePath, `${JSON.stringify({
113
+ timestamp: '2026-04-23T10:00:03.000Z',
114
+ type: 'event_msg',
115
+ payload: { type: 'agent_message', message: 'reply after long meta' },
116
+ })}\n`);
117
+ const second = parseCodexRolloutChunk(filePath, first.nextOffset);
118
+ expect(second.events).toHaveLength(1);
119
+ expect(second.events[0]).toMatchObject({
120
+ sourceSessionKey: 'thread-long-meta-1',
121
+ role: 'agent',
122
+ payload: 'reply after long meta',
123
+ modelId: 'OpenAI',
124
+ workDir: '/tmp/demo',
125
+ });
126
+ });
127
+ it('strips git directives from codex rollout agent messages', () => {
128
+ const filePath = writeTempFile('rollout-git.jsonl', [
129
+ JSON.stringify({
130
+ timestamp: '2026-04-23T10:00:00.000Z',
131
+ type: 'session_meta',
132
+ payload: { id: 'thread-git-1', cwd: '/tmp/demo', model_provider: 'OpenAI' },
133
+ }),
134
+ JSON.stringify({
135
+ timestamp: '2026-04-23T10:00:02.000Z',
136
+ type: 'event_msg',
137
+ payload: {
138
+ type: 'agent_message',
139
+ message: [
140
+ '修复完成。',
141
+ '',
142
+ '::git-stage{cwd="/Users/lichen/Documents/code/projects/shennian"}',
143
+ '::git-commit{cwd="/Users/lichen/Documents/code/projects/shennian"}',
144
+ ].join('\n'),
145
+ },
146
+ }),
147
+ '',
148
+ ].join('\n'));
149
+ const parsed = parseCodexRolloutChunk(filePath, 0);
150
+ expect(parsed.events).toHaveLength(1);
151
+ expect(parsed.events[0]).toMatchObject({
152
+ role: 'agent',
153
+ payload: '修复完成。',
154
+ });
155
+ });
156
+ it('parses claude transcript user and assistant messages', () => {
157
+ const filePath = writeTempFile('claude.jsonl', [
158
+ JSON.stringify({
159
+ type: 'user',
160
+ timestamp: '2026-04-23T10:00:01.000Z',
161
+ cwd: '/Users/lichen/Documents/code/projects/shennian',
162
+ message: { role: 'user', content: 'hello claude' },
163
+ }),
164
+ JSON.stringify({
165
+ type: 'assistant',
166
+ timestamp: '2026-04-23T10:00:02.000Z',
167
+ cwd: '/Users/lichen/Documents/code/projects/shennian',
168
+ message: {
169
+ model: 'claude-sonnet-4-6',
170
+ content: [{ type: 'text', text: 'hello back' }],
171
+ },
172
+ }),
173
+ '',
174
+ ].join('\n'));
175
+ const parsed = parseClaudeTranscriptChunk(filePath, 0);
176
+ expect(parsed.events).toHaveLength(2);
177
+ expect(parsed.events[0]).toMatchObject({
178
+ agentType: 'claude',
179
+ role: 'user',
180
+ payload: 'hello claude',
181
+ workDir: '/Users/lichen/Documents/code/projects/shennian',
182
+ });
183
+ expect(parsed.events[1]).toMatchObject({
184
+ role: 'agent',
185
+ payload: 'hello back',
186
+ modelId: 'claude-sonnet-4-6',
187
+ workDir: '/Users/lichen/Documents/code/projects/shennian',
188
+ });
189
+ });
190
+ it('looks up claude cwd by transcript session id', () => {
191
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-projects-'));
192
+ tempDirs.push(root);
193
+ const home = fs.mkdtempSync(path.join(os.tmpdir(), 'home-'));
194
+ tempDirs.push(home);
195
+ const transcriptDir = path.join(home, '.claude', 'projects', '-Users-lichen-Documents-code-projects-shennian');
196
+ fs.mkdirSync(transcriptDir, { recursive: true });
197
+ const filePath = path.join(transcriptDir, 'sid-claude-1.jsonl');
198
+ fs.writeFileSync(filePath, [
199
+ JSON.stringify({
200
+ type: 'user',
201
+ timestamp: '2026-04-23T10:00:01.000Z',
202
+ cwd: '/Users/lichen/Documents/code/projects/shennian',
203
+ message: { role: 'user', content: 'hello' },
204
+ }),
205
+ '',
206
+ ].join('\n'));
207
+ const homedirSpy = vi.spyOn(os, 'homedir').mockReturnValue(home);
208
+ try {
209
+ expect(lookupClaudeTranscriptCwd('sid-claude-1')).toBe('/Users/lichen/Documents/code/projects/shennian');
210
+ }
211
+ finally {
212
+ homedirSpy.mockRestore();
213
+ }
214
+ });
215
+ });
216
+ //# sourceMappingURL=native-fusion-parsers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-fusion-parsers.test.js","sourceRoot":"","sources":["../../../src/__tests__/native-fusion-parsers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=native-fusion-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-fusion-service.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/native-fusion-service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,157 @@
1
+ // @covers src/native-fusion/service.ts
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
+ const { mockLoadState, mockSaveState, mockListClaudeFiles, mockListCodexFiles, mockParseClaudeChunk } = vi.hoisted(() => ({
7
+ mockLoadState: vi.fn(),
8
+ mockSaveState: vi.fn(),
9
+ mockListClaudeFiles: vi.fn(),
10
+ mockListCodexFiles: vi.fn(),
11
+ mockParseClaudeChunk: vi.fn(),
12
+ }));
13
+ vi.mock('../native-fusion/state.js', () => ({
14
+ loadNativeScannerState: mockLoadState,
15
+ saveNativeScannerState: mockSaveState,
16
+ }));
17
+ vi.mock('../native-fusion/parsers.js', () => ({
18
+ listClaudeTranscriptFiles: mockListClaudeFiles,
19
+ listCodexRolloutFiles: mockListCodexFiles,
20
+ parseClaudeTranscriptChunk: mockParseClaudeChunk,
21
+ parseCodexRolloutChunk: vi.fn(),
22
+ }));
23
+ import { NativeSessionFusionService } from '../native-fusion/service.js';
24
+ function createClient() {
25
+ return {
26
+ getState: vi.fn(() => 'connected'),
27
+ sendBufferedEvent: vi.fn(async () => { }),
28
+ };
29
+ }
30
+ function createTranscriptFile() {
31
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'native-fusion-'));
32
+ const filePath = path.join(dir, 'claude-session.jsonl');
33
+ fs.writeFileSync(filePath, '');
34
+ return filePath;
35
+ }
36
+ describe('NativeSessionFusionService', () => {
37
+ beforeEach(() => {
38
+ vi.clearAllMocks();
39
+ mockLoadState.mockReturnValue({ files: {} });
40
+ mockListCodexFiles.mockReturnValue([]);
41
+ });
42
+ it('does not claim a native claude user message before sourceSessionKey is known', async () => {
43
+ const now = Date.parse('2026-04-23T13:09:17.785Z');
44
+ vi.setSystemTime(now);
45
+ const client = createClient();
46
+ const service = new NativeSessionFusionService(client);
47
+ const filePath = createTranscriptFile();
48
+ mockListClaudeFiles.mockReturnValue([filePath]);
49
+ service.registerManagedSend({
50
+ sessionId: 'sess-1',
51
+ agentType: 'claude',
52
+ canonicalMessageId: 'msg-user-1',
53
+ text: 'hello',
54
+ });
55
+ mockParseClaudeChunk.mockReturnValue({
56
+ nextOffset: 200,
57
+ events: [
58
+ {
59
+ agentType: 'claude',
60
+ sourceMode: 'claude_transcript_import',
61
+ sourceSessionKey: 'claude-native-1',
62
+ sourceEventKey: 'evt-user',
63
+ cursor: `${filePath}:1`,
64
+ role: 'user',
65
+ ts: now,
66
+ payload: 'hello',
67
+ title: 'hello',
68
+ workDir: 'Users/lichen/Documents/code/projects/shennian',
69
+ },
70
+ {
71
+ agentType: 'claude',
72
+ sourceMode: 'claude_transcript_import',
73
+ sourceSessionKey: 'claude-native-1',
74
+ sourceEventKey: 'evt-assistant',
75
+ cursor: `${filePath}:2`,
76
+ role: 'agent',
77
+ ts: now + 4000,
78
+ payload: 'Hey! What are you working on?',
79
+ title: 'hello',
80
+ modelId: 'claude-sonnet-4-6',
81
+ workDir: 'Users/lichen/Documents/code/projects/shennian',
82
+ },
83
+ ],
84
+ });
85
+ await service.scanNow();
86
+ expect(client.sendBufferedEvent).toHaveBeenCalledTimes(1);
87
+ const firstCall = client.sendBufferedEvent.mock.calls[0];
88
+ const sent = firstCall[0].payload.events;
89
+ expect(sent).toHaveLength(2);
90
+ expect(sent[0]).toMatchObject({
91
+ sourceMode: 'claude_transcript_import',
92
+ role: 'user',
93
+ payload: 'hello',
94
+ });
95
+ expect(sent[1]).toMatchObject({
96
+ sourceMode: 'claude_transcript_import',
97
+ role: 'agent',
98
+ payload: 'Hey! What are you working on?',
99
+ });
100
+ });
101
+ it('claims a managed echo once sourceSessionKey is known and suppresses the immediate assistant echo', async () => {
102
+ const now = Date.parse('2026-04-23T13:09:17.785Z');
103
+ vi.setSystemTime(now);
104
+ const client = createClient();
105
+ const service = new NativeSessionFusionService(client);
106
+ const filePath = createTranscriptFile();
107
+ mockListClaudeFiles.mockReturnValue([filePath]);
108
+ service.registerManagedSend({
109
+ sessionId: 'sess-1',
110
+ agentType: 'claude',
111
+ canonicalMessageId: 'msg-user-1',
112
+ sourceSessionKey: 'claude-native-1',
113
+ text: 'hello',
114
+ });
115
+ mockParseClaudeChunk.mockReturnValue({
116
+ nextOffset: 200,
117
+ events: [
118
+ {
119
+ agentType: 'claude',
120
+ sourceMode: 'claude_transcript_import',
121
+ sourceSessionKey: 'claude-native-1',
122
+ sourceEventKey: 'evt-user',
123
+ cursor: `${filePath}:1`,
124
+ role: 'user',
125
+ ts: now,
126
+ payload: 'hello',
127
+ title: 'hello',
128
+ workDir: 'Users/lichen/Documents/code/projects/shennian',
129
+ },
130
+ {
131
+ agentType: 'claude',
132
+ sourceMode: 'claude_transcript_import',
133
+ sourceSessionKey: 'claude-native-1',
134
+ sourceEventKey: 'evt-assistant',
135
+ cursor: `${filePath}:2`,
136
+ role: 'agent',
137
+ ts: now + 4000,
138
+ payload: 'Hey! What are you working on?',
139
+ title: 'hello',
140
+ modelId: 'claude-sonnet-4-6',
141
+ workDir: 'Users/lichen/Documents/code/projects/shennian',
142
+ },
143
+ ],
144
+ });
145
+ await service.scanNow();
146
+ expect(client.sendBufferedEvent).toHaveBeenCalledTimes(1);
147
+ const firstCall = client.sendBufferedEvent.mock.calls[0];
148
+ const sent = firstCall[0].payload.events;
149
+ expect(sent).toHaveLength(1);
150
+ expect(sent[0]).toMatchObject({
151
+ sourceMode: 'managed_echo_claim',
152
+ role: 'user',
153
+ claimCanonicalMessageId: 'msg-user-1',
154
+ });
155
+ });
156
+ });
157
+ //# sourceMappingURL=native-fusion-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-fusion-service.test.js","sourceRoot":"","sources":["../../../src/__tests__/native-fusion-service.test.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,9 @@ const mockAdapter = () => {
25
25
  const { mockCreateAgent } = vi.hoisted(() => ({
26
26
  mockCreateAgent: vi.fn(),
27
27
  }));
28
+ const { mockLookupClaudeTranscriptCwd } = vi.hoisted(() => ({
29
+ mockLookupClaudeTranscriptCwd: vi.fn(),
30
+ }));
28
31
  vi.mock('../agents/adapter.js', async (importOriginal) => {
29
32
  const orig = await importOriginal();
30
33
  return { ...orig, createAgent: mockCreateAgent };
@@ -35,6 +38,9 @@ vi.mock('../agents/gemini.js', () => ({}));
35
38
  vi.mock('../agents/cursor.js', () => ({}));
36
39
  vi.mock('../agents/openclaw.js', () => ({}));
37
40
  vi.mock('../agents/pi.js', () => ({}));
41
+ vi.mock('../native-fusion/parsers.js', () => ({
42
+ lookupClaudeTranscriptCwd: mockLookupClaudeTranscriptCwd,
43
+ }));
38
44
  import { SessionManager } from '../session/manager.js';
39
45
  function createMockClient() {
40
46
  return {
@@ -48,6 +54,7 @@ describe('SessionManager', () => {
48
54
  let manager;
49
55
  beforeEach(() => {
50
56
  vi.clearAllMocks();
57
+ mockLookupClaudeTranscriptCwd.mockReturnValue(null);
51
58
  client = createMockClient();
52
59
  manager = new SessionManager(client);
53
60
  });
@@ -310,6 +317,25 @@ describe('SessionManager', () => {
310
317
  });
311
318
  expect(adapter.send).toHaveBeenCalledWith('hello', 'sonnet');
312
319
  });
320
+ it('repairs claude imported workDir from transcript cwd before starting the adapter', async () => {
321
+ const adapter = mockAdapter();
322
+ mockCreateAgent.mockReturnValue(adapter);
323
+ mockLookupClaudeTranscriptCwd.mockReturnValue('/Users/lichen/Documents/code/projects/shennian');
324
+ await manager.handleReq({
325
+ type: 'req',
326
+ id: 'r1',
327
+ method: 'chat.send',
328
+ params: {
329
+ sessionId: 'sess-imported',
330
+ text: 'continue',
331
+ agentType: 'claude',
332
+ workDir: '-Users-lichen-Documents-code-projects-shennian',
333
+ agentSessionId: 'claude-sid-imported',
334
+ },
335
+ });
336
+ expect(adapter.start).toHaveBeenCalledWith('sess-imported', '/Users/lichen/Documents/code/projects/shennian', 'claude-sid-imported');
337
+ expect(adapter.send).toHaveBeenCalledWith('continue', undefined);
338
+ });
313
339
  });
314
340
  describe('codex resume flow', () => {
315
341
  it('passes agentSessionId to codex adapter via start()', async () => {