@pushary/agent-hooks 0.72.0 → 0.74.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 (41) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/bin/pushary-claude.js +3 -3
  3. package/dist/bin/pushary-clean.js +5 -5
  4. package/dist/bin/pushary-codex-hook.js +4 -4
  5. package/dist/bin/pushary-codex.js +2 -2
  6. package/dist/bin/pushary-connect.js +3 -3
  7. package/dist/bin/pushary-doctor.js +7 -7
  8. package/dist/bin/pushary-gemini-hook.js +4 -4
  9. package/dist/bin/pushary-hook.js +6 -6
  10. package/dist/bin/pushary-login.js +2 -2
  11. package/dist/bin/pushary-logout.js +2 -2
  12. package/dist/bin/pushary-mode.js +3 -3
  13. package/dist/bin/pushary-notification-hook.js +2 -2
  14. package/dist/bin/pushary-permission-denied-hook.js +6 -6
  15. package/dist/bin/pushary-permission-hook.js +6 -6
  16. package/dist/bin/pushary-post-hook.js +2 -2
  17. package/dist/bin/pushary-prompt-hook.js +2 -2
  18. package/dist/bin/pushary-session-end-hook.js +2 -2
  19. package/dist/bin/pushary-session-start-hook.js +2 -2
  20. package/dist/bin/pushary-setup.js +33 -14
  21. package/dist/bin/pushary-stats.js +2 -2
  22. package/dist/bin/pushary-status.js +2 -2
  23. package/dist/bin/pushary-stop-hook.js +2 -2
  24. package/dist/bin/pushary-stopfailure-hook.js +2 -2
  25. package/dist/bin/pushary-upgrade.js +4 -4
  26. package/dist/bin/pushary-wait.js +3 -3
  27. package/dist/{chunk-HU43EZ5Q.js → chunk-34HABKL7.js} +30 -8
  28. package/dist/{chunk-WLGEY4UX.js → chunk-3BJUW2SH.js} +1 -1
  29. package/dist/{chunk-G4TARJAY.js → chunk-43NDA7LR.js} +1 -1
  30. package/dist/{chunk-B7R4YSAB.js → chunk-4S3E5DQJ.js} +2 -2
  31. package/dist/{chunk-E2U35RLD.js → chunk-CJET52NP.js} +1 -1
  32. package/dist/{chunk-FZIQSDTQ.js → chunk-HAJA47IK.js} +1 -1
  33. package/dist/{chunk-I4BYZIX4.js → chunk-NDCIOAL7.js} +1 -1
  34. package/dist/{chunk-7HG4WUIE.js → chunk-PZ4UCGWG.js} +1 -1
  35. package/dist/{chunk-CAJZAFVS.js → chunk-Q5QV4I42.js} +1 -1
  36. package/dist/{chunk-GD275GEX.js → chunk-SM7EMSDQ.js} +2 -2
  37. package/dist/{chunk-SR52774M.js → chunk-VQSTA23N.js} +1 -1
  38. package/dist/src/index.d.ts +1 -0
  39. package/dist/src/index.js +6 -6
  40. package/package.json +1 -1
  41. /package/dist/{chunk-DQAN3JQP.js → chunk-TIZNAOTS.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,60 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.74.0
4
+
5
+ ### The terminal went quiet while your phone was deciding
6
+
7
+ A gated tool call sent the push and then blocked, writing nothing. Claude Code
8
+ showed a bare spinner. If you missed the notification there was no way to tell
9
+ that a question existed, let alone where to answer it, and the terminal prompt
10
+ only appeared once the wait expired.
11
+
12
+ The hook now says so before it blocks:
13
+
14
+ [pushary] Sent to your phone. Waiting 10s, then this terminal takes over.
15
+ Answer here instead: https://pushary.com/dashboard/agent
16
+
17
+ The wait line prints per question, because each question is its own blocking
18
+ moment with its own countdown. The URL prints once per session, because it is
19
+ the same page every time and repeating it on every gated call is noise.
20
+
21
+ That URL is the signed-in dashboard, not the `/decide` link the push carries.
22
+ The decide link is a bearer credential: anyone holding it can answer. Handing it
23
+ to the agent that is being gated would let it approve its own action, so the
24
+ hook is only ever told about the page that requires your login.
25
+
26
+ Servers that predate this send no URL, and the hook just prints the wait line.
27
+
28
+ ## 0.73.0
29
+
30
+ ### Codex could finish setup with no skill installed
31
+
32
+ If your machine already uses skills.sh, setup installs the Pushary skill
33
+ through that CLI so the install registers rather than being invisible. For
34
+ Codex, `skills add --agent codex` prints "copy to Codex", says "Installation
35
+ complete" and exits 0, then writes only `~/.agents/skills/pushary`. Nothing
36
+ lands in `~/.codex/skills`, which is where Codex reads. Setup took the exit
37
+ code as proof, skipped the copy it ships, and Codex ended up with no skill.
38
+
39
+ Doctor caught it, and then gave advice that could not work: clean and set up
40
+ again reinstalled exactly the same way and failed the same check.
41
+
42
+ The exit code no longer decides this. What decides it is whether the run left
43
+ a SKILL.md where that agent reads, which is the same thing doctor looks at,
44
+ and setup writes its own copy when it did not. Anything skills.sh really did
45
+ install is left exactly as it installed it, symlinks included.
46
+
47
+ Everything else about the wiring was fine, so this cost you the skill and
48
+ nothing more. Approvals, hooks and the instructions in `~/.codex/AGENTS.md`
49
+ were all in place.
50
+
51
+ ### A skill that will not install no longer stops setup
52
+
53
+ The skill is the one piece of the wiring nothing else depends on. It used to
54
+ be able to abort setup partway, leaving an agent half configured. Now it warns
55
+ and setup finishes the rest, and `pushary doctor` tells you the skill is
56
+ missing.
57
+
3
58
  ## 0.72.0
4
59
 
5
60
  ### Setup tells you when Codex was already quarantined
@@ -7,7 +7,7 @@ import {
7
7
  KILL_REASON,
8
8
  isDeferAnswer,
9
9
  resolveGate
10
- } from "../chunk-GD275GEX.js";
10
+ } from "../chunk-SM7EMSDQ.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-FZIQSDTQ.js";
22
+ } from "../chunk-HAJA47IK.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-DQAN3JQP.js";
28
+ } from "../chunk-TIZNAOTS.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-CAJZAFVS.js";
5
+ } from "../chunk-Q5QV4I42.js";
6
6
  import {
7
7
  removeInstructionBlock,
8
8
  shortenHome,
9
9
  unregisterPluginLocation,
10
10
  vscodeSettingsTargets
11
- } from "../chunk-I4BYZIX4.js";
11
+ } from "../chunk-NDCIOAL7.js";
12
12
  import {
13
13
  removeGeminiSettings
14
- } from "../chunk-E2U35RLD.js";
14
+ } from "../chunk-CJET52NP.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-7HG4WUIE.js";
32
+ } from "../chunk-PZ4UCGWG.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-DQAN3JQP.js";
47
+ import "../chunk-TIZNAOTS.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-GD275GEX.js";
7
+ } from "../chunk-SM7EMSDQ.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-FZIQSDTQ.js";
38
+ } from "../chunk-HAJA47IK.js";
39
39
  import {
40
40
  isGatingMoment,
41
41
  recordKeylessMoment
42
- } from "../chunk-WLGEY4UX.js";
42
+ } from "../chunk-3BJUW2SH.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-DQAN3JQP.js";
51
+ } from "../chunk-TIZNAOTS.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-FZIQSDTQ.js";
6
+ } from "../chunk-HAJA47IK.js";
7
7
  import "../chunk-BSZYIAZL.js";
