@funnycode/myclaude 0.1.280 → 0.1.285

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/myclaude.js CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.280",
8
- BUILD_TIME: "2026-08-19T00:59:52.123Z",
7
+ VERSION: "0.1.285",
8
+ BUILD_TIME: "2026-08-21T08:33:09.704Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -120027,7 +120027,7 @@ var package_default;
120027
120027
  var init_package = __esm(() => {
120028
120028
  package_default = {
120029
120029
  name: "@funnycode/myclaude",
120030
- version: "0.1.280",
120030
+ version: "0.1.285",
120031
120031
  private: false,
120032
120032
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
120033
120033
  license: "MIT",
@@ -282574,14 +282574,20 @@ __export(exports_sessionIdCompat, {
282574
282574
  resetCseShimGateForTesting: () => resetCseShimGateForTesting,
282575
282575
  getCseShimGate: () => getCseShimGate
282576
282576
  });
282577
- function setCseShimGate(gate) {
282578
- _isCseShimEnabled = gate;
282577
+ async function setCseShimGate(gate) {
282578
+ await _gateMutex.runExclusive(() => {
282579
+ if (_isCseShimEnabled === undefined) {
282580
+ _isCseShimEnabled = gate;
282581
+ }
282582
+ });
282579
282583
  }
282580
282584
  function getCseShimGate() {
282581
282585
  return _isCseShimEnabled;
282582
282586
  }
282583
- function resetCseShimGateForTesting() {
282584
- _isCseShimEnabled = undefined;
282587
+ async function resetCseShimGateForTesting() {
282588
+ await _gateMutex.runExclusive(() => {
282589
+ _isCseShimEnabled = undefined;
282590
+ });
282585
282591
  }
282586
282592
  function toCompatSessionId(id) {
282587
282593
  if (!id.startsWith("cse_"))
@@ -282597,7 +282603,11 @@ function toInfraSessionId(id) {
282597
282603
  return id;
282598
282604
  return "cse_" + id.slice("session_".length);
282599
282605
  }
282600
- var _isCseShimEnabled;
282606
+ var _isCseShimEnabled, _gateMutex;
282607
+ var init_sessionIdCompat = __esm(() => {
282608
+ init_async_mutex();
282609
+ _gateMutex = new Mutex;
282610
+ });
282601
282611
 
282602
282612
  // src/constants/product.ts
282603
282613
  function isRemoteSessionStaging(sessionId, ingressUrl) {
@@ -282616,7 +282626,7 @@ function getClaudeAiBaseUrl(sessionId, ingressUrl) {
282616
282626
  return CLAUDE_AI_BASE_URL;
282617
282627
  }
282618
282628
  function getRemoteSessionUrl(sessionId, ingressUrl) {
282619
- const { toCompatSessionId: toCompatSessionId2 } = __toCommonJS(exports_sessionIdCompat);
282629
+ const { toCompatSessionId: toCompatSessionId2 } = (init_sessionIdCompat(), __toCommonJS(exports_sessionIdCompat));
282620
282630
  const compatId = toCompatSessionId2(sessionId);
282621
282631
  const baseUrl = getClaudeAiBaseUrl(compatId, ingressUrl);
282622
282632
  return `${baseUrl}/code/${compatId}`;
@@ -387579,6 +387589,7 @@ var init_concurrentSessions = __esm(() => {
387579
387589
  // src/bridge/replBridgeHandle.ts
387580
387590
  var init_replBridgeHandle = __esm(() => {
387581
387591
  init_concurrentSessions();
387592
+ init_sessionIdCompat();
387582
387593
  });
387583
387594
 
387584
387595
  // src/tasks/LocalMainSessionTask.ts
@@ -464035,6 +464046,7 @@ var init_createSession = __esm(() => {
464035
464046
  init_debug();
464036
464047
  init_errors();
464037
464048
  init_debugUtils();
464049
+ init_sessionIdCompat();
464038
464050
  });
464039
464051
 
464040
464052
  // src/commands/rename/rename.ts
@@ -480186,23 +480198,23 @@ function sanitizeCommand(command6) {
480186
480198
  for (const node of parsed) {
480187
480199
  if (typeof node === "string") {
480188
480200
  if (/[`$<>|;&\\\n\r]/.test(node)) {
480189
- throw new Error(`Invalid command: shell metacharacter in token "${node}" is not allowed: "${command6}"`);
480201
+ throw new Error("Invalid command: shell metacharacter in token is not allowed (input omitted for security)");
480190
480202
  }
480191
480203
  argv.push(node);
480192
480204
  continue;
480193
480205
  }
480194
480206
  if (node && typeof node === "object") {
480195
480207
  const kind = node.op || node.pattern || "shell metacharacter";
480196
- throw new Error(`Invalid command: shell metacharacter/operator (${kind}) is not allowed: "${command6}"`);
480208
+ throw new Error(`Invalid command: shell metacharacter/operator (${kind}) is not allowed (input omitted for security)`);
480197
480209
  }
480198
- throw new Error(`Invalid command: unexpected token in command: "${command6}"`);
480210
+ throw new Error("Invalid command: unexpected token in command (input omitted for security)");
480199
480211
  }
480200
480212
  if (argv.length === 0) {
480201
480213
  throw new Error("Invalid command: no program specified");
480202
480214
  }
480203
480215
  const program = argv[0];
480204
480216
  if (!ALLOWED_COMMANDS.has(program)) {
480205
- throw new Error(`Invalid command: program "${program}" is not on the allowlist of permitted commands`);
480217
+ throw new Error("Invalid command: program is not on the allowlist of permitted commands (input omitted for security)");
480206
480218
  }
480207
480219
  return argv;
480208
480220
  }
@@ -480213,7 +480225,7 @@ function escapeCodeSpan(text2) {
480213
480225
  return `${delim}${pad}${text2}${pad}${delim}`;
480214
480226
  }
480215
480227
  function escapeMarkdown(text2) {
480216
- return text2.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\*/g, "\\*").replace(/_/g, "\\_").replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/#/g, "\\#").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/!/g, "\\!").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
480228
+ return text2.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\*/g, "\\*").replace(/_/g, "\\_").replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/#/g, "\\#").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/!/g, "\\!").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
480217
480229
  }
480218
480230
  function generateDiffPreview(flow) {
480219
480231
  const lines2 = [];
@@ -480255,6 +480267,7 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480255
480267
  startTime: Date.now(),
480256
480268
  aborted: false
480257
480269
  };
480270
+ const callbackErrors = [];
480258
480271
  if (options?.preview && options?.onPreview) {
480259
480272
  const preview = generateDiffPreview(flow);
480260
480273
  const approved = await options.onPreview(preview);
@@ -480284,6 +480297,7 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480284
480297
  await onStepComplete(step, state);
480285
480298
  } catch (callbackError) {
480286
480299
  console.error(`onStepComplete callback failed for step "${step.id}":`, callbackError);
480300
+ callbackErrors.push(callbackError);
480287
480301
  }
480288
480302
  }
480289
480303
  } catch (error52) {
@@ -480293,6 +480307,7 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480293
480307
  await onStepFail(step, state, error52);
480294
480308
  } catch (callbackError) {
480295
480309
  console.error(`onStepFail callback failed for step "${step.id}":`, callbackError);
480310
+ callbackErrors.push(callbackError);
480296
480311
  }
480297
480312
  }
480298
480313
  const shouldContinue = await shouldContinueOnError(error52, step);
@@ -480307,7 +480322,14 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480307
480322
  await onComplete(state);
480308
480323
  } catch (callbackError) {
480309
480324
  console.error("onComplete callback failed:", callbackError);
480325
+ callbackErrors.push(callbackError);
480326
+ }
480327
+ }
480328
+ if (callbackErrors.length > 0) {
480329
+ if (callbackErrors.length === 1) {
480330
+ throw callbackErrors[0];
480310
480331
  }
480332
+ throw new AggregateError(callbackErrors, "Multiple callback errors occurred during flow execution");
480311
480333
  }
480312
480334
  return state;
480313
480335
  }
@@ -480317,24 +480339,47 @@ async function executeCommand(command6, context2) {
480317
480339
  await context2.bridge.runCommand(argv);
480318
480340
  return;
480319
480341
  }
480320
- throw new Error("No bridge.runCommand available to execute: " + command6);
480342
+ throw new Error("No bridge.runCommand available to execute command (input omitted for security)");
480321
480343
  }
480322
480344
  async function executeFileOperation(file2, context2) {
480345
+ if (typeof file2 !== "string") {
480346
+ throw new Error("Invalid file path: must be a string");
480347
+ }
480348
+ if (file2.includes("\x00")) {
480349
+ throw new Error("Invalid file path: NUL byte detected");
480350
+ }
480351
+ const normalized = file2.replace(/\\/g, "/");
480352
+ if (normalized.startsWith("/") || /^[A-Za-z]:\//.test(normalized)) {
480353
+ throw new Error("Invalid file path: absolute paths are not allowed");
480354
+ }
480355
+ const parts = normalized.split("/");
480356
+ for (const part of parts) {
480357
+ if (part === "..") {
480358
+ throw new Error("Invalid file path: path traversal (..) is not allowed");
480359
+ }
480360
+ }
480323
480361
  if (context2?.bridge?.editFile) {
480324
480362
  await context2.bridge.editFile(file2);
480325
480363
  return;
480326
480364
  }
480327
- throw new Error("No bridge.editFile available to edit: " + file2);
480365
+ throw new Error("No bridge.editFile available to edit file (input omitted for security)");
480328
480366
  }
480329
480367
  async function shouldContinueOnError(error52, step) {
480330
- const transientCodes = ["ETIMEDOUT"];
480368
+ const transientCodes = [
480369
+ "ETIMEDOUT",
480370
+ "ECONNRESET",
480371
+ "ENETUNREACH",
480372
+ "EPIPE",
480373
+ "EAI_AGAIN",
480374
+ "ENOTFOUND",
480375
+ "ECONNREFUSED"
480376
+ ];
480331
480377
  const err2 = error52;
480332
- if (err2.code && transientCodes.includes(err2.code)) {
480378
+ const codeFromProps = typeof err2.code === "string" ? err2.code : typeof err2.errno === "string" ? err2.errno : null;
480379
+ if (codeFromProps && transientCodes.includes(codeFromProps)) {
480333
480380
  return true;
480334
480381
  }
480335
- const ipv4Port = String.raw`\d{1,3}(?:\.\d{1,3}){3}:\d+`;
480336
- const hostnamePort = String.raw`[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?){1,}:\d+`;
480337
- if (transientCodes.some((code) => new RegExp(`(^|:\\s*)${code}\\b|\\b${code}\\s+(?:${ipv4Port}|${hostnamePort})`).test(error52.message))) {
480382
+ if (transientCodes.some((code) => new RegExp(`(^|:\\s*)${code}\\b`).test(error52.message))) {
480338
480383
  return true;
480339
480384
  }
480340
480385
  if (/^No bridge\.(runCommand|editFile) available/.test(error52.message)) {
@@ -480346,13 +480391,11 @@ var import_shell_quote4, ALLOWED_COMMANDS;
480346
480391
  var init_executor = __esm(() => {
480347
480392
  import_shell_quote4 = __toESM(require_shell_quote(), 1);
480348
480393
  ALLOWED_COMMANDS = new Set([
480349
- "npm",
480350
480394
  "mkdir",
480351
480395
  "touch",
480352
480396
  "cp",
480353
480397
  "mv",
480354
480398
  "echo",
480355
- "git",
480356
480399
  "tsc",
480357
480400
  "vitest"
480358
480401
  ]);
@@ -582260,6 +582303,7 @@ var init_replBridge = __esm(() => {
582260
582303
  init_cleanupRegistry();
582261
582304
  init_bridgeMessaging();
582262
582305
  init_workSecret();
582306
+ init_sessionIdCompat();
582263
582307
  init_concurrentSessions();
582264
582308
  init_trustedDevice();
582265
582309
  init_HybridTransport();
@@ -582840,6 +582884,7 @@ var init_remoteBridgeCore = __esm(() => {
582840
582884
  init_axios2();
582841
582885
  init_replBridgeTransport();
582842
582886
  init_workSecret();
582887
+ init_sessionIdCompat();
582843
582888
  init_jwtUtils();
582844
582889
  init_trustedDevice();
582845
582890
  init_envLessBridgeConfig();
@@ -582879,7 +582924,7 @@ async function initReplBridge(options) {
582879
582924
  outboundOnly,
582880
582925
  tags
582881
582926
  } = options ?? {};
582882
- setCseShimGate(isCseShimEnabled);
582927
+ await setCseShimGate(isCseShimEnabled);
582883
582928
  const [
582884
582929
  { getFeatureValue_CACHED_WITH_REFRESH: getFeatureValue_CACHED_WITH_REFRESH4 },
582885
582930
  { getOrganizationUUID: getOrganizationUUID2 },
@@ -583130,6 +583175,7 @@ var init_initReplBridge = __esm(() => {
583130
583175
  init_envLessBridgeConfig();
583131
583176
  init_pollConfig();
583132
583177
  init_replBridge();
583178
+ init_sessionIdCompat();
583133
583179
  });
583134
583180
 
583135
583181
  // src/cli/print.ts
package/dist/myclaude.mjs CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.280",
8
- BUILD_TIME: "2026-08-19T00:59:52.123Z",
7
+ VERSION: "0.1.285",
8
+ BUILD_TIME: "2026-08-21T08:33:09.704Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -120027,7 +120027,7 @@ var package_default;
120027
120027
  var init_package = __esm(() => {
120028
120028
  package_default = {
120029
120029
  name: "@funnycode/myclaude",
120030
- version: "0.1.280",
120030
+ version: "0.1.285",
120031
120031
  private: false,
120032
120032
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
120033
120033
  license: "MIT",
@@ -282574,14 +282574,20 @@ __export(exports_sessionIdCompat, {
282574
282574
  resetCseShimGateForTesting: () => resetCseShimGateForTesting,
282575
282575
  getCseShimGate: () => getCseShimGate
282576
282576
  });
282577
- function setCseShimGate(gate) {
282578
- _isCseShimEnabled = gate;
282577
+ async function setCseShimGate(gate) {
282578
+ await _gateMutex.runExclusive(() => {
282579
+ if (_isCseShimEnabled === undefined) {
282580
+ _isCseShimEnabled = gate;
282581
+ }
282582
+ });
282579
282583
  }
282580
282584
  function getCseShimGate() {
282581
282585
  return _isCseShimEnabled;
282582
282586
  }
282583
- function resetCseShimGateForTesting() {
282584
- _isCseShimEnabled = undefined;
282587
+ async function resetCseShimGateForTesting() {
282588
+ await _gateMutex.runExclusive(() => {
282589
+ _isCseShimEnabled = undefined;
282590
+ });
282585
282591
  }
282586
282592
  function toCompatSessionId(id) {
282587
282593
  if (!id.startsWith("cse_"))
@@ -282597,7 +282603,11 @@ function toInfraSessionId(id) {
282597
282603
  return id;
282598
282604
  return "cse_" + id.slice("session_".length);
282599
282605
  }
282600
- var _isCseShimEnabled;
282606
+ var _isCseShimEnabled, _gateMutex;
282607
+ var init_sessionIdCompat = __esm(() => {
282608
+ init_async_mutex();
282609
+ _gateMutex = new Mutex;
282610
+ });
282601
282611
 
282602
282612
  // src/constants/product.ts
282603
282613
  function isRemoteSessionStaging(sessionId, ingressUrl) {
@@ -282616,7 +282626,7 @@ function getClaudeAiBaseUrl(sessionId, ingressUrl) {
282616
282626
  return CLAUDE_AI_BASE_URL;
282617
282627
  }
282618
282628
  function getRemoteSessionUrl(sessionId, ingressUrl) {
282619
- const { toCompatSessionId: toCompatSessionId2 } = __toCommonJS(exports_sessionIdCompat);
282629
+ const { toCompatSessionId: toCompatSessionId2 } = (init_sessionIdCompat(), __toCommonJS(exports_sessionIdCompat));
282620
282630
  const compatId = toCompatSessionId2(sessionId);
282621
282631
  const baseUrl = getClaudeAiBaseUrl(compatId, ingressUrl);
282622
282632
  return `${baseUrl}/code/${compatId}`;
@@ -387579,6 +387589,7 @@ var init_concurrentSessions = __esm(() => {
387579
387589
  // src/bridge/replBridgeHandle.ts
387580
387590
  var init_replBridgeHandle = __esm(() => {
387581
387591
  init_concurrentSessions();
387592
+ init_sessionIdCompat();
387582
387593
  });
387583
387594
 
387584
387595
  // src/tasks/LocalMainSessionTask.ts
@@ -464035,6 +464046,7 @@ var init_createSession = __esm(() => {
464035
464046
  init_debug();
464036
464047
  init_errors();
464037
464048
  init_debugUtils();
464049
+ init_sessionIdCompat();
464038
464050
  });
464039
464051
 
464040
464052
  // src/commands/rename/rename.ts
@@ -480186,23 +480198,23 @@ function sanitizeCommand(command6) {
480186
480198
  for (const node of parsed) {
480187
480199
  if (typeof node === "string") {
480188
480200
  if (/[`$<>|;&\\\n\r]/.test(node)) {
480189
- throw new Error(`Invalid command: shell metacharacter in token "${node}" is not allowed: "${command6}"`);
480201
+ throw new Error("Invalid command: shell metacharacter in token is not allowed (input omitted for security)");
480190
480202
  }
480191
480203
  argv.push(node);
480192
480204
  continue;
480193
480205
  }
480194
480206
  if (node && typeof node === "object") {
480195
480207
  const kind = node.op || node.pattern || "shell metacharacter";
480196
- throw new Error(`Invalid command: shell metacharacter/operator (${kind}) is not allowed: "${command6}"`);
480208
+ throw new Error(`Invalid command: shell metacharacter/operator (${kind}) is not allowed (input omitted for security)`);
480197
480209
  }
480198
- throw new Error(`Invalid command: unexpected token in command: "${command6}"`);
480210
+ throw new Error("Invalid command: unexpected token in command (input omitted for security)");
480199
480211
  }
480200
480212
  if (argv.length === 0) {
480201
480213
  throw new Error("Invalid command: no program specified");
480202
480214
  }
480203
480215
  const program = argv[0];
480204
480216
  if (!ALLOWED_COMMANDS.has(program)) {
480205
- throw new Error(`Invalid command: program "${program}" is not on the allowlist of permitted commands`);
480217
+ throw new Error("Invalid command: program is not on the allowlist of permitted commands (input omitted for security)");
480206
480218
  }
480207
480219
  return argv;
480208
480220
  }
@@ -480213,7 +480225,7 @@ function escapeCodeSpan(text2) {
480213
480225
  return `${delim}${pad}${text2}${pad}${delim}`;
480214
480226
  }
480215
480227
  function escapeMarkdown(text2) {
480216
- return text2.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\*/g, "\\*").replace(/_/g, "\\_").replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/#/g, "\\#").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/!/g, "\\!").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
480228
+ return text2.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\*/g, "\\*").replace(/_/g, "\\_").replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/#/g, "\\#").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/!/g, "\\!").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
480217
480229
  }
480218
480230
  function generateDiffPreview(flow) {
480219
480231
  const lines2 = [];
@@ -480255,6 +480267,7 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480255
480267
  startTime: Date.now(),
480256
480268
  aborted: false
480257
480269
  };
480270
+ const callbackErrors = [];
480258
480271
  if (options?.preview && options?.onPreview) {
480259
480272
  const preview = generateDiffPreview(flow);
480260
480273
  const approved = await options.onPreview(preview);
@@ -480284,6 +480297,7 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480284
480297
  await onStepComplete(step, state);
480285
480298
  } catch (callbackError) {
480286
480299
  console.error(`onStepComplete callback failed for step "${step.id}":`, callbackError);
480300
+ callbackErrors.push(callbackError);
480287
480301
  }
480288
480302
  }
480289
480303
  } catch (error52) {
@@ -480293,6 +480307,7 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480293
480307
  await onStepFail(step, state, error52);
480294
480308
  } catch (callbackError) {
480295
480309
  console.error(`onStepFail callback failed for step "${step.id}":`, callbackError);
480310
+ callbackErrors.push(callbackError);
480296
480311
  }
480297
480312
  }
480298
480313
  const shouldContinue = await shouldContinueOnError(error52, step);
@@ -480307,7 +480322,14 @@ async function executeFlow(flow, context2, onStepStart, onStepComplete, onStepFa
480307
480322
  await onComplete(state);
480308
480323
  } catch (callbackError) {
480309
480324
  console.error("onComplete callback failed:", callbackError);
480325
+ callbackErrors.push(callbackError);
480326
+ }
480327
+ }
480328
+ if (callbackErrors.length > 0) {
480329
+ if (callbackErrors.length === 1) {
480330
+ throw callbackErrors[0];
480310
480331
  }
480332
+ throw new AggregateError(callbackErrors, "Multiple callback errors occurred during flow execution");
480311
480333
  }
480312
480334
  return state;
480313
480335
  }
@@ -480317,24 +480339,47 @@ async function executeCommand(command6, context2) {
480317
480339
  await context2.bridge.runCommand(argv);
480318
480340
  return;
480319
480341
  }
480320
- throw new Error("No bridge.runCommand available to execute: " + command6);
480342
+ throw new Error("No bridge.runCommand available to execute command (input omitted for security)");
480321
480343
  }
480322
480344
  async function executeFileOperation(file2, context2) {
480345
+ if (typeof file2 !== "string") {
480346
+ throw new Error("Invalid file path: must be a string");
480347
+ }
480348
+ if (file2.includes("\x00")) {
480349
+ throw new Error("Invalid file path: NUL byte detected");
480350
+ }
480351
+ const normalized = file2.replace(/\\/g, "/");
480352
+ if (normalized.startsWith("/") || /^[A-Za-z]:\//.test(normalized)) {
480353
+ throw new Error("Invalid file path: absolute paths are not allowed");
480354
+ }
480355
+ const parts = normalized.split("/");
480356
+ for (const part of parts) {
480357
+ if (part === "..") {
480358
+ throw new Error("Invalid file path: path traversal (..) is not allowed");
480359
+ }
480360
+ }
480323
480361
  if (context2?.bridge?.editFile) {
480324
480362
  await context2.bridge.editFile(file2);
480325
480363
  return;
480326
480364
  }
480327
- throw new Error("No bridge.editFile available to edit: " + file2);
480365
+ throw new Error("No bridge.editFile available to edit file (input omitted for security)");
480328
480366
  }
480329
480367
  async function shouldContinueOnError(error52, step) {
480330
- const transientCodes = ["ETIMEDOUT"];
480368
+ const transientCodes = [
480369
+ "ETIMEDOUT",
480370
+ "ECONNRESET",
480371
+ "ENETUNREACH",
480372
+ "EPIPE",
480373
+ "EAI_AGAIN",
480374
+ "ENOTFOUND",
480375
+ "ECONNREFUSED"
480376
+ ];
480331
480377
  const err2 = error52;
480332
- if (err2.code && transientCodes.includes(err2.code)) {
480378
+ const codeFromProps = typeof err2.code === "string" ? err2.code : typeof err2.errno === "string" ? err2.errno : null;
480379
+ if (codeFromProps && transientCodes.includes(codeFromProps)) {
480333
480380
  return true;
480334
480381
  }
480335
- const ipv4Port = String.raw`\d{1,3}(?:\.\d{1,3}){3}:\d+`;
480336
- const hostnamePort = String.raw`[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?){1,}:\d+`;
480337
- if (transientCodes.some((code) => new RegExp(`(^|:\\s*)${code}\\b|\\b${code}\\s+(?:${ipv4Port}|${hostnamePort})`).test(error52.message))) {
480382
+ if (transientCodes.some((code) => new RegExp(`(^|:\\s*)${code}\\b`).test(error52.message))) {
480338
480383
  return true;
480339
480384
  }
480340
480385
  if (/^No bridge\.(runCommand|editFile) available/.test(error52.message)) {
@@ -480346,13 +480391,11 @@ var import_shell_quote4, ALLOWED_COMMANDS;
480346
480391
  var init_executor = __esm(() => {
480347
480392
  import_shell_quote4 = __toESM(require_shell_quote(), 1);
480348
480393
  ALLOWED_COMMANDS = new Set([
480349
- "npm",
480350
480394
  "mkdir",
480351
480395
  "touch",
480352
480396
  "cp",
480353
480397
  "mv",
480354
480398
  "echo",
480355
- "git",
480356
480399
  "tsc",
480357
480400
  "vitest"
480358
480401
  ]);
@@ -582260,6 +582303,7 @@ var init_replBridge = __esm(() => {
582260
582303
  init_cleanupRegistry();
582261
582304
  init_bridgeMessaging();
582262
582305
  init_workSecret();
582306
+ init_sessionIdCompat();
582263
582307
  init_concurrentSessions();
582264
582308
  init_trustedDevice();
582265
582309
  init_HybridTransport();
@@ -582840,6 +582884,7 @@ var init_remoteBridgeCore = __esm(() => {
582840
582884
  init_axios2();
582841
582885
  init_replBridgeTransport();
582842
582886
  init_workSecret();
582887
+ init_sessionIdCompat();
582843
582888
  init_jwtUtils();
582844
582889
  init_trustedDevice();
582845
582890
  init_envLessBridgeConfig();
@@ -582879,7 +582924,7 @@ async function initReplBridge(options) {
582879
582924
  outboundOnly,
582880
582925
  tags
582881
582926
  } = options ?? {};
582882
- setCseShimGate(isCseShimEnabled);
582927
+ await setCseShimGate(isCseShimEnabled);
582883
582928
  const [
582884
582929
  { getFeatureValue_CACHED_WITH_REFRESH: getFeatureValue_CACHED_WITH_REFRESH4 },
582885
582930
  { getOrganizationUUID: getOrganizationUUID2 },
@@ -583130,6 +583175,7 @@ var init_initReplBridge = __esm(() => {
583130
583175
  init_envLessBridgeConfig();
583131
583176
  init_pollConfig();
583132
583177
  init_replBridge();
583178
+ init_sessionIdCompat();
583133
583179
  });
583134
583180
 
583135
583181
  // src/cli/print.ts
package/package.json CHANGED
@@ -1,131 +1,131 @@
1
- {
2
- "name": "@funnycode/myclaude",
3
- "version": "0.1.280",
4
- "private": false,
5
- "description": "An open-source AI coding assistant in your terminal - powered by Claude",
6
- "license": "MIT",
7
- "type": "module",
8
- "packageManager": "bun@1.3.5",
9
- "repository": {
10
- "type": "git",
11
- "url": "https://github.com/thomaslwq/myclaude.git"
12
- },
13
- "bugs": {
14
- "url": "https://github.com/thomaslwq/myclaude/issues"
15
- },
16
- "homepage": "https://github.com/thomaslwq/myclaude",
17
- "engines": {
18
- "bun": ">=1.3.5",
19
- "node": ">=18.17.0"
20
- },
21
- "scripts": {
22
- "dev": "bun run ./src/dev-entry.ts",
23
- "start": "bun run ./src/dev-entry.ts",
24
- "test": "bun test",
25
- "test:watch": "bun test --watch",
26
- "test:perf": "bun test src/tests/performance-regression.test.ts",
27
- "build": "bun run ./scripts/build.ts",
28
- "prepublishOnly": "bun run build",
29
- "version": "bun run ./src/dev-entry.ts --version"
30
- },
31
- "bin": {
32
- "myclaude": "bin/myclaude.cjs"
33
- },
34
- "files": [
35
- "dist/",
36
- "seed/",
37
- "bin/",
38
- "LICENSE",
39
- "README.md",
40
- "README.zh-CN.md",
41
- "CHANGELOG.md",
42
- "docs/funnycode.png",
43
- "shims/node-domexception/"
44
- ],
45
- "publishConfig": {
46
- "access": "public"
47
- },
48
- "dependencies": {
49
- "@alcalzone/ansi-tokenize": "0.3.0",
50
- "@anthropic-ai/claude-agent-sdk": "0.3.207",
51
- "@anthropic-ai/mcpb": "2.1.2",
52
- "@anthropic-ai/sandbox-runtime": "0.0.44",
53
- "@anthropic-ai/sdk": "0.111.0",
54
- "@aws-sdk/client-bedrock-runtime": "3.1020.0",
55
- "@commander-js/extra-typings": "14.0.0",
56
- "@growthbook/growthbook": "1.6.5",
57
- "@modelcontextprotocol/sdk": "1.29.0",
58
- "@opentelemetry/api": "1.9.1",
59
- "@opentelemetry/api-logs": "0.221.0",
60
- "@opentelemetry/core": "1.28.0",
61
- "@opentelemetry/resources": "1.28.0",
62
- "@opentelemetry/sdk-logs": "0.52.0",
63
- "@opentelemetry/sdk-metrics": "1.28.0",
64
- "@opentelemetry/sdk-trace-base": "1.28.0",
65
- "@opentelemetry/semantic-conventions": "1.43.0",
66
- "ajv": "8.18.0",
67
- "asciichart": "1.5.25",
68
- "async-mutex": "0.5.0",
69
- "auto-bind": "5.0.1",
70
- "axios": "1.19.0",
71
- "bidi-js": "1.0.3",
72
- "chalk": "5.6.2",
73
- "chokidar": "5.0.0",
74
- "cli-boxes": "4.0.1",
75
- "code-excerpt": "4.0.0",
76
- "diff": "8.0.4",
77
- "emoji-regex": "10.6.0",
78
- "env-paths": "4.0.0",
79
- "execa": "9.6.1",
80
- "figures": "6.1.0",
81
- "fuse.js": "7.1.0",
82
- "get-east-asian-width": "1.5.0",
83
- "google-auth-library": "10.6.2",
84
- "highlight.js": "11.11.1",
85
- "https-proxy-agent": "8.0.0",
86
- "ignore": "7.0.5",
87
- "indent-string": "5.0.0",
88
- "ink": "6.8.0",
89
- "jsonc-parser": "3.3.1",
90
- "lodash-es": "4.17.23",
91
- "lru-cache": "11.5.2",
92
- "marked": "18.0.9",
93
- "p-map": "7.0.4",
94
- "picomatch": "4.0.4",
95
- "proper-lockfile": "4.1.2",
96
- "qrcode": "1.5.4",
97
- "react": "19.2.8",
98
- "react-reconciler": "0.33.0",
99
- "semver": "7.8.5",
100
- "shell-quote": "1.8.3",
101
- "signal-exit": "4.1.0",
102
- "stack-utils": "2.0.6",
103
- "strip-ansi": "7.2.0",
104
- "supports-hyperlinks": "4.4.0",
105
- "tree-kill": "1.2.2",
106
- "type-fest": "5.5.0",
107
- "undici": "7.24.6",
108
- "usehooks-ts": "3.1.1",
109
- "vscode-jsonrpc": "8.2.1",
110
- "vscode-languageserver-protocol": "3.17.5",
111
- "vscode-languageserver-types": "3.17.5",
112
- "wrap-ansi": "10.0.0",
113
- "ws": "8.20.0",
114
- "xss": "1.0.15",
115
- "yaml": "2.8.3",
116
- "zod": "4.4.3"
117
- },
118
- "optionalDependencies": {
119
- "@ant/claude-for-chrome-mcp": "file:./shims/ant-claude-for-chrome-mcp",
120
- "@ant/computer-use-input": "file:./shims/ant-computer-use-input",
121
- "@ant/computer-use-mcp": "file:./shims/ant-computer-use-mcp",
122
- "@ant/computer-use-swift": "file:./shims/ant-computer-use-swift",
123
- "color-diff-napi": "file:./shims/color-diff-napi",
124
- "modifiers-napi": "file:./shims/modifiers-napi",
125
- "node-domexception": "file:./shims/node-domexception",
126
- "url-handler-napi": "file:./shims/url-handler-napi"
127
- },
128
- "overrides": {
129
- "node-domexception": "file:./shims/node-domexception"
130
- }
131
- }
1
+ {
2
+ "name": "@funnycode/myclaude",
3
+ "version": "0.1.285",
4
+ "private": false,
5
+ "description": "An open-source AI coding assistant in your terminal - powered by Claude",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "packageManager": "bun@1.3.5",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/thomaslwq/myclaude.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/thomaslwq/myclaude/issues"
15
+ },
16
+ "homepage": "https://github.com/thomaslwq/myclaude",
17
+ "engines": {
18
+ "bun": ">=1.3.5",
19
+ "node": ">=18.17.0"
20
+ },
21
+ "scripts": {
22
+ "dev": "bun run ./src/dev-entry.ts",
23
+ "start": "bun run ./src/dev-entry.ts",
24
+ "test": "bun test",
25
+ "test:watch": "bun test --watch",
26
+ "test:perf": "bun test src/tests/performance-regression.test.ts",
27
+ "build": "bun run ./scripts/build.ts",
28
+ "prepublishOnly": "bun run build",
29
+ "version": "bun run ./src/dev-entry.ts --version"
30
+ },
31
+ "bin": {
32
+ "myclaude": "bin/myclaude.cjs"
33
+ },
34
+ "files": [
35
+ "dist/",
36
+ "seed/",
37
+ "bin/",
38
+ "LICENSE",
39
+ "README.md",
40
+ "README.zh-CN.md",
41
+ "CHANGELOG.md",
42
+ "docs/funnycode.png",
43
+ "shims/node-domexception/"
44
+ ],
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "dependencies": {
49
+ "@alcalzone/ansi-tokenize": "0.3.0",
50
+ "@anthropic-ai/claude-agent-sdk": "0.3.207",
51
+ "@anthropic-ai/mcpb": "2.1.2",
52
+ "@anthropic-ai/sandbox-runtime": "0.0.44",
53
+ "@anthropic-ai/sdk": "0.111.0",
54
+ "@aws-sdk/client-bedrock-runtime": "3.1020.0",
55
+ "@commander-js/extra-typings": "14.0.0",
56
+ "@growthbook/growthbook": "1.6.5",
57
+ "@modelcontextprotocol/sdk": "1.29.0",
58
+ "@opentelemetry/api": "1.9.1",
59
+ "@opentelemetry/api-logs": "0.221.0",
60
+ "@opentelemetry/core": "1.28.0",
61
+ "@opentelemetry/resources": "1.28.0",
62
+ "@opentelemetry/sdk-logs": "0.52.0",
63
+ "@opentelemetry/sdk-metrics": "1.28.0",
64
+ "@opentelemetry/sdk-trace-base": "1.28.0",
65
+ "@opentelemetry/semantic-conventions": "1.43.0",
66
+ "ajv": "8.18.0",
67
+ "asciichart": "1.5.25",
68
+ "async-mutex": "0.5.0",
69
+ "auto-bind": "5.0.1",
70
+ "axios": "1.19.0",
71
+ "bidi-js": "1.0.3",
72
+ "chalk": "5.6.2",
73
+ "chokidar": "5.0.0",
74
+ "cli-boxes": "4.0.1",
75
+ "code-excerpt": "4.0.0",
76
+ "diff": "8.0.4",
77
+ "emoji-regex": "10.6.0",
78
+ "env-paths": "4.0.0",
79
+ "execa": "9.6.1",
80
+ "figures": "6.1.0",
81
+ "fuse.js": "7.1.0",
82
+ "get-east-asian-width": "1.5.0",
83
+ "google-auth-library": "10.6.2",
84
+ "highlight.js": "11.11.1",
85
+ "https-proxy-agent": "8.0.0",
86
+ "ignore": "7.0.5",
87
+ "indent-string": "5.0.0",
88
+ "ink": "6.8.0",
89
+ "jsonc-parser": "3.3.1",
90
+ "lodash-es": "4.17.23",
91
+ "lru-cache": "11.5.2",
92
+ "marked": "18.0.9",
93
+ "p-map": "7.0.4",
94
+ "picomatch": "4.0.4",
95
+ "proper-lockfile": "4.1.2",
96
+ "qrcode": "1.5.4",
97
+ "react": "19.2.8",
98
+ "react-reconciler": "0.33.0",
99
+ "semver": "7.8.5",
100
+ "shell-quote": "1.8.3",
101
+ "signal-exit": "4.1.0",
102
+ "stack-utils": "2.0.6",
103
+ "strip-ansi": "7.2.0",
104
+ "supports-hyperlinks": "4.4.0",
105
+ "tree-kill": "1.2.2",
106
+ "type-fest": "5.5.0",
107
+ "undici": "7.24.6",
108
+ "usehooks-ts": "3.1.1",
109
+ "vscode-jsonrpc": "8.2.1",
110
+ "vscode-languageserver-protocol": "3.17.5",
111
+ "vscode-languageserver-types": "3.17.5",
112
+ "wrap-ansi": "10.0.0",
113
+ "ws": "8.20.0",
114
+ "xss": "1.0.15",
115
+ "yaml": "2.8.3",
116
+ "zod": "4.4.3"
117
+ },
118
+ "optionalDependencies": {
119
+ "@ant/claude-for-chrome-mcp": "file:./shims/ant-claude-for-chrome-mcp",
120
+ "@ant/computer-use-input": "file:./shims/ant-computer-use-input",
121
+ "@ant/computer-use-mcp": "file:./shims/ant-computer-use-mcp",
122
+ "@ant/computer-use-swift": "file:./shims/ant-computer-use-swift",
123
+ "color-diff-napi": "file:./shims/color-diff-napi",
124
+ "modifiers-napi": "file:./shims/modifiers-napi",
125
+ "node-domexception": "file:./shims/node-domexception",
126
+ "url-handler-napi": "file:./shims/url-handler-napi"
127
+ },
128
+ "overrides": {
129
+ "node-domexception": "file:./shims/node-domexception"
130
+ }
131
+ }