pushary 1.9.65 → 1.9.67

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 (129) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/data/SKILL.md +1 -1
  3. package/data/cursor-plugin/skills/pushary/SKILL.md +1 -1
  4. package/data/vscode-plugin/skills/pushary/SKILL.md +1 -1
  5. package/dist/{api-32B3XLJR.js → api-3WIPD5GC.js} +12 -10
  6. package/dist/bin/pushary-bell-hook.js +25 -27
  7. package/dist/bin/pushary-bell.js +10 -10
  8. package/dist/bin/pushary-claude.js +26 -28
  9. package/dist/bin/pushary-clean.js +74 -77
  10. package/dist/bin/pushary-codex-bridge.js +21 -22
  11. package/dist/bin/pushary-codex-hook.js +30 -32
  12. package/dist/bin/pushary-codex-session.js +8 -8
  13. package/dist/bin/pushary-codex.js +13 -13
  14. package/dist/bin/pushary-connect.js +28 -28
  15. package/dist/bin/pushary-cowork.js +5 -5
  16. package/dist/bin/pushary-daemon.js +40 -41
  17. package/dist/bin/pushary-disconnect.js +25 -26
  18. package/dist/bin/pushary-doctor.js +118 -76
  19. package/dist/bin/pushary-elicitation-hook.js +25 -27
  20. package/dist/bin/pushary-gemini-bridge.js +15 -16
  21. package/dist/bin/pushary-gemini-hook.js +27 -29
  22. package/dist/bin/pushary-hook.js +29 -31
  23. package/dist/bin/pushary-login.js +20 -19
  24. package/dist/bin/pushary-logout.js +26 -28
  25. package/dist/bin/pushary-mcp.js +11 -11
  26. package/dist/bin/pushary-mode.js +16 -15
  27. package/dist/bin/pushary-notification-hook.js +24 -26
  28. package/dist/bin/pushary-opencode-hook.js +26 -28
  29. package/dist/bin/pushary-permission-denied-hook.js +29 -31
  30. package/dist/bin/pushary-permission-hook.js +32 -31
  31. package/dist/bin/pushary-post-hook.js +24 -26
  32. package/dist/bin/pushary-prompt-hook.js +24 -26
  33. package/dist/bin/pushary-session-end-hook.js +26 -28
  34. package/dist/bin/pushary-session-start-hook.js +34 -35
  35. package/dist/bin/pushary-setup.js +111 -99
  36. package/dist/bin/pushary-stats.js +5 -5
  37. package/dist/bin/pushary-status.js +37 -36
  38. package/dist/bin/pushary-stop-hook.js +24 -26
  39. package/dist/bin/pushary-stopfailure-hook.js +24 -26
  40. package/dist/bin/pushary-suggestions.js +15 -14
  41. package/dist/bin/pushary-transcript-register.js +16 -18
  42. package/dist/bin/pushary-transcripts.js +18 -17
  43. package/dist/bin/pushary-upgrade.js +45 -39
  44. package/dist/bin/pushary-wait.js +26 -20
  45. package/dist/bin/pushary.js +7 -7
  46. package/dist/{chunk-Y64JGYTB.js → chunk-32OSSYGZ.js} +1 -1
  47. package/dist/{chunk-UHS5MMAI.js → chunk-3THDNNVL.js} +3 -3
  48. package/dist/{chunk-OA6EADFT.js → chunk-564IPPBL.js} +3 -3
  49. package/dist/chunk-5MOJCOCF.js +25 -0
  50. package/dist/{chunk-RRHHWYPX.js → chunk-6H4E5UBA.js} +6 -6
  51. package/dist/{chunk-UM2X7HL6.js → chunk-6LXXKMV6.js} +42 -16
  52. package/dist/chunk-76SWHCAR.js +299 -0
  53. package/dist/{chunk-AN7C3CHH.js → chunk-77L2TNJW.js} +1 -1
  54. package/dist/{chunk-XJIIU36L.js → chunk-7YJSDXLM.js} +1 -1
  55. package/dist/{chunk-XZCJC3QO.js → chunk-B3V2WOJX.js} +285 -50
  56. package/dist/{chunk-RABLE5R6.js → chunk-BBFGDYYI.js} +1 -1
  57. package/dist/{chunk-GTBWWCCM.js → chunk-BFF3ABFV.js} +115 -9
  58. package/dist/{chunk-NOH3EJFH.js → chunk-C4EDAHXI.js} +1 -1
  59. package/dist/{chunk-ITYKN2K3.js → chunk-CHYBOTQN.js} +2 -2
  60. package/dist/{chunk-FFSIYBBU.js → chunk-CJZLIAJF.js} +27 -10
  61. package/dist/{chunk-UMTMFDL2.js → chunk-CPLQ5OHX.js} +1 -1
  62. package/dist/{chunk-DTVHZDYM.js → chunk-D3U6CN7T.js} +26 -12
  63. package/dist/{chunk-ICFHMJTW.js → chunk-D7Z4USSB.js} +27 -8
  64. package/dist/{chunk-DXMUJTYF.js → chunk-DP6LU6BB.js} +2 -2
  65. package/dist/{chunk-GA257T2E.js → chunk-DXCHIKAN.js} +8 -8
  66. package/dist/{chunk-PP7FC3Y7.js → chunk-EQR6JSFE.js} +9 -7
  67. package/dist/{chunk-Z3M627TQ.js → chunk-FONWVVDD.js} +1 -1
  68. package/dist/{chunk-3KXBRSL3.js → chunk-GMHQYX3D.js} +1 -1
  69. package/dist/{chunk-WY6YAMZW.js → chunk-ICQCQAUO.js} +5 -4
  70. package/dist/{chunk-CZ65D6Q5.js → chunk-IPG3RS23.js} +2 -2
  71. package/dist/{chunk-JCWHOB36.js → chunk-IRV2MNMA.js} +53 -3
  72. package/dist/{chunk-HIYLAC3C.js → chunk-IVB5O6NY.js} +3 -3
  73. package/dist/{chunk-DM24VZOI.js → chunk-IXTVUINH.js} +3 -3
  74. package/dist/{chunk-BEQ3MEE3.js → chunk-JBRMIADM.js} +2 -2
  75. package/dist/{chunk-CU2PXLZ6.js → chunk-JHB5SR5B.js} +4 -4
  76. package/dist/{chunk-ED2SWTPC.js → chunk-JOBSKQ2Z.js} +4 -4
  77. package/dist/{chunk-W5L2ZLHE.js → chunk-JOD2325S.js} +3 -3
  78. package/dist/{chunk-CSKABVSH.js → chunk-JSPCGPSH.js} +3 -3
  79. package/dist/{chunk-R4FL5JHK.js → chunk-KE4TSJUD.js} +4 -4
  80. package/dist/{chunk-3LF7T3NW.js → chunk-KIXRHNCW.js} +6 -6
  81. package/dist/{chunk-BKCI53W6.js → chunk-KNUYUQBP.js} +4 -4
  82. package/dist/{chunk-4LUWNBGD.js → chunk-KTLE7NIK.js} +23 -8
  83. package/dist/{chunk-ADXHPGBZ.js → chunk-LJHDUKBB.js} +6 -6
  84. package/dist/{chunk-U2P2LQ5B.js → chunk-LS42NV6E.js} +15 -6
  85. package/dist/{chunk-QNZ6G3LY.js → chunk-LYTWK5TF.js} +5 -5
  86. package/dist/{chunk-2VADJ6JH.js → chunk-METUT7V4.js} +2 -2
  87. package/dist/{chunk-P5HZEGT7.js → chunk-NSS2AIGI.js} +6 -6
  88. package/dist/{chunk-QSW3HAKI.js → chunk-NWN6GGJL.js} +61 -2
  89. package/dist/{chunk-7ILQX47W.js → chunk-P4RXSZDT.js} +3 -3
  90. package/dist/{chunk-FWS2KLV2.js → chunk-PIBWX3EF.js} +2 -2
  91. package/dist/{chunk-F56GTJFG.js → chunk-PO2P3XDC.js} +5 -5
  92. package/dist/{chunk-EEVE7H5Z.js → chunk-R2BZH2NK.js} +4 -4
  93. package/dist/{chunk-I2UBF2SS.js → chunk-RO2B4YBF.js} +1 -1
  94. package/dist/{chunk-MNKIR2ZB.js → chunk-RQOT6QL3.js} +67 -6
  95. package/dist/{chunk-Q2BD4IBX.js → chunk-SB6TYV4M.js} +11 -13
  96. package/dist/{chunk-ATPJGHUP.js → chunk-TI4JYPGQ.js} +7 -3
  97. package/dist/{chunk-LMC5UPL7.js → chunk-UC2J5RR4.js} +1 -1
  98. package/dist/{chunk-IZVEBBDH.js → chunk-UQIPWXBL.js} +3 -3
  99. package/dist/{chunk-VHKK3US3.js → chunk-UXN73YAE.js} +3 -3
  100. package/dist/{chunk-WOHP7EL6.js → chunk-VEYFXRZ6.js} +7 -6
  101. package/dist/{chunk-2Z7I7DHT.js → chunk-VHMZPN3N.js} +1 -1
  102. package/dist/{chunk-HVOQUPSO.js → chunk-VKZ3RJ5U.js} +1 -1
  103. package/dist/chunk-VVIQWGS7.js +2298 -0
  104. package/dist/{chunk-SCMEVDAR.js → chunk-WJLHZ6E6.js} +3 -3
  105. package/dist/{chunk-BAGBCSXA.js → chunk-X2MTVD4W.js} +1 -1
  106. package/dist/{chunk-3UNAPXED.js → chunk-XFDWLDHG.js} +9 -9
  107. package/dist/{chunk-6CZX6YOE.js → chunk-XNUWKKGS.js} +3 -3
  108. package/dist/{chunk-NUEPJ5W6.js → chunk-XZKSUJ55.js} +3 -5
  109. package/dist/{chunk-HDGB6SQ4.js → chunk-Y4MRHAE5.js} +2 -2
  110. package/dist/{chunk-SZBMTOUZ.js → chunk-Y6ZN454E.js} +1 -1
  111. package/dist/{chunk-TK4JU2F7.js → chunk-YSD4SMHE.js} +1 -1
  112. package/dist/{chunk-SROWUG5W.js → chunk-ZK5WYAMI.js} +1 -1
  113. package/dist/{chunk-JFKMPLNF.js → chunk-ZPIYJLQ3.js} +2 -2
  114. package/dist/{codex-app-cards-switch-HK4RMOBI.js → codex-app-cards-switch-25TDTMUZ.js} +11 -11
  115. package/dist/{codex-desktop-launch-OCO6N7SA.js → codex-desktop-launch-JDKUCD2Y.js} +1 -1
  116. package/dist/{codex-session-launch-ETZQTVFS.js → codex-session-launch-6N35AAEO.js} +18 -19
  117. package/dist/{config-YY54G3CC.js → config-OBGYURFX.js} +3 -3
  118. package/dist/{global-upgrade-5DN5G3ZQ.js → global-upgrade-2QNQD5OM.js} +10 -10
  119. package/dist/{identity-EGL6HAWG.js → identity-CUPX2U7Q.js} +4 -4
  120. package/dist/{live-capabilities-WU3FYJJG.js → live-capabilities-CUEIWMSM.js} +5 -5
  121. package/dist/{paths-ZG6KDM6Y.js → paths-BHLBZ6FY.js} +7 -3
  122. package/dist/{reapply-AQLNCCTE.js → reapply-4GXLWZ5M.js} +27 -27
  123. package/dist/src/index.js +30 -20
  124. package/dist/{upgrade-lock-BIRXIKHJ.js → upgrade-lock-RDKTAHWR.js} +4 -4
  125. package/dist/{usage-43C2DHDU.js → usage-KX2HN47E.js} +3 -3
  126. package/package.json +1 -1
  127. package/dist/chunk-ANP3DIST.js +0 -118
  128. package/dist/chunk-ONBL2GCU.js +0 -615
  129. package/dist/chunk-TJUJAK5L.js +0 -62
