pushary 1.9.91 → 1.9.93

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 (128) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/data/cursor-plugin/scripts/pushary-gate.mjs +34 -9
  3. package/data/vscode-plugin/scripts/pushary-gate.mjs +34 -9
  4. package/dist/{api-SXS2T6QU.js → api-QUARGXSY.js} +10 -10
  5. package/dist/bin/pushary-bell-hook.js +26 -26
  6. package/dist/bin/pushary-bell.js +10 -10
  7. package/dist/bin/pushary-claude.js +30 -29
  8. package/dist/bin/pushary-clean.js +34 -34
  9. package/dist/bin/pushary-codex-bridge.js +21 -21
  10. package/dist/bin/pushary-codex-hook.js +35 -34
  11. package/dist/bin/pushary-codex-session.js +8 -8
  12. package/dist/bin/pushary-codex.js +14 -14
  13. package/dist/bin/pushary-connect.js +27 -27
  14. package/dist/bin/pushary-cowork.js +5 -5
  15. package/dist/bin/pushary-daemon.js +39 -39
  16. package/dist/bin/pushary-disconnect.js +26 -26
  17. package/dist/bin/pushary-display-hook.js +17 -17
  18. package/dist/bin/pushary-doctor.js +42 -42
  19. package/dist/bin/pushary-elicitation-hook.js +26 -26
  20. package/dist/bin/pushary-gemini-bridge.js +15 -15
  21. package/dist/bin/pushary-gemini-hook.js +28 -28
  22. package/dist/bin/pushary-hook.js +30 -30
  23. package/dist/bin/pushary-login.js +20 -20
  24. package/dist/bin/pushary-logout.js +25 -25
  25. package/dist/bin/pushary-mcp.js +11 -11
  26. package/dist/bin/pushary-mode.js +15 -15
  27. package/dist/bin/pushary-notification-hook.js +25 -25
  28. package/dist/bin/pushary-opencode-hook.js +27 -27
  29. package/dist/bin/pushary-permission-denied-hook.js +30 -30
  30. package/dist/bin/pushary-permission-hook.js +30 -30
  31. package/dist/bin/pushary-post-hook.js +25 -25
  32. package/dist/bin/pushary-prompt-hook.js +25 -25
  33. package/dist/bin/pushary-session-end-hook.js +27 -27
  34. package/dist/bin/pushary-session-start-hook.js +35 -35
  35. package/dist/bin/pushary-setup.js +54 -52
  36. package/dist/bin/pushary-stats.js +5 -5
  37. package/dist/bin/pushary-status.js +32 -32
  38. package/dist/bin/pushary-stop-hook.js +25 -25
  39. package/dist/bin/pushary-stopfailure-hook.js +25 -25
  40. package/dist/bin/pushary-suggestions.js +15 -15
  41. package/dist/bin/pushary-transcript-register.js +18 -18
  42. package/dist/bin/pushary-transcripts.js +26 -26
  43. package/dist/bin/pushary-upgrade.js +40 -40
  44. package/dist/bin/pushary-wait.js +15 -15
  45. package/dist/bin/pushary.js +7 -7
  46. package/dist/{chunk-KDN7AMAQ.js → chunk-2BVVMWVF.js} +47 -8
  47. package/dist/{chunk-L2ZV2R56.js → chunk-2BXWBKVN.js} +3 -3
  48. package/dist/{chunk-KFJAVZQ4.js → chunk-2FL5PLA4.js} +2 -2
  49. package/dist/{chunk-CEFWJUMO.js → chunk-373552A3.js} +4 -4
  50. package/dist/{chunk-ZH7GIWNY.js → chunk-3CJFBWID.js} +3 -3
  51. package/dist/{chunk-CIS6AR32.js → chunk-3JVV6PMG.js} +5 -5
  52. package/dist/{chunk-7M2XBZ5B.js → chunk-4HQTZQ4D.js} +2 -2
  53. package/dist/{chunk-27232B7Y.js → chunk-4PD7FP55.js} +2 -2
  54. package/dist/{chunk-R6XUBZXX.js → chunk-5TQC2LS6.js} +4 -4
  55. package/dist/{chunk-SF3FHCJJ.js → chunk-5V2YDO4U.js} +4 -4
  56. package/dist/{chunk-KRNY5Z6I.js → chunk-66VEUAN5.js} +1 -1
  57. package/dist/{chunk-FVLMKRSH.js → chunk-76ROCOWD.js} +7 -7
  58. package/dist/{chunk-ESUZQNA4.js → chunk-7DOSRSRU.js} +9 -14
  59. package/dist/{chunk-QFTLJDUE.js → chunk-7GFWYFLO.js} +10 -10
  60. package/dist/{chunk-HF5PQTRW.js → chunk-7PQ66CB3.js} +1 -1
  61. package/dist/{chunk-36LCF2YG.js → chunk-7VJ7PEI3.js} +4 -4
  62. package/dist/{chunk-INHSF76N.js → chunk-7YB2XRY7.js} +3 -3
  63. package/dist/{chunk-XNX6P2J5.js → chunk-A2FDS7E3.js} +5 -5
  64. package/dist/{chunk-5UTJHR7L.js → chunk-ANDG4PUV.js} +6 -6
  65. package/dist/{chunk-IAMH6L23.js → chunk-ATWH6TGY.js} +18 -17
  66. package/dist/{chunk-RR2T2R2Z.js → chunk-BETKU76V.js} +3 -3
  67. package/dist/{chunk-OBRDREJD.js → chunk-CFD3IESN.js} +6 -6
  68. package/dist/{chunk-LLVX57ZC.js → chunk-CHVXLS7U.js} +2 -2
  69. package/dist/{chunk-OAWIPPYH.js → chunk-CO6TQ44W.js} +3 -3
  70. package/dist/{chunk-BANK74ZZ.js → chunk-CQMY74I2.js} +7 -7
  71. package/dist/{chunk-RD2WTV72.js → chunk-CSUO5YJG.js} +2 -2
  72. package/dist/{chunk-NRK3RNWF.js → chunk-DV7LLH25.js} +1 -1
  73. package/dist/{chunk-GSV75E67.js → chunk-FTJ5DQL7.js} +2 -2
  74. package/dist/{chunk-ZAXB2CFU.js → chunk-GLA6MCOG.js} +1 -1
  75. package/dist/{chunk-46MZBPY3.js → chunk-H4MIOBC6.js} +2 -2
  76. package/dist/{chunk-BGJ3SXTZ.js → chunk-HALVTC2N.js} +5 -5
  77. package/dist/{chunk-2GYHJE4R.js → chunk-HUNGCBCF.js} +3 -3
  78. package/dist/{chunk-SVE32G6W.js → chunk-JJWZIPDL.js} +4 -4
  79. package/dist/{chunk-DCILU6SS.js → chunk-JZ2MRWC4.js} +3 -3
  80. package/dist/{chunk-JQ37ZJJQ.js → chunk-KJ752DUH.js} +6 -6
  81. package/dist/{chunk-PETLGHDR.js → chunk-LANGH7UF.js} +4 -4
  82. package/dist/{chunk-7JF57OPF.js → chunk-LTMMFZHG.js} +1 -1
  83. package/dist/{chunk-24JXCTST.js → chunk-MSJXRN22.js} +5 -5
  84. package/dist/{chunk-BFXTO23L.js → chunk-N7CPX5S5.js} +5 -5
  85. package/dist/{chunk-7ECQUETY.js → chunk-NDPOESVW.js} +1 -1
  86. package/dist/{chunk-QAXQ33SA.js → chunk-NHGOCUX7.js} +1 -1
  87. package/dist/{chunk-PKM6S4XN.js → chunk-NPH4DJAU.js} +5 -5
  88. package/dist/{chunk-KU2FFKWS.js → chunk-NPZ5L2WQ.js} +1 -1
  89. package/dist/{chunk-Q37ESQSL.js → chunk-NZKH2RMQ.js} +1 -1
  90. package/dist/{chunk-PRH7XNAT.js → chunk-OC47FGOY.js} +1 -1
  91. package/dist/{chunk-Q2PKD73S.js → chunk-OFQJHWAS.js} +12 -10
  92. package/dist/{chunk-XMKJ3UEC.js → chunk-OLMKZINV.js} +6 -6
  93. package/dist/{chunk-ABAIOLV5.js → chunk-OMN5UCMW.js} +102 -69
  94. package/dist/{chunk-CPEITTYS.js → chunk-ONRA5ON4.js} +2 -2
  95. package/dist/{chunk-2GSRRZ6B.js → chunk-PFHU3CW4.js} +1 -1
  96. package/dist/{chunk-4QQDACWU.js → chunk-PS2K6ZQ3.js} +12 -11
  97. package/dist/{chunk-3R2FRFVO.js → chunk-RFP4Q5I3.js} +11 -11
  98. package/dist/{chunk-B3K3752V.js → chunk-RXAQOAZI.js} +3 -3
  99. package/dist/{chunk-CEUWBQF2.js → chunk-RXQT5FTX.js} +52 -11
  100. package/dist/{chunk-UOBUESLS.js → chunk-SPPMPM7F.js} +1 -1
  101. package/dist/{chunk-2YFTIQM5.js → chunk-SR44ZNZF.js} +5 -5
  102. package/dist/{chunk-TJMSJDRS.js → chunk-UGGACQMD.js} +3 -3
  103. package/dist/{chunk-YHOMFTLQ.js → chunk-UHS3JZLN.js} +2 -2
  104. package/dist/{chunk-IL67TUP3.js → chunk-UNPDFIPQ.js} +2 -2
  105. package/dist/{chunk-GVEIAGZ5.js → chunk-UZRKR6NZ.js} +3 -3
  106. package/dist/{chunk-EJEAHC7H.js → chunk-V3LBQFQM.js} +1 -1
  107. package/dist/{chunk-62KQLGEP.js → chunk-V7TNHTHH.js} +1 -1
  108. package/dist/{chunk-OGRGVEWA.js → chunk-VMIWR724.js} +1 -1
  109. package/dist/{chunk-I5M2KWB3.js → chunk-WW4OMRZX.js} +1 -1
  110. package/dist/{chunk-QAKTIVCT.js → chunk-X3AHEUQ5.js} +3 -3
  111. package/dist/{chunk-PX56WF4C.js → chunk-XDWJX7LT.js} +3 -3
  112. package/dist/{chunk-EX76IRRF.js → chunk-XTNCXIYR.js} +4 -4
  113. package/dist/{chunk-D4A277IY.js → chunk-Y7AX6BS4.js} +3 -3
  114. package/dist/{chunk-HEFRK3YI.js → chunk-YLCNW7YN.js} +2 -2
  115. package/dist/{chunk-B3IAV5CZ.js → chunk-YT3ENXBT.js} +2 -2
  116. package/dist/{codex-app-cards-switch-CCPJNIO3.js → codex-app-cards-switch-XP2H2CZO.js} +11 -11
  117. package/dist/{codex-desktop-launch-K435NZMM.js → codex-desktop-launch-QRFE2GHZ.js} +1 -1
  118. package/dist/{codex-session-launch-TFFGMVQQ.js → codex-session-launch-EUUWALWW.js} +18 -18
  119. package/dist/{config-T354BRNE.js → config-WBDMUTD4.js} +3 -3
  120. package/dist/{global-upgrade-PUHR6IUT.js → global-upgrade-ZXFLRGGV.js} +10 -10
  121. package/dist/{identity-SKMA72SN.js → identity-NUQ75BP7.js} +4 -4
  122. package/dist/{live-capabilities-OBNZ57FR.js → live-capabilities-SIQ25SSK.js} +5 -5
  123. package/dist/{paths-HXV4TRDG.js → paths-BGO6PZFZ.js} +3 -3
  124. package/dist/{reapply-2HEDTSBK.js → reapply-AD5ATZOO.js} +28 -28
  125. package/dist/src/index.js +29 -29
  126. package/dist/{upgrade-lock-DMC66XTA.js → upgrade-lock-B5HTMEWT.js} +4 -4
  127. package/dist/{usage-MBT3U2VX.js → usage-YHFALPKW.js} +3 -3
  128. package/package.json +1 -1