8
8
  import "../chunk-SAF6HGAA.js";
9
9
  import "../chunk-7QLSKOSU.js";
10
- import "../chunk-DQAN3JQP.js";
10
+ import "../chunk-TIZNAOTS.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-SR52774M.js";
4
+ } from "../chunk-VQSTA23N.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-G4TARJAY.js";
17
+ } from "../chunk-43NDA7LR.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-DQAN3JQP.js";
34
+ import "../chunk-TIZNAOTS.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-B7R4YSAB.js";
9
+ } from "../chunk-4S3E5DQJ.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-I4BYZIX4.js";
18
+ } from "../chunk-NDCIOAL7.js";
19
19
  import {
20
20
  GEMINI_HOOK_BINARY,
21
21
  hasGeminiHooks,
22
22
  missingGeminiHookEvents
23
- } from "../chunk-E2U35RLD.js";
23
+ } from "../chunk-CJET52NP.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-7HG4WUIE.js";
42
+ } from "../chunk-PZ4UCGWG.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-G4TARJAY.js";
57
+ } from "../chunk-43NDA7LR.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-WLGEY4UX.js";
76
+ } from "../chunk-3BJUW2SH.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-DQAN3JQP.js";
85
+ import "../chunk-TIZNAOTS.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-GD275GEX.js";
7
+ } from "../chunk-SM7EMSDQ.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-FZIQSDTQ.js";
29
+ } from "../chunk-HAJA47IK.js";
30
30
  import {
31
31
  isGatingMoment,
32
32
  recordKeylessMoment
33
- } from "../chunk-WLGEY4UX.js";
33
+ } from "../chunk-3BJUW2SH.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-DQAN3JQP.js";
42
+ } from "../chunk-TIZNAOTS.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-HU43EZ5Q.js";
5
- import "../chunk-CAJZAFVS.js";
4
+ } from "../chunk-34HABKL7.js";
5
+ import "../chunk-Q5QV4I42.js";
6
6
  import {
7
7
  exitOnHelpFlag
8
8
  } from "../chunk-BBK3TTU2.js";