@@ -242,10 +242,10 @@ var AGENTS = {
242
242
  label: "Hermes",
243
243
  policyAgent: "hermes",
244
244
  enforcement: "enforced",
245
- connectVia: "Native Python plugin + approval transport",
245
+ connectVia: "Native plugin in ~/.hermes/plugins + approval transport",
246
246
  setupCommand: PUSHARY_SETUP_COMMAND,
247
247
  enforcementDetail: "Hermes dangerous-command approvals when the Pushary transport is selected; optional PUSHARY_GATE_TOOLS gates named tools.",
248
- capabilityNote: "Uses the Python plugin, not a macOS bridge HookSource. CLI disconnect and managed-provider controls are not implemented for Hermes."
248
+ capabilityNote: "Uses the Pushary plugin in ~/.hermes/plugins/pushary, not a macOS bridge HookSource. CLI disconnect and managed-provider controls are not implemented for Hermes."
249
249
  },
250
250
  cursor: {
251
251
  ...defaults,
@@ -2602,6 +2602,16 @@ var shellCommandStringOf = (shell, args) => {
2602
2602
  return operand === void 0 || operand.expands ? UNREADABLE2 : { kind: "readable", script: operand.text };
2603
2603
  };
2604
2604
 
2605
+ // ../contracts/src/partner-developer-guide.ts
2606
+ var PARTNER_API_KEYS_URL = "https://pushary.com/dashboard/agent/settings";
2607
+ var PARTNER_INSTALL_COMMAND = "npm i @pushary/server";
2608
+ var PARTNER_DEVELOPER_STEPS = [
2609
+ `Install on our server: ${PARTNER_INSTALL_COMMAND}. Create the client with our Partner API key from ${PARTNER_API_KEYS_URL} and keep the key on the server.`,
2610
+ "For each customer, call pushary.enroll(customerId) and show the universalLink it returns as a button or QR code in our app. They open it in the free Pushary app and allow notifications. Installing the app does not carry the link over, so keep it available until they finish.",
2611
+ "Before a risky action, call pushary.authorize({ externalId: customerId, toolName, question }) and run the action only if approved is true.",
2612
+ "If the answer can come later than the request, create a decision with pushary.decisions.create, save its id, and resume from pushary.decisions.get or the webhook."
2613
+ ];
2614
+
2605
2615
  // ../contracts/src/degraded.ts
2606
2616
  var DEGRADED_PREFIX = "[degraded]";
2607
2617
  var degradedPayload = (subsystem, report) => ({
@@ -2614,6 +2624,16 @@ var degradedPayload = (subsystem, report) => ({
2614
2624
  });
2615
2625
  var degradedLine = (subsystem, report) => `${DEGRADED_PREFIX} ${JSON.stringify(degradedPayload(subsystem, report))}`;
2616
2626
 
2627
+ // ../contracts/src/key-scope.ts
2628
+ var KEY_SCOPES = ["full_access", "agent", "connector", "bound"];
2629
+ var KEY_SCOPE = {
2630
+ full_access: "full_access",
2631
+ agent: "agent",
2632
+ connector: "connector",
2633
+ bound: "bound"
2634
+ };
2635
+ var normalizeKeyScope = (value) => typeof value === "string" && KEY_SCOPES.includes(value) ? value : null;
2636
+
2617
2637
  // ../contracts/src/observability.ts
2618
2638
  var CLIENT_CONTEXT_HEADERS = {
2619
2639
  surface: "x-pushary-surface",
@@ -3072,10 +3092,26 @@ var compressTranscriptRecord = (raw, deflateRaw) => {
3072
3092
  };
3073
3093
 
3074
3094
  // ../contracts/src/index.ts
3075
- var KEY_SCOPES = ["full_access", "agent", "connector", "bound"];
3076
- var normalizeKeyScope = (value) => typeof value === "string" && KEY_SCOPES.includes(value) ? value : null;
3077
3095
  var APPROVAL_MODES = ["push_only", "terminal_only", "push_first", "notify_only"];
3078
3096
  var isApprovalMode = (value) => typeof value === "string" && APPROVAL_MODES.includes(value);
3097
+ var APPROVAL_MODE_META = {
3098
+ push_first: {
3099
+ label: "When away",
3100
+ description: "Ask in the notch. Alert my phone when I\u2019m away."
3101
+ },
3102
+ push_only: {
3103
+ label: "Always",
3104
+ description: "Ask in the notch and on my phone."
3105
+ },
3106
+ notify_only: {
3107
+ label: "Alert only",
3108
+ description: "Notify my phone. I answer in the agent."
3109
+ },
3110
+ terminal_only: {
3111
+ label: "In agent",
3112
+ description: "I answer in the agent. No approval alerts."
3113
+ }
3114
+ };
3079
3115
  var approvalWaitsAtTheAgentsPrompt = (mode) => {
3080
3116
  switch (mode) {
3081
3117
  case "push_first":
@@ -5757,6 +5793,22 @@ var EXIT_PLAN_MODE_TOOL = "ExitPlanMode";
5757
5793
  var ASKED_IN_EVERY_MODE_TOOLS = [AGENT_QUESTION_TOOL, EXIT_PLAN_MODE_TOOL];
5758
5794
  var ASKED_IN_EVERY_MODE = /* @__PURE__ */ new Set([...ASKED_IN_EVERY_MODE_TOOLS, ...CODEX_QUESTION_TOOLS]);
5759
5795
  var isAskedInEveryMode = (toolName) => ASKED_IN_EVERY_MODE.has(toolName);
5796
+ var MODES_WITH_A_TERMINAL_PROMPT = /* @__PURE__ */ new Set(["default", "acceptEdits"]);
5797
+ var TERMINAL_AND_PHONE_REASON = "Pushary may also ask your phone. The first answer counts.";
5798
+ var terminalStaysLiveForTheCall = (facts) => facts.source === "claude" && facts.sessionAttended && facts.permissionHookAdmitted && !facts.handedDownByTheMacBridge && !facts.fromCursor && MODES_WITH_A_TERMINAL_PROMPT.has(facts.permissionMode ?? "") && !isAskedInEveryMode(facts.toolName);
5799
+ var TIMEOUT_DECISIONS = { approve: "allow", deny: "deny" };
5800
+ var pushOnlyTimeoutDecision = (policy) => policy.mode === "push_only" ? TIMEOUT_DECISIONS[policy.timeoutAction] : void 0;
5801
+ var phoneWindowSeconds = (policy) => Math.max(policy.mode === "push_only" ? policy.timeoutSeconds : policy.pushFirstSeconds, 0);
5802
+ var terminalLiveWait = (policy, holdBudgetProof) => {
5803
+ const budget = Math.min(holdBudgetProof ?? HOOK_BUDGETS.claude.budgetSeconds, HOOK_BUDGETS.claude.budgetSeconds);
5804
+ const ceiling = Math.max(budget - HOOK_BUDGETS.claude.guardSeconds, 1);
5805
+ const policySeconds = phoneWindowSeconds(policy);
5806
+ const decision = pushOnlyTimeoutDecision(policy);
5807
+ if (decision !== void 0 && policySeconds <= ceiling) return { waitSeconds: policySeconds, holdSeconds: ceiling, onTimeout: decision };
5808
+ const waitsForThePhone = policy.mode === "push_only" && policy.timeoutAction === "wait";
5809
+ const holdsTheBudget = waitsForThePhone || holdBudgetProof !== void 0 && decision === void 0;
5810
+ return { waitSeconds: holdsTheBudget ? ceiling : Math.min(policySeconds, ceiling), holdSeconds: ceiling, onTimeout: "leave_to_terminal" };
5811
+ };
5760
5812
  var NATIVE_BLOCK_EVENTS = /* @__PURE__ */ new Set(["PermissionDenied"]);
5761
5813
  var isNativeBlockEvent = (event) => typeof event === "string" && NATIVE_BLOCK_EVENTS.has(event);
5762
5814
  var CODEX_RESCUE_TOOL_NAME = "Bash";
@@ -5833,7 +5885,8 @@ var resolveGate = (input) => {
5833
5885
  scopePath: scopeReason && "path" in scopeVerdict ? widenablePath(scopeVerdict.path) : void 0
5834
5886
  };
5835
5887
  };
5836
- var editAsksAtTheAgentsPrompt = (input, verdict) => verdict.kind === "gate" && !verdict.scopeReason && (input.modeState.mode ?? input.config.modeOverride ?? null) === null && !aChosenRuleGoverns(input) && verdict.policy.mode === "push_first" && FILE_EDIT_TOOLS.has(input.toolName);
5888
+ var noModeOverrideIsActive = (input) => (input.modeState.mode ?? input.config.modeOverride ?? null) === null;
5889
+ var editAsksAtTheAgentsPrompt = (input, verdict) => verdict.kind === "gate" && !verdict.scopeReason && noModeOverrideIsActive(input) && !aChosenRuleGoverns(input) && verdict.policy.mode === "push_first" && FILE_EDIT_TOOLS.has(input.toolName);
5837
5890
  var claudePromptsBeforeAnEdit = (permissionMode) => permissionMode === "default";
5838
5891
  var runsTheClaudeHook = (source) => source === null || source === "claude" || hookCompatibleProfileBySource(source) !== void 0;
5839
5892
  var agentPromptsBeforeAnEdit = ({ source, event, permissionMode }) => {
@@ -5950,6 +6003,7 @@ var aChosenRuleGoverns = (input) => {
5950
6003
  });
5951
6004
  };
5952
6005
  var claudeAllowlistOwnsCall = (input, verdict, permissionMode, rules) => rules !== null && verdict.kind === "gate" && !verdict.scopeReason && !aChosenRuleGoverns(input) && !isAskedInEveryMode(input.toolName) && claudeConsultsItsAllowlist(permissionMode) && agentRulesAllowEveryInput(rules, input.toolName, input.toolInputs, input.cwd);
6006
+ var claudePromptTakesTheCall = (facts, input, verdict) => verdict.kind === "gate" && !verdict.scopeReason && terminalStaysLiveForTheCall(facts) && noModeOverrideIsActive(input) && !aChosenRuleGoverns(input) && !editGoesToTheAgentsPrompt({ source: facts.source, event: "PreToolUse", permissionMode: facts.permissionMode }, input, verdict);
5953
6007
  var toPolicyVersion = (value) => typeof value === "string" || typeof value === "number" ? String(value) : null;
5954
6008
  var modeStateFromResponse = (data) => {
5955
6009
  const mode = data.override?.mode;
@@ -6337,6 +6391,8 @@ export {
6337
6391
  toolsCoveredByGateEntry,
6338
6392
  cursorGateOwnsToolCall,
6339
6393
  degradedLine,
6394
+ KEY_SCOPE,
6395
+ normalizeKeyScope,
6340
6396
  hookWritePath,
6341
6397
  MAX_HOOK_ACTIVATION_EVIDENCE_ROWS,
6342
6398
  isHookActivationReport,
@@ -6371,8 +6427,8 @@ export {
6371
6427
  parseCodexNativeApproval,
6372
6428
  codexNativeApprovalResponse,
6373
6429
  compressTranscriptRecord,
6374
- normalizeKeyScope,
6375
6430
  isApprovalMode,
6431
+ APPROVAL_MODE_META,
6376
6432
  approvalModeWithoutLocalPrompt,
6377
6433
  timeoutActionWithoutLocalPrompt,
6378
6434
  isTimeoutAction,
@@ -6426,12 +6482,16 @@ export {
6426
6482
  codexQuestionGoesToPushary,
6427
6483
  agentQuestionStrategy,
6428
6484
  questionHandedToTheTerminal,
6485
+ TERMINAL_AND_PHONE_REASON,
6486
+ terminalStaysLiveForTheCall,
6487
+ terminalLiveWait,
6429
6488
  CODEX_RESCUE_TOOL_NAME,
6430
6489
  isBlockedActionRequest,
6431
6490
  canonicalJsonText,
6432
6491
  BLOCKED_ACTION_GRANT_TTL_SECONDS,
6433
6492
  blockedActionIdentity,
6434
6493
  PRETOOLUSE_GATED_TOOLS,
6494
+ PRETOOLUSE_HANDLED_TOOLS,
6435
6495
  isPermissionRequestOwnedByPreToolUse,
6436
6496
  CLAUDE_PRETOOLUSE_MATCHER,
6437
6497
  resolveGate,
@@ -6453,6 +6513,7 @@ export {
6453
6513
  claudeConsultsItsAllowlist,
6454
6514
  agentRulesAllowEveryInput,
6455
6515
  claudeAllowlistOwnsCall,
6516
+ claudePromptTakesTheCall,
6456
6517
  modeStateFromResponse,
6457
6518
  GATE_WIRE,
6458
6519
  GATE_MAX_TOOL_INPUTS,
@@ -3,43 +3,41 @@ import {
3
3
  loadPin,
4
4
  savePin,
5
5
  verifyRecipients
6
- } from "./chunk-SZBMTOUZ.js";
6
+ } from "./chunk-Y6ZN454E.js";
7
7
  import {
8
8
  ensureDaemonRunning
9
- } from "./chunk-ADXHPGBZ.js";
9
+ } from "./chunk-LJHDUKBB.js";
10
10
  import {
11
11
  hookOwnerOf
12
- } from "./chunk-GTBWWCCM.js";
12
+ } from "./chunk-BFF3ABFV.js";
13
13
  import {
14
14
  buildTranscriptRecords,
15
15
  decodePublicKey,
16
+ fetchTranscriptRecipients,
16
17
  generateSessionKey,
17
18
  recordSealerFor,
19
+ uploadTranscriptRecords,
18
20
  wrapSessionKey
19
- } from "./chunk-QSW3HAKI.js";
20
- import {
21
- fetchTranscriptRecipients,
22
- uploadTranscriptRecords
23
- } from "./chunk-TJUJAK5L.js";
21
+ } from "./chunk-NWN6GGJL.js";
24
22
  import {
25
23
  transcriptEnvironmentPreference,
26
24
  transcriptsEnabled
27
- } from "./chunk-TK4JU2F7.js";
25
+ } from "./chunk-YSD4SMHE.js";
28
26
  import {
29
27
  readTranscriptPreference
30
- } from "./chunk-ED2SWTPC.js";
28
+ } from "./chunk-JOBSKQ2Z.js";
31
29
  import {
32
30
  claudeConfigDir,
33
31
  codexHome,
34
32
  pusharyDir
35
- } from "./chunk-ATPJGHUP.js";
33
+ } from "./chunk-TI4JYPGQ.js";
36
34
  import {
37
35
  writeJsonAtomic
38
- } from "./chunk-SCMEVDAR.js";
36
+ } from "./chunk-WJLHZ6E6.js";
39
37
  import {
40
38
  getApiKey,
41
39
  getBaseUrl
42
- } from "./chunk-Y64JGYTB.js";
40
+ } from "./chunk-32OSSYGZ.js";
43
41
 
