pushary 1.9.140 → 1.9.142

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 +22 -0
  2. package/dist/{api-ZV6JN5J3.js → api-JR3YAO4I.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-7OBROSQL.js → chunk-22CXL7YI.js} +3 -3
  46. package/dist/{chunk-T5GZUMBP.js → chunk-34JVH6VP.js} +5 -5
  47. package/dist/{chunk-UGU566AU.js → chunk-3KW7WC4L.js} +6 -6
  48. package/dist/{chunk-SQB57AJR.js → chunk-3VOUWGFF.js} +4 -4
  49. package/dist/{chunk-Y7LBB6YM.js → chunk-4EBJ4PTZ.js} +1 -1
  50. package/dist/{chunk-MTVAACOE.js → chunk-4JTZZXB3.js} +3 -3
  51. package/dist/{chunk-7LBMCU3S.js → chunk-4KVGNCMN.js} +4 -4
  52. package/dist/{chunk-3FJO3HIA.js → chunk-4OX4SJGA.js} +3 -3
  53. package/dist/{chunk-LURIPMCB.js → chunk-4YH326C5.js} +6 -6
  54. package/dist/{chunk-L7BWJD25.js → chunk-4Z7YVVKQ.js} +1 -1
  55. package/dist/{chunk-7W4XA2WF.js → chunk-53KLGXFL.js} +1 -1
  56. package/dist/{chunk-MFRNEOCN.js → chunk-5GE7PKK4.js} +11 -11
  57. package/dist/{chunk-B4KAY45V.js → chunk-5N6Q5XGF.js} +16 -12
  58. package/dist/{chunk-SANGITZF.js → chunk-5TZYAMGW.js} +1 -1
  59. package/dist/{chunk-AQVXXXFZ.js → chunk-6JLANX5L.js} +4 -4
  60. package/dist/{chunk-FSDTFT7J.js → chunk-76N6DCSP.js} +2 -2
  61. package/dist/{chunk-UHB7G2XC.js → chunk-77ZUOR3U.js} +5 -5
  62. package/dist/{chunk-7DPPMWTR.js → chunk-7K3KDCOX.js} +3 -3
  63. package/dist/{chunk-7WLNPGEY.js → chunk-7PJLQRRM.js} +4 -4
  64. package/dist/{chunk-6WBHYQ2P.js → chunk-7QWH257P.js} +1 -1
  65. package/dist/{chunk-YB7V6V6O.js → chunk-7VMVMC4H.js} +1 -1
  66. package/dist/{chunk-E4MC6B6U.js → chunk-A3DVD55C.js} +4 -4
  67. package/dist/{chunk-5TPC3M45.js → chunk-B4VIT5N3.js} +1 -1
  68. package/dist/{chunk-RACM64B6.js → chunk-BHKODM4L.js} +2 -2
  69. package/dist/{chunk-QCIZDJSU.js → chunk-C5LIS3XM.js} +477 -28
  70. package/dist/{chunk-6Z7VJ65F.js → chunk-CZCLJXUA.js} +5 -5
  71. package/dist/{chunk-BMBWFLIT.js → chunk-DDJHPMBJ.js} +1 -1
  72. package/dist/{chunk-HNN46FYL.js → chunk-DV4ZWKI6.js} +4 -4
  73. package/dist/{chunk-4SMS5DND.js → chunk-DZLLKJJT.js} +3 -3
  74. package/dist/{chunk-O55PACNP.js → chunk-EECOWW5X.js} +4 -4
  75. package/dist/{chunk-MDRNNK3L.js → chunk-EMODTMHE.js} +1 -1
  76. package/dist/{chunk-OZY4EU6V.js → chunk-FFAVOHI5.js} +8 -8
  77. package/dist/{chunk-HJFTPNP6.js → chunk-FS47XZCE.js} +2 -2
  78. package/dist/{chunk-GUVTHNCX.js → chunk-G562FBHB.js} +5 -5
  79. package/dist/{chunk-UH25VEQI.js → chunk-H33CFJOF.js} +4 -4
  80. package/dist/{chunk-RQPVEBKR.js → chunk-HIIXYZYV.js} +3 -3
  81. package/dist/{chunk-QDQHIQWH.js → chunk-HLWS6ADK.js} +2 -2
  82. package/dist/{chunk-2MELVDYD.js → chunk-I6HXZIER.js} +2 -2
  83. package/dist/{chunk-IJMWFHZZ.js → chunk-IG7NGXBS.js} +2 -2
  84. package/dist/{chunk-N346VCKX.js → chunk-KP6FVUCC.js} +3 -3
  85. package/dist/{chunk-H2EXF6DB.js → chunk-KRSZFHNS.js} +3 -3
  86. package/dist/{chunk-S6LB3SZE.js → chunk-KY6AHZ2P.js} +12 -12
  87. package/dist/{chunk-TA3YQY6I.js → chunk-LS6BU5RM.js} +1 -1
  88. package/dist/{chunk-7TXUHOQW.js → chunk-LTPKSJWY.js} +10 -10
  89. package/dist/{chunk-4IAFTTNQ.js → chunk-LUVSHGLH.js} +1 -1
  90. package/dist/{chunk-V5VSSRV6.js → chunk-MDIBO7U7.js} +6 -6
  91. package/dist/{chunk-MEFTOIUI.js → chunk-MH5BRZOQ.js} +1 -1
  92. package/dist/{chunk-3HORJAQX.js → chunk-MOYEHNFP.js} +2 -2
  93. package/dist/{chunk-TJX25WUQ.js → chunk-NOTW7GOC.js} +2 -2
  94. package/dist/{chunk-E67Y7DSA.js → chunk-NQF652IG.js} +2 -2
  95. package/dist/{chunk-IEHY7DCR.js → chunk-P5QXH5QI.js} +1 -1
  96. package/dist/{chunk-O66URN57.js → chunk-POXASZR6.js} +3 -3
  97. package/dist/{chunk-TRCJWAZD.js → chunk-PYSDCPZ3.js} +6 -6
  98. package/dist/{chunk-S7DTAH7Q.js → chunk-QESEICW4.js} +1 -1
  99. package/dist/{chunk-AXAO3JF5.js → chunk-QFZNPZRO.js} +3 -3
  100. package/dist/{chunk-D7AJ3ZCI.js → chunk-QLGLUUOP.js} +1 -1
  101. package/dist/{chunk-PHZYLAHL.js → chunk-QQHUUPPW.js} +2 -2
  102. package/dist/{chunk-YD3PTYOT.js → chunk-R27HXRSK.js} +3 -3
  103. package/dist/{chunk-MGBYRHT3.js → chunk-R7FSMUHG.js} +1 -1
  104. package/dist/{chunk-NBJ7N7KL.js → chunk-SMF4TBPU.js} +5 -5
  105. package/dist/{chunk-4YIVV4PY.js → chunk-TKFNIDZK.js} +2 -2
  106. package/dist/{chunk-LW7TXMCP.js → chunk-TKYGEPBH.js} +1 -1
  107. package/dist/{chunk-QAT2PWRX.js → chunk-TPQDOZGK.js} +16 -16
  108. package/dist/{chunk-SSAGWDBN.js → chunk-TYQITMXN.js} +3 -3
  109. package/dist/{chunk-E46NE7FB.js → chunk-U4P4NDVB.js} +2 -0
  110. package/dist/{chunk-JYOC6N7C.js → chunk-UIZE4YMU.js} +2 -2
  111. package/dist/{chunk-XJ6CRGD2.js → chunk-UPI4IIX3.js} +4 -4
  112. package/dist/{chunk-LAAGGP7K.js → chunk-XIU5ER6S.js} +5 -5
  113. package/dist/{chunk-3TQ4NPFC.js → chunk-XWYCFODT.js} +3 -3
  114. package/dist/{chunk-6LK6I62M.js → chunk-YCU7Y77H.js} +1 -1
  115. package/dist/{chunk-YIIGX653.js → chunk-Z5OFTJGZ.js} +5 -5
  116. package/dist/{chunk-RVKCG7DK.js → chunk-ZF4CPOO7.js} +6 -6
  117. package/dist/{chunk-JHRJ3KKG.js → chunk-ZGYVUZEZ.js} +5 -5
  118. package/dist/{chunk-BAT4TJOE.js → chunk-ZJHZICA4.js} +8 -8
  119. package/dist/{chunk-ULRZGJSL.js → chunk-ZKKZEVNI.js} +2 -2
  120. package/dist/{chunk-7AXEKUXY.js → chunk-ZVJIJPQY.js} +1 -1
  121. package/dist/{codex-app-cards-switch-YW4R5WTG.js → codex-app-cards-switch-FAWUGM7P.js} +12 -12
  122. package/dist/{codex-card-routing-5EHXCS7Y.js → codex-card-routing-I6YOJBTT.js} +2 -2
  123. package/dist/{codex-desktop-launch-VEPL7OFZ.js → codex-desktop-launch-WPN7UNS7.js} +2 -2
  124. package/dist/{codex-session-launch-7UKI32XL.js → codex-session-launch-YPPBWBBH.js} +20 -20
  125. package/dist/{config-5YVCM3JL.js → config-2CHOLFNB.js} +3 -3
  126. package/dist/{global-upgrade-YNLHN2LI.js → global-upgrade-CCVIYELF.js} +9 -9
  127. package/dist/{identity-ZF5BYVAH.js → identity-7QA3EDOM.js} +4 -4
  128. package/dist/{live-capabilities-UDAEQC25.js → live-capabilities-SDMX6CPZ.js} +4 -4
  129. package/dist/{paths-5CUJRNH3.js → paths-ZC6XY73Q.js} +3 -3
  130. package/dist/{reapply-EHYJUX67.js → reapply-4PUJZT73.js} +29 -29
  131. package/dist/src/index.js +34 -34
  132. package/dist/{upgrade-lock-ONZN26ZJ.js → upgrade-lock-BRVUBSLD.js} +4 -4
  133. package/dist/{usage-GF3ZBAH4.js → usage-GWUTCS5A.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
  };
