@pushary/agent-hooks 1.9.1 → 1.9.3

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 +10 -0
  2. package/data/cursor-plugin/.cursor-plugin/plugin.json +1 -1
  3. package/data/cursor-plugin/CHANGELOG.md +4 -0
  4. package/data/cursor-plugin/scripts/pushary-gate.mjs +1 -1
  5. package/data/vscode-plugin/.claude-plugin/plugin.json +1 -1
  6. package/data/vscode-plugin/CHANGELOG.md +4 -0
  7. package/data/vscode-plugin/scripts/pushary-gate.mjs +1 -1
  8. package/dist/bin/pushary-bell-hook.js +23 -23
  9. package/dist/bin/pushary-bell.js +9 -9
  10. package/dist/bin/pushary-claude.js +26 -26
  11. package/dist/bin/pushary-clean.js +28 -28
  12. package/dist/bin/pushary-codex-bridge.js +18 -18
  13. package/dist/bin/pushary-codex-hook.js +31 -31
  14. package/dist/bin/pushary-codex.js +13 -13
  15. package/dist/bin/pushary-connect.js +13 -13
  16. package/dist/bin/pushary-cowork.js +5 -5
  17. package/dist/bin/pushary-daemon.js +26 -26
  18. package/dist/bin/pushary-disconnect.js +18 -18
  19. package/dist/bin/pushary-doctor.js +99 -48
  20. package/dist/bin/pushary-elicitation-hook.js +25 -25
  21. package/dist/bin/pushary-gemini-bridge.js +13 -13
  22. package/dist/bin/pushary-gemini-hook.js +28 -28
  23. package/dist/bin/pushary-hook.js +32 -32
  24. package/dist/bin/pushary-login.js +26 -23
  25. package/dist/bin/pushary-logout.js +7 -7
  26. package/dist/bin/pushary-mcp.js +9 -9
  27. package/dist/bin/pushary-mode.js +9 -9
  28. package/dist/bin/pushary-notification-hook.js +28 -28
  29. package/dist/bin/pushary-opencode-hook.js +27 -27
  30. package/dist/bin/pushary-permission-denied-hook.js +32 -32
  31. package/dist/bin/pushary-permission-hook.js +31 -31
  32. package/dist/bin/pushary-post-hook.js +28 -28
  33. package/dist/bin/pushary-prompt-hook.js +28 -28
  34. package/dist/bin/pushary-session-end-hook.js +28 -28
  35. package/dist/bin/pushary-session-start-hook.js +31 -31
  36. package/dist/bin/pushary-setup.js +69 -52
  37. package/dist/bin/pushary-stats.js +5 -5
  38. package/dist/bin/pushary-status.js +15 -15
  39. package/dist/bin/pushary-stop-hook.js +28 -28
  40. package/dist/bin/pushary-stopfailure-hook.js +28 -28
  41. package/dist/bin/pushary-suggestions.js +4 -4
  42. package/dist/bin/pushary-transcript-register.js +19 -19
  43. package/dist/bin/pushary-transcripts.js +7 -7
  44. package/dist/bin/pushary-upgrade.js +21 -21
  45. package/dist/bin/pushary-wait.js +9 -9
  46. package/dist/bin/pushary.js +6 -6
  47. package/dist/{chunk-COSADFEH.js → chunk-2UWD2WZC.js} +1 -1
  48. package/dist/{chunk-7ER66HZH.js → chunk-34JHGOYO.js} +1 -1
  49. package/dist/{chunk-4SB46XLF.js → chunk-4GTXFYQ7.js} +1 -1
  50. package/dist/{chunk-P7YDVWLL.js → chunk-552AGATI.js} +1 -1
  51. package/dist/{chunk-ZMKEKWNR.js → chunk-5IIAUWEJ.js} +18 -5
  52. package/dist/{chunk-AKCJ5SNO.js → chunk-7FVC3RGF.js} +17 -12
  53. package/dist/{chunk-DMA3QUOB.js → chunk-7MO3CNBX.js} +3 -3
  54. package/dist/{chunk-IITCMJ4G.js → chunk-AGW7PMMO.js} +2 -2
  55. package/dist/{chunk-WWDPULS3.js → chunk-AMFNJPJ5.js} +8 -8
  56. package/dist/{chunk-LJI7U6PM.js → chunk-AUS3LY4N.js} +2 -2
  57. package/dist/{chunk-RS4ZOFSF.js → chunk-BPGATW2F.js} +7 -6
  58. package/dist/{chunk-JCER3Q6P.js → chunk-CJFVYYKM.js} +10 -9
  59. package/dist/{chunk-D3RS57MN.js → chunk-CVVPUVBD.js} +3 -3
  60. package/dist/{chunk-JGQ2ANHQ.js → chunk-DEWCUHOY.js} +2 -2
  61. package/dist/chunk-EO23EUOK.js +14 -0
  62. package/dist/{chunk-FVOCQSBG.js → chunk-EZFE4PC3.js} +1 -1
  63. package/dist/{chunk-LXWUYG7D.js → chunk-FANGHYW5.js} +1 -1
  64. package/dist/{chunk-SKEP3M6M.js → chunk-FLUECSUC.js} +2 -2
  65. package/dist/{chunk-J7JXA2LX.js → chunk-FSFI2PQL.js} +1 -1
  66. package/dist/{chunk-UPTEPARD.js → chunk-G2YXIZZS.js} +2 -2
  67. package/dist/{chunk-65TOHCXT.js → chunk-GB2U4QVF.js} +4 -4
  68. package/dist/{chunk-CE4UH4AP.js → chunk-GOWCPJTP.js} +7 -5
  69. package/dist/{chunk-RNDFGHSQ.js → chunk-HBUQ2EQD.js} +1 -1
  70. package/dist/{chunk-GHKNUQYU.js → chunk-HIQNUBWO.js} +2 -2
  71. package/dist/{chunk-QXL27RY6.js → chunk-HPXFPXW7.js} +1 -1
  72. package/dist/{chunk-CGRPHFOV.js → chunk-IVF3OVR2.js} +1 -1
  73. package/dist/{chunk-XEIV5QOT.js → chunk-JDUWMJDP.js} +118 -170
  74. package/dist/{chunk-V4H33GBM.js → chunk-JM2MCYRZ.js} +6 -6
  75. package/dist/{chunk-LZMH4EGE.js → chunk-KA2GI53J.js} +1 -1
  76. package/dist/{chunk-SWGY5WNX.js → chunk-KO7UOTLD.js} +5 -5
  77. package/dist/{chunk-HU2LWGEE.js → chunk-MH6SJHUE.js} +1 -1
  78. package/dist/{chunk-XW2B4QV2.js → chunk-NGD7H3GZ.js} +2 -2
  79. package/dist/{chunk-UYHLMBPQ.js → chunk-NP5RJL34.js} +1 -1
  80. package/dist/{chunk-IJXJW2VH.js → chunk-NZJ5LFMX.js} +10 -10
  81. package/dist/{chunk-QQJCDRD3.js → chunk-OEMF3KJ3.js} +5 -5
  82. package/dist/{chunk-6L7TNZ43.js → chunk-OXJRUMZT.js} +1 -1
  83. package/dist/{chunk-C6PPDKVI.js → chunk-P3REVSM5.js} +3 -3
  84. package/dist/{chunk-SPB3QRE7.js → chunk-PPC4FZKJ.js} +4 -4
  85. package/dist/{chunk-FJPC35OW.js → chunk-Q4RF7EEP.js} +1 -1
  86. package/dist/{chunk-4XT4JXMG.js → chunk-Q7FLA4N3.js} +1 -1
  87. package/dist/{chunk-LKKYRNJT.js → chunk-Q7KSRRQ4.js} +1 -1
  88. package/dist/{chunk-KR5JASA4.js → chunk-QVUOPB32.js} +44 -16
  89. package/dist/{chunk-VH6763OR.js → chunk-SJC5TXK7.js} +3 -3
  90. package/dist/{chunk-6QSDNXGM.js → chunk-U3DBAX7P.js} +2 -2
  91. package/dist/{chunk-JHZAZAI3.js → chunk-UWMEY4RS.js} +5 -5
  92. package/dist/{chunk-NVLXK2I6.js → chunk-VRPNTJX3.js} +5 -5
  93. package/dist/{chunk-5K43TBK4.js → chunk-VRYOALHQ.js} +3 -3
  94. package/dist/{chunk-VQLWYKX7.js → chunk-WEK6US33.js} +1 -1
  95. package/dist/{chunk-PEGKBNGN.js → chunk-WL4YO6CO.js} +5 -5
  96. package/dist/{chunk-6JTTJIKJ.js → chunk-WRDMCP4G.js} +3 -3
  97. package/dist/{chunk-RJ7ECJSZ.js → chunk-ZPTSEJMD.js} +4 -2
  98. package/dist/{chunk-6Q4NM2LW.js → chunk-ZUZKHTPJ.js} +3 -3
  99. package/dist/{chunk-PMS3EBD2.js → chunk-ZV32QRBR.js} +1 -1
  100. package/dist/{global-upgrade-ML2RHV4W.js → global-upgrade-VEQ4KQEW.js} +6 -6
  101. package/dist/{paths-LG3IEDDM.js → paths-QTOUBV2V.js} +2 -2
  102. package/dist/{reapply-7PFOITE4.js → reapply-T5PLCAGP.js} +8 -8
  103. package/dist/src/index.js +20 -20
  104. package/dist/{upgrade-lock-2A2YUUEU.js → upgrade-lock-KFZBAPNU.js} +3 -3
  105. package/package.json +1 -1
