pushary 1.9.30 → 1.9.32
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 +18 -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 +25 -25
- package/dist/bin/pushary-clean.js +29 -29
- package/dist/bin/pushary-codex-bridge.js +17 -17
- package/dist/bin/pushary-codex-hook.js +31 -31
- 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-ZLKJHXSC.js → chunk-2GYTGLML.js} +4 -4
- package/dist/{chunk-GSMB7FWI.js → chunk-5LXIM5LF.js} +7 -7
- package/dist/{chunk-JHVSVVHB.js → chunk-5SMAW6N7.js} +177 -56
- package/dist/{chunk-HMA7QQ3P.js → chunk-6C57SBLO.js} +4 -4
- package/dist/{chunk-2VQULZ4L.js → chunk-6ILLZXCS.js} +2 -2
- package/dist/{chunk-6R22H57A.js → chunk-6R7RZMN5.js} +2 -2
- package/dist/{chunk-XKSAXKRY.js → chunk-7ENPTXR4.js} +3 -3
- package/dist/{chunk-OARF7TWF.js → chunk-7HIODNBA.js} +6 -6
- package/dist/{chunk-SMA7LUCS.js → chunk-7OMOUQSU.js} +1 -1
- package/dist/{chunk-MYTWZ33A.js → chunk-AGMKXRLQ.js} +3 -3
- package/dist/{chunk-3QKX22ZA.js → chunk-ALJEKG2D.js} +3 -3
- package/dist/{chunk-XLNSQLTV.js → chunk-BQQQ4NP5.js} +8 -8
- package/dist/{chunk-3HTCA4SQ.js → chunk-BWPR75C3.js} +1 -1
- package/dist/{chunk-IMUCTAM2.js → chunk-BZ3GN2YK.js} +1 -1
- package/dist/{chunk-2OIGS4P2.js → chunk-CBRLV3W7.js} +3 -3
- package/dist/{chunk-VTR4VRL2.js → chunk-DWQYCOPI.js} +2 -4
- package/dist/{chunk-EDEEITT3.js → chunk-DXFMP37X.js} +5 -5
- package/dist/{chunk-SMAY3CGD.js → chunk-EFQPXGND.js} +2 -2
- package/dist/{chunk-XZRRYMY2.js → chunk-EUUB3NI5.js} +4 -4
- package/dist/{chunk-SM4P6VIY.js → chunk-F3TI7CYV.js} +1 -1
- package/dist/{chunk-NKDK3H3I.js → chunk-FAINF4IK.js} +4 -4
- package/dist/{chunk-KHYUAZPL.js → chunk-FZ2EGAEA.js} +2 -2
- package/dist/{chunk-DU6UZXGV.js → chunk-GF45OS6U.js} +2 -2
- package/dist/{chunk-LD3A63IE.js → chunk-H7F2IN22.js} +3 -3
- package/dist/{chunk-E2WJLU5U.js → chunk-HFRRSYTG.js} +1 -1
- package/dist/{chunk-GFY6XONT.js → chunk-I3N5LPFB.js} +5 -5
- package/dist/{chunk-S6J3A4DF.js → chunk-I6D5BGFF.js} +1 -1
- package/dist/{chunk-YZPCDR32.js → chunk-IPJRYHDC.js} +4 -4
- package/dist/{chunk-H7HRHS3M.js → chunk-IW6MFF5I.js} +4 -4
- package/dist/{chunk-RZTWWE26.js → chunk-J2OVVMBU.js} +1 -1
- package/dist/{chunk-JBVKA3UR.js → chunk-JD6HIO7N.js} +731 -108
- package/dist/{chunk-V2FRBKMP.js → chunk-JH2TTKC4.js} +2 -2
- package/dist/{chunk-MTPE6BW7.js → chunk-K7NUD23S.js} +1 -1
- package/dist/{chunk-KRZECDHA.js → chunk-KTFZKXRE.js} +2 -2
- package/dist/{chunk-4GIGQIRN.js → chunk-L5WCPMWZ.js} +2 -2
- package/dist/{chunk-OQ5K6QHU.js → chunk-LA6Q2BJF.js} +5 -5
- package/dist/{chunk-VTTHXOCR.js → chunk-LBD7QQ2V.js} +2 -2
- package/dist/{chunk-2QEW5FJK.js → chunk-MKYICE44.js} +4 -4
- package/dist/{chunk-PWQN4D6R.js → chunk-NFABDPWT.js} +5 -5
- package/dist/{chunk-CI2H3U7O.js → chunk-NRM4QJKG.js} +2 -2
- package/dist/{chunk-QYD5TN2J.js → chunk-OT6QTOOR.js} +5 -5
- package/dist/{chunk-SAGO6JNL.js → chunk-PQ3QV523.js} +1 -1
- package/dist/{chunk-T4KXYKDL.js → chunk-QRDTNXP2.js} +5 -5
- package/dist/{chunk-AO75FKBR.js → chunk-S5J2ZFQK.js} +3 -3
- package/dist/{chunk-PGFLQXW5.js → chunk-SUXSVHCP.js} +2 -2
- package/dist/{chunk-7JO33ODX.js → chunk-UOVREWK3.js} +3 -3
- package/dist/{chunk-434NFCK2.js → chunk-WAR24VWD.js} +1 -1
- package/dist/{chunk-CS5JKDWW.js → chunk-XJEIN2FJ.js} +2 -2
- package/dist/{chunk-Q6HJD6SH.js → chunk-Y25UXZQT.js} +1 -1
- package/dist/{chunk-DP6FJABB.js → chunk-Y53KKEMZ.js} +1 -1
- package/dist/{chunk-6DJBVMTR.js → chunk-YTVNKMOA.js} +1 -1
- package/dist/{chunk-XNKFK27C.js → chunk-Z73AKQYU.js} +1 -1
- package/dist/{chunk-KT4SP73I.js → chunk-ZLHBY5BV.js} +4 -4
- package/dist/{chunk-J3HI2SRD.js → chunk-ZVPADGCH.js} +1 -1
- package/dist/{chunk-3FIKV3PW.js → chunk-ZZ4C47Z2.js} +11 -11
- package/dist/{global-upgrade-JDZPAQ6B.js → global-upgrade-B6E7DWGC.js} +6 -6
- package/dist/{paths-4QBYMQHK.js → paths-H4Q6OES7.js} +2 -2
- package/dist/{reapply-26GMHUWI.js → reapply-HXIKYN5E.js} +20 -20
- package/dist/src/index.js +19 -19
- package/dist/{upgrade-lock-DIRCINDI.js → upgrade-lock-MLXS6NH2.js} +3 -3
- package/package.json +1 -1
|
@@ -1750,6 +1750,539 @@ var powerShellCommandHasAVisibleConsequence = (command, judge) => {
|
|
|
1750
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
1751
|
};
|
|
1752
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 BRACKET_IDENTIFIER_OPEN = "[";
|
|
1762
|
+
var BRACKET_IDENTIFIER_CLOSE = "]";
|
|
1763
|
+
var BACKSLASH = "\\";
|
|
1764
|
+
var DOLLAR = "$";
|
|
1765
|
+
var DASH_DASH = "--";
|
|
1766
|
+
var HASH = "#";
|
|
1767
|
+
var BLOCK_COMMENT_OPEN2 = "/*";
|
|
1768
|
+
var BLOCK_COMMENT_CLOSE2 = "*/";
|
|
1769
|
+
var NEWLINE2 = "\n";
|
|
1770
|
+
var CARRIAGE_RETURN2 = "\r";
|
|
1771
|
+
var TRIPLE_QUOTE_LENGTH = 3;
|
|
1772
|
+
var CLIENT_COMMAND_LENGTH = 2;
|
|
1773
|
+
var UNICODE_ESCAPE_PREFIX = /^[uU]&$/;
|
|
1774
|
+
var ESCAPE_STRING_PREFIX = /^[eE]$/;
|
|
1775
|
+
var EXECUTABLE_COMMENT_OPENER = /^\/\*M?!/;
|
|
1776
|
+
var ASCII_LETTER_OR_UNDERSCORE = /^[A-Za-z_]$/;
|
|
1777
|
+
var DECIMAL_DIGIT = /^[0-9]$/;
|
|
1778
|
+
var DECIMAL_DIGITS = /^[0-9]+$/;
|
|
1779
|
+
var ANY_WHITESPACE = /^\s$/;
|
|
1780
|
+
var STATEMENT_TERMINATOR_CLIENT_COMMAND = /^\\[gG]$/;
|
|
1781
|
+
var SQL_MODE_SETTING = /\bsql_mode\b/i;
|
|
1782
|
+
var FIRST_NON_ASCII = "\x80";
|
|
1783
|
+
var FIRST_NON_ASCII_CODE = 128;
|
|
1784
|
+
var LAST_ASCII_CONTROL_OR_SPACE = 32;
|
|
1785
|
+
var ASCII_DELETE = 127;
|
|
1786
|
+
var MYSQL_WHITESPACE = /* @__PURE__ */ new Set([" ", " ", "\n", "\v", "\f", "\r"]);
|
|
1787
|
+
var ESCAPE_STRING_SYNTAX = { backslashes: "escape", content: "hidden" };
|
|
1788
|
+
var isIdentifierStart = (character) => ASCII_LETTER_OR_UNDERSCORE.test(character) || character >= FIRST_NON_ASCII;
|
|
1789
|
+
var isDecimalDigit = (character) => DECIMAL_DIGIT.test(character);
|
|
1790
|
+
var isWordCharacter = (character) => isIdentifierStart(character) || isDecimalDigit(character);
|
|
1791
|
+
var isIdentifierPart = (character) => isWordCharacter(character) || character === DOLLAR;
|
|
1792
|
+
var isQuote = (character) => character === SINGLE_QUOTE || character === DOUBLE_QUOTE || character === BACKTICK;
|
|
1793
|
+
var isLineCommentTerminator = (character) => character === NEWLINE2 || character === CARRIAGE_RETURN2;
|
|
1794
|
+
var isControlOrSpace = (character) => {
|
|
1795
|
+
const code = character.charCodeAt(0);
|
|
1796
|
+
return code <= LAST_ASCII_CONTROL_OR_SPACE || code === ASCII_DELETE;
|
|
1797
|
+
};
|
|
1798
|
+
var followsNonAsciiText = (source, index) => source.charCodeAt(index - 1) >= FIRST_NON_ASCII_CODE;
|
|
1799
|
+
var mayBeAMultibyteTrailByte = (source, index, lexicon) => lexicon.clientCharsets === "may-be-multibyte" && followsNonAsciiText(source, index);
|
|
1800
|
+
var endOfRun = (source, start, belongs) => {
|
|
1801
|
+
let index = start;
|
|
1802
|
+
while (index < source.length && belongs(source.charAt(index))) index += 1;
|
|
1803
|
+
return index;
|
|
1804
|
+
};
|
|
1805
|
+
var dollarQuoteDelimiterAt = (source, start) => {
|
|
1806
|
+
if (source.charAt(start) !== DOLLAR) return void 0;
|
|
1807
|
+
const tagStart = start + 1;
|
|
1808
|
+
const tagEnd = isIdentifierStart(source.charAt(tagStart)) ? endOfRun(source, tagStart, isWordCharacter) : tagStart;
|
|
1809
|
+
return source.charAt(tagEnd) === DOLLAR ? source.slice(start, tagEnd + 1) : void 0;
|
|
1810
|
+
};
|
|
1811
|
+
var doubledQuoteEnd = (source, from, quote, backslashBeforeTheQuote) => {
|
|
1812
|
+
for (let index = from; index < source.length; index += 1) {
|
|
1813
|
+
if (backslashBeforeTheQuote === "uncertain" && source[index] === BACKSLASH && source[index + 1] === quote) return "uncertain";
|
|
1814
|
+
if (source[index] !== quote) continue;
|
|
1815
|
+
if (source[index + 1] === quote) index += 1;
|
|
1816
|
+
else return index + 1;
|
|
1817
|
+
}
|
|
1818
|
+
return "unterminated";
|
|
1819
|
+
};
|
|
1820
|
+
var escapedQuoteEnd = (source, from, closing, lexicon) => {
|
|
1821
|
+
for (let index = from; index < source.length; ) {
|
|
1822
|
+
if (source[index] === BACKSLASH) {
|
|
1823
|
+
if (mayBeAMultibyteTrailByte(source, index, lexicon)) return "uncertain";
|
|
1824
|
+
index += 2;
|
|
1825
|
+
} else if (!source.startsWith(closing, index)) {
|
|
1826
|
+
index += 1;
|
|
1827
|
+
} else if (closing.length === 1 && source[index + 1] === closing) {
|
|
1828
|
+
index += 2;
|
|
1829
|
+
} else {
|
|
1830
|
+
return index + closing.length;
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
return "unterminated";
|
|
1834
|
+
};
|
|
1835
|
+
var blockCommentEnd = (source, start, lexicon) => {
|
|
1836
|
+
let depth = 0;
|
|
1837
|
+
let index = start + BLOCK_COMMENT_OPEN2.length;
|
|
1838
|
+
while (index < source.length) {
|
|
1839
|
+
if (source.startsWith(BLOCK_COMMENT_OPEN2, index)) {
|
|
1840
|
+
if (lexicon.nestedBlockComments === "uncertain") return "uncertain";
|
|
1841
|
+
depth += 1;
|
|
1842
|
+
index += BLOCK_COMMENT_OPEN2.length;
|
|
1843
|
+
} else if (!source.startsWith(BLOCK_COMMENT_CLOSE2, index)) {
|
|
1844
|
+
index += 1;
|
|
1845
|
+
} else if (depth === 0) {
|
|
1846
|
+
return index + BLOCK_COMMENT_CLOSE2.length;
|
|
1847
|
+
} else {
|
|
1848
|
+
depth -= 1;
|
|
1849
|
+
index += BLOCK_COMMENT_CLOSE2.length;
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
return "uncertain";
|
|
1853
|
+
};
|
|
1854
|
+
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));
|
|
1855
|
+
var quotedTextSyntaxOf = (quote, lexicon) => {
|
|
1856
|
+
if (quote === SINGLE_QUOTE) return lexicon.singleQuotes;
|
|
1857
|
+
if (quote === DOUBLE_QUOTE) return lexicon.doubleQuotes;
|
|
1858
|
+
return lexicon.backticks;
|
|
1859
|
+
};
|
|
1860
|
+
var syntaxOfQuoteAt = (source, start, lexicon) => opensAnEscapeString(source, start, lexicon) ? ESCAPE_STRING_SYNTAX : quotedTextSyntaxOf(source.charAt(start), lexicon);
|
|
1861
|
+
var openerOfQuoteAt = (source, start, lexicon) => {
|
|
1862
|
+
const triple = source.charAt(start).repeat(TRIPLE_QUOTE_LENGTH);
|
|
1863
|
+
return lexicon.tripleQuotes === "quote" && source.startsWith(triple, start) ? triple : source.charAt(start);
|
|
1864
|
+
};
|
|
1865
|
+
var readsBackslashesLiterally = (syntax, reading) => syntax.backslashes === "escape-unless-the-sql-mode-disables-it" && reading.backslashMode === "literal";
|
|
1866
|
+
var quotedTextEnd = (source, start, opener, syntax, reading) => {
|
|
1867
|
+
const from = start + opener.length;
|
|
1868
|
+
if (opener.length > 1) return escapedQuoteEnd(source, from, opener, reading.lexicon);
|
|
1869
|
+
const end = doubledQuoteEnd(source, from, opener, "uncertain");
|
|
1870
|
+
if (end !== "uncertain" || syntax.backslashes === "uncertain-before-the-quote") return end;
|
|
1871
|
+
return readsBackslashesLiterally(syntax, reading) ? doubledQuoteEnd(source, from, opener, "ordinary") : escapedQuoteEnd(source, from, opener, reading.lexicon);
|
|
1872
|
+
};
|
|
1873
|
+
var opensAUnicodeEscapedQuote = (source, start) => source.charAt(start) !== SINGLE_QUOTE && UNICODE_ESCAPE_PREFIX.test(source.slice(Math.max(0, start - 2), start));
|
|
1874
|
+
var swallowsABacktick = (source, start, end, lexicon) => {
|
|
1875
|
+
if (source.charAt(start) !== BACKTICK) return false;
|
|
1876
|
+
for (let index = start; index !== -1 && index < end; index = source.indexOf(BACKTICK, index + 1)) {
|
|
1877
|
+
if (mayBeAMultibyteTrailByte(source, index, lexicon)) return true;
|
|
1878
|
+
}
|
|
1879
|
+
return false;
|
|
1880
|
+
};
|
|
1881
|
+
var unterminatedTextRunsToTheEnd = (reading) => reading.backslashMode === "literal";
|
|
1882
|
+
var visibleQuotedText = (content) => `${TOKEN_GAP}${content}${TOKEN_GAP}`;
|
|
1883
|
+
var quotedToken = (source, start, reading, inside) => {
|
|
1884
|
+
if (opensAUnicodeEscapedQuote(source, start)) return "uncertain";
|
|
1885
|
+
const syntax = syntaxOfQuoteAt(source, start, reading.lexicon);
|
|
1886
|
+
const opener = openerOfQuoteAt(source, start, reading.lexicon);
|
|
1887
|
+
const end = quotedTextEnd(source, start, opener, syntax, reading);
|
|
1888
|
+
if (end === "uncertain") return "uncertain";
|
|
1889
|
+
if (end === "unterminated") {
|
|
1890
|
+
return unterminatedTextRunsToTheEnd(reading) ? { text: STRING_PLACEHOLDER, end: source.length, insideExecutableComment: inside } : "uncertain";
|
|
1891
|
+
}
|
|
1892
|
+
if (swallowsABacktick(source, start, end, reading.lexicon)) return "uncertain";
|
|
1893
|
+
const quote = source.charAt(start);
|
|
1894
|
+
const text = syntax.content === "hidden" ? STRING_PLACEHOLDER : visibleQuotedText(source.slice(start + opener.length, end - opener.length).replaceAll(quote + quote, quote));
|
|
1895
|
+
return { text, end, insideExecutableComment: inside };
|
|
1896
|
+
};
|
|
1897
|
+
var lineCommentEnd = (source, start, lexicon) => {
|
|
1898
|
+
const terminator = endOfRun(source, start, (character) => !isLineCommentTerminator(character));
|
|
1899
|
+
if (source.charAt(terminator) !== CARRIAGE_RETURN2) return terminator;
|
|
1900
|
+
if (lexicon.carriageReturnInLineComment === "uncertain") return "uncertain";
|
|
1901
|
+
if (lexicon.carriageReturnInLineComment === "ends-the-comment") return terminator;
|
|
1902
|
+
const newline = source.indexOf(NEWLINE2, terminator);
|
|
1903
|
+
return newline === -1 ? source.length : newline;
|
|
1904
|
+
};
|
|
1905
|
+
var lineCommentToken = (source, start, lexicon, inside) => {
|
|
1906
|
+
if (inside) return "uncertain";
|
|
1907
|
+
const end = lineCommentEnd(source, start, lexicon);
|
|
1908
|
+
return end === "uncertain" ? "uncertain" : { text: TOKEN_GAP, end, insideExecutableComment: false };
|
|
1909
|
+
};
|
|
1910
|
+
var dashDashStartsAComment = (next, lexicon) => {
|
|
1911
|
+
if (lexicon.dashDash === "comment" || next === "") return true;
|
|
1912
|
+
if (lexicon.dashDash === "uncertain-before-text") return ANY_WHITESPACE.test(next) || "uncertain";
|
|
1913
|
+
if (MYSQL_WHITESPACE.has(next)) return true;
|
|
1914
|
+
return isControlOrSpace(next) ? "uncertain" : false;
|
|
1915
|
+
};
|
|
1916
|
+
var dashDashToken = (source, start, lexicon, inside) => {
|
|
1917
|
+
const startsAComment = dashDashStartsAComment(source.charAt(start + DASH_DASH.length), lexicon);
|
|
1918
|
+
if (startsAComment === "uncertain") return "uncertain";
|
|
1919
|
+
return startsAComment ? lineCommentToken(source, start, lexicon, inside) : { text: source.charAt(start), end: start + 1, insideExecutableComment: inside };
|
|
1920
|
+
};
|
|
1921
|
+
var hashToken = (source, start, lexicon, inside) => {
|
|
1922
|
+
if (lexicon.hash === "uncertain") return "uncertain";
|
|
1923
|
+
if (lexicon.hash === "comment") return lineCommentToken(source, start, lexicon, inside);
|
|
1924
|
+
return { text: HASH, end: start + 1, insideExecutableComment: inside };
|
|
1925
|
+
};
|
|
1926
|
+
var blockCommentToken = (source, start, lexicon, inside) => {
|
|
1927
|
+
if (inside) return "uncertain";
|
|
1928
|
+
const opener = EXECUTABLE_COMMENT_OPENER.exec(source.slice(start, start + 4))?.[0];
|
|
1929
|
+
if (opener !== void 0 && lexicon.executableComments === "uncertain") return "uncertain";
|
|
1930
|
+
if (opener !== void 0) {
|
|
1931
|
+
return { text: TOKEN_GAP, end: endOfRun(source, start + opener.length, isDecimalDigit), insideExecutableComment: true };
|
|
1932
|
+
}
|
|
1933
|
+
const end = blockCommentEnd(source, start, lexicon);
|
|
1934
|
+
return end === "uncertain" ? "uncertain" : { text: TOKEN_GAP, end, insideExecutableComment: false };
|
|
1935
|
+
};
|
|
1936
|
+
var dollarToken = (source, start, lexicon, inside) => {
|
|
1937
|
+
const delimiter = dollarQuoteDelimiterAt(source, start);
|
|
1938
|
+
if (delimiter === void 0) return { text: DOLLAR, end: start + 1, insideExecutableComment: inside };
|
|
1939
|
+
if (lexicon.dollarQuotes === "uncertain") return "uncertain";
|
|
1940
|
+
const close = source.indexOf(delimiter, start + delimiter.length);
|
|
1941
|
+
return close === -1 ? "uncertain" : { text: delimiter + delimiter, end: close + delimiter.length, insideExecutableComment: inside };
|
|
1942
|
+
};
|
|
1943
|
+
var numberToken = (source, start, inside) => {
|
|
1944
|
+
const end = endOfRun(source, start, isWordCharacter);
|
|
1945
|
+
const text = source.slice(start, end);
|
|
1946
|
+
if (!DECIMAL_DIGITS.test(text) && dollarQuoteDelimiterAt(source, end) !== void 0) return "uncertain";
|
|
1947
|
+
return { text, end, insideExecutableComment: inside };
|
|
1948
|
+
};
|
|
1949
|
+
var identifierToken = (source, start, inside) => {
|
|
1950
|
+
const end = endOfRun(source, start, isIdentifierPart);
|
|
1951
|
+
return { text: source.slice(start, end), end, insideExecutableComment: inside };
|
|
1952
|
+
};
|
|
1953
|
+
var clientCommandToken = (source, start, inside) => {
|
|
1954
|
+
const command = source.slice(start, start + CLIENT_COMMAND_LENGTH);
|
|
1955
|
+
return STATEMENT_TERMINATOR_CLIENT_COMMAND.test(command) ? { text: STATEMENT_SEPARATOR2, end: start + CLIENT_COMMAND_LENGTH, insideExecutableComment: inside } : "uncertain";
|
|
1956
|
+
};
|
|
1957
|
+
var squareBracketToken = (source, start, lexicon, inside) => {
|
|
1958
|
+
if (lexicon.squareBrackets === "uncertain") return "uncertain";
|
|
1959
|
+
if (lexicon.squareBrackets === "text") return { text: BRACKET_IDENTIFIER_OPEN, end: start + 1, insideExecutableComment: inside };
|
|
1960
|
+
const closing = source.indexOf(BRACKET_IDENTIFIER_CLOSE, start + 1);
|
|
1961
|
+
return closing === -1 ? "uncertain" : { text: visibleQuotedText(source.slice(start + 1, closing)), end: closing + 1, insideExecutableComment: inside };
|
|
1962
|
+
};
|
|
1963
|
+
var nextSqlToken = (source, start, reading, inside) => {
|
|
1964
|
+
const { lexicon } = reading;
|
|
1965
|
+
const character = source.charAt(start);
|
|
1966
|
+
if (character === BRACKET_IDENTIFIER_OPEN) return squareBracketToken(source, start, lexicon, inside);
|
|
1967
|
+
if (isQuote(character)) return quotedToken(source, start, reading, inside);
|
|
1968
|
+
if (source.startsWith(DASH_DASH, start)) return dashDashToken(source, start, lexicon, inside);
|
|
1969
|
+
if (character === HASH) return hashToken(source, start, lexicon, inside);
|
|
1970
|
+
if (source.startsWith(BLOCK_COMMENT_OPEN2, start)) return blockCommentToken(source, start, lexicon, inside);
|
|
1971
|
+
if (inside && source.startsWith(BLOCK_COMMENT_CLOSE2, start)) {
|
|
1972
|
+
return { text: TOKEN_GAP, end: start + BLOCK_COMMENT_CLOSE2.length, insideExecutableComment: false };
|
|
1973
|
+
}
|
|
1974
|
+
if (character === BACKSLASH && lexicon.backslashOutsideLiterals === "client-command") return clientCommandToken(source, start, inside);
|
|
1975
|
+
if (character === DOLLAR) return dollarToken(source, start, lexicon, inside);
|
|
1976
|
+
if (isIdentifierStart(character)) return identifierToken(source, start, inside);
|
|
1977
|
+
if (isDecimalDigit(character)) return numberToken(source, start, inside);
|
|
1978
|
+
return { text: character, end: start + 1, insideExecutableComment: inside };
|
|
1979
|
+
};
|
|
1980
|
+
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);
|
|
1981
|
+
var sqlReadingOf = (source, reading) => {
|
|
1982
|
+
const pieces = [];
|
|
1983
|
+
let inside = false;
|
|
1984
|
+
let backslashModeMatters = false;
|
|
1985
|
+
for (let index = 0; index < source.length; ) {
|
|
1986
|
+
const token = nextSqlToken(source, index, reading, inside);
|
|
1987
|
+
if (token === "uncertain") return "uncertain";
|
|
1988
|
+
backslashModeMatters ||= readsABackslashTheSqlModeDecides(source, index, token.end, reading.lexicon);
|
|
1989
|
+
pieces.push(token.text);
|
|
1990
|
+
inside = token.insideExecutableComment;
|
|
1991
|
+
index = token.end;
|
|
1992
|
+
}
|
|
1993
|
+
return inside ? "uncertain" : { text: pieces.join(""), backslashModeMatters };
|
|
1994
|
+
};
|
|
1995
|
+
var sqlModeDecidesBackslashes = (lexicon) => [lexicon.singleQuotes, lexicon.doubleQuotes, lexicon.backticks].some((syntax) => syntax.backslashes === "escape-unless-the-sql-mode-disables-it");
|
|
1996
|
+
var backslashModesOf = (lexicon) => sqlModeDecidesBackslashes(lexicon) ? ["escape", "literal"] : ["escape"];
|
|
1997
|
+
var isReadingText = (result) => result !== "uncertain";
|
|
1998
|
+
var mayChangeTheBackslashMode = (readings) => readings.some((reading) => reading.backslashModeMatters) && readings.some((reading) => SQL_MODE_SETTING.test(reading.text));
|
|
1999
|
+
var sqlOutsideLiterals = (source, lexicon) => {
|
|
2000
|
+
const results = backslashModesOf(lexicon).map((backslashMode) => sqlReadingOf(source, { lexicon, backslashMode }));
|
|
2001
|
+
const readings = results.filter(isReadingText);
|
|
2002
|
+
if (readings.length < results.length || mayChangeTheBackslashMode(readings)) return UNCERTAIN_SQL;
|
|
2003
|
+
return { kind: "readable", texts: [...new Set(readings.map((reading) => reading.text))] };
|
|
2004
|
+
};
|
|
2005
|
+
|
|
2006
|
+
// ../contracts/src/command-analysis/sql-clients.ts
|
|
2007
|
+
var STRING_WITH_DOUBLED_QUOTES = { backslashes: "uncertain-before-the-quote", content: "hidden" };
|
|
2008
|
+
var IDENTIFIER_WITH_DOUBLED_QUOTES = { backslashes: "uncertain-before-the-quote", content: "shown" };
|
|
2009
|
+
var MYSQL_STRING = { backslashes: "escape-unless-the-sql-mode-disables-it", content: "hidden" };
|
|
2010
|
+
var STRING_WITH_BACKSLASH_ESCAPES = { backslashes: "escape", content: "hidden" };
|
|
2011
|
+
var SHOWN_TEXT_WITH_BACKSLASH_ESCAPES = { backslashes: "escape", content: "shown" };
|
|
2012
|
+
var POSTGRES_LEXICON = {
|
|
2013
|
+
squareBrackets: "text",
|
|
2014
|
+
singleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
2015
|
+
doubleQuotes: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
2016
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
2017
|
+
tripleQuotes: "absent",
|
|
2018
|
+
escapeStringPrefix: "backslash-escapes",
|
|
2019
|
+
dollarQuotes: "string",
|
|
2020
|
+
dashDash: "comment",
|
|
2021
|
+
carriageReturnInLineComment: "ends-the-comment",
|
|
2022
|
+
hash: "text",
|
|
2023
|
+
executableComments: "uncertain",
|
|
2024
|
+
nestedBlockComments: "nest",
|
|
2025
|
+
backslashOutsideLiterals: "text",
|
|
2026
|
+
clientCharsets: "may-be-multibyte"
|
|
2027
|
+
};
|
|
2028
|
+
var MYSQL_LEXICON = {
|
|
2029
|
+
squareBrackets: "uncertain",
|
|
2030
|
+
singleQuotes: MYSQL_STRING,
|
|
2031
|
+
doubleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
2032
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
2033
|
+
tripleQuotes: "absent",
|
|
2034
|
+
escapeStringPrefix: "absent",
|
|
2035
|
+
dollarQuotes: "uncertain",
|
|
2036
|
+
dashDash: "comment-before-whitespace",
|
|
2037
|
+
carriageReturnInLineComment: "stays-in-the-comment",
|
|
2038
|
+
hash: "comment",
|
|
2039
|
+
executableComments: "executed",
|
|
2040
|
+
nestedBlockComments: "uncertain",
|
|
2041
|
+
backslashOutsideLiterals: "client-command",
|
|
2042
|
+
clientCharsets: "may-be-multibyte"
|
|
2043
|
+
};
|
|
2044
|
+
var SQLITE_LEXICON = {
|
|
2045
|
+
squareBrackets: "identifier",
|
|
2046
|
+
singleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
2047
|
+
doubleQuotes: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
2048
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
2049
|
+
tripleQuotes: "absent",
|
|
2050
|
+
escapeStringPrefix: "absent",
|
|
2051
|
+
dollarQuotes: "uncertain",
|
|
2052
|
+
dashDash: "comment",
|
|
2053
|
+
carriageReturnInLineComment: "stays-in-the-comment",
|
|
2054
|
+
hash: "text",
|
|
2055
|
+
executableComments: "uncertain",
|
|
2056
|
+
nestedBlockComments: "uncertain",
|
|
2057
|
+
backslashOutsideLiterals: "text",
|
|
2058
|
+
clientCharsets: "unicode"
|
|
2059
|
+
};
|
|
2060
|
+
var GOOGLE_SQL_LEXICON = {
|
|
2061
|
+
squareBrackets: "text",
|
|
2062
|
+
singleQuotes: STRING_WITH_BACKSLASH_ESCAPES,
|
|
2063
|
+
doubleQuotes: SHOWN_TEXT_WITH_BACKSLASH_ESCAPES,
|
|
2064
|
+
backticks: SHOWN_TEXT_WITH_BACKSLASH_ESCAPES,
|
|
2065
|
+
tripleQuotes: "quote",
|
|
2066
|
+
escapeStringPrefix: "absent",
|
|
2067
|
+
dollarQuotes: "uncertain",
|
|
2068
|
+
dashDash: "comment",
|
|
2069
|
+
carriageReturnInLineComment: "uncertain",
|
|
2070
|
+
hash: "comment",
|
|
2071
|
+
executableComments: "uncertain",
|
|
2072
|
+
nestedBlockComments: "uncertain",
|
|
2073
|
+
backslashOutsideLiterals: "text",
|
|
2074
|
+
clientCharsets: "unicode"
|
|
2075
|
+
};
|
|
2076
|
+
var UNVERIFIED_SQL_LEXICON = {
|
|
2077
|
+
squareBrackets: "uncertain",
|
|
2078
|
+
singleQuotes: STRING_WITH_DOUBLED_QUOTES,
|
|
2079
|
+
doubleQuotes: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
2080
|
+
backticks: IDENTIFIER_WITH_DOUBLED_QUOTES,
|
|
2081
|
+
tripleQuotes: "absent",
|
|
2082
|
+
escapeStringPrefix: "absent",
|
|
2083
|
+
dollarQuotes: "uncertain",
|
|
2084
|
+
dashDash: "uncertain-before-text",
|
|
2085
|
+
carriageReturnInLineComment: "uncertain",
|
|
2086
|
+
hash: "uncertain",
|
|
2087
|
+
executableComments: "uncertain",
|
|
2088
|
+
nestedBlockComments: "uncertain",
|
|
2089
|
+
backslashOutsideLiterals: "text",
|
|
2090
|
+
clientCharsets: "may-be-multibyte"
|
|
2091
|
+
};
|
|
2092
|
+
var MYSQL_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-e", "--execute"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false, lexicon: MYSQL_LEXICON };
|
|
2093
|
+
var SQLITE_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-init"]), positionalSql: true, lexicon: SQLITE_LEXICON };
|
|
2094
|
+
var SQL_CLIENT_SYNTAX = /* @__PURE__ */ new Map([
|
|
2095
|
+
["psql", { inlineFlags: /* @__PURE__ */ new Set(["-c", "--command"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false, lexicon: POSTGRES_LEXICON }],
|
|
2096
|
+
["mysql", MYSQL_SYNTAX],
|
|
2097
|
+
["mariadb", MYSQL_SYNTAX],
|
|
2098
|
+
["sqlite3", SQLITE_SYNTAX],
|
|
2099
|
+
["sqlite", SQLITE_SYNTAX],
|
|
2100
|
+
["duckdb", { inlineFlags: /* @__PURE__ */ new Set(["-c", "-s", "-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "-init"]), positionalSql: true, lexicon: UNVERIFIED_SQL_LEXICON }],
|
|
2101
|
+
["clickhouse-client", { inlineFlags: /* @__PURE__ */ new Set(["-q", "--query"]), scriptFlags: /* @__PURE__ */ new Set(["--queries-file"]), positionalSql: false, lexicon: UNVERIFIED_SQL_LEXICON }],
|
|
2102
|
+
["bq", { inlineFlags: /* @__PURE__ */ new Set(), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: true, lexicon: GOOGLE_SQL_LEXICON }],
|
|
2103
|
+
["mongosh", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false, lexicon: UNVERIFIED_SQL_LEXICON }],
|
|
2104
|
+
["mongo", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false, lexicon: UNVERIFIED_SQL_LEXICON }]
|
|
2105
|
+
]);
|
|
2106
|
+
|
|
2107
|
+
// ../contracts/src/command-analysis/env-invocation.ts
|
|
2108
|
+
var GNU_ENV = {
|
|
2109
|
+
shortOptions: { switches: /* @__PURE__ */ new Set(["i", "v", "0"]), withAValue: /* @__PURE__ */ new Set(["a", "C", "S", "u"]) },
|
|
2110
|
+
longOptions: [
|
|
2111
|
+
{ name: "argv0", argument: "required", effect: "continues" },
|
|
2112
|
+
{ name: "ignore-environment", argument: "none", effect: "continues" },
|
|
2113
|
+
{ name: "null", argument: "none", effect: "continues" },
|
|
2114
|
+
{ name: "unset", argument: "required", effect: "continues" },
|
|
2115
|
+
{ name: "chdir", argument: "required", effect: "continues" },
|
|
2116
|
+
{ name: "default-signal", argument: "optional", effect: "continues" },
|
|
2117
|
+
{ name: "ignore-signal", argument: "optional", effect: "continues" },
|
|
2118
|
+
{ name: "block-signal", argument: "optional", effect: "continues" },
|
|
2119
|
+
{ name: "list-signal-handling", argument: "none", effect: "continues" },
|
|
2120
|
+
{ name: "debug", argument: "none", effect: "continues" },
|
|
2121
|
+
{ name: "split-string", argument: "required", effect: "splits" },
|
|
2122
|
+
{ name: "help", argument: "none", effect: "exits" },
|
|
2123
|
+
{ name: "version", argument: "none", effect: "exits" }
|
|
2124
|
+
]
|
|
2125
|
+
};
|
|
2126
|
+
var BSD_ENV = {
|
|
2127
|
+
shortOptions: { switches: /* @__PURE__ */ new Set(["-", "i", "v", "0"]), withAValue: /* @__PURE__ */ new Set(["C", "L", "P", "S", "U", "u"]) },
|
|
2128
|
+
longOptions: null
|
|
2129
|
+
};
|
|
2130
|
+
var ENV_FLAVORS = [GNU_ENV, BSD_ENV];
|
|
2131
|
+
var UNREADABLE = { kind: "unreadable" };
|
|
2132
|
+
var RUNS_NOTHING = { kind: "runs-nothing" };
|
|
2133
|
+
var EXITS = { kind: "exits" };
|
|
2134
|
+
var SPLIT_STRING_LETTER = "S";
|
|
2135
|
+
var END_OF_OPTIONS = "--";
|
|
2136
|
+
var LONE_DASH = "-";
|
|
2137
|
+
var OPTION_PREFIX = "-";
|
|
2138
|
+
var NO_CLUSTER = "";
|
|
2139
|
+
var LONG_OPTION_PREFIX = "--";
|
|
2140
|
+
var ASSIGNMENT_SEPARATOR = "=";
|
|
2141
|
+
var nextOption = (next) => ({ kind: "next", next });
|
|
2142
|
+
var finished = (reading) => ({ kind: "done", reading });
|
|
2143
|
+
var commandAfterOptions = (args, firstOperand) => {
|
|
2144
|
+
let start = args[firstOperand]?.text === LONE_DASH ? firstOperand + 1 : firstOperand;
|
|
2145
|
+
while (args[start]?.text.includes(ASSIGNMENT_SEPARATOR)) start += 1;
|
|
2146
|
+
return { kind: "command", start };
|
|
2147
|
+
};
|
|
2148
|
+
var splitReading = (args, index, clusterBefore, attached) => {
|
|
2149
|
+
const word = args[index];
|
|
2150
|
+
const prefix = [...args.slice(0, index).map((arg) => arg.text), ...clusterBefore.length > 1 ? [clusterBefore] : []];
|
|
2151
|
+
if (word !== void 0 && attached !== void 0) return { kind: "split", prefix, value: { ...word, text: attached }, rest: index + 1 };
|
|
2152
|
+
return { kind: "split", prefix, value: args[index + 1], rest: index + 2 };
|
|
2153
|
+
};
|
|
2154
|
+
var requiredValueStep = (args, index) => index + 1 < args.length ? nextOption(index + 2) : finished(EXITS);
|
|
2155
|
+
var shortOptionStep = (args, index, text, options) => {
|
|
2156
|
+
for (let position = 1; position < text.length; position += 1) {
|
|
2157
|
+
const letter = text.charAt(position);
|
|
2158
|
+
if (options.switches.has(letter)) continue;
|
|
2159
|
+
if (!options.withAValue.has(letter)) return finished(EXITS);
|
|
2160
|
+
const attached = text.slice(position + 1);
|
|
2161
|
+
if (letter === SPLIT_STRING_LETTER) return finished(splitReading(args, index, text.slice(0, position), attached === "" ? void 0 : attached));
|
|
2162
|
+
return attached === "" ? requiredValueStep(args, index) : nextOption(index + 1);
|
|
2163
|
+
}
|
|
2164
|
+
return nextOption(index + 1);
|
|
2165
|
+
};
|
|
2166
|
+
var gnuLongOptionAbbreviatedBy = (name, options) => {
|
|
2167
|
+
const exact = options.find((option) => option.name === name);
|
|
2168
|
+
if (exact !== void 0) return exact;
|
|
2169
|
+
const candidates = options.filter((option) => option.name.startsWith(name));
|
|
2170
|
+
return candidates.length === 1 ? candidates[0] : void 0;
|
|
2171
|
+
};
|
|
2172
|
+
var longOptionStep = (args, index, text, options) => {
|
|
2173
|
+
const body = text.slice(LONG_OPTION_PREFIX.length);
|
|
2174
|
+
const separator = body.indexOf(ASSIGNMENT_SEPARATOR);
|
|
2175
|
+
const attached = separator === -1 ? void 0 : body.slice(separator + 1);
|
|
2176
|
+
const option = gnuLongOptionAbbreviatedBy(separator === -1 ? body : body.slice(0, separator), options);
|
|
2177
|
+
if (option === void 0) return finished(UNREADABLE);
|
|
2178
|
+
if (option.effect === "exits" || option.argument === "none" && attached !== void 0) return finished(EXITS);
|
|
2179
|
+
if (option.effect === "splits") return finished(splitReading(args, index, NO_CLUSTER, attached));
|
|
2180
|
+
return option.argument === "required" && attached === void 0 ? requiredValueStep(args, index) : nextOption(index + 1);
|
|
2181
|
+
};
|
|
2182
|
+
var optionStep = (args, index, word, flavor) => {
|
|
2183
|
+
if (word.expands) return finished(UNREADABLE);
|
|
2184
|
+
if (flavor.longOptions !== null && word.text.startsWith(LONG_OPTION_PREFIX)) return longOptionStep(args, index, word.text, flavor.longOptions);
|
|
2185
|
+
return shortOptionStep(args, index, word.text, flavor.shortOptions);
|
|
2186
|
+
};
|
|
2187
|
+
var flavorReadingOf = (args, flavor) => {
|
|
2188
|
+
for (let index = 0; index < args.length; ) {
|
|
2189
|
+
const word = args[index];
|
|
2190
|
+
if (word === void 0) break;
|
|
2191
|
+
if (word.text === END_OF_OPTIONS) return commandAfterOptions(args, index + 1);
|
|
2192
|
+
if (word.text === LONE_DASH || !word.text.startsWith(OPTION_PREFIX)) return commandAfterOptions(args, index);
|
|
2193
|
+
const step = optionStep(args, index, word, flavor);
|
|
2194
|
+
if (step.kind === "done") return step.reading;
|
|
2195
|
+
index = step.next;
|
|
2196
|
+
}
|
|
2197
|
+
return commandAfterOptions(args, args.length);
|
|
2198
|
+
};
|
|
2199
|
+
var runsSomething = (reading) => reading.kind === "command" || reading.kind === "split";
|
|
2200
|
+
var sameEnvReading = (left, right) => {
|
|
2201
|
+
if (left.kind === "command" && right.kind === "command") return left.start === right.start;
|
|
2202
|
+
if (left.kind !== "split" || right.kind !== "split") return false;
|
|
2203
|
+
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;
|
|
2204
|
+
};
|
|
2205
|
+
var envReadingOf = (args) => {
|
|
2206
|
+
const readings = ENV_FLAVORS.map((flavor) => flavorReadingOf(args, flavor));
|
|
2207
|
+
if (readings.some((reading) => reading.kind === "unreadable")) return UNREADABLE;
|
|
2208
|
+
const running = readings.filter(runsSomething);
|
|
2209
|
+
const [first, ...others] = running;
|
|
2210
|
+
if (first === void 0) return RUNS_NOTHING;
|
|
2211
|
+
return others.every((other) => sameEnvReading(first, other)) ? first : { kind: "ambiguous", readings: running };
|
|
2212
|
+
};
|
|
2213
|
+
|
|
2214
|
+
// ../contracts/src/command-analysis/shell-command-string.ts
|
|
2215
|
+
var NO_LETTERS = /* @__PURE__ */ new Set();
|
|
2216
|
+
var BASH_OPTIONS = {
|
|
2217
|
+
lettersWithAValue: /* @__PURE__ */ new Set(["o", "O"]),
|
|
2218
|
+
lettersThatEndOptions: NO_LETTERS,
|
|
2219
|
+
leadingLongOptionsWithAValue: /* @__PURE__ */ new Set(["--rcfile", "--init-file", "-rcfile", "-init-file"])
|
|
2220
|
+
};
|
|
2221
|
+
var SHELL_OPTION_SYNTAX = /* @__PURE__ */ new Map([
|
|
2222
|
+
["sh", BASH_OPTIONS],
|
|
2223
|
+
["bash", BASH_OPTIONS],
|
|
2224
|
+
["zsh", { lettersWithAValue: /* @__PURE__ */ new Set(["o"]), lettersThatEndOptions: /* @__PURE__ */ new Set(["b"]), leadingLongOptionsWithAValue: NO_LETTERS }],
|
|
2225
|
+
["dash", { lettersWithAValue: /* @__PURE__ */ new Set(["o"]), lettersThatEndOptions: NO_LETTERS, leadingLongOptionsWithAValue: NO_LETTERS }],
|
|
2226
|
+
["ksh", { lettersWithAValue: /* @__PURE__ */ new Set(["o", "R"]), lettersThatEndOptions: NO_LETTERS, leadingLongOptionsWithAValue: NO_LETTERS }]
|
|
2227
|
+
]);
|
|
2228
|
+
var POSIX_SHELL_PROGRAMS = new Set(SHELL_OPTION_SYNTAX.keys());
|
|
2229
|
+
var ABSENT = { kind: "absent" };
|
|
2230
|
+
var UNREADABLE2 = { kind: "unreadable" };
|
|
2231
|
+
var COMMAND_STRING_LETTER = "c";
|
|
2232
|
+
var END_OF_OPTIONS2 = "--";
|
|
2233
|
+
var LONE_DASH2 = "-";
|
|
2234
|
+
var LONG_OPTION_PREFIX2 = "--";
|
|
2235
|
+
var SHORT_OPTION_CLUSTER = /^[-+][A-Za-z]*$/;
|
|
2236
|
+
var COMMAND_STRING_CLUSTER = /^[-+][A-Za-z]*c[A-Za-z]*$/;
|
|
2237
|
+
var clusterReadingOf = (cluster, syntax) => {
|
|
2238
|
+
const letters = cluster.slice(1);
|
|
2239
|
+
const valueLetter = [...letters].findIndex((letter) => syntax.lettersWithAValue.has(letter));
|
|
2240
|
+
if (valueLetter !== -1 && valueLetter !== letters.length - 1) return null;
|
|
2241
|
+
return {
|
|
2242
|
+
runsACommandString: letters.includes(COMMAND_STRING_LETTER),
|
|
2243
|
+
takesAValue: valueLetter !== -1,
|
|
2244
|
+
endsOptions: [...letters].some((letter) => syntax.lettersThatEndOptions.has(letter))
|
|
2245
|
+
};
|
|
2246
|
+
};
|
|
2247
|
+
var endsOptionParsing = (text) => text === END_OF_OPTIONS2 || text === LONE_DASH2;
|
|
2248
|
+
var isAnOperand = (text) => !text.startsWith("-") && !text.startsWith("+");
|
|
2249
|
+
var optionValueIsUnreadable = (value) => value === void 0 || value.expands;
|
|
2250
|
+
var shellCommandStringOf = (shell, args) => {
|
|
2251
|
+
const syntax = SHELL_OPTION_SYNTAX.get(shell);
|
|
2252
|
+
if (syntax === void 0 || !args.some((arg) => COMMAND_STRING_CLUSTER.test(arg.text))) return ABSENT;
|
|
2253
|
+
let runsACommandString = false;
|
|
2254
|
+
let seenAShortOption = false;
|
|
2255
|
+
let index = 0;
|
|
2256
|
+
while (index < args.length) {
|
|
2257
|
+
const word = args[index];
|
|
2258
|
+
if (word === void 0 || word.expands) return UNREADABLE2;
|
|
2259
|
+
if (endsOptionParsing(word.text)) {
|
|
2260
|
+
index += 1;
|
|
2261
|
+
break;
|
|
2262
|
+
}
|
|
2263
|
+
if (isAnOperand(word.text)) break;
|
|
2264
|
+
if (!seenAShortOption && syntax.leadingLongOptionsWithAValue.has(word.text)) {
|
|
2265
|
+
if (optionValueIsUnreadable(args[index + 1])) return UNREADABLE2;
|
|
2266
|
+
index += 2;
|
|
2267
|
+
continue;
|
|
2268
|
+
}
|
|
2269
|
+
if (word.text.startsWith(LONG_OPTION_PREFIX2)) {
|
|
2270
|
+
index += 1;
|
|
2271
|
+
continue;
|
|
2272
|
+
}
|
|
2273
|
+
const cluster = SHORT_OPTION_CLUSTER.test(word.text) ? clusterReadingOf(word.text, syntax) : null;
|
|
2274
|
+
if (cluster === null) return UNREADABLE2;
|
|
2275
|
+
if (cluster.takesAValue && optionValueIsUnreadable(args[index + 1])) return UNREADABLE2;
|
|
2276
|
+
seenAShortOption = true;
|
|
2277
|
+
runsACommandString ||= cluster.runsACommandString;
|
|
2278
|
+
index += cluster.takesAValue ? 2 : 1;
|
|
2279
|
+
if (cluster.endsOptions) break;
|
|
2280
|
+
}
|
|
2281
|
+
if (!runsACommandString) return ABSENT;
|
|
2282
|
+
const operand = args[index];
|
|
2283
|
+
return operand === void 0 || operand.expands ? UNREADABLE2 : { kind: "readable", script: operand.text };
|
|
2284
|
+
};
|
|
2285
|
+
|
|
1753
2286
|
// ../contracts/src/degraded.ts
|
|
1754
2287
|
var DEGRADED_PREFIX = "[degraded]";
|
|
1755
2288
|
var degradedPayload = (subsystem, report) => ({
|
|
@@ -1762,37 +2295,6 @@ var degradedPayload = (subsystem, report) => ({
|
|
|
1762
2295
|
});
|
|
1763
2296
|
var degradedLine = (subsystem, report) => `${DEGRADED_PREFIX} ${JSON.stringify(degradedPayload(subsystem, report))}`;
|
|
1764
2297
|
|
|
1765
|
-
// ../contracts/src/setup-wire.ts
|
|
1766
|
-
var PAIR_TTL_SECONDS = 900;
|
|
1767
|
-
var computerOsOfPlatform = (platform) => {
|
|
1768
|
-
switch (platform) {
|
|
1769
|
-
case "darwin":
|
|
1770
|
-
return "mac";
|
|
1771
|
-
case "win32":
|
|
1772
|
-
return "windows";
|
|
1773
|
-
case "linux":
|
|
1774
|
-
return "linux";
|
|
1775
|
-
default:
|
|
1776
|
-
return null;
|
|
1777
|
-
}
|
|
1778
|
-
};
|
|
1779
|
-
var SETUP_AGENT_CHOICES = [
|
|
1780
|
-
"claude_code",
|
|
1781
|
-
"codex",
|
|
1782
|
-
"gemini_cli",
|
|
1783
|
-
"hermes",
|
|
1784
|
-
"cursor",
|
|
1785
|
-
"vscode",
|
|
1786
|
-
"opencode",
|
|
1787
|
-
"fx",
|
|
1788
|
-
...COMPATIBLE_AGENT_TYPES,
|
|
1789
|
-
"custom"
|
|
1790
|
-
];
|
|
1791
|
-
var isComputerAgent = (agent) => agent !== "custom";
|
|
1792
|
-
var NO_PAIRING_COMPUTER = { computerName: null, os: null, agents: null };
|
|
1793
|
-
var SETUP_CONNECT_MODES = ["app", "browser", "web", "none"];
|
|
1794
|
-
var isSetupConnectMode = (value) => typeof value === "string" && SETUP_CONNECT_MODES.includes(value);
|
|
1795
|
-
|
|
1796
2298
|
// ../contracts/src/observability.ts
|
|
1797
2299
|
var CLIENT_CONTEXT_HEADERS = {
|
|
1798
2300
|
surface: "x-pushary-surface",
|
|
@@ -1840,6 +2342,37 @@ var AUTH_REJECTION_REASONS = [
|
|
|
1840
2342
|
...AGENT_SITE_REJECTION_REASONS
|
|
1841
2343
|
];
|
|
1842
2344
|
|
|
2345
|
+
// ../contracts/src/setup-wire.ts
|
|
2346
|
+
var PAIR_TTL_SECONDS = 900;
|
|
2347
|
+
var computerOsOfPlatform = (platform) => {
|
|
2348
|
+
switch (platform) {
|
|
2349
|
+
case "darwin":
|
|
2350
|
+
return "mac";
|
|
2351
|
+
case "win32":
|
|
2352
|
+
return "windows";
|
|
2353
|
+
case "linux":
|
|
2354
|
+
return "linux";
|
|
2355
|
+
default:
|
|
2356
|
+
return null;
|
|
2357
|
+
}
|
|
2358
|
+
};
|
|
2359
|
+
var SETUP_AGENT_CHOICES = [
|
|
2360
|
+
"claude_code",
|
|
2361
|
+
"codex",
|
|
2362
|
+
"gemini_cli",
|
|
2363
|
+
"hermes",
|
|
2364
|
+
"cursor",
|
|
2365
|
+
"vscode",
|
|
2366
|
+
"opencode",
|
|
2367
|
+
"fx",
|
|
2368
|
+
...COMPATIBLE_AGENT_TYPES,
|
|
2369
|
+
"custom"
|
|
2370
|
+
];
|
|
2371
|
+
var isComputerAgent = (agent) => agent !== "custom";
|
|
2372
|
+
var NO_PAIRING_COMPUTER = { computerName: null, os: null, agents: null };
|
|
2373
|
+
var SETUP_CONNECT_MODES = ["app", "browser", "web", "none"];
|
|
2374
|
+
var isSetupConnectMode = (value) => typeof value === "string" && SETUP_CONNECT_MODES.includes(value);
|
|
2375
|
+
|
|
1843
2376
|
// ../contracts/src/declined-agents.ts
|
|
1844
2377
|
var DECLINED_AGENTS_FILE = "declined-agents.json";
|
|
1845
2378
|
var DECLINED_AGENTS_VERSION = 1;
|
|
@@ -2165,12 +2698,17 @@ var rankWholeOrSegments = (toolName, arg, intent, matches) => {
|
|
|
2165
2698
|
const matched = toolName in POLICY_COMMAND_KEYS ? shellSegmentsMatch(arg, intent, matches) : matches(arg);
|
|
2166
2699
|
return matched ? "prefix" : "none";
|
|
2167
2700
|
};
|
|
2701
|
+
var argumentOpenIndex = (pattern) => pattern.endsWith(")") ? pattern.indexOf("(") : -1;
|
|
2702
|
+
var patternToolName = (pattern) => {
|
|
2703
|
+
const open = argumentOpenIndex(pattern);
|
|
2704
|
+
return open === -1 ? pattern : pattern.slice(0, open);
|
|
2705
|
+
};
|
|
2168
2706
|
var matchToolPattern = (pattern, toolName, arg, intent = PATTERN_INTENT.grant) => {
|
|
2169
|
-
const open = pattern
|
|
2170
|
-
if (open === -1
|
|
2707
|
+
const open = argumentOpenIndex(pattern);
|
|
2708
|
+
if (open === -1) {
|
|
2171
2709
|
return pattern === toolName ? "tool" : "none";
|
|
2172
2710
|
}
|
|
2173
|
-
if (pattern
|
|
2711
|
+
if (patternToolName(pattern) !== toolName || arg === void 0) return "none";
|
|
2174
2712
|
const inner = pattern.slice(open + 1, -1);
|
|
2175
2713
|
if (inner.endsWith(":*")) {
|
|
2176
2714
|
const prefix = inner.slice(0, -2);
|
|
@@ -2453,7 +2991,7 @@ var uniqFileOperandCount = (args) => {
|
|
|
2453
2991
|
if (optionsEnded || !isFlagToken(arg) || arg === STDIN_OPERAND) {
|
|
2454
2992
|
operands += 1;
|
|
2455
2993
|
optionsEnded = true;
|
|
2456
|
-
} else if (arg ===
|
|
2994
|
+
} else if (arg === END_OF_OPTIONS3) {
|
|
2457
2995
|
optionsEnded = true;
|
|
2458
2996
|
} else if (UNIQ_OPTIONS_WITH_A_SEPARATE_VALUE.includes(arg)) {
|
|
2459
2997
|
index += 1;
|
|
@@ -2462,7 +3000,7 @@ var uniqFileOperandCount = (args) => {
|
|
|
2462
3000
|
return operands;
|
|
2463
3001
|
};
|
|
2464
3002
|
var STDIN_OPERAND = "-";
|
|
2465
|
-
var
|
|
3003
|
+
var LONG_OPTION_PREFIX3 = "--";
|
|
2466
3004
|
var OPTION_VALUE_SEPARATOR = "=";
|
|
2467
3005
|
var longOptionName = (token) => token.split(OPTION_VALUE_SEPARATOR, 1)[0] ?? token;
|
|
2468
3006
|
var abbreviatesALongOption = (token, longOptions) => {
|
|
@@ -2471,8 +3009,8 @@ var abbreviatesALongOption = (token, longOptions) => {
|
|
|
2471
3009
|
};
|
|
2472
3010
|
var clustersAShortOption = (token, shortOptions) => shortOptions.some((option) => token.slice(1).includes(option.slice(1)));
|
|
2473
3011
|
var isRefusedOption = (token, options) => {
|
|
2474
|
-
if (token ===
|
|
2475
|
-
return token.startsWith(
|
|
3012
|
+
if (token === END_OF_OPTIONS3 || !isFlagToken(token)) return false;
|
|
3013
|
+
return token.startsWith(LONG_OPTION_PREFIX3) ? abbreviatesALongOption(token, options.long) : clustersAShortOption(token, options.short);
|
|
2476
3014
|
};
|
|
2477
3015
|
var carriesNoRefusedOption = (args, options) => !args.some((arg) => isRefusedOption(arg, options));
|
|
2478
3016
|
var SED_PRINT_ONLY_SCRIPT = /^(?:\d+|\$)(?:,(?:\d+|\$))?p$/;
|
|
@@ -2485,8 +3023,8 @@ var isReadOnlyDate = (args) => args.every((arg) => arg.startsWith(DATE_FORMAT_PR
|
|
|
2485
3023
|
var PRINTF_TEXT_CONVERSION = /%(?:%|[-+ #0]*\d*(?:\.\d*)?[bcqs])/g;
|
|
2486
3024
|
var PRINTF_CONVERSION_START = "%";
|
|
2487
3025
|
var ARITHMETIC_SAFE_NUMBER = /^[-+]?(?:0[xX][0-9a-fA-F]+|\d+(?:\.\d+)?)$/;
|
|
2488
|
-
var printfAssignsNothing = (args) => args[0] ===
|
|
2489
|
-
var printfOperands = (args) => args[0] ===
|
|
3026
|
+
var printfAssignsNothing = (args) => args[0] === END_OF_OPTIONS3 || !isFlagToken(args[0] ?? "");
|
|
3027
|
+
var printfOperands = (args) => args[0] === END_OF_OPTIONS3 ? args.slice(1) : args;
|
|
2490
3028
|
var convertsArgumentsOnlyAsText = (format) => !format.replace(PRINTF_TEXT_CONVERSION, "").includes(PRINTF_CONVERSION_START);
|
|
2491
3029
|
var printfNeverEvaluatesAnArgument = ([format = "", ...values]) => convertsArgumentsOnlyAsText(format) || values.every((value) => ARITHMETIC_SAFE_NUMBER.test(value));
|
|
2492
3030
|
var isOutputOnlyPrintf = (args) => printfAssignsNothing(args) && printfNeverEvaluatesAnArgument(printfOperands(args));
|
|
@@ -2758,7 +3296,7 @@ var SHELL_RESERVED_WORDS = /* @__PURE__ */ new Set([
|
|
|
2758
3296
|
"]]"
|
|
2759
3297
|
]);
|
|
2760
3298
|
var HARMLESS_GLOBAL_FLAGS = /* @__PURE__ */ new Set(["--no-pager", "--version", "-v", "-V", "--help", "-h"]);
|
|
2761
|
-
var
|
|
3299
|
+
var END_OF_OPTIONS3 = "--";
|
|
2762
3300
|
var SUBCOMMAND_DEPTH = 3;
|
|
2763
3301
|
var SHELL_LINE_CONTINUATION = /\\\n/g;
|
|
2764
3302
|
var invocationOf = (segment) => {
|
|
@@ -2770,13 +3308,13 @@ var argsAfterHarmlessGlobalFlags = (args) => {
|
|
|
2770
3308
|
return firstMeaningful === -1 ? [] : args.slice(firstMeaningful);
|
|
2771
3309
|
};
|
|
2772
3310
|
var subcommandWordsOf = (args) => {
|
|
2773
|
-
const endOfOptions = args.findIndex((arg) => arg.text ===
|
|
3311
|
+
const endOfOptions = args.findIndex((arg) => arg.text === END_OF_OPTIONS3);
|
|
2774
3312
|
const options = endOfOptions === -1 ? args : args.slice(0, endOfOptions);
|
|
2775
3313
|
return options.filter((arg) => !arg.text.startsWith("-")).slice(0, SUBCOMMAND_DEPTH);
|
|
2776
3314
|
};
|
|
2777
3315
|
var passesInlineCode = (arg) => {
|
|
2778
3316
|
if (arg === INLINE_CODE_SUBCOMMAND || arg === STANDARD_INPUT_ARGUMENT || INLINE_CODE_LONG_FLAG.test(arg)) return true;
|
|
2779
|
-
if (arg.startsWith(
|
|
3317
|
+
if (arg.startsWith(END_OF_OPTIONS3)) return false;
|
|
2780
3318
|
const cluster = SHORT_FLAG_CLUSTER.exec(arg)?.[1] ?? "";
|
|
2781
3319
|
return [...cluster].some((letter) => INLINE_CODE_SHORT_FLAG_LETTERS.has(letter));
|
|
2782
3320
|
};
|
|
@@ -2804,9 +3342,9 @@ var invocationTextWith = ({ program, args }, wordText) => {
|
|
|
2804
3342
|
};
|
|
2805
3343
|
var normalizedInvocation = (invocation) => invocationTextWith(invocation, (word) => word.text);
|
|
2806
3344
|
var SHELL_METACHARACTER = /[\s;&|<>()$`\\"'*?[\]#~{}!]/;
|
|
2807
|
-
var
|
|
3345
|
+
var SINGLE_QUOTE2 = "'";
|
|
2808
3346
|
var ESCAPED_SINGLE_QUOTE = `'\\''`;
|
|
2809
|
-
var asOneShellWord = (text) => SHELL_METACHARACTER.test(text) ? `${
|
|
3347
|
+
var asOneShellWord = (text) => SHELL_METACHARACTER.test(text) ? `${SINGLE_QUOTE2}${text.replaceAll(SINGLE_QUOTE2, ESCAPED_SINGLE_QUOTE)}${SINGLE_QUOTE2}` : text;
|
|
2810
3348
|
var quotedInvocation = (invocation) => invocationTextWith(invocation, (word) => asOneShellWord(word.text));
|
|
2811
3349
|
var normalizedCommand = (command) => {
|
|
2812
3350
|
const segments = readableCommandSegments(command);
|
|
@@ -2888,20 +3426,6 @@ var changesProduction = (invocation) => {
|
|
|
2888
3426
|
const words = wordsOfInvocation(invocation);
|
|
2889
3427
|
return words.some((word, index) => wordSelectsProduction(word, words[index - 1])) && (deployCliChangesSomething(words) || SCHEMA_CHANGE_WORD.test(normalizedInvocation(invocation)));
|
|
2890
3428
|
};
|
|
2891
|
-
var MYSQL_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-e", "--execute"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false };
|
|
2892
|
-
var SQLITE_SYNTAX = { inlineFlags: /* @__PURE__ */ new Set(["-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-init"]), positionalSql: true };
|
|
2893
|
-
var SQL_CLIENT_SYNTAX = /* @__PURE__ */ new Map([
|
|
2894
|
-
["psql", { inlineFlags: /* @__PURE__ */ new Set(["-c", "--command"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false }],
|
|
2895
|
-
["mysql", MYSQL_SYNTAX],
|
|
2896
|
-
["mariadb", MYSQL_SYNTAX],
|
|
2897
|
-
["sqlite3", SQLITE_SYNTAX],
|
|
2898
|
-
["sqlite", SQLITE_SYNTAX],
|
|
2899
|
-
["duckdb", { inlineFlags: /* @__PURE__ */ new Set(["-c", "-s", "-cmd"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "-init"]), positionalSql: true }],
|
|
2900
|
-
["clickhouse-client", { inlineFlags: /* @__PURE__ */ new Set(["-q", "--query"]), scriptFlags: /* @__PURE__ */ new Set(["--queries-file"]), positionalSql: false }],
|
|
2901
|
-
["bq", { inlineFlags: /* @__PURE__ */ new Set(), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: true }],
|
|
2902
|
-
["mongosh", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(["-f", "--file"]), positionalSql: false }],
|
|
2903
|
-
["mongo", { inlineFlags: /* @__PURE__ */ new Set(["--eval"]), scriptFlags: /* @__PURE__ */ new Set(), positionalSql: false }]
|
|
2904
|
-
]);
|
|
2905
3429
|
var SQL_WRITE_STATEMENT = new RegExp([
|
|
2906
3430
|
String.raw`\b(?:insert|update|delete|merge|upsert|alter|create|drop|truncate|grant|revoke|copy|vacuum|reindex|rename|attach|detach)\b`,
|
|
2907
3431
|
String.raw`\breplace\s+into\b`,
|
|
@@ -2909,21 +3433,26 @@ var SQL_WRITE_STATEMENT = new RegExp([
|
|
|
2909
3433
|
String.raw`\binto\s+(?:out|dump)file\b`,
|
|
2910
3434
|
String.raw`\bset\s+(?:global|persist)\b`,
|
|
2911
3435
|
String.raw`\bkill\s+(?:query|connection|\d)`,
|
|
2912
|
-
String.raw`\bcall\
|
|
2913
|
-
String.raw`\
|
|
3436
|
+
String.raw`\bcall\b`,
|
|
3437
|
+
String.raw`\bexecute\s+immediate\b`,
|
|
3438
|
+
String.raw`\bprepare\s+\S+\s+from\b`,
|
|
3439
|
+
String.raw`\bselect\b[^;]*\binto\b(?!\s*@)`,
|
|
3440
|
+
String.raw`(?:^|;)\s*lock\b`,
|
|
3441
|
+
String.raw`(?:^|;)\s*do\b`,
|
|
2914
3442
|
String.raw`\bpg_terminate_backend\b`,
|
|
2915
3443
|
String.raw`\bsetval\b`,
|
|
2916
3444
|
String.raw`\bpragma\s+writable_schema\b`,
|
|
2917
3445
|
String.raw`\.(?:insert|update|delete|replace|remove|drop|rename|create|bulkwrite|findoneand)\w*\s*\(`
|
|
2918
3446
|
].join("|"), "i");
|
|
2919
3447
|
var SQL_READ_PHRASE = /\bshow\s+create\b/gi;
|
|
2920
|
-
var
|
|
2921
|
-
|
|
2922
|
-
var SQL_COMMENT = /--[^\n]*|\/\*[\s\S]*?\*\//g;
|
|
2923
|
-
var writesThroughSql = (sql) => {
|
|
2924
|
-
const statement = sql.replace(SQL_COMMENT, " ").replace(SQL_STRING_LITERAL, EMPTY_SQL_STRING).replace(SQL_READ_PHRASE, "");
|
|
3448
|
+
var sqlTextWrites = (text) => {
|
|
3449
|
+
const statement = text.replace(SQL_READ_PHRASE, "");
|
|
2925
3450
|
return SQL_WRITE_STATEMENT.test(statement) || SQL_CLIENT_FILE_COMMAND.test(statement);
|
|
2926
3451
|
};
|
|
3452
|
+
var writesThroughSql = (sql, lexicon) => {
|
|
3453
|
+
const parsed = sqlOutsideLiterals(sql, lexicon);
|
|
3454
|
+
return parsed.kind === "uncertain" || parsed.texts.some(sqlTextWrites);
|
|
3455
|
+
};
|
|
2927
3456
|
var SQL_CLIENT_FILE_COMMAND = new RegExp([
|
|
2928
3457
|
String.raw`(?:^|[\s;=])\\(?:i|ir|include|include_relative|o|out|w|write|gexec|!|\.)(?=\s|$)`,
|
|
2929
3458
|
String.raw`(?:^|[\s;=])\\g\s*\|`,
|
|
@@ -2931,6 +3460,7 @@ var SQL_CLIENT_FILE_COMMAND = new RegExp([
|
|
|
2931
3460
|
String.raw`(?:^|[;=])\s*(?:system|source)\s`
|
|
2932
3461
|
].join("|"), "i");
|
|
2933
3462
|
var SHORT_FLAG_CLUSTER_ONLY = /^-([A-Za-z0-9]+)$/;
|
|
3463
|
+
var LEADING_OPTION_DASHES = /^-+/;
|
|
2934
3464
|
var NO_SQL = { script: false, sql: null, hidden: false };
|
|
2935
3465
|
var shortFlagOf = (flags, text) => [...flags].find((flag) => /^-[A-Za-z]$/.test(flag) && text.startsWith(flag) && text.length > flag.length && !text.startsWith("--"));
|
|
2936
3466
|
var sqlArgumentAt = (args, index, syntax) => {
|
|
@@ -2950,7 +3480,7 @@ var sqlArgumentAt = (args, index, syntax) => {
|
|
|
2950
3480
|
const last = cluster ? `-${cluster.slice(-1)}` : "";
|
|
2951
3481
|
if (cluster && cluster.length > 1 && syntax.scriptFlags.has(last)) return { script: true, sql: null, hidden: false };
|
|
2952
3482
|
if (cluster && cluster.length > 1 && syntax.inlineFlags.has(last)) return valueOf(next);
|
|
2953
|
-
return { script: false, sql: arg.text, hidden: false };
|
|
3483
|
+
return { script: false, sql: arg.text.replace(LEADING_OPTION_DASHES, ""), hidden: false };
|
|
2954
3484
|
};
|
|
2955
3485
|
var namesALongFlagValue = (text, flags) => [...flags].some((flag) => flag.startsWith("--") && text.startsWith(`${flag}${FLAG_VALUE_SEPARATOR}`));
|
|
2956
3486
|
var positionalSqlIsHidden = (args, syntax) => syntax.positionalSql && args.filter((arg) => !arg.text.startsWith("-")).slice(1).some((arg) => arg.expands);
|
|
@@ -2960,7 +3490,7 @@ var sqlClientChangesData = (invocation) => {
|
|
|
2960
3490
|
if (syntax === void 0) return false;
|
|
2961
3491
|
return positionalSqlIsHidden(invocation.args, syntax) || invocation.args.some((_, index) => {
|
|
2962
3492
|
const { script, sql, hidden } = sqlArgumentAt(invocation.args, index, syntax);
|
|
2963
|
-
return script || hidden || sql !== null && writesThroughSql(sql);
|
|
3493
|
+
return script || hidden || sql !== null && writesThroughSql(sql, syntax.lexicon);
|
|
2964
3494
|
});
|
|
2965
3495
|
};
|
|
2966
3496
|
var PULL_REQUEST_CLIS = /* @__PURE__ */ new Set(["gh", "glab"]);
|
|
@@ -3102,10 +3632,24 @@ var GITHUB_READ_COMMANDS = /* @__PURE__ */ new Map([
|
|
|
3102
3632
|
var GITHUB_OPTIONS_WITH_VALUES = /* @__PURE__ */ new Set(["-R", "--repo", "--hostname"]);
|
|
3103
3633
|
var GITHUB_API_SUBCOMMAND = "api";
|
|
3104
3634
|
var GITHUB_GRAPHQL_ENDPOINT = "graphql";
|
|
3105
|
-
var
|
|
3106
|
-
var HTTP_METHOD_ATTACHED = /^(?:-X|--method=)(.+)$/;
|
|
3635
|
+
var HTTP_METHOD_OPTIONS = /* @__PURE__ */ new Set(["-X", "--method"]);
|
|
3107
3636
|
var HTTP_READ_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD"]);
|
|
3108
|
-
var
|
|
3637
|
+
var GITHUB_API_BODY_OPTIONS = /* @__PURE__ */ new Set(["-f", "-F", "--field", "--raw-field", "--input"]);
|
|
3638
|
+
var GITHUB_API_SHORT_SWITCHES = /* @__PURE__ */ new Set(["i", "h"]);
|
|
3639
|
+
var GITHUB_API_SHORT_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set(["X", "F", "f", "H", "p", "t", "q"]);
|
|
3640
|
+
var GITHUB_API_LONG_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set([
|
|
3641
|
+
"--method",
|
|
3642
|
+
"--field",
|
|
3643
|
+
"--raw-field",
|
|
3644
|
+
"--header",
|
|
3645
|
+
"--preview",
|
|
3646
|
+
"--input",
|
|
3647
|
+
"--template",
|
|
3648
|
+
"--jq",
|
|
3649
|
+
"--cache",
|
|
3650
|
+
"--hostname"
|
|
3651
|
+
]);
|
|
3652
|
+
var PFLAG_ATTACHED_VALUE_PREFIX = /^=/;
|
|
3109
3653
|
var GITHUB_API_FILE_FIELD = /=@|^--input(?:=|$)/;
|
|
3110
3654
|
var GRAPHQL_MUTATION = /\bmutation\b/i;
|
|
3111
3655
|
var STRIPE_READ_COMMANDS = /* @__PURE__ */ new Set([
|
|
@@ -3154,29 +3698,63 @@ var S3_URL_PREFIX = "s3://";
|
|
|
3154
3698
|
var TWILIO_TOPIC_SEPARATOR = ":";
|
|
3155
3699
|
var TWILIO_READ_ACTIONS = /* @__PURE__ */ new Set(["list", "fetch"]);
|
|
3156
3700
|
var positionalWordsOf = (args, optionsWithValues) => {
|
|
3157
|
-
const endOfOptions = args.findIndex((arg) => arg.text ===
|
|
3701
|
+
const endOfOptions = args.findIndex((arg) => arg.text === END_OF_OPTIONS3);
|
|
3158
3702
|
const options = endOfOptions === -1 ? args : args.slice(0, endOfOptions);
|
|
3159
3703
|
const operands = endOfOptions === -1 ? [] : args.slice(endOfOptions + 1);
|
|
3160
3704
|
const positional = options.filter((arg, index) => !arg.text.startsWith("-") && !optionsWithValues.has(options[index - 1]?.text ?? ""));
|
|
3161
3705
|
return [...positional, ...operands];
|
|
3162
3706
|
};
|
|
3163
|
-
var
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
3707
|
+
var NO_CLI_OPTION = [];
|
|
3708
|
+
var githubApiLongOptionAt = (args, index, arg) => {
|
|
3709
|
+
const separator = arg.text.indexOf(FLAG_VALUE_SEPARATOR);
|
|
3710
|
+
if (separator !== -1) {
|
|
3711
|
+
return { options: [{ name: arg.text.slice(0, separator), value: { ...arg, text: arg.text.slice(separator + 1) } }], next: index + 1 };
|
|
3712
|
+
}
|
|
3713
|
+
if (!GITHUB_API_LONG_OPTIONS_WITH_A_VALUE.has(arg.text)) return { options: [{ name: arg.text, value: void 0 }], next: index + 1 };
|
|
3714
|
+
return { options: [{ name: arg.text, value: args[index + 1] }], next: index + 2 };
|
|
3715
|
+
};
|
|
3716
|
+
var githubApiShortOptionsAt = (args, index, arg) => {
|
|
3717
|
+
const options = [];
|
|
3718
|
+
for (let position = 1; position < arg.text.length; position += 1) {
|
|
3719
|
+
const letter = arg.text.charAt(position);
|
|
3720
|
+
const name = `-${letter}`;
|
|
3721
|
+
if (GITHUB_API_SHORT_SWITCHES.has(letter)) {
|
|
3722
|
+
options.push({ name, value: void 0 });
|
|
3723
|
+
continue;
|
|
3170
3724
|
}
|
|
3725
|
+
if (!GITHUB_API_SHORT_OPTIONS_WITH_A_VALUE.has(letter)) return null;
|
|
3726
|
+
const attached = arg.text.slice(position + 1);
|
|
3727
|
+
if (attached === "") return { options: [...options, { name, value: args[index + 1] }], next: index + 2 };
|
|
3728
|
+
return { options: [...options, { name, value: { ...arg, text: attached.replace(PFLAG_ATTACHED_VALUE_PREFIX, "") } }], next: index + 1 };
|
|
3171
3729
|
}
|
|
3172
|
-
return
|
|
3730
|
+
return { options, next: index + 1 };
|
|
3731
|
+
};
|
|
3732
|
+
var githubApiOptionsAt = (args, index, arg) => {
|
|
3733
|
+
if (LONG_OPTION.test(arg.text)) return githubApiLongOptionAt(args, index, arg);
|
|
3734
|
+
if (FLAG.test(arg.text) && arg.text !== STANDARD_INPUT_ARGUMENT) return githubApiShortOptionsAt(args, index, arg);
|
|
3735
|
+
return { options: NO_CLI_OPTION, next: index + 1 };
|
|
3736
|
+
};
|
|
3737
|
+
var githubApiOptionsOf = (args) => {
|
|
3738
|
+
const options = [];
|
|
3739
|
+
for (let index = 0; index < args.length; ) {
|
|
3740
|
+
const arg = args[index];
|
|
3741
|
+
if (arg === void 0 || arg.text === END_OF_OPTIONS3) break;
|
|
3742
|
+
const parsed = githubApiOptionsAt(args, index, arg);
|
|
3743
|
+
if (parsed === null) return null;
|
|
3744
|
+
options.push(...parsed.options);
|
|
3745
|
+
index = parsed.next;
|
|
3746
|
+
}
|
|
3747
|
+
return options;
|
|
3173
3748
|
};
|
|
3749
|
+
var requestMethodCanWrite = (method) => method === void 0 || method.expands || !HTTP_READ_METHODS.has(method.text.toUpperCase());
|
|
3174
3750
|
var graphqlRequestCanWrite = (args) => args.some((arg) => arg.expands || GRAPHQL_MUTATION.test(arg.text) || GITHUB_API_FILE_FIELD.test(arg.text));
|
|
3175
3751
|
var githubApiRequestWrites = (args) => {
|
|
3176
|
-
const
|
|
3177
|
-
if (
|
|
3752
|
+
const options = githubApiOptionsOf(args);
|
|
3753
|
+
if (options === null) return true;
|
|
3754
|
+
const method = options.filter((option) => HTTP_METHOD_OPTIONS.has(option.name)).at(-1);
|
|
3755
|
+
if (method !== void 0) return requestMethodCanWrite(method.value);
|
|
3178
3756
|
if (args.some((arg) => arg.text === GITHUB_GRAPHQL_ENDPOINT)) return graphqlRequestCanWrite(args);
|
|
3179
|
-
return
|
|
3757
|
+
return options.some((option) => GITHUB_API_BODY_OPTIONS.has(option.name));
|
|
3180
3758
|
};
|
|
3181
3759
|
var githubCommandOnlyReads = (noun, verb) => {
|
|
3182
3760
|
if (noun === void 0 || GITHUB_COMMANDS_THAT_ONLY_READ.has(noun.text)) return true;
|
|
@@ -3220,7 +3798,7 @@ var segmentWritesThroughARemoteApi = (segment, depth) => {
|
|
|
3220
3798
|
const innermost = innermostInvocation(segment.invocation);
|
|
3221
3799
|
return invocationWritesThroughARemoteApi(innermost) || commandsNestedIn(innermost, inlineScriptsOf(innermost, segment.heredocs)).some((nested) => commandWritesThroughARemoteApiAt(nested, depth + 1));
|
|
3222
3800
|
};
|
|
3223
|
-
var commandWritesThroughARemoteApiAt = (command, depth) => depth
|
|
3801
|
+
var commandWritesThroughARemoteApiAt = (command, depth) => depth > MAX_SPELLING_DEPTH || spelledSegmentsOf(command).some((segment) => segmentWritesThroughARemoteApi(segment, depth));
|
|
3224
3802
|
var commandWritesThroughARemoteApi = (command) => commandWritesThroughARemoteApiAt(command, 0);
|
|
3225
3803
|
var segmentNeedsAPerson = (toolName, segment) => {
|
|
3226
3804
|
const invocation = invocationOf(segment);
|
|
@@ -3360,8 +3938,9 @@ var findRunnerEnd = (args, from) => {
|
|
|
3360
3938
|
};
|
|
3361
3939
|
var wrapperSyntax = (optionsWithAValue = [], operandsBeforeTheCommand = 0) => ({ optionsWithAValue: new Set(optionsWithAValue), operandsBeforeTheCommand });
|
|
3362
3940
|
var ENVIRONMENT_ASSIGNMENTS = wrapperSyntax();
|
|
3941
|
+
var ENV = "env";
|
|
3942
|
+
var ENV_SPLIT_STRING_ESCAPE = /[\\$]/;
|
|
3363
3943
|
var WRAPPER_SYNTAX = /* @__PURE__ */ new Map([
|
|
3364
|
-
["env", wrapperSyntax(["-u", "--unset", "-C", "--chdir", "-S", "--split-string", "-P"])],
|
|
3365
3944
|
["xargs", wrapperSyntax([
|
|
3366
3945
|
"-I",
|
|
3367
3946
|
"-J",
|
|
@@ -3423,22 +4002,39 @@ var WRAPPER_SYNTAX = /* @__PURE__ */ new Map([
|
|
|
3423
4002
|
["pnpx", wrapperSyntax()],
|
|
3424
4003
|
["uvx", wrapperSyntax(["--from", "--with", "-p", "--python"])]
|
|
3425
4004
|
]);
|
|
3426
|
-
var SHELLS = /* @__PURE__ */ new Set(["sh", "bash", "zsh", "dash", "ksh"]);
|
|
3427
|
-
var SCRIPT_FLAG_CLUSTER = /^-[A-Za-z]*c$/;
|
|
3428
4005
|
var EVAL = "eval";
|
|
3429
4006
|
var MAX_CONSEQUENCE_DEPTH = 4;
|
|
4007
|
+
var shortValueOptionPosition = (text, options) => {
|
|
4008
|
+
if (!text.startsWith("-") || text.startsWith("--")) return -1;
|
|
4009
|
+
for (let index = 1; index < text.length; index += 1) {
|
|
4010
|
+
if (options.has(`-${text[index]}`)) return index;
|
|
4011
|
+
}
|
|
4012
|
+
return -1;
|
|
4013
|
+
};
|
|
4014
|
+
var wrapperOptionConsumesNextWord = (text, options) => {
|
|
4015
|
+
if (options.has(text)) return true;
|
|
4016
|
+
const position = shortValueOptionPosition(text, options);
|
|
4017
|
+
return position !== -1 && position === text.length - 1;
|
|
4018
|
+
};
|
|
3430
4019
|
var commandStartAfterWrapper = (words, syntax) => {
|
|
3431
4020
|
let index = 0;
|
|
3432
4021
|
while (index < words.length) {
|
|
3433
4022
|
const text = words[index]?.text ?? "";
|
|
3434
|
-
if (text ===
|
|
4023
|
+
if (text === END_OF_OPTIONS3) return index + 1 + syntax.operandsBeforeTheCommand;
|
|
3435
4024
|
if (!SHELL_ENV_ASSIGNMENT.test(text) && (!FLAG.test(text) || text === STANDARD_INPUT_ARGUMENT)) break;
|
|
3436
|
-
index += syntax.optionsWithAValue
|
|
4025
|
+
index += wrapperOptionConsumesNextWord(text, syntax.optionsWithAValue) ? 2 : 1;
|
|
3437
4026
|
}
|
|
3438
4027
|
return index + syntax.operandsBeforeTheCommand;
|
|
3439
4028
|
};
|
|
4029
|
+
var envWrappedInvocation = (args) => {
|
|
4030
|
+
const reading = envReadingOf(args);
|
|
4031
|
+
if (reading.kind !== "command") return null;
|
|
4032
|
+
const command = args[reading.start];
|
|
4033
|
+
return command === void 0 ? null : { program: command, args: args.slice(reading.start + 1) };
|
|
4034
|
+
};
|
|
3440
4035
|
var wrappedInvocation = ({ program, args }) => {
|
|
3441
4036
|
if (program === void 0) return null;
|
|
4037
|
+
if (basenameOf(program.text) === ENV) return envWrappedInvocation(args);
|
|
3442
4038
|
const assigns = SHELL_ENV_ASSIGNMENT.test(program.text);
|
|
3443
4039
|
const syntax = assigns ? ENVIRONMENT_ASSIGNMENTS : WRAPPER_SYNTAX.get(basenameOf(program.text));
|
|
3444
4040
|
if (syntax === void 0) return null;
|
|
@@ -3447,17 +4043,29 @@ var wrappedInvocation = ({ program, args }) => {
|
|
|
3447
4043
|
const command = words[start];
|
|
3448
4044
|
return command === void 0 ? null : { program: command, args: words.slice(start + 1) };
|
|
3449
4045
|
};
|
|
3450
|
-
var innermostInvocation = (invocation
|
|
3451
|
-
|
|
3452
|
-
|
|
4046
|
+
var innermostInvocation = (invocation) => {
|
|
4047
|
+
let current = invocation;
|
|
4048
|
+
let wrapped = wrappedInvocation(current);
|
|
4049
|
+
while (wrapped !== null) {
|
|
4050
|
+
current = wrapped;
|
|
4051
|
+
wrapped = wrappedInvocation(current);
|
|
4052
|
+
}
|
|
4053
|
+
return current;
|
|
4054
|
+
};
|
|
4055
|
+
var envSplitScriptOf = ({ prefix, value, rest }, args) => {
|
|
4056
|
+
if (value === void 0 || value.expands || ENV_SPLIT_STRING_ESCAPE.test(value.text)) return null;
|
|
4057
|
+
return [ENV, ...prefix.map(asOneShellWord), value.text, ...args.slice(rest).map((arg) => asOneShellWord(arg.text))].join(" ");
|
|
3453
4058
|
};
|
|
3454
4059
|
var shellScriptOf = ({ program, args }) => {
|
|
3455
4060
|
if (program === void 0) return null;
|
|
3456
|
-
|
|
3457
|
-
if (
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
4061
|
+
const name = basenameOf(program.text);
|
|
4062
|
+
if (name === ENV) {
|
|
4063
|
+
const reading = envReadingOf(args);
|
|
4064
|
+
return reading.kind === "split" ? envSplitScriptOf(reading, args) : null;
|
|
4065
|
+
}
|
|
4066
|
+
if (name === EVAL) return args.some((arg) => arg.expands) ? null : args.map((arg) => arg.text).join(" ");
|
|
4067
|
+
const commandString = shellCommandStringOf(name, args);
|
|
4068
|
+
return commandString.kind === "readable" ? commandString.script : null;
|
|
3461
4069
|
};
|
|
3462
4070
|
var FLAG = /^-/;
|
|
3463
4071
|
var FLAG_WITH_ATTACHED_VALUE = /^-[^=]*=/;
|
|
@@ -3485,18 +4093,19 @@ var honoursPreviewFlags = ({ program, args }) => {
|
|
|
3485
4093
|
var onlyPreviews = (invocation) => invocation.program !== void 0 && honoursPreviewFlags(invocation) && invocation.args.some((arg) => !arg.expands && PREVIEW_FLAG.test(arg.text));
|
|
3486
4094
|
var changesWhatIsDeployed = (toolName, invocation, normalized) => !onlyPreviews(invocation) && (changesProduction(invocation) || mergesAPullRequest(invocation) || isCoveredByPolicy(DEPLOY_AND_SCHEMA_COMMAND_PATTERNS, toolName, normalized));
|
|
3487
4095
|
var invocationHasAVisibleConsequence = (toolName, invocation, depth) => {
|
|
3488
|
-
if (
|
|
4096
|
+
if (depth > MAX_CONSEQUENCE_DEPTH) return true;
|
|
4097
|
+
if (invocation.program === void 0) return false;
|
|
3489
4098
|
const normalized = quotedInvocation(invocation);
|
|
3490
|
-
const
|
|
4099
|
+
const innermost = innermostInvocation(invocation);
|
|
3491
4100
|
const script = shellScriptOf(invocation);
|
|
3492
|
-
return classifyDecisionRisk(toolName, normalized) === "destructive" || changesWhatIsDeployed(toolName, invocation, normalized) || writesASecretFile(invocation) || losesDataVisibly(toolName, invocation, normalized, depth) || subcommandDestroysVisibly(invocation) || sqlClientChangesData(invocation) ||
|
|
4101
|
+
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));
|
|
3493
4102
|
};
|
|
3494
4103
|
var RUNS_FETCHED_CODE = /(?:\$\(|`|<\()\s*(?:curl|wget)\b/;
|
|
3495
4104
|
var FETCHING_PROGRAMS = /* @__PURE__ */ new Set(["curl", "wget"]);
|
|
3496
4105
|
var READS_ITS_SCRIPT_FROM_STANDARD_INPUT = /^-[A-Za-z]*s[A-Za-z]*$/;
|
|
3497
4106
|
var interpreterNameOf = (program) => basenameOf(program.text).replace(/\d+(?:\.\d+)*$/, "");
|
|
3498
|
-
var runsScripts = (program) =>
|
|
3499
|
-
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) ||
|
|
4107
|
+
var runsScripts = (program) => POSIX_SHELL_PROGRAMS.has(basenameOf(program.text)) || INLINE_CODE_INTERPRETERS.has(interpreterNameOf(program));
|
|
4108
|
+
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)));
|
|
3500
4109
|
var fetches = (invocation) => FETCHING_PROGRAMS.has(basenameOf(innermostInvocation(invocation).program?.text ?? ""));
|
|
3501
4110
|
var URL_QUERY_OR_FRAGMENT2 = /[?#].*$/;
|
|
3502
4111
|
var SOURCES_A_SCRIPT = /* @__PURE__ */ new Set(["source", "."]);
|
|
@@ -3611,7 +4220,7 @@ var roughSegmentsOf = (command) => {
|
|
|
3611
4220
|
};
|
|
3612
4221
|
var roughSegmentHasAVisibleConsequence = (toolName, segment, fetchesCode, depth) => {
|
|
3613
4222
|
const innermost = innermostInvocation(segment.invocation);
|
|
3614
|
-
const runsAHeredocScript = innermost.program !== void 0 &&
|
|
4223
|
+
const runsAHeredocScript = innermost.program !== void 0 && POSIX_SHELL_PROGRAMS.has(basenameOf(innermost.program.text));
|
|
3615
4224
|
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));
|
|
3616
4225
|
};
|
|
3617
4226
|
var roughReadingHasAVisibleConsequence = (toolName, command, depth) => {
|
|
@@ -3701,14 +4310,28 @@ var canonicalInvocationText = (invocation) => invocationTextWith(invocation, (wo
|
|
|
3701
4310
|
var spellingsOfAnInvocation = (invocation, innermost) => [invocation, innermost, ...gitReadingsPastGlobalOptions(innermost), ...readingsPastGlobalFlags(innermost)].flatMap((reading) => [verbatimInvocationText(reading), canonicalInvocationText(reading)]);
|
|
3702
4311
|
var NO_INLINE_SCRIPT = { kind: "none" };
|
|
3703
4312
|
var HIDDEN_INLINE_SCRIPT = { kind: "hidden" };
|
|
4313
|
+
var ENV_READINGS_THAT_NAME_THEIR_OUTCOME = /* @__PURE__ */ new Set(["command", "runs-nothing"]);
|
|
4314
|
+
var envPassesItsCommandIndirectly = (reading) => !ENV_READINGS_THAT_NAME_THEIR_OUTCOME.has(reading.kind);
|
|
3704
4315
|
var passesAnInlineScript = ({ program, args }) => {
|
|
3705
4316
|
const name = basenameOf(program?.text ?? "");
|
|
3706
|
-
return name === EVAL ||
|
|
3707
|
-
};
|
|
3708
|
-
var
|
|
4317
|
+
return name === EVAL || shellCommandStringOf(name, args).kind !== "absent" || name === ENV && envPassesItsCommandIndirectly(envReadingOf(args));
|
|
4318
|
+
};
|
|
4319
|
+
var envCommandScriptOf = (start, args) => args[start]?.expands ? null : args.slice(start).map((word) => asOneShellWord(word.text)).join(" ");
|
|
4320
|
+
var envCandidateScriptOf = (reading, args) => reading.kind === "split" ? envSplitScriptOf(reading, args) : envCommandScriptOf(reading.start, args);
|
|
4321
|
+
var isAScript = (script) => script !== null;
|
|
4322
|
+
var envCandidateScriptsOf = ({ program, args }) => {
|
|
4323
|
+
if (basenameOf(program?.text ?? "") !== ENV) return NO_INLINE_SCRIPT;
|
|
4324
|
+
const reading = envReadingOf(args);
|
|
4325
|
+
if (reading.kind !== "ambiguous") return NO_INLINE_SCRIPT;
|
|
4326
|
+
const scripts = reading.readings.map((candidate) => envCandidateScriptOf(candidate, args));
|
|
4327
|
+
return scripts.every(isAScript) ? { kind: "readable", scripts } : HIDDEN_INLINE_SCRIPT;
|
|
4328
|
+
};
|
|
4329
|
+
var shellReadsItsScript = (invocation) => POSIX_SHELL_PROGRAMS.has(basenameOf(invocation.program?.text ?? "")) && runsWhatItReads(invocation);
|
|
3709
4330
|
var inlineScriptsOf = (invocation, heredocs) => {
|
|
3710
4331
|
const script = shellScriptOf(invocation);
|
|
3711
4332
|
if (script !== null) return { kind: "readable", scripts: [script] };
|
|
4333
|
+
const envCandidates = envCandidateScriptsOf(invocation);
|
|
4334
|
+
if (envCandidates.kind !== "none") return envCandidates;
|
|
3712
4335
|
if (passesAnInlineScript(invocation)) return HIDDEN_INLINE_SCRIPT;
|
|
3713
4336
|
if (!shellReadsItsScript(invocation)) return NO_INLINE_SCRIPT;
|
|
3714
4337
|
return heredocs.length > 0 ? { kind: "readable", scripts: heredocs } : HIDDEN_INLINE_SCRIPT;
|
|
@@ -5190,6 +5813,8 @@ export {
|
|
|
5190
5813
|
MAX_HOOK_ACTIVATION_EVIDENCE_ROWS,
|
|
5191
5814
|
isHookActivationReport,
|
|
5192
5815
|
hookActivationResult,
|
|
5816
|
+
CLIENT_REPORT_PATH,
|
|
5817
|
+
clientContextHeaders,
|
|
5193
5818
|
PAIR_TTL_SECONDS,
|
|
5194
5819
|
computerOsOfPlatform,
|
|
5195
5820
|
SETUP_AGENT_CHOICES,
|
|
@@ -5197,8 +5822,6 @@ export {
|
|
|
5197
5822
|
NO_PAIRING_COMPUTER,
|
|
5198
5823
|
SETUP_CONNECT_MODES,
|
|
5199
5824
|
isSetupConnectMode,
|
|
5200
|
-
CLIENT_REPORT_PATH,
|
|
5201
|
-
clientContextHeaders,
|
|
5202
5825
|
DECLINED_AGENTS_FILE,
|
|
5203
5826
|
parseDeclinedAgents,
|
|
5204
5827
|
serializeDeclinedAgents,
|