@pushary/agent-hooks 1.9.80 → 1.9.82

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 (132) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +4 -4
  3. package/data/SKILL.md +12 -16
  4. package/data/cursor-plugin/README.md +1 -1
  5. package/data/cursor-plugin/skills/pushary/SKILL.md +11 -15
  6. package/data/vscode-plugin/README.md +1 -1
  7. package/data/vscode-plugin/skills/pushary/SKILL.md +11 -15
  8. package/dist/{api-FPA2PPXY.js → api-TZO5ACOS.js} +11 -11
  9. package/dist/bin/pushary-bell-hook.js +26 -26
  10. package/dist/bin/pushary-bell.js +11 -11
  11. package/dist/bin/pushary-claude.js +27 -27
  12. package/dist/bin/pushary-clean.js +34 -34
  13. package/dist/bin/pushary-codex-bridge.js +22 -22
  14. package/dist/bin/pushary-codex-hook.js +31 -31
  15. package/dist/bin/pushary-codex-session.js +8 -8
  16. package/dist/bin/pushary-codex.js +14 -14
  17. package/dist/bin/pushary-connect.js +27 -27
  18. package/dist/bin/pushary-cowork.js +6 -6
  19. package/dist/bin/pushary-daemon.js +39 -39
  20. package/dist/bin/pushary-disconnect.js +26 -26
  21. package/dist/bin/pushary-display-hook.js +17 -17
  22. package/dist/bin/pushary-doctor.js +48 -44
  23. package/dist/bin/pushary-elicitation-hook.js +26 -26
  24. package/dist/bin/pushary-gemini-bridge.js +16 -16
  25. package/dist/bin/pushary-gemini-hook.js +28 -28
  26. package/dist/bin/pushary-hook.js +30 -30
  27. package/dist/bin/pushary-login.js +21 -21
  28. package/dist/bin/pushary-logout.js +25 -25
  29. package/dist/bin/pushary-mcp.js +12 -12
  30. package/dist/bin/pushary-mode.js +16 -16
  31. package/dist/bin/pushary-notification-hook.js +25 -25
  32. package/dist/bin/pushary-opencode-hook.js +27 -27
  33. package/dist/bin/pushary-permission-denied-hook.js +30 -30
  34. package/dist/bin/pushary-permission-hook.js +30 -30
  35. package/dist/bin/pushary-post-hook.js +25 -25
  36. package/dist/bin/pushary-prompt-hook.js +25 -25
  37. package/dist/bin/pushary-session-end-hook.js +27 -27
  38. package/dist/bin/pushary-session-start-hook.js +35 -35
  39. package/dist/bin/pushary-setup.js +54 -59
  40. package/dist/bin/pushary-stats.js +6 -6
  41. package/dist/bin/pushary-status.js +32 -32
  42. package/dist/bin/pushary-stop-hook.js +25 -25
  43. package/dist/bin/pushary-stopfailure-hook.js +25 -25
  44. package/dist/bin/pushary-suggestions.js +16 -16
  45. package/dist/bin/pushary-transcript-register.js +17 -17
  46. package/dist/bin/pushary-transcripts.js +19 -19
  47. package/dist/bin/pushary-upgrade.js +40 -40
  48. package/dist/bin/pushary-wait.js +16 -16
  49. package/dist/bin/pushary.js +8 -8
  50. package/dist/{chunk-IRE7HPNI.js → chunk-2BJZFA7X.js} +7 -5
  51. package/dist/{chunk-PJRXYNXG.js → chunk-2TEX3APZ.js} +5 -5
  52. package/dist/{chunk-OJS32QPK.js → chunk-3BFCJZBU.js} +1 -1
  53. package/dist/{chunk-N3DOT42Y.js → chunk-3UBYG4G7.js} +6 -6
  54. package/dist/{chunk-TSCACSAR.js → chunk-3V6G2GBJ.js} +6 -6
  55. package/dist/{chunk-DFW2JKHX.js → chunk-4S5XVFDV.js} +1 -1
  56. package/dist/{chunk-WJVQOAZY.js → chunk-4TR4G7A4.js} +1 -1
  57. package/dist/{chunk-3G2D5NAG.js → chunk-5LLZSX7I.js} +3 -3
  58. package/dist/{chunk-4OXYED6O.js → chunk-5TMGEQAC.js} +4 -4
  59. package/dist/{chunk-HJZDJS63.js → chunk-6224ENW3.js} +3 -3
  60. package/dist/{chunk-B67R6ZCW.js → chunk-6355HHSR.js} +2 -2
  61. package/dist/{chunk-FZJON3RK.js → chunk-6L2U3TP3.js} +20 -19
  62. package/dist/{chunk-YEPXSGFC.js → chunk-72CIQCBA.js} +9 -6
  63. package/dist/{chunk-Z4PNECON.js → chunk-AM3H6HWG.js} +1 -1
  64. package/dist/{chunk-7TIDWBXF.js → chunk-APSYBSMG.js} +14 -12
  65. package/dist/{chunk-BWE52JRG.js → chunk-AXE2ZOKS.js} +2 -2
  66. package/dist/{chunk-ZYFZAZCN.js → chunk-C6FQ4YST.js} +2 -2
  67. package/dist/{chunk-3LJU2L5S.js → chunk-CV56MBIZ.js} +9 -8
  68. package/dist/{chunk-3GZRNHH5.js → chunk-CXZAKS7S.js} +4 -4
  69. package/dist/{chunk-SNQ5HQHE.js → chunk-D3QGBMO3.js} +2 -2
  70. package/dist/{chunk-EU67IKIQ.js → chunk-DJILSCSU.js} +3 -3
  71. package/dist/{chunk-IYCYKG2B.js → chunk-DS5BR4K6.js} +2 -2
  72. package/dist/{chunk-YJGWHP2I.js → chunk-DX45XQ36.js} +3 -3
  73. package/dist/{chunk-IPIJY4TI.js → chunk-ER4UCECJ.js} +1 -1
  74. package/dist/{chunk-262U6MMI.js → chunk-ESRKYHWE.js} +2 -2
  75. package/dist/{chunk-FNBGGKRK.js → chunk-FHPSVTS5.js} +9 -9
  76. package/dist/{chunk-T2H6BCRY.js → chunk-FJZSJZCT.js} +3 -3
  77. package/dist/{chunk-L3VBP627.js → chunk-G5BYSS6C.js} +6 -6
  78. package/dist/{chunk-VP473NXT.js → chunk-GUI2NYCX.js} +5 -5
  79. package/dist/{chunk-SGG5GNVW.js → chunk-GUM3WG4B.js} +6 -6
  80. package/dist/{chunk-LN32FXTF.js → chunk-I4RNLK5G.js} +4 -4
  81. package/dist/{chunk-PE6JUMI2.js → chunk-IEAABGST.js} +7 -6
  82. package/dist/{chunk-TDW5LI6P.js → chunk-IXVMMDIG.js} +3 -3
  83. package/dist/{chunk-ITVTU4RZ.js → chunk-J4TQYGHU.js} +5 -5
  84. package/dist/{chunk-LK343VAG.js → chunk-JNCD2ZG3.js} +4 -4
  85. package/dist/{chunk-5HA42EV4.js → chunk-JTYZEP4Q.js} +1 -1
  86. package/dist/{chunk-ZJGIJDWP.js → chunk-JXE4UQFJ.js} +3 -3
  87. package/dist/{chunk-LIXHCI4G.js → chunk-L77YWBMK.js} +7 -7
  88. package/dist/{chunk-OSXIMNMJ.js → chunk-LGWTITVK.js} +1 -1
  89. package/dist/{chunk-S5MRKUSX.js → chunk-LNSCANYY.js} +3 -3
  90. package/dist/{chunk-7R5ZKOQ4.js → chunk-M5XNFUXN.js} +1 -1
  91. package/dist/{chunk-3KQM5AKY.js → chunk-N3C3D4AV.js} +4 -4
  92. package/dist/{chunk-3BPSCYOE.js → chunk-NEWGYFKC.js} +7 -7
  93. package/dist/{chunk-GXW43S4A.js → chunk-NPBPH7KI.js} +2 -2
  94. package/dist/{chunk-QNPIHZFM.js → chunk-O6T3CLWT.js} +3 -3
  95. package/dist/{chunk-UAADLSK5.js → chunk-OIW3JAWH.js} +5 -5
  96. package/dist/{chunk-AFCKBLEG.js → chunk-ONUAAXAW.js} +1 -1
  97. package/dist/{chunk-MJNZBNTN.js → chunk-OXKVR2FP.js} +16 -10
  98. package/dist/{chunk-WQNHWWVW.js → chunk-OXTRF7CP.js} +1 -1
  99. package/dist/{chunk-A2OAJ7CS.js → chunk-PJ26BODT.js} +1 -1
  100. package/dist/{chunk-6VLSVB2C.js → chunk-QJJJENT2.js} +5 -5
  101. package/dist/{chunk-KHLWYQK7.js → chunk-RL2KE6HG.js} +13 -13
  102. package/dist/{chunk-HMLURCXV.js → chunk-RRMRP62I.js} +6 -6
  103. package/dist/{chunk-UCZZX5JH.js → chunk-S2DLTWFG.js} +4 -4
  104. package/dist/{chunk-IWYGHJY6.js → chunk-TKFDPYXS.js} +4 -4
  105. package/dist/{chunk-J5BCHHCB.js → chunk-TO77OYLM.js} +1 -1
  106. package/dist/{chunk-35M6YE6T.js → chunk-TTTK44RK.js} +3 -5
  107. package/dist/{chunk-24FQPJOZ.js → chunk-UB7VUSSX.js} +3 -3
  108. package/dist/{chunk-7QYERUTD.js → chunk-UOUUTDWF.js} +85 -45
  109. package/dist/{chunk-RNAFUXEK.js → chunk-UYTPCZ4M.js} +4 -4
  110. package/dist/{chunk-NOQGCGOR.js → chunk-VHLRXIMC.js} +1 -1
  111. package/dist/{chunk-XU2FL4B6.js → chunk-W3VRQEL3.js} +2 -2
  112. package/dist/{chunk-HGCUZQUL.js → chunk-WG67W43Y.js} +0 -1
  113. package/dist/{chunk-4WCPDCKA.js → chunk-WLOVGZ7R.js} +2 -2
  114. package/dist/{chunk-DN6QYNNC.js → chunk-WUS2LFTM.js} +10 -10
  115. package/dist/{chunk-DLPFYJ7G.js → chunk-X2P3O4PX.js} +1 -1
  116. package/dist/{chunk-QBI4KSTQ.js → chunk-YAMNJXCD.js} +2 -2
  117. package/dist/{chunk-EUZ73S73.js → chunk-Z5HLACZT.js} +4 -4
  118. package/dist/{chunk-QTOLNRET.js → chunk-ZVU6WMMU.js} +10 -0
  119. package/dist/{codex-app-cards-switch-AT6X3X6U.js → codex-app-cards-switch-3FAIEEB2.js} +12 -12
  120. package/dist/{codex-desktop-launch-4ELF22QM.js → codex-desktop-launch-LHMHRVGF.js} +1 -1
  121. package/dist/{codex-session-launch-QEVWHTU7.js → codex-session-launch-MXUBSTL2.js} +19 -19
  122. package/dist/{config-PXISW4O5.js → config-MZDRETL2.js} +3 -3
  123. package/dist/{global-upgrade-H3S4KQ26.js → global-upgrade-ZDENZA42.js} +11 -11
  124. package/dist/{identity-FB7QFMEZ.js → identity-YZRDJOGY.js} +5 -5
  125. package/dist/{live-capabilities-27LDDOMC.js → live-capabilities-KSQDWVT6.js} +6 -6
  126. package/dist/{paths-URGGQMFD.js → paths-DYZZBVYI.js} +4 -4
  127. package/dist/{reapply-A6OKNS24.js → reapply-L3AI5KJH.js} +28 -28
  128. package/dist/src/index.js +29 -29
  129. package/dist/{upgrade-lock-65A4XSMV.js → upgrade-lock-X7F2OFYB.js} +5 -5
  130. package/dist/usage-TKZALYXF.js +11 -0
  131. package/package.json +1 -1
  132. package/dist/usage-FZTPRQRP.js +0 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.82
