@pushary/agent-hooks 1.9.59 → 1.9.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +6 -0
  3. package/data/cursor-plugin/.cursor-plugin/plugin.json +5 -1
  4. package/data/cursor-plugin/CHANGELOG.md +4 -0
  5. package/dist/{api-UVJGNZIF.js → api-LW3PJQYY.js} +12 -11
  6. package/dist/bin/pushary-bell-hook.js +30 -29
  7. package/dist/bin/pushary-bell.js +13 -12
  8. package/dist/bin/pushary-claude.js +32 -30
  9. package/dist/bin/pushary-clean.js +61 -54
  10. package/dist/bin/pushary-codex-bridge.js +23 -22
  11. package/dist/bin/pushary-codex-hook.js +35 -34
  12. package/dist/bin/pushary-codex-session.js +9 -8
  13. package/dist/bin/pushary-codex.js +16 -15
  14. package/dist/bin/pushary-connect.js +30 -29
  15. package/dist/bin/pushary-cowork.js +8 -7
  16. package/dist/bin/pushary-daemon.js +40 -39
  17. package/dist/bin/pushary-disconnect.js +43 -29
  18. package/dist/bin/pushary-doctor.js +52 -47
  19. package/dist/bin/pushary-elicitation-hook.js +30 -29
  20. package/dist/bin/pushary-gemini-bridge.js +16 -15
  21. package/dist/bin/pushary-gemini-hook.js +32 -31
  22. package/dist/bin/pushary-hook.js +34 -33
  23. package/dist/bin/pushary-login.js +23 -19
  24. package/dist/bin/pushary-logout.js +37 -31
  25. package/dist/bin/pushary-mcp.js +13 -12
  26. package/dist/bin/pushary-mode.js +42 -55
  27. package/dist/bin/pushary-notification-hook.js +29 -28
  28. package/dist/bin/pushary-opencode-hook.js +31 -30
  29. package/dist/bin/pushary-permission-denied-hook.js +34 -33
  30. package/dist/bin/pushary-permission-hook.js +33 -32
  31. package/dist/bin/pushary-post-hook.js +29 -28
  32. package/dist/bin/pushary-prompt-hook.js +29 -28
  33. package/dist/bin/pushary-session-end-hook.js +29 -28
  34. package/dist/bin/pushary-session-start-hook.js +36 -35
  35. package/dist/bin/pushary-setup.js +4397 -292
  36. package/dist/bin/pushary-stats.js +6 -5
  37. package/dist/bin/pushary-status.js +42 -36
  38. package/dist/bin/pushary-stop-hook.js +29 -28
  39. package/dist/bin/pushary-stopfailure-hook.js +29 -28
  40. package/dist/bin/pushary-suggestions.js +34 -39
  41. package/dist/bin/pushary-transcript-register.js +21 -20
  42. package/dist/bin/pushary-transcripts.js +34 -20
  43. package/dist/bin/pushary-upgrade.js +77 -50
  44. package/dist/bin/pushary-wait.js +37 -42
  45. package/dist/bin/pushary.js +9 -8
  46. package/dist/{chunk-PVANKDWM.js → chunk-2AELPDMT.js} +1 -1
  47. package/dist/{chunk-W47WL6JY.js → chunk-33OOEVPG.js} +1 -1
  48. package/dist/{chunk-BRUHVTFB.js → chunk-4N5E4JNF.js} +2 -2
  49. package/dist/{chunk-6ONSTCDJ.js → chunk-4VRTSDGP.js} +5 -5
  50. package/dist/{chunk-DS7X36Z3.js → chunk-64S5PQBQ.js} +4 -4
  51. package/dist/{chunk-KQHY6L3X.js → chunk-6FJ6CK32.js} +4 -4
  52. package/dist/{chunk-EBQTWH5O.js → chunk-6T5Z64KS.js} +39 -31
  53. package/dist/{chunk-JAKBCKEB.js → chunk-7BAO42UV.js} +8 -7
  54. package/dist/chunk-7BHI3PZN.js +41 -0
  55. package/dist/{chunk-5BNXJTOZ.js → chunk-7HDGH3Z2.js} +3 -12
  56. package/dist/{chunk-D6CXQIXO.js → chunk-7JXJJNQ5.js} +1 -1
  57. package/dist/{chunk-KHDD74MK.js → chunk-7MCCXE5Y.js} +5 -5
  58. package/dist/{chunk-AY32RSUC.js → chunk-ADR3KHOC.js} +2 -2
  59. package/dist/{chunk-MMLIQDTG.js → chunk-ATKN4BJT.js} +1 -1
  60. package/dist/{chunk-762CDAJJ.js → chunk-AXJLJJ3M.js} +7 -0
  61. package/dist/{chunk-4XXZUFWN.js → chunk-BG4Y64FW.js} +1 -1
  62. package/dist/{chunk-X4ES7QBT.js → chunk-BJTSKOH3.js} +9 -7
  63. package/dist/{chunk-TCH5UCPR.js → chunk-BQ2VV7LY.js} +2 -2
  64. package/dist/{chunk-IBXHVYN2.js → chunk-BUZIEL7Y.js} +2 -2
  65. package/dist/{chunk-UFJS4RR7.js → chunk-CICLXLQN.js} +3 -3
  66. package/dist/{chunk-US3IT6ZC.js → chunk-CJ5TCFD4.js} +11 -4
  67. package/dist/{chunk-5JWCWALO.js → chunk-DQLCFGHK.js} +12 -10
  68. package/dist/{chunk-V3PDUDPB.js → chunk-ELLJPP6O.js} +2 -2
  69. package/dist/{chunk-BMPZ5HVJ.js → chunk-ERK24P76.js} +11 -1
  70. package/dist/{chunk-2WMZDKPM.js → chunk-EUIPTDLX.js} +13 -13
  71. package/dist/{chunk-RQDP2SJY.js → chunk-FUZ5VYWD.js} +1 -1
  72. package/dist/{chunk-5PP4455M.js → chunk-G36T5LAP.js} +3 -3
  73. package/dist/{chunk-3N2ZTHZZ.js → chunk-GAMVAORR.js} +1 -1
  74. package/dist/{chunk-YQVKG5MC.js → chunk-GDKQUB52.js} +7 -6
  75. package/dist/{chunk-KQWN7C5C.js → chunk-GKFO5JLN.js} +4 -4
  76. package/dist/{chunk-MYU5D5VH.js → chunk-GZCSWDAS.js} +4 -4
  77. package/dist/{chunk-2FVP7WRP.js → chunk-HUI4OE43.js} +3 -3
  78. package/dist/{chunk-AS4Z6KS4.js → chunk-IFPOHFDJ.js} +1 -1
  79. package/dist/{chunk-L3NVHPBU.js → chunk-JGQV4MDQ.js} +6 -6
  80. package/dist/{chunk-UVZK5LIK.js → chunk-K4MBKXAE.js} +1 -1
  81. package/dist/{chunk-EHCIQA5D.js → chunk-KPNZ7JUL.js} +4 -4
  82. package/dist/{chunk-4QF2YLYK.js → chunk-LBHJJEKT.js} +6 -6
  83. package/dist/{chunk-5O6D4J2K.js → chunk-LN7DE5LY.js} +2 -2
  84. package/dist/chunk-MLKGABMK.js +9 -0
  85. package/dist/{chunk-KZCYHWDF.js → chunk-MWLTTLPK.js} +107 -50
  86. package/dist/{chunk-WWAVHLGS.js → chunk-NKLNU577.js} +5 -5
  87. package/dist/{chunk-GMXKITVA.js → chunk-NMUI3ZWG.js} +1 -1
  88. package/dist/{chunk-SIU6OWA6.js → chunk-O65F2IIN.js} +6 -6
  89. package/dist/{chunk-T65RIQK2.js → chunk-ORX5BTV4.js} +6 -6
  90. package/dist/{chunk-VAJHDTJX.js → chunk-P3VQH65N.js} +28 -17
  91. package/dist/{chunk-CPRA7IEK.js → chunk-PITQ5ZIQ.js} +2 -2
  92. package/dist/chunk-PPY5N2E6.js +58 -0
  93. package/dist/{chunk-UTJ5465F.js → chunk-QER5R7Z6.js} +2 -2
  94. package/dist/{chunk-TDOKDCFH.js → chunk-RGSW36XH.js} +3 -3
  95. package/dist/{chunk-WW24SG27.js → chunk-RJHX66EY.js} +21 -11
  96. package/dist/{chunk-M46WDK64.js → chunk-SFAP4AJY.js} +1 -1
  97. package/dist/{chunk-MSU3VKGJ.js → chunk-SHJVFW22.js} +2 -2
  98. package/dist/{chunk-RAMQBSVZ.js → chunk-SVQWHV65.js} +1 -1
  99. package/dist/{chunk-3NROUNIS.js → chunk-UADSXJZ4.js} +2 -2
  100. package/dist/{chunk-M6MOQBR5.js → chunk-USE5IEEW.js} +1 -1
  101. package/dist/{chunk-KW3DED2A.js → chunk-VX2MJ4X7.js} +4 -4
  102. package/dist/{chunk-OZIXBN3O.js → chunk-WFSGCFXQ.js} +2 -2
  103. package/dist/{chunk-KAJDKYUM.js → chunk-WN3RACVD.js} +3 -3
  104. package/dist/chunk-X3YKQJCZ.js +36 -0
  105. package/dist/{chunk-5EFNBL6V.js → chunk-XAO6EYGM.js} +3 -3
  106. package/dist/{chunk-BKVX53QR.js → chunk-XEJOPVCG.js} +1 -1
  107. package/dist/{chunk-75UYYIFJ.js → chunk-XV6S5PWW.js} +3 -3
  108. package/dist/{chunk-3RKIJM26.js → chunk-Y5VKZNFN.js} +2 -2
  109. package/dist/{chunk-DK35M4TH.js → chunk-Y6Z7DA5Y.js} +5 -5
  110. package/dist/{chunk-MA37WNVS.js → chunk-YDR4BQ7R.js} +4 -4
  111. package/dist/{chunk-XGP5VSQG.js → chunk-YPD3MTFU.js} +1 -1
  112. package/dist/{chunk-LAEW5QQD.js → chunk-ZEWIMY63.js} +1 -1
  113. package/dist/{chunk-JBCMXSBO.js → chunk-ZGU3NXL2.js} +77 -18
  114. package/dist/{codex-app-cards-switch-N77RWKCO.js → codex-app-cards-switch-BD7LCI2I.js} +12 -11
  115. package/dist/{codex-desktop-launch-KIX7OMTL.js → codex-desktop-launch-V5CASSBB.js} +2 -1
  116. package/dist/{codex-session-launch-XV7SIIWP.js → codex-session-launch-5PKFKUFD.js} +20 -19
  117. package/dist/{config-HH4DYYNX.js → config-AEKH7HGC.js} +4 -3
  118. package/dist/{global-upgrade-YWIVJIUR.js → global-upgrade-IUXJJDWF.js} +10 -9
  119. package/dist/{identity-4J7Y2MW3.js → identity-YJIV2XTY.js} +5 -4
  120. package/dist/{live-capabilities-LHZBCI5U.js → live-capabilities-QYFW5QAW.js} +5 -4
  121. package/dist/{paths-ES3V7BWQ.js → paths-A5GAR5PL.js} +4 -3
  122. package/dist/reapply-BKJGICRJ.js +63 -0
  123. package/dist/src/index.js +23 -22
  124. package/dist/{upgrade-lock-TJPKU5HL.js → upgrade-lock-DDB7WEWC.js} +5 -4
  125. package/dist/usage-HBDNFZ3O.js +11 -0
  126. package/package.json +1 -1
  127. package/dist/chunk-7QLSKOSU.js +0 -19
  128. package/dist/chunk-EO23EUOK.js +0 -14
  129. package/dist/reapply-KA5SIYWX.js +0 -62
  130. package/dist/usage-7ALXBJVJ.js +0 -10
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ensureCodexTrustsPusharyHooks
3
- } from "./chunk-IBXHVYN2.js";
3
+ } from "./chunk-BUZIEL7Y.js";
4
4
  import {
5
5
  CODEX_INSTRUCTIONS_LABEL,
6
6
  GEMINI_INSTRUCTIONS_LABEL,
@@ -11,7 +11,7 @@ import {
11
11
  macAppFxBridge,
12
12
  refreshInstructionBlock,
13
13
  renderAgentInstructions
14
- } from "./chunk-6ONSTCDJ.js";
14
+ } from "./chunk-4VRTSDGP.js";
15
15
  import {
16
16
  OPENCODE_HOOK_BINARY,
17
17
  agentHookOwner,
@@ -21,10 +21,10 @@ import {
21
21
  openCodeInstructionsFile,
22
22
  openCodePluginDir,
23
23
  openCodeWired
24
- } from "./chunk-JBCMXSBO.js";
24
+ } from "./chunk-ZGU3NXL2.js";
25
25
  import {
26
26
  detectClaudeVersion
27
- } from "./chunk-M6MOQBR5.js";
27
+ } from "./chunk-USE5IEEW.js";
28
28
  import {
29
29
  addClaudeMcpServer,
30
30
  addCompatibleHooks,
@@ -33,7 +33,7 @@ import {
33
33
  compatibleConfigFile,
34
34
  compatibleInstructionsFile,
35
35
  hasCompatibleHooks
36
- } from "./chunk-KQWN7C5C.js";
36
+ } from "./chunk-GKFO5JLN.js";
37
37
  import {
38
38
  claudeUnprovenHolds,
39
39
  claudeWired,
@@ -41,7 +41,7 @@ import {
41
41
  codexWired,
42
42
  geminiWired,
43
43
  planHooks
44
- } from "./chunk-X4ES7QBT.js";
44
+ } from "./chunk-BJTSKOH3.js";
45
45
  import {
46
46
  CLAUDE_HOOK_BINARY,
47
47
  CLAUDE_HOOK_EVENTS,
@@ -52,7 +52,7 @@ import {
52
52
  needsReregistration,
53
53
  registrationSignatures,
54
54
  supportedClaudeEvents
55
- } from "./chunk-TDOKDCFH.js";
55
+ } from "./chunk-RGSW36XH.js";
56
56
  import {
57
57
  formatVersion
58
58
  } from "./chunk-6ICPEJY5.js";
