browser-cookie-bridge 1.5.3 → 1.5.5

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Browser Cookie Bridge",
4
- "version": "1.5.3",
4
+ "version": "1.5.5",
5
5
  "description": "Transfers selected browser data locally between supported browsers and embedded app browsers.",
6
6
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5o6lDkXzU/23Jm2QRk4mfuxNnr3VlEIjRHcZr93Gdo7PI7asHJQhigaMGT6UOz0lkaTn1F+TGIPlsJo9GNBSsxbCfxWoBSXcFQFrPolY5LEfKaMtZQQ6eb4UAnp+bbUwb1den4On0piWU47Yzl6i0Jcdg4EG5H1kCSF/6nJsbKgF7OTaR/3drULu40yRvflzSXRhly3UDO7c5mgHJsaMwVV+VILsxbcPOoRINjuo3zDC737HFs67dpf38xF3tjSVL0HURAWKKobMvfABiDfVEm5O0Lvf+57d1Ib12QLT2qtVXNDy3iYwX+w2S0wH2vIMsfvoFPlRdmeqft70kZOqXwIDAQAB",
7
7
  "permissions": ["alarms", "cookies", "history"],
@@ -10,8 +10,8 @@
10
10
  <key>CFBundleInfoDictionaryVersion</key><string>6.0</string>
11
11
  <key>CFBundleName</key><string>Browser Cookie Bridge</string>
12
12
  <key>CFBundlePackageType</key><string>APPL</string>
13
- <key>CFBundleShortVersionString</key><string>1.5.3</string>
14
- <key>CFBundleVersion</key><string>40</string>
13
+ <key>CFBundleShortVersionString</key><string>1.5.5</string>
14
+ <key>CFBundleVersion</key><string>42</string>
15
15
  <key>LSMinimumSystemVersion</key><string>13.5</string>
16
16
  <key>NSHighResolutionCapable</key><true/>
17
17
  </dict>
