@pushary/agent-hooks 1.9.58 → 1.9.60

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 (126) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/data/cursor-plugin/.cursor-plugin/plugin.json +5 -1
  3. package/data/cursor-plugin/CHANGELOG.md +4 -0
  4. package/dist/{api-WVXBM4MR.js → api-ASQA5PZM.js} +11 -11
  5. package/dist/bin/pushary-bell-hook.js +29 -29
  6. package/dist/bin/pushary-bell.js +12 -12
  7. package/dist/bin/pushary-claude.js +31 -30
  8. package/dist/bin/pushary-clean.js +58 -53
  9. package/dist/bin/pushary-codex-bridge.js +22 -22
  10. package/dist/bin/pushary-codex-hook.js +34 -34
  11. package/dist/bin/pushary-codex-session.js +8 -8
  12. package/dist/bin/pushary-codex.js +15 -15
  13. package/dist/bin/pushary-connect.js +29 -29
  14. package/dist/bin/pushary-cowork.js +7 -7
  15. package/dist/bin/pushary-daemon.js +39 -39
  16. package/dist/bin/pushary-disconnect.js +42 -29
  17. package/dist/bin/pushary-doctor.js +51 -47
  18. package/dist/bin/pushary-elicitation-hook.js +29 -29
  19. package/dist/bin/pushary-gemini-bridge.js +15 -15
  20. package/dist/bin/pushary-gemini-hook.js +31 -31
  21. package/dist/bin/pushary-hook.js +33 -33
  22. package/dist/bin/pushary-login.js +22 -19
  23. package/dist/bin/pushary-logout.js +36 -31
  24. package/dist/bin/pushary-mcp.js +12 -12
  25. package/dist/bin/pushary-mode.js +41 -55
  26. package/dist/bin/pushary-notification-hook.js +28 -28
  27. package/dist/bin/pushary-opencode-hook.js +30 -30
  28. package/dist/bin/pushary-permission-denied-hook.js +33 -33
  29. package/dist/bin/pushary-permission-hook.js +32 -32
  30. package/dist/bin/pushary-post-hook.js +28 -28
  31. package/dist/bin/pushary-prompt-hook.js +28 -28
  32. package/dist/bin/pushary-session-end-hook.js +28 -28
  33. package/dist/bin/pushary-session-start-hook.js +35 -35
  34. package/dist/bin/pushary-setup.js +49 -46
  35. package/dist/bin/pushary-stats.js +5 -5
  36. package/dist/bin/pushary-status.js +41 -36
  37. package/dist/bin/pushary-stop-hook.js +28 -28
  38. package/dist/bin/pushary-stopfailure-hook.js +28 -28
  39. package/dist/bin/pushary-suggestions.js +33 -39
  40. package/dist/bin/pushary-transcript-register.js +20 -20
  41. package/dist/bin/pushary-transcripts.js +33 -20
  42. package/dist/bin/pushary-upgrade.js +71 -50
  43. package/dist/bin/pushary-wait.js +36 -42
  44. package/dist/bin/pushary.js +8 -8
  45. package/dist/{chunk-JSQOHMNJ.js → chunk-2AELPDMT.js} +1 -1
  46. package/dist/{chunk-WVP6UQG3.js → chunk-2QREHU4O.js} +11 -4
  47. package/dist/{chunk-QTCFEKLJ.js → chunk-33OOEVPG.js} +1 -1
  48. package/dist/{chunk-QDFLBTUP.js → chunk-4MUFZU2G.js} +1 -1
  49. package/dist/{chunk-5DZHKNBU.js → chunk-4MWRR5IT.js} +8 -7
  50. package/dist/{chunk-XEJV3QSS.js → chunk-4PZXI7WU.js} +3 -3
  51. package/dist/{chunk-UMVVQXAC.js → chunk-56JCQQLS.js} +2 -2
  52. package/dist/{chunk-JZKEC4XJ.js → chunk-5RU35K57.js} +3 -12
  53. package/dist/{chunk-HRHAZ3GE.js → chunk-625DZLT5.js} +6 -6
  54. package/dist/{chunk-3KOPY2UQ.js → chunk-6LOQE4J4.js} +3 -3
  55. package/dist/{chunk-K5CAURU5.js → chunk-6MC2XXFD.js} +4 -4
  56. package/dist/{chunk-MYBCXDIL.js → chunk-6MJWYYAS.js} +62 -49
  57. package/dist/chunk-7BHI3PZN.js +41 -0
  58. package/dist/{chunk-C3IWX6KU.js → chunk-7JXJJNQ5.js} +1 -1
  59. package/dist/{chunk-CK5BCFQF.js → chunk-7WFRY6OL.js} +2 -2
  60. package/dist/{chunk-4YNNAF53.js → chunk-ADR3KHOC.js} +2 -2
  61. package/dist/{chunk-XTZHUIGJ.js → chunk-ATKN4BJT.js} +1 -1
  62. package/dist/{chunk-GZL3KEPC.js → chunk-AXJLJJ3M.js} +147 -136
  63. package/dist/{chunk-LVDC3RUE.js → chunk-BG4Y64FW.js} +1 -1
  64. package/dist/{chunk-KSVCCSAO.js → chunk-CDQHQAS7.js} +9 -7
  65. package/dist/{chunk-TN74MUMB.js → chunk-CEQ2AZH4.js} +13 -13
  66. package/dist/{chunk-X6F4BQEE.js → chunk-CSOROFJY.js} +5 -5
  67. package/dist/{chunk-CZULJ647.js → chunk-DJ7EZIQA.js} +3 -3
  68. package/dist/{chunk-IUOUNRLH.js → chunk-ELLJPP6O.js} +2 -2
  69. package/dist/{chunk-5SFM6XB4.js → chunk-ERK24P76.js} +12 -2
  70. package/dist/{chunk-DQ565WFA.js → chunk-EZHY65QA.js} +21 -11
  71. package/dist/{chunk-4LUPZ347.js → chunk-FDWMG6NY.js} +2 -2
  72. package/dist/{chunk-S5LX25XE.js → chunk-FUZ5VYWD.js} +1 -1
  73. package/dist/{chunk-N3NSWWNU.js → chunk-GAMVAORR.js} +1 -1
  74. package/dist/{chunk-QP3XPS5U.js → chunk-HC3FHDKB.js} +6 -6
  75. package/dist/{chunk-ATUZX4K7.js → chunk-IF26ZGZ7.js} +3 -3
  76. package/dist/{chunk-CSQJCXPX.js → chunk-J4KQL7YZ.js} +5 -5
  77. package/dist/{chunk-M7NX25ZA.js → chunk-K4MBKXAE.js} +1 -1
  78. package/dist/{chunk-PZOFPAPG.js → chunk-L3AFVFGQ.js} +2 -2
  79. package/dist/{chunk-S54YLXWW.js → chunk-METMK3L4.js} +4 -4
  80. package/dist/{chunk-ZEHUWE3X.js → chunk-MUNL23WE.js} +6 -6
  81. package/dist/{chunk-3TJLPABQ.js → chunk-NKLNU577.js} +5 -5
  82. package/dist/{chunk-GMXKITVA.js → chunk-NMUI3ZWG.js} +1 -1
  83. package/dist/{chunk-IJ6XKKQW.js → chunk-O6IUZGWV.js} +1 -1
  84. package/dist/chunk-PPY5N2E6.js +58 -0
  85. package/dist/{chunk-XWY4UW62.js → chunk-PUHP4IBA.js} +4 -4
  86. package/dist/{chunk-T2AC5VFQ.js → chunk-QGSHV3WO.js} +5 -5
  87. package/dist/{chunk-RGQEULXD.js → chunk-QLMOU57V.js} +28 -17
  88. package/dist/{chunk-FAGDOPQI.js → chunk-QUBIEZXC.js} +3 -3
  89. package/dist/{chunk-XFUKCBPU.js → chunk-RLVJ6TVL.js} +23 -23
  90. package/dist/{chunk-VPZ5K72D.js → chunk-RPPXQNIA.js} +1 -1
  91. package/dist/{chunk-MCHOBQHE.js → chunk-S54C6TQC.js} +7 -6
  92. package/dist/{chunk-ZL3UR6M5.js → chunk-SEILUNWB.js} +3 -3
  93. package/dist/{chunk-4JJ3T7IE.js → chunk-SOCJ2N3E.js} +6 -6
  94. package/dist/{chunk-JYXIARGW.js → chunk-SVQWHV65.js} +1 -1
  95. package/dist/{chunk-T2BEIPK2.js → chunk-U7NR4JVD.js} +4 -4
  96. package/dist/{chunk-LVWXRXT7.js → chunk-USE5IEEW.js} +1 -1
  97. package/dist/{chunk-OHD35NPC.js → chunk-V57XLKZL.js} +2 -2
  98. package/dist/{chunk-KIH5BDH5.js → chunk-VIJIG5YL.js} +2 -2
  99. package/dist/{chunk-RF74KBF5.js → chunk-W2IVTHIG.js} +9 -9
  100. package/dist/{chunk-WXZN5CS3.js → chunk-WFSGCFXQ.js} +2 -2
  101. package/dist/{chunk-IRZ5FVWG.js → chunk-WN3RACVD.js} +3 -3
  102. package/dist/{chunk-3WNOO7BM.js → chunk-WXPVVXBU.js} +4 -4
  103. package/dist/{chunk-HUWLEVL2.js → chunk-WXZHQ3TT.js} +5 -5
  104. package/dist/chunk-X3YKQJCZ.js +36 -0
  105. package/dist/{chunk-I43PY5G3.js → chunk-XEJOPVCG.js} +1 -1
  106. package/dist/{chunk-ECJJKDP7.js → chunk-XV6S5PWW.js} +3 -3
  107. package/dist/{chunk-ZJNU32VE.js → chunk-Y5V4PA2Z.js} +155 -37
  108. package/dist/{chunk-7RZO6VWD.js → chunk-Y5VKZNFN.js} +2 -2
  109. package/dist/{chunk-VLJ5C6IT.js → chunk-YGE6ML3O.js} +4 -4
  110. package/dist/{chunk-XXNT4FGA.js → chunk-YPD3MTFU.js} +1 -1
  111. package/dist/{chunk-KW6EYFZV.js → chunk-ZGOJLNKS.js} +4 -4
  112. package/dist/{codex-app-cards-switch-TVKXJWXE.js → codex-app-cards-switch-ZO76D2NY.js} +11 -11
  113. package/dist/{codex-desktop-launch-ROTJEEGF.js → codex-desktop-launch-MJT5E3O3.js} +1 -1
  114. package/dist/{codex-session-launch-VL6ZQA3N.js → codex-session-launch-PTFCVIC7.js} +19 -19
  115. package/dist/{config-SYLUYZQE.js → config-SXV6XNVU.js} +3 -3
  116. package/dist/{global-upgrade-IPWV5PTM.js → global-upgrade-ETDP32LO.js} +9 -9
  117. package/dist/{identity-ARPAUNGN.js → identity-OOLIOSMR.js} +4 -4
  118. package/dist/{live-capabilities-EWTRY2HA.js → live-capabilities-2XIFA7YO.js} +4 -4
  119. package/dist/{paths-IZTNMJAQ.js → paths-IIOQZESZ.js} +3 -3
  120. package/dist/{reapply-ILKOYYKA.js → reapply-KFAJSKOQ.js} +28 -28
  121. package/dist/src/index.js +22 -22
  122. package/dist/{upgrade-lock-ML73QXIG.js → upgrade-lock-T6ILR644.js} +4 -4
  123. package/dist/{usage-OUV76AIY.js → usage-6TN7FVWS.js} +3 -3
  124. package/package.json +1 -1
  125. package/dist/chunk-7QLSKOSU.js +0 -19
  126. package/dist/chunk-EO23EUOK.js +0 -14
