pushary 1.9.135 → 1.9.136

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 (133) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{api-WEDLFKUE.js → api-5H25QRNM.js} +11 -11
  3. package/dist/bin/pushary-audit.js +3 -3
  4. package/dist/bin/pushary-bell-hook.js +28 -28
  5. package/dist/bin/pushary-bell.js +10 -10
  6. package/dist/bin/pushary-claude.js +27 -27
  7. package/dist/bin/pushary-clean.js +35 -35
  8. package/dist/bin/pushary-codex-bridge.js +23 -23
  9. package/dist/bin/pushary-codex-hook.js +58 -42
  10. package/dist/bin/pushary-codex-session.js +8 -8
  11. package/dist/bin/pushary-codex.js +16 -16
  12. package/dist/bin/pushary-connect.js +29 -29
  13. package/dist/bin/pushary-cowork.js +5 -5
  14. package/dist/bin/pushary-daemon.js +43 -43
  15. package/dist/bin/pushary-disconnect.js +28 -28
  16. package/dist/bin/pushary-display-hook.js +21 -7
  17. package/dist/bin/pushary-doctor.js +43 -43
  18. package/dist/bin/pushary-elicitation-hook.js +28 -28
  19. package/dist/bin/pushary-gemini-bridge.js +17 -17
  20. package/dist/bin/pushary-gemini-hook.js +32 -32
  21. package/dist/bin/pushary-hook.js +35 -34
  22. package/dist/bin/pushary-login.js +21 -21
  23. package/dist/bin/pushary-logout.js +27 -27
  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 +27 -27
  27. package/dist/bin/pushary-opencode-hook.js +31 -31
  28. package/dist/bin/pushary-permission-denied-hook.js +35 -34
  29. package/dist/bin/pushary-permission-hook.js +39 -36
  30. package/dist/bin/pushary-post-hook.js +33 -28
  31. package/dist/bin/pushary-prompt-hook.js +27 -27
  32. package/dist/bin/pushary-session-end-hook.js +27 -27
  33. package/dist/bin/pushary-session-start-hook.js +36 -36
  34. package/dist/bin/pushary-setup.js +50 -50
  35. package/dist/bin/pushary-stats.js +5 -5
  36. package/dist/bin/pushary-status.js +33 -33
  37. package/dist/bin/pushary-stop-hook.js +27 -27
  38. package/dist/bin/pushary-stopfailure-hook.js +27 -27
  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 +41 -41
  43. package/dist/bin/pushary-wait.js +15 -15
  44. package/dist/bin/pushary.js +7 -7
  45. package/dist/{chunk-LIXCHEDJ.js → chunk-2E46RALI.js} +6 -6
  46. package/dist/{chunk-4YBDKFU2.js → chunk-2MVKT7KH.js} +2 -2
  47. package/dist/{chunk-7JXYR4TC.js → chunk-2R4OVJHS.js} +5 -5
  48. package/dist/{chunk-WPPTHRBO.js → chunk-2XDVEBHI.js} +5 -5
  49. package/dist/{chunk-5GQLZ46V.js → chunk-3HXOR6E5.js} +8 -8
  50. package/dist/{chunk-VND6LN6X.js → chunk-3QBI5C6P.js} +2 -2
  51. package/dist/{chunk-7ASHS5VR.js → chunk-43DT3QWZ.js} +18 -5
  52. package/dist/{chunk-AEOITMCS.js → chunk-4T72AHIA.js} +4 -4
  53. package/dist/{chunk-V7KBG7XH.js → chunk-54TZGPZP.js} +3 -3
  54. package/dist/{chunk-WVOMK2HW.js → chunk-5XDFQ6E3.js} +1 -1
  55. package/dist/{chunk-JDAX2HVS.js → chunk-62GD26OE.js} +2 -2
  56. package/dist/{chunk-VCMJLNEP.js → chunk-6SWFS4GU.js} +2 -2
  57. package/dist/{chunk-UXPRMNH2.js → chunk-A2YJ2FBR.js} +3 -2
  58. package/dist/{chunk-QUMPSMZN.js → chunk-A4YOXS24.js} +3 -3
  59. package/dist/{chunk-MGTMXF3T.js → chunk-A7R43KOX.js} +3 -3
  60. package/dist/{chunk-RGRPDJG3.js → chunk-D7AAAD6W.js} +163 -108
  61. package/dist/{chunk-6RSAOA2P.js → chunk-DBIPNY7J.js} +3 -3
  62. package/dist/{chunk-H4226UC7.js → chunk-DL67HX3D.js} +32 -9
  63. package/dist/{chunk-SULQKUPJ.js → chunk-EJHD44ZN.js} +2 -2
  64. package/dist/{chunk-MYMADZRU.js → chunk-EQZB5P6I.js} +2 -2
  65. package/dist/{chunk-RCZ5ZER4.js → chunk-FAF5RDWT.js} +6 -6
  66. package/dist/{chunk-OUMH4UTT.js → chunk-G73ACPR2.js} +2 -2
  67. package/dist/{chunk-N2DYYXQI.js → chunk-GACQSKNG.js} +2 -2
  68. package/dist/{chunk-ACI4PZ5N.js → chunk-GS5FH3C2.js} +3 -3
  69. package/dist/{chunk-64QLX4ZC.js → chunk-H2RE3IPK.js} +1 -1
  70. package/dist/{chunk-KUAS2DGZ.js → chunk-HKJLPVPZ.js} +5 -5
  71. package/dist/{chunk-7DWERNHQ.js → chunk-HY4ATVCT.js} +3 -3
  72. package/dist/{chunk-UDSJKRRI.js → chunk-ICCM3DLT.js} +2 -2
  73. package/dist/{chunk-AXQFLLOB.js → chunk-IHAKBLW2.js} +4 -4
  74. package/dist/{chunk-FP6ZVMF2.js → chunk-IKBTG3OT.js} +1 -1
  75. package/dist/{chunk-DMK3U7GG.js → chunk-IRIXOH4U.js} +1 -1
  76. package/dist/{chunk-U5W3MKPU.js → chunk-JZJ5CM6X.js} +5 -5
  77. package/dist/{chunk-4VVDRMVE.js → chunk-K7YJBVR3.js} +1 -1
  78. package/dist/{chunk-GLAGHQPB.js → chunk-KLV2NQVT.js} +4 -4
  79. package/dist/{chunk-FSLV5FIE.js → chunk-KTVMIG32.js} +4 -4
  80. package/dist/{chunk-Q5GPXYDG.js → chunk-KYD3LHFB.js} +1 -1
  81. package/dist/{chunk-XRO6NRBO.js → chunk-L2GADKFL.js} +6 -6
  82. package/dist/{chunk-65ZWYA5L.js → chunk-L7Q57R4J.js} +10 -10
  83. package/dist/{chunk-IOUCIJ56.js → chunk-LAWI6NQK.js} +1 -1
  84. package/dist/{chunk-IABPEGAA.js → chunk-LNF36PTF.js} +2 -2
  85. package/dist/{chunk-E4RMOK4A.js → chunk-MENTZJHA.js} +1 -1
  86. package/dist/{chunk-TKOALSA5.js → chunk-MQ3I5OIC.js} +8 -8
  87. package/dist/{chunk-BGXXWLS5.js → chunk-MQMVJDII.js} +1 -1
  88. package/dist/{chunk-WTLQMJZ3.js → chunk-N3VCBXI6.js} +3 -3
  89. package/dist/{chunk-EWJXECUK.js → chunk-NN43KGTN.js} +4 -4
  90. package/dist/{chunk-WNPZGHHU.js → chunk-NZD6ISCL.js} +3 -3
  91. package/dist/{chunk-3KPPXZCO.js → chunk-O5T53LZ5.js} +42 -25
  92. package/dist/{chunk-6UARD3WA.js → chunk-PHA6AFOR.js} +3 -3
  93. package/dist/{chunk-LTY5DSWT.js → chunk-PNVTPEO5.js} +3 -3
  94. package/dist/{chunk-G3YIGTFS.js → chunk-POV2TBFA.js} +11 -11
  95. package/dist/{chunk-SFN72Q7W.js → chunk-Q2VV77IY.js} +3 -3
  96. package/dist/{chunk-GRCX2FGD.js → chunk-QXATIKHQ.js} +1 -1
  97. package/dist/{chunk-6QZGKKQS.js → chunk-R7CQF2P3.js} +1 -1
  98. package/dist/{chunk-ZJKWDM3S.js → chunk-R7KC57PC.js} +2 -2
  99. package/dist/{chunk-UCGWTMQD.js → chunk-RPFSVNH6.js} +3 -3
  100. package/dist/{chunk-VXYGYCNR.js → chunk-RRUP72V6.js} +1 -1
  101. package/dist/{chunk-ORZ7H3AQ.js → chunk-TLK5YLIE.js} +4 -4
  102. package/dist/{chunk-NBMK6T6R.js → chunk-U3OLXV5Z.js} +2 -2
  103. package/dist/chunk-UP5QXEUU.js +31 -0
  104. package/dist/{chunk-X3NYMHLG.js → chunk-V7ZY7P2X.js} +6 -6
  105. package/dist/{chunk-CGROOSWT.js → chunk-VBWJ756P.js} +5 -5
  106. package/dist/{chunk-OEIU6BNH.js → chunk-VO77WHK4.js} +6 -6
  107. package/dist/{chunk-NWNUS2ET.js → chunk-VV7WRIQT.js} +4 -4
  108. package/dist/{chunk-2K7MZRPH.js → chunk-VVN3RPV6.js} +1 -1
  109. package/dist/{chunk-35RCY4LB.js → chunk-WM7OY63L.js} +1 -1
  110. package/dist/{chunk-RLNJNRYP.js → chunk-WNT4JHK3.js} +1 -1
  111. package/dist/{chunk-ZNST34QH.js → chunk-WXUEOHYY.js} +5 -5
  112. package/dist/{chunk-XB75IJ3G.js → chunk-Y47BMZUR.js} +1 -1
  113. package/dist/{chunk-4XTB74D3.js → chunk-YHX5YF77.js} +4 -4
  114. package/dist/{chunk-4PPSXQQ6.js → chunk-YOV3LHOL.js} +3 -3
  115. package/dist/{chunk-7KWOR2T2.js → chunk-YQQGIDBC.js} +1 -1
  116. package/dist/{chunk-7GEMAKQL.js → chunk-YURIU333.js} +5 -5
  117. package/dist/{chunk-QLIG4PMT.js → chunk-ZWIJJYN3.js} +4 -4
  118. package/dist/{chunk-UCDPJHZT.js → chunk-ZWLSXECG.js} +2 -2
  119. package/dist/{chunk-UQCVVN7K.js → chunk-ZWURBNA3.js} +1 -1
  120. package/dist/{codex-app-cards-switch-C6DXLVAM.js → codex-app-cards-switch-Z7TMF2OR.js} +11 -11
  121. package/dist/{codex-card-routing-ZMMS4RIR.js → codex-card-routing-LQJEJNTS.js} +2 -2
  122. package/dist/{codex-desktop-launch-DIUFMA45.js → codex-desktop-launch-HKXGKL3T.js} +1 -1
  123. package/dist/{codex-session-launch-S4WTGKRY.js → codex-session-launch-DTGH7ZKM.js} +20 -20
  124. package/dist/{config-BV5FQ536.js → config-34VUNHK6.js} +3 -3
  125. package/dist/{global-upgrade-JZWB67EU.js → global-upgrade-5UAH5DCG.js} +9 -9
  126. package/dist/{identity-G6FQTONT.js → identity-UFJEWGEU.js} +4 -4
  127. package/dist/{live-capabilities-YHMOXY5E.js → live-capabilities-BL3SHFWX.js} +4 -4
  128. package/dist/{paths-XTEJ5LI2.js → paths-YA5ROXGC.js} +3 -3
  129. package/dist/{reapply-MVZKPXIQ.js → reapply-OPQF4DPQ.js} +29 -29
  130. package/dist/src/index.js +34 -33
  131. package/dist/{upgrade-lock-YPAQEEJA.js → upgrade-lock-AZLOOGKV.js} +4 -4
  132. package/dist/{usage-R6PZTIEH.js → usage-ZSV4LFDL.js} +3 -3
  133. package/package.json +1 -1
