coolhand-cli 0.4.0 → 0.5.1

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 (36) hide show
  1. package/README.md +38 -14
  2. package/dist/api/last-sync.d.ts +16 -0
  3. package/dist/api/last-sync.d.ts.map +1 -0
  4. package/dist/api/last-sync.js +73 -0
  5. package/dist/api/last-sync.js.map +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +21 -7
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/analyze-claude-sessions.d.ts +3 -0
  10. package/dist/commands/analyze-claude-sessions.d.ts.map +1 -0
  11. package/dist/commands/analyze-claude-sessions.js +186 -0
  12. package/dist/commands/analyze-claude-sessions.js.map +1 -0
  13. package/dist/commands/claude.d.ts +14 -0
  14. package/dist/commands/claude.d.ts.map +1 -0
  15. package/dist/commands/claude.js +84 -0
  16. package/dist/commands/claude.js.map +1 -0
  17. package/dist/log-request.d.ts +1 -1
  18. package/dist/log-request.js +1 -1
  19. package/dist/sessions/capture-state.d.ts +27 -8
  20. package/dist/sessions/capture-state.d.ts.map +1 -1
  21. package/dist/sessions/capture-state.js +63 -13
  22. package/dist/sessions/capture-state.js.map +1 -1
  23. package/dist/sessions/claude-scanner.d.ts +12 -0
  24. package/dist/sessions/claude-scanner.d.ts.map +1 -1
  25. package/dist/sessions/claude-scanner.js +29 -4
  26. package/dist/sessions/claude-scanner.js.map +1 -1
  27. package/dist/sessions/cowork-scanner.d.ts +20 -0
  28. package/dist/sessions/cowork-scanner.d.ts.map +1 -0
  29. package/dist/sessions/cowork-scanner.js +76 -0
  30. package/dist/sessions/cowork-scanner.js.map +1 -0
  31. package/dist/types.d.ts +5 -1
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/types.js.map +1 -1
  34. package/dist/version.d.ts +2 -2
  35. package/dist/version.js +1 -1
  36. package/package.json +7 -3
