@pushary/agent-hooks 0.74.0 → 0.75.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 (49) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/data/SKILL.md +14 -6
  3. package/data/cursor-plugin/CHANGELOG.md +27 -1
  4. package/data/cursor-plugin/CONTRIBUTING.md +28 -0
  5. package/data/cursor-plugin/README.md +1 -1
  6. package/data/cursor-plugin/scripts/pushary-gate.mjs +305 -131
  7. package/data/cursor-plugin/scripts/pushary-gate.test.mjs +130 -0
  8. package/data/cursor-plugin/skills/pushary/SKILL.md +14 -6
  9. package/data/vscode-plugin/CONTRIBUTING.md +28 -0
  10. package/data/vscode-plugin/skills/pushary/SKILL.md +14 -6
  11. package/dist/bin/pushary-claude.js +3 -3
  12. package/dist/bin/pushary-clean.js +5 -5
  13. package/dist/bin/pushary-codex-hook.js +4 -4
  14. package/dist/bin/pushary-codex.js +2 -2
  15. package/dist/bin/pushary-connect.js +3 -3
  16. package/dist/bin/pushary-doctor.js +7 -7
  17. package/dist/bin/pushary-gemini-hook.js +4 -4
  18. package/dist/bin/pushary-hook.js +6 -6
  19. package/dist/bin/pushary-login.js +2 -2
  20. package/dist/bin/pushary-logout.js +2 -2
  21. package/dist/bin/pushary-mode.js +3 -3
  22. package/dist/bin/pushary-notification-hook.js +2 -2
  23. package/dist/bin/pushary-permission-denied-hook.js +6 -6
  24. package/dist/bin/pushary-permission-hook.js +6 -6
  25. package/dist/bin/pushary-post-hook.js +2 -2
  26. package/dist/bin/pushary-prompt-hook.js +2 -2
  27. package/dist/bin/pushary-session-end-hook.js +2 -2
  28. package/dist/bin/pushary-session-start-hook.js +2 -2
  29. package/dist/bin/pushary-setup.js +17 -13
  30. package/dist/bin/pushary-stats.js +2 -2
  31. package/dist/bin/pushary-status.js +2 -2
  32. package/dist/bin/pushary-stop-hook.js +2 -2
  33. package/dist/bin/pushary-stopfailure-hook.js +2 -2
  34. package/dist/bin/pushary-upgrade.js +4 -4
  35. package/dist/bin/pushary-wait.js +3 -3
  36. package/dist/{chunk-Q5QV4I42.js → chunk-3CBPY2G5.js} +1 -1
  37. package/dist/{chunk-4S3E5DQJ.js → chunk-46UEJXQO.js} +2 -2
  38. package/dist/{chunk-VQSTA23N.js → chunk-7BBUTWBD.js} +1 -1
  39. package/dist/{chunk-HAJA47IK.js → chunk-7L57N7WN.js} +1 -1
  40. package/dist/{chunk-CJET52NP.js → chunk-CC2K2SST.js} +1 -1
  41. package/dist/{chunk-34HABKL7.js → chunk-DJHWBNM3.js} +5 -5
  42. package/dist/{chunk-43NDA7LR.js → chunk-DLBW37U6.js} +1 -1
  43. package/dist/{chunk-3BJUW2SH.js → chunk-IA5GBKNL.js} +1 -1
  44. package/dist/{chunk-NDCIOAL7.js → chunk-IZA7SWXX.js} +1 -1
  45. package/dist/{chunk-PZ4UCGWG.js → chunk-QCYN5VXB.js} +1 -1
  46. package/dist/{chunk-SM7EMSDQ.js → chunk-UPPHYOIZ.js} +2 -2
  47. package/dist/src/index.js +6 -6
  48. package/package.json +1 -1
  49. /package/dist/{chunk-TIZNAOTS.js → chunk-TJJBF73A.js} +0 -0
