pushary 1.9.31 → 1.9.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/data/SKILL.md +6 -7
  3. package/data/cowork/SKILL.md +2 -2
  4. package/data/cursor-plugin/rules/pushary.mdc +1 -1
  5. package/data/cursor-plugin/skills/pushary/SKILL.md +6 -7
  6. package/data/vscode-plugin/skills/pushary/SKILL.md +6 -7
  7. package/dist/bin/pushary-bell-hook.js +25 -25
  8. package/dist/bin/pushary-bell.js +9 -9
  9. package/dist/bin/pushary-claude.js +24 -24
  10. package/dist/bin/pushary-clean.js +29 -29
  11. package/dist/bin/pushary-codex-bridge.js +17 -17
  12. package/dist/bin/pushary-codex-hook.js +30 -30
  13. package/dist/bin/pushary-codex.js +12 -12
  14. package/dist/bin/pushary-connect.js +24 -24
  15. package/dist/bin/pushary-cowork.js +5 -5
  16. package/dist/bin/pushary-daemon.js +32 -32
  17. package/dist/bin/pushary-disconnect.js +24 -24
  18. package/dist/bin/pushary-doctor.js +33 -33
  19. package/dist/bin/pushary-elicitation-hook.js +25 -25
  20. package/dist/bin/pushary-gemini-bridge.js +13 -13
  21. package/dist/bin/pushary-gemini-hook.js +27 -27
  22. package/dist/bin/pushary-hook.js +29 -29
  23. package/dist/bin/pushary-login.js +12 -12
  24. package/dist/bin/pushary-logout.js +24 -24
  25. package/dist/bin/pushary-mcp.js +9 -9
  26. package/dist/bin/pushary-mode.js +12 -12
  27. package/dist/bin/pushary-notification-hook.js +24 -24
  28. package/dist/bin/pushary-opencode-hook.js +26 -26
  29. package/dist/bin/pushary-permission-denied-hook.js +29 -29
  30. package/dist/bin/pushary-permission-hook.js +28 -28
  31. package/dist/bin/pushary-post-hook.js +24 -24
  32. package/dist/bin/pushary-prompt-hook.js +24 -24
  33. package/dist/bin/pushary-session-end-hook.js +24 -24
  34. package/dist/bin/pushary-session-start-hook.js +28 -28
  35. package/dist/bin/pushary-setup.js +35 -35
  36. package/dist/bin/pushary-stats.js +5 -5
  37. package/dist/bin/pushary-status.js +26 -26
  38. package/dist/bin/pushary-stop-hook.js +24 -24
  39. package/dist/bin/pushary-stopfailure-hook.js +24 -24
  40. package/dist/bin/pushary-suggestions.js +12 -12
  41. package/dist/bin/pushary-transcript-register.js +17 -17
  42. package/dist/bin/pushary-transcripts.js +7 -7
  43. package/dist/bin/pushary-upgrade.js +30 -30
  44. package/dist/bin/pushary-wait.js +12 -12
  45. package/dist/bin/pushary.js +6 -6
  46. package/dist/{chunk-4WGKAGIU.js → chunk-22YSHBTI.js} +3 -3
  47. package/dist/{chunk-IDGESFKZ.js → chunk-36ZCFJUI.js} +1 -1
  48. package/dist/{chunk-GROYT52D.js → chunk-3FOPVVNO.js} +4 -4
  49. package/dist/{chunk-5EX2SD5N.js → chunk-3LS3GFJW.js} +1 -1
  50. package/dist/{chunk-2ROXUEZV.js → chunk-45OXG3VR.js} +1 -1
  51. package/dist/{chunk-EPVY3JU3.js → chunk-4PIAOJAW.js} +1 -1
  52. package/dist/{chunk-AXANUGOV.js → chunk-4TFD3WAA.js} +2 -2
  53. package/dist/{chunk-35RJKPIC.js → chunk-57FFQR46.js} +1 -1
  54. package/dist/{chunk-FXJ5SEQT.js → chunk-6OGDGQTT.js} +5 -5
  55. package/dist/{chunk-TDLEFGAM.js → chunk-7FQL5NWJ.js} +117 -99
  56. package/dist/{chunk-SYUHM6V3.js → chunk-7IVV4LLF.js} +3 -3
  57. package/dist/{chunk-SAHD5DYW.js → chunk-7S7H7V5V.js} +4 -4
  58. package/dist/{chunk-SJJA2GPD.js → chunk-7UGGCTTW.js} +2 -2
  59. package/dist/{chunk-Q2GSTQ3R.js → chunk-A455TSHF.js} +2 -2
  60. package/dist/{chunk-CJCVPCOB.js → chunk-A5FFSXZE.js} +2 -2
  61. package/dist/{chunk-ALSIMOFS.js → chunk-B5RLJ6QD.js} +4 -4
  62. package/dist/{chunk-7447DYNW.js → chunk-CK3W7Q5S.js} +1 -1
  63. package/dist/{chunk-GSBOLJZ4.js → chunk-CPYOJRDN.js} +85 -48
  64. package/dist/{chunk-IKJJB4QG.js → chunk-DCBSD22V.js} +3 -3
  65. package/dist/{chunk-4JOWKPUF.js → chunk-DQKEGNTI.js} +1 -1
  66. package/dist/{chunk-D3TVRNZC.js → chunk-E2OZZZKP.js} +2 -2
  67. package/dist/{chunk-QGCEQGH6.js → chunk-EGTRIM74.js} +4 -4
  68. package/dist/{chunk-X5HK4XUN.js → chunk-EJWSE7S7.js} +5 -5
  69. package/dist/{chunk-N4LLBUU2.js → chunk-FDNMQEU6.js} +2 -2
  70. package/dist/{chunk-VFNYTVTJ.js → chunk-FPYBX36E.js} +5 -5
  71. package/dist/{chunk-OSUAY4SA.js → chunk-FQQSW7MD.js} +1 -1
  72. package/dist/{chunk-5F32ZTWD.js → chunk-FYQG2UTK.js} +2 -2
  73. package/dist/{chunk-QCOE42GO.js → chunk-GC3SUMYD.js} +4 -4
  74. package/dist/{chunk-FEICGRNI.js → chunk-H52HBSOD.js} +3 -3
  75. package/dist/{chunk-IIP4LEO3.js → chunk-HJNCVY5F.js} +7 -7
  76. package/dist/{chunk-H2PQXK26.js → chunk-HQKYWUBF.js} +2 -2
  77. package/dist/{chunk-BMUTA66M.js → chunk-HVUBWLER.js} +11 -11
  78. package/dist/{chunk-7S4Z36H7.js → chunk-IRU7DKJW.js} +3 -3
  79. package/dist/{chunk-3EIJDBVB.js → chunk-LOYSI2CZ.js} +5 -5
  80. package/dist/{chunk-MG523AVN.js → chunk-NKAMF2YJ.js} +1 -1
  81. package/dist/{chunk-KBRKQMCI.js → chunk-NMQLY4PE.js} +2 -2
  82. package/dist/{chunk-464FX6W5.js → chunk-OZMGO4WF.js} +6 -7
  83. package/dist/{chunk-77J4RVB2.js → chunk-PEEJP4HN.js} +4 -4
  84. package/dist/{chunk-OS6AE2MR.js → chunk-QJ3ENGBT.js} +3 -3
  85. package/dist/{chunk-X427XA76.js → chunk-SMRMWDFE.js} +8 -8
  86. package/dist/{chunk-MRR4NQ3H.js → chunk-SMSX4TCC.js} +1 -1
  87. package/dist/{chunk-SQIZGUAN.js → chunk-U7CN5HG2.js} +5 -5
  88. package/dist/{chunk-5FNE6ZVV.js → chunk-UDECNZYI.js} +2 -2
  89. package/dist/{chunk-NTWTU6FA.js → chunk-ULJFIF5N.js} +1 -1
  90. package/dist/{chunk-SRRJLA24.js → chunk-UPRNSD2T.js} +4 -4
  91. package/dist/{chunk-OTDRNEED.js → chunk-V4ZIG66K.js} +1 -1
  92. package/dist/{chunk-DP2FAIW6.js → chunk-VTAC5FBZ.js} +1 -1
  93. package/dist/{chunk-OULHOX5C.js → chunk-WFPXKCN4.js} +5 -5
  94. package/dist/{chunk-RN3KZDWP.js → chunk-WMB3OCI4.js} +2 -2
  95. package/dist/{chunk-75UCMLT5.js → chunk-WPSI4246.js} +1 -1
  96. package/dist/{chunk-ZYDSHR5P.js → chunk-XLXG6MA5.js} +3 -3
  97. package/dist/{chunk-5GDNIEL5.js → chunk-YABMIGR3.js} +1 -1
  98. package/dist/{chunk-FGFFUCEL.js → chunk-YRDNKY77.js} +6 -6
  99. package/dist/{chunk-Q7H2IMJQ.js → chunk-Z6HDYK2A.js} +2 -2
  100. package/dist/{global-upgrade-YMBTZHDP.js → global-upgrade-IZCB4WIE.js} +6 -6
  101. package/dist/{paths-BPFRUWMB.js → paths-4WAA57P5.js} +2 -2
  102. package/dist/{reapply-ZC2LSUVZ.js → reapply-GJ73ZHDD.js} +20 -20
  103. package/dist/src/index.js +19 -19
  104. package/dist/{upgrade-lock-TTZMLZPB.js → upgrade-lock-J5PIKSYV.js} +3 -3
  105. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.34
