@pushary/agent-hooks 0.88.0 → 0.88.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 (62) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/data/cursor-plugin/scripts/pushary-gate.mjs +63 -7
  3. package/data/vscode-plugin/scripts/pushary-gate.mjs +56 -18
  4. package/dist/bin/pushary-bell-hook.js +4 -4
  5. package/dist/bin/pushary-bell.js +7 -7
  6. package/dist/bin/pushary-claude.js +9 -9
  7. package/dist/bin/pushary-clean.js +11 -13
  8. package/dist/bin/pushary-codex-bridge.js +6 -6
  9. package/dist/bin/pushary-codex-hook.js +5 -5
  10. package/dist/bin/pushary-codex.js +4 -4
  11. package/dist/bin/pushary-connect.js +6 -6
  12. package/dist/bin/pushary-daemon.js +5 -5
  13. package/dist/bin/pushary-disconnect.js +9 -11
  14. package/dist/bin/pushary-doctor.js +15 -15
  15. package/dist/bin/pushary-elicitation-hook.js +7 -120
  16. package/dist/bin/pushary-gemini-bridge.js +6 -6
  17. package/dist/bin/pushary-gemini-hook.js +5 -5
  18. package/dist/bin/pushary-hook.js +6 -6
  19. package/dist/bin/pushary-login.js +4 -4
  20. package/dist/bin/pushary-logout.js +4 -4
  21. package/dist/bin/pushary-mode.js +3 -3
  22. package/dist/bin/pushary-notification-hook.js +4 -4
  23. package/dist/bin/pushary-opencode-hook.js +5 -5
  24. package/dist/bin/pushary-permission-denied-hook.js +6 -6
  25. package/dist/bin/pushary-permission-hook.js +6 -6
  26. package/dist/bin/pushary-post-hook.js +4 -4
  27. package/dist/bin/pushary-prompt-hook.js +4 -4
  28. package/dist/bin/pushary-session-end-hook.js +4 -4
  29. package/dist/bin/pushary-session-start-hook.js +4 -4
  30. package/dist/bin/pushary-setup.js +25 -24
  31. package/dist/bin/pushary-stats.js +2 -2
  32. package/dist/bin/pushary-status.js +5 -5
  33. package/dist/bin/pushary-stop-hook.js +4 -4
  34. package/dist/bin/pushary-stopfailure-hook.js +4 -4
  35. package/dist/bin/pushary-upgrade.js +9 -11
  36. package/dist/bin/pushary-wait.js +3 -3
  37. package/dist/{chunk-OULRSHFB.js → chunk-4FANZF2L.js} +2 -2
  38. package/dist/{chunk-DSTZ2RBU.js → chunk-4KMWTOBK.js} +4 -1
  39. package/dist/{chunk-LEYXXXRN.js → chunk-6GBQDZ7K.js} +1 -1
  40. package/dist/{chunk-B7ZBHWOW.js → chunk-AIGDBRIJ.js} +1 -1
  41. package/dist/{chunk-VSCSZ2LI.js → chunk-AJ4EMW5D.js} +1 -1
  42. package/dist/{chunk-DXBUFXPL.js → chunk-DLI5IXSD.js} +1 -1
  43. package/dist/{chunk-67TNJVJW.js → chunk-EKNFTIKO.js} +1 -1
  44. package/dist/{chunk-MY5A4EPQ.js → chunk-F3ZDPL6O.js} +187 -60
  45. package/dist/{chunk-VHHVGVFQ.js → chunk-FRH2QIMY.js} +1 -1
  46. package/dist/{chunk-XFHMGVMX.js → chunk-LNAQWWBP.js} +1 -1
  47. package/dist/{chunk-F5W3AY6L.js → chunk-LXTX5CT7.js} +1 -1
  48. package/dist/{chunk-T2XZH7D5.js → chunk-O7P7O4VY.js} +2 -2
  49. package/dist/{chunk-MNXG6IIM.js → chunk-OSE7X44J.js} +3 -3
  50. package/dist/{chunk-4VYELDAH.js → chunk-PXEFENML.js} +1 -1
  51. package/dist/{chunk-3JL64GVE.js → chunk-Q6MK2YKV.js} +120 -1
  52. package/dist/{chunk-ESARAYRI.js → chunk-SHVW5KFR.js} +1 -1
  53. package/dist/{chunk-RSUBLTMP.js → chunk-SUZF64M4.js} +2 -2
  54. package/dist/{chunk-3B3PYTKH.js → chunk-U44C3ULB.js} +1 -1
  55. package/dist/{chunk-UTQCV46U.js → chunk-U65EIMUJ.js} +4 -4
  56. package/dist/{chunk-6BOE5NJZ.js → chunk-WFFPWJN6.js} +1 -1
  57. package/dist/{chunk-WXCHB6BO.js → chunk-WPDMGNQR.js} +1 -1
  58. package/dist/{chunk-3PSEZOC4.js → chunk-ZPRF4YLA.js} +1 -1
  59. package/dist/src/index.js +6 -6
  60. package/package.json +1 -1
  61. package/dist/chunk-U6HRYNHC.js +0 -137
  62. /package/dist/{chunk-VT4IVERX.js → chunk-PZA7G4CN.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.88.1
4
+
5
+ ### One install, whichever surface writes it
6
+
7
+ The generated hook spec now describes the whole install, not only the hooks: the
8
+ MCP entry for each agent, the managed block in AGENTS.md or GEMINI.md, and the
9
+ skill. The CLI writes exactly what it wrote before. The Mac app reads the same
10
+ spec, so an install from the app and an install from `pushary setup` leave the
11
+ same files behind, and Repair can put back a tool entry as well as a hook.
12
+
13
+ `Elicitation` is no longer CLI-only in the spec: a typed answer can now come back
14
+ from a settlement, so the Mac app writes that hook too.
15
+
16
+ ### One predicate for Ctrl-C at a prompt
17
+
18
+ Setup carried its own test for an inquirer cancellation and matched a different
19
+ string from the one in `cli/exit.ts`. Both agreed on inquirer's current wording
20
+ and would have disagreed the day it changed, printing "Setup failed" over a
21
+ deliberate Ctrl-C. One predicate now, matching the union of what both matched.
22
+
3
23
  ## 0.87.1
4
24
 
5
25
  ### Unanswered approvals hand off once and fail closed
@@ -40,6 +40,7 @@ const MAX_BLOCK_MS = 45_000 // longest we can wait before Cursor's hook timeout
40
40
  const WAIT_CHUNK_MS = 20_000 // per wait_for_answer long-poll
41
41
  const POLL_GAP_MS = 1_500 // pause between polls after a transient error
42
42
  const NET_TIMEOUT_MS = 27_000 // abort a single MCP request
43
+ const WITHDRAW_TIMEOUT_MS = 4_000
43
44
  const HARD_GUARD_MS = 55_000 // force a graceful "ask" before failClosed (60s) fires
44
45
 
45
46
  // ── Cursor decisions ──────────────────────────────────────────────────────────
@@ -208,7 +209,7 @@ const parseMcpBody = (body, contentType) => {
208
209
  return JSON.parse(body)
209
210
  }
210
211
 
211
- const callTool = async (apiKey, name, args) => {
212
+ const callTool = async (apiKey, name, args, timeoutMs = NET_TIMEOUT_MS) => {
212
213
  const response = await fetch(MCP_URL, {
213
214
  method: 'POST',
214
215
  headers: {
@@ -217,7 +218,7 @@ const callTool = async (apiKey, name, args) => {
217
218
  Authorization: `Bearer ${apiKey}`,
218
219
  },
219
220
  body: JSON.stringify({ jsonrpc: '2.0', id: Date.now(), method: 'tools/call', params: { name, arguments: args } }),
220
- signal: AbortSignal.timeout(NET_TIMEOUT_MS),
221
+ signal: AbortSignal.timeout(timeoutMs),
221
222
  })
222
223
  const text = await response.text()
223
224
  if (!response.ok) throw new Error(`Pushary MCP ${response.status}`)
@@ -376,6 +377,33 @@ const pollForAnswer = async (apiKey, correlationId, deadlineMs) => {
376
377
  const fromTimeoutAction = (action, deniedReason) =>
377
378
  action === 'approve' ? ALLOW : action === 'deny' ? deny(deniedReason) : ask()
378
379
 
380
+ const fromAnswer = (answer, deniedReason) => {
381
+ if (answer.value === 'defer') return ask()
382
+ return answer.value === 'yes' ? ALLOW : deny(deniedReason)
383
+ }
384
+
385
+ const withdraw = async (apiKey, correlationId) => {
386
+ const unanswered = { answered: false }
387
+ let cancelled
388
+ try {
389
+ cancelled = await callTool(apiKey, 'cancel_question', { correlationId }, WITHDRAW_TIMEOUT_MS)
390
+ } catch {
391
+ return unanswered
392
+ }
393
+ if (cancelled?.cancelled !== false || cancelled?.status === 'unavailable') return unanswered
394
+ try {
395
+ const answer = await callTool(apiKey, 'wait_for_answer', { correlationId, timeoutMs: 1_000 }, WITHDRAW_TIMEOUT_MS)
396
+ return answer?.answered ? answer : unanswered
397
+ } catch {
398
+ return unanswered
399
+ }
400
+ }
401
+
402
+ const handedOff = (asked) => asked.suppressed || asked.status === 'terminal'
403
+
404
+ const handoffMessage = (asked) =>
405
+ asked.suppressed ? 'You are at the keyboard, approve here.' : 'Delivery mode is Terminal, approve here.'
406
+
379
407
  const denialFor = (noun) =>
380
408
  `The user denied this ${noun} via a Pushary push approval. Do not run it — propose an alternative or ask how to proceed.`
381
409
 
@@ -452,10 +480,24 @@ const handlePushOnly = async (apiKey, request, project, ident, timeoutSeconds, t
452
480
  }
453
481
  if (!asked?.correlationId) return ask()
454
482
 
455
- const realMs = Math.max(timeoutSeconds, 1) * 1000
483
+ if (handedOff(asked)) {
484
+ const late = await withdraw(apiKey, asked.correlationId)
485
+ if (late.answered) return fromAnswer(late, request.denied)
486
+ return ask(handoffMessage(asked))
487
+ }
488
+ if (asked.noDevices) {
489
+ const late = await withdraw(apiKey, asked.correlationId)
490
+ if (late.answered) return fromAnswer(late, request.denied)
491
+ return fromTimeoutAction(timeoutAction, 'No device connected to approve on; denied per your Pushary policy.')
492
+ }
493
+
494
+ const realMs = timeoutAction === 'wait' ? MAX_BLOCK_MS : Math.max(timeoutSeconds, 1) * 1000
456
495
  const cap = Math.min(realMs, MAX_BLOCK_MS)
457
496
  const answer = await pollForAnswer(apiKey, asked.correlationId, Date.now() + cap)
458
- if (answer.answered) return answer.value === 'yes' ? ALLOW : deny(request.denied)
497
+ if (answer.answered) return fromAnswer(answer, request.denied)
498
+
499
+ const late = await withdraw(apiKey, asked.correlationId)
500
+ if (late.answered) return fromAnswer(late, request.denied)
459
501
 
460
502
  // If Cursor's hook limit cut us off before the configured timeout, hand off to
461
503
  // Cursor's own prompt rather than misapplying the policy's timeout action.
@@ -473,10 +515,24 @@ const handlePushFirst = async (apiKey, request, project, ident, pushFirstSeconds
473
515
  }
474
516
  if (!asked?.correlationId) return ask()
475
517
 
518
+ if (handedOff(asked)) {
519
+ const late = await withdraw(apiKey, asked.correlationId)
520
+ if (late.answered) return fromAnswer(late, request.denied)
521
+ return ask(handoffMessage(asked))
522
+ }
523
+ if (asked.noDevices) {
524
+ const late = await withdraw(apiKey, asked.correlationId)
525
+ if (late.answered) return fromAnswer(late, request.denied)
526
+ return ask('No device connected, approve here.')
527
+ }
528
+
476
529
  const cap = Math.min(Math.max(pushFirstSeconds, 1) * 1000, MAX_BLOCK_MS)
477
530
  const answer = await pollForAnswer(apiKey, asked.correlationId, Date.now() + cap)
478
- if (answer.answered) return answer.value === 'yes' ? ALLOW : deny(request.denied)
479
- return ask('Sent to your phone via Pushary — you can also approve here.')
531
+ if (answer.answered) return fromAnswer(answer, request.denied)
532
+
533
+ const late = await withdraw(apiKey, asked.correlationId)
534
+ if (late.answered) return fromAnswer(late, request.denied)
535
+ return ask('No answer from your phone in time, so the request was withdrawn there. Approve here.')
480
536
  }
481
537
 
482
538
  // notify_only: fire an awareness notification, let Cursor's prompt decide.
@@ -548,7 +604,7 @@ const main = async () => {
548
604
 
549
605
  // Exported for scripts/pushary-gate.test.mjs. main() only runs when the gate is
550
606
  // executed directly, so importing this file for a test does not read stdin.
551
- export { normalizeRepoRemote, deriveRepoKey, describeRequest }
607
+ export { normalizeRepoRemote, deriveRepoKey, describeRequest, handlePushOnly, handlePushFirst, withdraw }
552
608
 
553
609
  const isDirectRun = process.argv[1] && import.meta.url === `file://${process.argv[1]}`
554
610
  if (!isDirectRun) {
@@ -51,6 +51,7 @@ const MAX_BLOCK_MS = 45_000 // longest we can wait inside VS Code's hook timeout
51
51
  const WAIT_CHUNK_MS = 20_000 // per wait_for_answer long-poll
52
52
  const POLL_GAP_MS = 1_500 // pause between polls after a transient error
53
53
  const NET_TIMEOUT_MS = 27_000 // abort a single MCP request
54
+ const WITHDRAW_TIMEOUT_MS = 4_000
54
55
  const HARD_GUARD_MS = 55_000 // force a graceful "ask" before the 60s hook timeout
55
56
 
56
57
  // Which commands are worth a phone approval. This is the only place the set is
@@ -194,7 +195,7 @@ const parseMcpBody = (body, contentType) => {
194
195
  return JSON.parse(body)
195
196
  }
196
197
 
197
- const callTool = async (apiKey, name, args) => {
198
+ const callTool = async (apiKey, name, args, timeoutMs = NET_TIMEOUT_MS) => {
198
199
  const response = await fetch(MCP_URL, {
199
200
  method: 'POST',
200
201
  headers: {
@@ -203,7 +204,7 @@ const callTool = async (apiKey, name, args) => {
203
204
  Authorization: `Bearer ${apiKey}`,
204
205
  },
205
206
  body: JSON.stringify({ jsonrpc: '2.0', id: Date.now(), method: 'tools/call', params: { name, arguments: args } }),
206
- signal: AbortSignal.timeout(NET_TIMEOUT_MS),
207
+ signal: AbortSignal.timeout(timeoutMs),
207
208
  })
208
209
  const text = await response.text()
209
210
  if (!response.ok) throw new Error(`Pushary MCP ${response.status}`)
@@ -397,6 +398,33 @@ const fromTimeoutAction = (action, deniedReason) =>
397
398
 
398
399
  const DENIED = 'The user denied this command via a Pushary push approval. Do not run it. Propose an alternative or ask how to proceed.'
399
400
 
401
+ const fromAnswer = (answer) => {
402
+ if (answer.value === 'defer') return ask()
403
+ return answer.value === 'yes' ? ALLOW : deny(DENIED)
404
+ }
405
+
406
+ const withdrawQuestion = async (apiKey, correlationId) => {
407
+ const unanswered = { answered: false }
408
+ let cancelled
409
+ try {
410
+ cancelled = await callTool(apiKey, 'cancel_question', { correlationId }, WITHDRAW_TIMEOUT_MS)
411
+ } catch {
412
+ return unanswered
413
+ }
414
+ if (cancelled?.cancelled !== false || cancelled?.status === 'unavailable') return unanswered
415
+ try {
416
+ const answer = await callTool(apiKey, 'wait_for_answer', { correlationId, timeoutMs: 1_000 }, WITHDRAW_TIMEOUT_MS)
417
+ return answer?.answered ? answer : unanswered
418
+ } catch {
419
+ return unanswered
420
+ }
421
+ }
422
+
423
+ const handedOff = (asked) => asked.suppressed || asked.status === 'terminal'
424
+
425
+ const handoffMessage = (asked) =>
426
+ asked.suppressed ? 'You are at the keyboard, approve here.' : 'Delivery mode is Terminal, approve here.'
427
+
400
428
  // push_only: wait up to the policy timeout, then apply the timeout action.
401
429
  const handlePushOnly = async (apiKey, command, project, ident, timeoutSeconds, timeoutAction) => {
402
430
  let asked
@@ -409,21 +437,24 @@ const handlePushOnly = async (apiKey, command, project, ident, timeoutSeconds, t
409
437
 
410
438
  // Keyboard bypass: the user is at the keyboard, so VS Code's own prompt is the
411
439
  // faster channel.
412
- if (asked.suppressed) {
413
- await callTool(apiKey, 'cancel_question', { correlationId: asked.correlationId }).catch(() => {})
414
- return ask('You are at the keyboard, approve here.')
440
+ if (handedOff(asked)) {
441
+ const late = await withdrawQuestion(apiKey, asked.correlationId)
442
+ if (late.answered) return fromAnswer(late)
443
+ return ask(handoffMessage(asked))
415
444
  }
416
445
  if (asked.noDevices) {
446
+ const late = await withdrawQuestion(apiKey, asked.correlationId)
447
+ if (late.answered) return fromAnswer(late)
417
448
  return fromTimeoutAction(timeoutAction, 'No device connected to approve on; denied per your Pushary policy.')
418
449
  }
419
450
 
420
451
  const realMs = timeoutAction === 'wait' ? MAX_BLOCK_MS : Math.max(timeoutSeconds, 1) * 1000
421
452
  const cap = Math.min(realMs, MAX_BLOCK_MS)
422
453
  const answer = await pollForAnswer(apiKey, asked.correlationId, Date.now() + cap)
423
- if (answer.answered) {
424
- if (answer.value === 'defer') return ask()
425
- return answer.value === 'yes' ? ALLOW : deny(DENIED)
426
- }
454
+ if (answer.answered) return fromAnswer(answer)
455
+
456
+ const late = await withdrawQuestion(apiKey, asked.correlationId)
457
+ if (late.answered) return fromAnswer(late)
427
458
 
428
459
  // If VS Code's hook limit cut us off before the configured timeout, hand off to
429
460
  // VS Code's own prompt rather than misapplying the policy's timeout action.
@@ -441,21 +472,28 @@ const handlePushFirst = async (apiKey, command, project, ident, pushFirstSeconds
441
472
  }
442
473
  if (!asked?.correlationId) return ask()
443
474
 
444
- if (asked.suppressed) {
445
- await callTool(apiKey, 'cancel_question', { correlationId: asked.correlationId }).catch(() => {})
446
- return ask('You are at the keyboard, approve here.')
475
+ if (handedOff(asked)) {
476
+ const late = await withdrawQuestion(apiKey, asked.correlationId)
477
+ if (late.answered) return fromAnswer(late)
478
+ return ask(handoffMessage(asked))
479
+ }
480
+ if (asked.noDevices) {
481
+ const late = await withdrawQuestion(apiKey, asked.correlationId)
482
+ if (late.answered) return fromAnswer(late)
483
+ return ask('No device connected, approve here.')
447
484
  }
448
- if (asked.noDevices) return ask('No device connected, approve here.')
449
485
 
450
486
  const cap = Math.min(Math.max(pushFirstSeconds, 1) * 1000, MAX_BLOCK_MS)
451
487
  const answer = await pollForAnswer(apiKey, asked.correlationId, Date.now() + cap)
452
- if (answer.answered) {
453
- if (answer.value === 'defer') return ask()
454
- return answer.value === 'yes' ? ALLOW : deny(DENIED)
455
- }
456
- return ask('Sent to your phone via Pushary, you can also approve here.')
488
+ if (answer.answered) return fromAnswer(answer)
489
+
490
+ const late = await withdrawQuestion(apiKey, asked.correlationId)
491
+ if (late.answered) return fromAnswer(late)
492
+ return ask('No answer from your phone in time, so the request was withdrawn there. Approve here.')
457
493
  }
458
494
 
495
+ export { handlePushOnly, handlePushFirst, withdrawQuestion }
496
+
459
497
  // notify_only: fire an awareness notification, let VS Code's prompt decide.
460
498
  const handleNotifyOnly = async (apiKey, command, project, ident) => {
461
499
  try {
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-WXCHB6BO.js";
4
+ } from "../chunk-WPDMGNQR.js";
5
5
  import {
6
6
  readHookInput
7
7
  } from "../chunk-6CUUA7HO.js";
8
- import "../chunk-67TNJVJW.js";
8
+ import "../chunk-EKNFTIKO.js";
9
9
  import "../chunk-BC3VCZ3E.js";
10
10
  import "../chunk-6MTNS63X.js";
11
- import "../chunk-VSCSZ2LI.js";
11
+ import "../chunk-AJ4EMW5D.js";
12
12
  import "../chunk-2UMNXADU.js";
13
- import "../chunk-3JL64GVE.js";
13
+ import "../chunk-Q6MK2YKV.js";
14
14
 
15
15
  // bin/pushary-bell-hook.ts
16
16
  var main = async () => {
@@ -5,19 +5,19 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-WXCHB6BO.js";
8
+ } from "../chunk-WPDMGNQR.js";
9
9
  import {
10
10
  guardBinary
11
- } from "../chunk-B7ZBHWOW.js";
12
- import "../chunk-VT4IVERX.js";
11
+ } from "../chunk-AIGDBRIJ.js";
12
+ import "../chunk-PZA7G4CN.js";
13
13
  import {
14
14
  claudeSettings
15
- } from "../chunk-VHHVGVFQ.js";
15
+ } from "../chunk-FRH2QIMY.js";
16
16
  import "../chunk-GIRT7677.js";
17
17
  import {
18
18
  createIo
19
19
  } from "../chunk-5RUIFDTP.js";
20
- import "../chunk-67TNJVJW.js";
20
+ import "../chunk-EKNFTIKO.js";
21
21
  import {
22
22
  parseFlags
23
23
  } from "../chunk-GMXKITVA.js";
@@ -31,13 +31,13 @@ import {
31
31
  readJsonSafe,
32
32
  writeJsonAtomic
33
33
  } from "../chunk-6MTNS63X.js";
34
- import "../chunk-VSCSZ2LI.js";
34
+ import "../chunk-AJ4EMW5D.js";
35
35
  import "../chunk-7QLSKOSU.js";
36
36
  import {
37
37
  EXIT
38
38
  } from "../chunk-KZERVKTD.js";
39
39
  import "../chunk-2UMNXADU.js";
40
- import "../chunk-3JL64GVE.js";
40
+ import "../chunk-Q6MK2YKV.js";
41
41
 
42
42
  // src/bell/install.ts
43
43
  import { join } from "path";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ensureDaemonRunning
4
- } from "../chunk-OULRSHFB.js";
4
+ } from "../chunk-4FANZF2L.js";
5
5
  import {
6
6
  buildTranscriptRecords,
7
7
  decodePublicKey,
@@ -9,17 +9,17 @@ import {
9
9
  generateSessionKey,
10
10
  uploadTranscriptRecords,
11
11
  wrapSessionKey
12
- } from "../chunk-LEYXXXRN.js";
12
+ } from "../chunk-6GBQDZ7K.js";
13
13
  import {
14
14
  startProcessOwnership,
15
15
  withSpawnProcessOwnership
16
- } from "../chunk-3B3PYTKH.js";
16
+ } from "../chunk-U44C3ULB.js";
17
17
  import {
18
18
  needsShell,
19
19
  spawnClaude
20
20
  } from "../chunk-XHKBHWLX.js";
21
- import "../chunk-VT4IVERX.js";
22
- import "../chunk-VHHVGVFQ.js";
21
+ import "../chunk-PZA7G4CN.js";
22
+ import "../chunk-FRH2QIMY.js";
23
23
  import {
24
24
  isDeferAnswer
25
25
  } from "../chunk-YHG74UFF.js";
@@ -29,7 +29,7 @@ import {
29
29
  getPolicy,
30
30
  repoKeyFor,
31
31
  reportEvent
32
- } from "../chunk-MNXG6IIM.js";
32
+ } from "../chunk-OSE7X44J.js";
33
33
  import {
34
34
  askUser,
35
35
  cancelQuestion,
@@ -39,7 +39,7 @@ import {
39
39
  deriveToolTarget,
40
40
  describeToolCall,
41
41
  scopePathFor
42
- } from "../chunk-F5W3AY6L.js";
42
+ } from "../chunk-LXTX5CT7.js";
43
43
  import {
44
44
  getMachineId
45
45
  } from "../chunk-RN3NOEJF.js";
@@ -47,7 +47,7 @@ import "../chunk-DINDL2CF.js";
47
47
  import "../chunk-6MTNS63X.js";
48
48
  import "../chunk-BSZYIAZL.js";
49
49
  import "../chunk-SAF6HGAA.js";
50
- import "../chunk-VSCSZ2LI.js";
50
+ import "../chunk-AJ4EMW5D.js";
51
51
  import "../chunk-7QLSKOSU.js";
52
52
  import "../chunk-KZERVKTD.js";
53
53
  import {
@@ -57,7 +57,7 @@ import {
57
57
  import {
58
58
  KILL_REASON,
59
59
  resolveGate
60
- } from "../chunk-3JL64GVE.js";
60
+ } from "../chunk-Q6MK2YKV.js";
61
61
 
62
62
  // src/wrapper/claudeBinary.ts
63
63
  import { statSync } from "fs";
@@ -1,23 +1,21 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- removeClaudeMcpServers,
4
- removePusharySettings
5
- } from "../chunk-U6HRYNHC.js";
6
2
  import {
7
3
  removeInstructionBlock,
8
4
  shortenHome,
9
5
  unregisterPluginLocation,
10
6
  vscodeSettingsTargets
11
- } from "../chunk-T2XZH7D5.js";
12
- import "../chunk-DSTZ2RBU.js";
7
+ } from "../chunk-O7P7O4VY.js";
8
+ import "../chunk-4KMWTOBK.js";
13
9
  import {
14
- removeGeminiSettings
15
- } from "../chunk-MY5A4EPQ.js";
10
+ removeClaudeMcpServers,
11
+ removeGeminiSettings,
12
+ removePusharySettings
13
+ } from "../chunk-F3ZDPL6O.js";
16
14
  import "../chunk-ATBKJNWS.js";
17
- import "../chunk-B7ZBHWOW.js";
15
+ import "../chunk-AIGDBRIJ.js";
18
16
  import {
19
17
  execNpm
20
- } from "../chunk-VT4IVERX.js";
18
+ } from "../chunk-PZA7G4CN.js";
21
19
  import {
22
20
  claudeJson,
23
21
  claudeSettings,
@@ -37,9 +35,9 @@ import {
37
35
  removeCodexHookTrust,
38
36
  removeCodexHooks,
39
37
  vscodePluginDir
40
- } from "../chunk-VHHVGVFQ.js";
38
+ } from "../chunk-FRH2QIMY.js";
41
39
  import "../chunk-GIRT7677.js";
42
- import "../chunk-F5W3AY6L.js";
40
+ import "../chunk-LXTX5CT7.js";
43
41
  import {
44
42
  rejectUnknownFlags
45
43
  } from "../chunk-GMXKITVA.js";
@@ -57,7 +55,7 @@ import {
57
55
  } from "../chunk-KZERVKTD.js";
58
56
  import {
59
57
  CURSOR_GATE_EVENTS
60
- } from "../chunk-3JL64GVE.js";
58
+ } from "../chunk-Q6MK2YKV.js";
61
59
 
62
60
  // bin/pushary-clean.ts
63
61
  import { existsSync, readFileSync, copyFileSync, readdirSync } from "fs";
@@ -6,19 +6,19 @@ import {
6
6
  postLiveSession,
7
7
  postLiveSessionUntilAccepted,
8
8
  startLiveSessionHeartbeat
9
- } from "../chunk-XFHMGVMX.js";
10
- import "../chunk-LEYXXXRN.js";
9
+ } from "../chunk-LNAQWWBP.js";
10
+ import "../chunk-6GBQDZ7K.js";
11
11
  import {
12
12
  startProcessOwnership,
13
13
  withSpawnProcessOwnership
14
- } from "../chunk-3B3PYTKH.js";
14
+ } from "../chunk-U44C3ULB.js";
15
15
  import {
16
16
  spawnClaude
17
17
  } from "../chunk-XHKBHWLX.js";
18
18
  import {
19
19
  resolveBinary
20
- } from "../chunk-VT4IVERX.js";
21
- import "../chunk-VHHVGVFQ.js";
20
+ } from "../chunk-PZA7G4CN.js";
21
+ import "../chunk-FRH2QIMY.js";
22
22
  import "../chunk-GIRT7677.js";