@@ -1,33 +1,38 @@
1
+ import {
2
+ forgetPhoneApproval,
3
+ rememberPhoneApproval,
4
+ takePhoneApproval
5
+ } from "./chunk-UP5QXEUU.js";
1
6
  import {
2
7
  claudeSettingsLocationFor,
3
8
  readClaudePermissionRules
4
- } from "./chunk-OUMH4UTT.js";
9
+ } from "./chunk-G73ACPR2.js";
5
10
  import {
6
11
  askAgentQuestions,
7
12
  defersToNativeMode,
8
13
  outcomeOfFailedAsk,
9
14
  storedWaitDeadline
10
- } from "./chunk-7JXYR4TC.js";
15
+ } from "./chunk-2R4OVJHS.js";
11
16
  import {
12
17
  reportMachineDenial
13
- } from "./chunk-7DWERNHQ.js";
18
+ } from "./chunk-HY4ATVCT.js";
14
19
  import {
15
20
  isGatingMoment,
16
21
  recordKeylessMoment
17
- } from "./chunk-7KWOR2T2.js";
22
+ } from "./chunk-YQQGIDBC.js";
18
23
  import {
19
24
  isAdmitted,
20
25
  readAdmissionRules
21
- } from "./chunk-7GEMAKQL.js";
26
+ } from "./chunk-YURIU333.js";
22
27
  import {
23
28
  isDeferAnswer,
24
29
  oncePerSession
25
- } from "./chunk-64QLX4ZC.js";
30
+ } from "./chunk-H2RE3IPK.js";
26
31
  import {
27
32
  activeHookSource,
28
33
  activeIdentity,
29
34
  namedSource
30
- } from "./chunk-7ASHS5VR.js";
35
+ } from "./chunk-43DT3QWZ.js";
31
36
  import {
32
37
  DEFAULT_SESSION,
33
38
  approvalAwaitingRetry,
@@ -48,7 +53,7 @@ import {
48
53
  settleQuestionsForToolUse,
49
54
  sweepFilesOlderThan,
50
55
  userScope
51
- } from "./chunk-RGRPDJG3.js";
56
+ } from "./chunk-D7AAAD6W.js";
52
57
  import {
53
58
  UNNAMED_ACTION,
54
59
  deriveAction,
@@ -59,12 +64,12 @@ import {
59
64
  patchDeletesFiles,
60
65
  permissionDeniedAction,
61
66
  scopePathFor
62
- } from "./chunk-UXPRMNH2.js";
67
+ } from "./chunk-A2YJ2FBR.js";
63
68
  import {
64
69
  branchFor,
65
70
  repoKeyFor,
66
71
  repositoryScopeFor
67
- } from "./chunk-DMK3U7GG.js";
72
+ } from "./chunk-IRIXOH4U.js";
68
73
  import {
69
74
  askUser,
70
75
  cancelQuestion,
@@ -81,20 +86,20 @@ import {
81
86
  waitForQuestion,
82
87
  waitsForThePhone,
83
88
  withdrawQuestion
84
- } from "./chunk-XRO6NRBO.js";
89
+ } from "./chunk-L2GADKFL.js";
85
90
  import {
86
91
  getMachineId
87
- } from "./chunk-RLNJNRYP.js";
92
+ } from "./chunk-WNT4JHK3.js";
88
93
  import {
89
94
  getApiKey,
90
95
  getBaseUrl
91
- } from "./chunk-FP6ZVMF2.js";
96
+ } from "./chunk-IKBTG3OT.js";
92
97
  import {
93
98
  writeFileAtomic
94
99
  } from "./chunk-TODDEIYG.js";
