pushary 1.9.117 → 1.9.119

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 (130) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{api-OXKVQGTP.js → api-WWB7ZOLK.js} +11 -11
  3. package/dist/bin/pushary-audit.js +3 -3
  4. package/dist/bin/pushary-bell-hook.js +27 -27
  5. package/dist/bin/pushary-bell.js +10 -10
  6. package/dist/bin/pushary-claude.js +35 -40
  7. package/dist/bin/pushary-clean.js +43 -43
  8. package/dist/bin/pushary-codex-bridge.js +21 -21
  9. package/dist/bin/pushary-codex-hook.js +64 -75
  10. package/dist/bin/pushary-codex-session.js +8 -8
  11. package/dist/bin/pushary-codex.js +15 -15
  12. package/dist/bin/pushary-connect.js +28 -28
  13. package/dist/bin/pushary-cowork.js +5 -5
  14. package/dist/bin/pushary-daemon.js +44 -44
  15. package/dist/bin/pushary-disconnect.js +27 -27
  16. package/dist/bin/pushary-display-hook.js +17 -17
  17. package/dist/bin/pushary-doctor.js +47 -47
  18. package/dist/bin/pushary-elicitation-hook.js +27 -27
  19. package/dist/bin/pushary-gemini-bridge.js +15 -15
  20. package/dist/bin/pushary-gemini-hook.js +93 -90
  21. package/dist/bin/pushary-hook.js +33 -32
  22. package/dist/bin/pushary-login.js +22 -22
  23. package/dist/bin/pushary-logout.js +26 -26
  24. package/dist/bin/pushary-mcp.js +12 -12
  25. package/dist/bin/pushary-mode.js +15 -15
  26. package/dist/bin/pushary-notification-hook.js +26 -26
  27. package/dist/bin/pushary-opencode-hook.js +93 -75
  28. package/dist/bin/pushary-permission-denied-hook.js +33 -32
  29. package/dist/bin/pushary-permission-hook.js +33 -32
  30. package/dist/bin/pushary-post-hook.js +26 -26
  31. package/dist/bin/pushary-prompt-hook.js +26 -26
  32. package/dist/bin/pushary-session-end-hook.js +26 -26
  33. package/dist/bin/pushary-session-start-hook.js +35 -35
  34. package/dist/bin/pushary-setup.js +90 -90
  35. package/dist/bin/pushary-stats.js +5 -5
  36. package/dist/bin/pushary-status.js +32 -32
  37. package/dist/bin/pushary-stop-hook.js +26 -26
  38. package/dist/bin/pushary-stopfailure-hook.js +26 -26
  39. package/dist/bin/pushary-suggestions.js +15 -15
  40. package/dist/bin/pushary-transcript-register.js +17 -17
  41. package/dist/bin/pushary-transcripts.js +25 -25
  42. package/dist/bin/pushary-upgrade.js +43 -43
  43. package/dist/bin/pushary-wait.js +17 -17
  44. package/dist/bin/pushary.js +7 -7
  45. package/dist/{chunk-3ZQT5LQ3.js → chunk-2C45MJGK.js} +9 -6
  46. package/dist/{chunk-H5RGOO3B.js → chunk-2UE2NDCX.js} +1 -1
  47. package/dist/{chunk-NSCLVG7M.js → chunk-3B7S2H4R.js} +1 -1
  48. package/dist/{chunk-EXWJBUL5.js → chunk-3IESC326.js} +3 -3
  49. package/dist/{chunk-PHCZ26TZ.js → chunk-4D23TNCL.js} +4 -4
  50. package/dist/{chunk-DH23XX7X.js → chunk-4HDX77ND.js} +3 -3
  51. package/dist/{chunk-NI5KTEVM.js → chunk-4SZM2HRA.js} +6 -6
  52. package/dist/{chunk-XIJ4ADBX.js → chunk-5HKU4VUL.js} +3 -3
  53. package/dist/{chunk-EBL6XYOI.js → chunk-5T5T4YXM.js} +1 -1
  54. package/dist/{chunk-LN6LLUY7.js → chunk-67I7QRQB.js} +1 -1
  55. package/dist/{chunk-2NN5ODYJ.js → chunk-6KX2H4I5.js} +3 -3
  56. package/dist/{chunk-BSSD6UWJ.js → chunk-6YLVNFQZ.js} +3 -3
  57. package/dist/{chunk-U2AB2ZUZ.js → chunk-7CJ7W2RH.js} +4 -4
  58. package/dist/{chunk-MKTZZPWV.js → chunk-AGXOTZID.js} +5 -5
  59. package/dist/{chunk-MYSBGQU6.js → chunk-B7BOENW7.js} +1 -1
  60. package/dist/{chunk-SUMWA5VN.js → chunk-BQ673OOD.js} +2 -2
  61. package/dist/{chunk-ARRXCME5.js → chunk-CBLFIWPI.js} +2 -2
  62. package/dist/{chunk-7VPA5PXJ.js → chunk-COXNQUDP.js} +4 -4
  63. package/dist/{chunk-PHDPS5C7.js → chunk-CXIYGD33.js} +2 -2
  64. package/dist/{chunk-YEV6CIQZ.js → chunk-DXJUASTS.js} +2 -2
  65. package/dist/{chunk-X2JY437V.js → chunk-EFFH2FYG.js} +2 -2
  66. package/dist/{chunk-BJ7FGYF7.js → chunk-EISUEJDT.js} +6 -6
  67. package/dist/{chunk-4UGNMAQ2.js → chunk-EP6I3MQY.js} +4 -4
  68. package/dist/{chunk-IUPEFEBH.js → chunk-FPG7X2GS.js} +4 -4
  69. package/dist/{chunk-5TVOBKRE.js → chunk-G4OVFWU4.js} +20 -14
  70. package/dist/{chunk-4BV525QE.js → chunk-G5FQU2XF.js} +6 -6
  71. package/dist/{chunk-NZFYK75R.js → chunk-GAOUWLYN.js} +3 -3
  72. package/dist/{chunk-2KYPNVRC.js → chunk-GBVTVTDF.js} +1 -1
  73. package/dist/{chunk-BE6JIWTM.js → chunk-GW3PE52Q.js} +1 -1
  74. package/dist/{chunk-PPNJ3INA.js → chunk-HYTDNEXV.js} +1 -1
  75. package/dist/{chunk-K54Y2QFA.js → chunk-ISVHV2DP.js} +1 -1
  76. package/dist/{chunk-RVYREG7X.js → chunk-JJNF6QU4.js} +1 -1
  77. package/dist/{chunk-F3Z7UWM6.js → chunk-JKS4MN47.js} +6 -6
  78. package/dist/{chunk-S5MQA774.js → chunk-K5WTTEIQ.js} +5 -5
  79. package/dist/{chunk-FKH3KT4U.js → chunk-KILSIJTF.js} +31 -21
  80. package/dist/{chunk-XU4DUX7K.js → chunk-KOZBVXXC.js} +3 -3
  81. package/dist/{chunk-TKTNQORW.js → chunk-KVDN4U6W.js} +10 -10
  82. package/dist/{chunk-RYAWSPAR.js → chunk-L3MCQSES.js} +5 -5
  83. package/dist/{chunk-MHU7CW7T.js → chunk-MEPYLTWF.js} +10 -10
  84. package/dist/{chunk-FRIQ4LQ5.js → chunk-MYNLU6DV.js} +2 -2
  85. package/dist/{chunk-N74WJAL6.js → chunk-NASQPMXW.js} +9 -9
  86. package/dist/{chunk-XJC6PG7J.js → chunk-NVV3YUTX.js} +2 -2
  87. package/dist/{chunk-T3UOM443.js → chunk-PDAOZ2NF.js} +10 -10
  88. package/dist/{chunk-R5ZMI6BM.js → chunk-PJSFKKZ5.js} +1 -1
  89. package/dist/{chunk-4SI3CUWN.js → chunk-PNSIMPC7.js} +6 -6
  90. package/dist/{chunk-N4DQDFEP.js → chunk-R3RTISDD.js} +1 -1
  91. package/dist/{chunk-GJNWZWMA.js → chunk-R67NTMBY.js} +8 -8
  92. package/dist/{chunk-3OVRAD25.js → chunk-RGXFBS56.js} +3 -3
  93. package/dist/{chunk-UJGA7WL5.js → chunk-RIAELZYW.js} +2 -2
  94. package/dist/{chunk-74MC5LRW.js → chunk-SE7P5BBK.js} +1 -1
  95. package/dist/{chunk-2UYYX6VC.js → chunk-SNKC2IQZ.js} +2 -2
  96. package/dist/{chunk-DE6ZYZZZ.js → chunk-SQRS4IF2.js} +3 -3
  97. package/dist/{chunk-G5EB7GAR.js → chunk-SSBETUYZ.js} +3 -3
  98. package/dist/{chunk-C2NKILG3.js → chunk-TLCJCP5R.js} +1 -1
  99. package/dist/{chunk-KYWTX4R2.js → chunk-TRDHHF3A.js} +337 -37
  100. package/dist/{chunk-RCCISH7T.js → chunk-TZYVXTLN.js} +1 -1
  101. package/dist/{chunk-6ICAZ33G.js → chunk-U32N5JZO.js} +1 -1
  102. package/dist/{chunk-BL7ESWIQ.js → chunk-UHAUC7EO.js} +2 -2
  103. package/dist/{chunk-C32IT2TR.js → chunk-V52J2THT.js} +1 -1
  104. package/dist/chunk-VFZ2PE6U.js +60 -0
  105. package/dist/{chunk-DZI6MSR4.js → chunk-VMM6JCNQ.js} +2 -2
  106. package/dist/{chunk-MI56IIXG.js → chunk-VRZOUCIK.js} +2 -2
  107. package/dist/{chunk-2JQZFGIF.js → chunk-W5ZUDPKV.js} +5 -5
  108. package/dist/{chunk-ZJKH3CTN.js → chunk-W6LKC5YD.js} +5 -5
  109. package/dist/{chunk-J3PBLQUD.js → chunk-XBH6OKHD.js} +3 -3
  110. package/dist/{chunk-SE62HPB7.js → chunk-XNCKBVZX.js} +6 -61
  111. package/dist/{chunk-SQLXC4PM.js → chunk-YCCLWG7G.js} +6 -6
  112. package/dist/{chunk-YU3LDR5W.js → chunk-YZ7V2LVG.js} +3 -3
  113. package/dist/{chunk-MA4KQLCT.js → chunk-YZESBU7F.js} +5 -5
  114. package/dist/{chunk-FW2SOQ5J.js → chunk-Z3OG44Z4.js} +4 -4
  115. package/dist/chunk-ZLUAXGAA.js +121 -0
  116. package/dist/{chunk-6GZU4IYU.js → chunk-ZTVBM3EZ.js} +4 -4
  117. package/dist/{codex-app-cards-switch-ANBV6CA6.js → codex-app-cards-switch-J6EULXO5.js} +12 -12
  118. package/dist/{codex-card-routing-POEBILLG.js → codex-card-routing-XNJB6573.js} +2 -2
  119. package/dist/{codex-desktop-launch-Z4HXKBYP.js → codex-desktop-launch-46ELENBQ.js} +1 -1
  120. package/dist/{codex-session-launch-XA6BMIVU.js → codex-session-launch-R5FHFWAG.js} +18 -18
  121. package/dist/{config-ATKVK4QQ.js → config-RKWDMDRY.js} +3 -3
  122. package/dist/{global-upgrade-BJKCVYJU.js → global-upgrade-E65GJQS6.js} +9 -9
  123. package/dist/{identity-X3FI7ZYE.js → identity-JRGY2KS6.js} +4 -4
  124. package/dist/{live-capabilities-6OV363JK.js → live-capabilities-SOO6PD7Y.js} +4 -4
  125. package/dist/{paths-U67N2RPP.js → paths-G7NZODAY.js} +3 -3
  126. package/dist/{reapply-L3KVM3ZO.js → reapply-YKN5BKIP.js} +28 -28
  127. package/dist/src/index.js +32 -31
  128. package/dist/{upgrade-lock-ZIPY7I2T.js → upgrade-lock-YKAZI3BH.js} +4 -4
  129. package/dist/{usage-RAJPNVE5.js → usage-QWYNOIU6.js} +3 -3
  130. package/package.json +2 -2
