@pushary/agent-hooks 0.88.0 → 0.89.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.
- package/CHANGELOG.md +44 -0
- package/data/cursor-plugin/scripts/pushary-gate.mjs +63 -7
- package/data/vscode-plugin/scripts/pushary-gate.mjs +56 -18
- package/dist/bin/pushary-bell-hook.js +4 -4
- package/dist/bin/pushary-bell.js +7 -7
- package/dist/bin/pushary-claude.js +9 -9
- package/dist/bin/pushary-clean.js +11 -13
- package/dist/bin/pushary-codex-bridge.js +6 -6
- package/dist/bin/pushary-codex-hook.js +5 -5
- package/dist/bin/pushary-codex.js +4 -4
- package/dist/bin/pushary-connect.js +6 -6
- package/dist/bin/pushary-daemon.js +5 -5
- package/dist/bin/pushary-disconnect.js +9 -11
- package/dist/bin/pushary-doctor.js +15 -15
- package/dist/bin/pushary-elicitation-hook.js +7 -120
- package/dist/bin/pushary-gemini-bridge.js +6 -6
- package/dist/bin/pushary-gemini-hook.js +5 -5
- package/dist/bin/pushary-hook.js +6 -6
- package/dist/bin/pushary-login.js +4 -4
- package/dist/bin/pushary-logout.js +4 -4
- package/dist/bin/pushary-mode.js +3 -3
- package/dist/bin/pushary-notification-hook.js +4 -4
- package/dist/bin/pushary-opencode-hook.js +5 -5
- package/dist/bin/pushary-permission-denied-hook.js +6 -6
- package/dist/bin/pushary-permission-hook.js +6 -6
- package/dist/bin/pushary-post-hook.js +4 -4
- package/dist/bin/pushary-prompt-hook.js +4 -4
- package/dist/bin/pushary-session-end-hook.js +4 -4
- package/dist/bin/pushary-session-start-hook.js +4 -4
- package/dist/bin/pushary-setup.js +32 -29
- package/dist/bin/pushary-stats.js +2 -2
- package/dist/bin/pushary-status.js +5 -5
- package/dist/bin/pushary-stop-hook.js +4 -4
- package/dist/bin/pushary-stopfailure-hook.js +4 -4
- package/dist/bin/pushary-upgrade.js +10 -12
- package/dist/bin/pushary-wait.js +3 -3
- package/dist/{chunk-OULRSHFB.js → chunk-4FANZF2L.js} +2 -2
- package/dist/{chunk-DSTZ2RBU.js → chunk-4KMWTOBK.js} +4 -1
- package/dist/{chunk-LEYXXXRN.js → chunk-6GBQDZ7K.js} +1 -1
- package/dist/{chunk-B7ZBHWOW.js → chunk-AIGDBRIJ.js} +1 -1
- package/dist/{chunk-VSCSZ2LI.js → chunk-AJ4EMW5D.js} +1 -1
- package/dist/{chunk-DXBUFXPL.js → chunk-DLI5IXSD.js} +1 -1
- package/dist/{chunk-67TNJVJW.js → chunk-EKNFTIKO.js} +1 -1
- package/dist/{chunk-MY5A4EPQ.js → chunk-F3ZDPL6O.js} +187 -60
- package/dist/{chunk-VHHVGVFQ.js → chunk-FRH2QIMY.js} +1 -1
- package/dist/{chunk-XFHMGVMX.js → chunk-LNAQWWBP.js} +1 -1
- package/dist/{chunk-F5W3AY6L.js → chunk-LXTX5CT7.js} +1 -1
- package/dist/{chunk-T2XZH7D5.js → chunk-O7P7O4VY.js} +2 -2
- package/dist/{chunk-MNXG6IIM.js → chunk-OSE7X44J.js} +3 -3
- package/dist/{chunk-4VYELDAH.js → chunk-PXEFENML.js} +1 -1
- package/dist/{chunk-3JL64GVE.js → chunk-Q6MK2YKV.js} +120 -1
- package/dist/{chunk-ESARAYRI.js → chunk-SHVW5KFR.js} +1 -1
- package/dist/{chunk-RSUBLTMP.js → chunk-SUZF64M4.js} +2 -2
- package/dist/{chunk-3B3PYTKH.js → chunk-U44C3ULB.js} +1 -1
- package/dist/{chunk-UTQCV46U.js → chunk-U65EIMUJ.js} +4 -4
- package/dist/{chunk-6BOE5NJZ.js → chunk-WFFPWJN6.js} +1 -1
- package/dist/{chunk-WXCHB6BO.js → chunk-WPDMGNQR.js} +1 -1
- package/dist/{chunk-3PSEZOC4.js → chunk-ZPRF4YLA.js} +1 -1
- package/dist/src/index.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-U6HRYNHC.js +0 -137
- /package/dist/{chunk-VT4IVERX.js → chunk-PZA7G4CN.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.89.0
|
|
4
|
+
|
|
5
|
+
### Hermes approvals go to the phone, and setup wires it
|
|
6
|
+
|
|
7
|
+
`setup --agents hermes` now selects Pushary as the Hermes approval transport,
|
|
8
|
+
with `transport_fallback: builtin`. Hermes owns the timeout (300s) and the
|
|
9
|
+
once/session/always/deny choices, and persists the last two, so a repeated
|
|
10
|
+
approval can become a standing rule instead of being asked forever. The
|
|
11
|
+
fallback is what makes selecting it safe: a missing key, an unreachable
|
|
12
|
+
Pushary, or no connected device falls back to the terminal prompt rather than
|
|
13
|
+
blocking work.
|
|
14
|
+
|
|
15
|
+
The note explaining why setup writes `~/.hermes/config.yaml` directly rather
|
|
16
|
+
than running `hermes plugins enable` was half wrong. Current Hermes does
|
|
17
|
+
resolve pip-installed plugins in both `list` and `enable`; the reason to write
|
|
18
|
+
the file is the rule against executing an agent's binary, and nothing else.
|
|
19
|
+
|
|
20
|
+
### `pushary upgrade` named a package that does not exist
|
|
21
|
+
|
|
22
|
+
It printed `pip install --upgrade pushary-hermes`. That package is not on PyPI.
|
|
23
|
+
The real one is `hermes-plugin-pushary`, and the upgrade path for it is setup,
|
|
24
|
+
which installs into the interpreter Hermes actually runs in. Now points there,
|
|
25
|
+
like every other agent in that list.
|
|
26
|
+
|
|
27
|
+
## 0.88.1
|
|
28
|
+
|
|
29
|
+
### One install, whichever surface writes it
|
|
30
|
+
|
|
31
|
+
The generated hook spec now describes the whole install, not only the hooks: the
|
|
32
|
+
MCP entry for each agent, the managed block in AGENTS.md or GEMINI.md, and the
|
|
33
|
+
skill. The CLI writes exactly what it wrote before. The Mac app reads the same
|
|
34
|
+
spec, so an install from the app and an install from `pushary setup` leave the
|
|
35
|
+
same files behind, and Repair can put back a tool entry as well as a hook.
|
|
36
|
+
|
|
37
|
+
`Elicitation` is no longer CLI-only in the spec: a typed answer can now come back
|
|
38
|
+
from a settlement, so the Mac app writes that hook too.
|
|
39
|
+
|
|
40
|
+
### One predicate for Ctrl-C at a prompt
|
|
41
|
+
|
|
42
|
+
Setup carried its own test for an inquirer cancellation and matched a different
|
|
43
|
+
string from the one in `cli/exit.ts`. Both agreed on inquirer's current wording
|
|
44
|
+
and would have disagreed the day it changed, printing "Setup failed" over a
|
|
45
|
+
deliberate Ctrl-C. One predicate now, matching the union of what both matched.
|
|
46
|
+
|
|
3
47
|
## 0.87.1
|
|
4
48
|
|
|
5
49
|
### 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(
|
|
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
|
-
|
|
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
|
|
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
|
|
479
|
-
|
|
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(
|
|
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
|
|
413
|
-
await
|
|
414
|
-
|
|
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
|
-
|
|
425
|
-
|
|
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
|
|
445
|
-
await
|
|
446
|
-
|
|
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
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
return ask('
|
|
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-
|
|
4
|
+
} from "../chunk-WPDMGNQR.js";
|
|
5
5
|
import {
|
|
6
6
|
readHookInput
|
|
7
7
|
} from "../chunk-6CUUA7HO.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-EKNFTIKO.js";
|
|
9
9
|
import "../chunk-BC3VCZ3E.js";
|
|
10
10
|
import "../chunk-6MTNS63X.js";
|
|
11
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-AJ4EMW5D.js";
|
|
12
12
|
import "../chunk-2UMNXADU.js";
|
|
13
|
-
import "../chunk-
|
|
13
|
+
import "../chunk-Q6MK2YKV.js";
|
|
14
14
|
|
|
15
15
|
// bin/pushary-bell-hook.ts
|
|
16
16
|
var main = async () => {
|
package/dist/bin/pushary-bell.js
CHANGED
|
@@ -5,19 +5,19 @@ import {
|
|
|
5
5
|
liveAgentCount,
|
|
6
6
|
ring,
|
|
7
7
|
upgradeThreshold
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-WPDMGNQR.js";
|
|
9
9
|
import {
|
|
10
10
|
guardBinary
|
|
11
|
-
} from "../chunk-
|
|
12
|
-
import "../chunk-
|
|
11
|
+
} from "../chunk-AIGDBRIJ.js";
|
|
12
|
+
import "../chunk-PZA7G4CN.js";
|
|
13
13
|
import {
|
|
14
14
|
claudeSettings
|
|
15
|
-
} from "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
12
|
+
} from "../chunk-6GBQDZ7K.js";
|
|
13
13
|
import {
|
|
14
14
|
startProcessOwnership,
|
|
15
15
|
withSpawnProcessOwnership
|
|
16
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-U44C3ULB.js";
|
|
17
17
|
import {
|
|
18
18
|
needsShell,
|
|
19
19
|
spawnClaude
|
|
20
20
|
} from "../chunk-XHKBHWLX.js";
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
12
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-O7P7O4VY.js";
|
|
8
|
+
import "../chunk-4KMWTOBK.js";
|
|
13
9
|
import {
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
removeClaudeMcpServers,
|
|
11
|
+
removeGeminiSettings,
|
|
12
|
+
removePusharySettings
|
|
13
|
+
} from "../chunk-F3ZDPL6O.js";
|
|
16
14
|
import "../chunk-ATBKJNWS.js";
|
|
17
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-AIGDBRIJ.js";
|
|
18
16
|
import {
|
|
19
17
|
execNpm
|
|
20
|
-
} from "../chunk-
|
|
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-
|
|
38
|
+
} from "../chunk-FRH2QIMY.js";
|
|
41
39
|
import "../chunk-GIRT7677.js";
|
|
42
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
10
|
-
import "../chunk-
|
|
9
|
+
} from "../chunk-LNAQWWBP.js";
|
|
10
|
+
import "../chunk-6GBQDZ7K.js";
|
|
11
11
|
import {
|
|
12
12
|
startProcessOwnership,
|
|
13
13
|
withSpawnProcessOwnership
|
|
14
|
-
} from "../chunk-
|
|
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-
|
|
21
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
+
} from "../chunk-OSE7X44J.js";
|
|
5
5
|
import {
|
|
6
6
|
askUser,
|
|
7
7
|
waitForAnswer
|
|
8
8
|
} from "../chunk-J3YDT4HM.js";
|
|
9
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
+
} from "../chunk-ZPRF4YLA.js";
|
|
5
5
|
import {
|
|
6
6
|
confirmAppConnection,
|
|
7
7
|
connectDevice,
|
|
8
8
|
printConnectInstructions
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-SHVW5KFR.js";
|
|
10
10
|
import "../chunk-3EGEA4KH.js";
|
|
11
11
|
import {
|
|
12
12
|
checkApiKey
|
|
13
|
-
} from "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
29
|
-
import "../chunk-
|
|
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-
|
|
47
|
+
import "../chunk-Q6MK2YKV.js";
|
|
48
48
|
|
|
49
49
|
// src/spawn-daemon.ts
|
|
50
50
|
import { execFileSync, spawn } from "child_process";
|