@pushary/agent-hooks 0.86.0 → 0.87.1

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 (65) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/data/SKILL.md +31 -11
  3. package/data/cursor-plugin/.cursor-plugin/plugin.json +1 -1
  4. package/data/cursor-plugin/rules/pushary.mdc +2 -2
  5. package/data/cursor-plugin/skills/pushary/SKILL.md +30 -10
  6. package/data/vscode-plugin/.claude-plugin/plugin.json +1 -1
  7. package/data/vscode-plugin/skills/pushary/SKILL.md +30 -10
  8. package/dist/bin/pushary-bell-hook.js +4 -4
  9. package/dist/bin/pushary-bell.js +6 -6
  10. package/dist/bin/pushary-claude.js +12 -10
  11. package/dist/bin/pushary-clean.js +6 -6
  12. package/dist/bin/pushary-codex-bridge.js +5 -5
  13. package/dist/bin/pushary-codex-hook.js +13 -29
  14. package/dist/bin/pushary-codex.js +6 -4
  15. package/dist/bin/pushary-connect.js +6 -6
  16. package/dist/bin/pushary-daemon.js +4 -4
  17. package/dist/bin/pushary-disconnect.js +22 -8
  18. package/dist/bin/pushary-doctor.js +21 -15
  19. package/dist/bin/pushary-elicitation-hook.d.ts +1 -0
  20. package/dist/bin/pushary-elicitation-hook.js +210 -0
  21. package/dist/bin/pushary-gemini-bridge.js +5 -5
  22. package/dist/bin/pushary-gemini-hook.js +10 -8
  23. package/dist/bin/pushary-hook.js +6 -5
  24. package/dist/bin/pushary-login.js +4 -4
  25. package/dist/bin/pushary-logout.js +4 -4
  26. package/dist/bin/pushary-mode.js +3 -3
  27. package/dist/bin/pushary-notification-hook.js +4 -3
  28. package/dist/bin/pushary-permission-denied-hook.js +6 -5
  29. package/dist/bin/pushary-permission-hook.js +6 -5
  30. package/dist/bin/pushary-post-hook.js +4 -3
  31. package/dist/bin/pushary-prompt-hook.js +4 -3
  32. package/dist/bin/pushary-session-end-hook.js +4 -3
  33. package/dist/bin/pushary-session-start-hook.js +4 -3
  34. package/dist/bin/pushary-setup.js +19 -15
  35. package/dist/bin/pushary-stats.js +2 -2
  36. package/dist/bin/pushary-status.js +5 -5
  37. package/dist/bin/pushary-stop-hook.js +4 -3
  38. package/dist/bin/pushary-stopfailure-hook.js +4 -3
  39. package/dist/bin/pushary-upgrade.js +8 -7
  40. package/dist/bin/pushary-wait.js +3 -3
  41. package/dist/{chunk-5EUZYWID.js → chunk-2T3GX7WG.js} +1 -1
  42. package/dist/{chunk-GK4CED6Z.js → chunk-5646VKR4.js} +7 -3
  43. package/dist/{chunk-MNQI6ZZU.js → chunk-7MBDFNUC.js} +1 -1
  44. package/dist/{chunk-CY4TZK5O.js → chunk-7YJS2VTG.js} +31 -4
  45. package/dist/{chunk-PZR4XMFU.js → chunk-A3PFIWWN.js} +1 -1
  46. package/dist/{chunk-2TZCZ7CL.js → chunk-A4I5JGCW.js} +1 -1
  47. package/dist/{chunk-VPJAAGD4.js → chunk-B3V2H6SA.js} +37 -17
  48. package/dist/{chunk-XPAGN3SC.js → chunk-ECEUMWBH.js} +1 -1
  49. package/dist/{chunk-2255DZ74.js → chunk-HAUTLCMA.js} +1 -1
  50. package/dist/{chunk-S3UD7O35.js → chunk-HJ44HIUW.js} +12 -28
  51. package/dist/chunk-J3YDT4HM.js +128 -0
  52. package/dist/{chunk-N52CIK47.js → chunk-JAICP7BA.js} +1 -1
  53. package/dist/{chunk-QW27ZFA4.js → chunk-LT2VLPUK.js} +2 -2
  54. package/dist/{chunk-HSGEEBBL.js → chunk-M7RYIZX6.js} +3 -3
  55. package/dist/{chunk-7G5VO76N.js → chunk-OT4YD54Q.js} +1 -1
  56. package/dist/{chunk-VZNDR3Z7.js → chunk-QBWYNVKY.js} +1 -1
  57. package/dist/{chunk-MTKR4YLW.js → chunk-SJVLFIYP.js} +1 -1
  58. package/dist/{chunk-33T5OOKP.js → chunk-V2XPF77V.js} +96 -161
  59. package/dist/{chunk-FOY5FISQ.js → chunk-WLLBFDVY.js} +1 -1
  60. package/dist/{chunk-Q7N3XGWM.js → chunk-XW5CHAQX.js} +2 -2
  61. package/dist/{chunk-7C5CJC3H.js → chunk-Y3UTTFTZ.js} +1 -1
  62. package/dist/{chunk-2C6B6V2U.js → chunk-ZZE6FN7T.js} +1 -1
  63. package/dist/src/index.d.ts +2 -2
  64. package/dist/src/index.js +10 -8
  65. package/package.json +3 -1
