pushary 1.9.105 → 1.9.107
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 +8 -0
- package/data/SKILL.md +3 -3
- package/data/cursor-plugin/skills/pushary/SKILL.md +2 -2
- package/data/vscode-plugin/skills/pushary/SKILL.md +2 -2
- package/dist/bin/pushary-connect.js +2 -2
- package/dist/bin/pushary-daemon.js +1 -1
- package/dist/bin/pushary-doctor.js +2 -2
- package/dist/bin/pushary-hook.js +2 -2
- package/dist/bin/pushary-login.js +2 -2
- package/dist/bin/pushary-permission-denied-hook.js +2 -2
- package/dist/bin/pushary-permission-hook.js +2 -2
- package/dist/bin/pushary-setup.js +3 -3
- package/dist/bin/pushary-status.js +2 -2
- package/dist/bin/pushary-transcripts.js +2 -2
- package/dist/bin/pushary-upgrade.js +2 -2
- package/dist/{chunk-MLLL2ET6.js → chunk-2BILLNZ4.js} +1 -1
- package/dist/{chunk-QCFWJZGT.js → chunk-4OUPD4KA.js} +1 -1
- package/dist/{chunk-WUIWHGKF.js → chunk-LIPMEFRA.js} +1 -1
- package/dist/{chunk-X4TZN52V.js → chunk-VK4PPVWB.js} +18 -4
- package/dist/{chunk-WTREXZGS.js → chunk-ZB2WNJXZ.js} +1 -1
- package/dist/src/index.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.107
|
|
4
|
+
|
|
5
|
+
- On Windows, the hook now reads Claude Code's managed settings from `C:\Program Files\ClaudeCode\managed-settings.json`, where Claude Code reads them. It read `C:\ProgramData\ClaudeCode\managed-settings.json`, which Claude Code no longer reads, so an organization's managed allow, ask and deny rules were missing when Pushary checked whether Claude Code's own rules already cover a tool call, and from the hook wiring report. macOS and Linux are unchanged. Nothing else in the CLI or the hooks changed.
|
|
6
|
+
|
|
7
|
+
## 1.9.106
|
|
8
|
+
|
|
9
|
+
- The test approval at the end of `pushary setup`, and the one `pushary doctor` sends, now wait the full 55 seconds for your tap. Since the server began ending each wait after at most 48 seconds, so that agents' tool calls stay inside their hosts' time limits, the check made one wait, read the early "still pending" as nobody answering, and cancelled the question on your phone. A tap between 48 and 55 seconds was reported as "nothing came back". The check now keeps waiting while the question is pending, up to its own 55 second window, and still cancels the question if nobody answers in time. Pressing Ctrl-C while it waits stops the waiting at once. The bundled Pushary skill now says one call waits at most 48 seconds. Nothing else in the CLI or the hooks changed.
|
|
10
|
+
|
|
3
11
|
## 1.9.105
|
|
4
12
|
|
|
5
13
|
- The background daemon now reports, on the heartbeat it already sends each minute, whether Pushary's hooks are still in place for each agent on the computer: wired, untrusted, weakened, missing, unreadable or disconnected. A hook counts only when it really runs Pushary's own binary for that event. Each agent is named with a short hash of the computer's id and its config file's path, never the path itself. If building the report fails, the heartbeat goes out without it, as before. Nothing else in the CLI or the hooks changed.
|
package/data/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pushary
|
|
3
|
-
version: 0.13.
|
|
3
|
+
version: 0.13.2
|
|
4
4
|
description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a person who may not be at the terminal, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill's workflow says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says things like keep going and ping me on my phone if you need anything, notify me when my agent needs me, approve from my phone, ask me questions while I am away from the terminal, run this overnight, keep working while I am in a meeting, I am stepping away, or do not wait for me, or wants a long task to run unattended. Ask yes/no, multiple choice or free-text questions on their phone and get the answer back, and send an update when a task finishes or fails. Use these tools proactively, without waiting to be asked. Every question and answer is recorded, so an unattended run stays reviewable afterwards. Works with Claude Code, Codex, Cursor, VS Code, Gemini CLI, Windsurf, Hermes, Lovable, or any MCP client; no Claude Max subscription required. Pushary is a hosted, paid service; web and native store checkout have different price and trial terms.
|
|
5
5
|
metadata:
|
|
6
6
|
hermes:
|
|
@@ -200,7 +200,7 @@ Your client already holds each tool's schema, with every parameter and returned
|
|
|
200
200
|
|
|
201
201
|
### ask_user
|
|
202
202
|
|
|
203
|
-
Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 known options, and `input` when the options cannot be listed. A question stays open until it is answered or cancelled, except one asked through a connector, by signing in or with a connector key, which closes 10 minutes after it is sent: Claude.ai, Claude Desktop, Cowork, ChatGPT, Grok Bot, signed-in Cline, and the Pushary for Claude and Pushary for Cowork plugins. One call waits at most
|
|
203
|
+
Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 known options, and `input` when the options cannot be listed. A question stays open until it is answered or cancelled, except one asked through a connector, by signing in or with a connector key, which closes 10 minutes after it is sent: Claude.ai, Claude Desktop, Cowork, ChatGPT, Grok Bot, signed-in Cline, and the Pushary for Claude and Pushary for Cowork plugins. One call waits at most 48 seconds and may return at once. The user's delivery mode decides how long:
|
|
204
204
|
|
|
205
205
|
| Mode | The phone | The call |
|
|
206
206
|
|---|---|---|
|
|
@@ -265,7 +265,7 @@ Ask with `ask_user`, not with `context.askQuestion`. That field remains for olde
|
|
|
265
265
|
|
|
266
266
|
### wait_for_answer
|
|
267
267
|
|
|
268
|
-
Waits up to
|
|
268
|
+
Waits up to 48 seconds for the answer to a question that is still pending. Keep calling it with the same `correlationId` while the status is `pending`.
|
|
269
269
|
|
|
270
270
|
### cancel_question
|
|
271
271
|
|
|
@@ -193,7 +193,7 @@ Your client already holds each tool's schema, with every parameter and returned
|
|
|
193
193
|
|
|
194
194
|
### ask_user
|
|
195
195
|
|
|
196
|
-
Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 known options, and `input` when the options cannot be listed. A question stays open until it is answered or cancelled, except one asked through a connector, by signing in or with a connector key, which closes 10 minutes after it is sent: Claude.ai, Claude Desktop, Cowork, ChatGPT, Grok Bot, signed-in Cline, and the Pushary for Claude and Pushary for Cowork plugins. One call waits at most
|
|
196
|
+
Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 known options, and `input` when the options cannot be listed. A question stays open until it is answered or cancelled, except one asked through a connector, by signing in or with a connector key, which closes 10 minutes after it is sent: Claude.ai, Claude Desktop, Cowork, ChatGPT, Grok Bot, signed-in Cline, and the Pushary for Claude and Pushary for Cowork plugins. One call waits at most 48 seconds and may return at once. The user's delivery mode decides how long:
|
|
197
197
|
|
|
198
198
|
| Mode | The phone | The call |
|
|
199
199
|
|---|---|---|
|
|
@@ -258,7 +258,7 @@ Ask with `ask_user`, not with `context.askQuestion`. That field remains for olde
|
|
|
258
258
|
|
|
259
259
|
### wait_for_answer
|
|
260
260
|
|
|
261
|
-
Waits up to
|
|
261
|
+
Waits up to 48 seconds for the answer to a question that is still pending. Keep calling it with the same `correlationId` while the status is `pending`.
|
|
262
262
|
|
|
263
263
|
### cancel_question
|
|
264
264
|
|
|
@@ -193,7 +193,7 @@ Your client already holds each tool's schema, with every parameter and returned
|
|
|
193
193
|
|
|
194
194
|
### ask_user
|
|
195
195
|
|
|
196
|
-
Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 known options, and `input` when the options cannot be listed. A question stays open until it is answered or cancelled, except one asked through a connector, by signing in or with a connector key, which closes 10 minutes after it is sent: Claude.ai, Claude Desktop, Cowork, ChatGPT, Grok Bot, signed-in Cline, and the Pushary for Claude and Pushary for Cowork plugins. One call waits at most
|
|
196
|
+
Asks a question and waits. Use `confirm` for yes or no, `select` for 2 to 6 known options, and `input` when the options cannot be listed. A question stays open until it is answered or cancelled, except one asked through a connector, by signing in or with a connector key, which closes 10 minutes after it is sent: Claude.ai, Claude Desktop, Cowork, ChatGPT, Grok Bot, signed-in Cline, and the Pushary for Claude and Pushary for Cowork plugins. One call waits at most 48 seconds and may return at once. The user's delivery mode decides how long:
|
|
197
197
|
|
|
198
198
|
| Mode | The phone | The call |
|
|
199
199
|
|---|---|---|
|
|
@@ -258,7 +258,7 @@ Ask with `ask_user`, not with `context.askQuestion`. That field remains for olde
|
|
|
258
258
|
|
|
259
259
|
### wait_for_answer
|
|
260
260
|
|
|
261
|
-
Waits up to
|
|
261
|
+
Waits up to 48 seconds for the answer to a question that is still pending. Keep calling it with the same `correlationId` while the status is `pending`.
|
|
262
262
|
|
|
263
263
|
### cancel_question
|
|
264
264
|
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
connectDevice,
|
|
7
7
|
connectExistingApp,
|
|
8
8
|
printConnectInstructions
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-ZB2WNJXZ.js";
|
|
10
10
|
import "../chunk-3EGEA4KH.js";
|
|
11
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-VK4PPVWB.js";
|
|
12
12
|
import "../chunk-772NHSQB.js";
|
|
13
13
|
import {
|
|
14
14
|
CONNECTED_THROUGH_MAC_APP,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
} from "../chunk-6DKMZBRK.js";
|
|
22
22
|
import {
|
|
23
23
|
fetchChannels
|
|
24
|
-
} from "../chunk-
|
|
24
|
+
} from "../chunk-ZB2WNJXZ.js";
|
|
25
25
|
import "../chunk-3EGEA4KH.js";
|
|
26
26
|
import {
|
|
27
27
|
describeAnswerTestPrompt,
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
reachVerdict,
|
|
32
32
|
roundTripEvidence,
|
|
33
33
|
verifyRoundTrip
|
|
34
|
-
} from "../chunk-
|
|
34
|
+
} from "../chunk-VK4PPVWB.js";
|
|
35
35
|
import {
|
|
36
36
|
readMachineReadiness,
|
|
37
37
|
readManagedControlEvidence
|
package/dist/bin/pushary-hook.js
CHANGED
|
@@ -6,14 +6,14 @@ import {
|
|
|
6
6
|
} from "../chunk-4EMPELDR.js";
|
|
7
7
|
import {
|
|
8
8
|
TRANSCRIPT_SYNC_NOTICE
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-4OUPD4KA.js";
|
|
10
10
|
import "../chunk-PUZZELE6.js";
|
|
11
11
|
import {
|
|
12
12
|
writeJsonError,
|
|
13
13
|
writeStdoutFully
|
|
14
14
|
} from "../chunk-6DKMZBRK.js";
|
|
15
15
|
import "../chunk-3EGEA4KH.js";
|
|
16
|
-
import "../chunk-
|
|
16
|
+
import "../chunk-VK4PPVWB.js";
|
|
17
17
|
import "../chunk-2HC5ISDW.js";
|
|
18
18
|
import "../chunk-FJYUB3ZK.js";
|
|
19
19
|
import {
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
phoneStartServiceState,
|
|
36
36
|
renderCommandSurface,
|
|
37
37
|
unverifiedKeyClosingReason
|
|
38
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-4OUPD4KA.js";
|
|
39
39
|
import {
|
|
40
40
|
coworkOutput,
|
|
41
41
|
coworkSelection
|
|
@@ -73,7 +73,7 @@ import {
|
|
|
73
73
|
pairingEscapeApplies,
|
|
74
74
|
printConnectInstructions,
|
|
75
75
|
waitForYourPhone
|
|
76
|
-
} from "../chunk-
|
|
76
|
+
} from "../chunk-ZB2WNJXZ.js";
|
|
77
77
|
import "../chunk-3EGEA4KH.js";
|
|
78
78
|
import {
|
|
79
79
|
SETUP_AGENT_NAME,
|
|
@@ -82,7 +82,7 @@ import {
|
|
|
82
82
|
roundTripEvidence,
|
|
83
83
|
roundTripWasAnswered,
|
|
84
84
|
verifyRoundTrip
|
|
85
|
-
} from "../chunk-
|
|
85
|
+
} from "../chunk-VK4PPVWB.js";
|
|
86
86
|
import {
|
|
87
87
|
readManagedControlEvidence,
|
|
88
88
|
waitForMachineReadiness
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
} from "../chunk-6DKMZBRK.js";
|
|
5
5
|
import {
|
|
6
6
|
fetchChannels
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-ZB2WNJXZ.js";
|
|
8
8
|
import "../chunk-3EGEA4KH.js";
|
|
9
9
|
import {
|
|
10
10
|
describeReach,
|
|
11
11
|
reachVerdict
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-VK4PPVWB.js";
|
|
13
13
|
import {
|
|
14
14
|
describeLastSeen,
|
|
15
15
|
listMachines
|
|
@@ -4,8 +4,8 @@ import {
|
|
|
4
4
|
} from "../chunk-P3VVRBBI.js";
|
|
5
5
|
import {
|
|
6
6
|
TRANSCRIPT_SYNC_NOTICE
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-4OUPD4KA.js";
|
|
8
|
+
import "../chunk-VK4PPVWB.js";
|
|
9
9
|
import "../chunk-2HC5ISDW.js";
|
|
10
10
|
import "../chunk-FJYUB3ZK.js";
|
|
11
11
|
import {
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "../chunk-VCWLGM77.js";
|
|
25
25
|
import {
|
|
26
26
|
phoneStartFellShortLine
|
|
27
|
-
} from "../chunk-
|
|
27
|
+
} from "../chunk-4OUPD4KA.js";
|
|
28
28
|
import {
|
|
29
29
|
ensureCodexTrustAfterReapply,
|
|
30
30
|
reapplyAllAgents
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
HERMES_RESTART_COMMAND,
|
|
34
34
|
describeCodexTrustConfirmation
|
|
35
35
|
} from "../chunk-TXMYET7E.js";
|
|
36
|
-
import "../chunk-
|
|
36
|
+
import "../chunk-VK4PPVWB.js";
|
|
37
37
|
import {
|
|
38
38
|
waitForMachineReadiness
|
|
39
39
|
} from "../chunk-J5PUKKCT.js";
|
|
@@ -12,7 +12,7 @@ import { join } from "path";
|
|
|
12
12
|
var MANAGED_CLAUDE_SETTINGS_BY_PLATFORM = {
|
|
13
13
|
darwin: "/Library/Application Support/ClaudeCode/managed-settings.json",
|
|
14
14
|
linux: "/etc/claude-code/managed-settings.json",
|
|
15
|
-
win32: "C:\\
|
|
15
|
+
win32: "C:\\Program Files\\ClaudeCode\\managed-settings.json"
|
|
16
16
|
};
|
|
17
17
|
var MAX_CLAUDE_SETTINGS_BYTES = 1048576;
|
|
18
18
|
var claudeSettingsLocationFor = (cwd, environment = process.env, home = homedir(), platform = process.platform) => ({
|
|
@@ -187,10 +187,24 @@ var defaultAsk = (apiKey, agentName) => (
|
|
|
187
187
|
// reporting "unanswered" after three seconds would be a lie about the product.
|
|
188
188
|
callMcpTool(apiKey, "ask_user", roundTripAsk(agentName), { timeoutMs: 15e3 })
|
|
189
189
|
);
|
|
190
|
-
var
|
|
190
|
+
var ROUND_TRIP_WAIT_REQUEST_SLACK_MS = 5e3;
|
|
191
|
+
var ROUND_TRIP_MIN_WAIT_MS = 1e3;
|
|
192
|
+
var ROUND_TRIP_MAX_WAITS = 4;
|
|
193
|
+
var defaultWait = (apiKey, correlationId, timeoutMs) => callMcpTool(apiKey, "wait_for_answer", {
|
|
191
194
|
correlationId,
|
|
192
|
-
timeoutMs
|
|
193
|
-
}, { timeoutMs:
|
|
195
|
+
timeoutMs
|
|
196
|
+
}, { timeoutMs: timeoutMs + ROUND_TRIP_WAIT_REQUEST_SLACK_MS });
|
|
197
|
+
var isStillPending = (answer) => answer.answered !== true && answer.status === "pending";
|
|
198
|
+
var waitUntilDeadline = async (wait, apiKey, correlationId, deadline, now, interruptRequested) => {
|
|
199
|
+
let answer = { answered: false, status: "pending" };
|
|
200
|
+
for (let attempt = 0; attempt < ROUND_TRIP_MAX_WAITS; attempt++) {
|
|
201
|
+
const remaining = deadline - now();
|
|
202
|
+
if (interruptRequested() || remaining < ROUND_TRIP_MIN_WAIT_MS) return answer;
|
|
203
|
+
answer = await wait(apiKey, correlationId, remaining);
|
|
204
|
+
if (!isStillPending(answer)) return answer;
|
|
205
|
+
}
|
|
206
|
+
return answer;
|
|
207
|
+
};
|
|
194
208
|
var defaultCancel = async (apiKey, correlationId) => {
|
|
195
209
|
await callMcpTool(apiKey, "cancel_question", { correlationId }, { timeoutMs: 1e4 }).catch(() => {
|
|
196
210
|
});
|
|
@@ -257,7 +271,7 @@ var verifyRoundTrip = async (apiKey, agentName = SETUP_AGENT_NAME, deps = {}) =>
|
|
|
257
271
|
if (asked.noDevices || asked.warning) return { kind: "no-recipients" };
|
|
258
272
|
if (asked.mode === "notify_only" || asked.status === "notified") return { kind: "notify-only" };
|
|
259
273
|
if (!asked.correlationId) return { kind: "error", detail: "no correlationId returned" };
|
|
260
|
-
const answer = asked.answered === true ? asked : await wait
|
|
274
|
+
const answer = asked.answered === true ? asked : await waitUntilDeadline(wait, apiKey, asked.correlationId, now() + ROUND_TRIP_TIMEOUT_MS, now, () => shutdown !== void 0);
|
|
261
275
|
if (answer.answered === true) {
|
|
262
276
|
const outcome = answeredRoundTrip(answer, asked.correlationId, now() - started);
|
|
263
277
|
answerObserved = outcome.kind === "answered";
|
package/dist/src/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pushary",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.107",
|
|
4
4
|
"description": "Human-in-the-loop (HITL) for AI agents: ask a person for approvals or answers by push notification. One command connects Claude Code, Codex, Cursor, Gemini CLI and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pushary",
|