@@ -0,0 +1,84 @@
1
+ import { spawn } from 'child_process';
2
+ import { createRequire } from 'module';
3
+ import { realpathSync } from 'fs';
4
+ import { ExitCode, CliError } from '../errors.js';
5
+ import { logger, redact } from '../logger.js';
6
+ import { loadConfig, getClient } from '../config.js';
7
+ import { DEFAULT_BASE_URL } from '../types.js';
8
+ /**
9
+ * Locate the coolhand-proxy CLI (`dist/cli.js`, which hosts the `wrap` command).
10
+ * coolhand-proxy ships dist/ and declares no `exports` restriction, so deep
11
+ * subpath resolution works. We resolve a file path and later run it with `node`
12
+ * rather than via the `.bin` shim, which avoids the Windows `.bin` ENOENT gotcha.
13
+ */
14
+ function defaultResolveProxyCli() {
15
+ // Anchor resolution at the real path of the running CLI entry (dist/bin.js),
16
+ // following any global-install symlink, so we resolve coolhand-proxy from this
17
+ // package's node_modules. Avoids `import.meta` (keeps the ts-jest build happy).
18
+ const anchor = realpathSync(process.argv[1] ?? process.cwd());
19
+ const require = createRequire(anchor);
20
+ return require.resolve('coolhand-proxy/dist/cli.js');
21
+ }
22
+ /**
23
+ * Build the full ingest endpoint the proxy should post to for a given client.
24
+ * The proxy's `--api-endpoint` wants the full path; the CLI stores only the
25
+ * site base_url, so append the ingest path. Returns undefined for the default
26
+ * base_url (the proxy already targets the right endpoint).
27
+ */
28
+ function endpointForBaseUrl(baseUrl) {
29
+ if (!baseUrl || baseUrl === DEFAULT_BASE_URL) {
30
+ return undefined;
31
+ }
32
+ return `${baseUrl.replace(/\/+$/, '')}/api/v2/llm_request_logs`;
33
+ }
34
+ /**
35
+ * `coolhand claude [args...]` — run the Claude CLI behind the Coolhand proxy with
36
+ * the stored API key filled in. Shells out to `coolhand-proxy wrap -- claude ...`
37
+ * so the proxy's battle-tested wrap behavior is reused, not duplicated.
38
+ */
39
+ export async function run(opts, deps = {}) {
40
+ const spawnFn = deps.spawnFn ?? spawn;
41
+ const resolveProxyCli = deps.resolveProxyCli ?? defaultResolveProxyCli;
42
+ try {
43
+ const cfg = await loadConfig();
44
+ const entry = getClient(cfg, opts.clientId);
45
+ if (!entry) {
46
+ throw new CliError('NOT_CONFIGURED', 'No Coolhand account configured. Run `coolhand login` first.');
47
+ }
48
+ let proxyCli;
49
+ try {
50
+ proxyCli = resolveProxyCli();
51
+ }
52
+ catch {
53
+ logger.info('Error: could not locate the coolhand-proxy dependency. Try reinstalling coolhand-cli.');
54
+ return ExitCode.INTERNAL;
55
+ }
56
+ const wrapArgs = ['wrap', '--silent'];
57
+ const endpoint = endpointForBaseUrl(entry.base_url);
58
+ if (endpoint) {
59
+ wrapArgs.push('--api-endpoint', endpoint);
60
+ }
61
+ wrapArgs.push('--', 'claude', ...opts.args);
62
+ return await new Promise((resolve) => {
63
+ const child = spawnFn(process.execPath, [proxyCli, ...wrapArgs], {
64
+ stdio: 'inherit',
65
+ env: { ...process.env, COOLHAND_API_KEY: entry.api_key },
66
+ });
67
+ child.on('error', (err) => {
68
+ logger.info(`Error: failed to start coolhand-proxy: ${redact(err.message)}`);
69
+ resolve(ExitCode.INTERNAL);
70
+ });
71
+ child.on('close', (code) => {
72
+ resolve(code ?? ExitCode.INTERNAL);
73
+ });
74
+ });
75
+ }
76
+ catch (err) {
77
+ if (err instanceof CliError) {
78
+ logger.info(`Error: ${redact(err.message)} [${err.code}]`);
79
+ return err.exitCode;
80
+ }
81
+ throw err;
82
+ }
83
+ }
84
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/commands/claude.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * deduplicates by the envelope's `response_body.id`, so re-submitting the same turn is harmless.
7
7
  *
8
8
  * The SDK swallows submission failures and returns `null`; we translate that (and a base_url
9
- * rejection from the SDK constructor) back into a `CliError` so `capture-sessions` keeps its
9
+ * rejection from the SDK constructor) back into a `CliError` so `analyze-claude-sessions` keeps its
10
10
  * per-session success/failure accounting intact.
11
11
  */
