shinjuku-shield 0.3.93 → 0.3.94

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.93. The npm packages `shinjuku-shield` and
9
+ This is version 0.3.94. The npm packages `shinjuku-shield` and
10
10
  `shinjuku-shielded` hold the same files; `shinjuku` is the short command.
11
11
 
12
12
  ## Set up
13
13
 
14
14
  ```sh
15
- npx -y --no-audit --no-fund shinjuku-shield@0.3.93 setup
15
+ npx -y --no-audit --no-fund shinjuku-shield@0.3.94 setup
16
16
  ```
17
17
 
18
18
  Setup makes the wallet on this machine, a private passphrase file, and the
@@ -24,7 +24,7 @@ server to that host's config.
24
24
  ## The `shinjuku` command
25
25
 
26
26
  ```sh
27
- npm install -g shinjuku@0.3.93
27
+ npm install -g shinjuku@0.3.94
28
28
  shinjuku help
29
29
  ```
30
30
 
@@ -36,13 +36,13 @@ Every wallet command works after `shinjuku`, for example `shinjuku balance`,
36
36
  Claude Code:
37
37
 
38
38
  ```sh
39
- claude mcp add --scope user shinjuku-shielded -- npx -y --no-audit --no-fund shinjuku-shield@0.3.93 mcp
39
+ claude mcp add --scope user shinjuku-shielded -- npx -y --no-audit --no-fund shinjuku-shield@0.3.94 mcp
40
40
  ```
41
41
 
42
42
  Claude Desktop (`claude_desktop_config.json`) or Cursor (`~/.cursor/mcp.json`):
43
43
 
44
44
  ```json
45
- { "mcpServers": { "shinjuku-shielded": { "command": "npx", "args": ["-y", "--no-audit", "--no-fund", "shinjuku-shield@0.3.93", "mcp"] } } }
45
+ { "mcpServers": { "shinjuku-shielded": { "command": "npx", "args": ["-y", "--no-audit", "--no-fund", "shinjuku-shield@0.3.94", "mcp"] } } }
46
46
  ```
47
47
 
48
48
  On native Windows, if the host cannot find `npx`, use `"command": "cmd"` and
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": "6048ca6123de12e425ab2f3575fa69838eb1ea93dbff3d2facab612e0004bf8a",
5
- "bytes": 12704961,
6
- "sourceCommit": "714b20d52346099009acced7d327566f239e8b7d",
4
+ "sha256": "af5b54d5bce11c64a002dca7d59c8593767ddefe4b7177b8ef44cdefb27f0030",
5
+ "bytes": 12706861,
6
+ "sourceCommit": "1de2cfe58fcb9a08b6665b2f37aad6bb916c943a",
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",
@@ -1297,5 +1297,5 @@
1297
1297
  "version": "1.8.0"
1298
1298
  }
1299
1299
  ],
1300
- "publishedAt": "2026-10-24T03:23:12.626Z"
1300
+ "publishedAt": "2026-10-24T04:23:52.556Z"
1301
1301
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "shinjuku-shield",
3
- "version": "0.3.93",
3
+ "version": "0.3.94",
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": "6048ca61",
7
- "shinjukuSha256": "6048ca6123de12e425ab2f3575fa69838eb1ea93dbff3d2facab612e0004bf8a",
6
+ "shinjukuRelease": "af5b54d5",
7
+ "shinjukuSha256": "af5b54d5bce11c64a002dca7d59c8593767ddefe4b7177b8ef44cdefb27f0030",
8
8
  "license": "SEE LICENSE IN LICENSE.txt",
9
9
  "author": "Shinjuku Shielded",
10
10
  "homepage": "https://github.com/ShinjukuStaition/shinjuku-mcp#readme",
@@ -110080,7 +110080,11 @@ function refusalSay(a, tool, again, npmVersion) {
110080
110080
  return `Not set up. This app cannot show the setup question. Run ${oneTimeCommandLine("setup", npmVersion)} in a terminal, then reconnect the wallet.`;
110081
110081
  }
110082
110082
  if (code2 === "mcp_setup_declined") return "Not set up. The setup was not confirmed; nothing was created.";