9
9
  import "../chunk-7OYGFJYZ.js";
10
- import "../chunk-GD275GEX.js";
11
- import "../chunk-FZIQSDTQ.js";
12
- import "../chunk-WLGEY4UX.js";
10
+ import "../chunk-SM7EMSDQ.js";
11
+ import "../chunk-HAJA47IK.js";
12
+ import "../chunk-3BJUW2SH.js";
13
13
  import "../chunk-BSZYIAZL.js";
14
14
  import "../chunk-SAF6HGAA.js";
15
15
  import "../chunk-7QLSKOSU.js";
16
- import "../chunk-DQAN3JQP.js";
16
+ import "../chunk-TIZNAOTS.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-G4TARJAY.js";
14
+ } from "../chunk-43NDA7LR.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-DQAN3JQP.js";
34
+ } from "../chunk-TIZNAOTS.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-7HG4WUIE.js";
7
+ } from "../chunk-PZ4UCGWG.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-DQAN3JQP.js";
27
+ import "../chunk-TIZNAOTS.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-SR52774M.js";
5
- import "../chunk-G4TARJAY.js";
4
+ } from "../chunk-VQSTA23N.js";
5
+ import "../chunk-43NDA7LR.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-DQAN3JQP.js";
20
+ import "../chunk-TIZNAOTS.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-FZIQSDTQ.js";
4
+ } from "../chunk-HAJA47IK.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-DQAN3JQP.js";
8
+ import "../chunk-TIZNAOTS.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-HU43EZ5Q.js";
5
- import "../chunk-CAJZAFVS.js";
6
- import "../chunk-GD275GEX.js";
7
- import "../chunk-FZIQSDTQ.js";
8
- import "../chunk-WLGEY4UX.js";
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";
9
9
  import "../chunk-BSZYIAZL.js";
10
10
  import "../chunk-SAF6HGAA.js";
11
11
  import "../chunk-7QLSKOSU.js";
12
- import "../chunk-DQAN3JQP.js";
12
+ import "../chunk-TIZNAOTS.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-HU43EZ5Q.js";
5
- import "../chunk-CAJZAFVS.js";
6
- import "../chunk-GD275GEX.js";
7
- import "../chunk-FZIQSDTQ.js";
8
- import "../chunk-WLGEY4UX.js";
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";
9
9
  import "../chunk-BSZYIAZL.js";
10
10
  import "../chunk-SAF6HGAA.js";
11
11
  import "../chunk-7QLSKOSU.js";
