@pushary/agent-hooks 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +27 -0
  3. package/data/vscode-plugin/README.md +1 -1
  4. package/data/vscode-plugin/scripts/pushary-gate.mjs +2 -2
  5. package/dist/bin/pushary-bell-hook.js +22 -21
  6. package/dist/bin/pushary-bell.js +10 -10
  7. package/dist/bin/pushary-claude.js +28 -24
  8. package/dist/bin/pushary-clean.js +30 -26
  9. package/dist/bin/pushary-codex-bridge.js +16 -14
  10. package/dist/bin/pushary-codex-hook.js +41 -31
  11. package/dist/bin/pushary-codex.js +15 -10
  12. package/dist/bin/pushary-connect.js +11 -11
  13. package/dist/bin/pushary-cowork.js +6 -6
  14. package/dist/bin/pushary-daemon.js +31 -28
  15. package/dist/bin/pushary-disconnect.js +16 -16
  16. package/dist/bin/pushary-doctor.js +81 -38
  17. package/dist/bin/pushary-elicitation-hook.js +23 -22
  18. package/dist/bin/pushary-gemini-bridge.js +13 -11
  19. package/dist/bin/pushary-gemini-hook.js +29 -24
  20. package/dist/bin/pushary-hook.js +30 -30
  21. package/dist/bin/pushary-login.js +14 -14
  22. package/dist/bin/pushary-logout.js +8 -8
  23. package/dist/bin/pushary-mode.js +7 -7
  24. package/dist/bin/pushary-notification-hook.js +26 -25
  25. package/dist/bin/pushary-opencode-hook.js +25 -24
  26. package/dist/bin/pushary-permission-denied-hook.js +30 -29
  27. package/dist/bin/pushary-permission-hook.js +29 -28
  28. package/dist/bin/pushary-post-hook.js +26 -25
  29. package/dist/bin/pushary-prompt-hook.js +26 -25
  30. package/dist/bin/pushary-session-end-hook.js +26 -25
  31. package/dist/bin/pushary-session-start-hook.js +32 -27
  32. package/dist/bin/pushary-setup.js +85 -59
  33. package/dist/bin/pushary-stats.js +6 -6
  34. package/dist/bin/pushary-status.js +15 -15
  35. package/dist/bin/pushary-stop-hook.js +26 -25
  36. package/dist/bin/pushary-stopfailure-hook.js +26 -25
  37. package/dist/bin/pushary-suggestions.js +4 -4
  38. package/dist/bin/pushary-transcript-register.js +20 -19
  39. package/dist/bin/pushary-transcripts.js +8 -8
  40. package/dist/bin/pushary-upgrade.js +231 -37
  41. package/dist/bin/pushary-wait.js +7 -7
  42. package/dist/bin/pushary.js +8 -8
  43. package/dist/{chunk-MN3XOVRK.js → chunk-2QT3GCU4.js} +1 -1
  44. package/dist/{chunk-LUT2EZLG.js → chunk-3NBODGQS.js} +1 -1
  45. package/dist/{chunk-43JKGLZZ.js → chunk-3ZSGKLSO.js} +2 -2
  46. package/dist/{chunk-QBS6LGEK.js → chunk-43LJSM4F.js} +2 -2
  47. package/dist/{chunk-SWFF5U2N.js → chunk-43ZDACBO.js} +1 -1
  48. package/dist/{chunk-HK3IXIQJ.js → chunk-5HYNICS7.js} +1 -1
  49. package/dist/{chunk-EQRS3SGM.js → chunk-66H2QQAK.js} +1 -1
  50. package/dist/{chunk-3BPB2HYZ.js → chunk-7XT76LWT.js} +7 -7
  51. package/dist/{chunk-ALFT7H5B.js → chunk-CQYHOHOK.js} +56 -5
  52. package/dist/{chunk-3UA6FPRC.js → chunk-DLJN5XEU.js} +3 -3
  53. package/dist/{chunk-BZBUPZC6.js → chunk-DTQNDR7C.js} +1 -1
  54. package/dist/{chunk-SAF6NNXY.js → chunk-DYHXOXUF.js} +43 -6
  55. package/dist/{chunk-FAH3D74E.js → chunk-EA3IELHP.js} +6 -0
  56. package/dist/{chunk-ED5TA2FJ.js → chunk-EADZPVYW.js} +3 -3
  57. package/dist/{chunk-I6HRQOMT.js → chunk-F57RGL7K.js} +8 -8
  58. package/dist/{chunk-LNGYW6G4.js → chunk-FDHMNT24.js} +20 -16
  59. package/dist/{chunk-37VLIYLI.js → chunk-H5LHTC5X.js} +1 -1
  60. package/dist/{chunk-EYRGBYZG.js → chunk-HETOKNIL.js} +1 -1
  61. package/dist/{chunk-K6I5M2ME.js → chunk-HU5LSYL2.js} +2 -2
  62. package/dist/{chunk-SKXLIVFM.js → chunk-HVBF35GT.js} +2 -2
  63. package/dist/{chunk-DINDL2CF.js → chunk-HWJW3CPO.js} +25 -5
  64. package/dist/{chunk-GOFDGTEI.js → chunk-IYTQ4B5I.js} +18 -45
  65. package/dist/{chunk-WIOXWUUH.js → chunk-J4J45VPZ.js} +3 -3
  66. package/dist/{chunk-HQLAZWJJ.js → chunk-JF736N4C.js} +5 -5
  67. package/dist/{chunk-LYXX5NSB.js → chunk-K3QVDAZW.js} +1 -1
  68. package/dist/{chunk-KI36MAT6.js → chunk-KEOLNHR3.js} +2 -2
  69. package/dist/{chunk-S3EP4B35.js → chunk-KJRALILH.js} +28 -11
  70. package/dist/{chunk-PHHGHHOW.js → chunk-MYP4UUFH.js} +1 -1
  71. package/dist/{chunk-TNS3YLFE.js → chunk-NFKVRMTM.js} +8 -8
  72. package/dist/{chunk-TF4IOINR.js → chunk-NTQSICPJ.js} +3 -3
  73. package/dist/{chunk-4FN6VV56.js → chunk-ORLJNJEO.js} +2 -2
  74. package/dist/{chunk-2UMNXADU.js → chunk-OSJEMXSR.js} +5 -1
  75. package/dist/chunk-OSSDK5RS.js +162 -0
  76. package/dist/{chunk-TWWLVOPB.js → chunk-P4BNYJ5Q.js} +5 -5
  77. package/dist/{chunk-KEMEBTCJ.js → chunk-PCGZXWGQ.js} +4 -4
  78. package/dist/{chunk-2GMI6JH6.js → chunk-PNNBMH4E.js} +5 -5
  79. package/dist/{chunk-LGXUGYUH.js → chunk-PYCQXCI5.js} +2 -2
  80. package/dist/{chunk-JOVWYVSR.js → chunk-SOCEY746.js} +1 -1
  81. package/dist/{chunk-FVKFDTN6.js → chunk-T4QY64OR.js} +19 -14
  82. package/dist/{chunk-R3AMKNIW.js → chunk-TFKBFQCE.js} +1 -1
  83. package/dist/{chunk-CRNAXFQ6.js → chunk-TIWURSLS.js} +1 -1
  84. package/dist/{chunk-VYUDGQM7.js → chunk-TUXFIVOH.js} +1 -1
  85. package/dist/{chunk-3T52B2OF.js → chunk-UQHUUZ5H.js} +1 -1
  86. package/dist/{chunk-TI3ZWXZG.js → chunk-USQDVBEV.js} +2 -2
  87. package/dist/{chunk-WEO5JCB4.js → chunk-UYDTFCHW.js} +1 -1
  88. package/dist/{chunk-D7ERHWYB.js → chunk-XWEONSLV.js} +1 -1
  89. package/dist/{chunk-GKIUEIDX.js → chunk-YQMFGWBD.js} +1 -1
  90. package/dist/{reapply-BAWDJTG7.js → reapply-D2TFN6XK.js} +9 -8
  91. package/dist/src/index.js +18 -16
  92. package/package.json +1 -1
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runBrowserLogin
4
- } from "../chunk-GKIUEIDX.js";
4
+ } from "../chunk-YQMFGWBD.js";
5
5
  import {
6
6
  coworkOutput,
7
7
  coworkSelection
8
- } from "../chunk-43JKGLZZ.js";
8
+ } from "../chunk-3ZSGKLSO.js";
9
9
  import "../chunk-PUZZELE6.js";
