pushary 1.9.22 → 1.9.24

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 +13 -0
  2. package/data/cursor-plugin/.cursor-plugin/plugin.json +1 -1
  3. package/data/cursor-plugin/CHANGELOG.md +4 -0
  4. package/data/cursor-plugin/scripts/pushary-gate.mjs +4 -2
  5. package/data/cursor-plugin/scripts/pushary-gate.test.mjs +14 -1
  6. package/dist/bin/pushary-bell-hook.js +25 -25
  7. package/dist/bin/pushary-bell.js +9 -9
  8. package/dist/bin/pushary-claude.js +27 -26
  9. package/dist/bin/pushary-clean.js +41 -93
  10. package/dist/bin/pushary-codex-bridge.js +17 -17
  11. package/dist/bin/pushary-codex-hook.js +33 -31
  12. package/dist/bin/pushary-codex.js +12 -12
  13. package/dist/bin/pushary-connect.js +24 -24
  14. package/dist/bin/pushary-cowork.js +5 -5
  15. package/dist/bin/pushary-daemon.js +31 -31
  16. package/dist/bin/pushary-disconnect.js +24 -24
  17. package/dist/bin/pushary-doctor.js +33 -33
  18. package/dist/bin/pushary-elicitation-hook.js +25 -25
  19. package/dist/bin/pushary-gemini-bridge.js +13 -13
  20. package/dist/bin/pushary-gemini-hook.js +27 -27
  21. package/dist/bin/pushary-hook.js +29 -29
  22. package/dist/bin/pushary-login.js +16 -16
  23. package/dist/bin/pushary-logout.js +77 -26
  24. package/dist/bin/pushary-mcp.js +9 -9
  25. package/dist/bin/pushary-mode.js +12 -12
  26. package/dist/bin/pushary-notification-hook.js +24 -24
  27. package/dist/bin/pushary-opencode-hook.js +26 -26
  28. package/dist/bin/pushary-permission-denied-hook.js +29 -29
  29. package/dist/bin/pushary-permission-hook.js +28 -28
  30. package/dist/bin/pushary-post-hook.js +24 -24
  31. package/dist/bin/pushary-prompt-hook.js +24 -24
  32. package/dist/bin/pushary-session-end-hook.js +24 -24
  33. package/dist/bin/pushary-session-start-hook.js +28 -28
  34. package/dist/bin/pushary-setup.js +46 -42
  35. package/dist/bin/pushary-stats.js +5 -5
  36. package/dist/bin/pushary-status.js +26 -26
  37. package/dist/bin/pushary-stop-hook.js +24 -24
  38. package/dist/bin/pushary-stopfailure-hook.js +24 -24
  39. package/dist/bin/pushary-suggestions.js +12 -12
  40. package/dist/bin/pushary-transcript-register.js +17 -17
  41. package/dist/bin/pushary-transcripts.js +7 -7
  42. package/dist/bin/pushary-upgrade.js +30 -30
  43. package/dist/bin/pushary-wait.js +12 -12
  44. package/dist/bin/pushary.js +6 -6
  45. package/dist/{chunk-2MW4OHWI.js → chunk-264EOGIK.js} +2 -2
  46. package/dist/{chunk-WAKQYJ6T.js → chunk-2E6AWHV7.js} +3 -3
  47. package/dist/{chunk-76YNWUXC.js → chunk-2F6UQ3YD.js} +1 -1
  48. package/dist/{chunk-YPZ4AE2R.js → chunk-2JTJZ7VI.js} +4 -4
  49. package/dist/{chunk-KH2EDRJQ.js → chunk-35U2QHH2.js} +2 -2
  50. package/dist/{chunk-GNQZY4GL.js → chunk-3WRJU7KN.js} +1 -1
  51. package/dist/{chunk-3BWW4UMT.js → chunk-7JHYWFY6.js} +2 -2
  52. package/dist/{chunk-ARJSQUIS.js → chunk-7Z2DLAEE.js} +2 -2
  53. package/dist/{chunk-AR4NXO4Q.js → chunk-CLVU24OZ.js} +2 -2
  54. package/dist/{chunk-YODL2CJV.js → chunk-CYGIJXAP.js} +2 -2
  55. package/dist/{chunk-P345G4DK.js → chunk-E4B7TXVS.js} +1 -1
  56. package/dist/{chunk-ZUOIDI6M.js → chunk-EE357RIP.js} +4 -4
  57. package/dist/{chunk-JQVGCDHW.js → chunk-EKPAV33G.js} +5 -5
  58. package/dist/{chunk-TH3HKKGW.js → chunk-G6GFNKF7.js} +18 -15
  59. package/dist/{chunk-T57BCGHQ.js → chunk-GBD6G4TA.js} +1 -1
  60. package/dist/{chunk-GFXZDU4V.js → chunk-GM2IFDVF.js} +38 -3
  61. package/dist/{chunk-5TLRS3AK.js → chunk-GXQVOKHJ.js} +2 -2
  62. package/dist/{chunk-NB2PY5JX.js → chunk-H2RD5EMR.js} +3 -3
  63. package/dist/{chunk-N2JP3RKP.js → chunk-HBR6ZZHN.js} +5 -5
  64. package/dist/{chunk-KCLWVCGN.js → chunk-HLXGEOX3.js} +4 -4
  65. package/dist/{chunk-Z7KB4R6U.js → chunk-IO5ZDIHY.js} +7 -7
  66. package/dist/{chunk-U2IEM5FF.js → chunk-IS737HST.js} +1 -1
  67. package/dist/{chunk-WE2RVY7V.js → chunk-JDWOK6PE.js} +1 -1
  68. package/dist/{chunk-CW3QUV6B.js → chunk-KT5BH6GC.js} +8 -8
  69. package/dist/{chunk-UFGU7AK3.js → chunk-KX776UXN.js} +2 -2
  70. package/dist/chunk-L5MCJNSI.js +166 -0
  71. package/dist/{chunk-KCXG2INQ.js → chunk-LHFK5F3T.js} +2 -2
  72. package/dist/{chunk-6TSEEKPL.js → chunk-LOERK6N3.js} +4 -4
  73. package/dist/{chunk-U26CAOZC.js → chunk-NJK4MGXL.js} +1 -1
  74. package/dist/{chunk-E7EOUEGQ.js → chunk-NQICO3ES.js} +4 -4
  75. package/dist/{chunk-U4OWRGYI.js → chunk-O3RRQTTV.js} +5 -5
  76. package/dist/{chunk-4AO2OVUA.js → chunk-OLWKCDK4.js} +6 -6
  77. package/dist/{chunk-TSFNX5J2.js → chunk-OSOCONIE.js} +5 -5
  78. package/dist/{chunk-75MJRC5I.js → chunk-OY6NJWDD.js} +1 -1
  79. package/dist/{chunk-YR3DHPYI.js → chunk-P447F2RB.js} +1 -1
  80. package/dist/{chunk-BDGKWUK2.js → chunk-Q7IEFI7V.js} +2 -2
  81. package/dist/{chunk-TZWZVAMN.js → chunk-QDKNLNCA.js} +3 -3
  82. package/dist/{chunk-BDV4WDIA.js → chunk-RFK2WN6S.js} +1 -1
  83. package/dist/{chunk-E3FSKKTJ.js → chunk-RIBIEQHU.js} +1 -1
  84. package/dist/{chunk-6SFTI7LM.js → chunk-RK7TDMQT.js} +3 -3
  85. package/dist/{chunk-G5YMVGAK.js → chunk-SBQCRQIP.js} +4 -4
  86. package/dist/{chunk-SGUGGHMC.js → chunk-SH2KK2ED.js} +3 -3
  87. package/dist/{chunk-E7HOX73X.js → chunk-T5KM7J75.js} +4 -4
  88. package/dist/{chunk-DV26ZWUC.js → chunk-T6TJA4RF.js} +2 -2
  89. package/dist/{chunk-6IOLTFNP.js → chunk-U23XTMBF.js} +21 -8
  90. package/dist/{chunk-YI543EKI.js → chunk-URCSJZNU.js} +3 -3
  91. package/dist/{chunk-YGR5PBOF.js → chunk-VFIZFKZY.js} +3 -3
  92. package/dist/{chunk-OZVZGWER.js → chunk-VICG46JC.js} +1 -1
  93. package/dist/{chunk-LH3GTSXC.js → chunk-W5NHIA4Y.js} +8 -8
  94. package/dist/{chunk-4PERN2SO.js → chunk-WYLA6J43.js} +1 -1
  95. package/dist/{chunk-XDTYGS6R.js → chunk-XA2RGGNR.js} +4 -4
  96. package/dist/{chunk-GWKT2ZZS.js → chunk-XQROISQB.js} +2 -2
  97. package/dist/{chunk-5AZ546F6.js → chunk-Z5L4NQHC.js} +1 -1
  98. package/dist/{chunk-AGIO7SF5.js → chunk-ZVON5PCF.js} +5 -5
  99. package/dist/{global-upgrade-F3QY6OHE.js → global-upgrade-DZGLAARJ.js} +6 -6
  100. package/dist/{paths-CBEAZNJR.js → paths-JATF66FP.js} +2 -2
  101. package/dist/{reapply-4HP6N7LY.js → reapply-7TDCFXNF.js} +20 -20
  102. package/dist/src/index.js +19 -19
  103. package/dist/{upgrade-lock-N3G5V2QS.js → upgrade-lock-LPIDFQEH.js} +3 -3
  104. package/package.json +1 -1
  105. package/dist/chunk-OYIN77HO.js +0 -72
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.24
4
+
5
+ - Under When I'm out, a call nobody answers is refused for every agent with no approval prompt of its own (Antigravity CLI, Cursor file edits, sessions started from your phone), even when your rule approves on timeout. The 1.9.17 notes said this; only Codex did it. Under Every time a rule that approves on timeout still runs the call after its full wait.
6
+ - After three approvals nobody answered in a session, an Every time call whose rule approves on timeout keeps reaching your phone instead of running at once with nothing shown. Antigravity CLI sessions are no longer paused at all: agy sends nothing that could lift the pause, so every later call was refused until a new conversation.
7
+ - "Allow for this session" is offered for an MCP tool only when its name says it reads, such as `get_issue` or `list_files`. A grant cannot see the arguments of later calls, so a tool such as `query` or `create_issue` asks every time. A session grant already given for such a tool stops applying.
8
+ - `pushary sign-out --revoke` and `pushary clean --everything` revoke only a key this CLI created by browser sign-in or pairing. The Pushary Mac app's key, a key you pasted or passed with `--key`, and a key from an `export PUSHARY_API_KEY` line are removed from this computer and not revoked, because the Mac app or another machine may still use them; the output says so and links to the dashboard to revoke it there. Since 1.9.8 `sign-out --revoke` could revoke the Mac app's own key. A key saved before 1.9.24 has no record of how it was made, so it is removed and not revoked until your next sign-in records one.
9
+
10
+ ## 1.9.23
11
+
12
+ - A `printf` whose format has a numeric conversion, such as `%d`, `%x` or `%f`, is no longer approved as a read unless every argument is a plain number. zsh, the default shell on a Mac, evaluates those arguments as arithmetic, and an argument such as `'PWD[$(command)]'` ran the command while Pushary approved it without asking. `printf '%s\n' text`, `printf hello` and `printf '%d\n' 42` are still approved as reads.
13
+ - Codex with its approval policy set to never: answering "Handle on your machine" on your phone now refuses the call. Codex has no prompt of its own there, so the call used to run, a destructive one included. With Codex's own prompts on, the call still goes to that prompt.
14
+ - Antigravity CLI: when your Pushary subscription has ended, a call Pushary would ask about is refused with a message that says so. Pushary is agy's only gate, and the call used to run with nothing asking. Renew, or run `pushary disconnect antigravity` to give approvals back to agy.
15
+
3
16
  ## 1.9.22