@@ -6,14 +6,17 @@ import {
6
6
  readServiceExecPath,
7
7
  versionManagerOf
8
8
  } from "../chunk-GU3EJCVV.js";
9
+ import {
10
+ writeStdoutFully
11
+ } from "../chunk-EO23EUOK.js";
9
12
  import {
10
13
  assessCodexHookTrust,
11
14
  readCodexTrustForPusharyHooks
12
- } from "../chunk-KR5JASA4.js";
15
+ } from "../chunk-QVUOPB32.js";
13
16
  import {
14
17
  readMachineReadiness,
15
18
  readManagedControlEvidence
16
- } from "../chunk-AKCJ5SNO.js";
19
+ } from "../chunk-7FVC3RGF.js";
17
20
  import {
18
21
  FX_PROFILE_REFUSALS,
19
22
  FX_PUSHARY_TOOLS_RULE,
@@ -33,28 +36,28 @@ import {
33
36
  retryAgentCommand,
34
37
  shortenHome,
35
38
  vscodeSettingsTargets
36
- } from "../chunk-V4H33GBM.js";
37
- import "../chunk-LJI7U6PM.js";
39
+ } from "../chunk-JM2MCYRZ.js";
40
+ import "../chunk-AUS3LY4N.js";
38
41
  import {
39
42
  OPENCODE_PLUGIN_PLACEHOLDER,
40
43
  openCodePluginDir,
41
44
  openCodePluginFile,
42
45
  openCodeWired
43
- } from "../chunk-CGRPHFOV.js";
46
+ } from "../chunk-IVF3OVR2.js";
44
47
  import {
45
48
  compatibleConfigFile,
46
49
  compatibleInstructionsFile,
47
50
  compatibleMcpFile,
48
51
  hasCompatibleHooks,
49
52
  missingCompatibleHookEvents
50
- } from "../chunk-NVLXK2I6.js";
51
- import "../chunk-6Q4NM2LW.js";
53
+ } from "../chunk-VRPNTJX3.js";
54
+ import "../chunk-ZUZKHTPJ.js";
52
55
  import {
53
56
  detectProviderLiveCapabilities,
54
57
  expectedLaunchCapabilities,
55
58
  hasSpawnProvider,
56
59
  resolveControlPolicy
57
- } from "../chunk-IITCMJ4G.js";
60
+ } from "../chunk-AGW7PMMO.js";
58
61
  import "../chunk-RIVNNBEK.js";
