browser-cookie-bridge 1.5.4 → 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.4",
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.4</string>
14
- <key>CFBundleVersion</key><string>41</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>
@@ -758,12 +758,14 @@ final class SyncModel: ObservableObject {
758
758
  self.secondaryStatus = "No cloud profile was changed; temporary profile data was removed"
759
759
  } else if success {
760
760
  self.state = partial ? .warning : .success
761
- if self.isGrokBotTarget, let result = self.parseGrokBotResult(from: output) {
762
- self.grokBotPrompt = result.prompt
763
- self.grokBotOutputPath = result.outputPath
764
- 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
765
766
  self.primaryStatus = partial ? "Grok Bot transfer created with warnings" : "Grok Bot transfer file ready"
766
767
  self.secondaryStatus = self.lastMeaningfulLine(output) ?? "Attach the .bcbx file to any Grok Bot and paste the prompt"
768
+ self.presentGrokBotResultSheet()
767
769
  } else {
768
770
  self.primaryStatus = self.isBrowserlessTarget
769
771
  ? (partial ? "Browserless profile uploaded with omissions" : "Browserless profile uploaded")
@@ -1169,6 +1171,21 @@ final class SyncModel: ObservableObject {
1169
1171
  isDirectTarget || selectedTargetID == "browserless" || isGrokBotTarget ? [] : [selectedSourceID, selectedTargetID]
1170
1172
  }
1171
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
+
1172
1189
  private struct GrokBotResultPayload: Decodable {
1173
1190
  let outputPath: String
1174
1191
  let prompt: String
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-cookie-bridge",
3
- "version": "1.5.4",
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;