@pushary/agent-hooks 0.89.2 → 0.89.4

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 (58) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +40 -0
  3. package/dist/bin/pushary-bell-hook.js +3 -3
  4. package/dist/bin/pushary-bell.js +9 -10
  5. package/dist/bin/pushary-claude.js +106 -24
  6. package/dist/bin/pushary-clean.js +28 -7
  7. package/dist/bin/pushary-codex-bridge.js +17 -7
  8. package/dist/bin/pushary-codex-hook.js +8 -7
  9. package/dist/bin/pushary-codex.js +6 -4
  10. package/dist/bin/pushary-connect.js +4 -4
  11. package/dist/bin/pushary-daemon.js +141 -21
  12. package/dist/bin/pushary-disconnect.js +3 -4
  13. package/dist/bin/pushary-doctor.js +45 -29
  14. package/dist/bin/pushary-elicitation-hook.js +4 -2
  15. package/dist/bin/pushary-gemini-bridge.js +16 -6
  16. package/dist/bin/pushary-gemini-hook.js +6 -4
  17. package/dist/bin/pushary-hook.js +9 -7
  18. package/dist/bin/pushary-login.js +4 -4
  19. package/dist/bin/pushary-logout.js +5 -6
  20. package/dist/bin/pushary-mode.js +2 -2
  21. package/dist/bin/pushary-notification-hook.js +6 -4
  22. package/dist/bin/pushary-opencode-hook.js +14 -6
  23. package/dist/bin/pushary-permission-denied-hook.js +7 -5
  24. package/dist/bin/pushary-permission-hook.js +7 -5
  25. package/dist/bin/pushary-post-hook.js +6 -4
  26. package/dist/bin/pushary-prompt-hook.js +6 -4
  27. package/dist/bin/pushary-session-end-hook.js +6 -4
  28. package/dist/bin/pushary-session-start-hook.js +6 -4
  29. package/dist/bin/pushary-setup.js +49 -28
  30. package/dist/bin/pushary-stats.js +2 -2
  31. package/dist/bin/pushary-status.js +7 -6
  32. package/dist/bin/pushary-stop-hook.js +6 -4
  33. package/dist/bin/pushary-stopfailure-hook.js +6 -4
  34. package/dist/bin/pushary-suggestions.js +2 -2
  35. package/dist/bin/pushary-upgrade.js +63 -28
  36. package/dist/bin/pushary-wait.js +2 -2
  37. package/dist/bin/pushary.js +1 -1
  38. package/dist/chunk-2HYPZLYY.js +45 -0
  39. package/dist/{chunk-ZYPS2XMT.js → chunk-4ZHQNBDP.js} +1 -1
  40. package/dist/{chunk-B7JE4XHD.js → chunk-7IJYOBHL.js} +1 -1
  41. package/dist/{chunk-NRGRUOAR.js → chunk-FWUEYXSD.js} +4 -0
  42. package/dist/{chunk-J3YDT4HM.js → chunk-GKAKAOKC.js} +68 -2
  43. package/dist/{chunk-GOEXZ5QJ.js → chunk-GPNOHKFO.js} +9 -2
  44. package/dist/{chunk-SQOFGPNX.js → chunk-KJ57OPCC.js} +1 -1
  45. package/dist/{chunk-LGXTBUT4.js → chunk-KOPUTJQC.js} +1 -0
  46. package/dist/{chunk-HEQVIIBN.js → chunk-MZBT2LXW.js} +4 -4
  47. package/dist/{chunk-6XSC6Z2K.js → chunk-NFI2K2ZQ.js} +80 -23
  48. package/dist/{chunk-K42SZKYF.js → chunk-NLMSSKES.js} +251 -6
  49. package/dist/{chunk-4VYUMYWD.js → chunk-OBI4YMCT.js} +17 -2
  50. package/dist/{chunk-LUCFN47K.js → chunk-QH4AA7QV.js} +1 -1
  51. package/dist/{chunk-VKVHY5HD.js → chunk-V37ZXMH3.js} +11 -3
  52. package/dist/{chunk-MHBC2XUP.js → chunk-VP7SDXYG.js} +1 -1
  53. package/dist/src/index.d.ts +2 -0
  54. package/dist/src/index.js +7 -5
  55. package/package.json +1 -1
  56. package/dist/chunk-GIRT7677.js +0 -11
  57. package/dist/chunk-RN3NOEJF.js +0 -9
  58. package/dist/{chunk-LALHWDWL.js → chunk-W6NPWHBJ.js} +3 -3