4
+
5
+ - The background service that starts sessions from your phone now survives `brew upgrade node`. On a Mac or Linux computer where Node.js comes from Homebrew, it was pinned to Homebrew's versioned Node.js folder, which the upgrade deletes. Setup, `pushary upgrade` and `pushary daemon install` now pin it to Homebrew's stable link, and `pushary doctor` says when a service is still pinned to a version folder.
6
+ - Windows: when Node.js is installed in Program Files, as the official installer and winget do, Codex and OpenCode hooks now start it by its full path, so they no longer depend on Node.js being on the agent's PATH. Other agents and other Windows setups keep the hooks they had.
7
+ - Windows: Claude Code hooks keep working after `pushary upgrade`, an automatic update, or a Claude Code update. Those rewrote the hooks with the full path of the npm folder, which Git Bash, where Claude Code runs hooks, cannot read, so every Pushary hook in Claude Code failed silently. They now keep the plain names setup writes. If Claude Code on Windows stopped reaching your phone, run `npx.cmd pushary@latest setup` once.
8
+ - `pushary doctor` also checks that the Node.js a hook names still exists.
9
+
10
+ ## 1.9.81
11
+
12
+ - While setup waits for your phone, it no longer suggests `--connect browser`. That sign-in needs a terminal, so an AI agent running setup for you got "No API key" when it followed the hint. The Ctrl+C screen now offers the app download, or a key you already have. `--connect browser` and `--connect web` still work for scripts that use them, and a mistyped `--connect` value now suggests only `app` or `none`.
13
+ - `setup --help` now says what happens without a terminal: setup asks nothing, configures the agents it detects and takes every default. It used to say such runs need `--agents` or `--yes`, which was not true.
14
+ - The bundled Pushary skill tells agents to run setup in the background and show you the link while it waits, and to run `doctor --roundtrip` afterwards, because setup run by an agent sends only a test notification. It also names the approval modes as the app does and says new workspaces start on Always.
15
+
3
16
  ## 1.9.80