@@ -4,15 +4,16 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleNotification
7
- } from "../chunk-33T5OOKP.js";
7
+ } from "../chunk-V2XPF77V.js";
8
+ import "../chunk-J3YDT4HM.js";
8
9
  import "../chunk-RN3NOEJF.js";
9
10
  import "../chunk-BSZYIAZL.js";
10
11
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-7C5CJC3H.js";
12
+ import "../chunk-Y3UTTFTZ.js";
12
13
  import "../chunk-7QLSKOSU.js";
13
14
  import "../chunk-KZERVKTD.js";
14
15
  import "../chunk-2UMNXADU.js";
15
- import "../chunk-CY4TZK5O.js";
16
+ import "../chunk-7YJS2VTG.js";
16
17
 
17
18
  // bin/pushary-notification-hook.ts
18
19
  var main = async () => {
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionDenied
4
- } from "../chunk-S3UD7O35.js";
4
+ } from "../chunk-HJ44HIUW.js";
5
5
  import "../chunk-ATBKJNWS.js";
6
- import "../chunk-MNQI6ZZU.js";
6
+ import "../chunk-7MBDFNUC.js";
7
7
  import {
8
8
  readHookInput
9
9
  } from "../chunk-6CUUA7HO.js";
10
10
  import "../chunk-YHG74UFF.js";
11
- import "../chunk-33T5OOKP.js";
11
+ import "../chunk-V2XPF77V.js";
12
+ import "../chunk-J3YDT4HM.js";
12
13
  import "../chunk-RN3NOEJF.js";
13
14
  import "../chunk-BSZYIAZL.js";
14
15
  import "../chunk-SAF6HGAA.js";
15
- import "../chunk-7C5CJC3H.js";
16
+ import "../chunk-Y3UTTFTZ.js";
16
17
  import "../chunk-7QLSKOSU.js";
17
18
  import "../chunk-KZERVKTD.js";
18
19
  import "../chunk-2UMNXADU.js";
19
- import "../chunk-CY4TZK5O.js";
20
+ import "../chunk-7YJS2VTG.js";
20
21
 
21
22
  // bin/pushary-permission-denied-hook.ts
22
23
  var main = async () => {
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionRequest
4
- } from "../chunk-S3UD7O35.js";
4
+ } from "../chunk-HJ44HIUW.js";
5
5
  import "../chunk-ATBKJNWS.js";
6
- import "../chunk-MNQI6ZZU.js";
6
+ import "../chunk-7MBDFNUC.js";
7
7
  import {
8
8
  readHookInput
9
9
  } from "../chunk-6CUUA7HO.js";
10
10
  import "../chunk-YHG74UFF.js";
11
- import "../chunk-33T5OOKP.js";
11
+ import "../chunk-V2XPF77V.js";
12
+ import "../chunk-J3YDT4HM.js";
12
13
  import "../chunk-RN3NOEJF.js";
13
14
  import "../chunk-BSZYIAZL.js";
14
15
  import "../chunk-SAF6HGAA.js";
15
- import "../chunk-7C5CJC3H.js";
16
+ import "../chunk-Y3UTTFTZ.js";
16
17
  import "../chunk-7QLSKOSU.js";
17
18
  import "../chunk-KZERVKTD.js";
18
19
  import "../chunk-2UMNXADU.js";
19
- import "../chunk-CY4TZK5O.js";
20
+ import "../chunk-7YJS2VTG.js";
20
21
 