@@ -4,15 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleNotification
7
- } from "../chunk-6XSC6Z2K.js";
8
- import "../chunk-J3YDT4HM.js";
9
- import "../chunk-LGXTBUT4.js";
10
- import "../chunk-RN3NOEJF.js";
7
+ } from "../chunk-NFI2K2ZQ.js";
8
+ import "../chunk-GKAKAOKC.js";
9
+ import "../chunk-KOPUTJQC.js";
10
+ import "../chunk-2HYPZLYY.js";
11
+ import "../chunk-V37ZXMH3.js";
11
12
  import "../chunk-BSZYIAZL.js";
12
13
  import "../chunk-SAF6HGAA.js";
13
14
  import "../chunk-OFRNZWC4.js";
14
15
  import "../chunk-7QLSKOSU.js";
15
16
  import "../chunk-KZERVKTD.js";
17
+ import "../chunk-6MTNS63X.js";
16
18
  import "../chunk-2UMNXADU.js";
17
19
  import "../chunk-L4C2JXJS.js";
18
20
 
@@ -19,7 +19,7 @@ import {
19
19
  policyRequestFor,
20
20
  readLastPrompt,
21
21
  repoKeyFor
22
- } from "../chunk-6XSC6Z2K.js";
22
+ } from "../chunk-NFI2K2ZQ.js";
23
23
  import {
24
24
  DEFAULT_SESSION,
25
25
  askUser,
@@ -27,23 +27,26 @@ import {
27
27
  savePendingQuestion,
28
28
  sendNotification,
29
29
  waitForAnswer
30
- } from "../chunk-J3YDT4HM.js";
30
+ } from "../chunk-GKAKAOKC.js";
31
31
  import {
32
+ HOOK_FALLBACK_MAX,
32
33
  OPENCODE_TOOL_NAMES,
33
34
  deriveActionBody,
34
35
  deriveBlocker,
35
36
  deriveToolTarget,
36
37
  describeToolCall,
37
38
  scopePathFor
38
- } from "../chunk-LGXTBUT4.js";
39
+ } from "../chunk-KOPUTJQC.js";
39
40
  import {
40
41
  getMachineId
41
- } from "../chunk-RN3NOEJF.js";
42
+ } from "../chunk-2HYPZLYY.js";
43
+ import "../chunk-V37ZXMH3.js";
42
44
  import "../chunk-BSZYIAZL.js";
43
45
  import "../chunk-SAF6HGAA.js";
44
46
  import "../chunk-OFRNZWC4.js";
45
47
  import "../chunk-7QLSKOSU.js";
46
48
  import "../chunk-KZERVKTD.js";
49
+ import "../chunk-6MTNS63X.js";
47
50
  import {
48
51
  getApiKey
49
52
  } from "../chunk-2UMNXADU.js";
@@ -55,6 +58,7 @@ import {
55
58
  gateOutputFor,
56
59
  hookWaitClamped,
57
60
  hookWaitDeadline,
61
+ redactSecrets,
58
62
  resolveGate
59
63
  } from "../chunk-L4C2JXJS.js";
60
64
 
@@ -108,9 +112,13 @@ var pollForAnswer = async (apiKey, correlationId, deadlineMs, pollInterval = 2e3
108
112
  return { answered: false };
109
113
  };
110
114
  var agentNameFor = (input) => `${OPENCODE_AGENT.label} - ${basename(input.cwd ?? process.cwd())}`;