59
62
  import {
60
63
  AUTO_UPDATE_DISABLE_ENV,
@@ -63,16 +66,16 @@ import {
63
66
  describeAutoUpdateCheck,
64
67
  readAutoUpdateState,
65
68
  takeAutoUpdateAnnouncement
66
- } from "../chunk-CE4UH4AP.js";
69
+ } from "../chunk-GOWCPJTP.js";
67
70
  import {
68
71
  readLedgerSummary
69
- } from "../chunk-P7YDVWLL.js";
72
+ } from "../chunk-552AGATI.js";
70
73
  import {
71
74
  describeBridgeResolution,
72
75
  isBridgeLocator,
73
76
  liveBridgeProbe,
74
77
  resolveBridgeStub
75
- } from "../chunk-LXWUYG7D.js";
78
+ } from "../chunk-FANGHYW5.js";
76
79
  import {
77
80
  claudeOtherHolders,
78
81
  claudeUnprovenHolds,
@@ -89,7 +92,7 @@ import {
89
92
  geminiWired,
90
93
  holdsLong,
91
94
  pusharyHookExecutable
92
- } from "../chunk-5K43TBK4.js";
95
+ } from "../chunk-VRYOALHQ.js";
93
96
  import {
94
97
  daemonHasRemoteProof,
95
98
  daemonServiceManagerAvailable,
@@ -98,19 +101,19 @@ import {
98
101
  readDaemonNeedsLogin,
99
102
  readDaemonStatus,
100
103
  readInstalledDaemonService
101
- } from "../chunk-PEGKBNGN.js";
104
+ } from "../chunk-WL4YO6CO.js";
102
105
  import {
103
106
  GEMINI_HOOK_BINARY,
104
107
  hasGeminiHooks,
105
108
  missingGeminiHookEvents
106
- } from "../chunk-D3RS57MN.js";
109
+ } from "../chunk-CVVPUVBD.js";
107
110
  import "../chunk-XHKBHWLX.js";
108
111
  import "../chunk-6ICPEJY5.js";
109
- import "../chunk-JCER3Q6P.js";
112
+ import "../chunk-CJFVYYKM.js";
110
113
  import "../chunk-N6IOSZOE.js";
111
- import "../chunk-RNDFGHSQ.js";
112
- import "../chunk-JHZAZAI3.js";
113
- import "../chunk-SPB3QRE7.js";
114
+ import "../chunk-HBUQ2EQD.js";
115
+ import "../chunk-UWMEY4RS.js";
116
+ import "../chunk-PPC4FZKJ.js";
114
117
  import "../chunk-POFBE6ZY.js";
115
118
  import {
116
119
  describeReach,
@@ -119,7 +122,7 @@ import {
119
122
  reachVerdict,
120
123
  roundTripEvidence,
121
124
  verifyRoundTrip
122
- } from "../chunk-RS4ZOFSF.js";
125
+ } from "../chunk-BPGATW2F.js";
123
126
  import "../chunk-3EGEA4KH.js";
124
127
  import "../chunk-QCGNGEGE.js";
125
128
  import {
@@ -127,7 +130,7 @@ import {
127
130
  } from "../chunk-U4TMAANR.js";
128
131
  import {
129
132
  exitOnHelpFlag
130
- } from "../chunk-JGQ2ANHQ.js";
133
+ } from "../chunk-DEWCUHOY.js";
131
134
  import {
132
135
  parseFlags
133
136
  } from "../chunk-GMXKITVA.js";
@@ -135,28 +138,29 @@ import {
135
138
  keyPrefix,
136
139
  readControlMode,
137
140
  readKeySource
138
- } from "../chunk-RJ7ECJSZ.js";
141
+ } from "../chunk-ZPTSEJMD.js";
139
142
  import {
140
143
  callMcpTool,
141
144
  sendMcpRequest
142
- } from "../chunk-VH6763OR.js";
145
+ } from "../chunk-SJC5TXK7.js";
143
146
  import {
144
147
  checkApiKey,
145
148
  describeKeyCheck
146
- } from "../chunk-DMA3QUOB.js";
147
- import "../chunk-6JTTJIKJ.js";
149
+ } from "../chunk-7MO3CNBX.js";
150
+ import "../chunk-WRDMCP4G.js";
148
151
  import {
149
152
  getMachineId
150
- } from "../chunk-J7JXA2LX.js";
153
+ } from "../chunk-FSFI2PQL.js";
151
154
  import {
152
155
  UsageError
153
156
  } from "../chunk-7QLSKOSU.js";
154
157
  import {
155
158
  EXIT
156
159
  } from "../chunk-KZERVKTD.js";
157
- import "../chunk-6QSDNXGM.js";
160
+ import "../chunk-U3DBAX7P.js";
158
161
  import {
159
162
  CODEX_HOOK_EVENTS,
163
+ CODEX_REQUIRED_APPROVAL_EVENTS,
160
164
  autoUpdateState,
161
165
  claudeJson,
162
166
  claudeSettings,
@@ -184,20 +188,21 @@ import {
184
188
  readGlobalCliInstall,
185
189
  resolvePathBinary,
186
190
  vscodePluginDir
187
- } from "../chunk-ZMKEKWNR.js";
191
+ } from "../chunk-5IIAUWEJ.js";
188
192
  import "../chunk-T7E75EKA.js";
