pushary 1.9.140 → 1.9.141

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{api-ZV6JN5J3.js → api-JWLCKSWR.js} +11 -11
  3. package/dist/bin/pushary-audit.js +3 -3
  4. package/dist/bin/pushary-bell-hook.js +28 -28
  5. package/dist/bin/pushary-bell.js +10 -10
  6. package/dist/bin/pushary-claude.js +27 -27
  7. package/dist/bin/pushary-clean.js +36 -36
  8. package/dist/bin/pushary-codex-bridge.js +23 -23
  9. package/dist/bin/pushary-codex-hook.js +35 -35
  10. package/dist/bin/pushary-codex-session.js +9 -9
  11. package/dist/bin/pushary-codex.js +16 -16
  12. package/dist/bin/pushary-connect.js +29 -29
  13. package/dist/bin/pushary-cowork.js +5 -5
  14. package/dist/bin/pushary-daemon.js +52 -65
  15. package/dist/bin/pushary-disconnect.js +28 -28
  16. package/dist/bin/pushary-display-hook.js +8 -1
  17. package/dist/bin/pushary-doctor.js +43 -43
  18. package/dist/bin/pushary-elicitation-hook.js +28 -28
  19. package/dist/bin/pushary-gemini-bridge.js +17 -17
  20. package/dist/bin/pushary-gemini-hook.js +32 -32
  21. package/dist/bin/pushary-hook.js +35 -35
  22. package/dist/bin/pushary-login.js +21 -21
  23. package/dist/bin/pushary-logout.js +27 -27
  24. package/dist/bin/pushary-mcp.js +12 -12
  25. package/dist/bin/pushary-mode.js +15 -15
  26. package/dist/bin/pushary-notification-hook.js +27 -27
  27. package/dist/bin/pushary-opencode-hook.js +31 -31
  28. package/dist/bin/pushary-permission-denied-hook.js +35 -35
  29. package/dist/bin/pushary-permission-hook.js +35 -35
  30. package/dist/bin/pushary-post-hook.js +28 -28
  31. package/dist/bin/pushary-prompt-hook.js +27 -27
  32. package/dist/bin/pushary-session-end-hook.js +27 -27
  33. package/dist/bin/pushary-session-start-hook.js +36 -36
  34. package/dist/bin/pushary-setup.js +51 -51
  35. package/dist/bin/pushary-stats.js +5 -5
  36. package/dist/bin/pushary-status.js +33 -33
  37. package/dist/bin/pushary-stop-hook.js +27 -27
  38. package/dist/bin/pushary-stopfailure-hook.js +27 -27
  39. package/dist/bin/pushary-suggestions.js +15 -15
  40. package/dist/bin/pushary-transcript-register.js +17 -17
  41. package/dist/bin/pushary-transcripts.js +25 -25
  42. package/dist/bin/pushary-upgrade.js +41 -41
  43. package/dist/bin/pushary-wait.js +15 -15
  44. package/dist/bin/pushary.js +7 -7
  45. package/dist/{chunk-4IAFTTNQ.js → chunk-24BLJAQN.js} +1 -1
  46. package/dist/{chunk-7TXUHOQW.js → chunk-3MFJDZ2L.js} +10 -10
  47. package/dist/{chunk-SSAGWDBN.js → chunk-3MMOB5TM.js} +3 -3
  48. package/dist/{chunk-O55PACNP.js → chunk-3PALTBFX.js} +4 -4
  49. package/dist/{chunk-UGU566AU.js → chunk-3RBUCAO7.js} +6 -6
  50. package/dist/{chunk-3FJO3HIA.js → chunk-3YV26XPH.js} +3 -3
  51. package/dist/{chunk-AQVXXXFZ.js → chunk-4JR6PPIY.js} +4 -4
  52. package/dist/{chunk-GUVTHNCX.js → chunk-4KHBN7LI.js} +5 -5
  53. package/dist/{chunk-TJX25WUQ.js → chunk-4Y2LO2WB.js} +2 -2
  54. package/dist/{chunk-XJ6CRGD2.js → chunk-4ZTPPMLM.js} +4 -4
  55. package/dist/{chunk-LAAGGP7K.js → chunk-5DMGHDOT.js} +5 -5
  56. package/dist/{chunk-4SMS5DND.js → chunk-62V26PAL.js} +3 -3
  57. package/dist/{chunk-6LK6I62M.js → chunk-6DAXKHVX.js} +1 -1
  58. package/dist/{chunk-QAT2PWRX.js → chunk-7EYUDJQ6.js} +16 -16
  59. package/dist/{chunk-QDQHIQWH.js → chunk-7TKF7IFS.js} +2 -2
  60. package/dist/{chunk-QCIZDJSU.js → chunk-A6KNDKO5.js} +458 -27
  61. package/dist/{chunk-MTVAACOE.js → chunk-ACG7RC7N.js} +3 -3
  62. package/dist/{chunk-4YIVV4PY.js → chunk-AIZ5KC2N.js} +2 -2
  63. package/dist/{chunk-MEFTOIUI.js → chunk-ALJL6GDD.js} +1 -1
  64. package/dist/{chunk-BAT4TJOE.js → chunk-ARIJUXCG.js} +8 -8
  65. package/dist/{chunk-6WBHYQ2P.js → chunk-BFXIQGWS.js} +1 -1
  66. package/dist/{chunk-MGBYRHT3.js → chunk-BKWDG5QV.js} +1 -1
  67. package/dist/{chunk-IEHY7DCR.js → chunk-C4VTURGH.js} +1 -1
  68. package/dist/{chunk-7W4XA2WF.js → chunk-CAUSBRTJ.js} +1 -1
  69. package/dist/{chunk-V5VSSRV6.js → chunk-CL3OIICA.js} +6 -6
  70. package/dist/{chunk-3HORJAQX.js → chunk-CUJ2MGG5.js} +2 -2
  71. package/dist/{chunk-YIIGX653.js → chunk-CVGVWUNE.js} +5 -5
  72. package/dist/{chunk-S7DTAH7Q.js → chunk-CWCJFCAY.js} +1 -1
  73. package/dist/{chunk-HJFTPNP6.js → chunk-D35XQMWO.js} +2 -2
  74. package/dist/{chunk-T5GZUMBP.js → chunk-EADQYNLU.js} +5 -5
  75. package/dist/{chunk-LW7TXMCP.js → chunk-F335PCA4.js} +1 -1
  76. package/dist/{chunk-AXAO3JF5.js → chunk-FKKS4ZC5.js} +3 -3
  77. package/dist/{chunk-E4MC6B6U.js → chunk-FOPV3VQD.js} +4 -4
  78. package/dist/{chunk-BMBWFLIT.js → chunk-GA72NGS7.js} +1 -1
  79. package/dist/{chunk-IJMWFHZZ.js → chunk-GGXAZTSW.js} +2 -2
  80. package/dist/{chunk-OZY4EU6V.js → chunk-GX46NBAE.js} +8 -8
  81. package/dist/{chunk-SANGITZF.js → chunk-HEXX52SX.js} +1 -1
  82. package/dist/{chunk-HNN46FYL.js → chunk-I547BHSE.js} +4 -4
  83. package/dist/{chunk-O66URN57.js → chunk-I72H3AWD.js} +3 -3
  84. package/dist/{chunk-H2EXF6DB.js → chunk-IR7J5WY4.js} +3 -3
  85. package/dist/{chunk-7AXEKUXY.js → chunk-J2ELAXGI.js} +1 -1
  86. package/dist/{chunk-PHZYLAHL.js → chunk-J3NMHMG7.js} +2 -2
  87. package/dist/{chunk-MDRNNK3L.js → chunk-JBQFVXDK.js} +1 -1
  88. package/dist/{chunk-7OBROSQL.js → chunk-KAYK66B3.js} +3 -3
  89. package/dist/{chunk-6Z7VJ65F.js → chunk-LCYHJQGQ.js} +5 -5
  90. package/dist/{chunk-S6LB3SZE.js → chunk-ME2ZKG6Y.js} +12 -12
  91. package/dist/{chunk-D7AJ3ZCI.js → chunk-MQJEDVTH.js} +1 -1
  92. package/dist/{chunk-LURIPMCB.js → chunk-MW6MPOQZ.js} +6 -6
  93. package/dist/{chunk-YB7V6V6O.js → chunk-NDAJSNIZ.js} +1 -1
  94. package/dist/{chunk-FSDTFT7J.js → chunk-NFXWQDZ6.js} +2 -2
  95. package/dist/{chunk-MFRNEOCN.js → chunk-O2CW5IFD.js} +11 -11
  96. package/dist/{chunk-RACM64B6.js → chunk-OR47JOLE.js} +2 -2
  97. package/dist/{chunk-2MELVDYD.js → chunk-PD5LSNEK.js} +2 -2
  98. package/dist/{chunk-Y7LBB6YM.js → chunk-PDES33BK.js} +1 -1
  99. package/dist/{chunk-UHB7G2XC.js → chunk-PHSPXFAY.js} +5 -5
  100. package/dist/{chunk-RVKCG7DK.js → chunk-PNKFGNJF.js} +6 -6
  101. package/dist/{chunk-SQB57AJR.js → chunk-PY2JHBNC.js} +4 -4
  102. package/dist/{chunk-E67Y7DSA.js → chunk-Q4XW5FWF.js} +2 -2
  103. package/dist/{chunk-UH25VEQI.js → chunk-Q6EK2GDR.js} +4 -4
  104. package/dist/{chunk-ULRZGJSL.js → chunk-QNEF5JII.js} +2 -2
  105. package/dist/{chunk-RQPVEBKR.js → chunk-QVXNSVBS.js} +3 -3
  106. package/dist/{chunk-NBJ7N7KL.js → chunk-RO36S2KY.js} +5 -5
  107. package/dist/{chunk-5TPC3M45.js → chunk-RQCKUCWK.js} +1 -1
  108. package/dist/{chunk-N346VCKX.js → chunk-TIX4DZ2J.js} +3 -3
  109. package/dist/{chunk-E46NE7FB.js → chunk-U4P4NDVB.js} +2 -0
  110. package/dist/{chunk-B4KAY45V.js → chunk-UJ2WT54H.js} +16 -12
  111. package/dist/{chunk-7DPPMWTR.js → chunk-UOKA4ENY.js} +3 -3
  112. package/dist/{chunk-YD3PTYOT.js → chunk-UQ352C7S.js} +3 -3
  113. package/dist/{chunk-3TQ4NPFC.js → chunk-VBYWBGIJ.js} +3 -3
  114. package/dist/{chunk-7WLNPGEY.js → chunk-VR6VWNLQ.js} +4 -4
  115. package/dist/{chunk-TA3YQY6I.js → chunk-VTT3WV4C.js} +1 -1
  116. package/dist/{chunk-JYOC6N7C.js → chunk-XBPBYSNM.js} +2 -2
  117. package/dist/{chunk-TRCJWAZD.js → chunk-XYFKYZCQ.js} +6 -6
  118. package/dist/{chunk-L7BWJD25.js → chunk-XYRPLFMD.js} +1 -1
  119. package/dist/{chunk-JHRJ3KKG.js → chunk-YKL7VBKJ.js} +5 -5
  120. package/dist/{chunk-7LBMCU3S.js → chunk-ZE56WMFL.js} +4 -4
  121. package/dist/{codex-app-cards-switch-YW4R5WTG.js → codex-app-cards-switch-NRAMENRL.js} +12 -12
  122. package/dist/{codex-card-routing-5EHXCS7Y.js → codex-card-routing-D7ARIQKL.js} +2 -2
  123. package/dist/{codex-desktop-launch-VEPL7OFZ.js → codex-desktop-launch-2X4UEMRL.js} +2 -2
  124. package/dist/{codex-session-launch-7UKI32XL.js → codex-session-launch-FY5QIZSI.js} +20 -20
  125. package/dist/{config-5YVCM3JL.js → config-NDOIVL6S.js} +3 -3
  126. package/dist/{global-upgrade-YNLHN2LI.js → global-upgrade-MS3WGHEP.js} +9 -9
  127. package/dist/{identity-ZF5BYVAH.js → identity-VXA3TZ7U.js} +4 -4
  128. package/dist/{live-capabilities-UDAEQC25.js → live-capabilities-2LCBHUWN.js} +4 -4
  129. package/dist/{paths-5CUJRNH3.js → paths-HOCSWOBY.js} +3 -3
  130. package/dist/{reapply-EHYJUX67.js → reapply-VYMO3QM6.js} +29 -29
  131. package/dist/src/index.js +34 -34
  132. package/dist/{upgrade-lock-ONZN26ZJ.js → upgrade-lock-XH5AQIOD.js} +4 -4
  133. package/dist/{usage-GF3ZBAH4.js → usage-EVX6CH5H.js} +3 -3
  134. package/package.json +1 -1