4
17
 
5
18
  - Each approval Claude Code or Codex sends through Pushary now carries the approval mode the agent reported for the session, such as `default` or `bypassPermissions`, so Pushary can tell which mode an approval was asked in. It is recorded with the approval and never used to decide one. A mode that is empty or not text is left out, and a long one is cut to 64 characters.
@@ -2,7 +2,7 @@
2
2
  "name": "pushary",
3
3
  "displayName": "Pushary — Control Panel for AI Agents",
4
4
  "description": "Push notifications, human-in-the-loop questions, and permission gating for your AI coding agent. Get a push when a task finishes, answer the agent from your phone, and approve risky commands before they run.",
5
- "version": "0.2.5",
5
+ "version": "0.2.6",
6
6
  "author": { "name": "Pushary", "email": "business@pushary.com" },
7
7
  "homepage": "https://pushary.com",
8
8
  "repository": "https://github.com/Pushary/cursor-plugin",
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.6
4
+
5
+ - Under When I'm out, a file change nobody answers is refused, even when your rule approves on timeout. Cursor's file hooks have no prompt of their own, so the change used to run once the wait ended. Under Every time a rule that approves on timeout still runs the change, as before.
6
+
3
7
  ## 0.2.5
4
8
 
5
9
  - Under When I'm out, a file change asks your phone every time, also while you are at the keyboard, and waits for your policy's timeout. Cursor's file hooks cannot show a prompt of their own. Before, the change was refused with "Switch to Every time" and nobody was asked, or it was refused after the 10 second push window when you were away. Shell commands and MCP calls keep When I'm out as it was, because Cursor prompts for those itself.