115
+ var describeFor = (input, lookup) => {
116
+ if (lookup.tool) return describeToolCall(lookup.tool, lookup.input, "hook");
117
+ return redactSecrets(input.title ?? "").trim().slice(0, HOOK_FALLBACK_MAX) || "this request";
118
+ };
111
119
  var pushQuestion = async (apiKey, input, lookup, waitSeconds, mode, pollInterval = 2e3) => {
112
120
  const projectName = basename(input.cwd ?? process.cwd());
113
- const description = describeToolCall(lookup.tool, lookup.input, "hook");
121
+ const description = describeFor(input, lookup);
114
122
  const result = await askUser(apiKey, {
115
123
  question: `Allow ${description}?`,
116
124
  type: "confirm",
@@ -147,7 +155,7 @@ var notifyApprovalNeeded = async (apiKey, input, lookup) => {
147
155
  try {
148
156
  await sendNotification(apiKey, {
149
157
  title: "Agent needs approval",
150
- body: describeToolCall(lookup.tool, lookup.input, "hook"),
158
+ body: describeFor(input, lookup),
151
159
  agentName: agentNameFor(input),
152
160
  sessionId: input.session_id,
153
161
  machineId: getMachineId()
@@ -1,22 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionDenied
4
- } from "../chunk-HEQVIIBN.js";
4
+ } from "../chunk-MZBT2LXW.js";
5
5
  import "../chunk-ATBKJNWS.js";
6
6
  import "../chunk-VZKXBFUA.js";
7
7
  import {
8
8
  readHookInput
9
9
  } from "../chunk-6CUUA7HO.js";
10
10
  import "../chunk-YHG74UFF.js";
11
- import "../chunk-6XSC6Z2K.js";
12
- import "../chunk-J3YDT4HM.js";
13
- import "../chunk-LGXTBUT4.js";
14
- import "../chunk-RN3NOEJF.js";
11
+ import "../chunk-NFI2K2ZQ.js";
12
+ import "../chunk-GKAKAOKC.js";
13
+ import "../chunk-KOPUTJQC.js";
14
+ import "../chunk-2HYPZLYY.js";
15
+ import "../chunk-V37ZXMH3.js";
15
16
  import "../chunk-BSZYIAZL.js";
16
17
  import "../chunk-SAF6HGAA.js";
17
18
  import "../chunk-OFRNZWC4.js";
18
19
  import "../chunk-7QLSKOSU.js";
19
20
  import "../chunk-KZERVKTD.js";
21
+ import "../chunk-6MTNS63X.js";
20
22
  import "../chunk-2UMNXADU.js";
21
23
  import "../chunk-L4C2JXJS.js";
22
24
 
@@ -1,22 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionRequest
4
- } from "../chunk-HEQVIIBN.js";
4
+ } from "../chunk-MZBT2LXW.js";
5
5
  import "../chunk-ATBKJNWS.js";
6
6
  import "../chunk-VZKXBFUA.js";
7
7
  import {
8
8
  readHookInput
9
9
  } from "../chunk-6CUUA7HO.js";
10
10
  import "../chunk-YHG74UFF.js";
11
- import "../chunk-6XSC6Z2K.js";
12
- import "../chunk-J3YDT4HM.js";
13
- import "../chunk-LGXTBUT4.js";
14
- import "../chunk-RN3NOEJF.js";
11
+ import "../chunk-NFI2K2ZQ.js";
12
+ import "../chunk-GKAKAOKC.js";
13
+ import "../chunk-KOPUTJQC.js";
14
+ import "../chunk-2HYPZLYY.js";
15
+ import "../chunk-V37ZXMH3.js";
15
16
  import "../chunk-BSZYIAZL.js";
16
17
  import "../chunk-SAF6HGAA.js";
17
18
  import "../chunk-OFRNZWC4.js";
18
19
  import "../chunk-7QLSKOSU.js";
19
20
  import "../chunk-KZERVKTD.js";
21
+ import "../chunk-6MTNS63X.js";
20
22
  import "../chunk-2UMNXADU.js";
21
23
  import "../chunk-L4C2JXJS.js";
22
24
 
@@ -4,15 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handlePostToolUse
7
- } from "../chunk-6XSC6Z2K.js";
8
- import "../chunk-J3YDT4HM.js";
9
- import "../chunk-LGXTBUT4.js";
10
- import "../chunk-RN3NOEJF.js";
7
+ } from "../chunk-NFI2K2ZQ.js";
8
+ import "../chunk-GKAKAOKC.js";
9
+ import "../chunk-KOPUTJQC.js";
10
+ import "../chunk-2HYPZLYY.js";
11
+ import "../chunk-V37ZXMH3.js";
11
12
  import "../chunk-BSZYIAZL.js";
12
13
  import "../chunk-SAF6HGAA.js";
13
14
  import "../chunk-OFRNZWC4.js";
14
15
  import "../chunk-7QLSKOSU.js";
15
16
  import "../chunk-KZERVKTD.js";
17
+ import "../chunk-6MTNS63X.js";
16
18
  import "../chunk-2UMNXADU.js";
17
19
  import "../chunk-L4C2JXJS.js";
18
20
 
@@ -4,15 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleUserPrompt
7
- } from "../chunk-6XSC6Z2K.js";
8
- import "../chunk-J3YDT4HM.js";
9
- import "../chunk-LGXTBUT4.js";
10
- import "../chunk-RN3NOEJF.js";
7
+ } from "../chunk-NFI2K2ZQ.js";
8
+ import "../chunk-GKAKAOKC.js";
9
+ import "../chunk-KOPUTJQC.js";
10
+ import "../chunk-2HYPZLYY.js";
11
+ import "../chunk-V37ZXMH3.js";
11
12
  import "../chunk-BSZYIAZL.js";