@@ -1,3 +1,67 @@
1
+ // ../contracts/src/redaction.ts
2
+ var CREDENTIAL_NAME = String.raw`(?:authorization|secret|token|password|passwd|api[_-]?key|access[_-]?key|client[_-]?secret|private[_-]?key)["']?`;
3
+ var CREDENTIAL_KEY = String.raw`${CREDENTIAL_NAME}\s*[=:]\s*`;
4
+ var DISPLAYED_CREDENTIAL_KEY = String.raw`${CREDENTIAL_NAME}(?:[ \t]*:[ \t]*|[ \t]+=[ \t]*|=)`;
5
+ var SHELL_INERT_UNIT = String.raw`(?:[A-Za-z0-9_\-./+=:@%^!#]|\\[^\s'"])`;
6
+ var SHELL_INERT_SINGLE_QUOTED_UNIT = String.raw`[A-Za-z0-9_\-./+=:@%^!#\\]`;
7
+ var SHELL_INERT_URL_PASSWORD_UNIT = String.raw`(?:[A-Za-z0-9_\-.+=:%^!#]|\\[^\s'"@/])`;
8
+ var PEM_LINE_BREAK = String.raw`(?:\r?\n|(?:\\r)?\\n)`;
9
+ var credentialAssignmentRule = (key, doubleQuoted, singleQuoted, bare) => ({
10
+ pattern: new RegExp(String.raw`(${key})(?:(")${doubleQuoted}|(')${singleQuoted}|(["']?)${bare})`, "gi"),
11
+ replacement: "$1$2$3$4[redacted]$2$3"
12
+ });
13
+ var DISPLAYED_SECRET_SHAPES = {
14
+ separator: String.raw`[ \t]`,
15
+ privateKeyBody: String.raw`${PEM_LINE_BREAK}?(?:(?:Proc-Type|DEK-Info): [A-Za-z0-9,-]+${PEM_LINE_BREAK})*(?:[A-Za-z0-9+/=\r\n]|\\[rn])*?`,
16
+ urlPassword: `${SHELL_INERT_URL_PASSWORD_UNIT}+`,
17
+ authorizationValue: `${SHELL_INERT_UNIT}+`,
18
+ credentialAssignment: credentialAssignmentRule(
19
+ DISPLAYED_CREDENTIAL_KEY,
20
+ `${SHELL_INERT_UNIT}*"`,
21
+ `${SHELL_INERT_SINGLE_QUOTED_UNIT}*'`,
22
+ `${SHELL_INERT_UNIT}+`
23
+ )
24
+ };
25
+ var CUT_OFF_SECRET_SHAPES = {
26
+ separator: String.raw`\s`,
27
+ privateKeyBody: String.raw`[\s\S]*?`,
28
+ urlPassword: String.raw`[^\s@/]+`,
29
+ authorizationValue: String.raw`\S+`,
30
+ credentialAssignment: credentialAssignmentRule(
31
+ CREDENTIAL_KEY,
32
+ String.raw`(?:\\[\s\S]|[^"\\])*(?:"|\\?$)`,
33
+ "[^']*(?:'|$)",
34
+ String.raw`\S+`
35
+ )
36
+ };
37
+ var secretRedactionRules = (shapes) => [
38
+ { pattern: /\bpk_[A-Za-z0-9_]+\.[A-Za-z0-9_]+/g, replacement: "[redacted]" },
39
+ { pattern: new RegExp(String.raw`-----BEGIN[A-Z0-9 ]*PRIVATE KEY-----${shapes.privateKeyBody}-----END[A-Z0-9 ]*PRIVATE KEY-----`, "g"), replacement: "[redacted key]" },
40
+ { pattern: /\bsk-[A-Za-z0-9_-]{16,}\b/g, replacement: "[redacted]" },
41
+ { pattern: /\b[spr]k_(?:live|test)_[A-Za-z0-9]{8,}\b/g, replacement: "[redacted]" },
42
+ { pattern: /\bwhsec_[A-Za-z0-9]{16,}\b/g, replacement: "[redacted]" },
43
+ { pattern: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g, replacement: "[redacted]" },
44
+ { pattern: /\bgithub_pat_[A-Za-z0-9_]{22,}\b/g, replacement: "[redacted]" },
45
+ { pattern: /\bglpat-[A-Za-z0-9_-]{20,}\b/g, replacement: "[redacted]" },
46
+ { pattern: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, replacement: "[redacted]" },
47
+ { pattern: /\bAIza[A-Za-z0-9_-]{35}\b/g, replacement: "[redacted]" },
48
+ { pattern: /\bAKIA[0-9A-Z]{16}\b/g, replacement: "[redacted]" },
49
+ { pattern: /\bnpm_[A-Za-z0-9]{36}\b/g, replacement: "[redacted]" },
50
+ { pattern: /\bxai-[A-Za-z0-9]{16,}\b/g, replacement: "[redacted]" },
51
+ { pattern: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g, replacement: "[redacted]" },
52
+ { pattern: new RegExp(String.raw`\b([a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)${shapes.urlPassword}@`, "gi"), replacement: "$1[redacted]@" },
53
+ { pattern: new RegExp(String.raw`\bbearer${shapes.separator}+[A-Za-z0-9._~+/=-]+`, "gi"), replacement: "bearer [redacted]" },
54
+ { pattern: new RegExp(String.raw`\bauthorization:${shapes.separator}*${shapes.authorizationValue}`, "gi"), replacement: "authorization: [redacted]" },
55
+ shapes.credentialAssignment
56
+ ];
57
+ var SECRET_REDACTION_RULES = secretRedactionRules(DISPLAYED_SECRET_SHAPES);
58
+ var CUT_OFF_TEXT_REDACTION_RULES = secretRedactionRules(CUT_OFF_SECRET_SHAPES);
59
+ var HIGH_ENTROPY_RULE = { pattern: /[A-Za-z0-9+/]{40,}={0,2}/g, replacement: "[redacted]" };
60
+ var applyRedactionRules = (rules, text3) => rules.reduce((acc, rule) => acc.replace(rule.pattern, rule.replacement), text3);
61
+ var redactSecrets = (text3) => applyRedactionRules(SECRET_REDACTION_RULES, text3);
62
+ var redactSecretsFromContent = (text3) => applyRedactionRules(CUT_OFF_TEXT_REDACTION_RULES, text3);
63
+ var redactSecretsDeep = (text3) => redactSecrets(text3).replace(HIGH_ENTROPY_RULE.pattern, HIGH_ENTROPY_RULE.replacement);
64
+
1
65
  // ../contracts/src/json-record.ts