@@ -37,6 +37,8 @@ const unresolved = (verdict) => genericToolHook && verdict?.reason === 'not_gate
37
37
 
38
38
  const approvalModeWithoutLocalPrompt = (mode) => mode === 'push_first' ? 'push_only' : mode
39
39
  const deliveryModeForThisHook = (mode) => genericToolHook ? approvalModeWithoutLocalPrompt(mode) : mode
40
+ const timeoutActionWithoutLocalPrompt = ({ mode, timeoutAction }) => mode !== 'push_only' && timeoutAction === 'approve' ? 'deny' : timeoutAction
41
+ const timeoutActionForThisHook = (tool) => genericToolHook ? timeoutActionWithoutLocalPrompt(tool) : tool.timeoutAction
40
42
  const localSurfaceHint = () => genericToolHook ? { localSurfaceAvailable: false } : {}
41
43
 
42
44
  let activeQuestion
@@ -705,7 +707,7 @@ setTimeout(async () => {
705
707
  case 'notify_only':
706
708
  return respond(await handleNotifyOnly(apiKey, request, project, ident))
707
709
  case 'push_only':
708
- return respond(await handlePushOnly(apiKey, request, project, ident, tool.timeoutSeconds, tool.timeoutAction))
710
+ return respond(await handlePushOnly(apiKey, request, project, ident, tool.timeoutSeconds, timeoutActionForThisHook(tool)))
709
711
  case 'push_first':
710
712
  default:
711
713
  return respond(await handlePushFirst(apiKey, request, project, ident, tool.pushFirstSeconds))
@@ -718,7 +720,7 @@ setTimeout(async () => {
718
720
 
719
721
  // Exported for scripts/pushary-gate.test.mjs. main() only runs when the gate is
720
722
  // executed directly, so importing this file for a test does not read stdin.
721
- export { normalizeRepoRemote, deriveRepoKey, describeRequest, handlePushOnly, handlePushFirst, withdraw, approvalModeWithoutLocalPrompt }
723
+ export { normalizeRepoRemote, deriveRepoKey, describeRequest, handlePushOnly, handlePushFirst, withdraw, approvalModeWithoutLocalPrompt, timeoutActionWithoutLocalPrompt }
722
724
 
723
725
  const isDirectRun = process.argv[1] && import.meta.url === `file://${process.argv[1]}`
724
726
  if (!isDirectRun) {
@@ -14,7 +14,7 @@
14
14
 
15
15
  import assert from 'node:assert/strict'
16
16
  import { describe, it } from 'node:test'
17
- import { describeRequest, normalizeRepoRemote, redactSecrets } from './pushary-gate.mjs'
17
+ import { describeRequest, normalizeRepoRemote, redactSecrets, timeoutActionWithoutLocalPrompt } from './pushary-gate.mjs'
18
18
 
19
19
  describe('repo identity', () => {
20
20
  it('collapses the forms of one remote', () => {
@@ -135,3 +135,16 @@ describe('approval text redaction', () => {
135
135
  assert.equal(redactSecrets('export API_KEY="abc123" && rm -rf build'), 'export API_KEY="[redacted]" && rm -rf build')
136
136
  })
137
137
  })
138
+
139
+ describe('a rule that approves on timeout, for a file hook with no prompt of its own', () => {
140
+ it('approves only under Every time, and is refused under When I am out', () => {
141
+ assert.equal(timeoutActionWithoutLocalPrompt({ mode: 'push_only', timeoutAction: 'approve' }), 'approve')
142
+ assert.equal(timeoutActionWithoutLocalPrompt({ mode: 'push_first', timeoutAction: 'approve' }), 'deny')
143
+ })
144
+
145
+ it('leaves every other timeout action as the rule wrote it', () => {
146
+ for (const timeoutAction of ['deny', 'escalate', 'wait']) {
147
+ assert.equal(timeoutActionWithoutLocalPrompt({ mode: 'push_first', timeoutAction }), timeoutAction)
148
+ }
149
+ })
150
+ })
@@ -1,41 +1,41 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-76YNWUXC.js";
4
+ } from "../chunk-2F6UQ3YD.js";
5
5
  import {
6
6
  readHookInput
7
- } from "../chunk-E7HOX73X.js";
8
- import "../chunk-LH3GTSXC.js";
7
+ } from "../chunk-T5KM7J75.js";
8
+ import "../chunk-W5NHIA4Y.js";
9
9
  import "../chunk-VTR4VRL2.js";
10
- import "../chunk-N2JP3RKP.js";
11
- import "../chunk-E3FSKKTJ.js";
12
- import "../chunk-GNQZY4GL.js";
13
- import "../chunk-WE2RVY7V.js";
10
+ import "../chunk-HBR6ZZHN.js";
11
+ import "../chunk-RIBIEQHU.js";
12
+ import "../chunk-3WRJU7KN.js";
13
+ import "../chunk-JDWOK6PE.js";
14
14
  import "../chunk-XHKBHWLX.js";
15
- import "../chunk-6TSEEKPL.js";
16
- import "../chunk-TSFNX5J2.js";
17
- import "../chunk-YGR5PBOF.js";
18
- import "../chunk-U26CAOZC.js";
19
- import "../chunk-OZVZGWER.js";
15
+ import "../chunk-LOERK6N3.js";
16
+ import "../chunk-OSOCONIE.js";
17
+ import "../chunk-VFIZFKZY.js";
18
+ import "../chunk-NJK4MGXL.js";
19
+ import "../chunk-VICG46JC.js";
20
20
  import "../chunk-GMXKITVA.js";
21
21
  import "../chunk-6ICPEJY5.js";
22
- import "../chunk-6IOLTFNP.js";
23
- import "../chunk-CW3QUV6B.js";
24
- import "../chunk-BDV4WDIA.js";
25
- import "../chunk-AGIO7SF5.js";
22
+ import "../chunk-U23XTMBF.js";
23
+ import "../chunk-KT5BH6GC.js";
24
+ import "../chunk-RFK2WN6S.js";
25
+ import "../chunk-ZVON5PCF.js";
26
26
  import "../chunk-POFBE6ZY.js";
27
- import "../chunk-6SFTI7LM.js";
28
- import "../chunk-NB2PY5JX.js";
29
- import "../chunk-WAKQYJ6T.js";
30
- import "../chunk-U2IEM5FF.js";
27
+ import "../chunk-RK7TDMQT.js";
28
+ import "../chunk-H2RD5EMR.js";
29
+ import "../chunk-2E6AWHV7.js";
30
+ import "../chunk-IS737HST.js";
31
31
  import "../chunk-7QLSKOSU.js";
32
32
  import "../chunk-KZERVKTD.js";
33
- import "../chunk-5TLRS3AK.js";
34
- import "../chunk-E7EOUEGQ.js";
33
+ import "../chunk-GXQVOKHJ.js";
34
+ import "../chunk-NQICO3ES.js";
35
35
  import "../chunk-AQFEP65J.js";
36
- import "../chunk-75MJRC5I.js";
37
- import "../chunk-TZWZVAMN.js";
38
- import "../chunk-GFXZDU4V.js";
36
+ import "../chunk-OY6NJWDD.js";
37
+ import "../chunk-QDKNLNCA.js";
38
+ import "../chunk-GM2IFDVF.js";
39
39
 
40
40
  // bin/pushary-bell-hook.ts
41
41
  var main = async () => {
@@ -5,39 +5,39 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-76YNWUXC.js";
8
+ } from "../chunk-2F6UQ3YD.js";
9
9
  import {
10
10
  createIo
11
11
  } from "../chunk-FO3MDD26.js";
12
12
  import {
13
13
  exitOnHelpFlag
14
- } from "../chunk-2MW4OHWI.js";
14
+ } from "../chunk-264EOGIK.js";
15
15
  import {
16
16
  addBellHooks,
17
17
  bellInstalled,
18
18
  removeBellHooks
19
- } from "../chunk-OZVZGWER.js";
19
+ } from "../chunk-VICG46JC.js";
20
20
  import {
21
21
  parseFlags
22
22
  } from "../chunk-GMXKITVA.js";
23
- import "../chunk-6IOLTFNP.js";
23
+ import "../chunk-U23XTMBF.js";
24
24
  import "../chunk-7QLSKOSU.js";
25
25
  import {
26
26
  EXIT
27
27
  } from "../chunk-KZERVKTD.js";
28
- import "../chunk-5TLRS3AK.js";
28
+ import "../chunk-GXQVOKHJ.js";
29
29
  import {
30
30
  claudeSettings
31
- } from "../chunk-E7EOUEGQ.js";
31
+ } from "../chunk-NQICO3ES.js";
32
32
  import {
33
33
  readJsonSafe,
34
34
  writeJsonAtomic
35
35
  } from "../chunk-AQFEP65J.js";
36
- import "../chunk-75MJRC5I.js";
37
- import "../chunk-TZWZVAMN.js";
36
+ import "../chunk-OY6NJWDD.js";
37
+ import "../chunk-QDKNLNCA.js";
38
38
  import {
39
39
  isRecord
40
- } from "../chunk-GFXZDU4V.js";
40
+ } from "../chunk-GM2IFDVF.js";
41
41
 
42
42
  // bin/pushary-bell.ts
43
43
  exitOnHelpFlag("bell");
@@ -8,39 +8,39 @@ import {
8
8
  describeIdleWindow,
9
9
  startProcessOwnership,
10
10
  withSpawnProcessOwnership
11
- } from "../chunk-KH2EDRJQ.js";
11
+ } from "../chunk-35U2QHH2.js";
12
12
  import {
13
13
  announceSubscriptionRequired,
14
14
  isDeferAnswer
15
- } from "../chunk-P345G4DK.js";
15
+ } from "../chunk-E4B7TXVS.js";
16
16
  import {
17
17
  claudeTranscriptPath,
18
18
  loadSessionKey,
19
19
  registerTranscript,
20
20
  registeredTranscriptEnabled
21
- } from "../chunk-LH3GTSXC.js";
21
+ } from "../chunk-W5NHIA4Y.js";
22
22
  import "../chunk-VTR4VRL2.js";
