@pushary/agent-hooks 1.6.3 → 1.7.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 (100) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +3 -2
  3. package/dist/bin/pushary-bell-hook.js +24 -22
  4. package/dist/bin/pushary-bell.js +11 -12
  5. package/dist/bin/pushary-claude.js +29 -28
  6. package/dist/bin/pushary-clean.js +99 -40
  7. package/dist/bin/pushary-codex-bridge.js +25 -25
  8. package/dist/bin/pushary-codex-hook.js +39 -34
  9. package/dist/bin/pushary-codex.js +13 -12
  10. package/dist/bin/pushary-connect.js +13 -12
  11. package/dist/bin/pushary-cowork.js +5 -6
  12. package/dist/bin/pushary-daemon.js +31 -32
  13. package/dist/bin/pushary-disconnect.js +22 -21
  14. package/dist/bin/pushary-doctor.js +98 -61
  15. package/dist/bin/pushary-elicitation-hook.js +26 -25
  16. package/dist/bin/pushary-gemini-bridge.js +12 -13
  17. package/dist/bin/pushary-gemini-hook.js +35 -30
  18. package/dist/bin/pushary-hook.js +38 -33
  19. package/dist/bin/pushary-login.js +13 -15
  20. package/dist/bin/pushary-logout.js +12 -13
  21. package/dist/bin/pushary-mcp.d.ts +1 -0
  22. package/dist/bin/pushary-mcp.js +56 -0
  23. package/dist/bin/pushary-mode.js +10 -8
  24. package/dist/bin/pushary-notification-hook.js +28 -27
  25. package/dist/bin/pushary-opencode-hook.js +34 -29
  26. package/dist/bin/pushary-permission-denied-hook.js +32 -31
  27. package/dist/bin/pushary-permission-hook.js +31 -30
  28. package/dist/bin/pushary-post-hook.js +28 -27
  29. package/dist/bin/pushary-prompt-hook.js +28 -27
  30. package/dist/bin/pushary-session-end-hook.js +28 -27
  31. package/dist/bin/pushary-session-start-hook.js +32 -31
  32. package/dist/bin/pushary-setup.js +222 -110
  33. package/dist/bin/pushary-stats.js +5 -6
  34. package/dist/bin/pushary-status.js +15 -16
  35. package/dist/bin/pushary-stop-hook.js +28 -27
  36. package/dist/bin/pushary-stopfailure-hook.js +28 -27
  37. package/dist/bin/pushary-suggestions.js +4 -4
  38. package/dist/bin/pushary-transcript-register.js +19 -20
  39. package/dist/bin/pushary-transcripts.js +7 -8
  40. package/dist/bin/pushary-upgrade.js +28 -28
  41. package/dist/bin/pushary-wait.js +10 -8
  42. package/dist/bin/pushary.js +9 -5
  43. package/dist/{chunk-4KSTLHWY.js → chunk-2C7CCWVX.js} +1 -1
  44. package/dist/{chunk-P4BNYJ5Q.js → chunk-2PS6QWDW.js} +2 -2
  45. package/dist/{chunk-ILGL4L3J.js → chunk-4F46VIEE.js} +8 -8
  46. package/dist/{chunk-UAV5MNKY.js → chunk-52NVBNJT.js} +3 -3
  47. package/dist/{chunk-GQPCPEG2.js → chunk-5HLTWFJ6.js} +1 -1
  48. package/dist/{chunk-EJ7ADMNM.js → chunk-6ADZQFVW.js} +1 -1
  49. package/dist/{chunk-QKOVVL7I.js → chunk-73T6MSU5.js} +7 -7
  50. package/dist/{chunk-YOCXPNQ5.js → chunk-7OS4IHGI.js} +2 -2
  51. package/dist/{chunk-BY2CRWBO.js → chunk-B234346F.js} +1 -1
  52. package/dist/{chunk-EA3IELHP.js → chunk-B3UXMSMW.js} +6 -2
  53. package/dist/{chunk-STOMNX4S.js → chunk-B3YQANFN.js} +1 -1
  54. package/dist/{chunk-JBU7XKY2.js → chunk-B76WVEDX.js} +1 -1
  55. package/dist/{chunk-WA7SQX6S.js → chunk-BBKNJJVX.js} +6 -6
  56. package/dist/{chunk-KNIIFNNQ.js → chunk-BH2SKSSK.js} +1 -1
  57. package/dist/{chunk-CTOK3AYA.js → chunk-BWYJ6AAF.js} +6 -7
  58. package/dist/{chunk-HCVAMXHT.js → chunk-CVALVGA7.js} +1 -1
  59. package/dist/{chunk-DX5FOQSO.js → chunk-D6BULEJW.js} +2 -2
  60. package/dist/{chunk-RJUHSFYE.js → chunk-DANOZVZK.js} +1 -1
  61. package/dist/{chunk-3BJQYXTL.js → chunk-DNJUSFBL.js} +13 -5
  62. package/dist/{chunk-57YDFAPP.js → chunk-DVQDPI3T.js} +8 -8
  63. package/dist/{chunk-BEHGVU4W.js → chunk-DZURML2D.js} +1 -1
  64. package/dist/{chunk-LDS4ERW4.js → chunk-EAQMWJPG.js} +10 -10
  65. package/dist/{chunk-LVHGSD5E.js → chunk-EGKXSQCY.js} +13 -7
  66. package/dist/{chunk-HHYVBHHC.js → chunk-HDRNWNVP.js} +6 -6
  67. package/dist/{chunk-JBXUKGZS.js → chunk-IJ6ECPA6.js} +15 -9
  68. package/dist/{chunk-NMRH3VX4.js → chunk-J2355HR7.js} +1 -1
  69. package/dist/{chunk-HETOKNIL.js → chunk-JNXVOU6Y.js} +10 -6
  70. package/dist/{chunk-COGHCL6K.js → chunk-JXUAXO74.js} +2 -2
  71. package/dist/chunk-KW2RRR7D.js +124 -0
  72. package/dist/{chunk-66H2QQAK.js → chunk-KXMZMZD3.js} +1 -1
  73. package/dist/{chunk-H3FEVIQD.js → chunk-KYQXUGH7.js} +3 -3
  74. package/dist/{chunk-P35IUFFR.js → chunk-L4H2Q2S4.js} +276 -19
  75. package/dist/{chunk-NKR4YDRP.js → chunk-LEZFOTMI.js} +1 -1
  76. package/dist/{chunk-WD6W7QDI.js → chunk-O2LEPIU6.js} +1 -1
  77. package/dist/chunk-POFBE6ZY.js +12 -0
  78. package/dist/{chunk-SND3C2AV.js → chunk-PQ4F64M2.js} +3 -3
  79. package/dist/{chunk-3UOC3GRO.js → chunk-PUDBG3GM.js} +1 -1
  80. package/dist/{chunk-YQMFGWBD.js → chunk-QXAK5RFU.js} +1 -1
  81. package/dist/{chunk-REYWOCQJ.js → chunk-R2XCLT6I.js} +4 -4
  82. package/dist/{chunk-NPGOQQCV.js → chunk-ROQK7IN3.js} +2 -2
  83. package/dist/{chunk-GU3EJCVV.js → chunk-S3UD4V6W.js} +39 -0
  84. package/dist/{chunk-ICGAIM2R.js → chunk-SQRWHALT.js} +2 -2
  85. package/dist/{chunk-JX67DVMY.js → chunk-UC65FJJT.js} +5 -6
  86. package/dist/{chunk-CWIARY6F.js → chunk-UOAQ6QMP.js} +2 -2
  87. package/dist/{chunk-OSJEMXSR.js → chunk-V4AQBAVG.js} +1 -1
  88. package/dist/chunk-V6QRSU2G.js +142 -0
  89. package/dist/{chunk-VDMX5EMU.js → chunk-VKVIAZQO.js} +1 -1
  90. package/dist/{chunk-BG6OCZ4N.js → chunk-WUNZAE7I.js} +5 -5
  91. package/dist/{chunk-TZ4KUNZG.js → chunk-X6KDKOV5.js} +3 -3
  92. package/dist/{chunk-LM2IOEDK.js → chunk-XNCMT7YY.js} +3 -1
  93. package/dist/{chunk-GHOB245Q.js → chunk-YROGUPOZ.js} +132 -30
  94. package/dist/chunk-YYINL576.js +120 -0
  95. package/dist/{chunk-57DDP4TB.js → chunk-ZQ7IDOKY.js} +3 -3
  96. package/dist/{reapply-IB7YE7BU.js → reapply-6PH3FMPX.js} +9 -10
  97. package/dist/src/index.js +20 -19
  98. package/package.json +2 -1
  99. package/dist/chunk-HWJW3CPO.js +0 -65
  100. package/dist/chunk-SAF6HGAA.js +0 -57
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.7.0
4
+
5
+ - **fx.** `npx @pushary/agent-hooks@latest setup --agents fx`, or ticking fx in the picker, connects Vercel Labs' fx coding agent. Setup adds a `pushary` server to `~/.fx/mcp.json` that runs the new `pushary-mcp` command, a local bridge that signs in with the key setup saved in `~/.pushary`. No key is written to fx's files, and a rotated key is used without running setup again. fx has no hooks other tools can register, so Pushary cannot answer fx's own approval prompts; fx's agent asks through Pushary's tools when it chooses to, guided by a managed block setup writes to `~/.fx/AGENTS.md`.
6
+ - Setup adds `"mcp_pushary_*": "allow"` to the `permission` rules in `~/.fx/settings.json`, after your own rules, so fx runs Pushary's tools without reviewing or prompting for each call, the same as the other agents' auto-allowed Pushary tools. A rule you already set for `mcp_pushary_*` is kept. fx workspaces that set their own permission rules replace the global ones, and setup names how many there are.
7
+ - Setup leaves `~/.fx/mcp.json` and `~/.fx/settings.json` untouched when fx itself would reject or refuse to edit them (comments, a trailing comma, a repeated key, or servers under a key fx ignores) and prints the command that retries only fx. It writes both files as compact JSON, the way fx does, and leaves a file alone rather than grow it past the size fx reads. It skips fx on a machine with no `~/.fx`, and on Windows, which fx does not support. fx is ticked automatically only when fx's own files are there, since other tools use `~/.fx` too.
8
+ - `pushary doctor` checks the fx entry and that its bridge is installed, and warns when Pushary's tools are not auto-allowed. `pushary clean` removes only the Pushary server, the allow rule it added, and the instructions block.
9
+ - `pushary setup --help` lists every agent id setup accepts.
10
+
11
+ ## 1.6.4
12
+
13
+ - Requests to Pushary now say which client made them: the CLI version, the platform, a per-process run id, and the machine id this machine already has. They go only to Pushary's own address, never to npm or any other host, and never include file paths, keys or content. Support can then find a problem from your account instead of asking for terminal output.
14
+ - When setup, a hook or the bridge cannot reach Pushary, cannot claim a blocked action, or stands aside for an agent it does not recognise, it now tells Pushary with a short code such as `mode_fetch_failed`. Each code is sent at most once per clock minute per machine, not per hook, even when several hooks fail at the same moment, so an outage does not add a request to every tool call. `~/.pushary/client-reports/` holds one small claim file per code per minute. A report gives up after one second. Set `PUSHARY_DISABLE_CLIENT_REPORTS=1` to send none.
15
+
3
16
  ## 1.6.3