23
23
  import {
24
24
  getMachineId
@@ -28,7 +28,7 @@ import {
28
28
  getApiKey,
29
29
  getBaseUrl
30
30
  } from "../chunk-2UMNXADU.js";
31
- import "../chunk-3JL64GVE.js";
31
+ import "../chunk-Q6MK2YKV.js";
32
32
 
33
33
  // bin/pushary-codex-bridge.ts
34
34
  import { existsSync } from "fs";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  isGatingMoment,
4
4
  recordKeylessMoment
5
- } from "../chunk-4VYELDAH.js";
5
+ } from "../chunk-PXEFENML.js";
6
6
  import {
7
7
  readHookInput
8
8
  } from "../chunk-6CUUA7HO.js";
@@ -34,7 +34,7 @@ import {
34
34
  toCodexWire,
35
35
  toPolicyLookup,
36
36
  toPolicyLookups
37
- } from "../chunk-MNXG6IIM.js";
37
+ } from "../chunk-OSE7X44J.js";
38
38
  import {
39
39
  DEFAULT_SESSION,
40
40
  askUser,
@@ -49,13 +49,13 @@ import {
49
49
  deriveToolTarget,
50
50
  describeToolCall,
51
51
  scopePathFor
52
- } from "../chunk-F5W3AY6L.js";
52
+ } from "../chunk-LXTX5CT7.js";
53
53
  import {
54
54
  getMachineId
55
55
  } from "../chunk-RN3NOEJF.js";
