@opencode-trace/cli 0.0.3 → 0.0.5

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 (70) hide show
  1. package/README.md +2 -3
  2. package/dist/formatter.d.ts.map +1 -1
  3. package/dist/formatter.js +16 -6
  4. package/dist/formatter.js.map +1 -1
  5. package/dist/formatter.test.d.ts +2 -0
  6. package/dist/formatter.test.d.ts.map +1 -0
  7. package/dist/formatter.test.js +232 -0
  8. package/dist/formatter.test.js.map +1 -0
  9. package/dist/handlers/disable.test.d.ts +2 -0
  10. package/dist/handlers/disable.test.d.ts.map +1 -0
  11. package/dist/handlers/disable.test.js +115 -0
  12. package/dist/handlers/disable.test.js.map +1 -0
  13. package/dist/handlers/enable.d.ts.map +1 -1
  14. package/dist/handlers/enable.js +28 -10
  15. package/dist/handlers/enable.js.map +1 -1
  16. package/dist/handlers/enable.test.d.ts +2 -0
  17. package/dist/handlers/enable.test.d.ts.map +1 -0
  18. package/dist/handlers/enable.test.js +125 -0
  19. package/dist/handlers/enable.test.js.map +1 -0
  20. package/dist/handlers/export.d.ts.map +1 -1
  21. package/dist/handlers/export.js +11 -15
  22. package/dist/handlers/export.js.map +1 -1
  23. package/dist/handlers/export.test.d.ts +2 -0
  24. package/dist/handlers/export.test.d.ts.map +1 -0
  25. package/dist/handlers/export.test.js +492 -0
  26. package/dist/handlers/export.test.js.map +1 -0
  27. package/dist/handlers/list.d.ts.map +1 -1
  28. package/dist/handlers/list.js +8 -9
  29. package/dist/handlers/list.js.map +1 -1
  30. package/dist/handlers/list.test.d.ts +2 -0
  31. package/dist/handlers/list.test.d.ts.map +1 -0
  32. package/dist/handlers/list.test.js +154 -0
  33. package/dist/handlers/list.test.js.map +1 -0
  34. package/dist/handlers/show.d.ts.map +1 -1
  35. package/dist/handlers/show.js +1 -1
  36. package/dist/handlers/show.js.map +1 -1
  37. package/dist/handlers/show.test.d.ts +2 -0
  38. package/dist/handlers/show.test.d.ts.map +1 -0
  39. package/dist/handlers/show.test.js +322 -0
  40. package/dist/handlers/show.test.js.map +1 -0
  41. package/dist/handlers/status.d.ts.map +1 -1
  42. package/dist/handlers/status.js +24 -9
  43. package/dist/handlers/status.js.map +1 -1
  44. package/dist/handlers/status.test.d.ts +2 -0
  45. package/dist/handlers/status.test.d.ts.map +1 -0
  46. package/dist/handlers/status.test.js +141 -0
  47. package/dist/handlers/status.test.js.map +1 -0
  48. package/dist/handlers/sync.d.ts.map +1 -1
  49. package/dist/handlers/sync.js +5 -5
  50. package/dist/handlers/sync.js.map +1 -1
  51. package/dist/handlers/sync.test.d.ts +2 -0
  52. package/dist/handlers/sync.test.d.ts.map +1 -0
  53. package/dist/handlers/sync.test.js +120 -0
  54. package/dist/handlers/sync.test.js.map +1 -0
  55. package/dist/handlers/viewer.js +7 -7
  56. package/dist/handlers/viewer.js.map +1 -1
  57. package/dist/handlers/viewer.test.js +27 -23
  58. package/dist/handlers/viewer.test.js.map +1 -1
  59. package/dist/index.js +24 -16
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.test.js +38 -3
  62. package/dist/index.test.js.map +1 -1
  63. package/dist/utils.d.ts.map +1 -1
  64. package/dist/utils.js +22 -2
  65. package/dist/utils.js.map +1 -1
  66. package/dist/utils.test.d.ts +2 -0
  67. package/dist/utils.test.d.ts.map +1 -0
  68. package/dist/utils.test.js +250 -0
  69. package/dist/utils.test.js.map +1 -0
  70. package/package.json +4 -3
