shinjuku-shielded 0.3.177 → 0.3.178

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
@@ -6,13 +6,13 @@ answers privately, in a terminal chat or for your agent app. Its `mcp`
6
6
  command runs a local MCP server (stdio) for your agent. Your keys never
7
7
  leave your machine.
8
8
 
9
- This is version 0.3.177. The npm packages `shinjuku-shield` and
9
+ This is version 0.3.178. The npm packages `shinjuku-shield` and
10
10
  `shinjuku-shielded` hold the same files. The command is `shinjuku`.
11
11
 
12
12
  ## Set up
13
13
 
14
14
  ```sh
15
- npx -y shinjuku@0.3.177 setup
15
+ npx -y shinjuku@0.3.178 setup
16
16
  ```
17
17
 
18
18
  Setup offers to install the `shinjuku` command and, on Windows, adds npm's
@@ -35,13 +35,13 @@ Every wallet command works after `shinjuku`, for example `shinjuku balance`,
35
35
  Claude Code:
36
36
 
37
37
  ```sh
38
- claude mcp add --scope user shinjuku -- npx -y --no-audit --no-fund shinjuku-shield@0.3.177 mcp
38
+ claude mcp add --scope user shinjuku -- npx -y --no-audit --no-fund shinjuku-shield@0.3.178 mcp
39
39
  ```
40
40
 
41
41
  Claude Desktop (`claude_desktop_config.json`) or Cursor (`~/.cursor/mcp.json`):
42
42
 
43
43
  ```json
44
- { "mcpServers": { "shinjuku": { "command": "npx", "args": ["-y", "--no-audit", "--no-fund", "shinjuku-shield@0.3.177", "mcp"] } } }
44
+ { "mcpServers": { "shinjuku": { "command": "npx", "args": ["-y", "--no-audit", "--no-fund", "shinjuku-shield@0.3.178", "mcp"] } } }
45
45
  ```
46
46
 
47
47
  On native Windows, if the host cannot find `npx`, use `"command": "cmd"` and
@@ -54,7 +54,7 @@ Codex (the Codex app and Codex CLI read the same file, `~/.codex/config.toml`):
54
54
  ```toml
55
55
  [mcp_servers.shinjuku]
56
56
  command = "npx"
57
- args = ["-y", "--no-audit", "--no-fund", "shinjuku-shield@0.3.177", "mcp"]
57
+ args = ["-y", "--no-audit", "--no-fund", "shinjuku-shield@0.3.178", "mcp"]
58
58
  startup_timeout_sec = 120
59
59
  tool_timeout_sec = 300
60
60
  ```
package/manifest.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schema": "carbon-shielded-wallet/bundle-manifest/v1",
3
3
  "file": "shinjuku-wallet.mjs",
4
- "sha256": "8d9526ec3aa19b0a648557fb5ccb8568e7988f91bab9b208767fb00a50c8b71f",
5
- "bytes": 9405041,
6
- "sourceCommit": "a2e92102622963218d6222d6f5c18c46b858fb3b",
4
+ "sha256": "ab594bac31fc1416d01a6b552a820a8b35f99418b00d66bffd63991692a3f5c6",
5
+ "bytes": 9406427,
6
+ "sourceCommit": "7f0ed64412e94ac55a02cd50638480718c73f72b",
7
7
  "sourceDirty": false,
8
8
  "installRecordMatchesLockfile": true,
9
9
  "releaseRule": "valid only when two fresh npm ci --ignore-scripts builds on different OSes give the same sha256; installRecordMatchesLockfile true means every entry npm installed equals its package-lock.json entry and every entry not marked optional, devOptional included, is installed: an optional entry (a package for another platform) may be absent",
@@ -1038,5 +1038,5 @@
1038
1038
  "version": "1.8.0"
1039
1039
  }
1040
1040
  ],
1041
- "publishedAt": "2026-11-06T00:45:28.350Z"
1041
+ "publishedAt": "2026-11-06T01:20:35.699Z"
1042
1042
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "shinjuku-shielded",
3
- "version": "0.3.177",
3
+ "version": "0.3.178",
4
4
  "mcpName": "io.github.ShinjukuStaition/shinjuku-mcp",
5
5
  "description": "Shinjuku Shielded, the private x402 facilitator on Solana: the self-custody wallet CLI and its MCP server. Shield, pay, and unshield USDC from any MCP agent, under caps you set.",