@@ -1,23 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- isGatingMoment,
4
- recordKeylessMoment
5
- } from "../chunk-K54Y2QFA.js";
3
+ parseGeminiHookInput,
4
+ pushQuestionAndWait,
5
+ scopeQuestionOf
6
+ } from "../chunk-ZLUAXGAA.js";
6
7
  import {
7
8
  triggerAutoUpdate
8
- } from "../chunk-FRIQ4LQ5.js";
9
+ } from "../chunk-MYNLU6DV.js";
10
+ import {
11
+ reportMachineDenial
12
+ } from "../chunk-VFZ2PE6U.js";
13
+ import {
14
+ isGatingMoment,
15
+ recordKeylessMoment
16
+ } from "../chunk-ISVHV2DP.js";
9
17
  import {
10
18
  readHookInput
11
- } from "../chunk-3ZQT5LQ3.js";
12
- import "../chunk-4UGNMAQ2.js";
19
+ } from "../chunk-2C45MJGK.js";
20
+ import "../chunk-EP6I3MQY.js";
13
21
  import {
14
22
  announceSubscriptionRequired,
15
23
  isDeferAnswer
16
- } from "../chunk-2KYPNVRC.js";
17
- import "../chunk-T3UOM443.js";
24
+ } from "../chunk-GBVTVTDF.js";
25
+ import "../chunk-PDAOZ2NF.js";
18
26
  import "../chunk-HXBQTPKC.js";