10
10
  import {
11
11
  detectClaudeVersion
12
- } from "../chunk-LUT2EZLG.js";
12
+ } from "../chunk-3NBODGQS.js";
13
13
  import {
14
14
  describeVersionManagerPin,
15
15
  versionManagerOf
@@ -17,7 +17,7 @@ import {
17
17
  import {
18
18
  readManagedControlEvidence,
19
19
  waitForMachineReadiness
20
- } from "../chunk-I6HRQOMT.js";
20
+ } from "../chunk-F57RGL7K.js";
21
21
  import {
22
22
  HERMES_CONFIG_SCRIPT,
23
23
  HERMES_PIP_PACKAGE,
@@ -27,7 +27,7 @@ import {
27
27
  isHermesConfigReceipt,
28
28
  resolveHermesPython,
29
29
  runHermesPythonScript
30
- } from "../chunk-37VLIYLI.js";
30
+ } from "../chunk-H5LHTC5X.js";
31
31
  import {
32
32
  describeDetection,
33
33
  detectAllAgents,
@@ -39,7 +39,7 @@ import {
39
39
  shortenHome,
40
40
  vscodeSettingsTargets,
41
41
  writeInstructionBlock
42
- } from "../chunk-3UA6FPRC.js";
42
+ } from "../chunk-DLJN5XEU.js";
43
43
  import {
44
44
  OPENCODE_HOOK_BINARY,
45
45
  addOpenCodeMcpServer,
@@ -50,7 +50,7 @@ import {
50
50
  openCodePluginDir,
51
51
  openCodePluginFile,
52
52
  openCodeWired
53
- } from "../chunk-VYUDGQM7.js";
53
+ } from "../chunk-TUXFIVOH.js";
54
54
  import {
55
55
  addCompatibleHooks,
56
56
  addCompatibleMcpServer,
@@ -61,7 +61,7 @@ import {
61
61
  compatibleMcpFile,
62
62
  compatiblePermissionRuleFile,
63
63
  hasCompatibleHooks
64
- } from "../chunk-HQLAZWJJ.js";
64
+ } from "../chunk-JF736N4C.js";
65
65
  import {
66
66
  addClaudeMcpServer,
67
67
  addPusharyHooks,
@@ -69,12 +69,16 @@ import {
69
69
  captureClaudeMcpServer,
70
70
  isClaudeMcpSnapshot,
71
71
  updateClaudeMcpSnapshot
72
- } from "../chunk-WIOXWUUH.js";
72
+ } from "../chunk-J4J45VPZ.js";
73
73
  import {
74
74
  detectProviderLiveCapabilities,
75
75
  hasSpawnProvider,
76
76
  resolveControlPolicy
77
- } from "../chunk-KI36MAT6.js";
77
+ } from "../chunk-KEOLNHR3.js";
78
+ import {
79
+ describeAutoUpdateAnnouncement,
80
+ takeAutoUpdateAnnouncement
81
+ } from "../chunk-OSSDK5RS.js";
78
82
  import {
79
83
  KEEP_HINT,
80
84
  captureHookTakeover,
@@ -84,23 +88,23 @@ import {
84
88
  hookOwnerOf,
85
89
  mcpBearerKey,
86
90
  planHooks
87
- } from "../chunk-KEMEBTCJ.js";
91
+ } from "../chunk-PCGZXWGQ.js";
88
92
  import {
89
93
  AGENT_CHOICES,
90
94
  effectiveControlMode,
91
95
  effectiveVerify,
92
96
  parseSetupOptions
93
- } from "../chunk-R3AMKNIW.js";
97
+ } from "../chunk-TFKBFQCE.js";
94
98
  import {
95
99
  liveBridgeProbe,
96
100
  resolveBridgeStub
97
- } from "../chunk-LYXX5NSB.js";
101
+ } from "../chunk-K3QVDAZW.js";
98
102
  import {
99
103
  claudeWired,
100
104
  codexWired,
101
105
  geminiWired,
102
106
  pusharyHookExecutable
103
- } from "../chunk-TF4IOINR.js";
107
+ } from "../chunk-NTQSICPJ.js";
104
108
  import {
105
109
  clearDaemonNeedsLogin,
106
110
  daemonHasRemoteProof,
@@ -113,29 +117,31 @@ import {
113
117
  replaceDaemonService,
114
118
  stopDaemonService,
115
119
  waitForDaemonRemoteProof
116
- } from "../chunk-3BPB2HYZ.js";
120
+ } from "../chunk-7XT76LWT.js";
117
121
  import {
118
122
  GEMINI_HOOK_BINARY,
119
123
  addGeminiHooks,
120
124
  addGeminiMcpServer,
121
125
  compareVersion,
126
+ formatVersion,
122
127
  parseVersion
123
- } from "../chunk-ED5TA2FJ.js";
124
- import "../chunk-JOVWYVSR.js";
128
+ } from "../chunk-EADZPVYW.js";
129
+ import "../chunk-SOCEY746.js";
125
130
  import {
126
131
  transcriptPreferenceForSetup
127
- } from "../chunk-MN3XOVRK.js";
132
+ } from "../chunk-2QT3GCU4.js";
128
133
  import "../chunk-XHKBHWLX.js";