@@ -61,11 +61,14 @@ import {
61
61
  addCodexHookTrust,
62
62
  addCodexHooks,
63
63
  addCodexMcpServer,
64
+ claudeJson,
64
65
  claudeRegistrationReceipt,
66
+ claudeSettings,
65
67
  codexAgentsMd,
66
68
  codexConfigToml,
67
69
  codexHookPositions,
68
70
  codexHooksJson,
71
+ codexMcpStartsCommand,
69
72
  codexRegistrationHolder,
70
73
  codexVacatedIndexes,
71
74
  dropVacatedCodexHookTrust,
@@ -80,11 +83,11 @@ import {
80
83
  registeredCommands,
81
84
  registrationHolderOf,
82
85
  vscodePluginMcp
83
- } from "./chunk-KZCYHWDF.js";
86
+ } from "./chunk-MWLTTLPK.js";
84
87
  import {
85
88
  resolveGlobalBinDir,
86
89
  resolveGlobalBinary
87
- } from "./chunk-US3IT6ZC.js";
90
+ } from "./chunk-CJ5TCFD4.js";
88
91
  import {
89
92
  readJsonSafe,
90
93
  writeFileAtomic,
@@ -94,7 +97,7 @@ import {
94
97
  HOOK_COMPATIBLE_PROFILES,
95
98
  isCompatibleAgentType,
96
99
  isRecord
97
- } from "./chunk-762CDAJJ.js";
100
+ } from "./chunk-AXJLJJ3M.js";
98
101
 