95
100
  import {
96
101
  NPX_LATEST_COMMAND
97
- } from "./chunk-BGXXWLS5.js";
102
+ } from "./chunk-MQMVJDII.js";
98
103
  import {
99
104
  AGENT_QUESTION_STRATEGY,
100
105
  AGENT_QUESTION_TOOL,
@@ -163,7 +168,7 @@ import {
163
168
  timeoutActionWithoutLocalPrompt,
164
169
  unansweredRefusalReason,
165
170
  unapprovedScopeReason
166
- } from "./chunk-H4226UC7.js";
171
+ } from "./chunk-DL67HX3D.js";
167
172
 
168
173
  // src/terminal-answer-watch.ts
169
174
  import { closeSync, openSync, readSync, statSync } from "fs";
@@ -448,7 +453,9 @@ var ACTIVE_AGENT = activeIdentity(process.argv);
448
453
  var ACTIVE_SOURCE = activeHookSource(process.argv);
449
454
  var HANDED_DOWN_BY_THE_MAC_BRIDGE = namedSource(process.argv) !== void 0;
450
455
  var CLAUDE_SESSION_ATTENDED_ENV = "CLAUDE_CODE_SESSION_ATTENDED";
451
- var PUSHARY_IS_SOLE_GATE = ACTIVE_SOURCE !== null && hookCompatibleProfileBySource(ACTIVE_SOURCE)?.soleGate != null;
456
+ var ACTIVE_PROFILE = ACTIVE_SOURCE === null ? void 0 : hookCompatibleProfileBySource(ACTIVE_SOURCE);
457
+ var PUSHARY_IS_SOLE_GATE = ACTIVE_PROFILE?.soleGate != null;
458
+ var PHONE_APPROVAL_SOURCE = ACTIVE_PROFILE?.promptFollowsPreToolUseAllow ? ACTIVE_PROFILE.source : null;
452
459
  var agentNameIn = (projectName) => `${ACTIVE_AGENT.label} - ${projectName}`;