4
17
 
5
18
  - When setup cannot configure one of the agents you picked, the final summary now names that agent, says why, and prints the one command that retries only it, such as `npx @pushary/agent-hooks@latest setup --agents cursor`. Before, the reason was printed once in the middle of the run and the summary only said "Setup finished with 1 problem".
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![npm downloads](https://img.shields.io/npm/dm/@pushary/agent-hooks.svg)](https://www.npmjs.com/package/@pushary/agent-hooks)
5
5
  [![license](https://img.shields.io/npm/l/@pushary/agent-hooks.svg)](./LICENSE)
6
6
 
7
- Push notifications, questions, and permission approvals for AI agents. Get a push when your agent finishes work, answer its questions from your phone, and approve risky commands before they run. Works with Claude Code, Codex, Cursor, VS Code, OpenCode, Gemini CLI, and Hermes.
7
+ Push notifications, questions, and permission approvals for AI agents. Get a push when your agent finishes work, answer its questions from your phone, and approve risky commands before they run. Works with Claude Code, Codex, Cursor, VS Code, OpenCode, Gemini CLI, Hermes, and fx.
8
8
 
9
9
  Your agent froze waiting for a yes. This is how it reaches you.
10
10
 
@@ -111,6 +111,7 @@ npx @pushary/agent-hooks@latest doctor
111
111
  | Hermes | yes | yes | yes |
112
112
  | VS Code | yes | yes | yes |
113
113
  | OpenCode | yes | yes | yes |
114
+ | fx | yes | yes | no |
114
115
 
115
116
  Any other MCP client can use notify and ask by pointing at the Pushary MCP endpoint directly.
116
117
 
@@ -184,7 +185,7 @@ failing closed would let one malformed download silence every hook on the machin
184
185
 
185
186
  ```
186
187
  cowork Set up Claude Desktop and Cowork with the Pushary connector
187
- setup Configure Claude Code, Codex, Gemini CLI, Hermes, Cursor, VS Code, or OpenCode with Pushary
188
+ setup Configure Claude Code, Codex, Gemini CLI, Hermes, Cursor, VS Code, OpenCode, or fx with Pushary
188
189
  claude Run Claude Code through Pushary, reachable from your phone even when idle
189
190
  daemon Keep this machine reachable so your phone can START a new session
190
191
  status One screen: which key is in force, whether the server accepts it, what can receive an approval
@@ -1,36 +1,38 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-EJ7ADMNM.js";
4
+ } from "../chunk-6ADZQFVW.js";
5
5
  import {
6
6
  readHookInput
7
- } from "../chunk-JX67DVMY.js";
8
- import "../chunk-LDS4ERW4.js";
7
+ } from "../chunk-UC65FJJT.js";
8
+ import "../chunk-EAQMWJPG.js";
9
9
  import "../chunk-SGZJ5LYH.js";
10
- import "../chunk-REYWOCQJ.js";
11
- import "../chunk-HCVAMXHT.js";
12
- import "../chunk-GQPCPEG2.js";
13
- import "../chunk-SND3C2AV.js";
14
- import "../chunk-QKOVVL7I.js";
15
- import "../chunk-57DDP4TB.js";
16
- import "../chunk-VDMX5EMU.js";
17
- import "../chunk-KNIIFNNQ.js";
18
- import "../chunk-66H2QQAK.js";
19
- import "../chunk-JBU7XKY2.js";
10
+ import "../chunk-R2XCLT6I.js";
11
+ import "../chunk-CVALVGA7.js";
12
+ import "../chunk-5HLTWFJ6.js";
13
+ import "../chunk-PQ4F64M2.js";
14
+ import "../chunk-73T6MSU5.js";
15
+ import "../chunk-ZQ7IDOKY.js";
16
+ import "../chunk-VKVIAZQO.js";
17
+ import "../chunk-BH2SKSSK.js";
18
+ import "../chunk-KXMZMZD3.js";
19
+ import "../chunk-B76WVEDX.js";
20
20
  import "../chunk-XHKBHWLX.js";
21
- import "../chunk-BEHGVU4W.js";
22
- import "../chunk-LM2IOEDK.js";
23
- import "../chunk-3BJQYXTL.js";
21
+ import "../chunk-DZURML2D.js";
22
+ import "../chunk-V6QRSU2G.js";
23
+ import "../chunk-POFBE6ZY.js";
24
24
  import "../chunk-GMXKITVA.js";
25
- import "../chunk-CWIARY6F.js";
25
+ import "../chunk-UOAQ6QMP.js";
26
+ import "../chunk-KW2RRR7D.js";
27
+ import "../chunk-XNCMT7YY.js";
26
28
  import "../chunk-7QLSKOSU.js";
27
29
  import "../chunk-KZERVKTD.js";
28
- import "../chunk-NPGOQQCV.js";
30
+ import "../chunk-ROQK7IN3.js";
31
+ import "../chunk-DNJUSFBL.js";
29
32
  import "../chunk-T7E75EKA.js";
30
- import "../chunk-OSJEMXSR.js";
31
- import "../chunk-GHOB245Q.js";
32
- import "../chunk-EA3IELHP.js";
33
- import "../chunk-HWJW3CPO.js";
33
+ import "../chunk-V4AQBAVG.js";
34
+ import "../chunk-B3UXMSMW.js";
35
+ import "../chunk-YROGUPOZ.js";
34
36
 
35
37
  // bin/pushary-bell-hook.ts
36
38
  var main = async () => {
@@ -5,38 +5,37 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-EJ7ADMNM.js";
8
+ } from "../chunk-6ADZQFVW.js";
9
9
  import {
10
10
  addBellHooks,
11
11
  bellInstalled,
12
12
  removeBellHooks
13
- } from "../chunk-VDMX5EMU.js";
14
- import {
15
- claudeSettings
16
- } from "../chunk-3BJQYXTL.js";
13
+ } from "../chunk-VKVIAZQO.js";
17
14
  import {
18
15
  createIo
19
16
  } from "../chunk-5RUIFDTP.js";
20
17
  import {
21
18
  exitOnHelpFlag
22
- } from "../chunk-P4BNYJ5Q.js";
19
+ } from "../chunk-2PS6QWDW.js";
23
20
  import {
24
21
  parseFlags
25
22
  } from "../chunk-GMXKITVA.js";
26
- import "../chunk-CWIARY6F.js";
23
+ import "../chunk-UOAQ6QMP.js";
27
24
  import "../chunk-7QLSKOSU.js";
28
25
  import {
29
26
  EXIT
30
27
  } from "../chunk-KZERVKTD.js";
31
- import "../chunk-NPGOQQCV.js";
28
+ import "../chunk-ROQK7IN3.js";
29
+ import {
30
+ claudeSettings
31
+ } from "../chunk-DNJUSFBL.js";
32
32
  import {
33
33
  readJsonSafe,
34
34
  writeJsonAtomic
35
35
  } from "../chunk-T7E75EKA.js";
36
- import "../chunk-OSJEMXSR.js";
37
- import "../chunk-GHOB245Q.js";
38
- import "../chunk-EA3IELHP.js";
39
- import "../chunk-HWJW3CPO.js";
36
+ import "../chunk-V4AQBAVG.js";
37
+ import "../chunk-B3UXMSMW.js";
38
+ import "../chunk-YROGUPOZ.js";
40
39
 
41
40
  // bin/pushary-bell.ts
42
41
  exitOnHelpFlag("bell");
@@ -8,7 +8,7 @@ import {
8
8
  describeIdleWindow,
9
9
  startProcessOwnership,
10
10
  withSpawnProcessOwnership
11
- } from "../chunk-NKR4YDRP.js";
11
+ } from "../chunk-LEZFOTMI.js";
12
12
  import {
13
13
  isDeferAnswer
14
14
  } from "../chunk-YHG74UFF.js";
@@ -17,24 +17,24 @@ import {
17
17
  loadSessionKey,
18
18
  registerTranscript,
19
19
  registeredTranscriptEnabled
20
- } from "../chunk-LDS4ERW4.js";
20
+ } from "../chunk-EAQMWJPG.js";
21
21
  import "../chunk-SGZJ5LYH.js";
22
- import "../chunk-REYWOCQJ.js";
23
- import "../chunk-HCVAMXHT.js";
24
- import "../chunk-GQPCPEG2.js";
25
- import "../chunk-SND3C2AV.js";
22
+ import "../chunk-R2XCLT6I.js";
23
+ import "../chunk-CVALVGA7.js";
24
+ import "../chunk-5HLTWFJ6.js";
25
+ import "../chunk-PQ4F64M2.js";
26
26
  import {
27
27
  ensureDaemonRunning
28
- } from "../chunk-QKOVVL7I.js";
29
- import "../chunk-57DDP4TB.js";
30
- import "../chunk-VDMX5EMU.js";
28
+ } from "../chunk-73T6MSU5.js";
29
+ import "../chunk-ZQ7IDOKY.js";
30
+ import "../chunk-VKVIAZQO.js";
31
31
  import {
32
32
  encryptRecord
33
- } from "../chunk-KNIIFNNQ.js";
34
- import "../chunk-66H2QQAK.js";
33
+ } from "../chunk-BH2SKSSK.js";
34
+ import "../chunk-KXMZMZD3.js";
35
35
  import {
36
36
  transcriptsEnabled
37
- } from "../chunk-JBU7XKY2.js";
37
+ } from "../chunk-B76WVEDX.js";
38
38
  import {
39
39
  needsShell,
40
40
  spawnClaude
@@ -56,8 +56,8 @@ import {
56
56
  reportEvent,
57
57
  savePendingCommand,
58
58
  scopePathFor
59
- } from "../chunk-JBXUKGZS.js";
60
- import "../chunk-BEHGVU4W.js";
59
+ } from "../chunk-IJ6ECPA6.js";
60
+ import "../chunk-DZURML2D.js";
61
61
  import {
62
62
  DECISION_STOP_REASON,
63
63
  askUser,
@@ -67,32 +67,33 @@ import {
67
67
  nextLongPollMs,
68
68
  waitForAnswer,
69
69
  withdrawQuestion
70
- } from "../chunk-LVHGSD5E.js";
70
+ } from "../chunk-EGKXSQCY.js";
71
+ import "../chunk-V6QRSU2G.js";
72
+ import "../chunk-POFBE6ZY.js";
73
+ import "../chunk-GMXKITVA.js";
74
+ import "../chunk-UOAQ6QMP.js";
75
+ import "../chunk-JNXVOU6Y.js";
76
+ import "../chunk-KW2RRR7D.js";
71
77
  import {
72
78
  getMachineId
73
- } from "../chunk-LM2IOEDK.js";
74
- import "../chunk-3BJQYXTL.js";
75
- import "../chunk-GMXKITVA.js";
76
- import "../chunk-CWIARY6F.js";
77
- import "../chunk-HETOKNIL.js";
78
- import "../chunk-SAF6HGAA.js";
79
+ } from "../chunk-XNCMT7YY.js";
79
80
  import "../chunk-7QLSKOSU.js";
80
81
  import "../chunk-KZERVKTD.js";
81
- import "../chunk-NPGOQQCV.js";
82
+ import "../chunk-ROQK7IN3.js";
83
+ import "../chunk-DNJUSFBL.js";
82
84
  import "../chunk-T7E75EKA.js";
83
85
  import {
84
86
  getApiKey,
85
87
  getBaseUrl
86
- } from "../chunk-OSJEMXSR.js";
88
+ } from "../chunk-V4AQBAVG.js";
89
+ import {
90
+ NPX_LATEST_COMMAND
91
+ } from "../chunk-B3UXMSMW.js";
87
92
  import {
88
93
  KILL_REASON,
89
94
  redactSecrets,
90
95
  resolveGate
91
- } from "../chunk-GHOB245Q.js";
92
- import {
93
- NPX_LATEST_COMMAND
94
- } from "../chunk-EA3IELHP.js";
95
- import "../chunk-HWJW3CPO.js";
96
+ } from "../chunk-YROGUPOZ.js";
96
97
 
97
98
  // src/wrapper/localPassthrough.ts
98
99
  var SIGNAL_NUMBERS = {
@@ -7,14 +7,24 @@ import {
7
7
  createGuards,
8
8
  resolveHermesPython,
9
9
  runHermesPythonScript
10
- } from "../chunk-RJUHSFYE.js";
10
+ } from "../chunk-DANOZVZK.js";
11
11
  import "../chunk-P32LPT2L.js";
12
12
  import {
13
+ FX_PROFILE_REFUSALS,
14
+ FX_SETTINGS_REFUSALS,
15
+ fxProfileText,
16
+ fxSettingsText,
17
+ readFxFile,
18
+ readFxProfile,
19
+ readFxSettings,
13
20
  removeInstructionBlock,
14
21
  shortenHome,
15
22
  unregisterPluginLocation,
16
- vscodeSettingsTargets
17
- } from "../chunk-P35IUFFR.js";
23
+ vscodeSettingsTargets,
24
+ withoutFxPusharyServer,
25
+ withoutPusharyToolsAllowed
26
+ } from "../chunk-L4H2Q2S4.js";
27
+ import "../chunk-YYINL576.js";
18
28
  import {
19
29
  OPENCODE_PLUGIN_SIBLING,
20
30
  OPENCODE_PLUGIN_SIBLING_CONTENTS,
@@ -24,7 +34,7 @@ import {
24
34
  openCodePluginDir,
25
35
  openCodePluginFile,
26
36
  removeOpenCodeMcpServer
27
- } from "../chunk-STOMNX4S.js";
37
+ } from "../chunk-B3YQANFN.js";
28
38
  import {
29
39
  compatibleConfigFile,
30
40
  compatibleInstructionsFile,
@@ -32,40 +42,60 @@ import {
32
42
  compatiblePermissionRuleFile,
33
43
  removeCompatibleHooks,
34
44
  removeCompatibleMcpServer
35
- } from "../chunk-BG6OCZ4N.js";
45
+ } from "../chunk-WUNZAE7I.js";
36
46
  import {
37
47
  isClaudeMcpSnapshot,
38
48
  removeClaudeMcpServers,
39
49
  removePusharySettings,
40
50
  removePusharyToolPermissions,
41
51
  restoreClaudeMcpServer
42
- } from "../chunk-H3FEVIQD.js";
52
+ } from "../chunk-KYQXUGH7.js";
43
53
  import {
44
54
  hookOwnerOf,
45
55
  isHookTakeoverReceipt,
46
56
  restoreHookTakeover,
47
57
  restoreMcpServer
48
- } from "../chunk-REYWOCQJ.js";
49
- import "../chunk-HCVAMXHT.js";
58
+ } from "../chunk-R2XCLT6I.js";
59
+ import "../chunk-CVALVGA7.js";
50
60
  import {
51
61
  liveBridgeProbe,
52
62
  resolveBridgeStub
53
- } from "../chunk-GQPCPEG2.js";
63
+ } from "../chunk-5HLTWFJ6.js";
54
64
  import {
55
65
  pusharyHookExecutable
56
- } from "../chunk-SND3C2AV.js";
66
+ } from "../chunk-PQ4F64M2.js";
57
67
  import {
58
68
  disableDaemonService
59
- } from "../chunk-QKOVVL7I.js";
69
+ } from "../chunk-73T6MSU5.js";
60
70
  import {
61
71
  removeGeminiSettings
62
- } from "../chunk-57DDP4TB.js";
63
- import "../chunk-VDMX5EMU.js";
72
+ } from "../chunk-ZQ7IDOKY.js";
73
+ import "../chunk-VKVIAZQO.js";
64
74
  import "../chunk-XHKBHWLX.js";
65
- import "../chunk-JBXUKGZS.js";
66
- import "../chunk-BEHGVU4W.js";
67
- import "../chunk-LVHGSD5E.js";
68
- import "../chunk-LM2IOEDK.js";
75
+ import "../chunk-IJ6ECPA6.js";
76
+ import "../chunk-DZURML2D.js";
77
+ import "../chunk-EGKXSQCY.js";
78
+ import "../chunk-V6QRSU2G.js";
79
+ import "../chunk-POFBE6ZY.js";
80
+ import {
81
+ exitOnHelpFlag
82
+ } from "../chunk-2PS6QWDW.js";
83
+ import {
84
+ rejectUnknownFlags
85
+ } from "../chunk-GMXKITVA.js";
86
+ import {
87
+ CANDIDATE_RCS,
88
+ isDisabledExport,
89
+ removeClaudeAlias
90
+ } from "../chunk-UOAQ6QMP.js";
91
+ import "../chunk-JNXVOU6Y.js";
92
+ import "../chunk-KW2RRR7D.js";
93
+ import "../chunk-XNCMT7YY.js";
94
+ import "../chunk-7QLSKOSU.js";
95
+ import {
96
+ EXIT
97
+ } from "../chunk-KZERVKTD.js";
98
+ import "../chunk-ROQK7IN3.js";
69
99
  import {
70
100
  bridgeAgentKey,
71
101
  claudeJson,
@@ -82,6 +112,9 @@ import {
82
112
  cursorUserHooks,
83
113
  cursorUserMcp,
84
114
  execNpm,
115
+ fxAgentsMd,
116
+ fxMcpProfile,
117
+ fxSettings,
85
118
  geminiMd,
86
119
  geminiSettings,
87
120
  hermesConfigReceipt,
@@ -94,27 +127,10 @@ import {
94
127
  restoreCodexHookTrust,
95
128
  vscodePluginDir,
96
129
  vscodePluginMcp
97
- } from "../chunk-3BJQYXTL.js";
98
- import {
99
- exitOnHelpFlag
100
- } from "../chunk-P4BNYJ5Q.js";
101
- import {
102
- rejectUnknownFlags
103
- } from "../chunk-GMXKITVA.js";
104
- import {
105
- CANDIDATE_RCS,
106
- isDisabledExport,
107
- removeClaudeAlias
108
- } from "../chunk-CWIARY6F.js";
109
- import "../chunk-HETOKNIL.js";
110
- import "../chunk-SAF6HGAA.js";
111
- import "../chunk-7QLSKOSU.js";
112
- import {
113
- EXIT
114
- } from "../chunk-KZERVKTD.js";
115
- import "../chunk-NPGOQQCV.js";
130
+ } from "../chunk-DNJUSFBL.js";
116
131
  import "../chunk-T7E75EKA.js";
117
- import "../chunk-OSJEMXSR.js";
132
+ import "../chunk-V4AQBAVG.js";
133
+ import "../chunk-B3UXMSMW.js";
118
134
  import {
119
135
  CURSOR_GATE_EVENTS,
120
136
  HOOK_COMPATIBLE_PROFILES,
@@ -123,9 +139,7 @@ import {
123
139
  SUPPORT_EMAIL,
124
140
  isValidApiKey,
125
141
  redactSecrets
126
- } from "../chunk-GHOB245Q.js";
127
- import "../chunk-EA3IELHP.js";
128
- import "../chunk-HWJW3CPO.js";
142
+ } from "../chunk-YROGUPOZ.js";
129
143
 
130
144
  // bin/pushary-clean.ts
131
145
  import { existsSync as existsSync6, readFileSync as readFileSync4, copyFileSync, readdirSync as readdirSync3 } from "fs";
@@ -526,6 +540,48 @@ var guardedAliasRemoval = () => {
526
540
  var writeJson = (path, data) => {
527
541
  guardedWrite(path, JSON.stringify(data, null, 2) + "\n");
528
542
  };
543
+ var writeFxText = (path, rendered, label) => {
544
+ if (rendered.kind === "refused") {
545
+ console.log(` ${skip} ${label} ${dim(`(${path} would grow past the size fx reads; left untouched)`)}`);
546
+ return;
547
+ }
548
+ guardedWrite(path, rendered.text);
549
+ console.log(` ${check} ${label} ${dim(did("removed"))}`);
550
+ };
551
+ var removeFxMcpServer = () => {
552
+ const path = fxMcpProfile();
553
+ const read = readFxFile(path, readFxProfile);
554
+ if (read.kind === "missing") {
555
+ console.log(` ${skip} fx MCP ${dim("(not found)")}`);
556
+ } else if (read.kind === "unreadable") {
557
+ console.log(` ${skip} fx MCP ${dim(`(${path} could not be read; left untouched)`)}`);
558
+ } else if (read.kind === "refused") {
559
+ console.log(` ${skip} fx MCP ${dim(`(${path} ${FX_PROFILE_REFUSALS[read.reason]}; left untouched)`)}`);
560
+ } else {
561
+ const { profile, removed } = withoutFxPusharyServer(read.profile);
562
+ if (removed) {
563
+ writeFxText(path, fxProfileText(profile), "fx MCP");
564
+ } else {
565
+ console.log(` ${skip} fx MCP ${dim("(no pushary entry)")}`);
566
+ }
567
+ }
568
+ };
569
+ var removeFxToolsRule = () => {
570
+ const path = fxSettings();
571
+ const read = readFxFile(path, readFxSettings);
572
+ if (read.kind === "refused") {
573
+ console.log(` ${skip} fx settings ${dim(`(${path} ${FX_SETTINGS_REFUSALS[read.reason]}; left untouched)`)}`);
574
+ return;
575
+ }
576
+ if (read.kind !== "settings") return;
577
+ const { settings, removed } = withoutPusharyToolsAllowed(read.settings);
578
+ if (removed) writeFxText(path, fxSettingsText(settings), "fx auto-allowed Pushary tools");
579
+ };
580
+ var removeFxInstructions = () => {
581
+ if (guardedInstructionBlockRemoval(fxAgentsMd())) {
582
+ console.log(` ${check} fx instructions ${dim(did("removed"))}`);
583
+ }
584
+ };
529
585
  var removeCursorUserHook = (scope) => {
530
586
  if (!existsSync6(CURSOR_USER_HOOKS)) return "absent";
531
587
  let parsed2;
@@ -998,6 +1054,9 @@ var main = async () => {
998
1054
  } else {
999
1055
  console.log(` ${skip} OpenCode MCP ${dim("(not found)")}`);
1000
1056
  }
1057
+ removeFxMcpServer();
1058
+ removeFxToolsRule();
1059
+ removeFxInstructions();
1001
1060
  const hermesPython = resolveHermesPython();
1002
1061
  if (hermesPython) {
1003
1062
  const configUpdated = dryRun ? (wouldNote("run ", "hermes plugin config restore"), true) : runHermesPythonScript(hermesPython, HERMES_CONFIG_SCRIPT, "clean", HERMES_CONFIG_RECEIPT);
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import "../chunk-COGHCL6K.js";
2
+ import "../chunk-JXUAXO74.js";
3
3
  import {
4
4
  LiveTranscriptRelay,
5
5
  liveSessionSleep,
6
6
  postLiveSession,
7
7
  postLiveSessionUntilAccepted,
8
8
  startLiveSessionHeartbeat
9
- } from "../chunk-ICGAIM2R.js";
9
+ } from "../chunk-SQRWHALT.js";
10
10
  import {
11
11
  SESSION_IDLE_TIMEOUT_MS,
12
12
  describeIdleWindow,
13
13
  idleDeadlinePassed,
14
14
  startProcessOwnership,
15
15
  withSpawnProcessOwnership
16
- } from "../chunk-NKR4YDRP.js";
17
- import "../chunk-KNIIFNNQ.js";
18
- import "../chunk-66H2QQAK.js";
16
+ } from "../chunk-LEZFOTMI.js";
17
+ import "../chunk-BH2SKSSK.js";
18
+ import "../chunk-KXMZMZD3.js";
19
19
  import {
20
20
  transcriptsEnabled
21
- } from "../chunk-JBU7XKY2.js";
21
+ } from "../chunk-B76WVEDX.js";
22
22
  import {
23
23
  spawnClaude
24
24
  } from "../chunk-XHKBHWLX.js";
@@ -27,36 +27,38 @@ import {
27
27
  isDecisionStopped,
28
28
  isWaitForAnswerResponse,
29
29
  withdrawQuestion
30
- } from "../chunk-LVHGSD5E.js";
30
+ } from "../chunk-EGKXSQCY.js";
31
31
  import {
32
- getMachineId
33
- } from "../chunk-LM2IOEDK.js";
34
- import {
35
- resolveBinary
36
- } from "../chunk-3BJQYXTL.js";
37
- import "../chunk-CWIARY6F.js";
32
+ writeDegraded
33
+ } from "../chunk-V6QRSU2G.js";
34
+ import "../chunk-POFBE6ZY.js";
35
+ import "../chunk-UOAQ6QMP.js";
38
36
  import {
39
37
  callMcpTool
40
- } from "../chunk-HETOKNIL.js";
41
- import "../chunk-SAF6HGAA.js";
38
+ } from "../chunk-JNXVOU6Y.js";
39
+ import "../chunk-KW2RRR7D.js";
40
+ import {
41
+ getMachineId
42
+ } from "../chunk-XNCMT7YY.js";
42
43
  import "../chunk-7QLSKOSU.js";
43
44
  import "../chunk-KZERVKTD.js";
44
- import "../chunk-NPGOQQCV.js";
45
+ import "../chunk-ROQK7IN3.js";
46
+ import {
47
+ resolveBinary
48
+ } from "../chunk-DNJUSFBL.js";
45
49
  import "../chunk-T7E75EKA.js";
46
50
  import {
47
51
  getApiKey,
48
52
  getBaseUrl
49
- } from "../chunk-OSJEMXSR.js";
53
+ } from "../chunk-V4AQBAVG.js";
54
+ import "../chunk-B3UXMSMW.js";
50
55
  import {
51
- degradedLine,
52
56
  elicitationContent,
53
57
  parseAgentQuestion,
54
58
  parseAgentQuestionAnswers,
55
59
  planElicitationAsk,
56
60
  readElicitationFields
57
- } from "../chunk-GHOB245Q.js";
58
- import "../chunk-EA3IELHP.js";
59
- import "../chunk-HWJW3CPO.js";
61
+ } from "../chunk-YROGUPOZ.js";
60
62
 
61
63
  // bin/pushary-codex-bridge.ts
62
64
  import { existsSync } from "fs";
@@ -358,8 +360,7 @@ var answerCodexQuestions = async (options, params, signal, toolName = "request_u
358
360
  var answerCodexElicitation = async (options, params, threadId, signal) => {
359
361
  const plan = planCodexElicitation(params, threadId);
360
362
  if (!plan) {
361
- process.stderr.write(`${degradedLine("questions", { reason: "unsupported_codex_elicitation", fallback: "no form answer submitted", event: "mcpServer/elicitation/request" })}
362
- `);
363
+ writeDegraded("questions", { reason: "unsupported_codex_elicitation", fallback: "no form answer submitted", event: "mcpServer/elicitation/request" });
363
364
  return { action: "cancel", content: null };
364
365
  }
365
366
  try {
@@ -371,8 +372,7 @@ var answerCodexElicitation = async (options, params, threadId, signal) => {
371
372
  if (!content) throw new Error("Invalid elicitation answer");
372
373
  return { action: "accept", content };
373
374
  } catch {
374
- process.stderr.write(`${degradedLine("questions", { reason: "codex_elicitation_unanswered", fallback: "no form answer submitted", event: "mcpServer/elicitation/request" })}
375
- `);
375
+ writeDegraded("questions", { reason: "codex_elicitation_unanswered", fallback: "no form answer submitted", event: "mcpServer/elicitation/request" });
376
376
  return { action: "cancel", content: null };
377
377
  }
378
378
  };