@@ -8315,6 +8709,7 @@ var ANSWER_SOURCES = [
8315
8709
  "inbox",
8316
8710
  "slack",
8317
8711
  "mac_app",
8712
+ "voice_call",
8318
8713
  // Nobody. A decision opened on a workspace's sandbox site is settled by the
8319
8714
  // simulator instead of being delivered, and the ledger has to say so: a
8320
8715
  // sandbox row that looked like a human answer would be indistinguishable
@@ -8401,6 +8796,7 @@ var CAPABILITY_PATTERNS = {
8401
8796
  "Bash(mkfs:*)"
8402
8797
  ]
8403
8798
  };
8799
+ var MAX_PUSH_WINDOW_SECONDS = 300;
8404
8800
  var DECISION_EPISODE_SCHEMA_VERSION = 1;
8405
8801
  var DECISION_FEATURE_EXTRACTOR = `pushary-hooks/schema-${DECISION_EPISODE_SCHEMA_VERSION}`;
8406
8802
  var DECISION_ORIGIN = {
@@ -8562,7 +8958,7 @@ var isScopeContract = (value) => {
8562
8958
  if (c.promises !== void 0 && !strings(c.promises)) return false;
8563
8959
  return strings(c.allowedPaths) && strings(c.offLimitsPaths) && typeof c.doneWhen === "string";
8564
8960
  };
8565
- var findBestRoute = (routes, toolName, args, repoKey) => {
8961
+ var routeMatchingBestUnderOneArrowReading = (routes, toolName, args, repoKey) => {
8566
8962
  let best;
8567
8963
  let bestWeight = 0;
8568
8964
  let bestScoped = -1;
@@ -8583,7 +8979,13 @@ var findBestRoute = (routes, toolName, args, repoKey) => {
8583
8979
  bestLength = length;
8584
8980
  }
8585
8981
  }
8586
- return best ?? routes.find((r) => r.toolPattern === "*");
8982
+ return best;
8983
+ };
8984
+ var isAMatchedRoute = (route) => route !== void 0;
8985
+ var routeWaitsForSomeoneElse = (route) => route.answeredBySomeoneElse === true;
8986
+ var findBestRoute = (routes, toolName, args, repoKey) => {
8987
+ const matched = underEachArrowReading(() => routeMatchingBestUnderOneArrowReading(routes, toolName, args, repoKey)).filter(isAMatchedRoute);
8988
+ return matched.find(routeWaitsForSomeoneElse) ?? matched[0] ?? routes.find((r) => r.toolPattern === "*");
8587
8989
  };
8588
8990
  var autoApprove = (tool) => ({
8589
8991
  tool,
@@ -8698,11 +9100,13 @@ var resolvePolicyReading = (reach, config, toolName, modeOverride, toolInput, cw
8698
9100
  }
8699
9101
  return base;
8700
9102
  };
8701
- var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId) => {
9103
+ var policyUnderOneArrowReading = (config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId) => {
8702
9104
  const withoutRunners = resolvePolicyReading(SPELLS_WITHOUT_COMMAND_RUNNERS, config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId);
8703
9105
  const withRunners = resolvePolicyReading(SPELLS_COMMAND_RUNNERS_TOO, config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId);
8704
9106
  return strictestReadingOf(withRunners, withoutRunners);
8705
9107
  };
9108
+ var keepingTheStrictestReading = (strictest, reading) => strictestReadingOf(reading, strictest);
9109
+ var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId) => underEachArrowReading(() => policyUnderOneArrowReading(config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId)).reduce(keepingTheStrictestReading);
8706
9110
  var VERDICT_RESTRAINT = { allow: 0, requires_human: 1, deny: 2 };
8707
9111
  var verdictRestraint = (policy) => VERDICT_RESTRAINT[verdictForPolicy(policy)];
8708
9112
  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 +9331,18 @@ var policyForScopeQuestion = (policy) => policy.timeoutAction === "approve" ? {
8927
9331
  pushFirstSeconds: policy.pushFirstSeconds > 0 ? policy.pushFirstSeconds : SCOPE_QUESTION_FIRST_WAIT_SECONDS
8928
9332
  } : policy;
8929
9333
  var isAReading = (reading) => reading !== null && reading.trim() !== "";
9334
+ var readingsOfScriptsWrittenForAShell = (command) => readingsOfNestedShellScripts(command, scriptsWrittenForAShellOrAnEval);
8930
9335
  var extraReadingsOf = (toolInput) => {
8931
9336
  const { command } = toolInput;
8932
9337
  if (typeof command !== "string" || command.length > LONGEST_COMMAND_READ_FOR_A_PUSH) return [];
8933
9338
  const commentFree = readingWithoutCommentsOrAnsiEscapes(command);
8934
9339
  const spelledOut = [command, commentFree].filter(isAReading).map(readingWithShellFormsSpelledOut);
9340
+ const scanned = [command, commentFree, ...spelledOut].filter(isAReading);
8935
9341
  const readings = [
8936
9342
  commentFree,
8937
9343
  ...spelledOut,
8938
- ...[command, commentFree, ...spelledOut].filter(isAReading).flatMap(readingsOfScriptsPassedToAShell)
9344
+ ...scanned.flatMap(readingsOfScriptsPassedToAShell),
9345
+ ...scanned.flatMap(readingsOfScriptsWrittenForAShell)
8939
9346
  ];
8940
9347
  return readings.filter(isAReading).map((reading) => ({ ...toolInput, command: reading }));
8941
9348
  };
@@ -8948,7 +9355,16 @@ var readingsNotYetJudged = (toolInputs) => {
8948
9355
  });