@@ -0,0 +1,130 @@
1
+ // Parity tests for the vendored policy logic in pushary-gate.mjs.
2
+ //
3
+ // The gate cannot depend on @pushary/contracts — a Cursor plugin is cloned, not
4
+ // installed — so the matcher is vendored. These cases mirror policy.test.ts in
5
+ // the Pushary monorepo. If they drift, Cursor silently resolves a different
6
+ // policy from every other agent, which is the bug this file exists to prevent.
7
+ //
8
+ // Run: node --test scripts/pushary-gate.test.mjs
9
+
10
+ import assert from 'node:assert/strict'
11
+ import { describe, it } from 'node:test'
12
+ import { matchToolPattern, resolvePolicy, isDestructive, normalizeRepoRemote } from './pushary-gate.mjs'
13
+
14
+ const base = {
15
+ defaultTimeoutSeconds: 60,
16
+ defaultTimeoutAction: 'escalate',
17
+ defaultMode: 'push_first',
18
+ defaultPushFirstSeconds: 20,
19
+ }
20
+ const cfg = (...policies) => ({ ...base, policies })
21
+ const allow = { timeoutSeconds: 0, timeoutAction: 'approve', mode: 'terminal_only', pushFirstSeconds: 0 }
22
+ const denyRule = { timeoutSeconds: 0, timeoutAction: 'deny', mode: 'push_only', pushFirstSeconds: 0 }
23
+ const autoApproves = (p) => p.timeoutSeconds === 0 && p.timeoutAction === 'approve'
24
+
25
+ describe('matchToolPattern', () => {
26
+ it('matches bare, exact and prefix forms', () => {
27
+ assert.equal(matchToolPattern('Bash', 'Bash', 'npm test'), 'tool')
28
+ assert.equal(matchToolPattern('Bash(git status)', 'Bash', 'git status'), 'exact')
29
+ assert.equal(matchToolPattern('Bash(npm test:*)', 'Bash', 'npm test -- --watch'), 'prefix')
30
+ assert.equal(matchToolPattern('Bash(npm test:*)', 'Bash', 'npm install'), 'none')
31
+ })
32
+
33
+ it('checks :* before globs so destructive prefixes keep their meaning', () => {
34
+ assert.equal(matchToolPattern('Bash(rm -rf:*)', 'Bash', 'rm -rf /tmp/x'), 'prefix')
35
+ })
36
+
37
+ it('supports globs', () => {
38
+ assert.equal(matchToolPattern('Bash(deploy *)', 'Bash', 'deploy staging'), 'prefix')
39
+ assert.equal(matchToolPattern('Bash(deploy *)', 'Bash', 'deploy'), 'none')
40
+ })
41
+
42
+ it('does not backtrack on adversarial star patterns', () => {
43
+ const started = Date.now()
44
+ assert.equal(matchToolPattern(`Bash(${'*'.repeat(8)}x)`, 'Bash', 'a'.repeat(4000)), 'none')
45
+ assert.ok(Date.now() - started < 1000, 'must not backtrack')
46
+ })
47
+ })
48
+
49
+ describe('argument rules, which the gate previously ignored entirely', () => {
50
+ it("honours a user's explicit deny under a broad allow", () => {
51
+ const config = cfg({ tool: 'Bash', ...allow }, { tool: 'Bash(rm:*)', ...denyRule })
52
+ const resolved = resolvePolicy(config, 'Bash', null, 'rm -rf /important', undefined)
53
+ assert.equal(resolved.timeoutAction, 'deny')
54
+ assert.equal(autoApproves(resolved), false)
55
+ })
56
+
57
+ it('honours the preset always-ask rule for force pushes', () => {
58
+ const config = cfg({ tool: 'Bash', ...allow }, { tool: 'Bash(git push:*)', timeoutSeconds: 60, timeoutAction: 'wait', mode: 'push_first', pushFirstSeconds: 20 })
59
+ assert.equal(resolvePolicy(config, 'Bash', null, 'git push --force origin main', undefined).timeoutAction, 'wait')
60
+ })
61
+
62
+ it('prefers an exact rule over a matching prefix rule', () => {
63
+ const config = cfg({ tool: 'Bash(git:*)', ...denyRule }, { tool: 'Bash(git status)', ...allow })
64
+ assert.equal(autoApproves(resolvePolicy(config, 'Bash', null, 'git status', undefined)), true)
65
+ })
66
+ })
67
+
68
+ describe('destructive ceiling', () => {
69
+ it('refuses to auto-approve a destructive command through a bare-tool allow', () => {
70
+ const resolved = resolvePolicy(cfg({ tool: 'Bash', ...allow }), 'Bash', null, 'rm -rf /important', undefined)
71
+ assert.equal(autoApproves(resolved), false)
72
+ assert.equal(resolved.timeoutAction, 'wait')
73
+ })
74
+
75
+ it('refuses through a wildcard allow too', () => {
76
+ assert.equal(autoApproves(resolvePolicy(cfg({ tool: '*', ...allow }), 'Bash', null, 'git push --force origin main', undefined)), false)
77
+ })
78
+
79
+ it('still lets an explicit rule the user wrote win', () => {
80
+ const config = cfg({ tool: 'Bash', ...allow }, { tool: 'Bash(rm -rf:*)', ...allow })
81
+ assert.equal(autoApproves(resolvePolicy(config, 'Bash', null, 'rm -rf /tmp/x', undefined)), true)
82
+ })
83
+
84
+ it('leaves ordinary commands alone', () => {
85
+ assert.equal(autoApproves(resolvePolicy(cfg({ tool: 'Bash', ...allow }), 'Bash', null, 'npm test', undefined)), true)
86
+ })
87
+
88
+ it('flags the classifier set', () => {
89
+ for (const c of ['rm -rf /', 'sudo reboot', 'git reset --hard', 'terraform destroy', 'npm publish', 'DROP TABLE users']) {
90
+ assert.equal(isDestructive(c), true, c)
91
+ }
92
+ assert.equal(isDestructive('npm test'), false)
93
+ })
94
+ })
95
+
96
+ describe('repo scoping', () => {
97
+ const scoped = { tool: 'Bash', repoKey: 'github.com/acme/api', ...denyRule }
98
+
99
+ it('applies a scoped rule only in its own repository', () => {
100
+ assert.equal(resolvePolicy(cfg(scoped), 'Bash', null, 'npm test', 'github.com/acme/api').timeoutAction, 'deny')
101
+ assert.notEqual(resolvePolicy(cfg(scoped), 'Bash', null, 'npm test', 'github.com/acme/web').timeoutAction, 'deny')
102
+ })
103
+
104
+ it('never applies a scoped rule when the repository is unknown', () => {
105
+ assert.notEqual(resolvePolicy(cfg(scoped), 'Bash', null, 'npm test', undefined).timeoutAction, 'deny')
106
+ })
107
+
108
+ it('prefers the scoped rule at equal rank', () => {
109
+ const config = cfg({ tool: 'Bash', ...allow }, scoped)
110
+ assert.equal(resolvePolicy(config, 'Bash', null, 'npm test', 'github.com/acme/api').timeoutAction, 'deny')
111
+ })
112
+ })
113
+
114
+ describe('repo identity', () => {
115
+ it('collapses the forms of one remote', () => {
116
+ for (const r of ['https://github.com/acme/api.git', 'git@github.com:acme/api.git', 'ssh://git@github.com:22/acme/api.git']) {
117
+ assert.equal(normalizeRepoRemote(r), 'github.com/acme/api', r)
118
+ }
119
+ })
120
+
121
+ it('never lets a credential survive', () => {
122
+ const key = normalizeRepoRemote('https://user:ghp_SECRET@github.com/acme/api.git')
123
+ assert.equal(key, 'github.com/acme/api')
124
+ assert.ok(!key.includes('ghp_') && !key.includes('@'))
125
+ })
126
+
127
+ it('returns undefined without a stable identity', () => {
128
+ for (const r of ['', '../rel', 'file:///Users/dev/repo']) assert.equal(normalizeRepoRemote(r), undefined, r)
129
+ })
130
+ })
@@ -53,16 +53,24 @@ If the user runs Claude Code with a Claude Max subscription, Anthropic Remote Co
53
53
 