44
42
  // src/transcript-registration.ts
45
43
  import { createHash } from "crypto";
@@ -4,7 +4,7 @@ import {
4
4
  quoteIfNeeded,
5
5
  shellDoubleQuoted,
6
6
  writeFileAtomic
7
- } from "./chunk-SCMEVDAR.js";
7
+ } from "./chunk-WJLHZ6E6.js";
8
8
  import {
9
9
  CLAUDE_PRETOOLUSE_MATCHER,
10
10
  CODEX_QUESTION_TOOLS,
@@ -12,7 +12,7 @@ import {
12
12
  HOOK_LOCATOR_BINARY,
13
13
  PRETOOLUSE_GATED_TOOLS,
14
14
  withHookHoldBudget
15
- } from "./chunk-MNKIR2ZB.js";
15
+ } from "./chunk-RQOT6QL3.js";
16
16
 
17
17
  // src/setup/paths.ts
18
18
  import { createHash as createHash2 } from "crypto";
@@ -550,7 +550,7 @@ var CLAUDE_HOOK_EVENTS = [
550
550
  { event: "SessionStart", binary: "pushary-session-start-hook", matcher: "startup|resume|clear", timeout: 10, delivery: "telemetry", since: ESTABLISHED },
551
551
  { event: "SessionEnd", binary: "pushary-session-end-hook", timeout: 10, delivery: "telemetry", since: ESTABLISHED },
552
552
  { event: "StopFailure", binary: "pushary-stopfailure-hook", timeout: 10, delivery: "telemetry", since: ESTABLISHED },
553
- { event: "PermissionRequest", binary: "pushary-permission-hook", timeout: HOOK_BUDGETS.claude.budgetSeconds, delivery: "approval", since: ESTABLISHED },
553
+ { event: "PermissionRequest", binary: "pushary-permission-hook", timeout: HOOK_BUDGETS.claude.budgetSeconds, delivery: "approval", holds: true, since: ESTABLISHED },
554
554
  { event: "PermissionDenied", binary: "pushary-permission-denied-hook", timeout: HOOK_BUDGETS.claude.budgetSeconds, delivery: "approval", holds: true, since: ESTABLISHED },
555
555
  // Observability only. Each carries session shape the island cannot get any other
556
556
  // way, and none of them decides anything.
@@ -1049,6 +1049,8 @@ var clientReportClaims = () => join5(pusharyDir(), "client-reports");
1049
1049
  var claudeRegistrationReceipt = () => join5(claudeSetupDir(), "claude-registration.json");
1050
1050
  var hermesConfig = () => join5(homedir3(), ".hermes", "config.yaml");
1051
1051
  var hermesConfigReceipt = () => join5(pusharyDir(), "setup", "hermes-config.json");
1052
+ var hermesSetupReceipt = () => join5(pusharyDir(), "setup", "hermes-plugin.json");
1053
+ var hermesAppWiringRecord = () => join5(pusharyDir(), "setup", "hermes-wired-by-mac-app");
1052
1054
  var fxQuestionRuleReceipt = () => join5(pusharyDir(), "setup", "fx-question-rule.json");
1053
1055
  var hookTakeoverReceipt = (agent) => join5(agent === "claude_code" ? claudeSetupDir() : join5(pusharyDir(), "setup"), `hook-takeover-${agent}.json`);
1054
1056
  var codexSkillDir2 = () => join5(codexHome(), "skills", "pushary");
@@ -1185,6 +1187,8 @@ export {
1185
1187
  claudeRegistrationReceipt,
1186
1188
  hermesConfig,
1187
1189
  hermesConfigReceipt,
1190
+ hermesSetupReceipt,
1191
+ hermesAppWiringRecord,
1188
1192
  fxQuestionRuleReceipt,
1189
1193
  hookTakeoverReceipt,
1190
1194
  codexSkillDir2,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  HOOK_HOLD_BUDGET_ENV,
3
3
  hookHoldBudgetProof
4
- } from "./chunk-MNKIR2ZB.js";
4
+ } from "./chunk-RQOT6QL3.js";
5
5
 