19
27
  import "../chunk-G66WIAST.js";
20
- import "../chunk-MA4KQLCT.js";
28
+ import "../chunk-YZESBU7F.js";
21
29
  import {
22
30
  DEFAULT_SESSION,
23
31
  fetchModeState,
@@ -30,73 +38,69 @@ import {
30
38
  readLastPrompt,
31
39
  readLastUserPrompt,
32
40
  reportEvent
33
- } from "../chunk-5TVOBKRE.js";
34
- import "../chunk-BJ7FGYF7.js";
35
- import "../chunk-7VPA5PXJ.js";
41
+ } from "../chunk-G4OVFWU4.js";
42
+ import "../chunk-EISUEJDT.js";
43
+ import "../chunk-COXNQUDP.js";
36
44
  import {
37
- UNNAMED_ACTION,
38
45
  deriveActionBody,
39
46
  deriveBlocker,
40
47
  deriveToolTarget,
41
48
  describeToolCall,
42
49
  scopePathFor
43
- } from "../chunk-BE6JIWTM.js";
44
- import "../chunk-H5RGOO3B.js";
45
- import "../chunk-C32IT2TR.js";
50
+ } from "../chunk-GW3PE52Q.js";
51
+ import "../chunk-2UE2NDCX.js";
52
+ import "../chunk-V52J2THT.js";
46
53
  import "../chunk-YPY4YCIZ.js";
47
- import "../chunk-DE6ZYZZZ.js";
54
+ import "../chunk-SQRS4IF2.js";
48
55
  import "../chunk-XMSDA5WA.js";
49
- import "../chunk-C2NKILG3.js";
56
+ import "../chunk-TLCJCP5R.js";
50
57
  import {
51
58
  repoKeyFor
52
- } from "../chunk-74MC5LRW.js";
59
+ } from "../chunk-SE7P5BBK.js";
53
60
  import {
54
- askUser,
55
61
  exitAfterClientReports,
56
62
  isDecisionStopped,
57
- isLocalQuestionHandoff,
58
63
  isQuestionLimitRefusal,
59
- sendNotification,
60
- waitForQuestion
61
- } from "../chunk-N74WJAL6.js";
64
+ sendNotification
65
+ } from "../chunk-NASQPMXW.js";
62
66
  import "../chunk-POFBE6ZY.js";
63
67
  import {
64
68
  SubscriptionRequiredError
65
- } from "../chunk-ZJKH3CTN.js";
66
- import "../chunk-DH23XX7X.js";
67
- import "../chunk-3OVRAD25.js";
69
+ } from "../chunk-W6LKC5YD.js";
70
+ import "../chunk-4HDX77ND.js";
71
+ import "../chunk-RGXFBS56.js";
68
72
  import "../chunk-XHKBHWLX.js";
69
- import "../chunk-6ICAZ33G.js";
73
+ import "../chunk-U32N5JZO.js";
70
74
  import {
71
75
  getMachineId
72
- } from "../chunk-RCCISH7T.js";
73
- import "../chunk-YU3LDR5W.js";
74
- import "../chunk-DZI6MSR4.js";
75
- import "../chunk-ARRXCME5.js";
76
- import "../chunk-XU4DUX7K.js";
76
+ } from "../chunk-TZYVXTLN.js";
77
+ import "../chunk-YZ7V2LVG.js";
78
+ import "../chunk-VMM6JCNQ.js";
79
+ import "../chunk-CBLFIWPI.js";
80
+ import "../chunk-KOZBVXXC.js";
77
81
  import {
78
82
  getApiKey
79
- } from "../chunk-N4DQDFEP.js";
83
+ } from "../chunk-R3RTISDD.js";
80
84
  import "../chunk-YU2EUD7O.js";
81
85
  import "../chunk-T5I4PKOQ.js";
82
86
  import {
83
87
  EXIT
84
88
  } from "../chunk-BG4HHB7E.js";
85
- import "../chunk-R5ZMI6BM.js";
89
+ import "../chunk-PJSFKKZ5.js";
86
90
  import "../chunk-ZVU6WMMU.js";
87
91
  import {
88
92
  DECISION_STOP_REASON,
89
93
  KILL_REASON,
90
94
  UNVERIFIABLE_APPROVAL_REASON,
95
+ approvalModeWithoutLocalPrompt,
91
96
  denyReasonFrom,
92
97
  effectiveWaitSeconds,
93
98
  gateOutputFor,
94
- hookWaitClamped,
95
- hookWaitDeadline,
96
99
  questionLimitHandBack,
97
100
  refusesWhenUnanswered,
98
- resolveGate
99
- } from "../chunk-KYWTX4R2.js";
101
+ resolveGate,
102
+ unapprovedScopeReason
103
+ } from "../chunk-TRDHHF3A.js";
100
104
  import "../chunk-MLKGABMK.js";
