coolhand-cli 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,17 +22,34 @@ Requires Node 20 or newer.
22
22
  ## Commands
23
23
 
24
24
  ```
25
- coolhand login [--base-url URL] [--write-env PATH] [--client-id ID] [--json]
25
+ coolhand login [--base-url URL] [--scope private] [--write-env PATH] [--client-id ID] [--json]
26
26
  coolhand logout [--client-id ID | --all] [--json]
27
27
  coolhand status [--client-id ID] [--json]
28
28
  coolhand whoami [--client-id ID]
29
29
  coolhand clients [use <id>] [--json]
30
+
31
+ coolhand search-optimizations [--status V] [--type V] [--category V] [--query V]
32
+ [--from DATE] [--to DATE] [--days-back N]
33
+ [--template-id ID] [--workload-id ID]
34
+ [--sort-by impact_desc|complexity_asc|created_at_desc]
35
+ [--page N] [--per-page N] [--client-id ID] [--json]
36
+ coolhand get-optimization <id> [--client-id ID] [--json]
37
+ coolhand update-optimization <id> [--title V] [--analysis V] [--plan V] [--client-id ID] [--json]
38
+ coolhand close-optimization <id> <reason> [--client-id ID] [--json]
39
+
40
+ coolhand capture-sessions [--dry-run] [--client-id ID] [--json]
41
+
42
+ coolhand wildcard --complaint "..." --agent-name "..." [--thinking "..."] [--log-id ID] [--json]
43
+ coolhand report-blocker (alias for wildcard)
44
+ coolhand complaint-box (alias for wildcard)
30
45
  ```
31
46
 
32
47
  ### login
33
48
 
34
49
  Opens your browser to the Coolhand consent page, listens on `127.0.0.1` for the callback, and stores the returned token. The token is the **public** `api_key` for the client you select — the same key you would use with `coolhand-node`, `coolhand-python`, or the `coolhand-js` widget.
35
50
 
51
+ `--scope private` authenticates against a private workspace instead of the default shared workspace.
52
+
36
53
  `--write-env PATH` will additionally set `COOLHAND_API_KEY=<token>` in the target `.env` file (idempotent — replaces an existing value rather than appending a duplicate).
37
54
 
38
55
  ### status
@@ -56,6 +73,57 @@ Exit code is `0` if a token is configured for the default (or requested) client,
56
73
 
57
74
  Multiple clients can be stored at once. `coolhand clients` lists them, `coolhand clients use <id>` switches the default. Each `coolhand login` adds (or refreshes) one entry, keyed by the server-assigned `client_id`.
58
75
 
76
+ ## Optimization commands
77
+
78
+ Coolhand stores LLM-generated optimization suggestions as structured records. These commands let you query, update, and comment on them from the terminal or from agent workflows.
79
+
80
+ ### search-optimizations
81
+
82
+ Lists optimizations with optional filtering and pagination.
83
+
84
+ | Flag | Description |
85
+ |------|-------------|
86
+ | `--status V` | Filter by status (e.g. `open`, `closed`) |
87
+ | `--type V` | Filter by optimization type |
88
+ | `--category V` | Filter by category |
89
+ | `--query V` | Free-text search |
90
+ | `--from DATE` | Start of date range |
91
+ | `--to DATE` | End of date range |
92
+ | `--days-back N` | Only show optimizations from the last N days |
93
+ | `--template-id ID` | Filter to a specific template |
94
+ | `--workload-id ID` | Filter to a specific workload |
95
+ | `--sort-by V` | Sort order: `impact_desc`, `complexity_asc`, or `created_at_desc` |
96
+ | `--page N` | Page number (default: 1) |
97
+ | `--per-page N` | Results per page (default: 20, max: 50) |
98
+ | `--client-id ID` | Use a specific stored client |
99
+ | `--json` | Emit JSON output |
100
+
101
+ Human-readable output includes a pagination hint: `Page N of M (X total)`.
102
+
103
+ ### get-optimization
104
+
105
+ ```bash
106
+ coolhand get-optimization <id>
107
+ ```
108
+
109
+ Fetches a single optimization by ID. When present, the output includes PR information (`PR: #N <url>`) and a `--- Coding Prompt ---` block with the full coding prompt text.
110
+
111
+ ### update-optimization
112
+
113
+ ```bash
114
+ coolhand update-optimization <id> --title "..." --analysis "..." --plan "..."
115
+ ```
116
+
117
+ Updates an existing optimization. Only the flags you provide are changed.
118
+
119
+ ### close-optimization
120
+
121
+ ```bash
122
+ coolhand close-optimization <id> <reason>
123
+ ```
124
+
125
+ Closes an optimization. The reason is a free-text positional argument (quote it if it contains spaces).
126
+
59
127
  ## Security
60
128
 
61
129
  - The callback listener binds to `127.0.0.1` only — never reachable from the LAN.
@@ -96,6 +164,33 @@ coolhand login --write-env .env
96
164
 