2
66
  var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
3
67
 
@@ -139,7 +203,8 @@ var CLAUDE_CONNECTOR_STEPS = [
139
203
  "For proactive Cowork use, install the Pushary Cowork plugin/skill or paste the standing instructions into Settings > Cowork.",
140
204
  "Ask Claude to send the test question below, answer it from Pushary, and confirm Claude receives your answer."
141
205
  ];
142
- var CLAUDE_CONNECTOR_TEST = "Use Pushary ask_user to ask \u201CDid this setup question reach you?\u201D with type \u201Cconfirm\u201D. Use agentName \u201CClaude Cowork - Setup check\u201D in Cowork or \u201CClaude Chat - Setup check\u201D in Chat. Wait for my answer and tell me which answer you received. Do not run a command or change any files.";
206
+ var CONNECTOR_SETUP_QUESTION = "Did this setup question reach you?";
207
+ var CLAUDE_CONNECTOR_TEST = `Use Pushary ask_user to ask \u201C${CONNECTOR_SETUP_QUESTION}\u201D with type \u201Cconfirm\u201D. Use agentName \u201CClaude Cowork - Setup check\u201D in Cowork or \u201CClaude Chat - Setup check\u201D in Chat. Wait for my answer and tell me which answer you received. Do not run a command or change any files.`;
143
208
  var COWORK_STANDING_INSTRUCTIONS = `Pushary is connected as a connector. Use it proactively to reach me on my phone or Mac notch.
144
209
 
145
210
  - When you need a decision or clarifying answer, call ask_user. Use type "confirm", "select", or "input" as appropriate. Ask once on one channel.
@@ -930,70 +995,6 @@ var compatibleTargetFiles = (profile) => {
930
995
  return [...seen.values()];
931
996
  };
932
997
 
933
- // ../contracts/src/redaction.ts
934
- var CREDENTIAL_NAME = String.raw`(?:authorization|secret|token|password|passwd|api[_-]?key|access[_-]?key|client[_-]?secret|private[_-]?key)["']?`;
935
- var CREDENTIAL_KEY = String.raw`${CREDENTIAL_NAME}\s*[=:]\s*`;
936
- var DISPLAYED_CREDENTIAL_KEY = String.raw`${CREDENTIAL_NAME}(?:[ \t]*:[ \t]*|[ \t]+=[ \t]*|=)`;
937
- var SHELL_INERT_UNIT = String.raw`(?:[A-Za-z0-9_\-./+=:@%^!#]|\\[^\s'"])`;
938
- var SHELL_INERT_SINGLE_QUOTED_UNIT = String.raw`[A-Za-z0-9_\-./+=:@%^!#\\]`;
939
- var SHELL_INERT_URL_PASSWORD_UNIT = String.raw`(?:[A-Za-z0-9_\-.+=:%^!#]|\\[^\s'"@/])`;
940
- var PEM_LINE_BREAK = String.raw`(?:\r?\n|(?:\\r)?\\n)`;
941
- var credentialAssignmentRule = (key, doubleQuoted, singleQuoted, bare) => ({
942
- pattern: new RegExp(String.raw`(${key})(?:(")${doubleQuoted}|(')${singleQuoted}|(["']?)${bare})`, "gi"),
943
- replacement: "$1$2$3$4[redacted]$2$3"
944
- });
945
- var DISPLAYED_SECRET_SHAPES = {
946
- separator: String.raw`[ \t]`,
947
- privateKeyBody: String.raw`${PEM_LINE_BREAK}?(?:(?:Proc-Type|DEK-Info): [A-Za-z0-9,-]+${PEM_LINE_BREAK})*(?:[A-Za-z0-9+/=\r\n]|\\[rn])*?`,
948
- urlPassword: `${SHELL_INERT_URL_PASSWORD_UNIT}+`,
949
- authorizationValue: `${SHELL_INERT_UNIT}+`,
950
- credentialAssignment: credentialAssignmentRule(
951
- DISPLAYED_CREDENTIAL_KEY,
952
- `${SHELL_INERT_UNIT}*"`,
953
- `${SHELL_INERT_SINGLE_QUOTED_UNIT}*'`,
954
- `${SHELL_INERT_UNIT}+`
955
- )
956
- };
957
- var CUT_OFF_SECRET_SHAPES = {
958
- separator: String.raw`\s`,
959
- privateKeyBody: String.raw`[\s\S]*?`,
960
- urlPassword: String.raw`[^\s@/]+`,
961
- authorizationValue: String.raw`\S+`,
962
- credentialAssignment: credentialAssignmentRule(
963
- CREDENTIAL_KEY,
964
- String.raw`(?:\\[\s\S]|[^"\\])*(?:"|\\?$)`,
965
- "[^']*(?:'|$)",
966
- String.raw`\S+`
967
- )
968
- };
969
- var secretRedactionRules = (shapes) => [
970
- { pattern: /\bpk_[A-Za-z0-9_]+\.[A-Za-z0-9_]+/g, replacement: "[redacted]" },
971
- { pattern: new RegExp(String.raw`-----BEGIN[A-Z0-9 ]*PRIVATE KEY-----${shapes.privateKeyBody}-----END[A-Z0-9 ]*PRIVATE KEY-----`, "g"), replacement: "[redacted key]" },
972
- { pattern: /\bsk-[A-Za-z0-9_-]{16,}\b/g, replacement: "[redacted]" },
973
- { pattern: /\b[spr]k_(?:live|test)_[A-Za-z0-9]{8,}\b/g, replacement: "[redacted]" },
974
- { pattern: /\bwhsec_[A-Za-z0-9]{16,}\b/g, replacement: "[redacted]" },
975
- { pattern: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g, replacement: "[redacted]" },
976
- { pattern: /\bgithub_pat_[A-Za-z0-9_]{22,}\b/g, replacement: "[redacted]" },
977
- { pattern: /\bglpat-[A-Za-z0-9_-]{20,}\b/g, replacement: "[redacted]" },
978
- { pattern: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, replacement: "[redacted]" },
979
- { pattern: /\bAIza[A-Za-z0-9_-]{35}\b/g, replacement: "[redacted]" },
980
- { pattern: /\bAKIA[0-9A-Z]{16}\b/g, replacement: "[redacted]" },
981
- { pattern: /\bnpm_[A-Za-z0-9]{36}\b/g, replacement: "[redacted]" },
982
- { pattern: /\bxai-[A-Za-z0-9]{16,}\b/g, replacement: "[redacted]" },
983
- { pattern: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g, replacement: "[redacted]" },
984
- { pattern: new RegExp(String.raw`\b([a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)${shapes.urlPassword}@`, "gi"), replacement: "$1[redacted]@" },
985
- { pattern: new RegExp(String.raw`\bbearer${shapes.separator}+[A-Za-z0-9._~+/=-]+`, "gi"), replacement: "bearer [redacted]" },
986
- { pattern: new RegExp(String.raw`\bauthorization:${shapes.separator}*${shapes.authorizationValue}`, "gi"), replacement: "authorization: [redacted]" },
987
- shapes.credentialAssignment
988
- ];
989
- var SECRET_REDACTION_RULES = secretRedactionRules(DISPLAYED_SECRET_SHAPES);
990
- var CUT_OFF_TEXT_REDACTION_RULES = secretRedactionRules(CUT_OFF_SECRET_SHAPES);
991
- var HIGH_ENTROPY_RULE = { pattern: /[A-Za-z0-9+/]{40,}={0,2}/g, replacement: "[redacted]" };
992
- var applyRedactionRules = (rules, text3) => rules.reduce((acc, rule) => acc.replace(rule.pattern, rule.replacement), text3);
993
- var redactSecrets = (text3) => applyRedactionRules(SECRET_REDACTION_RULES, text3);
994
- var redactSecretsFromContent = (text3) => applyRedactionRules(CUT_OFF_TEXT_REDACTION_RULES, text3);
995
- var redactSecretsDeep = (text3) => redactSecrets(text3).replace(HIGH_ENTROPY_RULE.pattern, HIGH_ENTROPY_RULE.replacement);
996
-
997
998
  // ../contracts/src/cursor.ts
998
999
  var CURSOR_GATE_EVENTS = ["beforeShellExecution", "beforeMCPExecution", "preToolUse"];
999
1000
  var CURSOR_GATE_SCRIPT = "pushary-gate.mjs";
@@ -1028,6 +1029,19 @@ var toolsCoveredByGateEntry = (coverage, matcher) => {
1028
1029
  var toolMatches = (match, toolName) => match.kind === "named" ? match.tools.includes(toolName) : toolName.startsWith(match.prefix);
1029
1030
  var cursorGateOwnsToolCall = (registration, toolName) => typeof toolName === "string" && registration.some((match) => toolMatches(match, toolName));
1030
1031
 
1032
+ // ../contracts/src/receipt-evidence.ts
1033
+ var RECEIPT_TARGET_MAX_LENGTH = 256;
1034
+ var GIT_BRANCH_MAX_LENGTH = 256;
1035
+ function isGitBranch(value) {
1036
+ return typeof value === "string" && value.length > 0 && value.length <= GIT_BRANCH_MAX_LENGTH && !/[\x00-\x20\x7f]/.test(value);
1037
+ }
1038
+ function parseGitBranch(value) {
1039
+ return isGitBranch(value) && redactSecrets(value) === value ? value : void 0;
1040
+ }
1041
+ function parseCommitId(value) {
1042
+ return typeof value === "string" && /^[a-f\d]{7,64}$/i.test(value) ? value.toLowerCase() : void 0;
1043
+ }
1044
+
1031
1045
  // ../contracts/src/conversation-text.ts
1032
1046
  var INTERNAL_ENVELOPE = /(^|\n) {0,3}(?:<(total_tokens|task-notification)>[\s\S]*?(?:<\/\2>|$)[\t ]*)+/g;
1033
1047
  var INCOMPLETE_ENVELOPE = /(^|\n) {0,3}<(?:total_tokens|task-notification)$/g;
@@ -2864,6 +2878,9 @@ var shellCommandStringOf = (shell, args) => {
2864
2878
  return operand === void 0 || operand.expands ? UNREADABLE2 : { kind: "readable", script: operand.text };
2865
2879
  };
2866
2880
 
2881
+ // ../contracts/src/chatgpt-plugin.ts
2882
+ var CHATGPT_CONNECTOR_TEST = `@Pushary use ask_user to ask \u201C${CONNECTOR_SETUP_QUESTION}\u201D with type \u201Cconfirm\u201D and agentName \u201CChatGPT - Setup check\u201D. Wait for my answer and tell me which answer you received.`;
2883
+
2867
2884
  // ../contracts/src/partner-developer-guide.ts
2868
2885
  var PARTNER_API_KEYS_URL = "https://pushary.com/dashboard/agent/settings";
2869
2886
  var PARTNER_INSTALL_COMMAND = "npm i @pushary/server";
@@ -3487,6 +3504,12 @@ var SETUP_VERIFICATION_SENDER_THROUGH_0_95_5 = {
3487
3504
  ...SETUP_VERIFICATION_SENDER,
3488
3505
  body: "Your AI agent can now reach you right here."
3489
3506
  };
3507
+ var ROUND_TRIP_QUESTION = "Pushary delivery test. Answer either way to test returning an answer. This does not test your agent hooks.";
3508
+ var ROUND_TRIP_SENDER_NAMES = [
3509
+ SETUP_VERIFICATION_SENDER.agentName,
3510
+ DOCTOR_VERIFICATION_SENDER.agentName
3511
+ ];
3512
+ var roundTripAsk = (agentName) => ({ question: ROUND_TRIP_QUESTION, type: "confirm", agentName, wait: false });
3490
3513
  var AGENT_STOP_DEFAULT_SECONDS = 3600;
3491
3514
  var TIMEOUT_ACTIONS = ["approve", "deny", "escalate", "wait"];
3492
3515
  var isTimeoutAction = (value) => typeof value === "string" && TIMEOUT_ACTIONS.includes(value);
@@ -6638,7 +6661,8 @@ var PRETOOLUSE_HANDLED_TOOLS = /* @__PURE__ */ new Set([...PRETOOLUSE_GATED_TOOL
6638
6661
  var isPermissionRequestOwnedByPreToolUse = (toolName, permissionMode, defers = shouldDeferToNativeMode) => PRETOOLUSE_HANDLED_TOOLS.has(toolName) && (isAskedInEveryMode(toolName) || !defers(permissionMode, toolName));
6639
6662
  var CLAUDE_PRETOOLUSE_MATCHER = [...PRETOOLUSE_HANDLED_TOOLS].join("|");
6640
6663
  var resolveGate = (input) => {
6641
- const { modeState, config, toolName, toolInputs, cwd, repoKey, sessionId } = input;
6664
+ const { modeState, config, toolName, toolInputs, cwd, sessionId } = input;
6665
+ const repoKey = input.sharedRepoKey ?? input.repoKey;
6642
6666
  if (isPusharyOwnTool(toolName)) {
6643
6667
  return {
6644
6668
  kind: "defer",
@@ -6647,6 +6671,10 @@ var resolveGate = (input) => {
6647
6671
  };
6648
6672
  }
6649
6673
  if (modeState.kill) return { kind: "kill", reason: KILL_REASON };
6674
+ if (input.sharedRepoKey && input.repoKey && input.sharedRepoKey !== input.repoKey) {
6675
+ const legacyPolicy = (toolInputs.length ? toolInputs : [void 0]).map((toolInput) => resolvePolicy(config, toolName, modeState.mode, toolInput, cwd, input.repoKey, sessionId)).find((policy2) => policy2.repoKey === input.repoKey && verdictForPolicy(policy2) === "deny");
6676
+ if (legacyPolicy) return { kind: "deny", policy: legacyPolicy, reason: `Denied by policy for ${legacyPolicy.tool}` };
6677
+ }
6650
6678
  const policy = resolvePolicyAcross(config, toolName, modeState.mode, toolInputs, cwd, repoKey, sessionId);
6651
6679
  const verdict = verdictForPolicy(policy);
6652
6680
  const autoApproves = verdict === "allow";
@@ -7128,6 +7156,12 @@ var hookActivationResult = (report) => {
7128
7156
  };
7129
7157
 
7130
7158
  export {
7159
+ redactSecrets,
7160
+ redactSecretsFromContent,
7161
+ redactSecretsDeep,
7162
+ RECEIPT_TARGET_MAX_LENGTH,
7163
+ parseGitBranch,
7164
+ parseCommitId,
7131
7165
  conversationText,
7132
7166
  extractMessageText,
7133
7167
  NativeInputAgent,
@@ -7195,9 +7229,6 @@ export {
7195
7229
  hookCompatibleProfile,
7196
7230
  hookCompatibleProfileBySource,
7197
7231
  compatibleTargetFiles,
7198
- redactSecrets,
7199
- redactSecretsFromContent,
7200
- redactSecretsDeep,
7201
7232
  CURSOR_GATE_EVENTS,
7202
7233
  CURSOR_GATE_SCRIPT,
7203
7234
  CURSOR_GATE_COVERAGE,
@@ -7261,6 +7292,7 @@ export {
7261
7292
  timeoutActionWithoutLocalPrompt,
7262
7293
  SETUP_VERIFICATION_SENDER,
7263
7294
  DOCTOR_VERIFICATION_SENDER,
7295
+ roundTripAsk,
7264
7296
  AGENT_STOP_DEFAULT_SECONDS,
7265
7297
  isTimeoutAction,
7266
7298
  plainAskOf,
@@ -7303,6 +7335,7 @@ export {
7303
7335
  isAnswerSource,
7304
7336
  denyReasonFrom,
7305
7337
  classifyConfirmResponse,
7338
+ classifyDecisionRisk,
7306
7339
  buildDecisionEpisodeFeatures,
7307
7340
  resolveAutoResolveOrigin,
7308
7341
  resolvePolicy,
@@ -9,7 +9,7 @@ import {
9
9
  isSetupConnectMode,
10
10
  isValidApiKey,
11
11
  normalizeAgentId
12
- } from "./chunk-ABAIOLV5.js";
12
+ } from "./chunk-OMN5UCMW.js";
13
13
 
14
14
  // src/setup/options.ts
15
15
  var AGENT_CHOICES = SETUP_AGENT_CHOICES;
@@ -37,7 +37,7 @@ var effectiveVerify = (options, context) => {
37
37
  if (options.verifyExplicit) return options.verify;
38
38
  return context.paired ? "push" : options.verify;
39
39
  };
40
- var effectiveAgentSelection = (selection, context) => context.paired && selection.kind === "ask" ? { kind: "auto" } : selection;
40
+ var effectiveAgentSelection = (selection, context) => context.paired && context.hasDetectedAgents && selection.kind === "ask" ? { kind: "auto" } : selection;
41
41
  var SETUP_FLAGS = {
42
42
  bools: ["key-stdin", "skip-phone", "yes", "y", "json", "dry-run", "take-over-hooks", "help", "h"],
43
43
  values: ["key", "connect", "agents", "verify", "control", "transcripts"]
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  guardBinary
3
- } from "./chunk-LLVX57ZC.js";
3
+ } from "./chunk-CHVXLS7U.js";
4
4
 
5
5
  // src/bell/install.ts
6
6
  import { join } from "path";
@@ -4,7 +4,7 @@ import {
4
4
  postLiveSession,
5
5
  postLiveSessionUntilAccepted,
6
6
  startLiveSessionHeartbeat
7
- } from "./chunk-UOBUESLS.js";
7
+ } from "./chunk-SPPMPM7F.js";
8
8
  import {
9
9
  CommandReceipts,
10
10
  controllerCommandSchema
@@ -14,24 +14,24 @@ import {
14
14
  describeIdleWindow,
15
15
  idleDeadlinePassed,
16
16
  startProcessOwnership
17
- } from "./chunk-L2ZV2R56.js";
17
+ } from "./chunk-2BXWBKVN.js";
18
18
  import {
19
19
  spawnClaude
20
20
  } from "./chunk-XHKBHWLX.js";
21
21
  import {
22
- repoKeyFor
23
- } from "./chunk-CEUWBQF2.js";
22
+ repositoryScopeFor
23
+ } from "./chunk-RXQT5FTX.js";
24
24
  import {
25
25
  isAskUserResponse,
26
26
  isDecisionStopped,
27
27
  isWaitForAnswerResponse,
28
28
  withdrawQuestion,
29
29
  writeDegraded
30
- } from "./chunk-2YFTIQM5.js";
30
+ } from "./chunk-SR44ZNZF.js";
31
31
  import {
32
32
  callMcpTool,
33
33
  isRetryable
34
- } from "./chunk-EX76IRRF.js";
34
+ } from "./chunk-XTNCXIYR.js";
35
35
  import {
36
36
  AGENT_QUESTION_DESCRIPTION_MAX,
37
37
  AGENT_QUESTION_HEADER_MAX,
@@ -52,7 +52,7 @@ import {
52
52
  parseCodexQuestions,
53
53
  planElicitationAsk,
54
54
  readElicitationFields
55
- } from "./chunk-ABAIOLV5.js";
55
+ } from "./chunk-OMN5UCMW.js";
56
56
 
57
57
  // src/codex-question-owner.ts
58
58
  import { createHash } from "crypto";
@@ -114,8 +114,8 @@ var CodexNativeApprovals = class {
114
114
  const changes = this.patches.get(this.patchKey(p));
115
115
  const approval = parseCodexNativeApproval({ method: message.method, params: p, ...changes ? { changes } : {} });
116
116
  if (!approval || approval.threadId !== threadId) return false;
117
- const repoKey = repoKeyFor(approval.cwd ?? cwd);
118
- const subjectHash = createHash2("sha256").update(canonicalJsonText({ request: approval.request, cwd, repoKey })).digest("hex");
117
+ const { repoKey, sharedRepoKey } = repositoryScopeFor(approval.cwd ?? cwd);
118
+ const subjectHash = createHash2("sha256").update(canonicalJsonText({ request: approval.request, cwd, repoKey, ...sharedRepoKey ? { sharedRepoKey } : {} })).digest("hex");
119
119
  const existing = this.pending.get(message.id);
120
120
  if (existing) {
121
121
  if (existing.owner.subjectHash !== subjectHash) this.retire(message.id, existing, false);
@@ -131,7 +131,7 @@ var CodexNativeApprovals = class {
131
131
  subjectHash,
132
132
  method: approval.request.method
133
133
  };
134
- const pending = { owner, approval, repoKey, cwd, controller: new AbortController(), replied: false, creating: true, correlationId: randomUUID() };
134
+ const pending = { owner, approval, repoKey, sharedRepoKey, cwd, controller: new AbortController(), replied: false, creating: true, correlationId: randomUUID() };
135
135
  this.pending.set(message.id, pending);
136
136
  const task = this.answer(pending).finally(() => {
137
137
  this.tasks.delete(task);
@@ -191,7 +191,8 @@ var CodexNativeApprovals = class {
191
191
  localSurfaceAvailable: this.options.shared,
192
192
  acceptsAllowReply: true,
193
193
  cwd: pending.cwd,
194
- repoKey: pending.repoKey
194
+ repoKey: pending.repoKey,
195
+ sharedRepoKey: pending.sharedRepoKey
195
196
  });
196
197
  const body = await response.json();
197
198
  if (!response.ok || !record(body)) throw new Error("Native approval service unavailable");
@@ -2,13 +2,13 @@ import {
2
2
  SESSION_HISTORY_RETENTION_DAYS,
3
3
  readOwnerOnlyJson,
4
4
  savedTranscriptReadPositions
5
- } from "./chunk-PRH7XNAT.js";
5
+ } from "./chunk-OC47FGOY.js";
6
6
  import {
7
7
  ensureDaemonRunning
8
- } from "./chunk-OBRDREJD.js";
8
+ } from "./chunk-CFD3IESN.js";
9
9
  import {
10
10
  hookOwnerOf
11
- } from "./chunk-SF3FHCJJ.js";
11
+ } from "./chunk-5V2YDO4U.js";
12
12
  import {
13
13
  buildTranscriptRecords,
14
14
  decodePublicKey,
@@ -19,33 +19,33 @@ import {
19
19
  recordSealerFor,
20
20
  uploadTranscriptRecords,
21
21
  wrapSessionKey
22
- } from "./chunk-27232B7Y.js";
22
+ } from "./chunk-4PD7FP55.js";
23
23
  import {
24
24
  external_exports
25
25
  } from "./chunk-XMSDA5WA.js";
26
26
  import {
27
27
  transcriptEnvironmentPreference,
28
28
  transcriptsEnabled
29
- } from "./chunk-OGRGVEWA.js";
29
+ } from "./chunk-VMIWR724.js";
30
30
  import {
31
31
  readTranscriptPreference
32
- } from "./chunk-PETLGHDR.js";
32
+ } from "./chunk-LANGH7UF.js";
33
33
  import {
34
34
  hookMeaning
35
- } from "./chunk-KDN7AMAQ.js";
35
+ } from "./chunk-2BVVMWVF.js";
36
36
  import {
37
37
  claudeConfigDir,
38
38
  codexHome,
39
39
  pusharyDir
40
- } from "./chunk-LLVX57ZC.js";
40
+ } from "./chunk-CHVXLS7U.js";
41
41
  import {
42
42
  writeJsonAtomic,
43
43
  writeJsonAtomicDurable
44
- } from "./chunk-D4A277IY.js";
44
+ } from "./chunk-Y7AX6BS4.js";
45
45
  import {
46
46
  getApiKey,
47
47
  getBaseUrl
48
- } from "./chunk-KU2FFKWS.js";
48
+ } from "./chunk-NPZ5L2WQ.js";
49
49
  import {
50
50
  PENDING_COMMAND_PREFIX,
51
51
  SESSION_HISTORY_BACKFILL_LIMIT_BYTES,
@@ -53,7 +53,7 @@ import {
53
53
  isHookSource,
54
54
  isRecord,
55
55
  redactSecretsFromContent
56
- } from "./chunk-ABAIOLV5.js";
56
+ } from "./chunk-OMN5UCMW.js";
57
57
 
