pushary 1.9.143 → 1.9.144

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/data/SKILL.md +4 -2
  3. package/data/cursor-plugin/skills/pushary/SKILL.md +3 -1
  4. package/data/vscode-plugin/skills/pushary/SKILL.md +3 -1
  5. package/dist/{api-2YC2KSIM.js → api-ZV7TT25P.js} +7 -7
  6. package/dist/bin/pushary-bell-hook.js +15 -15
  7. package/dist/bin/pushary-bell.js +3 -3
  8. package/dist/bin/pushary-claude.js +14 -14
  9. package/dist/bin/pushary-clean.js +24 -24
  10. package/dist/bin/pushary-codex-bridge.js +11 -11
  11. package/dist/bin/pushary-codex-hook.js +21 -21
  12. package/dist/bin/pushary-codex-session.js +6 -6
  13. package/dist/bin/pushary-codex.js +8 -8
  14. package/dist/bin/pushary-connect.js +17 -17
  15. package/dist/bin/pushary-daemon.js +29 -29
  16. package/dist/bin/pushary-disconnect.js +17 -17
  17. package/dist/bin/pushary-doctor.js +28 -28
  18. package/dist/bin/pushary-elicitation-hook.js +16 -16
  19. package/dist/bin/pushary-gemini-bridge.js +6 -6
  20. package/dist/bin/pushary-gemini-hook.js +19 -19
  21. package/dist/bin/pushary-hook.js +21 -21
  22. package/dist/bin/pushary-login.js +11 -11
  23. package/dist/bin/pushary-logout.js +15 -15
  24. package/dist/bin/pushary-mcp.js +8 -8
  25. package/dist/bin/pushary-mode.js +7 -7
  26. package/dist/bin/pushary-notification-hook.js +15 -15
  27. package/dist/bin/pushary-opencode-hook.js +18 -18
  28. package/dist/bin/pushary-permission-denied-hook.js +21 -21
  29. package/dist/bin/pushary-permission-hook.js +21 -21
  30. package/dist/bin/pushary-post-hook.js +16 -16
  31. package/dist/bin/pushary-prompt-hook.js +15 -15
  32. package/dist/bin/pushary-session-end-hook.js +15 -15
  33. package/dist/bin/pushary-session-start-hook.js +24 -24
  34. package/dist/bin/pushary-setup.js +38 -37
  35. package/dist/bin/pushary-status.js +20 -20
  36. package/dist/bin/pushary-stop-hook.js +15 -15
  37. package/dist/bin/pushary-stopfailure-hook.js +15 -15
  38. package/dist/bin/pushary-suggestions.js +7 -7
  39. package/dist/bin/pushary-transcript-register.js +7 -7
  40. package/dist/bin/pushary-transcripts.js +14 -14
  41. package/dist/bin/pushary-upgrade.js +30 -30
  42. package/dist/bin/pushary-wait.js +7 -7
  43. package/dist/bin/pushary.js +4 -4
  44. package/dist/{chunk-4YH326C5.js → chunk-23CGCD5L.js} +2 -2
  45. package/dist/{chunk-KRSZFHNS.js → chunk-3KRGT5AZ.js} +2 -2
  46. package/dist/{chunk-FS47XZCE.js → chunk-44BLJJPH.js} +1 -1
  47. package/dist/{chunk-MQF6MQMR.js → chunk-44WPMZGQ.js} +4 -4
  48. package/dist/{chunk-MOYEHNFP.js → chunk-4524ZR2U.js} +1 -1
  49. package/dist/{chunk-NZHRH4RR.js → chunk-56HFENZK.js} +4 -4
  50. package/dist/{chunk-NQF652IG.js → chunk-5AXDNDUJ.js} +1 -1
  51. package/dist/{chunk-4Z7YVVKQ.js → chunk-5BTAIFVV.js} +1 -1
  52. package/dist/{chunk-QFZNPZRO.js → chunk-5I3UQEAX.js} +3 -3
  53. package/dist/{chunk-HLWS6ADK.js → chunk-6LALK6GI.js} +2 -2
  54. package/dist/{chunk-CNURORKI.js → chunk-74QCFZKV.js} +3 -3
  55. package/dist/{chunk-R27HXRSK.js → chunk-AGUL2JDK.js} +2 -2
  56. package/dist/{chunk-44Z6MQZ2.js → chunk-AJQ4TTPJ.js} +2 -2
  57. package/dist/{chunk-UIZE4YMU.js → chunk-BE5LO5VW.js} +1 -1
  58. package/dist/{chunk-EGUT2MWV.js → chunk-BHNX7XNO.js} +1 -1
  59. package/dist/{chunk-G3G7DWR3.js → chunk-C6SKS6IU.js} +9 -9
  60. package/dist/{chunk-KP6FVUCC.js → chunk-CV4EIXPV.js} +2 -2
  61. package/dist/{chunk-DU4KCXC2.js → chunk-CWWO3JTD.js} +1 -1
  62. package/dist/{chunk-USNGPJXF.js → chunk-CZOMD2IW.js} +3 -3
  63. package/dist/{chunk-DZLLKJJT.js → chunk-E32SRYTE.js} +1 -1
  64. package/dist/{chunk-V7CS72Q5.js → chunk-EC7VHNHE.js} +3 -3
  65. package/dist/{chunk-K7MVCPH5.js → chunk-EOKUIOMT.js} +2 -2
  66. package/dist/{chunk-QGJK3NAR.js → chunk-EY5CVFDL.js} +5 -5
  67. package/dist/{chunk-MH5BRZOQ.js → chunk-F37YD4YE.js} +1 -1
  68. package/dist/{chunk-WSKBXADV.js → chunk-FC2ENROR.js} +2 -2
  69. package/dist/{chunk-LWQLM3AO.js → chunk-GV3FDGQH.js} +1 -1
  70. package/dist/{chunk-FYB6HBHQ.js → chunk-HGIW56MU.js} +2 -2
  71. package/dist/{chunk-G7G2ZPT4.js → chunk-HNFYZPNJ.js} +3 -3
  72. package/dist/{chunk-SMF4TBPU.js → chunk-JK7DTAQH.js} +3 -3
  73. package/dist/{chunk-3VOUWGFF.js → chunk-KEBI7NYU.js} +2 -2
  74. package/dist/{chunk-SYZF5SDG.js → chunk-LVOHE66T.js} +3 -3
  75. package/dist/{chunk-XWYCFODT.js → chunk-MCI6KYN7.js} +1 -1
  76. package/dist/{chunk-PYSDCPZ3.js → chunk-OZG6CGYW.js} +5 -5
  77. package/dist/{chunk-LTPKSJWY.js → chunk-PYT4WXXR.js} +3 -3
  78. package/dist/{chunk-IG7NGXBS.js → chunk-RPXSGCRG.js} +2 -1
  79. package/dist/{chunk-6JLANX5L.js → chunk-S7WVJ6AR.js} +3 -3
  80. package/dist/{chunk-UJETZZG5.js → chunk-UK5DKLZY.js} +7 -7
  81. package/dist/{chunk-ZF4CPOO7.js → chunk-VP4T5352.js} +3 -3
  82. package/dist/{chunk-MMS7R3VO.js → chunk-WC25Z4XS.js} +2 -2
  83. package/dist/{chunk-5RSM5DRT.js → chunk-WGOTBZ23.js} +3 -3
  84. package/dist/{chunk-V53QYJNY.js → chunk-WGT5LCIB.js} +2 -2
  85. package/dist/{chunk-MLOYBLO4.js → chunk-WTBFPSTR.js} +3 -3
  86. package/dist/{chunk-QQHUUPPW.js → chunk-WTULK73V.js} +2 -2
  87. package/dist/{chunk-42DRRA6N.js → chunk-WWCM6UL7.js} +1 -1
  88. package/dist/{chunk-NOTW7GOC.js → chunk-XLMJEEW3.js} +1 -1
  89. package/dist/{chunk-ZDOTNMGL.js → chunk-YD376BLV.js} +9 -7
  90. package/dist/{chunk-4OX4SJGA.js → chunk-YESBU4VQ.js} +1 -1
  91. package/dist/{chunk-TKFNIDZK.js → chunk-YFK3MJGZ.js} +1 -1
  92. package/dist/{chunk-3WZMIDGX.js → chunk-YY5YVMBA.js} +3 -3
  93. package/dist/{chunk-DOXH5BV4.js → chunk-Z2WQD2W6.js} +3 -3
  94. package/dist/{chunk-X2MC2CF3.js → chunk-ZGYGKKXF.js} +10 -10
  95. package/dist/{codex-app-cards-switch-EGUHSLTG.js → codex-app-cards-switch-5PWB62W3.js} +6 -6
  96. package/dist/{codex-desktop-launch-6UN5CWCX.js → codex-desktop-launch-BCPUKOCV.js} +1 -1
  97. package/dist/{codex-session-launch-7R3HNIDJ.js → codex-session-launch-4ZUBROFZ.js} +11 -11
  98. package/dist/{global-upgrade-CCVIYELF.js → global-upgrade-4IKWJHLE.js} +7 -7
  99. package/dist/{identity-7QA3EDOM.js → identity-I2VWLZAQ.js} +3 -3
  100. package/dist/{live-capabilities-SDMX6CPZ.js → live-capabilities-4CLCROSP.js} +3 -3
  101. package/dist/{paths-ZC6XY73Q.js → paths-YMHQKLFX.js} +2 -2
  102. package/dist/{reapply-W6AIK5PH.js → reapply-FBQ7VR6L.js} +19 -19
  103. package/dist/src/index.js +21 -21
  104. package/dist/{upgrade-lock-BRVUBSLD.js → upgrade-lock-7ONNXM6V.js} +3 -3
  105. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.144