54
54
  ## Setup
55
55
 
56
- First check for an API key. Look for `PUSHARY_API_KEY` in the environment or an Authorization header in the existing MCP config. If there is no key, the user needs an account: give them this link, then pause until they finish signup from their phone and hand you the key:
56
+ Just run it. No account, no API key, and nothing to paste first:
57
57
 
58
- https://pushary.com/sign-up?utm_source=skill&utm_medium=setup
58
+ ```bash
59
+ npx @pushary/agent-hooks@latest setup
60
+ ```
61
+
62
+ It configures MCP, hooks, permissions and the skill in one step, then prints a QR code and waits.
59
63
 
60
- Signup starts a 7-day trial and asks for a card up front. The key format is `pk_xxx.sk_xxx`.
64
+ **Show the user your output and ask them to scan that QR with their phone camera.** Scanning pairs their Pushary app, which is what hands this machine its key. A tappable link and a fingerprint print under the QR for a phone already in hand. Do not ask the user for an API key, and do not send them to a signup page first: that is the old flow and it is strictly worse.
61
65
 
62
- Once the key exists, run the CLI setup (recommended - configures MCP, hooks, permissions, and skill in one step):
66
+ Signup starts a 7-day trial and asks for a card up front, which happens in the app.
67
+
68
+ If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
69
+
70
+ No app on their phone yet? They can get it at https://pushary.com/download, or approve in a browser tab instead:
63
71
 