97
165
  The CLI works especially well with the [Coolhand feedback collection skill](https://github.com/Coolhand-Labs/feedback-collection-skill) for Claude Code. The skill scans your project for LLM inference calls and implements best-practice human feedback collection — it reads `COOLHAND_API_KEY` from the environment, which `coolhand login --write-env .env` puts in place.
98
166
 
167
+ ### wildcard (agent complaint box)
168
+
169
+ When an agent is blocked because a capability does not exist in its environment, it can record the blocker and get back an unambiguous "stop and move on" response:
170
+
171
+ ```bash
172
+ coolhand wildcard \
173
+ --complaint "I need to run database migrations but no database is reachable" \
174
+ --agent-name code-review-agent
175
+ ```
176
+
177
+ The command records the complaint as feedback tagged `creator_type: agent`, prints a terminal de-loop message, and exits `0` so the agent stops and moves on. The de-loop always fires — even if the feedback could not be recorded (not logged in or a server error) — because the missing capability is real regardless of whether the server was reachable, and a logged-out agent in a sandbox is exactly who this command is for. When recording fails the message says so plainly and a warning is logged, so the failure still surfaces without trapping the agent in the retry loop the command exists to break.
178
+
179
+ Set `COOLHAND_AGENT_NAME` to avoid passing `--agent-name` on every call. Optional `--thinking` attaches the reasoning that led to the blocker; `--log-id` ties it to a specific LLM request log.
180
+
181
+ ### capture-sessions
182
+
183
+ Import locally-saved Claude Code sessions into Coolhand for analysis:
184
+
185
+ ```bash
186
+ coolhand capture-sessions # scan ~/.claude/projects/ and submit new sessions
187
+ coolhand capture-sessions --dry-run # report what would be submitted without sending
188
+ ```
189
+
190
+ Each Claude Code session is submitted as one conversation log. A local state file (`~/.coolhand/capture-state.json`) tracks which sessions have already been sent per client, so re-running is always safe — already-submitted sessions are skipped.
191
+
192
+ See [docs/session-capture.md](./docs/session-capture.md) for the full envelope format and deduplication details.
193
+
99
194
  ## Configuration file
100
195
 
101
196
  Located at `$HOME/.coolhand/config.json` (override with `COOLHAND_CONFIG_DIR` for testing). Schema:
@@ -116,6 +211,16 @@ Located at `$HOME/.coolhand/config.json` (override with `COOLHAND_CONFIG_DIR` fo
116
211
  }
117
212
  ```
118
213
 
214
+ ## Documentation
215
+
216
+ - [Auth Flow](./docs/auth-flow.md) — browser-callback sequence, state machine, timeout and error paths
217
+ - [Configuration File](./docs/config-file.md) — full config schema, multi-client model, `COOLHAND_CONFIG_DIR` override
218
+ - [Session Capture](./docs/session-capture.md) — session scanning, envelope format, deduplication, scope and limitations
219
+
220
+ ## About Coolhand Labs
221
+
222
+ [Coolhand Labs](https://coolhandlabs.com) builds observability and feedback tooling for AI-powered applications.
223
+
119
224
  ## License
120
225
 
121
226
  Apache-2.0
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA4BA,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC;AA0KD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAqCpD;AA0ND,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+EzD"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA4BA,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC;AAmLD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAqCpD;AAiOD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+EzD"}
package/dist/cli.js CHANGED
@@ -8,11 +8,11 @@ import { run as runWhoami } from './commands/whoami.js';
8
8
  import { run as runClients } from './commands/clients.js';
9
9
  import { run as runSearchOptimizations } from './commands/search-optimizations.js';
10
10
  import { run as runGetOptimization } from './commands/get-optimization.js';
11
- import { run as runAddOptimizationComment } from './commands/add-optimization-comment.js';
12
11
  import { run as runCloseOptimization } from './commands/close-optimization.js';
13
- import { run as runCreateOptimization } from './commands/create-optimization.js';
14
12
  import { run as runUpdateOptimization } from './commands/update-optimization.js';
15
- const BOOLEAN_FLAGS = new Set(['all', 'help', 'h', 'json', 'version', 'v']);
13
+ import { run as runWildcard } from './commands/wildcard.js';
14
+ import { run as runCaptureSessions } from './commands/capture-sessions.js';
15
+ const BOOLEAN_FLAGS = new Set(['all', 'help', 'h', 'json', 'version', 'v', 'dry-run']);
16
16
  const COMMANDS = [
17
17
  {
18
18
  name: 'login',
@@ -91,43 +91,46 @@ const COMMANDS = [
91
91
  ],
92
92
  },
93
93
  {
94
- name: 'add-optimization-comment',
95
- oneLiner: 'Add a comment to an optimization',
96
- usage: 'coolhand add-optimization-comment <id> <comment> [options]',
94
+ name: 'close-optimization',
95
+ oneLiner: 'Close an optimization with a reason',
96
+ usage: 'coolhand close-optimization <id> <reason> [options]',
97
97
  options: [
98
98
  { flag: '--client-id ID', description: 'Use a specific stored client' },
99
99
  { flag: '--json', description: 'Emit JSON output instead of human-readable text' },
100
100
  ],
101
101
  },
102
102
  {
103
- name: 'close-optimization',
104
- oneLiner: 'Close an optimization with a reason',
105
- usage: 'coolhand close-optimization <id> <reason> [options]',
103
+ name: 'update-optimization',
104
+ oneLiner: 'Update an existing optimization',
105
+ usage: 'coolhand update-optimization <id> [options]',
106
106
  options: [
107
+ { flag: '--title VALUE', description: 'New title' },
108
+ { flag: '--analysis VALUE', description: 'New analysis text' },
109
+ { flag: '--plan VALUE', description: 'New optimization plan' },
107
110
  { flag: '--client-id ID', description: 'Use a specific stored client' },
108
111
  { flag: '--json', description: 'Emit JSON output instead of human-readable text' },
109
112
  ],
110
113
  },
111
114
  {
112
- name: 'create-optimization',
113
- oneLiner: 'Create a new optimization',
114
- usage: 'coolhand create-optimization [options]',
115
+ name: 'wildcard',
116
+ aliases: ['complaint-box', 'report-blocker'],
117
+ oneLiner: 'Agent complaint box: report an unavailable capability and stop',
118
+ usage: 'coolhand wildcard --complaint "<what is blocking you>" --agent-name <name> [options]',
115
119
  options: [
116
- { flag: '--title VALUE', description: 'Optimization title' },
117
- { flag: '--analysis VALUE', description: 'Analysis text' },
118
- { flag: '--plan VALUE', description: 'Optimization plan' },
120
+ { flag: '--complaint TEXT', description: 'What capability is missing or blocking you (required)' },
121
+ { flag: '--agent-name NAME', description: 'Identifier for the calling agent (or set COOLHAND_AGENT_NAME)' },
122
+ { flag: '--thinking TEXT', description: 'Optional reasoning/context that led to the blocker' },
123
+ { flag: '--log-id N', description: 'Optional LLM request log id this blocker relates to' },
119
124
  { flag: '--client-id ID', description: 'Use a specific stored client' },
120
125
  { flag: '--json', description: 'Emit JSON output instead of human-readable text' },
121
126
  ],
122
127
  },
123
128
  {
124
- name: 'update-optimization',
125
- oneLiner: 'Update an existing optimization',
126
- usage: 'coolhand update-optimization <id> [options]',
129
+ name: 'capture-sessions',
130
+ oneLiner: 'Scan local Claude Code sessions and submit them to Coolhand',
131
+ usage: 'coolhand capture-sessions [options]',
127
132
  options: [
128
- { flag: '--title VALUE', description: 'New title' },
129
- { flag: '--analysis VALUE', description: 'New analysis text' },
130
- { flag: '--plan VALUE', description: 'New optimization plan' },
133
+ { flag: '--dry-run', description: 'Scan and report what would be submitted, without sending' },
131
134
  { flag: '--client-id ID', description: 'Use a specific stored client' },
132
135
  { flag: '--json', description: 'Emit JSON output instead of human-readable text' },
133
136
  ],
@@ -139,9 +142,13 @@ const COMMANDS = [
139
142
  options: [],
140
143
  },
141
144
  ];
145
+ function findCommand(name) {
146
+ return COMMANDS.find((c) => c.name === name || c.aliases?.includes(name));
147
+ }
142
148
  function buildSummaryHelp() {
143
- const nameWidth = Math.max(...COMMANDS.map((c) => c.name.length)) + 2;
144
- const commandLines = COMMANDS.map((c) => ` ${c.name.padEnd(nameWidth)}${c.oneLiner}`).join('\n');
149
+ const rows = COMMANDS.flatMap((c) => [c, ...(c.aliases ?? []).map((a) => ({ ...c, name: a }))]);
150
+ const nameWidth = Math.max(...rows.map((r) => r.name.length)) + 2;
151
+ const commandLines = rows.map((r) => ` ${r.name.padEnd(nameWidth)}${r.oneLiner}`).join('\n');
145
152
  return `coolhand-cli — authenticate with Coolhand from your terminal
146
153
 
147
154
  Usage:
@@ -349,21 +356,6 @@ function getOptimizationOptions(parsed) {
349
356
  }
350
357
  return opts;
351
358
  }