4
17
 
5
18
  - Setup no longer freezes while it installs the Pushary skill through skills.sh. The install takes about as long as before, but the terminal stays responsive, and each agent still gets its own install, so skills.sh records them as before.
package/README.md CHANGED
@@ -91,7 +91,7 @@ pairing.
91
91
  For CI or another non-interactive install, pass an existing key explicitly:
92
92
 
93
93
  ```bash
94
- npx pushary@latest setup --key pk_xxx.sk_xxx --skip-phone
94
+ npx pushary@latest setup --key pk_xxx.xxx --skip-phone
95
95
  ```
96
96
 
97
97
  Verify it worked:
@@ -229,9 +229,9 @@ Run `pushary <command> --help` for one command's options.
229
229
 
230
230
  ### Non-interactive setup
231
231
 
232
- `setup` asks which agents you use, so a run with no terminal on stdin needs to be
233
- told instead. `--agents` or `--yes` does that; without either, setup takes the
234
- defaults rather than waiting for a keypress that can never arrive.
232
+ `setup` asks which agents you use at a terminal. With no terminal on stdin it asks
233
+ nothing: it configures the agents it detects and takes every default. Pass
234
+ `--agents` to choose the agents yourself.
235
235
 
236
236
  ```bash
237
237
  # Everything detected on this machine, no prompts
package/data/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- version: 0.12.0
3
+ version: 0.12.1
4
4
  description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a human and nobody is 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, do not wait for me, or wants a long task to run unattended. Send alerts when tasks finish or fail, ask questions (yes/no, multiple choice, or free text) via push, and get answers from their connected devices. Use these tools proactively - do not wait for the user to ask for notifications. Every question and answer is recorded, so an unattended run stays reviewable afterwards. Works with Claude Code, Codex, Cursor, VS Code, 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.
5
5
  metadata:
6
6
  hermes:
@@ -301,7 +301,9 @@ npx pushary@latest setup
301
301
 
302
302
  Setup pairs first and configures MCP, hooks, permissions and the skill only once pairing succeeds. Until someone completes the steps below, nothing is written and this machine has no Pushary. Treat pairing as the task, not as a prompt to wait out.
303
303
 
304
- It prints a QR, a short link under it, a fingerprint, and then waits about 15 minutes.
304
+ It prints a QR, a short link, a fingerprint, and then waits about 15 minutes.
305
+
306
+ **Run it in the background.** Fifteen minutes is longer than a foreground command may run in most agents, and a killed setup kills the pairing code with it. Start setup as a background process that writes to a log, read the link, QR and fingerprint from that log, show them to the user, and keep checking the log until setup exits. Start while the user can still read your messages: until they approve, nothing is configured and you have no other way to reach them.
305
307
 
306
308
  **Do not summarise that output. Show it, and walk the user through all four steps:**
307
309
 
@@ -312,21 +314,15 @@ It prints a QR, a short link under it, a fingerprint, and then waits about 15 mi
312
314
 
313
315
  Never ask the user for an API key, and never send them to a signup page first. Both are the old flow and both are worse.
314
316
 
315
- If setup exits without pairing, nothing was configured. Say that plainly and offer the two fallbacks below rather than pretending the tools are available.
317
+ If setup exits without pairing, nothing was configured. Say that plainly and offer the fallback below rather than pretending the tools are available.
316
318
 
317
319
  If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
318
320
 
319
- No app on their phone yet? They can get it at https://pushary.com/download. Or answer through the browser instead:
320
-
321
- ```bash
322
- npx pushary@latest setup --connect browser
323
- ```
324
-
325
- This is web push, not a login tab. It prints a QR for the user's own subscribe page, and it waits for a browser on that page to subscribe. On iOS the user must first add that page to the Home Screen, because iOS sends web push only from an installed page.
321
+ No app on their phone yet? They can get it at https://pushary.com/download while setup keeps waiting. If the code expired, run setup again for a fresh one.
326
322
 
327
323
  Manual MCP configuration also works, but it needs a key, so the user signs up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copies the key from the dashboard. Prefer `setup`: it needs neither.
328
324
 
329
- For CLI-owned setup with Node/npm and a CLI credential, explicitly test a synthetic question and answer with:
325
+ When you run setup, it sends only a test notification, because it cannot tell whether the user is there to answer. Right after it finishes, while the user still has their phone in hand, test a synthetic question and answer. For CLI-owned setup with Node/npm and a CLI credential:
330
326
 
331
327
  ```bash
