@tracemarketplace/cli 0.0.6 → 0.0.8
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.
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/submit.d.ts +1 -0
- package/dist/commands/submit.d.ts.map +1 -1
- package/dist/commands/submit.js +27 -11
- package/dist/commands/submit.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -4
- package/dist/config.js.map +1 -1
- package/dist/submitter.d.ts.map +1 -1
- package/dist/submitter.js +22 -7
- package/dist/submitter.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +2 -0
- package/src/commands/submit.ts +27 -11
- package/src/config.ts +36 -4
- package/src/submitter.ts +27 -8
package/dist/cli.js
CHANGED
|
@@ -30,10 +30,12 @@ program
|
|
|
30
30
|
.command("submit")
|
|
31
31
|
.description("Auto-detect and submit traces from Claude Code, Codex CLI, and Cursor")
|
|
32
32
|
.option("--tool <tool>", "Only submit from specific tool (claude-code|codex|cursor)")
|
|
33
|
+
.option("--session <id>", "Only submit a specific session ID")
|
|
33
34
|
.option("--dry-run", "Preview without submitting")
|
|
34
35
|
.option("--since <duration>", "Only include sessions from last N days (e.g. 30d)", "30d")
|
|
35
36
|
.action((opts) => submitCommand({
|
|
36
37
|
tool: opts.tool,
|
|
38
|
+
session: opts.session,
|
|
37
39
|
dryRun: opts.dryRun,
|
|
38
40
|
since: opts.since,
|
|
39
41
|
}).catch(handleError));
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../src/commands/submit.ts"],"names":[],"mappings":"AAYA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../src/commands/submit.ts"],"names":[],"mappings":"AAYA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4KtE"}
|
package/dist/commands/submit.js
CHANGED
|
@@ -7,9 +7,16 @@ import { extractClaudeCode, extractCodex, extractCursor, redactTrace } from "@tr
|
|
|
7
7
|
import { loadConfig } from "../config.js";
|
|
8
8
|
import { ApiClient } from "../api-client.js";
|
|
9
9
|
import { findFiles, CURSOR_DB_PATH } from "../sessions.js";
|
|
10
|
-
function
|
|
11
|
-
const
|
|
12
|
-
|
|
10
|
+
function parseSinceMs(since) {
|
|
11
|
+
const m = since.match(/^(\d+)(m|h|d)$/);
|
|
12
|
+
if (!m)
|
|
13
|
+
return 30 * 24 * 60 * 60 * 1000;
|
|
14
|
+
const n = parseInt(m[1], 10);
|
|
15
|
+
if (m[2] === "m")
|
|
16
|
+
return n * 60 * 1000;
|
|
17
|
+
if (m[2] === "h")
|
|
18
|
+
return n * 60 * 60 * 1000;
|
|
19
|
+
return n * 24 * 60 * 60 * 1000;
|
|
13
20
|
}
|
|
14
21
|
export async function submitCommand(opts) {
|
|
15
22
|
const config = loadConfig();
|
|
@@ -17,7 +24,8 @@ export async function submitCommand(opts) {
|
|
|
17
24
|
console.error(chalk.red("Not registered. Run: trace register"));
|
|
18
25
|
process.exit(1);
|
|
19
26
|
}
|
|
20
|
-
const
|
|
27
|
+
const sinceMs = parseSinceMs(opts.since ?? "30d");
|
|
28
|
+
const sinceDays = sinceMs / (24 * 60 * 60 * 1000);
|
|
21
29
|
const spinner = ora("Discovering sessions...").start();
|
|
22
30
|
const traces = [];
|
|
23
31
|
const errors = [];
|
|
@@ -78,25 +86,33 @@ export async function submitCommand(opts) {
|
|
|
78
86
|
}
|
|
79
87
|
}
|
|
80
88
|
spinner.stop();
|
|
89
|
+
// Filter to specific session if requested
|
|
90
|
+
const filteredTraces = opts.session
|
|
91
|
+
? traces.filter((t) => t.source_session_id.startsWith(opts.session))
|
|
92
|
+
: traces;
|
|
93
|
+
if (opts.session && filteredTraces.length === 0) {
|
|
94
|
+
console.log(chalk.yellow(`No session found matching ID: ${opts.session}`));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
81
97
|
if (errors.length > 0) {
|
|
82
98
|
console.log(chalk.yellow(`\n${errors.length} extraction error(s):`));
|
|
83
99
|
errors.slice(0, 3).forEach((e) => console.log(chalk.gray(` ${e}`)));
|
|
84
100
|
if (errors.length > 3)
|
|
85
101
|
console.log(chalk.gray(` ...and ${errors.length - 3} more`));
|
|
86
102
|
}
|
|
87
|
-
if (
|
|
103
|
+
if (filteredTraces.length === 0) {
|
|
88
104
|
console.log(chalk.yellow("No sessions found in the last " + sinceDays + " days."));
|
|
89
105
|
return;
|
|
90
106
|
}
|
|
91
107
|
// Preview table
|
|
92
|
-
console.log(`\n${chalk.bold("Sessions to submit:")} (${
|
|
108
|
+
console.log(`\n${chalk.bold("Sessions to submit:")} (${filteredTraces.length} total)\n`);
|
|
93
109
|
console.log(chalk.gray(" Tool".padEnd(16) +
|
|
94
110
|
"Session ID".padEnd(20) +
|
|
95
111
|
"Turns".padEnd(8) +
|
|
96
112
|
"Tokens".padEnd(12) +
|
|
97
113
|
"Est. payout"));
|
|
98
114
|
console.log(chalk.gray(" " + "─".repeat(60)));
|
|
99
|
-
for (const t of
|
|
115
|
+
for (const t of filteredTraces.slice(0, 20)) {
|
|
100
116
|
const tokens = (t.total_input_tokens ?? 0) + (t.total_output_tokens ?? 0);
|
|
101
117
|
const estPayout = t.content_fidelity === "full" ? "$0.04" : "$0.02";
|
|
102
118
|
console.log(" " +
|
|
@@ -106,8 +122,8 @@ export async function submitCommand(opts) {
|
|
|
106
122
|
String(tokens || "—").padEnd(12) +
|
|
107
123
|
estPayout);
|
|
108
124
|
}
|
|
109
|
-
if (
|
|
110
|
-
console.log(chalk.gray(` ... and ${
|
|
125
|
+
if (filteredTraces.length > 20) {
|
|
126
|
+
console.log(chalk.gray(` ... and ${filteredTraces.length - 20} more`));
|
|
111
127
|
}
|
|
112
128
|
if (opts.dryRun) {
|
|
113
129
|
console.log(chalk.cyan("\nDry run — nothing submitted."));
|
|
@@ -117,7 +133,7 @@ export async function submitCommand(opts) {
|
|
|
117
133
|
{
|
|
118
134
|
type: "confirm",
|
|
119
135
|
name: "confirm",
|
|
120
|
-
message: `Submit ${
|
|
136
|
+
message: `Submit ${filteredTraces.length} traces to ${config.serverUrl}?`,
|
|
121
137
|
default: true,
|
|
122
138
|
},
|
|
123
139
|
]);
|
|
@@ -130,7 +146,7 @@ export async function submitCommand(opts) {
|
|
|
130
146
|
try {
|
|
131
147
|
const home = homedir();
|
|
132
148
|
const result = (await client.post("/api/v1/traces/batch", {
|
|
133
|
-
traces:
|
|
149
|
+
traces: filteredTraces.map((t) => redactTrace(t, { homeDir: home })),
|
|
134
150
|
source_tool: tools[0] ?? "mixed",
|
|
135
151
|
}));
|
|
136
152
|
uploadSpinner.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/commands/submit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/commands/submit.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -3,7 +3,15 @@ export interface Config {
|
|
|
3
3
|
serverUrl: string;
|
|
4
4
|
email: string;
|
|
5
5
|
}
|
|
6
|
+
export interface SubmitState {
|
|
7
|
+
chunks: Record<string, number>;
|
|
8
|
+
}
|
|
9
|
+
export declare function getConfigDir(): string;
|
|
6
10
|
export declare function getConfigPath(): string;
|
|
11
|
+
export declare function getStatePath(): string;
|
|
7
12
|
export declare function loadConfig(): Config | null;
|
|
8
13
|
export declare function saveConfig(config: Config): void;
|
|
14
|
+
export declare function loadState(): SubmitState;
|
|
15
|
+
export declare function saveState(state: SubmitState): void;
|
|
16
|
+
export declare function stateKey(sourceTool: string, sessionId: string): string;
|
|
9
17
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAQ1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAQ1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/C;AAED,wBAAgB,SAAS,IAAI,WAAW,CAQvC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAGlD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtE"}
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
|
|
2
2
|
import { homedir } from "os";
|
|
3
3
|
import { join } from "path";
|
|
4
|
+
export function getConfigDir() {
|
|
5
|
+
return join(homedir(), ".config", "tracemarketplace");
|
|
6
|
+
}
|
|
4
7
|
export function getConfigPath() {
|
|
5
|
-
return join(
|
|
8
|
+
return join(getConfigDir(), "config.json");
|
|
9
|
+
}
|
|
10
|
+
export function getStatePath() {
|
|
11
|
+
return join(getConfigDir(), "state.json");
|
|
6
12
|
}
|
|
7
13
|
export function loadConfig() {
|
|
8
14
|
const p = getConfigPath();
|
|
@@ -16,8 +22,25 @@ export function loadConfig() {
|
|
|
16
22
|
}
|
|
17
23
|
}
|
|
18
24
|
export function saveConfig(config) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
26
|
+
writeFileSync(getConfigPath(), JSON.stringify(config, null, 2), "utf-8");
|
|
27
|
+
}
|
|
28
|
+
export function loadState() {
|
|
29
|
+
const p = getStatePath();
|
|
30
|
+
if (!existsSync(p))
|
|
31
|
+
return { chunks: {} };
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(readFileSync(p, "utf-8"));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return { chunks: {} };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function saveState(state) {
|
|
40
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
41
|
+
writeFileSync(getStatePath(), JSON.stringify(state, null, 2), "utf-8");
|
|
42
|
+
}
|
|
43
|
+
export function stateKey(sourceTool, sessionId) {
|
|
44
|
+
return `${sourceTool}:${sessionId}`;
|
|
22
45
|
}
|
|
23
46
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAW,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,aAAa,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAgB,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,SAAiB;IAC5D,OAAO,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC;AACtC,CAAC"}
|
package/dist/submitter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submitter.d.ts","sourceRoot":"","sources":["../src/submitter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"submitter.d.ts","sourceRoot":"","sources":["../src/submitter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,aAAa,GAAG,WAAW,EACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAQvB"}
|
package/dist/submitter.js
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { readFile } from "fs/promises";
|
|
6
6
|
import { homedir } from "os";
|
|
7
|
-
import { extractClaudeCode, extractCodex, extractCursor, redactTrace } from "@tracemarketplace/shared";
|
|
7
|
+
import { extractClaudeCode, extractCodex, extractCursor, redactTrace, chunkTrace } from "@tracemarketplace/shared";
|
|
8
8
|
import { ApiClient } from "./api-client.js";
|
|
9
9
|
import { CURSOR_DB_PATH } from "./sessions.js";
|
|
10
|
+
import { loadState, saveState, stateKey } from "./config.js";
|
|
10
11
|
/**
|
|
11
12
|
* Extract a claude_code or codex_cli session from a file path and submit it.
|
|
12
13
|
*/
|
|
@@ -43,20 +44,34 @@ export async function submitCursorSession(sessionId, config) {
|
|
|
43
44
|
return submitTrace(trace, config);
|
|
44
45
|
}
|
|
45
46
|
async function submitTrace(trace, config) {
|
|
46
|
-
const
|
|
47
|
+
const state = loadState();
|
|
48
|
+
const key = stateKey(trace.source_tool, trace.source_session_id);
|
|
49
|
+
const lastSubmittedChunk = state.chunks[key] ?? -1;
|
|
50
|
+
// Chunk the session and only send new chunks
|
|
51
|
+
const chunks = chunkTrace(trace);
|
|
52
|
+
const newChunks = chunks.filter((c) => (c.chunk_index ?? 0) > lastSubmittedChunk);
|
|
53
|
+
if (newChunks.length === 0) {
|
|
54
|
+
return { accepted: false, superseded: false, duplicate: true, turnCount: trace.turn_count, payoutCents: 0, traceId: null };
|
|
55
|
+
}
|
|
56
|
+
const home = homedir();
|
|
47
57
|
const client = new ApiClient(config.serverUrl, config.apiKey);
|
|
48
58
|
try {
|
|
49
59
|
const result = await client.post("/api/v1/traces/batch", {
|
|
50
|
-
traces:
|
|
60
|
+
traces: newChunks.map((c) => redactTrace(c, { homeDir: home })),
|
|
51
61
|
source_tool: trace.source_tool,
|
|
52
62
|
});
|
|
63
|
+
// Persist the highest chunk index we successfully submitted
|
|
64
|
+
const maxChunk = Math.max(...newChunks.map((c) => c.chunk_index ?? 0));
|
|
65
|
+
state.chunks[key] = maxChunk;
|
|
66
|
+
saveState(state);
|
|
67
|
+
const totalPayout = result.traces?.reduce((s, t) => s + (t.payout_cents ?? 0), 0) ?? 0;
|
|
53
68
|
const first = result.traces?.[0];
|
|
54
69
|
return {
|
|
55
70
|
accepted: result.accepted > 0,
|
|
56
|
-
superseded:
|
|
57
|
-
duplicate: result.duplicate > 0,
|
|
58
|
-
turnCount:
|
|
59
|
-
payoutCents:
|
|
71
|
+
superseded: false,
|
|
72
|
+
duplicate: result.duplicate > 0 && result.accepted === 0,
|
|
73
|
+
turnCount: trace.turn_count,
|
|
74
|
+
payoutCents: totalPayout,
|
|
60
75
|
traceId: first?.trace_id ?? null,
|
|
61
76
|
};
|
|
62
77
|
}
|
package/dist/submitter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submitter.js","sourceRoot":"","sources":["../src/submitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"submitter.js","sourceRoot":"","sources":["../src/submitter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -35,11 +35,13 @@ program
|
|
|
35
35
|
.command("submit")
|
|
36
36
|
.description("Auto-detect and submit traces from Claude Code, Codex CLI, and Cursor")
|
|
37
37
|
.option("--tool <tool>", "Only submit from specific tool (claude-code|codex|cursor)")
|
|
38
|
+
.option("--session <id>", "Only submit a specific session ID")
|
|
38
39
|
.option("--dry-run", "Preview without submitting")
|
|
39
40
|
.option("--since <duration>", "Only include sessions from last N days (e.g. 30d)", "30d")
|
|
40
41
|
.action((opts) =>
|
|
41
42
|
submitCommand({
|
|
42
43
|
tool: opts.tool,
|
|
44
|
+
session: opts.session,
|
|
43
45
|
dryRun: opts.dryRun,
|
|
44
46
|
since: opts.since,
|
|
45
47
|
}).catch(handleError)
|
package/src/commands/submit.ts
CHANGED
|
@@ -12,13 +12,18 @@ import type { NormalizedTrace } from "@tracemarketplace/shared";
|
|
|
12
12
|
|
|
13
13
|
interface SubmitOptions {
|
|
14
14
|
tool?: string;
|
|
15
|
+
session?: string;
|
|
15
16
|
dryRun?: boolean;
|
|
16
17
|
since?: string;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
function
|
|
20
|
-
const
|
|
21
|
-
return
|
|
20
|
+
function parseSinceMs(since: string): number {
|
|
21
|
+
const m = since.match(/^(\d+)(m|h|d)$/);
|
|
22
|
+
if (!m) return 30 * 24 * 60 * 60 * 1000;
|
|
23
|
+
const n = parseInt(m[1], 10);
|
|
24
|
+
if (m[2] === "m") return n * 60 * 1000;
|
|
25
|
+
if (m[2] === "h") return n * 60 * 60 * 1000;
|
|
26
|
+
return n * 24 * 60 * 60 * 1000;
|
|
22
27
|
}
|
|
23
28
|
|
|
24
29
|
export async function submitCommand(opts: SubmitOptions): Promise<void> {
|
|
@@ -28,7 +33,8 @@ export async function submitCommand(opts: SubmitOptions): Promise<void> {
|
|
|
28
33
|
process.exit(1);
|
|
29
34
|
}
|
|
30
35
|
|
|
31
|
-
const
|
|
36
|
+
const sinceMs = parseSinceMs(opts.since ?? "30d");
|
|
37
|
+
const sinceDays = sinceMs / (24 * 60 * 60 * 1000);
|
|
32
38
|
const spinner = ora("Discovering sessions...").start();
|
|
33
39
|
|
|
34
40
|
const traces: NormalizedTrace[] = [];
|
|
@@ -91,19 +97,29 @@ export async function submitCommand(opts: SubmitOptions): Promise<void> {
|
|
|
91
97
|
|
|
92
98
|
spinner.stop();
|
|
93
99
|
|
|
100
|
+
// Filter to specific session if requested
|
|
101
|
+
const filteredTraces = opts.session
|
|
102
|
+
? traces.filter((t) => t.source_session_id.startsWith(opts.session!))
|
|
103
|
+
: traces;
|
|
104
|
+
|
|
105
|
+
if (opts.session && filteredTraces.length === 0) {
|
|
106
|
+
console.log(chalk.yellow(`No session found matching ID: ${opts.session}`));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
94
110
|
if (errors.length > 0) {
|
|
95
111
|
console.log(chalk.yellow(`\n${errors.length} extraction error(s):`));
|
|
96
112
|
errors.slice(0, 3).forEach((e) => console.log(chalk.gray(` ${e}`)));
|
|
97
113
|
if (errors.length > 3) console.log(chalk.gray(` ...and ${errors.length - 3} more`));
|
|
98
114
|
}
|
|
99
115
|
|
|
100
|
-
if (
|
|
116
|
+
if (filteredTraces.length === 0) {
|
|
101
117
|
console.log(chalk.yellow("No sessions found in the last " + sinceDays + " days."));
|
|
102
118
|
return;
|
|
103
119
|
}
|
|
104
120
|
|
|
105
121
|
// Preview table
|
|
106
|
-
console.log(`\n${chalk.bold("Sessions to submit:")} (${
|
|
122
|
+
console.log(`\n${chalk.bold("Sessions to submit:")} (${filteredTraces.length} total)\n`);
|
|
107
123
|
console.log(
|
|
108
124
|
chalk.gray(
|
|
109
125
|
" Tool".padEnd(16) +
|
|
@@ -115,7 +131,7 @@ export async function submitCommand(opts: SubmitOptions): Promise<void> {
|
|
|
115
131
|
);
|
|
116
132
|
console.log(chalk.gray(" " + "─".repeat(60)));
|
|
117
133
|
|
|
118
|
-
for (const t of
|
|
134
|
+
for (const t of filteredTraces.slice(0, 20)) {
|
|
119
135
|
const tokens = (t.total_input_tokens ?? 0) + (t.total_output_tokens ?? 0);
|
|
120
136
|
const estPayout = t.content_fidelity === "full" ? "$0.04" : "$0.02";
|
|
121
137
|
console.log(
|
|
@@ -127,8 +143,8 @@ export async function submitCommand(opts: SubmitOptions): Promise<void> {
|
|
|
127
143
|
estPayout
|
|
128
144
|
);
|
|
129
145
|
}
|
|
130
|
-
if (
|
|
131
|
-
console.log(chalk.gray(` ... and ${
|
|
146
|
+
if (filteredTraces.length > 20) {
|
|
147
|
+
console.log(chalk.gray(` ... and ${filteredTraces.length - 20} more`));
|
|
132
148
|
}
|
|
133
149
|
|
|
134
150
|
if (opts.dryRun) {
|
|
@@ -140,7 +156,7 @@ export async function submitCommand(opts: SubmitOptions): Promise<void> {
|
|
|
140
156
|
{
|
|
141
157
|
type: "confirm",
|
|
142
158
|
name: "confirm",
|
|
143
|
-
message: `Submit ${
|
|
159
|
+
message: `Submit ${filteredTraces.length} traces to ${config.serverUrl}?`,
|
|
144
160
|
default: true,
|
|
145
161
|
},
|
|
146
162
|
]);
|
|
@@ -156,7 +172,7 @@ export async function submitCommand(opts: SubmitOptions): Promise<void> {
|
|
|
156
172
|
try {
|
|
157
173
|
const home = homedir();
|
|
158
174
|
const result = (await client.post("/api/v1/traces/batch", {
|
|
159
|
-
traces:
|
|
175
|
+
traces: filteredTraces.map((t) => redactTrace(t, { homeDir: home })),
|
|
160
176
|
source_tool: tools[0] ?? "mixed",
|
|
161
177
|
})) as {
|
|
162
178
|
submission_id: string;
|
package/src/config.ts
CHANGED
|
@@ -8,8 +8,22 @@ export interface Config {
|
|
|
8
8
|
email: string;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
// Tracks which chunks of each session have been submitted.
|
|
12
|
+
// Key: "<source_tool>:<source_session_id>", value: highest chunk_index submitted.
|
|
13
|
+
export interface SubmitState {
|
|
14
|
+
chunks: Record<string, number>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function getConfigDir(): string {
|
|
18
|
+
return join(homedir(), ".config", "tracemarketplace");
|
|
19
|
+
}
|
|
20
|
+
|
|
11
21
|
export function getConfigPath(): string {
|
|
12
|
-
return join(
|
|
22
|
+
return join(getConfigDir(), "config.json");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function getStatePath(): string {
|
|
26
|
+
return join(getConfigDir(), "state.json");
|
|
13
27
|
}
|
|
14
28
|
|
|
15
29
|
export function loadConfig(): Config | null {
|
|
@@ -23,7 +37,25 @@ export function loadConfig(): Config | null {
|
|
|
23
37
|
}
|
|
24
38
|
|
|
25
39
|
export function saveConfig(config: Config): void {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
40
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
41
|
+
writeFileSync(getConfigPath(), JSON.stringify(config, null, 2), "utf-8");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function loadState(): SubmitState {
|
|
45
|
+
const p = getStatePath();
|
|
46
|
+
if (!existsSync(p)) return { chunks: {} };
|
|
47
|
+
try {
|
|
48
|
+
return JSON.parse(readFileSync(p, "utf-8")) as SubmitState;
|
|
49
|
+
} catch {
|
|
50
|
+
return { chunks: {} };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function saveState(state: SubmitState): void {
|
|
55
|
+
mkdirSync(getConfigDir(), { recursive: true });
|
|
56
|
+
writeFileSync(getStatePath(), JSON.stringify(state, null, 2), "utf-8");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function stateKey(sourceTool: string, sessionId: string): string {
|
|
60
|
+
return `${sourceTool}:${sessionId}`;
|
|
29
61
|
}
|
package/src/submitter.ts
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { readFile } from "fs/promises";
|
|
6
6
|
import { homedir } from "os";
|
|
7
|
-
import { extractClaudeCode, extractCodex, extractCursor, redactTrace } from "@tracemarketplace/shared";
|
|
7
|
+
import { extractClaudeCode, extractCodex, extractCursor, redactTrace, chunkTrace, type NormalizedTrace } from "@tracemarketplace/shared";
|
|
8
8
|
import { ApiClient } from "./api-client.js";
|
|
9
9
|
import { CURSOR_DB_PATH } from "./sessions.js";
|
|
10
|
+
import { loadState, saveState, stateKey } from "./config.js";
|
|
10
11
|
import type { Config } from "./config.js";
|
|
11
12
|
|
|
12
13
|
export interface SubmitResult {
|
|
@@ -63,26 +64,44 @@ export async function submitCursorSession(
|
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
async function submitTrace(trace: Awaited<ReturnType<typeof extractClaudeCode>>, config: Config): Promise<SubmitResult> {
|
|
66
|
-
const
|
|
67
|
+
const state = loadState();
|
|
68
|
+
const key = stateKey(trace.source_tool, trace.source_session_id);
|
|
69
|
+
const lastSubmittedChunk = state.chunks[key] ?? -1;
|
|
70
|
+
|
|
71
|
+
// Chunk the session and only send new chunks
|
|
72
|
+
const chunks = chunkTrace(trace);
|
|
73
|
+
const newChunks = chunks.filter((c) => (c.chunk_index ?? 0) > lastSubmittedChunk);
|
|
74
|
+
|
|
75
|
+
if (newChunks.length === 0) {
|
|
76
|
+
return { accepted: false, superseded: false, duplicate: true, turnCount: trace.turn_count, payoutCents: 0, traceId: null };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const home = homedir();
|
|
67
80
|
const client = new ApiClient(config.serverUrl, config.apiKey);
|
|
81
|
+
|
|
68
82
|
try {
|
|
69
83
|
const result = await client.post("/api/v1/traces/batch", {
|
|
70
|
-
traces:
|
|
84
|
+
traces: newChunks.map((c) => redactTrace(c, { homeDir: home })),
|
|
71
85
|
source_tool: trace.source_tool,
|
|
72
86
|
}) as {
|
|
73
87
|
accepted: number;
|
|
74
88
|
duplicate: number;
|
|
75
|
-
superseded: number;
|
|
76
89
|
traces: Array<{ trace_id?: string; payout_cents?: number }>;
|
|
77
90
|
};
|
|
78
91
|
|
|
92
|
+
// Persist the highest chunk index we successfully submitted
|
|
93
|
+
const maxChunk = Math.max(...newChunks.map((c) => c.chunk_index ?? 0));
|
|
94
|
+
state.chunks[key] = maxChunk;
|
|
95
|
+
saveState(state);
|
|
96
|
+
|
|
97
|
+
const totalPayout = result.traces?.reduce((s, t) => s + (t.payout_cents ?? 0), 0) ?? 0;
|
|
79
98
|
const first = result.traces?.[0];
|
|
80
99
|
return {
|
|
81
100
|
accepted: result.accepted > 0,
|
|
82
|
-
superseded:
|
|
83
|
-
duplicate: result.duplicate > 0,
|
|
84
|
-
turnCount:
|
|
85
|
-
payoutCents:
|
|
101
|
+
superseded: false,
|
|
102
|
+
duplicate: result.duplicate > 0 && result.accepted === 0,
|
|
103
|
+
turnCount: trace.turn_count,
|
|
104
|
+
payoutCents: totalPayout,
|
|
86
105
|
traceId: first?.trace_id ?? null,
|
|
87
106
|
};
|
|
88
107
|
} catch (err) {
|