@herdctl/core 5.5.0 → 5.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/dist/config/__tests__/merge.test.js +1 -1
  2. package/dist/config/__tests__/merge.test.js.map +1 -1
  3. package/dist/config/index.d.ts +1 -1
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +3 -1
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/schema.d.ts +10 -2
  8. package/dist/config/schema.d.ts.map +1 -1
  9. package/dist/config/schema.js +6 -2
  10. package/dist/config/schema.js.map +1 -1
  11. package/dist/distribution/__tests__/agent-discovery.test.d.ts +7 -0
  12. package/dist/distribution/__tests__/agent-discovery.test.d.ts.map +1 -0
  13. package/dist/distribution/__tests__/agent-discovery.test.js +443 -0
  14. package/dist/distribution/__tests__/agent-discovery.test.js.map +1 -0
  15. package/dist/distribution/__tests__/agent-info.test.d.ts +7 -0
  16. package/dist/distribution/__tests__/agent-info.test.d.ts.map +1 -0
  17. package/dist/distribution/__tests__/agent-info.test.js +568 -0
  18. package/dist/distribution/__tests__/agent-info.test.js.map +1 -0
  19. package/dist/distribution/__tests__/agent-remover.test.d.ts +7 -0
  20. package/dist/distribution/__tests__/agent-remover.test.d.ts.map +1 -0
  21. package/dist/distribution/__tests__/agent-remover.test.js +498 -0
  22. package/dist/distribution/__tests__/agent-remover.test.js.map +1 -0
  23. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts +5 -0
  24. package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts.map +1 -0
  25. package/dist/distribution/__tests__/agent-repo-metadata.test.js +500 -0
  26. package/dist/distribution/__tests__/agent-repo-metadata.test.js.map +1 -0
  27. package/dist/distribution/__tests__/env-scanner.test.d.ts +5 -0
  28. package/dist/distribution/__tests__/env-scanner.test.d.ts.map +1 -0
  29. package/dist/distribution/__tests__/env-scanner.test.js +576 -0
  30. package/dist/distribution/__tests__/env-scanner.test.js.map +1 -0
  31. package/dist/distribution/__tests__/file-installer.test.d.ts +7 -0
  32. package/dist/distribution/__tests__/file-installer.test.d.ts.map +1 -0
  33. package/dist/distribution/__tests__/file-installer.test.js +714 -0
  34. package/dist/distribution/__tests__/file-installer.test.js.map +1 -0
  35. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts +7 -0
  36. package/dist/distribution/__tests__/fleet-config-updater.test.d.ts.map +1 -0
  37. package/dist/distribution/__tests__/fleet-config-updater.test.js +531 -0
  38. package/dist/distribution/__tests__/fleet-config-updater.test.js.map +1 -0
  39. package/dist/distribution/__tests__/installation-metadata.test.d.ts +2 -0
  40. package/dist/distribution/__tests__/installation-metadata.test.d.ts.map +1 -0
  41. package/dist/distribution/__tests__/installation-metadata.test.js +292 -0
  42. package/dist/distribution/__tests__/installation-metadata.test.js.map +1 -0
  43. package/dist/distribution/__tests__/integration.test.d.ts +10 -0
  44. package/dist/distribution/__tests__/integration.test.d.ts.map +1 -0
  45. package/dist/distribution/__tests__/integration.test.js +522 -0
  46. package/dist/distribution/__tests__/integration.test.js.map +1 -0
  47. package/dist/distribution/__tests__/repository-fetcher.test.d.ts +5 -0
  48. package/dist/distribution/__tests__/repository-fetcher.test.d.ts.map +1 -0
  49. package/dist/distribution/__tests__/repository-fetcher.test.js +386 -0
  50. package/dist/distribution/__tests__/repository-fetcher.test.js.map +1 -0
  51. package/dist/distribution/__tests__/repository-validator.test.d.ts +7 -0
  52. package/dist/distribution/__tests__/repository-validator.test.d.ts.map +1 -0
  53. package/dist/distribution/__tests__/repository-validator.test.js +447 -0
  54. package/dist/distribution/__tests__/repository-validator.test.js.map +1 -0
  55. package/dist/distribution/__tests__/source-specifier.test.d.ts +5 -0
  56. package/dist/distribution/__tests__/source-specifier.test.d.ts.map +1 -0
  57. package/dist/distribution/__tests__/source-specifier.test.js +533 -0
  58. package/dist/distribution/__tests__/source-specifier.test.js.map +1 -0
  59. package/dist/distribution/agent-discovery.d.ts +81 -0
  60. package/dist/distribution/agent-discovery.d.ts.map +1 -0
  61. package/dist/distribution/agent-discovery.js +264 -0
  62. package/dist/distribution/agent-discovery.js.map +1 -0
  63. package/dist/distribution/agent-info.d.ts +86 -0
  64. package/dist/distribution/agent-info.d.ts.map +1 -0
  65. package/dist/distribution/agent-info.js +225 -0
  66. package/dist/distribution/agent-info.js.map +1 -0
  67. package/dist/distribution/agent-remover.d.ts +83 -0
  68. package/dist/distribution/agent-remover.d.ts.map +1 -0
  69. package/dist/distribution/agent-remover.js +222 -0
  70. package/dist/distribution/agent-remover.js.map +1 -0
  71. package/dist/distribution/agent-repo-metadata.d.ts +181 -0
  72. package/dist/distribution/agent-repo-metadata.d.ts.map +1 -0
  73. package/dist/distribution/agent-repo-metadata.js +143 -0
  74. package/dist/distribution/agent-repo-metadata.js.map +1 -0
  75. package/dist/distribution/env-scanner.d.ts +78 -0
  76. package/dist/distribution/env-scanner.d.ts.map +1 -0
  77. package/dist/distribution/env-scanner.js +144 -0
  78. package/dist/distribution/env-scanner.js.map +1 -0
  79. package/dist/distribution/file-installer.d.ts +80 -0
  80. package/dist/distribution/file-installer.d.ts.map +1 -0
  81. package/dist/distribution/file-installer.js +268 -0
  82. package/dist/distribution/file-installer.js.map +1 -0
  83. package/dist/distribution/fleet-config-updater.d.ts +96 -0
  84. package/dist/distribution/fleet-config-updater.d.ts.map +1 -0
  85. package/dist/distribution/fleet-config-updater.js +266 -0
  86. package/dist/distribution/fleet-config-updater.js.map +1 -0
  87. package/dist/distribution/index.d.ts +23 -0
  88. package/dist/distribution/index.d.ts.map +1 -0
  89. package/dist/distribution/index.js +42 -0
  90. package/dist/distribution/index.js.map +1 -0
  91. package/dist/distribution/installation-metadata.d.ts +191 -0
  92. package/dist/distribution/installation-metadata.d.ts.map +1 -0
  93. package/dist/distribution/installation-metadata.js +100 -0
  94. package/dist/distribution/installation-metadata.js.map +1 -0
  95. package/dist/distribution/repository-fetcher.d.ts +104 -0
  96. package/dist/distribution/repository-fetcher.d.ts.map +1 -0
  97. package/dist/distribution/repository-fetcher.js +246 -0
  98. package/dist/distribution/repository-fetcher.js.map +1 -0
  99. package/dist/distribution/repository-validator.d.ts +86 -0
  100. package/dist/distribution/repository-validator.d.ts.map +1 -0
  101. package/dist/distribution/repository-validator.js +296 -0
  102. package/dist/distribution/repository-validator.js.map +1 -0
  103. package/dist/distribution/source-specifier.d.ts +106 -0
  104. package/dist/distribution/source-specifier.d.ts.map +1 -0
  105. package/dist/distribution/source-specifier.js +247 -0
  106. package/dist/distribution/source-specifier.js.map +1 -0
  107. package/dist/fleet-manager/errors.d.ts +15 -0
  108. package/dist/fleet-manager/errors.d.ts.map +1 -1
  109. package/dist/fleet-manager/errors.js +16 -0
  110. package/dist/fleet-manager/errors.js.map +1 -1
  111. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  112. package/dist/fleet-manager/fleet-manager.js +31 -9
  113. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  114. package/dist/index.d.ts +1 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/runner/message-processor.d.ts.map +1 -1
  119. package/dist/runner/message-processor.js +7 -2
  120. package/dist/runner/message-processor.js.map +1 -1
  121. package/dist/runner/runtime/container-manager.js +1 -1
  122. package/dist/runner/runtime/container-manager.js.map +1 -1
  123. package/dist/scheduler/errors.d.ts +15 -0
  124. package/dist/scheduler/errors.d.ts.map +1 -1
  125. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  126. package/dist/scheduler/schedule-runner.js +6 -5
  127. package/dist/scheduler/schedule-runner.js.map +1 -1
  128. package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
  129. package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
  130. package/dist/state/__tests__/jsonl-parser.test.js +307 -0
  131. package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
  132. package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
  133. package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
  134. package/dist/state/__tests__/session-attribution.test.js +567 -0
  135. package/dist/state/__tests__/session-attribution.test.js.map +1 -0
  136. package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
  137. package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
  138. package/dist/state/__tests__/session-discovery.test.js +941 -0
  139. package/dist/state/__tests__/session-discovery.test.js.map +1 -0
  140. package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
  141. package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
  142. package/dist/state/__tests__/session-metadata.test.js +422 -0
  143. package/dist/state/__tests__/session-metadata.test.js.map +1 -0
  144. package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
  145. package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
  146. package/dist/state/__tests__/tool-parsing.test.js +315 -0
  147. package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
  148. package/dist/state/index.d.ts +5 -0
  149. package/dist/state/index.d.ts.map +1 -1
  150. package/dist/state/index.js +10 -0
  151. package/dist/state/index.js.map +1 -1
  152. package/dist/state/jsonl-parser.d.ts +115 -0
  153. package/dist/state/jsonl-parser.d.ts.map +1 -0
  154. package/dist/state/jsonl-parser.js +437 -0
  155. package/dist/state/jsonl-parser.js.map +1 -0
  156. package/dist/state/session-attribution.d.ts +35 -0
  157. package/dist/state/session-attribution.d.ts.map +1 -0
  158. package/dist/state/session-attribution.js +179 -0
  159. package/dist/state/session-attribution.js.map +1 -0
  160. package/dist/state/session-discovery.d.ts +188 -0
  161. package/dist/state/session-discovery.d.ts.map +1 -0
  162. package/dist/state/session-discovery.js +513 -0
  163. package/dist/state/session-discovery.js.map +1 -0
  164. package/dist/state/session-metadata.d.ts +186 -0
  165. package/dist/state/session-metadata.d.ts.map +1 -0
  166. package/dist/state/session-metadata.js +297 -0
  167. package/dist/state/session-metadata.js.map +1 -0
  168. package/dist/state/tool-parsing.d.ts +88 -0
  169. package/dist/state/tool-parsing.d.ts.map +1 -0
  170. package/dist/state/tool-parsing.js +199 -0
  171. package/dist/state/tool-parsing.js.map +1 -0
  172. package/package.json +1 -1
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Tests for JSONL session file parser
3
+ */
4
+ import { join } from "node:path";
5
+ import { describe, expect, it } from "vitest";
6
+ import { extractLastSummary, extractSessionMetadata, extractSessionUsage, isSidechainSession, parseSessionMessages, } from "../jsonl-parser.js";
7
+ const fixturesDir = join(import.meta.dirname, "fixtures");
8
+ const fixture = (name) => join(fixturesDir, name);
9
+ // =============================================================================
10
+ // parseSessionMessages
11
+ // =============================================================================
12
+ describe("parseSessionMessages", () => {
13
+ it("parses simple-session.jsonl into correct ChatMessages", async () => {
14
+ const messages = await parseSessionMessages(fixture("simple-session.jsonl"));
15
+ // 2 user + 2 assistant = 4 messages
16
+ expect(messages).toHaveLength(4);
17
+ // All roles are user or assistant (no tool calls in this fixture)
18
+ for (const msg of messages) {
19
+ expect(["user", "assistant"]).toContain(msg.role);
20
+ }
21
+ // All messages have non-empty content
22
+ for (const msg of messages) {
23
+ expect(msg.content.length).toBeGreaterThan(0);
24
+ }
25
+ // All timestamps are ISO strings
26
+ for (const msg of messages) {
27
+ expect(new Date(msg.timestamp).toISOString()).toBe(msg.timestamp);
28
+ }
29
+ // Verify ordering: user, assistant, user, assistant
30
+ expect(messages[0].role).toBe("user");
31
+ expect(messages[0].content).toBe("What is TypeScript?");
32
+ expect(messages[1].role).toBe("assistant");
33
+ expect(messages[1].content).toContain("TypeScript is a strongly typed");
34
+ expect(messages[2].role).toBe("user");
35
+ expect(messages[2].content).toBe("How do I install it?");
36
+ expect(messages[3].role).toBe("assistant");
37
+ expect(messages[3].content).toContain("npm install -g typescript");
38
+ });
39
+ it("parses tool-calls-session.jsonl with correct tool metadata", async () => {
40
+ const messages = await parseSessionMessages(fixture("tool-calls-session.jsonl"));
41
+ // 1 user + 1 assistant (text) + 1 tool (Read result) + 1 assistant = 4
42
+ expect(messages).toHaveLength(4);
43
+ expect(messages[0].role).toBe("user");
44
+ expect(messages[1].role).toBe("assistant");
45
+ expect(messages[1].content).toBe("Let me read that file for you.");
46
+ // Tool message
47
+ const toolMsg = messages[2];
48
+ expect(toolMsg.role).toBe("tool");
49
+ expect(toolMsg.toolCall).toBeDefined();
50
+ expect(toolMsg.toolCall.toolName).toBe("Read");
51
+ expect(toolMsg.toolCall.isError).toBe(false);
52
+ expect(toolMsg.toolCall.output).toContain("import express from 'express'");
53
+ expect(toolMsg.toolCall.inputSummary).toBe("/src/index.ts");
54
+ // Final assistant message
55
+ expect(messages[3].role).toBe("assistant");
56
+ expect(messages[3].content).toContain("entry point for an Express.js web server");
57
+ });
58
+ it("parses multi-tool-session.jsonl with multiple tool messages from one assistant response", async () => {
59
+ const messages = await parseSessionMessages(fixture("multi-tool-session.jsonl"));
60
+ // 1 user + 1 assistant (text) + 1 tool (Bash) + 1 tool (Read) + 1 assistant = 5
61
+ expect(messages).toHaveLength(5);
62
+ expect(messages[0].role).toBe("user");
63
+ expect(messages[1].role).toBe("assistant");
64
+ // First tool: Bash
65
+ const bashTool = messages[2];
66
+ expect(bashTool.role).toBe("tool");
67
+ expect(bashTool.toolCall.toolName).toBe("Bash");
68
+ expect(bashTool.toolCall.isError).toBe(false);
69
+ expect(bashTool.toolCall.output).toContain("On branch main");
70
+ expect(bashTool.toolCall.inputSummary).toBe("git status");
71
+ // Second tool: Read
72
+ const readTool = messages[3];
73
+ expect(readTool.role).toBe("tool");
74
+ expect(readTool.toolCall.toolName).toBe("Read");
75
+ expect(readTool.toolCall.isError).toBe(false);
76
+ expect(readTool.toolCall.output).toContain("my-project");
77
+ expect(readTool.toolCall.inputSummary).toBe("/workspace/package.json");
78
+ // Final assistant text
79
+ expect(messages[4].role).toBe("assistant");
80
+ });
81
+ it("parses content-blocks-session.jsonl with mixed text and tool_use blocks", async () => {
82
+ const messages = await parseSessionMessages(fixture("content-blocks-session.jsonl"));
83
+ // 1 user + 1 assistant (combined text) + 1 tool (Read) + 1 tool (Bash) + 1 assistant = 5
84
+ expect(messages).toHaveLength(5);
85
+ expect(messages[0].role).toBe("user");
86
+ // Assistant message should contain combined text from both text blocks
87
+ expect(messages[1].role).toBe("assistant");
88
+ expect(messages[1].content).toContain("Let me check both for you.");
89
+ expect(messages[1].content).toContain("I'll also check the current directory.");
90
+ // Tool results
91
+ const readTool = messages[2];
92
+ expect(readTool.role).toBe("tool");
93
+ expect(readTool.toolCall.toolName).toBe("Read");
94
+ expect(readTool.toolCall.output).toContain("port");
95
+ const bashTool = messages[3];
96
+ expect(bashTool.role).toBe("tool");
97
+ expect(bashTool.toolCall.toolName).toBe("Bash");
98
+ expect(bashTool.toolCall.output).toBe("/workspace");
99
+ expect(messages[4].role).toBe("assistant");
100
+ });
101
+ it("parses sdk-agent-session.jsonl the same way as regular sessions", async () => {
102
+ const messages = await parseSessionMessages(fixture("sdk-agent-session.jsonl"));
103
+ // 1 user + 1 assistant + 1 tool (Bash) + 1 assistant + 1 tool (Write) + 1 assistant = 6
104
+ expect(messages).toHaveLength(6);
105
+ expect(messages[0].role).toBe("user");
106
+ expect(messages[0].content).toContain("login form component");
107
+ expect(messages[1].role).toBe("assistant");
108
+ expect(messages[2].role).toBe("tool");
109
+ expect(messages[2].toolCall.toolName).toBe("Bash");
110
+ expect(messages[2].toolCall.inputSummary).toBe("ls src/components/");
111
+ expect(messages[3].role).toBe("assistant");
112
+ expect(messages[4].role).toBe("tool");
113
+ expect(messages[4].toolCall.toolName).toBe("Write");
114
+ expect(messages[4].toolCall.inputSummary).toBe("/workspace/project/src/components/LoginForm.tsx");
115
+ expect(messages[5].role).toBe("assistant");
116
+ expect(messages[5].content).toContain("LoginForm");
117
+ });
118
+ it("skips summary lines in summary-session.jsonl", async () => {
119
+ const messages = await parseSessionMessages(fixture("summary-session.jsonl"));
120
+ // 2 summary lines are skipped, 2 user + 2 assistant = 4
121
+ expect(messages).toHaveLength(4);
122
+ // All messages should be user or assistant, no summaries leaking through
123
+ for (const msg of messages) {
124
+ expect(["user", "assistant"]).toContain(msg.role);
125
+ }
126
+ // First message should be the first actual user message, not summary text
127
+ expect(messages[0].role).toBe("user");
128
+ expect(messages[0].content).toBe("Now let's add a health check endpoint.");
129
+ });
130
+ it("handles malformed-session.jsonl without throwing", async () => {
131
+ const messages = await parseSessionMessages(fixture("malformed-session.jsonl"));
132
+ // Line 1: valid user
133
+ // Line 2: invalid JSON - skipped
134
+ // Line 3: blank line - skipped
135
+ // Line 4: valid assistant
136
+ // Line 5: valid JSON but no type field - skipped
137
+ // Line 6: valid user
138
+ // Total: 2 user + 1 assistant = 3
139
+ expect(messages).toHaveLength(3);
140
+ expect(messages[0].role).toBe("user");
141
+ expect(messages[0].content).toBe("First valid message");
142
+ expect(messages[1].role).toBe("assistant");
143
+ expect(messages[1].content).toBe("Response to the first message.");
144
+ expect(messages[2].role).toBe("user");
145
+ expect(messages[2].content).toBe("Another valid user message after the bad lines");
146
+ });
147
+ it("returns all messages from large-session.jsonl without error", async () => {
148
+ const messages = await parseSessionMessages(fixture("large-session.jsonl"));
149
+ // 53 user + 53 assistant = 106 messages
150
+ expect(messages).toHaveLength(106);
151
+ // Verify first and last messages
152
+ expect(messages[0].role).toBe("user");
153
+ expect(messages[0].content).toBe("What is a variable?");
154
+ expect(messages[messages.length - 1].role).toBe("assistant");
155
+ expect(messages[messages.length - 1].content).toContain("Server-Side Rendering");
156
+ });
157
+ it("respects limit parameter on large-session.jsonl", async () => {
158
+ const messages = await parseSessionMessages(fixture("large-session.jsonl"), { limit: 5 });
159
+ expect(messages).toHaveLength(5);
160
+ });
161
+ it("returns empty array for nonexistent file", async () => {
162
+ const messages = await parseSessionMessages(fixture("does-not-exist.jsonl"));
163
+ expect(messages).toEqual([]);
164
+ });
165
+ });
166
+ // =============================================================================
167
+ // extractSessionMetadata
168
+ // =============================================================================
169
+ describe("extractSessionMetadata", () => {
170
+ it("extracts correct metadata from simple-session.jsonl", async () => {
171
+ const meta = await extractSessionMetadata(fixture("simple-session.jsonl"));
172
+ expect(meta.sessionId).toBe("session-simple-001");
173
+ expect(meta.gitBranch).toBe("main");
174
+ expect(meta.claudeCodeVersion).toBe("2.0.77");
175
+ expect(meta.firstMessagePreview).toBe("What is TypeScript?");
176
+ expect(meta.firstMessagePreview.length).toBeGreaterThan(0);
177
+ expect(meta.messageCount).toBe(4);
178
+ expect(meta.firstMessageAt).toBe("2026-01-26T10:00:00.000Z");
179
+ expect(meta.lastMessageAt).toBe("2026-01-26T10:00:20.000Z");
180
+ });
181
+ it("returns the correct sessionId from the fixture", async () => {
182
+ const meta = await extractSessionMetadata(fixture("tool-calls-session.jsonl"));
183
+ expect(meta.sessionId).toBe("session-tools-001");
184
+ });
185
+ it("deduplicates assistant messages by message.id for messageCount", async () => {
186
+ // simple-session has 2 user + 2 assistant (each with unique id) = 4
187
+ const meta = await extractSessionMetadata(fixture("simple-session.jsonl"));
188
+ expect(meta.messageCount).toBe(4);
189
+ });
190
+ it("has firstMessageAt < lastMessageAt", async () => {
191
+ const meta = await extractSessionMetadata(fixture("simple-session.jsonl"));
192
+ expect(meta.firstMessageAt).toBeDefined();
193
+ expect(meta.lastMessageAt).toBeDefined();
194
+ const first = new Date(meta.firstMessageAt).getTime();
195
+ const last = new Date(meta.lastMessageAt).getTime();
196
+ expect(first).toBeLessThan(last);
197
+ });
198
+ it("returns sensible defaults for nonexistent file", async () => {
199
+ const meta = await extractSessionMetadata(fixture("does-not-exist.jsonl"));
200
+ expect(meta.sessionId).toBe("");
201
+ expect(meta.firstMessagePreview).toBeUndefined();
202
+ expect(meta.gitBranch).toBeUndefined();
203
+ expect(meta.claudeCodeVersion).toBeUndefined();
204
+ expect(meta.messageCount).toBe(0);
205
+ expect(meta.firstMessageAt).toBeUndefined();
206
+ expect(meta.lastMessageAt).toBeUndefined();
207
+ });
208
+ });
209
+ // =============================================================================
210
+ // extractSessionUsage
211
+ // =============================================================================
212
+ describe("extractSessionUsage", () => {
213
+ it("returns usage data from simple-session.jsonl", async () => {
214
+ const usage = await extractSessionUsage(fixture("simple-session.jsonl"));
215
+ expect(usage.hasData).toBe(true);
216
+ expect(usage.turnCount).toBeGreaterThan(0);
217
+ expect(usage.inputTokens).toBeGreaterThan(0);
218
+ });
219
+ it("turnCount equals number of unique assistant message IDs", async () => {
220
+ const usage = await extractSessionUsage(fixture("simple-session.jsonl"));
221
+ // msg_001 and msg_002 = 2 unique assistant IDs
222
+ expect(usage.turnCount).toBe(2);
223
+ });
224
+ it("inputTokens is the last assistant message total, not cumulative", async () => {
225
+ const usage = await extractSessionUsage(fixture("simple-session.jsonl"));
226
+ // Last assistant (msg_002): input_tokens=180 + cache_creation=0 + cache_read=120 = 300
227
+ expect(usage.inputTokens).toBe(300);
228
+ });
229
+ it("handles malformed-session.jsonl without throwing", async () => {
230
+ const usage = await extractSessionUsage(fixture("malformed-session.jsonl"));
231
+ // Only one valid assistant (msg_010): input_tokens=100 + 0 + 0 = 100
232
+ expect(usage.hasData).toBe(true);
233
+ expect(usage.turnCount).toBe(1);
234
+ expect(usage.inputTokens).toBe(100);
235
+ });
236
+ it("returns zero usage for nonexistent file", async () => {
237
+ const usage = await extractSessionUsage(fixture("does-not-exist.jsonl"));
238
+ expect(usage.inputTokens).toBe(0);
239
+ expect(usage.turnCount).toBe(0);
240
+ expect(usage.hasData).toBe(false);
241
+ });
242
+ });
243
+ // =============================================================================
244
+ // extractLastSummary
245
+ // =============================================================================
246
+ describe("extractLastSummary", () => {
247
+ it("returns the last summary from summary-session.jsonl", async () => {
248
+ const summary = await extractLastSummary(fixture("summary-session.jsonl"));
249
+ // The fixture has 2 summary entries; should return the second (last) one
250
+ expect(summary).toBe("The assistant helped configure CORS and body-parser middleware. The user then asked about database integration.");
251
+ });
252
+ it("returns undefined for simple-session.jsonl (no summaries)", async () => {
253
+ const summary = await extractLastSummary(fixture("simple-session.jsonl"));
254
+ expect(summary).toBeUndefined();
255
+ });
256
+ it("returns undefined for nonexistent file", async () => {
257
+ const summary = await extractLastSummary(fixture("does-not-exist.jsonl"));
258
+ expect(summary).toBeUndefined();
259
+ });
260
+ it("handles malformed-session.jsonl without throwing", async () => {
261
+ const summary = await extractLastSummary(fixture("malformed-session.jsonl"));
262
+ // No summary entries in this fixture
263
+ expect(summary).toBeUndefined();
264
+ });
265
+ });
266
+ // =============================================================================
267
+ // extractSessionMetadata - summary field
268
+ // =============================================================================
269
+ describe("extractSessionMetadata - summary field", () => {
270
+ it("includes summary field from summary-session.jsonl", async () => {
271
+ const meta = await extractSessionMetadata(fixture("summary-session.jsonl"));
272
+ // Should have the last summary
273
+ expect(meta.summary).toBe("The assistant helped configure CORS and body-parser middleware. The user then asked about database integration.");
274
+ });
275
+ it("returns undefined summary for sessions without summaries", async () => {
276
+ const meta = await extractSessionMetadata(fixture("simple-session.jsonl"));
277
+ expect(meta.summary).toBeUndefined();
278
+ });
279
+ });
280
+ // =============================================================================
281
+ // isSidechainSession
282
+ // =============================================================================
283
+ describe("isSidechainSession", () => {
284
+ it("returns true for sidechain session", async () => {
285
+ expect(await isSidechainSession(fixture("sidechain-session.jsonl"))).toBe(true);
286
+ });
287
+ it("returns false for normal session", async () => {
288
+ expect(await isSidechainSession(fixture("simple-session.jsonl"))).toBe(false);
289
+ });
290
+ it("returns false for nonexistent file", async () => {
291
+ expect(await isSidechainSession(fixture("does-not-exist.jsonl"))).toBe(false);
292
+ });
293
+ });
294
+ // =============================================================================
295
+ // extractSessionMetadata - isSidechain field
296
+ // =============================================================================
297
+ describe("extractSessionMetadata - isSidechain field", () => {
298
+ it("sets isSidechain true for sidechain sessions", async () => {
299
+ const meta = await extractSessionMetadata(fixture("sidechain-session.jsonl"));
300
+ expect(meta.isSidechain).toBe(true);
301
+ });
302
+ it("sets isSidechain false for normal sessions", async () => {
303
+ const meta = await extractSessionMetadata(fixture("simple-session.jsonl"));
304
+ expect(meta.isSidechain).toBe(false);
305
+ });
306
+ });
307
+ //# sourceMappingURL=jsonl-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-parser.test.js","sourceRoot":"","sources":["../../../src/state/__tests__/jsonl-parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-attribution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-attribution.test.d.ts","sourceRoot":"","sources":["../../../src/state/__tests__/session-attribution.test.ts"],"names":[],"mappings":""}