332
328
  npx pushary@latest doctor --roundtrip
@@ -607,14 +603,14 @@ else:
607
603
 
608
604
  If the user answers in chat before the push response arrives, call `cancel_question` before acting. If it returns `handoffAction: "stop"`, stop. Otherwise, if it returns false, poll once for 1 second and honor any phone answer that won the race.
609
605
 
610
- **How long `ask_user` blocks.** The user sets the delivery mode for their site. You do not set it. The mode decides how long the call waits, and whether it waits at all.
606
+ **How long `ask_user` blocks.** The user sets the delivery mode for their site. You do not set it. The mode decides how long the call waits, and whether it waits at all. New workspaces start on **Always**; the user can pick any of the four in the app.
611
607
 
612
608
  | Mode | The phone | The call |
613
609
  |---|---|---|
614
- | **When I'm out** (`push_first`, default) | Asked only when the user is away from the terminal and the Mac | Waits for the push-first window. 20 seconds by default. |
615
- | **Every time** (`push_only`) | Always asked | Waits for the policy timeout. |
616
- | **Updates** (`notify_only`) | Told, not asked | Returns at once with `answered: false`. Decide in the current client. |
617
- | **Terminal** (`terminal_only`) | Nothing is sent | Returns at once with `answered: false`. |
610
+ | **When away** (`push_first`) | Asked only when the user is away from the terminal and the Mac | Waits for the push-first window. 20 seconds by default. |
611
+ | **Always** (`push_only`) | Always asked | Waits for the policy timeout. |
612
+ | **Alert only** (`notify_only`) | Told, not asked | Returns at once with `answered: false`. Decide in the current client. |
613
+ | **In agent** (`terminal_only`) | Nothing is sent | Returns at once with `answered: false`. |
618
614
 
619
615
  Always read `answered`. Never assume the call waited. Pass `timeoutMs` only when you want a shorter wait than the site policy.
620
616
 
@@ -57,7 +57,7 @@ The plugin and CLI installer use the same decision service. Manual MCP-only conf
57
57
  The plugin reads your key from the `PUSHARY_API_KEY` environment variable. Get a key at https://pushary.com, then add it to your shell profile:
58
58
 
59
59
  ```bash
60
- echo 'export PUSHARY_API_KEY="pk_xxx.sk_xxx"' >> ~/.zshrc
60
+ echo 'export PUSHARY_API_KEY="pk_xxx.xxx"' >> ~/.zshrc
61
61
  source ~/.zshrc
62
62
  ```
63
63
 
@@ -294,7 +294,9 @@ npx pushary@latest setup
294
294
 
295
295
  Setup pairs first and configures MCP, hooks, permissions and the skill only once pairing succeeds. Until someone completes the steps below, nothing is written and this machine has no Pushary. Treat pairing as the task, not as a prompt to wait out.
296
296
 
297
- It prints a QR, a short link under it, a fingerprint, and then waits about 15 minutes.
297
+ It prints a QR, a short link, a fingerprint, and then waits about 15 minutes.
298
+
299
+ **Run it in the background.** Fifteen minutes is longer than a foreground command may run in most agents, and a killed setup kills the pairing code with it. Start setup as a background process that writes to a log, read the link, QR and fingerprint from that log, show them to the user, and keep checking the log until setup exits. Start while the user can still read your messages: until they approve, nothing is configured and you have no other way to reach them.
298
300
 