189
193
  import {
190
194
  getBaseUrl
191
- } from "../chunk-4SB46XLF.js";
195
+ } from "../chunk-4GTXFYQ7.js";
192
196
  import {
193
197
  NPX_LATEST_COMMAND
194
- } from "../chunk-FVOCQSBG.js";
198
+ } from "../chunk-EZFE4PC3.js";
195
199
  import {
196
200
  AGENTS,
197
201
  CURSOR_GATE_EVENTS,
198
202
  HOOK_COMPATIBLE_PROFILES,
199
203
  HOOK_LOCATOR_BINARY,
200
204
  HOOK_SOURCES,
205
+ MAX_HOOK_ACTIVATION_EVIDENCE_ROWS,
201
206
  SUPPORT_DISCORD,
202
207
  SUPPORT_EMAIL,
203
208
  commandsPackage,
@@ -206,11 +211,11 @@ import {
206
211
  hookCompatibleProfile,
207
212
  isHookActivationReport,
208
213
  isNewerVersion
209
- } from "../chunk-XEIV5QOT.js";
214
+ } from "../chunk-JDUWMJDP.js";
210
215
 
211
216
  // bin/pushary-doctor.ts
212
217
  import { existsSync, readFileSync, writeFileSync } from "fs";
213
- import { join, resolve } from "path";
218
+ import { join as join2 } from "path";
214
219
  import { homedir as homedir2 } from "os";
215
220
  import { execFileSync } from "child_process";
216
221
  import { confirm } from "@inquirer/prompts";