110083
- if (code2 === "tor_not_running" && tool === "shinjuku_setup") return "Not set up: Tor is not running on this computer. Start it with the command below and ask again, or set up without Tor.";
110083
+ const setupTool = tool === "shinjuku_setup" || tool === "wallet_status";
110084
+ if (code2 === "tor_not_running" && setupTool && /Tor Browser is open/.test(detail)) {
110085
+ return "Not set up: Tor Browser is open, but the wallet needs its own Tor. Start it with the command below, or set up without Tor.";
110086
+ }
110087
+ if (code2 === "tor_not_running" && setupTool) return "Not set up: Tor is not running on this computer. Start it with the command below and ask again, or set up without Tor.";
110084
110088
  if (code2 === "wallet_not_set_up" && tool === "x402_discover") return "Not searched yet. Set up the wallet first: setup asks one question, whether to use Tor, which hides your IP address.";
110085
110089
  if (code2 === "wallet_not_set_up") return "The wallet is not set up yet, so nothing was paid. Ask to set up the wallet first.";
110086
110090
  if (code2 === "mcp_tool_disabled") return "Nothing was paid or moved. This tool is off; only your owner can turn it on when starting the wallet.";
@@ -133449,7 +133453,7 @@ function createSetupTools({
133449
133453
  log = () => {
133450
133454
  },
133451
133455
  activate,
133452
- startWaitMs = 5e3,
133456
+ startWaitMs = SETUP_ANSWER_WAIT_MS,
133453
133457
  elicitTimeoutMs = ELICIT_TIMEOUT_MS,
133454
133458
  discoverCacheDir = join32(setupHome(), "discover-cache"),
133455
133459
  npmVersion
@@ -133531,8 +133535,21 @@ function createSetupTools({
133531
133535
  next: `The wallet tools are live in this server: call wallet_balance.${recoveryNext(summary)}` + (summary.tor === true ? " Setup ran over Tor, and the wallet runs over Tor: the servers it talks to do not see this computer's IP address." : "") + (summary.wallet.solanaFeePayer ? " To add funds, call wallet_shield after the user sends USDC to solanaFeePayer (no SOL needed), or call" : " To add funds, call") + " wallet_add_funds: it gives a one-time address for any amount from 0.01 USDC. After the user sends USDC there, ask for the balance once: the wallet then sees the USDC and makes it private by itself after a random privacy wait of a few minutes." + (privateInference ? " Private inference is on: after funding, call inference_chat (with no prompt it lists the models and prices); if this server was started with --no-tor, restart it without --no-tor so it runs behind Tor (inference_chat refuses until then)." : "")
133532
133536
  });
133533
133537
  }
133538
+ if (job.state === "confirming") return json3({ say: SETUP_CONFIRMING_SAY, ok: true, stage: "confirming", next: SETUP_CONFIRMING_NEXT });
133534
133539
  return json3({ ok: true, stage: job.stage, ...job.progress ? { progress: job.progress } : {}, next: SETUP_POLL_NEXT });
133535
133540
  }