4
+
5
+ - Live questions keep waiting when a tool poll ends; agent instructions no longer cancel them after one retry.
6
+ - Questions preserve every point up to 8,000 characters instead of being silently cut to 500. Notification previews stay short.
7
+
8
+ ## 1.9.33
9
+
10
+ - Session history keeps saving a conversation when the history process is stopped during that conversation's first upload. It used to make a new encryption key on restart, which the server refused, and the rest of that conversation was never saved.
11
+ - When the server cannot take history uploads, retries wait up to 12 seconds instead of repeating every 3 seconds, and go back to every 3 seconds as soon as one is accepted.
12
+ - A finished session with nothing to save, or one another Pushary process is already saving, stops being watched. Before, it held one of the 32 history slots for up to two days.
13
+
14
+ ## 1.9.32
15
+
16
+ - A paused session keeps asking about destructive PowerShell and Monitor commands, just as it does for Bash.
17
+ - SQLite bracket identifiers cannot hide a later write behind a comment marker. MySQL and MariaDB bracket syntax asks when the server's SQL mode is unknown; PostgreSQL and GoogleSQL array reads keep running.
18
+ - SQL writes next to quoted identifiers, such as `UPDATE[users]SET[x]=2`, ask even without spaces between the tokens.
19
+ - Commands beyond the remote API inspection limit ask for approval.
20
+
3
21
  ## 1.9.31
4
22
 
5
23
  - SQL sent through `psql`, `mysql` and `mariadb` is now read the way the database reads it. These used to run under an approve rule and now ask: a write after a dollar quote with a non-ASCII tag, such as `psql -c 'SELECT $é$ -- $é$; UPDATE users SET x=1'`; a write after a carriage return that ends a `--` comment; and a write inside a MySQL `/*! ... */` or MariaDB `/*M! ... */` comment, which those clients run.
package/data/SKILL.md CHANGED
@@ -410,8 +410,8 @@ decision belongs in the current client (`status: "notified"`), or you passed
410
410
  otherwise `nextAction`.
411
411
 
412
412
  For backward compatibility, `nextAction` keeps its original two values. A live timeout from `ask_user` says
