coolhand-cli 0.5.2 → 0.7.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.
Files changed (91) hide show
  1. package/README.md +27 -121
  2. package/dist/api/last-sync.d.ts +5 -0
  3. package/dist/api/last-sync.d.ts.map +1 -1
  4. package/dist/api/last-sync.js +5 -0
  5. package/dist/api/last-sync.js.map +1 -1
  6. package/dist/auth/callback-server.js +3 -3
  7. package/dist/auth/callback-server.js.map +1 -1
  8. package/dist/cli.d.ts +10 -0
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +320 -37
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/analyze-claude-sessions.d.ts.map +1 -1
  13. package/dist/commands/analyze-claude-sessions.js +37 -6
  14. package/dist/commands/analyze-claude-sessions.js.map +1 -1
  15. package/dist/commands/claude.d.ts +10 -10
  16. package/dist/commands/claude.d.ts.map +1 -1
  17. package/dist/commands/claude.js +6 -77
  18. package/dist/commands/claude.js.map +1 -1
  19. package/dist/commands/clients.js +1 -1
  20. package/dist/commands/clients.js.map +1 -1
  21. package/dist/commands/flush-pending.d.ts +25 -0
  22. package/dist/commands/flush-pending.d.ts.map +1 -0
  23. package/dist/commands/flush-pending.js +100 -0
  24. package/dist/commands/flush-pending.js.map +1 -0
  25. package/dist/commands/get-workload.d.ts +3 -0
  26. package/dist/commands/get-workload.d.ts.map +1 -0
  27. package/dist/commands/get-workload.js +28 -0
  28. package/dist/commands/get-workload.js.map +1 -0
  29. package/dist/commands/list-workloads.d.ts +3 -0
  30. package/dist/commands/list-workloads.d.ts.map +1 -0
  31. package/dist/commands/list-workloads.js +52 -0
  32. package/dist/commands/list-workloads.js.map +1 -0
  33. package/dist/commands/login.d.ts.map +1 -1
  34. package/dist/commands/login.js +41 -6
  35. package/dist/commands/login.js.map +1 -1
  36. package/dist/commands/mcp-call.d.ts.map +1 -1
  37. package/dist/commands/mcp-call.js +57 -10
  38. package/dist/commands/mcp-call.js.map +1 -1
  39. package/dist/commands/monitor.d.ts +9 -0
  40. package/dist/commands/monitor.d.ts.map +1 -0
  41. package/dist/commands/monitor.js +10 -0
  42. package/dist/commands/monitor.js.map +1 -0
  43. package/dist/commands/status.js +2 -2
  44. package/dist/commands/status.js.map +1 -1
  45. package/dist/commands/update-workload.d.ts +3 -0
  46. package/dist/commands/update-workload.d.ts.map +1 -0
  47. package/dist/commands/update-workload.js +35 -0
  48. package/dist/commands/update-workload.js.map +1 -0
  49. package/dist/commands/whoami.js +1 -1
  50. package/dist/commands/whoami.js.map +1 -1
  51. package/dist/commands/wildcard.d.ts.map +1 -1
  52. package/dist/commands/wildcard.js +118 -20
  53. package/dist/commands/wildcard.js.map +1 -1
  54. package/dist/config.d.ts +16 -0
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +127 -6
  57. package/dist/config.js.map +1 -1
  58. package/dist/pending-store.d.ts +31 -0
  59. package/dist/pending-store.d.ts.map +1 -0
  60. package/dist/pending-store.js +81 -0
  61. package/dist/pending-store.js.map +1 -0
  62. package/dist/prompt.d.ts +13 -0
  63. package/dist/prompt.d.ts.map +1 -0
  64. package/dist/prompt.js +30 -0
  65. package/dist/prompt.js.map +1 -0
  66. package/dist/proxy/certs.d.ts +14 -0
  67. package/dist/proxy/certs.d.ts.map +1 -0
  68. package/dist/proxy/certs.js +64 -0
  69. package/dist/proxy/certs.js.map +1 -0
  70. package/dist/proxy/interceptor.d.ts +16 -0
  71. package/dist/proxy/interceptor.d.ts.map +1 -0
  72. package/dist/proxy/interceptor.js +57 -0
  73. package/dist/proxy/interceptor.js.map +1 -0
  74. package/dist/proxy/proxy.d.ts +20 -0
  75. package/dist/proxy/proxy.d.ts.map +1 -0
  76. package/dist/proxy/proxy.js +114 -0
  77. package/dist/proxy/proxy.js.map +1 -0
  78. package/dist/proxy/sender.d.ts +32 -0
  79. package/dist/proxy/sender.d.ts.map +1 -0
  80. package/dist/proxy/sender.js +66 -0
  81. package/dist/proxy/sender.js.map +1 -0
  82. package/dist/proxy/wrap-runner.d.ts +36 -0
  83. package/dist/proxy/wrap-runner.d.ts.map +1 -0
  84. package/dist/proxy/wrap-runner.js +153 -0
  85. package/dist/proxy/wrap-runner.js.map +1 -0
  86. package/dist/types.d.ts +29 -2
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/types.js.map +1 -1
  89. package/dist/version.d.ts +2 -2
  90. package/dist/version.js +1 -1
  91. package/package.json +2 -2