129
134
  import {
130
135
  reportEvent
131
- } from "../chunk-LNGYW6G4.js";
132
- import "../chunk-WEO5JCB4.js";
133
- import "../chunk-LGXUGYUH.js";
134
- import "../chunk-3T52B2OF.js";
136
+ } from "../chunk-FDHMNT24.js";
137
+ import "../chunk-UYDTFCHW.js";
138
+ import "../chunk-PYCQXCI5.js";
139
+ import "../chunk-UQHUUZ5H.js";
135
140
  import {
136
141
  addCodexHookTrust,
137
142
  addCodexHooks,
138
143
  addCodexMcpServer,
144
+ autoUpdateState,
139
145
  captureCodexHookTrust,
140
146
  claudeJson,
141
147
  claudeMcpReceipt,
@@ -152,6 +158,7 @@ import {
152
158
  cursorUserHooks,
153
159
  cursorUserMcp,
154
160
  dropVacatedCodexHookTrust,
161
+ fetchLatestPublishedVersion,
155
162
  geminiMd,
156
163
  geminiSettings,
157
164
  guardBinary,
@@ -169,8 +176,9 @@ import {
169
176
  resolveGlobalBinary,
170
177
  vscodePluginDir,
171
178
  vscodePluginMcp
172
- } from "../chunk-SAF6NNXY.js";
179
+ } from "../chunk-DYHXOXUF.js";
173
180
  import {
181
+ BROWSER_CONNECT_COMMAND,
174
182
  confirmAppConnection,
175
183
  connectDevice,
176
184
  connectViaAppPairing,
@@ -179,27 +187,20 @@ import {
179
187
  printConnectInstructions,
180
188
  roundTripEvidence,
181
189
  verifyRoundTrip
182
- } from "../chunk-S3EP4B35.js";
190
+ } from "../chunk-KJRALILH.js";
183
191
  import "../chunk-3EGEA4KH.js";
184
192
  import {
185
193
  checkApiKey,
186
194
  describeKeyCheck,
187
195
  samePusharyAccount
188
- } from "../chunk-QBS6LGEK.js";
196
+ } from "../chunk-43LJSM4F.js";
189
197
  import {
190
198
  setHumanStream
191
199
  } from "../chunk-QCGNGEGE.js";