21
22
  // bin/pushary-permission-hook.ts
22
23
  var main = async () => {
@@ -4,15 +4,16 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handlePostToolUse
7
- } from "../chunk-33T5OOKP.js";
7
+ } from "../chunk-V2XPF77V.js";
8
+ import "../chunk-J3YDT4HM.js";
8
9
  import "../chunk-RN3NOEJF.js";
9
10
  import "../chunk-BSZYIAZL.js";
10
11
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-7C5CJC3H.js";
12
+ import "../chunk-Y3UTTFTZ.js";
12
13
  import "../chunk-7QLSKOSU.js";
13
14
  import "../chunk-KZERVKTD.js";
14
15
  import "../chunk-2UMNXADU.js";
15
- import "../chunk-CY4TZK5O.js";
16
+ import "../chunk-7YJS2VTG.js";
16
17
 
17
18
  // bin/pushary-post-hook.ts
18
19
  var main = async () => {
@@ -4,15 +4,16 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleUserPrompt
7
- } from "../chunk-33T5OOKP.js";
7
+ } from "../chunk-V2XPF77V.js";
8
+ import "../chunk-J3YDT4HM.js";
8
9
  import "../chunk-RN3NOEJF.js";
9
10
  import "../chunk-BSZYIAZL.js";
10
11
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-7C5CJC3H.js";
12
+ import "../chunk-Y3UTTFTZ.js";
12
13
  import "../chunk-7QLSKOSU.js";
13
14
  import "../chunk-KZERVKTD.js";
14
15
  import "../chunk-2UMNXADU.js";
15
- import "../chunk-CY4TZK5O.js";
16
+ import "../chunk-7YJS2VTG.js";
16
17
 
17
18
  // bin/pushary-prompt-hook.ts
18
19
  var main = async () => {
@@ -4,15 +4,16 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleSessionEnd
7
- } from "../chunk-33T5OOKP.js";
7
+ } from "../chunk-V2XPF77V.js";
8
+ import "../chunk-J3YDT4HM.js";
8
9
  import "../chunk-RN3NOEJF.js";
9
10
  import "../chunk-BSZYIAZL.js";
10
11
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-7C5CJC3H.js";
12
+ import "../chunk-Y3UTTFTZ.js";
12
13
  import "../chunk-7QLSKOSU.js";
13
14
  import "../chunk-KZERVKTD.js";
14
15
  import "../chunk-2UMNXADU.js";
15
- import "../chunk-CY4TZK5O.js";
16
+ import "../chunk-7YJS2VTG.js";
16
17
 
17
18
  // bin/pushary-session-end-hook.ts
18
19
  var main = async () => {
@@ -4,15 +4,16 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleSessionStart
7
- } from "../chunk-33T5OOKP.js";
7
+ } from "../chunk-V2XPF77V.js";
8
+ import "../chunk-J3YDT4HM.js";
8
9
  import "../chunk-RN3NOEJF.js";
9
10
  import "../chunk-BSZYIAZL.js";
10
11
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-7C5CJC3H.js";
12
+ import "../chunk-Y3UTTFTZ.js";
12
13
  import "../chunk-7QLSKOSU.js";
13
14
  import "../chunk-KZERVKTD.js";
14
15
  import "../chunk-2UMNXADU.js";
15
- import "../chunk-CY4TZK5O.js";
16
+ import "../chunk-7YJS2VTG.js";
16
17
 
17
18
  // bin/pushary-session-start-hook.ts
18
19
  var main = async () => {
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  detectClaudeVersion
4
- } from "../chunk-2255DZ74.js";
4
+ } from "../chunk-HAUTLCMA.js";
5
5
  import {
6
6
  claudeWired,
7
7
  codexWired,
8
8
  geminiWired
9
- } from "../chunk-Q7N3XGWM.js";
9
+ } from "../chunk-XW5CHAQX.js";
10
10
  import {
11
11
  runBrowserLogin
12
12
  } from "../chunk-Z3Z4VK5F.js";