453
460
  var allowWithInput = (updatedInput) => claudePreToolUseOutput("allow", void 0, updatedInput);
454
461
  var undecidedCall = (reason) => PUSHARY_IS_SOLE_GATE ? deny(reason) : void 0;
@@ -554,7 +561,7 @@ var emitDecisionEpisode = (apiKey, input, toolPolicy, machineId, toolTarget, dec
554
561
  machineId
555
562
  });
556
563
  };
557
- var dispatchModeHandler = async (apiKey, input, toolPolicy, machineId, trainingConsent = false, scopeReason, scopePath, terminalLive, askReason, matchedRoute) => {
564
+ var dispatchModeDecision = async (apiKey, input, toolPolicy, machineId, trainingConsent = false, scopeReason, scopePath, terminalLive, askReason, matchedRoute) => {
558
565
  const description = describeToolCall(input.tool_name, input.tool_input, "hook");
559
566
  const projectName = basename(input.cwd ?? process.cwd());
560
567
  const sessionId = input.session_id;
@@ -622,8 +629,10 @@ var dispatchModeHandler = async (apiKey, input, toolPolicy, machineId, trainingC
622
629
  if (trainingConsent && signals.humanDecision) {
623
630
  emitDecisionEpisode(apiKey, input, toolPolicy, machineId, toolTarget, decision, result);
624
631
  }
625
- return result;
632
+ return { result, humanDecision: signals.humanDecision === true };
626
633
  };
634
+ var dispatchModeHandler = async (...args) => (await dispatchModeDecision(...args)).result;
635
+ var isPhoneApproval = (decided) => decided.humanDecision && decided.result?.hookSpecificOutput.permissionDecision === "allow";
627
636
  var CURSOR_SCOPE_TIMEOUT_ACTION = "escalate";
628
637
  var cursorScopeWaitSeconds = ({ timeoutSeconds, timeoutAction }) => Math.min(effectiveWaitSeconds(timeoutAction, timeoutSeconds, "cursor"), hookMaxWaitSeconds("cursor"));
629
638
  var hasItsOwnApprovalPrompt = (source) => source === null || hasNativeApprovalPrompt(source, "PreToolUse");
@@ -865,6 +874,7 @@ var standingRefusalOf = async (input) => {
865
874
  }
866
875
  };
867
876
  var handlePreToolUse = async (input, canonical) => {
877
+ if (PHONE_APPROVAL_SOURCE) forgetPhoneApproval(PHONE_APPROVAL_SOURCE, input);
868
878
  if (isPusharyOwnTool(input.tool_name)) return void 0;
869
879
  if (isRefusalsOnlyCallInClaudeCode(input) && !mcpCallWaitsForSomeoneElse(input)) {
870
880
  return isPusharyConnectorTool(input.tool_name) ? void 0 : standingRefusalOf(input);
@@ -917,13 +927,12 @@ var handlePreToolUse = async (input, canonical) => {
917
927
  // opinion, so Claude Code's own flow runs as if the hook were absent.
918
928
  case "defer":
919
929
  return undecidedCall(SOLE_GATE_UNDECIDED_REASON);
920
- default:
930
+ default: {
921
931
  if (preToolUseHandsOff(input, gateInput, verdict)) return ask(TERMINAL_AND_PHONE_REASON);
922
- return rememberHandbackToThePrompt(
923
- input,
924
- heldForMcpRoute,
925
- await dispatchModeHandler(apiKey, input, verdict.policy, getMachineId(), modeState.trainingConsent, verdict.scopeReason, verdict.scopePath, void 0, permissionsOffAskReason(gateInput, verdict), matchedRouteOf(gateInput))
926
- );
932
+ const decided = await dispatchModeDecision(apiKey, input, verdict.policy, getMachineId(), modeState.trainingConsent, verdict.scopeReason, verdict.scopePath, void 0, permissionsOffAskReason(gateInput, verdict), matchedRouteOf(gateInput));
933
+ if (PHONE_APPROVAL_SOURCE && isPhoneApproval(decided)) rememberPhoneApproval(PHONE_APPROVAL_SOURCE, input);
934
+ return rememberHandbackToThePrompt(input, heldForMcpRoute, decided.result);
935
+ }
927
936
  }
928
937
  } catch (error) {
929
938
  await reportHookFailure("pre_tool_use_failed", error);
@@ -940,6 +949,7 @@ var toPermissionRequestOutput = (hookOutput) => {
940
949
  if (d.permissionDecision === "deny") return permReqDeny(d.permissionDecisionReason);
941
950
  return void 0;
942
951
  };
952
+ var answerOfTheReplay = (replayed) => replayed.humanDecision ? toPermissionRequestOutput(replayed.result) : void 0;
943
953
  var handlePermissionRequest = async (input, canonical, holdBudgetSeconds) => {
944
954
  const claudeRules = claudePermissionRulesFor(input);
945
955
  if (canonical === void 0 && !claudeRulesMayCover(input, claudeRules) && isPermissionRequestOwnedByPreToolUse(input.tool_name, input.permission_mode, shouldDeferToNativeMode) && !terminalStaysLiveForTheCall(terminalLiveFactsOf(input))) return void 0;
@@ -967,12 +977,14 @@ var handlePermissionRequest = async (input, canonical, holdBudgetSeconds) => {
967
977
  if (isMcpCallInClaudeCode(input) && claimMcpHoldHandback(blockedActionFingerprintFor(input))) return void 0;
968
978
  if (agentQuestionStrategy(ACTIVE_SOURCE, "PermissionRequest", input.tool_name) === AGENT_QUESTION_STRATEGY.native) return void 0;
969
979
  if (verdict.kind === "gate" && verdict.scopeReason && (canonical?.toolInputs.length ?? 0) > 1) return permReqDeny(SCOPE_BATCH_REASON);
980
+ const approvedCall = PHONE_APPROVAL_SOURCE ? takePhoneApproval(PHONE_APPROVAL_SOURCE, input) : void 0;
981
+ const preToolUseAllowLeftThePrompt = PHONE_APPROVAL_SOURCE !== null && (verdict.kind === "allow" || approvedCall !== void 0);
970
982
  const handedOff = preToolUseHandsOff(input, gateInput, verdict);
971
983
  const terminalLive = terminalStaysLiveForTheCall(terminalLiveFactsOf(input));
972
984
  const scopeQuestion = verdict.kind === "gate" && Boolean(verdict.scopeReason);
973
985
  const preToolUseRanForTheCall = PRETOOLUSE_HANDLED_TOOLS.has(input.tool_name) && isAdmitted(readAdmissionRules(), "claude", "PreToolUse");
974
986
  const preToolUseAskedTheScopeQuestion = scopeQuestion && terminalLive && preToolUseRanForTheCall;
975
- const preToolUseOwnsTheCall = !scopeQuestion && !claudeAllowlistOwnsCall(gateInput, verdict, input.permission_mode, claudeRules) && (isPermissionRequestOwnedByPreToolUse(input.tool_name, input.permission_mode, shouldDeferToNativeMode) || preToolUseRanForTheCall && approvalRouteOutranksAutoMode(gateInput, verdict, input.permission_mode));
987
+ const preToolUseOwnsTheCall = !scopeQuestion && !preToolUseAllowLeftThePrompt && !claudeAllowlistOwnsCall(gateInput, verdict, input.permission_mode, claudeRules) && (isPermissionRequestOwnedByPreToolUse(input.tool_name, input.permission_mode, shouldDeferToNativeMode) || preToolUseRanForTheCall && approvalRouteOutranksAutoMode(gateInput, verdict, input.permission_mode));
976
988
  if (!handedOff && (preToolUseAskedTheScopeQuestion || preToolUseOwnsTheCall)) return void 0;
977
989
  const terminalLiveDispatch = handedOff ? { holdBudgetSeconds } : void 0;
978
990
  switch (verdict.kind) {
@@ -982,6 +994,11 @@ var handlePermissionRequest = async (input, canonical, holdBudgetSeconds) => {
982
994
  case "defer":
983
995
  return void 0;
984
996
  default:
997
+ if (approvedCall) {
998
+ return answerOfTheReplay(
999
+ await dispatchModeDecision(apiKey, approvedCall, verdict.policy, getMachineId(), false, verdict.scopeReason, verdict.scopePath, terminalLiveDispatch, permissionsOffAskReason(gateInput, verdict), matchedRouteOf(gateInput))
1000
+ );
1001
+ }
985
1002
  return toPermissionRequestOutput(
986
1003
  await dispatchModeHandler(apiKey, input, verdict.policy, getMachineId(), modeState.trainingConsent, verdict.scopeReason, verdict.scopePath, terminalLiveDispatch, permissionsOffAskReason(gateInput, verdict), matchedRouteOf(gateInput))
987
1004
  );
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  readExistingMachineId
3
- } from "./chunk-RLNJNRYP.js";
3
+ } from "./chunk-WNT4JHK3.js";
4
4
  import {
5
5
  getBaseUrl
6
- } from "./chunk-FP6ZVMF2.js";
6
+ } from "./chunk-IKBTG3OT.js";
7
7
  import {
8
8
  NetworkError
9
9
  } from "./chunk-YU2EUD7O.js";
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  clientContextHeaders,
15
15
  redactSecretsFromContent
16
- } from "./chunk-H4226UC7.js";
16
+ } from "./chunk-DL67HX3D.js";
17
17
 
18
18
  // src/cli/net.ts
19
19
  import { createRequire } from "module";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  resolveInstallSourceFor
3
- } from "./chunk-IABPEGAA.js";
3
+ } from "./chunk-LNF36PTF.js";
4
4
  import {
5
5
  configFilePath
6
- } from "./chunk-FP6ZVMF2.js";
6
+ } from "./chunk-IKBTG3OT.js";
7
7
  import {
8
8
  backupFile,
9
9
  readJsonSafe,
@@ -14,7 +14,7 @@ import {
14
14
  API_KEY_PREFIX_PATTERN,
15
15
  isRecord,
16
16
  isValidApiKey
17
- } from "./chunk-H4226UC7.js";
17
+ } from "./chunk-DL67HX3D.js";
18
18
 