56
56
  import "../chunk-BSZYIAZL.js";
57
57
  import "../chunk-SAF6HGAA.js";
58
- import "../chunk-VSCSZ2LI.js";
58
+ import "../chunk-AJ4EMW5D.js";
59
59
  import "../chunk-7QLSKOSU.js";
60
60
  import "../chunk-KZERVKTD.js";
61
61
  import {
@@ -68,7 +68,7 @@ import {
68
68
  hookWaitClamped,
69
69
  hookWaitDeadline,
70
70
  resolveGate
71
- } from "../chunk-3JL64GVE.js";
71
+ } from "../chunk-Q6MK2YKV.js";
72
72
 
73
73
  // bin/pushary-codex-hook.ts
74
74
  import { basename } from "path";
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  reportEvent
4
- } from "../chunk-MNXG6IIM.js";
4
+ } from "../chunk-OSE7X44J.js";
5
5
  import {
6
6
  askUser,
7
7
  waitForAnswer
8
8
  } from "../chunk-J3YDT4HM.js";
9
- import "../chunk-F5W3AY6L.js";
9
+ import "../chunk-LXTX5CT7.js";
10
10
  import {
11
11
  getMachineId
12
12
  } from "../chunk-RN3NOEJF.js";
13
13
  import "../chunk-BSZYIAZL.js";