299
301
  **Do not summarise that output. Show it, and walk the user through all four steps:**
300
302
 
@@ -305,21 +307,15 @@ It prints a QR, a short link under it, a fingerprint, and then waits about 15 mi
305
307
 
306
308
  Never ask the user for an API key, and never send them to a signup page first. Both are the old flow and both are worse.
307
309
 
308
- If setup exits without pairing, nothing was configured. Say that plainly and offer the two fallbacks below rather than pretending the tools are available.
310
+ If setup exits without pairing, nothing was configured. Say that plainly and offer the fallback below rather than pretending the tools are available.
309
311
 
310
312
  If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
311
313
 
312
- No app on their phone yet? They can get it at https://pushary.com/download. Or answer through the browser instead:
313
-
314
- ```bash
315
- npx pushary@latest setup --connect browser
316
- ```
317
-
318
- This is web push, not a login tab. It prints a QR for the user's own subscribe page, and it waits for a browser on that page to subscribe. On iOS the user must first add that page to the Home Screen, because iOS sends web push only from an installed page.
314
+ No app on their phone yet? They can get it at https://pushary.com/download while setup keeps waiting. If the code expired, run setup again for a fresh one.
319
315
 
320
316
  Manual MCP configuration also works, but it needs a key, so the user signs up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copies the key from the dashboard. Prefer `setup`: it needs neither.
321
317
 
322
- For CLI-owned setup with Node/npm and a CLI credential, explicitly test a synthetic question and answer with:
318
+ When you run setup, it sends only a test notification, because it cannot tell whether the user is there to answer. Right after it finishes, while the user still has their phone in hand, test a synthetic question and answer. For CLI-owned setup with Node/npm and a CLI credential:
323
319
 
324
320
  ```bash
325
321
  npx pushary@latest doctor --roundtrip
@@ -600,14 +596,14 @@ else:
600
596
 
601
597
  If the user answers in chat before the push response arrives, call `cancel_question` before acting. If it returns `handoffAction: "stop"`, stop. Otherwise, if it returns false, poll once for 1 second and honor any phone answer that won the race.
602
598
 
603
- **How long `ask_user` blocks.** The user sets the delivery mode for their site. You do not set it. The mode decides how long the call waits, and whether it waits at all.
599
+ **How long `ask_user` blocks.** The user sets the delivery mode for their site. You do not set it. The mode decides how long the call waits, and whether it waits at all. New workspaces start on **Always**; the user can pick any of the four in the app.
604
600
 
605
601
  | Mode | The phone | The call |
606
602
  |---|---|---|
607
- | **When I'm out** (`push_first`, default) | Asked only when the user is away from the terminal and the Mac | Waits for the push-first window. 20 seconds by default. |
608
- | **Every time** (`push_only`) | Always asked | Waits for the policy timeout. |
609
- | **Updates** (`notify_only`) | Told, not asked | Returns at once with `answered: false`. Decide in the current client. |
610
- | **Terminal** (`terminal_only`) | Nothing is sent | Returns at once with `answered: false`. |
603
+ | **When away** (`push_first`) | Asked only when the user is away from the terminal and the Mac | Waits for the push-first window. 20 seconds by default. |
604
+ | **Always** (`push_only`) | Always asked | Waits for the policy timeout. |
605
+ | **Alert only** (`notify_only`) | Told, not asked | Returns at once with `answered: false`. Decide in the current client. |
606
+ | **In agent** (`terminal_only`) | Nothing is sent | Returns at once with `answered: false`. |
611
607
 
612
608
  Always read `answered`. Never assume the call waited. Pass `timeoutMs` only when you want a shorter wait than the site policy.
613
609
 
@@ -73,7 +73,7 @@ The source plugin and CLI installer use the same decision service. The Mac app c
73
73
  The plugin reads your key from the `PUSHARY_API_KEY` environment variable, falling back to the key `pushary setup` writes to `~/.pushary/config.json`.
74
74
 
75
75
  ```bash
76
- echo 'export PUSHARY_API_KEY="pk_xxx.sk_xxx"' >> ~/.zshrc
76
+ echo 'export PUSHARY_API_KEY="pk_xxx.xxx"' >> ~/.zshrc
77
77
  source ~/.zshrc