@@ -1799,6 +1799,7 @@ var A_SHELL_RUNNING_A_SUBSTITUTION = new RegExp(
1799
1799
  String.raw`${COMMAND_POSITION}${COMMAND_PREFIXES}(?:[^\s;&|()<>` + "`" + String.raw`]*/)?(?:sh|bash|zsh|dash|ksh|source|\.)(?:[ \t]+-[^\s<]*){0,8}[ \t]+(?:<[ \t]*)?[<=](?=\()`,
1800
1800
  "g"
1801
1801
  );
1802
+ var AN_EVAL_THAT_RUNS = new RegExp(String.raw`${COMMAND_POSITION}${COMMAND_PREFIXES}eval[ \t]+`, "g");
1802
1803
  var CASE_HEAD = /(^|[\s;&|(])case[ \t]+(?:"[^"\n]*"|'[^'\n]*'|\S+)[ \t\n]+in(?=[\s;])/g;
1803
1804
  var CASE_ARM_OPENING = /;[;&]{0,2}[ \t\n]*\(?[^()\s;][^()\n;]*\)[ \t\n]*/g;
1804
1805
  var CASE_ARM_ENDING = /;;&?|;&/g;
@@ -1861,8 +1862,70 @@ var readingWithShellFormsSpelledOut = (text3) => {
1861
1862
  const reading = SHELL_FORM_REWRITES.reduce((current, rewrite) => rewrite(current), text3);
1862
1863
  return reading === text3 ? null : reading;
1863
1864
  };
1865
+ var SHELLS_THAT_RUN_A_SCRIPT_ARGUMENT = /* @__PURE__ */ new Set(["sh", "bash", "zsh", "dash", "ksh"]);
1866
+ var SHORT_FLAGS_WITH_THE_COMMAND_FLAG = /^-[A-Za-z]*c[A-Za-z]*$/;
1867
+ var SHELL_LONG_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set(["--rcfile", "--init-file"]);
1868
+ var SHELL_SHORT_FLAGS_ENDING_IN_AN_OPTION_NAME = /^[-+][A-Za-z]*[oO]$/;
1869
+ var SHELL_OPTION_WORD = /^[-+]/;
1870
+ var COMMAND_SEPARATOR_INSIDE_A_WORD = /[;&|()`]/;
1864
1871
  var DEEPEST_NESTED_SCRIPT_READ = 3;
1865
1872
  var MOST_SCRIPTS_READ_FROM_ONE_COMMAND = 16;
1873
+ var programNamedBy = (word) => basenameOf(word.split(COMMAND_SEPARATOR_INSIDE_A_WORD).filter((piece) => piece !== "").pop() ?? "");
1874
+ var scriptArgumentOfAShellAt = (words, index) => {
1875
+ if (!SHELLS_THAT_RUN_A_SCRIPT_ARGUMENT.has(programNamedBy(words[index]?.text ?? ""))) return void 0;
1876
+ for (let next = index + 1; SHELL_OPTION_WORD.test(words[next]?.text ?? ""); next += 1) {
1877
+ const option = words[next]?.text ?? "";
1878
+ if (SHORT_FLAGS_WITH_THE_COMMAND_FLAG.test(option)) return words[next + 1]?.text;
1879
+ if (SHELL_LONG_OPTIONS_WITH_A_VALUE.has(option) || SHELL_SHORT_FLAGS_ENDING_IN_AN_OPTION_NAME.test(option)) next += 1;
1880
+ }
1881
+ return void 0;
1882
+ };
1883
+ var scriptsOfShellsIn = (text3) => {
1884
+ const words = shellWordsOf(text3);
1885
+ return words === null ? [] : words.flatMap((_, index) => scriptArgumentOfAShellAt(words, index) ?? []);
1886
+ };
1887
+ var endsTheCommandAsAControlOperator = (text3, index) => {
1888
+ const char = text3.charAt(index);
1889
+ const before = text3.charAt(index - 1);
1890
+ if (char === "|") return before !== ">";
1891
+ return char === "&" && before !== ">" && before !== "<" && text3.charAt(index + 1) !== ">";
1892
+ };
1893
+ var endOfTheSimpleCommandAt = (text3, from) => {
1894
+ let depth = 0;
1895
+ let quote = null;
1896
+ let inBackticks = false;
1897
+ for (let index = from; index < text3.length; index += 1) {
1898
+ const char = text3.charAt(index);
1899
+ if (quote === "'") {
1900
+ if (char === "'") quote = null;
1901
+ } else if (char === "\\") {
1902
+ index += 1;
1903
+ } else if (quote === '"') {
1904
+ if (char === '"') quote = null;
1905
+ } else if (char === "'" || char === '"') {
1906
+ quote = char;
1907
+ } else if (char === "`") {
1908
+ inBackticks = !inBackticks;
1909
+ } else if (inBackticks) {
1910
+ continue;
1911
+ } else if (char === "(") {
1912
+ depth += 1;
1913
+ } else if (char === ")" && depth > 0) {
1914
+ depth -= 1;
1915
+ } else if (depth === 0 && (char === "\n" || char === ";" || char === ")" || endsTheCommandAsAControlOperator(text3, index))) {
1916
+ return index;
1917
+ }
1918
+ }
1919
+ return text3.length;
1920
+ };
1921
+ var scriptOfAnEvalEndingAt = (text3, end) => {
1922
+ const words = shellWordsOf(text3.slice(end, endOfTheSimpleCommandAt(text3, end)));
1923
+ if (words === null) return [];
1924
+ const firstComment = words.findIndex((word) => word.comment);
1925
+ return [(firstComment === -1 ? words : words.slice(0, firstComment)).map((word) => word.text).join(" ")];
1926
+ };
1927
+ var scriptsOfEvalsIn = (text3) => [...text3.matchAll(AN_EVAL_THAT_RUNS)].slice(0, MOST_SCRIPTS_READ_FROM_ONE_COMMAND + 1).flatMap((match) => scriptOfAnEvalEndingAt(text3, match.index + match[0].length));
1928
+ var scriptsWrittenForAShellOrAnEval = (text3) => [...scriptsOfEvalsIn(text3), ...scriptsOfShellsIn(text3)];
1866
1929
  var READING_OF_SCRIPTS_TOO_MANY_TO_READ = ": | sh";