14
14
  import "../chunk-SAF6HGAA.js";
15
- import "../chunk-VSCSZ2LI.js";
15
+ import "../chunk-AJ4EMW5D.js";
16
16
  import "../chunk-7QLSKOSU.js";
17
17
  import "../chunk-KZERVKTD.js";
18
18
  import {
19
19
  getApiKey
20
20
  } from "../chunk-2UMNXADU.js";
21
- import "../chunk-3JL64GVE.js";
21
+ import "../chunk-Q6MK2YKV.js";
22
22
 
23
23
  // bin/pushary-codex.ts
24
24
  import { basename } from "path";
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  printKeyCheck
4
- } from "../chunk-3PSEZOC4.js";
4
+ } from "../chunk-ZPRF4YLA.js";
5
5
  import {
6
6
  confirmAppConnection,
7
7
  connectDevice,
8
8
  printConnectInstructions
9
- } from "../chunk-ESARAYRI.js";
9
+ } from "../chunk-SHVW5KFR.js";
10
10
  import "../chunk-3EGEA4KH.js";
11
11
  import {
12
12
  checkApiKey
13
- } from "../chunk-6BOE5NJZ.js";
13
+ } from "../chunk-WFFPWJN6.js";
14
14
  import {
15
15
  createIo
16
16
  } from "../chunk-5RUIFDTP.js";