@@ -1,20 +1,57 @@
1
1
  import { CliError } from '../errors.js';
2
- import { loadConfig, getClient } from '../config.js';
2
+ import { loadConfig, resolveClient } from '../config.js';
3
3
  import { DEFAULT_BASE_URL } from '../types.js';
4
4
  export async function mcpCall(toolName, args, opts = {}) {
5
5
  const cfg = await loadConfig();
6
- const client = getClient(cfg, opts.clientId);
7
- if (opts.clientId && !client) {
8
- throw new CliError('CLIENT_NOT_FOUND', `No client "${opts.clientId}" is configured.`);
6
+ const hasStoredClients = Object.keys(cfg.clients).length > 0;
7
+ const envPrivateKey = process.env.COOLHAND_PRIVATE_KEY;
8
+ // Resolve the client. The catch only handles resolveClient failures — the
9
+ // NO_PRIVATE_KEY check is intentionally outside this try so unrelated throws
10
+ // don't accidentally pass through the fallback guard.
11
+ let resolvedClient;
12
+ try {
13
+ resolvedClient = await resolveClient(cfg, opts.clientId);
14
+ }
15
+ catch (err) {
16
+ // Zero-config fallback: when there are no stored clients, fall back to
17
+ // COOLHAND_PRIVATE_KEY (raw env key). Guards:
18
+ // - opts.clientId must be undefined: an explicit --client-id flag names a specific
19
+ // account, so silently falling back would be confusing.
20
+ // - COOLHAND_CLIENT_ID must not be set: if the user set the env var, that is an
21
+ // intentional selection we should not silently override.
22
+ // - !hasStoredClients: if clients ARE stored, resolution failure (e.g. no default,
23
+ // non-TTY) should surface, not fall back to env key.
24
+ // With all three guards true (no explicit clientId, no COOLHAND_CLIENT_ID, no stored
25
+ // clients), the priority chain skips steps 1–3 and falls to step 4 (no clients), so
26
+ // resolveClient throws NOT_CONFIGURED. CLIENT_NOT_FOUND is not reachable here because
27
+ // that requires an explicit selection (step 1 or 2) which the guards above rule out.
28
+ if (err instanceof CliError &&
29
+ err.code === 'NOT_CONFIGURED' &&
30
+ opts.clientId === undefined &&
31
+ !process.env.COOLHAND_CLIENT_ID &&
32
+ !hasStoredClients &&
33
+ envPrivateKey) {
34
+ // resolvedClient stays undefined — handled in the branch below
35
+ }
36
+ else {
37
+ throw err;
38
+ }
9
39
  }
10
- if (!client && !process.env.COOLHAND_PRIVATE_KEY) {
11
- throw new CliError('NOT_CONFIGURED', 'Not logged in. Run `coolhand login --scope private` to authenticate.');
40
+ let privateKey;
41
+ let baseUrl;
42
+ if (resolvedClient !== undefined) {
43
+ if (!resolvedClient.private_key) {
44
+ throw new CliError('NO_PRIVATE_KEY', "No private key configured. Run 'coolhand login --scope private' first.");
45
+ }
46
+ privateKey = resolvedClient.private_key;
47
+ baseUrl = resolvedClient.base_url;
12
48
  }
13
- const privateKey = opts.clientId ? client?.private_key : (client?.private_key ?? process.env.COOLHAND_PRIVATE_KEY);
14
- if (!privateKey) {
15
- throw new CliError('NO_PRIVATE_KEY', "No private key configured. Run 'coolhand login --scope private' first.");
49
+ else {
50
+ // Zero-config fallback path: envPrivateKey is guaranteed non-null here because
51
+ // the catch condition above requires it (the catch would have re-thrown otherwise).
52
+ privateKey = envPrivateKey;
53
+ baseUrl = DEFAULT_BASE_URL;
16
54
  }
17
- const baseUrl = client?.base_url ?? DEFAULT_BASE_URL;
18
55
  let parsedBaseUrl;
19
56
  try {
20
57
  parsedBaseUrl = new URL(baseUrl);
@@ -61,6 +98,16 @@ export async function mcpCall(toolName, args, opts = {}) {
61
98
  if (json.error) {
62
99
  throw new CliError('MCP_ERROR', `MCP error: ${json.error.message ?? JSON.stringify(json.error)}`);
63
100
  }
101
+ // A tool call can also fail at the tool-execution level (e.g. a business-rule
102
+ // rejection like "Cannot rename system workloads") while the JSON-RPC envelope
103
+ // itself reports success. Every tool in this backend returns that case as a plain
104
+ // `{ error: "..." }` result hash rather than a top-level JSON-RPC `error`.
105
+ if (json.result !== null && typeof json.result === 'object' && !Array.isArray(json.result)) {
106
+ const result = json.result;
107
+ if (typeof result.error === 'string' && result.error.length > 0) {
108
+ throw new CliError('MCP_ERROR', result.error);
109
+ }
110
+ }
64
111
  return json.result;
65
112
  }
66
113
  //# sourceMappingURL=mcp-call.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-call.js","sourceRoot":"","sources":["../../src/commands/mcp-call.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-call.js","sourceRoot":"","sources":["../../src/commands/mcp-call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MonitorOptions } from '../types.js';
2
+ import { type WrapDeps } from '../proxy/wrap-runner.js';
3
+ /**
4
+ * `coolhand monitor [--] <command> [args...]` — run an arbitrary CLI behind the
5
+ * Coolhand proxy with the stored API key filled in. Generalizes the `claude`
6
+ * command's proxy wiring to any child command.
7
+ */
8
+ export declare function run(opts: MonitorOptions, deps?: WrapDeps): Promise<number>;
9
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpF"}
@@ -0,0 +1,10 @@
1
+ import { runWrapped } from '../proxy/wrap-runner.js';
2
+ /**
3
+ * `coolhand monitor [--] <command> [args...]` — run an arbitrary CLI behind the
4
+ * Coolhand proxy with the stored API key filled in. Generalizes the `claude`
5
+ * command's proxy wiring to any child command.
6
+ */
7
+ export async function run(opts, deps = {}) {
8
+ return runWrapped(opts.command, opts.args, opts.clientId, deps);
9
+ }
10
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAiB,MAAM,yBAAyB,CAAC;AAEpE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAoB,EAAE,OAAiB,EAAE;IACjE,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC"}
@@ -6,7 +6,7 @@ export function buildStatusOutput(cfg) {
6
6
  const clients = Object.values(cfg.clients).map((entry) => ({
7
7
  client_id: entry.client_id,
8
8
  client_name: entry.client_name,
9
- masked_token: maskToken(entry.api_key),
9
+ masked_token: entry.api_key ? maskToken(entry.api_key) : '(no public key)',
10
10
  base_url: entry.base_url,
11
11
  }));
12
12
  return {
@@ -24,7 +24,7 @@ export async function run(opts) {
24
24
  logger.json({ ...output, configured });
25
25
  }
26
26
  else if (configured && target) {
27
- logger.info(`Configured: "${target.client_name}" (${target.client_id}) — ${maskToken(target.api_key)}`);
27
+ logger.info(`Configured: "${target.client_name}" (${target.client_id}) — ${target.api_key ? maskToken(target.api_key) : '(no public key)'}`);
28
28
  }
29
29
  else if (opts.clientId) {
30
30
  logger.info(`No token configured for client "${opts.clientId}".`);
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,UAAU,iBAAiB,CAAC,GAA2C;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;QACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;QAC9B,OAAO;QACP,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAmB;IAC3C,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;IAEvE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,WAAW,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,UAAU,iBAAiB,CAAC,GAA2C;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB;QAC1E,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;QAC9B,OAAO;QACP,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAmB;IAC3C,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;IAEvE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,WAAW,MAAM,MAAM,CAAC,SAAS,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC/I,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;AACxD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { UpdateWorkloadOptions } from '../types.js';
2
+ export declare function run(opts: UpdateWorkloadOptions): Promise<number>;
3
+ //# sourceMappingURL=update-workload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-workload.d.ts","sourceRoot":"","sources":["../../src/commands/update-workload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAsB,GAAG,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BtE"}
@@ -0,0 +1,35 @@
1
+ import { CliError, ExitCode } from '../errors.js';
2
+ import { logger, redact } from '../logger.js';
3
+ import { mcpCall } from './mcp-call.js';
4
+ export async function run(opts) {
5
+ try {
6
+ const args = { workload_id: opts.id };
7
+ if (opts.name !== undefined) {
8
+ args.name = opts.name;
9
+ }
10
+ if (opts.description !== undefined) {
11
+ args.description = opts.description;
12
+ }
13
+ const result = await mcpCall('update_workload', args, { clientId: opts.clientId });
14
+ if (opts.json) {
15
+ logger.json({ ok: true, result });
16
+ }
17
+ else {
18
+ logger.info(JSON.stringify(result, null, 2));
19
+ }
20
+ return ExitCode.OK;
21
+ }
22
+ catch (err) {
23
+ if (err instanceof CliError) {
24
+ if (opts.json) {
25
+ logger.json({ ok: false, error: err.code, message: redact(err.message) });
26
+ }
27
+ else {
28
+ logger.info(`Error: ${redact(err.message)} [${err.code}]`);
29
+ }
30
+ return err.exitCode;
31
+ }
32
+ throw err;
33
+ }
34
+ }
35
+ //# sourceMappingURL=update-workload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-workload.js","sourceRoot":"","sources":["../../src/commands/update-workload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAA2B;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAA4B,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,GAAG,CAAC,QAAQ,CAAC;QACtB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -14,7 +14,7 @@ export async function run(opts) {
14
14
  }
15
15
  return ExitCode.USER_ERROR;
16
16
  }
17
- logger.info(`Logged in as "${entry.client_name}" (id: ${entry.client_id}) via ${entry.base_url} — ${maskToken(entry.api_key)}`);
17
+ logger.info(`Logged in as "${entry.client_name}" (id: ${entry.client_id}) via ${entry.base_url} — ${entry.api_key ? maskToken(entry.api_key) : '(no public key)'}`);
18
18
  return ExitCode.OK;
19
19
  }
20
20
  //# sourceMappingURL=whoami.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAmB;IAC3C,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,kBAAkB,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,IAAI,CACT,iBAAiB,KAAK,CAAC,WAAW,UAAU,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,QAAQ,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CACnH,CAAC;IACF,OAAO,QAAQ,CAAC,EAAE,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAmB;IAC3C,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,kBAAkB,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,IAAI,CACT,iBAAiB,KAAK,CAAC,WAAW,UAAU,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,QAAQ,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CACvJ,CAAC;IACF,OAAO,QAAQ,CAAC,EAAE,CAAC;AACrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wildcard.d.ts","sourceRoot":"","sources":["../../src/commands/wildcard.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAoBzE;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CpE"}
1
+ {"version":3,"file":"wildcard.d.ts","sourceRoot":"","sources":["../../src/commands/wildcard.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA6BzE;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsIpE"}
@@ -1,8 +1,9 @@
1
1
  import { Coolhand } from 'coolhand-node';
2
- import { ExitCode } from '../errors.js';
2
+ import { ExitCode, CliError } from '../errors.js';
3
3
  import { PACKAGE_IDENTIFIER } from '../version.js';
4
4
  import { logger, redact } from '../logger.js';
5
- import { loadConfig, getClient } from '../config.js';
5
+ import { loadConfig, resolveClient } from '../config.js';
6
+ import { savePendingRecord } from '../pending-store.js';
6
7
  import { DEFAULT_BASE_URL } from '../types.js';
7
8
  // Terminal guidance that breaks the agent out of its retry loop. The missing
8
9
  // capability is real regardless of whether we could reach the Coolhand server, so
@@ -10,11 +11,18 @@ import { DEFAULT_BASE_URL } from '../types.js';
10
11
  const STOP_GUIDANCE = 'Do not retry this action or attempt alternative ways to perform it; continue with the rest of your task.';
11
12
  // Printed when the blocker was successfully recorded server-side.
12
13
  const DELOOP_RECORDED = 'This capability is not available in this environment. Your feedback has been recorded. ' + STOP_GUIDANCE;
13
- // Printed when the blocker could NOT be recorded (e.g. not logged in, or the server
14
- // did not confirm). We still de-loop the agent, but stay honest: we never claim a
15
- // recording happened, and a warning is logged separately so the failure surfaces.
14
+ // Printed when the blocker could NOT be recorded (e.g. the server did not confirm).
15
+ // We still de-loop the agent, but stay honest: we never claim a recording happened,
16
+ // and a warning is logged separately so the failure surfaces.
16
17
  const DELOOP_UNRECORDED = 'This capability is not available in this environment. Your feedback could not be recorded ' +
17
- '(not logged in, or the server did not confirm — run `coolhand login` to enable reporting). ' +
18
+ '(the server did not confirm — run `coolhand login` to enable reporting). ' +
19
+ STOP_GUIDANCE;
20
+ // Printed when the blocker was saved locally because the API key is unavailable
21
+ // (not logged in, no default client set, or private-only login). The data is not
22
+ // lost: it uploads when credentials are available. The specific reason is already
23
+ // in the logger.warn() call above, so this message stays generic.
24
+ const DELOOP_SAVED = 'This capability is not available in this environment. Your feedback was saved locally ' +
25
+ 'and will be uploaded once a Coolhand account with a public API key is configured. ' +
18
26
  STOP_GUIDANCE;
19
27
  /**
20
28
  * Records an agent's free-form "I am blocked, this capability does not exist"
@@ -28,26 +36,84 @@ const DELOOP_UNRECORDED = 'This capability is not available in this environment.
28
36
  */
29
37
  export async function run(opts) {
30
38
  let recorded = false;
39
+ let savedPath;
40
+ // Set when client selection itself fails (prompt timeout / invalid input), so the de-loop
41
+ // message accurately reflects "selection not completed" rather than "server did not confirm".
42
+ let deloopFallback;
43
+ // The SDK resolves to null (it does not throw) when the write fails, so a truthy
44
+ // response is the only proof the blocker was actually recorded.
45
+ const feedback = {
46
+ explanation: opts.complaint,
47
+ creator_unique_id: opts.agentName,
48
+ creator_type: 'agent',
49
+ collector: `${PACKAGE_IDENTIFIER}/wildcard`,
50
+ ...(opts.thinking ? { original_output: opts.thinking } : {}),
51
+ ...(opts.logId !== undefined ? { llm_request_log_id: opts.logId } : {}),
52
+ };
31
53
  try {
32
54
  const cfg = await loadConfig();
33
- const client = getClient(cfg, opts.clientId);
55
+ // resolveClient runs the full priority chain (env var, default, auto-pick, stale warning).
56
+ // wildcard works even without a client, so we catch NOT_CONFIGURED and proceed silently.
57
+ let client;
58
+ try {
59
+ client = await resolveClient(cfg, opts.clientId);
60
+ }
61
+ catch (err) {
62
+ // NOT_CONFIGURED is swallowed in both sub-cases:
63
+ // (a) no clients stored at all → proceed unauthenticated (no accounts configured)
64
+ // (b) clients stored but non-TTY with no default → also proceed, but the
65
+ // warning block below (lines 96-109) distinguishes and warns accordingly.
66
+ // Any other error (CLIENT_NOT_FOUND for a bad --client-id, INVALID_ARGS for a
67
+ // prompt timeout, etc.) propagates to the outer catch, which logs a warning and
68
+ // still de-loops — the recording failure surfaces but the agent is freed.
69
+ if (!(err instanceof CliError) || err.code !== 'NOT_CONFIGURED') {
70
+ throw err;
71
+ }
72
+ }
73
+ // If COOLHAND_API_KEY is set in the environment it acts as a raw API key fallback for both
74
+ // sub-cases of NOT_CONFIGURED: (a) no clients stored at all — the intended zero-config agent
75
+ // path, and (b) clients stored but none auto-selected (non-TTY, no default). Sub-case (b)
76
+ // bypasses the three-way warning discriminator below and the "Client: ..." stderr label; this
77
+ // is intentional — wildcard is best-effort and using the env key is better than dropping the
78
+ // record. mcp-call explicitly does NOT allow this fallback (it surfaces the resolution error).
34
79
  const apiKey = client?.api_key ?? process.env.COOLHAND_API_KEY;
35
80
  const baseUrl = client?.base_url ?? DEFAULT_BASE_URL;
36
81
  if (!apiKey) {
37
- logger.warn('Not logged in; blocker feedback was not recorded. Run `coolhand login` to enable reporting.');
82
+ // No usable API key: save the blocker locally so it isn't lost. Uploads on
83
+ // the next `coolhand login` (or when credentials are otherwise supplied).
84
+ savedPath = await savePendingRecord({
85
+ command: 'report-blocker',
86
+ kind: 'feedback',
87
+ payload: feedback,
88
+ // Prefer the resolved client_id (known even for private-only clients).
89
+ // Fall back to opts.clientId only when no client was resolved at all.
90
+ ...(client !== undefined
91
+ ? { clientId: client.client_id }
92
+ : opts.clientId !== undefined
93
+ ? { clientId: opts.clientId }
94
+ : {}),
95
+ savedAt: new Date().toISOString(),
96
+ });
97
+ if (client) {
98
+ // Client resolved but has no public API key (private-only login).
99
+ logger.warn(`No public API key configured for "${client.client_name}". ` +
100
+ `Blocker feedback saved locally to ${savedPath}. ` +
101
+ `Re-authenticate with 'coolhand login' to grant the public key.`);
102
+ }
103
+ else if (Object.keys(cfg.clients).length > 0) {
104
+ // Clients are stored but none could be auto-selected (non-TTY, no default set).
105
+ logger.warn(`No default client is set and auto-selection is unavailable in non-interactive mode. ` +
106
+ `Blocker feedback saved locally to ${savedPath}. ` +
107
+ `Pass --client-id or run 'coolhand clients use <id>' to enable direct posting.`);
108
+ }
109
+ else {
110
+ // No clients configured at all.
111
+ logger.warn(`Not logged in; blocker feedback saved locally to ${savedPath}. ` +
112
+ 'It will upload on your next `coolhand login`.');
113
+ }
38
114
  }
39
115
  else {
40
116
  const coolhand = new Coolhand({ apiKey, baseUrl, silent: true });
41
- // The SDK resolves to null (it does not throw) when the write fails, so a
42
- // truthy response is the only proof the blocker was actually recorded.
43
- const feedback = {
44
- explanation: opts.complaint,
45
- creator_unique_id: opts.agentName,
46
- creator_type: 'agent',
47
- collector: `${PACKAGE_IDENTIFIER}/wildcard`,
48
- ...(opts.thinking ? { original_output: opts.thinking } : {}),
49
- ...(opts.logId !== undefined ? { llm_request_log_id: opts.logId } : {}),
50
- };
51
117
  const result = await coolhand.createFeedback(feedback);
52
118
  recorded = result !== null && result !== undefined;
53
119
  if (!recorded) {
@@ -56,15 +122,47 @@ export async function run(opts) {
56
122
  }
57
123
  }
58
124
  catch (err) {
125
+ // Note: errors that reach here (CLIENT_NOT_FOUND for a bad --client-id, INVALID_ARGS for a
126
+ // prompt timeout, SDK network errors, etc.) bypass the !apiKey branch above, so neither the
127
+ // env-key fallback nor the local-save path is attempted. The feedback is not persisted.
128
+ // This is intentional for CLIENT_NOT_FOUND: if the user named an explicit --client-id that
129
+ // doesn't exist, silently falling back to COOLHAND_API_KEY would be surprising. The agent
130
+ // is still de-looped and the failure surfaces as a warning.
131
+ if (err instanceof CliError && err.code === 'CLIENT_NOT_FOUND') {
132
+ // Bad --client-id value — not a server or auth failure; give actionable guidance.
133
+ deloopFallback =
134
+ 'This capability is not available in this environment. The specified client was not found ' +
135
+ '(pass --client-id with a valid client ID, or run `coolhand clients` to list configured clients). ' +
136
+ STOP_GUIDANCE;
137
+ }
138
+ else if (err instanceof CliError && err.code === 'INVALID_ARGS') {
139
+ // Client selection prompt timed out or received invalid input — not a server failure.
140
+ deloopFallback =
141
+ 'This capability is not available in this environment. Client selection was not completed ' +
142
+ '(prompt timed out or received invalid input — pass --client-id to select a client directly). ' +
143
+ STOP_GUIDANCE;
144
+ }
59
145
  logger.warn(`Could not record blocker feedback: ${redact(err.message)}`);
60
146
  }
61
147
  // Always de-loop: the capability genuinely does not exist, so the agent must stop
62
148
  // whether or not we could notify the server. Stay honest about the recording status
63
149
  // (warnings above already surfaced any failure) rather than gating the stop-signal
64
150
  // on a confirmed write and leaving a logged-out agent stuck.
65
- const message = recorded ? DELOOP_RECORDED : DELOOP_UNRECORDED;
151
+ let message;
152
+ if (recorded) {
153
+ message = DELOOP_RECORDED;
154
+ }
155
+ else if (savedPath) {
156
+ message = DELOOP_SAVED;
157
+ }
158
+ else if (deloopFallback) {
159
+ message = deloopFallback;
160
+ }
161
+ else {
162
+ message = DELOOP_UNRECORDED;
163
+ }
66
164
  if (opts.json === true) {
67
- logger.json({ ok: true, recorded, message });
165
+ logger.json({ ok: true, recorded, saved: savedPath ?? null, message });
68
166
  }
69
167
  else {
70
168
  logger.info(message);
@@ -1 +1 @@
1
- {"version":3,"file":"wildcard.js","sourceRoot":"","sources":["../../src/commands/wildcard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wildcard.js","sourceRoot":"","sources":["../../src/commands/wildcard.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -2,10 +2,26 @@ import type { ClientEntry, ConfigFile } from './types.js';
2
2
  export declare function configDir(): string;
3
3
  export declare function configPath(): string;
4
4
  export declare function loadConfig(): Promise<ConfigFile>;
5
+ /**
6
+ * Write a file atomically with restrictive permissions: write to a temp file in the
7
+ * same directory, then rename it into place (rename is atomic on POSIX), so a reader
8
+ * never sees a half-written file. The caller is responsible for ensuring the parent
9
+ * directory exists. Shared by `saveConfig` and the pending-record store.
10
+ */
11
+ export declare function atomicWriteFile(filePath: string, data: string, mode?: number): Promise<void>;
5
12
  export declare function saveConfig(cfg: ConfigFile): Promise<void>;
6
13
  export declare function deleteConfig(): Promise<void>;
7
14
  export declare function getClient(cfg: ConfigFile, clientId?: string): ClientEntry | undefined;
8
15
  export declare function upsertClient(entry: ClientEntry, makeDefault?: boolean): Promise<ConfigFile>;
9
16
  export declare function removeClient(clientId: string): Promise<ConfigFile | null>;
10
17
  export declare function setDefault(clientId: string): Promise<ConfigFile>;
18
+ /**
19
+ * Resolves which client to use for an API command. Priority:
20
+ * explicit clientId arg > COOLHAND_CLIENT_ID env > default_client_id config >
21
+ * auto-pick if only one client exists > interactive prompt (TTY) or error.
22
+ *
23
+ * Prints "Client: <name> (<id>)" to stderr after resolution so the user always
24
+ * knows which account's data they are looking at.
25
+ */
26
+ export declare function resolveClient(cfg: ConfigFile, clientId?: string): Promise<ClientEntry>;
11
27
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM1D,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAMD,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAyBtD;AAWD,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMrF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,UAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9F;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgB/E;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQtE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM1D,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAMD,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAyBtD;AAWD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMrF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,UAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ9F;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgB/E;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQtE;AA2CD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyE5F"}