101
105
 
102
106
  // bin/pushary-gemini-hook.ts
@@ -142,26 +146,32 @@ var geminiLocalHandoff = (bridge, reason = NO_LOCAL_INPUT) => geminiOwnsLifecycl
142
146
  var geminiSubscriptionRequiredDecision = (bridge) => geminiLocalHandoff(bridge, SUBSCRIPTION_REQUIRED);
143
147
  var geminiPushOnlyHandoff = (askStatus, bridge) => askStatus === "notified" || askStatus === "terminal" ? geminiLocalHandoff(bridge) : geminiPass();
144
148
  var fromPhoneAnswer = (answer) => answer.value === "yes" ? geminiAllow() : geminiDeny(denyReasonFrom(answer.value, answer.note));
145
- var geminiPushFirstDecision = (pushed, bridge) => {
146
- if (!pushed) return geminiPass();
149
+ var unlessOutOfScope = (scopeReason, decision) => scopeReason === void 0 ? decision : geminiDeny(unapprovedScopeReason(scopeReason));
150
+ var SCOPE_NEXT_STEP = "Gemini may be running without prompts, so Pushary cannot hand this to your terminal. Widen the agreed scope to include this path, then retry.";
151
+ var SCOPE_NEXT_STEP_NO_DEVICE = "No phone is connected to Pushary, and Gemini may be running without prompts. Connect a phone or widen the agreed scope, then retry.";
152
+ var refusedAtTheKeyboard = (scopeReason, noDevices) => geminiDeny(`${unapprovedScopeReason(scopeReason)} ${noDevices ? SCOPE_NEXT_STEP_NO_DEVICE : SCOPE_NEXT_STEP}`);
153
+ var geminiPushFirstDecision = (pushed, bridge, scopeReason) => {
154
+ if (!pushed) return unlessOutOfScope(scopeReason, geminiPass());
147
155
  const { answer, localHandoff } = pushed;
148
156
  if (isDecisionStopped(answer)) return geminiDeny(DECISION_STOP_REASON);
149
- if (localHandoff) return geminiLocalHandoff(bridge, pushed.noDevices ? NO_DEVICE : NO_LOCAL_INPUT);
150
- if (answer.answered) return isDeferAnswer(answer.value) ? geminiLocalHandoff(bridge, HANDLED_ON_MACHINE) : fromPhoneAnswer(answer);
151
- return geminiLocalHandoff(bridge, NO_ANSWER_IN_TIME);
157
+ if (localHandoff) return scopeReason === void 0 ? geminiLocalHandoff(bridge, pushed.noDevices ? NO_DEVICE : NO_LOCAL_INPUT) : refusedAtTheKeyboard(scopeReason, pushed.noDevices === true);
158
+ if (answer.answered && !isDeferAnswer(answer.value)) return fromPhoneAnswer(answer);
159
+ if (answer.answered) return unlessOutOfScope(scopeReason, geminiLocalHandoff(bridge, HANDLED_ON_MACHINE));
160
+ return unlessOutOfScope(scopeReason, geminiLocalHandoff(bridge, NO_ANSWER_IN_TIME));
152
161
  };
153
- var geminiPushOnlyDecision = (pushed, timeoutAction, bridge) => {
162
+ var geminiPushOnlyDecision = (pushed, timeoutAction, bridge, scopeReason) => {
154
163
  if (!pushed) return geminiDeny(UNVERIFIABLE_APPROVAL_REASON);
155
164
  const { answer, localHandoff, clampCut, askStatus } = pushed;
156
165
  if (isDecisionStopped(answer)) return geminiDeny(DECISION_STOP_REASON);
157
- if (localHandoff) return geminiPushOnlyHandoff(askStatus, bridge);
158
- if (answer.answered) return isDeferAnswer(answer.value) ? geminiPass() : fromPhoneAnswer(answer);
159
- if (clampCut) return geminiPass();
160
- return geminiTimeoutDecision(timeoutAction);
166
+ if (localHandoff) return scopeReason === void 0 ? geminiPushOnlyHandoff(askStatus, bridge) : refusedAtTheKeyboard(scopeReason, pushed.noDevices === true);
167
+ if (answer.answered && !isDeferAnswer(answer.value)) return fromPhoneAnswer(answer);
168
+ if (answer.answered) return unlessOutOfScope(scopeReason, geminiPass());
169
+ if (clampCut) return unlessOutOfScope(scopeReason, geminiPass());
170
+ return unlessOutOfScope(scopeReason, geminiTimeoutDecision(timeoutAction));
161
171
  };
162
- var geminiQuestionLimitDecision = ({ refusesUnanswered }) => {
172
+ var geminiQuestionLimitDecision = ({ refusesUnanswered, scopeReason }) => {
163
173
  const handBack = questionLimitHandBack({ refusesUnanswered, agentPromptFollows: false });
164
- return handBack.kind === "refuse" ? geminiDeny(handBack.reason) : geminiPass();
174
+ return unlessOutOfScope(scopeReason, handBack.kind === "refuse" ? geminiDeny(handBack.reason) : geminiPass());
165
175
  };
166
176
  var toGeminiWire = (decision) => {
167
177
  if (decision.kind === "pass") return null;
@@ -181,35 +191,24 @@ var geminiTimeoutDecision = (timeoutAction, denyReason = "No response within tim
181
191
  // bin/pushary-gemini-hook.ts
182
192
  var START_MS = Date.now();
183
193
  var agentNameFor = (input) => `${GEMINI_AGENT.label} - ${basename(input.cwd ?? process.cwd())}`;
184
- var pushQuestion = async (apiKey, input, lookup, waitSeconds, mode, pollInterval = 2e3) => {
185
- const projectName = basename(input.cwd ?? process.cwd());
194
+ var pushQuestion = (apiKey, input, lookup, waitSeconds, mode, scope, pollIntervalMs = 2e3) => {
186
195
  const description = describeToolCall(lookup.tool, lookup.input, "hook");
187
- const result = await askUser(apiKey, {
188
- question: `Allow ${description || UNNAMED_ACTION}?`,
189
- type: "confirm",
190
- context: `Agent wants to run this in ${projectName}`,
196
+ return pushQuestionAndWait(apiKey, {
197
+ description,
198
+ projectName: basename(input.cwd ?? process.cwd()),
191
199
  agentName: agentNameFor(input),
192
200
  sessionId: input.session_id,
193
- machineId: getMachineId(),
194
201
  toolName: lookup.tool,
195
202
  toolTarget: deriveToolTarget(lookup.tool, lookup.input),
196
- intent: readLastPrompt(input.session_id || DEFAULT_SESSION) ?? (input.transcript_path ? readLastUserPrompt(input.transcript_path) : void 0),
197
- action: description,
198
- blocker: deriveBlocker(mode),
199
- actionBody: deriveActionBody(input.tool_name ?? "", input.tool_input ?? {}),
200
- repoKey: repoKeyFor(input.cwd)
201
- });
202
- const now = Date.now();
203
- const deadline = hookWaitDeadline(START_MS, waitSeconds, "gemini", now);
204
- const clampCut = hookWaitClamped(START_MS, waitSeconds, "gemini", now);
205
- const answer = await waitForQuestion(apiKey, result, deadline, pollInterval);
206
- return {
207
- answer,
208
- localHandoff: !answer.answered && isLocalQuestionHandoff(result),
209
- clampCut,
210
- askStatus: result.status,
211
- noDevices: result.noDevices === true
212
- };
203
+ decision: {
204
+ intent: readLastPrompt(input.session_id || DEFAULT_SESSION) ?? (input.transcript_path ? readLastUserPrompt(input.transcript_path) : void 0),
205
+ action: description,
206
+ blocker: scope?.reason ?? deriveBlocker(mode),
207
+ actionBody: deriveActionBody(input.tool_name ?? "", input.tool_input ?? {}),
208
+ repoKey: repoKeyFor(input.cwd),
209
+ scopePath: scope?.path
210
+ }
211
+ }, { agent: "gemini", startMs: START_MS, waitSeconds, pollIntervalMs, askFailure: "fail_the_call" });
213
212
  };
214
213
  var notifyApprovalNeeded = async (apiKey, input, lookup) => {
215
214
  try {
@@ -227,26 +226,26 @@ var geminiStepsAside = (error, input) => {
227
226
  announceSubscriptionRequired(error.upgradeUrl, input.session_id);
228
227
  return geminiSubscriptionRequiredDecision(process.env.PUSHARY_GEMINI_BRIDGE);
229
228
  };
230
- var handlePushOnly = async (apiKey, input, lookup, timeoutSeconds, timeoutAction) => {
229
+ var handlePushOnly = async (apiKey, input, lookup, timeoutSeconds, timeoutAction, scope) => {
231
230
  let pushed;
232
231
  try {
233
- pushed = await pushQuestion(apiKey, input, lookup, effectiveWaitSeconds(timeoutAction, timeoutSeconds, "gemini"), "push_only");
232
+ pushed = await pushQuestion(apiKey, input, lookup, effectiveWaitSeconds(timeoutAction, timeoutSeconds, "gemini"), "push_only", scope);
234
233
  } catch (error) {
235
234
  if (error instanceof SubscriptionRequiredError) return geminiStepsAside(error, input);
236
- if (isQuestionLimitRefusal(error)) return geminiQuestionLimitDecision({ refusesUnanswered: refusesWhenUnanswered({ mode: "push_only", timeoutAction }) });
235
+ if (isQuestionLimitRefusal(error)) return geminiQuestionLimitDecision({ refusesUnanswered: refusesWhenUnanswered({ mode: "push_only", timeoutAction }), scopeReason: scope?.reason });
237
236
  pushed = void 0;
238
237
  }
239
- return geminiPushOnlyDecision(pushed, timeoutAction, process.env.PUSHARY_GEMINI_BRIDGE);
238
+ return geminiPushOnlyDecision(pushed, timeoutAction, process.env.PUSHARY_GEMINI_BRIDGE, scope?.reason);
240
239
  };
241
- var handlePushFirst = async (apiKey, input, lookup, pushFirstSeconds) => {
240
+ var handlePushFirst = async (apiKey, input, lookup, pushFirstSeconds, scope) => {
242
241
  let pushed;
243
242
  try {
244
- pushed = await pushQuestion(apiKey, input, lookup, pushFirstSeconds, "push_first", 1500);
243
+ pushed = await pushQuestion(apiKey, input, lookup, pushFirstSeconds, "push_first", scope, 1500);
245
244
  } catch (error) {
246
245
  if (error instanceof SubscriptionRequiredError) return geminiStepsAside(error, input);
247
246
  pushed = void 0;
248
247
  }
249
- return geminiPushFirstDecision(pushed, process.env.PUSHARY_GEMINI_BRIDGE);
248
+ return geminiPushFirstDecision(pushed, process.env.PUSHARY_GEMINI_BRIDGE, scope?.reason);
250
249
  };
251
250
  var decideBeforeTool = async (input) => {
252
251
  let apiKey;
@@ -283,23 +282,27 @@ var decideBeforeTool = async (input) => {
283
282
  repoKey: repoKeyFor(input.cwd),
284
283
  sessionId: input.session_id
285
284
  });
286
- if (verdict.kind === "kill") return geminiDeny(KILL_REASON);
285
+ if (verdict.kind === "kill" || verdict.kind === "deny") {
286
+ await reportMachineDenial({ ...input, tool_name: lookup.tool, tool_input: lookup.input }, verdict, GEMINI_AGENT);
287
+ return geminiDeny(verdict.kind === "kill" ? KILL_REASON : verdict.reason);
288
+ }
287
289
  if (verdict.kind === "allow") return geminiAllow();
288
- if (verdict.kind === "deny") return geminiDeny(verdict.reason);
289
290
  if (verdict.kind === "defer") return geminiPass();
290
291
  const toolPolicy = verdict.policy;
291
- switch (toolPolicy.mode) {
292
+ const scope = scopeQuestionOf(verdict);
293
+ switch (scope ? approvalModeWithoutLocalPrompt(toolPolicy.mode) : toolPolicy.mode) {
292
294
  case "push_only":
293
- return handlePushOnly(apiKey, input, lookup, toolPolicy.timeoutSeconds, toolPolicy.timeoutAction);
295
+ return handlePushOnly(apiKey, input, lookup, toolPolicy.timeoutSeconds, toolPolicy.timeoutAction, scope);
294
296
  case "terminal_only":
295
- return geminiLocalHandoff(process.env.PUSHARY_GEMINI_BRIDGE);
297
+ return scope ? geminiDeny(unapprovedScopeReason(scope.reason)) : geminiLocalHandoff(process.env.PUSHARY_GEMINI_BRIDGE);
296
298
  case "push_first":
297
- return handlePushFirst(apiKey, input, lookup, toolPolicy.pushFirstSeconds);
299
+ return handlePushFirst(apiKey, input, lookup, toolPolicy.pushFirstSeconds, scope);
298
300
  case "notify_only":
301
+ if (scope) return geminiDeny(unapprovedScopeReason(scope.reason));
299
302
  await notifyApprovalNeeded(apiKey, input, lookup);
300
303
  return geminiLocalHandoff(process.env.PUSHARY_GEMINI_BRIDGE);
301
304
  default:
302
- return handlePushFirst(apiKey, input, lookup, toolPolicy.pushFirstSeconds);
305
+ return handlePushFirst(apiKey, input, lookup, toolPolicy.pushFirstSeconds, scope);
303
306
  }
304
307
  } catch {
305
308
  return geminiPass();
@@ -332,7 +335,7 @@ var emit = (wire) => {
332
335
  if (wire) process.stdout.write(JSON.stringify(wire));
333
336
  };
334
337
  var main = async () => {
335
- const input = await readHookInput("gemini");
338
+ const input = await readHookInput("gemini", "", process.stdin, parseGeminiHookInput);
336
339
  if (!input) {
337
340
  return exitAfterClientReports(EXIT.OK);
338
341
  }
@@ -1,60 +1,61 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePreToolUse
4
- } from "../chunk-FKH3KT4U.js";
5
- import "../chunk-YEV6CIQZ.js";
4
+ } from "../chunk-KILSIJTF.js";
5
+ import "../chunk-DXJUASTS.js";
6
6
  import {
7
7
  exitOnHelpFlag
8
- } from "../chunk-LN6LLUY7.js";
9
- import "../chunk-SE62HPB7.js";
10
- import "../chunk-K54Y2QFA.js";
8
+ } from "../chunk-67I7QRQB.js";
9
+ import "../chunk-XNCKBVZX.js";
10
+ import "../chunk-VFZ2PE6U.js";
11
+ import "../chunk-ISVHV2DP.js";
11
12
  import {
12
13
  readToolHookCall
13
- } from "../chunk-3ZQT5LQ3.js";
14
- import "../chunk-4UGNMAQ2.js";
15
- import "../chunk-2KYPNVRC.js";
16
- import "../chunk-T3UOM443.js";
14
+ } from "../chunk-2C45MJGK.js";
15
+ import "../chunk-EP6I3MQY.js";
16
+ import "../chunk-GBVTVTDF.js";
17
+ import "../chunk-PDAOZ2NF.js";
17
18
  import "../chunk-HXBQTPKC.js";
18
19
  import "../chunk-G66WIAST.js";
19
20
  import {
20
21
  activeHookSource,
21
22
  normalizeToolCall,
22
23
  profileFromArgv
23
- } from "../chunk-MA4KQLCT.js";
24
- import "../chunk-5TVOBKRE.js";
25
- import "../chunk-BJ7FGYF7.js";
26
- import "../chunk-7VPA5PXJ.js";
24
+ } from "../chunk-YZESBU7F.js";
25
+ import "../chunk-G4OVFWU4.js";
26
+ import "../chunk-EISUEJDT.js";
27
+ import "../chunk-COXNQUDP.js";
27
28
  import {
28
29
  canonicalGateInputs
29
- } from "../chunk-BE6JIWTM.js";
30
- import "../chunk-H5RGOO3B.js";
31
- import "../chunk-C32IT2TR.js";
30
+ } from "../chunk-GW3PE52Q.js";
31
+ import "../chunk-2UE2NDCX.js";
32
+ import "../chunk-V52J2THT.js";
32
33
  import "../chunk-YPY4YCIZ.js";
33
- import "../chunk-DE6ZYZZZ.js";
34
+ import "../chunk-SQRS4IF2.js";
34
35
  import "../chunk-XMSDA5WA.js";
35
- import "../chunk-C2NKILG3.js";
36
- import "../chunk-74MC5LRW.js";
36
+ import "../chunk-TLCJCP5R.js";
37
+ import "../chunk-SE7P5BBK.js";
37
38
  import {
38
39
  exitAfterClientReports
39
- } from "../chunk-N74WJAL6.js";
40
+ } from "../chunk-NASQPMXW.js";
40
41
  import "../chunk-POFBE6ZY.js";
41
- import "../chunk-ZJKH3CTN.js";
42
- import "../chunk-DH23XX7X.js";
43
- import "../chunk-3OVRAD25.js";
42
+ import "../chunk-W6LKC5YD.js";
43
+ import "../chunk-4HDX77ND.js";
44
+ import "../chunk-RGXFBS56.js";
44
45
  import "../chunk-XHKBHWLX.js";
45
- import "../chunk-6ICAZ33G.js";
46
- import "../chunk-RCCISH7T.js";
47
- import "../chunk-YU3LDR5W.js";
48
- import "../chunk-DZI6MSR4.js";
49
- import "../chunk-ARRXCME5.js";
50
- import "../chunk-XU4DUX7K.js";
51
- import "../chunk-N4DQDFEP.js";
46
+ import "../chunk-U32N5JZO.js";
47
+ import "../chunk-TZYVXTLN.js";
48
+ import "../chunk-YZ7V2LVG.js";
49
+ import "../chunk-VMM6JCNQ.js";
50
+ import "../chunk-CBLFIWPI.js";
51
+ import "../chunk-KOZBVXXC.js";
52
+ import "../chunk-R3RTISDD.js";
52
53
  import "../chunk-YU2EUD7O.js";
53
54
  import "../chunk-T5I4PKOQ.js";
54
55
  import {
55
56
  EXIT
56
57
  } from "../chunk-BG4HHB7E.js";
57
- import "../chunk-R5ZMI6BM.js";
58
+ import "../chunk-PJSFKKZ5.js";
58
59
  import "../chunk-ZVU6WMMU.js";
59
60
  import {
60
61
  GROK_UNREADABLE_CALL,
@@ -62,7 +63,7 @@ import {
62
63
  isPusharyOwnTool,
63
64
  refusalOutput,
64
65
  renderPreToolUseVerdict
65
- } from "../chunk-KYWTX4R2.js";
66
+ } from "../chunk-TRDHHF3A.js";
66
67
  import "../chunk-MLKGABMK.js";
67
68
 
68
69
  // bin/pushary-hook.ts
@@ -3,55 +3,55 @@ import {
3
3
  describeKeyAccount,
4
4
  describeShellKeyShadow,
5
5
  runBrowserLogin
6
- } from "../chunk-GJNWZWMA.js";
6
+ } from "../chunk-R67NTMBY.js";
7
7
  import {
8
8
  TRANSCRIPT_SYNC_NOTICE
9
- } from "../chunk-PHCZ26TZ.js";
10
- import "../chunk-PUZZELE6.js";
9
+ } from "../chunk-4D23TNCL.js";
11
10
  import {
12
11
  writeJsonError,
13
12
  writeStdoutFully
14
- } from "../chunk-EBL6XYOI.js";
13
+ } from "../chunk-5T5T4YXM.js";
15
14
  import "../chunk-3EGEA4KH.js";
16
- import "../chunk-SQLXC4PM.js";
17
- import "../chunk-SUMWA5VN.js";
18
- import "../chunk-J3PBLQUD.js";
15
+ import "../chunk-YCCLWG7G.js";
16
+ import "../chunk-PUZZELE6.js";
17
+ import "../chunk-BQ673OOD.js";
18
+ import "../chunk-XBH6OKHD.js";
19
19
  import {
20
20
  createIo
21
21
  } from "../chunk-FO3MDD26.js";
22
22
  import {
23
23
  exitOnHelpFlag
24
- } from "../chunk-LN6LLUY7.js";
24
+ } from "../chunk-67I7QRQB.js";
25
25
  import "../chunk-G66WIAST.js";
26
26
  import {
27
27
  recoverDaemonAfterLogin
28
- } from "../chunk-BJ7FGYF7.js";
28
+ } from "../chunk-EISUEJDT.js";
29
29
  import {
30
30
  parseFlags
31
31
  } from "../chunk-YPY4YCIZ.js";