17
17
  import {
18
18
  readKeySource
19
- } from "../chunk-67TNJVJW.js";
19
+ } from "../chunk-EKNFTIKO.js";
20
20
  import {
21
21
  parseFlags
22
22
  } from "../chunk-GMXKITVA.js";
@@ -29,7 +29,7 @@ import "../chunk-DINDL2CF.js";
29
29
  import "../chunk-6MTNS63X.js";
30
30
  import "../chunk-BSZYIAZL.js";
31
31
  import "../chunk-SAF6HGAA.js";
32
- import "../chunk-VSCSZ2LI.js";
32
+ import "../chunk-AJ4EMW5D.js";
33
33
  import {
34
34
  UsageError
35
35
  } from "../chunk-7QLSKOSU.js";
@@ -37,7 +37,7 @@ import {
37
37
  EXIT
38
38
  } from "../chunk-KZERVKTD.js";
39
39
  import "../chunk-2UMNXADU.js";
40
- import "../chunk-3JL64GVE.js";
40
+ import "../chunk-Q6MK2YKV.js";
41
41
 
42
42
  // bin/pushary-connect.ts
43
43
  exitOnHelpFlag("connect");
@@ -8,7 +8,7 @@ import {
8
8
  acquireDaemonLease,
9
9
  readDaemonStatus,
10
10
  requestDaemonHandoff
11
- } from "../chunk-OULRSHFB.js";
11
+ } from "../chunk-4FANZF2L.js";
12
12
  import {
13
13
  CODEX_BRIDGE_CAPABILITY,
14
14
  CODEX_RESUME_CAPABILITY,
@@ -17,7 +17,7 @@ import {
17
17
  import {
18
18
  findLiveProcessBySpawnId,
19
19
  ownsLiveProcess
20
- } from "../chunk-3B3PYTKH.js";
20
+ } from "../chunk-U44C3ULB.js";
21
21
  import {
22
22
  spawnClaude
23
23
  } from "../chunk-XHKBHWLX.js";
@@ -25,8 +25,8 @@ import {
25
25
  resolveBinary,
26
26
  resolveGlobalPackageVersion,
27
27
  resolvePackageVersionFromBinary
28
- } from "../chunk-VT4IVERX.js";
29
- import "../chunk-VHHVGVFQ.js";
28
+ } from "../chunk-PZA7G4CN.js";
29
+ import "../chunk-FRH2QIMY.js";
30
30
  import "../chunk-GIRT7677.js";
31
31
  import {
32
32
  getMachineId
@@ -44,7 +44,7 @@ import {
44
44
  getApiKey,
45
45
  getBaseUrl
46
46
  } from "../chunk-2UMNXADU.js";
47
- import "../chunk-3JL64GVE.js";
47
+ import "../chunk-Q6MK2YKV.js";
48
48
 
49
49
  // src/spawn-daemon.ts
50
50
  import { execFileSync, spawn } from "child_process";