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 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.1
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 55 seconds and may return at once. The user's delivery mode decides how long:
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 55 seconds for the answer to a question that is still pending. Keep calling it with the same `correlationId` while the status is `pending`.
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 55 seconds and may return at once. The user's delivery mode decides how long:
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 55 seconds for the answer to a question that is still pending. Keep calling it with the same `correlationId` while the status is `pending`.
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 55 seconds and may return at once. The user's delivery mode decides how long:
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 55 seconds for the answer to a question that is still pending. Keep calling it with the same `correlationId` while the status is `pending`.
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-WTREXZGS.js";
9
+ } from "../chunk-ZB2WNJXZ.js";
10
10
  import "../chunk-3EGEA4KH.js";
11
- import "../chunk-X4TZN52V.js";
11
+ import "../chunk-VK4PPVWB.js";
12
12
  import "../chunk-772NHSQB.js";
13
13
  import {
14
14
  CONNECTED_THROUGH_MAC_APP,
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-P3H6I656.js";
5
5
  import {
6
6
  MANAGED_CLAUDE_SETTINGS_BY_PLATFORM
7
- } from "../chunk-WUIWHGKF.js";
7
+ } from "../chunk-LIPMEFRA.js";
8
8
  import {
9
9
  declinedAgentsFile,
10
10
  readDeclinedAgents
@@ -21,7 +21,7 @@ import {
21
21
  } from "../chunk-6DKMZBRK.js";
22
22
  import {
23
23
  fetchChannels
24
- } from "../chunk-WTREXZGS.js";
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-X4TZN52V.js";
34
+ } from "../chunk-VK4PPVWB.js";
35
35
  import {
36
36
  readMachineReadiness,
37
37
  readManagedControlEvidence
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePreToolUse
4
- } from "../chunk-MLLL2ET6.js";
5
- import "../chunk-WUIWHGKF.js";
4
+ } from "../chunk-2BILLNZ4.js";
5
+ import "../chunk-LIPMEFRA.js";
6
6
  import {
7
7
  exitOnHelpFlag
8
8
  } from "../chunk-B5Q44HKN.js";
@@ -6,14 +6,14 @@ import {
6
6
  } from "../chunk-4EMPELDR.js";
7
7
  import {
8
8
  TRANSCRIPT_SYNC_NOTICE
9
- } from "../chunk-QCFWJZGT.js";
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-X4TZN52V.js";
16
+ import "../chunk-VK4PPVWB.js";
17
17
  import "../chunk-2HC5ISDW.js";
18
18
  import "../chunk-FJYUB3ZK.js";
19
19
  import {
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionDenied
4
- } from "../chunk-MLLL2ET6.js";
5
- import "../chunk-WUIWHGKF.js";
4
+ } from "../chunk-2BILLNZ4.js";
5
+ import "../chunk-LIPMEFRA.js";
6
6
  import {
7
7
  takeHookHoldBudget
8
8
  } from "../chunk-XN527J4W.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePermissionRequest
4
- } from "../chunk-MLLL2ET6.js";
5
- import "../chunk-WUIWHGKF.js";
4
+ } from "../chunk-2BILLNZ4.js";
5
+ import "../chunk-LIPMEFRA.js";
6
6
  import {
7
7
  takeHookHoldBudget
8
8
  } from "../chunk-XN527J4W.js";
@@ -35,7 +35,7 @@ import {
35
35
  phoneStartServiceState,
36
36
  renderCommandSurface,
37
37
  unverifiedKeyClosingReason
38
- } from "../chunk-QCFWJZGT.js";
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-WTREXZGS.js";
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-X4TZN52V.js";
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-WTREXZGS.js";
7
+ } from "../chunk-ZB2WNJXZ.js";
8
8
  import "../chunk-3EGEA4KH.js";
9
9
  import {
10
10
  describeReach,
11
11
  reachVerdict
12
- } from "../chunk-X4TZN52V.js";
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-QCFWJZGT.js";
8
- import "../chunk-X4TZN52V.js";
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-QCFWJZGT.js";
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-X4TZN52V.js";
36
+ import "../chunk-VK4PPVWB.js";
37
37
  import {
38
38
  waitForMachineReadiness
39
39
  } from "../chunk-J5PUKKCT.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  claudeSettingsLocationFor,
3
3
  readClaudePermissionRules
4
- } from "./chunk-WUIWHGKF.js";
4
+ } from "./chunk-LIPMEFRA.js";
5
5
  import {
6
6
  askAgentQuestions,
7
7
  defersToNativeMode,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  notificationAnswerStep
3
- } from "./chunk-X4TZN52V.js";
3
+ } from "./chunk-VK4PPVWB.js";
4
4
  import {
5
5
  canChangeApprovalSettings
6
6
  } from "./chunk-2HC5ISDW.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:\\ProgramData\\ClaudeCode\\managed-settings.json"
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 defaultWait = (apiKey, correlationId) => callMcpTool(apiKey, "wait_for_answer", {
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: ROUND_TRIP_TIMEOUT_MS
193
- }, { timeoutMs: ROUND_TRIP_TIMEOUT_MS + 5e3 });
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(apiKey, asked.correlationId);
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";
@@ -12,7 +12,7 @@ import {
12
12
  reachVerdict,
13
13
  reachesYou,
14
14
  verifyDelivery
15
- } from "./chunk-X4TZN52V.js";
15
+ } from "./chunk-VK4PPVWB.js";
16
16
  import {
17
17
  humanIsTty,
18
18
  writeHuman
package/dist/src/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  handlePreToolUse
3
- } from "../chunk-MLLL2ET6.js";
4
- import "../chunk-WUIWHGKF.js";
3
+ } from "../chunk-2BILLNZ4.js";
4
+ import "../chunk-LIPMEFRA.js";
5
5
  import "../chunk-J2HIFUAT.js";
6
6
  import "../chunk-FUTFQSRA.js";
7
7
  import "../chunk-RKQVMFHN.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pushary",
3
- "version": "1.9.105",
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",