6
- "shinjukuRelease": "8d9526ec",
7
- "shinjukuSha256": "8d9526ec3aa19b0a648557fb5ccb8568e7988f91bab9b208767fb00a50c8b71f",
6
+ "shinjukuRelease": "ab594bac",
7
+ "shinjukuSha256": "ab594bac31fc1416d01a6b552a820a8b35f99418b00d66bffd63991692a3f5c6",
8
8
  "license": "SEE LICENSE IN LICENSE.txt",
9
9
  "author": "Shinjuku Shielded",
10
10
  "homepage": "https://github.com/ShinjukuStaition/shinjuku-shield#readme",
@@ -144975,7 +144975,7 @@ function moneyOptions({
144975
144975
  } catch {
144976
144976
  canonical5 = false;
144977
144977
  }
144978
- if (!canonical5) throw new Error("mcp_unshield_to_invalid: every send address approved at start must be a base58 Solana address (the value given is not repeated here); the MCP server did not start and nothing was moved");
144978
+ if (!canonical5) throw new Error("mcp_unshield_to_invalid: every send address approved at start must be a base58 Solana address (the value given is not repeated here); the wallet did not start for your AI app and nothing was moved");
144979
144979
  }
144980
144980
  const unshieldCap = asText(maxUnshieldAtomic);
144981
144981
  if (unshieldCap && !POSITIVE_ATOMIC7.test(unshieldCap)) setupInvalid("the unshield limit must be a positive whole number of atomic units");