352
- function addOptimizationCommentOptions(parsed) {
353
- const id = parsed.positional[0];
354
- const comment = parsed.positional.slice(1).join(' ').trim();
355
- if (!id || !comment) {
356
- throw new CliError('INVALID_ARGS', 'add-optimization-comment requires <id> and <comment> arguments');
357
- }
358
- const opts = { id, comment };
359
- if (typeof parsed.flags['client-id'] === 'string') {
360
- opts.clientId = parsed.flags['client-id'];
361
- }
362
- if (parsed.flags.json === true) {
363
- opts.json = true;
364
- }
365
- return opts;
366
- }
367
359
  function closeOptimizationOptions(parsed) {
368
360
  const id = parsed.positional[0];
369
361
  const reason = parsed.positional.slice(1).join(' ').trim();
@@ -379,8 +371,12 @@ function closeOptimizationOptions(parsed) {
379
371
  }
380
372
  return opts;
381
373
  }
382
- function createOptimizationOptions(parsed) {
383
- const opts = {};
374
+ function updateOptimizationOptions(parsed) {
375
+ const id = parsed.positional[0];
376
+ if (!id) {
377
+ throw new CliError('INVALID_ARGS', 'update-optimization requires an <id> argument');
378
+ }
379
+ const opts = { id };
384
380
  if (typeof parsed.flags.title === 'string') {
385
381
  opts.title = parsed.flags.title;
386
382
  }
@@ -398,20 +394,37 @@ function createOptimizationOptions(parsed) {
398
394
  }
399
395
  return opts;
400
396
  }
401
- function updateOptimizationOptions(parsed) {
402
- const id = parsed.positional[0];
403
- if (!id) {
404
- throw new CliError('INVALID_ARGS', 'update-optimization requires an <id> argument');
397
+ function captureSessionsOptions(parsed) {
398
+ const opts = {};
399
+ if (parsed.flags['dry-run'] === true) {
400
+ opts.dryRun = true;
405
401
  }
406
- const opts = { id };
407
- if (typeof parsed.flags.title === 'string') {
408
- opts.title = parsed.flags.title;
402
+ if (typeof parsed.flags['client-id'] === 'string') {
403
+ opts.clientId = parsed.flags['client-id'];
409
404
  }
410
- if (typeof parsed.flags.analysis === 'string') {
411
- opts.analysis = parsed.flags.analysis;
405
+ if (parsed.flags.json === true) {
406
+ opts.json = true;
412
407
  }
413
- if (typeof parsed.flags.plan === 'string') {
414
- opts.plan = parsed.flags.plan;
408
+ return opts;
409
+ }
410
+ function wildcardOptions(parsed) {
411
+ const complaint = typeof parsed.flags.complaint === 'string' ? parsed.flags.complaint.trim() : '';
412
+ if (!complaint) {
413
+ throw new CliError('INVALID_ARGS', 'wildcard requires --complaint "<what is blocking you>"');
414
+ }
415
+ const agentName = typeof parsed.flags['agent-name'] === 'string' ? parsed.flags['agent-name'] : process.env.COOLHAND_AGENT_NAME;
416
+ if (!agentName) {
417
+ throw new CliError('INVALID_ARGS', 'wildcard requires --agent-name <name> (or set COOLHAND_AGENT_NAME)');
418
+ }
419
+ const opts = { complaint, agentName };
420
+ if (typeof parsed.flags.thinking === 'string') {
421
+ opts.thinking = parsed.flags.thinking;
422
+ }
423
+ if (typeof parsed.flags['log-id'] === 'string') {
424
+ const n = parseInt(parsed.flags['log-id'], 10);
425
+ if (!isNaN(n)) {
426
+ opts.logId = n;
427
+ }
415
428
  }
416
429
  if (typeof parsed.flags['client-id'] === 'string') {
417
430
  opts.clientId = parsed.flags['client-id'];
@@ -434,7 +447,7 @@ export async function run(argv) {
434
447
  if (parsed.command === 'help' || parsed.command === '') {
435
448
  const target = parsed.positional[0];
436
449
  if (target) {
437
- const meta = COMMANDS.find((c) => c.name === target);
450
+ const meta = findCommand(target);
438
451
  if (!meta) {
439
452
  logger.info(`Unknown command: ${target}`);
440
453
  logger.info(buildSummaryHelp());
@@ -448,7 +461,7 @@ export async function run(argv) {
448
461
  return ExitCode.OK;
449
462
  }
450
463
  if (parsed.flags.help === true || parsed.flags.h === true) {
451
- const meta = COMMANDS.find((c) => c.name === parsed.command);
464
+ const meta = findCommand(parsed.command);
452
465
  if (meta) {
453
466
  logger.info(buildCommandHelp(meta));
454
467
  }
@@ -458,7 +471,7 @@ export async function run(argv) {
458
471
  return ExitCode.OK;
459
472
  }
460
473
  try {
461
- switch (parsed.command) {
474
+ switch (findCommand(parsed.command)?.name ?? parsed.command) {
462
475
  case 'login':
463
476
  return await runLogin(loginOptions(parsed));
464
477
  case 'logout':
@@ -473,14 +486,14 @@ export async function run(argv) {
473
486
  return await runSearchOptimizations(searchOptimizationsOptions(parsed));
474
487
  case 'get-optimization':
475
488
  return await runGetOptimization(getOptimizationOptions(parsed));
476
- case 'add-optimization-comment':
477
- return await runAddOptimizationComment(addOptimizationCommentOptions(parsed));
478
489
  case 'close-optimization':
479
490
  return await runCloseOptimization(closeOptimizationOptions(parsed));
480
- case 'create-optimization':
481
- return await runCreateOptimization(createOptimizationOptions(parsed));
482
491
  case 'update-optimization':
483
492
  return await runUpdateOptimization(updateOptimizationOptions(parsed));
493
+ case 'wildcard':
494
+ return await runWildcard(wildcardOptions(parsed));
495
+ case 'capture-sessions':
496
+ return await runCaptureSessions(captureSessionsOptions(parsed));
484
497
  default:
485
498
  logger.info(`Unknown command: ${parsed.command}`);
486
499
  logger.info(buildSummaryHelp());
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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"}
@@ -0,0 +1,3 @@
1
+ import type { CaptureSessionsOptions } from '../types.js';
2
+ export declare function run(opts: CaptureSessionsOptions): Promise<number>;
3
+ //# sourceMappingURL=capture-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-sessions.d.ts","sourceRoot":"","sources":["../../src/commands/capture-sessions.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAK1D,wBAAsB,GAAG,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwEvE"}
@@ -0,0 +1,79 @@
1
+ import { CliError, ExitCode } from '../errors.js';
2
+ import { logger, redact } from '../logger.js';
3
+ import { scanSessions, sessionIdOf } from '../sessions/claude-scanner.js';
4
+ import { loadCaptureState, isSubmitted, markSubmitted, saveCaptureState, } from '../sessions/capture-state.js';
5
+ import { loadConfig, getClient } from '../config.js';
6
+ import { logRequest } from '../log-request.js';
7
+ /** Errors that apply to every session (auth/config), so the run should abort, not keep retrying. */
8
+ const FATAL_CODES = new Set(['NOT_CONFIGURED', 'CLIENT_NOT_FOUND', 'INVALID_BASE_URL']);
9
+ export async function run(opts) {
10
+ try {
11
+ const { envelopes, sessionCount } = await scanSessions();
12
+ // Scope the "already submitted" list to the client we're submitting to, so the same sessions
13
+ // can be sent to a different client if needed.
14
+ const cfg = await loadConfig();
15
+ const stateClientId = getClient(cfg, opts.clientId)?.client_id ?? opts.clientId ?? '_default';
16
+ const state = await loadCaptureState();
17
+ const pending = envelopes.filter((e) => !isSubmitted(state, stateClientId, sessionIdOf(e)));
18
+ const skipped = envelopes.length - pending.length;
19
+ if (opts.dryRun) {
20
+ if (opts.json) {
21
+ logger.json({ ok: true, dryRun: true, sessions: sessionCount, toSubmit: pending.length, skipped });
22
+ }
23
+ else {
24
+ logger.info(`Dry run: found ${sessionCount} session(s), ${pending.length} new to submit, ` +
25
+ `${skipped} already submitted. Nothing sent.`);
26
+ }
27
+ return ExitCode.OK;
28
+ }
29
+ let submitted = 0;
30
+ let failed = 0;
31
+ try {
32
+ for (const envelope of pending) {
33
+ try {
34
+ await logRequest(envelope, { clientId: opts.clientId });
35
+ markSubmitted(state, stateClientId, sessionIdOf(envelope));
36
+ submitted += 1;
37
+ }
38
+ catch (err) {
39
+ if (err instanceof CliError && FATAL_CODES.has(err.code)) {
40
+ throw err;
41
+ }
42
+ failed += 1;
43
+ logger.warn(`Failed to submit session: ${redact(err.message)}`);
44
+ }
45
+ }
46
+ }
47
+ finally {
48
+ // Persist whatever we recorded, even if a fatal error aborts the run partway.
49
+ try {
50
+ await saveCaptureState(state);
51
+ }
52
+ catch (err) {
53
+ logger.warn(`Failed to save capture state: ${redact(err.message)}`);
54
+ }
55
+ }
56
+ if (opts.json) {
57
+ logger.json({ ok: failed === 0, sessions: sessionCount, submitted, skipped, failed });
58
+ }
59
+ else {
60
+ const failureNote = failed > 0 ? `, ${failed} failed` : '';
61
+ const skippedNote = skipped > 0 ? `, ${skipped} already submitted` : '';
62
+ logger.info(`Submitted ${submitted} session(s) of ${sessionCount} scanned${skippedNote}${failureNote}.`);
63
+ }
64
+ return failed === 0 ? ExitCode.OK : ExitCode.USER_ERROR;
65
+ }
66
+ catch (err) {
67
+ if (err instanceof CliError) {
68
+ if (opts.json) {
69
+ logger.json({ ok: false, error: err.code, message: redact(err.message) });
70
+ }
71
+ else {
72
+ logger.info(`Error: ${redact(err.message)} [${err.code}]`);
73
+ }
74
+ return err.exitCode;
75
+ }
76
+ throw err;
77
+ }
78
+ }
79
+ //# sourceMappingURL=capture-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-sessions.js","sourceRoot":"","sources":["../../src/commands/capture-sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ComplaintBoxOptions } from '../types.js';
2
+ /**
3
+ * Records an agent's free-form "I am blocked, this capability does not exist"
4
+ * complaint as feedback (tagged creator_type: "agent"), then prints a terminal
5
+ * de-loop message and exits 0 so the agent stops and moves on. The de-loop ALWAYS
6
+ * fires — even when the feedback could not be recorded — because the missing
7
+ * capability is real regardless of server state (and a logged-out agent in a
8
+ * sandbox is exactly who this command is for). When recording fails it says so
9
+ * plainly and logs a warning, so the failure still surfaces without trapping the
10
+ * agent in the retry loop the command exists to break.
11
+ */
12
+ export declare function run(opts: ComplaintBoxOptions): Promise<number>;
13
+ //# sourceMappingURL=wildcard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wildcard.d.ts","sourceRoot":"","sources":["../../src/commands/wildcard.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAoBzE;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2CpE"}
@@ -0,0 +1,72 @@
1
+ import { Coolhand } from 'coolhand-node';
2
+ import { ExitCode } from '../errors.js';
3
+ import { logger, redact } from '../logger.js';
4
+ import { loadConfig, getClient } from '../config.js';
5
+ import { DEFAULT_BASE_URL } from '../types.js';
6
+ // Terminal guidance that breaks the agent out of its retry loop. The missing
7
+ // capability is real regardless of whether we could reach the Coolhand server, so
8
+ // the de-loop is the agent's decision to make, not the server's.
9
+ const STOP_GUIDANCE = 'Do not retry this action or attempt alternative ways to perform it; continue with the rest of your task.';
10
+ // Printed when the blocker was successfully recorded server-side.
11
+ const DELOOP_RECORDED = 'This capability is not available in this environment. Your feedback has been recorded. ' + STOP_GUIDANCE;
12
+ // Printed when the blocker could NOT be recorded (e.g. not logged in, or the server
13
+ // did not confirm). We still de-loop the agent, but stay honest: we never claim a
14
+ // recording happened, and a warning is logged separately so the failure surfaces.
15
+ const DELOOP_UNRECORDED = 'This capability is not available in this environment. Your feedback could not be recorded ' +
16
+ '(not logged in, or the server did not confirm — run `coolhand login` to enable reporting). ' +
17
+ STOP_GUIDANCE;
18
+ /**
19
+ * Records an agent's free-form "I am blocked, this capability does not exist"
20
+ * complaint as feedback (tagged creator_type: "agent"), then prints a terminal
21
+ * de-loop message and exits 0 so the agent stops and moves on. The de-loop ALWAYS
22
+ * fires — even when the feedback could not be recorded — because the missing
23
+ * capability is real regardless of server state (and a logged-out agent in a
24
+ * sandbox is exactly who this command is for). When recording fails it says so
25
+ * plainly and logs a warning, so the failure still surfaces without trapping the
26
+ * agent in the retry loop the command exists to break.
27
+ */
28
+ export async function run(opts) {
29
+ let recorded = false;
30
+ try {
31
+ const cfg = await loadConfig();
32
+ const client = getClient(cfg, opts.clientId);
33
+ const apiKey = client?.api_key ?? process.env.COOLHAND_API_KEY;
34
+ const baseUrl = client?.base_url ?? DEFAULT_BASE_URL;
35
+ if (!apiKey) {
36
+ logger.warn('Not logged in; blocker feedback was not recorded. Run `coolhand login` to enable reporting.');
37
+ }
38
+ else {
39
+ const coolhand = new Coolhand({ apiKey, baseUrl, silent: true });
40
+ // The SDK resolves to null (it does not throw) when the write fails, so a
41
+ // truthy response is the only proof the blocker was actually recorded.
42
+ const feedback = {
43
+ explanation: opts.complaint,
44
+ creator_unique_id: opts.agentName,
45
+ creator_type: 'agent',
46
+ ...(opts.thinking ? { original_output: opts.thinking } : {}),
47
+ ...(opts.logId !== undefined ? { llm_request_log_id: opts.logId } : {}),
48
+ };
49
+ const result = await coolhand.createFeedback(feedback);
50
+ recorded = result !== null && result !== undefined;
51
+ if (!recorded) {
52
+ logger.warn('Blocker feedback was not recorded: the server did not confirm the write.');
53
+ }
54
+ }
55
+ }
56
+ catch (err) {
57
+ logger.warn(`Could not record blocker feedback: ${redact(err.message)}`);
58
+ }
59
+ // Always de-loop: the capability genuinely does not exist, so the agent must stop
60
+ // whether or not we could notify the server. Stay honest about the recording status
61
+ // (warnings above already surfaced any failure) rather than gating the stop-signal
62
+ // on a confirmed write and leaving a logged-out agent stuck.
63
+ const message = recorded ? DELOOP_RECORDED : DELOOP_UNRECORDED;
64
+ if (opts.json === true) {
65
+ logger.json({ ok: true, recorded, message });
66
+ }
67
+ else {
68
+ logger.info(message);
69
+ }
70
+ return ExitCode.OK;
71
+ }
72
+ //# sourceMappingURL=wildcard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wildcard.js","sourceRoot":"","sources":["../../src/commands/wildcard.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -4,7 +4,7 @@ export declare enum ExitCode {
4
4
  INTERNAL = 2,
5
5
  ABORTED = 130
6
6
  }
7
- export type ErrorCode = 'TIMEOUT' | 'STATE_MISMATCH' | 'INVALID_CALLBACK' | 'BROWSER_FAILED' | 'CONFIG_WRITE_FAILED' | 'CONFIG_READ_FAILED' | 'NOT_CONFIGURED' | 'INVALID_REDIRECT_URI' | 'INVALID_BASE_URL' | 'INVALID_ARGS' | 'WRITE_ENV_FAILED' | 'CLIENT_NOT_FOUND' | 'NO_PRIVATE_KEY' | 'MCP_ERROR';
7
+ export type ErrorCode = 'TIMEOUT' | 'STATE_MISMATCH' | 'INVALID_CALLBACK' | 'BROWSER_FAILED' | 'CONFIG_WRITE_FAILED' | 'CONFIG_READ_FAILED' | 'NOT_CONFIGURED' | 'INVALID_REDIRECT_URI' | 'INVALID_BASE_URL' | 'INVALID_ARGS' | 'WRITE_ENV_FAILED' | 'CLIENT_NOT_FOUND' | 'NO_PRIVATE_KEY' | 'MCP_ERROR' | 'INGEST_ERROR';
8
8
  export declare class CliError extends Error {
9
9
  readonly code: ErrorCode;
10
10
  readonly exitCode: number;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,EAAE,IAAI;IACN,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,OAAO,MAAM;CACd;AAED,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,CAAC;AAEhB,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAErB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA4B;CAMrF"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,EAAE,IAAI;IACN,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,OAAO,MAAM;CACd;AAED,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAErB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA4B;CAMrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,mCAAM,CAAA;IACN,mDAAc,CAAA;IACd,+CAAY,CAAA;IACZ,+CAAa,CAAA;AACf,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAkBD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAIjC,YAAY,IAAe,EAAE,OAAe,EAAE,WAAmB,QAAQ,CAAC,UAAU;QAClF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,mCAAM,CAAA;IACN,mDAAc,CAAA;IACd,+CAAY,CAAA;IACZ,+CAAa,CAAA;AACf,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAmBD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAIjC,YAAY,IAAe,EAAE,OAAe,EAAE,WAAmB,QAAQ,CAAC,UAAU;QAClF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Submit one captured request/response envelope to the Coolhand ingest endpoint.
3
+ *
4
+ * Transport is delegated to coolhand-node's `Coolhand#logRequest`, which posts to the same
5
+ * `/api/v2/llm_request_logs` endpoint with the client's public `api_key`. The server
6
+ * deduplicates by the envelope's `response_body.id`, so re-submitting the same turn is harmless.
7
+ *
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
10
+ * per-session success/failure accounting intact.
11
+ */
12
+ export declare function logRequest(rawRequest: unknown, opts?: {
13
+ clientId?: string;
14
+ }): Promise<unknown>;
15
+ //# sourceMappingURL=log-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-request.d.ts","sourceRoot":"","sources":["../src/log-request.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,OAAO,EACnB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,OAAO,CAAC,CAwClB"}
@@ -0,0 +1,51 @@
1
+ import { Coolhand } from 'coolhand-node';
2
+ import { CliError } from './errors.js';
3
+ import { loadConfig, getClient } from './config.js';
4
+ import { DEFAULT_BASE_URL } from './types.js';
5
+ /** Identifies submissions from this tool in the server's collector field. */
6
+ const COLLECTOR = 'coolhand-cli/claude-code';
7
+ /**
8
+ * Submit one captured request/response envelope to the Coolhand ingest endpoint.
9
+ *
10
+ * Transport is delegated to coolhand-node's `Coolhand#logRequest`, which posts to the same
11
+ * `/api/v2/llm_request_logs` endpoint with the client's public `api_key`. The server
12
+ * deduplicates by the envelope's `response_body.id`, so re-submitting the same turn is harmless.
13
+ *
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
16
+ * per-session success/failure accounting intact.
17
+ */
18
+ export async function logRequest(rawRequest, opts = {}) {
19
+ const cfg = await loadConfig();
20
+ const client = getClient(cfg, opts.clientId);
21
+ if (opts.clientId && !client) {
22
+ throw new CliError('CLIENT_NOT_FOUND', `No client "${opts.clientId}" is configured.`);
23
+ }
24
+ const apiKey = client?.api_key ?? process.env.COOLHAND_API_KEY;
25
+ if (!apiKey) {
26
+ throw new CliError('NOT_CONFIGURED', 'Not logged in. Run `coolhand login` to authenticate.');
27
+ }
28
+ const baseUrl = client?.base_url ?? DEFAULT_BASE_URL;
29
+ let coolhand;
30
+ try {
31
+ // The SDK validates baseUrl in its constructor (https required; http only for localhost).
32
+ coolhand = new Coolhand({ apiKey, baseUrl, silent: true });
33
+ }
34
+ catch (err) {
35
+ throw new CliError('INVALID_BASE_URL', `Invalid base_url for client: ${baseUrl} (${err.message})`);
36
+ }
37
+ let result;
38
+ try {
39
+ result = await coolhand.logRequest(rawRequest, { collector: COLLECTOR });
40
+ }
41
+ catch (err) {
42
+ throw new CliError('INGEST_ERROR', `Log submission failed: ${err.message}`);
43
+ }
44
+ // The SDK returns null when the POST fails (it reports the error itself). On Node >= 20 (our
45
+ // engine floor) fetch is always defined, so a null result here unambiguously means failure.
46
+ if (result === null) {
47
+ throw new CliError('INGEST_ERROR', 'Log submission failed.');
48
+ }
49
+ return result;
50
+ }
51
+ //# sourceMappingURL=log-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-request.js","sourceRoot":"","sources":["../src/log-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAmB,EACnB,OAA8B,EAAE;IAEhC,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,cAAc,IAAI,CAAC,QAAQ,kBAAkB,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,gBAAgB,EAChB,sDAAsD,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ,IAAI,gBAAgB,CAAC;IAErD,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,0FAA0F;QAC1F,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,gCAAgC,OAAO,KAAM,GAAa,CAAC,OAAO,GAAG,CAAC,CAAC;IAChH,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,UAA8B,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,6FAA6F;IAC7F,4FAA4F;IAC5F,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,20 @@
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.
4
+ *
5
+ * 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
+ * Keyed per client id, since the same session may legitimately be submitted to more than one client.
8
+ */
9
+ export interface CaptureState {
10
+ version: number;
11
+ submitted: Record<string, string[]>;
12
+ }
13
+ export declare function captureStatePath(): string;
14
+ 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;
19
+ export declare function saveCaptureState(state: CaptureState): Promise<void>;
20
+ //# sourceMappingURL=capture-state.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,80 @@
1
+ import { promises as fs } from 'fs';
2
+ import * as path from 'path';
3
+ import { randomBytes } from 'crypto';
4
+ import { configDir } from '../config.js';
5
+ import { CliError } from '../errors.js';
6
+ const STATE_FILENAME = 'capture-state.json';
7
+ const DIR_MODE = 0o700;
8
+ const FILE_MODE = 0o600;
9
+ export function captureStatePath() {
10
+ return path.join(configDir(), STATE_FILENAME);
11
+ }
12
+ function emptyState() {
13
+ return { version: 1, submitted: {} };
14
+ }
15
+ export async function loadCaptureState() {
16
+ const filePath = captureStatePath();
17
+ let raw;
18
+ try {
19
+ raw = await fs.readFile(filePath, 'utf8');
20
+ }
21
+ catch (err) {
22
+ if (err.code === 'ENOENT') {
23
+ return emptyState();
24
+ }
25
+ throw new CliError('CONFIG_READ_FAILED', `Failed to read ${filePath}: ${err.message}`);
26
+ }
27
+ try {
28
+ const parsed = JSON.parse(raw);
29
+ return {
30
+ version: 1,
31
+ submitted: parsed.submitted ?? {},
32
+ };
33
+ }
34
+ catch (err) {
35
+ throw new CliError('CONFIG_READ_FAILED', `Capture state at ${filePath} is not valid JSON: ${err.message}`);
36
+ }
37
+ }
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);
42
+ }
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
+ }
49
+ }
50
+ async function ensureDir(dir) {
51
+ await fs.mkdir(dir, { recursive: true, mode: DIR_MODE });
52
+ try {
53
+ await fs.chmod(dir, DIR_MODE);
54
+ }
55
+ catch {
56
+ // POSIX-only — Windows rejects chmod with this mode; ignore.
57
+ }
58
+ }
59
+ export async function saveCaptureState(state) {
60
+ const filePath = captureStatePath();
61
+ const dir = path.dirname(filePath);
62
+ await ensureDir(dir);
63
+ const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(6).toString('hex')}.tmp`);
64
+ const data = `${JSON.stringify(state, null, 2)}\n`;
65
+ try {
66
+ await fs.writeFile(tmpPath, data, { mode: FILE_MODE });
67
+ await fs.rename(tmpPath, filePath);
68
+ try {
69
+ await fs.chmod(filePath, FILE_MODE);
70
+ }
71
+ catch {
72
+ // ignore on Windows
73
+ }
74
+ }
75
+ catch (err) {
76
+ await fs.rm(tmpPath, { force: true }).catch(() => undefined);
77
+ throw new CliError('CONFIG_WRITE_FAILED', `Failed to write ${filePath}: ${err.message}`);
78
+ }
79
+ }
80
+ //# sourceMappingURL=capture-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-state.js","sourceRoot":"","sources":["../../src/sessions/capture-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /** One message in the reconstructed conversation. */
2
+ export interface ConversationMessage {
3
+ role: string;
4
+ content: string;
5
+ }
6
+ /**
7
+ * An Anthropic-shaped envelope for ONE whole Claude Code session (a conversation). The server's
8
+ * `claude_code` ingestor recognises it by the synthetic `claudecode://session/<sessionId>` url,
9
+ * stores the full back-and-forth (the server already treats a multi-message request as one "chat"
10
+ * log), and deduplicates on the session id. `request_body.messages` is the conversation;
11
+ * `response_body` is the final assistant turn; `response_body.usage` is the session's summed tokens.
12
+ */
13
+ export interface CaptureEnvelope {
14
+ url: string;
15
+ method: string;
16
+ status_code: number;
17
+ request_body: {
18
+ model?: string;
19
+ messages: ConversationMessage[];
20
+ };
21
+ response_body: {
22
+ id: string;
23
+ type: string;
24
+ role: string;
25
+ model?: string;
26
+ content: unknown;
27
+ usage?: unknown;
28
+ };
29
+ }
30
+ export interface ScanResult {
31
+ envelopes: CaptureEnvelope[];
32
+ sessionCount: number;
33
+ }
34
+ export declare function defaultProjectsDir(): string;
35
+ /**
36
+ * Parse one transcript's raw text (newline-delimited JSON) into a SINGLE session envelope holding
37
+ * the whole conversation — one log per session, not one per turn. Returns `null` when the transcript
38
+ * contains no assistant turns. Pure function (no filesystem) so it is easy to unit test.
39
+ */
40
+ export declare function parseTranscript(content: string, sessionId: string): CaptureEnvelope | null;
41
+ /**
42
+ * Find every Claude Code transcript under `projectsDir` (default `~/.claude/projects`) and build one
43
+ * conversation envelope per session. A missing directory simply yields zero sessions.
44
+ */
45
+ export declare function scanSessions(options?: {
46
+ projectsDir?: string;
47
+ }): Promise<ScanResult>;
48
+ /** The session id this envelope represents — used as the local dedup key. */
49
+ export declare function sessionIdOf(envelope: CaptureEnvelope): string;
50
+ //# sourceMappingURL=claude-scanner.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,152 @@
1
+ import { promises as fs } from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ export function defaultProjectsDir() {
5
+ return path.join(os.homedir(), '.claude', 'projects');
6
+ }
7
+ /** Pull plain text out of a Claude message `content`, which is either a string or block array. */
8
+ function extractText(content) {
9
+ if (typeof content === 'string') {
10
+ return content;
11
+ }
12
+ if (Array.isArray(content)) {
13
+ return content
14
+ .filter((block) => Boolean(block) &&
15
+ typeof block === 'object' &&
16
+ block.type === 'text' &&
17
+ typeof block.text === 'string')
18
+ .map((block) => block.text)
19
+ .join('\n');
20
+ }
21
+ return '';
22
+ }
23
+ function toCount(value) {
24
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
25
+ }
26
+ /**
27
+ * Parse one transcript's raw text (newline-delimited JSON) into a SINGLE session envelope holding
28
+ * the whole conversation — one log per session, not one per turn. Returns `null` when the transcript
29
+ * contains no assistant turns. Pure function (no filesystem) so it is easy to unit test.
30
+ */
31
+ export function parseTranscript(content, sessionId) {
32
+ const messages = [];
33
+ const usage = { input_tokens: 0, output_tokens: 0, cache_read_input_tokens: 0 };
34
+ let sawUsage = false;
35
+ let sessionModel;
36
+ let lastAssistant = null;
37
+ for (const line of content.split('\n')) {
38
+ const trimmed = line.trim();
39
+ if (!trimmed) {
40
+ continue;
41
+ }
42
+ let event;
43
+ try {
44
+ event = JSON.parse(trimmed);
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ if (!event || typeof event !== 'object') {
50
+ continue;
51
+ }
52
+ const message = event.message;
53
+ if (!message) {
54
+ continue;
55
+ }
56
+ if (event.type === 'user') {
57
+ // `user` events include tool results (no text) — only keep actual prompt text.
58
+ const text = extractText(message.content);
59
+ if (text) {
60
+ messages.push({ role: 'user', content: text });
61
+ }
62
+ continue;
63
+ }
64
+ if (event.type === 'assistant' && message.role === 'assistant') {
65
+ const requestId = typeof event.requestId === 'string'
66
+ ? event.requestId
67
+ : typeof message.id === 'string'
68
+ ? message.id
69
+ : undefined;
70
+ messages.push({ role: 'assistant', content: extractText(message.content) });
71
+ const model = typeof message.model === 'string' ? message.model : undefined;
72
+ if (model) {
73
+ sessionModel = model;
74
+ }
75
+ const turnUsage = message.usage;
76
+ if (turnUsage && typeof turnUsage === 'object') {
77
+ sawUsage = true;
78
+ usage.input_tokens += toCount(turnUsage.input_tokens);
79
+ usage.output_tokens += toCount(turnUsage.output_tokens);
80
+ usage.cache_read_input_tokens += toCount(turnUsage.cache_read_input_tokens);
81
+ }
82
+ lastAssistant = {
83
+ id: requestId ?? sessionId,
84
+ content: Array.isArray(message.content) ? message.content : [],
85
+ model,
86
+ };
87
+ }
88
+ }
89
+ // A session with no assistant turns has nothing to log.
90
+ if (!lastAssistant) {
91
+ return null;
92
+ }
93
+ return {
94
+ url: `claudecode://session/${sessionId}`,
95
+ method: 'POST',
96
+ status_code: 200,
97
+ request_body: {
98
+ model: sessionModel,
99
+ messages,
100
+ },
101
+ response_body: {
102
+ id: lastAssistant.id,
103
+ type: 'message',
104
+ role: 'assistant',
105
+ model: lastAssistant.model ?? sessionModel,
106
+ content: lastAssistant.content,
107
+ usage: sawUsage ? usage : undefined,
108
+ },
109
+ };
110
+ }
111
+ /**
112
+ * Find every Claude Code transcript under `projectsDir` (default `~/.claude/projects`) and build one
113
+ * conversation envelope per session. A missing directory simply yields zero sessions.
114
+ */
115
+ export async function scanSessions(options = {}) {
116
+ const dir = options.projectsDir ?? defaultProjectsDir();
117
+ let names;
118
+ try {
119
+ names = await fs.readdir(dir, { recursive: true });
120
+ }
121
+ catch (err) {
122
+ if (err.code === 'ENOENT') {
123
+ return { envelopes: [], sessionCount: 0 };
124
+ }
125
+ throw err;
126
+ }
127
+ const files = names.filter((name) => name.endsWith('.jsonl'));
128
+ const envelopes = [];
129
+ let sessionCount = 0;
130
+ for (const relativePath of files) {
131
+ let content;
132
+ try {
133
+ content = await fs.readFile(path.join(dir, relativePath), 'utf8');
134
+ }
135
+ catch {
136
+ // Unreadable transcript — skip it rather than failing the whole scan.
137
+ continue;
138
+ }
139
+ sessionCount += 1;
140
+ const sessionId = path.basename(relativePath, '.jsonl');
141
+ const envelope = parseTranscript(content, sessionId);
142
+ if (envelope) {
143
+ envelopes.push(envelope);
144
+ }
145
+ }
146
+ return { envelopes, sessionCount };
147
+ }
148
+ /** The session id this envelope represents — used as the local dedup key. */
149
+ export function sessionIdOf(envelope) {
150
+ return envelope.url.replace(/^claudecode:\/\/session\//, '');
151
+ }
152
+ //# sourceMappingURL=claude-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-scanner.js","sourceRoot":"","sources":["../../src/sessions/claude-scanner.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -71,30 +71,30 @@ export interface GetOptimizationOptions {
71
71
  json?: boolean;
72
72
  clientId?: string;
73
73
  }
74
- export interface AddOptimizationCommentOptions {
75
- id: string;
76
- comment: string;
77
- json?: boolean;
78
- clientId?: string;
79
- }
80
74
  export interface CloseOptimizationOptions {
81
75
  id: string;
82
76
  reason: string;
83
77
  json?: boolean;
84
78
  clientId?: string;
85
79
  }
86
- export interface CreateOptimizationOptions {
80
+ export interface UpdateOptimizationOptions {
81
+ id: string;
87
82
  title?: string;
88
83
  analysis?: string;
89
84
  plan?: string;
90
85
  json?: boolean;
91
86
  clientId?: string;
92
87
  }
93
- export interface UpdateOptimizationOptions {
94
- id: string;
95
- title?: string;
96
- analysis?: string;
97
- plan?: string;
88
+ export interface CaptureSessionsOptions {
89
+ dryRun?: boolean;
90
+ clientId?: string;
91
+ json?: boolean;
92
+ }
93
+ export interface ComplaintBoxOptions {
94
+ complaint: string;
95
+ agentName: string;
96
+ thinking?: string;
97
+ logId?: number;
98
98
  json?: boolean;
99
99
  clientId?: string;
100
100
  }
@@ -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/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.3.1";
5
+ export declare const PACKAGE_VERSION = "0.4.0";
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.3.1";
10
+ export declare const PACKAGE_IDENTIFIER = "coolhand-cli-0.4.0";
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.3.1';
5
+ export const PACKAGE_VERSION = '0.4.0';
6
6
  export const PACKAGE_NAME = 'coolhand-cli';
7
7
  /**
8
8
  * Full package identifier
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coolhand-cli",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "CLI for authenticating with Coolhand and retrieving API tokens from a local dev environment",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -58,7 +58,11 @@
58
58
  "clean": "rm -rf dist coverage",
59
59
  "smoke": "node dist/bin.js --version"
60
60
  },
61
+ "dependencies": {
62
+ "coolhand-node": "^0.7.0"
63
+ },
61
64
  "devDependencies": {
65
+ "@eslint/js": "^9.36.0",
62
66
  "@types/jest": "^30.0.0",
63
67
  "@types/node": "^20.0.0",
64
68
  "@typescript-eslint/eslint-plugin": "^8.45.0",
@@ -69,7 +73,6 @@
69
73
  "jest": "^30.2.0",
70
74
  "ts-jest": "^29.4.4",
71
75
  "ts-node": "^10.9.0",
72
- "typescript": "^5.0.0",
73
- "@eslint/js": "^9.36.0"
76
+ "typescript": "^5.0.0"
74
77
  }
75
78
  }