78
78
  ```
79
79
 
@@ -294,7 +294,9 @@ npx pushary@latest setup
294
294
 
295
295
  Setup pairs first and configures MCP, hooks, permissions and the skill only once pairing succeeds. Until someone completes the steps below, nothing is written and this machine has no Pushary. Treat pairing as the task, not as a prompt to wait out.
296
296
 
297
- It prints a QR, a short link under it, a fingerprint, and then waits about 15 minutes.
297
+ It prints a QR, a short link, a fingerprint, and then waits about 15 minutes.
298
+
299
+ **Run it in the background.** Fifteen minutes is longer than a foreground command may run in most agents, and a killed setup kills the pairing code with it. Start setup as a background process that writes to a log, read the link, QR and fingerprint from that log, show them to the user, and keep checking the log until setup exits. Start while the user can still read your messages: until they approve, nothing is configured and you have no other way to reach them.
298
300
 
299
301
  **Do not summarise that output. Show it, and walk the user through all four steps:**
300
302
 
@@ -305,21 +307,15 @@ It prints a QR, a short link under it, a fingerprint, and then waits about 15 mi
305
307
 
306
308
  Never ask the user for an API key, and never send them to a signup page first. Both are the old flow and both are worse.
307
309
 
308
- If setup exits without pairing, nothing was configured. Say that plainly and offer the two fallbacks below rather than pretending the tools are available.
310
+ If setup exits without pairing, nothing was configured. Say that plainly and offer the fallback below rather than pretending the tools are available.
309
311
 
310
312
  If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
311
313
 
312
- No app on their phone yet? They can get it at https://pushary.com/download. Or answer through the browser instead:
313
-
314
- ```bash
315
- npx pushary@latest setup --connect browser
316
- ```
317
-
318
- This is web push, not a login tab. It prints a QR for the user's own subscribe page, and it waits for a browser on that page to subscribe. On iOS the user must first add that page to the Home Screen, because iOS sends web push only from an installed page.
314
+ No app on their phone yet? They can get it at https://pushary.com/download while setup keeps waiting. If the code expired, run setup again for a fresh one.
319
315
 
320
316
  Manual MCP configuration also works, but it needs a key, so the user signs up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copies the key from the dashboard. Prefer `setup`: it needs neither.
321
317
 
322
- For CLI-owned setup with Node/npm and a CLI credential, explicitly test a synthetic question and answer with:
318
+ When you run setup, it sends only a test notification, because it cannot tell whether the user is there to answer. Right after it finishes, while the user still has their phone in hand, test a synthetic question and answer. For CLI-owned setup with Node/npm and a CLI credential:
323
319
 
324
320
  ```bash
325
321
  npx pushary@latest doctor --roundtrip
@@ -600,14 +596,14 @@ else:
600
596
 
601
597
  If the user answers in chat before the push response arrives, call `cancel_question` before acting. If it returns `handoffAction: "stop"`, stop. Otherwise, if it returns false, poll once for 1 second and honor any phone answer that won the race.
602
598
 
603
- **How long `ask_user` blocks.** The user sets the delivery mode for their site. You do not set it. The mode decides how long the call waits, and whether it waits at all.
599
+ **How long `ask_user` blocks.** The user sets the delivery mode for their site. You do not set it. The mode decides how long the call waits, and whether it waits at all. New workspaces start on **Always**; the user can pick any of the four in the app.
604
600
 
605
601
  | Mode | The phone | The call |
606
602
  |---|---|---|
607
- | **When I'm out** (`push_first`, default) | Asked only when the user is away from the terminal and the Mac | Waits for the push-first window. 20 seconds by default. |
608
- | **Every time** (`push_only`) | Always asked | Waits for the policy timeout. |
609
- | **Updates** (`notify_only`) | Told, not asked | Returns at once with `answered: false`. Decide in the current client. |
610
- | **Terminal** (`terminal_only`) | Nothing is sent | Returns at once with `answered: false`. |
603
+ | **When away** (`push_first`) | Asked only when the user is away from the terminal and the Mac | Waits for the push-first window. 20 seconds by default. |
604
+ | **Always** (`push_only`) | Always asked | Waits for the policy timeout. |
605
+ | **Alert only** (`notify_only`) | Told, not asked | Returns at once with `answered: false`. Decide in the current client. |
606
+ | **In agent** (`terminal_only`) | Nothing is sent | Returns at once with `answered: false`. |
611
607
 
612
608
  Always read `answered`. Never assume the call waited. Pass `timeoutMs` only when you want a shorter wait than the site policy.
613
609
 
@@ -17,23 +17,23 @@ import {
17
17
  waitForQuestion,
18
18
  waitsForThePhone,
19
19
  withdrawQuestion
20
- } from "./chunk-UAADLSK5.js";
20
+ } from "./chunk-OIW3JAWH.js";
21
21
  import "./chunk-POFBE6ZY.js";
22
- import "./chunk-EUZ73S73.js";
23
- import "./chunk-S5MRKUSX.js";
24
- import "./chunk-LK343VAG.js";
25
- import "./chunk-QBI4KSTQ.js";
26
- import "./chunk-7QYERUTD.js";
27
- import "./chunk-IRE7HPNI.js";
28
- import "./chunk-AFCKBLEG.js";
22
+ import "./chunk-Z5HLACZT.js";
23
+ import "./chunk-LNSCANYY.js";
24
+ import "./chunk-JNCD2ZG3.js";
25
+ import "./chunk-YAMNJXCD.js";
26
+ import "./chunk-UOUUTDWF.js";
27
+ import "./chunk-2BJZFA7X.js";
28
+ import "./chunk-ONUAAXAW.js";
29
29
  import "./chunk-PPY5N2E6.js";
30
30
  import "./chunk-KZERVKTD.js";
31
- import "./chunk-35M6YE6T.js";
32
- import "./chunk-QTOLNRET.js";
31
+ import "./chunk-TTTK44RK.js";
32
+ import "./chunk-ZVU6WMMU.js";
33
33
  import {
34
34
  DECISION_STOP_REASON,
35
35
  UNVERIFIABLE_APPROVAL_REASON
36
- } from "./chunk-HGCUZQUL.js";
36
+ } from "./chunk-WG67W43Y.js";
37
37
  import "./chunk-MLKGABMK.js";
38
38
  export {
39
39
  ABANDONED_WAIT,
@@ -1,41 +1,41 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-OSXIMNMJ.js";
4
+ } from "../chunk-LGWTITVK.js";
5
5
  import {
6
6
  readHookInput
7
- } from "../chunk-3BPSCYOE.js";
8
- import "../chunk-DN6QYNNC.js";
9
- import "../chunk-NOQGCGOR.js";
7
+ } from "../chunk-NEWGYFKC.js";
8
+ import "../chunk-WUS2LFTM.js";
9
+ import "../chunk-VHLRXIMC.js";
10
10
  import "../chunk-MHUKYYYR.js";
