claudish 7.32.0 → 7.33.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 (2) hide show
  1. package/dist/index.js +135 -57
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -651,7 +651,7 @@ var init_onepassword_config = __esm(() => {
651
651
  });
652
652
 
653
653
  // src/version.ts
654
- var VERSION = "7.32.0";
654
+ var VERSION = "7.33.0";
655
655
 
656
656
  // src/logger.ts
657
657
  var exports_logger = {};
@@ -912,6 +912,22 @@ var init_logger = __esm(() => {
912
912
  });
913
913
 
914
914
  // src/startup-trace.ts
915
+ var exports_startup_trace = {};
916
+ __export(exports_startup_trace, {
917
+ traceSpan: () => traceSpan,
918
+ suppressStartupTraceTerminalOutput: () => suppressStartupTraceTerminalOutput,
919
+ setStartupAuthKind: () => setStartupAuthKind,
920
+ finalizeStartupTrace: () => finalizeStartupTrace,
921
+ beginSpan: () => beginSpan,
922
+ beginQueuedSpan: () => beginQueuedSpan,
923
+ addSpanMeta: () => addSpanMeta,
924
+ __resetStartupTraceForTests: () => __resetStartupTraceForTests,
925
+ __getStartupSpansForTests: () => __getStartupSpansForTests,
926
+ __configureStartupTraceForTests: () => __configureStartupTraceForTests,
927
+ STARTUP_METRICS_MAX_LINES: () => STARTUP_METRICS_MAX_LINES,
928
+ STARTUP_METRICS_FILE: () => STARTUP_METRICS_FILE,
929
+ SLOW_START_THRESHOLD_MS: () => SLOW_START_THRESHOLD_MS
930
+ });
915
931
  import { appendFileSync, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync3 } from "fs";
916
932
  import { homedir as homedir3 } from "os";
917
933
  import { dirname, join as join3 } from "path";
@@ -1166,6 +1182,25 @@ function finalizeStartupTrace(context, opts = {}) {
1166
1182
  } catch {}
1167
1183
  } catch {}
1168
1184
  }
1185
+ function __configureStartupTraceForTests(overrides) {
1186
+ seams = { ...defaultSeams(), ...overrides };
1187
+ spans = [];
1188
+ finalized = false;
1189
+ authKind = "none";
1190
+ terminalSuppressed = false;
1191
+ suppressedLogSink = undefined;
1192
+ }
1193
+ function __resetStartupTraceForTests() {
1194
+ seams = defaultSeams();
1195
+ spans = [];
1196
+ finalized = false;
1197
+ authKind = "none";
1198
+ terminalSuppressed = false;
1199
+ suppressedLogSink = undefined;
1200
+ }
1201
+ function __getStartupSpansForTests() {
1202
+ return spans.map((s) => ({ ...s, meta: s.meta ? { ...s.meta } : undefined }));
1203
+ }
1169
1204
  var STARTUP_METRICS_FILE, STARTUP_METRICS_MAX_LINES = 500, SLOW_START_THRESHOLD_MS = 8000, MAX_BUFFERED_SPANS = 500, seams, spans, finalized = false, authKind = "none", terminalSuppressed = false, suppressedLogSink;