6
6
  // src/hold-budget.ts
7
7
  var takeHookHoldBudget = (args = process.argv.slice(2), env = process.env) => {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  pusharyDir
3
- } from "./chunk-ATPJGHUP.js";
3
+ } from "./chunk-TI4JYPGQ.js";
4
4
  import {
5
5
  readJsonSafe,
6
6
  writeFileAtomic
7
- } from "./chunk-SCMEVDAR.js";
7
+ } from "./chunk-WJLHZ6E6.js";
8
8
  import {
9
9
  DECLINED_AGENTS_FILE,
10
10
  DISCONNECT_AGENT_IDS,
@@ -13,7 +13,7 @@ import {
13
13
  serializeDeclinedAgents,
14
14
  withDeclinedAgent,
15
15
  withoutDeclinedAgent
16
- } from "./chunk-MNKIR2ZB.js";
16
+ } from "./chunk-RQOT6QL3.js";
17
17
 
18
18
  // src/declined-agents-file.ts
19
19
  import { join } from "path";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SETUP_FLAGS
3
- } from "./chunk-SROWUG5W.js";
3
+ } from "./chunk-ZK5WYAMI.js";
4
4
  import {
5
5
  parseFlags
6
6
  } from "./chunk-NMUI3ZWG.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-PPY5N2E6.js";