32
32
  import {
33
33
  transcriptPreferenceForSetup
34
- } from "../chunk-C2NKILG3.js";
35
- import "../chunk-ZJKH3CTN.js";
34
+ } from "../chunk-TLCJCP5R.js";
35
+ import "../chunk-W6LKC5YD.js";
36
36
  import {
37
37
  checkApiKey,
38
38
  describeKeyCheck
39
- } from "../chunk-DH23XX7X.js";
40
- import "../chunk-3OVRAD25.js";
39
+ } from "../chunk-4HDX77ND.js";
40
+ import "../chunk-RGXFBS56.js";
41
41
  import "../chunk-XHKBHWLX.js";
42
- import "../chunk-6ICAZ33G.js";
43
- import "../chunk-RCCISH7T.js";
42
+ import "../chunk-U32N5JZO.js";
43
+ import "../chunk-TZYVXTLN.js";
44
44
  import {
45
45
  newTerminalsUseSavedKey,
46
46
  readConfigFileKey,
47
47
  readControlMode,
48
48
  readKeySource,
49
49
  writeKey
50
- } from "../chunk-YU3LDR5W.js";
51
- import "../chunk-DZI6MSR4.js";
52
- import "../chunk-ARRXCME5.js";
53
- import "../chunk-XU4DUX7K.js";
54
- import "../chunk-N4DQDFEP.js";
50
+ } from "../chunk-YZ7V2LVG.js";
51
+ import "../chunk-VMM6JCNQ.js";
52
+ import "../chunk-CBLFIWPI.js";
53
+ import "../chunk-KOZBVXXC.js";
54
+ import "../chunk-R3RTISDD.js";
55
55
  import {
56
56
  UsageError
57
57
  } from "../chunk-YU2EUD7O.js";