13
13
  import {
14
14
  ensureDaemonRunning
15
- } from "../chunk-MTKR4YLW.js";
15
+ } from "../chunk-SJVLFIYP.js";
16
16
  import {
17
17
  addClaudeMcpServer,
18
18
  addPusharyHooks,
19
19
  addPusharyToolPermissions,
20
20
  compareVersion,
21
21
  parseVersion
22
- } from "../chunk-GK4CED6Z.js";
22
+ } from "../chunk-5646VKR4.js";
23
23
  import {
24
24
  describeDetection,
25
25
  detectAllAgents,
@@ -31,17 +31,17 @@ import {
31
31
  shortenHome,
32
32
  vscodeSettingsTargets,
33
33
  writeInstructionBlock
34
- } from "../chunk-QW27ZFA4.js";
34
+ } from "../chunk-LT2VLPUK.js";
35
35
  import {
36
36
  GEMINI_HOOK_BINARY,
37
37
  addGeminiHooks,
38
38
  addGeminiMcpServer
39
- } from "../chunk-2C6B6V2U.js";
39
+ } from "../chunk-ZZE6FN7T.js";
40
40
  import "../chunk-ATBKJNWS.js";
41
41
  import {
42
42
  guardBinary,
43
43
  guardNodeScript
44
- } from "../chunk-HSGEEBBL.js";
44
+ } from "../chunk-M7RYIZX6.js";
45
45
  import "../chunk-XHKBHWLX.js";
46
46
  import {
47
47
  installGlobally,
@@ -59,6 +59,7 @@ import {
59
59
  codexAgentsMd2 as codexAgentsMd,
60
60
  codexConfigToml,
61
61
  codexHome,
62
+ codexHookPositions,
62
63
  codexSkillDir2 as codexSkillDir,
63
64
  cursorPluginDir,
64
65
  cursorUserHooks,
@@ -66,10 +67,11 @@ import {
66
67
  geminiSettings,
67
68
  pusharyConfigFile,
68
69
  vscodePluginDir
69
- } from "../chunk-VPJAAGD4.js";
70
+ } from "../chunk-B3V2H6SA.js";
70
71
  import {
71
72
  reportEvent
72
- } from "../chunk-33T5OOKP.js";
73
+ } from "../chunk-V2XPF77V.js";
74
+ import "../chunk-J3YDT4HM.js";
73
75
  import "../chunk-RN3NOEJF.js";
74
76
  import {
75
77
  confirmAppConnection,
@@ -79,12 +81,12 @@ import {
79
81
  printConnectInstructions,
80
82
  setHumanStream,
81
83
  verifyRoundTrip
82
- } from "../chunk-PZR4XMFU.js";
84
+ } from "../chunk-A3PFIWWN.js";
83
85
  import "../chunk-3EGEA4KH.js";
84
86
  import {
85
87
  checkApiKey,
86
88
  describeKeyCheck
87
- } from "../chunk-2TZCZ7CL.js";
89
+ } from "../chunk-A4I5JGCW.js";
88
90
  import {
89
91
  useColor
90
92
  } from "../chunk-5RUIFDTP.js";
@@ -95,7 +97,7 @@ import {
95
97
  readConfigFileKey,
96
98
  readKeySource,
97
99
  writeKey
98
- } from "../chunk-7G5VO76N.js";
100
+ } from "../chunk-OT4YD54Q.js";
99
101
  import {
100
102
  parseFlags
101
103
  } from "../chunk-GMXKITVA.js";
@@ -118,7 +120,7 @@ import {
118
120
  } from "../chunk-6MTNS63X.js";
119
121
  import "../chunk-BSZYIAZL.js";
120
122
  import "../chunk-SAF6HGAA.js";
121
- import "../chunk-7C5CJC3H.js";
123
+ import "../chunk-Y3UTTFTZ.js";
122
124
  import {
123
125
  UsageError
124
126
  } from "../chunk-7QLSKOSU.js";
@@ -128,7 +130,7 @@ import {
128
130
  import "../chunk-2UMNXADU.js";
129
131
  import {
130
132
  isValidApiKey
131
- } from "../chunk-CY4TZK5O.js";
133
+ } from "../chunk-7YJS2VTG.js";
132
134
 
133
135
  // bin/pushary-setup.ts
134
136
  import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync, rmSync, renameSync, realpathSync, readdirSync, statSync } from "fs";