19
19
  // src/shell-alias.ts
20
20
  import { homedir } from "os";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  ensureCodexTrustsPusharyHooks
3
- } from "./chunk-VCMJLNEP.js";
3
+ } from "./chunk-6SWFS4GU.js";
4
4
  import {
5
5
  hermesReceiptPaths,
6
6
  hermesSetupPredatesThePluginFolder,
7
7
  installHermesPlugin,
8
8
  refreshHermesPluginFiles,
9
9
  shippedHermesPlugin
10
- } from "./chunk-MGTMXF3T.js";
10
+ } from "./chunk-A7R43KOX.js";
11
11
  import {
12
12
  fxIgnoresInstructionsFile,
13
13
  fxInstructionsBody,
@@ -16,7 +16,7 @@ import {
16
16
  macAppFxBridge,
17
17
  refreshClineKey,
18
18
  switchFxHttpEntryToBridge
19
- } from "./chunk-WPPTHRBO.js";
19
+ } from "./chunk-2XDVEBHI.js";
20
20
  import {
21
21
  OPENCODE_HOOK_BINARY,
22
22
  agentHookOwner,
@@ -28,16 +28,16 @@ import {
28
28
  openCodePluginDir,
29
29
  openCodeWired,
30
30
  withOpenCodeAskRules
31
- } from "./chunk-CGROOSWT.js";
31
+ } from "./chunk-VBWJ756P.js";
32
32
  import {
33
33
  detectClaudeVersion
34
- } from "./chunk-SULQKUPJ.js";
34
+ } from "./chunk-EJHD44ZN.js";
35
35
  import {
36
36
  addCompatibleHooks,
37
37
  compatibleConfigFile,
38
38
  compatibleInstructionsFile,
39
39
  hasCompatibleHooks
40
- } from "./chunk-7ASHS5VR.js";
40
+ } from "./chunk-43DT3QWZ.js";
41
41
  import {
42
42
  GEMINI_HOOK_BINARY,
43
43
  addGeminiHooks,
@@ -49,10 +49,10 @@ import {
49
49
  geminiWired,
50
50
  hasGeminiHooks,
51
51
  planHooks
52
- } from "./chunk-ORZ7H3AQ.js";
52
+ } from "./chunk-TLK5YLIE.js";
53
53
  import {
54
54
  KEY_FILE_MODE
55
- } from "./chunk-LTY5DSWT.js";
55
+ } from "./chunk-PNVTPEO5.js";
56
56
  import {
57
57
  CLAUDE_HOOK_BINARY,
58
58
  CLAUDE_HOOK_EVENTS,
@@ -99,13 +99,13 @@ import {
99
99
  renderAgentInstructions,
100
100
  supportedClaudeEvents,
101
101
  vscodePluginMcp
102
- } from "./chunk-ZJKWDM3S.js";
102
+ } from "./chunk-R7KC57PC.js";
103
103
  import {
104
104
  formatVersion,
105
105
  hookCommandsUseBareNames,
106
106
  resolveGlobalBinDir,
107
107
  resolveGlobalBinary
108
- } from "./chunk-ACI4PZ5N.js";
108
+ } from "./chunk-GS5FH3C2.js";
109
109
  import {
110
110
  readJsonSafe,
111
111
  writeFileAtomic,
@@ -115,7 +115,7 @@ import {
115
115
  HOOK_COMPATIBLE_PROFILES,
116
116
  isCompatibleAgentType,
117
117
  isRecord
118
- } from "./chunk-H4226UC7.js";
118
+ } from "./chunk-DL67HX3D.js";
119
119
 