@@ -145158,7 +145158,7 @@ async function openWalletServer({
145158
145158
  if (!POSITIVE_ATOMIC7.test(asText(maxPaymentAtomic))) capRequired("the limit per payment (the most one payment may cost; maxPaymentAtomic, in atomic units) is required and must be a positive whole number");
145159
145159
  if (!POSITIVE_ATOMIC7.test(asText(maxSessionAtomic))) capRequired("the limit in total (the most this MCP process may pay in total; maxSessionAtomic, in atomic units) is required and must be a positive whole number");
145160
145160
  if (BigInt(asText(maxSessionAtomic)) < BigInt(asText(maxPaymentAtomic))) {
145161
- throw new Error(`mcp_cap_invalid: the limit in total must be at least the limit per payment (${usdcFlagText(asText(maxSessionAtomic))} USDC in total is below ${usdcFlagText(asText(maxPaymentAtomic))} USDC per payment); the MCP server did not start and nothing was paid. For example: ${oneTimeCommandLine("mcp --max-payment 0.05 --max-session 0.2")}`);
145161
+ throw new Error(`mcp_cap_invalid: the limit in total must be at least the limit per payment (${usdcFlagText(asText(maxSessionAtomic))} USDC in total is below ${usdcFlagText(asText(maxPaymentAtomic))} USDC per payment); the wallet did not start for your AI app and nothing was paid. For example: ${oneTimeCommandLine("mcp --max-payment 0.05 --max-session 0.2")}`);
145162
145162
  }
145163
145163
  const readyText = asText(readyPockets);
145164
145164
  if (readyText && !/^[0-5]$/.test(readyText)) setupInvalid("the number of ready pockets must be a whole number from 0 to 5");
@@ -145822,10 +145822,10 @@ var init_stdioServer = __esm({
145822
145822
  LAUNCH_NOTICE_TOOLS = Object.freeze(["wallet_balance", "wallet_status"]);
145823
145823
  withLaunchLine = (instructions2, line) => !line ? instructions2 : () => `${typeof instructions2 === "function" ? instructions2() : instructions2} Tell the user: ${line}`;
145824
145824
  capRequired = (detail) => {
145825
- throw new Error(`mcp_cap_required: ${detail}; the MCP server did not start. Start it with both limits, for example (0.05 USDC per payment, 0.20 USDC in total): ${oneTimeCommandLine("mcp --max-payment 0.05 --max-session 0.2")}`);
145825
+ throw new Error(`mcp_cap_required: ${detail}; the wallet did not start for your AI app. Start it with both limits, for example (0.05 USDC per payment, 0.20 USDC in total): ${oneTimeCommandLine("mcp --max-payment 0.05 --max-session 0.2")}`);
145826
145826
  };
145827
145827
  setupInvalid = (detail) => {
145828
- throw new Error(`mcp_setup_invalid: ${detail}; the MCP server did not start and nothing was moved`);
145828
+ throw new Error(`mcp_setup_invalid: ${detail}; the wallet did not start for your AI app and nothing was moved`);
145829
145829
  };
145830
145830
  TOOL_ROOTS_WAIT_MS = 6e4;
145831
145831
  ROOTS_FREE_TOOLS = /* @__PURE__ */ new Set(["pay_for_service", "inference_chat", "inference_models", "inference_server", "check_price", "find_paid_services"]);
@@ -158026,8 +158026,13 @@ var NEXT = /^(Next|Status|Home|Then): ?(.*)$/;
158026
158026
  var NPM_COMMAND = String.raw`npm(?= (?:install|i|uninstall|ci|cache|config|prefix|root|bin|exec|run|view|ls|update|set|get|-\S*)(?:\s|$))`;
158027
158027
  var SHINJUKU_COMMAND = String.raw`shinjuku(?= (?:add-funds|backup-export|backup-verify|balance|buy-item|cancel|chat|curl|deposit[a-z-]*|funds-status|help|infer|init|keep-warm|limits|mcp|move|own-address|pay|pay-me|prepare|recover|restore|seller[a-z-]*|setup[a-z-]*|transfer-token|unshield[a-z-]*|version)(?:\s|$))`;
158028
158028
  var COMMAND_PROGRAM = String.raw`(?:npx|${NPM_COMMAND}|iwr|${SHINJUKU_COMMAND}|hermes|claude|codex|cursor|chmod|chown|wsl|Stop-Process|powershell|cmd|tor)`;
158029
- var WHOLE_LINE_SIGNS = new RegExp(String.raw`^\s*(?:${COMMAND_PROGRAM}(?= |$)|[&$]|["{}\[\]]|- |[A-Za-z_][\w.-]* = )|^\s+[A-Za-z_][\w.-]*:(?: |$)`);
158029
+ var WHOLE_LINE_SIGNS = new RegExp(String.raw`^\s*(?:${COMMAND_PROGRAM}(?= |$)|[&$]|["{}\[\]]|- |[A-Za-z_][\w.-]*[ \t]*=)|^\s+[A-Za-z_][\w.-]*:(?: |$)`);
158030
158030
  var CODE_TOKEN2 = /^(?:-|[^\s,;()]*[=@\\/:])/;
158031
+ var CONFIG_LINE = /^\s*(?:["{}\[\]]|- |[A-Za-z_][\w.-]*[ \t]*=)|^\s+[A-Za-z_][\w.-]*:(?: |$)/;
158032
+ var COLUMN_ROW = /^([ \t]+)(\S+(?: \S+)*?)( {2,})(\S.*)$/;
158033
+ var ROW_GAP = 3;
158034
+ var PATH_START = /(?:^|\s)(?:[A-Za-z]:\\|\\\\|~\/|\/)/;
158035
+ var CODE_WORDS = /(?:^|\s)-|[\\\/=@`"]/;
158031
158036
  var UNIT_PATTERNS = [
158032
158037
  // A command program and up to six words after it, to the next , ; ( ); while its words hold code (a flag, a path, =, @
158033
158038
  // or :), it goes on to the next such sign or the end (Claude Code's "with command: cmd /c npx ... mcp to user config").
@@ -158085,18 +158090,24 @@ function wrapWords(text3, firstPrefix, restPrefix, width) {
158085
158090
  return pieces;
158086
158091
  }
158087
158092
  function wrapSetupLine(line, paint2, width) {
158088
- if (!width || line.startsWith("\r") || columnsOf3(line) <= width || line.includes("\x1B[") || wholeLine(line) || PROGRESS.test(line)) return void 0;
158089
- const label = LABEL.exec(line);
158090
- if (label) {
158091
- const head = ` ${label[1]}${label[2]}`;
158092
- const under = " ".repeat(columnsOf3(head));
158093
- const pieces2 = wrapWords(label[3], head, under, width);
158094
- if (pieces2.length < 2) return void 0;
158095
- return [
158096
- paint2([[" ", ""], [label[1] + label[2], "mute"], [pieces2[0], "bone"]]),
158097
- ...pieces2.slice(1).map((piece) => paint2([[under, ""], [piece, "bone"]]))
158098
- ].join("\n");
158099
- }
158093
+ if (!width || line.startsWith("\r") || columnsOf3(line) <= width || line.includes("\x1B[") || PROGRESS.test(line)) return void 0;
158094
+ const row = !CONFIG_LINE.test(line) && COLUMN_ROW.exec(line);
158095
+ const isRow = row && !PATH_START.test(row[2]) && (!wholeLine(line) || row[3].length >= ROW_GAP && wholeLine(row[2]) && !CODE_WORDS.test(row[4]));
158096
+ if (isRow) {
158097
+ const [, indent2, first2, gap, about] = row;
158098
+ const head = `${indent2}${first2}${gap}`;
158099
+ const cls = COMMAND.test(line) ? "brass" : LABEL.test(line) ? "bone" : "dim";
158100
+ const firstWord = /^\S+/.exec(about)[0];
158101
+ if (columnsOf3(`${head}${firstWord}`) <= width) {
158102
+ const under = " ".repeat(columnsOf3(head));
158103
+ const pieces3 = wrapWords(about, head, under, width);
158104
+ if (pieces3.length < 2) return void 0;
158105
+ return [paintSetupLine(`${head}${pieces3[0]}`, paint2), ...pieces3.slice(1).map((piece) => paint2([[under, ""], [piece, cls]]))].join("\n");
158106
+ }
158107
+ const pieces2 = wrapWords(about, indent2, indent2, width);
158108
+ return [paintSetupLine(`${indent2}${first2}`, paint2), ...pieces2.map((piece) => paint2([[indent2, ""], [piece, cls]]))].join("\n");
158109
+ }
158110
+ if (wholeLine(line)) return void 0;
158100
158111
  const indent = /^[ \t]*/.exec(line)[0];
158101
158112
  const body = line.slice(indent.length);
158102
158113
  const kind = indent ? { cls: "dim" } : DONE.test(line) ? { mark: ["\u25C6 ", "crim"], cls: "verm" } : FAIL.test(line) ? { mark: ["\u25CB ", "crim"], cls: "crim" } : WARN.test(line) ? { mark: ["! ", "verm"], cls: "verm" } : STEP.test(line) ? { mark: ["\u25C6 ", "crim"], cls: "bone" } : NEXT.test(line) ? { cls: "bone", next: true } : { cls: "dim" };
@@ -160561,7 +160572,7 @@ async function runChatCommand(values, deps) {
160561
160572
  function validateMcp(values, env) {
160562
160573
  validatePayerSession("mcp", values, env);
160563
160574
  if (BigInt(values.get("--max-session")) < BigInt(values.get("--max-payment"))) {
160564
- throw new PublicFailure(`mcp_cap_invalid: --max-session must be at least --max-payment (--max-session ${usdcFlagText(values.get("--max-session"))} is below --max-payment ${usdcFlagText(values.get("--max-payment"))}, in USDC); the MCP server did not start and nothing was paid`);
160575
+ throw new PublicFailure(`mcp_cap_invalid: --max-session must be at least --max-payment (--max-session ${usdcFlagText(values.get("--max-session"))} is below --max-payment ${usdcFlagText(values.get("--max-payment"))}, in USDC); the wallet did not start for your AI app and nothing was paid`);
160565
160576
  }
160566
160577
  if (values.has("--no-shield") && values.has("--allow-shield")) throw new UsageError("--no-shield and --allow-shield contradict each other: pass one (wallet_shield is on by default)");
160567
160578
  if (values.has("--no-shield") && values.has("--max-shield")) throw new UsageError("--max-shield caps wallet_shield, which --no-shield turns off: pass one");
@@ -160935,7 +160946,7 @@ async function runMcp2(values, deps) {
160935
160946
  const { code: code2, started } = await torRunOf(["mcp", ...values.get(MCP_RAW_ARGS), ...tunnel ? ["--proxy", tunnel] : []], deps);
160936
160947
  if (code2 === 0) return void 0;
160937
160948
  if (started) {
160938
- throw new PublicFailure(`wallet_command_failed: the MCP server ran behind Tor and then ended with exit code ${code2}; its own message is above. Tor was running when it started, so this is not a Tor failure, and nothing fell back to a direct connection. Fix what that message says, then start mcp again`);
160949
+ throw new PublicFailure(`wallet_command_failed: the wallet for your AI app ran behind Tor and then ended with exit code ${code2}; its own message is above. Tor was running when it started, so this is not a Tor failure, and nothing fell back to a direct connection. Fix what that message says, then start mcp again`);
160939
160950
  }
160940
160951
  const configPath2 = join48(torHome, "config.json");
160941
160952
  if (deps.stdinIsTTY()) {
@@ -160946,9 +160957,9 @@ async function runMcp2(values, deps) {
160946
160957
  now = { answer: false };
160947
160958
  }
160948
160959
  if (now.answer === "too_old") {
160949
- throw new PublicFailure("mcp_tor_unavailable: your Tor program is too old, so the MCP server did not start and nothing was paid. Its message above has the command that installs a newer Tor; then start mcp again");
160960
+ throw new PublicFailure("mcp_tor_unavailable: your Tor program is too old, so the wallet did not start for your AI app and nothing was paid. Its message above has the command that installs a newer Tor; then start mcp again");
160950
160961
  }
160951
- throw new PublicFailure(`mcp_tor_unavailable: your private connection (Tor) is not running, so the MCP server did not start and nothing was paid (the Tor run of mcp ended with exit code ${code2}; its message is above). ` + (process.platform === "win32" ? "Then start it again." : torStartText("start mcp again", { tunnel: recordedTunnelUrl(configPath2) })));
160962
+ throw new PublicFailure(`mcp_tor_unavailable: your private connection (Tor) is not running, so the wallet did not start for your AI app and nothing was paid (the Tor run of mcp ended with exit code ${code2}; its message is above). ` + (process.platform === "win32" ? "Then start it again." : torStartText("start mcp again", { tunnel: recordedTunnelUrl(configPath2) })));
160952
160963
  }
160953
160964
  await deps.mcpTorDownMain({ exitCode: code2, configPath: configPath2 });
160954
160965
  return void 0;
@@ -161168,13 +161179,13 @@ async function runMcpFirstRun(values, deps) {
161168
161179
  ` : "Shinjuku Shield is not set up on this machine yet (no config.json, wallet, passphrase file, or setup files).\n");
161169
161180
  const answer = String(await deps.ask("Set up Shinjuku Shield now? (y/n) ")).trim();
161170
161181
  if (!/^y(es)?$/i.test(answer)) {
161171
- throw new PublicFailure(`mcp_not_set_up: the wallet is not set up, so the MCP server did not start and nothing was created; when you are ready, run:
161182
+ throw new PublicFailure(`mcp_not_set_up: the wallet is not set up, so the wallet did not start for your AI app and nothing was created; when you are ready, run:
161172
161183
  ${setupCli2()} setup`);
161173
161184
  }
161174
161185
  const setupValues = new Map(Object.entries(setupOptionsOf(values, home)).filter(([key]) => key !== "home").map(([key, value2]) => [`--${key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`, value2]));
161175
161186
  await runSetupCommand(setupValues, deps);
161176
161187
  const after = mcpValuesAfterSetup(values, home, deps);
161177
- io.err("Setup is done. The MCP server starts now on this terminal (an agent host normally starts it; Ctrl-C stops it).\n");
161188
+ io.err("Setup is done. The wallet now runs in this terminal for an AI app (your AI app normally starts it by itself; Ctrl-C stops it).\n");
161178
161189
  return runMcp2(after.values, after.deps);
161179
161190
  }
161180
161191
  let warm;
@@ -161858,10 +161869,19 @@ function claudeCodeEntryOf(deps) {
161858
161869
  return void 0;
161859
161870
  }
161860
161871
  }
161861
- function runClaude(args, program = "claude", stdio = "inherit") {
161862
- const options = { stdio, windowsHide: true, timeout: 12e4 };
161872
+ var CLAUDE_SAID_CHARS = 2e3;
161873
+ function runClaude(args, program = "claude", stdio = "inherit", sink) {
161874
+ const options = {
161875
+ stdio: sink ? ["ignore", "pipe", "pipe"] : stdio,
161876
+ windowsHide: true,
161877
+ timeout: 12e4,
161878
+ ...sink ? { encoding: "utf8", maxBuffer: 64 * 1024 * 1024 } : {}
161879
+ };
161863
161880
  const programWord = program === "claude" ? program : `"${program}"`;
161864
161881
  const result = process.platform === "win32" && !/\.exe$/i.test(program) ? spawnSync11([programWord, ...args.map((word2) => hostShellWord(word2, "win32"))].join(" "), { ...options, shell: true }) : spawnSync11(program, args, options);
161882
+ if (sink) sink.text = `${result.stdout ?? ""}
161883
+ ${result.stderr ?? ""}${result.error ? `
161884
+ ${result.error.message}` : ""}`.trim().slice(-CLAUDE_SAID_CHARS);
161865
161885
  return result.status ?? 1;
161866
161886
  }
161867
161887
  function claudeRemoveLines(program, platform) {
@@ -161993,7 +162013,8 @@ ${claudeCodeLines({ ...claudeOptions, claudeProgram }).map((line) => ` ${line}`
161993
162013
  continue;
161994
162014
  }
161995
162015
  const quiet = (args) => (deps.runClaudeCliQuiet ?? deps.runClaudeCli)(args, claudeProgram);
161996
- const runClaudeCli = (args) => deps.runClaudeCli(args, claudeProgram);
162016
+ const said = {};
162017
+ const runClaudeCli = (args) => deps.runClaudeCli(args, claudeProgram, said);
161997
162018
  for (const old of OLD_MCP_SERVER_NAMES) {
161998
162019
  if (quiet(["mcp", "remove", "--scope", "user", old]) === 0) io.out(`Replaced the old ${old} entry in Claude Code.
161999
162020
  `);
@@ -162022,7 +162043,8 @@ ${claudeCodeLines({ ...claudeOptions, claudeProgram }).map((line) => ` ${line}`
162022
162043
  if (status === 0) done.add(target);
162023
162044
  const homeNow = replacedOther ? ` Claude Code now uses the wallet in ${home}; the wallet in ${otherHome} is unchanged.` : "";
162024
162045
  io.out(status === 0 ? `${removed ? "Replaced the wallet in" : "Added the wallet to"} Claude Code, for all your folders.${homeNow} ${allowWalletChecks(deps).say} ${RESTART_APP("Claude Code")}${noStartFolderWords(target, mcpServerEntry(options))}
162025
- ` : `Claude Code did not take the server; its message is above. Run this yourself:
162046
+ ` : `Claude Code did not add the wallet${said.text ? `. Claude Code said: ${said.text}` : ""}
162047
+ Run this yourself:
162026
162048
  ${claudeCodeLines({ ...claudeOptions, claudeProgram }).map((line) => ` ${line}`).join("\n")}
162027
162049
  ` + (removed ? `Setup removed the old ${MCP_SERVER_NAME} entry first, so Claude Code has none until that line runs.
162028
162050
  ` : `If it says the server already exists, remove that entry with this command, then run the line above:
@@ -163479,7 +163501,7 @@ var COMMANDS = [
163479
163501
  },
163480
163502
  {
163481
163503
  name: "mcp",
163482
- summary: "Run a local MCP server (stdio) that lets an agent pay x402 URLs from your private balance, under caps you set.",
163504
+ summary: "Run the wallet for an AI app on this computer, so the app can pay websites from your private balance, under caps you set.",
163483
163505
  env: [],
163484
163506
  flags: [
163485
163507
  flag2("--max-payment", "<usdc>", "optional: the most one payment may cost, in USDC (0.05 = 5 cents); a tool argument can only lower it. Default no limit", { check: "atomic", usdc: true }),
@@ -167364,7 +167386,7 @@ function defaultDependencies() {
167364
167386
  }),
167365
167387
  /** claude with no output on the terminal (setup's probe of an old entry, and its remove); the exit status. */
167366
167388
  runClaudeCliQuiet: (args, program) => runClaude(args, program, "ignore"),
167367
- runClaudeCli: (args, program) => runClaude(args, program, "inherit"),
167389
+ runClaudeCli: (args, program, sink) => runClaude(args, program, "inherit", sink),
167368
167390
  /**
167369
167391
  * The --tor entry of this CLI: re-execute `args` behind Tor (proxy.mjs proves Tor first). `startedFile`
167370
167392
  * (torRunOf) reaches the Tor run in its environment, which proxy.mjs copies from this process at the spawn.