8949
9356
  };
8950
9357
  var withExtraReadings = (input) => shellDialectOf(input.toolName) !== void 0 ? { ...input, toolInputs: [...input.toolInputs, ...readingsNotYetJudged(input.toolInputs)] } : input;
8951
- var resolveGate = (rawInput) => {
9358
+ var GATE_VERDICT_RESTRAINT = { allow: 0, defer: 1, gate: 2, deny: 3, kill: 4 };
9359
+ var strictestGateVerdictOf = (strictest, verdict) => {
9360
+ const restraint = GATE_VERDICT_RESTRAINT[verdict.kind] - GATE_VERDICT_RESTRAINT[strictest.kind];
9361
+ if (restraint !== 0) return restraint > 0 ? verdict : strictest;
9362
+ return strictest.kind === "gate" && verdict.kind === "gate" ? { ...strictest, policy: strictestReadingOf(verdict.policy, strictest.policy) } : strictest;
9363
+ };
9364
+ var policyOfReadings = (readings) => readings.policy;
9365
+ var toolInputsOfReadings = (readings) => readings.toolInputs;
9366
+ var readingsAreAllowed = (readings) => verdictForPolicy(readings.policy) === "allow";
9367
+ var gateVerdictUnderOneArrowReading = (rawInput) => {
8952
9368
  const input = withExtraReadings(rawInput);
8953
9369
  const { modeState, config, toolName, toolInputs, cwd, sessionId } = input;
8954
9370
  const repoKey = input.sharedRepoKey ?? input.repoKey;
@@ -8964,16 +9380,23 @@ var resolveGate = (rawInput) => {
8964
9380
  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
9381
  if (legacyPolicy) return { kind: "deny", policy: legacyPolicy, reason: `Denied by policy for ${legacyPolicy.tool}` };
8966
9382
  }
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
- );
9383
+ const written = {
9384
+ toolInputs: rawInput.toolInputs,
9385
+ policy: resolvePolicyAcross(config, toolName, modeState.mode, rawInput.toolInputs, cwd, repoKey, sessionId)
9386
+ };
9387
+ const extra = toolInputs.slice(rawInput.toolInputs.length).map((reading) => ({
9388
+ toolInputs: [reading],
9389
+ policy: resolvePolicy(config, toolName, modeState.mode, reading, cwd, repoKey, sessionId)
9390
+ }));
9391
+ const policy = extra.map(policyOfReadings).reduce(keepingTheStrictestReading, written.policy);
8971
9392
  const verdict = verdictForPolicy(policy);
8972
9393
  const autoDenies = verdict === "deny";
8973
9394
  const allowedByBypassMode = !autoDenies && verdict !== "allow" && bypassModeAllows(input);
8974
- const askBesideARoutedPush = verdict === "allow" ? askAtTheRouteOfAPush(input, repoKey, policy) : void 0;
9395
+ const allowed = [written, ...extra].filter(readingsAreAllowed);
9396
+ const allowedBy = allowed[0]?.policy;
9397
+ const askBesideARoutedPush = autoDenies || allowedBy === void 0 ? void 0 : askAtTheRouteOfAPush({ ...input, toolInputs: allowed.flatMap(toolInputsOfReadings) }, repoKey, allowedBy);
8975
9398
  const autoApproves = (verdict === "allow" || allowedByBypassMode) && askBesideARoutedPush === void 0;
8976
- const askedPolicy = askBesideARoutedPush ?? policy;
9399
+ const askedPolicy = askBesideARoutedPush === void 0 ? policy : strictestReadingOf(policy, askBesideARoutedPush);
8977
9400
  if (autoDenies) return { kind: "deny", policy, reason: `Denied by policy for ${policy.tool}` };
8978
9401
  if (isAskedInEveryMode(toolName)) return { kind: "gate", policy };
8979
9402
  if (isModeStateDegraded(modeState)) {
@@ -9003,6 +9426,10 @@ var resolveGate = (rawInput) => {
9003
9426
  scopePath: scopeReason && "path" in scopeVerdict ? widenablePath(scopeVerdict.path) : void 0
9004
9427
  };
9005
9428
  };
9429
+ var resolveGate = (rawInput) => {
9430
+ const verdict = underEachArrowReading(() => gateVerdictUnderOneArrowReading(rawInput)).reduce(strictestGateVerdictOf);
9431
+ return verdict.kind === "gate" ? { ...verdict, policy: withApprovalRouteWait(rawInput, verdict.policy) } : verdict;
9432
+ };
9006
9433
  var noModeOverrideIsActive = (input) => (input.modeState.mode ?? input.config.modeOverride ?? null) === null;
9007
9434
  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
9435
  var claudePromptsBeforeAnEdit = (permissionMode) => permissionMode === "default";
@@ -9037,10 +9464,11 @@ var codexDeferredPreToolUse = () => ({ kind: "deny", reason: CODEX_PRE_TOOL_USE_
9037
9464
  var isScopeReason = (scopeReason) => typeof scopeReason === "string" && scopeReason.length > 0;
9038
9465
  var scopeBreachReasonOf = (verdict) => verdict.kind === "gate" && isScopeReason(verdict.scopeReason) ? verdict.scopeReason : void 0;
9039
9466
  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) => {
9467
+ var runsACommandThatNeedsAPersonUnderOneArrowReading = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
9041
9468
  const command = extractPolicyArg(toolName, toolInput);
9042
9469
  return command !== void 0 && (commandNeedsAPerson(toolName, command) || commandWritesThroughARemoteApi(command));
9043
9470
  });
9471
+ var runsACommandThatNeedsAPerson = (input) => underEitherArrowReading(() => runsACommandThatNeedsAPersonUnderOneArrowReading(input));
9044
9472
  var namesASecretOrWorkflowFile = (path) => {
9045
9473
  const written = withoutDotSegments(normalizeSeparators(path));
9046
9474
  return SECRET_FILE_NAME.test(basenameOf(written)) || CI_WORKFLOW_FILE.test(written);
@@ -9051,10 +9479,11 @@ var editsAFileThatNeedsAPerson = ({ toolName, toolInputs }) => toolInputs.some((
9051
9479
  const path = extractPolicyArg(toolName, toolInput);
9052
9480
  return path !== void 0 && fileEditNeedsAPerson(toolName, path);
9053
9481
  });
9054
- var runsADestructiveCommand = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
9482
+ var runsADestructiveCommandUnderOneArrowReading = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
9055
9483
  const command = extractPolicyArg(toolName, toolInput);
9056
9484
  return command !== void 0 && commandIsDestructive(toolName, command);
9057
9485
  });