4
+
5
+ - The Pushary instructions this CLI writes into AGENTS.md and GEMINI.md, and the Pushary skill it installs (0.13.3), say what to do when you ask an agent to call, phone or ring you if it gets stuck: ask with `ask_user`. Pushary may phone you only when the `ask_user` reply includes `phoneCall`; without it no call is planned, and the agent is told not to promise one. While the reply is pending and has no `handoffAction`, the agent keeps waiting with `wait_for_answer`; with one, it follows the handoff.
6
+ - The skill's description is cut to 1015 characters, inside the 1024 that Agent Skills and Codex read. It no longer names "keep working while I am in a meeting" or the Claude Max line.
7
+ - fx: the instructions setup writes into `~/.fx/AGENTS.md` say how to load a Pushary tool both in an fx with the `toolbox` tool, which replaces `mcp_select_tool` in fx after 0.0.16, and in an older fx. Setup and `pushary upgrade` say fx picks up the change automatically and to restart it if Pushary's tools do not appear, since fx 0.0.15 removed `/mcp reload`.
8
+
3
9
  ## 1.9.143
4
10
 
5
11
  - A hook waiting on your answer no longer cancels the question when one poll fails. A network blip, a dropped connection, a server error or a rate limit while the hook waits for `wait_for_answer` used to withdraw the question at once, so a phone call or a late tap had nothing left to answer. The hook now keeps polling with growing pauses (2, 4, 8, then 15 seconds) until its own deadline. A failure that will not pass, such as a refused request, a tool error or a reply the hook cannot read, still withdraws the question right away. The `pushary claude` wrapper waits the same way, and a session cancelled during a pause stops at once.
