pushary 1.9.96 → 1.9.99
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 +33 -0
- package/dist/{api-FPEL3PLH.js → api-UGCOLWF4.js} +10 -10
- package/dist/bin/pushary-bell-hook.js +27 -26
- package/dist/bin/pushary-bell.js +10 -10
- package/dist/bin/pushary-claude.js +48 -33
- package/dist/bin/pushary-clean.js +34 -34
- package/dist/bin/pushary-codex-bridge.js +21 -21
- package/dist/bin/pushary-codex-hook.js +33 -34
- package/dist/bin/pushary-codex-session.js +8 -8
- package/dist/bin/pushary-codex.js +14 -14
- package/dist/bin/pushary-connect.js +27 -27
- package/dist/bin/pushary-cowork.js +5 -5
- package/dist/bin/pushary-daemon.js +40 -39
- package/dist/bin/pushary-disconnect.js +26 -26
- package/dist/bin/pushary-display-hook.js +18 -17
- package/dist/bin/pushary-doctor.js +42 -42
- package/dist/bin/pushary-elicitation-hook.js +27 -26
- package/dist/bin/pushary-gemini-bridge.js +15 -15
- package/dist/bin/pushary-gemini-hook.js +29 -28
- package/dist/bin/pushary-hook.js +31 -30
- package/dist/bin/pushary-login.js +38 -20
- package/dist/bin/pushary-logout.js +25 -25
- package/dist/bin/pushary-mcp.js +11 -11
- package/dist/bin/pushary-mode.js +15 -15
- package/dist/bin/pushary-notification-hook.js +26 -25
- package/dist/bin/pushary-opencode-hook.js +28 -27
- package/dist/bin/pushary-permission-denied-hook.js +31 -30
- package/dist/bin/pushary-permission-hook.js +31 -30
- package/dist/bin/pushary-post-hook.js +26 -25
- package/dist/bin/pushary-prompt-hook.js +26 -25
- package/dist/bin/pushary-session-end-hook.js +28 -27
- package/dist/bin/pushary-session-start-hook.js +36 -35
- package/dist/bin/pushary-setup.js +103 -109
- package/dist/bin/pushary-stats.js +5 -5
- package/dist/bin/pushary-status.js +32 -32
- package/dist/bin/pushary-stop-hook.js +26 -25
- package/dist/bin/pushary-stopfailure-hook.js +26 -25
- package/dist/bin/pushary-suggestions.js +15 -15
- package/dist/bin/pushary-transcript-register.js +19 -18
- package/dist/bin/pushary-transcripts.js +27 -26
- package/dist/bin/pushary-upgrade.js +40 -40
- package/dist/bin/pushary-wait.js +15 -15
- package/dist/bin/pushary.js +7 -7
- package/dist/{chunk-PDRPVVZX.js → chunk-2CO34UJK.js} +2 -2
- package/dist/{chunk-3QS2RCCZ.js → chunk-2DKM45TQ.js} +6 -6
- package/dist/{chunk-HY7G3PWJ.js → chunk-35Q2Z7HD.js} +3 -3
- package/dist/{chunk-T7X5MQ3H.js → chunk-3NS3YK5S.js} +1 -1
- package/dist/{chunk-6YG5PZZS.js → chunk-3QTUISNT.js} +1 -1
- package/dist/{chunk-CRJDKGEF.js → chunk-3VWS2EAB.js} +5 -5
- package/dist/{chunk-VX27HJF6.js → chunk-4CD75FOI.js} +7 -7
- package/dist/{chunk-NGSJHUQN.js → chunk-4OG7AYQN.js} +1 -1
- package/dist/{chunk-PD2DWO4X.js → chunk-54476CMC.js} +2 -2
- package/dist/chunk-56MGFZDM.js +45 -0
- package/dist/{chunk-CLN5W5QP.js → chunk-5UKWIMMW.js} +5 -5
- package/dist/{chunk-CQ3YV6QI.js → chunk-73WH2KOH.js} +2 -2
- package/dist/{chunk-AEOYYLXF.js → chunk-7C5M5NY3.js} +3 -3
- package/dist/{chunk-77HBRZJI.js → chunk-7DJWJWRS.js} +3 -3
- package/dist/{chunk-OQY4G7FS.js → chunk-AP2VXDQB.js} +1 -1
- package/dist/{chunk-XZHJVGR3.js → chunk-AWO5VRPH.js} +2 -2
- package/dist/{chunk-TZWK2BVY.js → chunk-BFA36PR4.js} +6 -6
- package/dist/{chunk-XLRPJHXN.js → chunk-BSG7IIMK.js} +104 -2
- package/dist/{chunk-TVGOSEWS.js → chunk-BYGU5IV4.js} +52 -7
- package/dist/{chunk-SARU6WNW.js → chunk-E7WAVZNC.js} +1 -1
- package/dist/{chunk-OS32P4RZ.js → chunk-EBGUGOS3.js} +482 -12
- package/dist/{chunk-MSPHJNUL.js → chunk-EIREGHP2.js} +1 -1
- package/dist/{chunk-WVDPP7OQ.js → chunk-EJ7DI2HX.js} +5 -5
- package/dist/{chunk-N2KK2NSY.js → chunk-EXDEE4KB.js} +2 -2
- package/dist/{chunk-M7ZV5IPA.js → chunk-EXUGDNCF.js} +7 -7
- package/dist/{chunk-EPFI6W2K.js → chunk-FRAXLEC2.js} +1 -1
- package/dist/{chunk-BKN5E4L5.js → chunk-FSQXIJYX.js} +1 -1
- package/dist/{chunk-TQKVKV76.js → chunk-G24MYZIR.js} +5 -5
- package/dist/{chunk-OP2WJEPY.js → chunk-G66WIAST.js} +0 -43
- package/dist/{chunk-KHGW7THQ.js → chunk-GJ7CPXXB.js} +4 -4
- package/dist/{chunk-TTK2DLUS.js → chunk-GKRGH3SF.js} +10 -10
- package/dist/{chunk-IVYKPYMH.js → chunk-GNW6AHGY.js} +3 -3
- package/dist/{chunk-T2Z5ITWJ.js → chunk-GOHFQONY.js} +3 -3
- package/dist/{chunk-B4G4Q2AF.js → chunk-HF24RY6N.js} +1 -1
- package/dist/{chunk-YGMSDYOH.js → chunk-HVQSHNVK.js} +6 -6
- package/dist/{chunk-UFWRBHTV.js → chunk-IBHSZUXM.js} +3 -3
- package/dist/{chunk-CTKJVVDL.js → chunk-IOMU3A6E.js} +3 -3
- package/dist/{chunk-7CW3K3B5.js → chunk-JATIKUQ5.js} +5 -5
- package/dist/{chunk-3X3ALGMP.js → chunk-JE6UEOMG.js} +4 -4
- package/dist/{chunk-EMVK57K7.js → chunk-KLLX5ZTC.js} +2 -2
- package/dist/{chunk-YCYFREHD.js → chunk-KRQKPVHG.js} +2 -2
- package/dist/{chunk-TXDFQD2I.js → chunk-L6Q5FZ54.js} +1 -1
- package/dist/{chunk-M52UDSMQ.js → chunk-LM2YX5SO.js} +5 -5
- package/dist/{chunk-JU3JYEUG.js → chunk-LN53RAXQ.js} +4 -4
- package/dist/{chunk-WZADX5VO.js → chunk-MCZF73KL.js} +6 -6
- package/dist/{chunk-SISYAMDC.js → chunk-MLFZ4F2L.js} +4 -4
- package/dist/{chunk-QDS55ODM.js → chunk-N4SM5GMN.js} +14 -12
- package/dist/{chunk-SI2CJ2BB.js → chunk-NDOQN5VC.js} +3 -3
- package/dist/{chunk-6JZNZTGZ.js → chunk-NTAVA4LB.js} +3 -3
- package/dist/{chunk-VTFXPV4U.js → chunk-OBIXCQPF.js} +2 -2
- package/dist/{chunk-TAMHTWQZ.js → chunk-OLA7MWVD.js} +11 -10
- package/dist/{chunk-KG7GT7UW.js → chunk-P7SBX7QQ.js} +1 -1
- package/dist/{chunk-JCYXG6LQ.js → chunk-PDC4UQUC.js} +3 -3
- package/dist/{chunk-J3W32P43.js → chunk-PED2VA34.js} +1 -1
- package/dist/{chunk-4BLNOWGZ.js → chunk-PT43DN4J.js} +16 -15
- package/dist/{chunk-ARDQBF25.js → chunk-PVERXZOS.js} +1 -1
- package/dist/{chunk-V7EWOHNV.js → chunk-QTFN3ND3.js} +4 -4
- package/dist/{chunk-BDCFB4NV.js → chunk-RB4E2YHR.js} +6 -6
- package/dist/{chunk-3GPXHHBM.js → chunk-SYMYZNSB.js} +1 -1
- package/dist/{chunk-LGJPT33C.js → chunk-T3HCMKX4.js} +2 -2
- package/dist/{chunk-WUYB3J3Q.js → chunk-T7YK7FNA.js} +2 -2
- package/dist/{chunk-C4IKRLT4.js → chunk-TBE76OH7.js} +2 -2
- package/dist/{chunk-XLM2JZBE.js → chunk-TMRJOWWU.js} +1 -1
- package/dist/{chunk-2QFD5XGU.js → chunk-U4MEORPA.js} +3 -3
- package/dist/{chunk-2DF4TBGX.js → chunk-UKX7IMD2.js} +1 -1
- package/dist/{chunk-B75SIY5C.js → chunk-UMRO47H3.js} +3 -3
- package/dist/{chunk-R2RCFCFW.js → chunk-VSKHU5XR.js} +6 -6
- package/dist/{chunk-DN3QW2TT.js → chunk-VWGZZSJG.js} +3 -3
- package/dist/{chunk-3QT3DMNX.js → chunk-YIPSSNTL.js} +1 -1
- package/dist/{chunk-HOYWYQNC.js → chunk-YLBUBQEL.js} +5 -5
- package/dist/{chunk-GAZPL742.js → chunk-ZP7R762D.js} +4 -4
- package/dist/{codex-app-cards-switch-7YTDIMCX.js → codex-app-cards-switch-XMHI5UNS.js} +11 -11
- package/dist/{codex-desktop-launch-CICLFWQX.js → codex-desktop-launch-QSD3X65K.js} +1 -1
- package/dist/{codex-session-launch-KW7VUPAH.js → codex-session-launch-TKDH5MHT.js} +18 -18
- package/dist/{config-632JSNBM.js → config-R3P7U2TH.js} +3 -3
- package/dist/{global-upgrade-BMCLOI2P.js → global-upgrade-SYF6JI7C.js} +10 -10
- package/dist/{identity-UCVTGQHM.js → identity-VH233LC3.js} +4 -4
- package/dist/{live-capabilities-5VPEAE37.js → live-capabilities-THIEYKPD.js} +5 -5
- package/dist/{paths-NCKEVGEI.js → paths-UA5EZQAH.js} +3 -3
- package/dist/{reapply-UPZ2L4ID.js → reapply-QDTONXI3.js} +28 -28
- package/dist/src/index.js +30 -29
- package/dist/{upgrade-lock-J36URBLG.js → upgrade-lock-GHMTQ3JP.js} +4 -4
- package/dist/{usage-BL3KXNWQ.js → usage-E3M5YPYW.js} +3 -3
- package/package.json +1 -1
|
@@ -205,6 +205,18 @@ var CLAUDE_CONNECTOR_STEPS = [
|
|
|
205
205
|
];
|
|
206
206
|
var CONNECTOR_SETUP_QUESTION = "Did this setup question reach you?";
|
|
207
207
|
var CLAUDE_CONNECTOR_TEST = `Use Pushary ask_user to ask \u201C${CONNECTOR_SETUP_QUESTION}\u201D with type \u201Cconfirm\u201D. Use agentName \u201CClaude Cowork - Setup check\u201D in Cowork or \u201CClaude Chat - Setup check\u201D in Chat. Wait for my answer and tell me which answer you received. Do not run a command or change any files.`;
|
|
208
|
+
var connectorStarterPrompt = (agentNameRule) => `I\u2019m stepping away. Reach me on my phone with Pushary while you work on the task at the end of this message.
|
|
209
|
+
|
|
210
|
+
Before you start, use Pushary ask_user with type \u201Cselect\u201D to ask me the one choice that most changes the result. Give two to four options, put your recommendation first, and wait for my answer. Ask it even if you already have a recommendation. If I did not write a task, use ask_user with type \u201Cinput\u201D to ask me for one instead.
|
|
211
|
+
|
|
212
|
+
While you work, ask me with ask_user before you send, buy or delete anything, and wait for my answer. Silence is not a yes.
|
|
213
|
+
|
|
214
|
+
When you finish, send me a short note with send_notification and context.type \u201Ctask_complete\u201D.
|
|
215
|
+
|
|
216
|
+
${agentNameRule}
|
|
217
|
+
|
|
218
|
+
My task:`;
|
|
219
|
+
var CLAUDE_CONNECTOR_STARTER = connectorStarterPrompt("Use agentName \u201CClaude Cowork - <task name>\u201D in Cowork or \u201CClaude Chat - <task name>\u201D in Chat.");
|
|
208
220
|
var COWORK_STANDING_INSTRUCTIONS = `Pushary is connected as a connector. Use it proactively to reach me on my phone or Mac notch.
|
|
209
221
|
|
|
210
222
|
- When you need a decision or clarifying answer, call ask_user. Use type "confirm", "select", or "input" as appropriate. Ask once on one channel.
|
|
@@ -1942,6 +1954,8 @@ var POWERSHELL_FILE_WRITERS = /* @__PURE__ */ new Set([
|
|
|
1942
1954
|
"start-bitstransfer"
|
|
1943
1955
|
]);
|
|
1944
1956
|
var POWERSHELL_FETCHERS = /* @__PURE__ */ new Set(["invoke-webrequest", "invoke-restmethod", "start-bitstransfer"]);
|
|
1957
|
+
var POWERSHELL_WEB_REQUESTS = /* @__PURE__ */ new Set(["invoke-webrequest", "invoke-restmethod"]);
|
|
1958
|
+
var WEB_READ_METHODS = /* @__PURE__ */ new Set(["get", "head", "options"]);
|
|
1945
1959
|
var DISK_ERASERS = /* @__PURE__ */ new Set(["format-volume", "clear-disk", "initialize-disk", "remove-partition", "format"]);
|
|
1946
1960
|
var WINDOWS_SERVICE_CHANGERS = /* @__PURE__ */ new Set([
|
|
1947
1961
|
"start-service",
|
|
@@ -2140,9 +2154,29 @@ var stageIsDestructive = (stage, judge) => {
|
|
|
2140
2154
|
const command = powerShellCommandOf(stage);
|
|
2141
2155
|
return DOTNET_RECURSIVE_DELETE.test(stage.source) || command !== null && (removesRecursively(command) || !onlyReads(command, judge) && judge.namesADestructiveAction(keywordTextOf(command)));
|
|
2142
2156
|
};
|
|
2157
|
+
var LOOKS_LIKE_AN_ADDRESS = /^(?:[a-z][a-z\d+.-]*:\/\/|localhost\b|127\.|\[::1\])/i;
|
|
2158
|
+
var namesAWebRequestBody = (command) => command.args.some((arg) => {
|
|
2159
|
+
const parameter = parameterOf(arg);
|
|
2160
|
+
return namesTheParameter(parameter, "body", 1) || namesTheParameter(parameter, "infile", 2) || namesTheParameter(parameter, "form", 3);
|
|
2161
|
+
});
|
|
2162
|
+
var webRequestMethodOf = (command) => parameterValueOf(command, "method", 2) ?? parameterValueOf(command, "custommethod", 2);
|
|
2163
|
+
var SPLATTED_PARAMETERS = /^@\w+$/;
|
|
2164
|
+
var splatsItsParameters = (command) => command.args.some((arg) => !arg.quoted && SPLATTED_PARAMETERS.test(arg.text));
|
|
2165
|
+
var goesThroughAProxy = (command) => command.args.some((arg) => namesTheParameter(parameterOf(arg), "proxy", 5));
|
|
2166
|
+
var webRequestSendsData = (command) => {
|
|
2167
|
+
const method = webRequestMethodOf(command);
|
|
2168
|
+
if (splatsItsParameters(command)) return true;
|
|
2169
|
+
return method === void 0 ? namesAWebRequestBody(command) : method.includes("$") || !WEB_READ_METHODS.has(method.toLowerCase());
|
|
2170
|
+
};
|
|
2171
|
+
var webRequestAddressesOf = (command) => {
|
|
2172
|
+
if (splatsItsParameters(command) || goesThroughAProxy(command)) return [];
|
|
2173
|
+
const uri = parameterValueOf(command, "uri", 2);
|
|
2174
|
+
return uri === void 0 ? positionalTextsOf(command).filter((text3) => LOOKS_LIKE_AN_ADDRESS.test(text3)) : [uri];
|
|
2175
|
+
};
|
|
2176
|
+
var sendsAWebRequestThatNeedsAPerson = (command, judge) => POWERSHELL_WEB_REQUESTS.has(command.cmdlet) && judge.webRequestNeedsAPerson({ sendsData: webRequestSendsData(command), addresses: webRequestAddressesOf(command) });
|
|
2143
2177
|
var stageHasAVisibleConsequence = (stage, judge) => {
|
|
2144
2178
|
const command = powerShellCommandOf(stage);
|
|
2145
|
-
return stage.redirectTargets.some((target) => namesAPathThatNeedsAPerson(target.text, judge)) || command !== null && !onlyReads(command, judge) && powerShellCommandChangesSomething(command, judge);
|
|
2179
|
+
return stage.redirectTargets.some((target) => namesAPathThatNeedsAPerson(target.text, judge)) || command !== null && sendsAWebRequestThatNeedsAPerson(command, judge) || command !== null && !onlyReads(command, judge) && powerShellCommandChangesSomething(command, judge);
|
|
2146
2180
|
};
|
|
2147
2181
|
var fetchesWithPowerShell = (stage, judge) => {
|
|
2148
2182
|
const command = powerShellCommandOf(stage);
|
|
@@ -2880,6 +2914,7 @@ var shellCommandStringOf = (shell, args) => {
|
|
|
2880
2914
|
|
|
2881
2915
|
// ../contracts/src/chatgpt-plugin.ts
|
|
2882
2916
|
var CHATGPT_CONNECTOR_TEST = `@Pushary use ask_user to ask \u201C${CONNECTOR_SETUP_QUESTION}\u201D with type \u201Cconfirm\u201D and agentName \u201CChatGPT - Setup check\u201D. Wait for my answer and tell me which answer you received.`;
|
|
2917
|
+
var CHATGPT_CONNECTOR_STARTER = `@Pushary ${connectorStarterPrompt("Use agentName \u201CChatGPT - <task name>\u201D.")}`;
|
|
2883
2918
|
|
|
2884
2919
|
// ../contracts/src/partner-developer-guide.ts
|
|
2885
2920
|
var PARTNER_API_KEYS_URL = "https://pushary.com/dashboard/agent/settings";
|
|
@@ -4619,17 +4654,39 @@ var easCommandPublishes = (invocation) => {
|
|
|
4619
4654
|
const words = wordsOfInvocation(invocation);
|
|
4620
4655
|
return words.some((word, index) => EAS_PROGRAM.test(basenameOf(word.text)) && EAS_COMMANDS_THAT_PUBLISH.test(words[index + 1]?.text ?? ""));
|
|
4621
4656
|
};
|
|
4622
|
-
var
|
|
4657
|
+
var XCRUN = "xcrun";
|
|
4658
|
+
var ALTOOL = "altool";
|
|
4659
|
+
var NOTARYTOOL = "notarytool";
|
|
4660
|
+
var APPLE_UPLOAD_TOOLS = /* @__PURE__ */ new Set([ALTOOL, NOTARYTOOL]);
|
|
4661
|
+
var ALTOOL_UPLOAD_FLAG = /^--(?:upload-app|upload-package|notarize-app)$/;
|
|
4662
|
+
var NOTARYTOOL_SUBMIT = "submit";
|
|
4663
|
+
var appleUploadToolOf = ({ program, args }) => {
|
|
4664
|
+
if (program === void 0) return [];
|
|
4665
|
+
const name = basenameOf(program.text);
|
|
4666
|
+
if (APPLE_UPLOAD_TOOLS.has(name)) return [program, ...args];
|
|
4667
|
+
if (name !== XCRUN) return [];
|
|
4668
|
+
const tool = args.findIndex((arg) => APPLE_UPLOAD_TOOLS.has(basenameOf(arg.text)));
|
|
4669
|
+
return tool === -1 ? [] : args.slice(tool);
|
|
4670
|
+
};
|
|
4671
|
+
var uploadsABuildToApple = (invocation) => {
|
|
4672
|
+
const [tool, ...rest] = appleUploadToolOf(invocation);
|
|
4673
|
+
if (tool === void 0) return false;
|
|
4674
|
+
return basenameOf(tool.text) === ALTOOL ? rest.some((arg) => ALTOOL_UPLOAD_FLAG.test(arg.text)) : rest.find((arg) => !FLAG.test(arg.text))?.text === NOTARYTOOL_SUBMIT;
|
|
4675
|
+
};
|
|
4676
|
+
var publishesAnAppBuild = (invocation) => invocation.args.some((arg) => SUBMITS_THE_BUILD_TO_A_STORE.test(arg.text)) || easCommandPublishes(invocation) || uploadsABuildToApple(invocation);
|
|
4623
4677
|
var PUSHES_EVERY_TAG = /* @__PURE__ */ new Set(["--tags", "--follow-tags"]);
|
|
4624
4678
|
var NAMES_A_TAG = /(?:^|:)\+?refs\/tags\/|^tag$|(?:^|:)v?\d+(?:\.\d+){1,3}$|(?:^|:)v?\d+\.\d+\.\d+[-+][\w.]+$|\/v\d+\.\d+\.\d+(?:\.\d+)?(?:[-+][\w.]+)?$|^v\$/;
|
|
4625
4679
|
var TAG_HELD_IN_A_VARIABLE = /^v?\$\{?(?:\w+_)?(?:tag|version)(?:_name)?\}?$/i;
|
|
4626
4680
|
var GIT_PUSH = "push";
|
|
4681
|
+
var NAMES_A_MAJOR_VERSION_TAG = /(?:^|:)v\d+$/;
|
|
4682
|
+
var SETS_THE_UPSTREAM_BRANCH = /* @__PURE__ */ new Set(["-u", "--set-upstream"]);
|
|
4627
4683
|
var pushesATag = ({ program, args }) => {
|
|
4628
4684
|
if (program === void 0 || basenameOf(program.text) !== GIT) return false;
|
|
4629
4685
|
const [subcommand, ...rest] = argsAfterHarmlessGlobalFlags(args);
|
|
4630
4686
|
if (subcommand?.text !== GIT_PUSH) return false;
|
|
4631
4687
|
const operands = rest.filter((arg) => !FLAG.test(arg.text));
|
|
4632
|
-
|
|
4688
|
+
const pushesABranch = rest.some((arg) => SETS_THE_UPSTREAM_BRANCH.has(arg.text));
|
|
4689
|
+
return rest.some((arg) => PUSHES_EVERY_TAG.has(arg.text)) || operands.slice(1).some((operand) => NAMES_A_TAG.test(operand.text) || TAG_HELD_IN_A_VARIABLE.test(operand.text) || !pushesABranch && NAMES_A_MAJOR_VERSION_TAG.test(operand.text));
|
|
4633
4690
|
};
|
|
4634
4691
|
var SECRET_FILE_NAME = /^(?:\.env(?:\.(?!example$|sample$|template$)[\w.-]+)?|(?:secrets?|credentials)\.(?:json|ya?ml|env|toml|ini)|credentials)$/i;
|
|
4635
4692
|
var CI_WORKFLOW_FILE = /(?:^|\/)\.github\/workflows\/[^/]+$/i;
|
|
@@ -4645,8 +4702,29 @@ var AGENT_SETTINGS_FILE = new RegExp(String.raw`(?:^|/)(?:${[
|
|
|
4645
4702
|
String.raw`\.config/opencode/(?:opencode\.jsonc?|plugins?/.+)`,
|
|
4646
4703
|
String.raw`\.pushary(?:/.+)?`,
|
|
4647
4704
|
String.raw`\.git/hooks(?:/.+)?`,
|
|
4648
|
-
String.raw`\.
|
|
4705
|
+
String.raw`\.git/config`,
|
|
4706
|
+
String.raw`\.ssh(?:/(?!known_hosts(?:\.old)?$).+)?`,
|
|
4707
|
+
String.raw`\.mcp\.json`,
|
|
4708
|
+
String.raw`\.cursor/mcp\.json`,
|
|
4709
|
+
String.raw`\.claude/hooks/.+`,
|
|
4710
|
+
String.raw`pushary-(?:policy|mode)-[^/]*\.json`
|
|
4649
4711
|
].join("|")})$`, "i");
|
|
4712
|
+
var HOME_DIRECTORY = String.raw`(?:~|\$HOME|\$\{HOME\}|(?:[A-Za-z]:)?/Users/[^/]+|/home/[^/]+|/root|/var/root)`;
|
|
4713
|
+
var FILE_THE_MACHINE_RUNS_LATER = new RegExp(String.raw`^(?:${[
|
|
4714
|
+
String.raw`${HOME_DIRECTORY}/\.(?:zshrc|zshenv|zprofile|zlogin|zlogout|bashrc|bash_profile|bash_login|bash_logout|bash_aliases|profile)(?:\.[\w-]+)?`,
|
|
4715
|
+
String.raw`${HOME_DIRECTORY}/\.gitconfig(?:[-._][\w.-]+)?`,
|
|
4716
|
+
String.raw`${HOME_DIRECTORY}/\.p10k\.zsh`,
|
|
4717
|
+
String.raw`${HOME_DIRECTORY}/\.(?:zsh|zshrc\.d|oh-my-zsh)/.+`,
|
|
4718
|
+
String.raw`${HOME_DIRECTORY}/\.config/(?:fish/config\.fish|fish/conf\.d/.+|git/config|zsh/.+|systemd/user/.+)`,
|
|
4719
|
+
String.raw`(?:.*/)?Library/Launch(?:Agents|Daemons)/[^/]+`,
|
|
4720
|
+
String.raw`(?:.*/)?(?:Windows)?PowerShell/(?:Microsoft\.[\w.]+_)?profile\.ps1`,
|
|
4721
|
+
String.raw`\$profile(?:\.\w+)?`,
|
|
4722
|
+
String.raw`/(?:private/)?etc/.+`
|
|
4723
|
+
].join("|")})$`, "i");
|
|
4724
|
+
var FILE_A_PROJECT_TOOL_RUNS_LATER = /^(?:.*\/)?(?:\.husky\/.+|\.envrc|\.vscode\/tasks\.json)$/i;
|
|
4725
|
+
var LINE_TERMINATOR = /[\n\r\u2028\u2029]/;
|
|
4726
|
+
var CREDENTIAL_FILE_IN_THE_HOME_FOLDER = new RegExp(String.raw`^${HOME_DIRECTORY}/(?:\.npmrc|[._]netrc|\.kube/config)$`, "i");
|
|
4727
|
+
var AGENT_INSTRUCTION_FILE = /(?:^|\/)(?:CLAUDE(?:\.local)?\.md|AGENTS(?:\.override)?\.md|\.claude\/(?:commands|agents)\/.+)$/i;
|
|
4650
4728
|
var withoutDotSegments = (path) => {
|
|
4651
4729
|
const kept = [];
|
|
4652
4730
|
for (const segment of path.split("/")) {
|
|
@@ -4655,9 +4733,10 @@ var withoutDotSegments = (path) => {
|
|
|
4655
4733
|
}
|
|
4656
4734
|
return `${path.startsWith("/") ? "/" : ""}${kept.join("/")}`;
|
|
4657
4735
|
};
|
|
4736
|
+
var namesAFileAToolOrAnAgentReadsLater = (path) => !LINE_TERMINATOR.test(path) && (FILE_A_PROJECT_TOOL_RUNS_LATER.test(path) || AGENT_INSTRUCTION_FILE.test(path));
|
|
4658
4737
|
var pathNeedsAPersonToChange = (path) => {
|
|
4659
4738
|
const written = withoutDotSegments(normalizeSeparators(path));
|
|
4660
|
-
return SECRET_FILE_NAME.test(basenameOf(written)) || CI_WORKFLOW_FILE.test(written) || AGENT_SETTINGS_FILE.test(written);
|
|
4739
|
+
return SECRET_FILE_NAME.test(basenameOf(written)) || CI_WORKFLOW_FILE.test(written) || AGENT_SETTINGS_FILE.test(written) || FILE_THE_MACHINE_RUNS_LATER.test(written) || CREDENTIAL_FILE_IN_THE_HOME_FOLDER.test(written) || namesAFileAToolOrAnAgentReadsLater(written);
|
|
4661
4740
|
};
|
|
4662
4741
|
var REDIRECTS_INTO_A_SECRET_FILE = />>?\s*(?:[^\s;|&<>]*\/)?\.env(?:\.[\w-]+)?(?=$|[\s;|&)])/;
|
|
4663
4742
|
var COPIES_ONTO_ITS_LAST_OPERAND = /* @__PURE__ */ new Set(["cp", "install", "ln", "rsync", "scp"]);
|
|
@@ -4718,7 +4797,10 @@ var FOLDER_THAT_NEEDS_A_PERSON = new RegExp(String.raw`(?:^|/)(?:${[
|
|
|
4718
4797
|
String.raw`\.pushary`,
|
|
4719
4798
|
String.raw`\.git/hooks`,
|
|
4720
4799
|
String.raw`\.ssh`,
|
|
4721
|
-
String.raw`\.config/opencode(?:/plugins?)
|
|
4800
|
+
String.raw`\.config/opencode(?:/plugins?)?`,
|
|
4801
|
+
String.raw`Library/Launch(?:Agents|Daemons)`,
|
|
4802
|
+
String.raw`\.husky`,
|
|
4803
|
+
String.raw`\.claude/(?:commands|agents)`
|
|
4722
4804
|
].join("|")})$`, "i");
|
|
4723
4805
|
var folderNeedsAPersonToChange = (path) => FOLDER_THAT_NEEDS_A_PERSON.test(withoutDotSegments(normalizeSeparators(path)));
|
|
4724
4806
|
var NETWORK_SENDERS = /* @__PURE__ */ new Set([
|
|
@@ -4775,6 +4857,83 @@ var changesWhereGitLooksForHooks = ({ program, args }) => {
|
|
|
4775
4857
|
if (args[setting - 1]?.text === GIT_ONE_COMMAND_SETTING_FLAG) return true;
|
|
4776
4858
|
return args.some((arg) => arg.text === GIT_CONFIG_SUBCOMMAND) && (args[setting + 1] !== void 0 || args.some((arg) => GIT_CONFIG_UNSET_FLAGS.has(arg.text)));
|
|
4777
4859
|
};
|
|
4860
|
+
var GIT_SETTING_THAT_RUNS_A_PROGRAM = new RegExp(`^(?:${[
|
|
4861
|
+
String.raw`core\.(?:fsmonitor|sshcommand|pager|editor|askpass|gitproxy|alternaterefscommand|hookspath)`,
|
|
4862
|
+
String.raw`pager\..+`,
|
|
4863
|
+
String.raw`sequence\.editor`,
|
|
4864
|
+
String.raw`diff\.external`,
|
|
4865
|
+
String.raw`diff\..+\.(?:textconv|command)`,
|
|
4866
|
+
String.raw`merge\..+\.driver`,
|
|
4867
|
+
String.raw`(?:diff|merge)tool\..+\.(?:cmd|path)`,
|
|
4868
|
+
String.raw`interactive\.difffilter`,
|
|
4869
|
+
String.raw`gpg\.ssh\.defaultkeycommand`,
|
|
4870
|
+
String.raw`uploadpack\.packobjectshook`,
|
|
4871
|
+
String.raw`credential\.(?:.+\.)?helper`,
|
|
4872
|
+
String.raw`gpg(?:\.[\w-]+)?\.program`,
|
|
4873
|
+
String.raw`filter\..+\.(?:clean|smudge|process)`,
|
|
4874
|
+
String.raw`remote\..+\.(?:uploadpack|receivepack)`,
|
|
4875
|
+
String.raw`protocol\.(?:.+\.)?allow`,
|
|
4876
|
+
String.raw`include\.path`,
|
|
4877
|
+
String.raw`includeif\..+\.path`
|
|
4878
|
+
].join("|")})$`, "i");
|
|
4879
|
+
var SWITCHES_A_SETTING_ON_OR_OFF = /^(?:true|false|yes|no|on|off|0|1|never|)$/i;
|
|
4880
|
+
var GIT_INCLUDE_SETTING = /^include(?:if\..+)?\.path$/i;
|
|
4881
|
+
var GIT_CREDENTIAL_HELPER_SETTING = /^credential\.(?:.+\.)?helper$/i;
|
|
4882
|
+
var NAMES_A_KNOWN_CREDENTIAL_HELPER = /^(?:osxkeychain|store|cache|manager|manager-core|libsecret|wincred|gnome-keyring)(?:\s+--[\w-]+(?:=[\w./~:@%+,-]+)?)*$/i;
|
|
4883
|
+
var namesNoNewProgram = (setting, value) => !value.expands && !GIT_INCLUDE_SETTING.test(setting) && (SWITCHES_A_SETTING_ON_OR_OFF.test(value.text) || GIT_CREDENTIAL_HELPER_SETTING.test(setting) && NAMES_A_KNOWN_CREDENTIAL_HELPER.test(value.text));
|
|
4884
|
+
var GIT_SETTING_THAT_RUNS_A_COMMAND_AFTER_A_BANG = /^(?:alias\..+|submodule\..+\.update)$/i;
|
|
4885
|
+
var RUNS_A_SHELL_COMMAND = /^!/;
|
|
4886
|
+
var GIT_CONFIG_READ_OPTIONS = /* @__PURE__ */ new Set([
|
|
4887
|
+
"--get",
|
|
4888
|
+
"--get-all",
|
|
4889
|
+
"--get-regexp",
|
|
4890
|
+
"--get-urlmatch",
|
|
4891
|
+
"--get-color",
|
|
4892
|
+
"--get-colorbool",
|
|
4893
|
+
"--list",
|
|
4894
|
+
"-l"
|
|
4895
|
+
]);
|
|
4896
|
+
var GIT_CONFIG_READ_SUBCOMMANDS = /* @__PURE__ */ new Set(["get", "list"]);
|
|
4897
|
+
var GIT_CONFIG_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set(["--comment", "--file", "-f", "--blob", "--type", "--default"]);
|
|
4898
|
+
var gitConfigOnlyReads = (args) => {
|
|
4899
|
+
let firstOperand;
|
|
4900
|
+
for (let index = args.findIndex((arg) => arg.text === GIT_CONFIG_SUBCOMMAND) + 1; index < args.length; index++) {
|
|
4901
|
+
const text3 = args[index]?.text ?? "";
|
|
4902
|
+
if (!FLAG.test(text3)) firstOperand ??= text3;
|
|
4903
|
+
else if (GIT_CONFIG_READ_OPTIONS.has(text3)) return true;
|
|
4904
|
+
else if (GIT_CONFIG_OPTIONS_WITH_A_VALUE.has(text3)) index++;
|
|
4905
|
+
}
|
|
4906
|
+
return GIT_CONFIG_READ_SUBCOMMANDS.has(firstOperand ?? "");
|
|
4907
|
+
};
|
|
4908
|
+
var gitConfigWriteOf = (args, namesTheSetting) => {
|
|
4909
|
+
if (!args.some((arg) => arg.text === GIT_CONFIG_SUBCOMMAND)) return void 0;
|
|
4910
|
+
const operands = args.filter((arg) => !FLAG.test(arg.text));
|
|
4911
|
+
if (gitConfigOnlyReads(args)) return void 0;
|
|
4912
|
+
const setting = operands.findIndex((arg) => namesTheSetting(arg.text));
|
|
4913
|
+
const value = setting === -1 ? void 0 : operands[setting + 1];
|
|
4914
|
+
return value === void 0 ? void 0 : { name: operands[setting]?.text ?? "", value };
|
|
4915
|
+
};
|
|
4916
|
+
var namesAGitSettingThatRunsAProgram = (name) => GIT_SETTING_THAT_RUNS_A_PROGRAM.test(name) || GIT_SETTING_THAT_RUNS_A_COMMAND_AFTER_A_BANG.test(name);
|
|
4917
|
+
var setsAGitSettingThatRunsAProgram = ({ program, args }) => {
|
|
4918
|
+
if (program === void 0 || basenameOf(program.text) !== GIT) return false;
|
|
4919
|
+
const written = gitConfigWriteOf(args, namesAGitSettingThatRunsAProgram);
|
|
4920
|
+
if (written === void 0 || namesNoNewProgram(written.name, written.value)) return false;
|
|
4921
|
+
return !GIT_SETTING_THAT_RUNS_A_COMMAND_AFTER_A_BANG.test(written.name) || written.value.expands || RUNS_A_SHELL_COMMAND.test(written.value.text);
|
|
4922
|
+
};
|
|
4923
|
+
var GIT_DESTINATION_SETTING = String.raw`(?:remote\..+\.(?:url|pushurl)|url\..+\.(?:insteadof|pushinsteadof))`;
|
|
4924
|
+
var GIT_SETTING_THAT_CHANGES_WHERE_GIT_SENDS = new RegExp(`^${GIT_DESTINATION_SETTING}$`, "i");
|
|
4925
|
+
var GIT_ONE_COMMAND_SETTING_THAT_CHANGES_WHERE_GIT_SENDS = new RegExp(`^${GIT_DESTINATION_SETTING}=`, "i");
|
|
4926
|
+
var GIT_REMOTE_SUBCOMMAND = "remote";
|
|
4927
|
+
var GIT_REMOTE_SET_URL = "set-url";
|
|
4928
|
+
var namesAGitSettingThatChangesWhereGitSends = (name) => GIT_SETTING_THAT_CHANGES_WHERE_GIT_SENDS.test(name);
|
|
4929
|
+
var setsWhereGitSendsForOneCommand = (args) => args.some((arg, index) => args[index - 1]?.text === GIT_ONE_COMMAND_SETTING_FLAG && GIT_ONE_COMMAND_SETTING_THAT_CHANGES_WHERE_GIT_SENDS.test(arg.text));
|
|
4930
|
+
var changesWhereGitSends = ({ program, args }) => {
|
|
4931
|
+
if (program === void 0 || basenameOf(program.text) !== GIT) return false;
|
|
4932
|
+
const [subcommand, action] = subcommandWordsOf(argsAfterGitGlobalOptions(args));
|
|
4933
|
+
if (subcommand?.text === GIT_PUSH) return setsWhereGitSendsForOneCommand(args);
|
|
4934
|
+
if (subcommand?.text === GIT_REMOTE_SUBCOMMAND) return action?.text === GIT_REMOTE_SET_URL;
|
|
4935
|
+
return gitConfigWriteOf(args, namesAGitSettingThatChangesWhereGitSends) !== void 0;
|
|
4936
|
+
};
|
|
4778
4937
|
var writesAFileThatNeedsAPerson = ({ program, args }) => {
|
|
4779
4938
|
if (program === void 0) return false;
|
|
4780
4939
|
if (sendsAFileThatNeedsAPerson({ program, args })) return true;
|
|
@@ -5018,6 +5177,7 @@ var GITHUB_COMMANDS_WITH_A_CONSEQUENCE = /* @__PURE__ */ new Map([
|
|
|
5018
5177
|
["secret", /* @__PURE__ */ new Set(["set"])],
|
|
5019
5178
|
["variable", /* @__PURE__ */ new Set(["set"])],
|
|
5020
5179
|
[GITHUB_REPO_NOUN, /* @__PURE__ */ new Set(["archive", "rename"])],
|
|
5180
|
+
["workflow", /* @__PURE__ */ new Set(["run", "enable", "disable"])],
|
|
5021
5181
|
["ssh-key", /* @__PURE__ */ new Set(["add"])],
|
|
5022
5182
|
["gpg-key", /* @__PURE__ */ new Set(["add"])]
|
|
5023
5183
|
]);
|
|
@@ -5188,13 +5348,297 @@ var sshRemoteCommandOf = (args) => {
|
|
|
5188
5348
|
}
|
|
5189
5349
|
return args.slice(index + 1);
|
|
5190
5350
|
};
|
|
5351
|
+
var PLAIN_REMOTE_COMMAND = /^[\w ./:=,@%+-]+$/;
|
|
5352
|
+
var REMOTE_STATUS_COMMAND = new RegExp(`^(?:${[
|
|
5353
|
+
String.raw`(?:uptime|free|who|w|nproc|lscpu|lsblk|last|lsof|netstat)`,
|
|
5354
|
+
String.raw`docker (?:compose )?(?:ps|images|logs|inspect|stats|top|version|info)`,
|
|
5355
|
+
String.raw`systemctl (?:status|is-active|is-enabled|is-failed|list-units|list-timers|show|cat)`,
|
|
5356
|
+
String.raw`journalctl`
|
|
5357
|
+
].join("|")})(?: |$)`);
|
|
5358
|
+
var JOURNAL_CHANGING_OPTIONS = [
|
|
5359
|
+
"vacuum-size",
|
|
5360
|
+
"vacuum-time",
|
|
5361
|
+
"vacuum-files",
|
|
5362
|
+
"rotate",
|
|
5363
|
+
"flush",
|
|
5364
|
+
"sync",
|
|
5365
|
+
"relinquish-var",
|
|
5366
|
+
"smart-relinquish-var",
|
|
5367
|
+
"setup-keys",
|
|
5368
|
+
"update-catalog",
|
|
5369
|
+
"cursor-file"
|
|
5370
|
+
];
|
|
5371
|
+
var JOURNAL_READ_OPTIONS_SHARING_A_PREFIX = /* @__PURE__ */ new Set(["cursor"]);
|
|
5372
|
+
var LONG_OPTION_NAME = /^--([\w-]+)/;
|
|
5373
|
+
var namesAJournalChangingOption = (word) => {
|
|
5374
|
+
const name = LONG_OPTION_NAME.exec(word)?.[1];
|
|
5375
|
+
return name !== void 0 && !JOURNAL_READ_OPTIONS_SHARING_A_PREFIX.has(name) && JOURNAL_CHANGING_OPTIONS.some((option) => option.startsWith(name));
|
|
5376
|
+
};
|
|
5377
|
+
var onlyReadsTheRemoteStatus = (command) => PLAIN_REMOTE_COMMAND.test(command) && REMOTE_STATUS_COMMAND.test(command) && !command.split(" ").some(namesAJournalChangingOption);
|
|
5191
5378
|
var sshRunsMoreThanAReadOnlyCommand = ({ program, args }) => {
|
|
5192
5379
|
if (program === void 0 || basenameOf(program.text) !== SSH) return false;
|
|
5193
5380
|
if (sshOptionRunsACommand(args)) return true;
|
|
5194
5381
|
const command = sshRemoteCommandOf(args);
|
|
5195
|
-
|
|
5382
|
+
const remote = command.map((arg) => arg.text).join(" ");
|
|
5383
|
+
return command.length > 0 && (command.some((arg) => arg.expands) || !isSafeReadOnlyCommand(remote) && !onlyReadsTheRemoteStatus(remote));
|
|
5384
|
+
};
|
|
5385
|
+
var REMOTE_COPY_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Map([
|
|
5386
|
+
["scp", /* @__PURE__ */ new Set(["-c", "-D", "-F", "-i", "-J", "-l", "-o", "-P", "-S", "-X"])],
|
|
5387
|
+
["rsync", /* @__PURE__ */ new Set([
|
|
5388
|
+
"-e",
|
|
5389
|
+
"--rsh",
|
|
5390
|
+
"--rsync-path",
|
|
5391
|
+
"--exclude",
|
|
5392
|
+
"--include",
|
|
5393
|
+
"--filter",
|
|
5394
|
+
"-f",
|
|
5395
|
+
"--exclude-from",
|
|
5396
|
+
"--include-from",
|
|
5397
|
+
"--files-from",
|
|
5398
|
+
"--chmod",
|
|
5399
|
+
"--chown",
|
|
5400
|
+
"--log-file",
|
|
5401
|
+
"--password-file",
|
|
5402
|
+
"--port",
|
|
5403
|
+
"--timeout",
|
|
5404
|
+
"--contimeout",
|
|
5405
|
+
"--bwlimit",
|
|
5406
|
+
"--max-size",
|
|
5407
|
+
"--min-size",
|
|
5408
|
+
"--max-delete",
|
|
5409
|
+
"--backup-dir",
|
|
5410
|
+
"--link-dest",
|
|
5411
|
+
"--compare-dest",
|
|
5412
|
+
"--copy-dest",
|
|
5413
|
+
"--partial-dir",
|
|
5414
|
+
"--temp-dir",
|
|
5415
|
+
"-T",
|
|
5416
|
+
"--suffix",
|
|
5417
|
+
"--out-format",
|
|
5418
|
+
"--iconv",
|
|
5419
|
+
"--usermap",
|
|
5420
|
+
"--groupmap",
|
|
5421
|
+
"-M",
|
|
5422
|
+
"--remote-option",
|
|
5423
|
+
"--info",
|
|
5424
|
+
"--debug",
|
|
5425
|
+
"--skip-compress",
|
|
5426
|
+
"--compress-level",
|
|
5427
|
+
"--block-size",
|
|
5428
|
+
"-B",
|
|
5429
|
+
"--modify-window",
|
|
5430
|
+
"--sockopts",
|
|
5431
|
+
"--outbuf",
|
|
5432
|
+
"--copy-as",
|
|
5433
|
+
"--stop-at",
|
|
5434
|
+
"--stop-after",
|
|
5435
|
+
"--time-limit",
|
|
5436
|
+
"--checksum-seed",
|
|
5437
|
+
"--max-alloc",
|
|
5438
|
+
"--early-input",
|
|
5439
|
+
"--address",
|
|
5440
|
+
"--write-batch",
|
|
5441
|
+
"--read-batch",
|
|
5442
|
+
"--only-write-batch"
|
|
5443
|
+
])]
|
|
5444
|
+
]);
|
|
5445
|
+
var SSHPASS = "sshpass";
|
|
5446
|
+
var SSHPASS_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set(["-p", "-f", "-d", "-P"]);
|
|
5447
|
+
var NAMES_ANOTHER_MACHINE = /^(?:(?:rsync|scp|sftp):\/\/|(?:[^\s/:@]+@)?[^\s/:@]+:)/i;
|
|
5448
|
+
var SHORT_OPTION_CLUSTER2 = /^-[A-Za-z]+$/;
|
|
5449
|
+
var clusterEndsWithAnOptionThatTakesAValue = (text3, withAValue) => {
|
|
5450
|
+
const letters = text3.slice(1);
|
|
5451
|
+
const firstWithAValue = [...letters].findIndex((letter) => withAValue.has(`-${letter}`));
|
|
5452
|
+
return firstWithAValue === letters.length - 1;
|
|
5453
|
+
};
|
|
5454
|
+
var optionTakesTheNextWord = (text3, withAValue) => withAValue.has(text3) || SHORT_OPTION_CLUSTER2.test(text3) && clusterEndsWithAnOptionThatTakesAValue(text3, withAValue);
|
|
5455
|
+
var operandsAfterOptions = (args, withAValue) => {
|
|
5456
|
+
const operands = [];
|
|
5457
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
5458
|
+
const text3 = args[index]?.text ?? "";
|
|
5459
|
+
if (text3 === END_OF_OPTIONS3) return [...operands, ...args.slice(index + 1)];
|
|
5460
|
+
if (!FLAG.test(text3)) operands.push(args[index]);
|
|
5461
|
+
else if (optionTakesTheNextWord(text3, withAValue)) index += 1;
|
|
5462
|
+
}
|
|
5463
|
+
return operands;
|
|
5196
5464
|
};
|
|
5197
|
-
var
|
|
5465
|
+
var optionWordsOf = (args, withAValue) => {
|
|
5466
|
+
const options = [];
|
|
5467
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
5468
|
+
const text3 = args[index]?.text ?? "";
|
|
5469
|
+
if (text3 === END_OF_OPTIONS3) break;
|
|
5470
|
+
if (!FLAG.test(text3)) continue;
|
|
5471
|
+
options.push(text3);
|
|
5472
|
+
if (optionTakesTheNextWord(text3, withAValue)) index += 1;
|
|
5473
|
+
}
|
|
5474
|
+
return options;
|
|
5475
|
+
};
|
|
5476
|
+
var withoutSshpass = (invocation) => {
|
|
5477
|
+
if (invocation.program === void 0 || basenameOf(invocation.program.text) !== SSHPASS) return invocation;
|
|
5478
|
+
const [program, ...args] = operandsAfterOptions(invocation.args, SSHPASS_OPTIONS_WITH_A_VALUE);
|
|
5479
|
+
const start = program === void 0 ? -1 : invocation.args.indexOf(program);
|
|
5480
|
+
return { program, args: start === -1 ? [] : invocation.args.slice(start + 1) };
|
|
5481
|
+
};
|
|
5482
|
+
var RSYNC = "rsync";
|
|
5483
|
+
var RSYNC_DRY_RUN = "--dry-run";
|
|
5484
|
+
var RSYNC_DRY_RUN_LETTER = "n";
|
|
5485
|
+
var RSYNC_REMOTE_SHELL_LETTER = "e";
|
|
5486
|
+
var RSYNC_NAMES_A_PROGRAM = /^--(?:rsh|rsync-path)(?:=|$)/;
|
|
5487
|
+
var clusterTurnsOn = (text3, letter, withAValue) => {
|
|
5488
|
+
if (!SHORT_OPTION_CLUSTER2.test(text3)) return false;
|
|
5489
|
+
for (const each of text3.slice(1)) {
|
|
5490
|
+
if (each === letter) return true;
|
|
5491
|
+
if (withAValue.has(`-${each}`)) return false;
|
|
5492
|
+
}
|
|
5493
|
+
return false;
|
|
5494
|
+
};
|
|
5495
|
+
var rsyncOnlyPreviews = (args, withAValue) => {
|
|
5496
|
+
const options = optionWordsOf(args, withAValue);
|
|
5497
|
+
return options.some((text3) => text3 === RSYNC_DRY_RUN || clusterTurnsOn(text3, RSYNC_DRY_RUN_LETTER, withAValue)) && !options.some((text3) => RSYNC_NAMES_A_PROGRAM.test(text3) || clusterTurnsOn(text3, RSYNC_REMOTE_SHELL_LETTER, withAValue));
|
|
5498
|
+
};
|
|
5499
|
+
var copiesOntoAnotherMachine = (invocation) => {
|
|
5500
|
+
const { program, args } = withoutSshpass(invocation);
|
|
5501
|
+
const name = program === void 0 ? void 0 : basenameOf(program.text);
|
|
5502
|
+
const withAValue = name === void 0 ? void 0 : REMOTE_COPY_OPTIONS_WITH_A_VALUE.get(name);
|
|
5503
|
+
if (withAValue === void 0 || name === RSYNC && rsyncOnlyPreviews(args, withAValue)) return false;
|
|
5504
|
+
const operands = operandsAfterOptions(args, withAValue);
|
|
5505
|
+
const destination = operands.at(-1);
|
|
5506
|
+
return operands.length > 1 && destination !== void 0 && NAMES_ANOTHER_MACHINE.test(destination.text);
|
|
5507
|
+
};
|
|
5508
|
+
var HOSTED_SECRET_WRITES = /* @__PURE__ */ new Map([
|
|
5509
|
+
["doppler", /(?:^| )secrets (?:set|delete|upload)(?: |$)/],
|
|
5510
|
+
["vercel", /(?:^| )env (?:add|rm|remove|update)(?: |$)/],
|
|
5511
|
+
["fly", /(?:^| )secrets (?:set|unset|import|deploy)(?: |$)/],
|
|
5512
|
+
["flyctl", /(?:^| )secrets (?:set|unset|import|deploy)(?: |$)/],
|
|
5513
|
+
["heroku", /(?:^| )config:(?:set|unset|add|remove)(?: |$)/],
|
|
5514
|
+
["netlify", /(?:^| )env:(?:set|unset|import|clone)(?: |$)/],
|
|
5515
|
+
["railway", /(?:^| )variables? (?:set|delete)(?: |$)/],
|
|
5516
|
+
["supabase", /(?:^| )secrets (?:set|unset)(?: |$)/],
|
|
5517
|
+
["wrangler", /(?:^| )secret (?:put|delete|bulk)(?: |$)/],
|
|
5518
|
+
["firebase", /(?:^| )functions:secrets:(?:set|destroy|prune)(?: |$)/],
|
|
5519
|
+
["gcloud", /(?:^| )secrets (?:create|delete|update|versions (?:add|destroy|disable|enable))(?: |$)/],
|
|
5520
|
+
["az", /(?:^| )keyvault secret (?:set|set-attributes|delete|purge|recover|restore)(?: |$)/]
|
|
5521
|
+
]);
|
|
5522
|
+
var RAILWAY_CLI = "railway";
|
|
5523
|
+
var RAILWAY_VARIABLES = /(?:^| )variables?(?: |$)/;
|
|
5524
|
+
var RAILWAY_SET_FLAG = /^(?:--set(?:=|$)|-s$)/;
|
|
5525
|
+
var PACKAGE_RUNNERS = /* @__PURE__ */ new Set(["npx", "bunx", "pnpx", "pnpm", "yarn", "npm", "bun"]);
|
|
5526
|
+
var CLI_OF_A_PACKAGE = /* @__PURE__ */ new Map([
|
|
5527
|
+
["netlify-cli", "netlify"],
|
|
5528
|
+
["firebase-tools", "firebase"],
|
|
5529
|
+
["@railway/cli", "railway"],
|
|
5530
|
+
["@doppler/cli", "doppler"]
|
|
5531
|
+
]);
|
|
5532
|
+
var PACKAGE_VERSION = /(?<=.)@[^/@]*$/;
|
|
5533
|
+
var cliNameOf = (program) => {
|
|
5534
|
+
const unversioned = program.text.replace(PACKAGE_VERSION, "");
|
|
5535
|
+
return CLI_OF_A_PACKAGE.get(unversioned) ?? basenameOf(unversioned);
|
|
5536
|
+
};
|
|
5537
|
+
var namesAHostingCli = (word) => {
|
|
5538
|
+
const name = cliNameOf(word);
|
|
5539
|
+
return HOSTED_SECRET_WRITES.has(name) || name === RAILWAY_CLI;
|
|
5540
|
+
};
|
|
5541
|
+
var withoutAPackageRunner = (invocation) => {
|
|
5542
|
+
const { program, args } = invocation;
|
|
5543
|
+
if (program === void 0 || !PACKAGE_RUNNERS.has(basenameOf(program.text))) return invocation;
|
|
5544
|
+
const start = args.findIndex((arg) => !FLAG.test(arg.text) && namesAHostingCli(arg));
|
|
5545
|
+
return start === -1 ? invocation : { program: args[start], args: args.slice(start + 1) };
|
|
5546
|
+
};
|
|
5547
|
+
var writesAHostedSecret = (invocation) => {
|
|
5548
|
+
const { program, args } = withoutAPackageRunner(invocation);
|
|
5549
|
+
if (program === void 0) return false;
|
|
5550
|
+
const name = cliNameOf(program);
|
|
5551
|
+
const words = args.filter((arg) => !FLAG.test(arg.text)).map((arg) => arg.text.toLowerCase()).join(" ");
|
|
5552
|
+
return (HOSTED_SECRET_WRITES.get(name)?.test(words) ?? false) || name === RAILWAY_CLI && RAILWAY_VARIABLES.test(words) && args.some((arg) => RAILWAY_SET_FLAG.test(arg.text));
|
|
5553
|
+
};
|
|
5554
|
+
var NPM_REGISTRY_CHANGE = /^(?:(?:owner|author) (?:add|rm|remove)|dist-tags? (?:add|rm|remove|set)|deprecate|access (?:grant|revoke|public|restricted|set|edit|2fa-required|2fa-not-required)|team (?:create|destroy|add|rm))(?: |$)/;
|
|
5555
|
+
var YARN_REGISTRY_CHANGE = /^(?:npm )?(?:owner (?:add|remove)|tag (?:add|remove))(?: |$)/;
|
|
5556
|
+
var REGISTRY_CHANGE_BY_PACKAGE_MANAGER = /* @__PURE__ */ new Map([
|
|
5557
|
+
["npm", NPM_REGISTRY_CHANGE],
|
|
5558
|
+
["pnpm", NPM_REGISTRY_CHANGE],
|
|
5559
|
+
["yarn", YARN_REGISTRY_CHANGE]
|
|
5560
|
+
]);
|
|
5561
|
+
var PACKAGE_MANAGER_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Map([
|
|
5562
|
+
["npm", /* @__PURE__ */ new Set(["-w", "--workspace", "--prefix", "-C", "--registry", "--userconfig", "--globalconfig", "--cache", "--loglevel", "--otp", "--scope"])],
|
|
5563
|
+
["pnpm", /* @__PURE__ */ new Set(["-F", "--filter", "-C", "--dir", "--registry", "--loglevel", "--otp", "--config-dir"])],
|
|
5564
|
+
["yarn", /* @__PURE__ */ new Set(["--cwd"])]
|
|
5565
|
+
]);
|
|
5566
|
+
var PACKAGE_MANAGER_RUNS_A_PACKAGE = /* @__PURE__ */ new Set(["exec", "x", "dlx"]);
|
|
5567
|
+
var NO_OPTIONS_WITH_A_VALUE = /* @__PURE__ */ new Set();
|
|
5568
|
+
var YARN = "yarn";
|
|
5569
|
+
var YARN_WORKSPACE = "workspace";
|
|
5570
|
+
var COREPACK = "corepack";
|
|
5571
|
+
var REGISTRY_COMMAND_WORDS = 3;
|
|
5572
|
+
var REGISTRY_COMMAND_SPAN = 8;
|
|
5573
|
+
var OPTIONS_BEFORE_A_REGISTRY_COMMAND = 16;
|
|
5574
|
+
var MAX_PACKAGE_RUNNER_DEPTH = 2;
|
|
5575
|
+
var MAX_COMMAND_WORD_LENGTH = 214;
|
|
5576
|
+
var WORD_TOO_LONG_TO_BE_A_COMMAND = "-";
|
|
5577
|
+
var optionTakesItsValueAlong = (option) => option.includes("=");
|
|
5578
|
+
var commandStartsAfterOptions = (args, from, optionsWithAValue) => {
|
|
5579
|
+
const end = Math.min(args.length, from + OPTIONS_BEFORE_A_REGISTRY_COMMAND);
|
|
5580
|
+
const starts = /* @__PURE__ */ new Set();
|
|
5581
|
+
const visited = /* @__PURE__ */ new Set();
|
|
5582
|
+
const pending = [from];
|
|
5583
|
+
for (let index = pending.pop(); index !== void 0; index = pending.pop()) {
|
|
5584
|
+
if (visited.has(index) || index >= end) continue;
|
|
5585
|
+
visited.add(index);
|
|
5586
|
+
const option = args[index]?.text ?? "";
|
|
5587
|
+
if (!FLAG.test(option)) starts.add(index);
|
|
5588
|
+
else if (optionTakesItsValueAlong(option)) pending.push(index + 1);
|
|
5589
|
+
else if (optionsWithAValue.has(option)) pending.push(index + 2);
|
|
5590
|
+
else if (FLAG.test(args[index + 1]?.text ?? "")) pending.push(index + 1);
|
|
5591
|
+
else pending.push(index + 1, index + 2);
|
|
5592
|
+
}
|
|
5593
|
+
return [...starts];
|
|
5594
|
+
};
|
|
5595
|
+
var commandWordText = (text3) => text3.length > MAX_COMMAND_WORD_LENGTH ? WORD_TOO_LONG_TO_BE_A_COMMAND : text3.toLowerCase();
|
|
5596
|
+
var commandWordsFrom = (args, start, optionsWithAValue) => {
|
|
5597
|
+
const words = [];
|
|
5598
|
+
const end = Math.min(args.length, start + REGISTRY_COMMAND_SPAN);
|
|
5599
|
+
for (let index = start; index < end && words.length < REGISTRY_COMMAND_WORDS; index++) {
|
|
5600
|
+
const text3 = args[index]?.text ?? "";
|
|
5601
|
+
if (!FLAG.test(text3)) words.push(commandWordText(text3));
|
|
5602
|
+
else if (optionsWithAValue.has(text3)) index++;
|
|
5603
|
+
}
|
|
5604
|
+
return words;
|
|
5605
|
+
};
|
|
5606
|
+
var packageManagerNameOf = (word) => {
|
|
5607
|
+
if (word.text.length > MAX_COMMAND_WORD_LENGTH) return void 0;
|
|
5608
|
+
const name = cliNameOf(word);
|
|
5609
|
+
return REGISTRY_CHANGE_BY_PACKAGE_MANAGER.has(name) || name === COREPACK ? name : void 0;
|
|
5610
|
+
};
|
|
5611
|
+
var packageManagerRunFrom = (args, from) => {
|
|
5612
|
+
const end = Math.min(args.length, from + REGISTRY_COMMAND_SPAN);
|
|
5613
|
+
for (let index = from; index < end; index++) {
|
|
5614
|
+
const word = args[index];
|
|
5615
|
+
const name = word === void 0 ? void 0 : packageManagerNameOf(word);
|
|
5616
|
+
if (name !== void 0) return { name, args: index + 1 };
|
|
5617
|
+
}
|
|
5618
|
+
return null;
|
|
5619
|
+
};
|
|
5620
|
+
var runChangesAPublishedPackage = (args, from, depth) => {
|
|
5621
|
+
const inner = depth > MAX_PACKAGE_RUNNER_DEPTH ? null : packageManagerRunFrom(args, from);
|
|
5622
|
+
return inner !== null && packageManagerChangesAPublishedPackage(inner.name, args, inner.args, depth);
|
|
5623
|
+
};
|
|
5624
|
+
var packageManagerChangesAPublishedPackage = (name, args, from, depth) => {
|
|
5625
|
+
if (name === COREPACK) return runChangesAPublishedPackage(args, from, depth + 1);
|
|
5626
|
+
const registryChange = REGISTRY_CHANGE_BY_PACKAGE_MANAGER.get(name);
|
|
5627
|
+
if (registryChange === void 0) return false;
|
|
5628
|
+
const options = PACKAGE_MANAGER_OPTIONS_WITH_A_VALUE.get(name) ?? NO_OPTIONS_WITH_A_VALUE;
|
|
5629
|
+
return commandStartsAfterOptions(args, from, options).some((start) => {
|
|
5630
|
+
const words = commandWordsFrom(args, start, options);
|
|
5631
|
+
const [first] = words;
|
|
5632
|
+
if (first !== void 0 && PACKAGE_MANAGER_RUNS_A_PACKAGE.has(first)) return runChangesAPublishedPackage(args, start + 1, depth + 1);
|
|
5633
|
+
if (name === YARN && first === YARN_WORKSPACE) return registryChange.test(commandWordsFrom(args, start + 2, options).join(" "));
|
|
5634
|
+
return registryChange.test(words.join(" "));
|
|
5635
|
+
});
|
|
5636
|
+
};
|
|
5637
|
+
var changesAPublishedPackage = ({ program, args }) => {
|
|
5638
|
+
const name = program === void 0 ? void 0 : packageManagerNameOf(program);
|
|
5639
|
+
return name !== void 0 && packageManagerChangesAPublishedPackage(name, args, 0, 0);
|
|
5640
|
+
};
|
|
5641
|
+
var changesSomethingHostedElsewhere = (invocation) => githubCommandHasAConsequence(invocation) || writesThroughAServiceApi(invocation) || writesAHostedSecret(invocation) || sendsDataOffThisMachine(invocation) || copiesOntoAnotherMachine(invocation) || kubectlExecRunsMoreThanAReadOnlyCommand(invocation) || sshRunsMoreThanAReadOnlyCommand(invocation);
|
|
5198
5642
|
var segmentWritesThroughARemoteApi = (segment, depth) => {
|
|
5199
5643
|
const innermost = innermostInvocation(segment.invocation);
|
|
5200
5644
|
return invocationWritesThroughARemoteApi(innermost) || commandsNestedIn(innermost, inlineScriptsOf(innermost, segment.heredocs)).some((nested) => commandWritesThroughARemoteApiAt(nested, depth + 1));
|
|
@@ -5494,14 +5938,34 @@ var honoursPreviewFlags = ({ program, args }) => {
|
|
|
5494
5938
|
var onlyPreviews = (invocation) => invocation.program !== void 0 && honoursPreviewFlags(invocation) && invocation.args.some((arg) => !arg.expands && PREVIEW_FLAG.test(arg.text));
|
|
5495
5939
|
var changesWhatIsDeployed = (toolName, invocation, normalized) => !onlyPreviews(invocation) && (changesProduction(invocation) || mergesAPullRequest(invocation) || isCoveredByPolicy(DEPLOY_AND_SCHEMA_COMMAND_PATTERNS, toolName, normalized));
|
|
5496
5940
|
var releasesOrChangesACluster = (toolName, invocation, normalized) => !onlyPreviews(invocation) && (pushesATag(invocation) || publishesAnAppBuild(invocation) || RELEASE_AND_CLUSTER_PROGRAMS.has(basenameOf(invocation.program?.text ?? "")) && isCoveredByPolicy(RELEASE_AND_CLUSTER_COMMAND_PATTERNS, toolName, normalized));
|
|
5497
|
-
var
|
|
5498
|
-
var
|
|
5941
|
+
var MAIL_TRANSFER_PROGRAMS = /* @__PURE__ */ new Set(["sendmail", "msmtp", "ssmtp"]);
|
|
5942
|
+
var MAIL_CLIENTS = /* @__PURE__ */ new Set(["mail", "mailx", "mutt", "s-nail", "nail"]);
|
|
5943
|
+
var MAIL_TRANSFER_MODE_THAT_ONLY_READS = /^(?:-b[ptv]|--help|--version|-V|--serverinfo|--pretend)$/;
|
|
5944
|
+
var EMAIL_ADDRESS = /^[^\s@]+@[^\s@]+$/;
|
|
5945
|
+
var ADDRESS_SEPARATOR = /[\s<>,;"'()]+/;
|
|
5946
|
+
var namesAnEmailAddress = (word) => word.text.includes("@") && word.text.split(ADDRESS_SEPARATOR).some((part) => EMAIL_ADDRESS.test(part));
|
|
5947
|
+
var sendsMail = ({ program, args }) => {
|
|
5948
|
+
if (program === void 0) return false;
|
|
5949
|
+
const name = basenameOf(program.text);
|
|
5950
|
+
if (MAIL_TRANSFER_PROGRAMS.has(name)) return !args.some((arg) => MAIL_TRANSFER_MODE_THAT_ONLY_READS.test(arg.text));
|
|
5951
|
+
return MAIL_CLIENTS.has(name) && args.some(namesAnEmailAddress);
|
|
5952
|
+
};
|
|
5953
|
+
var PROGRAMS_THAT_STOP_THE_MACHINE = /* @__PURE__ */ new Set(["shutdown", "reboot", "halt", "poweroff"]);
|
|
5954
|
+
var ONLY_DESCRIBES_ITSELF = /^--(?:help|version)$/;
|
|
5955
|
+
var SHUTDOWN = "shutdown";
|
|
5956
|
+
var CANCELS_A_SHUTDOWN = "-c";
|
|
5957
|
+
var stopsTheMachine = ({ program, args }) => {
|
|
5958
|
+
const name = program === void 0 ? void 0 : basenameOf(program.text);
|
|
5959
|
+
return name !== void 0 && PROGRAMS_THAT_STOP_THE_MACHINE.has(name) && !args.some((arg) => ONLY_DESCRIBES_ITSELF.test(arg.text)) && !(name === SHUTDOWN && args.some((arg) => arg.text === CANCELS_A_SHUTDOWN));
|
|
5960
|
+
};
|
|
5961
|
+
var invocationHasAConsequenceOnlyPermissionsOffAsksAbout = (toolName, invocation, normalized, reading) => releasesOrChangesACluster(toolName, invocation, normalized) || reading === "as_written" && changesAPublishedPackage(invocation) || mergesAPullRequestByAnyPath(invocation) || writesAFileThatNeedsAPerson(invocation) || changesWhereGitLooksForHooks(invocation) || setsAGitSettingThatRunsAProgram(invocation) || changesWhereGitSends(invocation) || changesSomethingHostedElsewhere(invocation) || sendsMail(invocation) || stopsTheMachine(invocation);
|
|
5962
|
+
var invocationHasAVisibleConsequence = (toolName, invocation, depth, line, reading = "as_written") => {
|
|
5499
5963
|
if (depth > MAX_CONSEQUENCE_DEPTH) return true;
|
|
5500
5964
|
if (invocation.program === void 0) return false;
|
|
5501
5965
|
const normalized = quotedInvocation(invocation);
|
|
5502
5966
|
const innermost = innermostInvocation(invocation);
|
|
5503
5967
|
const script = shellScriptOf(invocation);
|
|
5504
|
-
return classifyDecisionRisk(toolName, normalized) === "destructive" || changesWhatIsDeployed(toolName, invocation, normalized) || writesASecretFile(invocation) || line === "permissions_off" && invocationHasAConsequenceOnlyPermissionsOffAsksAbout(toolName, invocation, normalized) || losesDataVisibly(toolName, invocation, normalized, depth, line) || subcommandDestroysVisibly(invocation) || sqlClientChangesData(invocation) || innermost !== invocation && invocationHasAVisibleConsequence(toolName, innermost, depth, line) || script === null && passesAnInlineScript(invocation) || script !== null && commandHasAVisibleConsequenceAt(toolName, script, depth + 1, line) || readingsPastGlobalFlags(invocation).some((
|
|
5968
|
+
return classifyDecisionRisk(toolName, normalized) === "destructive" || changesWhatIsDeployed(toolName, invocation, normalized) || writesASecretFile(invocation) || line === "permissions_off" && invocationHasAConsequenceOnlyPermissionsOffAsksAbout(toolName, invocation, normalized, reading) || losesDataVisibly(toolName, invocation, normalized, depth, line) || subcommandDestroysVisibly(invocation) || sqlClientChangesData(invocation) || innermost !== invocation && invocationHasAVisibleConsequence(toolName, innermost, depth, line) || script === null && passesAnInlineScript(invocation) || script !== null && commandHasAVisibleConsequenceAt(toolName, script, depth + 1, line) || readingsPastGlobalFlags(invocation).some((pastFlags) => invocationHasAVisibleConsequence(toolName, pastFlags, depth + 1, line, "past_global_flags"));
|
|
5505
5969
|
};
|
|
5506
5970
|
var RUNS_FETCHED_CODE = /(?:\$\(|`|<\()\s*(?:curl|wget)\b/;
|
|
5507
5971
|
var RUNS_DECODED_CODE = /(?:^|[;&|(\s])(?:bash|sh|zsh|source|\.|python3?|node|ruby|perl)\s+(?:-[A-Za-z]+\s+)*["']?(?:<\(|\$\()[^)]*\b(?:base64|xxd|openssl)\b/;
|
|
@@ -5776,6 +6240,8 @@ var redirectsIntoAFileThatNeedsAPerson = (command) => {
|
|
|
5776
6240
|
});
|
|
5777
6241
|
};
|
|
5778
6242
|
var posixCommandOf = (words) => words.map(asOneShellWord).join(" ");
|
|
6243
|
+
var webRequestSendsDataOffThisMachine = ({ sendsData, addresses }) => sendsData && !(addresses.length > 0 && addresses.every((address) => THIS_MACHINE_ADDRESS.test(address)));
|
|
6244
|
+
var noWebRequestNeedsAPerson = () => false;
|
|
5779
6245
|
var namesASecretPowerShellPath = (path) => SECRET_FILE_NAME.test(fileNameOf(path));
|
|
5780
6246
|
var posixShellJudgeFor = (toolName, line = "standing_allow") => ({
|
|
5781
6247
|
namesADestructiveAction: (text3) => classifyDecisionRisk(toolName, text3) === "destructive",
|
|
@@ -5785,7 +6251,8 @@ var posixShellJudgeFor = (toolName, line = "standing_allow") => ({
|
|
|
5785
6251
|
fetches,
|
|
5786
6252
|
runsWhatItReads,
|
|
5787
6253
|
runsScripts,
|
|
5788
|
-
namesAFileThatNeedsAPerson: line === "permissions_off" ? pathNeedsAPersonToChange : namesASecretPowerShellPath
|
|
6254
|
+
namesAFileThatNeedsAPerson: line === "permissions_off" ? pathNeedsAPersonToChange : namesASecretPowerShellPath,
|
|
6255
|
+
webRequestNeedsAPerson: line === "permissions_off" ? webRequestSendsDataOffThisMachine : noWebRequestNeedsAPerson
|
|
5789
6256
|
});
|
|
5790
6257
|
var commandIsDestructive = (toolName, command) => shellDialectOf(toolName) === "powershell" ? powerShellCommandIsDestructive(command, posixShellJudgeFor(toolName)) : readingsThatCanAct(command).some((reading) => classifyDecisionRisk(toolNameForAPosixReading(toolName), reading) === "destructive");
|
|
5791
6258
|
var commandHasAConsequenceOnTheLine = (toolName, command, line) => shellDialectOf(toolName) === "powershell" ? powerShellCommandHasAVisibleConsequence(command, posixShellJudgeFor(toolName, line)) : commandHasAVisibleConsequenceAt(toolNameForAPosixReading(toolName), command, 0, line);
|
|
@@ -7179,6 +7646,7 @@ var bypassModeCoversEveryInput = (input) => input.deletesFiles !== true && input
|
|
|
7179
7646
|
var bypassModeApplies = (input) => isBypassPermissionMode(input.permissionMode) && !isModeStateDegraded(input.modeState) && noModeOverrideIsActive(input) && input.toolInputs.length > 0;
|
|
7180
7647
|
var bypassModeAllows = (input) => bypassModeApplies(input) && (bypassStopsOf(input.config) === "nothing" ? !aChosenRuleGovernsInEitherRepository(input, ruleAsksOrRefuses) : bypassModeCoversEveryInput(input));
|
|
7181
7648
|
var PERMISSIONS_OFF_ASK_REASON = "Permissions are off in your agent, so Pushary only stops for risky steps like this one. You can change this in Settings on pushary.com.";
|
|
7649
|
+
var permissionsOffLineAppliesTo = (agentType) => agentType === CLAUDE_CODE_AGENT_TYPE;
|
|
7182
7650
|
var permissionsOffAskReason = (input, verdict) => verdict.kind === "gate" && !verdict.scopeReason && !isAskedInEveryMode(input.toolName) && bypassModeApplies(input) && bypassStopsOf(input.config) === "consequences" && !aChosenRuleGovernsInEitherRepository(input) ? PERMISSIONS_OFF_ASK_REASON : void 0;
|
|
7183
7651
|
var resolveGate = (input) => {
|
|
7184
7652
|
const { modeState, config, toolName, toolInputs, cwd, sessionId } = input;
|
|
@@ -7536,6 +8004,7 @@ var PLAN_DECLINED_REASON = "Plan declined from the phone. Ask what to change bef
|
|
|
7536
8004
|
var claudeStoppedPreToolUseOutput = (reason) => stoppedOutput(claudePreToolUseOutput("deny", reason), reason);
|
|
7537
8005
|
var claudeStoppedPermissionRequestOutput = (reason) => stoppedOutput(claudePermissionRequestOutput("deny", reason), reason);
|
|
7538
8006
|
var UNANSWERED_ASKS_BEFORE_PAUSE = 3;
|
|
8007
|
+
var CLAUDE_CODE_AGENT_TYPE = "claude_code";
|
|
7539
8008
|
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.`;
|
|
7540
8009
|
var unansweredRefusalReason = (paused) => paused ? SESSION_PAUSED_REASON : NO_RESPONSE_REASON;
|
|
7541
8010
|
var UNHEARD_PUSH_WINDOW_DAYS = 14;
|
|
@@ -7883,6 +8352,7 @@ export {
|
|
|
7883
8352
|
PRETOOLUSE_HANDLED_TOOLS,
|
|
7884
8353
|
isPermissionRequestOwnedByPreToolUse,
|
|
7885
8354
|
CLAUDE_PRETOOLUSE_MATCHER,
|
|
8355
|
+
permissionsOffLineAppliesTo,
|
|
7886
8356
|
permissionsOffAskReason,
|
|
7887
8357
|
resolveGate,
|
|
7888
8358
|
editGoesToTheAgentsPrompt,
|