11
- import "../chunk-4OXYED6O.js";
12
- import "../chunk-FZJON3RK.js";
13
- import "../chunk-PE6JUMI2.js";
14
- import "../chunk-ZJGIJDWP.js";
15
- import "../chunk-DFW2JKHX.js";
11
+ import "../chunk-5TMGEQAC.js";
12
+ import "../chunk-6L2U3TP3.js";
13
+ import "../chunk-IEAABGST.js";
14
+ import "../chunk-JXE4UQFJ.js";
15
+ import "../chunk-4S5XVFDV.js";
16
16
  import "../chunk-NMUI3ZWG.js";
17
- import "../chunk-XU2FL4B6.js";
17
+ import "../chunk-W3VRQEL3.js";
18
18
  import "../chunk-XMSDA5WA.js";
19
- import "../chunk-WQNHWWVW.js";
19
+ import "../chunk-OXTRF7CP.js";
20
20
  import "../chunk-XHKBHWLX.js";
21
- import "../chunk-3GZRNHH5.js";
22
- import "../chunk-FNBGGKRK.js";
23
- import "../chunk-7R5ZKOQ4.js";
24
- import "../chunk-UAADLSK5.js";
21
+ import "../chunk-CXZAKS7S.js";
22
+ import "../chunk-FHPSVTS5.js";
23
+ import "../chunk-M5XNFUXN.js";
24
+ import "../chunk-OIW3JAWH.js";
25
25
  import "../chunk-POFBE6ZY.js";
26
- import "../chunk-EUZ73S73.js";
27
- import "../chunk-S5MRKUSX.js";
28
- import "../chunk-LK343VAG.js";
29
- import "../chunk-QBI4KSTQ.js";
30
- import "../chunk-GXW43S4A.js";
31
- import "../chunk-7QYERUTD.js";
32
- import "../chunk-IRE7HPNI.js";
33
- import "../chunk-AFCKBLEG.js";
26
+ import "../chunk-Z5HLACZT.js";
27
+ import "../chunk-LNSCANYY.js";
28
+ import "../chunk-JNCD2ZG3.js";
29
+ import "../chunk-YAMNJXCD.js";
30
+ import "../chunk-NPBPH7KI.js";
31
+ import "../chunk-UOUUTDWF.js";
32
+ import "../chunk-2BJZFA7X.js";
33
+ import "../chunk-ONUAAXAW.js";
34
34
  import "../chunk-PPY5N2E6.js";
35
35
  import "../chunk-KZERVKTD.js";
36
- import "../chunk-35M6YE6T.js";
37
- import "../chunk-QTOLNRET.js";
38
- import "../chunk-HGCUZQUL.js";
36
+ import "../chunk-TTTK44RK.js";
37
+ import "../chunk-ZVU6WMMU.js";
38
+ import "../chunk-WG67W43Y.js";
39
39
  import "../chunk-MLKGABMK.js";
40
40
 
41
41
  // bin/pushary-bell-hook.ts
@@ -5,40 +5,40 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-OSXIMNMJ.js";
8
+ } from "../chunk-LGWTITVK.js";
9
9
  import {
10
10
  createIo
11
11
  } from "../chunk-FO3MDD26.js";
12
12
  import {
13
13
  exitOnHelpFlag
14
- } from "../chunk-SNQ5HQHE.js";
14
+ } from "../chunk-D3QGBMO3.js";
15
15
  import {
16
16
  addBellHooks,
17
17
  bellInstalled,
18
18
  removeBellHooks
19
- } from "../chunk-DFW2JKHX.js";
19
+ } from "../chunk-4S5XVFDV.js";
20
20
  import {
21
21
  parseFlags
22
22
  } from "../chunk-NMUI3ZWG.js";
23
- import "../chunk-3GZRNHH5.js";
24
- import "../chunk-GXW43S4A.js";
23
+ import "../chunk-CXZAKS7S.js";
24
+ import "../chunk-NPBPH7KI.js";
25
25
  import {
26
26
  claudeSettings
27
- } from "../chunk-7QYERUTD.js";
27
+ } from "../chunk-UOUUTDWF.js";
28
28
  import {
29
29
  readJsonSafe,
30
30
  writeJsonAtomic
31
- } from "../chunk-IRE7HPNI.js";
32
- import "../chunk-AFCKBLEG.js";
31
+ } from "../chunk-2BJZFA7X.js";
32
+ import "../chunk-ONUAAXAW.js";
33
33
  import "../chunk-PPY5N2E6.js";
34
34
  import {
35
35
  EXIT
36
36
  } from "../chunk-KZERVKTD.js";
37
- import "../chunk-35M6YE6T.js";
38
- import "../chunk-QTOLNRET.js";
37
+ import "../chunk-TTTK44RK.js";
38
+ import "../chunk-ZVU6WMMU.js";
39
39
  import {
40
40
  isRecord
41
- } from "../chunk-HGCUZQUL.js";
41
+ } from "../chunk-WG67W43Y.js";
42
42
  import "../chunk-MLKGABMK.js";
43
43
 
44
44
  // bin/pushary-bell.ts
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  WRAPPER_ACTIVE_ENV,
4
4
  findClaudeBinary
