@pushary/agent-hooks 1.9.24 → 1.9.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/bin/pushary-bell-hook.js +25 -25
- package/dist/bin/pushary-bell.js +9 -9
- package/dist/bin/pushary-claude.js +24 -24
- package/dist/bin/pushary-clean.js +29 -29
- package/dist/bin/pushary-codex-bridge.js +17 -17
- package/dist/bin/pushary-codex-hook.js +30 -30
- package/dist/bin/pushary-codex.js +12 -12
- package/dist/bin/pushary-connect.js +24 -24
- package/dist/bin/pushary-cowork.js +5 -5
- package/dist/bin/pushary-daemon.js +31 -31
- package/dist/bin/pushary-disconnect.js +24 -24
- package/dist/bin/pushary-doctor.js +33 -33
- package/dist/bin/pushary-elicitation-hook.js +25 -25
- package/dist/bin/pushary-gemini-bridge.js +13 -13
- package/dist/bin/pushary-gemini-hook.js +27 -27
- package/dist/bin/pushary-hook.js +29 -29
- package/dist/bin/pushary-login.js +12 -12
- package/dist/bin/pushary-logout.js +24 -24
- package/dist/bin/pushary-mcp.js +9 -9
- package/dist/bin/pushary-mode.js +12 -12
- package/dist/bin/pushary-notification-hook.js +24 -24
- package/dist/bin/pushary-opencode-hook.js +26 -26
- package/dist/bin/pushary-permission-denied-hook.js +29 -29
- package/dist/bin/pushary-permission-hook.js +28 -28
- package/dist/bin/pushary-post-hook.js +24 -24
- package/dist/bin/pushary-prompt-hook.js +24 -24
- package/dist/bin/pushary-session-end-hook.js +24 -24
- package/dist/bin/pushary-session-start-hook.js +28 -28
- package/dist/bin/pushary-setup.js +35 -35
- package/dist/bin/pushary-stats.js +5 -5
- package/dist/bin/pushary-status.js +26 -26
- package/dist/bin/pushary-stop-hook.js +24 -24
- package/dist/bin/pushary-stopfailure-hook.js +24 -24
- package/dist/bin/pushary-suggestions.js +12 -12
- package/dist/bin/pushary-transcript-register.js +17 -17
- package/dist/bin/pushary-transcripts.js +7 -7
- package/dist/bin/pushary-upgrade.js +30 -30
- package/dist/bin/pushary-wait.js +12 -12
- package/dist/bin/pushary.js +6 -6
- package/dist/{chunk-VFIZFKZY.js → chunk-2YF72RC5.js} +3 -3
- package/dist/{chunk-GBD6G4TA.js → chunk-3DLVLVEM.js} +1 -1
- package/dist/{chunk-CYGIJXAP.js → chunk-3G4R2FLX.js} +2 -2
- package/dist/{chunk-U23XTMBF.js → chunk-3HBLQXCJ.js} +3 -3
- package/dist/{chunk-NQICO3ES.js → chunk-3TRGUDQ3.js} +4 -4
- package/dist/{chunk-URCSJZNU.js → chunk-3ZDIA6ZC.js} +3 -3
- package/dist/{chunk-QDKNLNCA.js → chunk-47RVFUEG.js} +1 -1
- package/dist/{chunk-3WRJU7KN.js → chunk-4GKLAQY4.js} +1 -1
- package/dist/{chunk-IS737HST.js → chunk-4YWINUPJ.js} +1 -1
- package/dist/{chunk-W5NHIA4Y.js → chunk-5FL4M4YF.js} +8 -8
- package/dist/{chunk-OY6NJWDD.js → chunk-5UKZXDHV.js} +1 -1
- package/dist/{chunk-SBQCRQIP.js → chunk-AF2QZRYH.js} +4 -4
- package/dist/{chunk-RK7TDMQT.js → chunk-AG5ATWVT.js} +3 -3
- package/dist/{chunk-LOERK6N3.js → chunk-AXOMDPA7.js} +4 -4
- package/dist/{chunk-Q7IEFI7V.js → chunk-BIKHLGEL.js} +2 -2
- package/dist/{chunk-KT5BH6GC.js → chunk-BIV2LKDK.js} +8 -8
- package/dist/{chunk-EKPAV33G.js → chunk-BWXRLXNE.js} +5 -5
- package/dist/{chunk-SH2KK2ED.js → chunk-CA2EOOZG.js} +3 -3
- package/dist/{chunk-7Z2DLAEE.js → chunk-CW72FZ2M.js} +2 -2
- package/dist/{chunk-2E6AWHV7.js → chunk-CXG7XA4E.js} +3 -3
- package/dist/{chunk-ZVON5PCF.js → chunk-DDRSG6JL.js} +5 -5
- package/dist/{chunk-KX776UXN.js → chunk-F2HVTVQG.js} +2 -2
- package/dist/{chunk-CLVU24OZ.js → chunk-FA3YPD4P.js} +2 -2
- package/dist/{chunk-T6TJA4RF.js → chunk-FDT7KSQY.js} +2 -2
- package/dist/{chunk-G6GFNKF7.js → chunk-GEN4YTNR.js} +11 -11
- package/dist/{chunk-L5MCJNSI.js → chunk-GPDABKLD.js} +5 -5
- package/dist/{chunk-H2RD5EMR.js → chunk-GRL4VVUP.js} +3 -3
- package/dist/{chunk-WYLA6J43.js → chunk-I52A3NLY.js} +1 -1
- package/dist/{chunk-EE357RIP.js → chunk-IU5PAJDG.js} +4 -4
- package/dist/{chunk-2JTJZ7VI.js → chunk-JXHJYLFF.js} +4 -4
- package/dist/{chunk-35U2QHH2.js → chunk-K4OV2VLB.js} +2 -2
- package/dist/{chunk-GXQVOKHJ.js → chunk-KJ2W7ECE.js} +2 -2
- package/dist/{chunk-2F6UQ3YD.js → chunk-KTRRDTZN.js} +1 -1
- package/dist/{chunk-OSOCONIE.js → chunk-L62RNE5F.js} +5 -5
- package/dist/{chunk-LHFK5F3T.js → chunk-LGMSGVDN.js} +2 -2
- package/dist/{chunk-OLWKCDK4.js → chunk-MPBWPDXQ.js} +6 -6
- package/dist/{chunk-RIBIEQHU.js → chunk-NCAVDVXP.js} +1 -1
- package/dist/{chunk-JDWOK6PE.js → chunk-OGTWSEWN.js} +1 -1
- package/dist/{chunk-HBR6ZZHN.js → chunk-P7WJ2KKO.js} +5 -5
- package/dist/{chunk-HLXGEOX3.js → chunk-PPOQG2U6.js} +4 -4
- package/dist/{chunk-7JHYWFY6.js → chunk-PTJYAKZX.js} +2 -2
- package/dist/{chunk-Z5L4NQHC.js → chunk-PUJQFTKF.js} +1 -1
- package/dist/{chunk-IO5ZDIHY.js → chunk-R5ABJ5H5.js} +7 -7
- package/dist/{chunk-264EOGIK.js → chunk-RQPJEYLM.js} +2 -2
- package/dist/{chunk-P447F2RB.js → chunk-RZTIB2TY.js} +1 -1
- package/dist/{chunk-T5KM7J75.js → chunk-SCFKXAHX.js} +4 -4
- package/dist/{chunk-O3RRQTTV.js → chunk-TEQJNXJH.js} +5 -5
- package/dist/{chunk-XQROISQB.js → chunk-TS3CRCI7.js} +2 -2
- package/dist/{chunk-GM2IFDVF.js → chunk-TVP5UU33.js} +934 -20
- package/dist/{chunk-XA2RGGNR.js → chunk-XDTGYZIT.js} +4 -4
- package/dist/{chunk-RFK2WN6S.js → chunk-XUVKAWV3.js} +1 -1
- package/dist/{chunk-NJK4MGXL.js → chunk-Y5O4TO7U.js} +1 -1
- package/dist/{chunk-VICG46JC.js → chunk-ZPLDPPZO.js} +1 -1
- package/dist/{chunk-E4B7TXVS.js → chunk-ZXYHVZZZ.js} +1 -1
- package/dist/{global-upgrade-DZGLAARJ.js → global-upgrade-3XKMGVAR.js} +6 -6
- package/dist/{paths-JATF66FP.js → paths-UB2IUM57.js} +2 -2
- package/dist/{reapply-7TDCFXNF.js → reapply-B7KMGQH7.js} +20 -20
- package/dist/src/index.js +19 -19
- package/dist/{upgrade-lock-LPIDFQEH.js → upgrade-lock-6LLAEJTW.js} +3 -3
- package/package.json +1 -1
|
@@ -708,12 +708,14 @@ var scanShell = (command) => {
|
|
|
708
708
|
}
|
|
709
709
|
return quote === null ? lexemes : null;
|
|
710
710
|
};
|
|
711
|
-
var
|
|
711
|
+
var PIPE = "|";
|
|
712
|
+
var splitShellSegments = (command) => {
|
|
712
713
|
const lexemes = scanShell(command);
|
|
713
714
|
if (lexemes === null) return null;
|
|
714
715
|
const segments = [];
|
|
715
716
|
let start = 0;
|
|
716
717
|
let consumed = -1;
|
|
718
|
+
let readsPipe = false;
|
|
717
719
|
for (const lexeme of lexemes) {
|
|
718
720
|
const { index, text, quote, kind } = lexeme;
|
|
719
721
|
if (index <= consumed || kind !== "text" || quote === "'") continue;
|
|
@@ -721,14 +723,103 @@ var shellCommandSegments = (command) => {
|
|
|
721
723
|
if (quote !== null) continue;
|
|
722
724
|
if (UNDECOMPOSABLE.has(text)) return null;
|
|
723
725
|
if (!SEGMENT_SEPARATORS.has(text)) continue;
|
|
724
|
-
|
|
725
|
-
|
|
726
|
+
const doubled = DOUBLED_SEPARATORS.has(text) && command[index + 1] === text;
|
|
727
|
+
consumed = index + (doubled ? 1 : 0);
|
|
728
|
+
segments.push({ text: trimShellWhitespace(command.slice(start, index)), readsPipe });
|
|
729
|
+
readsPipe = text === PIPE && !doubled;
|
|
726
730
|
start = consumed + 1;
|
|
727
731
|
}
|
|
728
|
-
segments.push(trimShellWhitespace(command.slice(start)));
|
|
729
|
-
const present = segments.filter((segment) => segment.length > 0);
|
|
732
|
+
segments.push({ text: trimShellWhitespace(command.slice(start)), readsPipe });
|
|
733
|
+
const present = segments.filter((segment) => segment.text.length > 0);
|
|
730
734
|
return present.length > 0 ? present : null;
|
|
731
735
|
};
|
|
736
|
+
var shellCommandSegments = (command) => splitShellSegments(command)?.map((segment) => segment.text) ?? null;
|
|
737
|
+
var shellSegmentsReadingAPipe = (command) => splitShellSegments(command)?.filter((segment) => segment.readsPipe).map((segment) => segment.text) ?? null;
|
|
738
|
+
var SUBSTITUTION_OPEN = "$(";
|
|
739
|
+
var QUOTED_HEREDOC_CAT = /^[ \t]*cat[ \t]+<<[ \t]*(?:'([A-Za-z_][A-Za-z0-9_]*)'|"([A-Za-z_][A-Za-z0-9_]*)")[ \t]*\n/;
|
|
740
|
+
var CLOSING_PARENTHESIS = /^\s*\)/;
|
|
741
|
+
var LEADING_TABS = /^\t+/;
|
|
742
|
+
var CHARACTERS_ESCAPED_IN_DOUBLE_QUOTES = /["\\$`]/g;
|
|
743
|
+
var isHeredocTerminator = (line, delimiter) => line.replace(LEADING_TABS, "").trimEnd() === delimiter;
|
|
744
|
+
var mightEndAHeredoc = (line, delimiter) => line.trimStart().startsWith(delimiter);
|
|
745
|
+
var BODY_ESCAPES = /[\\`]/;
|
|
746
|
+
var COMMENT_START = "#";
|
|
747
|
+
var WHITESPACE = /\s/;
|
|
748
|
+
var parenthesesBalanceInBody = (body, readsComments) => {
|
|
749
|
+
let depth = 0;
|
|
750
|
+
let quote = null;
|
|
751
|
+
let comment = false;
|
|
752
|
+
let wordStart = true;
|
|
753
|
+
for (const char of body) {
|
|
754
|
+
if (comment) {
|
|
755
|
+
comment = char !== "\n";
|
|
756
|
+
wordStart = true;
|
|
757
|
+
continue;
|
|
758
|
+
}
|
|
759
|
+
if (quote !== null) {
|
|
760
|
+
if (char === quote) quote = null;
|
|
761
|
+
wordStart = false;
|
|
762
|
+
continue;
|
|
763
|
+
}
|
|
764
|
+
if (readsComments && wordStart && char === COMMENT_START) {
|
|
765
|
+
comment = true;
|
|
766
|
+
continue;
|
|
767
|
+
}
|
|
768
|
+
if (char === "'" || char === '"') quote = char;
|
|
769
|
+
if (char === "(") depth += 1;
|
|
770
|
+
if (char === ")") depth -= 1;
|
|
771
|
+
if (depth < 0) return false;
|
|
772
|
+
wordStart = WHITESPACE.test(char);
|
|
773
|
+
}
|
|
774
|
+
return depth === 0 && quote === null;
|
|
775
|
+
};
|
|
776
|
+
var everyBashReadsTheBodyAsText = (body) => !BODY_ESCAPES.test(body) && parenthesesBalanceInBody(body, true) && parenthesesBalanceInBody(body, false);
|
|
777
|
+
var quotedHeredocSubstitutionAt = (command, open) => {
|
|
778
|
+
const header = QUOTED_HEREDOC_CAT.exec(command.slice(open + SUBSTITUTION_OPEN.length));
|
|
779
|
+
const delimiter = header?.[1] ?? header?.[2];
|
|
780
|
+
if (!header || !delimiter) return null;
|
|
781
|
+
const bodyStart = open + SUBSTITUTION_OPEN.length + header[0].length;
|
|
782
|
+
for (let lineStart = bodyStart; lineStart <= command.length; ) {
|
|
783
|
+
const newline = command.indexOf("\n", lineStart);
|
|
784
|
+
const lineEnd = newline === -1 ? command.length : newline;
|
|
785
|
+
const line = command.slice(lineStart, lineEnd);
|
|
786
|
+
if (line === delimiter) {
|
|
787
|
+
const closing = CLOSING_PARENTHESIS.exec(command.slice(lineEnd));
|
|
788
|
+
const body = command.slice(bodyStart, Math.max(bodyStart, lineStart - 1));
|
|
789
|
+
return closing && everyBashReadsTheBodyAsText(body) ? { body, end: lineEnd + closing[0].length } : null;
|
|
790
|
+
}
|
|
791
|
+
if (mightEndAHeredoc(line, delimiter)) return null;
|
|
792
|
+
if (newline === -1) return null;
|
|
793
|
+
lineStart = newline + 1;
|
|
794
|
+
}
|
|
795
|
+
return null;
|
|
796
|
+
};
|
|
797
|
+
var asDoubleQuotedText = (body) => body.replace(CHARACTERS_ESCAPED_IN_DOUBLE_QUOTES, (character) => `\\${character}`);
|
|
798
|
+
var withHeredocSubstitutionsAsQuotedText = (command) => {
|
|
799
|
+
let result = "";
|
|
800
|
+
let copied = 0;
|
|
801
|
+
let quote = null;
|
|
802
|
+
for (let index = 0; index < command.length; index += 1) {
|
|
803
|
+
const char = command.charAt(index);
|
|
804
|
+
if (char === "\\" && quote !== "'") {
|
|
805
|
+
index += 1;
|
|
806
|
+
continue;
|
|
807
|
+
}
|
|
808
|
+
if ((char === "'" || char === '"') && (quote === null || quote === char)) {
|
|
809
|
+
quote = quote === null ? char : null;
|
|
810
|
+
continue;
|
|
811
|
+
}
|
|
812
|
+
if (quote === "'") continue;
|
|
813
|
+
if (char === "`") break;
|
|
814
|
+
if (char !== "$" || command.charAt(index + 1) !== "(") continue;
|
|
815
|
+
const substitution = quote === '"' ? quotedHeredocSubstitutionAt(command, index) : null;
|
|
816
|
+
if (substitution === null) break;
|
|
817
|
+
result += command.slice(copied, index) + asDoubleQuotedText(substitution.body);
|
|
818
|
+
copied = substitution.end;
|
|
819
|
+
index = substitution.end - 1;
|
|
820
|
+
}
|
|
821
|
+
return result + command.slice(copied);
|
|
822
|
+
};
|
|
732
823
|
var shellVisibleText = (command) => {
|
|
733
824
|
const lexemes = scanShell(command);
|
|
734
825
|
if (lexemes === null) return null;
|
|
@@ -1183,11 +1274,12 @@ var PATTERN_INTENT = {
|
|
|
1183
1274
|
grant: "grant",
|
|
1184
1275
|
restrict: "restrict"
|
|
1185
1276
|
};
|
|
1277
|
+
var segmentsForMatching = (command) => shellCommandSegments(withHeredocSubstitutionsAsQuotedText(command));
|
|
1186
1278
|
var everySegmentMatches = (command, matches) => {
|
|
1187
|
-
const segments =
|
|
1279
|
+
const segments = segmentsForMatching(command);
|
|
1188
1280
|
return segments !== null && segments.every(matches);
|
|
1189
1281
|
};
|
|
1190
|
-
var anySegmentMatches = (command, matches) => (
|
|
1282
|
+
var anySegmentMatches = (command, matches) => (segmentsForMatching(command) ?? [command]).some(matches);
|
|
1191
1283
|
var shellSegmentsMatch = (command, intent, matches) => intent === PATTERN_INTENT.restrict ? anySegmentMatches(command, matches) : everySegmentMatches(command, matches);
|
|
1192
1284
|
var rankWholeOrSegments = (toolName, arg, intent, matches) => {
|
|
1193
1285
|
const matched = toolName in POLICY_COMMAND_KEYS ? shellSegmentsMatch(arg, intent, matches) : matches(arg);
|
|
@@ -1278,7 +1370,6 @@ var SAFE_SHELL_COMMANDS = /* @__PURE__ */ new Set([
|
|
|
1278
1370
|
"whoami",
|
|
1279
1371
|
"id",
|
|
1280
1372
|
"uname",
|
|
1281
|
-
"arch",
|
|
1282
1373
|
"printenv",
|
|
1283
1374
|
"locale",
|
|
1284
1375
|
"tty",
|
|
@@ -1629,6 +1720,7 @@ var COMMAND_RUNNERS = /* @__PURE__ */ new Set([
|
|
|
1629
1720
|
"script",
|
|
1630
1721
|
"su",
|
|
1631
1722
|
"doas",
|
|
1723
|
+
"arch",
|
|
1632
1724
|
"npx",
|
|
1633
1725
|
"bunx",
|
|
1634
1726
|
"pnpx",
|
|
@@ -1646,7 +1738,9 @@ var INLINE_CODE_INTERPRETERS = /* @__PURE__ */ new Set([
|
|
|
1646
1738
|
"lua",
|
|
1647
1739
|
"osascript",
|
|
1648
1740
|
"pwsh",
|
|
1649
|
-
"powershell"
|
|
1741
|
+
"powershell",
|
|
1742
|
+
"mongosh",
|
|
1743
|
+
"mongo"
|
|
1650
1744
|
]);
|
|
1651
1745
|
var INLINE_CODE_LONG_FLAG = /^-{1,2}(?:eval|print|require|import|command|encodedcommand|enc|ec)(?:=|$)/i;
|
|
1652
1746
|
var INLINE_CODE_SHORT_FLAG_LETTERS = /* @__PURE__ */ new Set(["c", "e", "E", "p", "r"]);
|
|
@@ -1669,7 +1763,15 @@ var DESTRUCTIVE_ARGUMENTS_BY_COMMAND = /* @__PURE__ */ new Map([
|
|
|
1669
1763
|
])],
|
|
1670
1764
|
["git checkout", /* @__PURE__ */ new Set(["-f", "--force", "--", "-B"])],
|
|
1671
1765
|
["git switch", /* @__PURE__ */ new Set(["-f", "--force", "--discard-changes", "-C", "--force-create"])],
|
|
1672
|
-
["git branch", /* @__PURE__ */ new Set(["-f", "--force", "-D", "-M", "-C"])]
|
|
1766
|
+
["git branch", /* @__PURE__ */ new Set(["-f", "--force", "-D", "-M", "-C"])],
|
|
1767
|
+
["git push", /* @__PURE__ */ new Set(["-f", "--force", "--force-with-lease", "--force-if-includes", "--mirror", "-d", "--delete", "--prune"])],
|
|
1768
|
+
["git clean", /* @__PURE__ */ new Set(["-f", "--force"])],
|
|
1769
|
+
["rm", /* @__PURE__ */ new Set(["-r", "-R", "--recursive"])],
|
|
1770
|
+
["pg_restore", /* @__PURE__ */ new Set(["-c", "--clean"])],
|
|
1771
|
+
["mongorestore", /* @__PURE__ */ new Set(["--drop"])],
|
|
1772
|
+
["aws s3", /* @__PURE__ */ new Set(["--delete"])],
|
|
1773
|
+
["gsutil rsync", /* @__PURE__ */ new Set(["-d", "--delete-unmatched-destination-objects"])],
|
|
1774
|
+
["gcloud storage", /* @__PURE__ */ new Set(["--delete-unmatched-destination-objects"])]
|
|
1673
1775
|
]);
|
|
1674
1776
|
var DESTRUCTIVE_WORDS_IN_ANY_CASE_BY_COMMAND = /* @__PURE__ */ new Map([
|
|
1675
1777
|
["redis-cli", /* @__PURE__ */ new Set(["flushall", "flushdb"])]
|
|
@@ -1710,7 +1812,8 @@ var SUBCOMMAND_CLIS = /* @__PURE__ */ new Set([
|
|
|
1710
1812
|
"heroku",
|
|
1711
1813
|
"supabase",
|
|
1712
1814
|
"wrangler",
|
|
1713
|
-
"railway"
|
|
1815
|
+
"railway",
|
|
1816
|
+
"bq"
|
|
1714
1817
|
]);
|
|
1715
1818
|
var DESTRUCTIVE_SUBCOMMANDS = /* @__PURE__ */ new Set([
|
|
1716
1819
|
"delete",
|
|
@@ -1812,33 +1915,833 @@ var argumentsHideTheEffect = (name, args) => {
|
|
|
1812
1915
|
return (meaningful[0]?.text.startsWith("-") ?? false) || subcommandWordsOf(meaningful).some((word) => word.expands || RUNNER_SUBCOMMANDS.has(word.text));
|
|
1813
1916
|
};
|
|
1814
1917
|
var invocationHidesItsEffect = ({ program, args }) => program !== void 0 && ([program, ...args].some((word) => word.comment) || programHidesItsEffect(program) || argumentsHideTheEffect(basenameOf(program.text), args));
|
|
1815
|
-
var
|
|
1816
|
-
var
|
|
1918
|
+
var commandForReading = (command) => withHeredocSubstitutionsAsQuotedText(command).replace(SHELL_LINE_CONTINUATION, "").replace(SAFE_REDIRECTION, "");
|
|
1919
|
+
var readableCommandSegments = (command) => shellCommandSegments(commandForReading(command));
|
|
1920
|
+
var invocationTextWith = ({ program, args }, wordText) => {
|
|
1817
1921
|
if (program === void 0) return "";
|
|
1818
1922
|
const name = basenameOf(program.text);
|
|
1819
1923
|
const kept = SUBCOMMAND_CLIS.has(name) ? argsAfterHarmlessGlobalFlags(args) : args;
|
|
1820
|
-
return [name, ...kept.map(
|
|
1821
|
-
};
|
|
1924
|
+
return [name, ...kept.map(wordText)].join(" ");
|
|
1925
|
+
};
|
|
1926
|
+
var normalizedInvocation = (invocation) => invocationTextWith(invocation, (word) => word.text);
|
|
1927
|
+
var SHELL_METACHARACTER = /[\s;&|<>()$`\\"'*?[\]#~{}!]/;
|
|
1928
|
+
var SINGLE_QUOTE = "'";
|
|
1929
|
+
var ESCAPED_SINGLE_QUOTE = `'\\''`;
|
|
1930
|
+
var asOneShellWord = (text) => SHELL_METACHARACTER.test(text) ? `${SINGLE_QUOTE}${text.replaceAll(SINGLE_QUOTE, ESCAPED_SINGLE_QUOTE)}${SINGLE_QUOTE}` : text;
|
|
1931
|
+
var quotedInvocation = (invocation) => invocationTextWith(invocation, (word) => asOneShellWord(word.text));
|
|
1822
1932
|
var normalizedCommand = (command) => {
|
|
1823
1933
|
const segments = readableCommandSegments(command);
|
|
1824
1934
|
return segments === null ? null : segments.map((segment) => normalizedInvocation(invocationOf(segment))).join("; ");
|
|
1825
1935
|
};
|
|
1826
1936
|
var subcommandDestroys = ({ program, args }) => program !== void 0 && SUBCOMMAND_CLIS.has(basenameOf(program.text)) && subcommandWordsOf(argsAfterHarmlessGlobalFlags(args)).some((word) => subcommandWordDestroys(word.text));
|
|
1937
|
+
var wordsOfInvocation = ({ program, args }) => program === void 0 ? args : [program, ...args];
|
|
1938
|
+
var PRODUCTION_NAMES = /* @__PURE__ */ new Set(["prod", "production"]);
|
|
1939
|
+
var PRODUCTION_FLAGS = /* @__PURE__ */ new Set(["--prod", "--production"]);
|
|
1940
|
+
var ENVIRONMENT_FLAGS = /* @__PURE__ */ new Set([
|
|
1941
|
+
"-e",
|
|
1942
|
+
"--env",
|
|
1943
|
+
"--environment",
|
|
1944
|
+
"--stage",
|
|
1945
|
+
"--profile",
|
|
1946
|
+
"--context",
|
|
1947
|
+
"--target"
|
|
1948
|
+
]);
|
|
1949
|
+
var ENVIRONMENT_VARIABLE = /^[A-Z_]*(?:ENV|ENVIRONMENT|STAGE)$/;
|
|
1950
|
+
var FLAG_VALUE_SEPARATOR = "=";
|
|
1951
|
+
var DEPLOY_CLIS = /* @__PURE__ */ new Set([
|
|
1952
|
+
"vercel",
|
|
1953
|
+
"netlify",
|
|
1954
|
+
"fly",
|
|
1955
|
+
"flyctl",
|
|
1956
|
+
"heroku",
|
|
1957
|
+
"railway",
|
|
1958
|
+
"firebase",
|
|
1959
|
+
"wrangler",
|
|
1960
|
+
"supabase",
|
|
1961
|
+
"serverless",
|
|
1962
|
+
"sls"
|
|
1963
|
+
]);
|
|
1964
|
+
var SCHEMA_CHANGE_WORD = /(?:^|[\s:_./-])(?:migrat(?:e|es|ion|ions)|rollback|seed|db[:\s]push)(?=$|[\s:_./-])(?![\s:_./-]+(?:status|version|list|ls|show|check|diff|history|info)(?:$|[\s:_./-]))/i;
|
|
1965
|
+
var PRODUCTION_READ_VERBS = /* @__PURE__ */ new Set([
|
|
1966
|
+
"logs",
|
|
1967
|
+
"log",
|
|
1968
|
+
"tail",
|
|
1969
|
+
"status",
|
|
1970
|
+
"list",
|
|
1971
|
+
"ls",
|
|
1972
|
+
"info",
|
|
1973
|
+
"inspect",
|
|
1974
|
+
"describe",
|
|
1975
|
+
"get",
|
|
1976
|
+
"show",
|
|
1977
|
+
"whoami",
|
|
1978
|
+
"build",
|
|
1979
|
+
"dev",
|
|
1980
|
+
"open",
|
|
1981
|
+
"history",
|
|
1982
|
+
"metrics",
|
|
1983
|
+
"help",
|
|
1984
|
+
"version",
|
|
1985
|
+
"login",
|
|
1986
|
+
"link",
|
|
1987
|
+
"pull"
|
|
1988
|
+
]);
|
|
1989
|
+
var PRODUCTION_SETTING_NAMESPACES = /* @__PURE__ */ new Set(["env", "secret", "secrets", "config", "domains", "dns", "certs"]);
|
|
1990
|
+
var deployCliOperandsAfter = (words, cli) => {
|
|
1991
|
+
const after = words.slice(cli + 1);
|
|
1992
|
+
const firstFlag = after.findIndex((word) => FLAG.test(word.text));
|
|
1993
|
+
return (firstFlag === -1 ? after : after.slice(0, firstFlag)).map((word) => word.text.toLowerCase());
|
|
1994
|
+
};
|
|
1995
|
+
var deployCliOnlyReads = (operands) => {
|
|
1996
|
+
const [first, second] = operands.map((operand) => operand.split(":")[0] ?? "");
|
|
1997
|
+
const verb = PRODUCTION_SETTING_NAMESPACES.has(first ?? "") ? second : first;
|
|
1998
|
+
return verb !== void 0 && PRODUCTION_READ_VERBS.has(verb);
|
|
1999
|
+
};
|
|
2000
|
+
var deployCliChangesSomething = (words) => words.some((word, index) => DEPLOY_CLIS.has(basenameOf(word.text)) && !deployCliOnlyReads(deployCliOperandsAfter(words, index)));
|
|
2001
|
+
var valueSelectsProduction = (name, value, names) => names.has(name) && PRODUCTION_NAMES.has(value.toLowerCase());
|
|
2002
|
+
var wordSelectsProduction = (word, previous) => {
|
|
2003
|
+
const separator = word.text.indexOf(FLAG_VALUE_SEPARATOR);
|
|
2004
|
+
const name = separator > 0 ? word.text.slice(0, separator) : "";
|
|
2005
|
+
const value = separator > 0 ? word.text.slice(separator + 1) : "";
|
|
2006
|
+
return PRODUCTION_FLAGS.has(word.text.toLowerCase()) || valueSelectsProduction(name.toLowerCase(), value, ENVIRONMENT_FLAGS) || ENVIRONMENT_VARIABLE.test(name) && PRODUCTION_NAMES.has(value.toLowerCase()) || valueSelectsProduction((previous?.text ?? "").toLowerCase(), word.text, ENVIRONMENT_FLAGS);
|
|
2007
|
+
};
|
|
2008
|
+
var changesProduction = (invocation) => {
|
|
2009
|
+
const words = wordsOfInvocation(invocation);
|
|
2010
|
+
return words.some((word, index) => wordSelectsProduction(word, words[index - 1])) && (deployCliChangesSomething(words) || SCHEMA_CHANGE_WORD.test(normalizedInvocation(invocation)));
|
|
2011
|
+
};
|
|
2012
|
+
var MYSQL_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-e", "--execute"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false };
|
|
2013
|
+
var SQLITE_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-init"]), positionalSql: true };
|
|
2014
|
+
var SQL_CLIENT_SYNTAX = /* @__PURE__ */ new Map([
|
|
2015
|
+
["psql", { inlineFlags: /* @__PURE__ */ new Set(["-c", "--command"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false }],
|
|
2016
|
+
["mysql", MYSQL_SYNTAX],
|
|
2017
|
+
["mariadb", MYSQL_SYNTAX],
|
|
2018
|
+
["sqlite3", SQLITE_SYNTAX],
|
|
2019
|
+
["sqlite", SQLITE_SYNTAX],
|
|
2020
|
+
["duckdb", { inlineFlags: /* @__PURE__ */ new Set(["-c", "-s", "-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "-init"]), positionalSql: true }],
|
|
2021
|
+
["clickhouse-client", { inlineFlags: /* @__PURE__ */ new Set(["-q", "--query"]), scriptFlags: /* @__PURE__ */ new Set(["--queries-file"]), positionalSql: false }],
|
|
2022
|
+
["bq", { inlineFlags: /* @__PURE__ */ new Set(), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: true }],
|
|
2023
|
+
["mongosh", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false }],
|
|
2024
|
+
["mongo", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false }]
|
|
2025
|
+
]);
|
|
2026
|
+
var SQL_WRITE_STATEMENT = new RegExp([
|
|
2027
|
+
String.raw`\b(?:insert|update|delete|merge|upsert|alter|create|drop|truncate|grant|revoke|copy|vacuum|reindex|rename|attach|detach)\b`,
|
|
2028
|
+
String.raw`\breplace\s+into\b`,
|
|
2029
|
+
String.raw`\bload\s+data\b`,
|
|
2030
|
+
String.raw`\binto\s+(?:out|dump)file\b`,
|
|
2031
|
+
String.raw`\bset\s+(?:global|persist)\b`,
|
|
2032
|
+
String.raw`\bkill\s+(?:query|connection|\d)`,
|
|
2033
|
+
String.raw`\bcall\s+[\w.]+\s*\(`,
|
|
2034
|
+
String.raw`\bdo\s+(?:\$\w*\$|')`,
|
|
2035
|
+
String.raw`\bpg_terminate_backend\b`,
|
|
2036
|
+
String.raw`\bsetval\b`,
|
|
2037
|
+
String.raw`\bpragma\s+writable_schema\b`,
|
|
2038
|
+
String.raw`\.(?:insert|update|delete|replace|remove|drop|rename|create|bulkwrite|findoneand)\w*\s*\(`
|
|
2039
|
+
].join("|"), "i");
|
|
2040
|
+
var SQL_READ_PHRASE = /\bshow\s+create\b/gi;
|
|
2041
|
+
var SQL_STRING_LITERAL = /'(?:[^']|'')*'/g;
|
|
2042
|
+
var EMPTY_SQL_STRING = "''";
|
|
2043
|
+
var SQL_COMMENT = /--[^\n]*|\/\*[\s\S]*?\*\//g;
|
|
2044
|
+
var writesThroughSql = (sql) => {
|
|
2045
|
+
const statement = sql.replace(SQL_COMMENT, " ").replace(SQL_STRING_LITERAL, EMPTY_SQL_STRING).replace(SQL_READ_PHRASE, "");
|
|
2046
|
+
return SQL_WRITE_STATEMENT.test(statement) || SQL_CLIENT_FILE_COMMAND.test(statement);
|
|
2047
|
+
};
|
|
2048
|
+
var SQL_CLIENT_FILE_COMMAND = new RegExp([
|
|
2049
|
+
String.raw`(?:^|[\s;=])\\(?:i|ir|include|include_relative|o|out|w|write|gexec|!|\.)(?=\s|$)`,
|
|
2050
|
+
String.raw`(?:^|[\s;=])\\g\s*\|`,
|
|
2051
|
+
String.raw`(?:^|[\s;=])\.(?:read|import|restore|load|output|once|shell|system|backup|save|open)(?=\s|$)`,
|
|
2052
|
+
String.raw`(?:^|[;=])\s*(?:system|source)\s`
|
|
2053
|
+
].join("|"), "i");
|
|
2054
|
+
var SHORT_FLAG_CLUSTER_ONLY = /^-([A-Za-z0-9]+)$/;
|
|
2055
|
+
var NO_SQL = { script: false, sql: null, hidden: false };
|
|
2056
|
+
var shortFlagOf = (flags, text) => [...flags].find((flag) => /^-[A-Za-z]$/.test(flag) && text.startsWith(flag) && text.length > flag.length && !text.startsWith("--"));
|
|
2057
|
+
var sqlArgumentAt = (args, index, syntax) => {
|
|
2058
|
+
const arg = args[index];
|
|
2059
|
+
if (arg === void 0) return NO_SQL;
|
|
2060
|
+
const next = args[index + 1];
|
|
2061
|
+
const valueOf = (word) => ({ script: false, sql: word?.text ?? null, hidden: word?.expands ?? false });
|
|
2062
|
+
if (syntax.scriptFlags.has(arg.text) || namesALongFlagValue(arg.text, syntax.scriptFlags) || shortFlagOf(syntax.scriptFlags, arg.text)) {
|
|
2063
|
+
return { script: true, sql: null, hidden: false };
|
|
2064
|
+
}
|
|
2065
|
+
if (syntax.inlineFlags.has(arg.text)) return valueOf(next);
|
|
2066
|
+
const longInline = [...syntax.inlineFlags].find((flag) => arg.text.startsWith(`${flag}${FLAG_VALUE_SEPARATOR}`));
|
|
2067
|
+
if (longInline) return { script: false, sql: arg.text.slice(longInline.length + 1), hidden: arg.expands };
|
|
2068
|
+
const shortInline = shortFlagOf(syntax.inlineFlags, arg.text);
|
|
2069
|
+
if (shortInline) return { script: false, sql: arg.text.slice(shortInline.length), hidden: arg.expands };
|
|
2070
|
+
const cluster = SHORT_FLAG_CLUSTER_ONLY.exec(arg.text)?.[1];
|
|
2071
|
+
const last = cluster ? `-${cluster.slice(-1)}` : "";
|
|
2072
|
+
if (cluster && cluster.length > 1 && syntax.scriptFlags.has(last)) return { script: true, sql: null, hidden: false };
|
|
2073
|
+
if (cluster && cluster.length > 1 && syntax.inlineFlags.has(last)) return valueOf(next);
|
|
2074
|
+
return { script: false, sql: arg.text, hidden: false };
|
|
2075
|
+
};
|
|
2076
|
+
var namesALongFlagValue = (text, flags) => [...flags].some((flag) => flag.startsWith("--") && text.startsWith(`${flag}${FLAG_VALUE_SEPARATOR}`));
|
|
2077
|
+
var positionalSqlIsHidden = (args, syntax) => syntax.positionalSql && args.filter((arg) => !arg.text.startsWith("-")).slice(1).some((arg) => arg.expands);
|
|
2078
|
+
var sqlClientSyntaxOf = ({ program }) => program === void 0 ? void 0 : SQL_CLIENT_SYNTAX.get(basenameOf(program.text));
|
|
2079
|
+
var sqlClientChangesData = (invocation) => {
|
|
2080
|
+
const syntax = sqlClientSyntaxOf(invocation);
|
|
2081
|
+
if (syntax === void 0) return false;
|
|
2082
|
+
return positionalSqlIsHidden(invocation.args, syntax) || invocation.args.some((_, index) => {
|
|
2083
|
+
const { script, sql, hidden } = sqlArgumentAt(invocation.args, index, syntax);
|
|
2084
|
+
return script || hidden || sql !== null && writesThroughSql(sql);
|
|
2085
|
+
});
|
|
2086
|
+
};
|
|
2087
|
+
var PULL_REQUEST_CLIS = /* @__PURE__ */ new Set(["gh", "glab"]);
|
|
2088
|
+
var PULL_REQUEST_NOUNS = /* @__PURE__ */ new Set(["pr", "mr"]);
|
|
2089
|
+
var MERGE_SUBCOMMAND = "merge";
|
|
2090
|
+
var PULL_REQUEST_MERGE_PATH = /(?:^|\/)pulls\/\d+\/merge$/;
|
|
2091
|
+
var mergesAPullRequest = ({ program, args }) => {
|
|
2092
|
+
if (program === void 0 || !PULL_REQUEST_CLIS.has(basenameOf(program.text))) return false;
|
|
2093
|
+
const words = args.filter((arg) => !arg.text.startsWith("-"));
|
|
2094
|
+
return words.some((word, index) => PULL_REQUEST_NOUNS.has(word.text) && words[index + 1]?.text === MERGE_SUBCOMMAND) || args.some((arg) => PULL_REQUEST_MERGE_PATH.test(arg.text));
|
|
2095
|
+
};
|
|
2096
|
+
var DEPLOY_AND_SCHEMA_COMMAND_PATTERNS = [
|
|
2097
|
+
"Bash(kubectl apply:*)",
|
|
2098
|
+
"Bash(kubectl replace:*)",
|
|
2099
|
+
"Bash(kubectl scale:*)",
|
|
2100
|
+
"Bash(kubectl rollout restart:*)",
|
|
2101
|
+
"Bash(kubectl rollout undo:*)",
|
|
2102
|
+
"Bash(helm install:*)",
|
|
2103
|
+
"Bash(helm upgrade:*)",
|
|
2104
|
+
"Bash(helm rollback:*)",
|
|
2105
|
+
"Bash(vercel promote:*)",
|
|
2106
|
+
"Bash(vercel rollback:*)",
|
|
2107
|
+
"Bash(railway up:*)",
|
|
2108
|
+
"Bash(prisma db push:*)",
|
|
2109
|
+
"Bash(prisma migrate reset:*)",
|
|
2110
|
+
"Bash(supabase db push:*)",
|
|
2111
|
+
"Bash(supabase db reset:*)",
|
|
2112
|
+
"Bash(drizzle-kit push:*)",
|
|
2113
|
+
"Bash(docker push:*)",
|
|
2114
|
+
"Bash(podman push:*)",
|
|
2115
|
+
"Bash(twine upload:*)",
|
|
2116
|
+
"Bash(npm publish:*)",
|
|
2117
|
+
"Bash(npm unpublish:*)",
|
|
2118
|
+
"Bash(cargo publish:*)",
|
|
2119
|
+
"Bash(gem push:*)",
|
|
2120
|
+
"Bash(poetry publish:*)",
|
|
2121
|
+
"Bash(uv publish:*)",
|
|
2122
|
+
"Bash(pnpm publish:*)",
|
|
2123
|
+
"Bash(yarn publish:*)",
|
|
2124
|
+
"Bash(yarn npm publish:*)",
|
|
2125
|
+
"Bash(bun publish:*)",
|
|
2126
|
+
"Bash(gh release create:*)",
|
|
2127
|
+
"Bash(pulumi up:*)",
|
|
2128
|
+
"Bash(pulumi destroy:*)",
|
|
2129
|
+
"Bash(cdk deploy:*)",
|
|
2130
|
+
"Bash(cdk destroy:*)",
|
|
2131
|
+
"Bash(tofu apply:*)",
|
|
2132
|
+
"Bash(tofu destroy:*)",
|
|
2133
|
+
"Bash(terraform apply:*)",
|
|
2134
|
+
"Bash(terraform destroy:*)",
|
|
2135
|
+
"Bash(firebase deploy:*)",
|
|
2136
|
+
"Bash(fly deploy:*)",
|
|
2137
|
+
"Bash(flyctl deploy:*)",
|
|
2138
|
+
"Bash(wrangler deploy:*)",
|
|
2139
|
+
"Bash(wrangler publish:*)",
|
|
2140
|
+
"Bash(serverless deploy:*)",
|
|
2141
|
+
"Bash(sls deploy:*)",
|
|
2142
|
+
"Bash(gcloud app deploy:*)",
|
|
2143
|
+
"Bash(gcloud run deploy:*)",
|
|
2144
|
+
"Bash(gcloud functions deploy:*)"
|
|
2145
|
+
];
|
|
2146
|
+
var SECRET_FILE_NAME = /^(?:\.env(?:\.(?!example$|sample$|template$)[\w.-]+)?|(?:secrets?|credentials)\.(?:json|ya?ml|env|toml|ini)|credentials)$/i;
|
|
2147
|
+
var REDIRECTS_INTO_A_SECRET_FILE = />>?\s*(?:[^\s;|&<>]*\/)?\.env(?:\.[\w-]+)?(?=$|[\s;|&)])/;
|
|
2148
|
+
var COPIES_ONTO_ITS_LAST_OPERAND = /* @__PURE__ */ new Set(["cp", "install", "ln", "rsync", "scp"]);
|
|
2149
|
+
var WRITES_EVERY_OPERAND = /* @__PURE__ */ new Set(["mv", "tee", "rm", "unlink", "shred", "truncate"]);
|
|
2150
|
+
var EDITS_IN_PLACE = /* @__PURE__ */ new Set(["sed", "gsed", "perl"]);
|
|
2151
|
+
var IN_PLACE_FLAG = /^(?:-[A-Za-z]*i|--in-place(?:=.*)?)$/;
|
|
2152
|
+
var namesASecretFile = (word) => word !== void 0 && SECRET_FILE_NAME.test(basenameOf(word.text));
|
|
2153
|
+
var NETWORK_SENDERS = /* @__PURE__ */ new Set([
|
|
2154
|
+
"curl",
|
|
2155
|
+
"wget",
|
|
2156
|
+
"scp",
|
|
2157
|
+
"sftp",
|
|
2158
|
+
"rsync",
|
|
2159
|
+
"nc",
|
|
2160
|
+
"ncat",
|
|
2161
|
+
"http",
|
|
2162
|
+
"https",
|
|
2163
|
+
"xh",
|
|
2164
|
+
"gh",
|
|
2165
|
+
"aws",
|
|
2166
|
+
"gsutil",
|
|
2167
|
+
"rclone"
|
|
2168
|
+
]);
|
|
2169
|
+
var FILE_REFERENCE_PREFIX = /^(?:[\w.-]+=)?@|^[\w.-]+:/;
|
|
2170
|
+
var namesASecretFileReference = (word) => SECRET_FILE_NAME.test(basenameOf(word.text.replace(FILE_REFERENCE_PREFIX, "")));
|
|
2171
|
+
var sendsASecretFile = ({ program, args }) => program !== void 0 && NETWORK_SENDERS.has(basenameOf(program.text)) && args.some(namesASecretFileReference);
|
|
2172
|
+
var writesASecretFile = ({ program, args }) => {
|
|
2173
|
+
if (program === void 0) return false;
|
|
2174
|
+
if (sendsASecretFile({ program, args })) return true;
|
|
2175
|
+
const name = basenameOf(program.text);
|
|
2176
|
+
const operands = args.filter((arg) => !FLAG.test(arg.text));
|
|
2177
|
+
if (COPIES_ONTO_ITS_LAST_OPERAND.has(name)) return namesASecretFile(operands.at(-1));
|
|
2178
|
+
if (WRITES_EVERY_OPERAND.has(name)) return operands.some(namesASecretFile);
|
|
2179
|
+
return EDITS_IN_PLACE.has(name) && args.some((arg) => IN_PLACE_FLAG.test(arg.text)) && operands.some(namesASecretFile);
|
|
2180
|
+
};
|
|
2181
|
+
var GITHUB_RESOURCE_NOUNS = /* @__PURE__ */ new Set([
|
|
2182
|
+
"pr",
|
|
2183
|
+
"issue",
|
|
2184
|
+
"release",
|
|
2185
|
+
"repo",
|
|
2186
|
+
"gist",
|
|
2187
|
+
"label",
|
|
2188
|
+
"secret",
|
|
2189
|
+
"variable",
|
|
2190
|
+
"workflow",
|
|
2191
|
+
"run",
|
|
2192
|
+
"cache",
|
|
2193
|
+
"project",
|
|
2194
|
+
"ruleset",
|
|
2195
|
+
"codespace",
|
|
2196
|
+
"org",
|
|
2197
|
+
"discussion"
|
|
2198
|
+
]);
|
|
2199
|
+
var GITHUB_READ_VERBS = /* @__PURE__ */ new Set([
|
|
2200
|
+
"view",
|
|
2201
|
+
"list",
|
|
2202
|
+
"ls",
|
|
2203
|
+
"status",
|
|
2204
|
+
"diff",
|
|
2205
|
+
"checks",
|
|
2206
|
+
"check",
|
|
2207
|
+
"watch",
|
|
2208
|
+
"browse",
|
|
2209
|
+
"download",
|
|
2210
|
+
"clone",
|
|
2211
|
+
"checkout",
|
|
2212
|
+
"get",
|
|
2213
|
+
"field-list",
|
|
2214
|
+
"item-list"
|
|
2215
|
+
]);
|
|
2216
|
+
var GITHUB_OPTIONS_WITH_VALUES = /* @__PURE__ */ new Set(["-R", "--repo", "--hostname"]);
|
|
2217
|
+
var GITHUB_API_SUBCOMMAND = "api";
|
|
2218
|
+
var GITHUB_GRAPHQL_ENDPOINT = "graphql";
|
|
2219
|
+
var HTTP_METHOD_FLAGS = /* @__PURE__ */ new Set(["-X", "--method"]);
|
|
2220
|
+
var HTTP_METHOD_ATTACHED = /^(?:-X|--method=)(.+)$/;
|
|
2221
|
+
var HTTP_READ_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD"]);
|
|
2222
|
+
var GITHUB_API_BODY_FLAG = /^(?:-[fF]|--(?:field|raw-field|input)(?:=|$))/;
|
|
2223
|
+
var GITHUB_API_FILE_FIELD = /=@|^--input(?:=|$)/;
|
|
2224
|
+
var GRAPHQL_MUTATION = /\bmutation\b/i;
|
|
2225
|
+
var STRIPE_READ_COMMANDS = /* @__PURE__ */ new Set([
|
|
2226
|
+
"get",
|
|
2227
|
+
"listen",
|
|
2228
|
+
"logs",
|
|
2229
|
+
"status",
|
|
2230
|
+
"version",
|
|
2231
|
+
"help",
|
|
2232
|
+
"login",
|
|
2233
|
+
"logout",
|
|
2234
|
+
"config",
|
|
2235
|
+
"completion",
|
|
2236
|
+
"open",
|
|
2237
|
+
"resources"
|
|
2238
|
+
]);
|
|
2239
|
+
var STRIPE_REQUEST_COMMANDS_THAT_WRITE = /* @__PURE__ */ new Set(["post", "delete", "trigger", "fixtures"]);
|
|
2240
|
+
var STRIPE_READ_OPERATIONS = /* @__PURE__ */ new Set(["list", "retrieve", "search"]);
|
|
2241
|
+
var STRIPE_OPTIONS_WITH_VALUES = /* @__PURE__ */ new Set([
|
|
2242
|
+
"--api-key",
|
|
2243
|
+
"--project-name",
|
|
2244
|
+
"-p",
|
|
2245
|
+
"--color",
|
|
2246
|
+
"--log-level",
|
|
2247
|
+
"--device-name",
|
|
2248
|
+
"--config",
|
|
2249
|
+
"--stripe-account"
|
|
2250
|
+
]);
|
|
2251
|
+
var AWS_OPTIONS_WITH_VALUES = /* @__PURE__ */ new Set([
|
|
2252
|
+
"--region",
|
|
2253
|
+
"--profile",
|
|
2254
|
+
"--output",
|
|
2255
|
+
"--endpoint-url",
|
|
2256
|
+
"--query",
|
|
2257
|
+
"--color",
|
|
2258
|
+
"--ca-bundle",
|
|
2259
|
+
"--cli-read-timeout",
|
|
2260
|
+
"--cli-connect-timeout",
|
|
2261
|
+
"--cli-binary-format"
|
|
2262
|
+
]);
|
|
2263
|
+
var AWS_LOCAL_COMMANDS = /* @__PURE__ */ new Set(["configure", "help", "history", "sso", "login", "logout"]);
|
|
2264
|
+
var AWS_READ_OPERATION = /^(?:describe|list|get|head|batch-get|lookup|search|filter|scan|query|select|wait|validate|estimate|simulate|tail|ls|presign|help)(?:-|$)/;
|
|
2265
|
+
var AWS_S3_SERVICE = "s3";
|
|
2266
|
+
var AWS_S3_COPIES = /* @__PURE__ */ new Set(["cp", "sync"]);
|
|
2267
|
+
var S3_URL_PREFIX = "s3://";
|
|
2268
|
+
var TWILIO_TOPIC_SEPARATOR = ":";
|
|
2269
|
+
var TWILIO_READ_ACTIONS = /* @__PURE__ */ new Set(["list", "fetch"]);
|
|
2270
|
+
var positionalWordsOf = (args, optionsWithValues) => {
|
|
2271
|
+
const endOfOptions = args.findIndex((arg) => arg.text === END_OF_OPTIONS);
|
|
2272
|
+
const options = endOfOptions === -1 ? args : args.slice(0, endOfOptions);
|
|
2273
|
+
const operands = endOfOptions === -1 ? [] : args.slice(endOfOptions + 1);
|
|
2274
|
+
const positional = options.filter((arg, index) => !arg.text.startsWith("-") && !optionsWithValues.has(options[index - 1]?.text ?? ""));
|
|
2275
|
+
return [...positional, ...operands];
|
|
2276
|
+
};
|
|
2277
|
+
var httpMethodOf = (args) => {
|
|
2278
|
+
for (const [index, arg] of args.entries()) {
|
|
2279
|
+
const attached = HTTP_METHOD_ATTACHED.exec(arg.text);
|
|
2280
|
+
if (attached) return arg.expands ? null : attached[1];
|
|
2281
|
+
if (HTTP_METHOD_FLAGS.has(arg.text)) {
|
|
2282
|
+
const value = args[index + 1];
|
|
2283
|
+
return value === void 0 || value.expands ? null : value.text;
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
return void 0;
|
|
2287
|
+
};
|
|
2288
|
+
var graphqlRequestCanWrite = (args) => args.some((arg) => arg.expands || GRAPHQL_MUTATION.test(arg.text) || GITHUB_API_FILE_FIELD.test(arg.text));
|
|
2289
|
+
var githubApiRequestWrites = (args) => {
|
|
2290
|
+
const method = httpMethodOf(args);
|
|
2291
|
+
if (method !== void 0) return method === null || !HTTP_READ_METHODS.has(method.toUpperCase());
|
|
2292
|
+
if (args.some((arg) => arg.text === GITHUB_GRAPHQL_ENDPOINT)) return graphqlRequestCanWrite(args);
|
|
2293
|
+
return args.some((arg) => GITHUB_API_BODY_FLAG.test(arg.text));
|
|
2294
|
+
};
|
|
2295
|
+
var githubCliWrites = (args) => {
|
|
2296
|
+
const meaningful = argsAfterHarmlessGlobalFlags(args);
|
|
2297
|
+
const [noun, verb] = positionalWordsOf(meaningful, GITHUB_OPTIONS_WITH_VALUES);
|
|
2298
|
+
if (noun?.text === GITHUB_API_SUBCOMMAND) return githubApiRequestWrites(meaningful.slice(meaningful.indexOf(noun) + 1));
|
|
2299
|
+
return noun !== void 0 && GITHUB_RESOURCE_NOUNS.has(noun.text) && verb !== void 0 && !GITHUB_READ_VERBS.has(verb.text);
|
|
2300
|
+
};
|
|
2301
|
+
var stripeCliWrites = (args) => {
|
|
2302
|
+
const [command, operation] = positionalWordsOf(args, STRIPE_OPTIONS_WITH_VALUES);
|
|
2303
|
+
if (command === void 0 || STRIPE_READ_COMMANDS.has(command.text)) return false;
|
|
2304
|
+
if (STRIPE_REQUEST_COMMANDS_THAT_WRITE.has(command.text)) return true;
|
|
2305
|
+
return operation !== void 0 && !STRIPE_READ_OPERATIONS.has(operation.text);
|
|
2306
|
+
};
|
|
2307
|
+
var s3CommandWrites = (operation, operands) => !AWS_S3_COPIES.has(operation) ? !AWS_READ_OPERATION.test(operation) : operands.slice(1).some((operand) => operand.expands || operand.text.startsWith(S3_URL_PREFIX));
|
|
2308
|
+
var awsCliWrites = (args) => {
|
|
2309
|
+
const [service, operation, ...operands] = positionalWordsOf(args, AWS_OPTIONS_WITH_VALUES);
|
|
2310
|
+
if (service === void 0 || operation === void 0 || AWS_LOCAL_COMMANDS.has(service.text)) return false;
|
|
2311
|
+
return service.text === AWS_S3_SERVICE ? s3CommandWrites(operation.text, operands) : !AWS_READ_OPERATION.test(operation.text);
|
|
2312
|
+
};
|
|
2313
|
+
var twilioCliWrites = (args) => {
|
|
2314
|
+
const [topic] = positionalWordsOf(args, /* @__PURE__ */ new Set());
|
|
2315
|
+
if (topic === void 0 || !topic.text.includes(TWILIO_TOPIC_SEPARATOR)) return false;
|
|
2316
|
+
return !TWILIO_READ_ACTIONS.has(topic.text.split(TWILIO_TOPIC_SEPARATOR).at(-1) ?? "");
|
|
2317
|
+
};
|
|
2318
|
+
var REMOTE_API_CLI_WRITES = /* @__PURE__ */ new Map([
|
|
2319
|
+
["gh", githubCliWrites],
|
|
2320
|
+
["stripe", stripeCliWrites],
|
|
2321
|
+
["aws", awsCliWrites],
|
|
2322
|
+
["twilio", twilioCliWrites]
|
|
2323
|
+
]);
|
|
2324
|
+
var invocationWritesThroughARemoteApi = ({ program, args }) => {
|
|
2325
|
+
const writes = program === void 0 ? void 0 : REMOTE_API_CLI_WRITES.get(basenameOf(program.text));
|
|
2326
|
+
return writes !== void 0 && writes(args);
|
|
2327
|
+
};
|
|
2328
|
+
var commandWritesThroughARemoteApi = (command) => {
|
|
2329
|
+
const segments = readableCommandSegments(command);
|
|
2330
|
+
return segments !== null && segments.some((segment) => invocationWritesThroughARemoteApi(invocationOf(segment)));
|
|
2331
|
+
};
|
|
1827
2332
|
var segmentNeedsAPerson = (toolName, segment) => {
|
|
1828
2333
|
const invocation = invocationOf(segment);
|
|
1829
2334
|
const normalized = normalizedInvocation(invocation);
|
|
1830
|
-
return invocationHidesItsEffect(invocation) || subcommandDestroys(invocation) || classifyDecisionRisk(toolName, normalized) !== "standard" || isCoveredByPolicy(CAPABILITY_PATTERNS.destructive, toolName, normalized) || isCoveredByPolicy(CAPABILITY_PATTERNS.network, toolName, normalized) || isCoveredByPolicy(DATA_LOSS_COMMAND_PATTERNS, toolName, normalized);
|
|
2335
|
+
return invocationHidesItsEffect(invocation) || subcommandDestroys(invocation) || changesWhatIsDeployed(toolName, invocation, normalized) || sqlClientChangesData(invocation) || classifyDecisionRisk(toolName, normalized) !== "standard" || isCoveredByPolicy(CAPABILITY_PATTERNS.destructive, toolName, normalized) || isCoveredByPolicy(CAPABILITY_PATTERNS.network, toolName, normalized) || isCoveredByPolicy(DATA_LOSS_COMMAND_PATTERNS, toolName, normalized);
|
|
1831
2336
|
};
|
|
1832
2337
|
var commandNeedsAPerson = (toolName, command) => {
|
|
1833
2338
|
if (toolName === "Bash" && isSafeReadOnlyCommand(command)) return false;
|
|
1834
2339
|
const segments = readableCommandSegments(command);
|
|
1835
|
-
return segments === null || classifyDecisionRisk(toolName, command) !== "standard" || segments.some((segment) => segmentNeedsAPerson(toolName, segment));
|
|
2340
|
+
return segments === null || classifyDecisionRisk(toolName, command) !== "standard" || segments.some((segment) => segmentNeedsAPerson(toolName, segment)) || pipesIntoASqlClient(command);
|
|
1836
2341
|
};
|
|
2342
|
+
var VISIBLE_DATA_LOSS_PATTERNS = [
|
|
2343
|
+
"Bash(git branch -D:*)",
|
|
2344
|
+
"Bash(git branch --delete:*)",
|
|
2345
|
+
"Bash(git stash drop:*)",
|
|
2346
|
+
"Bash(git stash clear:*)",
|
|
2347
|
+
"Bash(git filter-branch:*)",
|
|
2348
|
+
"Bash(git update-ref -d:*)",
|
|
2349
|
+
"Bash(git reflog expire:*)",
|
|
2350
|
+
"Bash(git prune:*)",
|
|
2351
|
+
"Bash(dd :*)",
|
|
2352
|
+
"Bash(shred:*)",
|
|
2353
|
+
"Bash(chmod -R:*)",
|
|
2354
|
+
"Bash(chown -R:*)",
|
|
2355
|
+
"Bash(dropdb:*)",
|
|
2356
|
+
"Bash(mkfs:*)",
|
|
2357
|
+
"Bash(rclone sync:*)",
|
|
2358
|
+
"Bash(rclone delete:*)",
|
|
2359
|
+
"Bash(rclone purge:*)",
|
|
2360
|
+
"Bash(diskutil eraseDisk:*)",
|
|
2361
|
+
"Bash(diskutil eraseVolume:*)",
|
|
2362
|
+
"Bash(diskutil zeroDisk:*)",
|
|
2363
|
+
"Bash(diskutil secureErase:*)",
|
|
2364
|
+
"Bash(diskutil partitionDisk:*)",
|
|
2365
|
+
"Bash(diskutil reformat:*)"
|
|
2366
|
+
];
|
|
2367
|
+
var NEW_BRANCH_FLAGS = /* @__PURE__ */ new Set(["-b", "--orphan"]);
|
|
2368
|
+
var CHECKOUT_PATH_FLAGS = /* @__PURE__ */ new Set(["-p", "--patch", "--ours", "--theirs", "--pathspec-from-file"]);
|
|
2369
|
+
var UNSTAGE_ONLY_FLAGS = /* @__PURE__ */ new Set(["--staged", "-S"]);
|
|
2370
|
+
var WORKTREE_FLAGS = /* @__PURE__ */ new Set(["--worktree", "-W"]);
|
|
2371
|
+
var DISCARDING_RESET_MODES = /* @__PURE__ */ new Set(["--hard", "--merge", "--keep"]);
|
|
2372
|
+
var FORCE_FLAGS = /* @__PURE__ */ new Set(["-f", "--force"]);
|
|
2373
|
+
var REFSPEC_THAT_FORCES_OR_DELETES = /^[+:]/;
|
|
2374
|
+
var LOOKS_LIKE_A_PATH = /^\.{1,2}$|\/$|[*?[]|(?:^|\/)[^/]+\.[A-Za-z][A-Za-z0-9]*$/;
|
|
2375
|
+
var GIT_WORK_DISCARDERS = /* @__PURE__ */ new Map([
|
|
2376
|
+
["checkout", (flags, operands) => !flags.some((flag) => NEW_BRANCH_FLAGS.has(flag)) && (flags.some((flag) => CHECKOUT_PATH_FLAGS.has(flag)) || operands.length > 1 || operands.some((operand) => LOOKS_LIKE_A_PATH.test(operand)))],
|
|
2377
|
+
["restore", (flags) => !flags.some((flag) => UNSTAGE_ONLY_FLAGS.has(flag)) || flags.some((flag) => WORKTREE_FLAGS.has(flag))],
|
|
2378
|
+
["reset", (flags) => flags.some((flag) => DISCARDING_RESET_MODES.has(flag))],
|
|
2379
|
+
["push", (_flags, operands) => operands.some((operand) => REFSPEC_THAT_FORCES_OR_DELETES.test(operand))],
|
|
2380
|
+
["worktree", (flags, operands) => operands[0] === "remove" && flags.some((flag) => FORCE_FLAGS.has(flag))]
|
|
2381
|
+
]);
|
|
2382
|
+
var gitDiscardsWork = ({ program, args }) => {
|
|
2383
|
+
if (program === void 0 || basenameOf(program.text) !== "git") return false;
|
|
2384
|
+
const [subcommand, ...rest] = argsAfterHarmlessGlobalFlags(args);
|
|
2385
|
+
const discards = GIT_WORK_DISCARDERS.get(subcommand?.text ?? "");
|
|
2386
|
+
const texts = rest.map((arg) => arg.text);
|
|
2387
|
+
return discards !== void 0 && discards(texts.filter((text) => FLAG.test(text)), texts.filter((text) => !FLAG.test(text)));
|
|
2388
|
+
};
|
|
2389
|
+
var PACKAGE_MANAGERS = /* @__PURE__ */ new Set([
|
|
2390
|
+
"npm",
|
|
2391
|
+
"pnpm",
|
|
2392
|
+
"yarn",
|
|
2393
|
+
"bun",
|
|
2394
|
+
"pip",
|
|
2395
|
+
"pip3",
|
|
2396
|
+
"cargo",
|
|
2397
|
+
"brew",
|
|
2398
|
+
"gem",
|
|
2399
|
+
"uv",
|
|
2400
|
+
"poetry"
|
|
2401
|
+
]);
|
|
2402
|
+
var GIT = "git";
|
|
2403
|
+
var removesAPackage = ({ program, args }) => program !== void 0 && PACKAGE_MANAGERS.has(basenameOf(program.text)) && subcommandWordDestroys(subcommandWordsOf(argsAfterHarmlessGlobalFlags(args))[0]?.text ?? "");
|
|
2404
|
+
var subcommandDestroysVisibly = (invocation) => subcommandDestroys(invocation) && basenameOf(invocation.program?.text ?? "") !== GIT && !removesAPackage(invocation);
|
|
2405
|
+
var SERVICE_MANAGER_READ_VERBS = /* @__PURE__ */ new Map([
|
|
2406
|
+
["systemctl", /* @__PURE__ */ new Set([
|
|
2407
|
+
"status",
|
|
2408
|
+
"show",
|
|
2409
|
+
"cat",
|
|
2410
|
+
"help",
|
|
2411
|
+
"list-units",
|
|
2412
|
+
"list-unit-files",
|
|
2413
|
+
"list-timers",
|
|
2414
|
+
"list-sockets",
|
|
2415
|
+
"list-dependencies",
|
|
2416
|
+
"list-jobs",
|
|
2417
|
+
"is-active",
|
|
2418
|
+
"is-enabled",
|
|
2419
|
+
"is-failed",
|
|
2420
|
+
"is-system-running",
|
|
2421
|
+
"get-default"
|
|
2422
|
+
])],
|
|
2423
|
+
["launchctl", /* @__PURE__ */ new Set([
|
|
2424
|
+
"list",
|
|
2425
|
+
"print",
|
|
2426
|
+
"print-disabled",
|
|
2427
|
+
"print-cache",
|
|
2428
|
+
"blame",
|
|
2429
|
+
"help",
|
|
2430
|
+
"version",
|
|
2431
|
+
"getenv",
|
|
2432
|
+
"managerpid",
|
|
2433
|
+
"managername",
|
|
2434
|
+
"manageruid",
|
|
2435
|
+
"hostinfo",
|
|
2436
|
+
"dumpstate"
|
|
2437
|
+
])]
|
|
2438
|
+
]);
|
|
2439
|
+
var changesAService = ({ program, args }) => {
|
|
2440
|
+
const readVerbs = program === void 0 ? void 0 : SERVICE_MANAGER_READ_VERBS.get(basenameOf(program.text));
|
|
2441
|
+
const verb = args.find((arg) => !FLAG.test(arg.text))?.text;
|
|
2442
|
+
return readVerbs !== void 0 && verb !== void 0 && !readVerbs.has(verb);
|
|
2443
|
+
};
|
|
2444
|
+
var CRONTAB = "crontab";
|
|
2445
|
+
var CRONTAB_USER_FLAG = "-u";
|
|
2446
|
+
var CRONTAB_REMOVE_FLAG = "-r";
|
|
2447
|
+
var replacesTheCrontab = ({ program, args }) => program !== void 0 && basenameOf(program.text) === CRONTAB && args.some((arg, index) => arg.text === CRONTAB_REMOVE_FLAG || arg.text === STANDARD_INPUT_ARGUMENT || !FLAG.test(arg.text) && args[index - 1]?.text !== CRONTAB_USER_FLAG);
|
|
2448
|
+
var FIND_DELETE = "-delete";
|
|
2449
|
+
var FIND_RUNNERS = /* @__PURE__ */ new Set(["-exec", "-execdir", "-ok", "-okdir"]);
|
|
2450
|
+
var FIND_RUNNER_END = /* @__PURE__ */ new Set([";", "+"]);
|
|
2451
|
+
var losesDataVisibly = (toolName, invocation, normalized, depth) => {
|
|
2452
|
+
const { program, args } = invocation;
|
|
2453
|
+
if (program === void 0) return false;
|
|
2454
|
+
const name = basenameOf(program.text);
|
|
2455
|
+
if (name === "find") {
|
|
2456
|
+
return args.some((arg) => arg.text === FIND_DELETE) || args.some((arg, index) => FIND_RUNNERS.has(arg.text) && invocationHasAVisibleConsequence(toolName, {
|
|
2457
|
+
program: args[index + 1],
|
|
2458
|
+
args: args.slice(index + 2, findRunnerEnd(args, index + 2))
|
|
2459
|
+
}, depth + 1));
|
|
2460
|
+
}
|
|
2461
|
+
const destructiveArguments = destructiveArgumentsOf(name, args);
|
|
2462
|
+
return destructiveArguments !== void 0 && args.some((arg) => namesDestructiveArgument(arg.text, destructiveArguments)) || namesDestructiveWordInAnyCase(name, args.map((arg) => arg.text)) || gitDiscardsWork(invocation) || changesAService(invocation) || replacesTheCrontab(invocation) || isCoveredByPolicy(VISIBLE_DATA_LOSS_PATTERNS, toolName, normalized);
|
|
2463
|
+
};
|
|
2464
|
+
var findRunnerEnd = (args, from) => {
|
|
2465
|
+
const end = args.findIndex((arg, index) => index >= from && FIND_RUNNER_END.has(arg.text));
|
|
2466
|
+
return end === -1 ? args.length : end;
|
|
2467
|
+
};
|
|
2468
|
+
var wrapperSyntax = (optionsWithAValue = [], operandsBeforeTheCommand = 0) => ({ optionsWithAValue: new Set(optionsWithAValue), operandsBeforeTheCommand });
|
|
2469
|
+
var ENVIRONMENT_ASSIGNMENTS = wrapperSyntax();
|
|
2470
|
+
var WRAPPER_SYNTAX = /* @__PURE__ */ new Map([
|
|
2471
|
+
["env", wrapperSyntax(["-u", "--unset", "-C", "--chdir", "-S", "--split-string", "-P"])],
|
|
2472
|
+
["xargs", wrapperSyntax([
|
|
2473
|
+
"-I",
|
|
2474
|
+
"-J",
|
|
2475
|
+
"-R",
|
|
2476
|
+
"-S",
|
|
2477
|
+
"-n",
|
|
2478
|
+
"-L",
|
|
2479
|
+
"-P",
|
|
2480
|
+
"-s",
|
|
2481
|
+
"-d",
|
|
2482
|
+
"-E",
|
|
2483
|
+
"-a",
|
|
2484
|
+
"--max-args",
|
|
2485
|
+
"--max-lines",
|
|
2486
|
+
"--max-procs",
|
|
2487
|
+
"--max-chars",
|
|
2488
|
+
"--delimiter",
|
|
2489
|
+
"--arg-file",
|
|
2490
|
+
"--eof",
|
|
2491
|
+
"--replace"
|
|
2492
|
+
])],
|
|
2493
|
+
["timeout", wrapperSyntax(["-s", "--signal", "-k", "--kill-after"], 1)],
|
|
2494
|
+
["nice", wrapperSyntax(["-n", "--adjustment"])],
|
|
2495
|
+
["ionice", wrapperSyntax(["-c", "--class", "-n", "--classdata"])],
|
|
2496
|
+
["stdbuf", wrapperSyntax(["-i", "-o", "-e", "--input", "--output", "--error"])],
|
|
2497
|
+
["flock", wrapperSyntax(["-w", "--wait", "--timeout", "-E", "--conflict-exit-code"], 1)],
|
|
2498
|
+
["caffeinate", wrapperSyntax(["-t", "-w"])],
|
|
2499
|
+
["arch", wrapperSyntax(["-arch", "-d", "-e"])],
|
|
2500
|
+
["sudo", wrapperSyntax([
|
|
2501
|
+
"-u",
|
|
2502
|
+
"--user",
|
|
2503
|
+
"-g",
|
|
2504
|
+
"--group",
|
|
2505
|
+
"-C",
|
|
2506
|
+
"--close-from",
|
|
2507
|
+
"-h",
|
|
2508
|
+
"--host",
|
|
2509
|
+
"-p",
|
|
2510
|
+
"--prompt",
|
|
2511
|
+
"-U",
|
|
2512
|
+
"--other-user",
|
|
2513
|
+
"-r",
|
|
2514
|
+
"--role",
|
|
2515
|
+
"-t",
|
|
2516
|
+
"--type",
|
|
2517
|
+
"-D",
|
|
2518
|
+
"--chdir"
|
|
2519
|
+
])],
|
|
2520
|
+
["doas", wrapperSyntax(["-u", "-C"])],
|
|
2521
|
+
["time", wrapperSyntax(["-f", "--format", "-o", "--output"])],
|
|
2522
|
+
["watch", wrapperSyntax(["-n", "--interval"])],
|
|
2523
|
+
["nohup", wrapperSyntax()],
|
|
2524
|
+
["command", wrapperSyntax()],
|
|
2525
|
+
["builtin", wrapperSyntax()],
|
|
2526
|
+
["exec", wrapperSyntax(["-a"])],
|
|
2527
|
+
["unbuffer", wrapperSyntax()],
|
|
2528
|
+
["npx", wrapperSyntax(["-p", "--package", "-c", "--call"])],
|
|
2529
|
+
["bunx", wrapperSyntax(["-p", "--package"])],
|
|
2530
|
+
["pnpx", wrapperSyntax()],
|
|
2531
|
+
["uvx", wrapperSyntax(["--from", "--with", "-p", "--python"])]
|
|
2532
|
+
]);
|
|
2533
|
+
var SHELLS = /* @__PURE__ */ new Set(["sh", "bash", "zsh", "dash", "ksh"]);
|
|
2534
|
+
var SCRIPT_FLAG_CLUSTER = /^-[A-Za-z]*c$/;
|
|
2535
|
+
var EVAL = "eval";
|
|
2536
|
+
var MAX_CONSEQUENCE_DEPTH = 4;
|
|
2537
|
+
var commandStartAfterWrapper = (words, syntax) => {
|
|
2538
|
+
let index = 0;
|
|
2539
|
+
while (index < words.length) {
|
|
2540
|
+
const text = words[index]?.text ?? "";
|
|
2541
|
+
if (text === END_OF_OPTIONS) return index + 1 + syntax.operandsBeforeTheCommand;
|
|
2542
|
+
if (!SHELL_ENV_ASSIGNMENT.test(text) && (!FLAG.test(text) || text === STANDARD_INPUT_ARGUMENT)) break;
|
|
2543
|
+
index += syntax.optionsWithAValue.has(text) ? 2 : 1;
|
|
2544
|
+
}
|
|
2545
|
+
return index + syntax.operandsBeforeTheCommand;
|
|
2546
|
+
};
|
|
2547
|
+
var wrappedInvocation = ({ program, args }) => {
|
|
2548
|
+
if (program === void 0) return null;
|
|
2549
|
+
const assigns = SHELL_ENV_ASSIGNMENT.test(program.text);
|
|
2550
|
+
const syntax = assigns ? ENVIRONMENT_ASSIGNMENTS : WRAPPER_SYNTAX.get(basenameOf(program.text));
|
|
2551
|
+
if (syntax === void 0) return null;
|
|
2552
|
+
const words = assigns ? [program, ...args] : args;
|
|
2553
|
+
const start = commandStartAfterWrapper(words, syntax);
|
|
2554
|
+
const command = words[start];
|
|
2555
|
+
return command === void 0 ? null : { program: command, args: words.slice(start + 1) };
|
|
2556
|
+
};
|
|
2557
|
+
var innermostInvocation = (invocation, depth = 0) => {
|
|
2558
|
+
const wrapped = depth < MAX_CONSEQUENCE_DEPTH ? wrappedInvocation(invocation) : null;
|
|
2559
|
+
return wrapped === null ? invocation : innermostInvocation(wrapped, depth + 1);
|
|
2560
|
+
};
|
|
2561
|
+
var shellScriptOf = ({ program, args }) => {
|
|
2562
|
+
if (program === void 0) return null;
|
|
2563
|
+
if (basenameOf(program.text) === EVAL) return args.some((arg) => arg.expands) ? null : args.map((arg) => arg.text).join(" ");
|
|
2564
|
+
if (!SHELLS.has(basenameOf(program.text))) return null;
|
|
2565
|
+
const flag = args.findIndex((arg) => SCRIPT_FLAG_CLUSTER.test(arg.text));
|
|
2566
|
+
const script = flag === -1 ? void 0 : args[flag + 1];
|
|
2567
|
+
return script === void 0 || script.expands ? null : script.text;
|
|
2568
|
+
};
|
|
2569
|
+
var FLAG = /^-/;
|
|
2570
|
+
var FLAG_WITH_ATTACHED_VALUE = /^-[^=]*=/;
|
|
2571
|
+
var withoutLeadingFlags = (args, flagsTakeAValue) => {
|
|
2572
|
+
let index = 0;
|
|
2573
|
+
while (index < args.length && FLAG.test(args[index]?.text ?? "")) {
|
|
2574
|
+
const takesNext = flagsTakeAValue && !FLAG_WITH_ATTACHED_VALUE.test(args[index]?.text ?? "") && !FLAG.test(args[index + 1]?.text ?? "-");
|
|
2575
|
+
index += takesNext ? 2 : 1;
|
|
2576
|
+
}
|
|
2577
|
+
return args.slice(index);
|
|
2578
|
+
};
|
|
2579
|
+
var readingsPastGlobalFlags = ({ program, args }) => {
|
|
2580
|
+
const meaningful = argsAfterHarmlessGlobalFlags(args);
|
|
2581
|
+
if (program === void 0 || !SUBCOMMAND_CLIS.has(basenameOf(program.text)) || !FLAG.test(meaningful[0]?.text ?? "")) return [];
|
|
2582
|
+
return [false, true].map((flagsTakeAValue) => ({ program, args: withoutLeadingFlags(meaningful, flagsTakeAValue) }));
|
|
2583
|
+
};
|
|
2584
|
+
var PREVIEW_FLAG = /^--(?:help|dry-?run(?:=(?:client|server|true))?)$/;
|
|
2585
|
+
var TASK_RUNNERS = /* @__PURE__ */ new Set(["make", "just", "rake", "task"]);
|
|
2586
|
+
var PUBLISH_SUBCOMMAND = "publish";
|
|
2587
|
+
var honoursPreviewFlags = ({ program, args }) => {
|
|
2588
|
+
const name = basenameOf(program?.text ?? "");
|
|
2589
|
+
if (TASK_RUNNERS.has(name)) return false;
|
|
2590
|
+
return !PACKAGE_MANAGERS.has(name) || subcommandWordsOf(argsAfterHarmlessGlobalFlags(args))[0]?.text === PUBLISH_SUBCOMMAND;
|
|
2591
|
+
};
|
|
2592
|
+
var onlyPreviews = (invocation) => invocation.program !== void 0 && honoursPreviewFlags(invocation) && invocation.args.some((arg) => !arg.expands && PREVIEW_FLAG.test(arg.text));
|
|
2593
|
+
var changesWhatIsDeployed = (toolName, invocation, normalized) => !onlyPreviews(invocation) && (changesProduction(invocation) || mergesAPullRequest(invocation) || isCoveredByPolicy(DEPLOY_AND_SCHEMA_COMMAND_PATTERNS, toolName, normalized));
|
|
2594
|
+
var invocationHasAVisibleConsequence = (toolName, invocation, depth) => {
|
|
2595
|
+
if (invocation.program === void 0 || depth > MAX_CONSEQUENCE_DEPTH) return false;
|
|
2596
|
+
const normalized = quotedInvocation(invocation);
|
|
2597
|
+
const wrapped = wrappedInvocation(invocation);
|
|
2598
|
+
const script = shellScriptOf(invocation);
|
|
2599
|
+
return classifyDecisionRisk(toolName, normalized) === "destructive" || changesWhatIsDeployed(toolName, invocation, normalized) || writesASecretFile(invocation) || losesDataVisibly(toolName, invocation, normalized, depth) || subcommandDestroysVisibly(invocation) || sqlClientChangesData(invocation) || wrapped !== null && invocationHasAVisibleConsequence(toolName, wrapped, depth + 1) || script !== null && commandHasAVisibleConsequenceAt(toolName, script, depth + 1) || readingsPastGlobalFlags(invocation).some((reading) => invocationHasAVisibleConsequence(toolName, reading, depth + 1));
|
|
2600
|
+
};
|
|
2601
|
+
var RUNS_FETCHED_CODE = /(?:\$\(|`|<\()\s*(?:curl|wget)\b/;
|
|
2602
|
+
var FETCHING_PROGRAMS = /* @__PURE__ */ new Set(["curl", "wget"]);
|
|
2603
|
+
var READS_ITS_SCRIPT_FROM_STANDARD_INPUT = /^-[A-Za-z]*s[A-Za-z]*$/;
|
|
2604
|
+
var interpreterNameOf = (program) => basenameOf(program.text).replace(/\d+(?:\.\d+)*$/, "");
|
|
2605
|
+
var runsScripts = (program) => SHELLS.has(basenameOf(program.text)) || INLINE_CODE_INTERPRETERS.has(interpreterNameOf(program));
|
|
2606
|
+
var runsWhatItReads = ({ program, args }) => program !== void 0 && runsScripts(program) && (args.length === 0 || args.every((arg) => arg.text.startsWith("-")) || args.some((arg) => arg.text === STANDARD_INPUT_ARGUMENT) || SHELLS.has(basenameOf(program.text)) && args.some((arg) => READS_ITS_SCRIPT_FROM_STANDARD_INPUT.test(arg.text)));
|
|
2607
|
+
var fetches = (invocation) => FETCHING_PROGRAMS.has(basenameOf(innermostInvocation(invocation).program?.text ?? ""));
|
|
2608
|
+
var URL_QUERY_OR_FRAGMENT = /[?#].*$/;
|
|
2609
|
+
var SOURCES_A_SCRIPT = /* @__PURE__ */ new Set(["source", "."]);
|
|
2610
|
+
var downloadedNamesOf = (invocations) => new Set(invocations.filter(fetches).flatMap((invocation) => innermostInvocation(invocation).args.filter((arg) => !FLAG.test(arg.text)).map((arg) => basenameOf(arg.text.replace(URL_QUERY_OR_FRAGMENT, "")))));
|
|
2611
|
+
var runsADownloadedScript = (invocations) => {
|
|
2612
|
+
const downloaded = downloadedNamesOf(invocations);
|
|
2613
|
+
return downloaded.size > 0 && invocations.map((invocation) => innermostInvocation(invocation)).some(({ program, args }) => {
|
|
2614
|
+
if (program === void 0) return false;
|
|
2615
|
+
const script = args.find((arg) => !FLAG.test(arg.text))?.text;
|
|
2616
|
+
return downloaded.has(basenameOf(program.text)) || (runsScripts(program) || SOURCES_A_SCRIPT.has(program.text)) && script !== void 0 && downloaded.has(basenameOf(script));
|
|
2617
|
+
});
|
|
2618
|
+
};
|
|
2619
|
+
var pipedSegmentsOf = (command) => (shellSegmentsReadingAPipe(commandForReading(command)) ?? []).map((segment) => innermostInvocation(invocationOf(withoutShellGrouping(segment))));
|
|
2620
|
+
var pipesIntoASqlClient = (command) => pipedSegmentsOf(command).some((invocation) => sqlClientSyntaxOf(invocation) !== void 0);
|
|
2621
|
+
var pipesFetchedCodeIntoAnInterpreter = (command, invocations) => invocations.some(fetches) && pipedSegmentsOf(command).some(runsWhatItReads);
|
|
2622
|
+
var SHELL_GROUPING_PREFIX = /^\s*(?:(?:if|then|elif|else|do|while|until|!)\s+|[({]\s*)+/;
|
|
2623
|
+
var GROUP_OPENER_BY_CLOSER = /* @__PURE__ */ new Map([[")", "("], ["}", "{"]]);
|
|
2624
|
+
var occurrencesOf = (text, character) => text.split(character).length - 1;
|
|
2625
|
+
var closesAGroupItDidNotOpen = (text) => {
|
|
2626
|
+
const last = text.at(-1) ?? "";
|
|
2627
|
+
const opener = GROUP_OPENER_BY_CLOSER.get(last);
|
|
2628
|
+
return opener !== void 0 && occurrencesOf(text, last) > occurrencesOf(text, opener);
|
|
2629
|
+
};
|
|
2630
|
+
var withoutShellGrouping = (segment) => {
|
|
2631
|
+
let text = segment.replace(SHELL_GROUPING_PREFIX, "").trimEnd();
|
|
2632
|
+
while (closesAGroupItDidNotOpen(text)) text = text.slice(0, -1).trimEnd();
|
|
2633
|
+
return text;
|
|
2634
|
+
};
|
|
2635
|
+
var HEREDOC_OPERATOR = /(?<!<)\d*<<(?!<)-?[ \t]*(?:'([A-Za-z_]\w*)'|"([A-Za-z_]\w*)"|\\?([A-Za-z_]\w*))/g;
|
|
2636
|
+
var HEREDOC_MARK = "\uE001";
|
|
2637
|
+
var withHeredocBodiesSetAside = (command) => {
|
|
2638
|
+
const lines = command.split("\n");
|
|
2639
|
+
const kept = [];
|
|
2640
|
+
const bodies = [];
|
|
2641
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
2642
|
+
const line = lines[index] ?? "";
|
|
2643
|
+
const delimiters = [...line.matchAll(HEREDOC_OPERATOR)].map((match) => match[1] ?? match[2] ?? match[3] ?? "");
|
|
2644
|
+
kept.push(line.replace(HEREDOC_OPERATOR, ` ${HEREDOC_MARK} `));
|
|
2645
|
+
for (const delimiter of delimiters) {
|
|
2646
|
+
const body = [];
|
|
2647
|
+
for (index += 1; index < lines.length && !mightEndAHeredoc(lines[index] ?? "", delimiter); index += 1) {
|
|
2648
|
+
body.push(lines[index] ?? "");
|
|
2649
|
+
}
|
|
2650
|
+
bodies.push(body.join("\n"));
|
|
2651
|
+
const ending = lines[index];
|
|
2652
|
+
if (ending !== void 0 && !isHeredocTerminator(ending, delimiter)) kept.push(ending);
|
|
2653
|
+
}
|
|
2654
|
+
}
|
|
2655
|
+
return { text: kept.join("\n"), bodies };
|
|
2656
|
+
};
|
|
2657
|
+
var REDIRECTION_TARGET = String.raw`(?:'[^']*'|"[^"]*"|[^\s;|&()<>]+)`;
|
|
2658
|
+
var INPUT_REDIRECTION = new RegExp(String.raw`\d*(?:<<<|<(?![<(&>]))\s*${REDIRECTION_TARGET}`, "g");
|
|
2659
|
+
var OUTPUT_REDIRECTION = new RegExp(String.raw`(?:\d*|&)(?:>>?|>\||<>|>&|<&)\s*${REDIRECTION_TARGET}`, "g");
|
|
2660
|
+
var REDIRECTED_INPUT_MARK = "\uE000";
|
|
2661
|
+
var ROUGH_SEPARATORS = ["&&", "||", "$(", "\n", ";", "|", "&", "`", "(", ")", "{", "}"];
|
|
2662
|
+
var SEPARATORS_INSIDE_DOUBLE_QUOTES = /* @__PURE__ */ new Set(["$(", "`", ")"]);
|
|
2663
|
+
var PIPE2 = "|";
|
|
2664
|
+
var SUBSTITUTION_OPENERS = /* @__PURE__ */ new Set(["$(", "`"]);
|
|
2665
|
+
var QUOTE_CHARACTERS = /['"]/g;
|
|
2666
|
+
var roughPiecesOf = (text) => {
|
|
2667
|
+
const pieces = [];
|
|
2668
|
+
let current = "";
|
|
2669
|
+
let before = "";
|
|
2670
|
+
let quote = null;
|
|
2671
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
2672
|
+
const char = text.charAt(index);
|
|
2673
|
+
if (quote === "'") {
|
|
2674
|
+
current += char;
|
|
2675
|
+
if (char === "'") quote = null;
|
|
2676
|
+
continue;
|
|
2677
|
+
}
|
|
2678
|
+
if (char === "\\") {
|
|
2679
|
+
current += text.slice(index, index + 2);
|
|
2680
|
+
index += 1;
|
|
2681
|
+
continue;
|
|
2682
|
+
}
|
|
2683
|
+
const separator = ROUGH_SEPARATORS.find((candidate) => text.startsWith(candidate, index) && (quote === null || SEPARATORS_INSIDE_DOUBLE_QUOTES.has(candidate)));
|
|
2684
|
+
if (separator !== void 0) {
|
|
2685
|
+
pieces.push({ text: current, before });
|
|
2686
|
+
current = "";
|
|
2687
|
+
before = separator;
|
|
2688
|
+
index += separator.length - 1;
|
|
2689
|
+
continue;
|
|
2690
|
+
}
|
|
2691
|
+
if (char === '"' || char === "'") quote = quote === char ? null : quote ?? char;
|
|
2692
|
+
current += char;
|
|
2693
|
+
}
|
|
2694
|
+
return [...pieces, { text: current, before }];
|
|
2695
|
+
};
|
|
2696
|
+
var invocationOfRoughPiece = (text) => {
|
|
2697
|
+
const piece = withoutShellGrouping(text.replaceAll(REDIRECTED_INPUT_MARK, "").replaceAll(HEREDOC_MARK, ""));
|
|
2698
|
+
const parsed = invocationOf(piece);
|
|
2699
|
+
return parsed.program !== void 0 ? parsed : invocationOf(piece.replace(QUOTE_CHARACTERS, ""));
|
|
2700
|
+
};
|
|
2701
|
+
var roughSegmentsOf = (command) => {
|
|
2702
|
+
const { text, bodies } = withHeredocBodiesSetAside(commandForReading(command));
|
|
2703
|
+
const pieces = roughPiecesOf(text.replace(INPUT_REDIRECTION, ` ${REDIRECTED_INPUT_MARK} `).replace(OUTPUT_REDIRECTION, " "));
|
|
2704
|
+
let heredocsSeen = 0;
|
|
2705
|
+
return pieces.map((piece, index) => {
|
|
2706
|
+
const heredocCount = occurrencesOf(piece.text, HEREDOC_MARK);
|
|
2707
|
+
const heredocs = bodies.slice(heredocsSeen, heredocsSeen + heredocCount);
|
|
2708
|
+
heredocsSeen += heredocCount;
|
|
2709
|
+
return {
|
|
2710
|
+
invocation: invocationOfRoughPiece(piece.text),
|
|
2711
|
+
readsInput: piece.text.includes(REDIRECTED_INPUT_MARK) || heredocCount > 0 || piece.before === PIPE2,
|
|
2712
|
+
readsAPipe: piece.before === PIPE2,
|
|
2713
|
+
feedsASubstitution: SUBSTITUTION_OPENERS.has(pieces[index + 1]?.before ?? ""),
|
|
2714
|
+
heredocs
|
|
2715
|
+
};
|
|
2716
|
+
});
|
|
2717
|
+
};
|
|
2718
|
+
var roughSegmentHasAVisibleConsequence = (toolName, segment, fetchesCode, depth) => {
|
|
2719
|
+
const innermost = innermostInvocation(segment.invocation);
|
|
2720
|
+
const runsAHeredocScript = innermost.program !== void 0 && SHELLS.has(basenameOf(innermost.program.text));
|
|
2721
|
+
return invocationHasAVisibleConsequence(toolName, segment.invocation, depth) || sqlClientSyntaxOf(innermost) !== void 0 && (segment.readsInput || segment.feedsASubstitution) || segment.readsAPipe && fetchesCode && runsWhatItReads(innermost) || runsAHeredocScript && segment.heredocs.some((body) => commandHasAVisibleConsequenceAt(toolName, body, depth + 1));
|
|
2722
|
+
};
|
|
2723
|
+
var roughReadingHasAVisibleConsequence = (toolName, command, depth) => {
|
|
2724
|
+
const segments = roughSegmentsOf(command);
|
|
2725
|
+
const invocations = segments.map((segment) => segment.invocation);
|
|
2726
|
+
const fetchesCode = invocations.some(fetches);
|
|
2727
|
+
return segments.some((segment) => roughSegmentHasAVisibleConsequence(toolName, segment, fetchesCode, depth)) || runsADownloadedScript(invocations);
|
|
2728
|
+
};
|
|
2729
|
+
var commandHasAVisibleConsequenceAt = (toolName, command, depth) => {
|
|
2730
|
+
if (toolName === "Bash" && isSafeReadOnlyCommand(command)) return false;
|
|
2731
|
+
const readable = withHeredocSubstitutionsAsQuotedText(command);
|
|
2732
|
+
if (classifyDecisionRisk(toolName, readable) === "destructive" || RUNS_FETCHED_CODE.test(readable) || REDIRECTS_INTO_A_SECRET_FILE.test(readable)) return true;
|
|
2733
|
+
const segments = readableCommandSegments(command);
|
|
2734
|
+
if (segments === null) return roughReadingHasAVisibleConsequence(toolName, command, depth);
|
|
2735
|
+
const invocations = segments.map((segment) => invocationOf(withoutShellGrouping(segment)));
|
|
2736
|
+
return invocations.some((invocation) => invocationHasAVisibleConsequence(toolName, invocation, depth)) || pipesIntoASqlClient(command) || pipesFetchedCodeIntoAnInterpreter(command, invocations) || runsADownloadedScript(invocations);
|
|
2737
|
+
};
|
|
2738
|
+
var commandHasAVisibleConsequence = (toolName, command) => commandHasAVisibleConsequenceAt(toolName, command, 0);
|
|
1837
2739
|
var withoutSessionToolGrants = (config) => ({
|
|
1838
2740
|
...config,
|
|
1839
2741
|
policies: config.policies.filter((policy) => !isSessionToolGrant(policy))
|
|
1840
2742
|
});
|
|
1841
2743
|
var SESSION_TOOL_GRANT_TOOLS = /* @__PURE__ */ new Set(["Bash"]);
|
|
2744
|
+
var isStandingShellAllow = (policy) => !policy.origin && !isSessionToolGrant(policy) && SESSION_TOOL_GRANT_TOOLS.has(policy.tool) && isAutoApprove(policy);
|
|
1842
2745
|
var MCP_TOOL_PREFIX = "mcp__";
|
|
1843
2746
|
var parseMcpToolName = (toolName) => {
|
|
1844
2747
|
if (!toolName.startsWith(MCP_TOOL_PREFIX)) return void 0;
|
|
@@ -2460,6 +3363,7 @@ var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, se
|
|
|
2460
3363
|
};
|
|
2461
3364
|
const governedBySpecificRule = isSpecificArgumentRank(match?.rank);
|
|
2462
3365
|
const governedBySessionToolGrant = match?.rank === "tool" && isSessionToolGrant(match.policy);
|
|
3366
|
+
const governedByStandingShellAllow = match?.rank === "tool" && isStandingShellAllow(match.policy);
|
|
2463
3367
|
const governingMode = base.mode;
|
|
2464
3368
|
const approvedByReadOnlyFloor = !isAutoDeny(base) && (shellReadOnlyFloorApplies(toolName, arg, match?.rank) || coordinationFloorApplies(toolName, match?.rank));
|
|
2465
3369
|
if (governedBySessionToolGrant && !approvedByReadOnlyFloor && typeof arg === "string" && commandNeedsAPerson(toolName, arg)) {
|
|
@@ -2469,7 +3373,7 @@ var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, se
|
|
|
2469
3373
|
base = autoApprove(base.tool);
|
|
2470
3374
|
}
|
|
2471
3375
|
const wouldAutoApprove = isAutoApprove(base);
|
|
2472
|
-
if (!governedBySpecificRule && wouldAutoApprove && toolName === "Bash" && typeof arg === "string" && classifyDecisionRisk(toolName, arg) === "destructive") {
|
|
3376
|
+
if (!governedBySpecificRule && wouldAutoApprove && toolName === "Bash" && typeof arg === "string" && (classifyDecisionRisk(toolName, arg) === "destructive" || governedByStandingShellAllow && commandHasAVisibleConsequence(toolName, arg))) {
|
|
2473
3377
|
base = {
|
|
2474
3378
|
tool: base.tool,
|
|
2475
3379
|
timeoutSeconds: config.defaultTimeoutSeconds,
|
|
@@ -2646,9 +3550,16 @@ var scopeBreachReasonOf = (verdict) => verdict.kind === "gate" && isScopeReason(
|
|
|
2646
3550
|
var onlyCodexPreToolUseCanAsk = (verdict, permissionMode) => verdict.kind === "gate" && (scopeBreachReasonOf(verdict) !== void 0 || !codexRaisesItsOwnPrompts(permissionMode));
|
|
2647
3551
|
var runsACommandThatNeedsAPerson = ({ toolName, toolInputs }) => toolName === "Bash" && toolInputs.some((toolInput) => {
|
|
2648
3552
|
const command = extractPolicyArg(toolName, toolInput);
|
|
2649
|
-
return command !== void 0 && commandNeedsAPerson(toolName, command);
|
|
3553
|
+
return command !== void 0 && (commandNeedsAPerson(toolName, command) || commandWritesThroughARemoteApi(command));
|
|
3554
|
+
});
|
|
3555
|
+
var CI_WORKFLOW_FILE = /(?:^|\/)\.github\/workflows\/[^/]+$/;
|
|
3556
|
+
var FILE_WRITING_TOOLS = /* @__PURE__ */ new Set(["Edit", "Write", "MultiEdit", "NotebookEdit"]);
|
|
3557
|
+
var namesASecretOrWorkflowFile = (path) => SECRET_FILE_NAME.test(basenameOf(path)) || CI_WORKFLOW_FILE.test(normalizeSeparators(path));
|
|
3558
|
+
var writesASecretOrWorkflowFile = ({ toolName, toolInputs }) => FILE_WRITING_TOOLS.has(toolName) && toolInputs.some((toolInput) => {
|
|
3559
|
+
const path = extractPolicyArg(toolName, toolInput);
|
|
3560
|
+
return path !== void 0 && namesASecretOrWorkflowFile(path);
|
|
2650
3561
|
});
|
|
2651
|
-
var codexCallNeedsAPerson = (input, verdict, call) => onlyCodexPreToolUseCanAsk(verdict, call.permissionMode) || verdict.kind === "gate" && (aChosenRuleGoverns(input) || call.deletesFiles || runsACommandThatNeedsAPerson(input));
|
|
3562
|
+
var codexCallNeedsAPerson = (input, verdict, call) => onlyCodexPreToolUseCanAsk(verdict, call.permissionMode) || verdict.kind === "gate" && (aChosenRuleGoverns(input) || call.deletesFiles || runsACommandThatNeedsAPerson(input) || writesASecretOrWorkflowFile(input));
|
|
2652
3563
|
var MAX_AGENT_PERMISSION_RULES_PER_KIND = 256;
|
|
2653
3564
|
var MAX_AGENT_PERMISSION_RULE_LENGTH = 512;
|
|
2654
3565
|
var isAgentPermissionRule = (value) => typeof value === "string" && value.length > 0 && value.length <= MAX_AGENT_PERMISSION_RULE_LENGTH;
|
|
@@ -2888,6 +3799,9 @@ var WITHDRAWN_APPROVAL_REASON = "The phone question was withdrawn. Approve in th
|
|
|
2888
3799
|
var PLAN_DECLINED_REASON = "Plan declined from the phone. Ask what to change before coding.";
|
|
2889
3800
|
var claudeStoppedPreToolUseOutput = (reason) => stoppedOutput(claudePreToolUseOutput("deny", reason), reason);
|
|
2890
3801
|
var claudeStoppedPermissionRequestOutput = (reason) => stoppedOutput(claudePermissionRequestOutput("deny", reason), reason);
|
|
3802
|
+
var UNHEARD_PUSH_WINDOW_DAYS = 14;
|
|
3803
|
+
var DAY_MS = 24 * 60 * 60 * 1e3;
|
|
3804
|
+
var UNHEARD_PUSH_WINDOW_MS = UNHEARD_PUSH_WINDOW_DAYS * DAY_MS;
|
|
2891
3805
|
var ELICITATION_ANSWERABLE_MODE = "form";
|
|
2892
3806
|
var ELICITATION_MIN_OPTIONS = 2;
|
|
2893
3807
|
var ELICITATION_MAX_MULTI_QUESTIONS = 4;
|