99
102
  // src/reapply.ts
100
103
  import { dirname, join } from "path";
@@ -137,8 +140,6 @@ var storedSignatures = (raw) => {
137
140
  };
138
141
 
139
142
  // src/reapply.ts
140
- var CLAUDE_SETTINGS = join(homedir(), ".claude", "settings.json");
141
- var CLAUDE_JSON = join(homedir(), ".claude.json");
142
143
  var readJson = (filePath) => {
143
144
  const result = readJsonSafe(filePath);
144
145
  if (result.kind === "ok") return isRecord(result.value) ? result.value : null;
@@ -147,7 +148,7 @@ var readJson = (filePath) => {
147
148
  };
148
149
  var writeJson = (filePath, data) => writeJsonAtomic(filePath, data);
149
150
  var hasPusharyClaudeHooks = (settings) => JSON.stringify(settings.hooks ?? {}).includes(CLAUDE_HOOK_BINARY);
150
- var hasPusharyMcp = (claudeJson) => !!claudeJson.mcpServers?.pushary;
151
+ var hasPusharyMcp = (claudeJson2) => !!claudeJson2.mcpServers?.pushary;
151
152
  var PRIVATE_TO_OWNER = 384;
152
153
  var modeToPreserve = (filePath) => {
153
154
  try {
@@ -158,14 +159,14 @@ var modeToPreserve = (filePath) => {
158
159
  };
159
160
  var wouldWriteBareNames = (resolve, probe) => resolve(probe) === void 0;
160
161
  var reapplyClaudeSettings = (apiKey, paths = {}) => {
161
- const settingsPath = paths.settingsPath ?? CLAUDE_SETTINGS;
162
- const claudeJsonPath = paths.claudeJsonPath ?? CLAUDE_JSON;
162
+ const settingsPath = paths.settingsPath ?? claudeSettings();
163
+ const claudeJsonPath = paths.claudeJsonPath ?? claudeJson();
163
164
  const settings = readJson(settingsPath);
164
- const claudeJson = readJson(claudeJsonPath);
165
- const configured = settings != null && hasPusharyClaudeHooks(settings) || claudeJson != null && hasPusharyMcp(claudeJson);
165
+ const claudeJson2 = readJson(claudeJsonPath);
166
+ const configured = settings != null && hasPusharyClaudeHooks(settings) || claudeJson2 != null && hasPusharyMcp(claudeJson2);
166
167
  if (!configured) return { configured: false, reapplied: false, hooks: false, mcp: false };
167
168
  const settingsWritable = settings != null;
168
- const claudeJsonWritable = claudeJson != null;
169
+ const claudeJsonWritable = claudeJson2 != null;
169
170
  let hooks = false;
170
171
  let mcp = false;
171
172
  let failed = false;
@@ -183,7 +184,7 @@ var reapplyClaudeSettings = (apiKey, paths = {}) => {
183
184
  if (apiKey) {
184
185
  try {
185
186
  if (!claudeJsonWritable) throw new Error(".claude.json could not be parsed");
186
- const cj = claudeJson;
187
+ const cj = claudeJson2;
187
188
  addClaudeMcpServer(cj, apiKey);
188
189
  writeJson(claudeJsonPath, cj);
189
190
  mcp = true;
@@ -196,7 +197,7 @@ var reapplyClaudeSettings = (apiKey, paths = {}) => {
196
197
  var reapplyClaudeForVersion = (apiKey, paths = {}) => {
197
198
  const idle = { verdict: "current", rewrote: false, missing: [] };
198
199
  try {
199
- const settingsPath = paths.settingsPath ?? CLAUDE_SETTINGS;
200
+ const settingsPath = paths.settingsPath ?? claudeSettings();
200
201
  const receiptPath = paths.receiptPath ?? claudeRegistrationReceipt();
201
202
  const version = (paths.detectVersion ?? detectClaudeVersion)();
202
203
  const receipt = readJsonSafe(receiptPath);
@@ -234,9 +235,9 @@ var readToml = (filePath) => {
234
235
  };
235
236
  var inspectConfiguredManagedProviders = (paths = {}) => {
236
237
  const providers = [];
237
- const claudeSettings = readJson(paths.claudeSettingsPath ?? CLAUDE_SETTINGS);
238
- const claudeJson = readJson(paths.claudeJsonPath ?? CLAUDE_JSON);
239
- if (claudeWired({ claudeJson, settings: claudeSettings, skillExists: false })) {
238
+ const claudeSettings2 = readJson(paths.claudeSettingsPath ?? claudeSettings());
239
+ const claudeJson2 = readJson(paths.claudeJsonPath ?? claudeJson());
240
+ if (claudeWired({ claudeJson: claudeJson2, settings: claudeSettings2, skillExists: false })) {
240
241
  providers.push("claude");
241
242
  }
242
243
  const codexConfig = readToml(paths.codexConfigPath ?? codexConfigToml());
@@ -250,13 +251,23 @@ var inspectConfiguredManagedProviders = (paths = {}) => {
250
251
  }
251
252
  return providers;
252
253
  };
253
- var reapplyCodexSettings = (apiKey, paths = {}) => {
254
+ var codexNativeOwnershipFor = (hooksConfig, requested, macAppAvailable) => hooksConfig === null && macAppAvailable ? "preserve" : requested;
255
+ var reapplyCodexSettings = (apiKey, paths = {}, nativeOwnership = "preserve") => {
254
256
  const configPath = paths.configPath ?? codexConfigToml();
255
257
  const hooksPath = paths.hooksPath ?? codexHooksJson();
256
258
  const config = readToml(configPath);
257
259
  const hooksConfig = readJson(hooksPath);
258
260
  const configured = config != null && !!config.mcp_servers?.pushary || hooksConfig != null && hasCodexHooks(hooksConfig);
259
261
  if (!configured) return { configured: false, reapplied: false, hooks: false, mcp: false };
262
+ const startedCommand = config != null && codexMcpStartsCommand(config);
263
+ let mcpWrite = null;
264
+ if (config != null && apiKey) {
265
+ try {
266
+ mcpWrite = addCodexMcpServer(config, apiKey, codexNativeOwnershipFor(hooksConfig, nativeOwnership, paths.macAppAvailable ?? true));
267
+ } catch {
268
+ return { configured: true, reapplied: false, hooks: false, mcp: false, failed: true };
269
+ }
270
+ }
260
271
  const command = guardBinary((paths.resolveBinary ?? resolveGlobalBinary)(CODEX_HOOK_BINARY) ?? CODEX_HOOK_BINARY);
261
272
  let hooks = false;
262
273
  let mcp = false;
@@ -277,12 +288,9 @@ var reapplyCodexSettings = (apiKey, paths = {}) => {
277
288
  dropVacatedCodexHookTrust(config, hooksPath, vacated);
278
289
  addCodexHookTrust(config, hooksPath, command, codexHookPositions(hooksConfig ?? void 0));
279
290
  }
280
- if (apiKey) {
281
- addCodexMcpServer(config, apiKey);
282
- }
283
291
  if (hooks || apiKey) {
284
292
  writeFileAtomic(configPath, stringifyTOML(config), modeToPreserve(configPath), "utf-8");
285
- mcp = Boolean(apiKey);
293
+ mcp = mcpWrite === "wrote-key";
286
294
  }
287
295
  } catch {
288
296
  failed = true;
@@ -290,7 +298,7 @@ var reapplyCodexSettings = (apiKey, paths = {}) => {
290
298
  }
291
299
  }
292
300
  if (config === null) hooks = false;
293
- return { configured: true, reapplied: hooks || mcp, hooks, mcp, failed };
301
+ return { configured: true, reapplied: hooks || mcp, hooks, mcp, failed, ...mcp && startedCommand ? { codexRestartRequired: true } : {} };
294
302
  };
295
303
  var repairCodexHolds = (paths = {}) => {
296
304
  const idle = { configured: false, reapplied: false, hooks: false, mcp: false };
@@ -408,12 +416,13 @@ var KEPT_FOR_APP = { configured: true, reapplied: false, hooks: false, mcp: fals
408
416
  var FAILED_REAPPLY = { configured: false, reapplied: false, hooks: false, mcp: false, failed: true };
409
417
  var noInstructionBlock = () => null;
410
418
  var reapplyAllAgents = (apiKey, options = {}) => {
419
+ const appAvailable = (options.appAvailable ?? macAppBridgeAvailable)();
411
420
  const runners = [
412
421
  { id: "claude", label: "Claude Code", run: () => reapplyClaudeSettings(apiKey), instructions: noInstructionBlock },
413
422
  {
414
423
  id: "codex",
415
424
  label: "Codex",
416
- run: () => reapplyCodexSettings(apiKey),
425
+ run: () => reapplyCodexSettings(apiKey, { macAppAvailable: appAvailable }, "take-over"),
417
426
  instructions: () => ({ file: codexAgentsMd(), body: renderAgentInstructions(CODEX_INSTRUCTIONS_LABEL) })
418
427
  },
419
428
  {
@@ -438,7 +447,6 @@ var reapplyAllAgents = (apiKey, options = {}) => {
438
447
  instructions: () => compatibleInstructionTarget(profile)
439
448
  }))
440
449
  ];
441
- const appAvailable = (options.appAvailable ?? macAppBridgeAvailable)();
442
450
  const done = [];
443
451
  for (const runner of runners) {
444
452
  try {
@@ -1,18 +1,19 @@
1
1
  import {
2
2
  readExistingMachineId
3
- } from "./chunk-M46WDK64.js";
3
+ } from "./chunk-SFAP4AJY.js";
4
4
  import {
5
5
  NetworkError
6
- } from "./chunk-7QLSKOSU.js";
6
+ } from "./chunk-PPY5N2E6.js";
7
7
  import {
8
8
  getBaseUrl
9
- } from "./chunk-4XXZUFWN.js";
9
+ } from "./chunk-BG4Y64FW.js";
10
10
  import {
11
11
  getPackageVersion
12
12
  } from "./chunk-QTOLNRET.js";
13
13
  import {
14
- clientContextHeaders
15
- } from "./chunk-762CDAJJ.js";
14
+ clientContextHeaders,
15
+ redactSecretsFromContent
16
+ } from "./chunk-AXJLJJ3M.js";
16
17
 
17
18
  // src/cli/net.ts
18
19
  import { createRequire } from "module";
@@ -112,8 +113,8 @@ var pusharyFetch = async (url, init = {}) => {
112
113
  } catch (err) {
113
114
  if (isNetworkFailure(err)) {
114
115
  const proxy = proxyFromEnv();
115
- const via = proxy ? ` (via proxy ${proxy})` : "";
116
- throw new NetworkError(`Could not reach ${new URL(url).host}${via}: ${err instanceof Error ? err.message : String(err)}`);
116
+ const via = proxy ? " (via configured proxy)" : "";
117
+ throw new NetworkError(redactSecretsFromContent(`Could not reach ${new URL(url).host}${via}: ${err instanceof Error ? err.message : String(err)}`));
117
118
  }
118
119
  throw err;
119
120
  }
@@ -0,0 +1,41 @@
1
+ import {
2
+ exitCodeFor,
3
+ messageFor
4
+ } from "./chunk-PPY5N2E6.js";
5
+ import {
6
+ EXIT
7
+ } from "./chunk-KZERVKTD.js";
8
+ import {
9
+ redactSecretsFromContent
10
+ } from "./chunk-AXJLJJ3M.js";
11
+
12
+ // src/cli/json.ts
13
+ var writeStdoutFully = (text) => new Promise((resolve, reject) => {
14
+ const settle = (error) => {
15
+ if (!error) process.stdout.off("error", settle);
16
+ if (error && (!("code" in error) || error.code !== "EPIPE")) reject(error);
17
+ else resolve();
18
+ };
19
+ process.stdout.once("error", settle);
20
+ process.stdout.write(text, settle);
21
+ });
22
+ var writeJsonError = async (command, error, argv = process.argv.slice(2)) => {
23
+ const exitCode = exitCodeFor(error);
24
+ const end = argv.indexOf("--");
25
+ const flags = end < 0 ? argv : argv.slice(0, end);
26
+ if (!flags.includes("--json") && !flags.includes("-json")) return { written: false, exitCode };
27
+ await writeStdoutFully(`${JSON.stringify({
28
+ ok: false,
29
+ command,
30
+ reason: exitCode === EXIT.USAGE ? "usage" : "failed",
31
+ message: redactSecretsFromContent(messageFor(error)),
32
+ exitCode
33
+ })}
34
+ `);
35
+ return { written: true, exitCode };
36
+ };
37
+
38
+ export {
39
+ writeStdoutFully,
40
+ writeJsonError
41
+ };
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-POFBE6ZY.js";
4
4
  import {
5
5
  autoUpdateState
6
- } from "./chunk-KZCYHWDF.js";
6
+ } from "./chunk-MWLTTLPK.js";
7
7
  import {
8
8
  readJsonSafe,
9
9
  writeJsonAtomic
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-QTOLNRET.js";
18
18
  import {
19
19
  isAutoUpdateResult
20
- } from "./chunk-762CDAJJ.js";
20
+ } from "./chunk-AXJLJJ3M.js";
21
21
 
22
22
  // src/auto-update.ts
23
23
  import { spawn } from "child_process";
@@ -130,15 +130,6 @@ var readLocalAutoUpdateReport = () => {
130
130
  return null;
131
131
  }
132
132
  };
133
- var parseAutoUpdateFlag = (args) => {
134
- const token = args.find((arg) => arg === AUTO_UPDATE_FLAG || arg.startsWith(`${AUTO_UPDATE_FLAG}=`));
135
- if (token === void 0) return { kind: "absent" };
136
- if (token === AUTO_UPDATE_FLAG) return { kind: "run" };
137
- const value = token.slice(AUTO_UPDATE_FLAG.length + 1);
138
- if (value === "on") return { kind: "set", enabled: true };
139
- if (value === "off") return { kind: "set", enabled: false };
140
- return { kind: "invalid", value };
141
- };
142
133
  var AUTO_UPDATE_RESULT_LABELS = {
143
134
  updated: "updated",
144
135
  finish_pending: "installed; configuration refresh pending",
@@ -209,13 +200,13 @@ var triggerAutoUpdate = (trigger) => {
209
200
 
210
201
  export {
211
202
  AUTO_UPDATE_DISABLE_ENV,
203
+ AUTO_UPDATE_FLAG,
212
204
  isAutoUpdateDisabledByEnv,
213
205
  autoUpdateOffReason,
214
206
  globalInstallLocation,
215
207
  upgradeEntryFor,
216
208
  nextFinishAttempt,
217
209
  readLocalAutoUpdateReport,
218
- parseAutoUpdateFlag,
219
210
  describeAutoUpdateCheck,
220
211
  isUnfinishedAutoUpdate,
221
212
  holdsUnfinishedFinish,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readTranscriptPreference
3
- } from "./chunk-KAJDKYUM.js";
3
+ } from "./chunk-WN3RACVD.js";
4
4
 
5
5
  // src/transcript-setting.ts
6
6
  var transcriptEnvironmentPreference = () => {
@@ -3,24 +3,24 @@ import {
3
3
  expectedLaunchCapabilities,
4
4
  hasSpawnProvider,
5
5
  resolveControlPolicy
6
- } from "./chunk-5PP4455M.js";
6
+ } from "./chunk-G36T5LAP.js";
7
7
  import {
8
8
  daemonHasRemoteProof,
9
9
  daemonServiceManagerAvailable,
10
10
  hasDaemonServiceDefinition,
11
11
  readDaemonNeedsLogin,
12
12
  readDaemonStatus
13
- } from "./chunk-4QF2YLYK.js";
13
+ } from "./chunk-LBHJJEKT.js";
14
14
  import {
15
15
  readControlMode,
16
16
  readKeySource
17
- } from "./chunk-KAJDKYUM.js";
17
+ } from "./chunk-WN3RACVD.js";
18
18
  import {
19
19
  getMachineId
20
- } from "./chunk-M46WDK64.js";
20
+ } from "./chunk-SFAP4AJY.js";
21
21
  import {
22
22
  getBaseUrl
23
- } from "./chunk-4XXZUFWN.js";
23
+ } from "./chunk-BG4Y64FW.js";
24
24
  import {
25
25
  getPackageVersion
26
26
  } from "./chunk-QTOLNRET.js";
@@ -4,10 +4,10 @@ import {
4
4
  keyPrefix,
5
5
  readConfigFileKey,
6
6
  readMacAppKeyPrefix
7
- } from "./chunk-KAJDKYUM.js";
7
+ } from "./chunk-WN3RACVD.js";
8
8
  import {
9
9
  NPX_LATEST_COMMAND
10
- } from "./chunk-BMPZ5HVJ.js";
10
+ } from "./chunk-ERK24P76.js";
11
11
 
12
12
  // src/key-signed-out.ts
13
13
  var VERDICT_BY_CHECK = {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readConfigFileKey
3
- } from "./chunk-KAJDKYUM.js";
3
+ } from "./chunk-WN3RACVD.js";
4
4
 
5
5
  // src/bell/fleet.ts
6
6
  import { closeSync, constants, futimesSync, lstatSync, mkdirSync, openSync, readdirSync, unlinkSync } from "fs";
@@ -384,6 +384,13 @@ var AGENTS = {
384
384
  enforcementDetail: "Shell, edits and MCP calls through native PreToolUse hooks. Grok's own permission checks still apply after a phone approval.",
385
385
  capabilityNote: "Grok fails open if it kills a hook or cannot run it. Setup leaves Grok's permission mode unchanged. Native question and plan dialogs stay in Grok; proactive phone questions use Pushary MCP."
386
386
  },
387
+ grok_bot: {
388
+ ...defaults,
389
+ label: "Grok Bot",
390
+ connectVia: "Grok Bot app plugin (remote MCP connector)",
391
+ setupGuide: "[Grok Bot setup](/docs/agents/guides/grok-bot)",
392
+ capabilityNote: "Grok Bot keeps its own approval cards, and Pushary cannot stop a Bot in the middle of a task. A question nobody answers expires after about ten minutes and is never treated as a yes."
393
+ },
387
394
  windsurf: {
388
395
  ...defaults,
389
396
  label: "Windsurf",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  NPX_LATEST_COMMAND
3
- } from "./chunk-BMPZ5HVJ.js";
3
+ } from "./chunk-ERK24P76.js";
4
4
 
5
5
  // src/config.ts
6
6
  import { readFileSync } from "fs";
@@ -2,23 +2,24 @@ import {
2
2
  CLAUDE_HOOK_EVENTS,
3
3
  GEMINI_HOOK_EVENTS,
4
4
  hasGeminiHooks
5
- } from "./chunk-TDOKDCFH.js";
5
+ } from "./chunk-RGSW36XH.js";
6
6
  import {
7
7
  AGENT_CHOICES
8
- } from "./chunk-75UYYIFJ.js";
8
+ } from "./chunk-XV6S5PWW.js";
9
9
  import {
10
10
  BELL_HOOK_BINARY
11
- } from "./chunk-AS4Z6KS4.js";
11
+ } from "./chunk-IFPOHFDJ.js";
12
12
  import {
13
13
  CODEX_HOOK_EVENTS,
14
+ HOOK_SHELL,
14
15
  hasCodexHooks,
15
16
  holdBudgetOf
16
- } from "./chunk-KZCYHWDF.js";
17
+ } from "./chunk-MWLTTLPK.js";
17
18
  import {
18
19
  CURSOR_GATE_EVENTS,
19
20
  HOOK_LOCATOR_BINARY,
20
21
  hookCommandHoldBudget
21
- } from "./chunk-762CDAJJ.js";
22
+ } from "./chunk-AXJLJJ3M.js";
22
23
 