413
- `wait_for_answer`; poll once with `timeoutMs: 55000`. An unanswered poll says
414
- `handoffAction: cancel_then_ask_in_current_client`: cancel the phone question before asking in
413
+ `wait_for_answer`; keep polling the same correlationId with `timeoutMs: 55000` while pending. The question stays open until answered, explicitly cancelled or expired. Only an explicit
414
+ `handoffAction: cancel_then_ask_in_current_client` asks you to cancel the phone question before asking in
415
415
  the current chat or client. If cancellation returns `handoffAction: "stop"`, stop.
416
416
  Otherwise, if cancellation returns false, poll once for 1 second
417
417
  and honor any answer that won the race. A cancelled question says `handoffAction:
@@ -462,8 +462,7 @@ rule, so an approval you label once is an approval they never see again.
462
462
 
463
463
  Poll for the user's response to a question sent via `ask_user` with `wait: false`, or to one that timed out. Not needed when using the default blocking mode.
464
464
 
465
- A single call waits at most 55 seconds. Use it once after a live `ask_user`
466
- timeout. If it returns `answered: false`, follow `handoffAction` when present,
465
+ A single call waits at most 55 seconds. Keep waiting with the same correlationId while pending; the poll timeout is not the question deadline. If it returns `answered: false`, follow `handoffAction` when present,
467
466
  otherwise `nextAction`: ask in the current chat or client only after cancelling a still-pending phone question. If the
468
467
  cancellation loses a race, poll once for 1 second and honor the phone answer
469
468
  instead. Only `status: "pending"` means the question is still live; cancelled,
@@ -535,8 +534,8 @@ The result tells you whether you got it right. **`hookSeen: false` means no agen
535
534
 
536
535
  `ratified` and `answered` are separate on purpose. Answered but not ratified means the user declined: ask which boundary they want, and do **not** proceed as if they had agreed. Not answered means no scope is in force.
537
536
 
538
- An unanswered proposal returns its `correlationId`. Poll it once; a late phone
539
- yes ratifies the exact stored proposal. If that poll is still pending, cancel it
537
+ An unanswered proposal returns its `correlationId`. Keep waiting while pending; a phone
538
+ yes ratifies the exact stored proposal. Only an explicit handoff asks you to cancel it
540
539
  before asking in the current chat whether to continue without an enforced scope.
541
540
  If cancellation returns `handoffAction: "stop"`, stop. Otherwise, if cancellation
542
541
  returns false, poll once for 1 second and honor the phone answer
@@ -567,7 +566,7 @@ attention rather than getting you answered sooner.
567
566
 
568
567
  Honor authorization already granted in this session. Ask only for a missing decision or an action outside that authorization, or when an enforced host policy requires it. A multi-step task alone does not require plan approval. Never ask again merely because the next authorized step deletes, deploys or publishes something. These skills guide the agent; supported hooks and runtime approval gates enforce policy. Do not bypass an enforced gate.
569
568
 
570
- Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Follow the returned handoff rather than inventing a retry loop. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
569
+ Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Keep waiting with the same correlationId while pending. A poll ending does not expire the question; never cancel just because a poll returned without an answer. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
571
570
 
572
571
  Delivery is controlled by the user's policy: `push_first` uses presence, `push_only` requests push every time, `notify_only` leaves the decision in the current client, and `terminal_only` avoids push. Do not override the mode or duplicate a question on every surface. The runtime owns delivery, expiry and settlement; do not claim that a reply can restart an ended agent turn.
573
572
 
@@ -38,11 +38,11 @@ Do not create a question just to keep the turn alive or ask for optional feedbac
38
38
 
39
39
  ## How to wait for answers
40
40
 
41
- Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Follow the returned handoff rather than inventing a retry loop. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
41
+ Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Keep waiting with the same correlationId while pending. A poll ending does not expire the question; never cancel just because a poll returned without an answer. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
42
42
 
43
43
  Delivery is controlled by the user's policy: `push_first` uses presence, `push_only` requests push every time, `notify_only` leaves the decision in the current client, and `terminal_only` avoids push. Do not override the mode or duplicate a question on every surface. The runtime owns delivery, expiry and settlement; do not claim that a reply can restart an ended agent turn.
44
44
 
45
- - If `ask_user` times out, call `wait_for_answer` once with the same question id. If it is still pending, cancel it before asking in the current client. If cancellation returns `handoffAction: "stop"`, stop. Otherwise, if cancellation returns false, poll once for 1 second and honor the answer that won the race.
45
+ - If a poll ends while pending, keep waiting with the same question id. Cancel only when explicitly handing off or the answer is no longer needed. If cancellation returns `handoffAction: "stop"`, stop. Otherwise, if cancellation returns false, poll once for 1 second and honor the answer that won the race.
46
46
  - On long tasks where the user might be away, prefer `send_notification` with `context.askQuestion` over a blocking `ask_user`. The user can answer from the notification page while the question remains live. Poll the returned `linkedCorrelationId` once when you need the result, then follow the returned handoff; do not promise an overnight wait or a reply after the turn ends.
47
47
  - Use `cancel_question` to retract a question that is no longer needed.
48
48
 
@@ -16,7 +16,7 @@ When Pushary is connected, it is your channel for reaching the user. Any time yo
16
16
  - A name, a path, a value, or other free text. Use type "input".
17
17
  - Approval of a plan or an approach before you start. Use type "select" with the options the user is choosing between, or "confirm" to approve a single plan.
18
18
 
19
- `ask_user` blocks and returns `{ answered, value, nextAction, handoffAction }`. Always set `context` to one line on what you are doing, and set `agentName` to "Cursor - {project}". If `answered` is false, follow `handoffAction` when present, otherwise `nextAction`: poll once when instructed, then cancel a live phone question before asking in the current chat. Never assume approval.
19
+ `ask_user` blocks and returns `{ answered, value, nextAction, handoffAction }`. Always set `context` to one line on what you are doing, and set `agentName` to "Cursor - {project}". If `answered` is false, follow `handoffAction` when present, otherwise `nextAction`: keep waiting with the same correlationId while pending. Cancel only for an explicit handoff or when the answer is no longer needed. Never assume approval.
20
20
 
21
21
  If the user answers in the chat before the push comes back, call `cancel_question` with the correlationId before acting. If cancellation returns `handoffAction: "stop"`, stop. Otherwise, if cancellation returns false, poll once for 1 second and honor any phone answer that won the race.
22
22
 
@@ -403,8 +403,8 @@ decision belongs in the current client (`status: "notified"`), or you passed
403
403
  otherwise `nextAction`.
404
404
 
405
405
  For backward compatibility, `nextAction` keeps its original two values. A live timeout from `ask_user` says
406
- `wait_for_answer`; poll once with `timeoutMs: 55000`. An unanswered poll says
407
- `handoffAction: cancel_then_ask_in_current_client`: cancel the phone question before asking in
406
+ `wait_for_answer`; keep polling the same correlationId with `timeoutMs: 55000` while pending. The question stays open until answered, explicitly cancelled or expired. Only an explicit
407
+ `handoffAction: cancel_then_ask_in_current_client` asks you to cancel the phone question before asking in
408
408
  the current chat or client. If cancellation returns `handoffAction: "stop"`, stop.
409
409
  Otherwise, if cancellation returns false, poll once for 1 second
410
410
  and honor any answer that won the race. A cancelled question says `handoffAction:
@@ -455,8 +455,7 @@ rule, so an approval you label once is an approval they never see again.
455
455
 
456
456
  Poll for the user's response to a question sent via `ask_user` with `wait: false`, or to one that timed out. Not needed when using the default blocking mode.
457
457
 
458
- A single call waits at most 55 seconds. Use it once after a live `ask_user`
459
- timeout. If it returns `answered: false`, follow `handoffAction` when present,
458
+ A single call waits at most 55 seconds. Keep waiting with the same correlationId while pending; the poll timeout is not the question deadline. If it returns `answered: false`, follow `handoffAction` when present,
460
459
  otherwise `nextAction`: ask in the current chat or client only after cancelling a still-pending phone question. If the
461
460
  cancellation loses a race, poll once for 1 second and honor the phone answer
462
461
  instead. Only `status: "pending"` means the question is still live; cancelled,
@@ -528,8 +527,8 @@ The result tells you whether you got it right. **`hookSeen: false` means no agen
528
527
 
529
528
  `ratified` and `answered` are separate on purpose. Answered but not ratified means the user declined: ask which boundary they want, and do **not** proceed as if they had agreed. Not answered means no scope is in force.
530
529
 
531
- An unanswered proposal returns its `correlationId`. Poll it once; a late phone
532
- yes ratifies the exact stored proposal. If that poll is still pending, cancel it
530
+ An unanswered proposal returns its `correlationId`. Keep waiting while pending; a phone
531
+ yes ratifies the exact stored proposal. Only an explicit handoff asks you to cancel it
533
532
  before asking in the current chat whether to continue without an enforced scope.
534
533
  If cancellation returns `handoffAction: "stop"`, stop. Otherwise, if cancellation
535
534
  returns false, poll once for 1 second and honor the phone answer
@@ -560,7 +559,7 @@ attention rather than getting you answered sooner.
560
559
 
561
560
  Honor authorization already granted in this session. Ask only for a missing decision or an action outside that authorization, or when an enforced host policy requires it. A multi-step task alone does not require plan approval. Never ask again merely because the next authorized step deletes, deploys or publishes something. These skills guide the agent; supported hooks and runtime approval gates enforce policy. Do not bypass an enforced gate.
562
561
 
563
- Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Follow the returned handoff rather than inventing a retry loop. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
562
+ Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Keep waiting with the same correlationId while pending. A poll ending does not expire the question; never cancel just because a poll returned without an answer. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
564
563
 
565
564
  Delivery is controlled by the user's policy: `push_first` uses presence, `push_only` requests push every time, `notify_only` leaves the decision in the current client, and `terminal_only` avoids push. Do not override the mode or duplicate a question on every surface. The runtime owns delivery, expiry and settlement; do not claim that a reply can restart an ended agent turn.
566
565
 
@@ -403,8 +403,8 @@ decision belongs in the current client (`status: "notified"`), or you passed
403
403
  otherwise `nextAction`.
404
404
 
405
405
  For backward compatibility, `nextAction` keeps its original two values. A live timeout from `ask_user` says
406
- `wait_for_answer`; poll once with `timeoutMs: 55000`. An unanswered poll says
407
- `handoffAction: cancel_then_ask_in_current_client`: cancel the phone question before asking in
406
+ `wait_for_answer`; keep polling the same correlationId with `timeoutMs: 55000` while pending. The question stays open until answered, explicitly cancelled or expired. Only an explicit
407
+ `handoffAction: cancel_then_ask_in_current_client` asks you to cancel the phone question before asking in
408
408
  the current chat or client. If cancellation returns `handoffAction: "stop"`, stop.
409
409
  Otherwise, if cancellation returns false, poll once for 1 second