23
23
  import {
24
24
  ensureDaemonRunning
25
- } from "../chunk-N2JP3RKP.js";
25
+ } from "../chunk-HBR6ZZHN.js";
26
26
  import {
27
27
  encryptRecord
28
- } from "../chunk-E3FSKKTJ.js";
29
- import "../chunk-GNQZY4GL.js";
28
+ } from "../chunk-RIBIEQHU.js";
29
+ import "../chunk-3WRJU7KN.js";
30
30
  import {
31
31
  transcriptsEnabled
32
- } from "../chunk-WE2RVY7V.js";
32
+ } from "../chunk-JDWOK6PE.js";
33
33
  import {
34
34
  needsShell,
35
35
  spawnClaude
36
36
  } from "../chunk-XHKBHWLX.js";
37
- import "../chunk-TSFNX5J2.js";
38
- import "../chunk-YGR5PBOF.js";
39
- import "../chunk-U26CAOZC.js";
40
- import "../chunk-OZVZGWER.js";
37
+ import "../chunk-OSOCONIE.js";
38
+ import "../chunk-VFIZFKZY.js";
39
+ import "../chunk-NJK4MGXL.js";
40
+ import "../chunk-VICG46JC.js";
41
41
  import "../chunk-GMXKITVA.js";
42
42
  import "../chunk-6ICPEJY5.js";