package/data/SKILL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: pushary
3
- version: 0.13.2
4
- description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a person who may not be at the terminal, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill's workflow says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says things like keep going and ping me on my phone if you need anything, notify me when my agent needs me, approve from my phone, ask me questions while I am away from the terminal, run this overnight, keep working while I am in a meeting, I am stepping away, or do not wait for me, or wants a long task to run unattended. Ask yes/no, multiple choice or free-text questions on their phone and get the answer back, and send an update when a task finishes or fails. Use these tools proactively, without waiting to be asked. Every question and answer is recorded, so an unattended run stays reviewable afterwards. Works with Claude Code, Codex, Cursor, VS Code, Gemini CLI, Windsurf, Hermes, Lovable, or any MCP client; no Claude Max subscription required. Pushary is a hosted, paid service; web and native store checkout have different price and trial terms.
3
+ version: 0.13.3
4
+ description: Push notifications and human-in-the-loop for AI agents. Use it whenever a running agent needs a person who may not be at the terminal, such as before an irreversible or destructive action, spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, on a genuine ambiguity while unattended, when another skill says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says keep going and ping me on my phone if you need anything, call me if you get stuck, notify me when my agent needs me, approve from my phone, ask me while I am away, run this overnight, I am stepping away, or do not wait for me. Ask yes/no, choice or free-text questions on their phone and send updates. Use these tools proactively. Works with Claude Code, Codex, Cursor, VS Code, Gemini CLI, Windsurf, Hermes, Lovable or any MCP client. Pushary is a hosted, paid service; web and native store checkout have different price and trial terms.
5
5
  metadata:
6
6
  hermes:
7
7
  tags: [notifications, push, human-in-the-loop, alerts, permissions, mcp]
@@ -215,6 +215,8 @@ Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 know
215
215
 
216
216
  **Answers.** `value` is "yes" or "no" for confirm, the chosen option for select, and the typed text for input. Read `note` too: a denial with a note carries the reason or a condition. A select or input value containing "yes" is answer data, not approval of a separate action.
217
217
 
218
+ **Phone calls.** When the user says "call me", "phone me" or "ring me if you get stuck", ask with `ask_user`; there is no separate call tool. Pushary may phone only when the reply includes `phoneCall`; without it no call is planned, so do not promise one. With it, Pushary phones the person who can answer if the question is still unanswered, and records what they say as the answer: an approval, a choice or free text. For a call to the user, `ringsAt` says when it rings, and `waiting_for_calling_hours` means it rings when their calling hours start. While the reply is pending and has no `handoffAction`, keep waiting with `wait_for_answer` and the same `correlationId`: the spoken answer arrives there like any other. Do not cancel the question, ask it again or give up because a call is coming.
219
+
218
220
  ```json
219
221
  { "question": "Delete the 3 unused migration files in db/migrate/?", "type": "confirm", "context": "Cleaning up old migrations before the schema change", "toolName": "Bash", "toolTarget": "rm", "actionBody": "rm db/migrate/0003_*.sql", "agentName": "Claude Code - myproject" }
220
222
  { "question": "Which auth strategy for the new API?", "type": "select", "options": ["JWT tokens", "Session cookies", "OAuth2 + PKCE"], "context": "Setting up auth for the new endpoints", "agentName": "Claude Code - api-server" }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a person who may not be at the terminal, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill's workflow says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says things like keep going and ping me on my phone if you need anything, notify me when my agent needs me, approve from my phone, ask me questions while I am away from the terminal, run this overnight, keep working while I am in a meeting, I am stepping away, or do not wait for me, or wants a long task to run unattended. Ask yes/no, multiple choice or free-text questions on their phone and get the answer back, and send an update when a task finishes or fails. Use these tools proactively, without waiting to be asked. Every question and answer is recorded, so an unattended run stays reviewable afterwards. Works with Claude Code, Codex, Cursor, VS Code, Gemini CLI, Windsurf, Hermes, Lovable, or any MCP client; no Claude Max subscription required. Pushary is a hosted, paid service; web and native store checkout have different price and trial terms.
3
+ description: Push notifications and human-in-the-loop for AI agents. Use it whenever a running agent needs a person who may not be at the terminal, such as before an irreversible or destructive action, spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, on a genuine ambiguity while unattended, when another skill says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says keep going and ping me on my phone if you need anything, call me if you get stuck, notify me when my agent needs me, approve from my phone, ask me while I am away, run this overnight, I am stepping away, or do not wait for me. Ask yes/no, choice or free-text questions on their phone and send updates. Use these tools proactively. Works with Claude Code, Codex, Cursor, VS Code, Gemini CLI, Windsurf, Hermes, Lovable or any MCP client. Pushary is a hosted, paid service; web and native store checkout have different price and trial terms.
4
4
  ---
5
5
 
6
6
  # Pushary - Push Notifications for AI Agents
@@ -208,6 +208,8 @@ Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 know
208
208
 
209
209
  **Answers.** `value` is "yes" or "no" for confirm, the chosen option for select, and the typed text for input. Read `note` too: a denial with a note carries the reason or a condition. A select or input value containing "yes" is answer data, not approval of a separate action.
210
210
 
211
+ **Phone calls.** When the user says "call me", "phone me" or "ring me if you get stuck", ask with `ask_user`; there is no separate call tool. Pushary may phone only when the reply includes `phoneCall`; without it no call is planned, so do not promise one. With it, Pushary phones the person who can answer if the question is still unanswered, and records what they say as the answer: an approval, a choice or free text. For a call to the user, `ringsAt` says when it rings, and `waiting_for_calling_hours` means it rings when their calling hours start. While the reply is pending and has no `handoffAction`, keep waiting with `wait_for_answer` and the same `correlationId`: the spoken answer arrives there like any other. Do not cancel the question, ask it again or give up because a call is coming.
212
+
211
213
  ```json
212
214
  { "question": "Delete the 3 unused migration files in db/migrate/?", "type": "confirm", "context": "Cleaning up old migrations before the schema change", "toolName": "Bash", "toolTarget": "rm", "actionBody": "rm db/migrate/0003_*.sql", "agentName": "Claude Code - myproject" }
213
215
  { "question": "Which auth strategy for the new API?", "type": "select", "options": ["JWT tokens", "Session cookies", "OAuth2 + PKCE"], "context": "Setting up auth for the new endpoints", "agentName": "Claude Code - api-server" }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a person who may not be at the terminal, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill's workflow says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says things like keep going and ping me on my phone if you need anything, notify me when my agent needs me, approve from my phone, ask me questions while I am away from the terminal, run this overnight, keep working while I am in a meeting, I am stepping away, or do not wait for me, or wants a long task to run unattended. Ask yes/no, multiple choice or free-text questions on their phone and get the answer back, and send an update when a task finishes or fails. Use these tools proactively, without waiting to be asked. Every question and answer is recorded, so an unattended run stays reviewable afterwards. Works with Claude Code, Codex, Cursor, VS Code, Gemini CLI, Windsurf, Hermes, Lovable, or any MCP client; no Claude Max subscription required. Pushary is a hosted, paid service; web and native store checkout have different price and trial terms.
