@pushary/agent-hooks 1.9.29 → 1.9.31
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 +22 -0
- package/data/SKILL.md +46 -12
- package/data/cursor-plugin/skills/pushary/SKILL.md +46 -12
- package/data/vscode-plugin/skills/pushary/SKILL.md +46 -12
- package/dist/bin/pushary-bell-hook.js +26 -26
- package/dist/bin/pushary-bell.js +9 -9
- package/dist/bin/pushary-claude.js +30 -27
- package/dist/bin/pushary-clean.js +29 -29
- package/dist/bin/pushary-codex-bridge.js +17 -17
- package/dist/bin/pushary-codex-hook.js +41 -40
- 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 +33 -33
- package/dist/bin/pushary-disconnect.js +24 -24
- package/dist/bin/pushary-doctor.js +33 -33
- package/dist/bin/pushary-elicitation-hook.js +26 -26
- package/dist/bin/pushary-gemini-bridge.js +13 -13
- package/dist/bin/pushary-gemini-hook.js +28 -28
- package/dist/bin/pushary-hook.js +30 -30
- 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 +25 -25
- package/dist/bin/pushary-opencode-hook.js +27 -27
- package/dist/bin/pushary-permission-denied-hook.js +30 -30
- package/dist/bin/pushary-permission-hook.js +29 -29
- package/dist/bin/pushary-post-hook.js +25 -25
- package/dist/bin/pushary-prompt-hook.js +25 -25
- package/dist/bin/pushary-session-end-hook.js +25 -25
- package/dist/bin/pushary-session-start-hook.js +29 -29
- 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 +25 -25
- package/dist/bin/pushary-stopfailure-hook.js +25 -25
- package/dist/bin/pushary-suggestions.js +12 -12
- package/dist/bin/pushary-transcript-register.js +18 -18
- package/dist/bin/pushary-transcripts.js +8 -8
- 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-QOMUEL44.js → chunk-2ROXUEZV.js} +1 -1
- package/dist/{chunk-WJUYWTNT.js → chunk-35RJKPIC.js} +1 -1
- package/dist/{chunk-SLKVEJLM.js → chunk-3EIJDBVB.js} +5 -5
- package/dist/{chunk-Y3OZ3CT6.js → chunk-464FX6W5.js} +6 -5
- package/dist/{chunk-KMTSU366.js → chunk-4JOWKPUF.js} +1 -1
- package/dist/{chunk-35CMXPES.js → chunk-4WGKAGIU.js} +3 -3
- package/dist/{chunk-TXKAPRIA.js → chunk-5EX2SD5N.js} +1 -1
- package/dist/{chunk-WLDFMVRY.js → chunk-5F32ZTWD.js} +2 -2
- package/dist/{chunk-NRV5PIPA.js → chunk-5FNE6ZVV.js} +2 -2
- package/dist/{chunk-L7PGUSAU.js → chunk-5GDNIEL5.js} +1 -1
- package/dist/{chunk-OUWDJIJF.js → chunk-7447DYNW.js} +1 -1
- package/dist/{chunk-5L7H32JK.js → chunk-75UCMLT5.js} +1 -1
- package/dist/{chunk-7MYGOFVX.js → chunk-77J4RVB2.js} +4 -4
- package/dist/{chunk-CCI2UBYR.js → chunk-7S4Z36H7.js} +3 -3
- package/dist/{chunk-LSB66XQC.js → chunk-ALSIMOFS.js} +4 -4
- package/dist/{chunk-M2L4EHYW.js → chunk-AXANUGOV.js} +2 -2
- package/dist/{chunk-Z2WS466S.js → chunk-BMUTA66M.js} +15 -13
- package/dist/{chunk-XH7NMH3Q.js → chunk-CJCVPCOB.js} +2 -2
- package/dist/{chunk-PRVG3COH.js → chunk-D3TVRNZC.js} +2 -2
- package/dist/{chunk-CPZZTS4I.js → chunk-DP2FAIW6.js} +1 -1
- package/dist/{chunk-VTR4VRL2.js → chunk-DWQYCOPI.js} +2 -4
- package/dist/{chunk-LRLF6PZ2.js → chunk-EPVY3JU3.js} +1 -1
- package/dist/{chunk-GVIPEBEL.js → chunk-FEICGRNI.js} +3 -3
- package/dist/{chunk-C2ZIVQ6W.js → chunk-FGFFUCEL.js} +6 -6
- package/dist/{chunk-TJXCBTL4.js → chunk-FXJ5SEQT.js} +5 -5
- package/dist/{chunk-G4X3Z3YS.js → chunk-GROYT52D.js} +4 -4
- package/dist/{chunk-2FOAQ64R.js → chunk-GSBOLJZ4.js} +177 -56
- package/dist/{chunk-UW37WHVP.js → chunk-H2PQXK26.js} +2 -2
- package/dist/{chunk-BUOLA2AM.js → chunk-IDGESFKZ.js} +1 -1
- package/dist/{chunk-BAVNBGH4.js → chunk-IIP4LEO3.js} +7 -7
- package/dist/{chunk-GMVZYB3W.js → chunk-IKJJB4QG.js} +3 -3
- package/dist/{chunk-S3DP6DCZ.js → chunk-KBRKQMCI.js} +2 -2
- package/dist/{chunk-AZMHKUUU.js → chunk-MG523AVN.js} +1 -1
- package/dist/{chunk-AVQ6ETA7.js → chunk-MRR4NQ3H.js} +1 -1
- package/dist/{chunk-ETLVZHRG.js → chunk-N4LLBUU2.js} +2 -2
- package/dist/{chunk-YFEHKEGQ.js → chunk-NTWTU6FA.js} +1 -1
- package/dist/{chunk-UM2HNUJA.js → chunk-OS6AE2MR.js} +3 -3
- package/dist/{chunk-DQGM57ZW.js → chunk-OSUAY4SA.js} +1 -1
- package/dist/{chunk-IWPEAA2J.js → chunk-OTDRNEED.js} +1 -1
- package/dist/{chunk-BP3WMLXJ.js → chunk-OULHOX5C.js} +5 -5
- package/dist/{chunk-4DTKE3AS.js → chunk-Q2GSTQ3R.js} +2 -2
- package/dist/{chunk-DUVHHQEL.js → chunk-Q7H2IMJQ.js} +2 -2
- package/dist/{chunk-PX4RRHEB.js → chunk-QCOE42GO.js} +4 -4
- package/dist/{chunk-BKOWTW5P.js → chunk-QGCEQGH6.js} +4 -4
- package/dist/{chunk-JGDBHB6L.js → chunk-RN3KZDWP.js} +2 -2
- package/dist/{chunk-BJMVQ6D5.js → chunk-SAHD5DYW.js} +4 -4
- package/dist/{chunk-62LJB5U3.js → chunk-SJJA2GPD.js} +2 -2
- package/dist/{chunk-IM73P6JT.js → chunk-SQIZGUAN.js} +5 -5
- package/dist/{chunk-CBOHZ6NY.js → chunk-SRRJLA24.js} +4 -4
- package/dist/{chunk-TILXDMUR.js → chunk-SYUHM6V3.js} +3 -3
- package/dist/{chunk-H7QTZTIE.js → chunk-TDLEFGAM.js} +1641 -178
- package/dist/{chunk-CJQEJWLU.js → chunk-VFNYTVTJ.js} +5 -5
- package/dist/{chunk-OSVDGVLL.js → chunk-X427XA76.js} +12 -12
- package/dist/{chunk-2XM4TGIM.js → chunk-X5HK4XUN.js} +4 -4
- package/dist/{chunk-EO2GYHWH.js → chunk-ZYDSHR5P.js} +3 -3
- package/dist/{global-upgrade-ZPULZXOY.js → global-upgrade-YMBTZHDP.js} +6 -6
- package/dist/{paths-Y7ZWWCFK.js → paths-BPFRUWMB.js} +2 -2
- package/dist/{reapply-I4YMQP7F.js → reapply-ZC2LSUVZ.js} +20 -20
- package/dist/src/index.js +19 -19
- package/dist/{upgrade-lock-IDAAFSH2.js → upgrade-lock-TTZMLZPB.js} +3 -3
- package/package.json +1 -1
|
@@ -296,12 +296,27 @@ var normalizeAgentId = (value, accepted) => {
|
|
|
296
296
|
return accepted.find((candidate) => names.includes(candidate)) ?? null;
|
|
297
297
|
};
|
|
298
298
|
|
|
299
|
+
// ../contracts/src/shell-tools.ts
|
|
300
|
+
var SHELL_TOOL = "Bash";
|
|
301
|
+
var POWERSHELL_TOOL = "PowerShell";
|
|
302
|
+
var MONITOR_TOOL = "Monitor";
|
|
303
|
+
var SHELL_DIALECT_BY_TOOL = /* @__PURE__ */ new Map([
|
|
304
|
+
[SHELL_TOOL, "posix"],
|
|
305
|
+
[MONITOR_TOOL, "posix"],
|
|
306
|
+
[POWERSHELL_TOOL, "powershell"]
|
|
307
|
+
]);
|
|
308
|
+
var shellDialectOf = (toolName) => SHELL_DIALECT_BY_TOOL.get(toolName);
|
|
309
|
+
var POSIX_SHELL_TOOLS = new Set(
|
|
310
|
+
[...SHELL_DIALECT_BY_TOOL].filter(([, dialect]) => dialect === "posix").map(([toolName]) => toolName)
|
|
311
|
+
);
|
|
312
|
+
var toolNameForAPosixReading = (toolName) => shellDialectOf(toolName) === "posix" ? SHELL_TOOL : toolName;
|
|
313
|
+
|
|
299
314
|
// ../contracts/src/agent-wiring.ts
|
|
300
315
|
var COMPATIBLE_AGENT_TYPES = ["qwen_code", "codebuddy", "qoder", "droid", "devin", "antigravity_cli"];
|
|
301
316
|
var isCompatibleAgentType = (value) => typeof value === "string" && COMPATIBLE_AGENT_TYPES.includes(value);
|
|
302
317
|
var CANONICAL_PATH_KEYS = ["file_path", "path", "notebook_path"];
|
|
303
318
|
var CANONICAL_COMMAND_KEYS = ["command"];
|
|
304
|
-
var SHELL_TOOLS = /* @__PURE__ */ new Set([
|
|
319
|
+
var SHELL_TOOLS = /* @__PURE__ */ new Set([SHELL_TOOL, POWERSHELL_TOOL]);
|
|
305
320
|
var PATH_TOOLS = /* @__PURE__ */ new Set(["Write", "Edit", "MultiEdit", "NotebookEdit", "Read"]);
|
|
306
321
|
var PHONE_ANSWERED_TOOLS = /* @__PURE__ */ new Set(["AskUserQuestion", "ExitPlanMode"]);
|
|
307
322
|
var firstString = (record, keys) => {
|
|
@@ -319,15 +334,15 @@ var canonicalToolName = (profile, toolName) => profile.toolAliases[toolName] ??
|
|
|
319
334
|
var TASK_OUTPUT_TOOL = "BashOutput";
|
|
320
335
|
var TASK_STOP_TOOL = "KillShell";
|
|
321
336
|
var BLANK_TASK_INPUT_TOOL = "TaskInput";
|
|
322
|
-
var SHELL_TOOL = "Bash";
|
|
323
337
|
var typesText = (value) => typeof value === "string" && value.trim().length > 0;
|
|
324
338
|
var taskIdOf = (control, toolInput) => typeof toolInput[control.taskKey] === "string" ? { task_id: toolInput[control.taskKey] } : {};
|
|
325
339
|
var typedIntoTask = (control, toolInput) => {
|
|
326
340
|
const text = toolInput[control.inputKey];
|
|
327
341
|
if (typesText(text)) return { tool: SHELL_TOOL, input: { command: text }, unreadable: false };
|
|
342
|
+
if (text !== void 0 && typeof text !== "string") return { tool: control.name, input: toolInput, unreadable: true };
|
|
328
343
|
return {
|
|
329
344
|
tool: BLANK_TASK_INPUT_TOOL,
|
|
330
|
-
input: { ...taskIdOf(control, toolInput), input:
|
|
345
|
+
input: { ...taskIdOf(control, toolInput), input: text ?? "" },
|
|
331
346
|
unreadable: false
|
|
332
347
|
};
|
|
333
348
|
};
|
|
@@ -925,6 +940,1238 @@ var shellWordsOf = (command) => {
|
|
|
925
940
|
return words;
|
|
926
941
|
};
|
|
927
942
|
|
|
943
|
+
// ../contracts/src/powershell-analysis.ts
|
|
944
|
+
var SINGLE_QUOTES = /* @__PURE__ */ new Set(["'", "\u2018", "\u2019", "\u201A", "\u201B"]);
|
|
945
|
+
var DOUBLE_QUOTES = /* @__PURE__ */ new Set(['"', "\u201C", "\u201D", "\u201E"]);
|
|
946
|
+
var ESCAPE = "`";
|
|
947
|
+
var NEWLINE = "\n";
|
|
948
|
+
var CARRIAGE_RETURN = "\r";
|
|
949
|
+
var WORD_SPACE = /[ \t\r\f\v ]/;
|
|
950
|
+
var GROUP_CLOSERS = /* @__PURE__ */ new Map([["(", ")"], ["{", "}"]]);
|
|
951
|
+
var STRAY_CLOSERS = /* @__PURE__ */ new Set([")", "}"]);
|
|
952
|
+
var SIGILS_THAT_OPEN_A_GROUP = /* @__PURE__ */ new Set(["$", "@"]);
|
|
953
|
+
var LINE_COMMENT = "#";
|
|
954
|
+
var BLOCK_COMMENT_OPEN = "<#";
|
|
955
|
+
var BLOCK_COMMENT_CLOSE = "#>";
|
|
956
|
+
var COMMENT_MAY_FOLLOW = /[\s;|&({]/;
|
|
957
|
+
var HERE_STRING_SIGIL = "@";
|
|
958
|
+
var HERE_STRING_HEADER_REST = /^[ \t\r]*\n/;
|
|
959
|
+
var TRAILING_CARRIAGE_RETURN = /\r$/;
|
|
960
|
+
var BRACED_VARIABLE_OPEN = "${";
|
|
961
|
+
var BRACED_VARIABLE_CLOSE = "}";
|
|
962
|
+
var VARIABLE_SIGIL = "$";
|
|
963
|
+
var SUBEXPRESSION_OPEN = "$(";
|
|
964
|
+
var SUBEXPRESSION_PLACEHOLDER = "$()";
|
|
965
|
+
var VARIABLE_NAME_START = /[A-Za-z0-9_?^$:{(]/;
|
|
966
|
+
var REDIRECTION_OPERATOR = /^[1-6*]?>>?(?:&[1-6])?/;
|
|
967
|
+
var STREAM_NUMBER = /[1-6*]/;
|
|
968
|
+
var OUTPUT_REDIRECT = ">";
|
|
969
|
+
var MERGES_INTO_A_STREAM = "&";
|
|
970
|
+
var PIPE2 = "|";
|
|
971
|
+
var AMPERSAND = "&";
|
|
972
|
+
var STATEMENT_SEPARATOR = ";";
|
|
973
|
+
var ASSIGNMENT_OPERATORS = /* @__PURE__ */ new Set(["=", "+=", "-=", "*=", "/=", "%=", "??="]);
|
|
974
|
+
var CALL_OPERATOR_WORD = { text: AMPERSAND, quoted: false, expands: false, nested: [] };
|
|
975
|
+
var NOT_FOUND = -1;
|
|
976
|
+
var TOP_LEVEL = 0;
|
|
977
|
+
var MAX_GROUP_NESTING = 128;
|
|
978
|
+
var opensAVariable = (source, index) => source.charAt(index) === VARIABLE_SIGIL && VARIABLE_NAME_START.test(source.charAt(index + 1));
|
|
979
|
+
var endOfLine = (source, index) => {
|
|
980
|
+
const newline = source.indexOf(NEWLINE, index);
|
|
981
|
+
return newline === NOT_FOUND ? source.length : newline;
|
|
982
|
+
};
|
|
983
|
+
var endOfBlockComment = (source, index) => {
|
|
984
|
+
const close = source.indexOf(BLOCK_COMMENT_CLOSE, index + BLOCK_COMMENT_OPEN.length);
|
|
985
|
+
return close === NOT_FOUND ? null : close + BLOCK_COMMENT_CLOSE.length;
|
|
986
|
+
};
|
|
987
|
+
var commentMayStartAt = (source, index) => index === 0 || COMMENT_MAY_FOLLOW.test(source.charAt(index - 1));
|
|
988
|
+
var opensAHereString = (source, index) => {
|
|
989
|
+
const quote = source.charAt(index + 1);
|
|
990
|
+
return source.charAt(index) === HERE_STRING_SIGIL && (SINGLE_QUOTES.has(quote) || DOUBLE_QUOTES.has(quote)) && HERE_STRING_HEADER_REST.test(source.slice(index + 2));
|
|
991
|
+
};
|
|
992
|
+
var singleQuotedTextAt = (source, open) => {
|
|
993
|
+
let text = "";
|
|
994
|
+
for (let index = open + 1; index < source.length; index += 1) {
|
|
995
|
+
const char = source.charAt(index);
|
|
996
|
+
if (!SINGLE_QUOTES.has(char)) {
|
|
997
|
+
text += char;
|
|
998
|
+
} else if (SINGLE_QUOTES.has(source.charAt(index + 1))) {
|
|
999
|
+
text += char;
|
|
1000
|
+
index += 1;
|
|
1001
|
+
} else {
|
|
1002
|
+
return { end: index + 1, text, expands: false, nested: [] };
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
return null;
|
|
1006
|
+
};
|
|
1007
|
+
var expandableTextUntil = (source, start, closesAt, nesting) => {
|
|
1008
|
+
let text = "";
|
|
1009
|
+
let expands = false;
|
|
1010
|
+
const nested = [];
|
|
1011
|
+
for (let index = start; index < source.length; index += 1) {
|
|
1012
|
+
const char = source.charAt(index);
|
|
1013
|
+
if (closesAt(index)) return { end: index + 1, text, expands, nested };
|
|
1014
|
+
if (char === ESCAPE || DOUBLE_QUOTES.has(char) && DOUBLE_QUOTES.has(source.charAt(index + 1))) {
|
|
1015
|
+
text += source.charAt(index + 1);
|
|
1016
|
+
index += 1;
|
|
1017
|
+
} else if (source.startsWith(SUBEXPRESSION_OPEN, index)) {
|
|
1018
|
+
const group = groupAt(source, index + SUBEXPRESSION_OPEN.length, ")", nesting + 1);
|
|
1019
|
+
if (group === null) return null;
|
|
1020
|
+
nested.push(group.inner);
|
|
1021
|
+
text += SUBEXPRESSION_PLACEHOLDER;
|
|
1022
|
+
expands = true;
|
|
1023
|
+
index = group.end - 1;
|
|
1024
|
+
} else {
|
|
1025
|
+
expands ||= opensAVariable(source, index);
|
|
1026
|
+
text += char;
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
return null;
|
|
1030
|
+
};
|
|
1031
|
+
var closesADoubleQuote = (source) => (index) => DOUBLE_QUOTES.has(source.charAt(index)) && !DOUBLE_QUOTES.has(source.charAt(index + 1));
|
|
1032
|
+
var doubleQuotedTextAt = (source, open, nesting) => expandableTextUntil(source, open + 1, closesADoubleQuote(source), nesting);
|
|
1033
|
+
var hereStringBody = (body, end, expandable, nesting) => {
|
|
1034
|
+
if (!expandable) return { end, text: body, expands: false, nested: [] };
|
|
1035
|
+
const scanned = expandableTextUntil(`${body}${NEWLINE}`, 0, (index) => index === body.length, nesting);
|
|
1036
|
+
return scanned === null ? null : { ...scanned, end };
|
|
1037
|
+
};
|
|
1038
|
+
var hereStringAt = (source, open, nesting) => {
|
|
1039
|
+
const quote = source.charAt(open + 1);
|
|
1040
|
+
const quotes = SINGLE_QUOTES.has(quote) ? SINGLE_QUOTES : DOUBLE_QUOTES;
|
|
1041
|
+
const header = HERE_STRING_HEADER_REST.exec(source.slice(open + 2));
|
|
1042
|
+
if (header === null) return null;
|
|
1043
|
+
const bodyStart = open + 2 + header[0].length;
|
|
1044
|
+
for (let lineStart = bodyStart; lineStart < source.length; ) {
|
|
1045
|
+
if (quotes.has(source.charAt(lineStart)) && source.charAt(lineStart + 1) === HERE_STRING_SIGIL) {
|
|
1046
|
+
const body = source.slice(bodyStart, Math.max(bodyStart, lineStart - 1)).replace(TRAILING_CARRIAGE_RETURN, "");
|
|
1047
|
+
return hereStringBody(body, lineStart + 2, quotes === DOUBLE_QUOTES, nesting);
|
|
1048
|
+
}
|
|
1049
|
+
const newline = source.indexOf(NEWLINE, lineStart);
|
|
1050
|
+
if (newline === NOT_FOUND) return null;
|
|
1051
|
+
lineStart = newline + 1;
|
|
1052
|
+
}
|
|
1053
|
+
return null;
|
|
1054
|
+
};
|
|
1055
|
+
var quotedTextAt = (source, index, nesting) => {
|
|
1056
|
+
if (opensAHereString(source, index)) return hereStringAt(source, index, nesting);
|
|
1057
|
+
return SINGLE_QUOTES.has(source.charAt(index)) ? singleQuotedTextAt(source, index) : doubleQuotedTextAt(source, index, nesting);
|
|
1058
|
+
};
|
|
1059
|
+
var opensQuotedText = (source, index) => SINGLE_QUOTES.has(source.charAt(index)) || DOUBLE_QUOTES.has(source.charAt(index)) || opensAHereString(source, index);
|
|
1060
|
+
var indexAfterGroupContent = (source, index, nesting) => {
|
|
1061
|
+
const char = source.charAt(index);
|
|
1062
|
+
if (char === ESCAPE) return index + 2;
|
|
1063
|
+
if (opensQuotedText(source, index)) return quotedTextAt(source, index, nesting)?.end ?? null;
|
|
1064
|
+
if (source.startsWith(BLOCK_COMMENT_OPEN, index)) return endOfBlockComment(source, index);
|
|
1065
|
+
if (char === LINE_COMMENT && commentMayStartAt(source, index)) return endOfLine(source, index);
|
|
1066
|
+
const closer = GROUP_CLOSERS.get(char);
|
|
1067
|
+
if (closer !== void 0) return groupAt(source, index + 1, closer, nesting + 1)?.end ?? null;
|
|
1068
|
+
return STRAY_CLOSERS.has(char) ? null : index + 1;
|
|
1069
|
+
};
|
|
1070
|
+
var groupAt = (source, start, closer, nesting) => {
|
|
1071
|
+
if (nesting > MAX_GROUP_NESTING) return null;
|
|
1072
|
+
for (let index = start; index < source.length; ) {
|
|
1073
|
+
if (source.charAt(index) === closer) return { end: index + 1, inner: source.slice(start, index) };
|
|
1074
|
+
const after = indexAfterGroupContent(source, index, nesting);
|
|
1075
|
+
if (after === null) return null;
|
|
1076
|
+
index = after;
|
|
1077
|
+
}
|
|
1078
|
+
return null;
|
|
1079
|
+
};
|
|
1080
|
+
var lineContinuationLength = (source, index) => {
|
|
1081
|
+
if (source.charAt(index) === NEWLINE) return 1;
|
|
1082
|
+
return source.charAt(index) === CARRIAGE_RETURN && source.charAt(index + 1) === NEWLINE ? 2 : 0;
|
|
1083
|
+
};
|
|
1084
|
+
var continuesWithAPipe = (source, from) => {
|
|
1085
|
+
const rest = source.slice(from).trimStart();
|
|
1086
|
+
return rest.startsWith(PIPE2) && !rest.startsWith(`${PIPE2}${PIPE2}`);
|
|
1087
|
+
};
|
|
1088
|
+
var isPowerShellAssignmentOperator = (word) => word !== void 0 && !word.quoted && ASSIGNMENT_OPERATORS.has(word.text);
|
|
1089
|
+
var opensARedirection = (source, index, wordStarted) => source.charAt(index) === OUTPUT_REDIRECT || !wordStarted && STREAM_NUMBER.test(source.charAt(index)) && source.charAt(index + 1) === OUTPUT_REDIRECT;
|
|
1090
|
+
var powerShellStatementsOf = (source) => {
|
|
1091
|
+
const statements = [];
|
|
1092
|
+
let stages = [];
|
|
1093
|
+
let words = [];
|
|
1094
|
+
let redirectTargets = [];
|
|
1095
|
+
let draft = null;
|
|
1096
|
+
let readsAPipe = false;
|
|
1097
|
+
let stageStart = 0;
|
|
1098
|
+
let targetsARedirect = false;
|
|
1099
|
+
const startWord = () => {
|
|
1100
|
+
draft ??= { text: "", quoted: false, expands: false, nested: [] };
|
|
1101
|
+
return draft;
|
|
1102
|
+
};
|
|
1103
|
+
const finishWord = () => {
|
|
1104
|
+
if (draft === null) return;
|
|
1105
|
+
if (targetsARedirect) redirectTargets.push(draft);
|
|
1106
|
+
else words.push(draft);
|
|
1107
|
+
draft = null;
|
|
1108
|
+
targetsARedirect = false;
|
|
1109
|
+
};
|
|
1110
|
+
const finishStage = (end, next) => {
|
|
1111
|
+
finishWord();
|
|
1112
|
+
if (words.length > 0 || redirectTargets.length > 0) {
|
|
1113
|
+
stages.push({ words, redirectTargets, readsAPipe, source: source.slice(stageStart, end).trim() });
|
|
1114
|
+
}
|
|
1115
|
+
words = [];
|
|
1116
|
+
redirectTargets = [];
|
|
1117
|
+
readsAPipe = false;
|
|
1118
|
+
stageStart = next;
|
|
1119
|
+
};
|
|
1120
|
+
const finishStatement = () => {
|
|
1121
|
+
if (stages.length > 0) statements.push({ stages });
|
|
1122
|
+
stages = [];
|
|
1123
|
+
};
|
|
1124
|
+
const awaitsAPipedStage = () => readsAPipe && words.length === 0 && draft === null;
|
|
1125
|
+
const startsACommand = () => draft === null && (words.length === 0 || isPowerShellAssignmentOperator(words.at(-1)));
|
|
1126
|
+
const groupAttachesToTheWord = () => draft !== null && SIGILS_THAT_OPEN_A_GROUP.has(draft.text.slice(-1));
|
|
1127
|
+
let index = 0;
|
|
1128
|
+
while (index < source.length) {
|
|
1129
|
+
const char = source.charAt(index);
|
|
1130
|
+
const next = source.charAt(index + 1);
|
|
1131
|
+
if (char === ESCAPE) {
|
|
1132
|
+
const continuation = lineContinuationLength(source, index + 1);
|
|
1133
|
+
if (continuation === 0) {
|
|
1134
|
+
const word = startWord();
|
|
1135
|
+
word.text += next;
|
|
1136
|
+
word.quoted = true;
|
|
1137
|
+
}
|
|
1138
|
+
index += 1 + Math.max(continuation, 1);
|
|
1139
|
+
} else if (char === NEWLINE) {
|
|
1140
|
+
if (!awaitsAPipedStage()) {
|
|
1141
|
+
finishStage(index, index + 1);
|
|
1142
|
+
if (!continuesWithAPipe(source, index + 1)) finishStatement();
|
|
1143
|
+
}
|
|
1144
|
+
index += 1;
|
|
1145
|
+
} else if (WORD_SPACE.test(char)) {
|
|
1146
|
+
finishWord();
|
|
1147
|
+
index += 1;
|
|
1148
|
+
} else if (char === STATEMENT_SEPARATOR) {
|
|
1149
|
+
finishStage(index, index + 1);
|
|
1150
|
+
finishStatement();
|
|
1151
|
+
index += 1;
|
|
1152
|
+
} else if (char === PIPE2) {
|
|
1153
|
+
const chained = next === PIPE2;
|
|
1154
|
+
finishStage(index, index + (chained ? 2 : 1));
|
|
1155
|
+
if (chained) finishStatement();
|
|
1156
|
+
else readsAPipe = true;
|
|
1157
|
+
index += chained ? 2 : 1;
|
|
1158
|
+
} else if (char === AMPERSAND && next !== AMPERSAND && startsACommand()) {
|
|
1159
|
+
words.push(CALL_OPERATOR_WORD);
|
|
1160
|
+
index += 1;
|
|
1161
|
+
} else if (char === AMPERSAND) {
|
|
1162
|
+
const chained = next === AMPERSAND;
|
|
1163
|
+
finishStage(index, index + (chained ? 2 : 1));
|
|
1164
|
+
finishStatement();
|
|
1165
|
+
index += chained ? 2 : 1;
|
|
1166
|
+
} else if (opensARedirection(source, index, draft !== null)) {
|
|
1167
|
+
finishWord();
|
|
1168
|
+
const operator = REDIRECTION_OPERATOR.exec(source.slice(index))?.[0] ?? char;
|
|
1169
|
+
targetsARedirect = !operator.includes(MERGES_INTO_A_STREAM);
|
|
1170
|
+
index += operator.length;
|
|
1171
|
+
} else if (draft === null && char === LINE_COMMENT) {
|
|
1172
|
+
index = endOfLine(source, index);
|
|
1173
|
+
} else if (draft === null && source.startsWith(BLOCK_COMMENT_OPEN, index)) {
|
|
1174
|
+
const end = endOfBlockComment(source, index);
|
|
1175
|
+
if (end === null) return null;
|
|
1176
|
+
index = end;
|
|
1177
|
+
} else if (SINGLE_QUOTES.has(char) || DOUBLE_QUOTES.has(char) || draft === null && opensAHereString(source, index)) {
|
|
1178
|
+
const quoted = quotedTextAt(source, index, TOP_LEVEL);
|
|
1179
|
+
if (quoted === null) return null;
|
|
1180
|
+
const word = startWord();
|
|
1181
|
+
word.text += quoted.text;
|
|
1182
|
+
word.quoted = true;
|
|
1183
|
+
word.expands ||= quoted.expands;
|
|
1184
|
+
word.nested.push(...quoted.nested);
|
|
1185
|
+
index = quoted.end;
|
|
1186
|
+
} else if (source.startsWith(BRACED_VARIABLE_OPEN, index)) {
|
|
1187
|
+
const close = source.indexOf(BRACED_VARIABLE_CLOSE, index + BRACED_VARIABLE_OPEN.length);
|
|
1188
|
+
if (close === NOT_FOUND) return null;
|
|
1189
|
+
const word = startWord();
|
|
1190
|
+
word.text += source.slice(index, close + 1);
|
|
1191
|
+
word.expands = true;
|
|
1192
|
+
index = close + 1;
|
|
1193
|
+
} else if (GROUP_CLOSERS.has(char)) {
|
|
1194
|
+
const closer = GROUP_CLOSERS.get(char) ?? "";
|
|
1195
|
+
const group = groupAt(source, index + 1, closer, TOP_LEVEL);
|
|
1196
|
+
if (group === null) return null;
|
|
1197
|
+
if (!groupAttachesToTheWord()) finishWord();
|
|
1198
|
+
const word = startWord();
|
|
1199
|
+
word.text += `${char}${closer}`;
|
|
1200
|
+
word.expands = true;
|
|
1201
|
+
word.nested.push(group.inner);
|
|
1202
|
+
index = group.end;
|
|
1203
|
+
} else if (STRAY_CLOSERS.has(char)) {
|
|
1204
|
+
return null;
|
|
1205
|
+
} else {
|
|
1206
|
+
const word = startWord();
|
|
1207
|
+
word.expands ||= opensAVariable(source, index);
|
|
1208
|
+
word.text += char;
|
|
1209
|
+
index += 1;
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
finishStage(source.length, source.length);
|
|
1213
|
+
finishStatement();
|
|
1214
|
+
return statements;
|
|
1215
|
+
};
|
|
1216
|
+
|
|
1217
|
+
// ../contracts/src/powershell-consequences.ts
|
|
1218
|
+
var POWERSHELL_ALIASES = /* @__PURE__ */ new Map([
|
|
1219
|
+
["rm", "remove-item"],
|
|
1220
|
+
["del", "remove-item"],
|
|
1221
|
+
["erase", "remove-item"],
|
|
1222
|
+
["rd", "remove-item"],
|
|
1223
|
+
["rmdir", "remove-item"],
|
|
1224
|
+
["ri", "remove-item"],
|
|
1225
|
+
["cp", "copy-item"],
|
|
1226
|
+
["copy", "copy-item"],
|
|
1227
|
+
["cpi", "copy-item"],
|
|
1228
|
+
["mv", "move-item"],
|
|
1229
|
+
["move", "move-item"],
|
|
1230
|
+
["mi", "move-item"],
|
|
1231
|
+
["ren", "rename-item"],
|
|
1232
|
+
["rni", "rename-item"],
|
|
1233
|
+
["sc", "set-content"],
|
|
1234
|
+
["ac", "add-content"],
|
|
1235
|
+
["clc", "clear-content"],
|
|
1236
|
+
["ni", "new-item"],
|
|
1237
|
+
["tee", "tee-object"],
|
|
1238
|
+
["iwr", "invoke-webrequest"],
|
|
1239
|
+
["curl", "invoke-webrequest"],
|
|
1240
|
+
["wget", "invoke-webrequest"],
|
|
1241
|
+
["irm", "invoke-restmethod"],
|
|
1242
|
+
["iex", "invoke-expression"],
|
|
1243
|
+
["icm", "invoke-command"],
|
|
1244
|
+
["saps", "start-process"],
|
|
1245
|
+
["start", "start-process"],
|
|
1246
|
+
["spsv", "stop-service"],
|
|
1247
|
+
["sasv", "start-service"],
|
|
1248
|
+
["%", "foreach-object"],
|
|
1249
|
+
["foreach", "foreach-object"],
|
|
1250
|
+
["?", "where-object"],
|
|
1251
|
+
["where", "where-object"],
|
|
1252
|
+
["ls", "get-childitem"],
|
|
1253
|
+
["dir", "get-childitem"],
|
|
1254
|
+
["gci", "get-childitem"],
|
|
1255
|
+
["cat", "get-content"],
|
|
1256
|
+
["type", "get-content"],
|
|
1257
|
+
["gc", "get-content"],
|
|
1258
|
+
["echo", "write-output"],
|
|
1259
|
+
["write", "write-output"],
|
|
1260
|
+
["select", "select-object"],
|
|
1261
|
+
["sort", "sort-object"],
|
|
1262
|
+
["group", "group-object"],
|
|
1263
|
+
["measure", "measure-object"],
|
|
1264
|
+
["diff", "compare-object"],
|
|
1265
|
+
["compare", "compare-object"],
|
|
1266
|
+
["ft", "format-table"],
|
|
1267
|
+
["fl", "format-list"],
|
|
1268
|
+
["fw", "format-wide"],
|
|
1269
|
+
["gi", "get-item"],
|
|
1270
|
+
["gp", "get-itemproperty"],
|
|
1271
|
+
["gl", "get-location"],
|
|
1272
|
+
["pwd", "get-location"],
|
|
1273
|
+
["cd", "set-location"],
|
|
1274
|
+
["chdir", "set-location"],
|
|
1275
|
+
["sl", "set-location"],
|
|
1276
|
+
["pushd", "push-location"],
|
|
1277
|
+
["popd", "pop-location"],
|
|
1278
|
+
["gcm", "get-command"],
|
|
1279
|
+
["gps", "get-process"],
|
|
1280
|
+
["ps", "get-process"],
|
|
1281
|
+
["gsv", "get-service"],
|
|
1282
|
+
["sls", "select-string"],
|
|
1283
|
+
["gm", "get-member"],
|
|
1284
|
+
["gal", "get-alias"],
|
|
1285
|
+
["gv", "get-variable"],
|
|
1286
|
+
["h", "get-history"],
|
|
1287
|
+
["history", "get-history"],
|
|
1288
|
+
["cls", "clear-host"],
|
|
1289
|
+
["clear", "clear-host"],
|
|
1290
|
+
["sleep", "start-sleep"],
|
|
1291
|
+
["kill", "stop-process"],
|
|
1292
|
+
["spps", "stop-process"]
|
|
1293
|
+
]);
|
|
1294
|
+
var POWERSHELL_READ_VERBS = /* @__PURE__ */ new Set([
|
|
1295
|
+
"get",
|
|
1296
|
+
"test",
|
|
1297
|
+
"select",
|
|
1298
|
+
"measure",
|
|
1299
|
+
"compare",
|
|
1300
|
+
"resolve",
|
|
1301
|
+
"convertto",
|
|
1302
|
+
"convertfrom",
|
|
1303
|
+
"find",
|
|
1304
|
+
"search",
|
|
1305
|
+
"wait",
|
|
1306
|
+
"read",
|
|
1307
|
+
"format"
|
|
1308
|
+
]);
|
|
1309
|
+
var POWERSHELL_READ_CMDLETS = /* @__PURE__ */ new Set([
|
|
1310
|
+
"sort-object",
|
|
1311
|
+
"group-object",
|
|
1312
|
+
"where-object",
|
|
1313
|
+
"write-output",
|
|
1314
|
+
"write-host",
|
|
1315
|
+
"write-verbose",
|
|
1316
|
+
"write-debug",
|
|
1317
|
+
"write-information",
|
|
1318
|
+
"write-warning",
|
|
1319
|
+
"write-error",
|
|
1320
|
+
"write-progress",
|
|
1321
|
+
"out-string",
|
|
1322
|
+
"out-host",
|
|
1323
|
+
"out-null",
|
|
1324
|
+
"out-default",
|
|
1325
|
+
"split-path",
|
|
1326
|
+
"join-path",
|
|
1327
|
+
"set-location",
|
|
1328
|
+
"push-location",
|
|
1329
|
+
"pop-location",
|
|
1330
|
+
"clear-host",
|
|
1331
|
+
"start-sleep"
|
|
1332
|
+
]);
|
|
1333
|
+
var POWERSHELL_WRITERS_WITH_A_READ_VERB = /* @__PURE__ */ new Set(["format-volume"]);
|
|
1334
|
+
var POWERSHELL_VERB_SEPARATOR = "-";
|
|
1335
|
+
var POWERSHELL_LANGUAGE_KEYWORDS = /* @__PURE__ */ new Set([
|
|
1336
|
+
"if",
|
|
1337
|
+
"elseif",
|
|
1338
|
+
"else",
|
|
1339
|
+
"foreach",
|
|
1340
|
+
"for",
|
|
1341
|
+
"while",
|
|
1342
|
+
"do",
|
|
1343
|
+
"until",
|
|
1344
|
+
"switch",
|
|
1345
|
+
"try",
|
|
1346
|
+
"catch",
|
|
1347
|
+
"finally",
|
|
1348
|
+
"trap",
|
|
1349
|
+
"function",
|
|
1350
|
+
"filter",
|
|
1351
|
+
"workflow",
|
|
1352
|
+
"param",
|
|
1353
|
+
"begin",
|
|
1354
|
+
"process",
|
|
1355
|
+
"end",
|
|
1356
|
+
"dynamicparam",
|
|
1357
|
+
"break",
|
|
1358
|
+
"continue",
|
|
1359
|
+
"exit",
|
|
1360
|
+
"throw",
|
|
1361
|
+
"data",
|
|
1362
|
+
"class",
|
|
1363
|
+
"enum",
|
|
1364
|
+
"using",
|
|
1365
|
+
"configuration",
|
|
1366
|
+
"in"
|
|
1367
|
+
]);
|
|
1368
|
+
var POWERSHELL_CALL_OPERATORS = /* @__PURE__ */ new Set(["&", "."]);
|
|
1369
|
+
var POWERSHELL_RETURN_KEYWORD = "return";
|
|
1370
|
+
var POWERSHELL_ASSIGNMENT_TARGET = /^[$[]/;
|
|
1371
|
+
var POWERSHELL_ARRAY_SEPARATOR = ",";
|
|
1372
|
+
var POWERSHELL_ATTACHED_ASSIGNMENT = /^\$[^=\s]*?(?:[+\-*/%]|\?\?)?=(?!=)([\s\S]+)$/;
|
|
1373
|
+
var POWERSHELL_EXPRESSION_START = /^[$({@[\-–—―]/;
|
|
1374
|
+
var POWERSHELL_NUMBER_OR_RANGE = /^\d[\d.]*$/;
|
|
1375
|
+
var POWERSHELL_PARAMETER = /^[-–—―]([A-Za-z][\w-]*)(?::([\s\S]*))?$/;
|
|
1376
|
+
var POWERSHELL_SWITCH_OFF = "$false";
|
|
1377
|
+
var EXECUTABLE_EXTENSION = /\.(?:exe|cmd|bat|com)$/;
|
|
1378
|
+
var REMOVE_ITEM = "remove-item";
|
|
1379
|
+
var COPY_ITEM = "copy-item";
|
|
1380
|
+
var GET_CHILD_ITEM = "get-childitem";
|
|
1381
|
+
var FOREACH_OBJECT = "foreach-object";
|
|
1382
|
+
var INVOKE_EXPRESSION = "invoke-expression";
|
|
1383
|
+
var DELETE_METHOD = "delete";
|
|
1384
|
+
var RECURSE_PARAMETER = "recurse";
|
|
1385
|
+
var DEPTH_PARAMETER = "depth";
|
|
1386
|
+
var WHAT_IF_PARAMETER = "whatif";
|
|
1387
|
+
var DESTINATION_PARAMETER = "destination";
|
|
1388
|
+
var MEMBER_NAME_PARAMETER = "membername";
|
|
1389
|
+
var FILE_PARAMETER = "file";
|
|
1390
|
+
var FILE_PATH_PARAMETER = "filepath";
|
|
1391
|
+
var SHORTEST_PARAMETER_PREFIX = 1;
|
|
1392
|
+
var SHORTEST_DEPTH_PREFIX = 3;
|
|
1393
|
+
var SHORTEST_DESTINATION_PREFIX = 3;
|
|
1394
|
+
var SHORTEST_FILE_PATH_PREFIX = 2;
|
|
1395
|
+
var POWERSHELL_FILE_WRITERS = /* @__PURE__ */ new Set([
|
|
1396
|
+
"set-content",
|
|
1397
|
+
"add-content",
|
|
1398
|
+
"clear-content",
|
|
1399
|
+
"out-file",
|
|
1400
|
+
"new-item",
|
|
1401
|
+
REMOVE_ITEM,
|
|
1402
|
+
"move-item",
|
|
1403
|
+
"rename-item",
|
|
1404
|
+
"tee-object",
|
|
1405
|
+
"invoke-webrequest",
|
|
1406
|
+
"invoke-restmethod",
|
|
1407
|
+
"start-bitstransfer"
|
|
1408
|
+
]);
|
|
1409
|
+
var POWERSHELL_FETCHERS = /* @__PURE__ */ new Set(["invoke-webrequest", "invoke-restmethod", "start-bitstransfer"]);
|
|
1410
|
+
var DISK_ERASERS = /* @__PURE__ */ new Set(["format-volume", "clear-disk", "initialize-disk", "remove-partition", "format"]);
|
|
1411
|
+
var WINDOWS_SERVICE_CHANGERS = /* @__PURE__ */ new Set([
|
|
1412
|
+
"start-service",
|
|
1413
|
+
"stop-service",
|
|
1414
|
+
"restart-service",
|
|
1415
|
+
"suspend-service",
|
|
1416
|
+
"resume-service",
|
|
1417
|
+
"set-service",
|
|
1418
|
+
"new-service",
|
|
1419
|
+
"remove-service"
|
|
1420
|
+
]);
|
|
1421
|
+
var SERVICE_CONTROL_PROGRAM = "sc";
|
|
1422
|
+
var SERVICE_CONTROL_VERBS_THAT_CHANGE = /* @__PURE__ */ new Set([
|
|
1423
|
+
"start",
|
|
1424
|
+
"stop",
|
|
1425
|
+
"pause",
|
|
1426
|
+
"continue",
|
|
1427
|
+
"config",
|
|
1428
|
+
"create",
|
|
1429
|
+
"delete",
|
|
1430
|
+
"failure",
|
|
1431
|
+
"failureflag",
|
|
1432
|
+
"sidtype",
|
|
1433
|
+
"privs",
|
|
1434
|
+
"managedaccount",
|
|
1435
|
+
"description",
|
|
1436
|
+
"sdset",
|
|
1437
|
+
"control",
|
|
1438
|
+
"triggerinfo",
|
|
1439
|
+
"preferrednode"
|
|
1440
|
+
]);
|
|
1441
|
+
var REMOTE_MACHINE_PREFIX = "\\\\";
|
|
1442
|
+
var NET_PROGRAMS = /* @__PURE__ */ new Set(["net", "net1"]);
|
|
1443
|
+
var NET_VERBS_THAT_CHANGE_A_SERVICE = /* @__PURE__ */ new Set(["stop", "pause", "continue"]);
|
|
1444
|
+
var NET_START = "start";
|
|
1445
|
+
var SCHEDULED_TASK_CHANGERS = /* @__PURE__ */ new Set([
|
|
1446
|
+
"register-scheduledtask",
|
|
1447
|
+
"unregister-scheduledtask",
|
|
1448
|
+
"set-scheduledtask",
|
|
1449
|
+
"enable-scheduledtask",
|
|
1450
|
+
"disable-scheduledtask",
|
|
1451
|
+
"start-scheduledtask",
|
|
1452
|
+
"stop-scheduledtask"
|
|
1453
|
+
]);
|
|
1454
|
+
var SCHTASKS_PROGRAM = "schtasks";
|
|
1455
|
+
var SCHTASKS_SWITCHES_THAT_CHANGE = /^[/-](?:create|delete|change|run|end)$/i;
|
|
1456
|
+
var DOTNET_RECURSIVE_DELETE = /::Delete\s*\([^()]*,\s*(?:\$true|1)\s*\)|\.Delete\s*\(\s*\$true\s*\)/i;
|
|
1457
|
+
var DOTNET_DOWNLOAD = /\.Download(?:String|Data|File)(?:Async|TaskAsync)?\s*\(/i;
|
|
1458
|
+
var SCRIPTBLOCK_FROM_TEXT = /\[(?:System\.Management\.Automation\.)?ScriptBlock\]::Create\s*\(/i;
|
|
1459
|
+
var POWERSHELL_HOSTS = /* @__PURE__ */ new Set(["powershell", "pwsh", "powershell_ise"]);
|
|
1460
|
+
var WINDOWS_POWERSHELL_HOST = "powershell";
|
|
1461
|
+
var POWERSHELL_HOST_COMMAND_SWITCHES = /* @__PURE__ */ new Set(["-c", "-command", "--command", "/c", "/command"]);
|
|
1462
|
+
var POWERSHELL_HOST_SWITCHES_THAT_HIDE_THE_COMMAND = /* @__PURE__ */ new Set([
|
|
1463
|
+
"-f",
|
|
1464
|
+
"-file",
|
|
1465
|
+
"/f",
|
|
1466
|
+
"/file",
|
|
1467
|
+
"-e",
|
|
1468
|
+
"-ec",
|
|
1469
|
+
"-enc",
|
|
1470
|
+
"-encodedcommand",
|
|
1471
|
+
"/encodedcommand"
|
|
1472
|
+
]);
|
|
1473
|
+
var POWERSHELL_HOST_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set([
|
|
1474
|
+
"-executionpolicy",
|
|
1475
|
+
"-ep",
|
|
1476
|
+
"-ex",
|
|
1477
|
+
"-windowstyle",
|
|
1478
|
+
"-w",
|
|
1479
|
+
"-workingdirectory",
|
|
1480
|
+
"-wd",
|
|
1481
|
+
"-configurationname",
|
|
1482
|
+
"-config",
|
|
1483
|
+
"-inputformat",
|
|
1484
|
+
"-inf",
|
|
1485
|
+
"-if",
|
|
1486
|
+
"-outputformat",
|
|
1487
|
+
"-of",
|
|
1488
|
+
"-o",
|
|
1489
|
+
"-version",
|
|
1490
|
+
"-v",
|
|
1491
|
+
"-settingsfile",
|
|
1492
|
+
"-custompipename",
|
|
1493
|
+
"-psconsolefile"
|
|
1494
|
+
]);
|
|
1495
|
+
var POWERSHELL_HOST_SWITCH = /^[-/]/;
|
|
1496
|
+
var POWERSHELL_FILE_RUNNERS = /* @__PURE__ */ new Set(["start-process", "invoke-item", "msiexec"]);
|
|
1497
|
+
var WINDOWS_SWITCH = /^[-/–—―]/;
|
|
1498
|
+
var CMD_PROGRAM = "cmd";
|
|
1499
|
+
var CMD_RUNS_THE_REST = /^\/[ck]$/i;
|
|
1500
|
+
var CMD_SEPARATORS = ["&&", "||", "&", "|"];
|
|
1501
|
+
var CMD_ESCAPE = "^";
|
|
1502
|
+
var CMD_QUOTE = '"';
|
|
1503
|
+
var CMD_WORD_SEPARATOR = /\s+/;
|
|
1504
|
+
var CMD_RECURSIVE_REMOVERS = /* @__PURE__ */ new Set(["rd", "rmdir", "del", "erase"]);
|
|
1505
|
+
var CMD_SWITCH_PREFIX = "/";
|
|
1506
|
+
var CMD_RECURSE_SWITCH = "s";
|
|
1507
|
+
var WSL_PROGRAM = "wsl";
|
|
1508
|
+
var WSL_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set(["-d", "--distribution", "-u", "--user", "--cd", "--shell-type"]);
|
|
1509
|
+
var WSL_COMMAND_MARKERS = /* @__PURE__ */ new Set(["-e", "--exec", "--"]);
|
|
1510
|
+
var NO_SCRIPTS_INSIDE = { powerShell: [], cmd: [], posix: [] };
|
|
1511
|
+
var MAX_NESTED_SCRIPT_DEPTH = 4;
|
|
1512
|
+
var TOP_LEVEL_SCRIPT = 0;
|
|
1513
|
+
var POSIX_FLAG = /^-/;
|
|
1514
|
+
var PATH_SEPARATORS = /[/\\]/;
|
|
1515
|
+
var URL_QUERY_OR_FRAGMENT = /[?#].*$/;
|
|
1516
|
+
var fileNameOf = (path) => path.split(PATH_SEPARATORS).at(-1) ?? path;
|
|
1517
|
+
var parameterOf = (word) => {
|
|
1518
|
+
if (word === void 0 || word.quoted) return null;
|
|
1519
|
+
const match = POWERSHELL_PARAMETER.exec(word.text);
|
|
1520
|
+
return match === null ? null : { name: (match[1] ?? "").toLowerCase(), value: match[2] };
|
|
1521
|
+
};
|
|
1522
|
+
var namesTheParameter = (parameter, fullName, shortestPrefix) => parameter !== null && parameter.name.length >= shortestPrefix && fullName.startsWith(parameter.name);
|
|
1523
|
+
var turnsOn = (command, fullName, shortestPrefix) => command.args.some((arg) => {
|
|
1524
|
+
const parameter = parameterOf(arg);
|
|
1525
|
+
return namesTheParameter(parameter, fullName, shortestPrefix) && parameter?.value?.toLowerCase() !== POWERSHELL_SWITCH_OFF;
|
|
1526
|
+
});
|
|
1527
|
+
var parameterValueOf = (command, fullName, shortestPrefix) => {
|
|
1528
|
+
const index = command.args.findIndex((arg) => namesTheParameter(parameterOf(arg), fullName, shortestPrefix));
|
|
1529
|
+
return index === -1 ? void 0 : parameterOf(command.args[index])?.value ?? command.args[index + 1]?.text;
|
|
1530
|
+
};
|
|
1531
|
+
var operandTextsOf = (command) => command.args.flatMap((arg) => {
|
|
1532
|
+
const parameter = parameterOf(arg);
|
|
1533
|
+
const text = parameter === null ? arg.text : parameter.value;
|
|
1534
|
+
return text === void 0 ? [] : text.split(POWERSHELL_ARRAY_SEPARATOR);
|
|
1535
|
+
});
|
|
1536
|
+
var positionalTextsOf = (command) => command.args.filter((arg) => parameterOf(arg) === null).map((arg) => arg.text);
|
|
1537
|
+
var firstOperandOf = (command, isSwitch) => command.args.find((arg) => !isSwitch.test(arg.text))?.text;
|
|
1538
|
+
var namesASecretPath = (text, judge) => judge.namesASecretFile(fileNameOf(text.trim()));
|
|
1539
|
+
var isAssignmentTarget = (word) => POWERSHELL_ASSIGNMENT_TARGET.test(word.text) || word.text === POWERSHELL_ARRAY_SEPARATOR;
|
|
1540
|
+
var wordsAfterAnAssignment = (words) => {
|
|
1541
|
+
const operator = words.findIndex((word) => isPowerShellAssignmentOperator(word));
|
|
1542
|
+
if (operator > 0 && words.slice(0, operator).every(isAssignmentTarget)) return words.slice(operator + 1);
|
|
1543
|
+
const [first, ...rest] = words;
|
|
1544
|
+
const assigned = first === void 0 ? void 0 : POWERSHELL_ATTACHED_ASSIGNMENT.exec(first.text)?.[1];
|
|
1545
|
+
return first === void 0 || assigned === void 0 ? words : [{ ...first, text: assigned }, ...rest];
|
|
1546
|
+
};
|
|
1547
|
+
var commandWordsOf = (words) => {
|
|
1548
|
+
const assigned = wordsAfterAnAssignment(words);
|
|
1549
|
+
const returned = assigned[0] !== void 0 && !assigned[0].quoted && assigned[0].text.toLowerCase() === POWERSHELL_RETURN_KEYWORD ? assigned.slice(1) : assigned;
|
|
1550
|
+
const first = returned[0];
|
|
1551
|
+
const viaCallOperator = first !== void 0 && !first.quoted && POWERSHELL_CALL_OPERATORS.has(first.text);
|
|
1552
|
+
return { words: viaCallOperator ? returned.slice(1) : returned, viaCallOperator };
|
|
1553
|
+
};
|
|
1554
|
+
var namesAPowerShellCommand = (program, viaCallOperator, readsAPipe) => {
|
|
1555
|
+
if (program.text.length === 0 || POWERSHELL_EXPRESSION_START.test(program.text) || POWERSHELL_NUMBER_OR_RANGE.test(program.text)) {
|
|
1556
|
+
return false;
|
|
1557
|
+
}
|
|
1558
|
+
if (viaCallOperator) return true;
|
|
1559
|
+
return !program.quoted && (readsAPipe || !POWERSHELL_LANGUAGE_KEYWORDS.has(program.text.toLowerCase()));
|
|
1560
|
+
};
|
|
1561
|
+
var powerShellCommandOf = (stage) => {
|
|
1562
|
+
const { words, viaCallOperator } = commandWordsOf(stage.words);
|
|
1563
|
+
const [program, ...args] = words;
|
|
1564
|
+
if (program === void 0 || !namesAPowerShellCommand(program, viaCallOperator, stage.readsAPipe)) return null;
|
|
1565
|
+
const fileName = fileNameOf(program.text).toLowerCase();
|
|
1566
|
+
const name = fileName.replace(EXECUTABLE_EXTENSION, "");
|
|
1567
|
+
return { stage, program, args, fileName, name, cmdlet: POWERSHELL_ALIASES.get(fileName) ?? name };
|
|
1568
|
+
};
|
|
1569
|
+
var posixWordOf = (word) => ({ text: word.text, plain: !word.quoted, expands: word.expands, comment: false });
|
|
1570
|
+
var posixProgramWordOf = (command) => ({ ...posixWordOf(command.program), text: command.name });
|
|
1571
|
+
var posixInvocationOf = (command) => ({ program: posixProgramWordOf(command), args: command.args.map(posixWordOf) });
|
|
1572
|
+
var verbOfCmdlet = (cmdlet) => {
|
|
1573
|
+
const separator = cmdlet.indexOf(POWERSHELL_VERB_SEPARATOR);
|
|
1574
|
+
return separator === -1 ? "" : cmdlet.slice(0, separator);
|
|
1575
|
+
};
|
|
1576
|
+
var cmdletOnlyReads = (cmdlet) => POWERSHELL_READ_CMDLETS.has(cmdlet) || POWERSHELL_READ_VERBS.has(verbOfCmdlet(cmdlet)) && !POWERSHELL_WRITERS_WITH_A_READ_VERB.has(cmdlet);
|
|
1577
|
+
var readsLikeAPosixRead = (command, judge) => !command.program.expands && !command.args.some((arg) => arg.expands) && command.stage.redirectTargets.length === 0 && judge.onlyReads([command.name, ...command.args.map((arg) => arg.text)]);
|
|
1578
|
+
var onlyReads = (command, judge) => cmdletOnlyReads(command.cmdlet) || readsLikeAPosixRead(command, judge);
|
|
1579
|
+
var onlyPreviewsInPowerShell = (command) => turnsOn(command, WHAT_IF_PARAMETER, WHAT_IF_PARAMETER.length);
|
|
1580
|
+
var removesRecursively = (command) => command.cmdlet === REMOVE_ITEM && turnsOn(command, RECURSE_PARAMETER, SHORTEST_PARAMETER_PREFIX) && !onlyPreviewsInPowerShell(command);
|
|
1581
|
+
var listsRecursively = (command) => command.cmdlet === GET_CHILD_ITEM && (turnsOn(command, RECURSE_PARAMETER, SHORTEST_PARAMETER_PREFIX) || parameterValueOf(command, DEPTH_PARAMETER, SHORTEST_DEPTH_PREFIX) !== void 0);
|
|
1582
|
+
var calledMemberOf = (command) => (parameterValueOf(command, MEMBER_NAME_PARAMETER, SHORTEST_PARAMETER_PREFIX) ?? firstOperandOf(command, WINDOWS_SWITCH))?.toLowerCase();
|
|
1583
|
+
var removesWhatItIsGiven = (command) => !onlyPreviewsInPowerShell(command) && (command.cmdlet === REMOVE_ITEM || command.cmdlet === FOREACH_OBJECT && calledMemberOf(command) === DELETE_METHOD);
|
|
1584
|
+
var commandsOfStatement = (statement) => statement.stages.map(powerShellCommandOf);
|
|
1585
|
+
var listsRecursivelyIntoARemoval = (statement) => {
|
|
1586
|
+
const commands = commandsOfStatement(statement);
|
|
1587
|
+
const listing = commands.findIndex((command) => command !== null && listsRecursively(command));
|
|
1588
|
+
return listing !== -1 && commands.slice(listing + 1).some((command) => command !== null && removesWhatItIsGiven(command));
|
|
1589
|
+
};
|
|
1590
|
+
var copyDestinationOf = (command) => {
|
|
1591
|
+
const named = parameterValueOf(command, DESTINATION_PARAMETER, SHORTEST_DESTINATION_PREFIX);
|
|
1592
|
+
const positional = positionalTextsOf(command);
|
|
1593
|
+
return named ?? (positional.length > 1 ? positional.at(-1) : void 0);
|
|
1594
|
+
};
|
|
1595
|
+
var writesASecretFileFromPowerShell = (command, judge) => {
|
|
1596
|
+
if (command.cmdlet !== COPY_ITEM) {
|
|
1597
|
+
return POWERSHELL_FILE_WRITERS.has(command.cmdlet) && operandTextsOf(command).some((text) => namesASecretPath(text, judge));
|
|
1598
|
+
}
|
|
1599
|
+
const destination = copyDestinationOf(command);
|
|
1600
|
+
return destination !== void 0 && namesASecretPath(destination, judge);
|
|
1601
|
+
};
|
|
1602
|
+
var formatsADisk = (command) => DISK_ERASERS.has(command.cmdlet);
|
|
1603
|
+
var changesAWindowsService = (command) => {
|
|
1604
|
+
if (WINDOWS_SERVICE_CHANGERS.has(command.cmdlet)) return true;
|
|
1605
|
+
const [verb, ...operands] = command.args.map((arg) => arg.text.toLowerCase()).filter((text) => !text.startsWith(REMOTE_MACHINE_PREFIX));
|
|
1606
|
+
if (command.name === SERVICE_CONTROL_PROGRAM) return SERVICE_CONTROL_VERBS_THAT_CHANGE.has(verb ?? "");
|
|
1607
|
+
return NET_PROGRAMS.has(command.name) && (NET_VERBS_THAT_CHANGE_A_SERVICE.has(verb ?? "") || verb === NET_START && operands.length > 0);
|
|
1608
|
+
};
|
|
1609
|
+
var changesAScheduledTask = (command) => SCHEDULED_TASK_CHANGERS.has(command.cmdlet) || command.name === SCHTASKS_PROGRAM && command.args.some((arg) => SCHTASKS_SWITCHES_THAT_CHANGE.test(arg.text));
|
|
1610
|
+
var powerShellCommandChangesSomething = (command, judge) => judge.invocationShowsAConsequence(posixInvocationOf(command)) || !onlyPreviewsInPowerShell(command) && (writesASecretFileFromPowerShell(command, judge) || formatsADisk(command) || changesAWindowsService(command) || changesAScheduledTask(command));
|
|
1611
|
+
var keywordTextOf = (command) => [command.name, ...[...command.args, ...command.stage.redirectTargets].map((word) => word.text)].join(" ");
|
|
1612
|
+
var stageIsDestructive = (stage, judge) => {
|
|
1613
|
+
const command = powerShellCommandOf(stage);
|
|
1614
|
+
return DOTNET_RECURSIVE_DELETE.test(stage.source) || command !== null && (removesRecursively(command) || !onlyReads(command, judge) && judge.namesADestructiveAction(keywordTextOf(command)));
|
|
1615
|
+
};
|
|
1616
|
+
var stageHasAVisibleConsequence = (stage, judge) => {
|
|
1617
|
+
const command = powerShellCommandOf(stage);
|
|
1618
|
+
return stage.redirectTargets.some((target) => namesASecretPath(target.text, judge)) || command !== null && !onlyReads(command, judge) && powerShellCommandChangesSomething(command, judge);
|
|
1619
|
+
};
|
|
1620
|
+
var fetchesWithPowerShell = (stage, judge) => {
|
|
1621
|
+
const command = powerShellCommandOf(stage);
|
|
1622
|
+
return DOTNET_DOWNLOAD.test(stage.source) || command !== null && (POWERSHELL_FETCHERS.has(command.cmdlet) || judge.fetches(posixInvocationOf(command)));
|
|
1623
|
+
};
|
|
1624
|
+
var runsTextAsCode = (stage, judge) => {
|
|
1625
|
+
const command = powerShellCommandOf(stage);
|
|
1626
|
+
return SCRIPTBLOCK_FROM_TEXT.test(stage.source) || command !== null && (command.cmdlet === INVOKE_EXPRESSION || stage.readsAPipe && judge.runsWhatItReads(posixInvocationOf(command)));
|
|
1627
|
+
};
|
|
1628
|
+
var runsFetchedPowerShellCode = (stages, judge) => stages.some((stage) => fetchesWithPowerShell(stage, judge)) && stages.some((stage) => runsTextAsCode(stage, judge));
|
|
1629
|
+
var downloadedFileNameOf = (text) => fileNameOf(text.replace(URL_QUERY_OR_FRAGMENT, "")).toLowerCase();
|
|
1630
|
+
var downloadedFileNamesOf = (stages, judge) => new Set(stages.filter((stage) => fetchesWithPowerShell(stage, judge)).flatMap((stage) => {
|
|
1631
|
+
const command = powerShellCommandOf(stage);
|
|
1632
|
+
return command === null ? [] : operandTextsOf(command).map(downloadedFileNameOf);
|
|
1633
|
+
}).filter((fileName) => fileName.length > 0));
|
|
1634
|
+
var fileRunBy = (command, judge) => {
|
|
1635
|
+
if (POWERSHELL_HOSTS.has(command.name)) return parameterValueOf(command, FILE_PARAMETER, SHORTEST_PARAMETER_PREFIX);
|
|
1636
|
+
if (POWERSHELL_FILE_RUNNERS.has(command.cmdlet)) {
|
|
1637
|
+
return parameterValueOf(command, FILE_PATH_PARAMETER, SHORTEST_FILE_PATH_PREFIX) ?? firstOperandOf(command, WINDOWS_SWITCH);
|
|
1638
|
+
}
|
|
1639
|
+
return judge.runsScripts(posixProgramWordOf(command)) ? firstOperandOf(command, POSIX_FLAG) : void 0;
|
|
1640
|
+
};
|
|
1641
|
+
var runsADownloadedFile = (stages, judge) => {
|
|
1642
|
+
const downloaded = downloadedFileNamesOf(stages, judge);
|
|
1643
|
+
return downloaded.size > 0 && stages.some((stage) => {
|
|
1644
|
+
const command = powerShellCommandOf(stage);
|
|
1645
|
+
if (command === null || fetchesWithPowerShell(stage, judge)) return false;
|
|
1646
|
+
const file = fileRunBy(command, judge);
|
|
1647
|
+
return downloaded.has(command.fileName) || file !== void 0 && downloaded.has(downloadedFileNameOf(file));
|
|
1648
|
+
});
|
|
1649
|
+
};
|
|
1650
|
+
var invokedExpressionsOf = (command) => command.cmdlet === INVOKE_EXPRESSION ? positionalTextsOf(command) : [];
|
|
1651
|
+
var positionalHostCommandOf = (texts) => {
|
|
1652
|
+
let index = 0;
|
|
1653
|
+
while (index < texts.length && POWERSHELL_HOST_SWITCH.test(texts[index] ?? "")) {
|
|
1654
|
+
index += POWERSHELL_HOST_OPTIONS_WITH_A_VALUE.has((texts[index] ?? "").toLowerCase()) ? 2 : 1;
|
|
1655
|
+
}
|
|
1656
|
+
return index < texts.length ? texts.slice(index).join(" ") : void 0;
|
|
1657
|
+
};
|
|
1658
|
+
var hostedPowerShellScriptOf = (command) => {
|
|
1659
|
+
if (!POWERSHELL_HOSTS.has(command.name)) return void 0;
|
|
1660
|
+
const texts = command.args.map((arg) => arg.text);
|
|
1661
|
+
const lowered = texts.map((text) => text.toLowerCase());
|
|
1662
|
+
const commandSwitch = lowered.findIndex((text) => POWERSHELL_HOST_COMMAND_SWITCHES.has(text));
|
|
1663
|
+
if (commandSwitch !== -1) return texts.slice(commandSwitch + 1).join(" ");
|
|
1664
|
+
if (command.name !== WINDOWS_POWERSHELL_HOST || lowered.some((text) => POWERSHELL_HOST_SWITCHES_THAT_HIDE_THE_COMMAND.has(text))) {
|
|
1665
|
+
return void 0;
|
|
1666
|
+
}
|
|
1667
|
+
return positionalHostCommandOf(texts);
|
|
1668
|
+
};
|
|
1669
|
+
var cmdScriptOf = (command) => {
|
|
1670
|
+
if (command.name !== CMD_PROGRAM) return void 0;
|
|
1671
|
+
const start = command.args.findIndex((arg) => CMD_RUNS_THE_REST.test(arg.text));
|
|
1672
|
+
return start === -1 ? void 0 : command.args.slice(start + 1).map((arg) => arg.text).join(" ");
|
|
1673
|
+
};
|
|
1674
|
+
var cmdPiecesOf = (script) => {
|
|
1675
|
+
const pieces = [];
|
|
1676
|
+
let current = "";
|
|
1677
|
+
let quoted = false;
|
|
1678
|
+
for (let index = 0; index < script.length; index += 1) {
|
|
1679
|
+
const char = script.charAt(index);
|
|
1680
|
+
const separator = quoted ? void 0 : CMD_SEPARATORS.find((candidate) => script.startsWith(candidate, index));
|
|
1681
|
+
if (char === CMD_ESCAPE && !quoted) {
|
|
1682
|
+
current += script.slice(index, index + 2);
|
|
1683
|
+
index += 1;
|
|
1684
|
+
} else if (separator !== void 0) {
|
|
1685
|
+
pieces.push(current);
|
|
1686
|
+
current = "";
|
|
1687
|
+
index += separator.length - 1;
|
|
1688
|
+
} else {
|
|
1689
|
+
quoted = char === CMD_QUOTE ? !quoted : quoted;
|
|
1690
|
+
current += char;
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
return [...pieces, current].map((piece) => piece.trim()).filter((piece) => piece.length > 0);
|
|
1694
|
+
};
|
|
1695
|
+
var namesTheCmdRecurseSwitch = (word) => word.startsWith(CMD_SWITCH_PREFIX) && word.toLowerCase().split(CMD_SWITCH_PREFIX).includes(CMD_RECURSE_SWITCH);
|
|
1696
|
+
var cmdPieceRemovesRecursively = (piece) => {
|
|
1697
|
+
const [program = "", ...args] = piece.replaceAll(CMD_QUOTE, "").split(CMD_WORD_SEPARATOR);
|
|
1698
|
+
return CMD_RECURSIVE_REMOVERS.has(program.toLowerCase()) && args.some(namesTheCmdRecurseSwitch);
|
|
1699
|
+
};
|
|
1700
|
+
var cmdScriptRemovesRecursively = (script) => cmdPiecesOf(script).some(cmdPieceRemovesRecursively);
|
|
1701
|
+
var wslCommandWordsOf = (command) => {
|
|
1702
|
+
if (command.name !== WSL_PROGRAM) return void 0;
|
|
1703
|
+
const texts = command.args.map((arg) => arg.text);
|
|
1704
|
+
let index = 0;
|
|
1705
|
+
while (index < texts.length && POSIX_FLAG.test(texts[index] ?? "")) {
|
|
1706
|
+
const text = texts[index] ?? "";
|
|
1707
|
+
index += WSL_OPTIONS_WITH_A_VALUE.has(text) ? 2 : 1;
|
|
1708
|
+
if (WSL_COMMAND_MARKERS.has(text)) break;
|
|
1709
|
+
}
|
|
1710
|
+
return index < texts.length ? texts.slice(index) : void 0;
|
|
1711
|
+
};
|
|
1712
|
+
var presentOnly = (value) => value === void 0 ? [] : [value];
|
|
1713
|
+
var scriptsInsideTheStage = (stage) => {
|
|
1714
|
+
const groups = [...stage.words, ...stage.redirectTargets].flatMap((word) => word.nested);
|
|
1715
|
+
const command = powerShellCommandOf(stage);
|
|
1716
|
+
if (command === null) return { ...NO_SCRIPTS_INSIDE, powerShell: groups };
|
|
1717
|
+
const cmd = presentOnly(cmdScriptOf(command));
|
|
1718
|
+
return {
|
|
1719
|
+
powerShell: [...groups, ...invokedExpressionsOf(command), ...presentOnly(hostedPowerShellScriptOf(command)), ...cmd.flatMap(cmdPiecesOf)],
|
|
1720
|
+
cmd,
|
|
1721
|
+
posix: presentOnly(wslCommandWordsOf(command))
|
|
1722
|
+
};
|
|
1723
|
+
};
|
|
1724
|
+
var powerShellReadingAt = (command, depth) => {
|
|
1725
|
+
const statements = powerShellStatementsOf(command);
|
|
1726
|
+
if (statements === null) return null;
|
|
1727
|
+
const inside = depth >= MAX_NESTED_SCRIPT_DEPTH ? [] : statements.flatMap((statement) => statement.stages).map(scriptsInsideTheStage);
|
|
1728
|
+
const nested = inside.flatMap((scripts) => scripts.powerShell).map((script) => ({ script, reading: powerShellReadingAt(script, depth + 1) }));
|
|
1729
|
+
const readings = nested.flatMap(({ reading }) => reading === null ? [] : [reading]);
|
|
1730
|
+
return {
|
|
1731
|
+
statements: [...statements, ...readings.flatMap((reading) => reading.statements)],
|
|
1732
|
+
cmdScripts: [...inside.flatMap((scripts) => scripts.cmd), ...readings.flatMap((reading) => reading.cmdScripts)],
|
|
1733
|
+
posixCommands: [...inside.flatMap((scripts) => scripts.posix), ...readings.flatMap((reading) => reading.posixCommands)],
|
|
1734
|
+
unreadScripts: [
|
|
1735
|
+
...nested.flatMap(({ script, reading }) => reading === null ? [script] : []),
|
|
1736
|
+
...readings.flatMap((reading) => reading.unreadScripts)
|
|
1737
|
+
]
|
|
1738
|
+
};
|
|
1739
|
+
};
|
|
1740
|
+
var stagesOfTheReading = (reading) => reading.statements.flatMap((statement) => statement.stages);
|
|
1741
|
+
var powerShellReadingIsDestructive = (reading, judge) => stagesOfTheReading(reading).some((stage) => stageIsDestructive(stage, judge)) || reading.cmdScripts.some(cmdScriptRemovesRecursively) || reading.unreadScripts.some((script) => judge.namesADestructiveAction(script));
|
|
1742
|
+
var powerShellCommandIsDestructive = (command, judge) => {
|
|
1743
|
+
const reading = powerShellReadingAt(command, TOP_LEVEL_SCRIPT);
|
|
1744
|
+
return reading === null ? judge.namesADestructiveAction(command) : powerShellReadingIsDestructive(reading, judge);
|
|
1745
|
+
};
|
|
1746
|
+
var powerShellCommandHasAVisibleConsequence = (command, judge) => {
|
|
1747
|
+
const reading = powerShellReadingAt(command, TOP_LEVEL_SCRIPT);
|
|
1748
|
+
if (reading === null) return judge.namesADestructiveAction(command);
|
|
1749
|
+
const stages = stagesOfTheReading(reading);
|
|
1750
|
+
return powerShellReadingIsDestructive(reading, judge) || stages.some((stage) => stageHasAVisibleConsequence(stage, judge)) || reading.statements.some(listsRecursivelyIntoARemoval) || runsFetchedPowerShellCode(stages, judge) || runsADownloadedFile(stages, judge) || reading.posixCommands.some((words) => judge.commandShowsAConsequence(words));
|
|
1751
|
+
};
|
|
1752
|
+
|
|
1753
|
+
// ../contracts/src/command-analysis/sql-text.ts
|
|
1754
|
+
var UNCERTAIN_SQL = { kind: "uncertain" };
|
|
1755
|
+
var STRING_PLACEHOLDER = "''";
|
|
1756
|
+
var TOKEN_GAP = " ";
|
|
1757
|
+
var STATEMENT_SEPARATOR2 = ";";
|
|
1758
|
+
var SINGLE_QUOTE = "'";
|
|
1759
|
+
var DOUBLE_QUOTE = '"';
|
|
1760
|
+
var BACKTICK = "`";
|
|
1761
|
+
var BACKSLASH = "\\";
|
|
1762
|
+
var DOLLAR = "$";
|
|
1763
|
+
var DASH_DASH = "--";
|
|
1764
|
+
var HASH = "#";
|
|
1765
|
+
var BLOCK_COMMENT_OPEN2 = "/*";
|
|
1766
|
+
var BLOCK_COMMENT_CLOSE2 = "*/";
|
|
1767
|
+
var NEWLINE2 = "\n";
|
|
1768
|
+
var CARRIAGE_RETURN2 = "\r";
|
|
1769
|
+
var TRIPLE_QUOTE_LENGTH = 3;
|
|
1770
|
+
var CLIENT_COMMAND_LENGTH = 2;
|
|
1771
|
+
var UNICODE_ESCAPE_PREFIX = /^[uU]&$/;
|
|
1772
|
+
var ESCAPE_STRING_PREFIX = /^[eE]$/;
|
|
1773
|
+
var EXECUTABLE_COMMENT_OPENER = /^\/\*M?!/;
|
|
1774
|
+
var ASCII_LETTER_OR_UNDERSCORE = /^[A-Za-z_]$/;
|
|
1775
|
+
var DECIMAL_DIGIT = /^[0-9]$/;
|
|
1776
|
+
var DECIMAL_DIGITS = /^[0-9]+$/;
|
|
1777
|
+
var ANY_WHITESPACE = /^\s$/;
|
|
1778
|
+
var STATEMENT_TERMINATOR_CLIENT_COMMAND = /^\\[gG]$/;
|
|
1779
|
+
var SQL_MODE_SETTING = /\bsql_mode\b/i;
|
|
1780
|
+
var FIRST_NON_ASCII = "\x80";
|
|
1781
|
+
var FIRST_NON_ASCII_CODE = 128;
|
|
1782
|
+
var LAST_ASCII_CONTROL_OR_SPACE = 32;
|
|
1783
|
+
var ASCII_DELETE = 127;
|
|
1784
|
+
var MYSQL_WHITESPACE = /* @__PURE__ */ new Set([" ", " ", "\n", "\v", "\f", "\r"]);
|
|
1785
|
+
var ESCAPE_STRING_SYNTAX = { backslashes: "escape", content: "hidden" };
|
|
1786
|
+
var isIdentifierStart = (character) => ASCII_LETTER_OR_UNDERSCORE.test(character) || character >= FIRST_NON_ASCII;
|
|
1787
|
+
var isDecimalDigit = (character) => DECIMAL_DIGIT.test(character);
|
|
1788
|
+
var isWordCharacter = (character) => isIdentifierStart(character) || isDecimalDigit(character);
|
|
1789
|
+
var isIdentifierPart = (character) => isWordCharacter(character) || character === DOLLAR;
|
|
1790
|
+
var isQuote = (character) => character === SINGLE_QUOTE || character === DOUBLE_QUOTE || character === BACKTICK;
|
|
1791
|
+
var isLineCommentTerminator = (character) => character === NEWLINE2 || character === CARRIAGE_RETURN2;
|
|
1792
|
+
var isControlOrSpace = (character) => {
|
|
1793
|
+
const code = character.charCodeAt(0);
|
|
1794
|
+
return code <= LAST_ASCII_CONTROL_OR_SPACE || code === ASCII_DELETE;
|
|
1795
|
+
};
|
|
1796
|
+
var followsNonAsciiText = (source, index) => source.charCodeAt(index - 1) >= FIRST_NON_ASCII_CODE;
|
|
1797
|
+
var mayBeAMultibyteTrailByte = (source, index, lexicon) => lexicon.clientCharsets === "may-be-multibyte" && followsNonAsciiText(source, index);
|
|
1798
|
+
var endOfRun = (source, start, belongs) => {
|
|
1799
|
+
let index = start;
|
|
1800
|
+
while (index < source.length && belongs(source.charAt(index))) index += 1;
|
|
1801
|
+
return index;
|
|
1802
|
+
};
|
|
1803
|
+
var dollarQuoteDelimiterAt = (source, start) => {
|
|
1804
|
+
if (source.charAt(start) !== DOLLAR) return void 0;
|
|
1805
|
+
const tagStart = start + 1;
|
|
1806
|
+
const tagEnd = isIdentifierStart(source.charAt(tagStart)) ? endOfRun(source, tagStart, isWordCharacter) : tagStart;
|
|
1807
|
+
return source.charAt(tagEnd) === DOLLAR ? source.slice(start, tagEnd + 1) : void 0;
|
|
1808
|
+
};
|
|
1809
|
+
var doubledQuoteEnd = (source, from, quote, backslashBeforeTheQuote) => {
|
|
1810
|
+
for (let index = from; index < source.length; index += 1) {
|
|
1811
|
+
if (backslashBeforeTheQuote === "uncertain" && source[index] === BACKSLASH && source[index + 1] === quote) return "uncertain";
|
|
1812
|
+
if (source[index] !== quote) continue;
|
|
1813
|
+
if (source[index + 1] === quote) index += 1;
|
|
1814
|
+
else return index + 1;
|
|
1815
|
+
}
|
|
1816
|
+
return "unterminated";
|
|
1817
|
+
};
|
|
1818
|
+
var escapedQuoteEnd = (source, from, closing, lexicon) => {
|
|
1819
|
+
for (let index = from; index < source.length; ) {
|
|
1820
|
+
if (source[index] === BACKSLASH) {
|
|
1821
|
+
if (mayBeAMultibyteTrailByte(source, index, lexicon)) return "uncertain";
|
|
1822
|
+
index += 2;
|
|
1823
|
+
} else if (!source.startsWith(closing, index)) {
|
|
1824
|
+
index += 1;
|
|
1825
|
+
} else if (closing.length === 1 && source[index + 1] === closing) {
|
|
1826
|
+
index += 2;
|
|
1827
|
+
} else {
|
|
1828
|
+
return index + closing.length;
|
|
1829
|
+
}
|
|
1830
|
+
}
|
|
1831
|
+
return "unterminated";
|
|
1832
|
+
};
|
|
1833
|
+
var blockCommentEnd = (source, start, lexicon) => {
|
|
1834
|
+
let depth = 0;
|
|
1835
|
+
let index = start + BLOCK_COMMENT_OPEN2.length;
|
|
1836
|
+
while (index < source.length) {
|
|
1837
|
+
if (source.startsWith(BLOCK_COMMENT_OPEN2, index)) {
|
|
1838
|
+
if (lexicon.nestedBlockComments === "uncertain") return "uncertain";
|
|
1839
|
+
depth += 1;
|
|
1840
|
+
index += BLOCK_COMMENT_OPEN2.length;
|
|
1841
|
+
} else if (!source.startsWith(BLOCK_COMMENT_CLOSE2, index)) {
|
|
1842
|
+
index += 1;
|
|
1843
|
+
} else if (depth === 0) {
|
|
1844
|
+
return index + BLOCK_COMMENT_CLOSE2.length;
|
|
1845
|
+
} else {
|
|
1846
|
+
depth -= 1;
|
|
1847
|
+
index += BLOCK_COMMENT_CLOSE2.length;
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
return "uncertain";
|
|
1851
|
+
};
|
|
1852
|
+
var opensAnEscapeString = (source, start, lexicon) => lexicon.escapeStringPrefix === "backslash-escapes" && source.charAt(start) === SINGLE_QUOTE && ESCAPE_STRING_PREFIX.test(source.charAt(start - 1)) && !isIdentifierPart(source.charAt(start - 2));
|
|
1853
|
+
var quotedTextSyntaxOf = (quote, lexicon) => {
|
|
1854
|
+
if (quote === SINGLE_QUOTE) return lexicon.singleQuotes;
|
|
1855
|
+
if (quote === DOUBLE_QUOTE) return lexicon.doubleQuotes;
|
|
1856
|
+
return lexicon.backticks;
|
|
1857
|
+
};
|
|
1858
|
+
var syntaxOfQuoteAt = (source, start, lexicon) => opensAnEscapeString(source, start, lexicon) ? ESCAPE_STRING_SYNTAX : quotedTextSyntaxOf(source.charAt(start), lexicon);
|
|
1859
|
+
var openerOfQuoteAt = (source, start, lexicon) => {
|
|
1860
|
+
const triple = source.charAt(start).repeat(TRIPLE_QUOTE_LENGTH);
|
|
1861
|
+
return lexicon.tripleQuotes === "quote" && source.startsWith(triple, start) ? triple : source.charAt(start);
|
|
1862
|
+
};
|
|
1863
|
+
var readsBackslashesLiterally = (syntax, reading) => syntax.backslashes === "escape-unless-the-sql-mode-disables-it" && reading.backslashMode === "literal";
|
|
1864
|
+
var quotedTextEnd = (source, start, opener, syntax, reading) => {
|
|
1865
|
+
const from = start + opener.length;
|
|
1866
|
+
if (opener.length > 1) return escapedQuoteEnd(source, from, opener, reading.lexicon);
|
|
1867
|
+
const end = doubledQuoteEnd(source, from, opener, "uncertain");
|
|
1868
|
+
if (end !== "uncertain" || syntax.backslashes === "uncertain-before-the-quote") return end;
|
|
1869
|
+
return readsBackslashesLiterally(syntax, reading) ? doubledQuoteEnd(source, from, opener, "ordinary") : escapedQuoteEnd(source, from, opener, reading.lexicon);
|
|
1870
|
+
};
|
|
1871
|
+
var opensAUnicodeEscapedQuote = (source, start) => source.charAt(start) !== SINGLE_QUOTE && UNICODE_ESCAPE_PREFIX.test(source.slice(Math.max(0, start - 2), start));
|
|
1872
|
+
var swallowsABacktick = (source, start, end, lexicon) => {
|
|
1873
|
+
if (source.charAt(start) !== BACKTICK) return false;
|
|
1874
|
+
for (let index = start; index !== -1 && index < end; index = source.indexOf(BACKTICK, index + 1)) {
|
|
1875
|
+
if (mayBeAMultibyteTrailByte(source, index, lexicon)) return true;
|
|
1876
|
+
}
|
|
1877
|
+
return false;
|
|
1878
|
+
};
|
|
1879
|
+
var unterminatedTextRunsToTheEnd = (reading) => reading.backslashMode === "literal";
|
|
1880
|
+
var quotedToken = (source, start, reading, inside) => {
|
|
1881
|
+
if (opensAUnicodeEscapedQuote(source, start)) return "uncertain";
|
|
1882
|
+
const syntax = syntaxOfQuoteAt(source, start, reading.lexicon);
|
|
1883
|
+
const opener = openerOfQuoteAt(source, start, reading.lexicon);
|
|
1884
|
+
const end = quotedTextEnd(source, start, opener, syntax, reading);
|
|
1885
|
+
if (end === "uncertain") return "uncertain";
|
|
1886
|
+
if (end === "unterminated") {
|
|
1887
|
+
return unterminatedTextRunsToTheEnd(reading) ? { text: STRING_PLACEHOLDER, end: source.length, insideExecutableComment: inside } : "uncertain";
|
|
1888
|
+
}
|
|
1889
|
+
if (swallowsABacktick(source, start, end, reading.lexicon)) return "uncertain";
|
|
1890
|
+
const quote = source.charAt(start);
|
|
1891
|
+
const text = syntax.content === "hidden" ? STRING_PLACEHOLDER : source.slice(start + opener.length, end - opener.length).replaceAll(quote + quote, quote);
|
|
1892
|
+
return { text, end, insideExecutableComment: inside };
|
|
1893
|
+
};
|
|
1894
|
+
var lineCommentEnd = (source, start, lexicon) => {
|
|
1895
|
+
const terminator = endOfRun(source, start, (character) => !isLineCommentTerminator(character));
|
|
1896
|
+
if (source.charAt(terminator) !== CARRIAGE_RETURN2) return terminator;
|
|
1897
|
+
if (lexicon.carriageReturnInLineComment === "uncertain") return "uncertain";
|
|
1898
|
+
if (lexicon.carriageReturnInLineComment === "ends-the-comment") return terminator;
|
|
1899
|
+
const newline = source.indexOf(NEWLINE2, terminator);
|
|
1900
|
+
return newline === -1 ? source.length : newline;
|
|
1901
|
+
};
|
|
1902
|
+
var lineCommentToken = (source, start, lexicon, inside) => {
|
|
1903
|
+
if (inside) return "uncertain";
|
|
1904
|
+
const end = lineCommentEnd(source, start, lexicon);
|
|
1905
|
+
return end === "uncertain" ? "uncertain" : { text: TOKEN_GAP, end, insideExecutableComment: false };
|
|
1906
|
+
};
|
|
1907
|
+
var dashDashStartsAComment = (next, lexicon) => {
|
|
1908
|
+
if (lexicon.dashDash === "comment" || next === "") return true;
|
|
1909
|
+
if (lexicon.dashDash === "uncertain-before-text") return ANY_WHITESPACE.test(next) || "uncertain";
|
|
1910
|
+
if (MYSQL_WHITESPACE.has(next)) return true;
|
|
1911
|
+
return isControlOrSpace(next) ? "uncertain" : false;
|
|
1912
|
+
};
|
|
1913
|
+
var dashDashToken = (source, start, lexicon, inside) => {
|
|
1914
|
+
const startsAComment = dashDashStartsAComment(source.charAt(start + DASH_DASH.length), lexicon);
|
|
1915
|
+
if (startsAComment === "uncertain") return "uncertain";
|
|
1916
|
+
return startsAComment ? lineCommentToken(source, start, lexicon, inside) : { text: source.charAt(start), end: start + 1, insideExecutableComment: inside };
|
|
1917
|
+
};
|
|
1918
|
+
var hashToken = (source, start, lexicon, inside) => {
|
|
1919
|
+
if (lexicon.hash === "uncertain") return "uncertain";
|
|
1920
|
+
if (lexicon.hash === "comment") return lineCommentToken(source, start, lexicon, inside);
|
|
1921
|
+
return { text: HASH, end: start + 1, insideExecutableComment: inside };
|
|
1922
|
+
};
|
|
1923
|
+
var blockCommentToken = (source, start, lexicon, inside) => {
|
|
1924
|
+
if (inside) return "uncertain";
|
|
1925
|
+
const opener = EXECUTABLE_COMMENT_OPENER.exec(source.slice(start, start + 4))?.[0];
|
|
1926
|
+
if (opener !== void 0 && lexicon.executableComments === "uncertain") return "uncertain";
|
|
1927
|
+
if (opener !== void 0) {
|
|
1928
|
+
return { text: TOKEN_GAP, end: endOfRun(source, start + opener.length, isDecimalDigit), insideExecutableComment: true };
|
|
1929
|
+
}
|
|
1930
|
+
const end = blockCommentEnd(source, start, lexicon);
|
|
1931
|
+
return end === "uncertain" ? "uncertain" : { text: TOKEN_GAP, end, insideExecutableComment: false };
|
|
1932
|
+
};
|
|
1933
|
+
var dollarToken = (source, start, lexicon, inside) => {
|
|
1934
|
+
const delimiter = dollarQuoteDelimiterAt(source, start);
|
|
1935
|
+
if (delimiter === void 0) return { text: DOLLAR, end: start + 1, insideExecutableComment: inside };
|
|
1936
|
+
if (lexicon.dollarQuotes === "uncertain") return "uncertain";
|
|
1937
|
+
const close = source.indexOf(delimiter, start + delimiter.length);
|
|
1938
|
+
return close === -1 ? "uncertain" : { text: delimiter + delimiter, end: close + delimiter.length, insideExecutableComment: inside };
|
|
1939
|
+
};
|
|
1940
|
+
var numberToken = (source, start, inside) => {
|
|
1941
|
+
const end = endOfRun(source, start, isWordCharacter);
|
|
1942
|
+
const text = source.slice(start, end);
|
|
1943
|
+
if (!DECIMAL_DIGITS.test(text) && dollarQuoteDelimiterAt(source, end) !== void 0) return "uncertain";
|
|
1944
|
+
return { text, end, insideExecutableComment: inside };
|
|
1945
|
+
};
|
|
1946
|
+
var identifierToken = (source, start, inside) => {
|
|
1947
|
+
const end = endOfRun(source, start, isIdentifierPart);
|
|
1948
|
+
return { text: source.slice(start, end), end, insideExecutableComment: inside };
|
|
1949
|
+
};
|
|
1950
|
+
var clientCommandToken = (source, start, inside) => {
|
|
1951
|
+
const command = source.slice(start, start + CLIENT_COMMAND_LENGTH);
|
|
1952
|
+
return STATEMENT_TERMINATOR_CLIENT_COMMAND.test(command) ? { text: STATEMENT_SEPARATOR2, end: start + CLIENT_COMMAND_LENGTH, insideExecutableComment: inside } : "uncertain";
|
|
1953
|
+
};
|
|
1954
|
+
var nextSqlToken = (source, start, reading, inside) => {
|
|
1955
|
+
const { lexicon } = reading;
|
|
1956
|
+
const character = source.charAt(start);
|
|
1957
|
+
if (isQuote(character)) return quotedToken(source, start, reading, inside);
|
|
1958
|
+
if (source.startsWith(DASH_DASH, start)) return dashDashToken(source, start, lexicon, inside);
|
|
1959
|
+
if (character === HASH) return hashToken(source, start, lexicon, inside);
|
|
1960
|
+
if (source.startsWith(BLOCK_COMMENT_OPEN2, start)) return blockCommentToken(source, start, lexicon, inside);
|
|
1961
|
+
if (inside && source.startsWith(BLOCK_COMMENT_CLOSE2, start)) {
|
|
1962
|
+
return { text: TOKEN_GAP, end: start + BLOCK_COMMENT_CLOSE2.length, insideExecutableComment: false };
|
|
1963
|
+
}
|
|
1964
|
+
if (character === BACKSLASH && lexicon.backslashOutsideLiterals === "client-command") return clientCommandToken(source, start, inside);
|
|
1965
|
+
if (character === DOLLAR) return dollarToken(source, start, lexicon, inside);
|
|
1966
|
+
if (isIdentifierStart(character)) return identifierToken(source, start, inside);
|
|
1967
|
+
if (isDecimalDigit(character)) return numberToken(source, start, inside);
|
|
1968
|
+
return { text: character, end: start + 1, insideExecutableComment: inside };
|
|
1969
|
+
};
|
|
1970
|
+
var readsABackslashTheSqlModeDecides = (source, start, end, lexicon) => isQuote(source.charAt(start)) && syntaxOfQuoteAt(source, start, lexicon).backslashes === "escape-unless-the-sql-mode-disables-it" && source.slice(start, end).includes(BACKSLASH);
|
|
1971
|
+
var sqlReadingOf = (source, reading) => {
|
|
1972
|
+
const pieces = [];
|
|
1973
|
+
let inside = false;
|
|
1974
|
+
let backslashModeMatters = false;
|
|
1975
|
+
for (let index = 0; index < source.length; ) {
|
|
1976
|
+
const token = nextSqlToken(source, index, reading, inside);
|
|
1977
|
+
if (token === "uncertain") return "uncertain";
|
|
1978
|
+
backslashModeMatters ||= readsABackslashTheSqlModeDecides(source, index, token.end, reading.lexicon);
|
|
1979
|
+
pieces.push(token.text);
|
|
1980
|
+
inside = token.insideExecutableComment;
|
|
1981
|
+
index = token.end;
|
|
1982
|
+
}
|
|
1983
|
+
return inside ? "uncertain" : { text: pieces.join(""), backslashModeMatters };
|
|
1984
|
+
};
|
|
1985
|
+
var sqlModeDecidesBackslashes = (lexicon) => [lexicon.singleQuotes, lexicon.doubleQuotes, lexicon.backticks].some((syntax) => syntax.backslashes === "escape-unless-the-sql-mode-disables-it");
|
|
1986
|
+
var backslashModesOf = (lexicon) => sqlModeDecidesBackslashes(lexicon) ? ["escape", "literal"] : ["escape"];
|
|
1987
|
+
var isReadingText = (result) => result !== "uncertain";
|
|
1988
|
+
var mayChangeTheBackslashMode = (readings) => readings.some((reading) => reading.backslashModeMatters) && readings.some((reading) => SQL_MODE_SETTING.test(reading.text));
|
|
1989
|
+
var sqlOutsideLiterals = (source, lexicon) => {
|
|
1990
|
+
const results = backslashModesOf(lexicon).map((backslashMode) => sqlReadingOf(source, { lexicon, backslashMode }));
|
|
1991
|
+
const readings = results.filter(isReadingText);
|
|
1992
|
+
if (readings.length < results.length || mayChangeTheBackslashMode(readings)) return UNCERTAIN_SQL;
|
|
1993
|
+
return { kind: "readable", texts: [...new Set(readings.map((reading) => reading.text))] };
|
|
1994
|
+
};
|
|
1995
|
+
|
|
1996
|
+
// ../contracts/src/command-analysis/env-invocation.ts
|
|
1997
|
+
var GNU_ENV = {
|
|
1998
|
+
shortOptions: { switches: /* @__PURE__ */ new Set(["i", "v", "0"]), withAValue: /* @__PURE__ */ new Set(["a", "C", "S", "u"]) },
|
|
1999
|
+
longOptions: [
|
|
2000
|
+
{ name: "argv0", argument: "required", effect: "continues" },
|
|
2001
|
+
{ name: "ignore-environment", argument: "none", effect: "continues" },
|
|
2002
|
+
{ name: "null", argument: "none", effect: "continues" },
|
|
2003
|
+
{ name: "unset", argument: "required", effect: "continues" },
|
|
2004
|
+
{ name: "chdir", argument: "required", effect: "continues" },
|
|
2005
|
+
{ name: "default-signal", argument: "optional", effect: "continues" },
|
|
2006
|
+
{ name: "ignore-signal", argument: "optional", effect: "continues" },
|
|
2007
|
+
{ name: "block-signal", argument: "optional", effect: "continues" },
|
|
2008
|
+
{ name: "list-signal-handling", argument: "none", effect: "continues" },
|
|
2009
|
+
{ name: "debug", argument: "none", effect: "continues" },
|
|
2010
|
+
{ name: "split-string", argument: "required", effect: "splits" },
|
|
2011
|
+
{ name: "help", argument: "none", effect: "exits" },
|
|
2012
|
+
{ name: "version", argument: "none", effect: "exits" }
|
|
2013
|
+
]
|
|
2014
|
+
};
|
|
2015
|
+
var BSD_ENV = {
|
|
2016
|
+
shortOptions: { switches: /* @__PURE__ */ new Set(["-", "i", "v", "0"]), withAValue: /* @__PURE__ */ new Set(["C", "L", "P", "S", "U", "u"]) },
|
|
2017
|
+
longOptions: null
|
|
2018
|
+
};
|
|
2019
|
+
var ENV_FLAVORS = [GNU_ENV, BSD_ENV];
|
|
2020
|
+
var UNREADABLE = { kind: "unreadable" };
|
|
2021
|
+
var RUNS_NOTHING = { kind: "runs-nothing" };
|
|
2022
|
+
var EXITS = { kind: "exits" };
|
|
2023
|
+
var SPLIT_STRING_LETTER = "S";
|
|
2024
|
+
var END_OF_OPTIONS = "--";
|
|
2025
|
+
var LONE_DASH = "-";
|
|
2026
|
+
var OPTION_PREFIX = "-";
|
|
2027
|
+
var NO_CLUSTER = "";
|
|
2028
|
+
var LONG_OPTION_PREFIX = "--";
|
|
2029
|
+
var ASSIGNMENT_SEPARATOR = "=";
|
|
2030
|
+
var nextOption = (next) => ({ kind: "next", next });
|
|
2031
|
+
var finished = (reading) => ({ kind: "done", reading });
|
|
2032
|
+
var commandAfterOptions = (args, firstOperand) => {
|
|
2033
|
+
let start = args[firstOperand]?.text === LONE_DASH ? firstOperand + 1 : firstOperand;
|
|
2034
|
+
while (args[start]?.text.includes(ASSIGNMENT_SEPARATOR)) start += 1;
|
|
2035
|
+
return { kind: "command", start };
|
|
2036
|
+
};
|
|
2037
|
+
var splitReading = (args, index, clusterBefore, attached) => {
|
|
2038
|
+
const word = args[index];
|
|
2039
|
+
const prefix = [...args.slice(0, index).map((arg) => arg.text), ...clusterBefore.length > 1 ? [clusterBefore] : []];
|
|
2040
|
+
if (word !== void 0 && attached !== void 0) return { kind: "split", prefix, value: { ...word, text: attached }, rest: index + 1 };
|
|
2041
|
+
return { kind: "split", prefix, value: args[index + 1], rest: index + 2 };
|
|
2042
|
+
};
|
|
2043
|
+
var requiredValueStep = (args, index) => index + 1 < args.length ? nextOption(index + 2) : finished(EXITS);
|
|
2044
|
+
var shortOptionStep = (args, index, text, options) => {
|
|
2045
|
+
for (let position = 1; position < text.length; position += 1) {
|
|
2046
|
+
const letter = text.charAt(position);
|
|
2047
|
+
if (options.switches.has(letter)) continue;
|
|
2048
|
+
if (!options.withAValue.has(letter)) return finished(EXITS);
|
|
2049
|
+
const attached = text.slice(position + 1);
|
|
2050
|
+
if (letter === SPLIT_STRING_LETTER) return finished(splitReading(args, index, text.slice(0, position), attached === "" ? void 0 : attached));
|
|
2051
|
+
return attached === "" ? requiredValueStep(args, index) : nextOption(index + 1);
|
|
2052
|
+
}
|
|
2053
|
+
return nextOption(index + 1);
|
|
2054
|
+
};
|
|
2055
|
+
var gnuLongOptionAbbreviatedBy = (name, options) => {
|
|
2056
|
+
const exact = options.find((option) => option.name === name);
|
|
2057
|
+
if (exact !== void 0) return exact;
|
|
2058
|
+
const candidates = options.filter((option) => option.name.startsWith(name));
|
|
2059
|
+
return candidates.length === 1 ? candidates[0] : void 0;
|
|
2060
|
+
};
|
|
2061
|
+
var longOptionStep = (args, index, text, options) => {
|
|
2062
|
+
const body = text.slice(LONG_OPTION_PREFIX.length);
|
|
2063
|
+
const separator = body.indexOf(ASSIGNMENT_SEPARATOR);
|
|
2064
|
+
const attached = separator === -1 ? void 0 : body.slice(separator + 1);
|
|
2065
|
+
const option = gnuLongOptionAbbreviatedBy(separator === -1 ? body : body.slice(0, separator), options);
|
|
2066
|
+
if (option === void 0) return finished(UNREADABLE);
|
|
2067
|
+
if (option.effect === "exits" || option.argument === "none" && attached !== void 0) return finished(EXITS);
|
|
2068
|
+
if (option.effect === "splits") return finished(splitReading(args, index, NO_CLUSTER, attached));
|
|
2069
|
+
return option.argument === "required" && attached === void 0 ? requiredValueStep(args, index) : nextOption(index + 1);
|
|
2070
|
+
};
|
|
2071
|
+
var optionStep = (args, index, word, flavor) => {
|
|
2072
|
+
if (word.expands) return finished(UNREADABLE);
|
|
2073
|
+
if (flavor.longOptions !== null && word.text.startsWith(LONG_OPTION_PREFIX)) return longOptionStep(args, index, word.text, flavor.longOptions);
|
|
2074
|
+
return shortOptionStep(args, index, word.text, flavor.shortOptions);
|
|
2075
|
+
};
|
|
2076
|
+
var flavorReadingOf = (args, flavor) => {
|
|
2077
|
+
for (let index = 0; index < args.length; ) {
|
|
2078
|
+
const word = args[index];
|
|
2079
|
+
if (word === void 0) break;
|
|
2080
|
+
if (word.text === END_OF_OPTIONS) return commandAfterOptions(args, index + 1);
|
|
2081
|
+
if (word.text === LONE_DASH || !word.text.startsWith(OPTION_PREFIX)) return commandAfterOptions(args, index);
|
|
2082
|
+
const step = optionStep(args, index, word, flavor);
|
|
2083
|
+
if (step.kind === "done") return step.reading;
|
|
2084
|
+
index = step.next;
|
|
2085
|
+
}
|
|
2086
|
+
return commandAfterOptions(args, args.length);
|
|
2087
|
+
};
|
|
2088
|
+
var runsSomething = (reading) => reading.kind === "command" || reading.kind === "split";
|
|
2089
|
+
var sameEnvReading = (left, right) => {
|
|
2090
|
+
if (left.kind === "command" && right.kind === "command") return left.start === right.start;
|
|
2091
|
+
if (left.kind !== "split" || right.kind !== "split") return false;
|
|
2092
|
+
return left.rest === right.rest && left.prefix.length === right.prefix.length && left.prefix.every((text, position) => text === right.prefix[position]) && left.value?.text === right.value?.text && left.value?.expands === right.value?.expands;
|
|
2093
|
+
};
|
|
2094
|
+
var envReadingOf = (args) => {
|
|
2095
|
+
const readings = ENV_FLAVORS.map((flavor) => flavorReadingOf(args, flavor));
|
|
2096
|
+
if (readings.some((reading) => reading.kind === "unreadable")) return UNREADABLE;
|
|
2097
|
+
const running = readings.filter(runsSomething);
|
|
2098
|
+
const [first, ...others] = running;
|
|
2099
|
+
if (first === void 0) return RUNS_NOTHING;
|
|
2100
|
+
return others.every((other) => sameEnvReading(first, other)) ? first : { kind: "ambiguous", readings: running };
|
|
2101
|
+
};
|
|
2102
|
+
|
|
2103
|
+
// ../contracts/src/command-analysis/shell-command-string.ts
|
|
2104
|
+
var NO_LETTERS = /* @__PURE__ */ new Set();
|
|
2105
|
+
var BASH_OPTIONS = {
|
|
2106
|
+
lettersWithAValue: /* @__PURE__ */ new Set(["o", "O"]),
|
|
2107
|
+
lettersThatEndOptions: NO_LETTERS,
|
|
2108
|
+
leadingLongOptionsWithAValue: /* @__PURE__ */ new Set(["--rcfile", "--init-file", "-rcfile", "-init-file"])
|
|
2109
|
+
};
|
|
2110
|
+
var SHELL_OPTION_SYNTAX = /* @__PURE__ */ new Map([
|
|
2111
|
+
["sh", BASH_OPTIONS],
|
|
2112
|
+
["bash", BASH_OPTIONS],
|
|
2113
|
+
["zsh", { lettersWithAValue: /* @__PURE__ */ new Set(["o"]), lettersThatEndOptions: /* @__PURE__ */ new Set(["b"]), leadingLongOptionsWithAValue: NO_LETTERS }],
|
|
2114
|
+
["dash", { lettersWithAValue: /* @__PURE__ */ new Set(["o"]), lettersThatEndOptions: NO_LETTERS, leadingLongOptionsWithAValue: NO_LETTERS }],
|
|
2115
|
+
["ksh", { lettersWithAValue: /* @__PURE__ */ new Set(["o", "R"]), lettersThatEndOptions: NO_LETTERS, leadingLongOptionsWithAValue: NO_LETTERS }]
|
|
2116
|
+
]);
|
|
2117
|
+
var POSIX_SHELL_PROGRAMS = new Set(SHELL_OPTION_SYNTAX.keys());
|
|
2118
|
+
var ABSENT = { kind: "absent" };
|
|
2119
|
+
var UNREADABLE2 = { kind: "unreadable" };
|
|
2120
|
+
var COMMAND_STRING_LETTER = "c";
|
|
2121
|
+
var END_OF_OPTIONS2 = "--";
|
|
2122
|
+
var LONE_DASH2 = "-";
|
|
2123
|
+
var LONG_OPTION_PREFIX2 = "--";
|
|
2124
|
+
var SHORT_OPTION_CLUSTER = /^[-+][A-Za-z]*$/;
|
|
2125
|
+
var COMMAND_STRING_CLUSTER = /^[-+][A-Za-z]*c[A-Za-z]*$/;
|
|
2126
|
+
var clusterReadingOf = (cluster, syntax) => {
|
|
2127
|
+
const letters = cluster.slice(1);
|
|
2128
|
+
const valueLetter = [...letters].findIndex((letter) => syntax.lettersWithAValue.has(letter));
|
|
2129
|
+
if (valueLetter !== -1 && valueLetter !== letters.length - 1) return null;
|
|
2130
|
+
return {
|
|
2131
|
+
runsACommandString: letters.includes(COMMAND_STRING_LETTER),
|
|
2132
|
+
takesAValue: valueLetter !== -1,
|
|
2133
|
+
endsOptions: [...letters].some((letter) => syntax.lettersThatEndOptions.has(letter))
|
|
2134
|
+
};
|
|
2135
|
+
};
|
|
2136
|
+
var endsOptionParsing = (text) => text === END_OF_OPTIONS2 || text === LONE_DASH2;
|
|
2137
|
+
var isAnOperand = (text) => !text.startsWith("-") && !text.startsWith("+");
|
|
2138
|
+
var optionValueIsUnreadable = (value) => value === void 0 || value.expands;
|
|
2139
|
+
var shellCommandStringOf = (shell, args) => {
|
|
2140
|
+
const syntax = SHELL_OPTION_SYNTAX.get(shell);
|
|
2141
|
+
if (syntax === void 0 || !args.some((arg) => COMMAND_STRING_CLUSTER.test(arg.text))) return ABSENT;
|
|
2142
|
+
let runsACommandString = false;
|
|
2143
|
+
let seenAShortOption = false;
|
|
2144
|
+
let index = 0;
|
|
2145
|
+
while (index < args.length) {
|
|
2146
|
+
const word = args[index];
|
|
2147
|
+
if (word === void 0 || word.expands) return UNREADABLE2;
|
|
2148
|
+
if (endsOptionParsing(word.text)) {
|
|
2149
|
+
index += 1;
|
|
2150
|
+
break;
|
|
2151
|
+
}
|
|
2152
|
+
if (isAnOperand(word.text)) break;
|
|
2153
|
+
if (!seenAShortOption && syntax.leadingLongOptionsWithAValue.has(word.text)) {
|
|
2154
|
+
if (optionValueIsUnreadable(args[index + 1])) return UNREADABLE2;
|
|
2155
|
+
index += 2;
|
|
2156
|
+
continue;
|
|
2157
|
+
}
|
|
2158
|
+
if (word.text.startsWith(LONG_OPTION_PREFIX2)) {
|
|
2159
|
+
index += 1;
|
|
2160
|
+
continue;
|
|
2161
|
+
}
|
|
2162
|
+
const cluster = SHORT_OPTION_CLUSTER.test(word.text) ? clusterReadingOf(word.text, syntax) : null;
|
|
2163
|
+
if (cluster === null) return UNREADABLE2;
|
|
2164
|
+
if (cluster.takesAValue && optionValueIsUnreadable(args[index + 1])) return UNREADABLE2;
|
|
2165
|
+
seenAShortOption = true;
|
|
2166
|
+
runsACommandString ||= cluster.runsACommandString;
|
|
2167
|
+
index += cluster.takesAValue ? 2 : 1;
|
|
2168
|
+
if (cluster.endsOptions) break;
|
|
2169
|
+
}
|
|
2170
|
+
if (!runsACommandString) return ABSENT;
|
|
2171
|
+
const operand = args[index];
|
|
2172
|
+
return operand === void 0 || operand.expands ? UNREADABLE2 : { kind: "readable", script: operand.text };
|
|
2173
|
+
};
|
|
2174
|
+
|
|
928
2175
|
// ../contracts/src/degraded.ts
|
|
929
2176
|
var DEGRADED_PREFIX = "[degraded]";
|
|
930
2177
|
var degradedPayload = (subsystem, report) => ({
|
|
@@ -937,37 +2184,6 @@ var degradedPayload = (subsystem, report) => ({
|
|
|
937
2184
|
});
|
|
938
2185
|
var degradedLine = (subsystem, report) => `${DEGRADED_PREFIX} ${JSON.stringify(degradedPayload(subsystem, report))}`;
|
|
939
2186
|
|
|
940
|
-
// ../contracts/src/setup-wire.ts
|
|
941
|
-
var PAIR_TTL_SECONDS = 900;
|
|
942
|
-
var computerOsOfPlatform = (platform) => {
|
|
943
|
-
switch (platform) {
|
|
944
|
-
case "darwin":
|
|
945
|
-
return "mac";
|
|
946
|
-
case "win32":
|
|
947
|
-
return "windows";
|
|
948
|
-
case "linux":
|
|
949
|
-
return "linux";
|
|
950
|
-
default:
|
|
951
|
-
return null;
|
|
952
|
-
}
|
|
953
|
-
};
|
|
954
|
-
var SETUP_AGENT_CHOICES = [
|
|
955
|
-
"claude_code",
|
|
956
|
-
"codex",
|
|
957
|
-
"gemini_cli",
|
|
958
|
-
"hermes",
|
|
959
|
-
"cursor",
|
|
960
|
-
"vscode",
|
|
961
|
-
"opencode",
|
|
962
|
-
"fx",
|
|
963
|
-
...COMPATIBLE_AGENT_TYPES,
|
|
964
|
-
"custom"
|
|
965
|
-
];
|
|
966
|
-
var isComputerAgent = (agent) => agent !== "custom";
|
|
967
|
-
var NO_PAIRING_COMPUTER = { computerName: null, os: null, agents: null };
|
|
968
|
-
var SETUP_CONNECT_MODES = ["app", "browser", "web", "none"];
|
|
969
|
-
var isSetupConnectMode = (value) => typeof value === "string" && SETUP_CONNECT_MODES.includes(value);
|
|
970
|
-
|
|
971
2187
|
// ../contracts/src/observability.ts
|
|
972
2188
|
var CLIENT_CONTEXT_HEADERS = {
|
|
973
2189
|
surface: "x-pushary-surface",
|
|
@@ -1015,6 +2231,37 @@ var AUTH_REJECTION_REASONS = [
|
|
|
1015
2231
|
...AGENT_SITE_REJECTION_REASONS
|
|
1016
2232
|
];
|
|
1017
2233
|
|
|
2234
|
+
// ../contracts/src/setup-wire.ts
|
|
2235
|
+
var PAIR_TTL_SECONDS = 900;
|
|
2236
|
+
var computerOsOfPlatform = (platform) => {
|
|
2237
|
+
switch (platform) {
|
|
2238
|
+
case "darwin":
|
|
2239
|
+
return "mac";
|
|
2240
|
+
case "win32":
|
|
2241
|
+
return "windows";
|
|
2242
|
+
case "linux":
|
|
2243
|
+
return "linux";
|
|
2244
|
+
default:
|
|
2245
|
+
return null;
|
|
2246
|
+
}
|
|
2247
|
+
};
|
|
2248
|
+
var SETUP_AGENT_CHOICES = [
|
|
2249
|
+
"claude_code",
|
|
2250
|
+
"codex",
|
|
2251
|
+
"gemini_cli",
|
|
2252
|
+
"hermes",
|
|
2253
|
+
"cursor",
|
|
2254
|
+
"vscode",
|
|
2255
|
+
"opencode",
|
|
2256
|
+
"fx",
|
|
2257
|
+
...COMPATIBLE_AGENT_TYPES,
|
|
2258
|
+
"custom"
|
|
2259
|
+
];
|
|
2260
|
+
var isComputerAgent = (agent) => agent !== "custom";
|
|
2261
|
+
var NO_PAIRING_COMPUTER = { computerName: null, os: null, agents: null };
|
|
2262
|
+
var SETUP_CONNECT_MODES = ["app", "browser", "web", "none"];
|
|
2263
|
+
var isSetupConnectMode = (value) => typeof value === "string" && SETUP_CONNECT_MODES.includes(value);
|
|
2264
|
+
|
|
1018
2265
|
// ../contracts/src/declined-agents.ts
|
|
1019
2266
|
var DECLINED_AGENTS_FILE = "declined-agents.json";
|
|
1020
2267
|
var DECLINED_AGENTS_VERSION = 1;
|
|
@@ -1340,12 +2587,17 @@ var rankWholeOrSegments = (toolName, arg, intent, matches) => {
|
|
|
1340
2587
|
const matched = toolName in POLICY_COMMAND_KEYS ? shellSegmentsMatch(arg, intent, matches) : matches(arg);
|
|
1341
2588
|
return matched ? "prefix" : "none";
|
|
1342
2589
|
};
|
|
2590
|
+
var argumentOpenIndex = (pattern) => pattern.endsWith(")") ? pattern.indexOf("(") : -1;
|
|
2591
|
+
var patternToolName = (pattern) => {
|
|
2592
|
+
const open = argumentOpenIndex(pattern);
|
|
2593
|
+
return open === -1 ? pattern : pattern.slice(0, open);
|
|
2594
|
+
};
|
|
1343
2595
|
var matchToolPattern = (pattern, toolName, arg, intent = PATTERN_INTENT.grant) => {
|
|
1344
|
-
const open = pattern
|
|
1345
|
-
if (open === -1
|
|
2596
|
+
const open = argumentOpenIndex(pattern);
|
|
2597
|
+
if (open === -1) {
|
|
1346
2598
|
return pattern === toolName ? "tool" : "none";
|
|
1347
2599
|
}
|
|
1348
|
-
if (pattern
|
|
2600
|
+
if (patternToolName(pattern) !== toolName || arg === void 0) return "none";
|
|
1349
2601
|
const inner = pattern.slice(open + 1, -1);
|
|
1350
2602
|
if (inner.endsWith(":*")) {
|
|
1351
2603
|
const prefix = inner.slice(0, -2);
|
|
@@ -1367,11 +2619,9 @@ var POLICY_PATH_KEYS = {
|
|
|
1367
2619
|
NotebookEdit: "notebook_path",
|
|
1368
2620
|
LS: "path"
|
|
1369
2621
|
};
|
|
1370
|
-
var POLICY_COMMAND_KEYS =
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
Monitor: "command"
|
|
1374
|
-
};
|
|
2622
|
+
var POLICY_COMMAND_KEYS = Object.fromEntries(
|
|
2623
|
+
[...SHELL_DIALECT_BY_TOOL.keys()].map((toolName) => [toolName, "command"])
|
|
2624
|
+
);
|
|
1375
2625
|
var POLICY_ARG_KEYS = { ...POLICY_COMMAND_KEYS, ...POLICY_PATH_KEYS };
|
|
1376
2626
|
var extractPolicyArg = (toolName, toolInput) => {
|
|
1377
2627
|
const key = POLICY_ARG_KEYS[toolName];
|
|
@@ -1630,7 +2880,7 @@ var uniqFileOperandCount = (args) => {
|
|
|
1630
2880
|
if (optionsEnded || !isFlagToken(arg) || arg === STDIN_OPERAND) {
|
|
1631
2881
|
operands += 1;
|
|
1632
2882
|
optionsEnded = true;
|
|
1633
|
-
} else if (arg ===
|
|
2883
|
+
} else if (arg === END_OF_OPTIONS3) {
|
|
1634
2884
|
optionsEnded = true;
|
|
1635
2885
|
} else if (UNIQ_OPTIONS_WITH_A_SEPARATE_VALUE.includes(arg)) {
|
|
1636
2886
|
index += 1;
|
|
@@ -1639,7 +2889,7 @@ var uniqFileOperandCount = (args) => {
|
|
|
1639
2889
|
return operands;
|
|
1640
2890
|
};
|
|
1641
2891
|
var STDIN_OPERAND = "-";
|
|
1642
|
-
var
|
|
2892
|
+
var LONG_OPTION_PREFIX3 = "--";
|
|
1643
2893
|
var OPTION_VALUE_SEPARATOR = "=";
|
|
1644
2894
|
var longOptionName = (token) => token.split(OPTION_VALUE_SEPARATOR, 1)[0] ?? token;
|
|
1645
2895
|
var abbreviatesALongOption = (token, longOptions) => {
|
|
@@ -1648,8 +2898,8 @@ var abbreviatesALongOption = (token, longOptions) => {
|
|
|
1648
2898
|
};
|
|
1649
2899
|
var clustersAShortOption = (token, shortOptions) => shortOptions.some((option) => token.slice(1).includes(option.slice(1)));
|
|
1650
2900
|
var isRefusedOption = (token, options) => {
|
|
1651
|
-
if (token ===
|
|
1652
|
-
return token.startsWith(
|
|
2901
|
+
if (token === END_OF_OPTIONS3 || !isFlagToken(token)) return false;
|
|
2902
|
+
return token.startsWith(LONG_OPTION_PREFIX3) ? abbreviatesALongOption(token, options.long) : clustersAShortOption(token, options.short);
|
|
1653
2903
|
};
|
|
1654
2904
|
var carriesNoRefusedOption = (args, options) => !args.some((arg) => isRefusedOption(arg, options));
|
|
1655
2905
|
var SED_PRINT_ONLY_SCRIPT = /^(?:\d+|\$)(?:,(?:\d+|\$))?p$/;
|
|
@@ -1662,8 +2912,8 @@ var isReadOnlyDate = (args) => args.every((arg) => arg.startsWith(DATE_FORMAT_PR
|
|
|
1662
2912
|
var PRINTF_TEXT_CONVERSION = /%(?:%|[-+ #0]*\d*(?:\.\d*)?[bcqs])/g;
|
|
1663
2913
|
var PRINTF_CONVERSION_START = "%";
|
|
1664
2914
|
var ARITHMETIC_SAFE_NUMBER = /^[-+]?(?:0[xX][0-9a-fA-F]+|\d+(?:\.\d+)?)$/;
|
|
1665
|
-
var printfAssignsNothing = (args) => args[0] ===
|
|
1666
|
-
var printfOperands = (args) => args[0] ===
|
|
2915
|
+
var printfAssignsNothing = (args) => args[0] === END_OF_OPTIONS3 || !isFlagToken(args[0] ?? "");
|
|
2916
|
+
var printfOperands = (args) => args[0] === END_OF_OPTIONS3 ? args.slice(1) : args;
|
|
1667
2917
|
var convertsArgumentsOnlyAsText = (format) => !format.replace(PRINTF_TEXT_CONVERSION, "").includes(PRINTF_CONVERSION_START);
|
|
1668
2918
|
var printfNeverEvaluatesAnArgument = ([format = "", ...values]) => convertsArgumentsOnlyAsText(format) || values.every((value) => ARITHMETIC_SAFE_NUMBER.test(value));
|
|
1669
2919
|
var isOutputOnlyPrintf = (args) => printfAssignsNothing(args) && printfNeverEvaluatesAnArgument(printfOperands(args));
|
|
@@ -1935,7 +3185,7 @@ var SHELL_RESERVED_WORDS = /* @__PURE__ */ new Set([
|
|
|
1935
3185
|
"]]"
|
|
1936
3186
|
]);
|
|
1937
3187
|
var HARMLESS_GLOBAL_FLAGS = /* @__PURE__ */ new Set(["--no-pager", "--version", "-v", "-V", "--help", "-h"]);
|
|
1938
|
-
var
|
|
3188
|
+
var END_OF_OPTIONS3 = "--";
|
|
1939
3189
|
var SUBCOMMAND_DEPTH = 3;
|
|
1940
3190
|
var SHELL_LINE_CONTINUATION = /\\\n/g;
|
|
1941
3191
|
var invocationOf = (segment) => {
|
|
@@ -1947,13 +3197,13 @@ var argsAfterHarmlessGlobalFlags = (args) => {
|
|
|
1947
3197
|
return firstMeaningful === -1 ? [] : args.slice(firstMeaningful);
|
|
1948
3198
|
};
|
|
1949
3199
|
var subcommandWordsOf = (args) => {
|
|
1950
|
-
const endOfOptions = args.findIndex((arg) => arg.text ===
|
|
3200
|
+
const endOfOptions = args.findIndex((arg) => arg.text === END_OF_OPTIONS3);
|
|
1951
3201
|
const options = endOfOptions === -1 ? args : args.slice(0, endOfOptions);
|
|
1952
3202
|
return options.filter((arg) => !arg.text.startsWith("-")).slice(0, SUBCOMMAND_DEPTH);
|
|
1953
3203
|
};
|
|
1954
3204
|
var passesInlineCode = (arg) => {
|
|
1955
3205
|
if (arg === INLINE_CODE_SUBCOMMAND || arg === STANDARD_INPUT_ARGUMENT || INLINE_CODE_LONG_FLAG.test(arg)) return true;
|
|
1956
|
-
if (arg.startsWith(
|
|
3206
|
+
if (arg.startsWith(END_OF_OPTIONS3)) return false;
|
|
1957
3207
|
const cluster = SHORT_FLAG_CLUSTER.exec(arg)?.[1] ?? "";
|
|
1958
3208
|
return [...cluster].some((letter) => INLINE_CODE_SHORT_FLAG_LETTERS.has(letter));
|
|
1959
3209
|
};
|
|
@@ -1981,9 +3231,9 @@ var invocationTextWith = ({ program, args }, wordText) => {
|
|
|
1981
3231
|
};
|
|
1982
3232
|
var normalizedInvocation = (invocation) => invocationTextWith(invocation, (word) => word.text);
|
|
1983
3233
|
var SHELL_METACHARACTER = /[\s;&|<>()$`\\"'*?[\]#~{}!]/;
|
|
1984
|
-
var
|
|
3234
|
+
var SINGLE_QUOTE2 = "'";
|
|
1985
3235
|
var ESCAPED_SINGLE_QUOTE = `'\\''`;
|
|
1986
|
-
var asOneShellWord = (text) => SHELL_METACHARACTER.test(text) ? `${
|
|
3236
|
+
var asOneShellWord = (text) => SHELL_METACHARACTER.test(text) ? `${SINGLE_QUOTE2}${text.replaceAll(SINGLE_QUOTE2, ESCAPED_SINGLE_QUOTE)}${SINGLE_QUOTE2}` : text;
|
|
1987
3237
|
var quotedInvocation = (invocation) => invocationTextWith(invocation, (word) => asOneShellWord(word.text));
|
|
1988
3238
|
var normalizedCommand = (command) => {
|
|
1989
3239
|
const segments = readableCommandSegments(command);
|
|
@@ -2065,19 +3315,99 @@ var changesProduction = (invocation) => {
|
|
|
2065
3315
|
const words = wordsOfInvocation(invocation);
|
|
2066
3316
|
return words.some((word, index) => wordSelectsProduction(word, words[index - 1])) && (deployCliChangesSomething(words) || SCHEMA_CHANGE_WORD.test(normalizedInvocation(invocation)));
|
|
2067
3317
|
};
|
|
2068
|
-
var
|
|
2069
|
-
var
|
|
3318
|
+
var STRING_WITH_DOUBLED_QUOTES = { backslashes: "uncertain-before-the-quote", content: "hidden" };
|
|
3319
|
+
var IDENTIFIER_WITH_DOUBLED_QUOTES = { backslashes: "uncertain-before-the-quote", content: "shown" };
|
|
3320
|
+
var MYSQL_STRING = { backslashes: "escape-unless-the-sql-mode-disables-it", content: "hidden" };
|
|
3321
|
+
var STRING_WITH_BACKSLASH_ESCAPES = { backslashes: "escape", content: "hidden" };
|
|
3322
|
+
var SHOWN_TEXT_WITH_BACKSLASH_ESCAPES = { backslashes: "escape", content: "shown" };
|
|
3323
|
+
var POSTGRES_LEXICON = {
|
|
3324
|
+
singleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
3325
|
+
doubleQuotes: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
3326
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
3327
|
+
tripleQuotes: "absent",
|
|
3328
|
+
escapeStringPrefix: "backslash-escapes",
|
|
3329
|
+
dollarQuotes: "string",
|
|
3330
|
+
dashDash: "comment",
|
|
3331
|
+
carriageReturnInLineComment: "ends-the-comment",
|
|
3332
|
+
hash: "text",
|
|
3333
|
+
executableComments: "uncertain",
|
|
3334
|
+
nestedBlockComments: "nest",
|
|
3335
|
+
backslashOutsideLiterals: "text",
|
|
3336
|
+
clientCharsets: "may-be-multibyte"
|
|
3337
|
+
};
|
|
3338
|
+
var MYSQL_LEXICON = {
|
|
3339
|
+
singleQuotes: MYSQL_STRING,
|
|
3340
|
+
doubleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
3341
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
3342
|
+
tripleQuotes: "absent",
|
|
3343
|
+
escapeStringPrefix: "absent",
|
|
3344
|
+
dollarQuotes: "uncertain",
|
|
3345
|
+
dashDash: "comment-before-whitespace",
|
|
3346
|
+
carriageReturnInLineComment: "stays-in-the-comment",
|
|
3347
|
+
hash: "comment",
|
|
3348
|
+
executableComments: "executed",
|
|
3349
|
+
nestedBlockComments: "uncertain",
|
|
3350
|
+
backslashOutsideLiterals: "client-command",
|
|
3351
|
+
clientCharsets: "may-be-multibyte"
|
|
3352
|
+
};
|
|
3353
|
+
var SQLITE_LEXICON = {
|
|
3354
|
+
singleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
3355
|
+
doubleQuotes: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
3356
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
3357
|
+
tripleQuotes: "absent",
|
|
3358
|
+
escapeStringPrefix: "absent",
|
|
3359
|
+
dollarQuotes: "uncertain",
|
|
3360
|
+
dashDash: "comment",
|
|
3361
|
+
carriageReturnInLineComment: "stays-in-the-comment",
|
|
3362
|
+
hash: "text",
|
|
3363
|
+
executableComments: "uncertain",
|
|
3364
|
+
nestedBlockComments: "uncertain",
|
|
3365
|
+
backslashOutsideLiterals: "text",
|
|
3366
|
+
clientCharsets: "unicode"
|
|
3367
|
+
};
|
|
3368
|
+
var GOOGLE_SQL_LEXICON = {
|
|
3369
|
+
singleQuotes: STRING_WITH_BACKSLASH_ESCAPES,
|
|
3370
|
+
doubleQuotes: SHOWN_TEXT_WITH_BACKSLASH_ESCAPES,
|
|
3371
|
+
backticks: SHOWN_TEXT_WITH_BACKSLASH_ESCAPES,
|
|
3372
|
+
tripleQuotes: "quote",
|
|
3373
|
+
escapeStringPrefix: "absent",
|
|
3374
|
+
dollarQuotes: "uncertain",
|
|
3375
|
+
dashDash: "comment",
|
|
3376
|
+
carriageReturnInLineComment: "uncertain",
|
|
3377
|
+
hash: "comment",
|
|
3378
|
+
executableComments: "uncertain",
|
|
3379
|
+
nestedBlockComments: "uncertain",
|
|
3380
|
+
backslashOutsideLiterals: "text",
|
|
3381
|
+
clientCharsets: "unicode"
|
|
3382
|
+
};
|
|
3383
|
+
var UNVERIFIED_SQL_LEXICON = {
|
|
3384
|
+
singleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
3385
|
+
doubleQuotes: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
3386
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
3387
|
+
tripleQuotes: "absent",
|
|
3388
|
+
escapeStringPrefix: "absent",
|
|
3389
|
+
dollarQuotes: "uncertain",
|
|
3390
|
+
dashDash: "uncertain-before-text",
|
|
3391
|
+
carriageReturnInLineComment: "uncertain",
|
|
3392
|
+
hash: "uncertain",
|
|
3393
|
+
executableComments: "uncertain",
|
|
3394
|
+
nestedBlockComments: "uncertain",
|
|
3395
|
+
backslashOutsideLiterals: "text",
|
|
3396
|
+
clientCharsets: "may-be-multibyte"
|
|
3397
|
+
};
|
|
3398
|
+
var MYSQL_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-e", "--execute"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false, lexicon: MYSQL_LEXICON };
|
|
3399
|
+
var SQLITE_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-init"]), positionalSql: true, lexicon: SQLITE_LEXICON };
|
|
2070
3400
|
var SQL_CLIENT_SYNTAX = /* @__PURE__ */ new Map([
|
|
2071
|
-
["psql", { inlineFlags: /* @__PURE__ */ new Set(["-c", "--command"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false }],
|
|
3401
|
+
["psql", { inlineFlags: /* @__PURE__ */ new Set(["-c", "--command"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false, lexicon: POSTGRES_LEXICON }],
|
|
2072
3402
|
["mysql", MYSQL_SYNTAX],
|
|
2073
3403
|
["mariadb", MYSQL_SYNTAX],
|
|
2074
3404
|
["sqlite3", SQLITE_SYNTAX],
|
|
2075
3405
|
["sqlite", SQLITE_SYNTAX],
|
|
2076
|
-
["duckdb", { inlineFlags: /* @__PURE__ */ new Set(["-c", "-s", "-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "-init"]), positionalSql: true }],
|
|
2077
|
-
["clickhouse-client", { inlineFlags: /* @__PURE__ */ new Set(["-q", "--query"]), scriptFlags: /* @__PURE__ */ new Set(["--queries-file"]), positionalSql: false }],
|
|
2078
|
-
["bq", { inlineFlags: /* @__PURE__ */ new Set(), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: true }],
|
|
2079
|
-
["mongosh", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false }],
|
|
2080
|
-
["mongo", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false }]
|
|
3406
|
+
["duckdb", { inlineFlags: /* @__PURE__ */ new Set(["-c", "-s", "-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "-init"]), positionalSql: true, lexicon: UNVERIFIED_SQL_LEXICON }],
|
|
3407
|
+
["clickhouse-client", { inlineFlags: /* @__PURE__ */ new Set(["-q", "--query"]), scriptFlags: /* @__PURE__ */ new Set(["--queries-file"]), positionalSql: false, lexicon: UNVERIFIED_SQL_LEXICON }],
|
|
3408
|
+
["bq", { inlineFlags: /* @__PURE__ */ new Set(), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: true, lexicon: GOOGLE_SQL_LEXICON }],
|
|
3409
|
+
["mongosh", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false, lexicon: UNVERIFIED_SQL_LEXICON }],
|
|
3410
|
+
["mongo", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false, lexicon: UNVERIFIED_SQL_LEXICON }]
|
|
2081
3411
|
]);
|
|
2082
3412
|
var SQL_WRITE_STATEMENT = new RegExp([
|
|
2083
3413
|
String.raw`\b(?:insert|update|delete|merge|upsert|alter|create|drop|truncate|grant|revoke|copy|vacuum|reindex|rename|attach|detach)\b`,
|
|
@@ -2086,21 +3416,26 @@ var SQL_WRITE_STATEMENT = new RegExp([
|
|
|
2086
3416
|
String.raw`\binto\s+(?:out|dump)file\b`,
|
|
2087
3417
|
String.raw`\bset\s+(?:global|persist)\b`,
|
|
2088
3418
|
String.raw`\bkill\s+(?:query|connection|\d)`,
|
|
2089
|
-
String.raw`\bcall\
|
|
2090
|
-
String.raw`\
|
|
3419
|
+
String.raw`\bcall\b`,
|
|
3420
|
+
String.raw`\bexecute\s+immediate\b`,
|
|
3421
|
+
String.raw`\bprepare\s+\S+\s+from\b`,
|
|
3422
|
+
String.raw`\bselect\b[^;]*\binto\b(?!\s*@)`,
|
|
3423
|
+
String.raw`(?:^|;)\s*lock\b`,
|
|
3424
|
+
String.raw`(?:^|;)\s*do\b`,
|
|
2091
3425
|
String.raw`\bpg_terminate_backend\b`,
|
|
2092
3426
|
String.raw`\bsetval\b`,
|
|
2093
3427
|
String.raw`\bpragma\s+writable_schema\b`,
|
|
2094
3428
|
String.raw`\.(?:insert|update|delete|replace|remove|drop|rename|create|bulkwrite|findoneand)\w*\s*\(`
|
|
2095
3429
|
].join("|"), "i");
|
|
2096
3430
|
var SQL_READ_PHRASE = /\bshow\s+create\b/gi;
|
|
2097
|
-
var
|
|
2098
|
-
|
|
2099
|
-
var SQL_COMMENT = /--[^\n]*|\/\*[\s\S]*?\*\//g;
|
|
2100
|
-
var writesThroughSql = (sql) => {
|
|
2101
|
-
const statement = sql.replace(SQL_COMMENT, " ").replace(SQL_STRING_LITERAL, EMPTY_SQL_STRING).replace(SQL_READ_PHRASE, "");
|
|
3431
|
+
var sqlTextWrites = (text) => {
|
|
3432
|
+
const statement = text.replace(SQL_READ_PHRASE, "");
|
|
2102
3433
|
return SQL_WRITE_STATEMENT.test(statement) || SQL_CLIENT_FILE_COMMAND.test(statement);
|
|
2103
3434
|
};
|
|
3435
|
+
var writesThroughSql = (sql, lexicon) => {
|
|
3436
|
+
const parsed = sqlOutsideLiterals(sql, lexicon);
|
|
3437
|
+
return parsed.kind === "uncertain" || parsed.texts.some(sqlTextWrites);
|
|
3438
|
+
};
|
|
2104
3439
|
var SQL_CLIENT_FILE_COMMAND = new RegExp([
|
|
2105
3440
|
String.raw`(?:^|[\s;=])\\(?:i|ir|include|include_relative|o|out|w|write|gexec|!|\.)(?=\s|$)`,
|
|
2106
3441
|
String.raw`(?:^|[\s;=])\\g\s*\|`,
|
|
@@ -2108,6 +3443,7 @@ var SQL_CLIENT_FILE_COMMAND = new RegExp([
|
|
|
2108
3443
|
String.raw`(?:^|[;=])\s*(?:system|source)\s`
|
|
2109
3444
|
].join("|"), "i");
|
|
2110
3445
|
var SHORT_FLAG_CLUSTER_ONLY = /^-([A-Za-z0-9]+)$/;
|
|
3446
|
+
var LEADING_OPTION_DASHES = /^-+/;
|
|
2111
3447
|
var NO_SQL = { script: false, sql: null, hidden: false };
|
|
2112
3448
|
var shortFlagOf = (flags, text) => [...flags].find((flag) => /^-[A-Za-z]$/.test(flag) && text.startsWith(flag) && text.length > flag.length && !text.startsWith("--"));
|
|
2113
3449
|
var sqlArgumentAt = (args, index, syntax) => {
|
|
@@ -2127,7 +3463,7 @@ var sqlArgumentAt = (args, index, syntax) => {
|
|
|
2127
3463
|
const last = cluster ? `-${cluster.slice(-1)}` : "";
|
|
2128
3464
|
if (cluster && cluster.length > 1 && syntax.scriptFlags.has(last)) return { script: true, sql: null, hidden: false };
|
|
2129
3465
|
if (cluster && cluster.length > 1 && syntax.inlineFlags.has(last)) return valueOf(next);
|
|
2130
|
-
return { script: false, sql: arg.text, hidden: false };
|
|
3466
|
+
return { script: false, sql: arg.text.replace(LEADING_OPTION_DASHES, ""), hidden: false };
|
|
2131
3467
|
};
|
|
2132
3468
|
var namesALongFlagValue = (text, flags) => [...flags].some((flag) => flag.startsWith("--") && text.startsWith(`${flag}${FLAG_VALUE_SEPARATOR}`));
|
|
2133
3469
|
var positionalSqlIsHidden = (args, syntax) => syntax.positionalSql && args.filter((arg) => !arg.text.startsWith("-")).slice(1).some((arg) => arg.expands);
|
|
@@ -2137,7 +3473,7 @@ var sqlClientChangesData = (invocation) => {
|
|
|
2137
3473
|
if (syntax === void 0) return false;
|
|
2138
3474
|
return positionalSqlIsHidden(invocation.args, syntax) || invocation.args.some((_, index) => {
|
|
2139
3475
|
const { script, sql, hidden } = sqlArgumentAt(invocation.args, index, syntax);
|
|
2140
|
-
return script || hidden || sql !== null && writesThroughSql(sql);
|
|
3476
|
+
return script || hidden || sql !== null && writesThroughSql(sql, syntax.lexicon);
|
|
2141
3477
|
});
|
|
2142
3478
|
};
|
|
2143
3479
|
var PULL_REQUEST_CLIS = /* @__PURE__ */ new Set(["gh", "glab"]);
|
|
@@ -2234,48 +3570,69 @@ var writesASecretFile = ({ program, args }) => {
|
|
|
2234
3570
|
if (WRITES_EVERY_OPERAND.has(name)) return operands.some(namesASecretFile);
|
|
2235
3571
|
return EDITS_IN_PLACE.has(name) && args.some((arg) => IN_PLACE_FLAG.test(arg.text)) && operands.some(namesASecretFile);
|
|
2236
3572
|
};
|
|
2237
|
-
var
|
|
2238
|
-
"
|
|
2239
|
-
"issue",
|
|
2240
|
-
"release",
|
|
2241
|
-
"repo",
|
|
2242
|
-
"gist",
|
|
2243
|
-
"label",
|
|
2244
|
-
"secret",
|
|
2245
|
-
"variable",
|
|
2246
|
-
"workflow",
|
|
2247
|
-
"run",
|
|
2248
|
-
"cache",
|
|
2249
|
-
"project",
|
|
2250
|
-
"ruleset",
|
|
2251
|
-
"codespace",
|
|
2252
|
-
"org",
|
|
2253
|
-
"discussion"
|
|
2254
|
-
]);
|
|
2255
|
-
var GITHUB_READ_VERBS = /* @__PURE__ */ new Set([
|
|
2256
|
-
"view",
|
|
2257
|
-
"list",
|
|
2258
|
-
"ls",
|
|
2259
|
-
"status",
|
|
2260
|
-
"diff",
|
|
2261
|
-
"checks",
|
|
2262
|
-
"check",
|
|
2263
|
-
"watch",
|
|
3573
|
+
var GITHUB_COMMANDS_THAT_ONLY_READ = /* @__PURE__ */ new Set([
|
|
3574
|
+
"search",
|
|
2264
3575
|
"browse",
|
|
2265
|
-
"
|
|
2266
|
-
"
|
|
2267
|
-
"
|
|
2268
|
-
"
|
|
2269
|
-
|
|
2270
|
-
|
|
3576
|
+
"status",
|
|
3577
|
+
"help",
|
|
3578
|
+
"version",
|
|
3579
|
+
"completion"
|
|
3580
|
+
]);
|
|
3581
|
+
var githubReadVerbs = (...verbs) => /* @__PURE__ */ new Set(["list", "ls", ...verbs]);
|
|
3582
|
+
var GITHUB_RULESET_READS = githubReadVerbs("view", "check");
|
|
3583
|
+
var GITHUB_CODESPACE_READS = githubReadVerbs("view");
|
|
3584
|
+
var GITHUB_EXTENSION_READS = githubReadVerbs("search");
|
|
3585
|
+
var GITHUB_ATTESTATION_READS = /* @__PURE__ */ new Set(["verify", "download", "trusted-root"]);
|
|
3586
|
+
var GITHUB_READ_COMMANDS = /* @__PURE__ */ new Map([
|
|
3587
|
+
["pr", githubReadVerbs("view", "status", "diff", "checks", "checkout", "co")],
|
|
3588
|
+
["issue", githubReadVerbs("view", "status")],
|
|
3589
|
+
["release", githubReadVerbs("view", "download")],
|
|
3590
|
+
["repo", githubReadVerbs("view", "clone")],
|
|
3591
|
+
["gist", githubReadVerbs("view", "clone")],
|
|
3592
|
+
["label", githubReadVerbs()],
|
|
3593
|
+
["secret", githubReadVerbs()],
|
|
3594
|
+
["variable", githubReadVerbs("get")],
|
|
3595
|
+
["workflow", githubReadVerbs("view")],
|
|
3596
|
+
["run", githubReadVerbs("view", "watch", "download")],
|
|
3597
|
+
["cache", githubReadVerbs()],
|
|
3598
|
+
["project", githubReadVerbs("view", "field-list", "item-list")],
|
|
3599
|
+
["ruleset", GITHUB_RULESET_READS],
|
|
3600
|
+
["rs", GITHUB_RULESET_READS],
|
|
3601
|
+
["codespace", GITHUB_CODESPACE_READS],
|
|
3602
|
+
["cs", GITHUB_CODESPACE_READS],
|
|
3603
|
+
["org", githubReadVerbs()],
|
|
3604
|
+
["auth", /* @__PURE__ */ new Set(["status"])],
|
|
3605
|
+
["extension", GITHUB_EXTENSION_READS],
|
|
3606
|
+
["extensions", GITHUB_EXTENSION_READS],
|
|
3607
|
+
["ext", GITHUB_EXTENSION_READS],
|
|
3608
|
+
["alias", githubReadVerbs()],
|
|
3609
|
+
["config", githubReadVerbs("get")],
|
|
3610
|
+
["ssh-key", githubReadVerbs()],
|
|
3611
|
+
["gpg-key", githubReadVerbs()],
|
|
3612
|
+
["attestation", GITHUB_ATTESTATION_READS],
|
|
3613
|
+
["at", GITHUB_ATTESTATION_READS]
|
|
2271
3614
|
]);
|
|
2272
3615
|
var GITHUB_OPTIONS_WITH_VALUES = /* @__PURE__ */ new Set(["-R", "--repo", "--hostname"]);
|
|
2273
3616
|
var GITHUB_API_SUBCOMMAND = "api";
|
|
2274
3617
|
var GITHUB_GRAPHQL_ENDPOINT = "graphql";
|
|
2275
|
-
var
|
|
2276
|
-
var HTTP_METHOD_ATTACHED = /^(?:-X|--method=)(.+)$/;
|
|
3618
|
+
var HTTP_METHOD_OPTIONS = /* @__PURE__ */ new Set(["-X", "--method"]);
|
|
2277
3619
|
var HTTP_READ_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD"]);
|
|
2278
|
-
var
|
|
3620
|
+
var GITHUB_API_BODY_OPTIONS = /* @__PURE__ */ new Set(["-f", "-F", "--field", "--raw-field", "--input"]);
|
|
3621
|
+
var GITHUB_API_SHORT_SWITCHES = /* @__PURE__ */ new Set(["i", "h"]);
|
|
3622
|
+
var GITHUB_API_SHORT_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set(["X", "F", "f", "H", "p", "t", "q"]);
|
|
3623
|
+
var GITHUB_API_LONG_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set([
|
|
3624
|
+
"--method",
|
|
3625
|
+
"--field",
|
|
3626
|
+
"--raw-field",
|
|
3627
|
+
"--header",
|
|
3628
|
+
"--preview",
|
|
3629
|
+
"--input",
|
|
3630
|
+
"--template",
|
|
3631
|
+
"--jq",
|
|
3632
|
+
"--cache",
|
|
3633
|
+
"--hostname"
|
|
3634
|
+
]);
|
|
3635
|
+
var PFLAG_ATTACHED_VALUE_PREFIX = /^=/;
|
|
2279
3636
|
var GITHUB_API_FILE_FIELD = /=@|^--input(?:=|$)/;
|
|
2280
3637
|
var GRAPHQL_MUTATION = /\bmutation\b/i;
|
|
2281
3638
|
var STRIPE_READ_COMMANDS = /* @__PURE__ */ new Set([
|
|
@@ -2324,35 +3681,74 @@ var S3_URL_PREFIX = "s3://";
|
|
|
2324
3681
|
var TWILIO_TOPIC_SEPARATOR = ":";
|
|
2325
3682
|
var TWILIO_READ_ACTIONS = /* @__PURE__ */ new Set(["list", "fetch"]);
|
|
2326
3683
|
var positionalWordsOf = (args, optionsWithValues) => {
|
|
2327
|
-
const endOfOptions = args.findIndex((arg) => arg.text ===
|
|
3684
|
+
const endOfOptions = args.findIndex((arg) => arg.text === END_OF_OPTIONS3);
|
|
2328
3685
|
const options = endOfOptions === -1 ? args : args.slice(0, endOfOptions);
|
|
2329
3686
|
const operands = endOfOptions === -1 ? [] : args.slice(endOfOptions + 1);
|
|
2330
3687
|
const positional = options.filter((arg, index) => !arg.text.startsWith("-") && !optionsWithValues.has(options[index - 1]?.text ?? ""));
|
|
2331
3688
|
return [...positional, ...operands];
|
|
2332
3689
|
};
|
|
2333
|
-
var
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
3690
|
+
var NO_CLI_OPTION = [];
|
|
3691
|
+
var githubApiLongOptionAt = (args, index, arg) => {
|
|
3692
|
+
const separator = arg.text.indexOf(FLAG_VALUE_SEPARATOR);
|
|
3693
|
+
if (separator !== -1) {
|
|
3694
|
+
return { options: [{ name: arg.text.slice(0, separator), value: { ...arg, text: arg.text.slice(separator + 1) } }], next: index + 1 };
|
|
3695
|
+
}
|
|
3696
|
+
if (!GITHUB_API_LONG_OPTIONS_WITH_A_VALUE.has(arg.text)) return { options: [{ name: arg.text, value: void 0 }], next: index + 1 };
|
|
3697
|
+
return { options: [{ name: arg.text, value: args[index + 1] }], next: index + 2 };
|
|
3698
|
+
};
|
|
3699
|
+
var githubApiShortOptionsAt = (args, index, arg) => {
|
|
3700
|
+
const options = [];
|
|
3701
|
+
for (let position = 1; position < arg.text.length; position += 1) {
|
|
3702
|
+
const letter = arg.text.charAt(position);
|
|
3703
|
+
const name = `-${letter}`;
|
|
3704
|
+
if (GITHUB_API_SHORT_SWITCHES.has(letter)) {
|
|
3705
|
+
options.push({ name, value: void 0 });
|
|
3706
|
+
continue;
|
|
2340
3707
|
}
|
|
3708
|
+
if (!GITHUB_API_SHORT_OPTIONS_WITH_A_VALUE.has(letter)) return null;
|
|
3709
|
+
const attached = arg.text.slice(position + 1);
|
|
3710
|
+
if (attached === "") return { options: [...options, { name, value: args[index + 1] }], next: index + 2 };
|
|
3711
|
+
return { options: [...options, { name, value: { ...arg, text: attached.replace(PFLAG_ATTACHED_VALUE_PREFIX, "") } }], next: index + 1 };
|
|
2341
3712
|
}
|
|
2342
|
-
return
|
|
3713
|
+
return { options, next: index + 1 };
|
|
3714
|
+
};
|
|
3715
|
+
var githubApiOptionsAt = (args, index, arg) => {
|
|
3716
|
+
if (LONG_OPTION.test(arg.text)) return githubApiLongOptionAt(args, index, arg);
|
|
3717
|
+
if (FLAG.test(arg.text) && arg.text !== STANDARD_INPUT_ARGUMENT) return githubApiShortOptionsAt(args, index, arg);
|
|
3718
|
+
return { options: NO_CLI_OPTION, next: index + 1 };
|
|
3719
|
+
};
|
|
3720
|
+
var githubApiOptionsOf = (args) => {
|
|
3721
|
+
const options = [];
|
|
3722
|
+
for (let index = 0; index < args.length; ) {
|
|
3723
|
+
const arg = args[index];
|
|
3724
|
+
if (arg === void 0 || arg.text === END_OF_OPTIONS3) break;
|
|
3725
|
+
const parsed = githubApiOptionsAt(args, index, arg);
|
|
3726
|
+
if (parsed === null) return null;
|
|
3727
|
+
options.push(...parsed.options);
|
|
3728
|
+
index = parsed.next;
|
|
3729
|
+
}
|
|
3730
|
+
return options;
|
|
2343
3731
|
};
|
|
3732
|
+
var requestMethodCanWrite = (method) => method === void 0 || method.expands || !HTTP_READ_METHODS.has(method.text.toUpperCase());
|
|
2344
3733
|
var graphqlRequestCanWrite = (args) => args.some((arg) => arg.expands || GRAPHQL_MUTATION.test(arg.text) || GITHUB_API_FILE_FIELD.test(arg.text));
|
|
2345
3734
|
var githubApiRequestWrites = (args) => {
|
|
2346
|
-
const
|
|
2347
|
-
if (
|
|
3735
|
+
const options = githubApiOptionsOf(args);
|
|
3736
|
+
if (options === null) return true;
|
|
3737
|
+
const method = options.filter((option) => HTTP_METHOD_OPTIONS.has(option.name)).at(-1);
|
|
3738
|
+
if (method !== void 0) return requestMethodCanWrite(method.value);
|
|
2348
3739
|
if (args.some((arg) => arg.text === GITHUB_GRAPHQL_ENDPOINT)) return graphqlRequestCanWrite(args);
|
|
2349
|
-
return
|
|
3740
|
+
return options.some((option) => GITHUB_API_BODY_OPTIONS.has(option.name));
|
|
3741
|
+
};
|
|
3742
|
+
var githubCommandOnlyReads = (noun, verb) => {
|
|
3743
|
+
if (noun === void 0 || GITHUB_COMMANDS_THAT_ONLY_READ.has(noun.text)) return true;
|
|
3744
|
+
const readVerbs = GITHUB_READ_COMMANDS.get(noun.text);
|
|
3745
|
+
return readVerbs !== void 0 && (verb === void 0 || readVerbs.has(verb.text));
|
|
2350
3746
|
};
|
|
2351
3747
|
var githubCliWrites = (args) => {
|
|
2352
3748
|
const meaningful = argsAfterHarmlessGlobalFlags(args);
|
|
2353
3749
|
const [noun, verb] = positionalWordsOf(meaningful, GITHUB_OPTIONS_WITH_VALUES);
|
|
2354
3750
|
if (noun?.text === GITHUB_API_SUBCOMMAND) return githubApiRequestWrites(meaningful.slice(meaningful.indexOf(noun) + 1));
|
|
2355
|
-
return
|
|
3751
|
+
return !githubCommandOnlyReads(noun, verb);
|
|
2356
3752
|
};
|
|
2357
3753
|
var stripeCliWrites = (args) => {
|
|
2358
3754
|
const [command, operation] = positionalWordsOf(args, STRIPE_OPTIONS_WITH_VALUES);
|
|
@@ -2381,19 +3777,22 @@ var invocationWritesThroughARemoteApi = ({ program, args }) => {
|
|
|
2381
3777
|
const writes = program === void 0 ? void 0 : REMOTE_API_CLI_WRITES.get(basenameOf(program.text));
|
|
2382
3778
|
return writes !== void 0 && writes(args);
|
|
2383
3779
|
};
|
|
2384
|
-
var
|
|
2385
|
-
const
|
|
2386
|
-
return
|
|
3780
|
+
var segmentWritesThroughARemoteApi = (segment, depth) => {
|
|
3781
|
+
const innermost = innermostInvocation(segment.invocation);
|
|
3782
|
+
return invocationWritesThroughARemoteApi(innermost) || commandsNestedIn(innermost, inlineScriptsOf(innermost, segment.heredocs)).some((nested) => commandWritesThroughARemoteApiAt(nested, depth + 1));
|
|
2387
3783
|
};
|
|
3784
|
+
var commandWritesThroughARemoteApiAt = (command, depth) => depth <= MAX_SPELLING_DEPTH && spelledSegmentsOf(command).some((segment) => segmentWritesThroughARemoteApi(segment, depth));
|
|
3785
|
+
var commandWritesThroughARemoteApi = (command) => commandWritesThroughARemoteApiAt(command, 0);
|
|
2388
3786
|
var segmentNeedsAPerson = (toolName, segment) => {
|
|
2389
3787
|
const invocation = invocationOf(segment);
|
|
2390
3788
|
const normalized = normalizedInvocation(invocation);
|
|
2391
3789
|
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);
|
|
2392
3790
|
};
|
|
2393
3791
|
var commandNeedsAPerson = (toolName, command) => {
|
|
2394
|
-
|
|
3792
|
+
const readingTool = toolNameForAPosixReading(toolName);
|
|
3793
|
+
if (readingTool === SHELL_TOOL && isSafeReadOnlyCommand(command)) return false;
|
|
2395
3794
|
const segments = readableCommandSegments(command);
|
|
2396
|
-
return segments === null || classifyDecisionRisk(
|
|
3795
|
+
return segments === null || classifyDecisionRisk(readingTool, command) !== "standard" || segments.some((segment) => segmentNeedsAPerson(readingTool, segment)) || pipesIntoASqlClient(command) || shellDialectOf(toolName) === "powershell" && powerShellCommandHasAVisibleConsequence(command, posixShellJudgeFor(toolName));
|
|
2397
3796
|
};
|
|
2398
3797
|
var VISIBLE_DATA_LOSS_PATTERNS = [
|
|
2399
3798
|
"Bash(git branch -D:*)",
|
|
@@ -2522,8 +3921,9 @@ var findRunnerEnd = (args, from) => {
|
|
|
2522
3921
|
};
|
|
2523
3922
|
var wrapperSyntax = (optionsWithAValue = [], operandsBeforeTheCommand = 0) => ({ optionsWithAValue: new Set(optionsWithAValue), operandsBeforeTheCommand });
|
|
2524
3923
|
var ENVIRONMENT_ASSIGNMENTS = wrapperSyntax();
|
|
3924
|
+
var ENV = "env";
|
|
3925
|
+
var ENV_SPLIT_STRING_ESCAPE = /[\\$]/;
|
|
2525
3926
|
var WRAPPER_SYNTAX = /* @__PURE__ */ new Map([
|
|
2526
|
-
["env", wrapperSyntax(["-u", "--unset", "-C", "--chdir", "-S", "--split-string", "-P"])],
|
|
2527
3927
|
["xargs", wrapperSyntax([
|
|
2528
3928
|
"-I",
|
|
2529
3929
|
"-J",
|
|
@@ -2585,22 +3985,39 @@ var WRAPPER_SYNTAX = /* @__PURE__ */ new Map([
|
|
|
2585
3985
|
["pnpx", wrapperSyntax()],
|
|
2586
3986
|
["uvx", wrapperSyntax(["--from", "--with", "-p", "--python"])]
|
|
2587
3987
|
]);
|
|
2588
|
-
var SHELLS = /* @__PURE__ */ new Set(["sh", "bash", "zsh", "dash", "ksh"]);
|
|
2589
|
-
var SCRIPT_FLAG_CLUSTER = /^-[A-Za-z]*c$/;
|
|
2590
3988
|
var EVAL = "eval";
|
|
2591
3989
|
var MAX_CONSEQUENCE_DEPTH = 4;
|
|
3990
|
+
var shortValueOptionPosition = (text, options) => {
|
|
3991
|
+
if (!text.startsWith("-") || text.startsWith("--")) return -1;
|
|
3992
|
+
for (let index = 1; index < text.length; index += 1) {
|
|
3993
|
+
if (options.has(`-${text[index]}`)) return index;
|
|
3994
|
+
}
|
|
3995
|
+
return -1;
|
|
3996
|
+
};
|
|
3997
|
+
var wrapperOptionConsumesNextWord = (text, options) => {
|
|
3998
|
+
if (options.has(text)) return true;
|
|
3999
|
+
const position = shortValueOptionPosition(text, options);
|
|
4000
|
+
return position !== -1 && position === text.length - 1;
|
|
4001
|
+
};
|
|
2592
4002
|
var commandStartAfterWrapper = (words, syntax) => {
|
|
2593
4003
|
let index = 0;
|
|
2594
4004
|
while (index < words.length) {
|
|
2595
4005
|
const text = words[index]?.text ?? "";
|
|
2596
|
-
if (text ===
|
|
4006
|
+
if (text === END_OF_OPTIONS3) return index + 1 + syntax.operandsBeforeTheCommand;
|
|
2597
4007
|
if (!SHELL_ENV_ASSIGNMENT.test(text) && (!FLAG.test(text) || text === STANDARD_INPUT_ARGUMENT)) break;
|
|
2598
|
-
index += syntax.optionsWithAValue
|
|
4008
|
+
index += wrapperOptionConsumesNextWord(text, syntax.optionsWithAValue) ? 2 : 1;
|
|
2599
4009
|
}
|
|
2600
4010
|
return index + syntax.operandsBeforeTheCommand;
|
|
2601
4011
|
};
|
|
4012
|
+
var envWrappedInvocation = (args) => {
|
|
4013
|
+
const reading = envReadingOf(args);
|
|
4014
|
+
if (reading.kind !== "command") return null;
|
|
4015
|
+
const command = args[reading.start];
|
|
4016
|
+
return command === void 0 ? null : { program: command, args: args.slice(reading.start + 1) };
|
|
4017
|
+
};
|
|
2602
4018
|
var wrappedInvocation = ({ program, args }) => {
|
|
2603
4019
|
if (program === void 0) return null;
|
|
4020
|
+
if (basenameOf(program.text) === ENV) return envWrappedInvocation(args);
|
|
2604
4021
|
const assigns = SHELL_ENV_ASSIGNMENT.test(program.text);
|
|
2605
4022
|
const syntax = assigns ? ENVIRONMENT_ASSIGNMENTS : WRAPPER_SYNTAX.get(basenameOf(program.text));
|
|
2606
4023
|
if (syntax === void 0) return null;
|
|
@@ -2609,17 +4026,29 @@ var wrappedInvocation = ({ program, args }) => {
|
|
|
2609
4026
|
const command = words[start];
|
|
2610
4027
|
return command === void 0 ? null : { program: command, args: words.slice(start + 1) };
|
|
2611
4028
|
};
|
|
2612
|
-
var innermostInvocation = (invocation
|
|
2613
|
-
|
|
2614
|
-
|
|
4029
|
+
var innermostInvocation = (invocation) => {
|
|
4030
|
+
let current = invocation;
|
|
4031
|
+
let wrapped = wrappedInvocation(current);
|
|
4032
|
+
while (wrapped !== null) {
|
|
4033
|
+
current = wrapped;
|
|
4034
|
+
wrapped = wrappedInvocation(current);
|
|
4035
|
+
}
|
|
4036
|
+
return current;
|
|
4037
|
+
};
|
|
4038
|
+
var envSplitScriptOf = ({ prefix, value, rest }, args) => {
|
|
4039
|
+
if (value === void 0 || value.expands || ENV_SPLIT_STRING_ESCAPE.test(value.text)) return null;
|
|
4040
|
+
return [ENV, ...prefix.map(asOneShellWord), value.text, ...args.slice(rest).map((arg) => asOneShellWord(arg.text))].join(" ");
|
|
2615
4041
|
};
|
|
2616
4042
|
var shellScriptOf = ({ program, args }) => {
|
|
2617
4043
|
if (program === void 0) return null;
|
|
2618
|
-
|
|
2619
|
-
if (
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
4044
|
+
const name = basenameOf(program.text);
|
|
4045
|
+
if (name === ENV) {
|
|
4046
|
+
const reading = envReadingOf(args);
|
|
4047
|
+
return reading.kind === "split" ? envSplitScriptOf(reading, args) : null;
|
|
4048
|
+
}
|
|
4049
|
+
if (name === EVAL) return args.some((arg) => arg.expands) ? null : args.map((arg) => arg.text).join(" ");
|
|
4050
|
+
const commandString = shellCommandStringOf(name, args);
|
|
4051
|
+
return commandString.kind === "readable" ? commandString.script : null;
|
|
2623
4052
|
};
|
|
2624
4053
|
var FLAG = /^-/;
|
|
2625
4054
|
var FLAG_WITH_ATTACHED_VALUE = /^-[^=]*=/;
|
|
@@ -2647,22 +4076,23 @@ var honoursPreviewFlags = ({ program, args }) => {
|
|
|
2647
4076
|
var onlyPreviews = (invocation) => invocation.program !== void 0 && honoursPreviewFlags(invocation) && invocation.args.some((arg) => !arg.expands && PREVIEW_FLAG.test(arg.text));
|
|
2648
4077
|
var changesWhatIsDeployed = (toolName, invocation, normalized) => !onlyPreviews(invocation) && (changesProduction(invocation) || mergesAPullRequest(invocation) || isCoveredByPolicy(DEPLOY_AND_SCHEMA_COMMAND_PATTERNS, toolName, normalized));
|
|
2649
4078
|
var invocationHasAVisibleConsequence = (toolName, invocation, depth) => {
|
|
2650
|
-
if (
|
|
4079
|
+
if (depth > MAX_CONSEQUENCE_DEPTH) return true;
|
|
4080
|
+
if (invocation.program === void 0) return false;
|
|
2651
4081
|
const normalized = quotedInvocation(invocation);
|
|
2652
|
-
const
|
|
4082
|
+
const innermost = innermostInvocation(invocation);
|
|
2653
4083
|
const script = shellScriptOf(invocation);
|
|
2654
|
-
return classifyDecisionRisk(toolName, normalized) === "destructive" || changesWhatIsDeployed(toolName, invocation, normalized) || writesASecretFile(invocation) || losesDataVisibly(toolName, invocation, normalized, depth) || subcommandDestroysVisibly(invocation) || sqlClientChangesData(invocation) ||
|
|
4084
|
+
return classifyDecisionRisk(toolName, normalized) === "destructive" || changesWhatIsDeployed(toolName, invocation, normalized) || writesASecretFile(invocation) || losesDataVisibly(toolName, invocation, normalized, depth) || subcommandDestroysVisibly(invocation) || sqlClientChangesData(invocation) || innermost !== invocation && invocationHasAVisibleConsequence(toolName, innermost, depth) || script === null && passesAnInlineScript(invocation) || script !== null && commandHasAVisibleConsequenceAt(toolName, script, depth + 1) || readingsPastGlobalFlags(invocation).some((reading) => invocationHasAVisibleConsequence(toolName, reading, depth + 1));
|
|
2655
4085
|
};
|
|
2656
4086
|
var RUNS_FETCHED_CODE = /(?:\$\(|`|<\()\s*(?:curl|wget)\b/;
|
|
2657
4087
|
var FETCHING_PROGRAMS = /* @__PURE__ */ new Set(["curl", "wget"]);
|
|
2658
4088
|
var READS_ITS_SCRIPT_FROM_STANDARD_INPUT = /^-[A-Za-z]*s[A-Za-z]*$/;
|
|
2659
4089
|
var interpreterNameOf = (program) => basenameOf(program.text).replace(/\d+(?:\.\d+)*$/, "");
|
|
2660
|
-
var runsScripts = (program) =>
|
|
2661
|
-
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) ||
|
|
4090
|
+
var runsScripts = (program) => POSIX_SHELL_PROGRAMS.has(basenameOf(program.text)) || INLINE_CODE_INTERPRETERS.has(interpreterNameOf(program));
|
|
4091
|
+
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) || POSIX_SHELL_PROGRAMS.has(basenameOf(program.text)) && args.some((arg) => READS_ITS_SCRIPT_FROM_STANDARD_INPUT.test(arg.text)));
|
|
2662
4092
|
var fetches = (invocation) => FETCHING_PROGRAMS.has(basenameOf(innermostInvocation(invocation).program?.text ?? ""));
|
|
2663
|
-
var
|
|
4093
|
+
var URL_QUERY_OR_FRAGMENT2 = /[?#].*$/;
|
|
2664
4094
|
var SOURCES_A_SCRIPT = /* @__PURE__ */ new Set(["source", "."]);
|
|
2665
|
-
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(
|
|
4095
|
+
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_FRAGMENT2, "")))));
|
|
2666
4096
|
var runsADownloadedScript = (invocations) => {
|
|
2667
4097
|
const downloaded = downloadedNamesOf(invocations);
|
|
2668
4098
|
return downloaded.size > 0 && invocations.map((invocation) => innermostInvocation(invocation)).some(({ program, args }) => {
|
|
@@ -2716,7 +4146,7 @@ var OUTPUT_REDIRECTION = new RegExp(String.raw`(?:\d*|&)(?:>>?|>\||<>|>&|<&)\s*$
|
|
|
2716
4146
|
var REDIRECTED_INPUT_MARK = "\uE000";
|
|
2717
4147
|
var ROUGH_SEPARATORS = ["&&", "||", "$(", "\n", ";", "|", "&", "`", "(", ")", "{", "}"];
|
|
2718
4148
|
var SEPARATORS_INSIDE_DOUBLE_QUOTES = /* @__PURE__ */ new Set(["$(", "`", ")"]);
|
|
2719
|
-
var
|
|
4149
|
+
var PIPE3 = "|";
|
|
2720
4150
|
var SUBSTITUTION_OPENERS = /* @__PURE__ */ new Set(["$(", "`"]);
|
|
2721
4151
|
var QUOTE_CHARACTERS = /['"]/g;
|
|
2722
4152
|
var roughPiecesOf = (text) => {
|
|
@@ -2764,8 +4194,8 @@ var roughSegmentsOf = (command) => {
|
|
|
2764
4194
|
heredocsSeen += heredocCount;
|
|
2765
4195
|
return {
|
|
2766
4196
|
invocation: invocationOfRoughPiece(piece.text),
|
|
2767
|
-
readsInput: piece.text.includes(REDIRECTED_INPUT_MARK) || heredocCount > 0 || piece.before ===
|
|
2768
|
-
readsAPipe: piece.before ===
|
|
4197
|
+
readsInput: piece.text.includes(REDIRECTED_INPUT_MARK) || heredocCount > 0 || piece.before === PIPE3,
|
|
4198
|
+
readsAPipe: piece.before === PIPE3,
|
|
2769
4199
|
feedsASubstitution: SUBSTITUTION_OPENERS.has(pieces[index + 1]?.before ?? ""),
|
|
2770
4200
|
heredocs
|
|
2771
4201
|
};
|
|
@@ -2773,7 +4203,7 @@ var roughSegmentsOf = (command) => {
|
|
|
2773
4203
|
};
|
|
2774
4204
|
var roughSegmentHasAVisibleConsequence = (toolName, segment, fetchesCode, depth) => {
|
|
2775
4205
|
const innermost = innermostInvocation(segment.invocation);
|
|
2776
|
-
const runsAHeredocScript = innermost.program !== void 0 &&
|
|
4206
|
+
const runsAHeredocScript = innermost.program !== void 0 && POSIX_SHELL_PROGRAMS.has(basenameOf(innermost.program.text));
|
|
2777
4207
|
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));
|
|
2778
4208
|
};
|
|
2779
4209
|
var roughReadingHasAVisibleConsequence = (toolName, command, depth) => {
|
|
@@ -2791,7 +4221,19 @@ var commandHasAVisibleConsequenceAt = (toolName, command, depth) => {
|
|
|
2791
4221
|
const invocations = segments.map((segment) => invocationOf(withoutShellGrouping(segment)));
|
|
2792
4222
|
return invocations.some((invocation) => invocationHasAVisibleConsequence(toolName, invocation, depth)) || pipesIntoASqlClient(command) || pipesFetchedCodeIntoAnInterpreter(command, invocations) || runsADownloadedScript(invocations);
|
|
2793
4223
|
};
|
|
2794
|
-
var
|
|
4224
|
+
var posixCommandOf = (words) => words.map(asOneShellWord).join(" ");
|
|
4225
|
+
var posixShellJudgeFor = (toolName) => ({
|
|
4226
|
+
namesADestructiveAction: (text) => classifyDecisionRisk(toolName, text) === "destructive",
|
|
4227
|
+
invocationShowsAConsequence: (invocation) => invocationHasAVisibleConsequence(SHELL_TOOL, invocation, 0),
|
|
4228
|
+
commandShowsAConsequence: (words) => commandHasAVisibleConsequenceAt(SHELL_TOOL, posixCommandOf(words), 1),
|
|
4229
|
+
onlyReads: (words) => isSafeReadOnlyCommand(posixCommandOf(words)),
|
|
4230
|
+
fetches,
|
|
4231
|
+
runsWhatItReads,
|
|
4232
|
+
runsScripts,
|
|
4233
|
+
namesASecretFile: (fileName) => SECRET_FILE_NAME.test(fileName)
|
|
4234
|
+
});
|
|
4235
|
+
var commandIsDestructive = (toolName, command) => shellDialectOf(toolName) === "powershell" ? powerShellCommandIsDestructive(command, posixShellJudgeFor(toolName)) : classifyDecisionRisk(toolNameForAPosixReading(toolName), command) === "destructive";
|
|
4236
|
+
var commandHasAVisibleConsequence = (toolName, command) => shellDialectOf(toolName) === "powershell" ? powerShellCommandHasAVisibleConsequence(command, posixShellJudgeFor(toolName)) : commandHasAVisibleConsequenceAt(toolNameForAPosixReading(toolName), command, 0);
|
|
2795
4237
|
var MAX_SPELLING_DEPTH = 3;
|
|
2796
4238
|
var GIT_GLOBAL_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set([
|
|
2797
4239
|
"-C",
|
|
@@ -2851,14 +4293,28 @@ var canonicalInvocationText = (invocation) => invocationTextWith(invocation, (wo
|
|
|
2851
4293
|
var spellingsOfAnInvocation = (invocation, innermost) => [invocation, innermost, ...gitReadingsPastGlobalOptions(innermost), ...readingsPastGlobalFlags(innermost)].flatMap((reading) => [verbatimInvocationText(reading), canonicalInvocationText(reading)]);
|
|
2852
4294
|
var NO_INLINE_SCRIPT = { kind: "none" };
|
|
2853
4295
|
var HIDDEN_INLINE_SCRIPT = { kind: "hidden" };
|
|
4296
|
+
var ENV_READINGS_THAT_NAME_THEIR_OUTCOME = /* @__PURE__ */ new Set(["command", "runs-nothing"]);
|
|
4297
|
+
var envPassesItsCommandIndirectly = (reading) => !ENV_READINGS_THAT_NAME_THEIR_OUTCOME.has(reading.kind);
|
|
2854
4298
|
var passesAnInlineScript = ({ program, args }) => {
|
|
2855
4299
|
const name = basenameOf(program?.text ?? "");
|
|
2856
|
-
return name === EVAL ||
|
|
2857
|
-
};
|
|
2858
|
-
var
|
|
4300
|
+
return name === EVAL || shellCommandStringOf(name, args).kind !== "absent" || name === ENV && envPassesItsCommandIndirectly(envReadingOf(args));
|
|
4301
|
+
};
|
|
4302
|
+
var envCommandScriptOf = (start, args) => args[start]?.expands ? null : args.slice(start).map((word) => asOneShellWord(word.text)).join(" ");
|
|
4303
|
+
var envCandidateScriptOf = (reading, args) => reading.kind === "split" ? envSplitScriptOf(reading, args) : envCommandScriptOf(reading.start, args);
|
|
4304
|
+
var isAScript = (script) => script !== null;
|
|
4305
|
+
var envCandidateScriptsOf = ({ program, args }) => {
|
|
4306
|
+
if (basenameOf(program?.text ?? "") !== ENV) return NO_INLINE_SCRIPT;
|
|
4307
|
+
const reading = envReadingOf(args);
|
|
4308
|
+
if (reading.kind !== "ambiguous") return NO_INLINE_SCRIPT;
|
|
4309
|
+
const scripts = reading.readings.map((candidate) => envCandidateScriptOf(candidate, args));
|
|
4310
|
+
return scripts.every(isAScript) ? { kind: "readable", scripts } : HIDDEN_INLINE_SCRIPT;
|
|
4311
|
+
};
|
|
4312
|
+
var shellReadsItsScript = (invocation) => POSIX_SHELL_PROGRAMS.has(basenameOf(invocation.program?.text ?? "")) && runsWhatItReads(invocation);
|
|
2859
4313
|
var inlineScriptsOf = (invocation, heredocs) => {
|
|
2860
4314
|
const script = shellScriptOf(invocation);
|
|
2861
4315
|
if (script !== null) return { kind: "readable", scripts: [script] };
|
|
4316
|
+
const envCandidates = envCandidateScriptsOf(invocation);
|
|
4317
|
+
if (envCandidates.kind !== "none") return envCandidates;
|
|
2862
4318
|
if (passesAnInlineScript(invocation)) return HIDDEN_INLINE_SCRIPT;
|
|
2863
4319
|
if (!shellReadsItsScript(invocation)) return NO_INLINE_SCRIPT;
|
|
2864
4320
|
return heredocs.length > 0 ? { kind: "readable", scripts: heredocs } : HIDDEN_INLINE_SCRIPT;
|
|
@@ -2907,7 +4363,7 @@ var withoutSessionToolGrants = (config) => ({
|
|
|
2907
4363
|
policies: config.policies.filter((policy) => !isSessionToolGrant(policy))
|
|
2908
4364
|
});
|
|
2909
4365
|
var SESSION_TOOL_GRANT_TOOLS = /* @__PURE__ */ new Set(["Bash"]);
|
|
2910
|
-
var isStandingShellAllow = (policy) => !policy.origin && !isSessionToolGrant(policy) &&
|
|
4366
|
+
var isStandingShellAllow = (policy) => !policy.origin && !isSessionToolGrant(policy) && SHELL_DIALECT_BY_TOOL.has(policy.tool) && isAutoApprove(policy);
|
|
2911
4367
|
var MCP_TOOL_PREFIX = "mcp__";
|
|
2912
4368
|
var parseMcpToolName = (toolName) => {
|
|
2913
4369
|
if (!toolName.startsWith(MCP_TOOL_PREFIX)) return void 0;
|
|
@@ -3500,7 +4956,6 @@ var AGENT_TASK_CONTROL_TOOLS = [TASK_OUTPUT_TOOL, TASK_STOP_TOOL];
|
|
|
3500
4956
|
var AGENT_TASK_CONTROL_TOOL_NAMES = new Set(AGENT_TASK_CONTROL_TOOLS);
|
|
3501
4957
|
var readsOrStopsItsOwnWork = (toolName) => isCodexCoordinationTool(toolName) || AGENT_TASK_CONTROL_TOOL_NAMES.has(toolName);
|
|
3502
4958
|
var coordinationFloorApplies = (toolName, rank) => readsOrStopsItsOwnWork(toolName) && !isNamedByARule(rank);
|
|
3503
|
-
var POSIX_SHELL_TOOLS = /* @__PURE__ */ new Set(["Bash", "Monitor"]);
|
|
3504
4959
|
var argumentsAsWritten = (args) => ({ forms: args, hidesWhatItRuns: false });
|
|
3505
4960
|
var namesAnArgumentOf = (pattern, toolName) => pattern.startsWith(`${toolName}(`);
|
|
3506
4961
|
var isSpelledOut = (form) => form.length > 0;
|
|
@@ -3517,7 +4972,7 @@ var restrictionReadingOf = (restrictingPatterns, toolName, args) => {
|
|
|
3517
4972
|
};
|
|
3518
4973
|
var restrictingPatternsOf = (policies) => policies.filter(restricts).map((policy) => policy.tool);
|
|
3519
4974
|
var policyReadingOf = (policies, toolName, args) => restrictionReadingOf(restrictingPatternsOf(policies), toolName, args);
|
|
3520
|
-
var stricterRule = (current, challenger) => current !== void 0 && (challenger === void 0 ||
|
|
4975
|
+
var stricterRule = (current, challenger) => current !== void 0 && (challenger === void 0 || comparePolicyStrictness(current.policy, challenger.policy) > 0) ? current : challenger;
|
|
3521
4976
|
var restrictsAnArgumentOf = (policy, toolName) => restricts(policy) && namesAnArgumentOf(policy.tool, toolName);
|
|
3522
4977
|
var strictestRuleNamingAnArgument = (pool, toolName, repoKey, sessionId) => pool.filter((policy) => restrictsAnArgumentOf(policy, toolName) && appliesToThisCall(policy, repoKey, sessionId)).reduce((strictest, policy) => stricterRule(strictest, { policy, rank: "prefix" }), void 0);
|
|
3523
4978
|
var governingRuleForReading = (pool, toolName, args, reading, repoKey, sessionId) => {
|
|
@@ -3555,7 +5010,7 @@ var unmatchedPolicyOf = (config, toolName) => ({
|
|
|
3555
5010
|
mode: config.defaultMode ?? "push_first",
|
|
3556
5011
|
pushFirstSeconds: config.defaultPushFirstSeconds ?? 20
|
|
3557
5012
|
});
|
|
3558
|
-
var stricterOfTheReadings = (asWritten, asSpelled, unmatched) =>
|
|
5013
|
+
var stricterOfTheReadings = (asWritten, asSpelled, unmatched) => comparePolicyStrictness(asWritten?.policy ?? unmatched, asSpelled?.policy ?? unmatched) > 0 ? asWritten : asSpelled;
|
|
3559
5014
|
var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, sessionId) => {
|
|
3560
5015
|
const args = toolInput ? policyArgForms(toolName, toolInput, cwd) : [];
|
|
3561
5016
|
const arg = args[0];
|
|
@@ -3577,7 +5032,7 @@ var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, se
|
|
|
3577
5032
|
base = autoApprove(base.tool);
|
|
3578
5033
|
}
|
|
3579
5034
|
const wouldAutoApprove = isAutoApprove(base);
|
|
3580
|
-
if (!governedBySpecificRule && wouldAutoApprove && toolName
|
|
5035
|
+
if (!governedBySpecificRule && wouldAutoApprove && SHELL_DIALECT_BY_TOOL.has(toolName) && typeof arg === "string" && (commandIsDestructive(toolName, arg) || governedByStandingShellAllow && commandHasAVisibleConsequence(toolName, arg))) {
|
|
3581
5036
|
base = {
|
|
3582
5037
|
tool: base.tool,
|
|
3583
5038
|
timeoutSeconds: config.defaultTimeoutSeconds,
|
|
@@ -3598,7 +5053,14 @@ var restraintRank = (policy) => {
|
|
|
3598
5053
|
if (policy.mode === "push_only") return 3;
|
|
3599
5054
|
return policy.mode === "terminal_only" || policy.mode === "notify_only" ? 1 : 2;
|
|
3600
5055
|
};
|
|
3601
|
-
var
|
|
5056
|
+
var TIMEOUT_ACTION_STRICTNESS = {
|
|
5057
|
+
approve: 0,
|
|
5058
|
+
escalate: 1,
|
|
5059
|
+
wait: 1,
|
|
5060
|
+
deny: 2
|
|
5061
|
+
};
|
|
5062
|
+
var comparePolicyStrictness = (a, b) => restraintRank(a) - restraintRank(b) || TIMEOUT_ACTION_STRICTNESS[a.timeoutAction] - TIMEOUT_ACTION_STRICTNESS[b.timeoutAction];
|
|
5063
|
+
var strictestPolicy = (current, challenger) => comparePolicyStrictness(current, challenger) > 0 ? current : challenger;
|
|
3602
5064
|
var resolvePolicyAcross = (config, toolName, modeOverride, toolInputs, cwd, repoKey, sessionId) => {
|
|
3603
5065
|
if (toolInputs.length === 0) return resolvePolicy(config, toolName, modeOverride, void 0, cwd, repoKey, sessionId);
|
|
3604
5066
|
return toolInputs.map((input) => resolvePolicy(config, toolName, modeOverride, input, cwd, repoKey, sessionId)).reduce(strictestPolicy);
|
|
@@ -3623,7 +5085,7 @@ var strictestScopeVerdict = (scope, paths) => {
|
|
|
3623
5085
|
};
|
|
3624
5086
|
var survivesDegraded = (config, toolName, toolInputs, cwd, repoKey, sessionId) => toolInputs.length === 1 && resolveAutoResolveOrigin(config, toolName, toolInputs[0], cwd, repoKey, sessionId) === "safe_readonly";
|
|
3625
5087
|
var FULL_DEFER_MODES = /* @__PURE__ */ new Set(["plan", "auto", "dontAsk"]);
|
|
3626
|
-
var
|
|
5088
|
+
var FILE_EDIT_TOOLS = /* @__PURE__ */ new Set([
|
|
3627
5089
|
"Write",
|
|
3628
5090
|
"Edit",
|
|
3629
5091
|
"MultiEdit",
|
|
@@ -3633,7 +5095,7 @@ var shouldDeferToNativeMode = (permissionMode, toolName, options = {}) => {
|
|
|
3633
5095
|
if (options.respectPermissionMode === false) return false;
|
|
3634
5096
|
if (typeof permissionMode !== "string") return false;
|
|
3635
5097
|
if (FULL_DEFER_MODES.has(permissionMode)) return true;
|
|
3636
|
-
if (permissionMode === "acceptEdits" &&
|
|
5098
|
+
if (permissionMode === "acceptEdits" && FILE_EDIT_TOOLS.has(toolName)) return true;
|
|
3637
5099
|
if (permissionMode === "bypassPermissions") return options.deferBypass === true;
|
|
3638
5100
|
return false;
|
|
3639
5101
|
};
|
|
@@ -3726,7 +5188,7 @@ var resolveGate = (input) => {
|
|
|
3726
5188
|
scopePath: scopeReason && "path" in scopeVerdict ? widenablePath(scopeVerdict.path) : void 0
|
|
3727
5189
|
};
|
|
3728
5190
|
};
|
|
3729
|
-
var editAsksAtTheAgentsPrompt = (input, verdict) => verdict.kind === "gate" && !verdict.scopeReason && (input.modeState.mode ?? input.config.modeOverride ?? null) === null && !aChosenRuleGoverns(input) && verdict.policy.mode === "push_first" &&
|
|
5191
|
+
var editAsksAtTheAgentsPrompt = (input, verdict) => verdict.kind === "gate" && !verdict.scopeReason && (input.modeState.mode ?? input.config.modeOverride ?? null) === null && !aChosenRuleGoverns(input) && verdict.policy.mode === "push_first" && FILE_EDIT_TOOLS.has(input.toolName);
|
|
3730
5192
|
var claudePromptsBeforeAnEdit = (permissionMode) => permissionMode === "default";
|
|
3731
5193
|
var runsTheClaudeHook = (source) => source === null || source === "claude" || hookCompatibleProfileBySource(source) !== void 0;
|
|
3732
5194
|
var agentPromptsBeforeAnEdit = ({ source, event, permissionMode }) => {
|
|
@@ -3741,13 +5203,9 @@ var NO_RESPONSE_REASON = "No response within timeout";
|
|
|
3741
5203
|
var codexRaisesItsOwnPrompts = (permissionMode) => permissionMode !== "bypassPermissions";
|
|
3742
5204
|
var codexHasNoPromptOfItsOwn = (scopeReason, permissionMode) => scopeReason !== void 0 || !codexRaisesItsOwnPrompts(permissionMode);
|
|
3743
5205
|
var CODEX_ASK_PASSES = { kind: "pass" };
|
|
3744
|
-
var
|
|
3745
|
-
var
|
|
3746
|
-
var codexUnansweredPreToolUse = (ask) =>
|
|
3747
|
-
if (timeoutActionApplies(ask) && ask.timeoutAction === "approve") return CODEX_ASK_PASSES;
|
|
3748
|
-
if (timeoutActionApplies(ask) && ask.timeoutAction === "deny") return CODEX_ASK_UNANSWERED;
|
|
3749
|
-
return codexRaisesItsOwnPrompts(ask.permissionMode) ? CODEX_ASK_PASSES : CODEX_ASK_UNANSWERED;
|
|
3750
|
-
};
|
|
5206
|
+
var codexAskUnanswered = (ask) => ({ kind: "deny", reason: unansweredRefusalReason(ask.paused) });
|
|
5207
|
+
var ruleApprovesAfterItsFullWindow = (ask) => ask.mode === "push_only" && ask.fullWindowServed && ask.timeoutAction === "approve";
|
|
5208
|
+
var codexUnansweredPreToolUse = (ask) => ruleApprovesAfterItsFullWindow(ask) ? CODEX_ASK_PASSES : codexAskUnanswered(ask);
|
|
3751
5209
|
var HANDED_BACK_REASON = "Handling on your machine";
|
|
3752
5210
|
var HAND_BACK_WITHOUT_A_PROMPT = { kind: "refuse", reason: NO_AGENT_PROMPT_REASON };
|
|
3753
5211
|
var CODEX_HAND_BACK_REASON = "You chose to handle this on your machine, so it did not run. Ask Codex to run it again while you are at your computer, or run it yourself.";
|
|
@@ -3756,18 +5214,18 @@ var codexDeferredPreToolUse = () => ({ kind: "deny", reason: CODEX_PRE_TOOL_USE_
|
|
|
3756
5214
|
var isScopeReason = (scopeReason) => typeof scopeReason === "string" && scopeReason.length > 0;
|
|
3757
5215
|
var scopeBreachReasonOf = (verdict) => verdict.kind === "gate" && isScopeReason(verdict.scopeReason) ? verdict.scopeReason : void 0;
|
|
3758
5216
|
var onlyCodexPreToolUseCanAsk = (verdict, permissionMode) => verdict.kind === "gate" && (scopeBreachReasonOf(verdict) !== void 0 || !codexRaisesItsOwnPrompts(permissionMode));
|
|
3759
|
-
var runsACommandThatNeedsAPerson = ({ toolName, toolInputs }) => toolName
|
|
5217
|
+
var runsACommandThatNeedsAPerson = ({ toolName, toolInputs }) => SHELL_DIALECT_BY_TOOL.has(toolName) && toolInputs.some((toolInput) => {
|
|
3760
5218
|
const command = extractPolicyArg(toolName, toolInput);
|
|
3761
5219
|
return command !== void 0 && (commandNeedsAPerson(toolName, command) || commandWritesThroughARemoteApi(command));
|
|
3762
5220
|
});
|
|
3763
|
-
var CI_WORKFLOW_FILE = /(?:^|\/)\.github\/workflows\/[^/]
|
|
3764
|
-
var FILE_WRITING_TOOLS = /* @__PURE__ */ new Set(["Edit", "Write", "MultiEdit", "NotebookEdit"]);
|
|
5221
|
+
var CI_WORKFLOW_FILE = /(?:^|\/)\.github\/workflows\/[^/]+$/i;
|
|
3765
5222
|
var namesASecretOrWorkflowFile = (path) => SECRET_FILE_NAME.test(basenameOf(path)) || CI_WORKFLOW_FILE.test(normalizeSeparators(path));
|
|
3766
|
-
var
|
|
5223
|
+
var fileEditNeedsAPerson = (toolName, path) => FILE_EDIT_TOOLS.has(toolName) && namesASecretOrWorkflowFile(path);
|
|
5224
|
+
var editsAFileThatNeedsAPerson = ({ toolName, toolInputs }) => toolInputs.some((toolInput) => {
|
|
3767
5225
|
const path = extractPolicyArg(toolName, toolInput);
|
|
3768
|
-
return path !== void 0 &&
|
|
5226
|
+
return path !== void 0 && fileEditNeedsAPerson(toolName, path);
|
|
3769
5227
|
});
|
|
3770
|
-
var codexCallNeedsAPerson = (input, verdict, call) => onlyCodexPreToolUseCanAsk(verdict, call.permissionMode) || verdict.kind === "gate" && (aChosenRuleGoverns(input) || call.deletesFiles || runsACommandThatNeedsAPerson(input) ||
|
|
5228
|
+
var codexCallNeedsAPerson = (input, verdict, call) => onlyCodexPreToolUseCanAsk(verdict, call.permissionMode) || verdict.kind === "gate" && (aChosenRuleGoverns(input) || call.deletesFiles || runsACommandThatNeedsAPerson(input) || editsAFileThatNeedsAPerson(input));
|
|
3771
5229
|
var MAX_AGENT_PERMISSION_RULES_PER_KIND = 256;
|
|
3772
5230
|
var MAX_AGENT_PERMISSION_RULE_LENGTH = 512;
|
|
3773
5231
|
var isAgentPermissionRule = (value) => typeof value === "string" && value.length > 0 && value.length <= MAX_AGENT_PERMISSION_RULE_LENGTH;
|
|
@@ -3802,7 +5260,8 @@ var allowRulesGrant = (rules, toolName, args) => {
|
|
|
3802
5260
|
var inputNeedsAPerson = (toolName, toolInput) => {
|
|
3803
5261
|
const arg = extractPolicyArg(toolName, toolInput);
|
|
3804
5262
|
if (arg === void 0) return false;
|
|
3805
|
-
|
|
5263
|
+
if (toolName in POLICY_COMMAND_KEYS) return commandNeedsAPerson(toolName, arg);
|
|
5264
|
+
return fileEditNeedsAPerson(toolName, arg) || classifyDecisionRisk(toolName, arg) !== "standard";
|
|
3806
5265
|
};
|
|
3807
5266
|
var agentRulesAllowEveryInput = (rules, toolName, toolInputs, cwd) => rules.allow.length > 0 && toolInputs.length > 0 && toolInputs.every((toolInput) => {
|
|
3808
5267
|
const args = policyArgForms(toolName, toolInput, cwd);
|
|
@@ -4010,6 +5469,9 @@ var WITHDRAWN_APPROVAL_REASON = "The phone question was withdrawn. Approve in th
|
|
|
4010
5469
|
var PLAN_DECLINED_REASON = "Plan declined from the phone. Ask what to change before coding.";
|
|
4011
5470
|
var claudeStoppedPreToolUseOutput = (reason) => stoppedOutput(claudePreToolUseOutput("deny", reason), reason);
|
|
4012
5471
|
var claudeStoppedPermissionRequestOutput = (reason) => stoppedOutput(claudePermissionRequestOutput("deny", reason), reason);
|
|
5472
|
+
var UNANSWERED_ASKS_BEFORE_PAUSE = 3;
|
|
5473
|
+
var SESSION_PAUSED_REASON = `Phone approvals for this session are paused because ${UNANSWERED_ASKS_BEFORE_PAUSE} of them went unanswered, so this was refused without asking anyone. A notification was sent to your phone: tap Approve on it to resume, then run this again.`;
|
|
5474
|
+
var unansweredRefusalReason = (paused) => paused ? SESSION_PAUSED_REASON : NO_RESPONSE_REASON;
|
|
4013
5475
|
var UNHEARD_PUSH_WINDOW_DAYS = 14;
|
|
4014
5476
|
var DAY_MS = 24 * 60 * 60 * 1e3;
|
|
4015
5477
|
var UNHEARD_PUSH_WINDOW_MS = UNHEARD_PUSH_WINDOW_DAYS * DAY_MS;
|
|
@@ -4334,6 +5796,8 @@ export {
|
|
|
4334
5796
|
MAX_HOOK_ACTIVATION_EVIDENCE_ROWS,
|
|
4335
5797
|
isHookActivationReport,
|
|
4336
5798
|
hookActivationResult,
|
|
5799
|
+
CLIENT_REPORT_PATH,
|
|
5800
|
+
clientContextHeaders,
|
|
4337
5801
|
PAIR_TTL_SECONDS,
|
|
4338
5802
|
computerOsOfPlatform,
|
|
4339
5803
|
SETUP_AGENT_CHOICES,
|
|
@@ -4341,8 +5805,6 @@ export {
|
|
|
4341
5805
|
NO_PAIRING_COMPUTER,
|
|
4342
5806
|
SETUP_CONNECT_MODES,
|
|
4343
5807
|
isSetupConnectMode,
|
|
4344
|
-
CLIENT_REPORT_PATH,
|
|
4345
|
-
clientContextHeaders,
|
|
4346
5808
|
DECLINED_AGENTS_FILE,
|
|
4347
5809
|
parseDeclinedAgents,
|
|
4348
5810
|
serializeDeclinedAgents,
|
|
@@ -4411,7 +5873,6 @@ export {
|
|
|
4411
5873
|
SCOPE_BATCH_REASON,
|
|
4412
5874
|
UNREADABLE_CALL_REASON,
|
|
4413
5875
|
unapprovedScopeReason,
|
|
4414
|
-
NO_RESPONSE_REASON,
|
|
4415
5876
|
codexHasNoPromptOfItsOwn,
|
|
4416
5877
|
codexUnansweredPreToolUse,
|
|
4417
5878
|
HANDED_BACK_REASON,
|
|
@@ -4444,6 +5905,8 @@ export {
|
|
|
4444
5905
|
PLAN_DECLINED_REASON,
|
|
4445
5906
|
claudeStoppedPreToolUseOutput,
|
|
4446
5907
|
claudeStoppedPermissionRequestOutput,
|
|
5908
|
+
SESSION_PAUSED_REASON,
|
|
5909
|
+
unansweredRefusalReason,
|
|
4447
5910
|
ELICITATION_ANSWERABLE_MODE,
|
|
4448
5911
|
readElicitationFields,
|
|
4449
5912
|
planElicitationAsk,
|