9486
+ var runsADestructiveCommand = (input) => underEitherArrowReading(() => runsADestructiveCommandUnderOneArrowReading(input));
9058
9487
  var codexCallIsDestructive = (input, call) => call.deletesFiles || runsADestructiveCommand(input);
9059
9488
  var connectorCallOnlyReads = ({ toolName, toolInputs }) => isCodexConnectorTool(toolName) && mcpToolOnlyReads(toolName) && !mcpToolAppNamesADatabase(toolName) && toolInputs.length > 0 && toolInputs.every((toolInput) => mcpToolInputOnlyReads(toolName, toolInput));
9060
9489
  var fullAccessRunsThisConnectorReadUnasked = (input, verdict, call) => !codexRaisesItsOwnPrompts(call.permissionMode) && scopeBreachReasonOf(verdict) === void 0 && noModeOverrideIsActive(input) && connectorCallOnlyReads(input);
@@ -9110,7 +9539,11 @@ var agentRulesAllowEveryInput = (rules, toolName, toolInputs, cwd) => rules.allo
9110
9539
  return allowRulesGrant(rules.allow, toolName, args) && !anyRuleRestrictsReading(rules.ask, toolName, reading) && !anyRuleRestrictsReading(rules.deny, toolName, reading) && !inputNeedsAPerson(toolName, toolInput);