12
12
  export declare function logRequest(rawRequest: unknown, opts?: {
@@ -12,7 +12,7 @@ const COLLECTOR = 'coolhand-cli/claude-code';
12
12
  * deduplicates by the envelope's `response_body.id`, so re-submitting the same turn is harmless.
13
13
  *
14
14
  * The SDK swallows submission failures and returns `null`; we translate that (and a base_url
15
- * rejection from the SDK constructor) back into a `CliError` so `capture-sessions` keeps its
15
+ * rejection from the SDK constructor) back into a `CliError` so `analyze-claude-sessions` keeps its
16
16
  * per-session success/failure accounting intact.
17
17
  */
18
18
  export async function logRequest(rawRequest, opts = {}) {
@@ -1,20 +1,39 @@
1
1
  /**
2
- * Local record of which Claude Code sessions have already been submitted, so re-running
3
- * `capture-sessions` does not resend (and therefore re-create) a session the server already stored.
2
+ * Local record of how much of each Claude Code session has already been submitted, so re-running
3
+ * `analyze-claude-sessions` does not resend a session unchanged — but DOES resend one whose transcript has
4
+ * grown with new turns since last time.
4
5
  *
5
6
  * The server cannot deduplicate these logs itself (its dedup runs before a log is classified, and
6
- * matched logs are never re-checked), so the tool keeps this list and skips sessions already sent.
7
+ * matched logs are never re-checked), so the tool keeps this record and decides what to (re)send.
7
8
  * Keyed per client id, since the same session may legitimately be submitted to more than one client.
9
+ *
10
+ * We store a turn COUNT per session (not a yes/no flag): a chat transcript keeps growing, so a
11
+ * boolean "already submitted?" silently drops later turns. Comparing the current turn count against
12
+ * `turnsSubmitted` is what lets a grown session be re-submitted.
8
13
  */
14
+ export interface SubmittedSession {
15
+ /** Number of assistant turns submitted the last time this session was sent. */
16
+ turnsSubmitted: number;
17
+ }
9
18
  export interface CaptureState {
10
19
  version: number;
11
- submitted: Record<string, string[]>;
20
+ /** ISO timestamp of the last Claude Code session sync; mtime cutoff for ~/.claude/projects. */
21
+ lastSyncAt?: string;
22
+ /** ISO timestamp of the last Cowork session sync; mtime cutoff for local-agent-mode-sessions. */
23
+ coworkLastSyncAt?: string;
24
+ submitted: Record<string, Record<string, SubmittedSession>>;
12
25
  }
13
26
  export declare function captureStatePath(): string;
27
+ /**
28
+ * Sentinel stored for sessions migrated from v1 (where only a boolean "submitted?" was tracked).
29
+ * `run()` treats this as "already submitted, turn count unknown" — it records the actual count
30
+ * without re-submitting, so subsequent runs can detect growth correctly.
31
+ */
32
+ export declare const V1_MIGRATION_SENTINEL = -1;
14
33
  export declare function loadCaptureState(): Promise<CaptureState>;
15
- /** True if this session id has already been submitted for this client. */
16
- export declare function isSubmitted(state: CaptureState, clientId: string, sessionId: string): boolean;
17
- /** Record a session as submitted for this client (idempotent — no duplicate ids stored). */
18
- export declare function markSubmitted(state: CaptureState, clientId: string, sessionId: string): void;
34
+ /** Turns already submitted for this session/client, or 0 if it has never been submitted. */
35
+ export declare function getTurnsSubmitted(state: CaptureState, clientId: string, sessionId: string): number;
36
+ /** Record that `turns` turns of this session have now been submitted for this client. */
37
+ export declare function recordSubmission(state: CaptureState, clientId: string, sessionId: string, turns: number): void;
19
38
  export declare function saveCaptureState(state: CaptureState): Promise<void>;
20
39
  //# sourceMappingURL=capture-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture-state.d.ts","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAMD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAuB9D;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAG7F;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAK5F;AAWD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBzE"}
1
+ {"version":3,"file":"capture-state.d.ts","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CAC7D;AAQD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAMD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AA6CxC,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAyB9D;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAElG;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,IAAI,CAGN;AAWD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBzE"}
@@ -3,6 +3,7 @@ import * as path from 'path';
3
3
  import { randomBytes } from 'crypto';
4
4
  import { configDir } from '../config.js';
5
5
  import { CliError } from '../errors.js';
6
+ const STATE_VERSION = 2;
6
7
  const STATE_FILENAME = 'capture-state.json';
7
8
  const DIR_MODE = 0o700;
8
9
  const FILE_MODE = 0o600;
@@ -10,7 +11,57 @@ export function captureStatePath() {
10
11
  return path.join(configDir(), STATE_FILENAME);
11
12
  }
12
13
  function emptyState() {
13
- return { version: 1, submitted: {} };
14
+ return { version: STATE_VERSION, submitted: {} };
15
+ }
16
+ /**
17
+ * Sentinel stored for sessions migrated from v1 (where only a boolean "submitted?" was tracked).
18
+ * `run()` treats this as "already submitted, turn count unknown" — it records the actual count
19
+ * without re-submitting, so subsequent runs can detect growth correctly.
20
+ */
21
+ export const V1_MIGRATION_SENTINEL = -1;
22
+ /** Read a turn count defensively (hand-edited files may hold garbage). */
23
+ function toTurnCount(value) {
24
+ // Allow the migration sentinel (-1) through; reject everything else outside [0, ∞).
25
+ if (value === V1_MIGRATION_SENTINEL) {
26
+ return V1_MIGRATION_SENTINEL;
27
+ }
28
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : 0;
29
+ }
30
+ /**
31
+ * Normalize the on-disk `submitted` map into the v2 shape, migrating v1 as we go.
32
+ *
33
+ * v1 stored `clientId -> sessionId[]` (a yes/no list). v2 stores
34
+ * `clientId -> { sessionId: { turnsSubmitted } }`. Migrating a v1 entry sets `turnsSubmitted`
35
+ * to `V1_MIGRATION_SENTINEL` (-1). On the first v2 run, `run()` treats the sentinel as unchanged —
36
+ * it records the actual current turn count without re-submitting, so previously-submitted sessions
37
+ * are not duplicated on the server.
38
+ */
39
+ function normalizeSubmitted(raw) {
40
+ if (!raw || typeof raw !== 'object') {
41
+ return {};
42
+ }
43
+ const out = {};
44
+ for (const [clientId, value] of Object.entries(raw)) {
45
+ const sessions = {};
46
+ if (Array.isArray(value)) {
47
+ // v1: a plain list of session ids. Use the migration sentinel so run() can learn the real
48
+ // turn count on the next scan without re-submitting sessions the server already holds.
49
+ for (const sessionId of value) {
50
+ if (typeof sessionId === 'string') {
51
+ sessions[sessionId] = { turnsSubmitted: V1_MIGRATION_SENTINEL };
52
+ }
53
+ }
54
+ }
55
+ else if (value && typeof value === 'object') {
56
+ // v2: a map of session id → { turnsSubmitted }.
57
+ for (const [sessionId, entry] of Object.entries(value)) {
58
+ const turns = entry?.turnsSubmitted;
59
+ sessions[sessionId] = { turnsSubmitted: toTurnCount(turns) };
60
+ }
61
+ }
62
+ out[clientId] = sessions;
63
+ }
64
+ return out;
14
65
  }
15
66
  export async function loadCaptureState() {
16
67
  const filePath = captureStatePath();
@@ -27,25 +78,24 @@ export async function loadCaptureState() {
27
78
  try {
28
79
  const parsed = JSON.parse(raw);
29
80
  return {
30
- version: 1,
31
- submitted: parsed.submitted ?? {},
81
+ version: STATE_VERSION,
82
+ lastSyncAt: typeof parsed.lastSyncAt === 'string' ? parsed.lastSyncAt : undefined,
83
+ coworkLastSyncAt: typeof parsed.coworkLastSyncAt === 'string' ? parsed.coworkLastSyncAt : undefined,
84
+ submitted: normalizeSubmitted(parsed.submitted),
32
85
  };
33
86
  }
34
87
  catch (err) {
35
88
  throw new CliError('CONFIG_READ_FAILED', `Capture state at ${filePath} is not valid JSON: ${err.message}`);
36
89
  }
37
90
  }
38
- /** True if this session id has already been submitted for this client. */
39
- export function isSubmitted(state, clientId, sessionId) {
40
- const list = state.submitted[clientId];
41
- return Array.isArray(list) && list.includes(sessionId);
91
+ /** Turns already submitted for this session/client, or 0 if it has never been submitted. */
92
+ export function getTurnsSubmitted(state, clientId, sessionId) {
93
+ return state.submitted[clientId]?.[sessionId]?.turnsSubmitted ?? 0;
42
94
  }
43
- /** Record a session as submitted for this client (idempotent — no duplicate ids stored). */
44
- export function markSubmitted(state, clientId, sessionId) {
45
- const list = state.submitted[clientId] ?? (state.submitted[clientId] = []);
46
- if (!list.includes(sessionId)) {
47
- list.push(sessionId);
48
- }
95
+ /** Record that `turns` turns of this session have now been submitted for this client. */
96
+ export function recordSubmission(state, clientId, sessionId, turns) {
97
+ const sessions = state.submitted[clientId] ?? (state.submitted[clientId] = {});
98
+ sessions[sessionId] = { turnsSubmitted: turns };
49
99
  }
50
100
  async function ensureDir(dir) {
51
101
  await fs.mkdir(dir, { recursive: true, mode: DIR_MODE });
@@ -1 +1 @@
1
- {"version":3,"file":"capture-state.js","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture-state.js","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AA6BxC,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,CAAC;AAExC,0EAA0E;AAC1E,SAAS,WAAW,CAAC,KAAc;IACjC,oFAAoF;IACpF,IAAI,KAAK,KAAK,qBAAqB,EAAE,CAAC;QAAC,OAAO,qBAAqB,CAAC;IAAC,CAAC;IACtE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,GAAY;IACtC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAqD,EAAE,CAAC;IACjE,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QAC/E,MAAM,QAAQ,GAAqC,EAAE,CAAC;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,0FAA0F;YAC1F,uFAAuF;YACvF,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;gBAC9B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAClC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,qBAAqB,EAAE,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9C,gDAAgD;YAChD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;gBAClF,MAAM,KAAK,GAAI,KAAsC,EAAE,cAAc,CAAC;gBACtE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,UAAU,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,kBAAkB,QAAQ,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoD,CAAC;QAClF,OAAO;YACL,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACjF,gBAAgB,EAAE,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;YACnG,SAAS,EAAE,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;SAChD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAChB,oBAAoB,EACpB,oBAAoB,QAAQ,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,QAAgB,EAAE,SAAiB;IACxF,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,cAAc,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,QAAgB,EAChB,SAAiB,EACjB,KAAa;IAEb,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAmB;IACxD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpG,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,mBAAmB,QAAQ,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
@@ -26,10 +26,17 @@ export interface CaptureEnvelope {
26
26
  content: unknown;
27
27
  usage?: unknown;
28
28
  };
29
+ /** Number of assistant turns in this session — compared against state to detect growth. */
30
+ turnCount: number;
29
31
  }
30
32
  export interface ScanResult {
31
33
  envelopes: CaptureEnvelope[];
32
34
  sessionCount: number;
35
+ /** False when the scan directory could not be read and the error was swallowed. The caller must
36
+ * not advance its mtime cutoff in this case — doing so would permanently hide pre-existing files
37
+ * whose mtimes predate the new cutoff, since the turn-count guard never sees them if they are
38
+ * never read. */
39
+ ok: boolean;
33
40
  }
34
41
  export declare function defaultProjectsDir(): string;
35
42
  /**
@@ -41,9 +48,14 @@ export declare function parseTranscript(content: string, sessionId: string): Cap
41
48
  /**
42
49
  * Find every Claude Code transcript under `projectsDir` (default `~/.claude/projects`) and build one
43
50
  * conversation envelope per session. A missing directory simply yields zero sessions.
51
+ *
52
+ * When `sinceTime` is given, files whose last-modified time is older than it are skipped entirely
53
+ * (not even read) — they cannot have grown since the last sync. `sessionCount` therefore counts only
54
+ * the files actually examined this run, so it reflects the work done rather than the whole corpus.
44
55
  */
45
56
  export declare function scanSessions(options?: {
46
57
  projectsDir?: string;
58
+ sinceTime?: Date;
47
59
  }): Promise<ScanResult>;
48
60
  /** The session id this envelope represents — used as the local dedup key. */
49
61
  export declare function sessionIdOf(envelope: CaptureEnvelope): string;
@@ -1 +1 @@
1
- {"version":3,"file":"claude-scanner.d.ts","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"AAIA,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,mBAAmB,EAAE,CAAC;KACjC,CAAC;IACF,aAAa,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAgCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA0F1F;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAkC9F;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAE7D"}
1
+ {"version":3,"file":"claude-scanner.d.ts","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"AAIA,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,mBAAmB,EAAE,CAAC;KACjC,CAAC;IACF,aAAa,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,2FAA2F;IAC3F,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB;;;sBAGkB;IAClB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAgCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA6F1F;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAO,GACvD,OAAO,CAAC,UAAU,CAAC,CAoDrB;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAG7D"}
@@ -34,6 +34,7 @@ export function parseTranscript(content, sessionId) {
34
34
  let sawUsage = false;
35
35
  let sessionModel;
36
36
  let lastAssistant = null;
37
+ let turnCount = 0;
37
38
  for (const line of content.split('\n')) {
38
39
  const trimmed = line.trim();
39
40
  if (!trimmed) {
@@ -68,6 +69,7 @@ export function parseTranscript(content, sessionId) {
68
69
  ? message.id
69
70
  : undefined;
70
71
  messages.push({ role: 'assistant', content: extractText(message.content) });
72
+ turnCount += 1;
71
73
  const model = typeof message.model === 'string' ? message.model : undefined;
72
74
  if (model) {
73
75
  sessionModel = model;
@@ -106,21 +108,27 @@ export function parseTranscript(content, sessionId) {
106
108
  content: lastAssistant.content,
107
109
  usage: sawUsage ? usage : undefined,
108
110
  },
111
+ turnCount,
109
112
  };
110
113
  }
111
114
  /**
112
115
  * Find every Claude Code transcript under `projectsDir` (default `~/.claude/projects`) and build one
113
116
  * conversation envelope per session. A missing directory simply yields zero sessions.
117
+ *
118
+ * When `sinceTime` is given, files whose last-modified time is older than it are skipped entirely
119
+ * (not even read) — they cannot have grown since the last sync. `sessionCount` therefore counts only
120
+ * the files actually examined this run, so it reflects the work done rather than the whole corpus.
114
121
  */
115
122
  export async function scanSessions(options = {}) {
116
123
  const dir = options.projectsDir ?? defaultProjectsDir();
124
+ const sinceMs = options.sinceTime?.getTime();
117
125
  let names;
118
126
  try {
119
127
  names = await fs.readdir(dir, { recursive: true });
120
128
  }
121
129
  catch (err) {
122
130
  if (err.code === 'ENOENT') {
123
- return { envelopes: [], sessionCount: 0 };
131
+ return { envelopes: [], sessionCount: 0, ok: true };
124
132
  }
125
133
  throw err;
126
134
  }
@@ -128,9 +136,25 @@ export async function scanSessions(options = {}) {
128
136
  const envelopes = [];
129
137
  let sessionCount = 0;
130
138
  for (const relativePath of files) {
139
+ const fullPath = path.join(dir, relativePath);
140
+ if (sinceMs !== undefined) {
141
+ let stat;
142
+ try {
143
+ stat = await fs.stat(fullPath);
144
+ }
145
+ catch {
146
+ // Unreadable transcript — skip it rather than failing the whole scan.
147
+ continue;
148
+ }
149
+ // Skip files unchanged since the cutoff. Use `>=` so a file touched exactly at the cutoff
150
+ // is still examined.
151
+ if (stat.mtimeMs < sinceMs) {
152
+ continue;
153
+ }
154
+ }
131
155
  let content;
132
156
  try {
133
- content = await fs.readFile(path.join(dir, relativePath), 'utf8');
157
+ content = await fs.readFile(fullPath, 'utf8');
134
158
  }
135
159
  catch {
136
160
  // Unreadable transcript — skip it rather than failing the whole scan.
@@ -143,10 +167,11 @@ export async function scanSessions(options = {}) {
143
167
  envelopes.push(envelope);
144
168
  }
145
169
  }
146
- return { envelopes, sessionCount };
170
+ return { envelopes, sessionCount, ok: true };
147
171
  }
148
172
  /** The session id this envelope represents — used as the local dedup key. */
149
173
  export function sessionIdOf(envelope) {
150
- return envelope.url.replace(/^claudecode:\/\/session\//, '');
174
+ const m = envelope.url.match(/^[a-z]+:\/\/session\/(.+)$/);
175
+ return m ? m[1] : envelope.url;
151
176
  }
152
177
  //# sourceMappingURL=claude-scanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-scanner.js","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-scanner.js","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ScanResult } from './claude-scanner.js';
2
+ export declare function defaultCoworkSessionsDir(): string;
3
+ /**
4
+ * Scan Claude Cowork sessions stored under `~/Library/Application Support/Claude/local-agent-mode-sessions/`.
5
+ *
6
+ * Structure: <workspace-uuid>/<cowork-session-uuid>/local_<session-uuid>/audit.jsonl
7
+ * Each `local_<uuid>` directory represents one agent invocation and maps to one session envelope.
8
+ *
9
+ * The `audit.jsonl` format is compatible with `parseTranscript` — same `user`/`assistant` event
10
+ * shapes. Cowork-only event types (`system`, `rate_limit_event`) have no `message` field and are
11
+ * silently skipped. Sessions use `cowork://session/<uuid>` URLs to distinguish them from Claude Code
12
+ * sessions (`claudecode://session/<id>`).
13
+ *
14
+ * Returns an empty result when the directory is missing (non-macOS systems, first-time setup, etc.).
15
+ */
16
+ export declare function scanCoworkSessions(options?: {
17
+ sessionsDir?: string;
18
+ sinceTime?: Date;
19
+ }): Promise<ScanResult>;
20
+ //# sourceMappingURL=cowork-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cowork-scanner.d.ts","sourceRoot":"","sources":["../../src/sessions/cowork-scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7F,wBAAgB,wBAAwB,IAAI,MAAM,CAQjD;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CAAO,GACvD,OAAO,CAAC,UAAU,CAAC,CAoDrB"}
@@ -0,0 +1,76 @@
1
+ import { promises as fs } from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import { parseTranscript } from './claude-scanner.js';
5
+ export function defaultCoworkSessionsDir() {
6
+ return path.join(os.homedir(), 'Library', 'Application Support', 'Claude', 'local-agent-mode-sessions');
7
+ }
8
+ /**
9
+ * Matches the `local_<uuid>/audit.jsonl` path suffix that identifies one Cowork agent invocation.
10
+ * Captures the UUID portion (group 1) which becomes the session id.
11
+ */
12
+ const LOCAL_AUDIT_RE = /[/\\]local_([^/\\]+)[/\\]audit\.jsonl$/;
13
+ /**
14
+ * Scan Claude Cowork sessions stored under `~/Library/Application Support/Claude/local-agent-mode-sessions/`.
15
+ *
16
+ * Structure: <workspace-uuid>/<cowork-session-uuid>/local_<session-uuid>/audit.jsonl
17
+ * Each `local_<uuid>` directory represents one agent invocation and maps to one session envelope.
18
+ *
19
+ * The `audit.jsonl` format is compatible with `parseTranscript` — same `user`/`assistant` event
20
+ * shapes. Cowork-only event types (`system`, `rate_limit_event`) have no `message` field and are
21
+ * silently skipped. Sessions use `cowork://session/<uuid>` URLs to distinguish them from Claude Code
22
+ * sessions (`claudecode://session/<id>`).
23
+ *
24
+ * Returns an empty result when the directory is missing (non-macOS systems, first-time setup, etc.).
25
+ */
26
+ export async function scanCoworkSessions(options = {}) {
27
+ const dir = options.sessionsDir ?? defaultCoworkSessionsDir();
28
+ const sinceMs = options.sinceTime?.getTime();
29
+ let names;
30
+ try {
31
+ names = await fs.readdir(dir, { recursive: true });
32
+ }
33
+ catch {
34
+ // Treat any readdir failure (ENOENT, EACCES, ENOTDIR, …) as an empty result. Cowork scanning
35
+ // is best-effort and macOS-only; an error here must not abort the Claude Code capture running
36
+ // in parallel inside Promise.all.
37
+ return { envelopes: [], sessionCount: 0, ok: false };
38
+ }
39
+ const files = names.filter((name) => LOCAL_AUDIT_RE.test(name));
40
+ const envelopes = [];
41
+ let sessionCount = 0;
42
+ for (const relativePath of files) {
43
+ const fullPath = path.join(dir, relativePath);
44
+ if (sinceMs !== undefined) {
45
+ let stat;
46
+ try {
47
+ stat = await fs.stat(fullPath);
48
+ }
49
+ catch {
50
+ continue;
51
+ }
52
+ if (stat.mtimeMs < sinceMs) {
53
+ continue;
54
+ }
55
+ }
56
+ let content;
57
+ try {
58
+ content = await fs.readFile(fullPath, 'utf8');
59
+ }
60
+ catch {
61
+ continue;
62
+ }
63
+ const m = relativePath.match(LOCAL_AUDIT_RE);
64
+ if (!m) {
65
+ continue;
66
+ }
67
+ const sessionUuid = m[1];
68
+ sessionCount += 1;
69
+ const envelope = parseTranscript(content, sessionUuid);
70
+ if (envelope) {
71
+ envelopes.push({ ...envelope, url: `cowork://session/${sessionUuid}` });
72
+ }
73
+ }
74
+ return { envelopes, sessionCount, ok: true };
75
+ }
76
+ //# sourceMappingURL=cowork-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cowork-scanner.js","sourceRoot":"","sources":["../../src/sessions/cowork-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAyC,MAAM,qBAAqB,CAAC;AAE7F,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,CAAC,IAAI,CACd,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,2BAA2B,CAC5B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,cAAc,GAAG,wCAAwC,CAAC;AAEhE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAsD,EAAE;IAExD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,IAAI,wBAAwB,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IAE7C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,6FAA6F;QAC7F,8FAA8F;QAC9F,kCAAkC;QAClC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,KAAK,GAAI,KAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;QACH,CAAC;QAED,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACrB,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,YAAY,IAAI,CAAC,CAAC;QAElB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,oBAAoB,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC"}
package/dist/types.d.ts CHANGED
@@ -85,7 +85,7 @@ export interface UpdateOptimizationOptions {
85
85
  json?: boolean;
86
86
  clientId?: string;
87
87
  }
88
- export interface CaptureSessionsOptions {
88
+ export interface AnalyzeClaudeSessionsOptions {
89
89
  dryRun?: boolean;
90
90
  clientId?: string;
91
91
  json?: boolean;
@@ -98,6 +98,10 @@ export interface ComplaintBoxOptions {
98
98
  json?: boolean;
99
99
  clientId?: string;
100
100
  }
101
+ export interface ClaudeOptions {
102
+ args: string[];
103
+ clientId?: string;
104
+ }
101
105
  export declare const DEFAULT_BASE_URL = "https://coolhandlabs.com";
102
106
  export declare const DEFAULT_TIMEOUT_MS: number;
103
107
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmHA,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAyHA,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC"}
package/dist/version.d.ts CHANGED
@@ -2,10 +2,10 @@
2
2
  * Auto-generated from package.json — do not edit manually.
3
3
  * Run `npm run sync-version` or `npm run build` to regenerate.
4
4
  */
5
- export declare const PACKAGE_VERSION = "0.4.0";
5
+ export declare const PACKAGE_VERSION = "0.5.1";
6
6
  export declare const PACKAGE_NAME = "coolhand-cli";
7
7
  /**
8
8
  * Full package identifier
9
9
  */
10
- export declare const PACKAGE_IDENTIFIER = "coolhand-cli-0.4.0";
10
+ export declare const PACKAGE_IDENTIFIER = "coolhand-cli-0.5.1";
11
11
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * Auto-generated from package.json — do not edit manually.
3
3
  * Run `npm run sync-version` or `npm run build` to regenerate.
4
4
  */
5
- export const PACKAGE_VERSION = '0.4.0';
5
+ export const PACKAGE_VERSION = '0.5.1';
6
6
  export const PACKAGE_NAME = 'coolhand-cli';
7
7
  /**
8
8
  * Full package identifier