1867
1930
  var readingsOfNestedShellScripts = (text3, scriptsDirectlyInside) => {
1868
1931
  const readings = [];
@@ -3853,6 +3916,310 @@ var codexPermissionPaths = (profile, access) => [
3853
3916
  ...profile.fileSystem?.[access] ?? [],
3854
3917
  ...(profile.fileSystem?.entries ?? []).filter((entry2) => entry2.access === access).map((entry2) => entry2.path.path)
3855
3918
  ];
3919
+ var CODEX_PERMISSION_QUESTION_MAX_UNITS = 180;
3920
+ var CODEX_PERMISSION_QUESTION_WITHOUT_A_GRANT = "Allow a Codex permission request that names no network access and no file paths?";
3921
+ var BROAD_ROOT_LABELS = {
3922
+ computer: "the whole computer",
3923
+ drive: "the whole drive",
3924
+ volume: "a whole volume",
3925
+ share: "a network share",
3926
+ everyHome: "every home folder",
3927
+ home: "a home folder",
3928
+ topLevel: "a top-level folder"
3929
+ };
3930
+ var BROAD_ROOTS_IN_NAMING_ORDER = ["computer", "drive", "volume", "share", "everyHome", "home", "topLevel"];
3931
+ var RANK_IN_A_SENSITIVE_PLACE = BROAD_ROOTS_IN_NAMING_ORDER.length;
3932
+ var RANK_OUTSIDE_THE_WORKING_DIRECTORY = RANK_IN_A_SENSITIVE_PLACE + 1;
3933
+ var RANK_INSIDE_THE_WORKING_DIRECTORY = RANK_OUTSIDE_THE_WORKING_DIRECTORY + 1;
3934
+ var DRIVE_PREFIX = /^[a-z]:/i;
3935
+ var PATH_SEPARATOR = /[\\/]/;
3936
+ var TWO_SEPARATORS_THEN_A_NAME = /^[\\/]{2}[^\\/]/;
3937
+ var DOTS_AND_SPACES_WINDOWS_DROPS = /[. ]+$/;
3938
+ var PROCESS_WHOSE_ROOT_IS_LINKED = /^(?:self|thread-self|\d+)$/;
3939
+ var MACOS_DATA_VOLUME_FOLDERS = ["system", "volumes", "data"];
3940
+ var PROCESS_FOLDER = "proc";
3941
+ var PROCESS_ROOT_LINK = "root";
3942
+ var PROCESS_ROOT_FOLDERS = 3;
3943
+ var MOUNT_PARENT_FOLDERS = ["volumes", "mnt"];
3944
+ var MOUNT_FOLDERS = 2;
3945
+ var MACOS_PRIVATE_FOLDER = "private";
3946
+ var MACOS_PRIVATE_FOLDERS = 1;
3947
+ var FOLDERS_MACOS_KEEPS_UNDER_PRIVATE = ["etc", "var", "tmp"];
3948
+ var HOME_PARENT_FOLDERS = ["users", "home"];
3949
+ var FOLDERS_EVERY_HOME_SHARES = ["shared", "public"];
3950
+ var SUPERUSER_HOME_FOLDER = "root";
3951
+ var MACOS_SUPERUSER_HOME_PARENT = "var";
3952
+ var HIDDEN_ENTRY_PREFIX = ".";
3953
+ var HOME_APP_DATA_FOLDERS = ["library", "appdata"];
3954
+ var HOME_APP_DATA_FOLDERS_HOLDING_NOTHING_KEPT = ["caches", "logs"];
3955
+ var SYSTEM_FOLDERS_OF_A_COMPUTER = ["etc", "library", "system", "usr", "bin", "sbin", "dev", "boot", "lib", "lib64", "var", "applications", "opt", "proc", "sys"];
3956
+ var ENTRIES_OF_A_SYSTEM_FOLDER_HOLDING_NOTHING_KEPT = {
3957
+ dev: ["null", "zero", "tty", "stdin", "stdout", "stderr", "fd", "random", "urandom"],
3958
+ var: ["folders", "tmp", "log"]
3959
+ };
3960
+ var SYSTEM_FOLDERS_OF_A_DRIVE = ["windows", "program files", "program files (x86)", "programdata"];
3961
+ var SENSITIVE_PLACE_LABELS = {
3962
+ hiddenInAHome: "hidden in a home folder",
3963
+ appDataOfAHome: "app data in a home folder",
3964
+ system: "a system folder"
3965
+ };
3966
+ var SEPARATOR_RUN = /[\\/]{2,}/g;
3967
+ var NETWORK_GRANT = "use the network";
3968
+ var WRITABLE_LEAD = "read and write ";
3969
+ var READ_ONLY_LEAD = "read ";
3970
+ var LIST_SEPARATOR = ", ";
3971
+ var QUOTE_UNITS = 2;
3972
+ var DETAILS_NOTE = " The details list every path.";
3973
+ var PERMISSIONS_HEADING = "Requested permissions:";
3974
+ var ELISION_MARK = "\u2026";
3975
+ var PATH_NO_REDACTION_SETTLES = "[redacted]";
3976
+ var SETTLING_PASSES = 4;
3977
+ var NAMED_PATH_FLOOR_UNITS = 32;
3978
+ var ONLY_NAMED_PATH_FLOOR_UNITS = 12;
3979
+ var NEVER_DRAWN_OR_BLANK = /^(?:[\p{C}\p{Zl}\p{Zp}\p{Default_Ignorable_Code_Point}\u2800]|(?! )\p{Zs})$/u;
3980
+ var COMBINING_MARK = /^\p{M}$/u;
3981
+ var LETTER_OR_DIGIT = /^[\p{L}\p{N}]$/u;
3982
+ var DISPLAY_UNIT = /\\ud[89ab][0-9a-f]{2}\\ud[c-f][0-9a-f]{2}|\\u[0-9a-f]{4}|\\["\\]|\[redacted(?: key)?\]|[\s\S]/gu;
3983
+ var PATH_IN_A_QUESTION = { backslashed: '"\\', reserved: ELISION_MARK };
3984
+ var PROSE_IN_QUOTES = { backslashed: '"\\', reserved: "" };
3985
+ var TEXT_ALREADY_ESCAPED = { backslashed: "", reserved: "" };
3986
+ var unitEscapes = (text3) => Array.from({ length: text3.length }, (_, index) => `\\u${text3.charCodeAt(index).toString(16).padStart(4, "0")}`).join("");
3987
+ var withCodePointVisible = (rules) => (shown, codePoint) => {
3988
+ if (rules.backslashed.includes(codePoint)) return { text: `${shown.text}\\${codePoint}`, marksHaveABase: false };
3989
+ if (rules.reserved.includes(codePoint) || NEVER_DRAWN_OR_BLANK.test(codePoint)) return { text: `${shown.text}${unitEscapes(codePoint)}`, marksHaveABase: false };
3990
+ if (COMBINING_MARK.test(codePoint)) return { text: `${shown.text}${shown.marksHaveABase ? codePoint : unitEscapes(codePoint)}`, marksHaveABase: shown.marksHaveABase };
3991
+ return { text: `${shown.text}${codePoint}`, marksHaveABase: LETTER_OR_DIGIT.test(codePoint) };
3992
+ };
3993
+ var visibleText = (text3, rules) => Array.from(text3).reduce(withCodePointVisible(rules), { text: "", marksHaveABase: false }).text;
3994
+ var inQuotes = (inside) => `"${inside}"`;
3995
+ var leadingUnitsWithin = (displayUnits, maxUnits) => {
3996
+ const kept = [];
3997
+ let units = 0;
3998
+ for (const displayUnit of displayUnits) {
3999
+ if (units + displayUnit.length > maxUnits) break;
4000
+ kept.push(displayUnit);
4001
+ units += displayUnit.length;
4002
+ }
4003
+ return kept;
4004
+ };
4005
+ var shortenedInTheMiddle = (text3, maxUnits) => {
4006
+ if (text3.length <= maxUnits) return text3;
4007
+ const displayUnits = text3.match(DISPLAY_UNIT) ?? [];
4008
+ const keptUnits = maxUnits - ELISION_MARK.length;
4009
+ const headUnits = Math.ceil(keptUnits / 2);
4010
+ const head = leadingUnitsWithin(displayUnits, headUnits);
4011
+ const tail = [...leadingUnitsWithin([...displayUnits].reverse(), keptUnits - headUnits)].reverse();
4012
+ return `${head.join("")}${ELISION_MARK}${tail.join("")}`;
4013
+ };
4014
+ var isStillInQuotes = (text3) => text3.length >= QUOTE_UNITS && text3.startsWith('"') && text3.endsWith('"');
4015
+ var settledWithin = (inside, maxUnits, passesLeft = SETTLING_PASSES) => {
4016
+ const shortened = shortenedInTheMiddle(inside, maxUnits);
4017
+ const redacted = redactSecrets(inQuotes(shortened));
4018
+ if (redacted === inQuotes(shortened)) return shortened;
4019
+ if (passesLeft === 0 || !isStillInQuotes(redacted)) return PATH_NO_REDACTION_SETTLES;
4020
+ return settledWithin(visibleText(redacted.slice(1, -1), TEXT_ALREADY_ESCAPED), maxUnits, passesLeft - 1);
4021
+ };
4022
+ var isNamedSegment = (segment) => segment.length > 0;
4023
+ var withoutWhatWindowsDrops = (segment) => segment.replace(DOTS_AND_SPACES_WINDOWS_DROPS, "");
4024
+ var pathShape = (path) => {
4025
+ const drive = DRIVE_PREFIX.exec(path)?.[0].toLowerCase() ?? null;
4026
+ const segments = path.slice(drive?.length ?? 0).split(PATH_SEPARATOR);
4027
+ return {
4028
+ drive,
4029
+ doubleSlashed: drive === null && TWO_SEPARATORS_THEN_A_NAME.test(path),
4030
+ segments: (drive === null ? segments : segments.map(withoutWhatWindowsDrops)).filter(isNamedSegment)
4031
+ };
4032
+ };
4033
+ var spellingOf = ({ drive, doubleSlashed, segments }) => `${drive ?? ""}${doubleSlashed ? "//" : "/"}${segments.join("/")}`;
4034
+ var startsWithTheDataVolume = (folders) => MACOS_DATA_VOLUME_FOLDERS.every((folder, index) => folders[index] === folder);
4035
+ var startsWithAProcessRoot = ([first, second, third]) => first === PROCESS_FOLDER && second !== void 0 && PROCESS_WHOSE_ROOT_IS_LINKED.test(second) && third === PROCESS_ROOT_LINK;
4036
+ var startsWithAMount = ([first, second]) => first !== void 0 && second !== void 0 && MOUNT_PARENT_FOLDERS.includes(first);
4037
+ var startsWithAFolderMacosKeepsUnderPrivate = ([first, second]) => first === MACOS_PRIVATE_FOLDER && second !== void 0 && FOLDERS_MACOS_KEEPS_UNDER_PRIVATE.includes(second);
4038
+ var beyondRootAliases = ({ root, folders }) => {
4039
+ if (startsWithTheDataVolume(folders)) return beyondRootAliases({ root: "volume", folders: folders.slice(MACOS_DATA_VOLUME_FOLDERS.length) });
4040
+ if (startsWithAProcessRoot(folders)) return beyondRootAliases({ root: "computer", folders: folders.slice(PROCESS_ROOT_FOLDERS) });
4041
+ if (startsWithAMount(folders)) return beyondRootAliases({ root: "volume", folders: folders.slice(MOUNT_FOLDERS) });
4042
+ if (startsWithAFolderMacosKeepsUnderPrivate(folders)) return beyondRootAliases({ root, folders: folders.slice(MACOS_PRIVATE_FOLDERS) });
4043
+ return { root, folders };
4044
+ };
4045
+ var placeOf = ({ drive, segments }) => {
4046
+ const folders = segments.map((segment) => segment.toLowerCase());
4047
+ return drive === null ? beyondRootAliases({ root: "computer", folders }) : { root: "drive", folders };
4048
+ };
4049
+ var namesAHome = (parent, folder) => HOME_PARENT_FOLDERS.includes(parent) && !FOLDERS_EVERY_HOME_SHARES.includes(folder) || parent === MACOS_SUPERUSER_HOME_PARENT && folder === SUPERUSER_HOME_FOLDER;
4050
+ var homeRelativePlace = ({ root, folders }) => {
4051
+ const [first, second] = folders;
4052
+ if (first === SUPERUSER_HOME_FOLDER) return { home: `${root}/${first}`, inside: folders.slice(1) };
4053
+ if (first === void 0 || second === void 0 || !namesAHome(first, second)) return null;
4054
+ return { home: `${root}/${first}/${second}`, inside: folders.slice(2) };
4055
+ };
4056
+ var sensitivePlaceInAHome = ({ home, inside }) => {
4057
+ const [entry2, kept] = inside;
4058
+ if (entry2 === void 0) return null;
4059
+ if (entry2.startsWith(HIDDEN_ENTRY_PREFIX)) return { kind: "hiddenInAHome", folder: `${home}/${entry2}`, isTheFolderItself: kept === void 0 };
4060
+ if (!HOME_APP_DATA_FOLDERS.includes(entry2) || kept !== void 0 && HOME_APP_DATA_FOLDERS_HOLDING_NOTHING_KEPT.includes(kept)) return null;
4061
+ return { kind: "appDataOfAHome", folder: `${home}/${entry2}`, isTheFolderItself: kept === void 0 };
4062
+ };
4063
+ var holdsNothingKept = (systemFolder, entry2) => entry2 !== void 0 && (ENTRIES_OF_A_SYSTEM_FOLDER_HOLDING_NOTHING_KEPT[systemFolder] ?? []).includes(entry2);
4064
+ var systemFoldersOf = (root) => root === "drive" ? SYSTEM_FOLDERS_OF_A_DRIVE : SYSTEM_FOLDERS_OF_A_COMPUTER;
4065
+ var sensitivePlaceOf = (place) => {
4066
+ const home = homeRelativePlace(place);
4067
+ if (home !== null) return sensitivePlaceInAHome(home);
4068
+ const [first, entry2] = place.folders;
4069
+ if (first === void 0 || !systemFoldersOf(place.root).includes(first) || holdsNothingKept(first, entry2)) return null;
4070
+ return { kind: "system", folder: `${place.root}/${first}`, isTheFolderItself: entry2 === void 0 };
4071
+ };
4072
+ var broadRootOf = (shape, place, sensitivePlace) => {
4073
+ const [first, second] = place.folders;
4074
+ if (first === void 0) return place.root;
4075
+ if (homeRelativePlace(place)?.inside.length === 0) return "home";
4076
+ if (second === void 0) return HOME_PARENT_FOLDERS.includes(first) ? "everyHome" : "topLevel";
4077
+ return shape.doubleSlashed && shape.segments.length === 2 && sensitivePlace === null ? "share" : null;
4078
+ };
4079
+ var isInside = (path, folder) => folder.segments.length > 0 && path.drive === folder.drive && path.doubleSlashed === folder.doubleSlashed && folder.segments.every((segment, index) => path.segments[index] === segment);
4080
+ var FITTING_PLANS = [
4081
+ { pointsToTheDetails: false, onlyWhenNothingIsLeftOut: true },
4082
+ { pointsToTheDetails: true, onlyWhenNothingIsLeftOut: false },
4083
+ { pointsToTheDetails: false, onlyWhenNothingIsLeftOut: false }
4084
+ ];
4085
+ var workingDirectory = (cwd) => {
4086
+ const shape = pathShape(cwd);
4087
+ const placed = sensitivePlaceOf(placeOf(shape));
4088
+ return { shape, sensitiveFolder: placed === null || placed.isTheFolderItself ? null : placed.folder };
4089
+ };
4090
+ var namingRank = (broadRoot, sensitivePlace, insideTheWorkingDirectory) => {
4091
+ if (broadRoot !== null) return BROAD_ROOTS_IN_NAMING_ORDER.indexOf(broadRoot);
4092
+ if (sensitivePlace !== null) return RANK_IN_A_SENSITIVE_PLACE;
4093
+ return insideTheWorkingDirectory ? RANK_INSIDE_THE_WORKING_DIRECTORY : RANK_OUTSIDE_THE_WORKING_DIRECTORY;
4094
+ };
4095
+ var firstSeparatorOfARun = (run) => run.slice(0, 1);
4096
+ var withSeparatorRunsCollapsed = (path, { doubleSlashed }) => {
4097
+ const collapsed = path.replace(SEPARATOR_RUN, firstSeparatorOfARun);
4098
+ return doubleSlashed ? `${collapsed.slice(0, 1)}${collapsed}` : collapsed;
4099
+ };
4100
+ var isAWholeSystemFolder = (broadRoot, sensitivePlace) => broadRoot === "topLevel" && sensitivePlace?.kind === "system";
4101
+ var placeLabel = (broadRoot, sensitivePlace) => {
4102
+ if (broadRoot !== null && !isAWholeSystemFolder(broadRoot, sensitivePlace)) return ` (${BROAD_ROOT_LABELS[broadRoot]})`;
4103
+ return sensitivePlace === null ? "" : ` (${SENSITIVE_PLACE_LABELS[sensitivePlace.kind]})`;
4104
+ };
4105
+ var grantedPath = (path, cwd) => {
4106
+ const shape = pathShape(path);
4107
+ const place = placeOf(shape);
4108
+ const placed = sensitivePlaceOf(place);
4109
+ const insideTheWorkingDirectory = isInside(shape, cwd.shape);
4110
+ const sensitivePlace = placed !== null && insideTheWorkingDirectory && placed.folder === cwd.sensitiveFolder ? null : placed;
4111
+ const broadRoot = broadRootOf(shape, place, sensitivePlace);
4112
+ return {
4113
+ shown: settledWithin(visibleText(redactSecrets(withSeparatorRunsCollapsed(path, shape)), PATH_IN_A_QUESTION), Number.POSITIVE_INFINITY),
4114
+ label: placeLabel(broadRoot, sensitivePlace),
4115
+ sensitive: broadRoot !== null || sensitivePlace !== null,
4116
+ rank: namingRank(broadRoot, sensitivePlace, insideTheWorkingDirectory)
4117
+ };
4118
+ };
4119
+ var firstSpellings = (paths2) => {
4120
+ const spelled = /* @__PURE__ */ new Map();
4121
+ for (const path of paths2) {
4122
+ const spelling = spellingOf(pathShape(path));
4123
+ if (!spelled.has(spelling)) spelled.set(spelling, path);
4124
+ }
4125
+ return spelled;
4126
+ };
4127
+ var mostImportantFirst = (first, second) => first.rank - second.rank;
4128
+ var hasPaths = (list) => list.paths.length > 0;
4129
+ var permissionGrant = (profile, cwd) => {
4130
+ const from = workingDirectory(cwd);
4131
+ const writable = firstSpellings(codexPermissionPaths(profile, "write"));
4132
+ const isNotAlsoWritable = ([spelling]) => !writable.has(spelling);
4133
+ const readOnly = [...firstSpellings(codexPermissionPaths(profile, "read"))].filter(isNotAlsoWritable).map(([, path]) => path);
4134
+ const listOf = (lead, listed) => ({ lead, paths: listed.map((path) => grantedPath(path, from)).sort(mostImportantFirst) });
4135
+ return { network: profile.network?.enabled === true, lists: [listOf(WRITABLE_LEAD, [...writable.values()]), listOf(READ_ONLY_LEAD, readOnly)].filter(hasPaths) };
4136
+ };
4137
+ var isSensitive = (path) => path.sensitive;
4138
+ var sensitiveNote = (counted) => {
4139
+ const sensitive = counted.filter(isSensitive).length;
4140
+ if (sensitive === 0) return "";
4141
+ return sensitive === counted.length ? ", all sensitive" : `, ${sensitive} of them sensitive`;
4142
+ };
4143
+ var restOf = (unnamed) => unnamed.length === 0 ? "" : ` and ${unnamed.length} more${sensitiveNote(unnamed)}`;
4144
+ var countedOnly = ({ lead, paths: paths2 }) => ({
4145
+ text: `${lead}${paths2.length} ${paths2.length === 1 ? "path" : "paths"}${sensitiveNote(paths2)}`,
4146
+ named: 0,
4147
+ complete: false
4148
+ });
4149
+ var leastNamedUnits = ({ lead, paths: paths2 }) => {
4150
+ const [first, ...rest] = paths2;
4151
+ if (first === void 0) return 0;
4152
+ return lead.length + QUOTE_UNITS + Math.min(first.shown.length, ONLY_NAMED_PATH_FLOOR_UNITS) + first.label.length + restOf(rest).length;
4153
+ };
4154
+ var fairShareOf = (lengths, units) => {
4155
+ const shortestFirst = [...lengths].sort((first, second) => first - second);
4156
+ let unitsLeft = units;
4157
+ for (const [position, length] of shortestFirst.entries()) {
4158
+ const share = Math.floor(unitsLeft / (shortestFirst.length - position));
4159
+ if (length > share) return share;
4160
+ unitsLeft -= length;
4161
+ }
4162
+ return Number.POSITIVE_INFINITY;
4163
+ };
4164
+ var namingTheFirst = ({ lead, paths: paths2 }, count, units) => {
4165
+ const named = paths2.slice(0, count);
4166
+ const rest = restOf(paths2.slice(count));
4167
+ const lengths = named.map((path) => path.shown.length);
4168
+ const floor = count === 1 ? ONLY_NAMED_PATH_FLOOR_UNITS : NAMED_PATH_FLOOR_UNITS;
4169
+ const pathUnits = units - lead.length - rest.length - LIST_SEPARATOR.length * (count - 1) - named.reduce((sum, path) => sum + QUOTE_UNITS + path.label.length, 0);
4170
+ if (pathUnits < lengths.reduce((sum, length) => sum + Math.min(length, floor), 0)) return null;
4171
+ const share = fairShareOf(lengths, pathUnits);
4172
+ const fitted = named.map((path) => ({ path, shown: settledWithin(path.shown, share) }));
4173
+ return {
4174
+ text: `${lead}${fitted.map(({ path, shown }) => `${inQuotes(shown)}${path.label}`).join(LIST_SEPARATOR)}${rest}`,
4175
+ named: count,
4176
+ complete: count === paths2.length && fitted.every(({ path, shown }) => shown === path.shown)
4177
+ };
4178
+ };
4179
+ var namedWithin = (list, units) => {
4180
+ for (let count = list.paths.length; count > 0; count -= 1) {
4181
+ const fitted = namingTheFirst(list, count, units);
4182
+ if (fitted !== null) return fitted;
4183
+ }
4184
+ return null;
4185
+ };
4186
+ var namesAsMany = (shared, unshared) => shared !== null && shared.named === unshared.named;
4187
+ var fittedAlone = (list, units) => {
4188
+ const named = namedWithin(list, units);
4189
+ return named === null ? null : [named];
4190
+ };
4191
+ var fittedLists = ([first, second], units) => {
4192
+ if (first === void 0) return [];
4193
+ if (second === void 0) return fittedAlone(first, units);
4194
+ const counted = countedOnly(second);
4195
+ const unshared = namedWithin(first, units - counted.text.length);
4196
+ if (unshared === null) return null;
4197
+ const shared = namedWithin(first, units - leastNamedUnits(second));
4198
+ const leading = namesAsMany(shared, unshared) ? shared : unshared;
4199
+ return [leading, namedWithin(second, units - leading.text.length) ?? counted];
4200
+ };
4201
+ var asAQuestion = (network, lists, pointsToTheDetails) => {
4202
+ const grants = [...network ? [NETWORK_GRANT] : [], ...lists];
4203
+ const inAList = grants.length < 2 ? grants.join("") : `${grants.slice(0, -1).join(", ")}, and ${grants.slice(-1).join("")}`;
4204
+ return `Allow Codex to ${inAList}?${pointsToTheDetails ? DETAILS_NOTE : ""}`;
4205
+ };
4206
+ var questionUnder = ({ network, lists }, plan) => {
4207
+ const frameUnits = asAQuestion(network, lists.map(() => ""), plan.pointsToTheDetails).length;
4208
+ const fitted = fittedLists(lists, CODEX_PERMISSION_QUESTION_MAX_UNITS - frameUnits);
4209
+ if (fitted === null) return null;
4210
+ const nothingIsLeftOut = fitted.every((list) => list.complete);
4211
+ if (plan.onlyWhenNothingIsLeftOut && !nothingIsLeftOut) return null;
4212
+ return asAQuestion(network, fitted.map((list) => list.text), plan.pointsToTheDetails && !nothingIsLeftOut);
4213
+ };
4214
+ var isAskable = (question) => question !== null && question.length <= CODEX_PERMISSION_QUESTION_MAX_UNITS && redactSecrets(question) === question;
4215
+ var codexPermissionProfileQuestion = (profile, cwd) => {
4216
+ const grant = permissionGrant(profile, cwd);
4217
+ if (!grant.network && grant.lists.length === 0) return CODEX_PERMISSION_QUESTION_WITHOUT_A_GRANT;
4218
+ return FITTING_PLANS.map((plan) => questionUnder(grant, plan)).find(isAskable) ?? asAQuestion(grant.network, grant.lists.map((list) => countedOnly(list).text), true);
4219
+ };
4220
+ var codexPermissionProfileDetail = (profile) => `${PERMISSIONS_HEADING}
4221
+ ${JSON.stringify(profile, null, 2).split("\n").map((line) => visibleText(line, TEXT_ALREADY_ESCAPED)).join("\n")}`;
4222
+ var codexProseOnOneQuotedLine = (prose) => inQuotes(visibleText(prose, PROSE_IN_QUOTES));
3856
4223
  var codexPermissionProfileResponse = (permissions, answer) => ({
3857
4224
  permissions: answer === CODEX_PERMISSION_PROFILE_CHOICES.turn || answer === CODEX_PERMISSION_PROFILE_CHOICES.session ? permissions : {},
3858
4225
  scope: answer === CODEX_PERMISSION_PROFILE_CHOICES.session ? "session" : "turn"
@@ -3901,9 +4268,9 @@ var fileChangeQuestion = (changes) => {
3901
4268
  return `Allow these ${changes.length} file changes once? ${named}${unnamed > 0 ? ` and ${unnamed} more` : ""}`;
3902
4269
  };
3903
4270
  var codexElicitationToolName = (serverName, toolName) => `mcp__${serverName}__${toolName}`;
3904
- var withCodexReason = (detail, reason) => text(reason) ? `${detail}
3905
-
3906
- Codex's reason: ${redactSecrets(reason)}` : detail;
4271
+ var CODEX_REASON_LEAD = "\n\nCodex's reason: ";
4272
+ var withCodexReason = (detail, reason) => text(reason) ? `${detail}${CODEX_REASON_LEAD}${redactSecrets(reason)}` : detail;
4273
+ var withCodexReasonOnOneQuotedLine = (detail, reason) => text(reason) ? `${detail}${CODEX_REASON_LEAD}${codexProseOnOneQuotedLine(redactSecrets(reason))}` : detail;
3907
4274
  var parseCodexNativeApproval = (value) => {
3908
4275
  if (!record3(value) || !keys2(value, ["method", "params", "changes"]) || !isMethod(value.method) || !record3(value.params) || !boundedJson(value)) return null;
3909
4276
  const p = value.params;
@@ -3964,8 +4331,8 @@ var parseCodexNativeApproval = (value) => {
3964
4331
  toolName: "request_permissions",
3965
4332
  toolInputs: [{ permissions: p.permissions }],
3966
4333
  scopePaths: [...codexPermissionPaths(p.permissions, "read"), ...codexPermissionPaths(p.permissions, "write")],
3967
- question: "Allow these permissions for this turn or session?",
3968
- detail: withCodexReason(JSON.stringify(p.permissions, null, 2), p.reason),
4334
+ question: codexPermissionProfileQuestion(p.permissions, p.cwd),
4335
+ detail: withCodexReasonOnOneQuotedLine(codexPermissionProfileDetail(p.permissions), p.reason),
3969
4336
  options: [CODEX_PERMISSION_PROFILE_CHOICES.turn, CODEX_PERMISSION_PROFILE_CHOICES.session, CODEX_PERMISSION_PROFILE_CHOICES.deny]
3970
4337
  };
3971
4338
  }
@@ -4039,6 +4406,12 @@ var SPAWN_RECOVERY = {
4039
4406
  receiptRetentionMs: 7 * 24 * 60 * 60 * 1e3,
4040
4407
  retrySendWindowMs: 60 * 60 * 1e3
4041
4408
  };
4409
+ var SPAWN_LAUNCH_FAILED_CODE = "launch_failed";
4410
+ var SPAWN_UNCONFIRMED_ATTEMPT_FAILURE = {
4411
+ code: SPAWN_LAUNCH_FAILED_CODE,
4412
+ message: "The previous launch could not be confirmed. Check your sessions before starting another.",
4413
+ retryable: true
4414
+ };
4042
4415
 
4043
4416
  // ../contracts/src/claude-inbox.ts
4044
4417
  var CLAUDE_INBOX = {
@@ -6923,11 +7296,32 @@ var substitutionFedTo = (pieces, index) => {
6923
7296
  const next = pieces[index + 1];
6924
7297
  return next !== void 0 && SUBSTITUTION_OPENERS.has(next.before) ? next.text : null;
6925
7298
  };
7299
+ var REDIRECTION_REMOVED = " ";
7300
+ var arrowReadingInForce = null;
7301
+ var anArrowWasReadAsText = false;
7302
+ var underEachArrowReading = (judge) => {
7303
+ if (arrowReadingInForce !== null) return [judge()];
7304
+ try {
7305
+ anArrowWasReadAsText = false;
7306
+ arrowReadingInForce = "arrows_the_shell_sees";
7307
+ const withArrowsTheShellSees = judge();
7308
+ if (!anArrowWasReadAsText) return [withArrowsTheShellSees];
7309
+ arrowReadingInForce = "every_arrow";
7310
+ return [withArrowsTheShellSees, judge()];
7311
+ } finally {
7312
+ arrowReadingInForce = null;
7313
+ }
7314
+ };
7315
+ var isTrue = (answer) => answer;
7316
+ var underEitherArrowReading = (judge) => underEachArrowReading(judge).some(isTrue);
6926
7317
  var withoutOutputRedirectionTargets = (text3) => {
7318
+ if (arrowReadingInForce === "every_arrow") return text3.replace(OUTPUT_REDIRECTION, REDIRECTION_REMOVED);
6927
7319
  const visible = shellVisibleText(text3);
6928
7320
  const removeVisibleRedirection = (match, _target, offset) => {
6929
7321
  const operator = offset + match.search(REDIRECTION_OPERATOR_CHARACTER);
6930
- return visible === null || REDIRECTION_OPERATOR_CHARACTER.test(visible.charAt(operator)) ? " " : match;
7322
+ if (visible === null || REDIRECTION_OPERATOR_CHARACTER.test(visible.charAt(operator))) return REDIRECTION_REMOVED;
7323
+ anArrowWasReadAsText = true;
7324
+ return match;
6931
7325
  };
6932
7326
  return text3.replace(OUTPUT_REDIRECTION, removeVisibleRedirection);
6933
7327
  };
@@ -8562,7 +8956,7 @@ var isScopeContract = (value) => {
8562
8956
  if (c.promises !== void 0 && !strings(c.promises)) return false;
8563
8957
  return strings(c.allowedPaths) && strings(c.offLimitsPaths) && typeof c.doneWhen === "string";
8564
8958
  };
8565
- var findBestRoute = (routes, toolName, args, repoKey) => {
8959
+ var routeMatchingBestUnderOneArrowReading = (routes, toolName, args, repoKey) => {
8566
8960
  let best;
8567
8961
  let bestWeight = 0;
8568
8962
  let bestScoped = -1;
@@ -8583,7 +8977,13 @@ var findBestRoute = (routes, toolName, args, repoKey) => {
8583
8977
  bestLength = length;
8584
8978
  }
8585
8979
  }
8586
- return best ?? routes.find((r) => r.toolPattern === "*");
8980
+ return best;
8981
+ };
8982
+ var isAMatchedRoute = (route) => route !== void 0;
8983
+ var routeWaitsForSomeoneElse = (route) => route.answeredBySomeoneElse === true;
8984
+ var findBestRoute = (routes, toolName, args, repoKey) => {
8985
+ const matched = underEachArrowReading(() => routeMatchingBestUnderOneArrowReading(routes, toolName, args, repoKey)).filter(isAMatchedRoute);
8986
+ return matched.find(routeWaitsForSomeoneElse) ?? matched[0] ?? routes.find((r) => r.toolPattern === "*");
8587
8987
  };
8588
8988
  var autoApprove = (tool) => ({
8589
8989
  tool,
@@ -8698,11 +9098,13 @@ var resolvePolicyReading = (reach, config, toolName, modeOverride, toolInput, cw
8698
9098
  }
8699
9099
  return base;
8700
9100
  };
8701
- var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId) => {
9101
+ var policyUnderOneArrowReading = (config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId) => {
8702
9102
  const withoutRunners = resolvePolicyReading(SPELLS_WITHOUT_COMMAND_RUNNERS, config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId);
8703
9103
  const withRunners = resolvePolicyReading(SPELLS_COMMAND_RUNNERS_TOO, config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId);
8704
9104
  return strictestReadingOf(withRunners, withoutRunners);
8705
9105
  };
9106
+ var keepingTheStrictestReading = (strictest, reading) => strictestReadingOf(reading, strictest);
9107
+ var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId) => underEachArrowReading(() => policyUnderOneArrowReading(config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId)).reduce(keepingTheStrictestReading);
8706
9108
  var VERDICT_RESTRAINT = { allow: 0, requires_human: 1, deny: 2 };
8707
9109
  var verdictRestraint = (policy) => VERDICT_RESTRAINT[verdictForPolicy(policy)];
8708
9110
  var asksAtLeastAsHard = (policy, than) => restraintRank(policy) >= restraintRank(than) && TIMEOUT_ACTION_STRICTNESS[policy.timeoutAction] >= TIMEOUT_ACTION_STRICTNESS[than.timeoutAction] && policy.timeoutSeconds >= than.timeoutSeconds && policy.pushFirstSeconds <= than.pushFirstSeconds;
@@ -8927,15 +9329,18 @@ var policyForScopeQuestion = (policy) => policy.timeoutAction === "approve" ? {
8927
9329
  pushFirstSeconds: policy.pushFirstSeconds > 0 ? policy.pushFirstSeconds : SCOPE_QUESTION_FIRST_WAIT_SECONDS
8928
9330
  } : policy;
8929
9331
  var isAReading = (reading) => reading !== null && reading.trim() !== "";
9332
+ var readingsOfScriptsWrittenForAShell = (command) => readingsOfNestedShellScripts(command, scriptsWrittenForAShellOrAnEval);
8930
9333
  var extraReadingsOf = (toolInput) => {
8931
9334
  const { command } = toolInput;
8932
9335
  if (typeof command !== "string" || command.length > LONGEST_COMMAND_READ_FOR_A_PUSH) return [];
8933
9336
  const commentFree = readingWithoutCommentsOrAnsiEscapes(command);
8934
9337
  const spelledOut = [command, commentFree].filter(isAReading).map(readingWithShellFormsSpelledOut);
9338
+ const scanned = [command, commentFree, ...spelledOut].filter(isAReading);
8935
9339
  const readings = [
8936
9340
  commentFree,
8937
9341
  ...spelledOut,
8938
- ...[command, commentFree, ...spelledOut].filter(isAReading).flatMap(readingsOfScriptsPassedToAShell)
9342
+ ...scanned.flatMap(readingsOfScriptsPassedToAShell),
9343
+ ...scanned.flatMap(readingsOfScriptsWrittenForAShell)
8939
9344
  ];
8940
9345
  return readings.filter(isAReading).map((reading) => ({ ...toolInput, command: reading }));
8941
9346
  };
@@ -8948,7 +9353,16 @@ var readingsNotYetJudged = (toolInputs) => {
8948
9353
  });
8949
9354
  };
8950
9355
  var withExtraReadings = (input) => shellDialectOf(input.toolName) !== void 0 ? { ...input, toolInputs: [...input.toolInputs, ...readingsNotYetJudged(input.toolInputs)] } : input;
8951
- var resolveGate = (rawInput) => {
9356
+ var GATE_VERDICT_RESTRAINT = { allow: 0, defer: 1, gate: 2, deny: 3, kill: 4 };
9357
+ var strictestGateVerdictOf = (strictest, verdict) => {
9358
+ const restraint = GATE_VERDICT_RESTRAINT[verdict.kind] - GATE_VERDICT_RESTRAINT[strictest.kind];
9359
+ if (restraint !== 0) return restraint > 0 ? verdict : strictest;
9360
+ return strictest.kind === "gate" && verdict.kind === "gate" ? { ...strictest, policy: strictestReadingOf(verdict.policy, strictest.policy) } : strictest;
9361
+ };
9362
+ var policyOfReadings = (readings) => readings.policy;
9363
+ var toolInputsOfReadings = (readings) => readings.toolInputs;
9364
+ var readingsAreAllowed = (readings) => verdictForPolicy(readings.policy) === "allow";
9365
+ var gateVerdictUnderOneArrowReading = (rawInput) => {
8952
9366
  const input = withExtraReadings(rawInput);
8953
9367
  const { modeState, config, toolName, toolInputs, cwd, sessionId } = input;
8954
9368
  const repoKey = input.sharedRepoKey ?? input.repoKey;
@@ -8964,16 +9378,23 @@ var resolveGate = (rawInput) => {
8964
9378
  const legacyPolicy = (toolInputs.length ? toolInputs : [void 0]).map((toolInput) => resolvePolicy(config, toolName, modeState.mode, toolInput, cwd, input.repoKey, sessionId)).find((policy2) => policy2.repoKey === input.repoKey && verdictForPolicy(policy2) === "deny");
8965
9379
  if (legacyPolicy) return { kind: "deny", policy: legacyPolicy, reason: `Denied by policy for ${legacyPolicy.tool}` };
8966
9380
  }
8967
- const policy = toolInputs.slice(rawInput.toolInputs.length).map((reading) => resolvePolicy(config, toolName, modeState.mode, reading, cwd, repoKey, sessionId)).reduce(
8968
- (strictest, reading) => strictestReadingOf(reading, strictest),
8969
- resolvePolicyAcross(config, toolName, modeState.mode, rawInput.toolInputs, cwd, repoKey, sessionId)
8970
- );
9381
+ const written = {
9382
+ toolInputs: rawInput.toolInputs,
9383
+ policy: resolvePolicyAcross(config, toolName, modeState.mode, rawInput.toolInputs, cwd, repoKey, sessionId)
9384
+ };
9385
+ const extra = toolInputs.slice(rawInput.toolInputs.length).map((reading) => ({
9386
+ toolInputs: [reading],
9387
+ policy: resolvePolicy(config, toolName, modeState.mode, reading, cwd, repoKey, sessionId)
9388
+ }));
9389
+ const policy = extra.map(policyOfReadings).reduce(keepingTheStrictestReading, written.policy);
8971
9390
  const verdict = verdictForPolicy(policy);
8972
9391
  const autoDenies = verdict === "deny";
8973
9392
  const allowedByBypassMode = !autoDenies && verdict !== "allow" && bypassModeAllows(input);
8974
- const askBesideARoutedPush = verdict === "allow" ? askAtTheRouteOfAPush(input, repoKey, policy) : void 0;
9393
+ const allowed = [written, ...extra].filter(readingsAreAllowed);
9394
+ const allowedBy = allowed[0]?.policy;
9395
+ const askBesideARoutedPush = autoDenies || allowedBy === void 0 ? void 0 : askAtTheRouteOfAPush({ ...input, toolInputs: allowed.flatMap(toolInputsOfReadings) }, repoKey, allowedBy);
8975
9396
  const autoApproves = (verdict === "allow" || allowedByBypassMode) && askBesideARoutedPush === void 0;
8976
- const askedPolicy = askBesideARoutedPush ?? policy;
9397
+ const askedPolicy = askBesideARoutedPush === void 0 ? policy : strictestReadingOf(policy, askBesideARoutedPush);
8977
9398
  if (autoDenies) return { kind: "deny", policy, reason: `Denied by policy for ${policy.tool}` };
8978
9399
  if (isAskedInEveryMode(toolName)) return { kind: "gate", policy };
8979
9400
  if (isModeStateDegraded(modeState)) {
@@ -9003,6 +9424,7 @@ var resolveGate = (rawInput) => {
9003
9424
  scopePath: scopeReason && "path" in scopeVerdict ? widenablePath(scopeVerdict.path) : void 0
9004
9425
  };
9005
9426
  };
9427
+ var resolveGate = (rawInput) => underEachArrowReading(() => gateVerdictUnderOneArrowReading(rawInput)).reduce(strictestGateVerdictOf);
9006
9428
  var noModeOverrideIsActive = (input) => (input.modeState.mode ?? input.config.modeOverride ?? null) === null;
9007
9429
  var editAsksAtTheAgentsPrompt = (input, verdict) => verdict.kind === "gate" && !verdict.scopeReason && noModeOverrideIsActive(input) && !aChosenRuleGoverns(input) && verdict.policy.mode === "push_first" && FILE_EDIT_TOOLS.has(input.toolName);
9008
9430
  var claudePromptsBeforeAnEdit = (permissionMode) => permissionMode === "default";
@@ -9037,10 +9459,11 @@ var codexDeferredPreToolUse = () => ({ kind: "deny", reason: CODEX_PRE_TOOL_USE_
9037
9459
  var isScopeReason = (scopeReason) => typeof scopeReason === "string" && scopeReason.length > 0;
9038
9460
  var scopeBreachReasonOf = (verdict) => verdict.kind === "gate" && isScopeReason(verdict.scopeReason) ? verdict.scopeReason : void 0;
9039
9461
  var onlyCodexPreToolUseCanAsk = (verdict, permissionMode) => verdict.kind === "gate" && (scopeBreachReasonOf(verdict) !== void 0 || !codexRaisesItsOwnPrompts(permissionMode));
9040
- var runsACommandThatNeedsAPerson = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
9462
+ var runsACommandThatNeedsAPersonUnderOneArrowReading = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
9041
9463
  const command = extractPolicyArg(toolName, toolInput);
9042
9464
  return command !== void 0 && (commandNeedsAPerson(toolName, command) || commandWritesThroughARemoteApi(command));
9043
9465
  });
9466
+ var runsACommandThatNeedsAPerson = (input) => underEitherArrowReading(() => runsACommandThatNeedsAPersonUnderOneArrowReading(input));
9044
9467
  var namesASecretOrWorkflowFile = (path) => {
9045
9468
  const written = withoutDotSegments(normalizeSeparators(path));
9046
9469
  return SECRET_FILE_NAME.test(basenameOf(written)) || CI_WORKFLOW_FILE.test(written);
@@ -9051,10 +9474,11 @@ var editsAFileThatNeedsAPerson = ({ toolName, toolInputs }) => toolInputs.some((
9051
9474
  const path = extractPolicyArg(toolName, toolInput);
9052
9475
  return path !== void 0 && fileEditNeedsAPerson(toolName, path);
9053
9476
  });
9054
- var runsADestructiveCommand = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
9477
+ var runsADestructiveCommandUnderOneArrowReading = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
9055
9478
  const command = extractPolicyArg(toolName, toolInput);
9056
9479
  return command !== void 0 && commandIsDestructive(toolName, command);
9057
9480
  });
9481
+ var runsADestructiveCommand = (input) => underEitherArrowReading(() => runsADestructiveCommandUnderOneArrowReading(input));
9058
9482
  var codexCallIsDestructive = (input, call) => call.deletesFiles || runsADestructiveCommand(input);
9059
9483
  var connectorCallOnlyReads = ({ toolName, toolInputs }) => isCodexConnectorTool(toolName) && mcpToolOnlyReads(toolName) && !mcpToolAppNamesADatabase(toolName) && toolInputs.length > 0 && toolInputs.every((toolInput) => mcpToolInputOnlyReads(toolName, toolInput));
9060
9484
  var fullAccessRunsThisConnectorReadUnasked = (input, verdict, call) => !codexRaisesItsOwnPrompts(call.permissionMode) && scopeBreachReasonOf(verdict) === void 0 && noModeOverrideIsActive(input) && connectorCallOnlyReads(input);
@@ -9232,7 +9656,7 @@ var pushSpellingsBeyondTheWrittenOnesIn = (input, toolInput) => [...pushesOfTheC
9232
9656
  var writtenRouteArgumentsOf = (input, toolInput) => [...policyArgForms(input.toolName, toolInput, input.cwd), ...pushesOfTheCurrentBranchIn(input, toolInput)];
9233
9657
  var routeArgumentsOf = (input, toolInput) => [...writtenRouteArgumentsOf(input, toolInput), ...pushSpellingsBeyondTheWrittenOnesIn(input, toolInput)];
9234
9658
  var everyRule = () => true;
9235
- var aChosenRuleGoverns = (input, counts = everyRule) => {
9659
+ var aChosenRuleGovernsUnderOneArrowReading = (input, counts) => {
9236
9660
  const chosen = input.config.policies.filter((policy) => !isDefaultRule(policy));
9237
9661
  const routes = approvalRoutesOf(input.config);
9238
9662
  if (routes === null) return true;
@@ -9243,8 +9667,8 @@ var aChosenRuleGoverns = (input, counts = everyRule) => {
9243
9667
  return governing !== void 0 && counts(governing.policy) || findBestRoute(routes, input.toolName, routeArgumentsOf(input, toolInput), input.repoKey) !== void 0;
9244
9668
  });
9245
9669
  };
9670
+ var aChosenRuleGoverns = (input, counts = everyRule) => underEitherArrowReading(() => aChosenRuleGovernsUnderOneArrowReading(input, counts));
9246
9671
  var AUTO_PERMISSION_MODE = "auto";
9247
- var routeWaitsForSomeoneElse = (route) => route.answeredBySomeoneElse === true;
9248
9672
  var routeDeliveredFor = (input, routes, toolInput) => {
9249
9673
  const repoKey = input.sharedRepoKey ?? input.repoKey;
9250
9674
  const written = writtenRouteArgumentsOf(input, toolInput);
@@ -9256,12 +9680,13 @@ var routeDeliveredFor = (input, routes, toolInput) => {
9256
9680
  if (heldSpelledRoute !== void 0 && heldSpelledRoute.toolPattern.length > (writtenRoute?.toolPattern.length ?? -1)) return heldSpelledRoute;
9257
9681
  return writtenRoute ?? findBestRoute(routes, input.toolName, spelled, repoKey);
9258
9682
  };
9259
- var callWaitsForSomeoneElse = (input) => {
9683
+ var callWaitsForSomeoneElseUnderOneArrowReading = (input) => {
9260
9684
  const routes = approvalRoutesOf(input.config);
9261
9685
  if (routes === null) return false;
9262
9686
  return withExtraReadings(input).toolInputs.some((toolInput) => routeDeliveredFor(input, routes, toolInput)?.answeredBySomeoneElse === true);
9263
9687
  };
9264
- var namedRouteWaitsForSomeoneElse = (input) => {
9688
+ var callWaitsForSomeoneElse = (input) => underEitherArrowReading(() => callWaitsForSomeoneElseUnderOneArrowReading(input));
9689
+ var namedRouteWaitsForSomeoneElseUnderOneArrowReading = (input) => {
9265
9690
  const routes = approvalRoutesOf(input.config);
9266
9691
  if (routes === null) return false;
9267
9692
  return withExtraReadings(input).toolInputs.some((toolInput) => {
@@ -9269,11 +9694,15 @@ var namedRouteWaitsForSomeoneElse = (input) => {
9269
9694
  return route?.answeredBySomeoneElse === true && patternToolName(route.toolPattern) === input.toolName;
9270
9695
  });
9271
9696
  };
9272
- var matchedRouteOf = (input) => {
9697
+ var namedRouteWaitsForSomeoneElse = (input) => underEitherArrowReading(() => namedRouteWaitsForSomeoneElseUnderOneArrowReading(input));
9698
+ var firstRouteHeldForSomeoneElseOrFirstOf = (matched) => matched.find(routeWaitsForSomeoneElse) ?? matched[0];
9699
+ var routesMatchedUnderOneArrowReading = (input) => {
9273
9700
  const routes = approvalRoutesOf(input.config);
9274
- if (routes === null) return void 0;
9275
- const matched = withExtraReadings(input).toolInputs.flatMap((toolInput) => routeDeliveredFor(input, routes, toolInput) ?? []);
9276
- const route = matched.find((candidate) => candidate.answeredBySomeoneElse === true) ?? matched[0];
9701
+ if (routes === null) return [];
9702
+ return withExtraReadings(input).toolInputs.flatMap((toolInput) => routeDeliveredFor(input, routes, toolInput) ?? []);
9703
+ };
9704
+ var matchedRouteOf = (input) => {
9705
+ const route = firstRouteHeldForSomeoneElseOrFirstOf(underEachArrowReading(() => routesMatchedUnderOneArrowReading(input)).flat());
9277
9706
  if (route === void 0) return void 0;
9278
9707
  return route.repoKey ? { toolPattern: route.toolPattern, repoKey: route.repoKey } : { toolPattern: route.toolPattern };
9279
9708
  };
@@ -9768,6 +10197,8 @@ export {
9768
10197
  codexNativeApprovalResponse,
9769
10198
  transcriptRecordPlaintext,
9770
10199
  compressTranscriptRecord,
10200
+ SPAWN_LAUNCH_FAILED_CODE,
10201
+ SPAWN_UNCONFIRMED_ATTEMPT_FAILURE,
9771
10202
  CLAUDE_INBOX,
9772
10203
  parseClaudeInboxSession,
9773
10204
  claudeInboxAction,