@@ -691,9 +691,11 @@ final class SyncModel: ObservableObject {
691
691
  private func startGrokBotExport(showMenuBarAlert: Bool) {
692
692
  let panel = NSSavePanel()
693
693
  panel.title = "Save Grok Bot transfer file"
694
- panel.nameFieldStringValue = "GrokBot-Import.bcbx"
694
+ // Base name only: including ".bcbx" here plus allowedContentTypes often makes macOS append a second extension (GrokBot-Import.bcbx.bcbx) and breaks Replace on an existing file.
695
+ panel.nameFieldStringValue = "GrokBot-Import"
695
696
  panel.canCreateDirectories = true
696
697
  panel.isExtensionHidden = false
698
+ panel.allowsOtherFileTypes = false
697
699
  if #available(macOS 12.0, *) {
698
700
  panel.allowedContentTypes = [UTType(filenameExtension: "bcbx") ?? .data]
699
701
  } else {
@@ -756,12 +758,14 @@ final class SyncModel: ObservableObject {
756
758
  self.secondaryStatus = "No cloud profile was changed; temporary profile data was removed"
757
759
  } else if success {
758
760
  self.state = partial ? .warning : .success
759
- if self.isGrokBotTarget, let result = self.parseGrokBotResult(from: output) {
760
- self.grokBotPrompt = result.prompt
761
- self.grokBotOutputPath = result.outputPath
762
- self.showingGrokBotResult = true
761
+ if self.isGrokBotTarget {
762
+ let parsed = self.parseGrokBotResult(from: output)
763
+ let outputPath = parsed?.outputPath ?? grokBotOutputPath ?? self.grokBotOutputPath
764
+ self.grokBotOutputPath = outputPath
765
+ self.grokBotPrompt = parsed?.prompt ?? Self.grokBotFallbackPrompt
763
766
  self.primaryStatus = partial ? "Grok Bot transfer created with warnings" : "Grok Bot transfer file ready"
764
767
  self.secondaryStatus = self.lastMeaningfulLine(output) ?? "Attach the .bcbx file to any Grok Bot and paste the prompt"
768
+ self.presentGrokBotResultSheet()
765
769
  } else {
766
770
  self.primaryStatus = self.isBrowserlessTarget
767
771
  ? (partial ? "Browserless profile uploaded with omissions" : "Browserless profile uploaded")
@@ -1167,6 +1171,21 @@ final class SyncModel: ObservableObject {
1167
1171
  isDirectTarget || selectedTargetID == "browserless" || isGrokBotTarget ? [] : [selectedSourceID, selectedTargetID]
1168
1172
  }
1169
1173
 
1174
+ private static let grokBotFallbackPrompt = """
1175
+ On your Grok Bot cloud computer only — do not access my local Mac and do not print cookie values.
1176
+
1177
+ 1. Save the attached GrokBot-Import.bcbx to the cloud computer.
1178
+ 2. Unzip it: unzip -o GrokBot-Import.bcbx -d bcb-import && cd bcb-import
1179
+ 3. Run: node import.mjs
1180
+ 4. Report only how many cookies were imported per domain, then delete the bcb-import folder and any copies of the bundle.
1181
+ """
1182
+
1183
+ private func presentGrokBotResultSheet() {
1184
+ DispatchQueue.main.async { [weak self] in
1185
+ self?.showingGrokBotResult = true
1186
+ }
1187
+ }
1188
+
1170
1189
  private struct GrokBotResultPayload: Decodable {
1171
1190
  let outputPath: String
1172
1191
  let prompt: String
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-cookie-bridge",
3
- "version": "1.5.3",
3
+ "version": "1.5.5",
4
4
  "description": "Local-first cookie and session transfer for macOS with optional Browserless upload",
5
5
  "type": "module",
6
6
  "bin": {
package/src/cli.js CHANGED
@@ -13,6 +13,7 @@ import { isChromiumBrowserRunning, readChromiumProfile } from "./chromium-reader
13
13
  import { uploadBrowserlessProfile } from "./browserless.js";
14
14
  import { inspectBrowserlessProfile } from "./browserless-preflight.js";
15
15
  import {
16
+ formatGrokBotResultLine,
16
17
  grokBotSummary,
17
18
  writeGrokBotBundle,
18
19
  } from "./grok-bot-export.js";
@@ -310,13 +311,10 @@ async function sync(args, { signal } = {}) {
310
311
  });
311
312
  result.sourceCookieSkipped = payload.cookieStats.skipped;
312
313
  console.log(grokBotSummary(result));
313
- console.log(`BCB_GROK_RESULT ${JSON.stringify({
314
+ console.log(formatGrokBotResultLine({
314
315
  outputPath: result.outputPath,
315
- cookieCount: result.cookieCount,
316
- domainCount: result.domainCount,
317
- domains: result.domains,
318
316
  prompt: result.prompt,
319
- })}`);
317
+ }));
320
318
  return result;
321
319
  }
322
320
  if (target === "browserless") {
@@ -157,6 +157,11 @@ export function grokBotSummary(result) {
157
157
  return `Grok Bot transfer file created: ${result.cookieCount} cookies across ${domainNote} from ${result.sourceBrowser}.${skipped} Attach ${path.basename(result.outputPath)} to any Grok Bot and paste the prompt. The bundle includes the decryption key—treat the file as credentials and do not share it.`;
158
158
  }
159
159
 
160
+ /** Machine-readable sync result for the macOS app (keep small — no domain lists). */
161
+ export function formatGrokBotResultLine({ outputPath, prompt }) {
162
+ return `BCB_GROK_RESULT ${JSON.stringify({ outputPath, prompt })}`;
163
+ }
164
+
160
165
  export function filterCookies(cookies, onlyDomains = []) {
161
166
  const domains = normalizeDomainFilters(onlyDomains);
162
167
  if (!domains.length) return cookies;