@pushary/agent-hooks 0.81.0 → 0.83.0

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 (52) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/data/SKILL.md +14 -5
  3. package/data/cursor-plugin/skills/pushary/SKILL.md +13 -4
  4. package/data/vscode-plugin/skills/pushary/SKILL.md +13 -4
  5. package/dist/bin/pushary-bell-hook.js +4 -4
  6. package/dist/bin/pushary-bell.js +6 -6
  7. package/dist/bin/pushary-claude.js +4 -4
  8. package/dist/bin/pushary-clean.js +5 -5
  9. package/dist/bin/pushary-codex-hook.js +10 -6
  10. package/dist/bin/pushary-codex.js +3 -3
  11. package/dist/bin/pushary-connect.js +7 -7
  12. package/dist/bin/pushary-doctor.js +11 -11
  13. package/dist/bin/pushary-gemini-hook.js +5 -5
  14. package/dist/bin/pushary-hook.js +7 -7
  15. package/dist/bin/pushary-login.js +5 -5
  16. package/dist/bin/pushary-logout.js +5 -5
  17. package/dist/bin/pushary-mode.js +4 -4
  18. package/dist/bin/pushary-notification-hook.js +3 -3
  19. package/dist/bin/pushary-permission-denied-hook.js +7 -7
  20. package/dist/bin/pushary-permission-hook.js +7 -7
  21. package/dist/bin/pushary-post-hook.js +3 -3
  22. package/dist/bin/pushary-prompt-hook.js +3 -3
  23. package/dist/bin/pushary-session-end-hook.js +3 -3
  24. package/dist/bin/pushary-session-start-hook.js +3 -3
  25. package/dist/bin/pushary-setup.js +22 -17
  26. package/dist/bin/pushary-stats.js +2 -2
  27. package/dist/bin/pushary-status.js +6 -6
  28. package/dist/bin/pushary-stop-hook.js +3 -3
  29. package/dist/bin/pushary-stopfailure-hook.js +3 -3
  30. package/dist/bin/pushary-suggestions.js +1 -1
  31. package/dist/bin/pushary-upgrade.js +4 -4
  32. package/dist/bin/pushary-wait.js +4 -4
  33. package/dist/{chunk-MHA2WB7S.js → chunk-2R63XKLG.js} +1 -1
  34. package/dist/{chunk-U2PZKYZM.js → chunk-3JDIGKPV.js} +2 -2
  35. package/dist/{chunk-TX7KBKT7.js → chunk-5RUIFDTP.js} +1 -0
  36. package/dist/{chunk-PPD3HHNJ.js → chunk-BT7NTTIW.js} +1 -1
  37. package/dist/{chunk-FVVJ3FOW.js → chunk-C4SQY777.js} +2 -2
  38. package/dist/{chunk-EBP4YG75.js → chunk-CXGJTN74.js} +1 -1
  39. package/dist/{chunk-7DYFAM32.js → chunk-DMKSHZKF.js} +1 -1
  40. package/dist/{chunk-JU72KNUB.js → chunk-E7YX7CTM.js} +20 -8
  41. package/dist/{chunk-PVSCRRPA.js → chunk-FFT7L2VE.js} +2 -2
  42. package/dist/{chunk-WYVKPLVT.js → chunk-HKKERYZP.js} +1 -1
  43. package/dist/{chunk-Q4QULGAV.js → chunk-O55DONTG.js} +1 -1
  44. package/dist/{chunk-BOMF4C2Q.js → chunk-R3AEWBAZ.js} +23 -12
  45. package/dist/{chunk-E6I3DBJW.js → chunk-RZP3Z2WR.js} +1 -1
  46. package/dist/{chunk-R6AYBATA.js → chunk-U752S5RE.js} +1 -1
  47. package/dist/{chunk-DNFYUBRP.js → chunk-UAWTJMXA.js} +1 -1
  48. package/dist/{chunk-UBUPETEQ.js → chunk-V6MCBCUC.js} +2 -2
  49. package/dist/src/index.d.ts +2 -0
  50. package/dist/src/index.js +7 -7
  51. package/package.json +1 -1
  52. /package/dist/{chunk-T6BNEQ2A.js → chunk-QA5HP7CR.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.82.0
4
+
5
+ ### Setup reads properly when an agent is the one running it
6
+
7
+ An agent that runs `setup` relays its output to you, and two things in
8
+ that output were written for a terminal that was not there.
9
+
10
+ Colour was unconditional. Piped into an agent's transcript, ten raw
11
+ escape sequences arrived as literal text around the parts you needed to
12
+ read. Colour now follows the same rule the rest of the CLI already used,
13
+ so it is on at a terminal and off everywhere else.
14
+
15
+ The app download was unreachable until you gave up. "No app?" was
16
+ answered with the command for approving in a browser, which sends you
17
+ away from the phone at the moment you were being asked to install it,
18
+ and the download link appeared only after the fifteen minute wait
19
+ expired. The header now names https://pushary.com/download first and
20
+ says the wait continues while you install.
21
+
22
+ ### The pairing QR is smaller
23
+
24
+ The QR encodes a link, and the link's length decides the QR's size. It
25
+ carried the pairing id and the public key, 114 characters, which drew 22
26
+ rows of blocks. Against a server that offers one, the CLI now uses a
27
+ short link instead: 33 characters, 16 rows, and small enough to survive
28
+ being relayed through something that truncates.
29
+
30
+ Nothing depends on it. Against an older server, or if the short link
31
+ cannot be issued, setup uses the long one exactly as before, and the
32
+ `pushary://` link is never shortened at all.
33
+
34
+
3
35
  ## 0.81.0
4
36
 
5
37
  ### The idle ping now honours a Terminal mode set in the dashboard
package/data/SKILL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: pushary
3
- version: 0.9.0
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: 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 the user's lock screen. 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 service, $9.99/mo after a 3-day card-first trial.
3
+ version: 0.9.2
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 the user's lock screen. 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 service, $9.99/mo after a 3-day card-first trial.
5
5
  metadata:
6
6
  hermes:
7
7
  tags: [notifications, push, human-in-the-loop, alerts, permissions, mcp]
@@ -92,11 +92,20 @@ Just run it. No account, no API key, and nothing to paste first:
92
92
  npx @pushary/agent-hooks@latest setup
93
93
  ```
94
94
 
95
- It configures MCP, hooks, permissions and the skill in one step, then prints a QR code and waits.
95
+ 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.
96
96
 
97
- **Show the user your output and ask them to scan that QR with their phone camera.** Scanning pairs their Pushary app, which is what hands this machine its key. A tappable link and a fingerprint print under the QR for a phone already in hand. Do not ask the user for an API key, and do not send them to a signup page first: that is the old flow and it is strictly worse.
97
+ It prints a QR, a short link under it, a fingerprint, and then waits about 15 minutes.
98
98
 
99
- Signup starts a 3-day trial and asks for a card up front, which happens in the app.
99
+ **Do not summarise that output. Show it, and walk the user through all four steps:**
100
+
101
+ 1. **Show them the QR and the short link.** Both point at the same pairing. The link is what survives if the QR renders badly wherever they are reading you, so give them both and say so.
102
+ 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it, so nobody has to restart anything.
103
+ 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app will also ask them to sign in and start a plan: $9.99/mo after a 3-day trial, card up front, all inside the app. Say this before they scan rather than letting them discover it mid-flow.
104
+ 4. **They approve.** Setup finishes on its own, and from then on your `ask_user` and `send_notification` calls arrive on their lock screen with answer buttons.
105
+
106
+ 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.
107
+
108
+ If setup exits without pairing, nothing was configured. Say that plainly and offer the two fallbacks below rather than pretending the tools are available.
100
109
 
101
110
  If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
102
111
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a human and nobody is at the terminal: 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 the user's lock screen. 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 service, $9.99/mo after a 3-day card-first trial.
3
+ 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 the user's lock screen. 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 service, $9.99/mo after a 3-day card-first trial.
4
4
  ---
5
5
 
6
6
  # Pushary - Push Notifications for AI Agents
@@ -85,11 +85,20 @@ Just run it. No account, no API key, and nothing to paste first:
85
85
  npx @pushary/agent-hooks@latest setup
86
86
  ```
87
87
 
88
- It configures MCP, hooks, permissions and the skill in one step, then prints a QR code and waits.
88
+ 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.
89
89
 
90
- **Show the user your output and ask them to scan that QR with their phone camera.** Scanning pairs their Pushary app, which is what hands this machine its key. A tappable link and a fingerprint print under the QR for a phone already in hand. Do not ask the user for an API key, and do not send them to a signup page first: that is the old flow and it is strictly worse.
90
+ It prints a QR, a short link under it, a fingerprint, and then waits about 15 minutes.
91
91
 
92
- Signup starts a 3-day trial and asks for a card up front, which happens in the app.
92
+ **Do not summarise that output. Show it, and walk the user through all four steps:**
93
+
94
+ 1. **Show them the QR and the short link.** Both point at the same pairing. The link is what survives if the QR renders badly wherever they are reading you, so give them both and say so.
95
+ 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it, so nobody has to restart anything.
96
+ 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app will also ask them to sign in and start a plan: $9.99/mo after a 3-day trial, card up front, all inside the app. Say this before they scan rather than letting them discover it mid-flow.
97
+ 4. **They approve.** Setup finishes on its own, and from then on your `ask_user` and `send_notification` calls arrive on their lock screen with answer buttons.
98
+
99
+ 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.
100
+
101
+ If setup exits without pairing, nothing was configured. Say that plainly and offer the two fallbacks below rather than pretending the tools are available.
93
102
 
94
103
  If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
95
104
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a human and nobody is at the terminal: 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 the user's lock screen. 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 service, $9.99/mo after a 3-day card-first trial.
3
+ 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 the user's lock screen. 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 service, $9.99/mo after a 3-day card-first trial.
4
4
  ---
5
5
 
6
6
  # Pushary - Push Notifications for AI Agents
@@ -85,11 +85,20 @@ Just run it. No account, no API key, and nothing to paste first:
85
85
  npx @pushary/agent-hooks@latest setup
86
86
  ```
87
87
 
88
- It configures MCP, hooks, permissions and the skill in one step, then prints a QR code and waits.
88
+ 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.
89
89
 
90
- **Show the user your output and ask them to scan that QR with their phone camera.** Scanning pairs their Pushary app, which is what hands this machine its key. A tappable link and a fingerprint print under the QR for a phone already in hand. Do not ask the user for an API key, and do not send them to a signup page first: that is the old flow and it is strictly worse.
90
+ It prints a QR, a short link under it, a fingerprint, and then waits about 15 minutes.
91
91
 
92
- Signup starts a 3-day trial and asks for a card up front, which happens in the app.
92
+ **Do not summarise that output. Show it, and walk the user through all four steps:**
93
+
94
+ 1. **Show them the QR and the short link.** Both point at the same pairing. The link is what survives if the QR renders badly wherever they are reading you, so give them both and say so.
95
+ 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it, so nobody has to restart anything.
96
+ 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app will also ask them to sign in and start a plan: $9.99/mo after a 3-day trial, card up front, all inside the app. Say this before they scan rather than letting them discover it mid-flow.
97
+ 4. **They approve.** Setup finishes on its own, and from then on your `ask_user` and `send_notification` calls arrive on their lock screen with answer buttons.
98
+
99
+ 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.
100
+
101
+ If setup exits without pairing, nothing was configured. Say that plainly and offer the two fallbacks below rather than pretending the tools are available.
93
102
 
94
103
  If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
95
104
 
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-DNFYUBRP.js";
5
- import "../chunk-E6I3DBJW.js";
4
+ } from "../chunk-UAWTJMXA.js";
5
+ import "../chunk-RZP3Z2WR.js";
6
6
  import "../chunk-6MTNS63X.js";
7
7
  import "../chunk-BC3VCZ3E.js";
8
- import "../chunk-PPD3HHNJ.js";
9
- import "../chunk-T6BNEQ2A.js";
8
+ import "../chunk-BT7NTTIW.js";
9
+ import "../chunk-QA5HP7CR.js";
10
10
  import "../chunk-2UMNXADU.js";
11
11
 
12
12
  // bin/pushary-bell-hook.ts
@@ -5,14 +5,14 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-DNFYUBRP.js";
8
+ } from "../chunk-UAWTJMXA.js";
9
9
  import {
10
10
  claudeSettings
11
- } from "../chunk-Q4QULGAV.js";
11
+ } from "../chunk-O55DONTG.js";
12
12
  import {
13
13
  createIo
14
- } from "../chunk-TX7KBKT7.js";
15
- import "../chunk-E6I3DBJW.js";
14
+ } from "../chunk-5RUIFDTP.js";
15
+ import "../chunk-RZP3Z2WR.js";
16
16
  import {
17
17
  readJsonSafe,
18
18
  writeJsonAtomic
@@ -21,9 +21,9 @@ import {
21
21
  parseFlags
22
22
  } from "../chunk-GMXKITVA.js";
23
23
  import "../chunk-BC3VCZ3E.js";
24
- import "../chunk-PPD3HHNJ.js";
24
+ import "../chunk-BT7NTTIW.js";
25
25
  import "../chunk-7QLSKOSU.js";
26
- import "../chunk-T6BNEQ2A.js";
26
+ import "../chunk-QA5HP7CR.js";
27
27
  import {
28
28
  exitOnHelpFlag
29
29
  } from "../chunk-RRZZ7TFJ.js";
@@ -3,7 +3,7 @@ import {
3
3
  KILL_REASON,
4
4
  isDeferAnswer,
5
5
  resolveGate
6
- } from "../chunk-PVSCRRPA.js";
6
+ } from "../chunk-FFT7L2VE.js";
7
7
  import {
8
8
  askUser,
9
9
  cancelQuestion,
@@ -15,14 +15,14 @@ import {
15
15
  reportEvent,
16
16
  scopePathFor,
17
17
  waitForAnswer
18
- } from "../chunk-FVVJ3FOW.js";
18
+ } from "../chunk-C4SQY777.js";
19
19
  import "../chunk-BSZYIAZL.js";
20
20
  import "../chunk-SAF6HGAA.js";
21
- import "../chunk-PPD3HHNJ.js";
21
+ import "../chunk-BT7NTTIW.js";
22
22
  import "../chunk-7QLSKOSU.js";
23
23
  import {
24
24
  redactSecrets
25
- } from "../chunk-T6BNEQ2A.js";
25
+ } from "../chunk-QA5HP7CR.js";
26
26
  import {
27
27
  needsShell,
28
28
  spawnClaude
@@ -4,14 +4,14 @@ import {
4
4
  shortenHome,
5
5
  unregisterPluginLocation,
6
6
  vscodeSettingsTargets
7
- } from "../chunk-WYVKPLVT.js";
7
+ } from "../chunk-HKKERYZP.js";
8
8
  import {
9
9
  removeGeminiSettings
10
- } from "../chunk-7DYFAM32.js";
10
+ } from "../chunk-DMKSHZKF.js";
11
11
  import {
12
12
  removeClaudeMcpServers,
13
13
  removePusharySettings
14
- } from "../chunk-R6AYBATA.js";
14
+ } from "../chunk-U752S5RE.js";
15
15
  import {
16
16
  claudeJson,
17
17
  claudeSettings,
@@ -29,7 +29,7 @@ import {
29
29
  pusharyDir,
30
30
  removeCodexHooks,
31
31
  vscodePluginDir
32
- } from "../chunk-Q4QULGAV.js";
32
+ } from "../chunk-O55DONTG.js";
33
33
  import {
34
34
  rejectUnknownFlags
35
35
  } from "../chunk-GMXKITVA.js";
@@ -37,7 +37,7 @@ import {
37
37
  removeClaudeAlias
38
38
  } from "../chunk-BC3VCZ3E.js";
39
39
  import "../chunk-7QLSKOSU.js";
40
- import "../chunk-T6BNEQ2A.js";
40
+ import "../chunk-QA5HP7CR.js";
41
41
  import {
42
42
  execNpm
43
43
  } from "../chunk-MUEW424A.js";
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  isGatingMoment,
4
4
  recordKeylessMoment
5
- } from "../chunk-MHA2WB7S.js";
5
+ } from "../chunk-2R63XKLG.js";
6
6
  import {
7
7
  KILL_REASON,
8
8
  denyReasonFrom,
9
9
  isDeferAnswer,
10
10
  resolveGate
11
- } from "../chunk-PVSCRRPA.js";
11
+ } from "../chunk-FFT7L2VE.js";
12
12
  import {
13
13
  CODEX_AGENT,
14
14
  DEFAULT_SESSION,
@@ -39,17 +39,17 @@ import {
39
39
  toPolicyLookup,
40
40
  toPolicyLookups,
41
41
  waitForAnswer
42
- } from "../chunk-FVVJ3FOW.js";
42
+ } from "../chunk-C4SQY777.js";
43
43
  import "../chunk-BSZYIAZL.js";
44
44
  import "../chunk-SAF6HGAA.js";
45
- import "../chunk-PPD3HHNJ.js";
45
+ import "../chunk-BT7NTTIW.js";
46
46
  import "../chunk-7QLSKOSU.js";
47
47
  import {
48
48
  DECISION_LINE_MAX,
49
49
  effectiveWaitSeconds,
50
50
  hookWaitClamped,
51
51
  hookWaitDeadline
52
- } from "../chunk-T6BNEQ2A.js";
52
+ } from "../chunk-QA5HP7CR.js";
53
53
  import {
54
54
  getMachineId
55
55
  } from "../chunk-RN3NOEJF.js";
@@ -142,7 +142,11 @@ var pushQuestion = async (apiKey, input, lookup, waitSeconds, mode) => {
142
142
  intent: readLastPrompt(input.session_id || DEFAULT_SESSION),
143
143
  action: description.slice(0, DECISION_LINE_MAX),
144
144
  blocker: deriveBlocker(mode),
145
- actionBody: deriveActionBody(input.tool_name ?? "", input.tool_input ?? {})
145
+ actionBody: deriveActionBody(input.tool_name ?? "", input.tool_input ?? {}),
146
+ // Codex has always sent this; it is what claimNotify and markApproved already
147
+ // key on locally. Passing it through lets the server collapse a retried create
148
+ // the same way, instead of putting the same approval on the phone twice.
149
+ toolUseId: input.tool_use_id
146
150
  });
147
151
  if (result.suppressed || result.noDevices) {
148
152
  return {
@@ -3,12 +3,12 @@ import {
3
3
  askUser,
4
4
  reportEvent,
5
5
  waitForAnswer
6
- } from "../chunk-FVVJ3FOW.js";
6
+ } from "../chunk-C4SQY777.js";
7
7
  import "../chunk-BSZYIAZL.js";
8
8
  import "../chunk-SAF6HGAA.js";
9
- import "../chunk-PPD3HHNJ.js";
9
+ import "../chunk-BT7NTTIW.js";
10
10
  import "../chunk-7QLSKOSU.js";
11
- import "../chunk-T6BNEQ2A.js";
11
+ import "../chunk-QA5HP7CR.js";
12
12
  import {
13
13
  getMachineId
14
14
  } from "../chunk-RN3NOEJF.js";
@@ -3,20 +3,20 @@ import {
3
3
  confirmAppConnection,
4
4
  connectDevice,
5
5
  printConnectInstructions
6
- } from "../chunk-BOMF4C2Q.js";
6
+ } from "../chunk-R3AEWBAZ.js";
7
7
  import "../chunk-3EGEA4KH.js";
8
8
  import {
9
9
  printKeyCheck
10
- } from "../chunk-U2PZKYZM.js";
10
+ } from "../chunk-3JDIGKPV.js";
11
11
  import {
12
12
  checkApiKey
13
- } from "../chunk-EBP4YG75.js";
13
+ } from "../chunk-CXGJTN74.js";
14
14
  import {
15
15
  createIo
16
- } from "../chunk-TX7KBKT7.js";
16
+ } from "../chunk-5RUIFDTP.js";
17
17
  import {
18
18
  readKeySource
19
- } from "../chunk-E6I3DBJW.js";
19
+ } from "../chunk-RZP3Z2WR.js";
20
20
  import "../chunk-6MTNS63X.js";
21
21
  import {
22
22
  parseFlags
@@ -24,11 +24,11 @@ import {
24
24
  import "../chunk-BC3VCZ3E.js";
25
25
  import "../chunk-BSZYIAZL.js";
26
26
  import "../chunk-SAF6HGAA.js";
27
- import "../chunk-PPD3HHNJ.js";
27
+ import "../chunk-BT7NTTIW.js";
28
28
  import {
29
29
  UsageError
30
30
  } from "../chunk-7QLSKOSU.js";
31
- import "../chunk-T6BNEQ2A.js";
31
+ import "../chunk-QA5HP7CR.js";
32
32
  import {
33
33
  exitOnHelpFlag
34
34
  } from "../chunk-RRZZ7TFJ.js";
@@ -6,7 +6,7 @@ import {
6
6
  claudeWired,
7
7
  codexWired,
8
8
  geminiWired
9
- } from "../chunk-UBUPETEQ.js";
9
+ } from "../chunk-V6MCBCUC.js";
10
10
  import {
11
11
  agentProbes,
12
12
  detectAgent,
@@ -15,12 +15,12 @@ import {
15
15
  isDetected,
16
16
  isPluginRegistered,
17
17
  vscodeSettingsTargets
18
- } from "../chunk-WYVKPLVT.js";
18
+ } from "../chunk-HKKERYZP.js";
19
19
  import {
20
20
  GEMINI_HOOK_BINARY,
21
21
  hasGeminiHooks,
22
22
  missingGeminiHookEvents
23
- } from "../chunk-7DYFAM32.js";
23
+ } from "../chunk-DMKSHZKF.js";
24
24
  import {
25
25
  claudeJson,
26
26
  claudeSettings,
@@ -39,29 +39,29 @@ import {
39
39
  readCodexMcpAuth,
40
40
  untrustedCodexHookEvents,
41
41
  vscodePluginDir
42
- } from "../chunk-Q4QULGAV.js";
42
+ } from "../chunk-O55DONTG.js";
43
43
  import {
44
44
  readLedgerSummary
45
- } from "../chunk-MHA2WB7S.js";
45
+ } from "../chunk-2R63XKLG.js";
46
46
  import {
47
47
  describeReach,
48
48
  describeRoundTrip,
49
49
  fetchChannels,
50
50
  reachVerdict,
51
51
  verifyRoundTrip
52
- } from "../chunk-BOMF4C2Q.js";
52
+ } from "../chunk-R3AEWBAZ.js";
53
53
  import "../chunk-3EGEA4KH.js";
54
54
  import {
55
55
  checkApiKey,
56
56
  describeKeyCheck
57
- } from "../chunk-EBP4YG75.js";
57
+ } from "../chunk-CXGJTN74.js";
58
58
  import {
59
59
  createIo
60
- } from "../chunk-TX7KBKT7.js";
60
+ } from "../chunk-5RUIFDTP.js";
61
61
  import {
62
62
  keyPrefix,
63
63
  readKeySource
64
- } from "../chunk-E6I3DBJW.js";
64
+ } from "../chunk-RZP3Z2WR.js";
65
65
  import "../chunk-6MTNS63X.js";
66
66
  import {
67
67
  parseFlags
@@ -72,11 +72,11 @@ import {
72
72
  sendMcpRequest
73
73
  } from "../chunk-BSZYIAZL.js";
74
74
  import "../chunk-SAF6HGAA.js";
75
- import "../chunk-PPD3HHNJ.js";
75
+ import "../chunk-BT7NTTIW.js";
76
76
  import {
77
77
  UsageError
78
78
  } from "../chunk-7QLSKOSU.js";
79
- import "../chunk-T6BNEQ2A.js";
79
+ import "../chunk-QA5HP7CR.js";
80
80
  import {
81
81
  execNpm
82
82
  } from "../chunk-MUEW424A.js";
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  isGatingMoment,
4
4
  recordKeylessMoment
5
- } from "../chunk-MHA2WB7S.js";
5
+ } from "../chunk-2R63XKLG.js";
6
6
  import {
7
7
  KILL_REASON,
8
8
  denyReasonFrom,
9
9
  isDeferAnswer,
10
10
  resolveGate
11
- } from "../chunk-PVSCRRPA.js";
11
+ } from "../chunk-FFT7L2VE.js";
12
12
  import {
13
13
  DEFAULT_SESSION,
14
14
  askUser,
@@ -30,17 +30,17 @@ import {
30
30
  scopePathFor,
31
31
  sendNotification,
32
32
  waitForAnswer
33
- } from "../chunk-FVVJ3FOW.js";
33
+ } from "../chunk-C4SQY777.js";
34
34
  import "../chunk-BSZYIAZL.js";
35
35
  import "../chunk-SAF6HGAA.js";
36
- import "../chunk-PPD3HHNJ.js";
36
+ import "../chunk-BT7NTTIW.js";
37
37
  import "../chunk-7QLSKOSU.js";
38
38
  import {
39
39
  DECISION_LINE_MAX,
40
40
  effectiveWaitSeconds,
41
41
  hookWaitClamped,
42
42
  hookWaitDeadline
43
- } from "../chunk-T6BNEQ2A.js";
43
+ } from "../chunk-QA5HP7CR.js";
44
44
  import {
45
45
  getMachineId
46
46
  } from "../chunk-RN3NOEJF.js";
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePreToolUse
4
- } from "../chunk-JU72KNUB.js";
5
- import "../chunk-R6AYBATA.js";
6
- import "../chunk-MHA2WB7S.js";
7
- import "../chunk-PVSCRRPA.js";
8
- import "../chunk-FVVJ3FOW.js";
4
+ } from "../chunk-E7YX7CTM.js";
5
+ import "../chunk-U752S5RE.js";
6
+ import "../chunk-2R63XKLG.js";
7
+ import "../chunk-FFT7L2VE.js";
8
+ import "../chunk-C4SQY777.js";
9
9
  import "../chunk-BSZYIAZL.js";
10
10
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-PPD3HHNJ.js";
11
+ import "../chunk-BT7NTTIW.js";
12
12
  import "../chunk-7QLSKOSU.js";
13
- import "../chunk-T6BNEQ2A.js";
13
+ import "../chunk-QA5HP7CR.js";
14
14
  import "../chunk-RN3NOEJF.js";
15
15
  import {
16
16
  exitOnHelpFlag
@@ -6,27 +6,27 @@ import "../chunk-3EGEA4KH.js";
6
6
  import {
7
7
  checkApiKey,
8
8
  describeKeyCheck
9
- } from "../chunk-EBP4YG75.js";
9
+ } from "../chunk-CXGJTN74.js";
10
10
  import {
11
11
  createIo
12
- } from "../chunk-TX7KBKT7.js";
12
+ } from "../chunk-5RUIFDTP.js";
13
13
  import {
14
14
  readKeySource,
15
15
  writeKey
16
- } from "../chunk-E6I3DBJW.js";
16
+ } from "../chunk-RZP3Z2WR.js";
17
17
  import "../chunk-6MTNS63X.js";
18
18
  import {
19
19
  parseFlags
20
20
  } from "../chunk-GMXKITVA.js";
21
21
  import "../chunk-BC3VCZ3E.js";
22
22
  import "../chunk-SAF6HGAA.js";
23
- import "../chunk-PPD3HHNJ.js";
23
+ import "../chunk-BT7NTTIW.js";
24
24
  import {
25
25
  UsageError
26
26
  } from "../chunk-7QLSKOSU.js";
27
27
  import {
28
28
  isValidApiKey
29
- } from "../chunk-T6BNEQ2A.js";
29
+ } from "../chunk-QA5HP7CR.js";
30
30
  import {
31
31
  exitOnHelpFlag
32
32
  } from "../chunk-RRZZ7TFJ.js";
@@ -4,24 +4,24 @@ import {
4
4
  codexConfigToml,
5
5
  cursorUserMcp,
6
6
  geminiSettings
7
- } from "../chunk-Q4QULGAV.js";
7
+ } from "../chunk-O55DONTG.js";
8
8
  import {
9
9
  createIo
10
- } from "../chunk-TX7KBKT7.js";
10
+ } from "../chunk-5RUIFDTP.js";
11
11
  import {
12
12
  clearKey,
13
13
  readKeySource
14
- } from "../chunk-E6I3DBJW.js";
14
+ } from "../chunk-RZP3Z2WR.js";
15
15
  import "../chunk-6MTNS63X.js";
16
16
  import {
17
17
  parseFlags
18
18
  } from "../chunk-GMXKITVA.js";
19
19
  import "../chunk-BC3VCZ3E.js";
20
- import "../chunk-PPD3HHNJ.js";
20
+ import "../chunk-BT7NTTIW.js";
21
21
  import {
22
22
  UsageError
23
23
  } from "../chunk-7QLSKOSU.js";
24
- import "../chunk-T6BNEQ2A.js";
24
+ import "../chunk-QA5HP7CR.js";
25
25
  import {
26
26
  exitOnHelpFlag
27
27
  } from "../chunk-RRZZ7TFJ.js";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exitOnFailedResponse
4
- } from "../chunk-U2PZKYZM.js";
5
- import "../chunk-EBP4YG75.js";
4
+ } from "../chunk-3JDIGKPV.js";
5
+ import "../chunk-CXGJTN74.js";
6
6
  import {
7
7
  createIo
8
- } from "../chunk-TX7KBKT7.js";
8
+ } from "../chunk-5RUIFDTP.js";
9
9
  import {
10
10
  rejectUnknownFlags
11
11
  } from "../chunk-GMXKITVA.js";
@@ -13,7 +13,7 @@ import "../chunk-SAF6HGAA.js";
13
13
  import {
14
14
  UsageError
15
15
  } from "../chunk-7QLSKOSU.js";
16
- import "../chunk-T6BNEQ2A.js";
16
+ import "../chunk-QA5HP7CR.js";
17
17
  import {
18
18
  exitOnHelpFlag
19
19
  } from "../chunk-RRZZ7TFJ.js";
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleNotification
4
- } from "../chunk-FVVJ3FOW.js";
4
+ } from "../chunk-C4SQY777.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
- import "../chunk-PPD3HHNJ.js";
7
+ import "../chunk-BT7NTTIW.js";
8
8
  import "../chunk-7QLSKOSU.js";
9
- import "../chunk-T6BNEQ2A.js";
9
+ import "../chunk-QA5HP7CR.js";
10
10
  import "../chunk-RN3NOEJF.js";
11
11
  import "../chunk-2UMNXADU.js";
12
12
  import "../chunk-KZERVKTD.js";
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionDenied
4
- } from "../chunk-JU72KNUB.js";
5
- import "../chunk-R6AYBATA.js";
6
- import "../chunk-MHA2WB7S.js";
7
- import "../chunk-PVSCRRPA.js";
8
- import "../chunk-FVVJ3FOW.js";
4
+ } from "../chunk-E7YX7CTM.js";
5
+ import "../chunk-U752S5RE.js";
6
+ import "../chunk-2R63XKLG.js";
7
+ import "../chunk-FFT7L2VE.js";
8
+ import "../chunk-C4SQY777.js";
9
9
  import "../chunk-BSZYIAZL.js";
10
10
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-PPD3HHNJ.js";
11
+ import "../chunk-BT7NTTIW.js";
12
12
  import "../chunk-7QLSKOSU.js";
13
- import "../chunk-T6BNEQ2A.js";
13
+ import "../chunk-QA5HP7CR.js";
14
14
  import "../chunk-RN3NOEJF.js";
15
15
  import "../chunk-2UMNXADU.js";
16
16
  import "../chunk-KZERVKTD.js";