192
200
  import {
193
201
  useColor
194
202
  } from "../chunk-5RUIFDTP.js";
195
- import {
196
- renderCommandHelp
197
- } from "../chunk-FAH3D74E.js";
198
203
  import "../chunk-GMXKITVA.js";
199
- import {
200
- getPackageVersion,
201
- isNewerVersion
202
- } from "../chunk-DINDL2CF.js";
203
204
  import {
204
205
  KEY_FILE_MODE,
205
206
  exportLine,
@@ -210,8 +211,8 @@ import {
210
211
  readKeySource,
211
212
  resolveShellRc,
212
213
  writeKey
213
- } from "../chunk-TI3ZWXZG.js";
214
- import "../chunk-EYRGBYZG.js";
214
+ } from "../chunk-USQDVBEV.js";
215
+ import "../chunk-HETOKNIL.js";
215
216
  import "../chunk-SAF6HGAA.js";
216
217
  import {
217
218
  UsageError
@@ -219,14 +220,14 @@ import {
219
220
  import {
220
221
  EXIT
221
222
  } from "../chunk-KZERVKTD.js";
222
- import "../chunk-K6I5M2ME.js";
223
+ import "../chunk-HU5LSYL2.js";
223
224
  import {
224
225
  backupFile,
225
226
  readJsonSafe,
226
227
  writeFileAtomic,
227
228
  writeJsonAtomic
228
229
  } from "../chunk-T7E75EKA.js";
229
- import "../chunk-2UMNXADU.js";
230
+ import "../chunk-OSJEMXSR.js";
230
231
  import {
231
232
  HOOK_COMPATIBLE_PROFILES,
232
233
  HOOK_LOCATOR_BINARY,
@@ -235,7 +236,15 @@ import {
235
236
  compatibleTargetFiles,
236
237
  hookCompatibleProfile,
237
238
  isValidApiKey
238
- } from "../chunk-FVKFDTN6.js";
239
+ } from "../chunk-T4QY64OR.js";
240
+ import {
241
+ NPX_LATEST_COMMAND,
242
+ renderCommandHelp
243
+ } from "../chunk-EA3IELHP.js";
244
+ import {
245
+ getPackageVersion,
246
+ isNewerVersion
247
+ } from "../chunk-HWJW3CPO.js";
239
248
 
240
249
  // bin/pushary-setup.ts
241
250
  import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync, rmSync, renameSync, realpathSync, readdirSync, statSync, openSync, readSync, closeSync } from "fs";
@@ -437,6 +446,15 @@ var readCodexVersion = (probe) => {
437
446
  return bundled ? parseCodexVersion(bundled) : null;
438
447
  };
439
448
 
449
+ // src/setup/codex-trust.ts
450
+ var CODEX_TRUST_VERIFIED_MAX = [0, 155, 1];
451
+ var planCodexTrust = (installed, hashingProvenOnThisMachine) => hashingProvenOnThisMachine || compareCodexVersion(installed, CODEX_TRUST_VERIFIED_MAX) <= 0 ? { kind: "pretrust" } : { kind: "manual", installed, verifiedMax: CODEX_TRUST_VERIFIED_MAX };
452
+ var codexTrustOutcome = (pretrusted) => pretrusted ? "pretrusted" : "manual";
453
+ var describeUnverifiedCodexTrust = (plan, surface) => {
454
+ const where = surface === "chatgpt" ? "Open ChatGPT, then Settings and Hooks," : "Open Codex";
455
+ return `Codex ${formatVersion(plan.installed)} is newer than the last version Pushary verified (${formatVersion(plan.verifiedMax)}), so its hooks are not trusted yet. ${where} and choose Trust for the Pushary hooks.`;
456
+ };
457
+
440
458
  // src/setup/codex-install.ts
441
459
  var NATIVE_BINARY_MIN_BYTES = 20 * 1024 * 1024;
442
460
  var packageRootFor = (probe, binPath) => {
@@ -528,6 +546,10 @@ var recordedKey = null;
528
546
  var recordSetupKey = (apiKey) => {
529
547
  recordedKey = apiKey;
530
548
  };
549
+ var recordedCodexTrust = null;
550
+ var recordCodexTrust = (outcome) => {
551
+ recordedCodexTrust = outcome;
552
+ };
531
553
  var emitted = false;
532
554
  var defaultDeps = { report: reportEvent };
533
555
  var emit = async (deps, props) => {
@@ -535,7 +557,7 @@ var emit = async (deps, props) => {
535
557
  emitted = true;
536
558
  try {
537
559
  await deps.report(
538
- { event: "agent_setup_completed", agentType: "setup", ...props },
560
+ { event: "agent_setup_completed", agentType: "setup", ...props, codexTrust: recordedCodexTrust },
539
561
  { maxAttempts: 1, timeoutMs: 2e3, ...recordedKey ? { apiKey: recordedKey } : {} }
540
562
  );
541
563
  } catch {
@@ -713,19 +735,17 @@ var spinner = async (label, fn, options = {}) => {
713
735
  if (!options.optional) throw err;
714
736
  }
715
737
  };
716
- var checkForUpdates = async (current) => {
717
- try {
718
- const res = await fetch("https://registry.npmjs.org/@pushary/agent-hooks/latest", {
719
- signal: AbortSignal.timeout(3e3)
720
- });
721
- const data = await res.json();
722
- const latest = data.version;
723
- if (latest && isNewerVersion(latest, current)) {
724
- console.log(` ${yellow("!")} Update available: ${dim(current)} \u2192 ${green(latest)}`);
725
- console.log(` ${dim("Run:")} npx @pushary/agent-hooks@latest upgrade`);
726
- console.log();
727
- }
728
- } catch {
738
+ var checkForUpdates = async (current, markAnnounced) => {
739
+ const announcement = takeAutoUpdateAnnouncement(autoUpdateState(), markAnnounced);
740
+ if (announcement) {
741
+ console.log(` ${check} ${describeAutoUpdateAnnouncement(announcement)}`);
742
+ console.log();
743
+ }
744
+ const latest = await fetchLatestPublishedVersion({ timeoutMs: 3e3 });
745
+ if (latest && isNewerVersion(latest, current)) {
746
+ console.log(` ${yellow("!")} Update available: ${dim(current)} \u2192 ${green(latest)}`);
747
+ console.log(` ${dim("Run:")} ${NPX_LATEST_COMMAND} upgrade`);
748
+ console.log();
729
749
  }
730
750
  };
731
751
  var globalInstallReady = false;
@@ -874,7 +894,6 @@ var setupHermes = async (_apiKey) => {
874
894
  };
875
895
  var CODEX_HOOKS_JSON = join3(CODEX_HOME, "hooks.json");
876
896
  var CODEX_HOOKS_MIN_VERSION = [0, 122, 0];
877
- var CODEX_TRUST_VERIFIED_MAX = [0, 147, 0];
878
897
  var codexOnPath = () => {
879
898
  const whichCmd = IS_WINDOWS ? "where" : "which";
880
899
  try {
@@ -983,7 +1002,6 @@ var detectCodexInstall = () => checkCodexInstall({
983
1002
  dirname: dirname2
984
1003
  });
985
1004
  var codexSupportsHooks = (version) => version !== null && compareCodexVersion(version, CODEX_HOOKS_MIN_VERSION) >= 0;
986
- var codexTrustAutoSupported = (version) => version !== null && codexSupportsHooks(version) && compareCodexVersion(version, CODEX_TRUST_VERIFIED_MAX) <= 0;
987
1005
  var removeCodexNotifyEntry = (codexConfig) => {
988
1006
  let raw = "";
989
1007
  try {
@@ -1053,7 +1071,11 @@ var setupCodex = async (apiKey) => {
1053
1071
  });
1054
1072
  const codexVersion = detectCodexVersion();
1055
1073
  const hooksSupported = codexSupportsHooks(codexVersion);
1056
- const trustAuto = hooksSupported && (codexTrustSchemeAgrees(readAgentJson(CODEX_HOOKS_JSON), readAgentToml(codexConfig), CODEX_HOOKS_JSON) || codexTrustAutoSupported(codexVersion));
1074
+ const trustPlan = hooksSupported && codexVersion !== null ? planCodexTrust(
1075
+ codexVersion,
1076
+ codexTrustSchemeAgrees(readAgentJson(CODEX_HOOKS_JSON), readAgentToml(codexConfig), CODEX_HOOKS_JSON)
1077
+ ) : null;
1078
+ const trustAuto = trustPlan?.kind === "pretrust";
1057
1079
  let trusted = false;
1058
1080
  if (hooksSupported) {
1059
1081
  const hookCommand = guardBinary(resolveGlobalBinary("pushary-codex-hook") ?? "pushary-codex-hook");
@@ -1083,6 +1105,7 @@ var setupCodex = async (apiKey) => {
1083
1105
  await spinner("Removing legacy notify handler", async () => {
1084
1106
  removeCodexNotifyEntry(codexConfig);
1085
1107
  });
1108
+ recordCodexTrust(codexTrustOutcome(trusted));
1086
1109
  } else {
1087
1110
  if (codexVersion !== null) {
1088
1111
  console.log(` ${yellow("!")} This Codex version predates native hooks (needs ${CODEX_HOOKS_MIN_VERSION.join(".")}+).`);
@@ -1113,6 +1136,9 @@ var setupCodex = async (apiKey) => {
1113
1136
  if (trusted) {
1114
1137
  console.log(` ${dim("\u2022")} Hook pre-trusted: no ${cyan("/hooks")} step. If approvals never arrive, ${cyan("/hooks")} re-trusts it`);
1115
1138
  } else {
1139
+ if (trustPlan?.kind === "manual") {
1140
+ console.log(` ${yellow("!")} ${describeUnverifiedCodexTrust(trustPlan, bundled ? "chatgpt" : "codex")}`);
1141
+ }
1116
1142
  console.log();
1117
1143
  console.log(` ${bold("One step left, and it happens inside Codex")}`);
1118
1144
  console.log(` ${dim("Codex makes you trust any hook before it runs. This is Codex's own")}`);
@@ -1743,10 +1769,10 @@ var printPairingEscape = () => {
1743
1769
  console.log();
1744
1770
  console.log(` ${yellow("!")} No app? Two ways to finish without one:`);
1745
1771
  console.log();
1746
- console.log(` ${cyan("npx @pushary/agent-hooks setup --connect browser")}`);
1772
+ console.log(` ${cyan(BROWSER_CONNECT_COMMAND)}`);
1747
1773
  console.log(` ${dim("Approve in a browser tab. No phone needed.")}`);
1748
1774
  console.log();
1749
- console.log(` ${cyan("npx @pushary/agent-hooks setup --key pk_...")}`);
1775
+ console.log(` ${cyan(`${NPX_LATEST_COMMAND} setup --key pk_...`)}`);
1750
1776
  console.log(` ${dim("Paste a key from")} ${cyan("pushary.com/dashboard/agent/settings")}`);
1751
1777
  console.log();
1752
1778
  console.log(` ${dim("Or get the app at")} ${cyan("https://pushary.com/download")} ${dim("and re-run setup.")}`);
@@ -1931,7 +1957,7 @@ var main = async () => {
1931
1957
  console.log(` ${bold("Pushary")} ${dim("v" + version)}`);
1932
1958
  console.log(` ${dim("Push notifications for AI agents")}`);
1933
1959
  console.log();
1934
- await checkForUpdates(version);
1960
+ await checkForUpdates(version, !options.dryRun);
1935
1961
  markStep("resolve-key");
1936
1962
  const connectMode = options.connectMode;
1937
1963
  const flagKey = await readKeyFromStdin(options) ?? options.key ?? void 0;
@@ -1989,7 +2015,7 @@ var main = async () => {
1989
2015
  console.log(` ${dim("Pairing with your Pushary app.")}`);
1990
2016
  console.log(` ${dim("Agent control requires a paid plan after the trial. Current pricing:")} ${cyan("https://pushary.com/pricing")}`);
1991
2017
  console.log(` ${dim("No app yet? Get it at")} ${cyan("https://pushary.com/download")}${dim(", this keeps waiting.")}`);
1992
- console.log(` ${dim("No phone? Ctrl-C, then:")} ${cyan("npx @pushary/agent-hooks setup --connect browser")}`);
2018
+ console.log(` ${dim("No phone? Ctrl-C, then:")} ${cyan(BROWSER_CONNECT_COMMAND)}`);
1993
2019
  markStep("pair");
1994
2020
  const previous = readKeySource();
1995
2021
  const paired = await connectViaAppPairing({
@@ -2458,7 +2484,7 @@ main().catch(async (err) => {
2458
2484
  }
2459
2485
  console.log();
2460
2486
  console.log(` ${yellow("!")} Setup failed: ${formatError(err)}`);
2461
- console.log(` ${dim("Run")} ${cyan("npx @pushary/agent-hooks doctor")} ${dim("after fixing the issue, then rerun setup.")}`);
2487
+ console.log(` ${dim("Run")} ${cyan(`${NPX_LATEST_COMMAND} doctor`)} ${dim("after fixing the issue, then rerun setup.")}`);
2462
2488
  console.log();
2463
2489
  process.exit(await abortWith("crashed", EXIT.FAILED));
2464
2490
  });
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  readLedgerSummary
4
- } from "../chunk-SWFF5U2N.js";
4
+ } from "../chunk-43ZDACBO.js";
5
5
  import {
6
6
  exitOnHelpFlag
7
- } from "../chunk-TWWLVOPB.js";
8
- import "../chunk-FAH3D74E.js";
9
- import "../chunk-DINDL2CF.js";
7
+ } from "../chunk-P4BNYJ5Q.js";
10
8
  import "../chunk-KZERVKTD.js";
11
9
  import {
12
10
  getApiKey
13
- } from "../chunk-2UMNXADU.js";
14
- import "../chunk-FVKFDTN6.js";
11
+ } from "../chunk-OSJEMXSR.js";
12
+ import "../chunk-T4QY64OR.js";
13
+ import "../chunk-EA3IELHP.js";
14
+ import "../chunk-HWJW3CPO.js";
15
15
 
16
16
  // bin/pushary-stats.ts
17
17
  exitOnHelpFlag("stats");
@@ -2,38 +2,36 @@
2
2
  import {
3
3
  describeLastSeen,
4
4
  listMachines
5
- } from "../chunk-I6HRQOMT.js";
6
- import "../chunk-KI36MAT6.js";
7
- import "../chunk-3BPB2HYZ.js";
5
+ } from "../chunk-F57RGL7K.js";
6
+ import "../chunk-KEOLNHR3.js";
7
+ import "../chunk-7XT76LWT.js";
8
8
  import "../chunk-XHKBHWLX.js";
9
- import "../chunk-3T52B2OF.js";
10
- import "../chunk-SAF6NNXY.js";
9
+ import "../chunk-UQHUUZ5H.js";
10
+ import "../chunk-DYHXOXUF.js";
11
11
  import {
12
12
  describeReach,
13
13
  fetchChannels,
14
14
  reachVerdict
15
- } from "../chunk-S3EP4B35.js";
15
+ } from "../chunk-KJRALILH.js";
16
16
  import "../chunk-3EGEA4KH.js";
17
17
  import {
18
18
  checkApiKey,
19
19
  describeKeyCheck
20
- } from "../chunk-QBS6LGEK.js";
20
+ } from "../chunk-43LJSM4F.js";
21
21
  import "../chunk-QCGNGEGE.js";
22
22
  import {
23
23
  createIo
24
24
  } from "../chunk-5RUIFDTP.js";
25
25
  import {
26
26
  exitOnHelpFlag
27
- } from "../chunk-TWWLVOPB.js";
28
- import "../chunk-FAH3D74E.js";
27
+ } from "../chunk-P4BNYJ5Q.js";
29
28
  import {
30
29
  rejectUnknownFlags
31
30
  } from "../chunk-GMXKITVA.js";
32
- import "../chunk-DINDL2CF.js";
33
31
  import {
34
32
  readKeySource
35
- } from "../chunk-TI3ZWXZG.js";
36
- import "../chunk-EYRGBYZG.js";
33
+ } from "../chunk-USQDVBEV.js";
34
+ import "../chunk-HETOKNIL.js";
37
35
  import "../chunk-SAF6HGAA.js";
38
36
  import {
39
37
  UsageError
@@ -41,10 +39,12 @@ import {
41
39
  import {
42
40
  EXIT
43
41
  } from "../chunk-KZERVKTD.js";
44
- import "../chunk-K6I5M2ME.js";
42
+ import "../chunk-HU5LSYL2.js";
45
43
  import "../chunk-T7E75EKA.js";
46
- import "../chunk-2UMNXADU.js";
47
- import "../chunk-FVKFDTN6.js";
44
+ import "../chunk-OSJEMXSR.js";
45
+ import "../chunk-T4QY64OR.js";
46
+ import "../chunk-EA3IELHP.js";
47
+ import "../chunk-HWJW3CPO.js";
48
48
 
49
49
  // src/status.ts
50
50
  var keySourceLine = (source) => {
@@ -2,44 +2,45 @@
2
2
  import {
3
3
  activeHookSource,
4
4
  activeIdentity
5
- } from "../chunk-HQLAZWJJ.js";
6
- import "../chunk-WIOXWUUH.js";
5
+ } from "../chunk-JF736N4C.js";
6
+ import "../chunk-J4J45VPZ.js";
7
7
  import {
8
8
  readHookInput
9
- } from "../chunk-4FN6VV56.js";
10
- import "../chunk-TNS3YLFE.js";
9
+ } from "../chunk-ORLJNJEO.js";
10
+ import "../chunk-NFKVRMTM.js";
11
11
  import "../chunk-SGZJ5LYH.js";
12
- import "../chunk-KEMEBTCJ.js";
13
- import "../chunk-R3AMKNIW.js";
14
- import "../chunk-LYXX5NSB.js";
15
- import "../chunk-TF4IOINR.js";
16
- import "../chunk-3BPB2HYZ.js";
17
- import "../chunk-ED5TA2FJ.js";
18
- import "../chunk-JOVWYVSR.js";
19
- import "../chunk-CRNAXFQ6.js";
20
- import "../chunk-EQRS3SGM.js";
21
- import "../chunk-MN3XOVRK.js";
12
+ import "../chunk-PCGZXWGQ.js";
13
+ import "../chunk-TFKBFQCE.js";
14
+ import "../chunk-K3QVDAZW.js";
15
+ import "../chunk-NTQSICPJ.js";
16
+ import "../chunk-7XT76LWT.js";
17
+ import "../chunk-EADZPVYW.js";
18
+ import "../chunk-SOCEY746.js";
19
+ import "../chunk-TIWURSLS.js";
20
+ import "../chunk-66H2QQAK.js";
21
+ import "../chunk-2QT3GCU4.js";
22
22
  import "../chunk-XHKBHWLX.js";
23
23
  import {
24
24
  handleStop,
25
25
  handleSubagentStop,
26
26
  isSubagentStop
27
- } from "../chunk-LNGYW6G4.js";
28
- import "../chunk-WEO5JCB4.js";
29
- import "../chunk-LGXUGYUH.js";
30
- import "../chunk-3T52B2OF.js";
31
- import "../chunk-SAF6NNXY.js";
27
+ } from "../chunk-FDHMNT24.js";
28
+ import "../chunk-UYDTFCHW.js";
29
+ import "../chunk-PYCQXCI5.js";
30
+ import "../chunk-UQHUUZ5H.js";
31
+ import "../chunk-DYHXOXUF.js";
32
32
  import "../chunk-GMXKITVA.js";
33
- import "../chunk-DINDL2CF.js";
34
- import "../chunk-TI3ZWXZG.js";
35
- import "../chunk-EYRGBYZG.js";
33
+ import "../chunk-USQDVBEV.js";
34
+ import "../chunk-HETOKNIL.js";
36
35
  import "../chunk-SAF6HGAA.js";
37
36
  import "../chunk-7QLSKOSU.js";
38
37
  import "../chunk-KZERVKTD.js";
39
- import "../chunk-K6I5M2ME.js";
38
+ import "../chunk-HU5LSYL2.js";
40
39
  import "../chunk-T7E75EKA.js";
41
- import "../chunk-2UMNXADU.js";
42
- import "../chunk-FVKFDTN6.js";
40
+ import "../chunk-OSJEMXSR.js";
41
+ import "../chunk-T4QY64OR.js";
42
+ import "../chunk-EA3IELHP.js";
43
+ import "../chunk-HWJW3CPO.js";
43
44
 
44
45
  // bin/pushary-stop-hook.ts
45
46
  var AGENT = activeIdentity(process.argv);
@@ -2,42 +2,43 @@
2
2
  import {
3
3
  activeHookSource,
4
4
  activeIdentity
5
- } from "../chunk-HQLAZWJJ.js";
6
- import "../chunk-WIOXWUUH.js";
5
+ } from "../chunk-JF736N4C.js";
6
+ import "../chunk-J4J45VPZ.js";
7
7
  import {
8
8
  readHookInput
9
- } from "../chunk-4FN6VV56.js";
10
- import "../chunk-TNS3YLFE.js";
9
+ } from "../chunk-ORLJNJEO.js";
10
+ import "../chunk-NFKVRMTM.js";
11
11
  import "../chunk-SGZJ5LYH.js";
12
- import "../chunk-KEMEBTCJ.js";
13
- import "../chunk-R3AMKNIW.js";
14
- import "../chunk-LYXX5NSB.js";
15
- import "../chunk-TF4IOINR.js";
16
- import "../chunk-3BPB2HYZ.js";
17
- import "../chunk-ED5TA2FJ.js";
18
- import "../chunk-JOVWYVSR.js";
19
- import "../chunk-CRNAXFQ6.js";
20
- import "../chunk-EQRS3SGM.js";
21
- import "../chunk-MN3XOVRK.js";
12
+ import "../chunk-PCGZXWGQ.js";
13
+ import "../chunk-TFKBFQCE.js";
14
+ import "../chunk-K3QVDAZW.js";
15
+ import "../chunk-NTQSICPJ.js";
16
+ import "../chunk-7XT76LWT.js";
17
+ import "../chunk-EADZPVYW.js";
18
+ import "../chunk-SOCEY746.js";
19
+ import "../chunk-TIWURSLS.js";
20
+ import "../chunk-66H2QQAK.js";
21
+ import "../chunk-2QT3GCU4.js";
22
22
  import "../chunk-XHKBHWLX.js";
23
23
  import {
24
24
  handleStopFailure
25
- } from "../chunk-LNGYW6G4.js";
26
- import "../chunk-WEO5JCB4.js";
27
- import "../chunk-LGXUGYUH.js";
28
- import "../chunk-3T52B2OF.js";
29
- import "../chunk-SAF6NNXY.js";
25
+ } from "../chunk-FDHMNT24.js";
26
+ import "../chunk-UYDTFCHW.js";
27
+ import "../chunk-PYCQXCI5.js";
28
+ import "../chunk-UQHUUZ5H.js";
29
+ import "../chunk-DYHXOXUF.js";
30
30
  import "../chunk-GMXKITVA.js";
31
- import "../chunk-DINDL2CF.js";
32
- import "../chunk-TI3ZWXZG.js";
33
- import "../chunk-EYRGBYZG.js";
31
+ import "../chunk-USQDVBEV.js";
32
+ import "../chunk-HETOKNIL.js";
34
33
  import "../chunk-SAF6HGAA.js";
35
34
  import "../chunk-7QLSKOSU.js";
36
35
  import "../chunk-KZERVKTD.js";
37
- import "../chunk-K6I5M2ME.js";
36
+ import "../chunk-HU5LSYL2.js";
38
37
  import "../chunk-T7E75EKA.js";
39
- import "../chunk-2UMNXADU.js";
40
- import "../chunk-FVKFDTN6.js";
38
+ import "../chunk-OSJEMXSR.js";
39
+ import "../chunk-T4QY64OR.js";
40
+ import "../chunk-EA3IELHP.js";
41
+ import "../chunk-HWJW3CPO.js";
41
42
 
42
43
  // bin/pushary-stopfailure-hook.ts
43
44
  var AGENT = activeIdentity(process.argv);
@@ -4,12 +4,10 @@ import {
4
4
  } from "../chunk-5RUIFDTP.js";
5
5
  import {
6
6
  exitOnHelpFlag
7
- } from "../chunk-TWWLVOPB.js";
8
- import "../chunk-FAH3D74E.js";
7
+ } from "../chunk-P4BNYJ5Q.js";
9
8
  import {
10
9
  rejectUnknownFlags
11
10
  } from "../chunk-GMXKITVA.js";
12
- import "../chunk-DINDL2CF.js";
13
11
  import {
14
12
  UsageError
15
13
  } from "../chunk-7QLSKOSU.js";
@@ -19,7 +17,9 @@ import {
19
17
  import {
20
18
  getApiKey,
21
19
  getBaseUrl
22
- } from "../chunk-2UMNXADU.js";
20
+ } from "../chunk-OSJEMXSR.js";
21
+ import "../chunk-EA3IELHP.js";
22
+ import "../chunk-HWJW3CPO.js";
23
23
 
24
24
  // bin/pushary-suggestions.ts
25
25
  exitOnHelpFlag("suggestions");