64
72
  ```bash
65
- npx @pushary/agent-hooks@latest setup
73
+ npx @pushary/agent-hooks@latest setup --connect browser
66
74
  ```
67
75
 
68
76
  Or add Pushary manually to your MCP configuration:
@@ -81,7 +89,7 @@ Or add Pushary manually to your MCP configuration:
81
89
  }
82
90
  ```
83
91
 
84
- Sign up at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup to get your API key.
92
+ Manual configuration needs a key, so it means signing up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copying the key from the dashboard. Prefer `setup` above: it needs neither.
85
93
 
86
94
  After setup, verify with:
87
95
 
@@ -0,0 +1,28 @@
1
+ # Contributing
2
+
3
+ Thanks for looking. Please read this before opening a pull request, because of
4
+ where this code lives.
5
+
6
+ **This repository is a published copy, not the place the code is written.** The
7
+ source is a directory inside Pushary's private monorepo, and it is pushed here
8
+ whenever it changes. Anything committed directly to this repo is overwritten by
9
+ the next publish.
10
+
11
+ That is not hypothetical. Two pull requests were merged here and then sat
12
+ stranded for a month, because nothing carried them back upstream and the next
13
+ publish would have deleted them.
14
+
15
+ ## So what should you do
16
+
17
+ **Open an issue.** Bugs, missing behaviour, a patch you have already written and
18
+ want applied: an issue is read and acted on, and the fix is made upstream and
19
+ published here. Paste your diff into the issue if you have one, and it will be
20
+ credited.
21
+
22
+ **Security issues**: email aadil@pushary.com rather than opening an issue.
23
+
24
+ ## If you do open a pull request
25
+
26
+ It will not be merged as a pull request, because merging it would guarantee it
27
+ gets erased. It will be treated as a patch submission: applied upstream, and
28
+ this repo updated on the next publish. You will be told when that has happened.
@@ -53,16 +53,24 @@ If the user runs Claude Code with a Claude Max subscription, Anthropic Remote Co
53
53
 
54
54
  ## Setup
55
55
 
56
- First check for an API key. Look for `PUSHARY_API_KEY` in the environment or an Authorization header in the existing MCP config. If there is no key, the user needs an account: give them this link, then pause until they finish signup from their phone and hand you the key:
56
+ Just run it. No account, no API key, and nothing to paste first:
57
57
 
58
- https://pushary.com/sign-up?utm_source=skill&utm_medium=setup
58
+ ```bash
59
+ npx @pushary/agent-hooks@latest setup
60
+ ```
61
+
62
+ It configures MCP, hooks, permissions and the skill in one step, then prints a QR code and waits.
59
63
 
60
- Signup starts a 7-day trial and asks for a card up front. The key format is `pk_xxx.sk_xxx`.
64
+ **Show the user your output and ask them to scan that QR with their phone camera.** Scanning pairs their Pushary app, which is what hands this machine its key. A tappable link and a fingerprint print under the QR for a phone already in hand. Do not ask the user for an API key, and do not send them to a signup page first: that is the old flow and it is strictly worse.
61
65
 
62
- Once the key exists, run the CLI setup (recommended - configures MCP, hooks, permissions, and skill in one step):
66
+ Signup starts a 7-day trial and asks for a card up front, which happens in the app.
67
+
68
+ If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
69
+
70
+ No app on their phone yet? They can get it at https://pushary.com/download, or approve in a browser tab instead:
63
71
 
64
72
  ```bash
65
- npx @pushary/agent-hooks@latest setup
73
+ npx @pushary/agent-hooks@latest setup --connect browser
66
74
  ```
67
75
 
68
76
  Or add Pushary manually to your MCP configuration:
@@ -81,7 +89,7 @@ Or add Pushary manually to your MCP configuration:
81
89
  }
82
90
  ```