23
24
  // src/diagnostics/bridge.ts
24
25
  import { execFileSync } from "child_process";
@@ -101,9 +102,10 @@ var record = (value) => value && typeof value === "object" && !Array.isArray(val
101
102
  var CLAUDE_HOOK_BINARY = /pushary-[a-z-]*hook/;
102
103
  var EXACT_HOOK_BINARY = /^pushary-[a-z-]*(hook|gate)$/;
103
104
  var pusharyHookExecutable = (command) => {
104
- const tokens = command.match(/"[^"]*"|'[^']*'|\S+/g) ?? [];
105
+ const tokens = command.match(/"(?:\\.|[^"\\])*"|'[^']*'|\S+/g) ?? [];
105
106
  for (const raw of tokens.reverse()) {
106
- const token = raw[0] === '"' && raw.at(-1) === '"' || raw[0] === "'" && raw.at(-1) === "'" ? raw.slice(1, -1) : raw;
107
+ const unquoted = raw[0] === '"' && raw.at(-1) === '"' || raw[0] === "'" && raw.at(-1) === "'" ? raw.slice(1, -1) : raw;
108
+ const token = command.startsWith(`${HOOK_SHELL} `) && raw[0] === '"' ? unquoted.replace(/\\(["\\$`])/g, "$1") : unquoted;
107
109
  const name = token.split(/[/\\]/).pop()?.replace(/\.(cmd|exe|mjs)$/i, "") ?? "";
108
110
  if (name === HOOK_LOCATOR_BINARY || EXACT_HOOK_BINARY.test(name)) return token;
109
111
  }
@@ -8,13 +8,13 @@ import {
8
8
  everyProgramFileIsThere,
9
9
  installedCodexApp,
10
10
  shellQuoted
11
- } from "./chunk-CPRA7IEK.js";
11
+ } from "./chunk-PITQ5ZIQ.js";
12
12
  import {
13
13
  writeHuman
14
14
  } from "./chunk-QCGNGEGE.js";
15
15
  import {
16
16
  xml
17
- } from "./chunk-4QF2YLYK.js";
17
+ } from "./chunk-LBHJJEKT.js";
18
18
  import {
19
19
  CODEX_APP_LAUNCH_AT_LOGIN_VERB,
20
20
  CODEX_APP_LAUNCH_VARIABLE
@@ -7,10 +7,10 @@ import {
7
7
  codexHome,
8
8
  codexHooksJsonIn,
9
9
  isPusharyCodexCommand
10
- } from "./chunk-KZCYHWDF.js";
10
+ } from "./chunk-MWLTTLPK.js";
11
11
  import {
12
12
  resolvePathBinary
13
- } from "./chunk-US3IT6ZC.js";
13
+ } from "./chunk-CJ5TCFD4.js";
14
14
  import {
15
15
  getPackageVersion
16
16
  } from "./chunk-QTOLNRET.js";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  notificationAnswerStep
3
- } from "./chunk-2FVP7WRP.js";
3
+ } from "./chunk-HUI4OE43.js";
4
4
  import {
5
5
  matchMacAccountStep,
6
6
  retryAgentCommand
7
- } from "./chunk-6ONSTCDJ.js";
7
+ } from "./chunk-4VRTSDGP.js";
8
8
  import {
9
9
  EXIT
10
10
  } from "./chunk-KZERVKTD.js";