1170
1205
  var init_startup_trace = __esm(() => {
1171
1206
  STARTUP_METRICS_FILE = join3(homedir3(), ".claudish", "startup-metrics.jsonl");
@@ -1173,6 +1208,17 @@ var init_startup_trace = __esm(() => {
1173
1208
  spans = [];
1174
1209
  });
1175
1210
 
1211
+ // src/env-placeholder.ts
1212
+ function realValue(v) {
1213
+ if (!v)
1214
+ return;
1215
+ return UNEXPANDED_PLACEHOLDER.test(v.trim()) ? undefined : v;
1216
+ }
1217
+ var UNEXPANDED_PLACEHOLDER;
1218
+ var init_env_placeholder = __esm(() => {
1219
+ UNEXPANDED_PLACEHOLDER = /^\$\{[^}]*\}$/;
1220
+ });
1221
+
1176
1222
  // src/providers/onepassword-handshake-lock.ts
1177
1223
  import { closeSync, mkdirSync as mkdirSync3, openSync, readFileSync as readFileSync3, rmSync, statSync, writeSync } from "fs";
1178
1224
  import { homedir as homedir4 } from "os";
@@ -3785,6 +3831,7 @@ __export(exports_onepassword, {
3785
3831
  resetSdkClientCache: () => resetSdkClientCache,
3786
3832
  resetOpFailures: () => resetOpFailures,
3787
3833
  renderOpFailureNotice: () => renderOpFailureNotice,
3834
+ renderOpFailureBlock: () => renderOpFailureBlock,
3788
3835
  recordOpHydratedVars: () => recordOpHydratedVars,
3789
3836
  recordOpFailure: () => recordOpFailure,
3790
3837
  readEnvironment: () => readEnvironment,
@@ -3809,6 +3856,7 @@ __export(exports_onepassword, {
3809
3856
  detectSdkAuth: () => detectSdkAuth,
3810
3857
  defaultSdkClientFactory: () => defaultSdkClientFactory,
3811
3858
  defaultScreenLockProbe: () => defaultScreenLockProbe,
3859
+ defaultOpDefaultAccountProbe: () => defaultOpDefaultAccountProbe,
3812
3860
  defaultOpAccountLister: () => defaultOpAccountLister,
3813
3861
  defaultAppLockProbe: () => defaultAppLockProbe,
3814
3862
  currentLockCause: () => currentLockCause,
@@ -3847,9 +3895,12 @@ function wasOpAuthorizationDenied() {
3847
3895
  return opSourceFailures.some((f) => /denied authorization/i.test(f.message));
3848
3896
  }
3849
3897
  function renderOpFailureNotice(envVar) {
3898
+ return renderOpFailureBlock(`for ${envVar} this run`);
3899
+ }
3900
+ function renderOpFailureBlock(subject) {
3850
3901
  if (opSourceFailures.length === 0)
3851
3902
  return [];
3852
- const lines = [`1Password was consulted for ${envVar} this run and failed:`];
3903
+ const lines = [`1Password was consulted ${subject} and failed:`];
3853
3904
  for (const f of opSourceFailures) {
3854
3905
  const where = f.source ? `${f.kind} ${f.source}` : f.kind;
3855
3906
  lines.push(` ${where} \u2014 ${f.message.split(`
@@ -4373,7 +4424,7 @@ function detectSdkAuth(env = process.env) {
4373
4424
  }
4374
4425
  function resolveDesktopAccount(opts = {}) {
4375
4426
  const env = opts.env ?? process.env;
4376
- const envAccount = env.OP_ACCOUNT?.trim();
4427
+ const envAccount = realValue(env.OP_ACCOUNT)?.trim();
4377
4428
  if (envAccount)
4378
4429
  return { accountName: envAccount };
4379
4430
  const configAccount = opts.configAccount?.trim();
@@ -4393,10 +4444,17 @@ function resolveDesktopAccount(opts = {}) {
4393
4444
  if (opts.interactive) {
4394
4445
  return { needsPicker: accounts };
4395
4446
  }
4447
+ const probe = opts.opDefaultAccountProbe ?? defaultOpDefaultAccountProbe;
4448
+ const defaultUuid = probe();
4449
+ if (defaultUuid) {
4450
+ const match = accounts.find((a) => a.account_uuid === defaultUuid);
4451
+ if (match)
4452
+ return { accountName: match.url };
4453
+ }
4396
4454
  const listing = accounts.map((a) => ` - ${a.url}${a.email ? ` (${a.email})` : ""}`).join(`
4397
4455
  `);
4398
4456
  return {
4399
- error: `Multiple 1Password accounts are available and this is a non-interactive session, so claudish can't prompt you to pick one. ${remediation}
4457
+ error: `Multiple 1Password accounts are available, this is a non-interactive session, and \`op\` could not name a default account. ${remediation}
4400
4458
  Accounts:
4401
4459
  ${listing}`
4402
4460
  };
@@ -4410,7 +4468,8 @@ async function resolveSdkAuth(opts = {}) {
4410
4468
  env,
4411
4469
  configAccount: opts.configAccount,
4412
4470
  interactive: opts.interactive,
4413
- opAccountLister: opts.opAccountLister
4471
+ opAccountLister: opts.opAccountLister,
4472
+ opDefaultAccountProbe: opts.opDefaultAccountProbe
4414
4473
  });
4415
4474
  if ("accountName" in result) {
4416
4475
  return { kind: "desktop", accountName: result.accountName };
@@ -4578,8 +4637,19 @@ var OP_REF_RE, opHydratedVars, opSourceFailures, ENV_VAR_NAME_RE, sdkClientCache
4578
4637
  } catch {
4579
4638
  return null;
4580
4639
  }
4640
+ }, defaultOpDefaultAccountProbe = () => {
4641
+ try {
4642
+ const res = spawnSync("op", ["account", "get", "--format=json"], { encoding: "utf-8" });
4643
+ if (res.error || res.status !== 0)
4644
+ return null;
4645
+ const parsed = JSON.parse(res.stdout ?? "");
4646
+ return typeof parsed.id === "string" && parsed.id ? parsed.id : null;
4647
+ } catch {
4648
+ return null;
4649
+ }
4581
4650
  };
4582
4651
  var init_onepassword = __esm(() => {
4652
+ init_env_placeholder();
4583
4653
  init_startup_trace();
4584
4654
  init_onepassword_handshake_lock();
4585
4655
  OP_REF_RE = /^op:\/\/[^\s]+$/;
@@ -29656,11 +29726,6 @@ var init_antigravity_credential = __esm(() => {
29656
29726
  import { existsSync as existsSync8 } from "fs";
29657
29727
  import { homedir as homedir10 } from "os";
29658
29728
  import { join as join10 } from "path";
29659
- function realValue(v) {
29660
- if (!v)
29661
- return;
29662
- return UNEXPANDED_PLACEHOLDER.test(v.trim()) ? undefined : v;
29663
- }
29664
29729
 
29665
29730
  class ApiKeyCredentialProvider {
29666
29731
  catalogName;
@@ -29763,11 +29828,10 @@ class ApiKeyCredentialProvider {
29763
29828
  return { headers };
29764
29829
  }
29765
29830
  }
29766
- var UNEXPANDED_PLACEHOLDER;
29767
29831
  var init_api_key_credential = __esm(() => {
29832
+ init_env_placeholder();
29768
29833
  init_profile_config();
29769
29834
  init_op_source();
29770
- UNEXPANDED_PLACEHOLDER = /^\$\{[^}]*\}$/;
29771
29835
  });
29772
29836
 
29773
29837
  // src/auth/codex-oauth.ts
@@ -33319,44 +33383,6 @@ async function isPortAvailable(port) {
33319
33383
  }
33320
33384
  var init_port_manager = () => {};
33321
33385
 
33322
- // src/redact.ts
33323
- function isPlaceholder(value) {
33324
- return PLACEHOLDER.test(value.trim());
33325
- }
33326
- function redactSecrets(text) {
33327
- if (!text)
33328
- return "";
33329
- let out = text;
33330
- out = out.replace(ASSIGNMENT_RE, (match, lhs, value) => isPlaceholder(value) ? match : `${lhs}${MASK}`);
33331
- for (const { re } of TOKEN_PATTERNS) {
33332
- out = out.replace(re, (match) => {
33333
- const scheme = /^(Bearer|Basic|Token)\s/.exec(match);
33334
- return scheme ? `${scheme[1]} ${MASK}` : MASK;
33335
- });
33336
- }
33337
- return out;
33338
- }
33339
- function sanitizeForReport(text) {
33340
- if (!text)
33341
- return "";
33342
- return redactSecrets(text).replace(/\/Users\/[^/\s]+/g, "/Users/***").replace(/\/home\/[^/\s]+/g, "/home/***").replace(/[A-Z]:\\Users\\[^\\\s]+/gi, "C:\\Users\\***").replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, "***@***.***");
33343
- }
33344
- var MASK = "***REDACTED***", PLACEHOLDER, ASSIGNMENT_RE, TOKEN_PATTERNS;
33345
- var init_redact = __esm(() => {
33346
- PLACEHOLDER = /^(['"`]?)(your[-_a-z0-9]*|<[^>]*>|\.\.\.|x{3,}|\*{3,}|REDACTED|CHANGEME|TODO|\$\{[^}]*\}|)(['"`]?)$/i;
33347
- ASSIGNMENT_RE = /(["']?\b[A-Z][A-Z0-9_]*(?:_API_KEY|_KEY|_TOKEN|_SECRET|_PASSWORD)\b["']?\s*[:=]\s*)(["'`]?\$\{[^}]*\}["'`]?|["'`]?[^\s"'`,}]+["'`]?)/g;
33348
- TOKEN_PATTERNS = [
33349
- { name: "sk", re: /\bsk-[A-Za-z0-9_-]{16,}/g },
33350
- { name: "google", re: /\bAIza[A-Za-z0-9_-]{20,}/g },
33351
- { name: "xai", re: /\bxai-[A-Za-z0-9_-]{16,}/g },
33352
- { name: "github", re: /\bgh[posur]_[A-Za-z0-9]{20,}/g },
33353
- { name: "aws", re: /\bAKIA[0-9A-Z]{12,}/g },
33354
- { name: "jwt", re: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g },
33355
- { name: "zhipu", re: /\b[0-9a-f]{32}\.[A-Za-z0-9]{16}\b/g },
33356
- { name: "bearer", re: /\b(?:Bearer|Basic|Token)\s+[A-Za-z0-9_.\-+/=]{12,}/g }
33357
- ];
33358
- });
33359
-
33360
33386
  // ../../node_modules/.bun/hono@4.10.6/node_modules/hono/dist/compose.js
33361
33387
  var compose = (middleware, onError, onNotFound) => {
33362
33388
  return (context, next) => {
@@ -47273,6 +47299,44 @@ var init_proxy_server = __esm(() => {
47273
47299
  };
47274
47300
  });
47275
47301
 
47302
+ // src/redact.ts
47303
+ function isPlaceholder(value) {
47304
+ return PLACEHOLDER.test(value.trim());
47305
+ }
47306
+ function redactSecrets(text) {
47307
+ if (!text)
47308
+ return "";
47309
+ let out = text;
47310
+ out = out.replace(ASSIGNMENT_RE, (match2, lhs, value) => isPlaceholder(value) ? match2 : `${lhs}${MASK}`);
47311
+ for (const { re } of TOKEN_PATTERNS) {
47312
+ out = out.replace(re, (match2) => {
47313
+ const scheme = /^(Bearer|Basic|Token)\s/.exec(match2);
47314
+ return scheme ? `${scheme[1]} ${MASK}` : MASK;
47315
+ });
47316
+ }
47317
+ return out;
47318
+ }
47319
+ function sanitizeForReport(text) {
47320
+ if (!text)
47321
+ return "";
47322
+ return redactSecrets(text).replace(/\/Users\/[^/\s]+/g, "/Users/***").replace(/\/home\/[^/\s]+/g, "/home/***").replace(/[A-Z]:\\Users\\[^\\\s]+/gi, "C:\\Users\\***").replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, "***@***.***");
47323
+ }
47324
+ var MASK = "***REDACTED***", PLACEHOLDER, ASSIGNMENT_RE, TOKEN_PATTERNS;
47325
+ var init_redact = __esm(() => {
47326
+ PLACEHOLDER = /^(['"`]?)(your[-_a-z0-9]*|<[^>]*>|\.\.\.|x{3,}|\*{3,}|REDACTED|CHANGEME|TODO|\$\{[^}]*\}|)(['"`]?)$/i;
47327
+ ASSIGNMENT_RE = /(["']?\b[A-Z][A-Z0-9_]*(?:_API_KEY|_KEY|_TOKEN|_SECRET|_PASSWORD)\b["']?\s*[:=]\s*)(["'`]?\$\{[^}]*\}["'`]?|["'`]?[^\s"'`,}]+["'`]?)/g;
47328
+ TOKEN_PATTERNS = [
47329
+ { name: "sk", re: /\bsk-[A-Za-z0-9_-]{16,}/g },
47330
+ { name: "google", re: /\bAIza[A-Za-z0-9_-]{20,}/g },
47331
+ { name: "xai", re: /\bxai-[A-Za-z0-9_-]{16,}/g },
47332
+ { name: "github", re: /\bgh[posur]_[A-Za-z0-9]{20,}/g },
47333
+ { name: "aws", re: /\bAKIA[0-9A-Z]{12,}/g },
47334
+ { name: "jwt", re: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g },
47335
+ { name: "zhipu", re: /\b[0-9a-f]{32}\.[A-Za-z0-9]{16}\b/g },
47336
+ { name: "bearer", re: /\b(?:Bearer|Basic|Token)\s+[A-Za-z0-9_.\-+/=]{12,}/g }
47337
+ ];
47338
+ });
47339
+
47276
47340
  // src/team-stats.ts
47277
47341
  import { existsSync as existsSync18, readFileSync as readFileSync16, writeFileSync as writeFileSync11 } from "fs";
47278
47342
  import { join as join25 } from "path";
@@ -48161,6 +48225,13 @@ function formatTeamResult(status, sessionPath) {
48161
48225
  }
48162
48226
  function defineTools(sessionManager, notifyChannel) {
48163
48227
  const tools = [];
48228
+ function withOpFailureContext(message, subject) {
48229
+ const block = renderOpFailureBlock(subject);
48230
+ return block.length === 0 ? message : `${message}
48231
+
48232
+ ${block.join(`
48233
+ `)}`;
48234
+ }
48164
48235
  tools.push({
48165
48236
  name: "run_prompt",
48166
48237
  description: "Run a prompt through any model \u2014 supports all providers (Kimi, GLM, Qwen, MiniMax, Gemini, GPT, Grok, etc.) with auto-routing, fallback chains, and custom routing rules.",
@@ -48195,10 +48266,10 @@ Tokens: ${result.usage.input} input, ${result.usage.output} output`;
48195
48266
  content: [
48196
48267
  {
48197
48268
  type: "text",
48198
- text: `Error: ${errMsg}
48269
+ text: withOpFailureContext(`Error: ${errMsg}
48199
48270
 
48200
48271
  ---
48201
- **To report this error**, use the \`report_error\` tool with \`error_type: "provider_failure"\` and \`model: "${args.model}"\`.`
48272
+ **To report this error**, use the \`report_error\` tool with \`error_type: "provider_failure"\` and \`model: "${args.model}"\`.`, `while routing ${args.model}`)
48202
48273
  }
48203
48274
  ],
48204
48275
  isError: true
@@ -48541,7 +48612,7 @@ Use with: run_prompt(model="${results2[0].model.id}", prompt="your prompt")`;
48541
48612
  content: [
48542
48613
  {
48543
48614
  type: "text",
48544
- text: `Error: ${error46 instanceof Error ? error46.message : String(error46)}`
48615
+ text: withOpFailureContext(`Error: ${error46 instanceof Error ? error46.message : String(error46)}`, "while running the team")
48545
48616
  }
48546
48617
  ],
48547
48618
  isError: true
@@ -48757,10 +48828,10 @@ Report manually at https://github.com/anthropics/claudish/issues${autoSendHint}`
48757
48828
  content: [
48758
48829
  {
48759
48830
  type: "text",
48760
- text: `Error creating session: ${errMsg}
48831
+ text: withOpFailureContext(`Error creating session: ${errMsg}
48761
48832
 
48762
48833
  ---
48763
- **To report this error**, use the \`report_error\` tool with \`error_type: "provider_failure"\` and \`model: "${args.model}"\`.`
48834
+ **To report this error**, use the \`report_error\` tool with \`error_type: "provider_failure"\` and \`model: "${args.model}"\`.`, `while routing ${args.model}`)
48764
48835
  }
48765
48836
  ],
48766
48837
  isError: true
@@ -49016,9 +49087,10 @@ var init_mcp_server = __esm(() => {
49016
49087
  init_channel();
49017
49088
  init_model_loader();
49018
49089
  init_port_manager();
49019
- init_redact();
49090
+ init_onepassword();
49020
49091
  init_provider_definitions();
49021
49092
  init_proxy_server();
49093
+ init_redact();
49022
49094
  init_team_orchestrator();
49023
49095
  import_dotenv2 = __toESM(require_main(), 1);
49024
49096
  import_dotenv2.config({ quiet: true });
@@ -76367,7 +76439,13 @@ var isLegacyGeminiLogout = args.includes("--gemini-logout");
76367
76439
  var isLegacyKimiLogin = args.includes("--kimi-login");
76368
76440
  var isLegacyKimiLogout = args.includes("--kimi-logout");
76369
76441
  if (isMcpMode) {
76370
- Promise.resolve().then(() => (init_mcp_server(), exports_mcp_server)).then((mcp) => mcp.startMcpServer());
76442
+ Promise.resolve().then(() => (init_mcp_server(), exports_mcp_server)).then(async (mcp) => {
76443
+ mcp.startMcpServer();
76444
+ if (process.env.CLAUDISH_STARTUP_TRACE === "1") {
76445
+ const { finalizeStartupTrace: finalizeStartupTrace2 } = await Promise.resolve().then(() => (init_startup_trace(), exports_startup_trace));
76446
+ finalizeStartupTrace2("mcp", { quiet: true });
76447
+ }
76448
+ });
76371
76449
  } else if (isServeCommand) {
76372
76450
  const serveArgIndex = args.indexOf("serve");
76373
76451
  Promise.resolve().then(() => (init_serve_command(), exports_serve_command)).then((m) => m.serveCommand(args.slice(serveArgIndex + 1)).catch((e) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudish",
3
- "version": "7.32.0",
3
+ "version": "7.33.0",
4
4
  "description": "Run Claude Code with any model - OpenRouter, Ollama, LM Studio & local models",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -60,10 +60,10 @@
60
60
  "ai"
61
61
  ],
62
62
  "optionalDependencies": {
63
- "@claudish/magmux-darwin-arm64": "7.32.0",
64
- "@claudish/magmux-darwin-x64": "7.32.0",
65
- "@claudish/magmux-linux-arm64": "7.32.0",
66
- "@claudish/magmux-linux-x64": "7.32.0"
63
+ "@claudish/magmux-darwin-arm64": "7.33.0",
64
+ "@claudish/magmux-darwin-x64": "7.33.0",
65
+ "@claudish/magmux-linux-arm64": "7.33.0",
66
+ "@claudish/magmux-linux-x64": "7.33.0"
67
67
  },
68
68
  "author": "Jack Rudenko <i@madappgang.com>",
69
69
  "license": "MIT",