58
58
  // src/transcript-recipient-pin.ts
59
59
  import { createHash } from "crypto";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  findNativeClaudeInstall
3
- } from "./chunk-KRNY5Z6I.js";
3
+ } from "./chunk-66VEUAN5.js";
4
4
  import {
5
5
  parseVersion
6
- } from "./chunk-D4A277IY.js";
6
+ } from "./chunk-Y7AX6BS4.js";
7
7
  import {
8
8
  isRecord
9
- } from "./chunk-ABAIOLV5.js";
9
+ } from "./chunk-OMN5UCMW.js";
10
10
 
11
11
  // src/setup/agent-probe.ts
12
12
  import { execSync } from "child_process";
@@ -1,17 +1,19 @@
1
1
  import {
2
2
  localRepoKey,
3
- normalizeRepoRemote
4
- } from "./chunk-ABAIOLV5.js";
3
+ normalizeRepoRemote,
4
+ parseGitBranch
5
+ } from "./chunk-OMN5UCMW.js";
5
6
 
6
7
  // src/repo.ts
7
8
  import { existsSync, readFileSync, statSync } from "fs";
8
9
  import { basename, dirname, isAbsolute, join, resolve } from "path";
9
10
  var MAX_PARENT_WALK = 64;
10
11
  var GIT_FILE_PREFIX = "gitdir:";
