claudish 2.6.3 → 2.8.1

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/index.js CHANGED
@@ -31245,6 +31245,2988 @@ var init_mcp_server = __esm(() => {
31245
31245
  ALL_MODELS_CACHE_PATH = join(__dirname2, "../all-models.json");
31246
31246
  });
31247
31247
 
31248
+ // src/profile-config.ts
31249
+ import { existsSync as existsSync2, mkdirSync, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "node:fs";
31250
+ import { homedir } from "node:os";
31251
+ import { join as join2 } from "node:path";
31252
+ function ensureConfigDir() {
31253
+ if (!existsSync2(CONFIG_DIR)) {
31254
+ mkdirSync(CONFIG_DIR, { recursive: true });
31255
+ }
31256
+ }
31257
+ function loadConfig() {
31258
+ ensureConfigDir();
31259
+ if (!existsSync2(CONFIG_FILE)) {
31260
+ return { ...DEFAULT_CONFIG };
31261
+ }
31262
+ try {
31263
+ const content = readFileSync2(CONFIG_FILE, "utf-8");
31264
+ const config3 = JSON.parse(content);
31265
+ return {
31266
+ version: config3.version || DEFAULT_CONFIG.version,
31267
+ defaultProfile: config3.defaultProfile || DEFAULT_CONFIG.defaultProfile,
31268
+ profiles: config3.profiles || DEFAULT_CONFIG.profiles
31269
+ };
31270
+ } catch (error46) {
31271
+ console.error(`Warning: Failed to load config, using defaults: ${error46}`);
31272
+ return { ...DEFAULT_CONFIG };
31273
+ }
31274
+ }
31275
+ function saveConfig(config3) {
31276
+ ensureConfigDir();
31277
+ writeFileSync2(CONFIG_FILE, JSON.stringify(config3, null, 2), "utf-8");
31278
+ }
31279
+ function configExists() {
31280
+ return existsSync2(CONFIG_FILE);
31281
+ }
31282
+ function getConfigPath() {
31283
+ return CONFIG_FILE;
31284
+ }
31285
+ function getProfile(name) {
31286
+ const config3 = loadConfig();
31287
+ return config3.profiles[name];
31288
+ }
31289
+ function getDefaultProfile() {
31290
+ const config3 = loadConfig();
31291
+ const profile = config3.profiles[config3.defaultProfile];
31292
+ if (!profile) {
31293
+ const firstProfile = Object.values(config3.profiles)[0];
31294
+ if (firstProfile) {
31295
+ return firstProfile;
31296
+ }
31297
+ return DEFAULT_CONFIG.profiles.default;
31298
+ }
31299
+ return profile;
31300
+ }
31301
+ function getProfileNames() {
31302
+ const config3 = loadConfig();
31303
+ return Object.keys(config3.profiles);
31304
+ }
31305
+ function setProfile(profile) {
31306
+ const config3 = loadConfig();
31307
+ const existingProfile = config3.profiles[profile.name];
31308
+ if (existingProfile) {
31309
+ profile.createdAt = existingProfile.createdAt;
31310
+ } else {
31311
+ profile.createdAt = new Date().toISOString();
31312
+ }
31313
+ profile.updatedAt = new Date().toISOString();
31314
+ config3.profiles[profile.name] = profile;
31315
+ saveConfig(config3);
31316
+ }
31317
+ function deleteProfile(name) {
31318
+ const config3 = loadConfig();
31319
+ if (!config3.profiles[name]) {
31320
+ return false;
31321
+ }
31322
+ const profileCount = Object.keys(config3.profiles).length;
31323
+ if (profileCount <= 1) {
31324
+ throw new Error("Cannot delete the last profile");
31325
+ }
31326
+ delete config3.profiles[name];
31327
+ if (config3.defaultProfile === name) {
31328
+ config3.defaultProfile = Object.keys(config3.profiles)[0];
31329
+ }
31330
+ saveConfig(config3);
31331
+ return true;
31332
+ }
31333
+ function setDefaultProfile(name) {
31334
+ const config3 = loadConfig();
31335
+ if (!config3.profiles[name]) {
31336
+ throw new Error(`Profile "${name}" does not exist`);
31337
+ }
31338
+ config3.defaultProfile = name;
31339
+ saveConfig(config3);
31340
+ }
31341
+ function getModelMapping(profileName) {
31342
+ const profile = profileName ? getProfile(profileName) : getDefaultProfile();
31343
+ if (!profile) {
31344
+ return {};
31345
+ }
31346
+ return profile.models;
31347
+ }
31348
+ function createProfile(name, models, description) {
31349
+ const now = new Date().toISOString();
31350
+ const profile = {
31351
+ name,
31352
+ description,
31353
+ models,
31354
+ createdAt: now,
31355
+ updatedAt: now
31356
+ };
31357
+ setProfile(profile);
31358
+ return profile;
31359
+ }
31360
+ function listProfiles() {
31361
+ const config3 = loadConfig();
31362
+ return Object.values(config3.profiles).map((profile) => ({
31363
+ ...profile,
31364
+ isDefault: profile.name === config3.defaultProfile
31365
+ }));
31366
+ }
31367
+ var CONFIG_DIR, CONFIG_FILE, DEFAULT_CONFIG;
31368
+ var init_profile_config = __esm(() => {
31369
+ CONFIG_DIR = join2(homedir(), ".claudish");
31370
+ CONFIG_FILE = join2(CONFIG_DIR, "config.json");
31371
+ DEFAULT_CONFIG = {
31372
+ version: "1.0.0",
31373
+ defaultProfile: "default",
31374
+ profiles: {
31375
+ default: {
31376
+ name: "default",
31377
+ description: "Default profile - balanced performance and cost",
31378
+ models: {
31379
+ opus: "x-ai/grok-3-beta",
31380
+ sonnet: "x-ai/grok-code-fast-1",
31381
+ haiku: "google/gemini-2.5-flash"
31382
+ },
31383
+ createdAt: new Date().toISOString(),
31384
+ updatedAt: new Date().toISOString()
31385
+ }
31386
+ }
31387
+ };
31388
+ });
31389
+
31390
+ // node_modules/@inquirer/core/dist/lib/key.js
31391
+ var isUpKey = (key, keybindings = []) => key.name === "up" || keybindings.includes("vim") && key.name === "k" || keybindings.includes("emacs") && key.ctrl && key.name === "p", isDownKey = (key, keybindings = []) => key.name === "down" || keybindings.includes("vim") && key.name === "j" || keybindings.includes("emacs") && key.ctrl && key.name === "n", isBackspaceKey = (key) => key.name === "backspace", isTabKey = (key) => key.name === "tab", isNumberKey = (key) => "1234567890".includes(key.name), isEnterKey = (key) => key.name === "enter" || key.name === "return";
31392
+
31393
+ // node_modules/@inquirer/core/dist/lib/errors.js
31394
+ var AbortPromptError, CancelPromptError, ExitPromptError, HookError, ValidationError;
31395
+ var init_errors5 = __esm(() => {
31396
+ AbortPromptError = class AbortPromptError extends Error {
31397
+ name = "AbortPromptError";
31398
+ message = "Prompt was aborted";
31399
+ constructor(options) {
31400
+ super();
31401
+ this.cause = options?.cause;
31402
+ }
31403
+ };
31404
+ CancelPromptError = class CancelPromptError extends Error {
31405
+ name = "CancelPromptError";
31406
+ message = "Prompt was canceled";
31407
+ };
31408
+ ExitPromptError = class ExitPromptError extends Error {
31409
+ name = "ExitPromptError";
31410
+ };
31411
+ HookError = class HookError extends Error {
31412
+ name = "HookError";
31413
+ };
31414
+ ValidationError = class ValidationError extends Error {
31415
+ name = "ValidationError";
31416
+ };
31417
+ });
31418
+
31419
+ // node_modules/@inquirer/core/dist/lib/hook-engine.js
31420
+ import { AsyncLocalStorage, AsyncResource } from "node:async_hooks";
31421
+ function createStore(rl) {
31422
+ const store = {
31423
+ rl,
31424
+ hooks: [],
31425
+ hooksCleanup: [],
31426
+ hooksEffect: [],
31427
+ index: 0,
31428
+ handleChange() {}
31429
+ };
31430
+ return store;
31431
+ }
31432
+ function withHooks(rl, cb) {
31433
+ const store = createStore(rl);
31434
+ return hookStorage.run(store, () => {
31435
+ function cycle(render) {
31436
+ store.handleChange = () => {
31437
+ store.index = 0;
31438
+ render();
31439
+ };
31440
+ store.handleChange();
31441
+ }
31442
+ return cb(cycle);
31443
+ });
31444
+ }
31445
+ function getStore() {
31446
+ const store = hookStorage.getStore();
31447
+ if (!store) {
31448
+ throw new HookError("[Inquirer] Hook functions can only be called from within a prompt");
31449
+ }
31450
+ return store;
31451
+ }
31452
+ function readline() {
31453
+ return getStore().rl;
31454
+ }
31455
+ function withUpdates(fn) {
31456
+ const wrapped = (...args) => {
31457
+ const store = getStore();
31458
+ let shouldUpdate = false;
31459
+ const oldHandleChange = store.handleChange;
31460
+ store.handleChange = () => {
31461
+ shouldUpdate = true;
31462
+ };
31463
+ const returnValue = fn(...args);
31464
+ if (shouldUpdate) {
31465
+ oldHandleChange();
31466
+ }
31467
+ store.handleChange = oldHandleChange;
31468
+ return returnValue;
31469
+ };
31470
+ return AsyncResource.bind(wrapped);
31471
+ }
31472
+ function withPointer(cb) {
31473
+ const store = getStore();
31474
+ const { index } = store;
31475
+ const pointer = {
31476
+ get() {
31477
+ return store.hooks[index];
31478
+ },
31479
+ set(value) {
31480
+ store.hooks[index] = value;
31481
+ },
31482
+ initialized: index in store.hooks
31483
+ };
31484
+ const returnValue = cb(pointer);
31485
+ store.index++;
31486
+ return returnValue;
31487
+ }
31488
+ function handleChange() {
31489
+ getStore().handleChange();
31490
+ }
31491
+ var hookStorage, effectScheduler;
31492
+ var init_hook_engine = __esm(() => {
31493
+ init_errors5();
31494
+ hookStorage = new AsyncLocalStorage;
31495
+ effectScheduler = {
31496
+ queue(cb) {
31497
+ const store = getStore();
31498
+ const { index } = store;
31499
+ store.hooksEffect.push(() => {
31500
+ store.hooksCleanup[index]?.();
31501
+ const cleanFn = cb(readline());
31502
+ if (cleanFn != null && typeof cleanFn !== "function") {
31503
+ throw new ValidationError("useEffect return value must be a cleanup function or nothing.");
31504
+ }
31505
+ store.hooksCleanup[index] = cleanFn;
31506
+ });
31507
+ },
31508
+ run() {
31509
+ const store = getStore();
31510
+ withUpdates(() => {
31511
+ store.hooksEffect.forEach((effect) => {
31512
+ effect();
31513
+ });
31514
+ store.hooksEffect.length = 0;
31515
+ })();
31516
+ },
31517
+ clearAll() {
31518
+ const store = getStore();
31519
+ store.hooksCleanup.forEach((cleanFn) => {
31520
+ cleanFn?.();
31521
+ });
31522
+ store.hooksEffect.length = 0;
31523
+ store.hooksCleanup.length = 0;
31524
+ }
31525
+ };
31526
+ });
31527
+
31528
+ // node_modules/@inquirer/core/dist/lib/use-state.js
31529
+ import { AsyncResource as AsyncResource2 } from "node:async_hooks";
31530
+ function useState(defaultValue) {
31531
+ return withPointer((pointer) => {
31532
+ const setState = AsyncResource2.bind(function setState(newValue) {
31533
+ if (pointer.get() !== newValue) {
31534
+ pointer.set(newValue);
31535
+ handleChange();
31536
+ }
31537
+ });
31538
+ if (pointer.initialized) {
31539
+ return [pointer.get(), setState];
31540
+ }
31541
+ const value = typeof defaultValue === "function" ? defaultValue() : defaultValue;
31542
+ pointer.set(value);
31543
+ return [value, setState];
31544
+ });
31545
+ }
31546
+ var init_use_state = __esm(() => {
31547
+ init_hook_engine();
31548
+ });
31549
+
31550
+ // node_modules/@inquirer/core/dist/lib/use-effect.js
31551
+ function useEffect(cb, depArray) {
31552
+ withPointer((pointer) => {
31553
+ const oldDeps = pointer.get();
31554
+ const hasChanged = !Array.isArray(oldDeps) || depArray.some((dep, i) => !Object.is(dep, oldDeps[i]));
31555
+ if (hasChanged) {
31556
+ effectScheduler.queue(cb);
31557
+ }
31558
+ pointer.set(depArray);
31559
+ });
31560
+ }
31561
+ var init_use_effect = __esm(() => {
31562
+ init_hook_engine();
31563
+ });
31564
+
31565
+ // node_modules/@inquirer/figures/dist/index.js
31566
+ import process3 from "node:process";
31567
+ function isUnicodeSupported() {
31568
+ if (process3.platform !== "win32") {
31569
+ return process3.env["TERM"] !== "linux";
31570
+ }
31571
+ return Boolean(process3.env["WT_SESSION"]) || Boolean(process3.env["TERMINUS_SUBLIME"]) || process3.env["ConEmuTask"] === "{cmd::Cmder}" || process3.env["TERM_PROGRAM"] === "Terminus-Sublime" || process3.env["TERM_PROGRAM"] === "vscode" || process3.env["TERM"] === "xterm-256color" || process3.env["TERM"] === "alacritty" || process3.env["TERMINAL_EMULATOR"] === "JetBrains-JediTerm";
31572
+ }
31573
+ var common, specialMainSymbols, specialFallbackSymbols, mainSymbols, fallbackSymbols, shouldUseMain, figures, dist_default, replacements;
31574
+ var init_dist = __esm(() => {
31575
+ common = {
31576
+ circleQuestionMark: "(?)",
31577
+ questionMarkPrefix: "(?)",
31578
+ square: "█",
31579
+ squareDarkShade: "▓",
31580
+ squareMediumShade: "▒",
31581
+ squareLightShade: "░",
31582
+ squareTop: "▀",
31583
+ squareBottom: "▄",
31584
+ squareLeft: "▌",
31585
+ squareRight: "▐",
31586
+ squareCenter: "■",
31587
+ bullet: "●",
31588
+ dot: "․",
31589
+ ellipsis: "…",
31590
+ pointerSmall: "›",
31591
+ triangleUp: "▲",
31592
+ triangleUpSmall: "▴",
31593
+ triangleDown: "▼",
31594
+ triangleDownSmall: "▾",
31595
+ triangleLeftSmall: "◂",
31596
+ triangleRightSmall: "▸",
31597
+ home: "⌂",
31598
+ heart: "♥",
31599
+ musicNote: "♪",
31600
+ musicNoteBeamed: "♫",
31601
+ arrowUp: "↑",
31602
+ arrowDown: "↓",
31603
+ arrowLeft: "←",
31604
+ arrowRight: "→",
31605
+ arrowLeftRight: "↔",
31606
+ arrowUpDown: "↕",
31607
+ almostEqual: "≈",
31608
+ notEqual: "≠",
31609
+ lessOrEqual: "≤",
31610
+ greaterOrEqual: "≥",
31611
+ identical: "≡",
31612
+ infinity: "∞",
31613
+ subscriptZero: "₀",
31614
+ subscriptOne: "₁",
31615
+ subscriptTwo: "₂",
31616
+ subscriptThree: "₃",
31617
+ subscriptFour: "₄",
31618
+ subscriptFive: "₅",
31619
+ subscriptSix: "₆",
31620
+ subscriptSeven: "₇",
31621
+ subscriptEight: "₈",
31622
+ subscriptNine: "₉",
31623
+ oneHalf: "½",
31624
+ oneThird: "⅓",
31625
+ oneQuarter: "¼",
31626
+ oneFifth: "⅕",
31627
+ oneSixth: "⅙",
31628
+ oneEighth: "⅛",
31629
+ twoThirds: "⅔",
31630
+ twoFifths: "⅖",
31631
+ threeQuarters: "¾",
31632
+ threeFifths: "⅗",
31633
+ threeEighths: "⅜",
31634
+ fourFifths: "⅘",
31635
+ fiveSixths: "⅚",
31636
+ fiveEighths: "⅝",
31637
+ sevenEighths: "⅞",
31638
+ line: "─",
31639
+ lineBold: "━",
31640
+ lineDouble: "═",
31641
+ lineDashed0: "┄",
31642
+ lineDashed1: "┅",
31643
+ lineDashed2: "┈",
31644
+ lineDashed3: "┉",
31645
+ lineDashed4: "╌",
31646
+ lineDashed5: "╍",
31647
+ lineDashed6: "╴",
31648
+ lineDashed7: "╶",
31649
+ lineDashed8: "╸",
31650
+ lineDashed9: "╺",
31651
+ lineDashed10: "╼",
31652
+ lineDashed11: "╾",
31653
+ lineDashed12: "−",
31654
+ lineDashed13: "–",
31655
+ lineDashed14: "‐",
31656
+ lineDashed15: "⁃",
31657
+ lineVertical: "│",
31658
+ lineVerticalBold: "┃",
31659
+ lineVerticalDouble: "║",
31660
+ lineVerticalDashed0: "┆",
31661
+ lineVerticalDashed1: "┇",
31662
+ lineVerticalDashed2: "┊",
31663
+ lineVerticalDashed3: "┋",
31664
+ lineVerticalDashed4: "╎",
31665
+ lineVerticalDashed5: "╏",
31666
+ lineVerticalDashed6: "╵",
31667
+ lineVerticalDashed7: "╷",
31668
+ lineVerticalDashed8: "╹",
31669
+ lineVerticalDashed9: "╻",
31670
+ lineVerticalDashed10: "╽",
31671
+ lineVerticalDashed11: "╿",
31672
+ lineDownLeft: "┐",
31673
+ lineDownLeftArc: "╮",
31674
+ lineDownBoldLeftBold: "┓",
31675
+ lineDownBoldLeft: "┒",
31676
+ lineDownLeftBold: "┑",
31677
+ lineDownDoubleLeftDouble: "╗",
31678
+ lineDownDoubleLeft: "╖",
31679
+ lineDownLeftDouble: "╕",
31680
+ lineDownRight: "┌",
31681
+ lineDownRightArc: "╭",
31682
+ lineDownBoldRightBold: "┏",
31683
+ lineDownBoldRight: "┎",
31684
+ lineDownRightBold: "┍",
31685
+ lineDownDoubleRightDouble: "╔",
31686
+ lineDownDoubleRight: "╓",
31687
+ lineDownRightDouble: "╒",
31688
+ lineUpLeft: "┘",
31689
+ lineUpLeftArc: "╯",
31690
+ lineUpBoldLeftBold: "┛",
31691
+ lineUpBoldLeft: "┚",
31692
+ lineUpLeftBold: "┙",
31693
+ lineUpDoubleLeftDouble: "╝",
31694
+ lineUpDoubleLeft: "╜",
31695
+ lineUpLeftDouble: "╛",
31696
+ lineUpRight: "└",
31697
+ lineUpRightArc: "╰",
31698
+ lineUpBoldRightBold: "┗",
31699
+ lineUpBoldRight: "┖",
31700
+ lineUpRightBold: "┕",
31701
+ lineUpDoubleRightDouble: "╚",
31702
+ lineUpDoubleRight: "╙",
31703
+ lineUpRightDouble: "╘",
31704
+ lineUpDownLeft: "┤",
31705
+ lineUpBoldDownBoldLeftBold: "┫",
31706
+ lineUpBoldDownBoldLeft: "┨",
31707
+ lineUpDownLeftBold: "┥",
31708
+ lineUpBoldDownLeftBold: "┩",
31709
+ lineUpDownBoldLeftBold: "┪",
31710
+ lineUpDownBoldLeft: "┧",
31711
+ lineUpBoldDownLeft: "┦",
31712
+ lineUpDoubleDownDoubleLeftDouble: "╣",
31713
+ lineUpDoubleDownDoubleLeft: "╢",
31714
+ lineUpDownLeftDouble: "╡",
31715
+ lineUpDownRight: "├",
31716
+ lineUpBoldDownBoldRightBold: "┣",
31717
+ lineUpBoldDownBoldRight: "┠",
31718
+ lineUpDownRightBold: "┝",
31719
+ lineUpBoldDownRightBold: "┡",
31720
+ lineUpDownBoldRightBold: "┢",
31721
+ lineUpDownBoldRight: "┟",
31722
+ lineUpBoldDownRight: "┞",
31723
+ lineUpDoubleDownDoubleRightDouble: "╠",
31724
+ lineUpDoubleDownDoubleRight: "╟",
31725
+ lineUpDownRightDouble: "╞",
31726
+ lineDownLeftRight: "┬",
31727
+ lineDownBoldLeftBoldRightBold: "┳",
31728
+ lineDownLeftBoldRightBold: "┯",
31729
+ lineDownBoldLeftRight: "┰",
31730
+ lineDownBoldLeftBoldRight: "┱",
31731
+ lineDownBoldLeftRightBold: "┲",
31732
+ lineDownLeftRightBold: "┮",
31733
+ lineDownLeftBoldRight: "┭",
31734
+ lineDownDoubleLeftDoubleRightDouble: "╦",
31735
+ lineDownDoubleLeftRight: "╥",
31736
+ lineDownLeftDoubleRightDouble: "╤",
31737
+ lineUpLeftRight: "┴",
31738
+ lineUpBoldLeftBoldRightBold: "┻",
31739
+ lineUpLeftBoldRightBold: "┷",
31740
+ lineUpBoldLeftRight: "┸",
31741
+ lineUpBoldLeftBoldRight: "┹",
31742
+ lineUpBoldLeftRightBold: "┺",
31743
+ lineUpLeftRightBold: "┶",
31744
+ lineUpLeftBoldRight: "┵",
31745
+ lineUpDoubleLeftDoubleRightDouble: "╩",
31746
+ lineUpDoubleLeftRight: "╨",
31747
+ lineUpLeftDoubleRightDouble: "╧",
31748
+ lineUpDownLeftRight: "┼",
31749
+ lineUpBoldDownBoldLeftBoldRightBold: "╋",
31750
+ lineUpDownBoldLeftBoldRightBold: "╈",
31751
+ lineUpBoldDownLeftBoldRightBold: "╇",
31752
+ lineUpBoldDownBoldLeftRightBold: "╊",
31753
+ lineUpBoldDownBoldLeftBoldRight: "╉",
31754
+ lineUpBoldDownLeftRight: "╀",
31755
+ lineUpDownBoldLeftRight: "╁",
31756
+ lineUpDownLeftBoldRight: "┽",
31757
+ lineUpDownLeftRightBold: "┾",
31758
+ lineUpBoldDownBoldLeftRight: "╂",
31759
+ lineUpDownLeftBoldRightBold: "┿",
31760
+ lineUpBoldDownLeftBoldRight: "╃",
31761
+ lineUpBoldDownLeftRightBold: "╄",
31762
+ lineUpDownBoldLeftBoldRight: "╅",
31763
+ lineUpDownBoldLeftRightBold: "╆",
31764
+ lineUpDoubleDownDoubleLeftDoubleRightDouble: "╬",
31765
+ lineUpDoubleDownDoubleLeftRight: "╫",
31766
+ lineUpDownLeftDoubleRightDouble: "╪",
31767
+ lineCross: "╳",
31768
+ lineBackslash: "╲",
31769
+ lineSlash: "╱"
31770
+ };
31771
+ specialMainSymbols = {
31772
+ tick: "✔",
31773
+ info: "ℹ",
31774
+ warning: "⚠",
31775
+ cross: "✘",
31776
+ squareSmall: "◻",
31777
+ squareSmallFilled: "◼",
31778
+ circle: "◯",
31779
+ circleFilled: "◉",
31780
+ circleDotted: "◌",
31781
+ circleDouble: "◎",
31782
+ circleCircle: "ⓞ",
31783
+ circleCross: "ⓧ",
31784
+ circlePipe: "Ⓘ",
31785
+ radioOn: "◉",
31786
+ radioOff: "◯",
31787
+ checkboxOn: "☒",
31788
+ checkboxOff: "☐",
31789
+ checkboxCircleOn: "ⓧ",
31790
+ checkboxCircleOff: "Ⓘ",
31791
+ pointer: "❯",
31792
+ triangleUpOutline: "△",
31793
+ triangleLeft: "◀",
31794
+ triangleRight: "▶",
31795
+ lozenge: "◆",
31796
+ lozengeOutline: "◇",
31797
+ hamburger: "☰",
31798
+ smiley: "㋡",
31799
+ mustache: "෴",
31800
+ star: "★",
31801
+ play: "▶",
31802
+ nodejs: "⬢",
31803
+ oneSeventh: "⅐",
31804
+ oneNinth: "⅑",
31805
+ oneTenth: "⅒"
31806
+ };
31807
+ specialFallbackSymbols = {
31808
+ tick: "√",
31809
+ info: "i",
31810
+ warning: "‼",
31811
+ cross: "×",
31812
+ squareSmall: "□",
31813
+ squareSmallFilled: "■",
31814
+ circle: "( )",
31815
+ circleFilled: "(*)",
31816
+ circleDotted: "( )",
31817
+ circleDouble: "( )",
31818
+ circleCircle: "(○)",
31819
+ circleCross: "(×)",
31820
+ circlePipe: "(│)",
31821
+ radioOn: "(*)",
31822
+ radioOff: "( )",
31823
+ checkboxOn: "[×]",
31824
+ checkboxOff: "[ ]",
31825
+ checkboxCircleOn: "(×)",
31826
+ checkboxCircleOff: "( )",
31827
+ pointer: ">",
31828
+ triangleUpOutline: "∆",
31829
+ triangleLeft: "◄",
31830
+ triangleRight: "►",
31831
+ lozenge: "♦",
31832
+ lozengeOutline: "◊",
31833
+ hamburger: "≡",
31834
+ smiley: "☺",
31835
+ mustache: "┌─┐",
31836
+ star: "✶",
31837
+ play: "►",
31838
+ nodejs: "♦",
31839
+ oneSeventh: "1/7",
31840
+ oneNinth: "1/9",
31841
+ oneTenth: "1/10"
31842
+ };
31843
+ mainSymbols = {
31844
+ ...common,
31845
+ ...specialMainSymbols
31846
+ };
31847
+ fallbackSymbols = {
31848
+ ...common,
31849
+ ...specialFallbackSymbols
31850
+ };
31851
+ shouldUseMain = isUnicodeSupported();
31852
+ figures = shouldUseMain ? mainSymbols : fallbackSymbols;
31853
+ dist_default = figures;
31854
+ replacements = Object.entries(specialMainSymbols);
31855
+ });
31856
+
31857
+ // node_modules/@inquirer/core/dist/lib/theme.js
31858
+ import { styleText } from "node:util";
31859
+ var defaultTheme;
31860
+ var init_theme = __esm(() => {
31861
+ init_dist();
31862
+ defaultTheme = {
31863
+ prefix: {
31864
+ idle: styleText("blue", "?"),
31865
+ done: styleText("green", dist_default.tick)
31866
+ },
31867
+ spinner: {
31868
+ interval: 80,
31869
+ frames: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"].map((frame) => styleText("yellow", frame))
31870
+ },
31871
+ style: {
31872
+ answer: (text) => styleText("cyan", text),
31873
+ message: (text) => styleText("bold", text),
31874
+ error: (text) => styleText("red", `> ${text}`),
31875
+ defaultAnswer: (text) => styleText("dim", `(${text})`),
31876
+ help: (text) => styleText("dim", text),
31877
+ highlight: (text) => styleText("cyan", text),
31878
+ key: (text) => styleText("cyan", styleText("bold", `<${text}>`))
31879
+ }
31880
+ };
31881
+ });
31882
+
31883
+ // node_modules/@inquirer/core/dist/lib/make-theme.js
31884
+ function isPlainObject3(value) {
31885
+ if (typeof value !== "object" || value === null)
31886
+ return false;
31887
+ let proto = value;
31888
+ while (Object.getPrototypeOf(proto) !== null) {
31889
+ proto = Object.getPrototypeOf(proto);
31890
+ }
31891
+ return Object.getPrototypeOf(value) === proto;
31892
+ }
31893
+ function deepMerge(...objects) {
31894
+ const output = {};
31895
+ for (const obj of objects) {
31896
+ for (const [key, value] of Object.entries(obj)) {
31897
+ const prevValue = output[key];
31898
+ output[key] = isPlainObject3(prevValue) && isPlainObject3(value) ? deepMerge(prevValue, value) : value;
31899
+ }
31900
+ }
31901
+ return output;
31902
+ }
31903
+ function makeTheme(...themes) {
31904
+ const themesToMerge = [
31905
+ defaultTheme,
31906
+ ...themes.filter((theme) => theme != null)
31907
+ ];
31908
+ return deepMerge(...themesToMerge);
31909
+ }
31910
+ var init_make_theme = __esm(() => {
31911
+ init_theme();
31912
+ });
31913
+
31914
+ // node_modules/@inquirer/core/dist/lib/use-prefix.js
31915
+ function usePrefix({ status = "idle", theme }) {
31916
+ const [showLoader, setShowLoader] = useState(false);
31917
+ const [tick, setTick] = useState(0);
31918
+ const { prefix, spinner } = makeTheme(theme);
31919
+ useEffect(() => {
31920
+ if (status === "loading") {
31921
+ let tickInterval;
31922
+ let inc = -1;
31923
+ const delayTimeout = setTimeout(() => {
31924
+ setShowLoader(true);
31925
+ tickInterval = setInterval(() => {
31926
+ inc = inc + 1;
31927
+ setTick(inc % spinner.frames.length);
31928
+ }, spinner.interval);
31929
+ }, 300);
31930
+ return () => {
31931
+ clearTimeout(delayTimeout);
31932
+ clearInterval(tickInterval);
31933
+ };
31934
+ } else {
31935
+ setShowLoader(false);
31936
+ }
31937
+ }, [status]);
31938
+ if (showLoader) {
31939
+ return spinner.frames[tick];
31940
+ }
31941
+ const iconName = status === "loading" ? "idle" : status;
31942
+ return typeof prefix === "string" ? prefix : prefix[iconName] ?? prefix["idle"];
31943
+ }
31944
+ var init_use_prefix = __esm(() => {
31945
+ init_use_state();
31946
+ init_use_effect();
31947
+ init_make_theme();
31948
+ });
31949
+
31950
+ // node_modules/@inquirer/core/dist/lib/use-memo.js
31951
+ function useMemo(fn, dependencies) {
31952
+ return withPointer((pointer) => {
31953
+ const prev = pointer.get();
31954
+ if (!prev || prev.dependencies.length !== dependencies.length || prev.dependencies.some((dep, i) => dep !== dependencies[i])) {
31955
+ const value = fn();
31956
+ pointer.set({ value, dependencies });
31957
+ return value;
31958
+ }
31959
+ return prev.value;
31960
+ });
31961
+ }
31962
+ var init_use_memo = __esm(() => {
31963
+ init_hook_engine();
31964
+ });
31965
+
31966
+ // node_modules/@inquirer/core/dist/lib/use-ref.js
31967
+ function useRef(val) {
31968
+ return useState({ current: val })[0];
31969
+ }
31970
+ var init_use_ref = __esm(() => {
31971
+ init_use_state();
31972
+ });
31973
+
31974
+ // node_modules/@inquirer/core/dist/lib/use-keypress.js
31975
+ function useKeypress(userHandler) {
31976
+ const signal = useRef(userHandler);
31977
+ signal.current = userHandler;
31978
+ useEffect((rl) => {
31979
+ let ignore = false;
31980
+ const handler = withUpdates((_input, event) => {
31981
+ if (ignore)
31982
+ return;
31983
+ signal.current(event, rl);
31984
+ });
31985
+ rl.input.on("keypress", handler);
31986
+ return () => {
31987
+ ignore = true;
31988
+ rl.input.removeListener("keypress", handler);
31989
+ };
31990
+ }, []);
31991
+ }
31992
+ var init_use_keypress = __esm(() => {
31993
+ init_use_ref();
31994
+ init_use_effect();
31995
+ init_hook_engine();
31996
+ });
31997
+
31998
+ // node_modules/cli-width/index.js
31999
+ var require_cli_width = __commonJS((exports, module) => {
32000
+ module.exports = cliWidth;
32001
+ function normalizeOpts(options) {
32002
+ const defaultOpts = {
32003
+ defaultWidth: 0,
32004
+ output: process.stdout,
32005
+ tty: __require("tty")
32006
+ };
32007
+ if (!options) {
32008
+ return defaultOpts;
32009
+ }
32010
+ Object.keys(defaultOpts).forEach(function(key) {
32011
+ if (!options[key]) {
32012
+ options[key] = defaultOpts[key];
32013
+ }
32014
+ });
32015
+ return options;
32016
+ }
32017
+ function cliWidth(options) {
32018
+ const opts = normalizeOpts(options);
32019
+ if (opts.output.getWindowSize) {
32020
+ return opts.output.getWindowSize()[0] || opts.defaultWidth;
32021
+ }
32022
+ if (opts.tty.getWindowSize) {
32023
+ return opts.tty.getWindowSize()[1] || opts.defaultWidth;
32024
+ }
32025
+ if (opts.output.columns) {
32026
+ return opts.output.columns;
32027
+ }
32028
+ if (process.env.CLI_WIDTH) {
32029
+ const width = parseInt(process.env.CLI_WIDTH, 10);
32030
+ if (!isNaN(width) && width !== 0) {
32031
+ return width;
32032
+ }
32033
+ }
32034
+ return opts.defaultWidth;
32035
+ }
32036
+ });
32037
+
32038
+ // node_modules/ansi-regex/index.js
32039
+ function ansiRegex({ onlyFirst = false } = {}) {
32040
+ const ST = "(?:\\u0007|\\u001B\\u005C|\\u009C)";
32041
+ const osc = `(?:\\u001B\\][\\s\\S]*?${ST})`;
32042
+ const csi = "[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";
32043
+ const pattern = `${osc}|${csi}`;
32044
+ return new RegExp(pattern, onlyFirst ? undefined : "g");
32045
+ }
32046
+
32047
+ // node_modules/strip-ansi/index.js
32048
+ function stripAnsi(string5) {
32049
+ if (typeof string5 !== "string") {
32050
+ throw new TypeError(`Expected a \`string\`, got \`${typeof string5}\``);
32051
+ }
32052
+ return string5.replace(regex, "");
32053
+ }
32054
+ var regex;
32055
+ var init_strip_ansi = __esm(() => {
32056
+ regex = ansiRegex();
32057
+ });
32058
+
32059
+ // node_modules/get-east-asian-width/lookup.js
32060
+ function isAmbiguous(x) {
32061
+ return x === 161 || x === 164 || x === 167 || x === 168 || x === 170 || x === 173 || x === 174 || x >= 176 && x <= 180 || x >= 182 && x <= 186 || x >= 188 && x <= 191 || x === 198 || x === 208 || x === 215 || x === 216 || x >= 222 && x <= 225 || x === 230 || x >= 232 && x <= 234 || x === 236 || x === 237 || x === 240 || x === 242 || x === 243 || x >= 247 && x <= 250 || x === 252 || x === 254 || x === 257 || x === 273 || x === 275 || x === 283 || x === 294 || x === 295 || x === 299 || x >= 305 && x <= 307 || x === 312 || x >= 319 && x <= 322 || x === 324 || x >= 328 && x <= 331 || x === 333 || x === 338 || x === 339 || x === 358 || x === 359 || x === 363 || x === 462 || x === 464 || x === 466 || x === 468 || x === 470 || x === 472 || x === 474 || x === 476 || x === 593 || x === 609 || x === 708 || x === 711 || x >= 713 && x <= 715 || x === 717 || x === 720 || x >= 728 && x <= 731 || x === 733 || x === 735 || x >= 768 && x <= 879 || x >= 913 && x <= 929 || x >= 931 && x <= 937 || x >= 945 && x <= 961 || x >= 963 && x <= 969 || x === 1025 || x >= 1040 && x <= 1103 || x === 1105 || x === 8208 || x >= 8211 && x <= 8214 || x === 8216 || x === 8217 || x === 8220 || x === 8221 || x >= 8224 && x <= 8226 || x >= 8228 && x <= 8231 || x === 8240 || x === 8242 || x === 8243 || x === 8245 || x === 8251 || x === 8254 || x === 8308 || x === 8319 || x >= 8321 && x <= 8324 || x === 8364 || x === 8451 || x === 8453 || x === 8457 || x === 8467 || x === 8470 || x === 8481 || x === 8482 || x === 8486 || x === 8491 || x === 8531 || x === 8532 || x >= 8539 && x <= 8542 || x >= 8544 && x <= 8555 || x >= 8560 && x <= 8569 || x === 8585 || x >= 8592 && x <= 8601 || x === 8632 || x === 8633 || x === 8658 || x === 8660 || x === 8679 || x === 8704 || x === 8706 || x === 8707 || x === 8711 || x === 8712 || x === 8715 || x === 8719 || x === 8721 || x === 8725 || x === 8730 || x >= 8733 && x <= 8736 || x === 8739 || x === 8741 || x >= 8743 && x <= 8748 || x === 8750 || x >= 8756 && x <= 8759 || x === 8764 || x === 8765 || x === 8776 || x === 8780 || x === 8786 || x === 8800 || x === 8801 || x >= 8804 && x <= 8807 || x === 8810 || x === 8811 || x === 8814 || x === 8815 || x === 8834 || x === 8835 || x === 8838 || x === 8839 || x === 8853 || x === 8857 || x === 8869 || x === 8895 || x === 8978 || x >= 9312 && x <= 9449 || x >= 9451 && x <= 9547 || x >= 9552 && x <= 9587 || x >= 9600 && x <= 9615 || x >= 9618 && x <= 9621 || x === 9632 || x === 9633 || x >= 9635 && x <= 9641 || x === 9650 || x === 9651 || x === 9654 || x === 9655 || x === 9660 || x === 9661 || x === 9664 || x === 9665 || x >= 9670 && x <= 9672 || x === 9675 || x >= 9678 && x <= 9681 || x >= 9698 && x <= 9701 || x === 9711 || x === 9733 || x === 9734 || x === 9737 || x === 9742 || x === 9743 || x === 9756 || x === 9758 || x === 9792 || x === 9794 || x === 9824 || x === 9825 || x >= 9827 && x <= 9829 || x >= 9831 && x <= 9834 || x === 9836 || x === 9837 || x === 9839 || x === 9886 || x === 9887 || x === 9919 || x >= 9926 && x <= 9933 || x >= 9935 && x <= 9939 || x >= 9941 && x <= 9953 || x === 9955 || x === 9960 || x === 9961 || x >= 9963 && x <= 9969 || x === 9972 || x >= 9974 && x <= 9977 || x === 9979 || x === 9980 || x === 9982 || x === 9983 || x === 10045 || x >= 10102 && x <= 10111 || x >= 11094 && x <= 11097 || x >= 12872 && x <= 12879 || x >= 57344 && x <= 63743 || x >= 65024 && x <= 65039 || x === 65533 || x >= 127232 && x <= 127242 || x >= 127248 && x <= 127277 || x >= 127280 && x <= 127337 || x >= 127344 && x <= 127373 || x === 127375 || x === 127376 || x >= 127387 && x <= 127404 || x >= 917760 && x <= 917999 || x >= 983040 && x <= 1048573 || x >= 1048576 && x <= 1114109;
32062
+ }
32063
+ function isFullWidth(x) {
32064
+ return x === 12288 || x >= 65281 && x <= 65376 || x >= 65504 && x <= 65510;
32065
+ }
32066
+ function isWide(x) {
32067
+ return x >= 4352 && x <= 4447 || x === 8986 || x === 8987 || x === 9001 || x === 9002 || x >= 9193 && x <= 9196 || x === 9200 || x === 9203 || x === 9725 || x === 9726 || x === 9748 || x === 9749 || x >= 9776 && x <= 9783 || x >= 9800 && x <= 9811 || x === 9855 || x >= 9866 && x <= 9871 || x === 9875 || x === 9889 || x === 9898 || x === 9899 || x === 9917 || x === 9918 || x === 9924 || x === 9925 || x === 9934 || x === 9940 || x === 9962 || x === 9970 || x === 9971 || x === 9973 || x === 9978 || x === 9981 || x === 9989 || x === 9994 || x === 9995 || x === 10024 || x === 10060 || x === 10062 || x >= 10067 && x <= 10069 || x === 10071 || x >= 10133 && x <= 10135 || x === 10160 || x === 10175 || x === 11035 || x === 11036 || x === 11088 || x === 11093 || x >= 11904 && x <= 11929 || x >= 11931 && x <= 12019 || x >= 12032 && x <= 12245 || x >= 12272 && x <= 12287 || x >= 12289 && x <= 12350 || x >= 12353 && x <= 12438 || x >= 12441 && x <= 12543 || x >= 12549 && x <= 12591 || x >= 12593 && x <= 12686 || x >= 12688 && x <= 12773 || x >= 12783 && x <= 12830 || x >= 12832 && x <= 12871 || x >= 12880 && x <= 42124 || x >= 42128 && x <= 42182 || x >= 43360 && x <= 43388 || x >= 44032 && x <= 55203 || x >= 63744 && x <= 64255 || x >= 65040 && x <= 65049 || x >= 65072 && x <= 65106 || x >= 65108 && x <= 65126 || x >= 65128 && x <= 65131 || x >= 94176 && x <= 94180 || x >= 94192 && x <= 94198 || x >= 94208 && x <= 101589 || x >= 101631 && x <= 101662 || x >= 101760 && x <= 101874 || x >= 110576 && x <= 110579 || x >= 110581 && x <= 110587 || x === 110589 || x === 110590 || x >= 110592 && x <= 110882 || x === 110898 || x >= 110928 && x <= 110930 || x === 110933 || x >= 110948 && x <= 110951 || x >= 110960 && x <= 111355 || x >= 119552 && x <= 119638 || x >= 119648 && x <= 119670 || x === 126980 || x === 127183 || x === 127374 || x >= 127377 && x <= 127386 || x >= 127488 && x <= 127490 || x >= 127504 && x <= 127547 || x >= 127552 && x <= 127560 || x === 127568 || x === 127569 || x >= 127584 && x <= 127589 || x >= 127744 && x <= 127776 || x >= 127789 && x <= 127797 || x >= 127799 && x <= 127868 || x >= 127870 && x <= 127891 || x >= 127904 && x <= 127946 || x >= 127951 && x <= 127955 || x >= 127968 && x <= 127984 || x === 127988 || x >= 127992 && x <= 128062 || x === 128064 || x >= 128066 && x <= 128252 || x >= 128255 && x <= 128317 || x >= 128331 && x <= 128334 || x >= 128336 && x <= 128359 || x === 128378 || x === 128405 || x === 128406 || x === 128420 || x >= 128507 && x <= 128591 || x >= 128640 && x <= 128709 || x === 128716 || x >= 128720 && x <= 128722 || x >= 128725 && x <= 128728 || x >= 128732 && x <= 128735 || x === 128747 || x === 128748 || x >= 128756 && x <= 128764 || x >= 128992 && x <= 129003 || x === 129008 || x >= 129292 && x <= 129338 || x >= 129340 && x <= 129349 || x >= 129351 && x <= 129535 || x >= 129648 && x <= 129660 || x >= 129664 && x <= 129674 || x >= 129678 && x <= 129734 || x === 129736 || x >= 129741 && x <= 129756 || x >= 129759 && x <= 129770 || x >= 129775 && x <= 129784 || x >= 131072 && x <= 196605 || x >= 196608 && x <= 262141;
32068
+ }
32069
+ var init_lookup = () => {};
32070
+
32071
+ // node_modules/get-east-asian-width/index.js
32072
+ function validate(codePoint) {
32073
+ if (!Number.isSafeInteger(codePoint)) {
32074
+ throw new TypeError(`Expected a code point, got \`${typeof codePoint}\`.`);
32075
+ }
32076
+ }
32077
+ function eastAsianWidth(codePoint, { ambiguousAsWide = false } = {}) {
32078
+ validate(codePoint);
32079
+ if (isFullWidth(codePoint) || isWide(codePoint) || ambiguousAsWide && isAmbiguous(codePoint)) {
32080
+ return 2;
32081
+ }
32082
+ return 1;
32083
+ }
32084
+ var init_get_east_asian_width = __esm(() => {
32085
+ init_lookup();
32086
+ });
32087
+
32088
+ // node_modules/emoji-regex/index.js
32089
+ var require_emoji_regex = __commonJS((exports, module) => {
32090
+ module.exports = () => {
32091
+ return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
32092
+ };
32093
+ });
32094
+
32095
+ // node_modules/string-width/index.js
32096
+ function stringWidth(string5, options = {}) {
32097
+ if (typeof string5 !== "string" || string5.length === 0) {
32098
+ return 0;
32099
+ }
32100
+ const {
32101
+ ambiguousIsNarrow = true,
32102
+ countAnsiEscapeCodes = false
32103
+ } = options;
32104
+ if (!countAnsiEscapeCodes) {
32105
+ string5 = stripAnsi(string5);
32106
+ }
32107
+ if (string5.length === 0) {
32108
+ return 0;
32109
+ }
32110
+ let width = 0;
32111
+ const eastAsianWidthOptions = { ambiguousAsWide: !ambiguousIsNarrow };
32112
+ for (const { segment: character } of segmenter.segment(string5)) {
32113
+ const codePoint = character.codePointAt(0);
32114
+ if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) {
32115
+ continue;
32116
+ }
32117
+ if (codePoint >= 8203 && codePoint <= 8207 || codePoint === 65279) {
32118
+ continue;
32119
+ }
32120
+ if (codePoint >= 768 && codePoint <= 879 || codePoint >= 6832 && codePoint <= 6911 || codePoint >= 7616 && codePoint <= 7679 || codePoint >= 8400 && codePoint <= 8447 || codePoint >= 65056 && codePoint <= 65071) {
32121
+ continue;
32122
+ }
32123
+ if (codePoint >= 55296 && codePoint <= 57343) {
32124
+ continue;
32125
+ }
32126
+ if (codePoint >= 65024 && codePoint <= 65039) {
32127
+ continue;
32128
+ }
32129
+ if (defaultIgnorableCodePointRegex.test(character)) {
32130
+ continue;
32131
+ }
32132
+ if (import_emoji_regex.default().test(character)) {
32133
+ width += 2;
32134
+ continue;
32135
+ }
32136
+ width += eastAsianWidth(codePoint, eastAsianWidthOptions);
32137
+ }
32138
+ return width;
32139
+ }
32140
+ var import_emoji_regex, segmenter, defaultIgnorableCodePointRegex;
32141
+ var init_string_width = __esm(() => {
32142
+ init_strip_ansi();
32143
+ init_get_east_asian_width();
32144
+ import_emoji_regex = __toESM(require_emoji_regex(), 1);
32145
+ segmenter = new Intl.Segmenter;
32146
+ defaultIgnorableCodePointRegex = /^\p{Default_Ignorable_Code_Point}$/u;
32147
+ });
32148
+
32149
+ // node_modules/ansi-styles/index.js
32150
+ function assembleStyles() {
32151
+ const codes = new Map;
32152
+ for (const [groupName, group] of Object.entries(styles)) {
32153
+ for (const [styleName, style] of Object.entries(group)) {
32154
+ styles[styleName] = {
32155
+ open: `\x1B[${style[0]}m`,
32156
+ close: `\x1B[${style[1]}m`
32157
+ };
32158
+ group[styleName] = styles[styleName];
32159
+ codes.set(style[0], style[1]);
32160
+ }
32161
+ Object.defineProperty(styles, groupName, {
32162
+ value: group,
32163
+ enumerable: false
32164
+ });
32165
+ }
32166
+ Object.defineProperty(styles, "codes", {
32167
+ value: codes,
32168
+ enumerable: false
32169
+ });
32170
+ styles.color.close = "\x1B[39m";
32171
+ styles.bgColor.close = "\x1B[49m";
32172
+ styles.color.ansi = wrapAnsi16();
32173
+ styles.color.ansi256 = wrapAnsi256();
32174
+ styles.color.ansi16m = wrapAnsi16m();
32175
+ styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
32176
+ styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
32177
+ styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
32178
+ Object.defineProperties(styles, {
32179
+ rgbToAnsi256: {
32180
+ value(red, green, blue) {
32181
+ if (red === green && green === blue) {
32182
+ if (red < 8) {
32183
+ return 16;
32184
+ }
32185
+ if (red > 248) {
32186
+ return 231;
32187
+ }
32188
+ return Math.round((red - 8) / 247 * 24) + 232;
32189
+ }
32190
+ return 16 + 36 * Math.round(red / 255 * 5) + 6 * Math.round(green / 255 * 5) + Math.round(blue / 255 * 5);
32191
+ },
32192
+ enumerable: false
32193
+ },
32194
+ hexToRgb: {
32195
+ value(hex3) {
32196
+ const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex3.toString(16));
32197
+ if (!matches) {
32198
+ return [0, 0, 0];
32199
+ }
32200
+ let [colorString] = matches;
32201
+ if (colorString.length === 3) {
32202
+ colorString = [...colorString].map((character) => character + character).join("");
32203
+ }
32204
+ const integer2 = Number.parseInt(colorString, 16);
32205
+ return [
32206
+ integer2 >> 16 & 255,
32207
+ integer2 >> 8 & 255,
32208
+ integer2 & 255
32209
+ ];
32210
+ },
32211
+ enumerable: false
32212
+ },
32213
+ hexToAnsi256: {
32214
+ value: (hex3) => styles.rgbToAnsi256(...styles.hexToRgb(hex3)),
32215
+ enumerable: false
32216
+ },
32217
+ ansi256ToAnsi: {
32218
+ value(code) {
32219
+ if (code < 8) {
32220
+ return 30 + code;
32221
+ }
32222
+ if (code < 16) {
32223
+ return 90 + (code - 8);
32224
+ }
32225
+ let red;
32226
+ let green;
32227
+ let blue;
32228
+ if (code >= 232) {
32229
+ red = ((code - 232) * 10 + 8) / 255;
32230
+ green = red;
32231
+ blue = red;
32232
+ } else {
32233
+ code -= 16;
32234
+ const remainder = code % 36;
32235
+ red = Math.floor(code / 36) / 5;
32236
+ green = Math.floor(remainder / 6) / 5;
32237
+ blue = remainder % 6 / 5;
32238
+ }
32239
+ const value = Math.max(red, green, blue) * 2;
32240
+ if (value === 0) {
32241
+ return 30;
32242
+ }
32243
+ let result = 30 + (Math.round(blue) << 2 | Math.round(green) << 1 | Math.round(red));
32244
+ if (value === 2) {
32245
+ result += 60;
32246
+ }
32247
+ return result;
32248
+ },
32249
+ enumerable: false
32250
+ },
32251
+ rgbToAnsi: {
32252
+ value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
32253
+ enumerable: false
32254
+ },
32255
+ hexToAnsi: {
32256
+ value: (hex3) => styles.ansi256ToAnsi(styles.hexToAnsi256(hex3)),
32257
+ enumerable: false
32258
+ }
32259
+ });
32260
+ return styles;
32261
+ }
32262
+ var ANSI_BACKGROUND_OFFSET = 10, wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`, wrapAnsi256 = (offset = 0) => (code) => `\x1B[${38 + offset};5;${code}m`, wrapAnsi16m = (offset = 0) => (red, green, blue) => `\x1B[${38 + offset};2;${red};${green};${blue}m`, styles, modifierNames, foregroundColorNames, backgroundColorNames, colorNames, ansiStyles, ansi_styles_default;
32263
+ var init_ansi_styles = __esm(() => {
32264
+ styles = {
32265
+ modifier: {
32266
+ reset: [0, 0],
32267
+ bold: [1, 22],
32268
+ dim: [2, 22],
32269
+ italic: [3, 23],
32270
+ underline: [4, 24],
32271
+ overline: [53, 55],
32272
+ inverse: [7, 27],
32273
+ hidden: [8, 28],
32274
+ strikethrough: [9, 29]
32275
+ },
32276
+ color: {
32277
+ black: [30, 39],
32278
+ red: [31, 39],
32279
+ green: [32, 39],
32280
+ yellow: [33, 39],
32281
+ blue: [34, 39],
32282
+ magenta: [35, 39],
32283
+ cyan: [36, 39],
32284
+ white: [37, 39],
32285
+ blackBright: [90, 39],
32286
+ gray: [90, 39],
32287
+ grey: [90, 39],
32288
+ redBright: [91, 39],
32289
+ greenBright: [92, 39],
32290
+ yellowBright: [93, 39],
32291
+ blueBright: [94, 39],
32292
+ magentaBright: [95, 39],
32293
+ cyanBright: [96, 39],
32294
+ whiteBright: [97, 39]
32295
+ },
32296
+ bgColor: {
32297
+ bgBlack: [40, 49],
32298
+ bgRed: [41, 49],
32299
+ bgGreen: [42, 49],
32300
+ bgYellow: [43, 49],
32301
+ bgBlue: [44, 49],
32302
+ bgMagenta: [45, 49],
32303
+ bgCyan: [46, 49],
32304
+ bgWhite: [47, 49],
32305
+ bgBlackBright: [100, 49],
32306
+ bgGray: [100, 49],
32307
+ bgGrey: [100, 49],
32308
+ bgRedBright: [101, 49],
32309
+ bgGreenBright: [102, 49],
32310
+ bgYellowBright: [103, 49],
32311
+ bgBlueBright: [104, 49],
32312
+ bgMagentaBright: [105, 49],
32313
+ bgCyanBright: [106, 49],
32314
+ bgWhiteBright: [107, 49]
32315
+ }
32316
+ };
32317
+ modifierNames = Object.keys(styles.modifier);
32318
+ foregroundColorNames = Object.keys(styles.color);
32319
+ backgroundColorNames = Object.keys(styles.bgColor);
32320
+ colorNames = [...foregroundColorNames, ...backgroundColorNames];
32321
+ ansiStyles = assembleStyles();
32322
+ ansi_styles_default = ansiStyles;
32323
+ });
32324
+
32325
+ // node_modules/wrap-ansi/index.js
32326
+ function wrapAnsi(string5, columns, options) {
32327
+ return String(string5).normalize().replaceAll(`\r
32328
+ `, `
32329
+ `).split(`
32330
+ `).map((line) => exec(line, columns, options)).join(`
32331
+ `);
32332
+ }
32333
+ var ESCAPES, END_CODE = 39, ANSI_ESCAPE_BELL = "\x07", ANSI_CSI = "[", ANSI_OSC = "]", ANSI_SGR_TERMINATOR = "m", ANSI_ESCAPE_LINK, wrapAnsiCode = (code) => `${ESCAPES.values().next().value}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`, wrapAnsiHyperlink = (url2) => `${ESCAPES.values().next().value}${ANSI_ESCAPE_LINK}${url2}${ANSI_ESCAPE_BELL}`, wordLengths = (string5) => string5.split(" ").map((character) => stringWidth(character)), wrapWord = (rows, word, columns) => {
32334
+ const characters = [...word];
32335
+ let isInsideEscape = false;
32336
+ let isInsideLinkEscape = false;
32337
+ let visible = stringWidth(stripAnsi(rows.at(-1)));
32338
+ for (const [index, character] of characters.entries()) {
32339
+ const characterLength = stringWidth(character);
32340
+ if (visible + characterLength <= columns) {
32341
+ rows[rows.length - 1] += character;
32342
+ } else {
32343
+ rows.push(character);
32344
+ visible = 0;
32345
+ }
32346
+ if (ESCAPES.has(character)) {
32347
+ isInsideEscape = true;
32348
+ const ansiEscapeLinkCandidate = characters.slice(index + 1, index + 1 + ANSI_ESCAPE_LINK.length).join("");
32349
+ isInsideLinkEscape = ansiEscapeLinkCandidate === ANSI_ESCAPE_LINK;
32350
+ }
32351
+ if (isInsideEscape) {
32352
+ if (isInsideLinkEscape) {
32353
+ if (character === ANSI_ESCAPE_BELL) {
32354
+ isInsideEscape = false;
32355
+ isInsideLinkEscape = false;
32356
+ }
32357
+ } else if (character === ANSI_SGR_TERMINATOR) {
32358
+ isInsideEscape = false;
32359
+ }
32360
+ continue;
32361
+ }
32362
+ visible += characterLength;
32363
+ if (visible === columns && index < characters.length - 1) {
32364
+ rows.push("");
32365
+ visible = 0;
32366
+ }
32367
+ }
32368
+ if (!visible && rows.at(-1).length > 0 && rows.length > 1) {
32369
+ rows[rows.length - 2] += rows.pop();
32370
+ }
32371
+ }, stringVisibleTrimSpacesRight = (string5) => {
32372
+ const words = string5.split(" ");
32373
+ let last = words.length;
32374
+ while (last > 0) {
32375
+ if (stringWidth(words[last - 1]) > 0) {
32376
+ break;
32377
+ }
32378
+ last--;
32379
+ }
32380
+ if (last === words.length) {
32381
+ return string5;
32382
+ }
32383
+ return words.slice(0, last).join(" ") + words.slice(last).join("");
32384
+ }, exec = (string5, columns, options = {}) => {
32385
+ if (options.trim !== false && string5.trim() === "") {
32386
+ return "";
32387
+ }
32388
+ let returnValue = "";
32389
+ let escapeCode;
32390
+ let escapeUrl;
32391
+ const lengths = wordLengths(string5);
32392
+ let rows = [""];
32393
+ for (const [index, word] of string5.split(" ").entries()) {
32394
+ if (options.trim !== false) {
32395
+ rows[rows.length - 1] = rows.at(-1).trimStart();
32396
+ }
32397
+ let rowLength = stringWidth(rows.at(-1));
32398
+ if (index !== 0) {
32399
+ if (rowLength >= columns && (options.wordWrap === false || options.trim === false)) {
32400
+ rows.push("");
32401
+ rowLength = 0;
32402
+ }
32403
+ if (rowLength > 0 || options.trim === false) {
32404
+ rows[rows.length - 1] += " ";
32405
+ rowLength++;
32406
+ }
32407
+ }
32408
+ if (options.hard && lengths[index] > columns) {
32409
+ const remainingColumns = columns - rowLength;
32410
+ const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);
32411
+ const breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns);
32412
+ if (breaksStartingNextLine < breaksStartingThisLine) {
32413
+ rows.push("");
32414
+ }
32415
+ wrapWord(rows, word, columns);
32416
+ continue;
32417
+ }
32418
+ if (rowLength + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) {
32419
+ if (options.wordWrap === false && rowLength < columns) {
32420
+ wrapWord(rows, word, columns);
32421
+ continue;
32422
+ }
32423
+ rows.push("");
32424
+ }
32425
+ if (rowLength + lengths[index] > columns && options.wordWrap === false) {
32426
+ wrapWord(rows, word, columns);
32427
+ continue;
32428
+ }
32429
+ rows[rows.length - 1] += word;
32430
+ }
32431
+ if (options.trim !== false) {
32432
+ rows = rows.map((row) => stringVisibleTrimSpacesRight(row));
32433
+ }
32434
+ const preString = rows.join(`
32435
+ `);
32436
+ const pre = [...preString];
32437
+ let preStringIndex = 0;
32438
+ for (const [index, character] of pre.entries()) {
32439
+ returnValue += character;
32440
+ if (ESCAPES.has(character)) {
32441
+ const { groups } = new RegExp(`(?:\\${ANSI_CSI}(?<code>\\d+)m|\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`).exec(preString.slice(preStringIndex)) || { groups: {} };
32442
+ if (groups.code !== undefined) {
32443
+ const code2 = Number.parseFloat(groups.code);
32444
+ escapeCode = code2 === END_CODE ? undefined : code2;
32445
+ } else if (groups.uri !== undefined) {
32446
+ escapeUrl = groups.uri.length === 0 ? undefined : groups.uri;
32447
+ }
32448
+ }
32449
+ const code = ansi_styles_default.codes.get(Number(escapeCode));
32450
+ if (pre[index + 1] === `
32451
+ `) {
32452
+ if (escapeUrl) {
32453
+ returnValue += wrapAnsiHyperlink("");
32454
+ }
32455
+ if (escapeCode && code) {
32456
+ returnValue += wrapAnsiCode(code);
32457
+ }
32458
+ } else if (character === `
32459
+ `) {
32460
+ if (escapeCode && code) {
32461
+ returnValue += wrapAnsiCode(escapeCode);
32462
+ }
32463
+ if (escapeUrl) {
32464
+ returnValue += wrapAnsiHyperlink(escapeUrl);
32465
+ }
32466
+ }
32467
+ preStringIndex += character.length;
32468
+ }
32469
+ return returnValue;
32470
+ };
32471
+ var init_wrap_ansi = __esm(() => {
32472
+ init_string_width();
32473
+ init_strip_ansi();
32474
+ init_ansi_styles();
32475
+ ESCAPES = new Set([
32476
+ "\x1B",
32477
+ "›"
32478
+ ]);
32479
+ ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;
32480
+ });
32481
+
32482
+ // node_modules/@inquirer/core/dist/lib/utils.js
32483
+ function breakLines(content, width) {
32484
+ return content.split(`
32485
+ `).flatMap((line) => wrapAnsi(line, width, { trim: false, hard: true }).split(`
32486
+ `).map((str) => str.trimEnd())).join(`
32487
+ `);
32488
+ }
32489
+ function readlineWidth() {
32490
+ return import_cli_width.default({ defaultWidth: 80, output: readline().output });
32491
+ }
32492
+ var import_cli_width;
32493
+ var init_utils = __esm(() => {
32494
+ init_wrap_ansi();
32495
+ init_hook_engine();
32496
+ import_cli_width = __toESM(require_cli_width(), 1);
32497
+ });
32498
+
32499
+ // node_modules/@inquirer/core/dist/lib/pagination/use-pagination.js
32500
+ function usePointerPosition({ active, renderedItems, pageSize, loop }) {
32501
+ const state = useRef({
32502
+ lastPointer: active,
32503
+ lastActive: undefined
32504
+ });
32505
+ const { lastPointer, lastActive } = state.current;
32506
+ const middle = Math.floor(pageSize / 2);
32507
+ const renderedLength = renderedItems.reduce((acc, item) => acc + item.length, 0);
32508
+ const defaultPointerPosition = renderedItems.slice(0, active).reduce((acc, item) => acc + item.length, 0);
32509
+ let pointer = defaultPointerPosition;
32510
+ if (renderedLength > pageSize) {
32511
+ if (loop) {
32512
+ pointer = lastPointer;
32513
+ if (lastActive != null && lastActive < active && active - lastActive < pageSize) {
32514
+ pointer = Math.min(middle, Math.abs(active - lastActive) === 1 ? Math.min(lastPointer + (renderedItems[lastActive]?.length ?? 0), Math.max(defaultPointerPosition, lastPointer)) : lastPointer + active - lastActive);
32515
+ }
32516
+ } else {
32517
+ const spaceUnderActive = renderedItems.slice(active).reduce((acc, item) => acc + item.length, 0);
32518
+ pointer = spaceUnderActive < pageSize - middle ? pageSize - spaceUnderActive : Math.min(defaultPointerPosition, middle);
32519
+ }
32520
+ }
32521
+ state.current.lastPointer = pointer;
32522
+ state.current.lastActive = active;
32523
+ return pointer;
32524
+ }
32525
+ function usePagination({ items, active, renderItem, pageSize, loop = true }) {
32526
+ const width = readlineWidth();
32527
+ const bound = (num) => (num % items.length + items.length) % items.length;
32528
+ const renderedItems = items.map((item, index) => {
32529
+ if (item == null)
32530
+ return [];
32531
+ return breakLines(renderItem({ item, index, isActive: index === active }), width).split(`
32532
+ `);
32533
+ });
32534
+ const renderedLength = renderedItems.reduce((acc, item) => acc + item.length, 0);
32535
+ const renderItemAtIndex = (index) => renderedItems[index] ?? [];
32536
+ const pointer = usePointerPosition({ active, renderedItems, pageSize, loop });
32537
+ const activeItem = renderItemAtIndex(active).slice(0, pageSize);
32538
+ const activeItemPosition = pointer + activeItem.length <= pageSize ? pointer : pageSize - activeItem.length;
32539
+ const pageBuffer = Array.from({ length: pageSize });
32540
+ pageBuffer.splice(activeItemPosition, activeItem.length, ...activeItem);
32541
+ const itemVisited = new Set([active]);
32542
+ let bufferPointer = activeItemPosition + activeItem.length;
32543
+ let itemPointer = bound(active + 1);
32544
+ while (bufferPointer < pageSize && !itemVisited.has(itemPointer) && (loop && renderedLength > pageSize ? itemPointer !== active : itemPointer > active)) {
32545
+ const lines = renderItemAtIndex(itemPointer);
32546
+ const linesToAdd = lines.slice(0, pageSize - bufferPointer);
32547
+ pageBuffer.splice(bufferPointer, linesToAdd.length, ...linesToAdd);
32548
+ itemVisited.add(itemPointer);
32549
+ bufferPointer += linesToAdd.length;
32550
+ itemPointer = bound(itemPointer + 1);
32551
+ }
32552
+ bufferPointer = activeItemPosition - 1;
32553
+ itemPointer = bound(active - 1);
32554
+ while (bufferPointer >= 0 && !itemVisited.has(itemPointer) && (loop && renderedLength > pageSize ? itemPointer !== active : itemPointer < active)) {
32555
+ const lines = renderItemAtIndex(itemPointer);
32556
+ const linesToAdd = lines.slice(Math.max(0, lines.length - bufferPointer - 1));
32557
+ pageBuffer.splice(bufferPointer - linesToAdd.length + 1, linesToAdd.length, ...linesToAdd);
32558
+ itemVisited.add(itemPointer);
32559
+ bufferPointer -= linesToAdd.length;
32560
+ itemPointer = bound(itemPointer - 1);
32561
+ }
32562
+ return pageBuffer.filter((line) => typeof line === "string").join(`
32563
+ `);
32564
+ }
32565
+ var init_use_pagination = __esm(() => {
32566
+ init_use_ref();
32567
+ init_utils();
32568
+ });
32569
+
32570
+ // node_modules/mute-stream/lib/index.js
32571
+ var require_lib = __commonJS((exports, module) => {
32572
+ var Stream = __require("stream");
32573
+
32574
+ class MuteStream extends Stream {
32575
+ #isTTY = null;
32576
+ constructor(opts = {}) {
32577
+ super(opts);
32578
+ this.writable = this.readable = true;
32579
+ this.muted = false;
32580
+ this.on("pipe", this._onpipe);
32581
+ this.replace = opts.replace;
32582
+ this._prompt = opts.prompt || null;
32583
+ this._hadControl = false;
32584
+ }
32585
+ #destSrc(key, def) {
32586
+ if (this._dest) {
32587
+ return this._dest[key];
32588
+ }
32589
+ if (this._src) {
32590
+ return this._src[key];
32591
+ }
32592
+ return def;
32593
+ }
32594
+ #proxy(method, ...args) {
32595
+ if (typeof this._dest?.[method] === "function") {
32596
+ this._dest[method](...args);
32597
+ }
32598
+ if (typeof this._src?.[method] === "function") {
32599
+ this._src[method](...args);
32600
+ }
32601
+ }
32602
+ get isTTY() {
32603
+ if (this.#isTTY !== null) {
32604
+ return this.#isTTY;
32605
+ }
32606
+ return this.#destSrc("isTTY", false);
32607
+ }
32608
+ set isTTY(val) {
32609
+ this.#isTTY = val;
32610
+ }
32611
+ get rows() {
32612
+ return this.#destSrc("rows");
32613
+ }
32614
+ get columns() {
32615
+ return this.#destSrc("columns");
32616
+ }
32617
+ mute() {
32618
+ this.muted = true;
32619
+ }
32620
+ unmute() {
32621
+ this.muted = false;
32622
+ }
32623
+ _onpipe(src) {
32624
+ this._src = src;
32625
+ }
32626
+ pipe(dest, options) {
32627
+ this._dest = dest;
32628
+ return super.pipe(dest, options);
32629
+ }
32630
+ pause() {
32631
+ if (this._src) {
32632
+ return this._src.pause();
32633
+ }
32634
+ }
32635
+ resume() {
32636
+ if (this._src) {
32637
+ return this._src.resume();
32638
+ }
32639
+ }
32640
+ write(c) {
32641
+ if (this.muted) {
32642
+ if (!this.replace) {
32643
+ return true;
32644
+ }
32645
+ if (c.match(/^\u001b/)) {
32646
+ if (c.indexOf(this._prompt) === 0) {
32647
+ c = c.slice(this._prompt.length);
32648
+ c = c.replace(/./g, this.replace);
32649
+ c = this._prompt + c;
32650
+ }
32651
+ this._hadControl = true;
32652
+ return this.emit("data", c);
32653
+ } else {
32654
+ if (this._prompt && this._hadControl && c.indexOf(this._prompt) === 0) {
32655
+ this._hadControl = false;
32656
+ this.emit("data", this._prompt);
32657
+ c = c.slice(this._prompt.length);
32658
+ }
32659
+ c = c.toString().replace(/./g, this.replace);
32660
+ }
32661
+ }
32662
+ this.emit("data", c);
32663
+ }
32664
+ end(c) {
32665
+ if (this.muted) {
32666
+ if (c && this.replace) {
32667
+ c = c.toString().replace(/./g, this.replace);
32668
+ } else {
32669
+ c = null;
32670
+ }
32671
+ }
32672
+ if (c) {
32673
+ this.emit("data", c);
32674
+ }
32675
+ this.emit("end");
32676
+ }
32677
+ destroy(...args) {
32678
+ return this.#proxy("destroy", ...args);
32679
+ }
32680
+ destroySoon(...args) {
32681
+ return this.#proxy("destroySoon", ...args);
32682
+ }
32683
+ close(...args) {
32684
+ return this.#proxy("close", ...args);
32685
+ }
32686
+ }
32687
+ module.exports = MuteStream;
32688
+ });
32689
+
32690
+ // node_modules/signal-exit/dist/mjs/signals.js
32691
+ var signals;
32692
+ var init_signals = __esm(() => {
32693
+ signals = [];
32694
+ signals.push("SIGHUP", "SIGINT", "SIGTERM");
32695
+ if (process.platform !== "win32") {
32696
+ signals.push("SIGALRM", "SIGABRT", "SIGVTALRM", "SIGXCPU", "SIGXFSZ", "SIGUSR2", "SIGTRAP", "SIGSYS", "SIGQUIT", "SIGIOT");
32697
+ }
32698
+ if (process.platform === "linux") {
32699
+ signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SIGSTKFLT");
32700
+ }
32701
+ });
32702
+
32703
+ // node_modules/signal-exit/dist/mjs/index.js
32704
+ class Emitter {
32705
+ emitted = {
32706
+ afterExit: false,
32707
+ exit: false
32708
+ };
32709
+ listeners = {
32710
+ afterExit: [],
32711
+ exit: []
32712
+ };
32713
+ count = 0;
32714
+ id = Math.random();
32715
+ constructor() {
32716
+ if (global2[kExitEmitter]) {
32717
+ return global2[kExitEmitter];
32718
+ }
32719
+ ObjectDefineProperty(global2, kExitEmitter, {
32720
+ value: this,
32721
+ writable: false,
32722
+ enumerable: false,
32723
+ configurable: false
32724
+ });
32725
+ }
32726
+ on(ev, fn) {
32727
+ this.listeners[ev].push(fn);
32728
+ }
32729
+ removeListener(ev, fn) {
32730
+ const list = this.listeners[ev];
32731
+ const i = list.indexOf(fn);
32732
+ if (i === -1) {
32733
+ return;
32734
+ }
32735
+ if (i === 0 && list.length === 1) {
32736
+ list.length = 0;
32737
+ } else {
32738
+ list.splice(i, 1);
32739
+ }
32740
+ }
32741
+ emit(ev, code, signal) {
32742
+ if (this.emitted[ev]) {
32743
+ return false;
32744
+ }
32745
+ this.emitted[ev] = true;
32746
+ let ret = false;
32747
+ for (const fn of this.listeners[ev]) {
32748
+ ret = fn(code, signal) === true || ret;
32749
+ }
32750
+ if (ev === "exit") {
32751
+ ret = this.emit("afterExit", code, signal) || ret;
32752
+ }
32753
+ return ret;
32754
+ }
32755
+ }
32756
+
32757
+ class SignalExitBase {
32758
+ }
32759
+ var processOk = (process4) => !!process4 && typeof process4 === "object" && typeof process4.removeListener === "function" && typeof process4.emit === "function" && typeof process4.reallyExit === "function" && typeof process4.listeners === "function" && typeof process4.kill === "function" && typeof process4.pid === "number" && typeof process4.on === "function", kExitEmitter, global2, ObjectDefineProperty, signalExitWrap = (handler) => {
32760
+ return {
32761
+ onExit(cb, opts) {
32762
+ return handler.onExit(cb, opts);
32763
+ },
32764
+ load() {
32765
+ return handler.load();
32766
+ },
32767
+ unload() {
32768
+ return handler.unload();
32769
+ }
32770
+ };
32771
+ }, SignalExitFallback, SignalExit, process4, onExit, load, unload;
32772
+ var init_mjs = __esm(() => {
32773
+ init_signals();
32774
+ kExitEmitter = Symbol.for("signal-exit emitter");
32775
+ global2 = globalThis;
32776
+ ObjectDefineProperty = Object.defineProperty.bind(Object);
32777
+ SignalExitFallback = class SignalExitFallback extends SignalExitBase {
32778
+ onExit() {
32779
+ return () => {};
32780
+ }
32781
+ load() {}
32782
+ unload() {}
32783
+ };
32784
+ SignalExit = class SignalExit extends SignalExitBase {
32785
+ #hupSig = process4.platform === "win32" ? "SIGINT" : "SIGHUP";
32786
+ #emitter = new Emitter;
32787
+ #process;
32788
+ #originalProcessEmit;
32789
+ #originalProcessReallyExit;
32790
+ #sigListeners = {};
32791
+ #loaded = false;
32792
+ constructor(process4) {
32793
+ super();
32794
+ this.#process = process4;
32795
+ this.#sigListeners = {};
32796
+ for (const sig of signals) {
32797
+ this.#sigListeners[sig] = () => {
32798
+ const listeners = this.#process.listeners(sig);
32799
+ let { count } = this.#emitter;
32800
+ const p = process4;
32801
+ if (typeof p.__signal_exit_emitter__ === "object" && typeof p.__signal_exit_emitter__.count === "number") {
32802
+ count += p.__signal_exit_emitter__.count;
32803
+ }
32804
+ if (listeners.length === count) {
32805
+ this.unload();
32806
+ const ret = this.#emitter.emit("exit", null, sig);
32807
+ const s = sig === "SIGHUP" ? this.#hupSig : sig;
32808
+ if (!ret)
32809
+ process4.kill(process4.pid, s);
32810
+ }
32811
+ };
32812
+ }
32813
+ this.#originalProcessReallyExit = process4.reallyExit;
32814
+ this.#originalProcessEmit = process4.emit;
32815
+ }
32816
+ onExit(cb, opts) {
32817
+ if (!processOk(this.#process)) {
32818
+ return () => {};
32819
+ }
32820
+ if (this.#loaded === false) {
32821
+ this.load();
32822
+ }
32823
+ const ev = opts?.alwaysLast ? "afterExit" : "exit";
32824
+ this.#emitter.on(ev, cb);
32825
+ return () => {
32826
+ this.#emitter.removeListener(ev, cb);
32827
+ if (this.#emitter.listeners["exit"].length === 0 && this.#emitter.listeners["afterExit"].length === 0) {
32828
+ this.unload();
32829
+ }
32830
+ };
32831
+ }
32832
+ load() {
32833
+ if (this.#loaded) {
32834
+ return;
32835
+ }
32836
+ this.#loaded = true;
32837
+ this.#emitter.count += 1;
32838
+ for (const sig of signals) {
32839
+ try {
32840
+ const fn = this.#sigListeners[sig];
32841
+ if (fn)
32842
+ this.#process.on(sig, fn);
32843
+ } catch (_) {}
32844
+ }
32845
+ this.#process.emit = (ev, ...a) => {
32846
+ return this.#processEmit(ev, ...a);
32847
+ };
32848
+ this.#process.reallyExit = (code) => {
32849
+ return this.#processReallyExit(code);
32850
+ };
32851
+ }
32852
+ unload() {
32853
+ if (!this.#loaded) {
32854
+ return;
32855
+ }
32856
+ this.#loaded = false;
32857
+ signals.forEach((sig) => {
32858
+ const listener = this.#sigListeners[sig];
32859
+ if (!listener) {
32860
+ throw new Error("Listener not defined for signal: " + sig);
32861
+ }
32862
+ try {
32863
+ this.#process.removeListener(sig, listener);
32864
+ } catch (_) {}
32865
+ });
32866
+ this.#process.emit = this.#originalProcessEmit;
32867
+ this.#process.reallyExit = this.#originalProcessReallyExit;
32868
+ this.#emitter.count -= 1;
32869
+ }
32870
+ #processReallyExit(code) {
32871
+ if (!processOk(this.#process)) {
32872
+ return 0;
32873
+ }
32874
+ this.#process.exitCode = code || 0;
32875
+ this.#emitter.emit("exit", this.#process.exitCode, null);
32876
+ return this.#originalProcessReallyExit.call(this.#process, this.#process.exitCode);
32877
+ }
32878
+ #processEmit(ev, ...args) {
32879
+ const og = this.#originalProcessEmit;
32880
+ if (ev === "exit" && processOk(this.#process)) {
32881
+ if (typeof args[0] === "number") {
32882
+ this.#process.exitCode = args[0];
32883
+ }
32884
+ const ret = og.call(this.#process, ev, ...args);
32885
+ this.#emitter.emit("exit", this.#process.exitCode, null);
32886
+ return ret;
32887
+ } else {
32888
+ return og.call(this.#process, ev, ...args);
32889
+ }
32890
+ }
32891
+ };
32892
+ process4 = globalThis.process;
32893
+ ({
32894
+ onExit,
32895
+ load,
32896
+ unload
32897
+ } = signalExitWrap(processOk(process4) ? new SignalExit(process4) : new SignalExitFallback));
32898
+ });
32899
+
32900
+ // node_modules/@inquirer/ansi/dist/index.js
32901
+ var ESC = "\x1B[", cursorLeft, cursorHide, cursorShow, cursorUp = (rows = 1) => rows > 0 ? `${ESC}${rows}A` : "", cursorDown = (rows = 1) => rows > 0 ? `${ESC}${rows}B` : "", cursorTo = (x, y) => {
32902
+ if (typeof y === "number" && !Number.isNaN(y)) {
32903
+ return `${ESC}${y + 1};${x + 1}H`;
32904
+ }
32905
+ return `${ESC}${x + 1}G`;
32906
+ }, eraseLine, eraseLines = (lines) => lines > 0 ? (eraseLine + cursorUp(1)).repeat(lines - 1) + eraseLine + cursorLeft : "";
32907
+ var init_dist2 = __esm(() => {
32908
+ cursorLeft = ESC + "G";
32909
+ cursorHide = ESC + "?25l";
32910
+ cursorShow = ESC + "?25h";
32911
+ eraseLine = ESC + "2K";
32912
+ });
32913
+
32914
+ // node_modules/@inquirer/core/dist/lib/screen-manager.js
32915
+ import { stripVTControlCharacters } from "node:util";
32916
+
32917
+ class ScreenManager {
32918
+ height = 0;
32919
+ extraLinesUnderPrompt = 0;
32920
+ cursorPos;
32921
+ rl;
32922
+ constructor(rl) {
32923
+ this.rl = rl;
32924
+ this.cursorPos = rl.getCursorPos();
32925
+ }
32926
+ write(content) {
32927
+ this.rl.output.unmute();
32928
+ this.rl.output.write(content);
32929
+ this.rl.output.mute();
32930
+ }
32931
+ render(content, bottomContent = "") {
32932
+ const promptLine = lastLine(content);
32933
+ const rawPromptLine = stripVTControlCharacters(promptLine);
32934
+ let prompt = rawPromptLine;
32935
+ if (this.rl.line.length > 0) {
32936
+ prompt = prompt.slice(0, -this.rl.line.length);
32937
+ }
32938
+ this.rl.setPrompt(prompt);
32939
+ this.cursorPos = this.rl.getCursorPos();
32940
+ const width = readlineWidth();
32941
+ content = breakLines(content, width);
32942
+ bottomContent = breakLines(bottomContent, width);
32943
+ if (rawPromptLine.length % width === 0) {
32944
+ content += `
32945
+ `;
32946
+ }
32947
+ let output = content + (bottomContent ? `
32948
+ ` + bottomContent : "");
32949
+ const promptLineUpDiff = Math.floor(rawPromptLine.length / width) - this.cursorPos.rows;
32950
+ const bottomContentHeight = promptLineUpDiff + (bottomContent ? height(bottomContent) : 0);
32951
+ if (bottomContentHeight > 0)
32952
+ output += cursorUp(bottomContentHeight);
32953
+ output += cursorTo(this.cursorPos.cols);
32954
+ this.write(cursorDown(this.extraLinesUnderPrompt) + eraseLines(this.height) + output);
32955
+ this.extraLinesUnderPrompt = bottomContentHeight;
32956
+ this.height = height(output);
32957
+ }
32958
+ checkCursorPos() {
32959
+ const cursorPos = this.rl.getCursorPos();
32960
+ if (cursorPos.cols !== this.cursorPos.cols) {
32961
+ this.write(cursorTo(cursorPos.cols));
32962
+ this.cursorPos = cursorPos;
32963
+ }
32964
+ }
32965
+ done({ clearContent }) {
32966
+ this.rl.setPrompt("");
32967
+ let output = cursorDown(this.extraLinesUnderPrompt);
32968
+ output += clearContent ? eraseLines(this.height) : `
32969
+ `;
32970
+ output += cursorShow;
32971
+ this.write(output);
32972
+ this.rl.close();
32973
+ }
32974
+ }
32975
+ var height = (content) => content.split(`
32976
+ `).length, lastLine = (content) => content.split(`
32977
+ `).pop() ?? "";
32978
+ var init_screen_manager = __esm(() => {
32979
+ init_utils();
32980
+ init_dist2();
32981
+ });
32982
+
32983
+ // node_modules/@inquirer/core/dist/lib/promise-polyfill.js
32984
+ var PromisePolyfill;
32985
+ var init_promise_polyfill = __esm(() => {
32986
+ PromisePolyfill = class PromisePolyfill extends Promise {
32987
+ static withResolver() {
32988
+ let resolve;
32989
+ let reject;
32990
+ const promise3 = new Promise((res, rej) => {
32991
+ resolve = res;
32992
+ reject = rej;
32993
+ });
32994
+ return { promise: promise3, resolve, reject };
32995
+ }
32996
+ };
32997
+ });
32998
+
32999
+ // node_modules/@inquirer/core/dist/lib/create-prompt.js
33000
+ import * as readline2 from "node:readline";
33001
+ import { AsyncResource as AsyncResource3 } from "node:async_hooks";
33002
+ function getCallSites() {
33003
+ const _prepareStackTrace = Error.prepareStackTrace;
33004
+ let result = [];
33005
+ try {
33006
+ Error.prepareStackTrace = (_, callSites) => {
33007
+ const callSitesWithoutCurrent = callSites.slice(1);
33008
+ result = callSitesWithoutCurrent;
33009
+ return callSitesWithoutCurrent;
33010
+ };
33011
+ new Error().stack;
33012
+ } catch {
33013
+ return result;
33014
+ }
33015
+ Error.prepareStackTrace = _prepareStackTrace;
33016
+ return result;
33017
+ }
33018
+ function createPrompt(view) {
33019
+ const callSites = getCallSites();
33020
+ const prompt = (config3, context = {}) => {
33021
+ const { input = process.stdin, signal } = context;
33022
+ const cleanups = new Set;
33023
+ const output = new import_mute_stream.default;
33024
+ output.pipe(context.output ?? process.stdout);
33025
+ const rl = readline2.createInterface({
33026
+ terminal: true,
33027
+ input,
33028
+ output
33029
+ });
33030
+ const screen = new ScreenManager(rl);
33031
+ const { promise: promise3, resolve, reject } = PromisePolyfill.withResolver();
33032
+ const cancel = () => reject(new CancelPromptError);
33033
+ if (signal) {
33034
+ const abort = () => reject(new AbortPromptError({ cause: signal.reason }));
33035
+ if (signal.aborted) {
33036
+ abort();
33037
+ return Object.assign(promise3, { cancel });
33038
+ }
33039
+ signal.addEventListener("abort", abort);
33040
+ cleanups.add(() => signal.removeEventListener("abort", abort));
33041
+ }
33042
+ cleanups.add(onExit((code, signal2) => {
33043
+ reject(new ExitPromptError(`User force closed the prompt with ${code} ${signal2}`));
33044
+ }));
33045
+ const sigint = () => reject(new ExitPromptError(`User force closed the prompt with SIGINT`));
33046
+ rl.on("SIGINT", sigint);
33047
+ cleanups.add(() => rl.removeListener("SIGINT", sigint));
33048
+ const checkCursorPos = () => screen.checkCursorPos();
33049
+ rl.input.on("keypress", checkCursorPos);
33050
+ cleanups.add(() => rl.input.removeListener("keypress", checkCursorPos));
33051
+ return withHooks(rl, (cycle) => {
33052
+ const hooksCleanup = AsyncResource3.bind(() => effectScheduler.clearAll());
33053
+ rl.on("close", hooksCleanup);
33054
+ cleanups.add(() => rl.removeListener("close", hooksCleanup));
33055
+ cycle(() => {
33056
+ try {
33057
+ const nextView = view(config3, (value) => {
33058
+ setImmediate(() => resolve(value));
33059
+ });
33060
+ if (nextView === undefined) {
33061
+ const callerFilename = callSites[1]?.getFileName();
33062
+ throw new Error(`Prompt functions must return a string.
33063
+ at ${callerFilename}`);
33064
+ }
33065
+ const [content, bottomContent] = typeof nextView === "string" ? [nextView] : nextView;
33066
+ screen.render(content, bottomContent);
33067
+ effectScheduler.run();
33068
+ } catch (error46) {
33069
+ reject(error46);
33070
+ }
33071
+ });
33072
+ return Object.assign(promise3.then((answer) => {
33073
+ effectScheduler.clearAll();
33074
+ return answer;
33075
+ }, (error46) => {
33076
+ effectScheduler.clearAll();
33077
+ throw error46;
33078
+ }).finally(() => {
33079
+ cleanups.forEach((cleanup) => cleanup());
33080
+ screen.done({ clearContent: Boolean(context.clearPromptOnDone) });
33081
+ output.end();
33082
+ }).then(() => promise3), { cancel });
33083
+ });
33084
+ };
33085
+ return prompt;
33086
+ }
33087
+ var import_mute_stream;
33088
+ var init_create_prompt = __esm(() => {
33089
+ init_mjs();
33090
+ init_screen_manager();
33091
+ init_promise_polyfill();
33092
+ init_hook_engine();
33093
+ init_errors5();
33094
+ import_mute_stream = __toESM(require_lib(), 1);
33095
+ });
33096
+
33097
+ // node_modules/@inquirer/core/dist/lib/Separator.js
33098
+ import { styleText as styleText2 } from "node:util";
33099
+
33100
+ class Separator {
33101
+ separator = styleText2("dim", Array.from({ length: 15 }).join(dist_default.line));
33102
+ type = "separator";
33103
+ constructor(separator) {
33104
+ if (separator) {
33105
+ this.separator = separator;
33106
+ }
33107
+ }
33108
+ static isSeparator(choice) {
33109
+ return Boolean(choice && typeof choice === "object" && "type" in choice && choice.type === "separator");
33110
+ }
33111
+ }
33112
+ var init_Separator = __esm(() => {
33113
+ init_dist();
33114
+ });
33115
+
33116
+ // node_modules/@inquirer/core/dist/index.js
33117
+ var init_dist3 = __esm(() => {
33118
+ init_use_prefix();
33119
+ init_use_state();
33120
+ init_use_effect();
33121
+ init_use_memo();
33122
+ init_use_ref();
33123
+ init_use_keypress();
33124
+ init_make_theme();
33125
+ init_use_pagination();
33126
+ init_create_prompt();
33127
+ init_Separator();
33128
+ init_errors5();
33129
+ });
33130
+
33131
+ // node_modules/@inquirer/confirm/dist/index.js
33132
+ function getBooleanValue(value, defaultValue) {
33133
+ let answer = defaultValue !== false;
33134
+ if (/^(y|yes)/i.test(value))
33135
+ answer = true;
33136
+ else if (/^(n|no)/i.test(value))
33137
+ answer = false;
33138
+ return answer;
33139
+ }
33140
+ function boolToString(value) {
33141
+ return value ? "Yes" : "No";
33142
+ }
33143
+ var dist_default2;
33144
+ var init_dist4 = __esm(() => {
33145
+ init_dist3();
33146
+ dist_default2 = createPrompt((config3, done) => {
33147
+ const { transformer = boolToString } = config3;
33148
+ const [status, setStatus] = useState("idle");
33149
+ const [value, setValue] = useState("");
33150
+ const theme = makeTheme(config3.theme);
33151
+ const prefix = usePrefix({ status, theme });
33152
+ useKeypress((key, rl) => {
33153
+ if (status !== "idle")
33154
+ return;
33155
+ if (isEnterKey(key)) {
33156
+ const answer = getBooleanValue(value, config3.default);
33157
+ setValue(transformer(answer));
33158
+ setStatus("done");
33159
+ done(answer);
33160
+ } else if (isTabKey(key)) {
33161
+ const answer = boolToString(!getBooleanValue(value, config3.default));
33162
+ rl.clearLine(0);
33163
+ rl.write(answer);
33164
+ setValue(answer);
33165
+ } else {
33166
+ setValue(rl.line);
33167
+ }
33168
+ });
33169
+ let formattedValue = value;
33170
+ let defaultValue = "";
33171
+ if (status === "done") {
33172
+ formattedValue = theme.style.answer(value);
33173
+ } else {
33174
+ defaultValue = ` ${theme.style.defaultAnswer(config3.default === false ? "y/N" : "Y/n")}`;
33175
+ }
33176
+ const message = theme.style.message(config3.message, status);
33177
+ return `${prefix} ${message}${defaultValue} ${formattedValue}`;
33178
+ });
33179
+ });
33180
+
33181
+ // node_modules/@inquirer/input/dist/index.js
33182
+ var inputTheme, dist_default3;
33183
+ var init_dist5 = __esm(() => {
33184
+ init_dist3();
33185
+ inputTheme = {
33186
+ validationFailureMode: "keep"
33187
+ };
33188
+ dist_default3 = createPrompt((config3, done) => {
33189
+ const { prefill = "tab" } = config3;
33190
+ const theme = makeTheme(inputTheme, config3.theme);
33191
+ const [status, setStatus] = useState("idle");
33192
+ const [defaultValue = "", setDefaultValue] = useState(config3.default);
33193
+ const [errorMsg, setError] = useState();
33194
+ const [value, setValue] = useState("");
33195
+ const prefix = usePrefix({ status, theme });
33196
+ async function validate2(value2) {
33197
+ const { required: required2, pattern, patternError = "Invalid input" } = config3;
33198
+ if (required2 && !value2) {
33199
+ return "You must provide a value";
33200
+ }
33201
+ if (pattern && !pattern.test(value2)) {
33202
+ return patternError;
33203
+ }
33204
+ if (typeof config3.validate === "function") {
33205
+ return await config3.validate(value2) || "You must provide a valid value";
33206
+ }
33207
+ return true;
33208
+ }
33209
+ useKeypress(async (key, rl) => {
33210
+ if (status !== "idle") {
33211
+ return;
33212
+ }
33213
+ if (isEnterKey(key)) {
33214
+ const answer = value || defaultValue;
33215
+ setStatus("loading");
33216
+ const isValid3 = await validate2(answer);
33217
+ if (isValid3 === true) {
33218
+ setValue(answer);
33219
+ setStatus("done");
33220
+ done(answer);
33221
+ } else {
33222
+ if (theme.validationFailureMode === "clear") {
33223
+ setValue("");
33224
+ } else {
33225
+ rl.write(value);
33226
+ }
33227
+ setError(isValid3);
33228
+ setStatus("idle");
33229
+ }
33230
+ } else if (isBackspaceKey(key) && !value) {
33231
+ setDefaultValue(undefined);
33232
+ } else if (isTabKey(key) && !value) {
33233
+ setDefaultValue(undefined);
33234
+ rl.clearLine(0);
33235
+ rl.write(defaultValue);
33236
+ setValue(defaultValue);
33237
+ } else {
33238
+ setValue(rl.line);
33239
+ setError(undefined);
33240
+ }
33241
+ });
33242
+ useEffect((rl) => {
33243
+ if (prefill === "editable" && defaultValue) {
33244
+ rl.write(defaultValue);
33245
+ setValue(defaultValue);
33246
+ }
33247
+ }, []);
33248
+ const message = theme.style.message(config3.message, status);
33249
+ let formattedValue = value;
33250
+ if (typeof config3.transformer === "function") {
33251
+ formattedValue = config3.transformer(value, { isFinal: status === "done" });
33252
+ } else if (status === "done") {
33253
+ formattedValue = theme.style.answer(value);
33254
+ }
33255
+ let defaultStr;
33256
+ if (defaultValue && status !== "done" && !value) {
33257
+ defaultStr = theme.style.defaultAnswer(defaultValue);
33258
+ }
33259
+ let error46 = "";
33260
+ if (errorMsg) {
33261
+ error46 = theme.style.error(errorMsg);
33262
+ }
33263
+ return [
33264
+ [prefix, message, defaultStr, formattedValue].filter((v) => v !== undefined).join(" "),
33265
+ error46
33266
+ ];
33267
+ });
33268
+ });
33269
+
33270
+ // node_modules/@inquirer/search/dist/index.js
33271
+ import { styleText as styleText3 } from "node:util";
33272
+ function isSelectable(item) {
33273
+ return !Separator.isSeparator(item) && !item.disabled;
33274
+ }
33275
+ function normalizeChoices(choices) {
33276
+ return choices.map((choice) => {
33277
+ if (Separator.isSeparator(choice))
33278
+ return choice;
33279
+ if (typeof choice === "string") {
33280
+ return {
33281
+ value: choice,
33282
+ name: choice,
33283
+ short: choice,
33284
+ disabled: false
33285
+ };
33286
+ }
33287
+ const name = choice.name ?? String(choice.value);
33288
+ const normalizedChoice = {
33289
+ value: choice.value,
33290
+ name,
33291
+ short: choice.short ?? name,
33292
+ disabled: choice.disabled ?? false
33293
+ };
33294
+ if (choice.description) {
33295
+ normalizedChoice.description = choice.description;
33296
+ }
33297
+ return normalizedChoice;
33298
+ });
33299
+ }
33300
+ var searchTheme, dist_default4;
33301
+ var init_dist6 = __esm(() => {
33302
+ init_dist3();
33303
+ init_dist();
33304
+ searchTheme = {
33305
+ icon: { cursor: dist_default.pointer },
33306
+ style: {
33307
+ disabled: (text) => styleText3("dim", `- ${text}`),
33308
+ searchTerm: (text) => styleText3("cyan", text),
33309
+ description: (text) => styleText3("cyan", text),
33310
+ keysHelpTip: (keys) => keys.map(([key, action]) => `${styleText3("bold", key)} ${styleText3("dim", action)}`).join(styleText3("dim", " • "))
33311
+ }
33312
+ };
33313
+ dist_default4 = createPrompt((config3, done) => {
33314
+ const { pageSize = 7, validate: validate2 = () => true } = config3;
33315
+ const theme = makeTheme(searchTheme, config3.theme);
33316
+ const [status, setStatus] = useState("loading");
33317
+ const [searchTerm, setSearchTerm] = useState("");
33318
+ const [searchResults, setSearchResults] = useState([]);
33319
+ const [searchError, setSearchError] = useState();
33320
+ const prefix = usePrefix({ status, theme });
33321
+ const bounds = useMemo(() => {
33322
+ const first = searchResults.findIndex(isSelectable);
33323
+ const last = searchResults.findLastIndex(isSelectable);
33324
+ return { first, last };
33325
+ }, [searchResults]);
33326
+ const [active = bounds.first, setActive] = useState();
33327
+ useEffect(() => {
33328
+ const controller = new AbortController;
33329
+ setStatus("loading");
33330
+ setSearchError(undefined);
33331
+ const fetchResults = async () => {
33332
+ try {
33333
+ const results = await config3.source(searchTerm || undefined, {
33334
+ signal: controller.signal
33335
+ });
33336
+ if (!controller.signal.aborted) {
33337
+ setActive(undefined);
33338
+ setSearchError(undefined);
33339
+ setSearchResults(normalizeChoices(results));
33340
+ setStatus("idle");
33341
+ }
33342
+ } catch (error47) {
33343
+ if (!controller.signal.aborted && error47 instanceof Error) {
33344
+ setSearchError(error47.message);
33345
+ }
33346
+ }
33347
+ };
33348
+ fetchResults();
33349
+ return () => {
33350
+ controller.abort();
33351
+ };
33352
+ }, [searchTerm]);
33353
+ const selectedChoice = searchResults[active];
33354
+ useKeypress(async (key, rl) => {
33355
+ if (isEnterKey(key)) {
33356
+ if (selectedChoice) {
33357
+ setStatus("loading");
33358
+ const isValid3 = await validate2(selectedChoice.value);
33359
+ setStatus("idle");
33360
+ if (isValid3 === true) {
33361
+ setStatus("done");
33362
+ done(selectedChoice.value);
33363
+ } else if (selectedChoice.name === searchTerm) {
33364
+ setSearchError(isValid3 || "You must provide a valid value");
33365
+ } else {
33366
+ rl.write(selectedChoice.name);
33367
+ setSearchTerm(selectedChoice.name);
33368
+ }
33369
+ } else {
33370
+ rl.write(searchTerm);
33371
+ }
33372
+ } else if (isTabKey(key) && selectedChoice) {
33373
+ rl.clearLine(0);
33374
+ rl.write(selectedChoice.name);
33375
+ setSearchTerm(selectedChoice.name);
33376
+ } else if (status !== "loading" && (isUpKey(key) || isDownKey(key))) {
33377
+ rl.clearLine(0);
33378
+ if (isUpKey(key) && active !== bounds.first || isDownKey(key) && active !== bounds.last) {
33379
+ const offset = isUpKey(key) ? -1 : 1;
33380
+ let next = active;
33381
+ do {
33382
+ next = (next + offset + searchResults.length) % searchResults.length;
33383
+ } while (!isSelectable(searchResults[next]));
33384
+ setActive(next);
33385
+ }
33386
+ } else {
33387
+ setSearchTerm(rl.line);
33388
+ }
33389
+ });
33390
+ const message = theme.style.message(config3.message, status);
33391
+ const helpLine = theme.style.keysHelpTip([
33392
+ ["↑↓", "navigate"],
33393
+ ["⏎", "select"]
33394
+ ]);
33395
+ const page = usePagination({
33396
+ items: searchResults,
33397
+ active,
33398
+ renderItem({ item, isActive }) {
33399
+ if (Separator.isSeparator(item)) {
33400
+ return ` ${item.separator}`;
33401
+ }
33402
+ if (item.disabled) {
33403
+ const disabledLabel = typeof item.disabled === "string" ? item.disabled : "(disabled)";
33404
+ return theme.style.disabled(`${item.name} ${disabledLabel}`);
33405
+ }
33406
+ const color = isActive ? theme.style.highlight : (x) => x;
33407
+ const cursor = isActive ? theme.icon.cursor : ` `;
33408
+ return color(`${cursor} ${item.name}`);
33409
+ },
33410
+ pageSize,
33411
+ loop: false
33412
+ });
33413
+ let error46;
33414
+ if (searchError) {
33415
+ error46 = theme.style.error(searchError);
33416
+ } else if (searchResults.length === 0 && searchTerm !== "" && status === "idle") {
33417
+ error46 = theme.style.error("No results found");
33418
+ }
33419
+ let searchStr;
33420
+ if (status === "done" && selectedChoice) {
33421
+ return [prefix, message, theme.style.answer(selectedChoice.short)].filter(Boolean).join(" ").trimEnd();
33422
+ } else {
33423
+ searchStr = theme.style.searchTerm(searchTerm);
33424
+ }
33425
+ const description = selectedChoice?.description;
33426
+ const header = [prefix, message, searchStr].filter(Boolean).join(" ").trimEnd();
33427
+ const body = [
33428
+ error46 ?? page,
33429
+ " ",
33430
+ description ? theme.style.description(description) : "",
33431
+ helpLine
33432
+ ].filter(Boolean).join(`
33433
+ `).trimEnd();
33434
+ return [header, body];
33435
+ });
33436
+ });
33437
+
33438
+ // node_modules/@inquirer/select/dist/index.js
33439
+ import { styleText as styleText4 } from "node:util";
33440
+ function isSelectable2(item) {
33441
+ return !Separator.isSeparator(item) && !item.disabled;
33442
+ }
33443
+ function normalizeChoices2(choices) {
33444
+ return choices.map((choice) => {
33445
+ if (Separator.isSeparator(choice))
33446
+ return choice;
33447
+ if (typeof choice === "string") {
33448
+ return {
33449
+ value: choice,
33450
+ name: choice,
33451
+ short: choice,
33452
+ disabled: false
33453
+ };
33454
+ }
33455
+ const name = choice.name ?? String(choice.value);
33456
+ const normalizedChoice = {
33457
+ value: choice.value,
33458
+ name,
33459
+ short: choice.short ?? name,
33460
+ disabled: choice.disabled ?? false
33461
+ };
33462
+ if (choice.description) {
33463
+ normalizedChoice.description = choice.description;
33464
+ }
33465
+ return normalizedChoice;
33466
+ });
33467
+ }
33468
+ var selectTheme, dist_default5;
33469
+ var init_dist7 = __esm(() => {
33470
+ init_dist3();
33471
+ init_dist2();
33472
+ init_dist();
33473
+ selectTheme = {
33474
+ icon: { cursor: dist_default.pointer },
33475
+ style: {
33476
+ disabled: (text) => styleText4("dim", `- ${text}`),
33477
+ description: (text) => styleText4("cyan", text),
33478
+ keysHelpTip: (keys) => keys.map(([key, action]) => `${styleText4("bold", key)} ${styleText4("dim", action)}`).join(styleText4("dim", " • "))
33479
+ },
33480
+ indexMode: "hidden",
33481
+ keybindings: []
33482
+ };
33483
+ dist_default5 = createPrompt((config3, done) => {
33484
+ const { loop = true, pageSize = 7 } = config3;
33485
+ const theme = makeTheme(selectTheme, config3.theme);
33486
+ const { keybindings } = theme;
33487
+ const [status, setStatus] = useState("idle");
33488
+ const prefix = usePrefix({ status, theme });
33489
+ const searchTimeoutRef = useRef();
33490
+ const searchEnabled = !keybindings.includes("vim");
33491
+ const items = useMemo(() => normalizeChoices2(config3.choices), [config3.choices]);
33492
+ const bounds = useMemo(() => {
33493
+ const first = items.findIndex(isSelectable2);
33494
+ const last = items.findLastIndex(isSelectable2);
33495
+ if (first === -1) {
33496
+ throw new ValidationError("[select prompt] No selectable choices. All choices are disabled.");
33497
+ }
33498
+ return { first, last };
33499
+ }, [items]);
33500
+ const defaultItemIndex = useMemo(() => {
33501
+ if (!("default" in config3))
33502
+ return -1;
33503
+ return items.findIndex((item) => isSelectable2(item) && item.value === config3.default);
33504
+ }, [config3.default, items]);
33505
+ const [active, setActive] = useState(defaultItemIndex === -1 ? bounds.first : defaultItemIndex);
33506
+ const selectedChoice = items[active];
33507
+ useKeypress((key, rl) => {
33508
+ clearTimeout(searchTimeoutRef.current);
33509
+ if (isEnterKey(key)) {
33510
+ setStatus("done");
33511
+ done(selectedChoice.value);
33512
+ } else if (isUpKey(key, keybindings) || isDownKey(key, keybindings)) {
33513
+ rl.clearLine(0);
33514
+ if (loop || isUpKey(key, keybindings) && active !== bounds.first || isDownKey(key, keybindings) && active !== bounds.last) {
33515
+ const offset = isUpKey(key, keybindings) ? -1 : 1;
33516
+ let next = active;
33517
+ do {
33518
+ next = (next + offset + items.length) % items.length;
33519
+ } while (!isSelectable2(items[next]));
33520
+ setActive(next);
33521
+ }
33522
+ } else if (isNumberKey(key) && !Number.isNaN(Number(rl.line))) {
33523
+ const selectedIndex = Number(rl.line) - 1;
33524
+ let selectableIndex = -1;
33525
+ const position = items.findIndex((item2) => {
33526
+ if (Separator.isSeparator(item2))
33527
+ return false;
33528
+ selectableIndex++;
33529
+ return selectableIndex === selectedIndex;
33530
+ });
33531
+ const item = items[position];
33532
+ if (item != null && isSelectable2(item)) {
33533
+ setActive(position);
33534
+ }
33535
+ searchTimeoutRef.current = setTimeout(() => {
33536
+ rl.clearLine(0);
33537
+ }, 700);
33538
+ } else if (isBackspaceKey(key)) {
33539
+ rl.clearLine(0);
33540
+ } else if (searchEnabled) {
33541
+ const searchTerm = rl.line.toLowerCase();
33542
+ const matchIndex = items.findIndex((item) => {
33543
+ if (Separator.isSeparator(item) || !isSelectable2(item))
33544
+ return false;
33545
+ return item.name.toLowerCase().startsWith(searchTerm);
33546
+ });
33547
+ if (matchIndex !== -1) {
33548
+ setActive(matchIndex);
33549
+ }
33550
+ searchTimeoutRef.current = setTimeout(() => {
33551
+ rl.clearLine(0);
33552
+ }, 700);
33553
+ }
33554
+ });
33555
+ useEffect(() => () => {
33556
+ clearTimeout(searchTimeoutRef.current);
33557
+ }, []);
33558
+ const message = theme.style.message(config3.message, status);
33559
+ const helpLine = theme.style.keysHelpTip([
33560
+ ["↑↓", "navigate"],
33561
+ ["⏎", "select"]
33562
+ ]);
33563
+ let separatorCount = 0;
33564
+ const page = usePagination({
33565
+ items,
33566
+ active,
33567
+ renderItem({ item, isActive, index }) {
33568
+ if (Separator.isSeparator(item)) {
33569
+ separatorCount++;
33570
+ return ` ${item.separator}`;
33571
+ }
33572
+ const indexLabel = theme.indexMode === "number" ? `${index + 1 - separatorCount}. ` : "";
33573
+ if (item.disabled) {
33574
+ const disabledLabel = typeof item.disabled === "string" ? item.disabled : "(disabled)";
33575
+ return theme.style.disabled(`${indexLabel}${item.name} ${disabledLabel}`);
33576
+ }
33577
+ const color = isActive ? theme.style.highlight : (x) => x;
33578
+ const cursor = isActive ? theme.icon.cursor : ` `;
33579
+ return color(`${cursor} ${indexLabel}${item.name}`);
33580
+ },
33581
+ pageSize,
33582
+ loop
33583
+ });
33584
+ if (status === "done") {
33585
+ return [prefix, message, theme.style.answer(selectedChoice.short)].filter(Boolean).join(" ");
33586
+ }
33587
+ const { description } = selectedChoice;
33588
+ const lines = [
33589
+ [prefix, message].filter(Boolean).join(" "),
33590
+ page,
33591
+ " ",
33592
+ description ? theme.style.description(description) : "",
33593
+ helpLine
33594
+ ].filter(Boolean).join(`
33595
+ `).trimEnd();
33596
+ return `${lines}${cursorHide}`;
33597
+ });
33598
+ });
33599
+
33600
+ // node_modules/@inquirer/prompts/dist/index.js
33601
+ var init_dist8 = __esm(() => {
33602
+ init_dist4();
33603
+ init_dist5();
33604
+ init_dist6();
33605
+ init_dist7();
33606
+ });
33607
+
33608
+ // src/model-selector.ts
33609
+ var exports_model_selector = {};
33610
+ __export(exports_model_selector, {
33611
+ selectProfile: () => selectProfile,
33612
+ selectModelsForProfile: () => selectModelsForProfile,
33613
+ selectModel: () => selectModel,
33614
+ promptForProfileName: () => promptForProfileName,
33615
+ promptForProfileDescription: () => promptForProfileDescription,
33616
+ promptForApiKey: () => promptForApiKey,
33617
+ confirmAction: () => confirmAction
33618
+ });
33619
+ import { readFileSync as readFileSync3, writeFileSync as writeFileSync3, existsSync as existsSync3 } from "node:fs";
33620
+ import { join as join3, dirname as dirname2 } from "node:path";
33621
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
33622
+ function loadRecommendedModels2() {
33623
+ if (existsSync3(RECOMMENDED_MODELS_JSON_PATH)) {
33624
+ try {
33625
+ const content = readFileSync3(RECOMMENDED_MODELS_JSON_PATH, "utf-8");
33626
+ const data = JSON.parse(content);
33627
+ return data.models || [];
33628
+ } catch {
33629
+ return [];
33630
+ }
33631
+ }
33632
+ return [];
33633
+ }
33634
+ async function fetchAllModels(forceUpdate = false) {
33635
+ if (!forceUpdate && existsSync3(ALL_MODELS_JSON_PATH)) {
33636
+ try {
33637
+ const cacheData = JSON.parse(readFileSync3(ALL_MODELS_JSON_PATH, "utf-8"));
33638
+ const lastUpdated = new Date(cacheData.lastUpdated);
33639
+ const now = new Date;
33640
+ const ageInDays = (now.getTime() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24);
33641
+ if (ageInDays <= CACHE_MAX_AGE_DAYS2) {
33642
+ return cacheData.models;
33643
+ }
33644
+ } catch {}
33645
+ }
33646
+ console.log("Fetching models from OpenRouter...");
33647
+ try {
33648
+ const response = await fetch("https://openrouter.ai/api/v1/models");
33649
+ if (!response.ok)
33650
+ throw new Error(`API returned ${response.status}`);
33651
+ const data = await response.json();
33652
+ const models = data.data;
33653
+ writeFileSync3(ALL_MODELS_JSON_PATH, JSON.stringify({
33654
+ lastUpdated: new Date().toISOString(),
33655
+ models
33656
+ }), "utf-8");
33657
+ console.log(`Cached ${models.length} models`);
33658
+ return models;
33659
+ } catch (error46) {
33660
+ console.error(`Failed to fetch models: ${error46}`);
33661
+ return [];
33662
+ }
33663
+ }
33664
+ function toModelInfo(model) {
33665
+ const provider = model.id.split("/")[0];
33666
+ const contextLen = model.context_length || model.top_provider?.context_length || 0;
33667
+ const promptPrice = parseFloat(model.pricing?.prompt || "0");
33668
+ const completionPrice = parseFloat(model.pricing?.completion || "0");
33669
+ const isFree = promptPrice === 0 && completionPrice === 0;
33670
+ let pricingStr = "N/A";
33671
+ if (isFree) {
33672
+ pricingStr = "FREE";
33673
+ } else if (model.pricing) {
33674
+ const avgPrice = (promptPrice + completionPrice) / 2;
33675
+ if (avgPrice < 0.001) {
33676
+ pricingStr = `$${(avgPrice * 1e6).toFixed(2)}/1M`;
33677
+ } else {
33678
+ pricingStr = `$${avgPrice.toFixed(4)}/1K`;
33679
+ }
33680
+ }
33681
+ return {
33682
+ id: model.id,
33683
+ name: model.name || model.id,
33684
+ description: model.description || "",
33685
+ provider: provider.charAt(0).toUpperCase() + provider.slice(1),
33686
+ pricing: {
33687
+ input: model.pricing?.prompt || "N/A",
33688
+ output: model.pricing?.completion || "N/A",
33689
+ average: pricingStr
33690
+ },
33691
+ context: contextLen > 0 ? `${Math.round(contextLen / 1000)}K` : "N/A",
33692
+ contextLength: contextLen,
33693
+ supportsTools: (model.supported_parameters || []).includes("tools"),
33694
+ supportsReasoning: (model.supported_parameters || []).includes("reasoning"),
33695
+ supportsVision: (model.architecture?.input_modalities || []).includes("image"),
33696
+ isFree
33697
+ };
33698
+ }
33699
+ async function getFreeModels() {
33700
+ const allModels = await fetchAllModels();
33701
+ const freeModels = allModels.filter((model) => {
33702
+ const promptPrice = parseFloat(model.pricing?.prompt || "0");
33703
+ const completionPrice = parseFloat(model.pricing?.completion || "0");
33704
+ const isFree = promptPrice === 0 && completionPrice === 0;
33705
+ if (!isFree)
33706
+ return false;
33707
+ const provider = model.id.split("/")[0].toLowerCase();
33708
+ return TRUSTED_FREE_PROVIDERS.includes(provider);
33709
+ });
33710
+ freeModels.sort((a, b) => {
33711
+ const contextA = a.context_length || a.top_provider?.context_length || 0;
33712
+ const contextB = b.context_length || b.top_provider?.context_length || 0;
33713
+ return contextB - contextA;
33714
+ });
33715
+ const seenBase = new Set;
33716
+ const dedupedModels = freeModels.filter((model) => {
33717
+ const baseId = model.id.replace(/:free$/, "");
33718
+ if (seenBase.has(baseId))
33719
+ return false;
33720
+ seenBase.add(baseId);
33721
+ return true;
33722
+ });
33723
+ return dedupedModels.slice(0, 20).map(toModelInfo);
33724
+ }
33725
+ async function getAllModelsForSearch() {
33726
+ const allModels = await fetchAllModels();
33727
+ return allModels.map(toModelInfo);
33728
+ }
33729
+ function formatModelChoice(model) {
33730
+ const caps = [
33731
+ model.supportsTools ? "T" : "",
33732
+ model.supportsReasoning ? "R" : "",
33733
+ model.supportsVision ? "V" : ""
33734
+ ].filter(Boolean).join("");
33735
+ const capsStr = caps ? ` [${caps}]` : "";
33736
+ const priceStr = model.pricing?.average || "N/A";
33737
+ const ctxStr = model.context || "N/A";
33738
+ return `${model.id} (${model.provider}, ${priceStr}, ${ctxStr}${capsStr})`;
33739
+ }
33740
+ function fuzzyMatch(text, query) {
33741
+ const lowerText = text.toLowerCase();
33742
+ const lowerQuery = query.toLowerCase();
33743
+ if (lowerText === lowerQuery)
33744
+ return 1;
33745
+ if (lowerText.includes(lowerQuery))
33746
+ return 0.8;
33747
+ let queryIdx = 0;
33748
+ let score = 0;
33749
+ for (let i = 0;i < lowerText.length && queryIdx < lowerQuery.length; i++) {
33750
+ if (lowerText[i] === lowerQuery[queryIdx]) {
33751
+ score++;
33752
+ queryIdx++;
33753
+ }
33754
+ }
33755
+ return queryIdx === lowerQuery.length ? score / lowerQuery.length * 0.6 : 0;
33756
+ }
33757
+ async function selectModel(options = {}) {
33758
+ const { freeOnly = false, recommended = true, message } = options;
33759
+ let models;
33760
+ if (freeOnly) {
33761
+ models = await getFreeModels();
33762
+ if (models.length === 0) {
33763
+ throw new Error("No free models available");
33764
+ }
33765
+ } else if (recommended) {
33766
+ const recommendedModels = loadRecommendedModels2();
33767
+ if (recommendedModels.length > 0) {
33768
+ models = recommendedModels;
33769
+ } else {
33770
+ const allModels = await getAllModelsForSearch();
33771
+ models = allModels.slice(0, 20);
33772
+ }
33773
+ } else {
33774
+ models = await getAllModelsForSearch();
33775
+ }
33776
+ const promptMessage = message || (freeOnly ? "Select a FREE model (type to search):" : "Select a model (type to search):");
33777
+ const selected = await dist_default4({
33778
+ message: promptMessage,
33779
+ source: async (term) => {
33780
+ if (!term) {
33781
+ return models.slice(0, 15).map((m) => ({
33782
+ name: formatModelChoice(m),
33783
+ value: m.id,
33784
+ description: m.description?.slice(0, 80)
33785
+ }));
33786
+ }
33787
+ const results = models.map((m) => ({
33788
+ model: m,
33789
+ score: Math.max(fuzzyMatch(m.id, term), fuzzyMatch(m.name, term), fuzzyMatch(m.provider, term) * 0.5)
33790
+ })).filter((r) => r.score > 0.1).sort((a, b) => b.score - a.score).slice(0, 15);
33791
+ return results.map((r) => ({
33792
+ name: formatModelChoice(r.model),
33793
+ value: r.model.id,
33794
+ description: r.model.description?.slice(0, 80)
33795
+ }));
33796
+ }
33797
+ });
33798
+ return selected;
33799
+ }
33800
+ async function selectModelsForProfile() {
33801
+ const allModels = await getAllModelsForSearch();
33802
+ console.log(`
33803
+ Configure models for each Claude tier:
33804
+ `);
33805
+ const selectForTier = async (tier, description) => {
33806
+ const useCustom = await dist_default2({
33807
+ message: `Configure ${tier} model? (${description})`,
33808
+ default: true
33809
+ });
33810
+ if (!useCustom)
33811
+ return;
33812
+ return dist_default4({
33813
+ message: `Select model for ${tier}:`,
33814
+ source: async (term) => {
33815
+ let filtered = allModels;
33816
+ if (term) {
33817
+ filtered = allModels.map((m) => ({
33818
+ model: m,
33819
+ score: Math.max(fuzzyMatch(m.id, term), fuzzyMatch(m.name, term), fuzzyMatch(m.provider, term) * 0.5)
33820
+ })).filter((r) => r.score > 0.1).sort((a, b) => b.score - a.score).slice(0, 15).map((r) => r.model);
33821
+ } else {
33822
+ filtered = filtered.slice(0, 15);
33823
+ }
33824
+ return filtered.map((m) => ({
33825
+ name: formatModelChoice(m),
33826
+ value: m.id,
33827
+ description: m.description?.slice(0, 80)
33828
+ }));
33829
+ }
33830
+ });
33831
+ };
33832
+ const opus = await selectForTier("Opus", "Most capable, used for complex reasoning");
33833
+ const sonnet = await selectForTier("Sonnet", "Balanced, used for general tasks");
33834
+ const haiku = await selectForTier("Haiku", "Fast & cheap, used for simple tasks");
33835
+ const subagent = await selectForTier("Subagent", "Used for spawned sub-agents");
33836
+ return { opus, sonnet, haiku, subagent };
33837
+ }
33838
+ async function promptForApiKey() {
33839
+ console.log(`
33840
+ OpenRouter API Key Required`);
33841
+ console.log(`Get your free API key from: https://openrouter.ai/keys
33842
+ `);
33843
+ const apiKey = await dist_default3({
33844
+ message: "Enter your OpenRouter API key:",
33845
+ validate: (value) => {
33846
+ if (!value.trim()) {
33847
+ return "API key cannot be empty";
33848
+ }
33849
+ if (!value.startsWith("sk-or-")) {
33850
+ return 'API key should start with "sk-or-"';
33851
+ }
33852
+ return true;
33853
+ }
33854
+ });
33855
+ return apiKey;
33856
+ }
33857
+ async function promptForProfileName(existing = []) {
33858
+ const name = await dist_default3({
33859
+ message: "Enter profile name:",
33860
+ validate: (value) => {
33861
+ const trimmed = value.trim();
33862
+ if (!trimmed) {
33863
+ return "Profile name cannot be empty";
33864
+ }
33865
+ if (!/^[a-z0-9-_]+$/i.test(trimmed)) {
33866
+ return "Profile name can only contain letters, numbers, hyphens, and underscores";
33867
+ }
33868
+ if (existing.includes(trimmed)) {
33869
+ return `Profile "${trimmed}" already exists`;
33870
+ }
33871
+ return true;
33872
+ }
33873
+ });
33874
+ return name.trim();
33875
+ }
33876
+ async function promptForProfileDescription() {
33877
+ const description = await dist_default3({
33878
+ message: "Enter profile description (optional):"
33879
+ });
33880
+ return description.trim();
33881
+ }
33882
+ async function selectProfile(profiles) {
33883
+ const selected = await dist_default5({
33884
+ message: "Select a profile:",
33885
+ choices: profiles.map((p) => ({
33886
+ name: p.isDefault ? `${p.name} (default)` : p.name,
33887
+ value: p.name,
33888
+ description: p.description
33889
+ }))
33890
+ });
33891
+ return selected;
33892
+ }
33893
+ async function confirmAction(message) {
33894
+ return dist_default2({ message, default: false });
33895
+ }
33896
+ var __filename3, __dirname3, ALL_MODELS_JSON_PATH, RECOMMENDED_MODELS_JSON_PATH, CACHE_MAX_AGE_DAYS2 = 2, TRUSTED_FREE_PROVIDERS;
33897
+ var init_model_selector = __esm(() => {
33898
+ init_dist8();
33899
+ __filename3 = fileURLToPath2(import.meta.url);
33900
+ __dirname3 = dirname2(__filename3);
33901
+ ALL_MODELS_JSON_PATH = join3(__dirname3, "../all-models.json");
33902
+ RECOMMENDED_MODELS_JSON_PATH = join3(__dirname3, "../recommended-models.json");
33903
+ TRUSTED_FREE_PROVIDERS = [
33904
+ "google",
33905
+ "openai",
33906
+ "x-ai",
33907
+ "deepseek",
33908
+ "qwen",
33909
+ "alibaba",
33910
+ "meta-llama",
33911
+ "microsoft",
33912
+ "mistralai",
33913
+ "nvidia",
33914
+ "cohere"
33915
+ ];
33916
+ });
33917
+
33918
+ // src/profile-commands.ts
33919
+ var exports_profile_commands = {};
33920
+ __export(exports_profile_commands, {
33921
+ profileUseCommand: () => profileUseCommand,
33922
+ profileShowCommand: () => profileShowCommand,
33923
+ profileRemoveCommand: () => profileRemoveCommand,
33924
+ profileListCommand: () => profileListCommand,
33925
+ profileEditCommand: () => profileEditCommand,
33926
+ profileCommand: () => profileCommand,
33927
+ profileAddCommand: () => profileAddCommand,
33928
+ initCommand: () => initCommand
33929
+ });
33930
+ async function initCommand() {
33931
+ console.log(`
33932
+ ${BOLD}${CYAN}Claudish Setup Wizard${RESET}
33933
+ `);
33934
+ if (configExists()) {
33935
+ const overwrite = await dist_default2({
33936
+ message: "Configuration already exists. Do you want to reconfigure?",
33937
+ default: false
33938
+ });
33939
+ if (!overwrite) {
33940
+ console.log("Setup cancelled.");
33941
+ return;
33942
+ }
33943
+ }
33944
+ console.log(`${DIM}This wizard will help you set up Claudish with your preferred models.${RESET}
33945
+ `);
33946
+ console.log(`${BOLD}Step 1: Create your default profile${RESET}
33947
+ `);
33948
+ const profileName = await promptForProfileName([]);
33949
+ const description = await promptForProfileDescription();
33950
+ console.log(`
33951
+ ${BOLD}Step 2: Select models for each Claude tier${RESET}`);
33952
+ console.log(`${DIM}These models will be used when Claude Code requests specific model types.${RESET}
33953
+ `);
33954
+ const models = await selectModelsForProfile();
33955
+ const profile = createProfile(profileName, models, description);
33956
+ setDefaultProfile(profileName);
33957
+ console.log(`
33958
+ ${GREEN}✓${RESET} Configuration saved to: ${CYAN}${getConfigPath()}${RESET}`);
33959
+ console.log(`
33960
+ ${BOLD}Profile created:${RESET}`);
33961
+ printProfile(profile, true);
33962
+ console.log(`
33963
+ ${BOLD}Usage:${RESET}`);
33964
+ console.log(` ${CYAN}claudish${RESET} # Use default profile`);
33965
+ console.log(` ${CYAN}claudish -p ${profileName}${RESET} # Use this profile explicitly`);
33966
+ console.log(` ${CYAN}claudish profile add${RESET} # Add another profile`);
33967
+ console.log("");
33968
+ }
33969
+ async function profileListCommand() {
33970
+ const profiles = listProfiles();
33971
+ const config3 = loadConfig();
33972
+ if (profiles.length === 0) {
33973
+ console.log("No profiles found. Run 'claudish init' to create one.");
33974
+ return;
33975
+ }
33976
+ console.log(`
33977
+ ${BOLD}Claudish Profiles${RESET}
33978
+ `);
33979
+ console.log(`${DIM}Config: ${getConfigPath()}${RESET}
33980
+ `);
33981
+ for (const profile of profiles) {
33982
+ const isDefault = profile.name === config3.defaultProfile;
33983
+ printProfile(profile, isDefault);
33984
+ console.log("");
33985
+ }
33986
+ }
33987
+ async function profileAddCommand() {
33988
+ console.log(`
33989
+ ${BOLD}${CYAN}Add New Profile${RESET}
33990
+ `);
33991
+ const existingNames = getProfileNames();
33992
+ const name = await promptForProfileName(existingNames);
33993
+ const description = await promptForProfileDescription();
33994
+ console.log(`
33995
+ ${BOLD}Select models for this profile:${RESET}
33996
+ `);
33997
+ const models = await selectModelsForProfile();
33998
+ const profile = createProfile(name, models, description);
33999
+ console.log(`
34000
+ ${GREEN}✓${RESET} Profile "${name}" created.`);
34001
+ printProfile(profile, false);
34002
+ const setAsDefault = await dist_default2({
34003
+ message: "Set this profile as default?",
34004
+ default: false
34005
+ });
34006
+ if (setAsDefault) {
34007
+ setDefaultProfile(name);
34008
+ console.log(`${GREEN}✓${RESET} "${name}" is now the default profile.`);
34009
+ }
34010
+ }
34011
+ async function profileRemoveCommand(name) {
34012
+ const profiles = getProfileNames();
34013
+ if (profiles.length === 0) {
34014
+ console.log("No profiles to remove.");
34015
+ return;
34016
+ }
34017
+ if (profiles.length === 1) {
34018
+ console.log("Cannot remove the last profile. Create another one first.");
34019
+ return;
34020
+ }
34021
+ let profileName = name;
34022
+ if (!profileName) {
34023
+ const profileList = listProfiles();
34024
+ profileName = await selectProfile(profileList.map((p) => ({
34025
+ name: p.name,
34026
+ description: p.description,
34027
+ isDefault: p.name === loadConfig().defaultProfile
34028
+ })));
34029
+ }
34030
+ const profile = getProfile(profileName);
34031
+ if (!profile) {
34032
+ console.log(`Profile "${profileName}" not found.`);
34033
+ return;
34034
+ }
34035
+ const confirmed = await confirmAction(`Are you sure you want to delete profile "${profileName}"?`);
34036
+ if (!confirmed) {
34037
+ console.log("Cancelled.");
34038
+ return;
34039
+ }
34040
+ try {
34041
+ deleteProfile(profileName);
34042
+ console.log(`${GREEN}✓${RESET} Profile "${profileName}" deleted.`);
34043
+ } catch (error46) {
34044
+ console.error(`Error: ${error46}`);
34045
+ }
34046
+ }
34047
+ async function profileUseCommand(name) {
34048
+ const profiles = getProfileNames();
34049
+ if (profiles.length === 0) {
34050
+ console.log("No profiles found. Run 'claudish init' to create one.");
34051
+ return;
34052
+ }
34053
+ let profileName = name;
34054
+ if (!profileName) {
34055
+ const profileList = listProfiles();
34056
+ profileName = await selectProfile(profileList.map((p) => ({
34057
+ name: p.name,
34058
+ description: p.description,
34059
+ isDefault: p.name === loadConfig().defaultProfile
34060
+ })));
34061
+ }
34062
+ const profile = getProfile(profileName);
34063
+ if (!profile) {
34064
+ console.log(`Profile "${profileName}" not found.`);
34065
+ return;
34066
+ }
34067
+ setDefaultProfile(profileName);
34068
+ console.log(`${GREEN}✓${RESET} "${profileName}" is now the default profile.`);
34069
+ }
34070
+ async function profileShowCommand(name) {
34071
+ let profileName = name;
34072
+ if (!profileName) {
34073
+ const config4 = loadConfig();
34074
+ profileName = config4.defaultProfile;
34075
+ }
34076
+ const profile = getProfile(profileName);
34077
+ if (!profile) {
34078
+ console.log(`Profile "${profileName}" not found.`);
34079
+ return;
34080
+ }
34081
+ const config3 = loadConfig();
34082
+ const isDefault = profileName === config3.defaultProfile;
34083
+ console.log("");
34084
+ printProfile(profile, isDefault, true);
34085
+ }
34086
+ async function profileEditCommand(name) {
34087
+ const profiles = getProfileNames();
34088
+ if (profiles.length === 0) {
34089
+ console.log("No profiles found. Run 'claudish init' to create one.");
34090
+ return;
34091
+ }
34092
+ let profileName = name;
34093
+ if (!profileName) {
34094
+ const profileList = listProfiles();
34095
+ profileName = await selectProfile(profileList.map((p) => ({
34096
+ name: p.name,
34097
+ description: p.description,
34098
+ isDefault: p.name === loadConfig().defaultProfile
34099
+ })));
34100
+ }
34101
+ const profile = getProfile(profileName);
34102
+ if (!profile) {
34103
+ console.log(`Profile "${profileName}" not found.`);
34104
+ return;
34105
+ }
34106
+ console.log(`
34107
+ ${BOLD}Editing profile: ${profileName}${RESET}
34108
+ `);
34109
+ console.log(`${DIM}Current models:${RESET}`);
34110
+ printModelMapping(profile.models);
34111
+ console.log("");
34112
+ const whatToEdit = await dist_default5({
34113
+ message: "What do you want to edit?",
34114
+ choices: [
34115
+ { name: "All models", value: "all" },
34116
+ { name: "Opus model only", value: "opus" },
34117
+ { name: "Sonnet model only", value: "sonnet" },
34118
+ { name: "Haiku model only", value: "haiku" },
34119
+ { name: "Subagent model only", value: "subagent" },
34120
+ { name: "Description", value: "description" },
34121
+ { name: "Cancel", value: "cancel" }
34122
+ ]
34123
+ });
34124
+ if (whatToEdit === "cancel") {
34125
+ return;
34126
+ }
34127
+ if (whatToEdit === "description") {
34128
+ const newDescription = await promptForProfileDescription();
34129
+ profile.description = newDescription;
34130
+ setProfile(profile);
34131
+ console.log(`${GREEN}✓${RESET} Description updated.`);
34132
+ return;
34133
+ }
34134
+ if (whatToEdit === "all") {
34135
+ const models = await selectModelsForProfile();
34136
+ profile.models = { ...profile.models, ...models };
34137
+ setProfile(profile);
34138
+ console.log(`${GREEN}✓${RESET} All models updated.`);
34139
+ return;
34140
+ }
34141
+ const tier = whatToEdit;
34142
+ const tierName = tier.charAt(0).toUpperCase() + tier.slice(1);
34143
+ const newModel = await selectModel({
34144
+ message: `Select new model for ${tierName}:`
34145
+ });
34146
+ profile.models[tier] = newModel;
34147
+ setProfile(profile);
34148
+ console.log(`${GREEN}✓${RESET} ${tierName} model updated to: ${newModel}`);
34149
+ }
34150
+ function printProfile(profile, isDefault, verbose = false) {
34151
+ const defaultBadge = isDefault ? ` ${YELLOW}(default)${RESET}` : "";
34152
+ console.log(`${BOLD}${profile.name}${RESET}${defaultBadge}`);
34153
+ if (profile.description) {
34154
+ console.log(` ${DIM}${profile.description}${RESET}`);
34155
+ }
34156
+ printModelMapping(profile.models);
34157
+ if (verbose) {
34158
+ console.log(` ${DIM}Created: ${profile.createdAt}${RESET}`);
34159
+ console.log(` ${DIM}Updated: ${profile.updatedAt}${RESET}`);
34160
+ }
34161
+ }
34162
+ function printModelMapping(models) {
34163
+ console.log(` ${CYAN}opus${RESET}: ${models.opus || DIM + "not set" + RESET}`);
34164
+ console.log(` ${CYAN}sonnet${RESET}: ${models.sonnet || DIM + "not set" + RESET}`);
34165
+ console.log(` ${CYAN}haiku${RESET}: ${models.haiku || DIM + "not set" + RESET}`);
34166
+ if (models.subagent) {
34167
+ console.log(` ${CYAN}subagent${RESET}: ${models.subagent}`);
34168
+ }
34169
+ }
34170
+ async function profileCommand(args) {
34171
+ const subcommand = args[0];
34172
+ const name = args[1];
34173
+ switch (subcommand) {
34174
+ case "list":
34175
+ case "ls":
34176
+ await profileListCommand();
34177
+ break;
34178
+ case "add":
34179
+ case "new":
34180
+ case "create":
34181
+ await profileAddCommand();
34182
+ break;
34183
+ case "remove":
34184
+ case "rm":
34185
+ case "delete":
34186
+ await profileRemoveCommand(name);
34187
+ break;
34188
+ case "use":
34189
+ case "default":
34190
+ case "set":
34191
+ await profileUseCommand(name);
34192
+ break;
34193
+ case "show":
34194
+ case "view":
34195
+ await profileShowCommand(name);
34196
+ break;
34197
+ case "edit":
34198
+ await profileEditCommand(name);
34199
+ break;
34200
+ default:
34201
+ printProfileHelp();
34202
+ }
34203
+ }
34204
+ function printProfileHelp() {
34205
+ console.log(`
34206
+ ${BOLD}Usage:${RESET} claudish profile <command> [options]
34207
+
34208
+ ${BOLD}Commands:${RESET}
34209
+ ${CYAN}list${RESET}, ${CYAN}ls${RESET} List all profiles
34210
+ ${CYAN}add${RESET}, ${CYAN}new${RESET} Add a new profile
34211
+ ${CYAN}remove${RESET} ${DIM}[name]${RESET} Remove a profile
34212
+ ${CYAN}use${RESET} ${DIM}[name]${RESET} Set default profile
34213
+ ${CYAN}show${RESET} ${DIM}[name]${RESET} Show profile details
34214
+ ${CYAN}edit${RESET} ${DIM}[name]${RESET} Edit a profile
34215
+
34216
+ ${BOLD}Examples:${RESET}
34217
+ claudish profile list
34218
+ claudish profile add
34219
+ claudish profile use frontend
34220
+ claudish profile remove debug
34221
+ `);
34222
+ }
34223
+ var RESET = "\x1B[0m", BOLD = "\x1B[1m", DIM = "\x1B[2m", GREEN = "\x1B[32m", YELLOW = "\x1B[33m", CYAN = "\x1B[36m";
34224
+ var init_profile_commands = __esm(() => {
34225
+ init_profile_config();
34226
+ init_model_selector();
34227
+ init_dist8();
34228
+ });
34229
+
31248
34230
  // src/config.ts
31249
34231
  var exports_config = {};
31250
34232
  __export(exports_config, {
@@ -31337,29 +34319,85 @@ __export(exports_claude_runner, {
31337
34319
  checkClaudeInstalled: () => checkClaudeInstalled
31338
34320
  });
31339
34321
  import { spawn } from "node:child_process";
31340
- import { writeFileSync as writeFileSync2, unlinkSync } from "node:fs";
31341
- import { tmpdir } from "node:os";
31342
- import { join as join2 } from "node:path";
34322
+ import { writeFileSync as writeFileSync4, unlinkSync } from "node:fs";
34323
+ import { tmpdir, platform } from "node:os";
34324
+ import { join as join4 } from "node:path";
34325
+ function createStatusLineScript(tokenFilePath) {
34326
+ const tempDir = tmpdir();
34327
+ const timestamp = Date.now();
34328
+ const scriptPath = join4(tempDir, `claudish-status-${timestamp}.js`);
34329
+ const escapedTokenPath = tokenFilePath.replace(/\\/g, "\\\\");
34330
+ const script = `
34331
+ const fs = require('fs');
34332
+ const path = require('path');
34333
+
34334
+ const CYAN = "\\x1b[96m";
34335
+ const YELLOW = "\\x1b[93m";
34336
+ const GREEN = "\\x1b[92m";
34337
+ const MAGENTA = "\\x1b[95m";
34338
+ const DIM = "\\x1b[2m";
34339
+ const RESET = "\\x1b[0m";
34340
+ const BOLD = "\\x1b[1m";
34341
+
34342
+ let input = '';
34343
+ process.stdin.setEncoding('utf8');
34344
+ process.stdin.on('data', chunk => input += chunk);
34345
+ process.stdin.on('end', () => {
34346
+ try {
34347
+ let dir = path.basename(process.cwd());
34348
+ if (dir.length > 15) dir = dir.substring(0, 12) + '...';
34349
+
34350
+ let ctx = 100, cost = 0;
34351
+ const model = process.env.CLAUDISH_ACTIVE_MODEL_NAME || 'unknown';
34352
+
34353
+ try {
34354
+ const tokens = JSON.parse(fs.readFileSync('${escapedTokenPath}', 'utf-8'));
34355
+ cost = tokens.total_cost || 0;
34356
+ ctx = tokens.context_left_percent || 100;
34357
+ } catch (e) {
34358
+ try {
34359
+ const json = JSON.parse(input);
34360
+ cost = json.total_cost_usd || 0;
34361
+ } catch {}
34362
+ }
34363
+
34364
+ const costStr = cost.toFixed(3);
34365
+ console.log(\`\${CYAN}\${BOLD}\${dir}\${RESET} \${DIM}•\${RESET} \${YELLOW}\${model}\${RESET} \${DIM}•\${RESET} \${GREEN}$\${costStr}\${RESET} \${DIM}•\${RESET} \${MAGENTA}\${ctx}%\${RESET}\`);
34366
+ } catch (e) {
34367
+ console.log('claudish');
34368
+ }
34369
+ });
34370
+ `;
34371
+ writeFileSync4(scriptPath, script, "utf-8");
34372
+ return scriptPath;
34373
+ }
31343
34374
  function createTempSettingsFile(modelDisplay, port) {
31344
34375
  const tempDir = tmpdir();
31345
34376
  const timestamp = Date.now();
31346
- const tempPath = join2(tempDir, `claudish-settings-${timestamp}.json`);
31347
- const CYAN = "\\033[96m";
31348
- const YELLOW = "\\033[93m";
31349
- const GREEN = "\\033[92m";
31350
- const MAGENTA = "\\033[95m";
31351
- const DIM = "\\033[2m";
31352
- const RESET = "\\033[0m";
31353
- const BOLD = "\\033[1m";
31354
- const tokenFilePath = `/tmp/claudish-tokens-${port}.json`;
34377
+ const tempPath = join4(tempDir, `claudish-settings-${timestamp}.json`);
34378
+ const tokenFilePath = join4(tempDir, `claudish-tokens-${port}.json`);
34379
+ let statusCommand;
34380
+ if (isWindows) {
34381
+ const scriptPath = createStatusLineScript(tokenFilePath);
34382
+ statusCommand = `node "${scriptPath}"`;
34383
+ } else {
34384
+ const CYAN2 = "\\033[96m";
34385
+ const YELLOW2 = "\\033[93m";
34386
+ const GREEN2 = "\\033[92m";
34387
+ const MAGENTA = "\\033[95m";
34388
+ const DIM2 = "\\033[2m";
34389
+ const RESET2 = "\\033[0m";
34390
+ const BOLD2 = "\\033[1m";
34391
+ statusCommand = `JSON=$(cat) && DIR=$(basename "$(pwd)") && [ \${#DIR} -gt 15 ] && DIR="\${DIR:0:12}..." || true && CTX=100 && COST="0" && if [ -f "${tokenFilePath}" ]; then TOKENS=$(cat "${tokenFilePath}" 2>/dev/null) && REAL_COST=$(echo "$TOKENS" | grep -o '"total_cost":[0-9.]*' | cut -d: -f2) && REAL_CTX=$(echo "$TOKENS" | grep -o '"context_left_percent":[0-9]*' | grep -o '[0-9]*') && if [ ! -z "$REAL_COST" ]; then COST="$REAL_COST"; else COST=$(echo "$JSON" | grep -o '"total_cost_usd":[0-9.]*' | cut -d: -f2); fi && if [ ! -z "$REAL_CTX" ]; then CTX="$REAL_CTX"; fi; else COST=$(echo "$JSON" | grep -o '"total_cost_usd":[0-9.]*' | cut -d: -f2); fi && [ -z "$COST" ] && COST="0" || true && printf "${CYAN2}${BOLD2}%s${RESET2} ${DIM2}•${RESET2} ${YELLOW2}%s${RESET2} ${DIM2}•${RESET2} ${GREEN2}\\$%.3f${RESET2} ${DIM2}•${RESET2} ${MAGENTA}%s%%${RESET2}\\n" "$DIR" "$CLAUDISH_ACTIVE_MODEL_NAME" "$COST" "$CTX"`;
34392
+ }
31355
34393
  const settings = {
31356
34394
  statusLine: {
31357
34395
  type: "command",
31358
- command: `JSON=$(cat) && DIR=$(basename "$(pwd)") && [ \${#DIR} -gt 15 ] && DIR="\${DIR:0:12}..." || true && CTX=100 && COST="0" && if [ -f "${tokenFilePath}" ]; then TOKENS=$(cat "${tokenFilePath}" 2>/dev/null) && REAL_COST=$(echo "$TOKENS" | grep -o '"total_cost":[0-9.]*' | cut -d: -f2) && REAL_CTX=$(echo "$TOKENS" | grep -o '"context_left_percent":[0-9]*' | grep -o '[0-9]*') && if [ ! -z "$REAL_COST" ]; then COST="$REAL_COST"; else COST=$(echo "$JSON" | grep -o '"total_cost_usd":[0-9.]*' | cut -d: -f2); fi && if [ ! -z "$REAL_CTX" ]; then CTX="$REAL_CTX"; fi; else COST=$(echo "$JSON" | grep -o '"total_cost_usd":[0-9.]*' | cut -d: -f2); fi && [ -z "$COST" ] && COST="0" || true && printf "${CYAN}${BOLD}%s${RESET} ${DIM}•${RESET} ${YELLOW}%s${RESET} ${DIM}•${RESET} ${GREEN}\\$%.3f${RESET} ${DIM}•${RESET} ${MAGENTA}%s%%${RESET}\\n" "$DIR" "$CLAUDISH_ACTIVE_MODEL_NAME" "$COST" "$CTX"`,
34396
+ command: statusCommand,
31359
34397
  padding: 0
31360
34398
  }
31361
34399
  };
31362
- writeFileSync2(tempPath, JSON.stringify(settings, null, 2), "utf-8");
34400
+ writeFileSync4(tempPath, JSON.stringify(settings, null, 2), "utf-8");
31363
34401
  return tempPath;
31364
34402
  }
31365
34403
  async function runClaudeWithProxy(config3, proxyUrl) {
@@ -31425,7 +34463,8 @@ async function runClaudeWithProxy(config3, proxyUrl) {
31425
34463
  }
31426
34464
  const proc = spawn("claude", claudeArgs, {
31427
34465
  env,
31428
- stdio: "inherit"
34466
+ stdio: "inherit",
34467
+ shell: isWindows
31429
34468
  });
31430
34469
  setupSignalHandlers(proc, tempSettingsPath, config3.quiet);
31431
34470
  const exitCode = await new Promise((resolve) => {
@@ -31439,8 +34478,8 @@ async function runClaudeWithProxy(config3, proxyUrl) {
31439
34478
  return exitCode;
31440
34479
  }
31441
34480
  function setupSignalHandlers(proc, tempSettingsPath, quiet) {
31442
- const signals = ["SIGINT", "SIGTERM", "SIGHUP"];
31443
- for (const signal of signals) {
34481
+ const signals2 = isWindows ? ["SIGINT", "SIGTERM"] : ["SIGINT", "SIGTERM", "SIGHUP"];
34482
+ for (const signal of signals2) {
31444
34483
  process.on(signal, () => {
31445
34484
  if (!quiet) {
31446
34485
  console.log(`
@@ -31456,8 +34495,11 @@ function setupSignalHandlers(proc, tempSettingsPath, quiet) {
31456
34495
  }
31457
34496
  async function checkClaudeInstalled() {
31458
34497
  try {
31459
- const proc = spawn("which", ["claude"], {
31460
- stdio: "ignore"
34498
+ const isWindows2 = process.platform === "win32";
34499
+ const command = isWindows2 ? "where" : "which";
34500
+ const proc = spawn(command, ["claude"], {
34501
+ stdio: "ignore",
34502
+ shell: isWindows2
31461
34503
  });
31462
34504
  const exitCode = await new Promise((resolve) => {
31463
34505
  proc.on("exit", (code) => {
@@ -31469,8 +34511,10 @@ async function checkClaudeInstalled() {
31469
34511
  return false;
31470
34512
  }
31471
34513
  }
34514
+ var isWindows;
31472
34515
  var init_claude_runner = __esm(() => {
31473
34516
  init_config();
34517
+ isWindows = platform() === "win32";
31474
34518
  });
31475
34519
 
31476
34520
  // src/types.ts
@@ -31493,17 +34537,17 @@ var init_types4 = __esm(() => {
31493
34537
  });
31494
34538
 
31495
34539
  // src/model-loader.ts
31496
- import { readFileSync as readFileSync2, existsSync as existsSync2 } from "node:fs";
31497
- import { join as join3, dirname as dirname2 } from "node:path";
31498
- import { fileURLToPath as fileURLToPath2 } from "node:url";
34540
+ import { readFileSync as readFileSync4, existsSync as existsSync4 } from "node:fs";
34541
+ import { join as join5, dirname as dirname3 } from "node:path";
34542
+ import { fileURLToPath as fileURLToPath3 } from "node:url";
31499
34543
  function loadModelInfo() {
31500
34544
  if (_cachedModelInfo) {
31501
34545
  return _cachedModelInfo;
31502
34546
  }
31503
- const jsonPath = join3(__dirname3, "../recommended-models.json");
31504
- if (existsSync2(jsonPath)) {
34547
+ const jsonPath = join5(__dirname4, "../recommended-models.json");
34548
+ if (existsSync4(jsonPath)) {
31505
34549
  try {
31506
- const jsonContent = readFileSync2(jsonPath, "utf-8");
34550
+ const jsonContent = readFileSync4(jsonPath, "utf-8");
31507
34551
  const data = JSON.parse(jsonContent);
31508
34552
  const modelInfo = {};
31509
34553
  for (const model of data.models) {
@@ -31535,10 +34579,10 @@ function getAvailableModels() {
31535
34579
  if (_cachedModelIds) {
31536
34580
  return _cachedModelIds;
31537
34581
  }
31538
- const jsonPath = join3(__dirname3, "../recommended-models.json");
31539
- if (existsSync2(jsonPath)) {
34582
+ const jsonPath = join5(__dirname4, "../recommended-models.json");
34583
+ if (existsSync4(jsonPath)) {
31540
34584
  try {
31541
- const jsonContent = readFileSync2(jsonPath, "utf-8");
34585
+ const jsonContent = readFileSync4(jsonPath, "utf-8");
31542
34586
  const data = JSON.parse(jsonContent);
31543
34587
  const modelIds = data.models.sort((a, b) => a.priority - b.priority).map((m) => m.id);
31544
34588
  const result = [...modelIds, "custom"];
@@ -31573,10 +34617,10 @@ async function fetchModelContextWindow(modelId) {
31573
34617
  try {
31574
34618
  const modelMetadata = loadModelInfo();
31575
34619
  } catch (e) {}
31576
- const jsonPath = join3(__dirname3, "../recommended-models.json");
31577
- if (existsSync2(jsonPath)) {
34620
+ const jsonPath = join5(__dirname4, "../recommended-models.json");
34621
+ if (existsSync4(jsonPath)) {
31578
34622
  try {
31579
- const jsonContent = readFileSync2(jsonPath, "utf-8");
34623
+ const jsonContent = readFileSync4(jsonPath, "utf-8");
31580
34624
  const data = JSON.parse(jsonContent);
31581
34625
  const model = data.models.find((m) => m.id === modelId);
31582
34626
  if (model && model.context) {
@@ -31605,10 +34649,10 @@ async function doesModelSupportReasoning(modelId) {
31605
34649
  }
31606
34650
  return false;
31607
34651
  }
31608
- var __filename3, __dirname3, _cachedModelInfo = null, _cachedModelIds = null, _cachedOpenRouterModels = null;
34652
+ var __filename4, __dirname4, _cachedModelInfo = null, _cachedModelIds = null, _cachedOpenRouterModels = null;
31609
34653
  var init_model_loader = __esm(() => {
31610
- __filename3 = fileURLToPath2(import.meta.url);
31611
- __dirname3 = dirname2(__filename3);
34654
+ __filename4 = fileURLToPath3(import.meta.url);
34655
+ __dirname4 = dirname3(__filename4);
31612
34656
  });
31613
34657
 
31614
34658
  // src/utils.ts
@@ -31652,9 +34696,9 @@ __export(exports_cli, {
31652
34696
  parseArgs: () => parseArgs,
31653
34697
  getVersion: () => getVersion
31654
34698
  });
31655
- import { readFileSync as readFileSync3, writeFileSync as writeFileSync4, existsSync as existsSync3, mkdirSync, copyFileSync } from "node:fs";
31656
- import { fileURLToPath as fileURLToPath3 } from "node:url";
31657
- import { dirname as dirname3, join as join4 } from "node:path";
34699
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync6, existsSync as existsSync5, mkdirSync as mkdirSync2, copyFileSync } from "node:fs";
34700
+ import { fileURLToPath as fileURLToPath4 } from "node:url";
34701
+ import { dirname as dirname4, join as join6 } from "node:path";
31658
34702
  function getVersion() {
31659
34703
  return VERSION;
31660
34704
  }
@@ -31718,7 +34762,7 @@ async function parseArgs(args) {
31718
34762
  const val = args[++i];
31719
34763
  if (val)
31720
34764
  config3.modelSubagent = val;
31721
- } else if (arg === "--port" || arg === "-p") {
34765
+ } else if (arg === "--port") {
31722
34766
  const portArg = args[++i];
31723
34767
  if (!portArg) {
31724
34768
  console.error("--port requires a value");
@@ -31757,6 +34801,13 @@ async function parseArgs(args) {
31757
34801
  config3.stdin = true;
31758
34802
  } else if (arg === "--free") {
31759
34803
  config3.freeOnly = true;
34804
+ } else if (arg === "--profile" || arg === "-p") {
34805
+ const profileArg = args[++i];
34806
+ if (!profileArg) {
34807
+ console.error("--profile requires a profile name");
34808
+ process.exit(1);
34809
+ }
34810
+ config3.profile = profileArg;
31760
34811
  } else if (arg === "--cost-tracker") {
31761
34812
  config3.costTracking = true;
31762
34813
  if (!config3.monitor) {
@@ -31844,17 +34895,32 @@ async function parseArgs(args) {
31844
34895
  if (config3.jsonOutput) {
31845
34896
  config3.quiet = true;
31846
34897
  }
34898
+ if (config3.profile || !config3.modelOpus || !config3.modelSonnet || !config3.modelHaiku || !config3.modelSubagent) {
34899
+ const profileModels = getModelMapping(config3.profile);
34900
+ if (!config3.modelOpus && profileModels.opus) {
34901
+ config3.modelOpus = profileModels.opus;
34902
+ }
34903
+ if (!config3.modelSonnet && profileModels.sonnet) {
34904
+ config3.modelSonnet = profileModels.sonnet;
34905
+ }
34906
+ if (!config3.modelHaiku && profileModels.haiku) {
34907
+ config3.modelHaiku = profileModels.haiku;
34908
+ }
34909
+ if (!config3.modelSubagent && profileModels.subagent) {
34910
+ config3.modelSubagent = profileModels.subagent;
34911
+ }
34912
+ }
31847
34913
  return config3;
31848
34914
  }
31849
34915
  async function searchAndPrintModels(query, forceUpdate) {
31850
34916
  let models = [];
31851
- if (!forceUpdate && existsSync3(ALL_MODELS_JSON_PATH)) {
34917
+ if (!forceUpdate && existsSync5(ALL_MODELS_JSON_PATH2)) {
31852
34918
  try {
31853
- const cacheData = JSON.parse(readFileSync3(ALL_MODELS_JSON_PATH, "utf-8"));
34919
+ const cacheData = JSON.parse(readFileSync5(ALL_MODELS_JSON_PATH2, "utf-8"));
31854
34920
  const lastUpdated = new Date(cacheData.lastUpdated);
31855
34921
  const now = new Date;
31856
34922
  const ageInDays = (now.getTime() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24);
31857
- if (ageInDays <= CACHE_MAX_AGE_DAYS2) {
34923
+ if (ageInDays <= CACHE_MAX_AGE_DAYS3) {
31858
34924
  models = cacheData.models;
31859
34925
  }
31860
34926
  } catch (e) {}
@@ -31867,7 +34933,7 @@ async function searchAndPrintModels(query, forceUpdate) {
31867
34933
  throw new Error(`API returned ${response.status}`);
31868
34934
  const data = await response.json();
31869
34935
  models = data.data;
31870
- writeFileSync4(ALL_MODELS_JSON_PATH, JSON.stringify({
34936
+ writeFileSync6(ALL_MODELS_JSON_PATH2, JSON.stringify({
31871
34937
  lastUpdated: new Date().toISOString(),
31872
34938
  models
31873
34939
  }), "utf-8");
@@ -31923,13 +34989,13 @@ Found ${results.length} matching models:
31923
34989
  }
31924
34990
  async function printAllModels(jsonOutput, forceUpdate) {
31925
34991
  let models = [];
31926
- if (!forceUpdate && existsSync3(ALL_MODELS_JSON_PATH)) {
34992
+ if (!forceUpdate && existsSync5(ALL_MODELS_JSON_PATH2)) {
31927
34993
  try {
31928
- const cacheData = JSON.parse(readFileSync3(ALL_MODELS_JSON_PATH, "utf-8"));
34994
+ const cacheData = JSON.parse(readFileSync5(ALL_MODELS_JSON_PATH2, "utf-8"));
31929
34995
  const lastUpdated = new Date(cacheData.lastUpdated);
31930
34996
  const now = new Date;
31931
34997
  const ageInDays = (now.getTime() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24);
31932
- if (ageInDays <= CACHE_MAX_AGE_DAYS2) {
34998
+ if (ageInDays <= CACHE_MAX_AGE_DAYS3) {
31933
34999
  models = cacheData.models;
31934
35000
  if (!jsonOutput) {
31935
35001
  console.error(`✓ Using cached models (last updated: ${cacheData.lastUpdated.split("T")[0]})`);
@@ -31945,7 +35011,7 @@ async function printAllModels(jsonOutput, forceUpdate) {
31945
35011
  throw new Error(`API returned ${response.status}`);
31946
35012
  const data = await response.json();
31947
35013
  models = data.data;
31948
- writeFileSync4(ALL_MODELS_JSON_PATH, JSON.stringify({
35014
+ writeFileSync6(ALL_MODELS_JSON_PATH2, JSON.stringify({
31949
35015
  lastUpdated: new Date().toISOString(),
31950
35016
  models
31951
35017
  }), "utf-8");
@@ -32014,11 +35080,11 @@ All OpenRouter Models (${models.length} total):
32014
35080
  console.log("Top models: claudish --top-models");
32015
35081
  }
32016
35082
  function isCacheStale() {
32017
- if (!existsSync3(MODELS_JSON_PATH)) {
35083
+ if (!existsSync5(MODELS_JSON_PATH)) {
32018
35084
  return true;
32019
35085
  }
32020
35086
  try {
32021
- const jsonContent = readFileSync3(MODELS_JSON_PATH, "utf-8");
35087
+ const jsonContent = readFileSync5(MODELS_JSON_PATH, "utf-8");
32022
35088
  const data = JSON.parse(jsonContent);
32023
35089
  if (!data.lastUpdated) {
32024
35090
  return true;
@@ -32026,7 +35092,7 @@ function isCacheStale() {
32026
35092
  const lastUpdated = new Date(data.lastUpdated);
32027
35093
  const now = new Date;
32028
35094
  const ageInDays = (now.getTime() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24);
32029
- return ageInDays > CACHE_MAX_AGE_DAYS2;
35095
+ return ageInDays > CACHE_MAX_AGE_DAYS3;
32030
35096
  } catch (error46) {
32031
35097
  return true;
32032
35098
  }
@@ -32114,9 +35180,9 @@ async function updateModelsFromOpenRouter() {
32114
35180
  providers.add(provider);
32115
35181
  }
32116
35182
  let version2 = "1.1.5";
32117
- if (existsSync3(MODELS_JSON_PATH)) {
35183
+ if (existsSync5(MODELS_JSON_PATH)) {
32118
35184
  try {
32119
- const existing = JSON.parse(readFileSync3(MODELS_JSON_PATH, "utf-8"));
35185
+ const existing = JSON.parse(readFileSync5(MODELS_JSON_PATH, "utf-8"));
32120
35186
  version2 = existing.version || version2;
32121
35187
  } catch {}
32122
35188
  }
@@ -32126,7 +35192,7 @@ async function updateModelsFromOpenRouter() {
32126
35192
  source: "https://openrouter.ai/models?categories=programming&fmt=cards&order=top-weekly",
32127
35193
  models: recommendations
32128
35194
  };
32129
- writeFileSync4(MODELS_JSON_PATH, JSON.stringify(updatedData, null, 2), "utf-8");
35195
+ writeFileSync6(MODELS_JSON_PATH, JSON.stringify(updatedData, null, 2), "utf-8");
32130
35196
  console.error(`✅ Updated ${recommendations.length} models (last updated: ${updatedData.lastUpdated})`);
32131
35197
  } catch (error46) {
32132
35198
  console.error(`❌ Failed to update models: ${error46 instanceof Error ? error46.message : String(error46)}`);
@@ -32144,7 +35210,7 @@ async function checkAndUpdateModelsCache(forceUpdate = false) {
32144
35210
  await updateModelsFromOpenRouter();
32145
35211
  } else {
32146
35212
  try {
32147
- const data = JSON.parse(readFileSync3(MODELS_JSON_PATH, "utf-8"));
35213
+ const data = JSON.parse(readFileSync5(MODELS_JSON_PATH, "utf-8"));
32148
35214
  console.error(`✓ Using cached models (last updated: ${data.lastUpdated})`);
32149
35215
  } catch {}
32150
35216
  }
@@ -32163,7 +35229,8 @@ USAGE:
32163
35229
  OPTIONS:
32164
35230
  -i, --interactive Run in interactive mode (default when no prompt given)
32165
35231
  -m, --model <model> OpenRouter model to use (required for single-shot mode)
32166
- -p, --port <port> Proxy server port (default: random)
35232
+ -p, --profile <name> Use named profile for model mapping (default: uses default profile)
35233
+ --port <port> Proxy server port (default: random)
32167
35234
  -d, --debug Enable debug logging to file (logs/claudish_*.log)
32168
35235
  --log-level <level> Log verbosity: debug (full), info (truncated), minimal (labels only)
32169
35236
  -q, --quiet Suppress [claudish] log messages (default in single-shot mode)
@@ -32187,6 +35254,15 @@ OPTIONS:
32187
35254
  --help-ai Show AI agent usage guide (file-based patterns, sub-agents)
32188
35255
  --init Install Claudish skill in current project (.claude/skills/)
32189
35256
 
35257
+ PROFILE MANAGEMENT:
35258
+ claudish init Setup wizard - create config and first profile
35259
+ claudish profile list List all profiles
35260
+ claudish profile add Add a new profile
35261
+ claudish profile remove Remove a profile (interactive or claudish profile remove <name>)
35262
+ claudish profile use Set default profile (interactive or claudish profile use <name>)
35263
+ claudish profile show Show profile details (default profile or claudish profile show <name>)
35264
+ claudish profile edit Edit a profile (interactive or claudish profile edit <name>)
35265
+
32190
35266
  MODEL MAPPING (per-role override):
32191
35267
  --model-opus <model> Model for Opus role (planning, complex tasks)
32192
35268
  --model-sonnet <model> Model for Sonnet role (default coding)
@@ -32244,6 +35320,10 @@ EXAMPLES:
32244
35320
  # Per-role model mapping (use different models for different Claude Code roles)
32245
35321
  claudish --model-opus openai/gpt-5 --model-sonnet x-ai/grok-code-fast-1 --model-haiku minimax/minimax-m2
32246
35322
 
35323
+ # Use named profiles for pre-configured model mappings
35324
+ claudish -p frontend "implement component"
35325
+ claudish --profile debug "investigate error"
35326
+
32247
35327
  # Hybrid: Native Anthropic for Opus, OpenRouter for Sonnet/Haiku
32248
35328
  claudish --model-opus claude-3-opus-20240229 --model-sonnet x-ai/grok-code-fast-1
32249
35329
 
@@ -32290,8 +35370,8 @@ MORE INFO:
32290
35370
  }
32291
35371
  function printAIAgentGuide() {
32292
35372
  try {
32293
- const guidePath = join4(__dirname4, "../AI_AGENT_GUIDE.md");
32294
- const guideContent = readFileSync3(guidePath, "utf-8");
35373
+ const guidePath = join6(__dirname5, "../AI_AGENT_GUIDE.md");
35374
+ const guideContent = readFileSync5(guidePath, "utf-8");
32295
35375
  console.log(guideContent);
32296
35376
  } catch (error46) {
32297
35377
  console.error("Error reading AI Agent Guide:");
@@ -32307,19 +35387,19 @@ async function initializeClaudishSkill() {
32307
35387
  console.log(`\uD83D\uDD27 Initializing Claudish skill in current project...
32308
35388
  `);
32309
35389
  const cwd = process.cwd();
32310
- const claudeDir = join4(cwd, ".claude");
32311
- const skillsDir = join4(claudeDir, "skills");
32312
- const claudishSkillDir = join4(skillsDir, "claudish-usage");
32313
- const skillFile = join4(claudishSkillDir, "SKILL.md");
32314
- if (existsSync3(skillFile)) {
35390
+ const claudeDir = join6(cwd, ".claude");
35391
+ const skillsDir = join6(claudeDir, "skills");
35392
+ const claudishSkillDir = join6(skillsDir, "claudish-usage");
35393
+ const skillFile = join6(claudishSkillDir, "SKILL.md");
35394
+ if (existsSync5(skillFile)) {
32315
35395
  console.log("✅ Claudish skill already installed at:");
32316
35396
  console.log(` ${skillFile}
32317
35397
  `);
32318
35398
  console.log("\uD83D\uDCA1 To reinstall, delete the file and run 'claudish --init' again.");
32319
35399
  return;
32320
35400
  }
32321
- const sourceSkillPath = join4(__dirname4, "../skills/claudish-usage/SKILL.md");
32322
- if (!existsSync3(sourceSkillPath)) {
35401
+ const sourceSkillPath = join6(__dirname5, "../skills/claudish-usage/SKILL.md");
35402
+ if (!existsSync5(sourceSkillPath)) {
32323
35403
  console.error("❌ Error: Claudish skill file not found in installation.");
32324
35404
  console.error(` Expected at: ${sourceSkillPath}`);
32325
35405
  console.error(`
@@ -32328,16 +35408,16 @@ async function initializeClaudishSkill() {
32328
35408
  process.exit(1);
32329
35409
  }
32330
35410
  try {
32331
- if (!existsSync3(claudeDir)) {
32332
- mkdirSync(claudeDir, { recursive: true });
35411
+ if (!existsSync5(claudeDir)) {
35412
+ mkdirSync2(claudeDir, { recursive: true });
32333
35413
  console.log("\uD83D\uDCC1 Created .claude/ directory");
32334
35414
  }
32335
- if (!existsSync3(skillsDir)) {
32336
- mkdirSync(skillsDir, { recursive: true });
35415
+ if (!existsSync5(skillsDir)) {
35416
+ mkdirSync2(skillsDir, { recursive: true });
32337
35417
  console.log("\uD83D\uDCC1 Created .claude/skills/ directory");
32338
35418
  }
32339
- if (!existsSync3(claudishSkillDir)) {
32340
- mkdirSync(claudishSkillDir, { recursive: true });
35419
+ if (!existsSync5(claudishSkillDir)) {
35420
+ mkdirSync2(claudishSkillDir, { recursive: true });
32341
35421
  console.log("\uD83D\uDCC1 Created .claude/skills/claudish-usage/ directory");
32342
35422
  }
32343
35423
  copyFileSync(sourceSkillPath, skillFile);
@@ -32379,8 +35459,8 @@ function printAvailableModels() {
32379
35459
  let lastUpdated = "unknown";
32380
35460
  let models = [];
32381
35461
  try {
32382
- if (existsSync3(MODELS_JSON_PATH)) {
32383
- const data = JSON.parse(readFileSync3(MODELS_JSON_PATH, "utf-8"));
35462
+ if (existsSync5(MODELS_JSON_PATH)) {
35463
+ const data = JSON.parse(readFileSync5(MODELS_JSON_PATH, "utf-8"));
32384
35464
  lastUpdated = data.lastUpdated || "unknown";
32385
35465
  models = data.models || [];
32386
35466
  }
@@ -32431,9 +35511,9 @@ Force update: claudish --list-models --force-update
32431
35511
  `);
32432
35512
  }
32433
35513
  function printAvailableModelsJSON() {
32434
- const jsonPath = join4(__dirname4, "../recommended-models.json");
35514
+ const jsonPath = join6(__dirname5, "../recommended-models.json");
32435
35515
  try {
32436
- const jsonContent = readFileSync3(jsonPath, "utf-8");
35516
+ const jsonContent = readFileSync5(jsonPath, "utf-8");
32437
35517
  const data = JSON.parse(jsonContent);
32438
35518
  console.log(JSON.stringify(data, null, 2));
32439
35519
  } catch (error46) {
@@ -32457,325 +35537,17 @@ function printAvailableModelsJSON() {
32457
35537
  console.log(JSON.stringify(output, null, 2));
32458
35538
  }
32459
35539
  }
32460
- var __filename4, __dirname4, packageJson, VERSION, CACHE_MAX_AGE_DAYS2 = 2, MODELS_JSON_PATH, ALL_MODELS_JSON_PATH;
35540
+ var __filename5, __dirname5, packageJson, VERSION, CACHE_MAX_AGE_DAYS3 = 2, MODELS_JSON_PATH, ALL_MODELS_JSON_PATH2;
32461
35541
  var init_cli = __esm(() => {
32462
35542
  init_config();
32463
35543
  init_model_loader();
32464
- __filename4 = fileURLToPath3(import.meta.url);
32465
- __dirname4 = dirname3(__filename4);
32466
- packageJson = JSON.parse(readFileSync3(join4(__dirname4, "../package.json"), "utf-8"));
32467
- VERSION = packageJson.version;
32468
- MODELS_JSON_PATH = join4(__dirname4, "../recommended-models.json");
32469
- ALL_MODELS_JSON_PATH = join4(__dirname4, "../all-models.json");
32470
- });
32471
-
32472
- // src/simple-selector.ts
32473
- var exports_simple_selector = {};
32474
- __export(exports_simple_selector, {
32475
- selectModelInteractively: () => selectModelInteractively,
32476
- promptForApiKey: () => promptForApiKey
32477
- });
32478
- import { createInterface } from "readline";
32479
- import { readFileSync as readFileSync4, writeFileSync as writeFileSync5, existsSync as existsSync4 } from "node:fs";
32480
- import { join as join5, dirname as dirname4 } from "node:path";
32481
- import { fileURLToPath as fileURLToPath4 } from "node:url";
32482
- function loadEnhancedModels() {
32483
- const jsonPath = join5(__dirname5, "../recommended-models.json");
32484
- if (existsSync4(jsonPath)) {
32485
- try {
32486
- const jsonContent = readFileSync4(jsonPath, "utf-8");
32487
- const data = JSON.parse(jsonContent);
32488
- return data.models || [];
32489
- } catch {
32490
- return [];
32491
- }
32492
- }
32493
- return [];
32494
- }
32495
- async function loadFreeModels() {
32496
- let allModels = [];
32497
- if (existsSync4(ALL_MODELS_JSON_PATH2)) {
32498
- try {
32499
- const cacheData = JSON.parse(readFileSync4(ALL_MODELS_JSON_PATH2, "utf-8"));
32500
- const lastUpdated = new Date(cacheData.lastUpdated);
32501
- const now = new Date;
32502
- const ageInDays = (now.getTime() - lastUpdated.getTime()) / (1000 * 60 * 60 * 24);
32503
- if (ageInDays <= CACHE_MAX_AGE_DAYS3) {
32504
- allModels = cacheData.models;
32505
- }
32506
- } catch {}
32507
- }
32508
- if (allModels.length === 0) {
32509
- console.error("\uD83D\uDD04 Fetching models from OpenRouter...");
32510
- try {
32511
- const response = await fetch("https://openrouter.ai/api/v1/models");
32512
- if (!response.ok)
32513
- throw new Error(`API returned ${response.status}`);
32514
- const data = await response.json();
32515
- allModels = data.data;
32516
- writeFileSync5(ALL_MODELS_JSON_PATH2, JSON.stringify({
32517
- lastUpdated: new Date().toISOString(),
32518
- models: allModels
32519
- }), "utf-8");
32520
- console.error(`✅ Cached ${allModels.length} models`);
32521
- } catch (error46) {
32522
- console.error(`❌ Failed to fetch models: ${error46}`);
32523
- return [];
32524
- }
32525
- }
32526
- const freeModels = allModels.filter((model) => {
32527
- const promptPrice = parseFloat(model.pricing?.prompt || "0");
32528
- const completionPrice = parseFloat(model.pricing?.completion || "0");
32529
- const isFree = promptPrice === 0 && completionPrice === 0;
32530
- if (!isFree)
32531
- return false;
32532
- const provider = model.id.split("/")[0].toLowerCase();
32533
- return TRUSTED_FREE_PROVIDERS.includes(provider);
32534
- });
32535
- freeModels.sort((a, b) => {
32536
- const contextA = a.context_length || a.top_provider?.context_length || 0;
32537
- const contextB = b.context_length || b.top_provider?.context_length || 0;
32538
- return contextB - contextA;
32539
- });
32540
- const seenBase = new Set;
32541
- const dedupedModels = freeModels.filter((model) => {
32542
- const baseId = model.id.replace(/:free$/, "");
32543
- if (seenBase.has(baseId)) {
32544
- return false;
32545
- }
32546
- seenBase.add(baseId);
32547
- return true;
32548
- });
32549
- const topModels = dedupedModels.slice(0, 15);
32550
- return topModels.map((model) => {
32551
- const provider = model.id.split("/")[0];
32552
- const contextLen = model.context_length || model.top_provider?.context_length || 0;
32553
- return {
32554
- id: model.id,
32555
- name: model.name || model.id,
32556
- description: model.description || "",
32557
- provider: provider.charAt(0).toUpperCase() + provider.slice(1),
32558
- pricing: {
32559
- input: "FREE",
32560
- output: "FREE",
32561
- average: "FREE"
32562
- },
32563
- context: contextLen > 0 ? `${Math.round(contextLen / 1000)}K` : "N/A",
32564
- supportsTools: (model.supported_parameters || []).includes("tools"),
32565
- supportsReasoning: (model.supported_parameters || []).includes("reasoning"),
32566
- supportsVision: (model.architecture?.input_modalities || []).includes("image")
32567
- };
32568
- });
32569
- }
32570
- async function promptForApiKey() {
32571
- return new Promise((resolve) => {
32572
- console.log(`
32573
- \x1B[1m\x1B[36mOpenRouter API Key Required\x1B[0m
32574
- `);
32575
- console.log(`\x1B[2mGet your free API key from: https://openrouter.ai/keys\x1B[0m
32576
- `);
32577
- console.log("Enter your OpenRouter API key:");
32578
- console.log(`\x1B[2m(it will not be saved, only used for this session)\x1B[0m
32579
- `);
32580
- const rl = createInterface({
32581
- input: process.stdin,
32582
- output: process.stdout,
32583
- terminal: false
32584
- });
32585
- let apiKey = null;
32586
- rl.on("line", (input) => {
32587
- const trimmed = input.trim();
32588
- if (!trimmed) {
32589
- console.log("\x1B[31mError: API key cannot be empty\x1B[0m");
32590
- return;
32591
- }
32592
- if (!trimmed.startsWith("sk-or-v1-")) {
32593
- console.log("\x1B[33mWarning: OpenRouter API keys usually start with 'sk-or-v1-'\x1B[0m");
32594
- console.log("\x1B[2mContinuing anyway...\x1B[0m");
32595
- }
32596
- apiKey = trimmed;
32597
- rl.close();
32598
- });
32599
- rl.on("close", () => {
32600
- if (apiKey) {
32601
- process.stdin.pause();
32602
- process.stdin.removeAllListeners("data");
32603
- process.stdin.removeAllListeners("end");
32604
- process.stdin.removeAllListeners("error");
32605
- process.stdin.removeAllListeners("readable");
32606
- if (process.stdin.isTTY && process.stdin.setRawMode) {
32607
- process.stdin.setRawMode(false);
32608
- }
32609
- setTimeout(() => {
32610
- resolve(apiKey);
32611
- }, 200);
32612
- } else {
32613
- console.error("\x1B[31mError: API key is required\x1B[0m");
32614
- process.exit(1);
32615
- }
32616
- });
32617
- });
32618
- }
32619
- async function selectModelInteractively(options = {}) {
32620
- const { freeOnly = false } = options;
32621
- let displayModels;
32622
- let enhancedMap;
32623
- if (freeOnly) {
32624
- const freeModels = await loadFreeModels();
32625
- if (freeModels.length === 0) {
32626
- console.error("❌ No free models found or failed to fetch models");
32627
- process.exit(1);
32628
- }
32629
- displayModels = freeModels.map((m) => m.id);
32630
- enhancedMap = new Map;
32631
- for (const m of freeModels) {
32632
- enhancedMap.set(m.id, m);
32633
- }
32634
- } else {
32635
- displayModels = getAvailableModels();
32636
- const enhancedModels = loadEnhancedModels();
32637
- enhancedMap = new Map;
32638
- for (const m of enhancedModels) {
32639
- enhancedMap.set(m.id, m);
32640
- }
32641
- }
32642
- const models = freeOnly ? displayModels : displayModels;
32643
- return new Promise((resolve) => {
32644
- const RESET = "\x1B[0m";
32645
- const BOLD = "\x1B[1m";
32646
- const DIM = "\x1B[2m";
32647
- const CYAN = "\x1B[36m";
32648
- const GREEN = "\x1B[32m";
32649
- const YELLOW = "\x1B[33m";
32650
- const MAGENTA = "\x1B[35m";
32651
- const pad = (text, width) => {
32652
- if (text.length > width)
32653
- return text.slice(0, width - 3) + "...";
32654
- return text + " ".repeat(width - text.length);
32655
- };
32656
- const headerText = freeOnly ? "Select a FREE OpenRouter Model" : "Select an OpenRouter Model";
32657
- const headerPadding = " ".repeat(82 - 4 - headerText.length);
32658
- console.log("");
32659
- console.log(`${DIM}╭${"─".repeat(82)}╮${RESET}`);
32660
- console.log(`${DIM}│${RESET} ${BOLD}${CYAN}${headerText}${RESET}${headerPadding}${DIM}│${RESET}`);
32661
- console.log(`${DIM}├${"─".repeat(82)}┤${RESET}`);
32662
- console.log(`${DIM}│${RESET} ${DIM}# Model Provider Pricing Context Caps${RESET} ${DIM}│${RESET}`);
32663
- console.log(`${DIM}├${"─".repeat(82)}┤${RESET}`);
32664
- models.forEach((modelId, index) => {
32665
- const num = (index + 1).toString().padStart(2);
32666
- const enhanced = enhancedMap.get(modelId);
32667
- if (modelId === "custom") {
32668
- console.log(`${DIM}│${RESET} ${YELLOW}${num}${RESET} ${DIM}Enter custom OpenRouter model ID...${RESET}${" ".repeat(40)}${DIM}│${RESET}`);
32669
- } else if (enhanced) {
32670
- const shortId = pad(modelId, 33);
32671
- const provider = pad(enhanced.provider || "N/A", 10);
32672
- const pricing = pad(enhanced.pricing?.average || "N/A", 9);
32673
- const context = pad(enhanced.context || "N/A", 7);
32674
- const tools = enhanced.supportsTools ? "✓" : "·";
32675
- const reasoning = enhanced.supportsReasoning ? "✓" : "·";
32676
- const vision = enhanced.supportsVision ? "✓" : "·";
32677
- console.log(`${DIM}│${RESET} ${GREEN}${num}${RESET} ${BOLD}${shortId}${RESET} ${CYAN}${provider}${RESET} ${MAGENTA}${pricing}${RESET} ${context} ${tools} ${reasoning} ${vision} ${DIM}│${RESET}`);
32678
- } else {
32679
- const shortId = pad(modelId, 33);
32680
- console.log(`${DIM}│${RESET} ${GREEN}${num}${RESET} ${shortId} ${DIM}${pad("N/A", 10)} ${pad("N/A", 9)} ${pad("N/A", 7)}${RESET} · · · ${DIM}│${RESET}`);
32681
- }
32682
- });
32683
- console.log(`${DIM}├${"─".repeat(82)}┤${RESET}`);
32684
- console.log(`${DIM}│${RESET} ${DIM}Caps: ✓/· = Tools, Reasoning, Vision${RESET}${" ".repeat(44)}${DIM}│${RESET}`);
32685
- console.log(`${DIM}╰${"─".repeat(82)}╯${RESET}`);
32686
- console.log("");
32687
- console.log(`${DIM}Enter number (1-${models.length}) or 'q' to quit:${RESET}`);
32688
- const rl = createInterface({
32689
- input: process.stdin,
32690
- output: process.stdout,
32691
- terminal: false
32692
- });
32693
- let selectedModel = null;
32694
- rl.on("line", (input) => {
32695
- const trimmed = input.trim();
32696
- if (trimmed.toLowerCase() === "q") {
32697
- rl.close();
32698
- process.exit(0);
32699
- }
32700
- const selection = parseInt(trimmed, 10);
32701
- if (isNaN(selection) || selection < 1 || selection > models.length) {
32702
- console.log(`\x1B[31mInvalid selection. Please enter 1-${models.length}\x1B[0m`);
32703
- return;
32704
- }
32705
- const model = models[selection - 1];
32706
- if (model === "custom") {
32707
- rl.close();
32708
- console.log(`
32709
- \x1B[1m\x1B[36mEnter custom OpenRouter model ID:\x1B[0m`);
32710
- const customRl = createInterface({
32711
- input: process.stdin,
32712
- output: process.stdout,
32713
- terminal: false
32714
- });
32715
- let customModel = null;
32716
- customRl.on("line", (customInput) => {
32717
- customModel = customInput.trim();
32718
- customRl.close();
32719
- });
32720
- customRl.on("close", () => {
32721
- process.stdin.pause();
32722
- process.stdin.removeAllListeners("data");
32723
- process.stdin.removeAllListeners("end");
32724
- process.stdin.removeAllListeners("error");
32725
- process.stdin.removeAllListeners("readable");
32726
- if (process.stdin.isTTY && process.stdin.setRawMode) {
32727
- process.stdin.setRawMode(false);
32728
- }
32729
- setTimeout(() => {
32730
- if (customModel) {
32731
- resolve(customModel);
32732
- } else {
32733
- console.error("\x1B[31mError: Model ID cannot be empty\x1B[0m");
32734
- process.exit(1);
32735
- }
32736
- }, 200);
32737
- });
32738
- } else {
32739
- selectedModel = model;
32740
- rl.close();
32741
- }
32742
- });
32743
- rl.on("close", () => {
32744
- if (selectedModel) {
32745
- process.stdin.pause();
32746
- process.stdin.removeAllListeners("data");
32747
- process.stdin.removeAllListeners("end");
32748
- process.stdin.removeAllListeners("error");
32749
- process.stdin.removeAllListeners("readable");
32750
- if (process.stdin.isTTY && process.stdin.setRawMode) {
32751
- process.stdin.setRawMode(false);
32752
- }
32753
- setTimeout(() => {
32754
- resolve(selectedModel);
32755
- }, 200);
32756
- }
32757
- });
32758
- });
32759
- }
32760
- var __filename5, __dirname5, ALL_MODELS_JSON_PATH2, CACHE_MAX_AGE_DAYS3 = 2, TRUSTED_FREE_PROVIDERS;
32761
- var init_simple_selector = __esm(() => {
32762
- init_model_loader();
35544
+ init_profile_config();
32763
35545
  __filename5 = fileURLToPath4(import.meta.url);
32764
35546
  __dirname5 = dirname4(__filename5);
32765
- ALL_MODELS_JSON_PATH2 = join5(__dirname5, "../all-models.json");
32766
- TRUSTED_FREE_PROVIDERS = [
32767
- "google",
32768
- "openai",
32769
- "x-ai",
32770
- "deepseek",
32771
- "qwen",
32772
- "alibaba",
32773
- "meta-llama",
32774
- "microsoft",
32775
- "mistralai",
32776
- "nvidia",
32777
- "cohere"
32778
- ];
35547
+ packageJson = JSON.parse(readFileSync5(join6(__dirname5, "../package.json"), "utf-8"));
35548
+ VERSION = packageJson.version;
35549
+ MODELS_JSON_PATH = join6(__dirname5, "../recommended-models.json");
35550
+ ALL_MODELS_JSON_PATH2 = join6(__dirname5, "../all-models.json");
32779
35551
  });
32780
35552
 
32781
35553
  // src/logger.ts
@@ -32791,8 +35563,8 @@ __export(exports_logger, {
32791
35563
  getLogLevel: () => getLogLevel,
32792
35564
  getLogFilePath: () => getLogFilePath
32793
35565
  });
32794
- import { writeFileSync as writeFileSync6, appendFile, existsSync as existsSync5, mkdirSync as mkdirSync2 } from "fs";
32795
- import { join as join6 } from "path";
35566
+ import { writeFileSync as writeFileSync7, appendFile, existsSync as existsSync6, mkdirSync as mkdirSync3 } from "fs";
35567
+ import { join as join7 } from "path";
32796
35568
  function flushLogBuffer() {
32797
35569
  if (!logFilePath || logBuffer.length === 0)
32798
35570
  return;
@@ -32816,7 +35588,7 @@ function scheduleFlush() {
32816
35588
  flushTimer = null;
32817
35589
  }
32818
35590
  if (logFilePath && logBuffer.length > 0) {
32819
- writeFileSync6(logFilePath, logBuffer.join(""), { flag: "a" });
35591
+ writeFileSync7(logFilePath, logBuffer.join(""), { flag: "a" });
32820
35592
  logBuffer = [];
32821
35593
  }
32822
35594
  });
@@ -32831,13 +35603,13 @@ function initLogger(debugMode, level = "info") {
32831
35603
  return;
32832
35604
  }
32833
35605
  logLevel = level;
32834
- const logsDir = join6(process.cwd(), "logs");
32835
- if (!existsSync5(logsDir)) {
32836
- mkdirSync2(logsDir, { recursive: true });
35606
+ const logsDir = join7(process.cwd(), "logs");
35607
+ if (!existsSync6(logsDir)) {
35608
+ mkdirSync3(logsDir, { recursive: true });
32837
35609
  }
32838
35610
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-").split("T").join("_").slice(0, -5);
32839
- logFilePath = join6(logsDir, `claudish_${timestamp}.log`);
32840
- writeFileSync6(logFilePath, `Claudish Debug Log - ${new Date().toISOString()}
35611
+ logFilePath = join7(logsDir, `claudish_${timestamp}.log`);
35612
+ writeFileSync7(logFilePath, `Claudish Debug Log - ${new Date().toISOString()}
32841
35613
  Log Level: ${level}
32842
35614
  ${"=".repeat(80)}
32843
35615
 
@@ -32946,7 +35718,7 @@ async function isPortAvailable(port) {
32946
35718
  }
32947
35719
  var init_port_manager = () => {};
32948
35720
 
32949
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/compose.js
35721
+ // node_modules/hono/dist/compose.js
32950
35722
  var compose = (middleware, onError, onNotFound) => {
32951
35723
  return (context, next) => {
32952
35724
  let index = -1;
@@ -32991,16 +35763,16 @@ var compose = (middleware, onError, onNotFound) => {
32991
35763
  };
32992
35764
  var init_compose = () => {};
32993
35765
 
32994
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/http-exception.js
35766
+ // node_modules/hono/dist/http-exception.js
32995
35767
  var init_http_exception = () => {};
32996
35768
 
32997
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/request/constants.js
35769
+ // node_modules/hono/dist/request/constants.js
32998
35770
  var GET_MATCH_RESULT;
32999
35771
  var init_constants = __esm(() => {
33000
35772
  GET_MATCH_RESULT = Symbol();
33001
35773
  });
33002
35774
 
33003
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/utils/body.js
35775
+ // node_modules/hono/dist/utils/body.js
33004
35776
  async function parseFormData(request, options) {
33005
35777
  const formData = await request.formData();
33006
35778
  if (formData) {
@@ -33069,7 +35841,7 @@ var init_body = __esm(() => {
33069
35841
  init_request();
33070
35842
  });
33071
35843
 
33072
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/utils/url.js
35844
+ // node_modules/hono/dist/utils/url.js
33073
35845
  var splitPath = (path) => {
33074
35846
  const paths = path.split("/");
33075
35847
  if (paths[0] === "") {
@@ -33256,7 +36028,7 @@ var init_url = __esm(() => {
33256
36028
  decodeURIComponent_ = decodeURIComponent;
33257
36029
  });
33258
36030
 
33259
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/request.js
36031
+ // node_modules/hono/dist/request.js
33260
36032
  var tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_), HonoRequest;
33261
36033
  var init_request = __esm(() => {
33262
36034
  init_http_exception();
@@ -33373,7 +36145,7 @@ var init_request = __esm(() => {
33373
36145
  };
33374
36146
  });
33375
36147
 
33376
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/utils/html.js
36148
+ // node_modules/hono/dist/utils/html.js
33377
36149
  var HtmlEscapedCallbackPhase, raw = (value, callbacks) => {
33378
36150
  const escapedString = new String(value);
33379
36151
  escapedString.isEscaped = true;
@@ -33412,7 +36184,7 @@ var init_html = __esm(() => {
33412
36184
  };
33413
36185
  });
33414
36186
 
33415
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/context.js
36187
+ // node_modules/hono/dist/context.js
33416
36188
  var TEXT_PLAIN = "text/plain; charset=UTF-8", setDefaultContentType = (contentType, headers) => {
33417
36189
  return {
33418
36190
  "Content-Type": contentType,
@@ -33580,7 +36352,7 @@ var init_context = __esm(() => {
33580
36352
  init_html();
33581
36353
  });
33582
36354
 
33583
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router.js
36355
+ // node_modules/hono/dist/router.js
33584
36356
  var METHOD_NAME_ALL = "ALL", METHOD_NAME_ALL_LOWERCASE = "all", METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built.", UnsupportedPathError;
33585
36357
  var init_router = __esm(() => {
33586
36358
  METHODS = ["get", "post", "put", "delete", "options", "patch"];
@@ -33588,11 +36360,11 @@ var init_router = __esm(() => {
33588
36360
  };
33589
36361
  });
33590
36362
 
33591
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/utils/constants.js
36363
+ // node_modules/hono/dist/utils/constants.js
33592
36364
  var COMPOSED_HANDLER = "__COMPOSED_HANDLER";
33593
36365
  var init_constants2 = () => {};
33594
36366
 
33595
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/hono-base.js
36367
+ // node_modules/hono/dist/hono-base.js
33596
36368
  var notFoundHandler = (c) => {
33597
36369
  return c.text("404 Not Found", 404);
33598
36370
  }, errorHandler = (err, c) => {
@@ -33816,7 +36588,7 @@ var init_hono_base = __esm(() => {
33816
36588
  init_url();
33817
36589
  });
33818
36590
 
33819
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/reg-exp-router/matcher.js
36591
+ // node_modules/hono/dist/router/reg-exp-router/matcher.js
33820
36592
  function match(method, path) {
33821
36593
  const matchers = this.buildAllMatchers();
33822
36594
  const match2 = (method2, path2) => {
@@ -33841,7 +36613,7 @@ var init_matcher = __esm(() => {
33841
36613
  emptyParam = [];
33842
36614
  });
33843
36615
 
33844
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/reg-exp-router/node.js
36616
+ // node_modules/hono/dist/router/reg-exp-router/node.js
33845
36617
  function compareKey(a, b) {
33846
36618
  if (a.length === 1) {
33847
36619
  return b.length === 1 ? a < b ? -1 : 1 : -1;
@@ -33944,7 +36716,7 @@ var init_node = __esm(() => {
33944
36716
  regExpMetaChars = new Set(".\\+*[^]$()");
33945
36717
  });
33946
36718
 
33947
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/reg-exp-router/trie.js
36719
+ // node_modules/hono/dist/router/reg-exp-router/trie.js
33948
36720
  var Trie = class {
33949
36721
  #context = { varIndex: 0 };
33950
36722
  #root = new Node;
@@ -34003,7 +36775,7 @@ var init_trie = __esm(() => {
34003
36775
  init_node();
34004
36776
  });
34005
36777
 
34006
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/reg-exp-router/router.js
36778
+ // node_modules/hono/dist/router/reg-exp-router/router.js
34007
36779
  function buildWildcardRegExp(path) {
34008
36780
  return wildcardRegExpCache[path] ??= new RegExp(path === "*" ? "" : `^${path.replace(/\/\*$|([.\\+*[^\]$()])/g, (_, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)")}$`);
34009
36781
  }
@@ -34175,7 +36947,7 @@ var init_router2 = __esm(() => {
34175
36947
  wildcardRegExpCache = /* @__PURE__ */ Object.create(null);
34176
36948
  });
34177
36949
 
34178
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/reg-exp-router/prepared-router.js
36950
+ // node_modules/hono/dist/router/reg-exp-router/prepared-router.js
34179
36951
  var PreparedRegExpRouter = class {
34180
36952
  name = "PreparedRegExpRouter";
34181
36953
  #matchers;
@@ -34252,13 +37024,13 @@ var init_prepared_router = __esm(() => {
34252
37024
  init_router2();
34253
37025
  });
34254
37026
 
34255
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/reg-exp-router/index.js
37027
+ // node_modules/hono/dist/router/reg-exp-router/index.js
34256
37028
  var init_reg_exp_router = __esm(() => {
34257
37029
  init_router2();
34258
37030
  init_prepared_router();
34259
37031
  });
34260
37032
 
34261
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/smart-router/router.js
37033
+ // node_modules/hono/dist/router/smart-router/router.js
34262
37034
  var SmartRouter = class {
34263
37035
  name = "SmartRouter";
34264
37036
  #routers = [];
@@ -34316,12 +37088,12 @@ var init_router3 = __esm(() => {
34316
37088
  init_router();
34317
37089
  });
34318
37090
 
34319
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/smart-router/index.js
37091
+ // node_modules/hono/dist/router/smart-router/index.js
34320
37092
  var init_smart_router = __esm(() => {
34321
37093
  init_router3();
34322
37094
  });
34323
37095
 
34324
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/trie-router/node.js
37096
+ // node_modules/hono/dist/router/trie-router/node.js
34325
37097
  var emptyParams, Node2 = class {
34326
37098
  #methods;
34327
37099
  #children;
@@ -34479,7 +37251,7 @@ var init_node2 = __esm(() => {
34479
37251
  emptyParams = /* @__PURE__ */ Object.create(null);
34480
37252
  });
34481
37253
 
34482
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/trie-router/router.js
37254
+ // node_modules/hono/dist/router/trie-router/router.js
34483
37255
  var TrieRouter = class {
34484
37256
  name = "TrieRouter";
34485
37257
  #node;
@@ -34505,12 +37277,12 @@ var init_router4 = __esm(() => {
34505
37277
  init_node2();
34506
37278
  });
34507
37279
 
34508
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/router/trie-router/index.js
37280
+ // node_modules/hono/dist/router/trie-router/index.js
34509
37281
  var init_trie_router = __esm(() => {
34510
37282
  init_router4();
34511
37283
  });
34512
37284
 
34513
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/hono.js
37285
+ // node_modules/hono/dist/hono.js
34514
37286
  var Hono2;
34515
37287
  var init_hono = __esm(() => {
34516
37288
  init_hono_base();
@@ -34527,12 +37299,12 @@ var init_hono = __esm(() => {
34527
37299
  };
34528
37300
  });
34529
37301
 
34530
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/index.js
34531
- var init_dist = __esm(() => {
37302
+ // node_modules/hono/dist/index.js
37303
+ var init_dist9 = __esm(() => {
34532
37304
  init_hono();
34533
37305
  });
34534
37306
 
34535
- // node_modules/.pnpm/hono@4.10.6/node_modules/hono/dist/middleware/cors/index.js
37307
+ // node_modules/hono/dist/middleware/cors/index.js
34536
37308
  var cors = (options) => {
34537
37309
  const defaults = {
34538
37310
  origin: "*",
@@ -34618,7 +37390,7 @@ var cors = (options) => {
34618
37390
  };
34619
37391
  var init_cors = () => {};
34620
37392
 
34621
- // node_modules/.pnpm/@hono+node-server@1.19.6_hono@4.10.6/node_modules/@hono/node-server/dist/index.mjs
37393
+ // node_modules/@hono/node-server/dist/index.mjs
34622
37394
  import { createServer as createServerHTTP } from "http";
34623
37395
  import { Http2ServerRequest as Http2ServerRequest2 } from "http2";
34624
37396
  import { Http2ServerRequest } from "http2";
@@ -34993,7 +37765,7 @@ var RequestError, toRequestError = (e) => {
34993
37765
  });
34994
37766
  return server;
34995
37767
  };
34996
- var init_dist2 = __esm(() => {
37768
+ var init_dist10 = __esm(() => {
34997
37769
  RequestError = class extends Error {
34998
37770
  constructor(message, options) {
34999
37771
  super(message, options);
@@ -35954,7 +38726,9 @@ function transformOpenAIToClaude(claudeRequestInput) {
35954
38726
  var init_transform = () => {};
35955
38727
 
35956
38728
  // src/handlers/openrouter-handler.ts
35957
- import { writeFileSync as writeFileSync7 } from "node:fs";
38729
+ import { writeFileSync as writeFileSync8 } from "node:fs";
38730
+ import { tmpdir as tmpdir2 } from "node:os";
38731
+ import { join as join8 } from "node:path";
35958
38732
 
35959
38733
  class OpenRouterHandler {
35960
38734
  targetModel;
@@ -36001,7 +38775,7 @@ class OpenRouterHandler {
36001
38775
  context_left_percent: leftPct,
36002
38776
  updated_at: Date.now()
36003
38777
  };
36004
- writeFileSync7(`/tmp/claudish-tokens-${this.port}.json`, JSON.stringify(data), "utf-8");
38778
+ writeFileSync8(join8(tmpdir2(), `claudish-tokens-${this.port}.json`), JSON.stringify(data), "utf-8");
36005
38779
  } catch (e) {}
36006
38780
  }
36007
38781
  async handle(c, payload) {
@@ -36429,9 +39203,9 @@ async function createProxyServer(port, openrouterApiKey, model, monitorMode = fa
36429
39203
  };
36430
39204
  }
36431
39205
  var init_proxy_server = __esm(() => {
36432
- init_dist();
39206
+ init_dist9();
36433
39207
  init_cors();
36434
- init_dist2();
39208
+ init_dist10();
36435
39209
  init_logger();
36436
39210
  init_native_handler();
36437
39211
  init_openrouter_handler();
@@ -36444,27 +39218,33 @@ __export(exports_update_checker, {
36444
39218
  });
36445
39219
  import { execSync } from "node:child_process";
36446
39220
  import { createInterface as createInterface2 } from "node:readline";
36447
- import { existsSync as existsSync6, readFileSync as readFileSync5, writeFileSync as writeFileSync8, mkdirSync as mkdirSync3, unlinkSync as unlinkSync2 } from "node:fs";
36448
- import { join as join7 } from "node:path";
36449
- import { tmpdir as tmpdir2, homedir } from "node:os";
39221
+ import { existsSync as existsSync7, readFileSync as readFileSync6, writeFileSync as writeFileSync9, mkdirSync as mkdirSync4, unlinkSync as unlinkSync2 } from "node:fs";
39222
+ import { join as join9 } from "node:path";
39223
+ import { tmpdir as tmpdir3, homedir as homedir2, platform as platform2 } from "node:os";
36450
39224
  function getCacheFilePath() {
36451
- const cacheDir = join7(homedir(), ".cache", "claudish");
39225
+ let cacheDir;
39226
+ if (isWindows2) {
39227
+ const localAppData = process.env.LOCALAPPDATA || join9(homedir2(), "AppData", "Local");
39228
+ cacheDir = join9(localAppData, "claudish");
39229
+ } else {
39230
+ cacheDir = join9(homedir2(), ".cache", "claudish");
39231
+ }
36452
39232
  try {
36453
- if (!existsSync6(cacheDir)) {
36454
- mkdirSync3(cacheDir, { recursive: true });
39233
+ if (!existsSync7(cacheDir)) {
39234
+ mkdirSync4(cacheDir, { recursive: true });
36455
39235
  }
36456
- return join7(cacheDir, "update-check.json");
39236
+ return join9(cacheDir, "update-check.json");
36457
39237
  } catch {
36458
- return join7(tmpdir2(), "claudish-update-check.json");
39238
+ return join9(tmpdir3(), "claudish-update-check.json");
36459
39239
  }
36460
39240
  }
36461
39241
  function readCache() {
36462
39242
  try {
36463
39243
  const cachePath = getCacheFilePath();
36464
- if (!existsSync6(cachePath)) {
39244
+ if (!existsSync7(cachePath)) {
36465
39245
  return null;
36466
39246
  }
36467
- const data = JSON.parse(readFileSync5(cachePath, "utf-8"));
39247
+ const data = JSON.parse(readFileSync6(cachePath, "utf-8"));
36468
39248
  return data;
36469
39249
  } catch {
36470
39250
  return null;
@@ -36477,7 +39257,7 @@ function writeCache(latestVersion) {
36477
39257
  lastCheck: Date.now(),
36478
39258
  latestVersion
36479
39259
  };
36480
- writeFileSync8(cachePath, JSON.stringify(data), "utf-8");
39260
+ writeFileSync9(cachePath, JSON.stringify(data), "utf-8");
36481
39261
  } catch {}
36482
39262
  }
36483
39263
  function isCacheValid(cache) {
@@ -36487,7 +39267,7 @@ function isCacheValid(cache) {
36487
39267
  function clearCache() {
36488
39268
  try {
36489
39269
  const cachePath = getCacheFilePath();
36490
- if (existsSync6(cachePath)) {
39270
+ if (existsSync7(cachePath)) {
36491
39271
  unlinkSync2(cachePath);
36492
39272
  }
36493
39273
  } catch {}
@@ -36543,7 +39323,8 @@ function runUpdate() {
36543
39323
  `);
36544
39324
  const result = execSync("npm install -g claudish@latest", {
36545
39325
  stdio: "inherit",
36546
- encoding: "utf-8"
39326
+ encoding: "utf-8",
39327
+ shell: true
36547
39328
  });
36548
39329
  console.error(`
36549
39330
  [claudish] Update complete! Please restart claudish.
@@ -36603,8 +39384,9 @@ async function checkForUpdates(currentVersion, options = {}) {
36603
39384
  }
36604
39385
  return false;
36605
39386
  }
36606
- var NPM_REGISTRY_URL = "https://registry.npmjs.org/claudish/latest", CACHE_MAX_AGE_MS;
39387
+ var isWindows2, NPM_REGISTRY_URL = "https://registry.npmjs.org/claudish/latest", CACHE_MAX_AGE_MS;
36607
39388
  var init_update_checker = __esm(() => {
39389
+ isWindows2 = platform2() === "win32";
36608
39390
  CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1000;
36609
39391
  });
36610
39392
 
@@ -36612,8 +39394,14 @@ var init_update_checker = __esm(() => {
36612
39394
  var import_dotenv2 = __toESM(require_main(), 1);
36613
39395
  import_dotenv2.config();
36614
39396
  var isMcpMode = process.argv.includes("--mcp");
39397
+ var args = process.argv.slice(2);
39398
+ var firstArg = args[0];
36615
39399
  if (isMcpMode) {
36616
39400
  Promise.resolve().then(() => (init_mcp_server(), exports_mcp_server)).then((mcp) => mcp.startMcpServer());
39401
+ } else if (firstArg === "init") {
39402
+ Promise.resolve().then(() => (init_profile_commands(), exports_profile_commands)).then((pc) => pc.initCommand());
39403
+ } else if (firstArg === "profile") {
39404
+ Promise.resolve().then(() => (init_profile_commands(), exports_profile_commands)).then((pc) => pc.profileCommand(args.slice(1)));
36617
39405
  } else {
36618
39406
  runCli();
36619
39407
  }
@@ -36621,7 +39409,7 @@ async function runCli() {
36621
39409
  const { checkClaudeInstalled: checkClaudeInstalled2, runClaudeWithProxy: runClaudeWithProxy2 } = await Promise.resolve().then(() => (init_claude_runner(), exports_claude_runner));
36622
39410
  const { parseArgs: parseArgs2, getVersion: getVersion2 } = await Promise.resolve().then(() => (init_cli(), exports_cli));
36623
39411
  const { DEFAULT_PORT_RANGE: DEFAULT_PORT_RANGE2 } = await Promise.resolve().then(() => (init_config(), exports_config));
36624
- const { selectModelInteractively: selectModelInteractively2, promptForApiKey: promptForApiKey2 } = await Promise.resolve().then(() => (init_simple_selector(), exports_simple_selector));
39412
+ const { selectModel: selectModel2, promptForApiKey: promptForApiKey2 } = await Promise.resolve().then(() => (init_model_selector(), exports_model_selector));
36625
39413
  const { initLogger: initLogger2, getLogFilePath: getLogFilePath2 } = await Promise.resolve().then(() => (init_logger(), exports_logger));
36626
39414
  const { findAvailablePort: findAvailablePort2 } = await Promise.resolve().then(() => (init_port_manager(), exports_port_manager));
36627
39415
  const { createProxyServer: createProxyServer2 } = await Promise.resolve().then(() => (init_proxy_server(), exports_proxy_server));
@@ -36661,7 +39449,7 @@ async function runCli() {
36661
39449
  console.log("");
36662
39450
  }
36663
39451
  if (cliConfig.interactive && !cliConfig.monitor && !cliConfig.model) {
36664
- cliConfig.model = await selectModelInteractively2({ freeOnly: cliConfig.freeOnly });
39452
+ cliConfig.model = await selectModel2({ freeOnly: cliConfig.freeOnly });
36665
39453
  console.log("");
36666
39454
  }
36667
39455
  if (!cliConfig.interactive && !cliConfig.monitor && !cliConfig.model) {