120
120
  // src/reapply.ts
121
121
  import { dirname, join } from "path";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  pusharyFetch
3
- } from "./chunk-6UARD3WA.js";
3
+ } from "./chunk-PHA6AFOR.js";
4
4
  import {
5
5
  getBaseUrl
6
- } from "./chunk-FP6ZVMF2.js";
6
+ } from "./chunk-IKBTG3OT.js";
7
7
  import {
8
8
  NetworkError
9
9
  } from "./chunk-YU2EUD7O.js";
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  isValidApiKey,
15
15
  normalizeKeyScope
16
- } from "./chunk-H4226UC7.js";
16
+ } from "./chunk-DL67HX3D.js";
17
17
 
18
18
  // src/session.ts
19
19
  var samePusharyAccount = (left, right) => left.kind === "ok" && right.kind === "ok" && left.identity.workspaceId !== "" && left.identity.workspaceId === right.identity.workspaceId && left.identity.siteId === right.identity.siteId;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  HOOK_HOLD_BUDGET_ENV,
3
3
  hookHoldBudgetProof
4
- } from "./chunk-H4226UC7.js";
4
+ } from "./chunk-DL67HX3D.js";
5
5
 
6
6
  // src/hold-budget.ts
7
7
  var takeHookHoldBudget = (args = process.argv.slice(2), env = process.env) => {
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  RETRY_ACK,
6
6
  refusedReceiptMessage
7
- } from "./chunk-XB75IJ3G.js";
7
+ } from "./chunk-Y47BMZUR.js";
8
8
 
9
9
  // src/command-receipts.ts
10
10
  import { randomUUID } from "crypto";
@@ -3,7 +3,7 @@ import {
3
3
  formatVersion,
4
4
  quoteIfNeeded,
5
5
  shellDoubleQuoted
6
- } from "./chunk-ACI4PZ5N.js";
6
+ } from "./chunk-GS5FH3C2.js";
7
7
  import {
8
8
  writeFileAtomic
9
9
  } from "./chunk-TODDEIYG.js";
@@ -20,7 +20,7 @@ import {
20
20
  PRETOOLUSE_GATED_TOOLS,
21
21
  PUSHARY_TOOL_PREFIX,
22
22
  withHookHoldBudget
23
- } from "./chunk-H4226UC7.js";
23
+ } from "./chunk-DL67HX3D.js";
24
24
 
25
25
  // src/setup/paths.ts
26
26
  import { createHash as createHash2 } from "crypto";
@@ -531,8 +531,8 @@ var loadedOnce = (load) => {
531
531
  };
532
532
 
533
533
  // src/codex-desktop-proxy.ts
534
- var loadThePhone = () => import("./api-WEDLFKUE.js");
535
- var loadTheCardRouting = () => import("./codex-card-routing-ZMMS4RIR.js");
534
+ var loadThePhone = () => import("./api-5H25QRNM.js");
535
+ var loadTheCardRouting = () => import("./codex-card-routing-LQJEJNTS.js");
536
536
  var theFirstCardLoadsAgain = () => {
537
537
  };