12
13
  import "../chunk-SAF6HGAA.js";
13
14
  import "../chunk-OFRNZWC4.js";
14
15
  import "../chunk-7QLSKOSU.js";
15
16
  import "../chunk-KZERVKTD.js";
17
+ import "../chunk-6MTNS63X.js";
16
18
  import "../chunk-2UMNXADU.js";
17
19
  import "../chunk-L4C2JXJS.js";
18
20
 
@@ -4,15 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleSessionEnd
7
- } from "../chunk-6XSC6Z2K.js";
8
- import "../chunk-J3YDT4HM.js";
9
- import "../chunk-LGXTBUT4.js";
10
- import "../chunk-RN3NOEJF.js";
7
+ } from "../chunk-NFI2K2ZQ.js";
8
+ import "../chunk-GKAKAOKC.js";
9
+ import "../chunk-KOPUTJQC.js";
10
+ import "../chunk-2HYPZLYY.js";
11
+ import "../chunk-V37ZXMH3.js";
11
12
  import "../chunk-BSZYIAZL.js";
12
13
  import "../chunk-SAF6HGAA.js";
13
14
  import "../chunk-OFRNZWC4.js";
14
15
  import "../chunk-7QLSKOSU.js";
15
16
  import "../chunk-KZERVKTD.js";
17
+ import "../chunk-6MTNS63X.js";
16
18
  import "../chunk-2UMNXADU.js";
17
19
  import "../chunk-L4C2JXJS.js";
18
20
 
@@ -4,15 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleSessionStart
7
- } from "../chunk-6XSC6Z2K.js";
8
- import "../chunk-J3YDT4HM.js";
9
- import "../chunk-LGXTBUT4.js";
10
- import "../chunk-RN3NOEJF.js";
7
+ } from "../chunk-NFI2K2ZQ.js";
8
+ import "../chunk-GKAKAOKC.js";
9
+ import "../chunk-KOPUTJQC.js";
10
+ import "../chunk-2HYPZLYY.js";
11
+ import "../chunk-V37ZXMH3.js";
11
12
  import "../chunk-BSZYIAZL.js";
12
13
  import "../chunk-SAF6HGAA.js";
13
14
  import "../chunk-OFRNZWC4.js";
14
15
  import "../chunk-7QLSKOSU.js";
15
16
  import "../chunk-KZERVKTD.js";
17
+ import "../chunk-6MTNS63X.js";
16
18
  import "../chunk-2UMNXADU.js";
17
19
  import "../chunk-L4C2JXJS.js";
18
20
 
@@ -6,13 +6,10 @@ import {
6
6
  claudeWired,
7
7
  codexWired,
8
8
  geminiWired
9
- } from "../chunk-4VYUMYWD.js";
9
+ } from "../chunk-OBI4YMCT.js";
10
10
  import {
11
11
  runBrowserLogin
12
12
  } from "../chunk-Z3Z4VK5F.js";