83
91
 
84
- Sign up at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup to get your API key.
92
+ Manual configuration needs a key, so it means signing up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copying the key from the dashboard. Prefer `setup` above: it needs neither.
85
93
 
86
94
  After setup, verify with:
87
95
 
@@ -7,7 +7,7 @@ import {
7
7
  KILL_REASON,
8
8
  isDeferAnswer,
9
9
  resolveGate
10
- } from "../chunk-SM7EMSDQ.js";
10
+ } from "../chunk-UPPHYOIZ.js";
11
11
  import {
12
12
  askUser,
13
13
  cancelQuestion,
@@ -19,13 +19,13 @@ import {
19
19
  reportEvent,
20
20
  scopePathFor,
21
21
  waitForAnswer
22
- } from "../chunk-HAJA47IK.js";
22
+ } from "../chunk-7L57N7WN.js";
23
23
  import "../chunk-BSZYIAZL.js";
24
24
  import "../chunk-SAF6HGAA.js";
25
25
  import "../chunk-7QLSKOSU.js";
26
26
  import {
27
27
  redactSecrets
28
- } from "../chunk-TIZNAOTS.js";
28
+ } from "../chunk-TJJBF73A.js";
29
29
  import {
30
30
  getMachineId
31
31
  } from "../chunk-RN3NOEJF.js";
@@ -2,16 +2,16 @@
2
2
  import {
3
3
  removeClaudeMcpServers,
4
4
  removePusharySettings
5
- } from "../chunk-Q5QV4I42.js";
5
+ } from "../chunk-3CBPY2G5.js";
6
6
  import {
7
7
  removeInstructionBlock,
8
8
  shortenHome,
9
9
  unregisterPluginLocation,
10
10
  vscodeSettingsTargets
11
- } from "../chunk-NDCIOAL7.js";
11
+ } from "../chunk-IZA7SWXX.js";
12
12
  import {
13
13
  removeGeminiSettings
14
- } from "../chunk-CJET52NP.js";
14
+ } from "../chunk-CC2K2SST.js";
15
15
  import {
16
16
  claudeJson,
17
17
  claudeSettings,
@@ -29,7 +29,7 @@ import {
29
29
  pusharyDir,
30
30
  removeCodexHooks,
31
31
  vscodePluginDir
32
- } from "../chunk-PZ4UCGWG.js";
32
+ } from "../chunk-QCYN5VXB.js";
33
33
  import {
34
34
  removeClaudeAlias
35
35
  } from "../chunk-BC3VCZ3E.js";
@@ -44,7 +44,7 @@ import {
44
44
  } from "../chunk-BBK3TTU2.js";
45
45
  import "../chunk-7OYGFJYZ.js";
46
46
  import "../chunk-7QLSKOSU.js";
47
- import "../chunk-TIZNAOTS.js";
47
+ import "../chunk-TJJBF73A.js";
48
48
  import {
49
49
  EXIT
50
50
  } from "../chunk-KZERVKTD.js";
@@ -4,7 +4,7 @@ import {
4
4
  denyReasonFrom,
5
5
  isDeferAnswer,
6
6
  resolveGate
7
- } from "../chunk-SM7EMSDQ.js";
7
+ } from "../chunk-UPPHYOIZ.js";
8
8
  import {
9
9
  CODEX_AGENT,
10
10
  DEFAULT_SESSION,
@@ -35,11 +35,11 @@ import {
35
35
  toPolicyLookup,
36
36
  toPolicyLookups,
37
37
  waitForAnswer
38
- } from "../chunk-HAJA47IK.js";
38
+ } from "../chunk-7L57N7WN.js";
39
39
  import {
40
40
  isGatingMoment,
41
41
  recordKeylessMoment
42
- } from "../chunk-3BJUW2SH.js";
42
+ } from "../chunk-IA5GBKNL.js";
43
43
  import "../chunk-BSZYIAZL.js";
44
44
  import "../chunk-SAF6HGAA.js";
45
45
  import "../chunk-7QLSKOSU.js";
@@ -48,7 +48,7 @@ import {
48
48
  effectiveWaitSeconds,
49
49
  hookWaitClamped,
50
50
  hookWaitDeadline
51
- } from "../chunk-TIZNAOTS.js";
51
+ } from "../chunk-TJJBF73A.js";
52
52
  import {
53
53
  getMachineId
54
54
  } from "../chunk-RN3NOEJF.js";