5
- } from "../chunk-4WCPDCKA.js";
5
+ } from "../chunk-WLOVGZ7R.js";
6
6
  import {
7
7
  CommandReceipts,
8
8
  controllerCommandSchema
@@ -12,40 +12,40 @@ import {
12
12
  describeIdleWindow,
13
13
  startProcessOwnership,
14
14
  withSpawnProcessOwnership
15
- } from "../chunk-EU67IKIQ.js";
16
- import "../chunk-J5BCHHCB.js";
15
+ } from "../chunk-DJILSCSU.js";
16
+ import "../chunk-TO77OYLM.js";
17
17
  import {
18
18
  announceSubscriptionRequired,
19
19
  isDeferAnswer
20
- } from "../chunk-Z4PNECON.js";
20
+ } from "../chunk-AM3H6HWG.js";
21
21
  import {
22
22
  claudeTranscriptPath,
23
23
  redactDraft,
24
24
  registerTranscript,
25
25
  registeredTranscriptEnabled,
26
26
  startDraftPublisher
27
- } from "../chunk-DN6QYNNC.js";
28
- import "../chunk-NOQGCGOR.js";
27
+ } from "../chunk-WUS2LFTM.js";
28
+ import "../chunk-VHLRXIMC.js";
29
29
  import "../chunk-MHUKYYYR.js";
30
30
  import {
31
31
  ensureDaemonRunning
32
- } from "../chunk-FZJON3RK.js";
33
- import "../chunk-PE6JUMI2.js";
34
- import "../chunk-ZJGIJDWP.js";
35
- import "../chunk-DFW2JKHX.js";
32
+ } from "../chunk-6L2U3TP3.js";
33
+ import "../chunk-IEAABGST.js";
34
+ import "../chunk-JXE4UQFJ.js";
35
+ import "../chunk-4S5XVFDV.js";
36
36
  import "../chunk-NMUI3ZWG.js";
37
- import "../chunk-XU2FL4B6.js";
37
+ import "../chunk-W3VRQEL3.js";
38
38
  import {
39
39
  external_exports
40
40
  } from "../chunk-XMSDA5WA.js";
41
41
  import {
42
42
  transcriptsEnabled
43
- } from "../chunk-WQNHWWVW.js";
43
+ } from "../chunk-OXTRF7CP.js";
44
44
  import {
45
45
  needsShell,
46
46
  spawnClaude
47
47
  } from "../chunk-XHKBHWLX.js";
48
- import "../chunk-3GZRNHH5.js";
48
+ import "../chunk-CXZAKS7S.js";
49
49
  import {
50
50
  DEFAULT_SESSION,
51
51
  UNNAMED_ACTION,
@@ -62,10 +62,10 @@ import {
62
62
  reportEvent,
63
63
  savePendingCommand,
64
64
  scopePathFor
65
- } from "../chunk-FNBGGKRK.js";
65
+ } from "../chunk-FHPSVTS5.js";
66
66
  import {
67
67
  repoKeyFor
68
- } from "../chunk-7R5ZKOQ4.js";
68
+ } from "../chunk-M5XNFUXN.js";
69
69
  import {
70
70
  askUser,
71
71
  cancelQuestion,
@@ -77,31 +77,31 @@ import {
77
77
  waitForAnswer,
78
78
  waitsForThePhone,
79
79
  withdrawQuestion
80
- } from "../chunk-UAADLSK5.js";
80
+ } from "../chunk-OIW3JAWH.js";
81
81
  import "../chunk-POFBE6ZY.js";
82
82
  import {
83
83
  SubscriptionRequiredError
84
- } from "../chunk-EUZ73S73.js";
85
- import "../chunk-S5MRKUSX.js";
86
- import "../chunk-LK343VAG.js";
84
+ } from "../chunk-Z5HLACZT.js";
85
+ import "../chunk-LNSCANYY.js";
86
+ import "../chunk-JNCD2ZG3.js";
87
87
  import {
88
88
  getMachineId
89
- } from "../chunk-QBI4KSTQ.js";
90
- import "../chunk-GXW43S4A.js";
89
+ } from "../chunk-YAMNJXCD.js";
90
+ import "../chunk-NPBPH7KI.js";
91
91
  import {
92
92
  claudeConfigDir
93
- } from "../chunk-7QYERUTD.js";
94
- import "../chunk-IRE7HPNI.js";
93
+ } from "../chunk-UOUUTDWF.js";
94
+ import "../chunk-2BJZFA7X.js";
95
95
  import {
96
96
  getApiKey,
97
97
  getBaseUrl
98
- } from "../chunk-AFCKBLEG.js";
98
+ } from "../chunk-ONUAAXAW.js";
99
99
  import "../chunk-PPY5N2E6.js";
100
100
  import "../chunk-KZERVKTD.js";
101
101
  import {
102
102
  NPX_LATEST_COMMAND
103
- } from "../chunk-35M6YE6T.js";
104
- import "../chunk-QTOLNRET.js";
103
+ } from "../chunk-TTTK44RK.js";
104
+ import "../chunk-ZVU6WMMU.js";
105
105
  import {
106
106
  DECISION_STOP_REASON,
107
107
  HAND_BACK_WITHOUT_A_PROMPT,
@@ -113,7 +113,7 @@ import {
113
113
  refusesWhenUnanswered,
114
114
  resolveGate,
115
115
  timeoutActionWithoutLocalPrompt
116
- } from "../chunk-HGCUZQUL.js";
116
+ } from "../chunk-WG67W43Y.js";
117
117
  import "../chunk-MLKGABMK.js";
118
118
 
119
119
  // src/wrapper/localPassthrough.ts