13
- import {
14
- ensureDaemonRunning
15
- } from "../chunk-K42SZKYF.js";
16
13
  import {
17
14
  describeDetection,
18
15
  detectAllAgents,
@@ -24,7 +21,7 @@ import {
24
21
  shortenHome,
25
22
  vscodeSettingsTargets,
26
23
  writeInstructionBlock
27
- } from "../chunk-LUCFN47K.js";
24
+ } from "../chunk-QH4AA7QV.js";
28
25
  import {
29
26
  OPENCODE_HOOK_BINARY,
30
27
  addOpenCodeMcpServer,
@@ -52,6 +49,10 @@ import {
52
49
  guardNodeScript,
53
50
  guardedArgv
54
51
  } from "../chunk-AIGDBRIJ.js";
52
+ import {
53
+ ensureDaemonRunning,
54
+ replaceDaemonService
55
+ } from "../chunk-NLMSSKES.js";
55
56
  import "../chunk-XHKBHWLX.js";
56
57
  import {
57
58
  installGlobally,
@@ -59,6 +60,12 @@ import {
59
60
  resolveGlobalBinDir,
60
61
  resolveGlobalBinary
61
62
  } from "../chunk-PZA7G4CN.js";
63
+ import {
64
+ reportEvent
65
+ } from "../chunk-NFI2K2ZQ.js";
66
+ import "../chunk-GKAKAOKC.js";
67
+ import "../chunk-KOPUTJQC.js";
68
+ import "../chunk-2HYPZLYY.js";
62
69
  import {
63
70
  addCodexHookTrust,
64
71
  addCodexHooks,
@@ -78,14 +85,7 @@ import {
78
85
  geminiSettings,
79
86
  pusharyConfigFile,
80
87
  vscodePluginDir
81
- } from "../chunk-VKVHY5HD.js";
82
- import "../chunk-GIRT7677.js";
83
- import {
84
- reportEvent
85
- } from "../chunk-6XSC6Z2K.js";
86
- import "../chunk-J3YDT4HM.js";
87
- import "../chunk-LGXTBUT4.js";
88
- import "../chunk-RN3NOEJF.js";
88
+ } from "../chunk-V37ZXMH3.js";
89
89
  import {
90
90
  confirmAppConnection,
91
91
  connectDevice,
@@ -110,13 +110,13 @@ import {
110
110
  readConfigFileKey,
111
111
  readKeySource,
112
112
  writeKey
113
- } from "../chunk-LALHWDWL.js";
113
+ } from "../chunk-W6NPWHBJ.js";
114
114
  import {
115
115
  parseFlags
116
116
  } from "../chunk-GMXKITVA.js";
117
117
  import {
118
118
  renderCommandHelp
119
- } from "../chunk-GOEXZ5QJ.js";
119
+ } from "../chunk-GPNOHKFO.js";
120
120
  import {
121
121
  installClaudeAlias,
122
122
  resolveShellRc
@@ -125,12 +125,6 @@ import {
125
125
  getPackageVersion,
126
126
  isNewerVersion
127
127
  } from "../chunk-DINDL2CF.js";
128
- import {
129
- backupFile,
130
- readJsonSafe,
131
- writeFileAtomic,
132
- writeJsonAtomic
133
- } from "../chunk-6MTNS63X.js";
134
128
  import "../chunk-BSZYIAZL.js";
135
129
  import "../chunk-SAF6HGAA.js";
136
130
  import "../chunk-OFRNZWC4.js";
@@ -140,6 +134,12 @@ import {
140
134
  import {
141
135
  EXIT
142
136
  } from "../chunk-KZERVKTD.js";
137
+ import {
138
+ backupFile,
139
+ readJsonSafe,
140
+ writeFileAtomic,
141
+ writeJsonAtomic
142
+ } from "../chunk-6MTNS63X.js";
143
143
  import "../chunk-2UMNXADU.js";
144
144
  import {
145
145
  CURSOR_GATE_EVENTS,
@@ -204,6 +204,18 @@ var describeClosing = (facts) => {
204
204
  exitCode: EXIT.PROBLEMS_FOUND
205
205
  };
206
206
  }
207
+ if (facts.daemonReady === false) {
208
+ return {
209
+ ok: false,
210
+ headline: "Setup finished with 1 problem.",
211
+ next: [
212
+ "Approvals are configured, but this machine cannot start an agent from your phone.",
213
+ "pushary daemon install install or repair the background service",
214
+ "pushary doctor verify it became reachable"
215
+ ],
216
+ exitCode: EXIT.PROBLEMS_FOUND
217
+ };
218
+ }
207
219
  if (facts.roundTripAnswered === true) {
208
220
  return {
209
221
  ok: true,
@@ -1133,14 +1145,17 @@ var installCursorUserHooks = (gateScript) => {
1133
1145
  const bundled = readJson(join3(CURSOR_PLUGIN_DIR, "hooks", "hooks.json")).hooks ?? {};
1134
1146
  let userHooks = {};
1135
1147
  if (existsSync(CURSOR_USER_HOOKS)) {
1136
- try {
1137
- userHooks = JSON.parse(readFileSync(CURSOR_USER_HOOKS, "utf-8"));
1138
- } catch {
1148
+ const result = readJsonSafe(CURSOR_USER_HOOKS);
1149
+ if (result.kind === "ok") userHooks = result.value;
1150
+ else {
1151
+ let backup = "";
1139
1152
  try {
1140
- cpSync(CURSOR_USER_HOOKS, `${CURSOR_USER_HOOKS}.bak`);
1153
+ backup = backupFile(CURSOR_USER_HOOKS);
1141
1154
  } catch {
1142
1155
  }
1143
- userHooks = {};
1156
+ throw new Error(
1157
+ `Could not parse or read Cursor hooks.json; left it untouched${backup ? ` and backed it up at ${backup}` : ""}. Fix the file, then re-run setup.`
1158
+ );
1144
1159
  }
1145
1160
  }
1146
1161
  const hooks = userHooks.hooks ?? {};
@@ -1796,6 +1811,7 @@ var main = async () => {
1796
1811
  process.exit(EXIT.OK);
1797
1812
  } else if (connectMode === "app" && canShowPairingQr() && !options.skipPhone) {
1798
1813
  console.log(` ${dim("Pairing with your Pushary app.")}`);
1814
+ console.log(` ${dim("Agent control requires a paid plan after the trial. Current pricing:")} ${cyan("https://pushary.com/pricing")}`);
1799
1815
  console.log(` ${dim("No app yet? Get it at")} ${cyan("https://pushary.com/download")}${dim(", this keeps waiting.")}`);
1800
1816
  console.log(` ${dim("No phone? Ctrl-C, then:")} ${cyan("npx @pushary/agent-hooks setup --connect browser")}`);
1801
1817
  markStep("pair");
@@ -2011,6 +2027,12 @@ var main = async () => {
2011
2027
  const reachChecked = phone !== null;
2012
2028
  const reachesYou = phone?.reachesYou ?? true;
2013
2029
  markStep("closing");
2030
+ const keyIsTrusted = keyFromPairing || keyCheck?.kind === "ok";
2031
+ const daemon = keyIsTrusted && completed.length > 0 ? await (async () => {
2032
+ const service = await replaceDaemonService();
2033
+ return service.kind === "ok" ? ensureDaemonRunning({ spawnDaemon: () => {
2034
+ } }) : { kind: "unavailable", detail: service.detail };
2035
+ })() : null;
2014
2036
  const closing = describeClosing({
2015
2037
  agentsOk,
2016
2038
  configuredNothing,
@@ -2018,12 +2040,11 @@ var main = async () => {
2018
2040
  failed,
2019
2041
  reachChecked,
2020
2042
  reachesYou,
2043
+ daemonReady: daemon === null ? null : daemon.kind === "running" || daemon.kind === "started",
2021
2044
  // null when the check did not run, so it changes nothing. Only an outright
2022
2045
  // `false` is allowed to hold back "Setup complete.".
2023
2046
  roundTripAnswered: roundTrip === null ? null : roundTrip.kind === "answered" ? true : roundTrip.kind === "unanswered" ? false : null
2024
2047
  });
2025
- const keyIsTrusted = keyFromPairing || keyCheck?.kind === "ok";
2026
- const daemon = keyIsTrusted && completed.length > 0 ? await ensureDaemonRunning() : null;
2027
2048
  console.log(` ${closing.ok ? green(bold(closing.headline)) : yellow(bold(closing.headline))}`);
2028
2049
  if (failed.length > 0) {
2029
2050
  console.log();
@@ -4,8 +4,8 @@ import {
4
4
  } from "../chunk-VZKXBFUA.js";
5
5
  import {
6
6
  exitOnHelpFlag
7
- } from "../chunk-SQOFGPNX.js";
8
- import "../chunk-GOEXZ5QJ.js";
7
+ } from "../chunk-KJ57OPCC.js";
8
+ import "../chunk-GPNOHKFO.js";
9
9
  import "../chunk-DINDL2CF.js";
10
10
  import "../chunk-KZERVKTD.js";
11
11
  import {
@@ -2,8 +2,9 @@
2
2
  import {
3
3
  describeLastSeen,
4
4
  listMachines
5
- } from "../chunk-MHBC2XUP.js";
6
- import "../chunk-RN3NOEJF.js";
5
+ } from "../chunk-VP7SDXYG.js";
6
+ import "../chunk-2HYPZLYY.js";
7
+ import "../chunk-V37ZXMH3.js";
7
8
  import {
8
9
  describeReach,
9
10
  fetchChannels,
@@ -19,17 +20,16 @@ import {
19
20
  } from "../chunk-5RUIFDTP.js";
20
21
  import {
21
22
  readKeySource
22
- } from "../chunk-LALHWDWL.js";
23
+ } from "../chunk-W6NPWHBJ.js";
23
24
  import {
24
25
  rejectUnknownFlags
25
26
  } from "../chunk-GMXKITVA.js";
26
27
  import {
27
28
  exitOnHelpFlag
28
- } from "../chunk-SQOFGPNX.js";
29
- import "../chunk-GOEXZ5QJ.js";
29
+ } from "../chunk-KJ57OPCC.js";
30
+ import "../chunk-GPNOHKFO.js";
30
31
  import "../chunk-BC3VCZ3E.js";
31
32
  import "../chunk-DINDL2CF.js";
32
- import "../chunk-6MTNS63X.js";
33
33
  import "../chunk-BSZYIAZL.js";
34
34
  import "../chunk-SAF6HGAA.js";
35
35
  import "../chunk-OFRNZWC4.js";
@@ -39,6 +39,7 @@ import {
39
39
  import {
40
40
  EXIT
41
41
  } from "../chunk-KZERVKTD.js";
42
+ import "../chunk-6MTNS63X.js";
42
43
  import "../chunk-2UMNXADU.js";
43
44
  import "../chunk-L4C2JXJS.js";
44
45
 
@@ -4,15 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleStop
7
- } from "../chunk-6XSC6Z2K.js";
8
- import "../chunk-J3YDT4HM.js";
9
- import "../chunk-LGXTBUT4.js";
10
- import "../chunk-RN3NOEJF.js";
7
+ } from "../chunk-NFI2K2ZQ.js";
8
+ import "../chunk-GKAKAOKC.js";
9
+ import "../chunk-KOPUTJQC.js";
10
+ import "../chunk-2HYPZLYY.js";
11
+ import "../chunk-V37ZXMH3.js";
11
12
  import "../chunk-BSZYIAZL.js";
12
13
  import "../chunk-SAF6HGAA.js";
13
14
  import "../chunk-OFRNZWC4.js";
14
15
  import "../chunk-7QLSKOSU.js";
15
16
  import "../chunk-KZERVKTD.js";
17
+ import "../chunk-6MTNS63X.js";
16
18
  import "../chunk-2UMNXADU.js";
17
19
  import "../chunk-L4C2JXJS.js";
18
20
 
@@ -4,15 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleStopFailure
7
- } from "../chunk-6XSC6Z2K.js";
8
- import "../chunk-J3YDT4HM.js";
9
- import "../chunk-LGXTBUT4.js";
10
- import "../chunk-RN3NOEJF.js";
7
+ } from "../chunk-NFI2K2ZQ.js";
8
+ import "../chunk-GKAKAOKC.js";
9
+ import "../chunk-KOPUTJQC.js";
10
+ import "../chunk-2HYPZLYY.js";
11
+ import "../chunk-V37ZXMH3.js";
11
12
  import "../chunk-BSZYIAZL.js";
12
13
  import "../chunk-SAF6HGAA.js";
13
14
  import "../chunk-OFRNZWC4.js";
14
15
  import "../chunk-7QLSKOSU.js";
15
16
  import "../chunk-KZERVKTD.js";
17
+ import "../chunk-6MTNS63X.js";
16
18
  import "../chunk-2UMNXADU.js";
17
19
  import "../chunk-L4C2JXJS.js";
18
20
 
@@ -7,8 +7,8 @@ import {
7
7
  } from "../chunk-GMXKITVA.js";
8
8
  import {
9
9
  exitOnHelpFlag
10
- } from "../chunk-SQOFGPNX.js";
11
- import "../chunk-GOEXZ5QJ.js";
10
+ } from "../chunk-KJ57OPCC.js";
11
+ import "../chunk-GPNOHKFO.js";
12
12
  import "../chunk-DINDL2CF.js";
13
13
  import {
14
14
  UsageError
@@ -15,12 +15,20 @@ import "../chunk-ATBKJNWS.js";
15
15
  import {
16
16
  guardBinary
17
17
  } from "../chunk-AIGDBRIJ.js";
18
+ import {
19
+ ensureDaemonRunning,
20
+ replaceDaemonService
21
+ } from "../chunk-NLMSSKES.js";
22
+ import {
23
+ needsShell
24
+ } from "../chunk-XHKBHWLX.js";
18
25
  import {
19
26
  execNpm,
20
27
  npmErrorMessage,
21
28
  resolveGlobalBinDir,
22
29
  resolveGlobalBinary
23
30
  } from "../chunk-PZA7G4CN.js";
31
+ import "../chunk-2HYPZLYY.js";
24
32
  import {
25
33
  CODEX_HOOK_BINARY,
26
34
  addCodexHookTrust,
@@ -35,19 +43,18 @@ import {
35
43
  hasCodexHooks,
36
44
  vscodePluginDir,
37
45
  vscodePluginMcp
38
- } from "../chunk-VKVHY5HD.js";
39
- import "../chunk-GIRT7677.js";
46
+ } from "../chunk-V37ZXMH3.js";
40
47
  import {
41
48
  exitOnHelpFlag
42
- } from "../chunk-SQOFGPNX.js";
43
- import "../chunk-GOEXZ5QJ.js";
49
+ } from "../chunk-KJ57OPCC.js";
50
+ import "../chunk-GPNOHKFO.js";
44
51
  import {
45
52
  isNewerVersion
46
53
  } from "../chunk-DINDL2CF.js";
54
+ import "../chunk-KZERVKTD.js";
47
55
  import {
48
56
  readJsonSafe
49
57
  } from "../chunk-6MTNS63X.js";
50
- import "../chunk-KZERVKTD.js";
51
58
  import {
52
59
  getApiKey
53
60
  } from "../chunk-2UMNXADU.js";
@@ -57,6 +64,7 @@ import "../chunk-L4C2JXJS.js";
57
64
  import { existsSync as existsSync2 } from "fs";
58
65
  import { homedir as homedir2 } from "os";
59
66
  import { join as join2 } from "path";
67
+ import { execFileSync } from "child_process";
60
68
 
61
69
  // src/reapply.ts
62
70
  import { join, dirname } from "path";
@@ -263,7 +271,49 @@ var fetchLatestVersion = async () => {
263
271
  return void 0;
264
272
  }
265
273
  };
274
+ var finishUpgrade = async () => {
275
+ let apiKey;
276
+ try {
277
+ apiKey = getApiKey();
278
+ } catch {
279
+ apiKey = void 0;
280
+ }
281
+ const refreshed = reapplyAllAgents(apiKey);
282
+ let daemonReady = true;
283
+ if (apiKey) {
284
+ const service = await replaceDaemonService();
285
+ const daemon = service.kind === "ok" ? await ensureDaemonRunning({ spawnDaemon: () => {
286
+ } }) : null;
287
+ daemonReady = service.kind === "ok" && (daemon?.kind === "running" || daemon?.kind === "started");
288
+ }
289
+ console.log();
290
+ if (refreshed.length > 0) {
291
+ console.log("Refreshed so the new hook set is active now:");
292
+ for (const agent of refreshed) {
293
+ const parts = [agent.result.hooks ? "hooks" : null, agent.result.mcp ? "MCP key" : null].filter(Boolean).join(" + ");
294
+ console.log(` ${agent.label.padEnd(14)} ${parts}`);
295
+ }
296
+ if (!apiKey) {
297
+ console.log();
298
+ console.log("No key was readable here, so MCP entries kept the key they already had.");
299
+ }
300
+ } else {
301
+ console.log("No agent config on this machine needed refreshing.");
302
+ }
303
+ console.log();
304
+ if (!daemonReady) {
305
+ console.error("Upgrade installed, but the background service did not start. Run: pushary daemon install");
306
+ process.exitCode = 1;
307
+ return;
308
+ }
309
+ console.log("Done. Your hooks and background service use the new global install.");
310
+ console.log("Verify with: pushary doctor");
311
+ };
266
312
  var main = async () => {
313
+ if (process.argv.includes("--finish-upgrade")) {
314
+ await finishUpgrade();
315
+ return;
316
+ }
267
317
  const installed = getInstalledVersion();
268
318
  if (!installed) {
269
319
  const found = detectInstallModes();
@@ -294,29 +344,14 @@ var main = async () => {
294
344
  console.error(`Upgrade failed: ${npmErrorMessage(err)}`);
295
345
  process.exit(1);
296
346
  }
297
- let apiKey;
298
- try {
299
- apiKey = getApiKey();
300
- } catch {
301
- apiKey = void 0;
302
- }
303
- const refreshed = reapplyAllAgents(apiKey);
304
- console.log();
305
- if (refreshed.length > 0) {
306
- console.log("Refreshed so the new hook set is active now:");
307
- for (const agent of refreshed) {
308
- const parts = [agent.result.hooks ? "hooks" : null, agent.result.mcp ? "MCP key" : null].filter(Boolean).join(" + ");
309
- console.log(` ${agent.label.padEnd(14)} ${parts}`);
310
- }
311
- if (!apiKey) {
312
- console.log();
313
- console.log("No key was readable here, so MCP entries kept the key they already had.");
314
- }
315
- } else {
316
- console.log("No agent config on this machine needed refreshing.");
347
+ const upgradedBinary = resolveGlobalBinary("pushary-upgrade");
348
+ if (!upgradedBinary) {
349
+ console.error("Upgrade installed, but the new pushary-upgrade binary could not be found on PATH.");
350
+ process.exit(1);
317
351
  }
318
- console.log();
319
- console.log("Done. Your hooks point at the global install.");
320
- console.log("Verify with: pushary doctor");
352
+ execFileSync(upgradedBinary, ["--finish-upgrade"], {
353
+ stdio: "inherit",
354
+ shell: needsShell(upgradedBinary)
355
+ });
321
356
  };
322
357
  main();