@@ -3,11 +3,11 @@ import {
3
3
  askUser,
4
4
  reportEvent,
5
5
  waitForAnswer
6
- } from "../chunk-HAJA47IK.js";
6
+ } from "../chunk-7L57N7WN.js";
7
7
  import "../chunk-BSZYIAZL.js";
8
8
  import "../chunk-SAF6HGAA.js";
9
9
  import "../chunk-7QLSKOSU.js";
10
- import "../chunk-TIZNAOTS.js";
10
+ import "../chunk-TJJBF73A.js";
11
11
  import {
12
12
  getMachineId
13
13
  } from "../chunk-RN3NOEJF.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  printKeyCheck
4
- } from "../chunk-VQSTA23N.js";
4
+ } from "../chunk-7BBUTWBD.js";
5
5
  import {
6
6
  confirmAppConnection,
7
7
  connectDevice,
@@ -14,7 +14,7 @@ import {
14
14
  import "../chunk-6MTNS63X.js";
15
15
  import {
16
16
  checkApiKey
17
- } from "../chunk-43NDA7LR.js";
17
+ } from "../chunk-DLBW37U6.js";
18
18
  import {
19
19
  createIo
20
20
  } from "../chunk-TX7KBKT7.js";
@@ -31,7 +31,7 @@ import "../chunk-SAF6HGAA.js";
31
31
  import {
32
32
  UsageError
33
33
  } from "../chunk-7QLSKOSU.js";
34
- import "../chunk-TIZNAOTS.js";
34
+ import "../chunk-TJJBF73A.js";
35
35
  import "../chunk-2UMNXADU.js";
36
36
  import {
37
37
  EXIT
@@ -6,7 +6,7 @@ import {
6
6
  claudeWired,
7
7
  codexWired,
8
8
  geminiWired
9
- } from "../chunk-4S3E5DQJ.js";
9
+ } from "../chunk-46UEJXQO.js";
10
10
  import {
11
11
  agentProbes,
12
12
  detectAgent,
@@ -15,12 +15,12 @@ import {
15
15
  isDetected,
16
16
  isPluginRegistered,
17
17
  vscodeSettingsTargets
18
- } from "../chunk-NDCIOAL7.js";
18
+ } from "../chunk-IZA7SWXX.js";
19
19
  import {
20
20
  GEMINI_HOOK_BINARY,
21
21
  hasGeminiHooks,
22
22
  missingGeminiHookEvents
23
- } from "../chunk-CJET52NP.js";
23
+ } from "../chunk-CC2K2SST.js";
24
24
  import {
25
25
  claudeJson,
26
26
  claudeSettings,
@@ -39,7 +39,7 @@ import {
39
39
  readCodexMcpAuth,
40
40
  untrustedCodexHookEvents,
41
41
  vscodePluginDir
42
- } from "../chunk-PZ4UCGWG.js";
42
+ } from "../chunk-QCYN5VXB.js";
43
43
  import {
44
44
  describeReach,
45
45
  fetchChannels,
@@ -54,7 +54,7 @@ import "../chunk-6MTNS63X.js";
54
54
  import {
55
55
  checkApiKey,
56
56
  describeKeyCheck
57
- } from "../chunk-43NDA7LR.js";
57
+ } from "../chunk-DLBW37U6.js";
58
58
  import {
59
59
  createIo
60
60
  } from "../chunk-TX7KBKT7.js";
@@ -73,7 +73,7 @@ import {
73
73
  } from "../chunk-7OYGFJYZ.js";