538
538
  var ASKS_WITHOUT_ROUTING = {};
@@ -1085,7 +1085,7 @@ var codexDesktopCommand = async (args, entry, readAccount) => {
1085
1085
  return runCodexDesktopProxy(engine2, args.slice(3), readAccount, { watchesForCards: layoutIsKnown });
1086
1086
  }
1087
1087
  if (args[0] === APP_CARDS_FLAG) {
1088
- const { codexAppCardsCommandOnThisMac } = await import("./codex-app-cards-switch-C6DXLVAM.js");
1088
+ const { codexAppCardsCommandOnThisMac } = await import("./codex-app-cards-switch-Z7TMF2OR.js");
1089
1089
  return codexAppCardsCommandOnThisMac(args.slice(1), entry, readAccount);
1090
1090
  }
1091
1091
  if (args.length > 2) throw new Error("Usage: pushary codex --desktop [path/to/Codex.app]");
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-BG4HHB7E.js";
8
8
  import {
9
9
  redactSecretsFromContent
10
- } from "./chunk-H4226UC7.js";
10
+ } from "./chunk-DL67HX3D.js";
11
11
 
12
12
  // src/cli/json.ts
13
13
  var writeStdoutFully = (text) => new Promise((resolve, reject) => {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  AGENT_CHOICES
3
- } from "./chunk-WVOMK2HW.js";
3
+ } from "./chunk-5XDFQ6E3.js";
4
4
  import {
5
5
  BELL_HOOK_BINARY
6
- } from "./chunk-IOUCIJ56.js";
6
+ } from "./chunk-LAWI6NQK.js";
7
7
  import {
8
8
  CLAUDE_HOOK_EVENTS,
9
9
  CODEX_HOOK_EVENTS,
@@ -16,13 +16,13 @@ import {
16
16
  isBridgeLocator,
17
17
  isProtectedByScope,
18
18
  registerHookEntry
19
- } from "./chunk-ZJKWDM3S.js";
19
+ } from "./chunk-R7KC57PC.js";
20
20
  import {
21
21
  CURSOR_GATE_EVENTS,
22
22
  HOOK_BUDGETS,
23
23
  HOOK_LOCATOR_BINARY,
24
24
  hookCommandHoldBudget
25
- } from "./chunk-H4226UC7.js";
25
+ } from "./chunk-DL67HX3D.js";
26
26
 
27
27
  // src/gemini-config.ts
28
28
  var GEMINI_HOOK_BINARY = "pushary-gemini-hook";
@@ -4,10 +4,10 @@ import {
4
4
  keyPrefix,
5
5
  readConfigFileKey,
6
6
  readMacAppKeyPrefix
7
- } from "./chunk-LTY5DSWT.js";
7
+ } from "./chunk-PNVTPEO5.js";
8
8
  import {
9
9
  NPX_LATEST_COMMAND
10
- } from "./chunk-BGXXWLS5.js";
10
+ } from "./chunk-MQMVJDII.js";
11
11
 
12
12
  // src/key-signed-out.ts
13
13
  var VERDICT_BY_CHECK = {
@@ -0,0 +1,31 @@
1
+ import {
2
+ callDecisionStore,
3
+ identifyingToolInput
4
+ } from "./chunk-D7AAAD6W.js";
5
+ import {
6
+ canonicalJson
7
+ } from "./chunk-R7KC57PC.js";
8
+
9
+ // src/phone-approval.ts
10
+ import { createHash } from "crypto";
11
+ var PHONE_APPROVAL_TTL_MS = 60 * 60 * 1e3;
12
+ var promptedCallKey = (source, call) => {
13
+ if (!call.session_id || !call.tool_name) return null;
14
+ const material = canonicalJson([source, call.session_id, call.cwd ?? "", call.tool_name, identifyingToolInput(call.tool_input)]);
15
+ return createHash("sha256").update(material, "utf-8").digest("hex").slice(0, 32);
16
+ };
17
+ var phoneApprovals = callDecisionStore("phone-approval", PHONE_APPROVAL_TTL_MS);
18
+ var forgetPhoneApproval = (source, call) => phoneApprovals.forget(promptedCallKey(source, call));
19
+ var rememberPhoneApproval = (source, call) => {
20
+ if (call.tool_use_id) phoneApprovals.record(promptedCallKey(source, call), { kind: "approved", toolUseId: call.tool_use_id });
21
+ };
22
+ var takePhoneApproval = (source, call) => {
23
+ const recorded = phoneApprovals.consume(promptedCallKey(source, call));
24
+ return recorded?.kind === "approved" ? { ...call, tool_use_id: recorded.toolUseId } : void 0;
25
+ };
26
+
27
+ export {
28
+ forgetPhoneApproval,
29
+ rememberPhoneApproval,
30
+ takePhoneApproval
31
+ };
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  APPROVAL_RULES_PATH,
3
3
  canChangeApprovalSettings
4
- } from "./chunk-VND6LN6X.js";
4
+ } from "./chunk-3QBI5C6P.js";
5
5
  import {
6
6
  callMcpTool
7
- } from "./chunk-ZNST34QH.js";
7
+ } from "./chunk-WXUEOHYY.js";
8
8
  import {
9
9
  absoluteUrl
10
- } from "./chunk-SFN72Q7W.js";
10
+ } from "./chunk-Q2VV77IY.js";
11
11
  import {
12
12
  getBaseUrl
13
- } from "./chunk-FP6ZVMF2.js";
13
+ } from "./chunk-IKBTG3OT.js";
14
14
  import {
15
15
  NPX_LATEST_COMMAND
16
- } from "./chunk-BGXXWLS5.js";
16
+ } from "./chunk-MQMVJDII.js";
17
17
  import {
18
18
  AGENT_STOP_DEFAULT_SECONDS,
19
19
  APPROVAL_MODE_META,
@@ -21,7 +21,7 @@ import {
21
21
  classifyConfirmResponse,
22
22
  isAnswerSource,
23
23
  roundTripAsk
24
- } from "./chunk-H4226UC7.js";
24
+ } from "./chunk-DL67HX3D.js";
25
25
 