@@ -59,13 +59,13 @@ import "../chunk-T5I4PKOQ.js";
59
59
  import {
60
60
  EXIT
61
61
  } from "../chunk-BG4HHB7E.js";
62
- import "../chunk-R5ZMI6BM.js";
62
+ import "../chunk-PJSFKKZ5.js";
63
63
  import {
64
64
  getPackageVersion
65
65
  } from "../chunk-ZVU6WMMU.js";
66
66
  import {
67
67
  isValidApiKey
68
- } from "../chunk-KYWTX4R2.js";
68
+ } from "../chunk-TRDHHF3A.js";
69
69
  import "../chunk-MLKGABMK.js";
70
70
 
71
71
  // bin/pushary-login.ts
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  writeJsonError
4
- } from "../chunk-EBL6XYOI.js";
4
+ } from "../chunk-5T5T4YXM.js";
5
5
  import {
6
6
  describeCliKeyRevocation,
7
7
  keyNoLongerAccepted,
@@ -11,55 +11,55 @@ import {
11
11
  readCliHeldKeys,
12
12
  revokeOwnKey,
13
13
  sparedKeys
14
- } from "../chunk-2JQZFGIF.js";
15
- import "../chunk-IUPEFEBH.js";
14
+ } from "../chunk-W5ZUDPKV.js";
15
+ import "../chunk-FPG7X2GS.js";
16
16
  import {
17
17
  API_KEYS_PATH
18
- } from "../chunk-SUMWA5VN.js";
19
- import "../chunk-MKTZZPWV.js";
18
+ } from "../chunk-BQ673OOD.js";
19
+ import "../chunk-AGXOTZID.js";
20
20
  import {
21
21
  createIo
22
22
  } from "../chunk-FO3MDD26.js";