74
74
  import {
75
75
  readLedgerSummary
76
- } from "../chunk-3BJUW2SH.js";
76
+ } from "../chunk-IA5GBKNL.js";
77
77
  import {
78
78
  callMcpTool,
79
79
  sendMcpRequest
@@ -82,7 +82,7 @@ import "../chunk-SAF6HGAA.js";
82
82
  import {
83
83
  UsageError
84
84
  } from "../chunk-7QLSKOSU.js";
85
- import "../chunk-TIZNAOTS.js";
85
+ import "../chunk-TJJBF73A.js";
86
86
  import {
87
87
  getMachineId
88
88
  } from "../chunk-RN3NOEJF.js";
@@ -4,7 +4,7 @@ import {
4
4
  denyReasonFrom,
5
5
  isDeferAnswer,
6
6
  resolveGate
7
- } from "../chunk-SM7EMSDQ.js";
7
+ } from "../chunk-UPPHYOIZ.js";
8
8
  import {
9
9
  DEFAULT_SESSION,
10
10
  askUser,
@@ -26,11 +26,11 @@ import {
26
26
  scopePathFor,
27
27
  sendNotification,
28
28
  waitForAnswer
29
- } from "../chunk-HAJA47IK.js";
29
+ } from "../chunk-7L57N7WN.js";
30
30
  import {
31
31
  isGatingMoment,
32
32
  recordKeylessMoment
33
- } from "../chunk-3BJUW2SH.js";
33
+ } from "../chunk-IA5GBKNL.js";
34
34
  import "../chunk-BSZYIAZL.js";
35
35
  import "../chunk-SAF6HGAA.js";
36
36
  import "../chunk-7QLSKOSU.js";
@@ -39,7 +39,7 @@ import {
39
39
  effectiveWaitSeconds,
40
40
  hookWaitClamped,
41
41
  hookWaitDeadline
42
- } from "../chunk-TIZNAOTS.js";
42
+ } from "../chunk-TJJBF73A.js";
43
43
  import {
44
44
  getMachineId
45
45
  } from "../chunk-RN3NOEJF.js";
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePreToolUse
4
- } from "../chunk-34HABKL7.js";
5
- import "../chunk-Q5QV4I42.js";
4
+ } from "../chunk-DJHWBNM3.js";
5
+ import "../chunk-3CBPY2G5.js";
6
6
  import {
7
7
  exitOnHelpFlag
8
8
  } from "../chunk-BBK3TTU2.js";
9
9
  import "../chunk-7OYGFJYZ.js";
10
- import "../chunk-SM7EMSDQ.js";
11
- import "../chunk-HAJA47IK.js";
12
- import "../chunk-3BJUW2SH.js";
10
+ import "../chunk-UPPHYOIZ.js";
11
+ import "../chunk-7L57N7WN.js";
12
+ import "../chunk-IA5GBKNL.js";
13
13
  import "../chunk-BSZYIAZL.js";
14
14
  import "../chunk-SAF6HGAA.js";
15
15
  import "../chunk-7QLSKOSU.js";
16
- import "../chunk-TIZNAOTS.js";
16
+ import "../chunk-TJJBF73A.js";
17
17
  import "../chunk-RN3NOEJF.js";
18
18
  import "../chunk-2UMNXADU.js";
19
19
  import "../chunk-KZERVKTD.js";
@@ -11,7 +11,7 @@ import "../chunk-6MTNS63X.js";
11
11
  import {
12
12
  checkApiKey,
13
13
  describeKeyCheck
14
- } from "../chunk-43NDA7LR.js";
14
+ } from "../chunk-DLBW37U6.js";
15
15
  import {
16
16
  createIo
17
17
  } from "../chunk-TX7KBKT7.js";
@@ -31,7 +31,7 @@ import {
31
31
  } from "../chunk-7QLSKOSU.js";
32
32
  import {
33
33
  isValidApiKey
34
- } from "../chunk-TIZNAOTS.js";
34
+ } from "../chunk-TJJBF73A.js";
35
35
  import "../chunk-2UMNXADU.js";
36
36
  import {
37
37
  EXIT
@@ -4,7 +4,7 @@ import {
4
4
  codexConfigToml,
5
5
  cursorUserMcp,
6
6
  geminiSettings
7
- } from "../chunk-PZ4UCGWG.js";
7
+ } from "../chunk-QCYN5VXB.js";
8
8
  import {
9
9
  clearKey,
10
10
  readKeySource
@@ -24,7 +24,7 @@ import "../chunk-7OYGFJYZ.js";
24
24
  import {
25
25
  UsageError
26
26
  } from "../chunk-7QLSKOSU.js";
27
- import "../chunk-TIZNAOTS.js";
27
+ import "../chunk-TJJBF73A.js";
28
28
  import {
29
29
  getBaseUrl
30
30
  } from "../chunk-2UMNXADU.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exitOnFailedResponse
4
- } from "../chunk-VQSTA23N.js";
5
- import "../chunk-43NDA7LR.js";
4
+ } from "../chunk-7BBUTWBD.js";
5
+ import "../chunk-DLBW37U6.js";
6
6
  import {
7
7
  createIo
8
8
  } from "../chunk-TX7KBKT7.js";