12
+ var GIT_DIR_NAME = ".git";
11
13
  var findGitDir = (startDir) => {
12
14
  let current = resolve(startDir);
13
15
  for (let depth = 0; depth < MAX_PARENT_WALK; depth += 1) {
14
- const candidate = join(current, ".git");
16
+ const candidate = join(current, GIT_DIR_NAME);
15
17
  try {
16
18
  if (existsSync(candidate)) {
17
19
  if (statSync(candidate).isDirectory()) return candidate;
@@ -29,16 +31,28 @@ var findGitDir = (startDir) => {
29
31
  }
30
32
  return void 0;
31
33
  };
32
- var configPathFor = (gitDir) => {
33
- const index = gitDir.replace(/\\/g, "/").indexOf("/worktrees/");
34
- return index === -1 ? join(gitDir, "config") : join(gitDir.slice(0, index), "config");
34
+ var COMMON_DIR_FILE = "commondir";
35
+ var mainGitDirOf = (gitDir) => {
36
+ try {
37
+ const pointer = readFileSync(join(gitDir, COMMON_DIR_FILE), "utf-8").trim();
38
+ if (pointer.length === 0) return gitDir;
39
+ return isAbsolute(pointer) ? pointer : resolve(gitDir, pointer);
40
+ } catch {
41
+ return gitDir;
42
+ }
43
+ };
44
+ var configPathFor = (gitDir) => join(mainGitDirOf(gitDir), "config");
45
+ var GIT_DIR_SUFFIX = ".git";
46
+ var projectRootOf = (gitDir, cwd) => {
47
+ const mainGitDir = mainGitDirOf(gitDir);
48
+ if (basename(mainGitDir) === GIT_DIR_NAME) return dirname(mainGitDir);
49
+ return gitDir.endsWith(GIT_DIR_SUFFIX) ? dirname(gitDir) : cwd;
35
50
  };
36
51
  var ORIGIN_SECTION = /^\[remote "origin"\]/;
37
52
  var SECTION_HEADER = /^\[/;
38
53
  var URL_LINE = /^url\s*=\s*(.+)$/;
39
- var readOriginRemote = (gitDir) => {
54
+ var readConfiguredOrigin = (configPath) => {
40
55
  try {
41
- const configPath = configPathFor(gitDir);
42
56
  if (!existsSync(configPath)) return void 0;
43
57
  let inOrigin = false;
44
58
  for (const rawLine of readFileSync(configPath, "utf-8").split("\n")) {
@@ -55,6 +69,7 @@ var readOriginRemote = (gitDir) => {
55
69
  }
56
70
  return void 0;
57
71
  };
72
+ var readOriginRemote = (gitDir) => readConfiguredOrigin(configPathFor(gitDir));
58
73
  var deriveRepoKey = (cwd) => {
59
74
  const dir = cwd && cwd.length > 0 ? cwd : process.cwd();
60
75
  try {
@@ -63,8 +78,7 @@ var deriveRepoKey = (cwd) => {
63
78
  const remote = readOriginRemote(gitDir);
64
79
  const normalized = remote ? normalizeRepoRemote(remote) : void 0;
65
80
  if (normalized) return normalized;
66
- const root = gitDir.endsWith(".git") ? dirname(gitDir) : dir;
67
- return localRepoKey(basename(root));
81
+ return localRepoKey(basename(projectRootOf(gitDir, dir)));
68
82
  }
69
83
  return localRepoKey(basename(resolve(dir)));
70
84
  } catch {
@@ -86,7 +100,34 @@ var repoKeyFor = (cwd) => {
86
100
  repoKeyCache.set(dir, derived);
87
101
  return derived;
88
102
  };
103
+ function branchFor(cwd) {
104
+ try {
105
+ const gitDir = findGitDir(cwd || process.cwd());
106
+ if (!gitDir) return void 0;
107
+ const headPath = join(gitDir, "HEAD");
108
+ if (statSync(headPath).size > 1024) return void 0;
109
+ const head = readFileSync(headPath, "utf8").trim();
110
+ const prefix = "ref: refs/heads/";
111
+ return head.startsWith(prefix) ? parseGitBranch(head.slice(prefix.length)) : void 0;
112
+ } catch {
113
+ return void 0;
114
+ }
115
+ }
116
+ var repositoryScopeFor = (cwd) => {
117
+ const sharedRepoKey = repoKeyFor(cwd);
118
+ if (process.env[REPO_KEY_ENV]?.trim()) return { repoKey: sharedRepoKey };
119
+ const dir = cwd || process.cwd();
120
+ const gitDir = findGitDir(dir);
121
+ if (!gitDir) return { repoKey: sharedRepoKey };
122
+ const index = gitDir.replace(/\\/g, "/").indexOf("/worktrees/");
123
+ const path = index === -1 ? join(gitDir, "config") : join(gitDir.slice(0, index), "config");
124
+ const remote = readConfiguredOrigin(path);
125
+ const repoKey = (remote ? normalizeRepoRemote(remote) : void 0) ?? localRepoKey(basename(gitDir.endsWith(".git") ? dirname(gitDir) : dir));
126
+ return { repoKey, ...sharedRepoKey && repoKey !== sharedRepoKey ? { sharedRepoKey } : {} };
127
+ };
89
128
 
90
129
  export {
91
- repoKeyFor
130
+ repoKeyFor,
131
+ branchFor,
132
+ repositoryScopeFor
92
133
  };
@@ -7,7 +7,7 @@ import {
7
7
  recordSealerFor,
8
8
  uploadTranscriptRecords,
9
9
  wrapSessionKey
10
- } from "./chunk-27232B7Y.js";
10
+ } from "./chunk-4PD7FP55.js";
11
11
 
12
12
  // src/live-session.ts
13
13
  var MAX_TRANSCRIPT_QUEUE = 100;
@@ -6,18 +6,18 @@ import {
6
6
  McpToolError,
7
7
  SubscriptionRequiredError,
8
8
  callMcpTool
9
- } from "./chunk-EX76IRRF.js";
9
+ } from "./chunk-XTNCXIYR.js";
10
10
  import {
11
11
  installNetworkDefaults,
12
12
  isNetworkFailure
13
- } from "./chunk-OAWIPPYH.js";
13
+ } from "./chunk-CO6TQ44W.js";
14
14
  import {
15
15
  clientReportClaims
16
- } from "./chunk-LLVX57ZC.js";
16
+ } from "./chunk-CHVXLS7U.js";
17
17
  import {
18
18
  getApiKey,
19
19
  getBaseUrl
20
- } from "./chunk-KU2FFKWS.js";
20
+ } from "./chunk-NPZ5L2WQ.js";
21
21
  import {
22
22
  ASK_AGENT_NAME_MAX,
23
23
  CLIENT_REPORT_PATH,
@@ -26,7 +26,7 @@ import {
26
26
  TOOL_FAILURE_CODES,
27
27
  degradedLine,
28
28
  truncateLine
29
- } from "./chunk-ABAIOLV5.js";
29
+ } from "./chunk-OMN5UCMW.js";
30
30
 
31
31
  // src/api.ts
32
32
  import { randomUUID } from "crypto";
@@ -9,20 +9,20 @@ import {
9
9
  installedCodexApp,
10
10
  readCodexAppRuntime,
11
11
  shellQuoted
12
- } from "./chunk-B3IAV5CZ.js";
12
+ } from "./chunk-YT3ENXBT.js";
13
13
  import {
14
14
  writeHuman
15
15
  } from "./chunk-QCGNGEGE.js";
16
16
  import {
17
17
  xml
18
- } from "./chunk-OBRDREJD.js";
18
+ } from "./chunk-CFD3IESN.js";
19
19
  import {
20
20
  CODEX_APP_LAUNCH_AT_LOGIN_VERB,
21
21
  CODEX_APP_LAUNCH_VARIABLE
22
22
  } from "./chunk-E46NE7FB.js";
23
23
  import {
24
24
  writeFileAtomic
25
- } from "./chunk-D4A277IY.js";
25
+ } from "./chunk-Y7AX6BS4.js";
26
26
 
27
27
  // src/codex-app-cards-switch.ts
28
28
  import { execFileSync as execFileSync2 } from "child_process";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  parseSseMessages
3
- } from "./chunk-EX76IRRF.js";
3
+ } from "./chunk-XTNCXIYR.js";
4
4
  import {
5
5
  NPX_LATEST_COMMAND
6
- } from "./chunk-7ECQUETY.js";
6
+ } from "./chunk-NDPOESVW.js";
7
7
 
