pushary 1.9.80 → 1.9.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +4 -4
- package/data/SKILL.md +12 -16
- package/data/cursor-plugin/README.md +1 -1
- package/data/cursor-plugin/skills/pushary/SKILL.md +11 -15
- package/data/vscode-plugin/README.md +1 -1
- package/data/vscode-plugin/skills/pushary/SKILL.md +11 -15
- package/dist/{api-FPA2PPXY.js → api-VFUZ5HBR.js} +10 -10
- package/dist/bin/pushary-bell-hook.js +25 -25
- package/dist/bin/pushary-bell.js +10 -10
- package/dist/bin/pushary-claude.js +26 -26
- package/dist/bin/pushary-clean.js +33 -33
- package/dist/bin/pushary-codex-bridge.js +21 -21
- package/dist/bin/pushary-codex-hook.js +30 -30
- package/dist/bin/pushary-codex-session.js +8 -8
- package/dist/bin/pushary-codex.js +13 -13
- package/dist/bin/pushary-connect.js +26 -26
- package/dist/bin/pushary-cowork.js +5 -5
- package/dist/bin/pushary-daemon.js +38 -38
- package/dist/bin/pushary-disconnect.js +25 -25
- package/dist/bin/pushary-display-hook.js +16 -16
- package/dist/bin/pushary-doctor.js +41 -41
- package/dist/bin/pushary-elicitation-hook.js +25 -25
- package/dist/bin/pushary-gemini-bridge.js +15 -15
- package/dist/bin/pushary-gemini-hook.js +27 -27
- package/dist/bin/pushary-hook.js +29 -29
- package/dist/bin/pushary-login.js +20 -20
- package/dist/bin/pushary-logout.js +24 -24
- package/dist/bin/pushary-mcp.js +11 -11
- package/dist/bin/pushary-mode.js +15 -15
- package/dist/bin/pushary-notification-hook.js +24 -24
- package/dist/bin/pushary-opencode-hook.js +26 -26
- package/dist/bin/pushary-permission-denied-hook.js +29 -29
- package/dist/bin/pushary-permission-hook.js +29 -29
- package/dist/bin/pushary-post-hook.js +24 -24
- package/dist/bin/pushary-prompt-hook.js +24 -24
- package/dist/bin/pushary-session-end-hook.js +26 -26
- package/dist/bin/pushary-session-start-hook.js +34 -34
- package/dist/bin/pushary-setup.js +47 -55
- package/dist/bin/pushary-stats.js +5 -5
- package/dist/bin/pushary-status.js +31 -31
- package/dist/bin/pushary-stop-hook.js +24 -24
- package/dist/bin/pushary-stopfailure-hook.js +24 -24
- package/dist/bin/pushary-suggestions.js +15 -15
- package/dist/bin/pushary-transcript-register.js +16 -16
- package/dist/bin/pushary-transcripts.js +18 -18
- package/dist/bin/pushary-upgrade.js +39 -39
- package/dist/bin/pushary-wait.js +15 -15
- package/dist/bin/pushary.js +7 -7
- package/dist/{chunk-VP473NXT.js → chunk-35S7VB26.js} +5 -5
- package/dist/{chunk-OJS32QPK.js → chunk-3BFCJZBU.js} +1 -1
- package/dist/{chunk-3GZRNHH5.js → chunk-3YOXBN7V.js} +4 -4
- package/dist/{chunk-ITVTU4RZ.js → chunk-47RUEZZA.js} +5 -5
- package/dist/{chunk-WJVQOAZY.js → chunk-4TR4G7A4.js} +1 -1
- package/dist/{chunk-KHLWYQK7.js → chunk-5WC7TXSS.js} +13 -13
- package/dist/{chunk-UCZZX5JH.js → chunk-5WIVX2NN.js} +3 -3
- package/dist/{chunk-BWE52JRG.js → chunk-74QJBFMG.js} +2 -2
- package/dist/{chunk-EU67IKIQ.js → chunk-7JU6DPO7.js} +3 -3
- package/dist/{chunk-3BPSCYOE.js → chunk-7WCB2BC4.js} +7 -7
- package/dist/{chunk-3LJU2L5S.js → chunk-ALTTZKDU.js} +6 -6
- package/dist/{chunk-MJNZBNTN.js → chunk-AZV3DQQU.js} +16 -10
- package/dist/{chunk-7QYERUTD.js → chunk-B2HMISVL.js} +2 -2
- package/dist/{chunk-DN6QYNNC.js → chunk-BB4W35D6.js} +10 -10
- package/dist/{chunk-N3DOT42Y.js → chunk-BYFFELB3.js} +6 -6
- package/dist/{chunk-SNQ5HQHE.js → chunk-CRKODLLY.js} +1 -1
- package/dist/{chunk-24FQPJOZ.js → chunk-DF7A5AWF.js} +3 -3
- package/dist/{chunk-IWYGHJY6.js → chunk-DLBUDQEE.js} +4 -4
- package/dist/{chunk-QNPIHZFM.js → chunk-DPP3ZCEE.js} +2 -2
- package/dist/{chunk-IPIJY4TI.js → chunk-ER4UCECJ.js} +1 -1
- package/dist/{chunk-6VLSVB2C.js → chunk-ESS7CW3I.js} +5 -5
- package/dist/{chunk-4WCPDCKA.js → chunk-FIMSM5SW.js} +2 -2
- package/dist/{chunk-3G2D5NAG.js → chunk-GOYYPBBJ.js} +3 -3
- package/dist/{chunk-IYCYKG2B.js → chunk-HG5EUDF3.js} +2 -2
- package/dist/{chunk-S5MRKUSX.js → chunk-HNUK557P.js} +3 -3
- package/dist/{chunk-TSCACSAR.js → chunk-IA53GEP5.js} +5 -5
- package/dist/{chunk-LK343VAG.js → chunk-ID46TTYS.js} +3 -3
- package/dist/{chunk-LN32FXTF.js → chunk-IO3OLTED.js} +3 -3
- package/dist/{chunk-UAADLSK5.js → chunk-IQQQ2LGB.js} +5 -5
- package/dist/{chunk-IRE7HPNI.js → chunk-IS5YVKUX.js} +3 -3
- package/dist/{chunk-TDW5LI6P.js → chunk-IXVMMDIG.js} +3 -3
- package/dist/{chunk-ZYFZAZCN.js → chunk-JTO6UPTJ.js} +2 -2
- package/dist/{chunk-5HA42EV4.js → chunk-JTYZEP4Q.js} +1 -1
- package/dist/{chunk-ZJGIJDWP.js → chunk-JXE4UQFJ.js} +3 -3
- package/dist/{chunk-YEPXSGFC.js → chunk-K5QN6V5K.js} +3 -3
- package/dist/{chunk-LIXHCI4G.js → chunk-KERGWHCK.js} +6 -6
- package/dist/{chunk-FNBGGKRK.js → chunk-KXSZ43Z6.js} +9 -9
- package/dist/{chunk-SGG5GNVW.js → chunk-LFEJVQWI.js} +6 -6
- package/dist/{chunk-L3VBP627.js → chunk-LJ4TUZJV.js} +6 -6
- package/dist/{chunk-3KQM5AKY.js → chunk-LJFB5ZJ4.js} +4 -4
- package/dist/{chunk-7R5ZKOQ4.js → chunk-M5XNFUXN.js} +1 -1
- package/dist/{chunk-RNAFUXEK.js → chunk-NK3I2QQA.js} +4 -4
- package/dist/{chunk-GXW43S4A.js → chunk-NPBPH7KI.js} +2 -2
- package/dist/{chunk-7TIDWBXF.js → chunk-NVEDZZ3V.js} +10 -10
- package/dist/{chunk-AFCKBLEG.js → chunk-ONUAAXAW.js} +1 -1
- package/dist/{chunk-A2OAJ7CS.js → chunk-PJ26BODT.js} +1 -1
- package/dist/{chunk-J5BCHHCB.js → chunk-QNEWV4JV.js} +1 -1
- package/dist/{chunk-PJRXYNXG.js → chunk-QZ666HLH.js} +5 -5
- package/dist/{chunk-WQNHWWVW.js → chunk-RVC7OSC7.js} +1 -1
- package/dist/{chunk-EUZ73S73.js → chunk-SEVGKJ7K.js} +4 -4
- package/dist/{chunk-NOQGCGOR.js → chunk-SFUJLUBM.js} +1 -1
- package/dist/{chunk-FZJON3RK.js → chunk-TJZIUFWK.js} +6 -6
- package/dist/{chunk-35M6YE6T.js → chunk-TTTK44RK.js} +3 -5
- package/dist/{chunk-4OXYED6O.js → chunk-UUASO2FU.js} +4 -4
- package/dist/{chunk-B67R6ZCW.js → chunk-VII55DVC.js} +2 -2
- package/dist/{chunk-DFW2JKHX.js → chunk-VK2CHU3L.js} +1 -1
- package/dist/{chunk-T2H6BCRY.js → chunk-VYRJAPZ6.js} +3 -3
- package/dist/{chunk-XU2FL4B6.js → chunk-W3VRQEL3.js} +2 -2
- package/dist/{chunk-HGCUZQUL.js → chunk-WG67W43Y.js} +0 -1
- package/dist/{chunk-QBI4KSTQ.js → chunk-WPGSQRMW.js} +2 -2
- package/dist/{chunk-DLPFYJ7G.js → chunk-X2P3O4PX.js} +1 -1
- package/dist/{chunk-PE6JUMI2.js → chunk-X772USE7.js} +4 -4
- package/dist/{chunk-HMLURCXV.js → chunk-YAAJ3VZA.js} +6 -6
- package/dist/{chunk-HJZDJS63.js → chunk-YIKIQ6YN.js} +3 -3
- package/dist/{chunk-OSXIMNMJ.js → chunk-YNWEE2WC.js} +1 -1
- package/dist/{chunk-YJGWHP2I.js → chunk-ZBST77LF.js} +3 -3
- package/dist/{chunk-262U6MMI.js → chunk-ZBYZCM6Y.js} +2 -2
- package/dist/{chunk-Z4PNECON.js → chunk-ZIJKTWNO.js} +1 -1
- package/dist/{codex-app-cards-switch-AT6X3X6U.js → codex-app-cards-switch-ZL6OHUXQ.js} +11 -11
- package/dist/{codex-desktop-launch-4ELF22QM.js → codex-desktop-launch-LQF5CPKU.js} +1 -1
- package/dist/{codex-session-launch-QEVWHTU7.js → codex-session-launch-5WBL5YHX.js} +18 -18
- package/dist/{config-PXISW4O5.js → config-MZDRETL2.js} +3 -3
- package/dist/{global-upgrade-H3S4KQ26.js → global-upgrade-HDDPHNGX.js} +10 -10
- package/dist/{identity-FB7QFMEZ.js → identity-RNZLFMKW.js} +4 -4
- package/dist/{live-capabilities-27LDDOMC.js → live-capabilities-Y2Q5QBVK.js} +5 -5
- package/dist/{paths-URGGQMFD.js → paths-WILX6YI3.js} +3 -3
- package/dist/{reapply-A6OKNS24.js → reapply-KF7ZZSA2.js} +27 -27
- package/dist/src/index.js +28 -28
- package/dist/{upgrade-lock-65A4XSMV.js → upgrade-lock-7Q4VWMDA.js} +4 -4
- package/dist/{usage-FZTPRQRP.js → usage-MSILPJVQ.js} +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.81
|
|
4
|
+
|
|
5
|
+
- 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`.
|
|
6
|
+
- `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.
|
|
7
|
+
- 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.
|
|
8
|
+
|
|
3
9
|
## 1.9.80
|
|
4
10
|
|
|
5
11
|
- 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.
|
|
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
|
|
233
|
-
|
|
234
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
615
|
-
| **
|
|
616
|
-
| **
|
|
617
|
-
| **
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
608
|
-
| **
|
|
609
|
-
| **
|
|
610
|
-
| **
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
608
|
-
| **
|
|
609
|
-
| **
|
|
610
|
-
| **
|
|
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-
|
|
20
|
+
} from "./chunk-IQQQ2LGB.js";
|
|
21
21
|
import "./chunk-POFBE6ZY.js";
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-SEVGKJ7K.js";
|
|
23
|
+
import "./chunk-HNUK557P.js";
|
|
24
|
+
import "./chunk-ID46TTYS.js";
|
|
25
|
+
import "./chunk-WPGSQRMW.js";
|
|
26
|
+
import "./chunk-B2HMISVL.js";
|
|
27
|
+
import "./chunk-IS5YVKUX.js";
|
|
28
|
+
import "./chunk-ONUAAXAW.js";
|
|
29
29
|
import "./chunk-PPY5N2E6.js";
|
|
30
30
|
import "./chunk-KZERVKTD.js";
|
|
31
|
-
import "./chunk-
|
|
31
|
+
import "./chunk-TTTK44RK.js";
|
|
32
32
|
import "./chunk-QTOLNRET.js";
|
|
33
33
|
import {
|
|
34
34
|
DECISION_STOP_REASON,
|
|
35
35
|
UNVERIFIABLE_APPROVAL_REASON
|
|
36
|
-
} from "./chunk-
|
|
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-
|
|
4
|
+
} from "../chunk-YNWEE2WC.js";
|
|
5
5
|
import {
|
|
6
6
|
readHookInput
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-7WCB2BC4.js";
|
|
8
|
+
import "../chunk-BB4W35D6.js";
|
|
9
|
+
import "../chunk-SFUJLUBM.js";
|
|
10
10
|
import "../chunk-MHUKYYYR.js";
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-UUASO2FU.js";
|
|
12
|
+
import "../chunk-TJZIUFWK.js";
|
|
13
|
+
import "../chunk-X772USE7.js";
|
|
14
|
+
import "../chunk-JXE4UQFJ.js";
|
|
15
|
+
import "../chunk-VK2CHU3L.js";
|
|
16
16
|
import "../chunk-NMUI3ZWG.js";
|
|
17
|
-
import "../chunk-
|
|
17
|
+
import "../chunk-W3VRQEL3.js";
|
|
18
18
|
import "../chunk-XMSDA5WA.js";
|
|
19
|
-
import "../chunk-
|
|
19
|
+
import "../chunk-RVC7OSC7.js";
|
|
20
20
|
import "../chunk-XHKBHWLX.js";
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-
|
|
21
|
+
import "../chunk-3YOXBN7V.js";
|
|
22
|
+
import "../chunk-KXSZ43Z6.js";
|
|
23
|
+
import "../chunk-M5XNFUXN.js";
|
|
24
|
+
import "../chunk-IQQQ2LGB.js";
|
|
25
25
|
import "../chunk-POFBE6ZY.js";
|
|
26
|
-
import "../chunk-
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-
|
|
30
|
-
import "../chunk-
|
|
31
|
-
import "../chunk-
|
|
32
|
-
import "../chunk-
|
|
33
|
-
import "../chunk-
|
|
26
|
+
import "../chunk-SEVGKJ7K.js";
|
|
27
|
+
import "../chunk-HNUK557P.js";
|
|
28
|
+
import "../chunk-ID46TTYS.js";
|
|
29
|
+
import "../chunk-WPGSQRMW.js";
|
|
30
|
+
import "../chunk-NPBPH7KI.js";
|
|
31
|
+
import "../chunk-B2HMISVL.js";
|
|
32
|
+
import "../chunk-IS5YVKUX.js";
|
|
33
|
+
import "../chunk-ONUAAXAW.js";
|
|
34
34
|
import "../chunk-PPY5N2E6.js";
|
|
35
35
|
import "../chunk-KZERVKTD.js";
|
|
36
|
-
import "../chunk-
|
|
36
|
+
import "../chunk-TTTK44RK.js";
|
|
37
37
|
import "../chunk-QTOLNRET.js";
|
|
38
|
-
import "../chunk-
|
|
38
|
+
import "../chunk-WG67W43Y.js";
|
|
39
39
|
import "../chunk-MLKGABMK.js";
|
|
40
40
|
|
|
41
41
|
// bin/pushary-bell-hook.ts
|
package/dist/bin/pushary-bell.js
CHANGED
|
@@ -5,40 +5,40 @@ import {
|
|
|
5
5
|
liveAgentCount,
|
|
6
6
|
ring,
|
|
7
7
|
upgradeThreshold
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-YNWEE2WC.js";
|
|
9
9
|
import {
|
|
10
10
|
createIo
|
|
11
11
|
} from "../chunk-FO3MDD26.js";
|
|
12
12
|
import {
|
|
13
13
|
exitOnHelpFlag
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-CRKODLLY.js";
|
|
15
15
|
import {
|
|
16
16
|
addBellHooks,
|
|
17
17
|
bellInstalled,
|
|
18
18
|
removeBellHooks
|
|
19
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-VK2CHU3L.js";
|
|
20
20
|
import {
|
|
21
21
|
parseFlags
|
|
22
22
|
} from "../chunk-NMUI3ZWG.js";
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-
|
|
23
|
+
import "../chunk-3YOXBN7V.js";
|
|
24
|
+
import "../chunk-NPBPH7KI.js";
|
|
25
25
|
import {
|
|
26
26
|
claudeSettings
|
|
27
|
-
} from "../chunk-
|
|
27
|
+
} from "../chunk-B2HMISVL.js";
|
|
28
28
|
import {
|
|
29
29
|
readJsonSafe,
|
|
30
30
|
writeJsonAtomic
|
|
31
|
-
} from "../chunk-
|
|
32
|
-
import "../chunk-
|
|
31
|
+
} from "../chunk-IS5YVKUX.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-
|
|
37
|
+
import "../chunk-TTTK44RK.js";
|
|
38
38
|
import "../chunk-QTOLNRET.js";
|
|
39
39
|
import {
|
|
40
40
|
isRecord
|
|
41
|
-
} from "../chunk-
|
|
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-
|
|
5
|
+
} from "../chunk-FIMSM5SW.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-
|
|
16
|
-
import "../chunk-
|
|
15
|
+
} from "../chunk-7JU6DPO7.js";
|
|
16
|
+
import "../chunk-QNEWV4JV.js";
|
|
17
17
|
import {
|
|
18
18
|
announceSubscriptionRequired,
|
|
19
19
|
isDeferAnswer
|
|
20
|
-
} from "../chunk-
|
|
20
|
+
} from "../chunk-ZIJKTWNO.js";
|
|
21
21
|
import {
|
|
22
22
|
claudeTranscriptPath,
|
|
23
23
|
redactDraft,
|
|
24
24
|
registerTranscript,
|
|
25
25
|
registeredTranscriptEnabled,
|
|
26
26
|
startDraftPublisher
|
|
27
|
-
} from "../chunk-
|
|
28
|
-
import "../chunk-
|
|
27
|
+
} from "../chunk-BB4W35D6.js";
|
|
28
|
+
import "../chunk-SFUJLUBM.js";
|
|
29
29
|
import "../chunk-MHUKYYYR.js";
|
|
30
30
|
import {
|
|
31
31
|
ensureDaemonRunning
|
|
32
|
-
} from "../chunk-
|
|
33
|
-
import "../chunk-
|
|
34
|
-
import "../chunk-
|
|
35
|
-
import "../chunk-
|
|
32
|
+
} from "../chunk-TJZIUFWK.js";
|
|
33
|
+
import "../chunk-X772USE7.js";
|
|
34
|
+
import "../chunk-JXE4UQFJ.js";
|
|
35
|
+
import "../chunk-VK2CHU3L.js";
|
|
36
36
|
import "../chunk-NMUI3ZWG.js";
|
|
37
|
-
import "../chunk-
|
|
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-
|
|
43
|
+
} from "../chunk-RVC7OSC7.js";
|
|
44
44
|
import {
|
|
45
45
|
needsShell,
|
|
46
46
|
spawnClaude
|
|
47
47
|
} from "../chunk-XHKBHWLX.js";
|
|
48
|
-
import "../chunk-
|
|
48
|
+
import "../chunk-3YOXBN7V.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-
|
|
65
|
+
} from "../chunk-KXSZ43Z6.js";
|
|
66
66
|
import {
|
|
67
67
|
repoKeyFor
|
|
68
|
-
} from "../chunk-
|
|
68
|
+
} from "../chunk-M5XNFUXN.js";
|
|
69
69
|
import {
|
|
70
70
|
askUser,
|
|
71
71
|
cancelQuestion,
|
|
@@ -77,30 +77,30 @@ import {
|
|
|
77
77
|
waitForAnswer,
|
|
78
78
|
waitsForThePhone,
|
|
79
79
|
withdrawQuestion
|
|
80
|
-
} from "../chunk-
|
|
80
|
+
} from "../chunk-IQQQ2LGB.js";
|
|
81
81
|
import "../chunk-POFBE6ZY.js";
|
|
82
82
|
import {
|
|
83
83
|
SubscriptionRequiredError
|
|
84
|
-
} from "../chunk-
|
|
85
|
-
import "../chunk-
|
|
86
|
-
import "../chunk-
|
|
84
|
+
} from "../chunk-SEVGKJ7K.js";
|
|
85
|
+
import "../chunk-HNUK557P.js";
|
|
86
|
+
import "../chunk-ID46TTYS.js";
|
|
87
87
|
import {
|
|
88
88
|
getMachineId
|
|
89
|
-
} from "../chunk-
|
|
90
|
-
import "../chunk-
|
|
89
|
+
} from "../chunk-WPGSQRMW.js";
|
|
90
|
+
import "../chunk-NPBPH7KI.js";
|
|
91
91
|
import {
|
|
92
92
|
claudeConfigDir
|
|
93
|
-
} from "../chunk-
|
|
94
|
-
import "../chunk-
|
|
93
|
+
} from "../chunk-B2HMISVL.js";
|
|
94
|
+
import "../chunk-IS5YVKUX.js";
|
|
95
95
|
import {
|
|
96
96
|
getApiKey,
|
|
97
97
|
getBaseUrl
|
|
98
|
-
} from "../chunk-
|
|
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-
|
|
103
|
+
} from "../chunk-TTTK44RK.js";
|
|
104
104
|
import "../chunk-QTOLNRET.js";
|
|
105
105
|
import {
|
|
106
106
|
DECISION_STOP_REASON,
|
|
@@ -113,7 +113,7 @@ import {
|
|
|
113
113
|
refusesWhenUnanswered,
|
|
114
114
|
resolveGate,
|
|
115
115
|
timeoutActionWithoutLocalPrompt
|
|
116
|
-
} from "../chunk-
|
|
116
|
+
} from "../chunk-WG67W43Y.js";
|
|
117
117
|
import "../chunk-MLKGABMK.js";
|
|
118
118
|
|
|
119
119
|
// src/wrapper/localPassthrough.ts
|