10
10
  import {
11
11
  NPX_LATEST_COMMAND
12
- } from "./chunk-BAGBCSXA.js";
12
+ } from "./chunk-X2MTVD4W.js";
13
13
  import {
14
14
  CLAUDE_CONNECTOR_GUIDE,
15
15
  CLAUDE_CONNECTOR_STEPS,
@@ -17,7 +17,7 @@ import {
17
17
  CLAUDE_CONNECTOR_URL,
18
18
  COWORK_CONNECTOR_LIMIT,
19
19
  COWORK_STANDING_INSTRUCTIONS
20
- } from "./chunk-MNKIR2ZB.js";
20
+ } from "./chunk-RQOT6QL3.js";
21
21
 
22
22
  // src/cli/cowork.ts
23
23
  import { readFileSync } from "fs";
@@ -3,10 +3,10 @@ import {
3
3
  forkFinishWithUpgradeLock,
4
4
  installWithUpgradeLock,
5
5
  releaseAutoUpdateLock
6
- } from "./chunk-DXMUJTYF.js";
6
+ } from "./chunk-DP6LU6BB.js";
7
7
  import {
8
8
  phoneStartIsRequired
9
- } from "./chunk-R4FL5JHK.js";
9
+ } from "./chunk-KE4TSJUD.js";
10
10
  import {
11
11
  describeAutoUpdateCheck,
12
12
  globalInstallLocation,
@@ -18,7 +18,7 @@ import {
18
18
  readAutoUpdateState,
19
19
  updateAutoUpdateState,
20
20
  upgradeEntryFor
21
- } from "./chunk-DM24VZOI.js";
21
+ } from "./chunk-IXTVUINH.js";
22
22
  import {
23
23
  EXIT
24
24
  } from "./chunk-KZERVKTD.js";