43
- import "../chunk-6IOLTFNP.js";
43
+ import "../chunk-U23XTMBF.js";
44
44
  import {
45
45
  DEFAULT_SESSION,
46
46
  UNNAMED_ACTION,
@@ -58,8 +58,8 @@ import {
58
58
  reportEvent,
59
59
  savePendingCommand,
60
60
  scopePathFor
61
- } from "../chunk-CW3QUV6B.js";
62
- import "../chunk-BDV4WDIA.js";
61
+ } from "../chunk-KT5BH6GC.js";
62
+ import "../chunk-RFK2WN6S.js";
63
63
  import {
64
64
  askUser,
65
65
  cancelQuestion,
@@ -69,35 +69,36 @@ import {
69
69
  waitForAnswer,
70
70
  waitsForThePhone,
71
71
  withdrawQuestion
72
- } from "../chunk-AGIO7SF5.js";
72
+ } from "../chunk-ZVON5PCF.js";
73
73
  import "../chunk-POFBE6ZY.js";
74
74
  import {
75
75
  SubscriptionRequiredError
76
- } from "../chunk-6SFTI7LM.js";
77
- import "../chunk-NB2PY5JX.js";
78
- import "../chunk-WAKQYJ6T.js";
76
+ } from "../chunk-RK7TDMQT.js";
77
+ import "../chunk-H2RD5EMR.js";
78
+ import "../chunk-2E6AWHV7.js";
79
79
  import {
80
80
  getMachineId
81
- } from "../chunk-U2IEM5FF.js";
81
+ } from "../chunk-IS737HST.js";
82
82
  import "../chunk-7QLSKOSU.js";
83
83
  import "../chunk-KZERVKTD.js";
84
- import "../chunk-5TLRS3AK.js";
85
- import "../chunk-E7EOUEGQ.js";
84
+ import "../chunk-GXQVOKHJ.js";
85
+ import "../chunk-NQICO3ES.js";
86
86
  import "../chunk-AQFEP65J.js";
87
87
  import {
88
88
  getApiKey,
89
89
  getBaseUrl
90
- } from "../chunk-75MJRC5I.js";
90
+ } from "../chunk-OY6NJWDD.js";
91
91
  import {
92
92
  NPX_LATEST_COMMAND
93
- } from "../chunk-TZWZVAMN.js";
93
+ } from "../chunk-QDKNLNCA.js";
94
94
  import {
95
95
  DECISION_STOP_REASON,
96
96
  KILL_REASON,
97
97
  UNVERIFIABLE_APPROVAL_REASON,
98
98
  redactSecretsFromContent,
99
- resolveGate
100
- } from "../chunk-GFXZDU4V.js";
99
+ resolveGate,
100
+ timeoutActionWithoutLocalPrompt
101
+ } from "../chunk-GM2IFDVF.js";
101
102
 
102
103
  // src/wrapper/localPassthrough.ts