410
410
  and honor any answer that won the race. A cancelled question says `handoffAction:
@@ -455,8 +455,7 @@ rule, so an approval you label once is an approval they never see again.
455
455
 
456
456
  Poll for the user's response to a question sent via `ask_user` with `wait: false`, or to one that timed out. Not needed when using the default blocking mode.
457
457
 
458
- A single call waits at most 55 seconds. Use it once after a live `ask_user`
459
- timeout. If it returns `answered: false`, follow `handoffAction` when present,
458
+ A single call waits at most 55 seconds. Keep waiting with the same correlationId while pending; the poll timeout is not the question deadline. If it returns `answered: false`, follow `handoffAction` when present,
460
459
  otherwise `nextAction`: ask in the current chat or client only after cancelling a still-pending phone question. If the
461
460
  cancellation loses a race, poll once for 1 second and honor the phone answer
462
461
  instead. Only `status: "pending"` means the question is still live; cancelled,
@@ -528,8 +527,8 @@ The result tells you whether you got it right. **`hookSeen: false` means no agen
528
527
 
529
528
  `ratified` and `answered` are separate on purpose. Answered but not ratified means the user declined: ask which boundary they want, and do **not** proceed as if they had agreed. Not answered means no scope is in force.
530
529
 
531
- An unanswered proposal returns its `correlationId`. Poll it once; a late phone
532
- yes ratifies the exact stored proposal. If that poll is still pending, cancel it
530
+ An unanswered proposal returns its `correlationId`. Keep waiting while pending; a phone
531
+ yes ratifies the exact stored proposal. Only an explicit handoff asks you to cancel it
533
532
  before asking in the current chat whether to continue without an enforced scope.
534
533
  If cancellation returns `handoffAction: "stop"`, stop. Otherwise, if cancellation
535
534
  returns false, poll once for 1 second and honor the phone answer
@@ -560,7 +559,7 @@ attention rather than getting you answered sooner.
560
559
 
561
560
  Honor authorization already granted in this session. Ask only for a missing decision or an action outside that authorization, or when an enforced host policy requires it. A multi-step task alone does not require plan approval. Never ask again merely because the next authorized step deletes, deploys or publishes something. These skills guide the agent; supported hooks and runtime approval gates enforce policy. Do not bypass an enforced gate.
562
561
 
563
- Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Follow the returned handoff rather than inventing a retry loop. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
562
+ Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Keep waiting with the same correlationId while pending. A poll ending does not expire the question; never cancel just because a poll returned without an answer. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing “yes” is answer data, not approval of a separate action.
564
563
 
565
564
  Delivery is controlled by the user's policy: `push_first` uses presence, `push_only` requests push every time, `notify_only` leaves the decision in the current client, and `terminal_only` avoids push. Do not override the mode or duplicate a question on every surface. The runtime owns delivery, expiry and settlement; do not claim that a reply can restart an ended agent turn.
566
565
 
@@ -1,41 +1,41 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-75UCMLT5.js";
4
+ } from "../chunk-WPSI4246.js";
5
5
  import {
6
6
  readHookInput
7
- } from "../chunk-ALSIMOFS.js";
8
- import "../chunk-GSBOLJZ4.js";
7
+ } from "../chunk-B5RLJ6QD.js";
8
+ import "../chunk-CPYOJRDN.js";
9
9
  import "../chunk-DWQYCOPI.js";
10
- import "../chunk-VFNYTVTJ.js";
11
- import "../chunk-7447DYNW.js";
12
- import "../chunk-EPVY3JU3.js";
13
- import "../chunk-MRR4NQ3H.js";
10
+ import "../chunk-FPYBX36E.js";
11
+ import "../chunk-CK3W7Q5S.js";
12
+ import "../chunk-4PIAOJAW.js";
13
+ import "../chunk-SMSX4TCC.js";
14
14
  import "../chunk-XHKBHWLX.js";
15
- import "../chunk-SAHD5DYW.js";
16
- import "../chunk-FXJ5SEQT.js";
17
- import "../chunk-OS6AE2MR.js";
18
- import "../chunk-35RJKPIC.js";
19
- import "../chunk-IDGESFKZ.js";
15
+ import "../chunk-7S7H7V5V.js";
16
+ import "../chunk-6OGDGQTT.js";
17
+ import "../chunk-QJ3ENGBT.js";
18
+ import "../chunk-57FFQR46.js";
19
+ import "../chunk-36ZCFJUI.js";
20
20
  import "../chunk-GMXKITVA.js";
21
21
  import "../chunk-6ICPEJY5.js";
22
- import "../chunk-IKJJB4QG.js";
23
- import "../chunk-X427XA76.js";
24
- import "../chunk-4JOWKPUF.js";
25
- import "../chunk-464FX6W5.js";
22
+ import "../chunk-DCBSD22V.js";
23
+ import "../chunk-SMRMWDFE.js";
24
+ import "../chunk-DQKEGNTI.js";
25
+ import "../chunk-OZMGO4WF.js";
26
26
  import "../chunk-POFBE6ZY.js";
27
- import "../chunk-FEICGRNI.js";
28
- import "../chunk-SYUHM6V3.js";
29
- import "../chunk-4WGKAGIU.js";
30
- import "../chunk-NTWTU6FA.js";
27
+ import "../chunk-H52HBSOD.js";
28
+ import "../chunk-7IVV4LLF.js";
29
+ import "../chunk-22YSHBTI.js";
30
+ import "../chunk-ULJFIF5N.js";
31
31
  import "../chunk-7QLSKOSU.js";
32
32
  import "../chunk-KZERVKTD.js";
33
- import "../chunk-KBRKQMCI.js";
34
- import "../chunk-SRRJLA24.js";
33
+ import "../chunk-NMQLY4PE.js";
34
+ import "../chunk-UPRNSD2T.js";
35
35
  import "../chunk-AQFEP65J.js";
36
- import "../chunk-5EX2SD5N.js";
37
- import "../chunk-2ROXUEZV.js";
38
- import "../chunk-TDLEFGAM.js";
36
+ import "../chunk-3LS3GFJW.js";
37
+ import "../chunk-45OXG3VR.js";
38
+ import "../chunk-7FQL5NWJ.js";
39
39
 
40
40
  // bin/pushary-bell-hook.ts
41
41
  var main = async () => {
@@ -5,39 +5,39 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-75UCMLT5.js";
8
+ } from "../chunk-WPSI4246.js";
9
9
  import {
10
10
  createIo
11
11
  } from "../chunk-FO3MDD26.js";
12
12
  import {
13
13
  exitOnHelpFlag
14
- } from "../chunk-CJCVPCOB.js";
14
+ } from "../chunk-A5FFSXZE.js";
15
15
  import {
16
16
  addBellHooks,
17
17
  bellInstalled,
18
18
  removeBellHooks
19
- } from "../chunk-IDGESFKZ.js";
19
+ } from "../chunk-36ZCFJUI.js";
20
20
  import {
21
21
  parseFlags
22
22
  } from "../chunk-GMXKITVA.js";
23
- import "../chunk-IKJJB4QG.js";
23
+ import "../chunk-DCBSD22V.js";
24
24
  import "../chunk-7QLSKOSU.js";
25
25
  import {
26
26
  EXIT
27
27
  } from "../chunk-KZERVKTD.js";
28
- import "../chunk-KBRKQMCI.js";
28
+ import "../chunk-NMQLY4PE.js";
29
29
  import {
30
30
  claudeSettings
31
- } from "../chunk-SRRJLA24.js";
31
+ } from "../chunk-UPRNSD2T.js";
32
32
  import {
33
33
  readJsonSafe,
34
34
  writeJsonAtomic
35
35
  } from "../chunk-AQFEP65J.js";
36
- import "../chunk-5EX2SD5N.js";
37
- import "../chunk-2ROXUEZV.js";
36
+ import "../chunk-3LS3GFJW.js";
37
+ import "../chunk-45OXG3VR.js";
38
38
  import {
39
39
  isRecord
40
- } from "../chunk-TDLEFGAM.js";
40
+ } from "../chunk-7FQL5NWJ.js";
41
41
 
42
42
  // bin/pushary-bell.ts
43
43
  exitOnHelpFlag("bell");
@@ -8,39 +8,39 @@ import {
8
8
  describeIdleWindow,
9
9
  startProcessOwnership,
10
10
  withSpawnProcessOwnership
11
- } from "../chunk-D3TVRNZC.js";
11
+ } from "../chunk-E2OZZZKP.js";
12
12
  import {
13
13
  announceSubscriptionRequired,
14
14
  isDeferAnswer
15
- } from "../chunk-MG523AVN.js";
15
+ } from "../chunk-NKAMF2YJ.js";
16
16
  import {
17
17
  claudeTranscriptPath,
18
18
  loadSessionKey,
19
19
  registerTranscript,
20
20
  registeredTranscriptEnabled
21
- } from "../chunk-GSBOLJZ4.js";
21
+ } from "../chunk-CPYOJRDN.js";
22
22
  import "../chunk-DWQYCOPI.js";
23
23
  import {
24
24
  ensureDaemonRunning
25
- } from "../chunk-VFNYTVTJ.js";
25
+ } from "../chunk-FPYBX36E.js";
26
26
  import {
27
27
  encryptRecord
28
- } from "../chunk-7447DYNW.js";
29
- import "../chunk-EPVY3JU3.js";
28
+ } from "../chunk-CK3W7Q5S.js";
29
+ import "../chunk-4PIAOJAW.js";
30
30
  import {
31
31
  transcriptsEnabled
32
- } from "../chunk-MRR4NQ3H.js";
32
+ } from "../chunk-SMSX4TCC.js";
33
33
  import {
34
34
  needsShell,
35
35
  spawnClaude
36
36
  } from "../chunk-XHKBHWLX.js";
37
- import "../chunk-FXJ5SEQT.js";
38
- import "../chunk-OS6AE2MR.js";
39
- import "../chunk-35RJKPIC.js";
40
- import "../chunk-IDGESFKZ.js";
37
+ import "../chunk-6OGDGQTT.js";
38
+ import "../chunk-QJ3ENGBT.js";
39
+ import "../chunk-57FFQR46.js";
40
+ import "../chunk-36ZCFJUI.js";
41
41
  import "../chunk-GMXKITVA.js";
42
42
  import "../chunk-6ICPEJY5.js";
43
- import "../chunk-IKJJB4QG.js";
43
+ import "../chunk-DCBSD22V.js";
44
44
  import {
45
45
  DEFAULT_SESSION,
46
46
  UNNAMED_ACTION,
@@ -58,8 +58,8 @@ import {
58
58
  reportEvent,
59
59
  savePendingCommand,
60
60
  scopePathFor
61
- } from "../chunk-X427XA76.js";
62
- import "../chunk-4JOWKPUF.js";
61
+ } from "../chunk-SMRMWDFE.js";
62
+ import "../chunk-DQKEGNTI.js";
63
63
  import {
64
64
  askUser,
65
65
  cancelQuestion,
@@ -70,28 +70,28 @@ import {
70
70
  waitForAnswer,
71
71
  waitsForThePhone,
72
72
  withdrawQuestion
73
- } from "../chunk-464FX6W5.js";
73
+ } from "../chunk-OZMGO4WF.js";
74
74
  import "../chunk-POFBE6ZY.js";
75
75
  import {
76
76
  SubscriptionRequiredError
77
- } from "../chunk-FEICGRNI.js";
78
- import "../chunk-SYUHM6V3.js";
79
- import "../chunk-4WGKAGIU.js";
77
+ } from "../chunk-H52HBSOD.js";
78
+ import "../chunk-7IVV4LLF.js";
79
+ import "../chunk-22YSHBTI.js";
80
80
  import {
81
81
  getMachineId
82
- } from "../chunk-NTWTU6FA.js";
82
+ } from "../chunk-ULJFIF5N.js";
83
83
  import "../chunk-7QLSKOSU.js";
84
84
  import "../chunk-KZERVKTD.js";
85
- import "../chunk-KBRKQMCI.js";
86
- import "../chunk-SRRJLA24.js";
85
+ import "../chunk-NMQLY4PE.js";
86
+ import "../chunk-UPRNSD2T.js";
87
87
  import "../chunk-AQFEP65J.js";
88
88
  import {
89
89
  getApiKey,
90
90
  getBaseUrl
91
- } from "../chunk-5EX2SD5N.js";
91
+ } from "../chunk-3LS3GFJW.js";
92
92
  import {
93
93
  NPX_LATEST_COMMAND
94
- } from "../chunk-2ROXUEZV.js";
94
+ } from "../chunk-45OXG3VR.js";
95
95
  import {
96
96
  DECISION_STOP_REASON,
97
97
  HAND_BACK_WITHOUT_A_PROMPT,
@@ -101,7 +101,7 @@ import {
101
101
  redactSecretsFromContent,
102
102
  resolveGate,
103
103
  timeoutActionWithoutLocalPrompt
104
- } from "../chunk-TDLEFGAM.js";
104
+ } from "../chunk-7FQL5NWJ.js";
105
105
 
106
106
  // src/wrapper/localPassthrough.ts
107
107
  var SIGNAL_NUMBERS = {
@@ -9,12 +9,12 @@ import {
9
9
  planCliKeyRevocations,
10
10
  readCliHeldKeys,
11
11
  revokeCliKeys
12
- } from "../chunk-SQIZGUAN.js";
12
+ } from "../chunk-U7CN5HG2.js";
13
13
  import {
14
14
  isCursorPluginLeftover,
15
15
  releaseSoleGate,
16
16
  withoutPusharyCursorHooks
17
- } from "../chunk-QCOE42GO.js";
17
+ } from "../chunk-GC3SUMYD.js";
18
18
  import {
19
19
  HERMES_PIP_PACKAGE,
20
20
  readHermesStatus,
@@ -23,25 +23,25 @@ import {
23
23
  shortenHome,
24
24
  unregisterPluginLocation,
25
25
  vscodeSettingsTargets
26
- } from "../chunk-7S4Z36H7.js";
26
+ } from "../chunk-IRU7DKJW.js";
27
27
  import {
28
28
  planFxRemoval,
29
29
  removeInstructionBlock
30
- } from "../chunk-X5HK4XUN.js";
31
- import "../chunk-5FNE6ZVV.js";
30
+ } from "../chunk-EJWSE7S7.js";
31
+ import "../chunk-UDECNZYI.js";
32
32
  import {
33
33
  disableDaemonService
34
- } from "../chunk-VFNYTVTJ.js";
34
+ } from "../chunk-FPYBX36E.js";
35
35
  import "../chunk-XHKBHWLX.js";
36
- import "../chunk-77J4RVB2.js";
36
+ import "../chunk-PEEJP4HN.js";
37
37
  import {
38
38
  macAppKeepsMcpEntry,
39
39
  mcpServerBearer,
40
40
  pusharyKey,
41
41
  readMacAppAgentKey,
42
42
  setupReceiptKey
43
- } from "../chunk-QGCEQGH6.js";
44
- import "../chunk-N4LLBUU2.js";
43
+ } from "../chunk-EGTRIM74.js";
44
+ import "../chunk-FDNMQEU6.js";
45
45
  import {
46
46
  OPENCODE_PLUGIN_SIBLING,
47
47
  OPENCODE_PLUGIN_SIBLING_CONTENTS,
@@ -53,14 +53,14 @@ import {
53
53
  openCodePluginDir,
54
54
  openCodePluginFile,
55
55
  removeOpenCodeMcpServer
56
- } from "../chunk-OULHOX5C.js";
56
+ } from "../chunk-WFPXKCN4.js";
57
57
  import {
58
58
  ansiPainter,
59
59
  useColor
60
60
  } from "../chunk-FO3MDD26.js";
61
61
  import {
62
62
  exitOnHelpFlag
63
- } from "../chunk-CJCVPCOB.js";
63
+ } from "../chunk-A5FFSXZE.js";
64
64
  import {
65
65
  compatibleConfigFile,
66
66
  compatibleInstructionsFile,
@@ -73,7 +73,7 @@ import {
73
73
  removePusharySettings,
74
74
  removePusharyToolPermissions,
75
75
  restoreClaudeMcpServer
76
- } from "../chunk-SAHD5DYW.js";
76
+ } from "../chunk-7S7H7V5V.js";
77
77
  import {
78
78
  hookOwnerOf,
79
79
  isHookTakeoverReceipt,
@@ -81,12 +81,12 @@ import {
81
81
  resolveBridgeStub,
82
82
  restoreHookTakeover,
83
83
  restoreMcpServer
84
- } from "../chunk-FXJ5SEQT.js";
84
+ } from "../chunk-6OGDGQTT.js";
85
85
  import {
86
86
  removeGeminiSettings
87
- } from "../chunk-OS6AE2MR.js";
88
- import "../chunk-35RJKPIC.js";
89
- import "../chunk-IDGESFKZ.js";
87
+ } from "../chunk-QJ3ENGBT.js";
88
+ import "../chunk-57FFQR46.js";
89
+ import "../chunk-36ZCFJUI.js";
90
90
  import {
91
91
  rejectUnknownFlags
92
92
  } from "../chunk-GMXKITVA.js";
@@ -96,20 +96,20 @@ import {
96
96
  isDisabledExport,
97
97
  removeClaudeAlias,
98
98
  shellProfileCandidates
99
- } from "../chunk-IKJJB4QG.js";
100
- import "../chunk-X427XA76.js";
101
- import "../chunk-4JOWKPUF.js";
102
- import "../chunk-464FX6W5.js";
99
+ } from "../chunk-DCBSD22V.js";
100
+ import "../chunk-SMRMWDFE.js";
101
+ import "../chunk-DQKEGNTI.js";
102
+ import "../chunk-OZMGO4WF.js";
103
103
  import "../chunk-POFBE6ZY.js";
104
- import "../chunk-FEICGRNI.js";
105
- import "../chunk-SYUHM6V3.js";
106
- import "../chunk-4WGKAGIU.js";
107
- import "../chunk-NTWTU6FA.js";
104
+ import "../chunk-H52HBSOD.js";
105
+ import "../chunk-7IVV4LLF.js";
106
+ import "../chunk-22YSHBTI.js";
107
+ import "../chunk-ULJFIF5N.js";
108
108
  import "../chunk-7QLSKOSU.js";
109
109
  import {
110
110
  EXIT
111
111
  } from "../chunk-KZERVKTD.js";
112
- import "../chunk-KBRKQMCI.js";
112
+ import "../chunk-NMQLY4PE.js";
113
113
  import {
114
114
  claudeJson,
115
115
  claudeMcpReceipt,
@@ -146,14 +146,14 @@ import {
146
146
  restoreCodexHookTrust,
147
147
  vscodePluginDir,
148
148
  vscodePluginMcp
149
- } from "../chunk-SRRJLA24.js";
149
+ } from "../chunk-UPRNSD2T.js";
150
150
  import "../chunk-AQFEP65J.js";
151
151
  import {
152
152
  getBaseUrl
153
- } from "../chunk-5EX2SD5N.js";
153
+ } from "../chunk-3LS3GFJW.js";
154
154
  import {
155
155
  NPX_LATEST_COMMAND
156
- } from "../chunk-2ROXUEZV.js";
156
+ } from "../chunk-45OXG3VR.js";
157
157
  import {
158
158
  CLI_PACKAGE_NAMES,
159
159
  HOOK_COMPATIBLE_PROFILES,
@@ -165,7 +165,7 @@ import {
165
165
  globalRootFor,
166
166
  isValidApiKey,
167
167
  redactSecrets
168
- } from "../chunk-TDLEFGAM.js";
168
+ } from "../chunk-7FQL5NWJ.js";
169
169
 
170
170
  // bin/pushary-clean.ts
171
171
  import { existsSync as existsSync6, readFileSync as readFileSync4, copyFileSync, readdirSync as readdirSync4 } from "fs";
@@ -5,10 +5,10 @@ import {
5
5
  postLiveSession,
6
6
  postLiveSessionUntilAccepted,
7
7
  startLiveSessionHeartbeat
8
- } from "../chunk-H2PQXK26.js";
8
+ } from "../chunk-HQKYWUBF.js";
9
9
  import {
10
10
  resolveProviderBinary
11
- } from "../chunk-AXANUGOV.js";
11
+ } from "../chunk-4TFD3WAA.js";
12
12
  import "../chunk-RIVNNBEK.js";
13
13
  import {
14
14
  SESSION_IDLE_TIMEOUT_MS,
@@ -16,50 +16,50 @@ import {
16
16
  idleDeadlinePassed,
17
17
  startProcessOwnership,
18
18
  withSpawnProcessOwnership
19
- } from "../chunk-D3TVRNZC.js";
20
- import "../chunk-7447DYNW.js";
21
- import "../chunk-EPVY3JU3.js";
19
+ } from "../chunk-E2OZZZKP.js";
20
+ import "../chunk-CK3W7Q5S.js";
21
+ import "../chunk-4PIAOJAW.js";
22
22
  import {
23
23
  transcriptsEnabled
24
- } from "../chunk-MRR4NQ3H.js";
24
+ } from "../chunk-SMSX4TCC.js";
25
25
  import {
26
26
  spawnClaude
27
27
  } from "../chunk-XHKBHWLX.js";
28
28
  import "../chunk-6ICPEJY5.js";
29
- import "../chunk-IKJJB4QG.js";
29
+ import "../chunk-DCBSD22V.js";
30
30
  import {
31
31
  isAskUserResponse,
32
32
  isDecisionStopped,
33
33
  isWaitForAnswerResponse,
34
34
  withdrawQuestion,
35
35
  writeDegraded
36
- } from "../chunk-464FX6W5.js";
36
+ } from "../chunk-OZMGO4WF.js";
37
37
  import "../chunk-POFBE6ZY.js";
38
38
  import {
39
39
  callMcpTool
40
- } from "../chunk-FEICGRNI.js";
41
- import "../chunk-SYUHM6V3.js";
42
- import "../chunk-4WGKAGIU.js";
40
+ } from "../chunk-H52HBSOD.js";
41
+ import "../chunk-7IVV4LLF.js";
42
+ import "../chunk-22YSHBTI.js";
43
43
  import {
44
44
  getMachineId
45
- } from "../chunk-NTWTU6FA.js";
45
+ } from "../chunk-ULJFIF5N.js";
46
46
  import "../chunk-7QLSKOSU.js";
47
47
  import "../chunk-KZERVKTD.js";
48
- import "../chunk-KBRKQMCI.js";
49
- import "../chunk-SRRJLA24.js";
48
+ import "../chunk-NMQLY4PE.js";
49
+ import "../chunk-UPRNSD2T.js";
50
50
  import "../chunk-AQFEP65J.js";
51
51
  import {
52
52
  getApiKey,
53
53
  getBaseUrl
54
- } from "../chunk-5EX2SD5N.js";
55
- import "../chunk-2ROXUEZV.js";
54
+ } from "../chunk-3LS3GFJW.js";
55
+ import "../chunk-45OXG3VR.js";
56
56
  import {
57
57
  elicitationContent,
58
58
  parseAgentQuestion,
59
59
  parseAgentQuestionAnswers,
60
60
  planElicitationAsk,
61
61
  readElicitationFields
62
- } from "../chunk-TDLEFGAM.js";
62
+ } from "../chunk-7FQL5NWJ.js";
63
63
 
64
64
  // bin/pushary-codex-bridge.ts
65
65
  import { existsSync } from "fs";