@@ -941,10 +943,12 @@ var setupCodex = async (apiKey) => {
941
943
  let trusted = false;
942
944
  if (hooksSupported) {
943
945
  const hookCommand = guardBinary(resolveGlobalBinary("pushary-codex-hook") ?? "pushary-codex-hook");
946
+ let hookPositions = {};
944
947
  await spinner("Adding native hooks (~/.codex/hooks.json)", async () => {
945
948
  const hooksConfig = readAgentJson(CODEX_HOOKS_JSON);
946
949
  addCodexHooks(hooksConfig, hookCommand);
947
950
  writeJson(CODEX_HOOKS_JSON, hooksConfig);
951
+ hookPositions = codexHookPositions(hooksConfig);
948
952
  });
949
953
  if (trustAuto) {
950
954
  await spinner("Trusting the Pushary hook (skips the /hooks step)", async () => {
@@ -954,7 +958,7 @@ var setupCodex = async (apiKey) => {
954
958
  } catch {
955
959
  }
956
960
  const config = raw ? parseTOML(raw) : {};
957
- addCodexHookTrust(config, CODEX_HOOKS_JSON, hookCommand);
961
+ addCodexHookTrust(config, CODEX_HOOKS_JSON, hookCommand, hookPositions);
958
962
  writeFileSync(codexConfig, stringifyTOML(config), "utf-8");
959
963
  trusted = true;
960
964
  }, { optional: true });
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  readLedgerSummary
4
- } from "../chunk-MNQI6ZZU.js";
4
+ } from "../chunk-7MBDFNUC.js";
5
5
  import {
6
6
  exitOnHelpFlag
7
7
  } from "../chunk-SQOFGPNX.js";
@@ -11,7 +11,7 @@ import "../chunk-KZERVKTD.js";
11
11
  import {
12
12
  getApiKey
13
13
  } from "../chunk-2UMNXADU.js";
14
- import "../chunk-CY4TZK5O.js";
14
+ import "../chunk-7YJS2VTG.js";
15
15
 
16
16
  // bin/pushary-stats.ts
17
17
  exitOnHelpFlag("stats");
@@ -8,18 +8,18 @@ import {
8
8
  describeReach,
9
9
  fetchChannels,
10
10
  reachVerdict
11
- } from "../chunk-PZR4XMFU.js";
11
+ } from "../chunk-A3PFIWWN.js";
12
12
  import "../chunk-3EGEA4KH.js";
13
13
  import {
14
14
  checkApiKey,
15
15
  describeKeyCheck
16
- } from "../chunk-2TZCZ7CL.js";
16
+ } from "../chunk-A4I5JGCW.js";
17
17
  import {
18
18
  createIo
19
19
  } from "../chunk-5RUIFDTP.js";
20
20
  import {
21
21
  readKeySource
22
- } from "../chunk-7G5VO76N.js";
22
+ } from "../chunk-OT4YD54Q.js";
23
23
  import {
24
24
  rejectUnknownFlags
25
25
  } from "../chunk-GMXKITVA.js";
@@ -32,7 +32,7 @@ import "../chunk-DINDL2CF.js";
32
32
  import "../chunk-6MTNS63X.js";
33
33
  import "../chunk-BSZYIAZL.js";
34
34
  import "../chunk-SAF6HGAA.js";
35
- import "../chunk-7C5CJC3H.js";
35
+ import "../chunk-Y3UTTFTZ.js";
36
36
  import {
37
37
  UsageError
38
38
  } from "../chunk-7QLSKOSU.js";
@@ -40,7 +40,7 @@ import {
40
40
  EXIT
41
41
  } from "../chunk-KZERVKTD.js";
42
42
  import "../chunk-2UMNXADU.js";
43
- import "../chunk-CY4TZK5O.js";
43
+ import "../chunk-7YJS2VTG.js";
44
44
 
45
45
  // src/status.ts
46
46
  var keySourceLine = (source) => {
@@ -4,15 +4,16 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleStop
7
- } from "../chunk-33T5OOKP.js";
7
+ } from "../chunk-V2XPF77V.js";
8
+ import "../chunk-J3YDT4HM.js";
8
9
  import "../chunk-RN3NOEJF.js";
9
10
  import "../chunk-BSZYIAZL.js";
10
11
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-7C5CJC3H.js";
12
+ import "../chunk-Y3UTTFTZ.js";
12
13
  import "../chunk-7QLSKOSU.js";
13
14
  import "../chunk-KZERVKTD.js";
14
15
  import "../chunk-2UMNXADU.js";
15
- import "../chunk-CY4TZK5O.js";
16
+ import "../chunk-7YJS2VTG.js";
16
17
 
17
18
  // bin/pushary-stop-hook.ts