@@ -401,8 +406,27 @@ var inertRegistrationRemedy = () => `Upgrade with ${NPX_LATEST_COMMAND} upgrade,
401
406
  var CURSOR_GATE_SCRIPT = "pushary-gate.mjs";
402
407
 
403
408
  // src/diagnostics/activation.ts
404
- var readHookActivation = async (apiKey, agentType, target, deps = {}) => {
405
- const machineId = deps.machineId ?? getMachineId();
409
+ import { realpathSync } from "fs";
410
+ import { basename, dirname, join, resolve } from "path";
411
+ var realpathOrNull = (path) => {
412
+ try {
413
+ return realpathSync(path);
414
+ } catch {
415
+ return null;
416
+ }
417
+ };
418
+ var canonicalPath = (path) => realpathOrNull(path) ?? join(realpathOrNull(dirname(path)) ?? dirname(path), basename(path));
419
+ var logicalCwd = () => {
420
+ const shell = process.env.PWD;
421
+ return shell && canonicalPath(shell) === canonicalPath(process.cwd()) ? shell : process.cwd();
422
+ };
423
+ var activationTargetPaths = (target, cwd = logicalCwd()) => {
424
+ const literal = resolve(cwd, target);
425
+ const canonical = canonicalPath(literal);
426
+ return canonical === literal ? [literal] : [literal, canonical];
427
+ };
428
+ var newestFirst = (a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt);
429
+ var readActivationAt = async (apiKey, agentType, machineId, target, deps) => {
406
430
  const url = new URL("/api/agent/onboarding/activation", deps.baseUrl ?? getBaseUrl());
407
431
  url.searchParams.set("machineId", machineId);
408
432
  url.searchParams.set("agent", agentType);
@@ -422,6 +446,19 @@ var readHookActivation = async (apiKey, agentType, target, deps = {}) => {
422
446
  return { kind: "unavailable", detail: "Activation evidence could not be read. Retry when the connection is available." };
423
447
  }
424
448
  };
449
+ var readHookActivation = async (apiKey, agentType, target, deps = {}) => {
450
+ const machineId = deps.machineId ?? getMachineId();
451
+ const paths = activationTargetPaths(target, deps.cwd);
452
+ const reads = await Promise.all(paths.map((path) => readActivationAt(apiKey, agentType, machineId, path, deps)));
453
+ const reports = [];
454
+ for (const read of reads) {
455
+ if (read.kind === "unavailable") return read;
456
+ reports.push(read.report);
457
+ }
458
+ const evidence = reports.flatMap((report) => report.evidence).sort(newestFirst);
459
+ const truncated = reports.some((report) => report.truncated) || evidence.length > MAX_HOOK_ACTIVATION_EVIDENCE_ROWS;
460
+ return { kind: "ok", report: { agentType, machineId, target: paths[0], truncated, evidence: truncated ? [] : evidence } };
461
+ };
425
462
 
426
463
  // src/diagnostics/roundtrip-plan.ts
427
464
  var planRoundTrip = (context) => {
@@ -455,7 +492,7 @@ var parseDoctorOptions = (argv) => {
455
492
  if (activation2 && (!Object.hasOwn(AGENTS, activation2) || !AGENTS[activation2].activationGuide)) throw new UsageError("This build supports --activation claude_code. Other integrations remain unverified.");
456
493
  const rawTarget = flags.values.get("activation-target");
457
494
  if (Boolean(activation2) !== Boolean(rawTarget)) throw new UsageError("--activation requires --activation-target with the unique scratch-file path used for this check.");
458
- const activationTarget = rawTarget ? resolve(rawTarget) : null;
495
+ const activationTarget = rawTarget ?? null;
459
496
  const noPush = flags.bools.has("no-push") || activation2 !== null && !roundtrip;
460
497
  if (roundtrip && noPush) {
461
498
  throw new UsageError("--roundtrip needs to send a push, so it cannot be combined with --no-push");
@@ -486,8 +523,8 @@ var fail = red("\u2717");
486
523
  var warn = yellow("!");
487
524
  var CLAUDE_SETTINGS = claudeSettings();
488
525
  var registeredConfigs = () => [CLAUDE_SETTINGS, codexHooksJson(), ...HOOK_COMPATIBLE_PROFILES.map((profile) => compatibleConfigFile(profile))].filter(existsSync).map((file) => ({ file, contents: readFileSync(file, "utf-8") }));
489
- var SKILL_PATH = join(claudeSkillDir(), "SKILL.md");
490
- var SHELL_FILES = [".zshrc", ".zprofile", ".bashrc", ".bash_profile"].map((f) => join(homedir2(), f));
526
+ var SKILL_PATH = join2(claudeSkillDir(), "SKILL.md");
527
+ var SHELL_FILES = [".zshrc", ".zprofile", ".bashrc", ".bash_profile"].map((f) => join2(homedir2(), f));
491
528
  var reportFxQuestionRouting = (routing) => {
492
529
  if (routing === "routed") {
493
530
  check(true, "fx: questions go through Pushary", `${FX_QUESTION_TOOL} is off in ${fxSettings()}`);
@@ -587,7 +624,7 @@ var reportCodexOwnTrust = (assessment) => {
587
624
  check(false, "Codex: hooks trusted", CODEX_NONE_LISTED);
588
625
  return;
589
626
  }
590
- check(assessment.kind === "trusted", "Codex: hooks trusted", assessment.kind === "trusted" ? `Codex reports ${assessment.trusted} of ${assessment.total} trusted` : `Codex reports ${describeReadings(assessment.failures)}. Type /hooks in Codex and trust them, once`);
627
+ check(assessment.kind === "trusted", "Codex: hooks trusted", assessment.kind === "trusted" ? `Codex reports ${assessment.trusted} of ${assessment.total} trusted` : `Codex reports ${describeReadings(assessment.failures)}. Run /hooks in Codex to enable and trust them, or re-run setup to repair the registrations`);
591
628
  if (assessment.notListed.length > 0) {
592
629
  console.log(` ${warn} Codex: does not list ${assessment.notListed.join(", ")} ${dim("(this Codex may not support those events yet)")}`);
593
630
  }
@@ -595,6 +632,13 @@ var reportCodexOwnTrust = (assessment) => {
595
632
  console.log(` ${warn} Codex: ${assessment.disabled.join(", ")} turned off in Codex ${dim("(turn them back on in /hooks)")}`);
596
633
  }
597
634
  };
635
+ var describeStoredCodexTrust = (untrusted, disabled, missing, asynchronous) => {
636
+ if (asynchronous.length > 0) return `asynchronous (${asynchronous.join(", ")}) \u2014 re-run setup to restore blocking permission hooks`;
637
+ if (missing.length > 0) return `missing (${missing.join(", ")}) \u2014 re-run setup to register the permission hooks`;
638
+ if (disabled.length > 0) return `disabled (${disabled.join(", ")}) \u2014 type /hooks in Codex to enable the permission hooks`;
639
+ if (untrusted.length > 0) return `untrusted (${untrusted.join(", ")}) \u2014 type /hooks in Codex and trust them, once`;
640
+ return "all events trusted";
641
+ };
598
642
  var skipped = (label, why) => {
599
643
  console.log(` ${dim("\u2013")} ${label} ${dim(`(${why})`)}`);
600
644
  };
@@ -737,7 +781,7 @@ var main = async () => {
737
781
  }
738
782
  const claudeHookState = { wired: claudeInPlay, hooksIntact: settings !== null && claudeHooksMissing === 0 };
739
783
  for (const finding of rewriterFindings({
740
- present: (rewriter) => rewriter.markers.some((marker) => existsSync(join(homedir2(), ...marker))),
784
+ present: (rewriter) => rewriter.markers.some((marker) => existsSync(join2(homedir2(), ...marker))),
741
785
  agentState: (agent) => agent === "Claude Code" ? claudeHookState : void 0
742
786
  })) {
743
787
  console.log(` ${warn} ${describeRewriterFinding(finding)}`);
@@ -756,7 +800,7 @@ var main = async () => {
756
800
  const codexInPlay = codexWired({
757
801
  config: codexParsed,
758
802
  hooks: codexHooksConfig,
759
- skillExists: existsSync(join(codexSkillDir(), "SKILL.md"))
803
+ skillExists: existsSync(join2(codexSkillDir(), "SKILL.md"))
760
804
  });
761
805
  if (codexInPlay) {
762
806
  checking("Codex");
@@ -819,6 +863,9 @@ var main = async () => {
819
863
  positions
820
864
  );
821
865
  const untrusted = gaps.filter((gap) => gap.kind === "untrusted").map((gap) => gap.event);
866
+ const missingApprovals = CODEX_REQUIRED_APPROVAL_EVENTS.filter((event) => !positions[event]);
867
+ const disabled = gaps.filter((gap) => gap.kind === "disabled").map((gap) => gap.event);
868
+ const asynchronous = gaps.filter((gap) => gap.kind === "asynchronous").map((gap) => gap.event);
822
869
  const stale = gaps.filter((gap) => gap.kind === "stale").map((gap) => gap.event);
823
870
  const codexTrust = await readCodexTrustForPusharyHooks();
824
871
  if (codexTrust.kind === "listed") {
@@ -826,7 +873,11 @@ var main = async () => {
826
873
  } else {
827
874
  const why = codexTrust.kind === "skipped" ? "did not ask" : "could not ask";
828
875
  console.log(` ${warn} Codex: ${why} Codex about hook trust ${dim(`(${codexTrust.reason}); checking Pushary's own record instead`)}`);
829
- check(untrusted.length === 0, "Codex: hooks trusted", untrusted.length === 0 ? "all events trusted" : `untrusted (${untrusted.join(", ")}) \u2014 type /hooks in Codex and trust them, once`);
876
+ check(
877
+ untrusted.length === 0 && disabled.length === 0 && missingApprovals.length === 0 && asynchronous.length === 0,
878
+ "Codex: hooks trusted",
879
+ describeStoredCodexTrust(untrusted, disabled, missingApprovals, asynchronous)
880
+ );
830
881
  }
831
882
  if (stale.length > 0) {
832
883
  console.log(` ${warn} Codex: ${stale.join(", ")} trusted at an older shape ${dim("(fires normally; re-run setup to pick up the current one)")}`);
@@ -842,7 +893,7 @@ var main = async () => {
842
893
  check(resolves, "Codex: notify handler resolves", resolves ? codexNotifyPath : `not found: ${codexNotifyPath}`);
843
894
  }
844
895
  }
845
- const codexSkillPath = join(codexSkillDir(), "SKILL.md");
896
+ const codexSkillPath = join2(codexSkillDir(), "SKILL.md");
846
897
  check(existsSync(codexSkillPath), "Codex: skill installed");
847
898
  const codexAgentsMd2 = codexAgentsMd();
848
899
  const hasCodexInstructions = hasInstructionBlock(codexAgentsMd2);
@@ -1030,7 +1081,7 @@ var main = async () => {
1030
1081
  }
1031
1082
  reportOtherHolders("Cursor", cursorOtherHolders(cursorUserHooksJson));
1032
1083
  const { authorization: cursorAuth, source: cursorMcpSource } = cursorMcpAuthorization(
1033
- readJson(join(cursorPluginDir2, "mcp.json")),
1084
+ readJson(join2(cursorPluginDir2, "mcp.json")),
1034
1085
  cursorUserMcpJson
1035
1086
  );
1036
1087
  if (!cursorAuth) {
@@ -1056,7 +1107,7 @@ var main = async () => {
1056
1107
  "VS Code: plugin registered",
1057
1108
  registeredIn.length > 0 ? registeredIn.join(", ") : "not listed in chat.pluginLocations \u2014 re-run setup (an unregistered plugin directory is never loaded)"
1058
1109
  );
1059
- const vscodeHooks = readJson(join(vscodePluginDir2, "hooks", "hooks.json"));
1110
+ const vscodeHooks = readJson(join2(vscodePluginDir2, "hooks", "hooks.json"));
1060
1111
  const gateCommand = extractAgentHookCommand(vscodeHooks?.hooks?.PreToolUse, CURSOR_GATE_SCRIPT);
1061
1112
  if (!gateCommand) {
1062
1113
  check(false, "VS Code: permission gate present", "no Pushary gate in the plugin hooks.json \u2014 re-run setup");
@@ -1070,7 +1121,7 @@ var main = async () => {
1070
1121
  );
1071
1122
  noteHookTarget(gateCommand);
1072
1123
  }
1073
- const vscodeMcp = readJson(join(vscodePluginDir2, ".mcp.json"));
1124
+ const vscodeMcp = readJson(join2(vscodePluginDir2, ".mcp.json"));
1074
1125
  const vscodeServers = vscodeMcp?.mcpServers ?? {};
1075
1126
  const vscodeAuth = vscodeServers.pushary?.headers?.Authorization;
1076
1127
  if (!vscodeAuth) {
@@ -1118,7 +1169,7 @@ var main = async () => {
1118
1169
  existsSync(binary) ? binary : `${binary} is not there \u2014 re-run setup`
1119
1170
  );
1120
1171
  }
1121
- const manifest = join(openCodePluginDir(), "package.json");
1172
+ const manifest = join2(openCodePluginDir(), "package.json");
1122
1173
  check(
1123
1174
  existsSync(manifest),
1124
1175
  "OpenCode: plugins directory declares ESM",
@@ -1397,7 +1448,7 @@ var main = async () => {
1397
1448
  checks: results.map((r) => ({ id: r.label, ok: r.passed, detail: r.detail ?? "" }))
1398
1449
  })
1399
1450
  );
1400
- const target = join(process.cwd(), bundleFileName(bundle));
1451
+ const target = join2(process.cwd(), bundleFileName(bundle));
1401
1452
  writeFileSync(target, `${JSON.stringify(bundle, null, 2)}