@@ -0,0 +1,154 @@
1
+ /**
2
+ * @vitest-environment node
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
5
+ vi.mock("@opencode-trace/core", async (importOriginal) => {
6
+ const original = await importOriginal();
7
+ return {
8
+ ...original,
9
+ store: {
10
+ ...original.store,
11
+ listSessionsFromBothDirs: vi.fn(),
12
+ },
13
+ };
14
+ });
15
+ import { store as mockedCore } from "@opencode-trace/core";
16
+ import { cmdList } from "./list.js";
17
+ import { GLOBAL_TRACE_DIR, LOCAL_TRACE_DIR } from "../utils.js";
18
+ const listSessionsFromBothDirsMock = vi.mocked(mockedCore.listSessionsFromBothDirs);
19
+ let consoleLogSpy;
20
+ let consoleErrorSpy;
21
+ beforeEach(() => {
22
+ vi.clearAllMocks();
23
+ consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => { });
24
+ consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
25
+ });
26
+ afterEach(() => {
27
+ consoleLogSpy.mockRestore();
28
+ consoleErrorSpy.mockRestore();
29
+ });
30
+ describe("cmdList", () => {
31
+ it("calls listSessionsFromBothDirs with GLOBAL_TRACE_DIR and LOCAL_TRACE_DIR", () => {
32
+ listSessionsFromBothDirsMock.mockReturnValue([]);
33
+ cmdList([]);
34
+ expect(listSessionsFromBothDirsMock).toHaveBeenCalledTimes(1);
35
+ expect(listSessionsFromBothDirsMock).toHaveBeenCalledWith({
36
+ globalDir: GLOBAL_TRACE_DIR,
37
+ localDir: LOCAL_TRACE_DIR,
38
+ });
39
+ });
40
+ it("prints 'No sessions found.' when no sessions exist", () => {
41
+ listSessionsFromBothDirsMock.mockReturnValue([]);
42
+ cmdList([]);
43
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
44
+ expect(consoleLogSpy).toHaveBeenCalledWith("No sessions found.");
45
+ });
46
+ it("prints each global session with [global] tag, id, title, created, updated", () => {
47
+ listSessionsFromBothDirsMock.mockReturnValue([
48
+ {
49
+ id: "session-1",
50
+ requestCount: 3,
51
+ title: "First Session",
52
+ createdAt: "2024-01-01T00:00:00Z",
53
+ updatedAt: "2024-01-01T01:00:00Z",
54
+ scope: "global",
55
+ },
56
+ ]);
57
+ cmdList([]);
58
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
59
+ const output = consoleLogSpy.mock.calls[0][0];
60
+ expect(output).toContain("session-1");
61
+ expect(output).toContain("[global]");
62
+ expect(output).toContain("title:First Session");
63
+ expect(output).toContain("created:2024-01-01T00:00:00Z");
64
+ expect(output).toContain("updated:2024-01-01T01:00:00Z");
65
+ });
66
+ it("prints local-scoped session with [local] tag", () => {
67
+ listSessionsFromBothDirsMock.mockReturnValue([
68
+ {
69
+ id: "session-local",
70
+ requestCount: 1,
71
+ title: "Local Title",
72
+ createdAt: "2024-02-01T00:00:00Z",
73
+ updatedAt: "2024-02-01T00:30:00Z",
74
+ scope: "local",
75
+ },
76
+ ]);
77
+ cmdList([]);
78
+ const output = consoleLogSpy.mock.calls[0][0];
79
+ expect(output).toContain("session-local");
80
+ expect(output).toContain("[local]");
81
+ expect(output).not.toContain("[global]");
82
+ });
83
+ it("prints '?' for missing title, createdAt, updatedAt", () => {
84
+ listSessionsFromBothDirsMock.mockReturnValue([
85
+ {
86
+ id: "session-incomplete",
87
+ requestCount: 0,
88
+ title: undefined,
89
+ createdAt: null,
90
+ updatedAt: null,
91
+ scope: "global",
92
+ },
93
+ ]);
94
+ cmdList([]);
95
+ const output = consoleLogSpy.mock.calls[0][0];
96
+ expect(output).toContain("session-incomplete");
97
+ expect(output).toContain("title:?");
98
+ expect(output).toContain("created:?");
99
+ expect(output).toContain("updated:?");
100
+ });
101
+ it("prints multiple sessions, one per line", () => {
102
+ listSessionsFromBothDirsMock.mockReturnValue([
103
+ {
104
+ id: "sess-a",
105
+ requestCount: 1,
106
+ title: "A",
107
+ createdAt: "2024-01-01T00:00:00Z",
108
+ updatedAt: "2024-01-01T01:00:00Z",
109
+ scope: "global",
110
+ },
111
+ {
112
+ id: "sess-b",
113
+ requestCount: 2,
114
+ title: "B",
115
+ createdAt: "2024-01-02T00:00:00Z",
116
+ updatedAt: "2024-01-02T01:00:00Z",
117
+ scope: "local",
118
+ },
119
+ ]);
120
+ cmdList([]);
121
+ expect(consoleLogSpy).toHaveBeenCalledTimes(2);
122
+ const first = consoleLogSpy.mock.calls[0][0];
123
+ const second = consoleLogSpy.mock.calls[1][0];
124
+ expect(first).toContain("sess-a");
125
+ expect(first).toContain("[global]");
126
+ expect(second).toContain("sess-b");
127
+ expect(second).toContain("[local]");
128
+ });
129
+ it("output format matches '<id> [<scope>] title:<title> created:<date> updated:<date>'", () => {
130
+ listSessionsFromBothDirsMock.mockReturnValue([
131
+ {
132
+ id: "fmt-check",
133
+ requestCount: 1,
134
+ title: "T",
135
+ createdAt: "2024-01-01T00:00:00Z",
136
+ updatedAt: "2024-01-01T01:00:00Z",
137
+ scope: "global",
138
+ },
139
+ ]);
140
+ cmdList([]);
141
+ const output = consoleLogSpy.mock.calls[0][0];
142
+ expect(output).toBe("fmt-check [global] title:T created:2024-01-01T00:00:00Z updated:2024-01-01T01:00:00Z");
143
+ });
144
+ it("ignores extra positional args (args currently unused)", () => {
145
+ listSessionsFromBothDirsMock.mockReturnValue([]);
146
+ cmdList(["ignored-arg", "another-arg"]);
147
+ expect(listSessionsFromBothDirsMock).toHaveBeenCalledWith({
148
+ globalDir: GLOBAL_TRACE_DIR,
149
+ localDir: LOCAL_TRACE_DIR,
150
+ });
151
+ expect(consoleLogSpy).toHaveBeenCalledWith("No sessions found.");
152
+ });
153
+ });
154
+ //# sourceMappingURL=list.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../src/handlers/list.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/handlers/show.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF3D"}
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/handlers/show.ts"],"names":[],"mappings":"AASA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF3D"}
@@ -1,5 +1,5 @@
1
1
  import { store, parse, query, record } from "@opencode-trace/core";
2
- import { parseFlags, parseRange, inRange, findSessionTraceDir } from "../utils.js";
2
+ import { parseFlags, parseRange, inRange, findSessionTraceDir, } from "../utils.js";
3
3
  import { outputData } from "../formatter.js";
4
4
  export async function cmdShow(args) {
5
5
  const { positional, flags } = parseFlags(args);
@@ -1 +1 @@
1
- {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/handlers/show.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/handlers/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=show.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.test.d.ts","sourceRoot":"","sources":["../../src/handlers/show.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,322 @@
1
+ /**
2
+ * @vitest-environment node
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
5
+ vi.mock("@opencode-trace/core", async (importOriginal) => {
6
+ const original = await importOriginal();
7
+ return {
8
+ ...original,
9
+ store: {
10
+ ...original.store,
11
+ readSessionMetadata: vi.fn(),
12
+ getSessionRecords: vi.fn(),
13
+ },
14
+ parse: {
15
+ ...original.parse,
16
+ detectAndParse: vi.fn(),
17
+ },
18
+ query: {
19
+ ...original.query,
20
+ buildSessionMetadata: vi.fn(),
21
+ buildSessionTimeline: vi.fn(),
22
+ },
23
+ record: {
24
+ ...original.record,
25
+ initStateManager: vi.fn().mockResolvedValue(undefined),
26
+ },
27
+ };
28
+ });
29
+ import { store as mockedStore, parse as mockedParse, query as mockedQuery, record as mockedRecord, } from "@opencode-trace/core";
30
+ import { cmdShow } from "./show.js";
31
+ const readSessionMetadataMock = vi.mocked(mockedStore.readSessionMetadata);
32
+ const getSessionRecordsMock = vi.mocked(mockedStore.getSessionRecords);
33
+ const detectAndParseMock = vi.mocked(mockedParse.detectAndParse);
34
+ const buildSessionMetadataMock = vi.mocked(mockedQuery.buildSessionMetadata);
35
+ const buildSessionTimelineMock = vi.mocked(mockedQuery.buildSessionTimeline);
36
+ const initStateManagerMock = vi.mocked(mockedRecord.initStateManager);
37
+ let consoleLogSpy;
38
+ let consoleErrorSpy;
39
+ let exitSpy;
40
+ function makeRecord(id) {
41
+ return {
42
+ id,
43
+ purpose: "chat",
44
+ requestAt: `2024-01-01T00:00:0${id}Z`,
45
+ responseAt: `2024-01-01T00:00:0${id}Z`,
46
+ request: { method: "POST", url: "https://api.test/v1/chat", headers: {}, body: {} },
47
+ response: { status: 200, statusText: "OK", headers: {}, body: {} },
48
+ error: null,
49
+ };
50
+ }
51
+ function makeConversation(provider = "openai") {
52
+ return {
53
+ provider,
54
+ model: "gpt-4",
55
+ msgs: [
56
+ {
57
+ id: "msg-1",
58
+ role: "user",
59
+ blocks: [{ type: "text", text: "hi" }],
60
+ },
61
+ ],
62
+ usage: null,
63
+ stream: false,
64
+ };
65
+ }
66
+ function makeDelta() {
67
+ return {
68
+ msgs: [
69
+ {
70
+ id: "msg-1",
71
+ added: [{ type: "text", text: "hello" }],
72
+ removed: [],
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ function defaultSessionMeta(overrides = {}) {
78
+ return {
79
+ sessionId: "my-session",
80
+ title: "Sample",
81
+ createdAt: "2024-01-01T00:00:00Z",
82
+ updatedAt: "2024-01-01T00:00:05Z",
83
+ enabled: true,
84
+ ...overrides,
85
+ };
86
+ }
87
+ function defaultMetadata(overrides = {}) {
88
+ return {
89
+ sessionId: "my-session",
90
+ tokenUsage: {
91
+ inputMissTokens: 0,
92
+ inputHitTokens: 0,
93
+ outputTokens: 0,
94
+ totalTokens: 0,
95
+ cacheHitRate: 0,
96
+ },
97
+ requestCount: 1,
98
+ subSessions: [],
99
+ parentSession: null,
100
+ createdAt: null,
101
+ updatedAt: null,
102
+ latencyStats: null,
103
+ durationStats: null,
104
+ ...overrides,
105
+ };
106
+ }
107
+ beforeEach(() => {
108
+ vi.clearAllMocks();
109
+ consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => { });
110
+ consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
111
+ exitSpy = vi
112
+ .spyOn(process, "exit")
113
+ .mockImplementation((code) => {
114
+ throw new Error(`exit_${code ?? 0}`);
115
+ });
116
+ readSessionMetadataMock.mockReturnValue(defaultSessionMeta());
117
+ getSessionRecordsMock.mockReturnValue([]);
118
+ detectAndParseMock.mockReturnValue(makeConversation());
119
+ buildSessionMetadataMock.mockReturnValue(defaultMetadata());
120
+ buildSessionTimelineMock.mockReturnValue({
121
+ sessionId: "my-session",
122
+ totalRequests: 0,
123
+ changes: [],
124
+ });
125
+ initStateManagerMock.mockResolvedValue(undefined);
126
+ });
127
+ afterEach(() => {
128
+ consoleLogSpy.mockRestore();
129
+ consoleErrorSpy.mockRestore();
130
+ exitSpy.mockRestore();
131
+ });
132
+ describe("cmdShow - input validation", () => {
133
+ it("exits with 1 when sessionId is missing", async () => {
134
+ await expect(cmdShow([])).rejects.toThrow("exit_1");
135
+ expect(consoleErrorSpy).toHaveBeenCalledWith("Error: session-id and subcommand are required");
136
+ expect(exitSpy).toHaveBeenCalledWith(1);
137
+ });
138
+ it("exits with 1 when subcommand is missing", async () => {
139
+ await expect(cmdShow(["my-session"])).rejects.toThrow("exit_1");
140
+ expect(consoleErrorSpy).toHaveBeenCalledWith("Error: session-id and subcommand are required");
141
+ });
142
+ it("exits with 1 when session not found", async () => {
143
+ readSessionMetadataMock.mockReturnValue(null);
144
+ getSessionRecordsMock.mockReturnValue([]);
145
+ await expect(cmdShow(["nonexistent", "metadata"])).rejects.toThrow("exit_1");
146
+ expect(consoleErrorSpy).toHaveBeenCalledWith("Session not found: nonexistent");
147
+ });
148
+ it("exits with 1 when no records found", async () => {
149
+ getSessionRecordsMock.mockReturnValue([]);
150
+ await expect(cmdShow(["my-session", "metadata"])).rejects.toThrow("exit_1");
151
+ expect(consoleErrorSpy).toHaveBeenCalledWith("No records found");
152
+ });
153
+ it("exits with 1 for unknown subcommand", async () => {
154
+ getSessionRecordsMock.mockReturnValue([makeRecord(1)]);
155
+ await expect(cmdShow(["my-session", "unknown-subcommand"])).rejects.toThrow("exit_1");
156
+ expect(consoleErrorSpy).toHaveBeenCalledWith("Unknown subcommand: unknown-subcommand");
157
+ });
158
+ });
159
+ describe("cmdShow - metadata", () => {
160
+ it("calls buildSessionMetadata with parsed records and prints JSON", async () => {
161
+ const rec = makeRecord(1);
162
+ getSessionRecordsMock.mockReturnValue([rec]);
163
+ buildSessionMetadataMock.mockReturnValue(defaultMetadata({ requestCount: 1 }));
164
+ await cmdShow(["my-session", "metadata"]);
165
+ expect(initStateManagerMock).toHaveBeenCalled();
166
+ expect(buildSessionMetadataMock).toHaveBeenCalledTimes(1);
167
+ const args = buildSessionMetadataMock.mock.calls[0];
168
+ expect(args[0]).toBe("my-session");
169
+ expect(args[1]).toHaveLength(1);
170
+ expect(args[1][0].id).toBe(1);
171
+ expect(args[1][0].parsed).toBeDefined();
172
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
173
+ const output = consoleLogSpy.mock.calls[0][0];
174
+ const parsed = JSON.parse(output);
175
+ expect(parsed.sessionId).toBe("my-session");
176
+ expect(parsed.requestCount).toBe(1);
177
+ });
178
+ it("merges createdAt, updatedAt, enabled from sessionMeta when present", async () => {
179
+ getSessionRecordsMock.mockReturnValue([makeRecord(1)]);
180
+ readSessionMetadataMock.mockReturnValue(defaultSessionMeta({
181
+ createdAt: "2024-05-01T00:00:00Z",
182
+ updatedAt: "2024-05-01T01:00:00Z",
183
+ enabled: true,
184
+ }));
185
+ await cmdShow(["my-session", "metadata"]);
186
+ const output = consoleLogSpy.mock.calls[0][0];
187
+ const parsed = JSON.parse(output);
188
+ expect(parsed.createdAt).toBe("2024-05-01T00:00:00Z");
189
+ expect(parsed.updatedAt).toBe("2024-05-01T01:00:00Z");
190
+ expect(parsed.enabled).toBe(true);
191
+ });
192
+ it("falls back gracefully when sessionMeta is null", async () => {
193
+ getSessionRecordsMock.mockReturnValue([makeRecord(1)]);
194
+ // findSessionTraceDir uses readSessionMetadata too, so we let
195
+ // it succeed first (to resolve traceDir) and then return null
196
+ // for the show.ts-internal call. The util uses 2 trace dirs;
197
+ // for simplicity we mock getSessionRecords path to resolve dir.
198
+ let callCount = 0;
199
+ readSessionMetadataMock.mockImplementation(() => {
200
+ callCount++;
201
+ // First call(s): findSessionTraceDir asks local then global metadata
202
+ // Return a valid meta so it picks LOCAL_TRACE_DIR. Then show.ts
203
+ // calls again with the resolved traceDir; return null this time.
204
+ if (callCount <= 1)
205
+ return defaultSessionMeta();
206
+ return null;
207
+ });
208
+ await cmdShow(["my-session", "metadata"]);
209
+ const output = consoleLogSpy.mock.calls[0][0];
210
+ const parsed = JSON.parse(output);
211
+ expect(parsed.sessionId).toBe("my-session");
212
+ // No enabled field added because sessionMeta was null
213
+ expect(parsed.enabled).toBeUndefined();
214
+ });
215
+ });
216
+ describe("cmdShow - conversation", () => {
217
+ it("returns only the last request by default (no -r flag)", async () => {
218
+ const records = [makeRecord(1), makeRecord(2), makeRecord(3)];
219
+ getSessionRecordsMock.mockReturnValue(records);
220
+ await cmdShow(["my-session", "conversation"]);
221
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
222
+ const output = consoleLogSpy.mock.calls[0][0];
223
+ const parsed = JSON.parse(output);
224
+ // Only last record id should be present
225
+ expect(Object.keys(parsed)).toEqual(["3"]);
226
+ expect(parsed["3"].provider).toBe("openai");
227
+ });
228
+ it("filters records by range with -r 1:3 (half-open)", async () => {
229
+ const records = [makeRecord(1), makeRecord(2), makeRecord(3)];
230
+ getSessionRecordsMock.mockReturnValue(records);
231
+ await cmdShow(["my-session", "conversation", "-r", "1:3"]);
232
+ const output = consoleLogSpy.mock.calls[0][0];
233
+ const parsed = JSON.parse(output);
234
+ // inRange uses upper bound exclusive: 1:3 => ids 1, 2 only
235
+ expect(Object.keys(parsed).sort()).toEqual(["1", "2"]);
236
+ });
237
+ it("outputs XML when --format xml is set", async () => {
238
+ getSessionRecordsMock.mockReturnValue([makeRecord(1)]);
239
+ await cmdShow(["my-session", "conversation", "--format", "xml"]);
240
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
241
+ const output = consoleLogSpy.mock.calls[0][0];
242
+ // XML output (not JSON parseable as object) — should look like xml
243
+ expect(output).toMatch(/<\/?\w+/);
244
+ // And shouldn't be plain JSON of the map
245
+ expect(output.trim().startsWith("{")).toBe(false);
246
+ });
247
+ it("compact flag is ignored when format is xml", async () => {
248
+ getSessionRecordsMock.mockReturnValue([makeRecord(1)]);
249
+ await cmdShow([
250
+ "my-session",
251
+ "conversation",
252
+ "--format",
253
+ "xml",
254
+ "--compact",
255
+ ]);
256
+ expect(consoleLogSpy).toHaveBeenCalledTimes(1);
257
+ const output = consoleLogSpy.mock.calls[0][0];
258
+ // Still XML — compact does not apply to XML branch
259
+ expect(output).toMatch(/<\/?\w+/);
260
+ });
261
+ it("calls detectAndParse for each in-range record", async () => {
262
+ const records = [makeRecord(1), makeRecord(2), makeRecord(3)];
263
+ getSessionRecordsMock.mockReturnValue(records);
264
+ await cmdShow(["my-session", "conversation", "-r", "1:3"]);
265
+ // detectAndParse is called once per in-range record (ids 1, 2)
266
+ expect(detectAndParseMock).toHaveBeenCalledTimes(2);
267
+ });
268
+ });
269
+ describe("cmdShow - changes", () => {
270
+ it("returns all changes by default (no -r flag => range is null)", async () => {
271
+ const records = [makeRecord(1), makeRecord(2), makeRecord(3)];
272
+ getSessionRecordsMock.mockReturnValue(records);
273
+ buildSessionTimelineMock.mockReturnValue({
274
+ sessionId: "my-session",
275
+ totalRequests: 3,
276
+ changes: [
277
+ { requestId: 1, delta: makeDelta(), interRequestDuration: null, isUserCall: true },
278
+ { requestId: 2, delta: makeDelta(), interRequestDuration: null, isUserCall: false },
279
+ { requestId: 3, delta: makeDelta(), interRequestDuration: null, isUserCall: false },
280
+ ],
281
+ });
282
+ await cmdShow(["my-session", "changes"]);
283
+ expect(buildSessionTimelineMock).toHaveBeenCalledTimes(1);
284
+ const output = consoleLogSpy.mock.calls[0][0];
285
+ const parsed = JSON.parse(output);
286
+ expect(Object.keys(parsed).sort()).toEqual(["1", "2", "3"]);
287
+ });
288
+ it("filters changes with -r 2 (range from 2 to last, upper-exclusive)", async () => {
289
+ const records = [makeRecord(1), makeRecord(2), makeRecord(3)];
290
+ getSessionRecordsMock.mockReturnValue(records);
291
+ buildSessionTimelineMock.mockReturnValue({
292
+ sessionId: "my-session",
293
+ totalRequests: 3,
294
+ changes: [
295
+ { requestId: 1, delta: makeDelta(), interRequestDuration: null, isUserCall: true },
296
+ { requestId: 2, delta: makeDelta(), interRequestDuration: null, isUserCall: false },
297
+ { requestId: 3, delta: makeDelta(), interRequestDuration: null, isUserCall: false },
298
+ ],
299
+ });
300
+ await cmdShow(["my-session", "changes", "-r", "2"]);
301
+ const output = consoleLogSpy.mock.calls[0][0];
302
+ const parsed = JSON.parse(output);
303
+ // parseRange("2", lastReqId=3) => {start:2, end:3}; inRange:
304
+ // reqId 2 -> true (2 >= 2 && 2 < 3)
305
+ // reqId 3 -> false (3 >= 3)
306
+ expect(Object.keys(parsed)).toEqual(["2"]);
307
+ });
308
+ it("outputs deltas map as XML when --format xml is set", async () => {
309
+ getSessionRecordsMock.mockReturnValue([makeRecord(1)]);
310
+ buildSessionTimelineMock.mockReturnValue({
311
+ sessionId: "my-session",
312
+ totalRequests: 1,
313
+ changes: [
314
+ { requestId: 1, delta: makeDelta(), interRequestDuration: null, isUserCall: true },
315
+ ],
316
+ });
317
+ await cmdShow(["my-session", "changes", "--format", "xml"]);
318
+ const output = consoleLogSpy.mock.calls[0][0];
319
+ expect(output).toMatch(/<\/?\w+/);
320
+ });
321
+ });
322
+ //# sourceMappingURL=show.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.test.js","sourceRoot":"","sources":["../../src/handlers/show.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/handlers/status.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B7D"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/handlers/status.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC7D"}
@@ -2,21 +2,36 @@ import { record } from "@opencode-trace/core";
2
2
  import { parseFlags, GLOBAL_TRACE_DIR, LOCAL_TRACE_DIR } from "../utils.js";
3
3
  export async function cmdStatus(args) {
4
4
  const { positional, flags } = parseFlags(args);
5
- const traceDir = flags.session ? LOCAL_TRACE_DIR : GLOBAL_TRACE_DIR;
6
- await record.initStateManager(traceDir);
5
+ const hasGlobal = flags.global === true;
6
+ const hasLocal = flags.local === true;
7
+ const hasSession = flags.session === true;
8
+ const anyScope = hasGlobal || hasLocal || hasSession;
7
9
  const status = {};
8
- if (flags.session) {
10
+ if (hasGlobal || !anyScope) {
11
+ await record.initStateManager(GLOBAL_TRACE_DIR);
12
+ status.global = {
13
+ enabled: record.getGlobalTraceEnabled(GLOBAL_TRACE_DIR),
14
+ storage: record.getStoragePreference(GLOBAL_TRACE_DIR),
15
+ };
16
+ }
17
+ if (hasLocal) {
18
+ await record.initStateManager(LOCAL_TRACE_DIR);
19
+ status.local = {
20
+ enabled: record.getGlobalTraceEnabled(LOCAL_TRACE_DIR),
21
+ };
22
+ }
23
+ if (hasSession) {
9
24
  const sessionId = positional[0];
10
25
  if (!sessionId) {
11
26
  console.error("Error: session-id is required when using -s");
12
27
  process.exit(1);
13
28
  }
14
- status.globalEnabled = record.getGlobalTraceEnabled(traceDir);
15
- status.sessionEnabled = record.getSessionEnabled(sessionId, traceDir);
16
- status.sessionId = sessionId;
17
- }
18
- else {
19
- status.globalEnabled = record.getGlobalTraceEnabled(traceDir);
29
+ await record.initStateManager(GLOBAL_TRACE_DIR);
30
+ status.session = {
31
+ id: sessionId,
32
+ enabled: record.getSessionEnabled(sessionId, GLOBAL_TRACE_DIR),
33
+ storage: record.getSessionStoragePreference(sessionId, GLOBAL_TRACE_DIR),
34
+ };
20
35
  }
21
36
  console.log(JSON.stringify(status, null, 2));
22
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/handlers/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEpE,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAExC,MAAM,MAAM,GAIR,EAAE,CAAC;IAEP,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/handlers/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,IAAI,QAAQ,IAAI,UAAU,CAAC;IAErD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,GAAG;YACd,OAAO,EAAE,MAAM,CAAC,qBAAqB,CAAC,gBAAgB,CAAC;YACvD,OAAO,EAAE,MAAM,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,GAAG;YACb,OAAO,EAAE,MAAM,CAAC,qBAAqB,CAAC,eAAe,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,GAAG;YACf,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,CAAC;YAC9D,OAAO,EAAE,MAAM,CAAC,2BAA2B,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACzE,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../../src/handlers/status.test.ts"],"names":[],"mappings":""}