3
+ description: Push notifications and human-in-the-loop for AI agents. Use it whenever a running agent needs a person who may not be at the terminal, such as before an irreversible or destructive action, spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, on a genuine ambiguity while unattended, when another skill says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says keep going and ping me on my phone if you need anything, call me if you get stuck, notify me when my agent needs me, approve from my phone, ask me while I am away, run this overnight, I am stepping away, or do not wait for me. Ask yes/no, choice or free-text questions on their phone and send updates. Use these tools proactively. Works with Claude Code, Codex, Cursor, VS Code, Gemini CLI, Windsurf, Hermes, Lovable or any MCP client. Pushary is a hosted, paid service; web and native store checkout have different price and trial terms.
4
4
  ---
5
5
 
6
6
  # Pushary - Push Notifications for AI Agents
@@ -208,6 +208,8 @@ Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 know
208
208
 
209
209
  **Answers.** `value` is "yes" or "no" for confirm, the chosen option for select, and the typed text for input. Read `note` too: a denial with a note carries the reason or a condition. A select or input value containing "yes" is answer data, not approval of a separate action.
210
210
 
211
+ **Phone calls.** When the user says "call me", "phone me" or "ring me if you get stuck", ask with `ask_user`; there is no separate call tool. Pushary may phone only when the reply includes `phoneCall`; without it no call is planned, so do not promise one. With it, Pushary phones the person who can answer if the question is still unanswered, and records what they say as the answer: an approval, a choice or free text. For a call to the user, `ringsAt` says when it rings, and `waiting_for_calling_hours` means it rings when their calling hours start. While the reply is pending and has no `handoffAction`, keep waiting with `wait_for_answer` and the same `correlationId`: the spoken answer arrives there like any other. Do not cancel the question, ask it again or give up because a call is coming.
212
+
211
213
  ```json
212
214
  { "question": "Delete the 3 unused migration files in db/migrate/?", "type": "confirm", "context": "Cleaning up old migrations before the schema change", "toolName": "Bash", "toolTarget": "rm", "actionBody": "rm db/migrate/0003_*.sql", "agentName": "Claude Code - myproject" }
213
215
  { "question": "Which auth strategy for the new API?", "type": "select", "options": ["JWT tokens", "Session cookies", "OAuth2 + PKCE"], "context": "Setting up auth for the new endpoints", "agentName": "Claude Code - api-server" }
@@ -19,16 +19,16 @@ import {
19
19
  waitRetryPauseMs,
20
20
  waitsForThePhone,
21
21
  withdrawQuestion
22
- } from "./chunk-CNURORKI.js";
22
+ } from "./chunk-74QCFZKV.js";
23
23
  import "./chunk-POFBE6ZY.js";
24
- import "./chunk-V53QYJNY.js";
25
- import "./chunk-DZLLKJJT.js";
26
- import "./chunk-4OX4SJGA.js";
24
+ import "./chunk-WGT5LCIB.js";
25
+ import "./chunk-E32SRYTE.js";
26
+ import "./chunk-YESBU4VQ.js";
27
27
  import "./chunk-YCU7Y77H.js";
28
- import "./chunk-4Z7YVVKQ.js";
28
+ import "./chunk-5BTAIFVV.js";
29
29
  import "./chunk-YU2EUD7O.js";
30
- import "./chunk-IG7NGXBS.js";
31
- import "./chunk-QFZNPZRO.js";
30
+ import "./chunk-RPXSGCRG.js";
31
+ import "./chunk-5I3UQEAX.js";
32
32
  import "./chunk-4EBJ4PTZ.js";
33
33
  import "./chunk-BG4HHB7E.js";
34
34
  import "./chunk-TODDEIYG.js";
@@ -4,37 +4,37 @@ import {
4
4
  } from "../chunk-P5QXH5QI.js";
5
5
  import {
6
6
  readHookInput
7
- } from "../chunk-NZHRH4RR.js";
8
- import "../chunk-6JLANX5L.js";
9
- import "../chunk-LTPKSJWY.js";
7
+ } from "../chunk-56HFENZK.js";
8
+ import "../chunk-S7WVJ6AR.js";
9
+ import "../chunk-PYT4WXXR.js";
10
10
  import "../chunk-VAE5JBR5.js";
11
11
  import "../chunk-G66WIAST.js";
12
- import "../chunk-5RSM5DRT.js";
13
- import "../chunk-ZF4CPOO7.js";
14
- import "../chunk-3VOUWGFF.js";
15
- import "../chunk-QGJK3NAR.js";
12
+ import "../chunk-WGOTBZ23.js";
13
+ import "../chunk-VP4T5352.js";
14
+ import "../chunk-KEBI7NYU.js";
15
+ import "../chunk-EY5CVFDL.js";
16
16
  import "../chunk-7QWH257P.js";
17
17
  import "../chunk-53KLGXFL.js";
18
- import "../chunk-MH5BRZOQ.js";
18
+ import "../chunk-F37YD4YE.js";
19
19
  import "../chunk-YPY4YCIZ.js";
20
20
  import "../chunk-22CXL7YI.js";
21
21
  import "../chunk-XMSDA5WA.js";
22
22
  import "../chunk-7VMVMC4H.js";
23
23
  import "../chunk-EMODTMHE.js";
24
- import "../chunk-CNURORKI.js";
24
+ import "../chunk-74QCFZKV.js";
25
25
  import "../chunk-POFBE6ZY.js";
26
- import "../chunk-V53QYJNY.js";
27
- import "../chunk-DZLLKJJT.js";
28
- import "../chunk-4OX4SJGA.js";
26
+ import "../chunk-WGT5LCIB.js";
27
+ import "../chunk-E32SRYTE.js";
28
+ import "../chunk-YESBU4VQ.js";
29
29
  import "../chunk-H6CL3T2S.js";
30
30
  import "../chunk-ZVJIJPQY.js";
31
31
  import "../chunk-YCU7Y77H.js";
32
- import "../chunk-4Z7YVVKQ.js";
32
+ import "../chunk-5BTAIFVV.js";
33
33
  import "../chunk-YU2EUD7O.js";
34
34
  import "../chunk-HIIXYZYV.js";
35
35
  import "../chunk-BHKODM4L.js";
36
- import "../chunk-IG7NGXBS.js";
37
- import "../chunk-QFZNPZRO.js";
36
+ import "../chunk-RPXSGCRG.js";
37
+ import "../chunk-5I3UQEAX.js";
38
38
  import "../chunk-4EBJ4PTZ.js";
39
39
  import "../chunk-BG4HHB7E.js";
40
40
  import "../chunk-TODDEIYG.js";
@@ -16,7 +16,7 @@ import {
16
16
  addBellHooks,
17
17
  bellInstalled,
18
18
  removeBellHooks
19
- } from "../chunk-MH5BRZOQ.js";
19
+ } from "../chunk-F37YD4YE.js";
20
20
  import {
21
21
  parseFlags
22
22
  } from "../chunk-YPY4YCIZ.js";
@@ -25,8 +25,8 @@ import "../chunk-HIIXYZYV.js";
25
25
  import "../chunk-BHKODM4L.js";
26
26
  import {
27
27
  claudeSettings
28
- } from "../chunk-IG7NGXBS.js";
29
- import "../chunk-QFZNPZRO.js";
28
+ } from "../chunk-RPXSGCRG.js";
29
+ import "../chunk-5I3UQEAX.js";
30
30
  import "../chunk-4EBJ4PTZ.js";
31
31
  import {
32
32
  EXIT
@@ -12,25 +12,25 @@ import {
12
12
  describeIdleWindow,
13
13
  startProcessOwnership,
14
14
  withSpawnProcessOwnership
15
- } from "../chunk-NQF652IG.js";
15
+ } from "../chunk-5AXDNDUJ.js";
16
16
  import "../chunk-CYTPQDQY.js";
17
17
  import {
18
18
  announceSubscriptionRequired,
19
19
  isDeferAnswer
20
- } from "../chunk-42DRRA6N.js";
20
+ } from "../chunk-WWCM6UL7.js";
21
21
  import {
22
22
  claudeTranscriptPath,
23
23
  redactDraft,
24
24
  registerTranscript,
25
25
  registeredTranscriptEnabled,
26
26
  startDraftPublisher
27
- } from "../chunk-LTPKSJWY.js";
27
+ } from "../chunk-PYT4WXXR.js";
28
28
  import "../chunk-VAE5JBR5.js";
29
29
  import "../chunk-G66WIAST.js";
30
30
  import {
31
31
  ensureDaemonRunning
32
- } from "../chunk-ZF4CPOO7.js";
33
- import "../chunk-3VOUWGFF.js";
32
+ } from "../chunk-VP4T5352.js";
33
+ import "../chunk-KEBI7NYU.js";
34
34
  import {
35
35
  DEFAULT_SESSION,
36
36
  PHONE_DRIVER,
@@ -45,7 +45,7 @@ import {
45
45
  removePendingCommand,
46
46
  reportEvent,
47
47
  savePendingCommand
48
- } from "../chunk-QGJK3NAR.js";
48
+ } from "../chunk-EY5CVFDL.js";
49
49
  import {
50
50
  UNNAMED_ACTION,
51
51
  deriveToolTarget,
@@ -54,7 +54,7 @@ import {
54
54
  scopePathFor
55
55
  } from "../chunk-7QWH257P.js";
56
56
  import "../chunk-53KLGXFL.js";
57
- import "../chunk-MH5BRZOQ.js";
57
+ import "../chunk-F37YD4YE.js";
58
58
  import "../chunk-YPY4YCIZ.js";
59
59
  import "../chunk-22CXL7YI.js";
60
60
  import {
@@ -80,13 +80,13 @@ import {
80
80
  waitRetryPauseMs,
81
81
  waitsForThePhone,
82
82
  withdrawQuestion
83
- } from "../chunk-CNURORKI.js";
83
+ } from "../chunk-74QCFZKV.js";
84
84
  import "../chunk-POFBE6ZY.js";
85
85
  import {
86
86
  SubscriptionRequiredError
87
- } from "../chunk-V53QYJNY.js";
88
- import "../chunk-DZLLKJJT.js";
89
- import "../chunk-4OX4SJGA.js";
87
+ } from "../chunk-WGT5LCIB.js";
88
+ import "../chunk-E32SRYTE.js";
89
+ import "../chunk-YESBU4VQ.js";
90
90
  import {
91
91
  needsShell,
92
92
  spawnClaude
@@ -100,14 +100,14 @@ import {
100
100
  import "../chunk-YCU7Y77H.js";
101
101
  import {
102
102
  getMachineId
103
- } from "../chunk-4Z7YVVKQ.js";
103
+ } from "../chunk-5BTAIFVV.js";
104
104
  import "../chunk-YU2EUD7O.js";
105
105
  import "../chunk-HIIXYZYV.js";
106
106
  import "../chunk-BHKODM4L.js";
107
107
  import {
108
108
  claudeConfigDir
109
- } from "../chunk-IG7NGXBS.js";
110
- import "../chunk-QFZNPZRO.js";
109
+ } from "../chunk-RPXSGCRG.js";
110
+ import "../chunk-5I3UQEAX.js";
111
111
  import {
112
112
  getApiKey,
113
113
  getBaseUrl
@@ -15,30 +15,30 @@ import {
15
15
  storedMacAppState,
16
16
  storedPusharyKeychainServices,
17
17
  waitForMacAppExit
18
- } from "../chunk-FYB6HBHQ.js";
18
+ } from "../chunk-HGIW56MU.js";
19
19
  import {
20
20
  PUSHARY_SKILL_NAME,
21
21
  PUSHARY_SKILL_SOURCE,
22
22
  createGuards
23
23
  } from "../chunk-XR27HPYC.js";
24
- import "../chunk-44Z6MQZ2.js";
24
+ import "../chunk-AJQ4TTPJ.js";
25
25
  import "../chunk-XCEN33UP.js";
26
26
  import {
27
27
  describeCliKeyRevocation,
28
28
  planCliKeyRevocations,
29
29
  readCliHeldKeys,
30
30
  revokeCliKeys
31
- } from "../chunk-3WZMIDGX.js";
31
+ } from "../chunk-YY5YVMBA.js";
32
32
  import {
33
33
  isCursorPluginLeftover,
34
34
  releaseSoleGate,
35
35
  withoutPusharyCursorHooks
36
- } from "../chunk-DOXH5BV4.js";
36
+ } from "../chunk-Z2WQD2W6.js";
37
37
  import {
38
38
  shortenHome,
39
39
  unregisterPluginLocation,
40
40
  vscodeSettingsTargets
41
- } from "../chunk-G7G2ZPT4.js";
41
+ } from "../chunk-HNFYZPNJ.js";
42
42
  import {
43
43
  configFileHoldsMacAppKey,
44
44
  macAppKeepsMcpEntry,
@@ -46,22 +46,22 @@ import {
46
46
  pusharyKey,
47
47
  readMacAppAgentKey,
48
48
  setupReceiptKey
49
- } from "../chunk-K7MVCPH5.js";
50
- import "../chunk-TKFNIDZK.js";
49
+ } from "../chunk-EOKUIOMT.js";
50
+ import "../chunk-YFK3MJGZ.js";
51
51
  import {
52
52
  HERMES_CONFIG_FILE,
53
53
  defaultHermesHome,
54
54
  hermesReceiptPaths,
55
55
  removeHermesWiring
56
- } from "../chunk-KP6FVUCC.js";
56
+ } from "../chunk-CV4EIXPV.js";
57
57
  import "../chunk-QCGNGEGE.js";
58
58
  import {
59
59
  planClineRemoval,
60
60
  planFxRemoval,
61
61
  removeClineServer
62
- } from "../chunk-ZDOTNMGL.js";
63
- import "../chunk-XWYCFODT.js";
64
- import "../chunk-EGUT2MWV.js";
62
+ } from "../chunk-YD376BLV.js";
63
+ import "../chunk-MCI6KYN7.js";
64
+ import "../chunk-BHNX7XNO.js";
65
65
  import {
66
66
  OPENCODE_ASKED_PERMISSIONS,
67
67
  OPENCODE_PLUGIN_SIBLING,
@@ -75,7 +75,7 @@ import {
75
75
  openCodePluginDir,
76
76
  openCodePluginFile,
77
77
  removeOpenCodeMcpServer
78
- } from "../chunk-SYZF5SDG.js";
78
+ } from "../chunk-LVOHE66T.js";
79
79
  import {
80
80
  ansiPainter,
81
81
  useColor
@@ -95,34 +95,34 @@ import {
95
95
  removeCompatibleHooks,
96
96
  removeCompatibleMcpServer,
97
97
  serializeConfigDocument
98
- } from "../chunk-5RSM5DRT.js";
98
+ } from "../chunk-WGOTBZ23.js";
99
99
  import {
100
100
  disableDaemonService
101
- } from "../chunk-ZF4CPOO7.js";
101
+ } from "../chunk-VP4T5352.js";
102
102
  import {
103
103
  hookOwnerOf,
104
104
  isHookTakeoverReceipt,
105
105
  removeGeminiSettings,
106
106
  restoreHookTakeover,
107
107
  restoreMcpServer
108
- } from "../chunk-3VOUWGFF.js";
109
- import "../chunk-QGJK3NAR.js";
108
+ } from "../chunk-KEBI7NYU.js";
109
+ import "../chunk-EY5CVFDL.js";
110
110
  import "../chunk-7QWH257P.js";
111
111
  import "../chunk-53KLGXFL.js";
112
- import "../chunk-MH5BRZOQ.js";
112
+ import "../chunk-F37YD4YE.js";
113
113
  import {
114
114
  parseFlags
115
115
  } from "../chunk-YPY4YCIZ.js";
116
116
  import "../chunk-EMODTMHE.js";
117
- import "../chunk-CNURORKI.js";
117
+ import "../chunk-74QCFZKV.js";
118
118
  import "../chunk-POFBE6ZY.js";
119
- import "../chunk-V53QYJNY.js";
120
- import "../chunk-DZLLKJJT.js";
121
- import "../chunk-4OX4SJGA.js";
119
+ import "../chunk-WGT5LCIB.js";
120
+ import "../chunk-E32SRYTE.js";
121
+ import "../chunk-YESBU4VQ.js";
122
122
  import "../chunk-H6CL3T2S.js";
123
123
  import "../chunk-ZVJIJPQY.js";
124
124
  import "../chunk-YCU7Y77H.js";
125
- import "../chunk-4Z7YVVKQ.js";
125
+ import "../chunk-5BTAIFVV.js";
126
126
  import "../chunk-YU2EUD7O.js";
127
127
  import {
128
128
  CANDIDATE_RCS,
@@ -175,14 +175,14 @@ import {
175
175
  restoreCodexHookTrust,
176
176
  vscodePluginDir,
177
177
  vscodePluginMcp
178
- } from "../chunk-IG7NGXBS.js";
178
+ } from "../chunk-RPXSGCRG.js";
179
179
  import {
180
180
  cleanNpmEnv,
181
181
  globalPackageState,
182
182
  npmIsOnPath,
183
183
  readGlobalFolder,
184
184
  readGlobalPrefix
185
- } from "../chunk-QFZNPZRO.js";
185
+ } from "../chunk-5I3UQEAX.js";
186
186
  import {
187
187
  getBaseUrl
188
188
  } from "../chunk-4EBJ4PTZ.js";
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCodexBridge
4
- } from "../chunk-USNGPJXF.js";
4
+ } from "../chunk-CZOMD2IW.js";
5
5
  import "../chunk-B4VIT5N3.js";
6
6
  import {
7
7
  resolveProviderBinary
8
- } from "../chunk-R27HXRSK.js";
9
- import "../chunk-UIZE4YMU.js";
8
+ } from "../chunk-AGUL2JDK.js";
9
+ import "../chunk-BE5LO5VW.js";
10
10
  import "../chunk-DDJHPMBJ.js";
11
11
  import {
12
12
  withSpawnProcessOwnership
13
- } from "../chunk-NQF652IG.js";
13
+ } from "../chunk-5AXDNDUJ.js";
14
14
  import "../chunk-CYTPQDQY.js";
15
15
  import "../chunk-22CXL7YI.js";
16
16
  import "../chunk-XMSDA5WA.js";
@@ -18,22 +18,22 @@ import {
18
18
  transcriptsEnabled
19
19
  } from "../chunk-7VMVMC4H.js";
20
20
  import "../chunk-EMODTMHE.js";
21
- import "../chunk-CNURORKI.js";
21
+ import "../chunk-74QCFZKV.js";
22
22
  import "../chunk-POFBE6ZY.js";
23
- import "../chunk-V53QYJNY.js";
24
- import "../chunk-DZLLKJJT.js";
25
- import "../chunk-4OX4SJGA.js";
23
+ import "../chunk-WGT5LCIB.js";
24
+ import "../chunk-E32SRYTE.js";
25
+ import "../chunk-YESBU4VQ.js";
26
26
  import "../chunk-H6CL3T2S.js";
27
27
  import "../chunk-ZVJIJPQY.js";
28
28
  import "../chunk-YCU7Y77H.js";
29
29
  import {
30
30
  getMachineId
31
- } from "../chunk-4Z7YVVKQ.js";
31
+ } from "../chunk-5BTAIFVV.js";
32
32
  import "../chunk-YU2EUD7O.js";
33
33
  import "../chunk-HIIXYZYV.js";
34
34
  import "../chunk-BHKODM4L.js";
35
- import "../chunk-IG7NGXBS.js";
36
- import "../chunk-QFZNPZRO.js";
35
+ import "../chunk-RPXSGCRG.js";
36
+ import "../chunk-5I3UQEAX.js";
37
37
  import {
38
38
  getApiKey,
39
39
  getBaseUrl
@@ -5,36 +5,36 @@ import {
5
5
  import {
6
6
  askAgentQuestions,
7
7
  defersToNativeMode
8
- } from "../chunk-MQF6MQMR.js";
8
+ } from "../chunk-44WPMZGQ.js";
9
9
  import {
10
10
  parseCodexHookInput,
11
11
  pushQuestionAndWait,
12
12
  scopeQuestionOf
13
- } from "../chunk-WSKBXADV.js";
13
+ } from "../chunk-FC2ENROR.js";
14
14
  import {
15
15
  reportMachineDenial
16
- } from "../chunk-DU4KCXC2.js";
16
+ } from "../chunk-CWWO3JTD.js";
17
17
  import {
18
18
  isGatingMoment,
19
19
  recordKeylessMoment
20
20
  } from "../chunk-5TZYAMGW.js";
21
21
  import {
22
22
  triggerAutoUpdate
23
- } from "../chunk-MOYEHNFP.js";
23
+ } from "../chunk-4524ZR2U.js";
24
24
  import {
25
25
  readHookInput
26
- } from "../chunk-NZHRH4RR.js";
27
- import "../chunk-6JLANX5L.js";
26
+ } from "../chunk-56HFENZK.js";
27
+ import "../chunk-S7WVJ6AR.js";
28
28
  import {
29
29
  announceSubscriptionRequired,
30
30
  isDeferAnswer
31
- } from "../chunk-42DRRA6N.js";
32
- import "../chunk-LTPKSJWY.js";
31
+ } from "../chunk-WWCM6UL7.js";
32
+ import "../chunk-PYT4WXXR.js";
33
33
  import "../chunk-VAE5JBR5.js";
34
34
  import "../chunk-G66WIAST.js";
35
- import "../chunk-5RSM5DRT.js";
36
- import "../chunk-ZF4CPOO7.js";
37
- import "../chunk-3VOUWGFF.js";
35
+ import "../chunk-WGOTBZ23.js";
36
+ import "../chunk-VP4T5352.js";
37
+ import "../chunk-KEBI7NYU.js";
38
38
  import {
39
39
  CODEX_AGENT,
40
40
  DEFAULT_SESSION,
@@ -65,7 +65,7 @@ import {
65
65
  toPolicyLookup,
66
66
  toPolicyLookups,
67
67
  userScope
68
- } from "../chunk-QGJK3NAR.js";
68
+ } from "../chunk-EY5CVFDL.js";
69
69
  import {
70
70
  codexReviewerDenialsSince,
71
71
  deriveActionBody,
@@ -80,7 +80,7 @@ import {
80
80
  sessionIdentityOf
81
81
  } from "../chunk-7QWH257P.js";
82
82
  import "../chunk-53KLGXFL.js";
83
- import "../chunk-MH5BRZOQ.js";
83
+ import "../chunk-F37YD4YE.js";
84
84
  import "../chunk-YPY4YCIZ.js";
85
85
  import "../chunk-22CXL7YI.js";
86
86
  import "../chunk-XMSDA5WA.js";
@@ -98,26 +98,26 @@ import {
98
98
  pollForAnswer,
99
99
  requestGate,
100
100
  sendNotification
101
- } from "../chunk-CNURORKI.js";
101
+ } from "../chunk-74QCFZKV.js";
102
102
  import "../chunk-POFBE6ZY.js";
103
103
  import {
104
104
  SubscriptionRequiredError
105
- } from "../chunk-V53QYJNY.js";
106
- import "../chunk-DZLLKJJT.js";
107
- import "../chunk-4OX4SJGA.js";
105
+ } from "../chunk-WGT5LCIB.js";
106
+ import "../chunk-E32SRYTE.js";
107
+ import "../chunk-YESBU4VQ.js";
108
108
  import "../chunk-H6CL3T2S.js";
109
109
  import "../chunk-ZVJIJPQY.js";
110
110
  import "../chunk-YCU7Y77H.js";
111
111
  import {
112
112
  getMachineId
113
- } from "../chunk-4Z7YVVKQ.js";
113
+ } from "../chunk-5BTAIFVV.js";
114
114
  import "../chunk-YU2EUD7O.js";
115
115
  import "../chunk-HIIXYZYV.js";
116
116
  import "../chunk-BHKODM4L.js";
117
117
  import {
118
118
  canonicalJson
119
- } from "../chunk-IG7NGXBS.js";
120
- import "../chunk-QFZNPZRO.js";
119
+ } from "../chunk-RPXSGCRG.js";
120
+ import "../chunk-5I3UQEAX.js";
121
121
  import {
122
122
  getApiKey
123
123
  } from "../chunk-4EBJ4PTZ.js";
@@ -823,7 +823,7 @@ var decidePreToolUse = async (input) => {
823
823
  };
824
824
  var repairCodexHoldsQuietly = async () => {
825
825
  try {
826
- const { repairCodexHolds } = await import("../reapply-W6AIK5PH.js");
826
+ const { repairCodexHolds } = await import("../reapply-FBQ7VR6L.js");
827
827
  repairCodexHolds();
828
828
  } catch {
829
829
  return;
@@ -9,7 +9,7 @@ var args = process.argv.slice(2);
9
9
  if (args[0] === "codex") args.shift();
10
10
  var appBehindTheProxy = args[0] === "--desktop-proxy" && args[2] === "--" ? args[1] : void 0;
11
11
  if (args[0] !== "--desktop-proxy") (await import("../usage-GWUTCS5A.js")).exitOnHelpFlag("codex");
12
- var loadWhatReadsTheAccount = () => Promise.all([import("../config-2CHOLFNB.js"), import("../identity-7QA3EDOM.js")]);
12
+ var loadWhatReadsTheAccount = () => Promise.all([import("../config-2CHOLFNB.js"), import("../identity-I2VWLZAQ.js")]);
13
13
  var loadedWhenThePassThroughStarted = appBehindTheProxy === void 0 ? null : loadWhatReadsTheAccount().catch(() => null);
14
14
  var desktopAccount = async () => {
15
15
  try {
@@ -19,7 +19,7 @@ var desktopAccount = async () => {
19
19
  return null;
20
20
  }
21
21
  };
22
- var desktopLaunch = await import("../codex-desktop-launch-6UN5CWCX.js").catch(() => null);
22
+ var desktopLaunch = await import("../codex-desktop-launch-BCPUKOCV.js").catch(() => null);
23
23
  if (desktopLaunch === null && appBehindTheProxy !== void 0) {
24
24
  process.exitCode = await letCodexRunWithoutPushary(appBehindTheProxy, args.slice(3));
25
25
  } else {
@@ -27,15 +27,15 @@ if (desktopLaunch === null && appBehindTheProxy !== void 0) {
27
27
  const stop = () => abort.abort();
28
28
  if (!args[0]?.startsWith("--desktop")) for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) process.on(signal, stop);
29
29
  try {
30
- const { codexDesktopCommand } = desktopLaunch ?? await import("../codex-desktop-launch-6UN5CWCX.js");
30
+ const { codexDesktopCommand } = desktopLaunch ?? await import("../codex-desktop-launch-BCPUKOCV.js");
31
31
  const desktop = await codexDesktopCommand(args, [process.execPath, ...process.execArgv, process.argv[1], "codex"], desktopAccount);
32
32
  if (desktop !== null) process.exitCode = desktop;
33
33
  else {
34
34
  const [{ getApiKey, getBaseUrl }, { getMachineId }, { resolveProviderBinary }, { codexSessionDirectory, launchCodexSession }] = await Promise.all([
35
35
  import("../config-2CHOLFNB.js"),
36
- import("../identity-7QA3EDOM.js"),
37
- import("../live-capabilities-SDMX6CPZ.js"),
38
- import("../codex-session-launch-7R3HNIDJ.js")
36
+ import("../identity-I2VWLZAQ.js"),
37
+ import("../live-capabilities-4CLCROSP.js"),
38
+ import("../codex-session-launch-4ZUBROFZ.js")
39
39
  ]);
40
40
  const binary = resolveProviderBinary("codex");
41
41
  if (!binary) throw new Error("Install Codex first, then run pushary codex");
@@ -1,27 +1,27 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  reportEvent
4
- } from "../chunk-QGJK3NAR.js";
4
+ } from "../chunk-EY5CVFDL.js";
5
5
  import "../chunk-7QWH257P.js";
6
6
  import "../chunk-EMODTMHE.js";
7
7
  import {
8
8
  askUser,
9
9
  isDecisionStopped,
10
10
  waitForAnswer
11
- } from "../chunk-CNURORKI.js";
11
+ } from "../chunk-74QCFZKV.js";
12
12
  import "../chunk-POFBE6ZY.js";
13
- import "../chunk-V53QYJNY.js";
14
- import "../chunk-DZLLKJJT.js";
15
- import "../chunk-4OX4SJGA.js";
13
+ import "../chunk-WGT5LCIB.js";
14
+ import "../chunk-E32SRYTE.js";
15
+ import "../chunk-YESBU4VQ.js";
16
16
  import "../chunk-ZVJIJPQY.js";
17
17
  import "../chunk-YCU7Y77H.js";
18
18
  import {
19
19
  getMachineId
20
- } from "../chunk-4Z7YVVKQ.js";
20
+ } from "../chunk-5BTAIFVV.js";
21
21
  import "../chunk-YU2EUD7O.js";
22
22
  import "../chunk-BHKODM4L.js";
23
- import "../chunk-IG7NGXBS.js";
24
- import "../chunk-QFZNPZRO.js";
23
+ import "../chunk-RPXSGCRG.js";
24
+ import "../chunk-5I3UQEAX.js";
25
25
  import {
26
26
  getApiKey
27
27
  } from "../chunk-4EBJ4PTZ.js";