@@ -26,30 +26,46 @@ import { join, resolve } from "path";
26
26
  import { spawn } from "child_process";
27
27
  import { Transform } from "stream";
28
28
 
29
- // src/codex-app-card.ts
29
+ // src/codex-permission-form.ts
30
30
  var CODEX_APP_CARD_METHOD = "mcpServer/elicitation/request";
31
+ var TOOL_CALL_APPROVAL = "mcp_tool_call";
32
+ var MAX_IDENTIFIER_LENGTH = 200;
33
+ var CODEX_COMPUTER_USE_SERVER = "cua_repl";
34
+ var CODEX_BROWSER_SERVER = "node_repl";
35
+ var CODEX_SHOWS_THE_SAME_QUESTION = "Codex is showing the same question on your Mac.";
36
+ var ONE_PRINTABLE_LINE = /^[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+$/u;
37
+ var CODEX_FORM_DECLINED = { action: "decline", content: null, _meta: null };
38
+ var isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
39
+ var isRequestId = (value) => typeof value === "string" && value.length > 0 && value.length <= MAX_IDENTIFIER_LENGTH || typeof value === "number" && Number.isSafeInteger(value);
40
+ var isIdentifier = (value) => typeof value === "string" && value.length > 0 && value.length <= MAX_IDENTIFIER_LENGTH;
41
+ var asksForNothingToFillIn = (schema) => isRecord(schema) && isRecord(schema.properties) && Object.keys(schema.properties).length === 0;
42
+ var codexPermissionFormOf = (message) => {
43
+ if (!isRecord(message) || message.method !== CODEX_APP_CARD_METHOD || !isRequestId(message.id)) return null;
44
+ const params = message.params;
45
+ if (!isRecord(params) || !isIdentifier(params.threadId)) return null;
46
+ if (typeof params.serverName !== "string" || typeof params.mode !== "string" || typeof params.message !== "string") return null;
47
+ if (!asksForNothingToFillIn(params.requestedSchema)) return null;
48
+ const meta = params._meta;
49
+ if (!isRecord(meta) || meta.codex_approval_kind !== TOOL_CALL_APPROVAL) return null;
50
+ return { requestId: message.id, threadId: params.threadId, serverName: params.serverName, mode: params.mode, sentence: params.message, meta };
51
+ };
52
+ var codexFormCameFrom = (message, servers) => isRecord(message) && message.method === CODEX_APP_CARD_METHOD && isRecord(message.params) && typeof message.params.serverName === "string" && servers.includes(message.params.serverName);
53
+
54
+ // src/codex-app-card.ts
31
55
  var CODEX_REQUEST_RESOLVED_METHOD = "serverRequest/resolved";
32
- var COMPUTER_USE_SERVER = "cua_repl";
33
56
  var COMPUTER_USE_CONNECTOR = "computer-use";
34
- var TOOL_CALL_APPROVAL = "mcp_tool_call";
35
57
  var CONVERSATION_GRANT = "session";
36
58
  var FORM_MODES = ["form", "openai/form", "openaiForm"];
37
59
  var APP_PARAMETER = "app";
38
- var MAX_IDENTIFIER_LENGTH = 200;
39
60
  var MAX_APP_NAME_LENGTH = 100;
40
61
  var MAX_CARDS_ANSWERED_ON_THE_PHONE = 64;
41
62
  var APP_LINES_A_LATE_REPLY_CAN_FOLLOW = 256;
42
- var ONE_PRINTABLE_LINE = /^[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+$/u;
43
63
  var APP_IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
44
64
  var RISK_LEVELS = ["low", "medium", "high"];
45
65
  var PHONE_ANSWER_YES = "yes";
46
66
  var PHONE_ANSWER_NO = "no";
47
67
  var ALLOW_THIS_CONVERSATION = { action: "accept", content: {}, _meta: { persist: CONVERSATION_GRANT } };
48
- var DENY = { action: "decline", content: null, _meta: null };
49
- var isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
50
- var isRequestId = (value) => typeof value === "string" && value.length > 0 && value.length <= MAX_IDENTIFIER_LENGTH || typeof value === "number" && Number.isSafeInteger(value);
51
- var isIdentifier = (value) => typeof value === "string" && value.length > 0 && value.length <= MAX_IDENTIFIER_LENGTH;
52
- var asksForNothingToFillIn = (schema) => isRecord(schema) && isRecord(schema.properties) && Object.keys(schema.properties).length === 0;
68
+ var DENY = CODEX_FORM_DECLINED;
53
69
  var offersAConversationGrant = (persist) => Array.isArray(persist) && persist.includes(CONVERSATION_GRANT);
54
70
  var isTheAppParameter = (entry) => isRecord(entry) && entry.name === APP_PARAMETER;
55
71
  var appNameShownBy = (meta) => {
@@ -64,25 +80,20 @@ var appIdentifierIn = (meta) => {
64
80
  var riskIn = (meta) => RISK_LEVELS.find((level) => level === meta.riskLevel) ?? null;
65
81
  var wordingCodexShowsFor = (appName) => `Allow Computer Use to use "${appName}"?`;
66
82
  var codexAppCardOf = (message) => {
67
- if (!isRecord(message) || message.method !== CODEX_APP_CARD_METHOD || !isRequestId(message.id)) return null;
68
- const params = message.params;
69
- if (!isRecord(params) || !isIdentifier(params.threadId) || params.serverName !== COMPUTER_USE_SERVER) return null;
70
- if (typeof params.mode !== "string" || !FORM_MODES.includes(params.mode)) return null;
71
- if (!asksForNothingToFillIn(params.requestedSchema)) return null;
72
- const meta = params._meta;
73
- if (!isRecord(meta) || meta.connector_id !== COMPUTER_USE_CONNECTOR || meta.codex_approval_kind !== TOOL_CALL_APPROVAL) return null;
74
- if (!offersAConversationGrant(meta.persist)) return null;
75
- const appName = appNameShownBy(meta);
76
- if (appName === null || params.message !== wordingCodexShowsFor(appName)) return null;
83
+ const form = codexPermissionFormOf(message);
84
+ if (!form || form.serverName !== CODEX_COMPUTER_USE_SERVER || !FORM_MODES.includes(form.mode)) return null;
85
+ if (form.meta.connector_id !== COMPUTER_USE_CONNECTOR || !offersAConversationGrant(form.meta.persist)) return null;
86
+ const appName = appNameShownBy(form.meta);
87
+ if (appName === null || form.sentence !== wordingCodexShowsFor(appName)) return null;
77
88
  return {
78
- requestId: message.id,
79
- threadId: params.threadId,
89
+ requestId: form.requestId,
90
+ threadId: form.threadId,
80
91
  appName,
81
- appIdentifier: appIdentifierIn(meta),
82
- risk: riskIn(meta)
92
+ appIdentifier: appIdentifierIn(form.meta),
93
+ risk: riskIn(form.meta)
83
94
  };
84
95
  };
85
- var comesFromComputerUse = (message) => isRecord(message) && message.method === CODEX_APP_CARD_METHOD && isRecord(message.params) && message.params.serverName === COMPUTER_USE_SERVER;
96
+ var comesFromComputerUse = (message) => codexFormCameFrom(message, [CODEX_COMPUTER_USE_SERVER]);
86
97
  var codexRequestResolvedBy = (message) => {
87
98
  if (!isRecord(message) || message.method !== CODEX_REQUEST_RESOLVED_METHOD || !isRecord(message.params)) return null;
88
99
  return isRequestId(message.params.requestId) ? message.params.requestId : null;
@@ -92,7 +103,7 @@ var codexAppCardQuestion = (card) => `Allow Codex to use ${card.appName} for thi
92
103
  var codexAppCardContext = (card) => [
93
104
  card.appIdentifier ? `App: ${card.appName} (${card.appIdentifier})` : `App: ${card.appName}`,
94
105
  ...card.risk ? [`Risk Codex reports: ${card.risk}`] : [],
95
- "Codex is showing the same question on your Mac. Yes allows this app for this conversation only."
106
+ `${CODEX_SHOWS_THE_SAME_QUESTION} Yes allows this app for this conversation only.`
96
107
  ].join("\n");
97
108
  var codexAppCardDecisionOf = (phoneAnswer) => {
98
109
  if (phoneAnswer === PHONE_ANSWER_YES) return "allow";
@@ -165,6 +176,110 @@ var CodexAppCardLedger = class {
165
176
  }
166
177
  };
167
178
 
179
+ // src/codex-browser-use-card.ts
180
+ var BROWSER_USE_SERVERS = [CODEX_COMPUTER_USE_SERVER, CODEX_BROWSER_SERVER];
181
+ var BROWSER_USE_CONNECTOR = "browser-use";
182
+ var PLAIN_FORM = "form";
183
+ var SITE_ACCESS_TOOL = "access_browser_origin";
184
+ var TRANSFER_TOOLS = { download: "download_browser_files", upload: "upload_browser_files" };
185
+ var TRANSFER_WORDING = {
186
+ download: { before: "Allow download from ", after: "?" },
187
+ upload: { before: "Allow upload to ", after: "?" }
188
+ };
189
+ var WEB_PROTOCOLS = ["http:", "https:"];
190
+ var BROWSER_NAMES = ["Browser use", "Cloud browser"];
191
+ var MAX_ORIGIN_LENGTH = 100;
192
+ var MAX_PAGE_LENGTH = 2e3;
193
+ var MAX_ADDRESS_SHOWN = 240;
194
+ var CUT_SHORT = "\u2026";
195
+ var WHAT_AN_ANSWER_DOES = {
196
+ site_access: `${CODEX_SHOWS_THE_SAME_QUESTION} Yes allows this site for the rest of this conversation, or only this turn if Codex is set to ask each turn. No blocks it for this conversation.`,
197
+ file_transfer: `${CODEX_SHOWS_THE_SAME_QUESTION} It shows the whole address. Yes allows it once and saves nothing.`
198
+ };
199
+ var ACCEPTED_WITH_NO_SAVED_CHOICE = { action: "accept", content: {}, _meta: null };
200
+ var webAddressOf = (text, longest) => {
201
+ if (text.length === 0 || text.length > longest || !ONE_PRINTABLE_LINE.test(text) || !URL.canParse(text)) return null;
202
+ const address = new URL(text);
203
+ return WEB_PROTOCOLS.includes(address.protocol) ? address : null;
204
+ };
205
+ var isOneWebOrigin = (value) => typeof value === "string" && webAddressOf(value, MAX_ORIGIN_LENGTH)?.origin === value;
206
+ var originAskedAbout = (meta) => {
207
+ const origin = meta.origin;
208
+ if (!isOneWebOrigin(origin)) return null;
209
+ return isRecord(meta.tool_params) && meta.tool_params.origin === origin ? origin : null;
210
+ };
211
+ var cleanAddressOn = (origin, page) => {
212
+ const address = webAddressOf(page, MAX_PAGE_LENGTH);
213
+ if (address === null || address.origin !== origin || address.username !== "" || address.password !== "") return null;
214
+ return address.href === page || address.origin === page ? address : null;
215
+ };
216
+ var addressToShow = (address) => {
217
+ const upToThePath = `${address.origin}${address.pathname}`;
218
+ const isWhole = address.href === upToThePath && upToThePath.length <= MAX_ADDRESS_SHOWN;
219
+ return isWhole ? upToThePath : `${upToThePath.slice(0, MAX_ADDRESS_SHOWN - CUT_SHORT.length)}${CUT_SHORT}`;
220
+ };
221
+ var isAKnownBrowserName = (value) => typeof value === "string" && BROWSER_NAMES.includes(value);
222
+ var siteAccessSentence = (browserName, origin) => `Allow ${browserName} to access ${origin}?`;
223
+ var siteAccessCardOf = (form, browserName, origin) => {
224
+ if (form.meta.tool_name !== SITE_ACCESS_TOOL || form.sentence !== siteAccessSentence(browserName, origin)) return null;
225
+ return { kind: "site_access", requestId: form.requestId, threadId: form.threadId, origin };
226
+ };
227
+ var isAFileTransfer = (value) => typeof value === "string" && Object.hasOwn(TRANSFER_TOOLS, value);
228
+ var pageNamedIn = (sentence, transfer) => {
229
+ const { before, after } = TRANSFER_WORDING[transfer];
230
+ if (!sentence.startsWith(before) || !sentence.endsWith(after)) return null;
231
+ return sentence.slice(before.length, sentence.length - after.length);
232
+ };
233
+ var fileTransferCardOf = (form, origin) => {
234
+ const transfer = form.meta.file_transfer;
235
+ if (!isAFileTransfer(transfer) || form.meta.tool_name !== TRANSFER_TOOLS[transfer]) return null;
236
+ const page = pageNamedIn(form.sentence, transfer);
237
+ const address = page === null ? null : cleanAddressOn(origin, page);
238
+ if (address === null) return null;
239
+ return { kind: "file_transfer", requestId: form.requestId, threadId: form.threadId, transfer, origin, addressShown: addressToShow(address) };
240
+ };
241
+ var codexBrowserUseCardOf = (message) => {
242
+ const form = codexPermissionFormOf(message);
243
+ if (!form || !BROWSER_USE_SERVERS.includes(form.serverName) || form.mode !== PLAIN_FORM) return null;
244
+ if (form.meta.connector_id !== BROWSER_USE_CONNECTOR) return null;
245
+ const browserName = form.meta.connector_name;
246
+ const origin = originAskedAbout(form.meta);
247
+ if (!isAKnownBrowserName(browserName) || origin === null) return null;
248
+ return siteAccessCardOf(form, browserName, origin) ?? fileTransferCardOf(form, origin);
249
+ };
250
+ var comesFromBrowserUse = (message) => codexFormCameFrom(message, BROWSER_USE_SERVERS);
251
+ var siteNameOf = (origin) => new URL(origin).host;
252
+ var TRANSFER_QUESTIONS = {
253
+ download: (site) => `Allow Codex to download from ${site}?`,
254
+ upload: (site) => `Allow Codex to upload files to ${site}?`
255
+ };
256
+ var codexBrowserUseCardQuestion = (card) => {
257
+ const site = siteNameOf(card.origin);
258
+ if (card.kind === "site_access") return `Allow Codex to access ${site} for this conversation?`;
259
+ return TRANSFER_QUESTIONS[card.transfer](site);
260
+ };
261
+ var codexBrowserUseCardContext = (card) => [
262
+ card.kind === "file_transfer" ? `Address: ${card.addressShown}` : `Site: ${card.origin}`,
263
+ WHAT_AN_ANSWER_DOES[card.kind]
264
+ ].join("\n");
265
+ var codexBrowserUseCardSubject = (card) => siteNameOf(card.origin);
266
+ var codexBrowserUseCardReply = (requestId, decision) => ({
267
+ id: requestId,
268
+ result: decision === "allow" ? ACCEPTED_WITH_NO_SAVED_CHOICE : CODEX_FORM_DECLINED
269
+ });
270
+
271
+ // src/codex-card.ts
272
+ var codexCardOf = (message) => {
273
+ const app = codexAppCardOf(message);
274
+ return app ? { kind: "app", ...app } : codexBrowserUseCardOf(message);
275
+ };
276
+ var comesFromCodexOwnTools = (message) => comesFromComputerUse(message) || comesFromBrowserUse(message);
277
+ var codexAppMayAnswerItself = (card) => card.kind === "site_access";
278
+ var codexCardQuestion = (card) => card.kind === "app" ? codexAppCardQuestion(card) : codexBrowserUseCardQuestion(card);
279
+ var codexCardContext = (card) => card.kind === "app" ? codexAppCardContext(card) : codexBrowserUseCardContext(card);
280
+ var codexCardSubject = (card) => card.kind === "app" ? card.appName : codexBrowserUseCardSubject(card);
281
+ var codexCardReply = (card, decision) => card.kind === "app" ? codexAppCardReply(card.requestId, decision) : codexBrowserUseCardReply(card.requestId, decision);
282
+
168
283
  // src/load-once.ts
169
284
  var loadedOnce = (load) => {
170
285
  let loading;
@@ -179,7 +294,7 @@ var loadedOnce = (load) => {
179
294
  };
180
295
 
181
296
  // src/codex-desktop-proxy.ts
182
- var loadThePhone = () => import("./api-WVXBM4MR.js");
297
+ var loadThePhone = () => import("./api-ASQA5PZM.js");
183
298
  var theFirstCardLoadsAgain = () => {
184
299
  };
185
300
  var APP_SERVER_COMMAND = "app-server";
@@ -200,9 +315,10 @@ var WITHDRAW_TIMEOUT_MS = 4e3;
200
315
  var CLOSE_GRACE_MS = 1500;
201
316
  var ENGINE_KILL_GRACE_MS = 2e3;
202
317
  var ENGINE_EXIT_GRACE_MS = 5e3;
203
- var QUESTION_IN_AN_UNKNOWN_SHAPE = "Codex asked about Computer Use in a way this version of Pushary does not know, so the question stays in Codex.";
318
+ var QUESTION_IN_AN_UNKNOWN_SHAPE = "Codex asked for a permission in a way this version of Pushary does not know, so the question stays in Codex.";
204
319
  var LAUNCHER_CHECK_MS = 2e3;
205
- var USUAL_TIMING = { answerWindowMs: 10 * 6e4, longPollMs: 25e3, pauseBetweenPollsMs: 2e3 };
320
+ var WAIT_FOR_CODEX_TO_ANSWER_SITE_ACCESS_ITSELF_MS = 500;
321
+ var USUAL_TIMING = { answerWindowMs: 10 * 6e4, longPollMs: 25e3, pauseBetweenPollsMs: 2e3, letCodexAnswerFirstMs: WAIT_FOR_CODEX_TO_ANSWER_SITE_ACCESS_ITSELF_MS };
206
322
  var subcommandIndexOf = (args) => {
207
323
  let index = 0;
208
324
  while (index < args.length) {
@@ -395,12 +511,12 @@ var CodexAppCards = class {
395
511
  await Promise.allSettled(outstanding.map((question) => this.cancel(question)));
396
512
  }
397
513
  questionShown(message) {
398
- const card = codexAppCardOf(message);
514
+ const card = codexCardOf(message);
399
515
  if (card) {
400
516
  if (this.ledger.open(card.requestId)) void this.askThePhone(card);
401
517
  return;
402
518
  }
403
- if (this.saidAQuestionWasUnknown || !comesFromComputerUse(message)) return;
519
+ if (this.saidAQuestionWasUnknown || !comesFromCodexOwnTools(message)) return;
404
520
  this.saidAQuestionWasUnknown = true;
405
521
  this.options.report(QUESTION_IN_AN_UNKNOWN_SHAPE);
406
522
  }
@@ -409,6 +525,8 @@ var CodexAppCards = class {
409
525
  }
410
526
  async askThePhone(card) {
411
527
  try {
528
+ if (codexAppMayAnswerItself(card)) await pauseUnlessStopped(this.timing.letCodexAnswerFirstMs, this.options.signal);
529
+ if (this.options.signal.aborted || !this.ledger.isWaiting(card.requestId)) return;
412
530
  const account = await this.options.readAccount();
413
531
  if (!account) {
414
532
  this.ledger.leaveWithTheApp(card.requestId);
@@ -418,9 +536,9 @@ var CodexAppCards = class {
418
536
  if (!this.ledger.isWaiting(card.requestId)) return;
419
537
  const answerableUntil = Date.now() + this.timing.answerWindowMs;
420
538
  const asked = await phone.askUser(account.apiKey, {
421
- question: codexAppCardQuestion(card),
539
+ question: codexCardQuestion(card),
422
540
  type: "confirm",
423
- context: codexAppCardContext(card),
541
+ context: codexCardContext(card),
424
542
  agentName: CODEX_APP_AGENT_NAME,
425
543
  sessionId: card.threadId,
426
544
  machineId: account.machineId,
@@ -444,7 +562,7 @@ var CodexAppCards = class {
444
562
  await this.waitForThePhone(phone, card, question);
445
563
  } catch (error) {
446
564
  if (this.ledger.leaveWithTheApp(card.requestId)) {
447
- this.options.report(`Could not ask about ${card.appName} through Pushary; answer in Codex. ${error instanceof Error ? error.message.split("\n")[0] : ""}`.trim());
565
+ this.options.report(`Could not ask about ${codexCardSubject(card)} through Pushary; answer in Codex. ${error instanceof Error ? error.message.split("\n")[0] : ""}`.trim());
448
566
  }
449
567
  }
450
568
  }
@@ -486,7 +604,7 @@ var CodexAppCards = class {
486
604
  this.ledger.leaveWithTheApp(card.requestId);
487
605
  return;
488
606
  }
489
- if (this.ledger.settleOnThePhone(card.requestId)) this.options.reply(codexAppCardReply(card.requestId, decision));
607
+ if (this.ledger.settleOnThePhone(card.requestId)) this.options.reply(codexCardReply(card, decision));
490
608
  }
491
609
  withdraw(requestId) {
492
610
  const key = codexRequestKey(requestId);
@@ -709,7 +827,7 @@ var codexDesktopCommand = async (args, entry, readAccount) => {
709
827
  return runCodexDesktopProxy(engine2, args.slice(3), readAccount, { watchesForCards: layoutIsKnown });
710
828
  }
711
829
  if (args[0] === APP_CARDS_FLAG) {
712
- const { codexAppCardsCommandOnThisMac } = await import("./codex-app-cards-switch-TVKXJWXE.js");
830
+ const { codexAppCardsCommandOnThisMac } = await import("./codex-app-cards-switch-ZO76D2NY.js");
713
831
  return codexAppCardsCommandOnThisMac(args.slice(1), entry, readAccount);
714
832
  }
715
833
  if (args.length > 2) throw new Error("Usage: pushary codex --desktop [path/to/Codex.app]");
@@ -720,7 +838,7 @@ var codexDesktopCommand = async (args, entry, readAccount) => {
720
838
  const directory = await mkdtemp(join(tmpdir(), "pushary-codex-desktop-"));
721
839
  try {
722
840
  const shim = await writeDesktopProxy(entry, app, engine, directory);
723
- process.stderr.write("[pushary] Experimental Codex app launch. When Codex asks to use an app on this Mac, the question also reaches Pushary; every other prompt stays as it is. Quit and open Codex normally to turn this off.\n");
841
+ process.stderr.write("[pushary] Experimental Codex app launch. When Codex asks to use an app on this Mac, or its browser asks to open a site, download or upload, the question also reaches Pushary; every other prompt stays as it is. Quit and open Codex normally to turn this off.\n");
724
842
  const child = spawn2(executable, [], { stdio: "ignore", detached: true, env: { ...process.env, [CODEX_APP_LAUNCH_VARIABLE]: shim } });
725
843
  return await new Promise((resolve2, reject) => {
726
844
  child.once("error", reject);
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  configFilePath
3
- } from "./chunk-LVDC3RUE.js";
3
+ } from "./chunk-BG4Y64FW.js";
4
4
  import {
5
5
  normalizeInstallSource
6
- } from "./chunk-GZL3KEPC.js";
6
+ } from "./chunk-AXJLJJ3M.js";
7
7
 
8
8
  // src/install-source.ts
9
9
  import { readFileSync } from "fs";
@@ -2,25 +2,25 @@ import {
2
2
  SIGNED_OUT_ON_MAC_MESSAGE,
3
3
  describeSignedOutKey,
4
4
  readSignedOutDiagnosis
5
- } from "./chunk-4YNNAF53.js";
5
+ } from "./chunk-ADR3KHOC.js";
6
6
  import {
7
7
  createIo
8
8
  } from "./chunk-FO3MDD26.js";
9
9
  import {
10
10
  readKeySource
11
- } from "./chunk-IRZ5FVWG.js";
11
+ } from "./chunk-WN3RACVD.js";
12
12
  import {
13
13
  absoluteUrl,
14
14
  checkApiKey,
15
15
  describeKeyCheck,
16
16
  keyCheckFromResponse
17
- } from "./chunk-S54YLXWW.js";
17
+ } from "./chunk-METMK3L4.js";
18
18
  import {
19
19
  EXIT
20
20
  } from "./chunk-KZERVKTD.js";
21
21
  import {
22
22
  getBaseUrl
23
- } from "./chunk-LVDC3RUE.js";
23
+ } from "./chunk-BG4Y64FW.js";
24
24
 
25
25
  // src/cli/report-key.ts
26
26
  var { dim, yellow } = createIo();
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  localRepoKey,
3
3
  normalizeRepoRemote
4
- } from "./chunk-GZL3KEPC.js";
4
+ } from "./chunk-AXJLJJ3M.js";
5
5
 
6
6
  // src/repo.ts
7
7
  import { existsSync, readFileSync, statSync } from "fs";
@@ -7,7 +7,7 @@ import {
7
7
  reachVerdict,
8
8
  reachesYou,
9
9
  verifyDelivery
10
- } from "./chunk-CZULJ647.js";
10
+ } from "./chunk-DJ7EZIQA.js";
11
11
  import {
12
12
  generateKeypair,
13
13
  openSealedKey,
@@ -24,14 +24,14 @@ import {
24
24
  } from "./chunk-FO3MDD26.js";
25
25
  import {
26
26
  reportedInstallSource
27
- } from "./chunk-7RZO6VWD.js";
27
+ } from "./chunk-Y5VKZNFN.js";
28
28
  import {
29
29
  NPX_LATEST_COMMAND
30
- } from "./chunk-5SFM6XB4.js";
30
+ } from "./chunk-ERK24P76.js";
31
31
  import {
32
32
  NO_PAIRING_COMPUTER,
33
33
  PAIR_TTL_SECONDS
34
- } from "./chunk-GZL3KEPC.js";
34
+ } from "./chunk-AXJLJJ3M.js";
35
35
 
36
36
  // src/onboarding.ts
37
37
  import qrcodeTerminal from "qrcode-terminal";
@@ -22,23 +22,23 @@ import {
22
22
  turnCodexAppCardsOff,
23
23
  turnCodexAppCardsOn,
24
24
  whyLaunchctlFailed
25
- } from "./chunk-XEJV3QSS.js";
26
- import "./chunk-ZJNU32VE.js";
25
+ } from "./chunk-4PZXI7WU.js";
26
+ import "./chunk-Y5V4PA2Z.js";
27
27
  import "./chunk-XCEN33UP.js";
28
28
  import "./chunk-QCGNGEGE.js";
29
- import "./chunk-QP3XPS5U.js";
29
+ import "./chunk-HC3FHDKB.js";
30
30
  import "./chunk-XHKBHWLX.js";
31
- import "./chunk-IRZ5FVWG.js";
31
+ import "./chunk-WN3RACVD.js";
32
32
  import "./chunk-E46NE7FB.js";
33
- import "./chunk-IJ6XKKQW.js";
34
- import "./chunk-7RZO6VWD.js";
35
- import "./chunk-MYBCXDIL.js";
36
- import "./chunk-WVP6UQG3.js";
33
+ import "./chunk-O6IUZGWV.js";
34
+ import "./chunk-Y5VKZNFN.js";
35
+ import "./chunk-6MJWYYAS.js";
36
+ import "./chunk-2QREHU4O.js";
37
37
  import "./chunk-QENTGE75.js";
38
- import "./chunk-LVDC3RUE.js";
39
- import "./chunk-5SFM6XB4.js";
38
+ import "./chunk-BG4Y64FW.js";
39
+ import "./chunk-ERK24P76.js";
40
40
  import "./chunk-QTOLNRET.js";
41
- import "./chunk-GZL3KEPC.js";
41
+ import "./chunk-AXJLJJ3M.js";
42
42
  export {
43
43
  CODEX_APP_CARDS_DIRECTORY,
44
44
  CODEX_APP_CARDS_LOGIN_ITEM,
@@ -11,7 +11,7 @@ import {
11
11
  installedCodexApp,
12
12
  shellQuoted,
13
13
  writeDesktopProxy
14
- } from "./chunk-ZJNU32VE.js";
14
+ } from "./chunk-Y5V4PA2Z.js";
15
15
  import "./chunk-XCEN33UP.js";
16
16
  import {
17
17
  CODEX_APP_LAUNCH_VARIABLE
@@ -11,36 +11,36 @@ import {
11
11
  isCodexQuestionLeftWithTheLocalClient,
12
12
  planCodexElicitation,
13
13
  reportOwnedQuestion
14
- } from "./chunk-ZEHUWE3X.js";
15
- import "./chunk-IUOUNRLH.js";
16
- import "./chunk-3KOPY2UQ.js";
17
- import "./chunk-LVWXRXT7.js";
18
- import "./chunk-CK5BCFQF.js";
14
+ } from "./chunk-MUNL23WE.js";
15
+ import "./chunk-ELLJPP6O.js";
16
+ import "./chunk-6LOQE4J4.js";
17
+ import "./chunk-USE5IEEW.js";
18
+ import "./chunk-7WFRY6OL.js";
19
19
  import "./chunk-VUFHYMSP.js";
20
- import "./chunk-JSQOHMNJ.js";
21
- import "./chunk-N3NSWWNU.js";
20
+ import "./chunk-2AELPDMT.js";
21
+ import "./chunk-GAMVAORR.js";
22
22
  import "./chunk-XHKBHWLX.js";
23
23
  import "./chunk-6ICPEJY5.js";
24
- import "./chunk-XXNT4FGA.js";
24
+ import "./chunk-YPD3MTFU.js";
25
25
  import {
26
26
  writeDegraded
27
- } from "./chunk-DQ565WFA.js";
28
- import "./chunk-ZL3UR6M5.js";
27
+ } from "./chunk-EZHY65QA.js";
28
+ import "./chunk-SEILUNWB.js";
29
29
  import "./chunk-POFBE6ZY.js";
30
- import "./chunk-S54YLXWW.js";
31
- import "./chunk-5DZHKNBU.js";
32
- import "./chunk-IJ6XKKQW.js";
33
- import "./chunk-7QLSKOSU.js";
30
+ import "./chunk-METMK3L4.js";
31
+ import "./chunk-4MWRR5IT.js";
32
+ import "./chunk-O6IUZGWV.js";
33
+ import "./chunk-PPY5N2E6.js";
34
34
  import "./chunk-KZERVKTD.js";
35
- import "./chunk-MYBCXDIL.js";
36
- import "./chunk-WVP6UQG3.js";
35
+ import "./chunk-6MJWYYAS.js";
36
+ import "./chunk-2QREHU4O.js";
37
37
  import "./chunk-QENTGE75.js";
38
- import "./chunk-LVDC3RUE.js";
39
- import "./chunk-5SFM6XB4.js";
38
+ import "./chunk-BG4Y64FW.js";
39
+ import "./chunk-ERK24P76.js";
40
40
  import "./chunk-QTOLNRET.js";
41
41
  import {
42
42
  canonicalJsonText
43
- } from "./chunk-GZL3KEPC.js";
43
+ } from "./chunk-AXJLJJ3M.js";
44
44
 
45
45
  // src/codex-session-launch.ts
46
46
  import { spawn as spawn2 } from "child_process";
@@ -3,9 +3,9 @@ import {
3
3
  getApiKey,
4
4
  getBaseUrl,
5
5
  resetKeyDriftWarning
6
- } from "./chunk-LVDC3RUE.js";
7
- import "./chunk-5SFM6XB4.js";
8
- import "./chunk-GZL3KEPC.js";
6
+ } from "./chunk-BG4Y64FW.js";
7
+ import "./chunk-ERK24P76.js";
8
+ import "./chunk-AXJLJJ3M.js";
9
9
  export {
10
10
  configFilePath,
11
11
  getApiKey,
@@ -7,21 +7,21 @@ import {
7
7
  recordUnfinishedUpgrade,
8
8
  upgradeInstalledPackage,
9
9
  withUpgradeLock
10
- } from "./chunk-4JJ3T7IE.js";
11
- import "./chunk-KIH5BDH5.js";
12
- import "./chunk-3KOPY2UQ.js";
13
- import "./chunk-LVWXRXT7.js";
10
+ } from "./chunk-SOCJ2N3E.js";
11
+ import "./chunk-VIJIG5YL.js";
12
+ import "./chunk-6LOQE4J4.js";
13
+ import "./chunk-USE5IEEW.js";
14
14
  import "./chunk-VUFHYMSP.js";
15
- import "./chunk-JZKEC4XJ.js";
15
+ import "./chunk-5RU35K57.js";
16
16
  import "./chunk-6ICPEJY5.js";
17
17
  import "./chunk-POFBE6ZY.js";
18
18
  import "./chunk-KZERVKTD.js";
19
- import "./chunk-MYBCXDIL.js";
20
- import "./chunk-WVP6UQG3.js";
19
+ import "./chunk-6MJWYYAS.js";
20
+ import "./chunk-2QREHU4O.js";
21
21
  import "./chunk-QENTGE75.js";
22
- import "./chunk-5SFM6XB4.js";
22
+ import "./chunk-ERK24P76.js";
23
23
  import "./chunk-QTOLNRET.js";
24
- import "./chunk-GZL3KEPC.js";
24
+ import "./chunk-AXJLJJ3M.js";
25
25
  export {
26
26
  finishGlobalUpgrade,
27
27
  finishUpgradeWithLock,
@@ -2,12 +2,12 @@ import {
2
2
  getMachineId,
3
3
  getOrCreateMachineId,
4
4
  readExistingMachineId
5
- } from "./chunk-IJ6XKKQW.js";
6
- import "./chunk-MYBCXDIL.js";
7
- import "./chunk-WVP6UQG3.js";
5
+ } from "./chunk-O6IUZGWV.js";
6
+ import "./chunk-6MJWYYAS.js";
7
+ import "./chunk-2QREHU4O.js";
8
8
  import "./chunk-QENTGE75.js";
9
9
  import "./chunk-QTOLNRET.js";
10
- import "./chunk-GZL3KEPC.js";
10
+ import "./chunk-AXJLJJ3M.js";
11
11
  export {
12
12
  getMachineId,
13
13
  getOrCreateMachineId,
@@ -22,14 +22,14 @@ import {
22
22
  resolveControlPolicy,
23
23
  resolveProviderBinary,
24
24
  trackProviderInventory
25
- } from "./chunk-3KOPY2UQ.js";
26
- import "./chunk-LVWXRXT7.js";
25
+ } from "./chunk-6LOQE4J4.js";
26
+ import "./chunk-USE5IEEW.js";
27
27
  import "./chunk-VUFHYMSP.js";
28
28
  import "./chunk-6ICPEJY5.js";
29
- import "./chunk-WVP6UQG3.js";
29
+ import "./chunk-2QREHU4O.js";
30
30
  import "./chunk-QENTGE75.js";
31
31
  import "./chunk-QTOLNRET.js";
32
- import "./chunk-GZL3KEPC.js";
32
+ import "./chunk-AXJLJJ3M.js";
33
33
  export {
34
34
  CLAUDE_BRIDGE_CAPABILITY,
35
35
  CLAUDE_RESUME_CAPABILITY,
@@ -33,10 +33,10 @@ import {
33
33
  serviceOwedBackMark,
34
34
  vscodePluginDir,
35
35
  vscodePluginMcp
36
- } from "./chunk-MYBCXDIL.js";
37
- import "./chunk-WVP6UQG3.js";
36
+ } from "./chunk-6MJWYYAS.js";
37
+ import "./chunk-2QREHU4O.js";
38
38
  import "./chunk-QTOLNRET.js";
39
- import "./chunk-GZL3KEPC.js";
39
+ import "./chunk-AXJLJJ3M.js";
40
40
  export {
41
41
  autoUpdateLock,
42
42
  autoUpdateLog,