@@ -26,17 +26,17 @@ import {
26
26
  autoUpdateLock,
27
27
  autoUpdateLog,
28
28
  autoUpdateState
29
- } from "./chunk-ATPJGHUP.js";
29
+ } from "./chunk-TI4JYPGQ.js";
30
30
  import {
31
31
  execNpm,
32
32
  fetchLatestPublishedVersion,
33
33
  npmErrorMessage,
34
34
  readGlobalCliInstallAt,
35
35
  readGlobalPrefix
36
- } from "./chunk-SCMEVDAR.js";
36
+ } from "./chunk-WJLHZ6E6.js";
37
37
  import {
38
38
  NPX_LATEST_COMMAND
39
- } from "./chunk-BAGBCSXA.js";
39
+ } from "./chunk-X2MTVD4W.js";
40
40
  import {
41
41
  commandsPackage,
42
42
  globalUpgradeEntry,
@@ -60,6 +60,7 @@ var refreshedPartsOf = (agent) => [
60
60
  ...agent.result.hooks ? ["hooks"] : [],
61
61
  ...agent.result.mcp ? ["MCP key"] : [],
62
62
  ...agent.result.approvalRules ? ["approval rules"] : [],
63
+ ...agent.result.pluginFiles ? ["plugin"] : [],
63
64
  ...agent.instructions?.outcome === "refreshed" ? ["instructions"] : []
64
65
  ];
65
66
  var wasRefreshed = (agent) => refreshedPartsOf(agent).length > 0;
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-KZERVKTD.js";
8
8
  import {
9
9
  redactSecretsFromContent
10
- } from "./chunk-MNKIR2ZB.js";
10
+ } from "./chunk-RQOT6QL3.js";
11
11
 
12
12
  // src/cli/json.ts
13
13
  var writeStdoutFully = (text) => new Promise((resolve, reject) => {
@@ -2,7 +2,7 @@ import {
2
2
  isApprovalMode,
3
3
  isRecord,
4
4
  isTimeoutAction
5
- } from "./chunk-MNKIR2ZB.js";
5
+ } from "./chunk-RQOT6QL3.js";
6
6
 
7
7
  // src/cli/settings-response.ts
8
8
  var isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);