18
19
  var main = async () => {
@@ -4,15 +4,16 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleStopFailure
7
- } from "../chunk-33T5OOKP.js";
7
+ } from "../chunk-V2XPF77V.js";
8
+ import "../chunk-J3YDT4HM.js";
8
9
  import "../chunk-RN3NOEJF.js";
9
10
  import "../chunk-BSZYIAZL.js";
10
11
  import "../chunk-SAF6HGAA.js";
11
- import "../chunk-7C5CJC3H.js";
12
+ import "../chunk-Y3UTTFTZ.js";
12
13
  import "../chunk-7QLSKOSU.js";
13
14
  import "../chunk-KZERVKTD.js";
14
15
  import "../chunk-2UMNXADU.js";
15
- import "../chunk-CY4TZK5O.js";
16
+ import "../chunk-7YJS2VTG.js";
16
17
 
17
18
  // bin/pushary-stopfailure-hook.ts
18
19
  var main = async () => {
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  detectClaudeVersion
4
- } from "../chunk-2255DZ74.js";
4
+ } from "../chunk-HAUTLCMA.js";
5
5
  import {
6
6
  addClaudeMcpServer,
7
7
  addPusharyHooks,
8
8
  addPusharyToolPermissions
9
- } from "../chunk-GK4CED6Z.js";
9
+ } from "../chunk-5646VKR4.js";
10
10
  import {
11
11
  GEMINI_HOOK_BINARY,
12
12
  addGeminiHooks,
13
13
  addGeminiMcpServer,
14
14
  hasGeminiHooks
15
- } from "../chunk-2C6B6V2U.js";
15
+ } from "../chunk-ZZE6FN7T.js";
16
16
  import "../chunk-ATBKJNWS.js";
17
17
  import {
18
18
  guardBinary
19
- } from "../chunk-HSGEEBBL.js";
19
+ } from "../chunk-M7RYIZX6.js";
20
20
  import {
21
21
  execNpm,
22
22
  npmErrorMessage,
@@ -30,13 +30,14 @@ import {
30
30
  addCodexMcpServer,
31
31
  claudeJson,
32
32
  codexConfigToml,
33
+ codexHookPositions,
33
34
  codexHooksJson,
34
35
  cursorPluginDir,
35
36
  geminiSettings,
36
37
  hasCodexHooks,
37
38
  vscodePluginDir,
38
39
  vscodePluginMcp
39
- } from "../chunk-VPJAAGD4.js";
40
+ } from "../chunk-B3V2H6SA.js";
40
41
  import {
41
42
  exitOnHelpFlag
42
43
  } from "../chunk-SQOFGPNX.js";
@@ -51,7 +52,7 @@ import "../chunk-KZERVKTD.js";
51
52
  import {
52
53
  getApiKey
53
54
  } from "../chunk-2UMNXADU.js";
54
- import "../chunk-CY4TZK5O.js";
55
+ import "../chunk-7YJS2VTG.js";
55
56
 
56
57
  // bin/pushary-upgrade.ts
57
58
  import { existsSync as existsSync2 } from "fs";
@@ -138,7 +139,7 @@ var reapplyCodexSettings = (apiKey, paths = {}) => {
138
139
  }
139
140
  if (config != null) {
140
141
  try {
141
- if (hooks) addCodexHookTrust(config, hooksPath, command);
142
+ if (hooks) addCodexHookTrust(config, hooksPath, command, codexHookPositions(hooksConfig ?? void 0));
142
143
  if (apiKey) {
143
144
  addCodexMcpServer(config, apiKey);
144
145
  mcp = true;
@@ -4,8 +4,8 @@ import {
4
4
  } from "../chunk-IIENZE2J.js";
5
5
  import {
6
6
  exitOnFailedResponse
7
- } from "../chunk-N52CIK47.js";
8
- import "../chunk-2TZCZ7CL.js";
7
+ } from "../chunk-JAICP7BA.js";
8
+ import "../chunk-A4I5JGCW.js";
9
9
  import {
10
10
  createIo
11
11
  } from "../chunk-5RUIFDTP.js";
@@ -28,7 +28,7 @@ import {
28
28
  getApiKey,
29
29
  getBaseUrl
30
30
  } from "../chunk-2UMNXADU.js";
31
- import "../chunk-CY4TZK5O.js";
31
+ import "../chunk-7YJS2VTG.js";
32
32
 
33
33
  // bin/pushary-wait.ts
34
34
  exitOnHelpFlag("wait");
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  readConfigFileKey
3
- } from "./chunk-7G5VO76N.js";
3
+ } from "./chunk-OT4YD54Q.js";
4
4
 