23
23
  import {
24
24
  exitOnHelpFlag
25
- } from "../chunk-LN6LLUY7.js";
26
- import "../chunk-MA4KQLCT.js";
27
- import "../chunk-5TVOBKRE.js";
28
- import "../chunk-7VPA5PXJ.js";
29
- import "../chunk-BE6JIWTM.js";
30
- import "../chunk-H5RGOO3B.js";
31
- import "../chunk-C32IT2TR.js";
25
+ } from "../chunk-67I7QRQB.js";
26
+ import "../chunk-YZESBU7F.js";
27
+ import "../chunk-G4OVFWU4.js";
28
+ import "../chunk-COXNQUDP.js";
29
+ import "../chunk-GW3PE52Q.js";
30
+ import "../chunk-2UE2NDCX.js";
31
+ import "../chunk-V52J2THT.js";
32
32
  import {
33
33
  parseFlags
34
34
  } from "../chunk-YPY4YCIZ.js";
35
- import "../chunk-74MC5LRW.js";
36
- import "../chunk-N74WJAL6.js";
35
+ import "../chunk-SE7P5BBK.js";
36
+ import "../chunk-NASQPMXW.js";
37
37
  import "../chunk-POFBE6ZY.js";
38
- import "../chunk-ZJKH3CTN.js";
38
+ import "../chunk-W6LKC5YD.js";
39
39
  import {
40
40
  absoluteUrl,
41
41
  checkApiKey
42
- } from "../chunk-DH23XX7X.js";
43
- import "../chunk-3OVRAD25.js";
44
- import "../chunk-6ICAZ33G.js";
45
- import "../chunk-RCCISH7T.js";
42
+ } from "../chunk-4HDX77ND.js";
43
+ import "../chunk-RGXFBS56.js";
44
+ import "../chunk-U32N5JZO.js";
45
+ import "../chunk-TZYVXTLN.js";
46
46
  import {
47
47
  clearKey,
48
48
  keyPrefix,
49
49
  readKeySource,
50
50
  resolveRcTarget
51
- } from "../chunk-YU3LDR5W.js";
52
- import "../chunk-DZI6MSR4.js";
51
+ } from "../chunk-YZ7V2LVG.js";
52
+ import "../chunk-VMM6JCNQ.js";
53
53
  import {
54
54
  claudeJson,
55
55
  codexConfigToml,
56
56
  cursorUserMcp,
57
57
  geminiSettings
58
- } from "../chunk-ARRXCME5.js";
59
- import "../chunk-XU4DUX7K.js";
58
+ } from "../chunk-CBLFIWPI.js";
59
+ import "../chunk-KOZBVXXC.js";
60
60
  import {
61
61
  getBaseUrl
62
- } from "../chunk-N4DQDFEP.js";
62
+ } from "../chunk-R3RTISDD.js";
63
63
  import {
64
64
  UsageError
65
65
  } from "../chunk-YU2EUD7O.js";