26
26
  // src/reach.ts
27
27
  var reachVerdict = (channels) => {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  compatibleConfigFile
3
- } from "./chunk-7ASHS5VR.js";
3
+ } from "./chunk-43DT3QWZ.js";
4
4
  import {
5
5
  hookOwnerOf,
6
6
  hookOwnerOfCommands
7
- } from "./chunk-ORZ7H3AQ.js";
7
+ } from "./chunk-TLK5YLIE.js";
8
8
  import {
9
9
  AGENT_CHOICES
10
- } from "./chunk-WVOMK2HW.js";
10
+ } from "./chunk-5XDFQ6E3.js";
11
11
  import {
12
12
  bridgeStub,
13
13
  claudeSettings,
@@ -19,7 +19,7 @@ import {
19
19
  resolveBridgeStub,
20
20
  vscodePluginDir,
21
21
  windowsNodeLauncherFor
22
- } from "./chunk-ZJKWDM3S.js";
22
+ } from "./chunk-R7KC57PC.js";
23
23
  import {
24
24
  readJsonSafe
25
25
  } from "./chunk-TODDEIYG.js";
@@ -29,7 +29,7 @@ import {
29
29
  OPENCODE_APPROVAL_EVENT,
30
30
  hookCompatibleProfile,
31
31
  isRecord
32
- } from "./chunk-H4226UC7.js";
32
+ } from "./chunk-DL67HX3D.js";
33
33
 
34
34
  // src/opencode-plugin.ts
35
35
  var OPENCODE_PLUGIN_MARKER = "pushary-opencode-plugin w1";
@@ -3,10 +3,10 @@ import {
3
3
  forkFinishWithUpgradeLock,
4
4
  installWithUpgradeLock,
5
5
  releaseAutoUpdateLock
6
- } from "./chunk-JDAX2HVS.js";
6
+ } from "./chunk-62GD26OE.js";
7
7
  import {
8
8
  phoneStartIsRequired
9
- } from "./chunk-6RSAOA2P.js";
9
+ } from "./chunk-DBIPNY7J.js";
10
10
  import {
11
11
  describeAutoUpdateCheck,
12
12
  globalInstallLocation,
@@ -18,25 +18,25 @@ import {
18
18
  readAutoUpdateState,
19
19
  updateAutoUpdateState,
20
20
  upgradeEntryFor
21
- } from "./chunk-UDSJKRRI.js";
21
+ } from "./chunk-ICCM3DLT.js";
22
22
  import {
23
23
  autoUpdateLock,
24
24
  autoUpdateLog,
25
25
  autoUpdateState
26
- } from "./chunk-ZJKWDM3S.js";
26
+ } from "./chunk-R7KC57PC.js";
27
27
  import {
28
28
  execNpm,
29
29
  fetchLatestPublishedVersion,
30
30
  npmErrorMessage,
31
31
  readGlobalCliInstallAt,
32
32
  readGlobalPrefix
33
- } from "./chunk-ACI4PZ5N.js";
33
+ } from "./chunk-GS5FH3C2.js";
34
34
  import {
35
35
  EXIT
36
36
  } from "./chunk-BG4HHB7E.js";
37
37
  import {
38
38
  NPX_LATEST_COMMAND
39
- } from "./chunk-BGXXWLS5.js";
39
+ } from "./chunk-MQMVJDII.js";
40
40
  import {
41
41
  commandsPackage,
42
42
  globalUpgradeEntry,
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  UNNAMED_ACTION
3
- } from "./chunk-UXPRMNH2.js";
3
+ } from "./chunk-A2YJ2FBR.js";
4
4
  import {
5
5
  askUser,
6
6
  isAwayPaused,
7
7
  isLocalQuestionHandoff,
8
8
  unavailableQuestionUnlessRefused,
9
9
  waitForQuestion
10
- } from "./chunk-XRO6NRBO.js";
10
+ } from "./chunk-L2GADKFL.js";
11
11
  import {
12
12
  getMachineId
13
- } from "./chunk-RLNJNRYP.js";
13
+ } from "./chunk-WNT4JHK3.js";
14
14
  import {
15
15
  hookWaitClamped,
16
16
  hookWaitDeadline,
17
17
  scopeBreachReasonOf
18
- } from "./chunk-H4226UC7.js";
18
+ } from "./chunk-DL67HX3D.js";
19
19
 
20
20
  // src/pushed-question.ts
21
21
  var scopeQuestionOf = (verdict) => {
@@ -5,7 +5,7 @@ import {
5
5
  MCP_CREDENTIAL_REJECTION_BODY,
6
6
  isRecord,
7
7
  responseRejectsCredential
8
- } from "./chunk-H4226UC7.js";
8
+ } from "./chunk-DL67HX3D.js";
9
9
 
10
10
  // src/credential-rejection.ts
11
11
  import { createHash, randomUUID } from "crypto";
@@ -7,7 +7,7 @@ import {
7
7
  recordSealerFor,
8
8
  uploadTranscriptRecords,
9
9
  wrapSessionKey
10
- } from "./chunk-4PPSXQQ6.js";
10
+ } from "./chunk-YOV3LHOL.js";
11
11
 
12
12
  // src/live-session.ts
13
13
  var MAX_TRANSCRIPT_QUEUE = 100;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pusharyDir
3
- } from "./chunk-ZJKWDM3S.js";
3
+ } from "./chunk-R7KC57PC.js";
4
4
  import {
5
5
  writeFileAtomic
6
6
  } from "./chunk-TODDEIYG.js";