8
8
  // src/mcp-stdio-bridge.ts
9
9
  var MCP_BRIDGE_BINARY = "pushary-mcp";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  autoUpdateLock
3
- } from "./chunk-LLVX57ZC.js";
3
+ } from "./chunk-CHVXLS7U.js";
4
4
  import {
5
5
  installPackageGlobally,
6
6
  npmErrorMessage,
7
7
  writeJsonAtomic
8
- } from "./chunk-D4A277IY.js";
8
+ } from "./chunk-Y7AX6BS4.js";
9
9
 
10
10
  // src/upgrade-lock.ts
11
11
  import { fork } from "child_process";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  pusharyFetch
3
- } from "./chunk-OAWIPPYH.js";
3
+ } from "./chunk-CO6TQ44W.js";
4
4
  import {
5
5
  getBaseUrl
6
- } from "./chunk-KU2FFKWS.js";
6
+ } from "./chunk-NPZ5L2WQ.js";
7
7
  import {
8
8
  NetworkError
9
9
  } from "./chunk-PPY5N2E6.js";
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  isValidApiKey,
15
15
  normalizeKeyScope
16
- } from "./chunk-ABAIOLV5.js";
16
+ } from "./chunk-OMN5UCMW.js";
17
17
 
18
18
  // src/session.ts
19
19
  var samePusharyAccount = (left, right) => left.kind === "ok" && right.kind === "ok" && left.identity.workspaceId !== "" && left.identity.workspaceId === right.identity.workspaceId && left.identity.siteId === right.identity.siteId;