103
104
  var SIGNAL_NUMBERS = {
@@ -454,7 +455,7 @@ var createRemoteApprover = (deps) => {
454
455
  const ceiling = policy.timeoutAction === "wait" ? MAX_APPROVAL_WINDOW_MS : base;
455
456
  return Math.min(Math.max(base, 15e3), Math.max(ceiling, 15e3));
456
457
  };
457
- const applyTimeout = (policy, input) => policy.timeoutAction === "approve" ? allow(input) : deny("No approval received in time");
458
+ const applyTimeout = (policy, input) => timeoutActionWithoutLocalPrompt(policy) === "approve" ? allow(input) : deny("No approval received in time");
458
459
  const waitForPhone = async (entry, correlationId, windowMs) => {
459
460
  const deadline = now() + windowMs;
460
461
  while (now() < deadline && !entry.controller.signal.aborted) {
@@ -5,15 +5,16 @@ import {
5
5
  createGuards
6
6
  } from "../chunk-EUW7JL2K.js";
7
7
  import {
8
- describeRevokeAttempt,
9
- keyNoLongerAccepted,
10
- revokeOwnKey
11
- } from "../chunk-OYIN77HO.js";
8
+ describeCliKeyRevocation,
9
+ planCliKeyRevocations,
10
+ readCliHeldKeys,
11
+ revokeCliKeys
12
+ } from "../chunk-L5MCJNSI.js";
12
13
  import {
13
14
  isCursorPluginLeftover,
14
15
  releaseSoleGate,
15
16
  withoutPusharyCursorHooks
16
- } from "../chunk-KCLWVCGN.js";
17
+ } from "../chunk-HLXGEOX3.js";
17
18
  import {
18
19
  HERMES_PIP_PACKAGE,
19
20
  readHermesStatus,
@@ -22,27 +23,25 @@ import {
22
23
  shortenHome,
23
24
  unregisterPluginLocation,
24
25
  vscodeSettingsTargets
25
- } from "../chunk-SGUGGHMC.js";
26
+ } from "../chunk-SH2KK2ED.js";
26
27
  import {
27
28
  planFxRemoval,
28
29
  removeInstructionBlock
29
- } from "../chunk-XDTYGS6R.js";
30
- import "../chunk-BDGKWUK2.js";
30
+ } from "../chunk-XA2RGGNR.js";
31
+ import "../chunk-Q7IEFI7V.js";
31
32
  import {
32
33
  disableDaemonService
33
- } from "../chunk-N2JP3RKP.js";
34
+ } from "../chunk-HBR6ZZHN.js";
34
35
  import "../chunk-XHKBHWLX.js";
35
- import {
36
- APPROVAL_SETTINGS_PATH
37
- } from "../chunk-ZUOIDI6M.js";
36
+ import "../chunk-EE357RIP.js";
38
37
  import {
39
38
  macAppKeepsMcpEntry,
40
39
  mcpServerBearer,
41
40
  pusharyKey,
42
41
  readMacAppAgentKey,
43
42
  setupReceiptKey
44
- } from "../chunk-YPZ4AE2R.js";
45
- import "../chunk-YODL2CJV.js";
43
+ } from "../chunk-2JTJZ7VI.js";
44
+ import "../chunk-CYGIJXAP.js";
46
45
  import {
47
46
  OPENCODE_PLUGIN_SIBLING,
48
47
  OPENCODE_PLUGIN_SIBLING_CONTENTS,
@@ -54,14 +53,14 @@ import {
54
53
  openCodePluginDir,
55
54
  openCodePluginFile,
56
55
  removeOpenCodeMcpServer
57
- } from "../chunk-U4OWRGYI.js";
56
+ } from "../chunk-O3RRQTTV.js";
58
57
  import {
59
58
  ansiPainter,
60
59
  useColor
61
60
  } from "../chunk-FO3MDD26.js";
62
61
  import {
63
62
  exitOnHelpFlag
64
- } from "../chunk-2MW4OHWI.js";
63
+ } from "../chunk-264EOGIK.js";
65
64
  import {
66
65
  compatibleConfigFile,
67
66
  compatibleInstructionsFile,
@@ -74,7 +73,7 @@ import {
74
73
  removePusharySettings,
75
74
  removePusharyToolPermissions,
76
75
  restoreClaudeMcpServer
77
- } from "../chunk-6TSEEKPL.js";
76
+ } from "../chunk-LOERK6N3.js";
78
77
  import {
79
78
  hookOwnerOf,
80
79
  isHookTakeoverReceipt,
@@ -82,42 +81,35 @@ import {
82
81
  resolveBridgeStub,
83
82
  restoreHookTakeover,
84
83
  restoreMcpServer
85
- } from "../chunk-TSFNX5J2.js";
84
+ } from "../chunk-OSOCONIE.js";
86
85
  import {
87
86
  removeGeminiSettings
88
- } from "../chunk-YGR5PBOF.js";
89
- import "../chunk-U26CAOZC.js";
90
- import "../chunk-OZVZGWER.js";
87
+ } from "../chunk-VFIZFKZY.js";
88
+ import "../chunk-NJK4MGXL.js";
89
+ import "../chunk-VICG46JC.js";
91
90
  import {
92
91
  rejectUnknownFlags
93
92
  } from "../chunk-GMXKITVA.js";
94
93
  import "../chunk-6ICPEJY5.js";
95
94
  import {
96
95
  CANDIDATE_RCS,
97
- findExportedKeyLines,
98
- isAdoptedMacAppKey,
99
96
  isDisabledExport,
100
- keyPrefix,
101
- readConfigFileKey,
102
- readKeySource,
103
- readMacAppKeyPrefix,
104
- removeClaudeAlias
105
- } from "../chunk-6IOLTFNP.js";
106
- import "../chunk-CW3QUV6B.js";
107
- import "../chunk-BDV4WDIA.js";
108
- import "../chunk-AGIO7SF5.js";
97
+ removeClaudeAlias,
98
+ shellProfileCandidates
99
+ } from "../chunk-U23XTMBF.js";
100
+ import "../chunk-KT5BH6GC.js";
101
+ import "../chunk-RFK2WN6S.js";
102
+ import "../chunk-ZVON5PCF.js";
109
103
  import "../chunk-POFBE6ZY.js";