5
5
  // src/bell/fleet.ts
6
6
  import { closeSync, constants, futimesSync, lstatSync, mkdirSync, openSync, readdirSync, unlinkSync } from "fs";
@@ -4,11 +4,11 @@ import {
4
4
  } from "./chunk-ATBKJNWS.js";
5
5
  import {
6
6
  guardBinary
7
- } from "./chunk-HSGEEBBL.js";
7
+ } from "./chunk-M7RYIZX6.js";
8
8
  import {
9
9
  HOOK_BUDGETS,
10
10
  HOOK_LOCATOR_BINARY
11
- } from "./chunk-CY4TZK5O.js";
11
+ } from "./chunk-7YJS2VTG.js";
12
12
 
13
13
  // src/claude-config.ts
14
14
  import { join } from "path";
@@ -48,7 +48,11 @@ var CLAUDE_HOOK_EVENTS = [
48
48
  { event: "SubagentStop", binary: "pushary-stop-hook", timeout: 10, delivery: "telemetry", since: OBSERVED },
49
49
  { event: "PreCompact", binary: "pushary-post-hook", matcher: "manual|auto", timeout: 10, delivery: "telemetry", since: OBSERVED },
50
50
  { event: "PostCompact", binary: "pushary-post-hook", matcher: "manual|auto", timeout: 10, delivery: "telemetry", since: OBSERVED },
51
- { event: "TeammateIdle", binary: "pushary-notification-hook", timeout: 10, delivery: "telemetry", since: OBSERVED }
51
+ { event: "TeammateIdle", binary: "pushary-notification-hook", timeout: 10, delivery: "telemetry", since: OBSERVED },
52
+ // An MCP server asking the person for a value, answered from the phone rather
53
+ // than the terminal. No matcher: Claude Code matches this event on the MCP
54
+ // server's name, and we have no business preferring one server over another.
55
+ { event: "Elicitation", binary: "pushary-elicitation-hook", timeout: HOOK_BUDGETS.claude.budgetSeconds, delivery: "approval", since: OBSERVED, cliOnly: true }
52
56
  ];
53
57
  var supportedClaudeEvents = (version) => CLAUDE_HOOK_EVENTS.filter((hook) => version ? atLeast(version, hook.since) : hook.since === ESTABLISHED);
54
58
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isSafeReadOnlyCommand
3
- } from "./chunk-CY4TZK5O.js";
3
+ } from "./chunk-7YJS2VTG.js";
4
4
 
5
5
  // src/ledger.ts
6
6
  import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync } from "fs";
@@ -53,7 +53,8 @@ var HOOK_BUDGETS = {
53
53
  gemini: { budgetSeconds: 180, guardSeconds: 10 },
54
54
  // The Cursor gate is a dependency-free .mjs that cannot import this module; it
55
55
  // mirrors these as MAX_BLOCK_MS (45s) inside its 60s failClosed budget.
56
- cursor: { budgetSeconds: 60, guardSeconds: 15 }
56
+ cursor: { budgetSeconds: 60, guardSeconds: 15 },
57
+ vscode: { budgetSeconds: 60, guardSeconds: 15 }
57
58
  };
58
59
  var hookMaxWaitSeconds = (agent) => Math.max(HOOK_BUDGETS[agent].budgetSeconds - HOOK_BUDGETS[agent].guardSeconds, 1);
59
60
  var hookWaitDeadline = (startMs, policyWaitSeconds, agent, nowMs) => {
@@ -65,6 +66,18 @@ var hookWaitDeadline = (startMs, policyWaitSeconds, agent, nowMs) => {
65
66
  };
66
67
  var hookWaitClamped = (startMs, policyWaitSeconds, agent, nowMs) => startMs + hookMaxWaitSeconds(agent) * 1e3 < nowMs + Math.max(policyWaitSeconds, 0) * 1e3;
67
68
  var effectiveWaitSeconds = (timeoutAction, policySeconds, agent) => timeoutAction === "wait" ? hookMaxWaitSeconds(agent) : policySeconds;
69
+ var AGENT_LABELS_BY_TYPE = {
70
+ claude_code: "Claude Code",
71
+ claude_cowork: "Claude Cowork",
72
+ codex: "Codex",
73
+ chatgpt: "ChatGPT",
74
+ gemini_cli: "Gemini CLI",
75
+ hermes: "Hermes",
76
+ cursor: "Cursor",
77
+ vscode: "VS Code",
78
+ windsurf: "Windsurf",
79
+ unknown: "Agent"
80
+ };
68
81
  var HOOK_LOCATOR_BINARY = "pushary-bridge";
69
82
  var HOOK_BATCH_MAX_BYTES = 4 * 1024 * 1024;
70
83
  var REPO_KEY_MAX_LENGTH = 200;
@@ -948,6 +961,7 @@ var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, se
948
961
  pushFirstSeconds: config.defaultPushFirstSeconds ?? 20
949
962
  };