12
- import "../chunk-DQAN3JQP.js";
12
+ import "../chunk-TIZNAOTS.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-FZIQSDTQ.js";
4
+ } from "../chunk-HAJA47IK.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-DQAN3JQP.js";
8
+ import "../chunk-TIZNAOTS.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-FZIQSDTQ.js";
4
+ } from "../chunk-HAJA47IK.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-DQAN3JQP.js";
8
+ import "../chunk-TIZNAOTS.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-FZIQSDTQ.js";
4
+ } from "../chunk-HAJA47IK.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-DQAN3JQP.js";
8
+ import "../chunk-TIZNAOTS.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
  handleSessionStart
4
- } from "../chunk-FZIQSDTQ.js";
4
+ } from "../chunk-HAJA47IK.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-DQAN3JQP.js";
8
+ import "../chunk-TIZNAOTS.js";
9
9
  import "../chunk-RN3NOEJF.js";
10
10
  import "../chunk-2UMNXADU.js";
11
11
  import "../chunk-KZERVKTD.js";
@@ -6,12 +6,12 @@ import {
6
6
  addClaudeMcpServer,
7
7
  addPusharyHooks,
8
8
  addPusharyToolPermissions
9
- } from "../chunk-CAJZAFVS.js";
9
+ } from "../chunk-Q5QV4I42.js";
10
10
  import {
11
11
  claudeWired,
12
12
  codexWired,
13
13
  geminiWired
14
- } from "../chunk-B7R4YSAB.js";
14
+ } from "../chunk-4S3E5DQJ.js";
15
15
  import {
16
16
  describeDetection,
17
17
  detectAllAgents,
@@ -23,12 +23,12 @@ import {
23
23
  shortenHome,
24
24
  vscodeSettingsTargets,
25
25
  writeInstructionBlock
26
- } from "../chunk-I4BYZIX4.js";
26
+ } from "../chunk-NDCIOAL7.js";
27
27
  import {
28
28
  GEMINI_HOOK_BINARY,
29
29
  addGeminiHooks,
30
30
  addGeminiMcpServer
31
- } from "../chunk-E2U35RLD.js";
31
+ } from "../chunk-CJET52NP.js";
32
32
  import {
33
33
  addCodexHookTrust,
34
34
  addCodexHooks,
@@ -46,7 +46,7 @@ import {
46
46
  geminiSettings,
47
47
  pusharyConfigFile,
48
48
  vscodePluginDir
49
- } from "../chunk-7HG4WUIE.js";
49
+ } from "../chunk-PZ4UCGWG.js";
50
50
  import {
51
51
  confirmAppConnection,
52
52
  connectDevice,
@@ -72,7 +72,7 @@ import {
72
72
  import {
73
73
  checkApiKey,
74
74
  describeKeyCheck
75
- } from "../chunk-G4TARJAY.js";
75
+ } from "../chunk-43NDA7LR.js";
76
76
  import {
77
77
  installClaudeAlias,
78
78
  resolveShellRc
@@ -94,7 +94,7 @@ import {
94
94
  } from "../chunk-7OYGFJYZ.js";
95
95
  import {
96
96
  reportEvent
97
- } from "../chunk-FZIQSDTQ.js";
97
+ } from "../chunk-HAJA47IK.js";
98
98
  import "../chunk-BSZYIAZL.js";
99
99
  import "../chunk-SAF6HGAA.js";
100
100
  import {
@@ -102,7 +102,7 @@ import {
102
102
  } from "../chunk-7QLSKOSU.js";
103
103
  import {
104
104
  isValidApiKey
105
- } from "../chunk-DQAN3JQP.js";
105
+ } from "../chunk-TIZNAOTS.js";
106
106
  import "../chunk-RN3NOEJF.js";
107
107
  import "../chunk-2UMNXADU.js";
108
108
  import {
@@ -294,6 +294,17 @@ var installSkillViaSkillsCli = (agent) => {
294
294
  return false;
295
295
  }
296
296
  };
297
+ var installAgentSkill = async (request, effects) => {
298
+ if (request.skillsCliInUse) {
299
+ const startedAt = effects.now();
300
+ if (effects.runSkillsCli(request.agent)) {
301
+ const modifiedAt = effects.skillModifiedAt(request.agentSkillDir);
302
+ if (modifiedAt !== null && modifiedAt >= startedAt) return "skills-cli";
303
+ }
304
+ }
305
+ await effects.writePackagedSkill(request.agentSkillDir);
306
+ return "packaged-copy";
307
+ };
297
308
 
298
309
  // src/setup/telemetry.ts
299
310
  var currentStep = "start";
@@ -607,14 +618,22 @@ var fetchSkillContent = async () => {
607
618
  _cachedSkillContent = readFileSync(source, "utf-8");
608
619
  return _cachedSkillContent;
609
620
  };
621
+ var writePackagedSkill = async (dir) => {
622
+ const content = await fetchSkillContent();
623
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
624
+ writeFileSync(join2(dir, "SKILL.md"), content, "utf-8");
625
+ };
610
626
  var skillsCliInUse = () => isInstalled("skills") || existsSync(join2(homedir(), ".agents", "skills"));
611
- var installSkill = async (agent, fallbackDir) => {
627
+ var skillInstallEffects = {
628
+ runSkillsCli: installSkillViaSkillsCli,
629
+ skillModifiedAt: (dir) => statSync(join2(dir, "SKILL.md"), { throwIfNoEntry: false })?.mtimeMs ?? null,
630
+ writePackagedSkill,
631
+ now: () => Date.now()
632
+ };
633
+ var installSkill = async (agent, agentSkillDir) => {
612
634
  await spinner("Installing Pushary skill", async () => {
613
- if (skillsCliInUse() && installSkillViaSkillsCli(agent)) return;
614
- const content = await fetchSkillContent();
615
- if (!existsSync(fallbackDir)) mkdirSync(fallbackDir, { recursive: true });
616
- writeFileSync(join2(fallbackDir, "SKILL.md"), content, "utf-8");
617
- });
635
+ await installAgentSkill({ agent, agentSkillDir, skillsCliInUse: skillsCliInUse() }, skillInstallEffects);
636
+ }, { optional: true });
618
637
  };