110
- import "../chunk-6SFTI7LM.js";
111
- import {
112
- absoluteUrl
113
- } from "../chunk-NB2PY5JX.js";
114
- import "../chunk-WAKQYJ6T.js";
115
- import "../chunk-U2IEM5FF.js";
104
+ import "../chunk-RK7TDMQT.js";
105
+ import "../chunk-H2RD5EMR.js";
106
+ import "../chunk-2E6AWHV7.js";
107
+ import "../chunk-IS737HST.js";
116
108
  import "../chunk-7QLSKOSU.js";
117
109
  import {
118
110
  EXIT
119
111
  } from "../chunk-KZERVKTD.js";
120
- import "../chunk-5TLRS3AK.js";
112
+ import "../chunk-GXQVOKHJ.js";
121
113
  import {
122
114
  claudeJson,
123
115
  claudeMcpReceipt,
@@ -154,14 +146,14 @@ import {
154
146
  restoreCodexHookTrust,
155
147
  vscodePluginDir,
156
148
  vscodePluginMcp
157
- } from "../chunk-E7EOUEGQ.js";
149
+ } from "../chunk-NQICO3ES.js";
158
150
  import "../chunk-AQFEP65J.js";
159
151
  import {
160
152
  getBaseUrl
161
- } from "../chunk-75MJRC5I.js";
153
+ } from "../chunk-OY6NJWDD.js";
162
154
  import {
163
155
  NPX_LATEST_COMMAND
164
- } from "../chunk-TZWZVAMN.js";
156
+ } from "../chunk-QDKNLNCA.js";
165
157
  import {
166
158
  CLI_PACKAGE_NAMES,
167
159
  HOOK_COMPATIBLE_PROFILES,
@@ -173,7 +165,7 @@ import {
173
165
  globalRootFor,
174
166
  isValidApiKey,
175
167
  redactSecrets
176
- } from "../chunk-GFXZDU4V.js";
168
+ } from "../chunk-GM2IFDVF.js";
177
169
 
178
170
  // bin/pushary-clean.ts
179
171
  import { existsSync as existsSync6, readFileSync as readFileSync4, copyFileSync, readdirSync as readdirSync4 } from "fs";
@@ -599,43 +591,6 @@ var cleanCompatibleAgent = (profile, scope, io, home) => {
599
591
  };
600
592
  };
601
593
 
602
- // src/cli/clean-key-revocation.ts
603
- var isMacAppCurrentOrAdoptedKey = (key, keys) => key === keys.macAppKey || isAdoptedMacAppKey(key, keys.macAppKeyPrefix);
604
- var revocationFor = (keys) => (key) => isMacAppCurrentOrAdoptedKey(key, keys) ? { kind: "mac_app_key", keyPrefix: keyPrefix(key) } : { kind: "revoke", key };
605
- var validKeys = (keys) => [...new Set(keys)].filter((key) => key !== null && isValidApiKey(key));
606
- var environmentOnlyKey = (keys, written) => validKeys([keys.envKey]).filter((key) => !written.includes(key)).map((key) => ({ kind: "environment_only", keyPrefix: keyPrefix(key) }));
607
- var planCliKeyRevocations = (keys) => {
608
- const written = validKeys([keys.configKey, ...keys.profileKeys]);
609
- return [...written.map(revocationFor(keys)), ...environmentOnlyKey(keys, written)];
610
- };
611
- var runRevocation = async (revocation, run) => {
612
- if (revocation.kind !== "revoke") return revocation;
613
- if (run.dryRun) return { kind: "would_revoke", keyPrefix: keyPrefix(revocation.key) };
614
- return { kind: "attempted", keyPrefix: keyPrefix(revocation.key), attempt: await revokeOwnKey(revocation.key, run.baseUrl) };
615
- };
616
- var revokeCliKeys = async (revocations, run) => {
617
- const outcomes = [];
618
- for (const revocation of revocations) outcomes.push(await runRevocation(revocation, run));
619
- return outcomes;
620
- };
621
- var describeCliKeyRevocation = (outcome, baseUrl) => {
622
- const label = `API key ${outcome.keyPrefix}`;
623
- switch (outcome.kind) {
624
- case "would_revoke":
625
- return { tone: "skipped", line: `${label} (would revoke it on pushary.com)`, next: null };
626
- case "mac_app_key":
627
- return { tone: "skipped", line: `${label} (not revoked: it is the Pushary Mac app's key)`, next: null };
628
- case "environment_only":
629
- return { tone: "skipped", line: `${label} in PUSHARY_API_KEY (left alone: Pushary did not write it)`, next: null };
630
- case "attempted":
631
- return keyNoLongerAccepted(outcome.attempt) ? { tone: "done", line: `${label}: ${describeRevokeAttempt(outcome.attempt)}`, next: null } : {
632
- tone: "warning",
633
- line: `${label}: ${describeRevokeAttempt(outcome.attempt)}`,
634
- next: `It may still be valid. Revoke it at ${absoluteUrl(baseUrl, APPROVAL_SETTINGS_PATH)}`
635
- };
636
- }
637
- };
638
-
639
594
  // bin/pushary-clean.ts
640
595
  exitOnHelpFlag("clean");
641
596
  var paint = ansiPainter(() => useColor());
@@ -870,18 +825,11 @@ var printKeyRevocation = (report) => {
870
825
  console.log(` ${KEY_REVOCATION_ICONS[report.tone]} ${report.line}`);
871
826
  if (report.next) console.log(` ${dim(report.next)}`);
872
827
  };
