@tracemarketplace/cli 0.0.22 → 0.0.23

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.
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { collectIdleSessionSources, createFreshSessionState, migrateLegacySessionState, planSessionUploads, verifyUnconfirmedChunks, } from "./flush.js";
2
+ import { collectIdleSessionSources, createFreshSessionState, migrateLegacySessionState, planSessionUploads, prepareTraceForUpload, verifyUnconfirmedChunks, } from "./flush.js";
3
3
  import { migrateSessionUploadState } from "./config.js";
4
4
  function makeTurn(turnId, role, timestamp, outputTokens = 0) {
5
5
  return {
@@ -143,6 +143,32 @@ describe("planSessionUploads", () => {
143
143
  expect(plan.observedState.openChunkStartTurn).toBe(trace.turn_count);
144
144
  });
145
145
  });
146
+ describe("prepareTraceForUpload", () => {
147
+ it("always omits raw session payloads before submit", () => {
148
+ const trace = {
149
+ ...makeTrace("session-raw", [
150
+ makeTurn("u1", "user", "2026-03-21T00:00:00.000Z"),
151
+ makeTurn("a1", "assistant", "2026-03-21T00:01:00.000Z", 10),
152
+ ]),
153
+ submitted_by: "user@example.com",
154
+ raw_json: {
155
+ events: [
156
+ {
157
+ type: "event_msg",
158
+ text: "/Users/fleet/project/secrets.txt",
159
+ },
160
+ ],
161
+ },
162
+ raw_json_format: "codex_cli.jsonl",
163
+ };
164
+ const prepared = prepareTraceForUpload(trace, { homeDir: "/Users/fleet" });
165
+ expect(prepared.raw_json).toBeNull();
166
+ expect(prepared.raw_json_format).toBeNull();
167
+ expect(prepared.submitted_by).toBe("[redacted]");
168
+ expect(prepared.turn_count).toBe(trace.turn_count);
169
+ expect(prepared.turns).toHaveLength(trace.turns.length);
170
+ });
171
+ });
146
172
  describe("migrateSessionUploadState", () => {
147
173
  it("fills in missing confirmation fields from next/openChunk values", () => {
148
174
  const legacy = {
@@ -265,6 +291,50 @@ describe("verifyUnconfirmedChunks", () => {
265
291
  expect(s.openChunkStartTurn).toBe(4);
266
292
  expect(s.unconfirmedSince).toBeNull();
267
293
  });
294
+ it("does not reset timed-out chunks that are still pending on the server", async () => {
295
+ const state = makeSubmitState({
296
+ "codex_cli:sess_pending": makeSessionState({
297
+ sourceTool: "codex_cli",
298
+ sourceSessionId: "sess_pending",
299
+ locator: "/tmp/sess_pending.jsonl",
300
+ nextChunkIndex: 3,
301
+ openChunkStartTurn: 12,
302
+ confirmedChunkIndex: 1,
303
+ confirmedOpenChunkStartTurn: 4,
304
+ unconfirmedSince: "2026-03-21T00:00:00.000Z",
305
+ }),
306
+ });
307
+ const client = makeMockClient({
308
+ "codex_cli:sess_pending:1": { exists: false, pending: true, status: "retry_wait" },
309
+ });
310
+ await verifyUnconfirmedChunks(state, client, new Date("2026-03-21T02:01:00.000Z"));
311
+ const s = state.sessions["codex_cli:sess_pending"];
312
+ expect(s.nextChunkIndex).toBe(3);
313
+ expect(s.openChunkStartTurn).toBe(12);
314
+ expect(s.unconfirmedSince).toBe("2026-03-21T00:00:00.000Z");
315
+ });
316
+ it("immediately resets when the server reports a terminal ingest failure", async () => {
317
+ const state = makeSubmitState({
318
+ "codex_cli:sess_failed": makeSessionState({
319
+ sourceTool: "codex_cli",
320
+ sourceSessionId: "sess_failed",
321
+ locator: "/tmp/sess_failed.jsonl",
322
+ nextChunkIndex: 3,
323
+ openChunkStartTurn: 12,
324
+ confirmedChunkIndex: 1,
325
+ confirmedOpenChunkStartTurn: 4,
326
+ unconfirmedSince: "2026-03-21T00:00:00.000Z",
327
+ }),
328
+ });
329
+ const client = makeMockClient({
330
+ "codex_cli:sess_failed:1": { exists: false, pending: false, status: "failed_terminal" },
331
+ });
332
+ await verifyUnconfirmedChunks(state, client, new Date("2026-03-21T00:05:00.000Z"));
333
+ const s = state.sessions["codex_cli:sess_failed"];
334
+ expect(s.nextChunkIndex).toBe(1);
335
+ expect(s.openChunkStartTurn).toBe(4);
336
+ expect(s.unconfirmedSince).toBeNull();
337
+ });
268
338
  it("skips sessions that are already fully confirmed", async () => {
269
339
  const state = makeSubmitState({
270
340
  "codex_cli:sess4": makeSessionState({
@@ -1 +1 @@
1
- {"version":3,"file":"flush.test.js","sourceRoot":"","sources":["../src/flush.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flush.test.js","sourceRoot":"","sources":["../src/flush.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracemarketplace/cli",
3
- "version": "0.0.22",
3
+ "version": "0.0.23",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "tracemp": "dist/cli.js"
@@ -13,7 +13,7 @@
13
13
  "test:watch": "vitest"
14
14
  },
15
15
  "dependencies": {
16
- "@tracemarketplace/shared": "^0.0.17",
16
+ "@tracemarketplace/shared": "^0.0.18",
17
17
  "better-sqlite3": "^12.8.0",
18
18
  "chalk": "^5.3.0",
19
19
  "commander": "^12.0.0",
@@ -25,7 +25,7 @@ describe("ApiClient", () => {
25
25
 
26
26
  const client = new ApiClient("https://example.test", "token");
27
27
 
28
- await expect(client.post("/api/v1/traces/batch", {})).rejects.toEqual(
28
+ await expect(client.post("/api/v1/traces/ingest", {})).rejects.toEqual(
29
29
  expect.objectContaining<Partial<ApiError>>({
30
30
  name: "ApiError",
31
31
  status: 503,
@@ -69,4 +69,24 @@ describe("ApiClient", () => {
69
69
  });
70
70
  expect(init.body).toBeInstanceOf(Uint8Array);
71
71
  });
72
+
73
+ it("turns hung requests into a timeout ApiError", async () => {
74
+ console.error = vi.fn();
75
+ global.fetch = vi.fn().mockImplementation((_url, init) => new Promise((_, reject) => {
76
+ (init?.signal as AbortSignal).addEventListener("abort", () => {
77
+ reject(new DOMException("timed out", "TimeoutError"));
78
+ }, { once: true });
79
+ })) as typeof fetch;
80
+
81
+ const client = new ApiClient("https://example.test", "token", 5);
82
+
83
+ await expect(client.get("/health")).rejects.toEqual(
84
+ expect.objectContaining<Partial<ApiError>>({
85
+ name: "ApiError",
86
+ status: 408,
87
+ retryAfterSeconds: null,
88
+ body: { error: "Request timed out" },
89
+ }),
90
+ );
91
+ });
72
92
  });
package/src/api-client.ts CHANGED
@@ -10,10 +10,13 @@ export class ApiError extends Error {
10
10
  }
11
11
  }
12
12
 
13
+ const DEFAULT_REQUEST_TIMEOUT_MS = 120_000;
14
+
13
15
  export class ApiClient {
14
16
  constructor(
15
17
  private baseUrl: string,
16
- private apiKey?: string
18
+ private apiKey?: string,
19
+ private requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS,
17
20
  ) {}
18
21
 
19
22
  async get(path: string): Promise<unknown> {
@@ -48,15 +51,29 @@ export class ApiClient {
48
51
  }
49
52
  }
50
53
 
51
- const res = await fetch(`${this.baseUrl}${path}`, {
52
- method,
53
- headers: {
54
- ...(method === "POST" ? { "Content-Type": "application/json" } : {}),
55
- ...(this.apiKey ? { "X-Api-Key": this.apiKey } : {}),
56
- ...extraHeaders,
57
- },
58
- body: reqBody as BodyInit | undefined,
59
- });
54
+ let res: Response;
55
+ try {
56
+ res = await fetch(`${this.baseUrl}${path}`, {
57
+ method,
58
+ headers: {
59
+ ...(method === "POST" ? { "Content-Type": "application/json" } : {}),
60
+ ...(this.apiKey ? { "X-Api-Key": this.apiKey } : {}),
61
+ ...extraHeaders,
62
+ },
63
+ body: reqBody as BodyInit | undefined,
64
+ signal: AbortSignal.timeout(this.requestTimeoutMs),
65
+ });
66
+ } catch (error) {
67
+ if (isRequestTimeout(error)) {
68
+ throw new ApiError(
69
+ `API request timed out after ${formatDuration(this.requestTimeoutMs)}`,
70
+ 408,
71
+ { error: "Request timed out" },
72
+ null,
73
+ );
74
+ }
75
+ throw error;
76
+ }
60
77
 
61
78
  const parsedBody = await parseResponseBody(res);
62
79
  if (!res.ok) {
@@ -125,3 +142,17 @@ function formatSize(bytes: number): string {
125
142
  }
126
143
  return `${Math.round(bytes / 1024)}KB`;
127
144
  }
145
+
146
+ function isRequestTimeout(error: unknown): boolean {
147
+ if (!(error instanceof Error)) {
148
+ return false;
149
+ }
150
+ return error.name === "AbortError" || error.name === "TimeoutError";
151
+ }
152
+
153
+ function formatDuration(ms: number): string {
154
+ if (ms < 1000) {
155
+ return `${ms}ms`;
156
+ }
157
+ return `${Math.ceil(ms / 1000)}s`;
158
+ }
@@ -0,0 +1,112 @@
1
+ import { unlinkSync } from "fs";
2
+ import { readFile } from "fs/promises";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+
5
+ vi.mock("fs", () => ({
6
+ closeSync: vi.fn(),
7
+ existsSync: vi.fn(() => false),
8
+ mkdirSync: vi.fn(),
9
+ openSync: vi.fn(() => 1),
10
+ unlinkSync: vi.fn(),
11
+ writeFileSync: vi.fn(),
12
+ }));
13
+
14
+ vi.mock("fs/promises", () => ({
15
+ readFile: vi.fn(),
16
+ }));
17
+
18
+ vi.mock("../config.js", () => ({
19
+ getConfigDir: vi.fn(() => "/tmp/tracemarketplace"),
20
+ getSubmitLogPath: vi.fn(() => "/tmp/tracemarketplace/submit.log"),
21
+ loadConfig: vi.fn(),
22
+ loadState: vi.fn(() => ({ sessions: {}, chunks: {} })),
23
+ resolveProfile: vi.fn((profile?: string) => profile ?? "prod"),
24
+ stateKey: vi.fn(() => "session-key"),
25
+ }));
26
+
27
+ vi.mock("../flush.js", () => ({
28
+ buildCursorSessionSource: vi.fn(),
29
+ buildFileSessionSource: vi.fn(),
30
+ createFreshSessionState: vi.fn(),
31
+ flushTrackedSessions: vi.fn(),
32
+ migrateLegacySessionState: vi.fn(),
33
+ planSessionUploads: vi.fn(),
34
+ }));
35
+
36
+ vi.mock("../sessions.js", () => ({
37
+ CURSOR_DB_PATH: "/tmp/cursor.sqlite",
38
+ findFiles: vi.fn(() => []),
39
+ }));
40
+
41
+ vi.mock("../submit-worker-state.js", () => ({
42
+ createSubmitWorkerState: vi.fn(),
43
+ removeSubmitWorkerState: vi.fn(),
44
+ writeSubmitWorkerState: vi.fn(),
45
+ }));
46
+
47
+ import { loadConfig } from "../config.js";
48
+ import { flushTrackedSessions } from "../flush.js";
49
+ import { removeSubmitWorkerState } from "../submit-worker-state.js";
50
+ import { submitWorkerCommand } from "./submit.js";
51
+
52
+ describe("submitWorkerCommand", () => {
53
+ beforeEach(() => {
54
+ vi.mocked(loadConfig).mockReturnValue({
55
+ profile: "prod",
56
+ email: "user@example.com",
57
+ serverUrl: "https://example.test",
58
+ apiKey: "tm_test_key",
59
+ } as never);
60
+
61
+ vi.mocked(readFile).mockResolvedValue(JSON.stringify({
62
+ createdAt: "2026-03-22T20:16:00.000Z",
63
+ readyChunkCount: 2,
64
+ readySessionCount: 1,
65
+ sources: [
66
+ {
67
+ tool: "codex_cli",
68
+ locator: "/tmp/session.jsonl",
69
+ label: "codex_cli:/tmp/session.jsonl",
70
+ },
71
+ ],
72
+ }) as never);
73
+
74
+ vi.mocked(flushTrackedSessions).mockResolvedValue({
75
+ processedSessions: 1,
76
+ uploadedChunks: 2,
77
+ duplicateChunks: 0,
78
+ pendingSessions: 0,
79
+ payoutCents: 0,
80
+ results: [],
81
+ });
82
+ });
83
+
84
+ afterEach(() => {
85
+ vi.restoreAllMocks();
86
+ });
87
+
88
+ it("waits for sync uploads before removing worker state", async () => {
89
+ const consoleLog = vi.spyOn(console, "log").mockImplementation(() => undefined);
90
+
91
+ await submitWorkerCommand({ profile: "prod", manifest: "/tmp/submit-job.json" });
92
+
93
+ expect(flushTrackedSessions).toHaveBeenCalledWith(
94
+ expect.objectContaining({ profile: "prod" }),
95
+ [
96
+ {
97
+ tool: "codex_cli",
98
+ locator: "/tmp/session.jsonl",
99
+ label: "codex_cli:/tmp/session.jsonl",
100
+ },
101
+ ],
102
+ expect.objectContaining({
103
+ includeIdleTracked: false,
104
+ sync: true,
105
+ }),
106
+ );
107
+ expect(removeSubmitWorkerState).toHaveBeenCalledWith("prod", process.pid);
108
+ expect(unlinkSync).toHaveBeenCalledWith("/tmp/submit-job.json");
109
+
110
+ consoleLog.mockRestore();
111
+ });
112
+ });
@@ -0,0 +1,75 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
2
+ import { join } from "path";
3
+ import { tmpdir } from "os";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+
6
+ const TEST_HOME = join(tmpdir(), "tracemarketplace-config-test");
7
+
8
+ vi.mock("os", async (importOriginal) => {
9
+ const actual = await importOriginal<typeof import("os")>();
10
+ return {
11
+ ...actual,
12
+ homedir: () => TEST_HOME,
13
+ };
14
+ });
15
+
16
+ import { getConfigDir, getConfigPath, loadConfig, saveConfig } from "./config.js";
17
+
18
+ describe("config persistence", () => {
19
+ beforeEach(() => {
20
+ rmSync(TEST_HOME, { recursive: true, force: true });
21
+ });
22
+
23
+ afterEach(() => {
24
+ rmSync(TEST_HOME, { recursive: true, force: true });
25
+ });
26
+
27
+ it("persists the active config shape without a raw upload toggle", () => {
28
+ const saved = saveConfig({
29
+ apiKey: "tm_test_key",
30
+ serverUrl: "https://example.test",
31
+ email: "user@example.com",
32
+ });
33
+
34
+ expect(saved).toEqual({
35
+ profile: "prod",
36
+ apiKey: "tm_test_key",
37
+ serverUrl: "https://example.test",
38
+ email: "user@example.com",
39
+ });
40
+ expect(loadConfig(saved.profile)).toEqual(saved);
41
+ });
42
+
43
+ it("loads legacy config files that still contain the raw upload toggle", () => {
44
+ mkdirSync(getConfigDir(), { recursive: true });
45
+ writeFileSync(getConfigPath(), JSON.stringify({
46
+ defaultProfile: "prod",
47
+ profiles: {
48
+ prod: {
49
+ apiKey: "tm_test_key",
50
+ serverUrl: "https://example.test",
51
+ email: "user@example.com",
52
+ includeRawJsonInUploads: true,
53
+ },
54
+ },
55
+ }, null, 2));
56
+
57
+ expect(loadConfig("prod")).toEqual({
58
+ profile: "prod",
59
+ apiKey: "tm_test_key",
60
+ serverUrl: "https://example.test",
61
+ email: "user@example.com",
62
+ });
63
+ });
64
+
65
+ it("rewrites configs without the legacy raw upload toggle", () => {
66
+ saveConfig({
67
+ apiKey: "tm_test_key",
68
+ serverUrl: "https://example.test",
69
+ email: "user@example.com",
70
+ }, { profile: "prod" });
71
+
72
+ expect(existsSync(getConfigPath())).toBe(true);
73
+ expect(readFileSync(getConfigPath(), "utf8")).not.toContain("includeRawJsonInUploads");
74
+ });
75
+ });
package/src/config.ts CHANGED
@@ -118,7 +118,10 @@ export function loadConfig(profile?: string): Config | null {
118
118
  const resolvedProfile = resolveProfileFromStore(store, profile);
119
119
  const selected = store.profiles[resolvedProfile];
120
120
  if (!selected) return null;
121
- return { profile: resolvedProfile, ...selected };
121
+ return {
122
+ profile: resolvedProfile,
123
+ ...selected,
124
+ };
122
125
  }
123
126
 
124
127
  export function saveConfig(
@@ -138,7 +141,10 @@ export function saveConfig(
138
141
  }
139
142
 
140
143
  writeConfigStore(store);
141
- return { profile, ...store.profiles[profile] };
144
+ return {
145
+ profile,
146
+ ...store.profiles[profile],
147
+ };
142
148
  }
143
149
 
144
150
  export function loadState(profile?: string): SubmitState {
package/src/flush.test.ts CHANGED
@@ -7,6 +7,7 @@ import {
7
7
  createFreshSessionState,
8
8
  migrateLegacySessionState,
9
9
  planSessionUploads,
10
+ prepareTraceForUpload,
10
11
  verifyUnconfirmedChunks,
11
12
  } from "./flush.js";
12
13
  import { migrateSessionUploadState } from "./config.js";
@@ -185,6 +186,35 @@ describe("planSessionUploads", () => {
185
186
  });
186
187
  });
187
188
 
189
+ describe("prepareTraceForUpload", () => {
190
+ it("always omits raw session payloads before submit", () => {
191
+ const trace = {
192
+ ...makeTrace("session-raw", [
193
+ makeTurn("u1", "user", "2026-03-21T00:00:00.000Z"),
194
+ makeTurn("a1", "assistant", "2026-03-21T00:01:00.000Z", 10),
195
+ ]),
196
+ submitted_by: "user@example.com",
197
+ raw_json: {
198
+ events: [
199
+ {
200
+ type: "event_msg",
201
+ text: "/Users/fleet/project/secrets.txt",
202
+ },
203
+ ],
204
+ },
205
+ raw_json_format: "codex_cli.jsonl",
206
+ } satisfies NormalizedTrace;
207
+
208
+ const prepared = prepareTraceForUpload(trace, { homeDir: "/Users/fleet" });
209
+
210
+ expect(prepared.raw_json).toBeNull();
211
+ expect(prepared.raw_json_format).toBeNull();
212
+ expect(prepared.submitted_by).toBe("[redacted]");
213
+ expect(prepared.turn_count).toBe(trace.turn_count);
214
+ expect(prepared.turns).toHaveLength(trace.turns.length);
215
+ });
216
+ });
217
+
188
218
  describe("migrateSessionUploadState", () => {
189
219
  it("fills in missing confirmation fields from next/openChunk values", () => {
190
220
  const legacy = {
@@ -231,7 +261,13 @@ describe("verifyUnconfirmedChunks", () => {
231
261
  return { version: 2 as const, chunks: {}, sessions };
232
262
  }
233
263
 
234
- function makeMockClient(responses: Record<string, { exists: boolean }>) {
264
+ function makeMockClient(
265
+ responses: Record<string, {
266
+ exists: boolean;
267
+ pending?: boolean;
268
+ status?: "queued" | "running" | "retry_wait" | "completed" | "duplicate" | "failed_terminal" | "payload_expired" | "missing";
269
+ }>,
270
+ ) {
235
271
  return {
236
272
  async get(path: string) {
237
273
  const url = new URL(`http://x${path}`);
@@ -326,6 +362,58 @@ describe("verifyUnconfirmedChunks", () => {
326
362
  expect(s.unconfirmedSince).toBeNull();
327
363
  });
328
364
 
365
+ it("does not reset timed-out chunks that are still pending on the server", async () => {
366
+ const state = makeSubmitState({
367
+ "codex_cli:sess_pending": makeSessionState({
368
+ sourceTool: "codex_cli",
369
+ sourceSessionId: "sess_pending",
370
+ locator: "/tmp/sess_pending.jsonl",
371
+ nextChunkIndex: 3,
372
+ openChunkStartTurn: 12,
373
+ confirmedChunkIndex: 1,
374
+ confirmedOpenChunkStartTurn: 4,
375
+ unconfirmedSince: "2026-03-21T00:00:00.000Z",
376
+ }),
377
+ });
378
+
379
+ const client = makeMockClient({
380
+ "codex_cli:sess_pending:1": { exists: false, pending: true, status: "retry_wait" },
381
+ });
382
+
383
+ await verifyUnconfirmedChunks(state, client, new Date("2026-03-21T02:01:00.000Z"));
384
+
385
+ const s = state.sessions["codex_cli:sess_pending"]!;
386
+ expect(s.nextChunkIndex).toBe(3);
387
+ expect(s.openChunkStartTurn).toBe(12);
388
+ expect(s.unconfirmedSince).toBe("2026-03-21T00:00:00.000Z");
389
+ });
390
+
391
+ it("immediately resets when the server reports a terminal ingest failure", async () => {
392
+ const state = makeSubmitState({
393
+ "codex_cli:sess_failed": makeSessionState({
394
+ sourceTool: "codex_cli",
395
+ sourceSessionId: "sess_failed",
396
+ locator: "/tmp/sess_failed.jsonl",
397
+ nextChunkIndex: 3,
398
+ openChunkStartTurn: 12,
399
+ confirmedChunkIndex: 1,
400
+ confirmedOpenChunkStartTurn: 4,
401
+ unconfirmedSince: "2026-03-21T00:00:00.000Z",
402
+ }),
403
+ });
404
+
405
+ const client = makeMockClient({
406
+ "codex_cli:sess_failed:1": { exists: false, pending: false, status: "failed_terminal" },
407
+ });
408
+
409
+ await verifyUnconfirmedChunks(state, client, new Date("2026-03-21T00:05:00.000Z"));
410
+
411
+ const s = state.sessions["codex_cli:sess_failed"]!;
412
+ expect(s.nextChunkIndex).toBe(1);
413
+ expect(s.openChunkStartTurn).toBe(4);
414
+ expect(s.unconfirmedSince).toBeNull();
415
+ });
416
+
329
417
  it("skips sessions that are already fully confirmed", async () => {
330
418
  const state = makeSubmitState({
331
419
  "codex_cli:sess4": makeSessionState({