1402
1453
  `, "utf-8");
1403
1454
  const say = options.json ? process.stderr : process.stdout;
@@ -1411,7 +1462,7 @@ var main = async () => {
1411
1462
  }
1412
1463
  }
1413
1464
  if (options.json) {
1414
- await new Promise((resolve2, reject) => process.stdout.write(`${JSON.stringify({
1465
+ await writeStdoutFully(`${JSON.stringify({
1415
1466
  ok: exitCode === EXIT.OK,
1416
1467
  exitCode,
1417
1468
  keyCheck: keyVerdict?.kind ?? null,
@@ -1426,7 +1477,7 @@ var main = async () => {
1426
1477
  checks: results.map((r) => ({ label: r.label, passed: r.passed, detail: r.detail ?? null })),
1427
1478
  otherHolders: otherHoldersByAgent
1428
1479
  }, null, 2)}
1429
- `, (error) => error ? reject(error) : resolve2()));
1480
+ `);
1430
1481
  }
1431
1482
  process.exit(exitCode);
1432
1483
  };
@@ -1,53 +1,53 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  readHookInput
4
- } from "../chunk-UPTEPARD.js";
4
+ } from "../chunk-G2YXIZZS.js";
5
5
  import {
6
6
  announceSubscriptionRequired,
7
7
  isDeferAnswer
8
8
  } from "../chunk-5OP5MQI7.js";
9
- import "../chunk-WWDPULS3.js";
9
+ import "../chunk-AMFNJPJ5.js";
10
10
  import "../chunk-SGZJ5LYH.js";
11
- import "../chunk-65TOHCXT.js";
12
- import "../chunk-HU2LWGEE.js";
13
- import "../chunk-LXWUYG7D.js";
14
- import "../chunk-5K43TBK4.js";
15
- import "../chunk-PEGKBNGN.js";
16
- import "../chunk-D3RS57MN.js";
17
- import "../chunk-COSADFEH.js";
18
- import "../chunk-FJPC35OW.js";
19
- import "../chunk-PMS3EBD2.js";
20
- import "../chunk-7ER66HZH.js";
11
+ import "../chunk-GB2U4QVF.js";
12
+ import "../chunk-MH6SJHUE.js";
13
+ import "../chunk-FANGHYW5.js";
14
+ import "../chunk-VRYOALHQ.js";
15
+ import "../chunk-WL4YO6CO.js";
16
+ import "../chunk-CVVPUVBD.js";
17
+ import "../chunk-2UWD2WZC.js";
18
+ import "../chunk-Q4RF7EEP.js";
19
+ import "../chunk-ZV32QRBR.js";
20
+ import "../chunk-34JHGOYO.js";
21
21
  import "../chunk-XHKBHWLX.js";
22
22
  import "../chunk-6ICPEJY5.js";
23
23
  import "../chunk-N6IOSZOE.js";
24
- import "../chunk-RNDFGHSQ.js";
24
+ import "../chunk-HBUQ2EQD.js";
25
25
  import {
26
26
  askUser,
27
27
  isDecisionStopped,
28
28
  waitForQuestion
29
- } from "../chunk-JHZAZAI3.js";
30
- import "../chunk-SPB3QRE7.js";
29
+ } from "../chunk-UWMEY4RS.js";
30
+ import "../chunk-PPC4FZKJ.js";
31
31
  import "../chunk-POFBE6ZY.js";
32
32
  import "../chunk-GMXKITVA.js";
33
- import "../chunk-RJ7ECJSZ.js";
33
+ import "../chunk-ZPTSEJMD.js";
34
34
  import {
35
35
  SubscriptionRequiredError
36
- } from "../chunk-VH6763OR.js";
37
- import "../chunk-DMA3QUOB.js";
38
- import "../chunk-6JTTJIKJ.js";
36
+ } from "../chunk-SJC5TXK7.js";
37
+ import "../chunk-7MO3CNBX.js";
38
+ import "../chunk-WRDMCP4G.js";
39
39
  import {
40
40
  getMachineId
41
- } from "../chunk-J7JXA2LX.js";
41
+ } from "../chunk-FSFI2PQL.js";
42
42
  import "../chunk-7QLSKOSU.js";
43
43
  import "../chunk-KZERVKTD.js";
44
- import "../chunk-6QSDNXGM.js";
45
- import "../chunk-ZMKEKWNR.js";
44
+ import "../chunk-U3DBAX7P.js";
45
+ import "../chunk-5IIAUWEJ.js";
46
46
  import "../chunk-T7E75EKA.js";
47
47
  import {
48
48
  getApiKey
49
- } from "../chunk-4SB46XLF.js";
50
- import "../chunk-FVOCQSBG.js";
49
+ } from "../chunk-4GTXFYQ7.js";
50
+ import "../chunk-EZFE4PC3.js";
51
51
  import {
52
52
  ELICITATION_ANSWERABLE_MODE,
53
53
  effectiveWaitSeconds,
@@ -58,7 +58,7 @@ import {
58
58
  planElicitationAsk,
59
59
  readElicitationFields,
60
60
  renderElicitationOutput
61
- } from "../chunk-XEIV5QOT.js";
61
+ } from "../chunk-JDUWMJDP.js";
62
62
 
63
63
  // bin/pushary-elicitation-hook.ts
64
64
  import { basename } from "path";
@@ -5,10 +5,10 @@ import {
5
5
  postLiveSession,
6
6
  postLiveSessionUntilAccepted,
7
7
  startLiveSessionHeartbeat
8
- } from "../chunk-SKEP3M6M.js";
8
+ } from "../chunk-FLUECSUC.js";
9
9
  import {
10
10
  resolveProviderBinary
11
- } from "../chunk-IITCMJ4G.js";
11
+ } from "../chunk-AGW7PMMO.js";
12
12
  import "../chunk-RIVNNBEK.js";
13
13
  import {
14
14
  SESSION_IDLE_TIMEOUT_MS,
@@ -16,29 +16,29 @@ import {
16
16
  idleDeadlinePassed,
17
17
  startProcessOwnership,
18
18
  withSpawnProcessOwnership
19
- } from "../chunk-6L7TNZ43.js";
20
- import "../chunk-FJPC35OW.js";
21
- import "../chunk-PMS3EBD2.js";
19
+ } from "../chunk-OXJRUMZT.js";
20
+ import "../chunk-Q4RF7EEP.js";
21
+ import "../chunk-ZV32QRBR.js";
22
22
  import {
23
23
  transcriptsEnabled
24
- } from "../chunk-7ER66HZH.js";
24
+ } from "../chunk-34JHGOYO.js";
25
25
  import {
26
26
  spawnClaude
27
27
  } from "../chunk-XHKBHWLX.js";
28
28
  import "../chunk-6ICPEJY5.js";
29
- import "../chunk-RJ7ECJSZ.js";
29
+ import "../chunk-ZPTSEJMD.js";
30
30
  import {
31
31
  getMachineId
32
- } from "../chunk-J7JXA2LX.js";
33
- import "../chunk-6QSDNXGM.js";
34
- import "../chunk-ZMKEKWNR.js";
32
+ } from "../chunk-FSFI2PQL.js";
33
+ import "../chunk-U3DBAX7P.js";
34
+ import "../chunk-5IIAUWEJ.js";
35
35
  import "../chunk-T7E75EKA.js";
36
36
  import {
37
37
  getApiKey,
38
38
  getBaseUrl
39
- } from "../chunk-4SB46XLF.js";
40
- import "../chunk-FVOCQSBG.js";
41
- import "../chunk-XEIV5QOT.js";
39
+ } from "../chunk-4GTXFYQ7.js";
40
+ import "../chunk-EZFE4PC3.js";
41
+ import "../chunk-JDUWMJDP.js";
42
42
 
43
43
  // bin/pushary-gemini-bridge.ts
44
44
  import { existsSync } from "fs";
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  triggerAutoUpdate
4
- } from "../chunk-CE4UH4AP.js";
4
+ } from "../chunk-GOWCPJTP.js";
5
5
  import {
6
6
  isGatingMoment,
7
7
  recordKeylessMoment
8
- } from "../chunk-P7YDVWLL.js";
8
+ } from "../chunk-552AGATI.js";
9
9
  import {
10
10
  readHookInput
11
- } from "../chunk-UPTEPARD.js";
11
+ } from "../chunk-G2YXIZZS.js";
12
12
  import {
13
13
  announceSubscriptionRequired,
14
14
  denyReasonFrom,
15
15
  isDeferAnswer
16
16
  } from "../chunk-5OP5MQI7.js";
17
- import "../chunk-WWDPULS3.js";
17
+ import "../chunk-AMFNJPJ5.js";
18
18
  import "../chunk-SGZJ5LYH.js";
19
- import "../chunk-65TOHCXT.js";
20
- import "../chunk-HU2LWGEE.js";
21
- import "../chunk-LXWUYG7D.js";
22
- import "../chunk-5K43TBK4.js";
23
- import "../chunk-PEGKBNGN.js";
24
- import "../chunk-D3RS57MN.js";
25
- import "../chunk-COSADFEH.js";
26
- import "../chunk-FJPC35OW.js";
27
- import "../chunk-PMS3EBD2.js";
28
- import "../chunk-7ER66HZH.js";
19
+ import "../chunk-GB2U4QVF.js";
20
+ import "../chunk-MH6SJHUE.js";
21
+ import "../chunk-FANGHYW5.js";
22
+ import "../chunk-VRYOALHQ.js";
23
+ import "../chunk-WL4YO6CO.js";
24
+ import "../chunk-CVVPUVBD.js";
25
+ import "../chunk-2UWD2WZC.js";
26
+ import "../chunk-Q4RF7EEP.js";
27
+ import "../chunk-ZV32QRBR.js";
28
+ import "../chunk-34JHGOYO.js";
29
29
  import "../chunk-XHKBHWLX.js";
30
30
  import "../chunk-6ICPEJY5.js";
31
31
  import {
@@ -46,11 +46,11 @@ import {
46
46
  repoKeyFor,
47
47
  reportEvent,
48
48
  scopePathFor
49
- } from "../chunk-JCER3Q6P.js";
49
+ } from "../chunk-CJFVYYKM.js";
50
50
  import {
51
51
  DEFAULT_SESSION
52
52
  } from "../chunk-N6IOSZOE.js";
53
- import "../chunk-RNDFGHSQ.js";
53
+ import "../chunk-HBUQ2EQD.js";
54
54
  import {
55
55
  DECISION_STOP_REASON,
56
56
  UNVERIFIABLE_APPROVAL_REASON,
@@ -59,32 +59,32 @@ import {
59
59
  isLocalQuestionHandoff,
60
60
  sendNotification,
61
61
  waitForQuestion
62
- } from "../chunk-JHZAZAI3.js";
62
+ } from "../chunk-UWMEY4RS.js";
63
63
  import {
64
64
  exitAfterClientReports
65
- } from "../chunk-SPB3QRE7.js";
65
+ } from "../chunk-PPC4FZKJ.js";
66
66
  import "../chunk-POFBE6ZY.js";
67
67
  import "../chunk-GMXKITVA.js";
68
- import "../chunk-RJ7ECJSZ.js";
68
+ import "../chunk-ZPTSEJMD.js";
69
69
  import {
70
70
  SubscriptionRequiredError
71
- } from "../chunk-VH6763OR.js";
72
- import "../chunk-DMA3QUOB.js";
73
- import "../chunk-6JTTJIKJ.js";
71
+ } from "../chunk-SJC5TXK7.js";
72
+ import "../chunk-7MO3CNBX.js";
73
+ import "../chunk-WRDMCP4G.js";
74
74
  import {
75
75
  getMachineId
76
- } from "../chunk-J7JXA2LX.js";
76
+ } from "../chunk-FSFI2PQL.js";
77
77
  import "../chunk-7QLSKOSU.js";
78
78
  import {
79
79
  EXIT
80
80
  } from "../chunk-KZERVKTD.js";
81
- import "../chunk-6QSDNXGM.js";
82
- import "../chunk-ZMKEKWNR.js";
81
+ import "../chunk-U3DBAX7P.js";
82
+ import "../chunk-5IIAUWEJ.js";
83
83
  import "../chunk-T7E75EKA.js";
84
84
  import {
85
85
  getApiKey
86
- } from "../chunk-4SB46XLF.js";
87
- import "../chunk-FVOCQSBG.js";
86
+ } from "../chunk-4GTXFYQ7.js";
87
+ import "../chunk-EZFE4PC3.js";
88
88
  import {
89
89
  KILL_REASON,
90
90
  effectiveWaitSeconds,
@@ -92,7 +92,7 @@ import {
92
92
  hookWaitClamped,
93
93
  hookWaitDeadline,
94
94
  resolveGate
95
- } from "../chunk-XEIV5QOT.js";
95
+ } from "../chunk-JDUWMJDP.js";
96
96
 
97
97
  // bin/pushary-gemini-hook.ts
98
98
  import { basename } from "path";