873
- var revokeKeysThisCliHolds = async () => {
874
- const baseUrl = getBaseUrl();
875
- const source = readKeySource();
876
- const revocations = planCliKeyRevocations({
877
- configKey: readConfigFileKey(),
878
- profileKeys: findExportedKeyLines().map((line) => line.key),
879
- envKey: source.kind === "env" ? source.key : null,
880
- macAppKey: readMacAppAgentKey(),
881
- macAppKeyPrefix: readMacAppKeyPrefix()
882
- });
883
- const outcomes = await revokeCliKeys(revocations, { dryRun, baseUrl });
884
- for (const outcome of outcomes) printKeyRevocation(describeCliKeyRevocation(outcome, baseUrl));
828
+ var revokeKeysThisCliCreated = async () => {
829
+ const run = { dryRun, baseUrl: getBaseUrl() };
830
+ const revocations = planCliKeyRevocations(readCliHeldKeys(shellProfileCandidates()));
831
+ const outcomes = await revokeCliKeys(revocations, run);
832
+ for (const outcome of outcomes) printKeyRevocation(describeCliKeyRevocation(outcome, run));
885
833
  };
886
834
  var main = async () => {
887
835
  console.log();
@@ -961,7 +909,7 @@ var main = async () => {
961
909
  process.exit(EXIT.FAILED);
962
910
  }
963
911
  console.log(` ${check} Background service ${dim(did("uninstalled"))}`);
964
- if (everything) await revokeKeysThisCliHolds();
912
+ if (everything) await revokeKeysThisCliCreated();
965
913
  const claudeJson2 = readJson(CLAUDE_JSON);
966
914
  const keepClaudeMcp = macAppKeeps("claude_code", mcpServerBearer(claudeJson2?.mcpServers));
967
915
  const claudeHasPusharyEntry = () => Boolean(claudeJson2?.mcpServers?.pushary);
@@ -5,10 +5,10 @@ import {
5
5
  postLiveSession,
6
6
  postLiveSessionUntilAccepted,
7
7
  startLiveSessionHeartbeat
8
- } from "../chunk-DV26ZWUC.js";
8
+ } from "../chunk-T6TJA4RF.js";
9
9
  import {
10
10
  resolveProviderBinary
11
- } from "../chunk-UFGU7AK3.js";
11
+ } from "../chunk-KX776UXN.js";
12
12
  import "../chunk-RIVNNBEK.js";
13
13
  import {
14
14
  SESSION_IDLE_TIMEOUT_MS,
@@ -16,50 +16,50 @@ import {
16
16
  idleDeadlinePassed,
17
17
  startProcessOwnership,
18
18
  withSpawnProcessOwnership
19
- } from "../chunk-KH2EDRJQ.js";
20
- import "../chunk-E3FSKKTJ.js";
21
- import "../chunk-GNQZY4GL.js";
19
+ } from "../chunk-35U2QHH2.js";
20
+ import "../chunk-RIBIEQHU.js";
21
+ import "../chunk-3WRJU7KN.js";
22
22
  import {
23
23
  transcriptsEnabled
24
- } from "../chunk-WE2RVY7V.js";
24
+ } from "../chunk-JDWOK6PE.js";
25
25
  import {
26
26
  spawnClaude
27
27
  } from "../chunk-XHKBHWLX.js";
28
28
  import "../chunk-6ICPEJY5.js";
29
- import "../chunk-6IOLTFNP.js";
29
+ import "../chunk-U23XTMBF.js";
30
30
  import {
31
31
  isAskUserResponse,
32
32
  isDecisionStopped,
33
33
  isWaitForAnswerResponse,
34
34
  withdrawQuestion,
35
35
  writeDegraded
36
- } from "../chunk-AGIO7SF5.js";
36
+ } from "../chunk-ZVON5PCF.js";
37
37
  import "../chunk-POFBE6ZY.js";
38
38
  import {
39
39
  callMcpTool
40
- } from "../chunk-6SFTI7LM.js";
41
- import "../chunk-NB2PY5JX.js";
42
- import "../chunk-WAKQYJ6T.js";
40
+ } from "../chunk-RK7TDMQT.js";
41
+ import "../chunk-H2RD5EMR.js";
42
+ import "../chunk-2E6AWHV7.js";
43
43
  import {
44
44
  getMachineId
45
- } from "../chunk-U2IEM5FF.js";
45
+ } from "../chunk-IS737HST.js";
46
46
  import "../chunk-7QLSKOSU.js";
47
47
  import "../chunk-KZERVKTD.js";
48
- import "../chunk-5TLRS3AK.js";
49
- import "../chunk-E7EOUEGQ.js";
48
+ import "../chunk-GXQVOKHJ.js";
49
+ import "../chunk-NQICO3ES.js";
50
50
  import "../chunk-AQFEP65J.js";
51
51
  import {
52
52
  getApiKey,
53
53
  getBaseUrl
54
- } from "../chunk-75MJRC5I.js";
55
- import "../chunk-TZWZVAMN.js";
54
+ } from "../chunk-OY6NJWDD.js";
55
+ import "../chunk-QDKNLNCA.js";
56
56
  import {
57
57
  elicitationContent,
58
58
  parseAgentQuestion,
59
59
  parseAgentQuestionAnswers,
60
60
  planElicitationAsk,
61
61
  readElicitationFields
62
- } from "../chunk-GFXZDU4V.js";
62
+ } from "../chunk-GM2IFDVF.js";
63
63
 
64
64
  // bin/pushary-codex-bridge.ts
65
65
  import { existsSync } from "fs";