619
638
  var setupClaudeCode = async (apiKey) => {
620
639
  console.log(`
@@ -5,8 +5,8 @@ import {
5
5
  import "../chunk-7OYGFJYZ.js";
6
6
  import {
7
7
  readLedgerSummary
8
- } from "../chunk-WLGEY4UX.js";
9
- import "../chunk-DQAN3JQP.js";
8
+ } from "../chunk-3BJUW2SH.js";
9
+ import "../chunk-TIZNAOTS.js";
10
10
  import {
11
11
  getApiKey
12
12
  } from "../chunk-2UMNXADU.js";
@@ -16,7 +16,7 @@ import "../chunk-6MTNS63X.js";
16
16
  import {
17
17
  checkApiKey,
18
18
  describeKeyCheck
19
- } from "../chunk-G4TARJAY.js";
19
+ } from "../chunk-43NDA7LR.js";
20
20
  import {
21
21
  createIo
22
22
  } from "../chunk-TX7KBKT7.js";
@@ -33,7 +33,7 @@ import "../chunk-SAF6HGAA.js";
33
33
  import {
34
34
  UsageError
35
35
  } from "../chunk-7QLSKOSU.js";
36
- import "../chunk-DQAN3JQP.js";
36
+ import "../chunk-TIZNAOTS.js";
37
37
  import "../chunk-RN3NOEJF.js";
38
38
  import "../chunk-2UMNXADU.js";
39
39
  import {
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleStop
4
- } from "../chunk-FZIQSDTQ.js";
4
+ } from "../chunk-HAJA47IK.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-DQAN3JQP.js";
8
+ import "../chunk-TIZNAOTS.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
  handleStopFailure
4
- } from "../chunk-FZIQSDTQ.js";
4
+ } from "../chunk-HAJA47IK.js";
5
5
  import "../chunk-BSZYIAZL.js";
6
6
  import "../chunk-SAF6HGAA.js";
7
7
  import "../chunk-7QLSKOSU.js";
8
- import "../chunk-DQAN3JQP.js";
8
+ import "../chunk-TIZNAOTS.js";
9
9
  import "../chunk-RN3NOEJF.js";
10
10
  import "../chunk-2UMNXADU.js";
11
11
  import "../chunk-KZERVKTD.js";
@@ -3,13 +3,13 @@ import {
3
3
  addClaudeMcpServer,
4
4
  addPusharyHooks,
5
5
  addPusharyToolPermissions
6
- } from "../chunk-CAJZAFVS.js";
6
+ } from "../chunk-Q5QV4I42.js";
7
7
  import {
8
8
  GEMINI_HOOK_BINARY,
9
9
  addGeminiHooks,
10
10
  addGeminiMcpServer,
11
11
  hasGeminiHooks
12
- } from "../chunk-E2U35RLD.js";
12
+ } from "../chunk-CJET52NP.js";
13
13
  import {
14
14
  CODEX_HOOK_BINARY,
15
15
  addCodexHookTrust,
@@ -23,7 +23,7 @@ import {
23
23
  hasCodexHooks,
24
24
  vscodePluginDir,
25
25
  vscodePluginMcp
26
- } from "../chunk-7HG4WUIE.js";
26
+ } from "../chunk-PZ4UCGWG.js";
27
27
  import {
28
28
  readJsonSafe
29
29
  } from "../chunk-6MTNS63X.js";
@@ -40,7 +40,7 @@ import {
40
40
  import {
41
41
  isNewerVersion
42
42
  } from "../chunk-7OYGFJYZ.js";
43
- import "../chunk-DQAN3JQP.js";
43
+ import "../chunk-TIZNAOTS.js";
44
44
  import {
45
45
  getApiKey
46
46
  } from "../chunk-2UMNXADU.js";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exitOnFailedResponse
4
- } from "../chunk-SR52774M.js";
4
+ } from "../chunk-VQSTA23N.js";
5
5
  import {
6
6
  describeWaitLadder
7
7
  } from "../chunk-IIENZE2J.js";
8
- import "../chunk-G4TARJAY.js";
8
+ import "../chunk-43NDA7LR.js";
9
9
  import {
10
10
  createIo
11
11
  } from "../chunk-TX7KBKT7.js";
@@ -20,7 +20,7 @@ import "../chunk-SAF6HGAA.js";
20
20
  import {
21
21
  UsageError
22
22
  } from "../chunk-7QLSKOSU.js";
23
- import "../chunk-DQAN3JQP.js";
23
+ import "../chunk-TIZNAOTS.js";
24
24
  import {
25
25
  getApiKey,
26
26
  getBaseUrl
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  PRETOOLUSE_HANDLED_TOOLS
3
- } from "./chunk-CAJZAFVS.js";
3
+ } from "./chunk-Q5QV4I42.js";
4
4
  import {
5
5
  denyReasonFrom,
6
6
  isDeferAnswer,
7
7
  resolveGate
8
- } from "./chunk-GD275GEX.js";
8
+ } from "./chunk-SM7EMSDQ.js";
9
9
  import {
10
10
  DEFAULT_SESSION,
11
11
  askUser,
@@ -25,17 +25,17 @@ import {
25
25
  sendNotification,
26
26
  throttlePass,
27
27
  waitForAnswer
28
- } from "./chunk-FZIQSDTQ.js";
28
+ } from "./chunk-HAJA47IK.js";
29
29
  import {
30
30
  isGatingMoment,
31
31
  recordKeylessMoment
32
- } from "./chunk-WLGEY4UX.js";
32
+ } from "./chunk-3BJUW2SH.js";
33
33
  import {
34
34
  buildDecisionEpisodeFeatures,
35
35
  effectiveWaitSeconds,
36
36
  hookWaitClamped,
37
37
  hookWaitDeadline
38
- } from "./chunk-DQAN3JQP.js";
38
+ } from "./chunk-TIZNAOTS.js";
39
39
  import {
40
40
  getMachineId
41
41
  } from "./chunk-RN3NOEJF.js";
@@ -159,6 +159,7 @@ var handlePushOnly = async (apiKey, description, projectName, timeoutSeconds, ti
159
159
  const now = Date.now();
160
160
  const deadline = hookWaitDeadline(START_MS, effectiveWait, "claude", now);
161
161
  const clampCut = hookWaitClamped(START_MS, effectiveWait, "claude", now);
162
+ announceWait(effectiveWait, result.answerUrl, sessionId);
162
163
  const answer = await pollForAnswer(apiKey, result.correlationId, deadline);
163
164
  if (answer.answered) {
164
165
  if (isDeferAnswer(answer.value)) return ask("Handling on your machine");
@@ -206,6 +207,7 @@ var handlePushFirst = async (apiKey, description, projectName, pushFirstSeconds,
206
207
  if (result.noDevices) {
207
208
  return void 0;
208
209
  }
210
+ announceWait(pushFirstSeconds, result.answerUrl, sessionId);
209
211
  const deadline = hookWaitDeadline(START_MS, pushFirstSeconds, "claude", Date.now());
210
212
  const answer = await pollForAnswer(apiKey, result.correlationId, deadline, 1500);
211
213
  if (answer.answered) {
@@ -294,13 +296,33 @@ var dispatchModeHandler = async (apiKey, input, toolPolicy, machineId, trainingC
294
296
  }
295
297
  return result;
296
298
  };
299
+ var announceWait = (waitSeconds, answerUrl, sessionId) => {
300
+ try {
301
+ const handoff = waitSeconds > 0 ? `Waiting ${waitSeconds}s, then this terminal takes over.` : "Waiting for your answer.";
302
+ process.stderr.write(`[pushary] Sent to your phone. ${handoff}
303
+ `);
304
+ if (answerUrl && oncePerSession("answerurl", sessionId)) {
305
+ process.stderr.write(` Answer here instead: ${answerUrl}
306
+ `);
307
+ }
308
+ } catch {
309
+ }
310
+ };
297
311
  var KEYLESS_NOTICE = "[pushary] Not connected (no API key), so your agent runs untouched. Approval moments are counted locally; see them with: npx @pushary/agent-hooks@latest stats. Connect: https://pushary.com/sign-up?utm_source=cli&utm_medium=keyless-hook";
298
- var keylessNoticeOnce = (sessionId) => {
312
+ var oncePerSession = (kind, sessionId) => {
299
313
  try {
300
314
  const key = (sessionId || DEFAULT_SESSION).replace(/[^a-zA-Z0-9_-]/g, "");
301
- const marker = join(tmpdir(), `pushary-keyless-${key}`);
302
- if (existsSync(marker)) return;
315
+ const marker = join(tmpdir(), `pushary-${kind}-${key}`);
316
+ if (existsSync(marker)) return false;
303
317
  writeFileSync(marker, "1", "utf-8");
318
+ return true;
319
+ } catch {
320
+ return false;
321
+ }
322
+ };
323
+ var keylessNoticeOnce = (sessionId) => {
324
+ try {
325
+ if (!oncePerSession("keyless", sessionId)) return;
304
326
  process.stderr.write(`${KEYLESS_NOTICE}
305
327
  `);
306
328
  } catch {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isSafeReadOnlyCommand
3
- } from "./chunk-DQAN3JQP.js";
3
+ } from "./chunk-TIZNAOTS.js";
4
4
 
5
5
  // src/ledger.ts
6
6
  import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync } from "fs";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-7QLSKOSU.js";
7
7
  import {
8
8
  isValidApiKey
9
- } from "./chunk-DQAN3JQP.js";
9
+ } from "./chunk-TIZNAOTS.js";
10
10
  import {
11
11
  getBaseUrl
12
12
  } from "./chunk-2UMNXADU.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  hasGeminiHooks
3
- } from "./chunk-E2U35RLD.js";
3
+ } from "./chunk-CJET52NP.js";
4
4
  import {
5
5
  hasCodexHooks
6
- } from "./chunk-7HG4WUIE.js";
6
+ } from "./chunk-PZ4UCGWG.js";
7
7
 
8
8
  // src/diagnostics/wiring.ts
9
9
  var record = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HOOK_BUDGETS
3
- } from "./chunk-DQAN3JQP.js";
3
+ } from "./chunk-TIZNAOTS.js";
4
4
 
5
5
  // src/gemini-config.ts
6
6
  var GEMINI_HOOK_BINARY = "pushary-gemini-hook";
@@ -20,7 +20,7 @@ import {
20
20
  policyArgForms,
21
21
  redactSecrets,
22
22
  redactSecretsDeep
23
- } from "./chunk-DQAN3JQP.js";
23
+ } from "./chunk-TIZNAOTS.js";
24
24
  import {
25
25
  getMachineId
26
26
  } from "./chunk-RN3NOEJF.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  codexHomeFrom
3
- } from "./chunk-7HG4WUIE.js";
3
+ } from "./chunk-PZ4UCGWG.js";
4
4
 
5
5
  // src/vscode-config.ts
6
6
  import { homedir } from "os";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HOOK_BUDGETS
3
- } from "./chunk-DQAN3JQP.js";
3
+ } from "./chunk-TIZNAOTS.js";
4
4
 
5
5
  // src/codex-config.ts
6
6
  import { createHash } from "crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HOOK_BUDGETS
3
- } from "./chunk-DQAN3JQP.js";
3
+ } from "./chunk-TIZNAOTS.js";
4
4
 
5
5
  // src/claude-config.ts
6
6
  import { join } from "path";
@@ -4,12 +4,12 @@ import {
4
4
  isModeStateDegraded,
5
5
  resolveAutoResolveOrigin,
6
6
  resolvePolicyAcross
7
- } from "./chunk-FZIQSDTQ.js";
7
+ } from "./chunk-HAJA47IK.js";
8
8
  import {
9
9
  evaluateScope,
10
10
  scopeChangeReason,
11
11
  scopeRequiresHuman
12
- } from "./chunk-DQAN3JQP.js";
12
+ } from "./chunk-TIZNAOTS.js";
13
13
 
14
14
  // src/answer.ts
15
15
  var denyReasonFrom = (value, note) => {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  describeKeyCheck,
3
3
  keyCheckFromResponse
4
- } from "./chunk-G4TARJAY.js";
4
+ } from "./chunk-43NDA7LR.js";
5
5
  import {
6
6
  createIo
7
7
  } from "./chunk-TX7KBKT7.js";
@@ -146,6 +146,7 @@ interface AskUserResponse {
146
146
  };
147
147
  suppressed?: boolean;
148
148
  noDevices?: boolean;
149
+ answerUrl?: string;
149
150
  }
150
151
  interface WaitForAnswerResponse {
151
152
  answered: boolean;
package/dist/src/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  handlePreToolUse
3
- } from "../chunk-HU43EZ5Q.js";
4
- import "../chunk-CAJZAFVS.js";
5
- import "../chunk-GD275GEX.js";
3
+ } from "../chunk-34HABKL7.js";
4
+ import "../chunk-Q5QV4I42.js";
5
+ import "../chunk-SM7EMSDQ.js";
6
6
  import {
7
7
  askUser,
8
8
  cancelQuestion,
@@ -15,12 +15,12 @@ import {
15
15
  reportEvent,
16
16
  resolvePolicy,
17
17
  waitForAnswer
18
- } from "../chunk-FZIQSDTQ.js";
19
- import "../chunk-WLGEY4UX.js";
18
+ } from "../chunk-HAJA47IK.js";
19
+ import "../chunk-3BJUW2SH.js";
20
20
  import "../chunk-BSZYIAZL.js";
21
21
  import "../chunk-SAF6HGAA.js";
22
22
  import "../chunk-7QLSKOSU.js";
23
- import "../chunk-DQAN3JQP.js";
23
+ import "../chunk-TIZNAOTS.js";
24
24
  import "../chunk-RN3NOEJF.js";
25
25
  import {
26
26
  getApiKey,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pushary/agent-hooks",
3
- "version": "0.72.0",
3
+ "version": "0.74.0",
4
4
  "description": "Permission hooks for AI coding agents: route tool approvals through Pushary push notifications",
5
5
  "keywords": [
6
6
  "pushary",
File without changes