11
11
  import {
12
12
  NPX_LATEST_COMMAND
13
- } from "./chunk-BMPZ5HVJ.js";
13
+ } from "./chunk-ERK24P76.js";
14
14
 
15
15
  // src/setup/closing.ts
16
16
  var ACTIVITY_URL = "pushary.com/dashboard/agent/activity";
@@ -12,6 +12,9 @@ import {
12
12
  ownPackageName
13
13
  } from "./chunk-QTOLNRET.js";
14
14
 
15
+ // src/shell-quote.ts
16
+ var shellDoubleQuoted = (text) => `"${text.replace(/(["\\$`])/g, "\\$1")}"`;
17
+
15
18
  // src/npm.ts
16
19
  import { promisify } from "util";
17
20
  import { exec, execFile, execFileSync, execSync } from "child_process";
@@ -320,7 +323,10 @@ var resolveGlobalBinDir = (probe) => {
320
323
  const resolved = resolveGlobalBinary(probe);
321
324
  return resolved ? resolved.slice(0, resolved.length - probe.length - 1) : void 0;
322
325
  };
323
- var quoteIfNeeded = (path) => /\s/.test(path) ? `"${path}"` : path;
326
+ var quoteIfNeeded = (path, platform = process.platform) => {
327
+ if (platform === "win32") return /\s/.test(path) ? `"${path}"` : path;
328
+ return /^[\w@%+=:,./-]+$/.test(path) ? path : shellDoubleQuoted(path);
329
+ };
324
330
  var fetchLatestPublishedVersion = async (request) => {
325
331
  try {
326
332
  const response = await (request.fetchImpl ?? fetch)(latestReleaseUrl(request.packageName), {
@@ -360,9 +366,9 @@ var installGlobally = (options) => {
360
366
  }
361
367
  const started = (async () => {
362
368
  if (!npmIsOnPath()) throw new NpmMissingError();
363
- const { withUpgradeLock } = await import("./global-upgrade-YWIVJIUR.js");
364
- const { installWithUpgradeLock, ownsUpgradeLock } = await import("./upgrade-lock-TJPKU5HL.js");
365
- const { autoUpdateLock } = await import("./paths-ES3V7BWQ.js");
369
+ const { withUpgradeLock } = await import("./global-upgrade-IUXJJDWF.js");
370
+ const { installWithUpgradeLock, ownsUpgradeLock } = await import("./upgrade-lock-DDB7WEWC.js");
371
+ const { autoUpdateLock } = await import("./paths-A5GAR5PL.js");
366
372
  let result = "skipped";
367
373
  const install = async () => {
368
374
  const platform = process.platform;
@@ -395,6 +401,7 @@ var installGlobally = (options) => {
395
401
  };
396
402
 
397
403
  export {
404
+ shellDoubleQuoted,
398
405
  LATEST_TAG,
399
406
  cleanNpmEnv,
400
407
  npmErrorMessage,
@@ -2,10 +2,10 @@ import {
2
2
  IDLE_PROMPT_NOTIFICATION,
3
3
  NOTIFICATION_PUSH_TYPES,
4
4
  POSTTOOLUSE_MIRROR_ONLY_TOOLS
5
- } from "./chunk-W47WL6JY.js";
5
+ } from "./chunk-33OOEVPG.js";
6
6
  import {
7
7
  repoKeyFor
8
- } from "./chunk-XGP5VSQG.js";
8
+ } from "./chunk-YPD3MTFU.js";
9
9
  import {
10
10
  cancelQuestion,
11
11
  clientErrorKindOf,
@@ -13,26 +13,26 @@ import {
13
13
  reportClientError,
14
14
  sendNotification,
15
15
  waitForAnswer
16
- } from "./chunk-WW24SG27.js";
16
+ } from "./chunk-RJHX66EY.js";
17
17
  import {
18
18
  withRetry
19
- } from "./chunk-5EFNBL6V.js";
19
+ } from "./chunk-XAO6EYGM.js";
20
20
  import {
21
21
  getMachineId
22
- } from "./chunk-M46WDK64.js";
22
+ } from "./chunk-SFAP4AJY.js";
23
23
  import {
24
24
  reportedInstallSource
25
- } from "./chunk-3RKIJM26.js";
25
+ } from "./chunk-Y5VKZNFN.js";
26
26
  import {
27
27
  canonicalJson
28
- } from "./chunk-KZCYHWDF.js";
28
+ } from "./chunk-MWLTTLPK.js";
29
29
  import {
30
30
  writeFileAtomic
31
31
  } from "./chunk-QENTGE75.js";
32
32
  import {
33
33
  getApiKey,
34
34
  getBaseUrl
35
- } from "./chunk-4XXZUFWN.js";
35
+ } from "./chunk-BG4Y64FW.js";
36
36
  import {
37
37
  ACTION_BODY_MAX,
38
38
  AGENTS,
@@ -66,7 +66,7 @@ import {
66
66
  toToolLookup,
67
67
  truncateLine,
68
68
  unansweredRefusalReason
69
- } from "./chunk-762CDAJJ.js";
69
+ } from "./chunk-AXJLJJ3M.js";
70
70
 
71
71
  // ../hook-mapping/src/describe.ts
72
72
  import { isAbsolute, relative, resolve } from "path";
@@ -224,6 +224,7 @@ var parseApplyPatchFiles = (command) => [...new Set(parseApplyPatchOps(command).
224
224
  var patchDeletesFiles = (toolName, toolInput) => toolName === "apply_patch" && parseApplyPatchOps(toolInput.command).some((entry) => entry.op === "delete");
225
225
  var OPENCODE_TOOL_NAMES = {
226
226
  bash: "Bash",
227
+ shell: "Bash",
227
228
  // A shell command reaching outside the worktree asks a second time under its
228
229
  // own key. It is still the same command, and still Bash.
229
230
  external_directory: "Bash",
@@ -236,7 +237,8 @@ var OPENCODE_TOOL_NAMES = {
236
237
  grep: "Grep",
237
238
  webfetch: "WebFetch",
238
239
  websearch: "WebSearch",
239
- task: "Task"
240
+ task: "Task",
241
+ subagent: "Task"
240
242
  };
241
243
  var PATCH_ARG_KEYS = ["command", "patch", "input"];
242
244
  var patchedFilesIn = (input) => [...new Set(PATCH_ARG_KEYS.flatMap((key) => parseApplyPatchFiles(input[key])))];
@@ -3,11 +3,11 @@ import {
3
3
  decodePublicKey,
4
4
  generateSessionKey,
5
5
  wrapSessionKey
6
- } from "./chunk-PVANKDWM.js";
6
+ } from "./chunk-2AELPDMT.js";
7
7
  import {
8
8
  fetchTranscriptRecipients,
9
9
  uploadTranscriptRecords
10
- } from "./chunk-3N2ZTHZZ.js";
10
+ } from "./chunk-GAMVAORR.js";
11
11
 
12
12
  // src/live-session.ts
13
13
  var MAX_TRANSCRIPT_QUEUE = 100;