950
963
  const governedBySpecificRule = match?.rank === "exact" || match?.rank === "prefix";
964
+ const governingMode = base.mode;
951
965
  if (!governedBySpecificRule && toolName === "Bash" && typeof arg === "string" && isSafeReadOnlyCommand(arg)) {
952
966
  base = autoApprove(base.tool);
953
967
  }
@@ -957,7 +971,7 @@ var resolvePolicy = (config, toolName, modeOverride, toolInput, cwd, repoKey, se
957
971
  tool: base.tool,
958
972
  timeoutSeconds: config.defaultTimeoutSeconds,
959
973
  timeoutAction: "wait",
960
- mode: "push_first",
974
+ mode: governingMode,
961
975
  pushFirstSeconds: config.defaultPushFirstSeconds ?? 20
962
976
  };
963
977
  }
@@ -1054,7 +1068,7 @@ var claudePermissionRequestOutput = (decision, reason, updatedInput) => ({
1054
1068
  });
1055
1069
  var gateOutputFor = (source, event, decision, reason) => {
1056
1070
  let output;
1057
- if (source === "claude") {
1071
+ if (source === "claude" || source === "vscode") {
1058
1072
  if (event === "PreToolUse") {
1059
1073
  output = claudePreToolUseOutput(decision, reason);
1060
1074
  } else if (event === "PermissionRequest" && decision !== "ask") {
@@ -1088,6 +1102,17 @@ var gateOutputFor = (source, event, decision, reason) => {
1088
1102
  }
1089
1103
  return output;
1090
1104
  };
1105
+ var ELICITATION_EVENTS = ["Elicitation", "ElicitationResult"];
1106
+ var claudeElicitationOutput = (event, action, content) => ({
1107
+ hookSpecificOutput: {
1108
+ hookEventName: event,
1109
+ action,
1110
+ // Only ever alongside an accept. A declined elicitation has nothing to carry,
1111
+ // and content beside a decline reads as an answer the person did not give.
1112
+ ...action === "accept" && content ? { content } : {}
1113
+ }
1114
+ });
1115
+ var renderElicitationOutput = (event, action, content) => ELICITATION_EVENTS.includes(event) ? JSON.stringify(claudeElicitationOutput(event, action, content)) : void 0;
1091
1116
 
1092
1117
  export {
1093
1118
  parseAgentQuestionAnswers,
@@ -1096,6 +1121,7 @@ export {
1096
1121
  hookWaitDeadline,
1097
1122
  hookWaitClamped,
1098
1123
  effectiveWaitSeconds,
1124
+ AGENT_LABELS_BY_TYPE,
1099
1125
  HOOK_LOCATOR_BINARY,
1100
1126
  normalizeRepoRemote,
1101
1127
  localRepoKey,
@@ -1115,5 +1141,6 @@ export {
1115
1141
  modeStateFromResponse,
1116
1142
  claudePreToolUseOutput,
1117
1143
  claudePermissionRequestOutput,
1118
- gateOutputFor
1144
+ gateOutputFor,
1145
+ renderElicitationOutput
1119
1146
  };
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-BSZYIAZL.js";
12
12
  import {
13
13
  reportedInstallSource
14
- } from "./chunk-7C5CJC3H.js";
14
+ } from "./chunk-Y3UTTFTZ.js";
15
15
 
16
16
  // src/reach.ts
17
17
  var reachVerdict = (channels) => {
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-2UMNXADU.js";
13
13
  import {
14
14
  isValidApiKey
15
- } from "./chunk-CY4TZK5O.js";
15
+ } from "./chunk-7YJS2VTG.js";
16
16
 
17
17
  // src/session.ts
18
18
  var IDENTITY_PATH = "/api/v1/server/identity";