133541
+ async function waitForAnswer({ progress: progress3, signal } = {}) {
133542
+ if (job?.state !== "confirming") return;
133543
+ const cancelled = signal ? new Promise((resolve41) => {
133544
+ if (signal.aborted) resolve41();
133545
+ else signal.addEventListener("abort", resolve41, { once: true });
133546
+ }) : void 0;
133547
+ await waitOrProgress(
133548
+ [job.answered, ...cancelled ? [cancelled] : []],
133549
+ startWaitMs,
133550
+ { progress: progress3, message: "waiting for the user's answer in the setup question" }
133551
+ );
133552
+ }
133536
133553
  async function confirm2(plan) {
133537
133554
  const limit = (atomic4) => String(atomic4) === NO_LIMIT_ATOMIC2 ? "no limit" : `${usdc9(atomic4)} USDC`;
133538
133555
  const message = `Create a Shinjuku Shield wallet on this machine (spending limits: ${limit(plan.maxPaymentAtomic)} per payment, ${limit(plan.maxSessionAtomic)} in any 24 hours)? The keys and a random passphrase stay in private files on this machine.`;
@@ -133557,8 +133574,11 @@ function createSetupTools({
133557
133574
  return { ok: false, privateInference: false, tor: false, unshown: error?.timedOut !== true && elicitUnshown(askedAt) };
133558
133575
  }
133559
133576
  }
133560
- async function begin() {
133561
- if (job) return status();
133577
+ async function begin(ctx) {
133578
+ if (job) {
133579
+ await waitForAnswer(ctx);
133580
+ return status();
133581
+ }
133562
133582
  const plan = setup.plan();
133563
133583
  if (!plan.ok) return refuse12(plan.code, plan.detail, `Nothing was created. ${setupTerminalNext()}, on a machine that can run the proof tools (Linux, or Windows with WSL)`);
133564
133584
  if (!client?.canElicit?.()) {
@@ -133568,23 +133588,31 @@ function createSetupTools({
133568
133588
  setupTerminalNext()
133569
133589
  );
133570
133590
  }
133571
- job = { state: "confirming", stage: "confirming" };
133591
+ let answered2;
133592
+ job = { state: "confirming", stage: "confirming", answered: new Promise((resolve41) => {
133593
+ answered2 = resolve41;
133594
+ }) };
133572
133595
  const started = (async () => {
133573
133596
  const answer = await confirm2(plan);
133574
133597
  if (!answer.ok) {
133575
133598
  job.state = "declined";
133599
+ job.stage = "declined";
133576
133600
  job.unshown = answer.unshown;
133577
133601
  log(`MCP_SETUP_DECLINED${answer.unshown ? " unshown=true" : ""}`);
133602
+ answered2();
133578
133603
  return;
133579
133604
  }
133580
133605
  if (answer.tor && !inTorRun() && await localTorProof(TOR_HTTP_TUNNEL) === "refused") {
133581
133606
  job.torBrowser = await localTorProof(TOR_BROWSER_PORT) !== "refused";
133582
133607
  job.state = "no_tor";
133608
+ job.stage = "no_tor";
133583
133609
  log(`MCP_SETUP_NO_TOR${job.torBrowser ? " tor-browser=open" : ""}`);
133610
+ answered2();
133584
133611
  return;
133585
133612
  }
133586
133613
  job.state = "running";
133587
133614
  job.stage = "starting";
133615
+ answered2();
133588
133616
  job.privateInference = answer.privateInference;
133589
133617
  log(`MCP_SETUP_STARTED tor=${answer.tor}`);
133590
133618
  try {
@@ -133599,6 +133627,7 @@ function createSetupTools({
133599
133627
  } catch (error) {
133600
133628
  job.failure = failure2(error, "mcp_setup_failed");
133601
133629
  job.state = "failed";
133630
+ job.stage = "failed";
133602
133631
  log(`MCP_SETUP_FAILED ${job.failure.error}`);
133603
133632
  return;
133604
133633
  }
@@ -133609,22 +133638,21 @@ function createSetupTools({
133609
133638
  } catch (error) {
133610
133639
  job.failure = failure2(error, "mcp_setup_switch_failed");
133611
133640
  job.state = "restart";
133641
+ job.stage = "done";
133612
133642
  log(`MCP_SETUP_SWITCH_FAILED ${job.failure.error}`);
133613
133643
  }
133614
133644
  })();
133615
- await Promise.race([started, new Promise((resolve41) => {
133616
- const timer = setTimeout(resolve41, startWaitMs);
133617
- timer.unref?.();
133618
- })]);
133645
+ started.then(answered2, answered2);
133646
+ await waitForAnswer(ctx);
133619
133647
  return status();
133620
133648
  }
133621
133649
  const setupTool = {
133622
133650
  name: "shinjuku_setup",
133623
133651
  title: "Set up the Shinjuku Shield wallet",
133624
- description: "The wallet is not set up on this machine yet. Call this when the user wants to pay an x402 URL, check a balance, or shield USDC. It asks the user to confirm in this client (with the spending caps), then creates a self-custody wallet on this machine (keys and a random passphrase in private local files; no tool takes or returns them), downloads and checks the proof tools (about 191 MB, minutes), and switches this server to the wallet tools. Takes no arguments. Call it again with no arguments as `next` says for the stage (confirming, tor, platform, release, passphrase, wallet, proof-tools, config, done). A decline creates nothing (mcp_setup_declined). A client that cannot confirm is refused (mcp_setup_needs_terminal) with the terminal command; a client that declines at once without showing the dialog gets mcp_setup_declined with the same terminal command.",
133652
+ description: "The wallet is not set up on this machine yet. Call this when the user wants to pay an x402 URL, check a balance, or shield USDC. It asks the user to confirm in this client (with the spending caps), then creates a self-custody wallet on this machine (keys and a random passphrase in private local files; no tool takes or returns them), downloads and checks the proof tools (about 191 MB, minutes), and switches this server to the wallet tools. Takes no arguments. Call it again with no arguments as `next` says for the stage (confirming, tor, platform, release, passphrase, wallet, proof-tools, config, done; declined, no_tor or failed: the setup ended, and this call answers why). A decline creates nothing (mcp_setup_declined). A client that cannot confirm is refused (mcp_setup_needs_terminal) with the terminal command; a client that declines at once without showing the dialog gets mcp_setup_declined with the same terminal command.",
133625
133653
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
133626
133654
  annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
133627
- run: () => begin()
133655
+ run: (args, ctx) => begin(ctx)
133628
133656
  };
133629
133657
  const statusTool = {
133630
133658
  name: "wallet_status",
@@ -133633,6 +133661,7 @@ function createSetupTools({
133633
133661
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
133634
133662
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
133635
133663
  run: async () => {
133664
+ if (job && ["failed", "no_tor", "declined", "restart"].includes(job.state)) return status();
133636
133665
  let missing;
133637
133666
  try {
133638
133667
  missing = setup.missing();
@@ -133644,7 +133673,7 @@ function createSetupTools({
133644
133673
  setUp: missing.length === 0 && (!job || job.state === "done"),
133645
133674
  missing,
133646
133675
  ...job ? { stage: job.stage } : {},
133647
- next: job ? SETUP_POLL_NEXT : "call shinjuku_setup when the user wants to use the wallet"
133676
+ next: job ? job.state === "confirming" ? SETUP_CONFIRMING_NEXT : SETUP_POLL_NEXT : "call shinjuku_setup when the user wants to use the wallet"
133648
133677
  });
133649
133678
  }
133650
133679
  };
@@ -133695,11 +133724,11 @@ function createSetupTools({
133695
133724
  } });
133696
133725
  const discover = discoverNow ? withSay(discoverTool(discoverCacheDir), { npmVersion }) : sayOnRefusal(discoverAfterSetup());
133697
133726
  return {
133698
- tools: [sayOnRefusal(setupTool), statusTool, ...MCP_TOOL_NAMES.map((name) => name !== "x402_discover" ? sayOnRefusal(notSetUp(name)) : discover)],
133727
+ tools: [sayOnRefusal(setupTool), sayOnRefusal(statusTool), ...MCP_TOOL_NAMES.map((name) => name !== "x402_discover" ? sayOnRefusal(notSetUp(name)) : discover)],
133699
133728
  doneTool: sayOnRefusal(doneTool)
133700
133729
  };
133701
133730
  }
133702
- var import_web3133, shownCaps, RELEASE_RETRY_MS, STAGE_WORDS, stageWords, INTERNAL_BALANCE_DETAIL, shownBreakdown, sessionLeftShown, TOKEN_UNIT_TOOLS, RESOURCE_PAYMENT_WAL_PREFIX2, POOL_LAYOUT_CODE, POOL_LAYOUT_UPDATE, USEPOD_VIA_INFERENCE_CHAT, SEND_RUNS_ON, DEPOSIT_RUNS_ON, CLI_FUNDS_PLAN_PREFIX, CLI_FUNDS_SCHEMA, SELF_PAY_ORIGIN3, REQUEST_ID4, POSITIVE_ATOMIC6, PRIVATE_HOST3, FORBIDDEN_HEADERS3, MAX_BODY_BYTES2, PREVIEW_TIMEOUT_MS, PREVIEW_SELLER_READ_MS, CALL_BUDGET_MS, budgetLeft, MONEY_FIRST_ANSWER_MS, BALANCE_AFTER_LANDING_MS, JOIN_CALL_MAX_MS, JOIN_NUDGE_QUIET_MS, JOIN_STEP_MS, sleep2, PROGRESS_EVERY_MS2, READ_BUDGET_MS, UNPAID_TOR_TRY_MS, UNPAID_CLEAR_MS, READ_BUDGET_TOOLS, FLOAT_BUSY_CODES, RETRY_MARGIN_MS, ASK_PAY_CODES, runningNpmVersion, terminalCommand, capPlaceWords, capRaiseText, cheaperSellerText, limitNext, SAFE_TEXT, MCP_TOOL_ALIASES, POOL_SWITCH_WHY, POOL_SWITCH_NEXT, SWITCH_STATES, quietSwitch, switchKey, ATOMIC_TEXT, FLOAT_ID, ANSWERED_EXIT_RETRY_MS, ANSWERED_EXIT_UNCONFIRMED_MS, ANSWERED_EXIT_RETRY_WINDOW_MS, ANSWERED_EXIT_CLOSED, switchAmount, switchEta, switchRows, OWNER_CAP_CODES, JOIN_END_MCP, JOIN_END_TERMINAL_LIBRARY, JOIN_RETRY_BACKOFF_MS, WALLET_CAP_FIX, MCP_CAP_FIX, capFix, ownerOnlyNext, mcpNext, CONFIDENTIAL_RETIRED, json3, answerResult, discoverTool, refuse12, publicOffer, FLOAT_PAID_CODES, FLOAT_PRIVATE_LEG, floatStillSettling, MONEY_ID2, toRecordId, linkKindOf, moneyId, REFUSED_CODES, refusedCodeOf, PLAIN_REASONS, plainReason, KEPT_SEND_TRIES, shownId, isSplitSend, sendPartId, PROMISED_NEXT, PUBLIC_READ_TIMEOUT_MS, RECIPIENT_CHECK_TIMEOUT_MS, withTimeout, ownKey, readFailure, OWN_KEY_TOKENS_MAX, OWN_TOKENS_GRACE_MS, tokenAmountText, elsewhereId, AGENT_ID_SCHEMA, agentIdName, minutesText2, ageWords2, DEPOSIT_SENT_STATES, depositLanded, usdcText2, walkWalletHistory, REFRESH_LEASE_WALK_MS, HOME_MARKS_SETTLED_MS2, AUTO_BACKUPS_KEPT, AUTO_BACKUP_NAME, AUTO_BACKUP_VERIFIED, FRONTED_SETTLE_MARGIN_SLOTS, BALANCE_REFRESH_WAIT_MS, BALANCE_REFRESH_GRACE_MS, BALANCE_REFRESH_LONG_MS, INBOUND_REFRESH_AGE_MS, CAP_BALANCE_WAIT_MS, CAP_BALANCE_RETRY_MS, REFRESH_RETRY_MS, FINALITY_POLL_MS, FINALITY_WAIT_MS, FINALITY_REFRESH_LIMIT_MS, POOL_WATCH_MS, POOL_WATCH_POLL_MS, EARLY_BALANCE_DELAY_MS, FINALITY_SETTLE_WINDOW_SLOTS, PUBLIC_READ_ANSWER_MS, SWITCH_WAIT_MS, UNSHIELD_TO_NO_USDC_DETAIL, UNSHIELD_TO_INVALID_NEXT, INFERENCE_MIN_MAX_TOKENS, ELICIT_TIMEOUT_MS, ELICIT_UNSHOWN_MS, elicitUnshown, POLL_SECONDS3, TRANSFER_CHANGE_READ_MS, TEMP_CLEAN_DELAY_MS, KEPT_ON_DISK, MAX_SHIELDED_BALANCE_ATOMIC, receiveGenerator, MCP_TOOL_NAMES, MCP_HIDDEN_TOOL_NAMES, setupTerminalNext, SETUP_POLL_NEXT, PRIVATE_INFERENCE_WHY, RESTART_STEPS, TOR_BROWSER_PORT, SETUP_TOR_TITLE, SETUP_TOR_WHY;
133731
+ var import_web3133, shownCaps, RELEASE_RETRY_MS, STAGE_WORDS, stageWords, INTERNAL_BALANCE_DETAIL, shownBreakdown, sessionLeftShown, TOKEN_UNIT_TOOLS, RESOURCE_PAYMENT_WAL_PREFIX2, POOL_LAYOUT_CODE, POOL_LAYOUT_UPDATE, USEPOD_VIA_INFERENCE_CHAT, SEND_RUNS_ON, DEPOSIT_RUNS_ON, CLI_FUNDS_PLAN_PREFIX, CLI_FUNDS_SCHEMA, SELF_PAY_ORIGIN3, REQUEST_ID4, POSITIVE_ATOMIC6, PRIVATE_HOST3, FORBIDDEN_HEADERS3, MAX_BODY_BYTES2, PREVIEW_TIMEOUT_MS, PREVIEW_SELLER_READ_MS, CALL_BUDGET_MS, budgetLeft, MONEY_FIRST_ANSWER_MS, BALANCE_AFTER_LANDING_MS, JOIN_CALL_MAX_MS, JOIN_NUDGE_QUIET_MS, JOIN_STEP_MS, sleep2, PROGRESS_EVERY_MS2, READ_BUDGET_MS, UNPAID_TOR_TRY_MS, UNPAID_CLEAR_MS, READ_BUDGET_TOOLS, FLOAT_BUSY_CODES, RETRY_MARGIN_MS, ASK_PAY_CODES, runningNpmVersion, terminalCommand, capPlaceWords, capRaiseText, cheaperSellerText, limitNext, SAFE_TEXT, MCP_TOOL_ALIASES, POOL_SWITCH_WHY, POOL_SWITCH_NEXT, SWITCH_STATES, quietSwitch, switchKey, ATOMIC_TEXT, FLOAT_ID, ANSWERED_EXIT_RETRY_MS, ANSWERED_EXIT_UNCONFIRMED_MS, ANSWERED_EXIT_RETRY_WINDOW_MS, ANSWERED_EXIT_CLOSED, switchAmount, switchEta, switchRows, OWNER_CAP_CODES, JOIN_END_MCP, JOIN_END_TERMINAL_LIBRARY, JOIN_RETRY_BACKOFF_MS, WALLET_CAP_FIX, MCP_CAP_FIX, capFix, ownerOnlyNext, mcpNext, CONFIDENTIAL_RETIRED, json3, answerResult, discoverTool, refuse12, publicOffer, FLOAT_PAID_CODES, FLOAT_PRIVATE_LEG, floatStillSettling, MONEY_ID2, toRecordId, linkKindOf, moneyId, REFUSED_CODES, refusedCodeOf, PLAIN_REASONS, plainReason, KEPT_SEND_TRIES, shownId, isSplitSend, sendPartId, PROMISED_NEXT, PUBLIC_READ_TIMEOUT_MS, RECIPIENT_CHECK_TIMEOUT_MS, withTimeout, ownKey, readFailure, OWN_KEY_TOKENS_MAX, OWN_TOKENS_GRACE_MS, tokenAmountText, elsewhereId, AGENT_ID_SCHEMA, agentIdName, minutesText2, ageWords2, DEPOSIT_SENT_STATES, depositLanded, usdcText2, walkWalletHistory, REFRESH_LEASE_WALK_MS, HOME_MARKS_SETTLED_MS2, AUTO_BACKUPS_KEPT, AUTO_BACKUP_NAME, AUTO_BACKUP_VERIFIED, FRONTED_SETTLE_MARGIN_SLOTS, BALANCE_REFRESH_WAIT_MS, BALANCE_REFRESH_GRACE_MS, BALANCE_REFRESH_LONG_MS, INBOUND_REFRESH_AGE_MS, CAP_BALANCE_WAIT_MS, CAP_BALANCE_RETRY_MS, REFRESH_RETRY_MS, FINALITY_POLL_MS, FINALITY_WAIT_MS, FINALITY_REFRESH_LIMIT_MS, POOL_WATCH_MS, POOL_WATCH_POLL_MS, EARLY_BALANCE_DELAY_MS, FINALITY_SETTLE_WINDOW_SLOTS, PUBLIC_READ_ANSWER_MS, SWITCH_WAIT_MS, UNSHIELD_TO_NO_USDC_DETAIL, UNSHIELD_TO_INVALID_NEXT, INFERENCE_MIN_MAX_TOKENS, ELICIT_TIMEOUT_MS, ELICIT_UNSHOWN_MS, elicitUnshown, POLL_SECONDS3, TRANSFER_CHANGE_READ_MS, TEMP_CLEAN_DELAY_MS, KEPT_ON_DISK, MAX_SHIELDED_BALANCE_ATOMIC, receiveGenerator, MCP_TOOL_NAMES, MCP_HIDDEN_TOOL_NAMES, setupTerminalNext, SETUP_POLL_NEXT, SETUP_ANSWER_WAIT_MS, SETUP_CONFIRMING_SAY, SETUP_CONFIRMING_NEXT, PRIVATE_INFERENCE_WHY, RESTART_STEPS, TOR_BROWSER_PORT, SETUP_TOR_TITLE, SETUP_TOR_WHY;
133703
133732
  var init_tools = __esm({
133704
133733
  "wallet/src/mcp/tools.mjs"() {
133705
133734
  "use strict";
@@ -134094,7 +134123,7 @@ var init_tools = __esm({
134094
134123
  UNSHIELD_TO_INVALID_NEXT = "Nothing was sent. Tell the user: a Shinjuku wallet can send only to an address that already holds USDC, and a Shinjuku wallet's one-time add-funds address cannot be paid from a Shinjuku wallet yet. Ask the person for a Solana address that already holds USDC (for example their Phantom address) and call wallet_unshield with it, or pay the link from a normal Solana wallet instead";
134095
134124
  INFERENCE_MIN_MAX_TOKENS = 256;
134096
134125
  ELICIT_TIMEOUT_MS = 5 * 6e4;
134097
- ELICIT_UNSHOWN_MS = 2e3;
134126
+ ELICIT_UNSHOWN_MS = 500;
134098
134127
  elicitUnshown = (askedAt, answer) => Date.now() - askedAt < ELICIT_UNSHOWN_MS && answer?.action !== "accept";
134099
134128
  POLL_SECONDS3 = 30;
134100
134129
  TRANSFER_CHANGE_READ_MS = 2e3;
@@ -134134,6 +134163,9 @@ var init_tools = __esm({
134134
134163
  ]);
134135
134164
  setupTerminalNext = () => `Tell the user to run \`${terminalCommand("setup")}\` in a terminal on this machine, then reconnect the wallet (${RESTART_STEPS})`;
134136
134165
  SETUP_POLL_NEXT = `call shinjuku_setup again in ${POLL_SECONDS3} s for the status (it never creates a second wallet)`;
134166
+ SETUP_ANSWER_WAIT_MS = CALL_BUDGET_MS;
134167
+ SETUP_CONFIRMING_SAY = "Answer the setup box on your screen. The wallet waits for your answer.";
134168
+ SETUP_CONFIRMING_NEXT = "The setup question is open in this app: tell the user to answer it. Call shinjuku_setup again at once (it waits for the answer and then gives the result); do not end the turn. It never creates a second wallet";
134137
134169
  PRIVATE_INFERENCE_WHY = "Your agent then buys AI answers from an AI provider, paid from your private balance over Tor; the AI provider and the company that runs the model see the prompt, not who paid.";
134138
134170
  RESTART_STEPS = "In Claude Code: type /mcp, pick shinjuku-shielded, and choose Reconnect. In Claude Desktop: quit it and open it again. In another app: restart it";
134139
134171
  TOR_BROWSER_PORT = "http://127.0.0.1:9150";