@@ -69,9 +69,9 @@ import {
69
69
  } from "../chunk-BG4HHB7E.js";
70
70
  import {
71
71
  isInvocationOf
72
- } from "../chunk-R5ZMI6BM.js";
72
+ } from "../chunk-PJSFKKZ5.js";
73
73
  import "../chunk-ZVU6WMMU.js";
74
- import "../chunk-KYWTX4R2.js";
74
+ import "../chunk-TRDHHF3A.js";
75
75
  import "../chunk-MLKGABMK.js";
76
76
 
77
77
  // bin/pushary-logout.ts
@@ -4,32 +4,32 @@ import {
4
4
  bridgeError,
5
5
  createMcpStdioBridge,
6
6
  parseBridgeLine
7
- } from "../chunk-2NN5ODYJ.js";
7
+ } from "../chunk-6KX2H4I5.js";
8
8
  import {
9
9
  triggerAutoUpdate
10
- } from "../chunk-FRIQ4LQ5.js";
10
+ } from "../chunk-MYNLU6DV.js";
11
11
  import "../chunk-POFBE6ZY.js";
12
- import "../chunk-ZJKH3CTN.js";
13
- import "../chunk-DH23XX7X.js";
12
+ import "../chunk-W6LKC5YD.js";
13
+ import "../chunk-4HDX77ND.js";
14
14
  import {
15
15
  installNetworkDefaults
16
- } from "../chunk-3OVRAD25.js";
17
- import "../chunk-6ICAZ33G.js";
18
- import "../chunk-RCCISH7T.js";
19
- import "../chunk-ARRXCME5.js";
20
- import "../chunk-XU4DUX7K.js";
16
+ } from "../chunk-RGXFBS56.js";
17
+ import "../chunk-U32N5JZO.js";
18
+ import "../chunk-TZYVXTLN.js";
19
+ import "../chunk-CBLFIWPI.js";
20
+ import "../chunk-KOZBVXXC.js";
21
21
  import {
22
22
  getApiKey,
23
23
  getBaseUrl
24
- } from "../chunk-N4DQDFEP.js";
24
+ } from "../chunk-R3RTISDD.js";
25
25
  import "../chunk-YU2EUD7O.js";
26
26
  import "../chunk-T5I4PKOQ.js";
27
27
  import {
28
28
  EXIT
29
29
  } from "../chunk-BG4HHB7E.js";
30
- import "../chunk-R5ZMI6BM.js";
30
+ import "../chunk-PJSFKKZ5.js";
31
31
  import "../chunk-ZVU6WMMU.js";
32
- import "../chunk-KYWTX4R2.js";
32
+ import "../chunk-TRDHHF3A.js";
33
33
  import "../chunk-MLKGABMK.js";
34
34
 
35
35
  // src/mcp-stdio-stream.ts