@@ -17,7 +17,7 @@ import "../chunk-SAF6HGAA.js";
17
17
  import {
18
18
  UsageError
19
19
  } from "../chunk-7QLSKOSU.js";
20
- import "../chunk-TIZNAOTS.js";
20
+ import "../chunk-TJJBF73A.js";
21
21
  import {
22
22
  getApiKey,
23
23
  getBaseUrl
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleNotification
4
- } from "../chunk-HAJA47IK.js";
4
+ } from "../chunk-7L57N7WN.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-TIZNAOTS.js";
8
+ import "../chunk-TJJBF73A.js";
9
9
  import "../chunk-RN3NOEJF.js";
10
10
  import "../chunk-2UMNXADU.js";
11
11
  import "../chunk-KZERVKTD.js";
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionDenied
4
- } from "../chunk-34HABKL7.js";
5
- import "../chunk-Q5QV4I42.js";
6
- import "../chunk-SM7EMSDQ.js";
7
- import "../chunk-HAJA47IK.js";
8
- import "../chunk-3BJUW2SH.js";
4
+ } from "../chunk-DJHWBNM3.js";
5
+ import "../chunk-3CBPY2G5.js";
6
+ import "../chunk-UPPHYOIZ.js";
7
+ import "../chunk-7L57N7WN.js";
8
+ import "../chunk-IA5GBKNL.js";
9
9
  import "../chunk-BSZYIAZL.js";
10
10
  import "../chunk-SAF6HGAA.js";
11
11
  import "../chunk-7QLSKOSU.js";
12
- import "../chunk-TIZNAOTS.js";
12
+ import "../chunk-TJJBF73A.js";
13
13
  import "../chunk-RN3NOEJF.js";
14
14
  import "../chunk-2UMNXADU.js";
15
15
  import "../chunk-KZERVKTD.js";
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionRequest
4
- } from "../chunk-34HABKL7.js";
5
- import "../chunk-Q5QV4I42.js";
6
- import "../chunk-SM7EMSDQ.js";
7
- import "../chunk-HAJA47IK.js";
8
- import "../chunk-3BJUW2SH.js";
4
+ } from "../chunk-DJHWBNM3.js";
5
+ import "../chunk-3CBPY2G5.js";
6
+ import "../chunk-UPPHYOIZ.js";
7
+ import "../chunk-7L57N7WN.js";
8
+ import "../chunk-IA5GBKNL.js";
9
9
  import "../chunk-BSZYIAZL.js";
10
10
  import "../chunk-SAF6HGAA.js";
11
11
  import "../chunk-7QLSKOSU.js";
12
- import "../chunk-TIZNAOTS.js";
12
+ import "../chunk-TJJBF73A.js";
13
13
  import "../chunk-RN3NOEJF.js";
14
14
  import "../chunk-2UMNXADU.js";
15
15
  import "../chunk-KZERVKTD.js";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePostToolUse
4
- } from "../chunk-HAJA47IK.js";
4
+ } from "../chunk-7L57N7WN.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-TIZNAOTS.js";
8
+ import "../chunk-TJJBF73A.js";
9
9
  import "../chunk-RN3NOEJF.js";
10
10
  import "../chunk-2UMNXADU.js";
11
11
  import "../chunk-KZERVKTD.js";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleUserPrompt
4
- } from "../chunk-HAJA47IK.js";
4
+ } from "../chunk-7L57N7WN.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-TIZNAOTS.js";
8
+ import "../chunk-TJJBF73A.js";
9
9
  import "../chunk-RN3NOEJF.js";
10
10
  import "../chunk-2UMNXADU.js";
11
11
  import "../chunk-KZERVKTD.js";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleSessionEnd
4
- } from "../chunk-HAJA47IK.js";
4
+ } from "../chunk-7L57N7WN.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-TIZNAOTS.js";
8
+ import "../chunk-TJJBF73A.js";
9
9
  import "../chunk-RN3NOEJF.js";
10
10
  import "../chunk-2UMNXADU.js";
11
11
  import "../chunk-KZERVKTD.js";