9111
9540
  });
9112
9541
  var isDefaultRule = (policy) => policy.origin === "builtin" || policy.tool === WILDCARD_TOOL_PATTERN;
9113
- var isApprovalRoutePattern = (value) => typeof value === "object" && value !== null && typeof value.toolPattern === "string" && ["string", "undefined"].includes(typeof value.repoKey) && ["boolean", "undefined"].includes(typeof value.answeredBySomeoneElse);
9542
+ var isValidRouteWait = (value) => {
9543
+ if (!("minimumPushWaitSeconds" in value) || value.minimumPushWaitSeconds === void 0) return true;
9544
+ return typeof value.minimumPushWaitSeconds === "number" && Number.isInteger(value.minimumPushWaitSeconds) && value.minimumPushWaitSeconds >= 0 && value.minimumPushWaitSeconds <= MAX_PUSH_WINDOW_SECONDS;
9545
+ };
9546
+ var isApprovalRoutePattern = (value) => typeof value === "object" && value !== null && typeof value.toolPattern === "string" && ["string", "undefined"].includes(typeof value.repoKey) && ["boolean", "undefined"].includes(typeof value.answeredBySomeoneElse) && isValidRouteWait(value);
9114
9547
  var approvalRoutesOf = (config) => {
9115
9548
  const routes = config.approvalRoutes ?? [];
9116
9549
  return Array.isArray(routes) && routes.every(isApprovalRoutePattern) ? routes : null;
@@ -9232,7 +9665,7 @@ var pushSpellingsBeyondTheWrittenOnesIn = (input, toolInput) => [...pushesOfTheC
9232
9665
  var writtenRouteArgumentsOf = (input, toolInput) => [...policyArgForms(input.toolName, toolInput, input.cwd), ...pushesOfTheCurrentBranchIn(input, toolInput)];
9233
9666
  var routeArgumentsOf = (input, toolInput) => [...writtenRouteArgumentsOf(input, toolInput), ...pushSpellingsBeyondTheWrittenOnesIn(input, toolInput)];
9234
9667
  var everyRule = () => true;
9235
- var aChosenRuleGoverns = (input, counts = everyRule) => {
9668
+ var aChosenRuleGovernsUnderOneArrowReading = (input, counts) => {
9236
9669
  const chosen = input.config.policies.filter((policy) => !isDefaultRule(policy));
9237
9670
  const routes = approvalRoutesOf(input.config);
9238
9671
  if (routes === null) return true;
@@ -9243,8 +9676,8 @@ var aChosenRuleGoverns = (input, counts = everyRule) => {
9243
9676
  return governing !== void 0 && counts(governing.policy) || findBestRoute(routes, input.toolName, routeArgumentsOf(input, toolInput), input.repoKey) !== void 0;
9244
9677
  });
9245
9678
  };
9679
+ var aChosenRuleGoverns = (input, counts = everyRule) => underEitherArrowReading(() => aChosenRuleGovernsUnderOneArrowReading(input, counts));
9246
9680
  var AUTO_PERMISSION_MODE = "auto";
9247
- var routeWaitsForSomeoneElse = (route) => route.answeredBySomeoneElse === true;
9248
9681
  var routeDeliveredFor = (input, routes, toolInput) => {
9249
9682
  const repoKey = input.sharedRepoKey ?? input.repoKey;
9250
9683
  const written = writtenRouteArgumentsOf(input, toolInput);
@@ -9256,12 +9689,13 @@ var routeDeliveredFor = (input, routes, toolInput) => {
9256
9689
  if (heldSpelledRoute !== void 0 && heldSpelledRoute.toolPattern.length > (writtenRoute?.toolPattern.length ?? -1)) return heldSpelledRoute;
9257
9690
  return writtenRoute ?? findBestRoute(routes, input.toolName, spelled, repoKey);
9258
9691
  };
9259
- var callWaitsForSomeoneElse = (input) => {
9692
+ var callWaitsForSomeoneElseUnderOneArrowReading = (input) => {
9260
9693
  const routes = approvalRoutesOf(input.config);
9261
9694
  if (routes === null) return false;
9262
9695
  return withExtraReadings(input).toolInputs.some((toolInput) => routeDeliveredFor(input, routes, toolInput)?.answeredBySomeoneElse === true);
9263
9696
  };
9264
- var namedRouteWaitsForSomeoneElse = (input) => {
9697
+ var callWaitsForSomeoneElse = (input) => underEitherArrowReading(() => callWaitsForSomeoneElseUnderOneArrowReading(input));
9698
+ var namedRouteWaitsForSomeoneElseUnderOneArrowReading = (input) => {
9265
9699
  const routes = approvalRoutesOf(input.config);
9266
9700
  if (routes === null) return false;
9267
9701
  return withExtraReadings(input).toolInputs.some((toolInput) => {
@@ -9269,11 +9703,24 @@ var namedRouteWaitsForSomeoneElse = (input) => {
9269
9703
  return route?.answeredBySomeoneElse === true && patternToolName(route.toolPattern) === input.toolName;
9270
9704
  });
9271
9705
  };
9272
- var matchedRouteOf = (input) => {
9706
+ var namedRouteWaitsForSomeoneElse = (input) => underEitherArrowReading(() => namedRouteWaitsForSomeoneElseUnderOneArrowReading(input));
9707
+ var firstRouteHeldForSomeoneElseOrFirstOf = (matched) => matched.find(routeWaitsForSomeoneElse) ?? matched[0];
9708
+ var routesMatchedUnderOneArrowReading = (input) => {
9273
9709
  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];
9710
+ if (routes === null) return [];
9711
+ return withExtraReadings(input).toolInputs.flatMap((toolInput) => routeDeliveredFor(input, routes, toolInput) ?? []);
9712
+ };
9713
+ var withApprovalRouteWait = (input, policy) => {
9714
+ if (verdictForPolicy(policy) !== "requires_human" || policy.timeoutAction === "approve") return policy;
9715
+ const routes = underEachArrowReading(() => routesMatchedUnderOneArrowReading(input)).flat();
9716
+ const minimum = Math.max(0, ...routes.map((route) => route.minimumPushWaitSeconds ?? 0));
9717
+ if (minimum === 0) return policy;
9718
+ if (policy.mode === "push_first") return { ...policy, pushFirstSeconds: Math.max(policy.pushFirstSeconds, minimum) };
9719
+ if (policy.mode === "push_only" && policy.timeoutAction !== "wait") return { ...policy, timeoutSeconds: Math.max(policy.timeoutSeconds, minimum) };
9720
+ return policy;
9721
+ };
9722
+ var matchedRouteOf = (input) => {
9723
+ const route = firstRouteHeldForSomeoneElseOrFirstOf(underEachArrowReading(() => routesMatchedUnderOneArrowReading(input)).flat());
9277
9724
  if (route === void 0) return void 0;
9278
9725
  return route.repoKey ? { toolPattern: route.toolPattern, repoKey: route.repoKey } : { toolPattern: route.toolPattern };
9279
9726
  };
@@ -9768,6 +10215,8 @@ export {
9768
10215
  codexNativeApprovalResponse,
9769
10216
  transcriptRecordPlaintext,
9770
10217
  compressTranscriptRecord,
10218
+ SPAWN_LAUNCH_FAILED_CODE,
10219
+ SPAWN_UNCONFIRMED_ATTEMPT_FAILURE,
9771
10220
  CLAUDE_INBOX,
9772
10221
  parseClaudeInboxSession,
9773
10222
  claudeInboxAction,