pi-freeflow 1.22.4 → 1.23.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.23.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Adding more Cline logins is now easy. Every login gets its own slot (`default`, `slot-2`, `slot-3`, …) and requests roll across all of them, so a second or third account keeps you working when one hits its free daily limit. The sign-in prompt now shows the link to sign out of Cline in your browser (`/freeflow cline signout` prints it any time), which is what you need to approve the next account with a different email — or use a private window and keep the session you already have. `/freeflow cline accounts` shows each login's email so you can tell them apart.
8
+
3
9
  ## 1.22.4
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -177,6 +177,7 @@ The same command set works identically in OMP and Pi:
177
177
  /freeflow cline login # Sign in through the browser, save to the per-user pool
178
178
  /freeflow cline accounts # List saved Cline logins
179
179
  /freeflow cline logout # Remove a saved Cline login
180
+ /freeflow cline signout # Link to sign out of Cline in your browser (to add another account)
180
181
  /freeflow export [path] [--include-secrets] # Save the relay pool to a file (default freeflow-relays.json; passwords left out unless asked)
181
182
  /freeflow import <path> [--merge|--replace] [--dry-run] # Load a relay pool from a file (merge is default; replace asks first; dry-run previews only)
182
183
  ```
@@ -236,6 +237,8 @@ Keyless access. Short aliases work for every row (the full ID is in parentheses)
236
237
 
237
238
  Rotating per-account promo, direct only (never through the relay pool). Sign in through your browser with `/freeflow cline login`, manage with `/freeflow cline accounts` and `/freeflow cline logout`. Requests roll across saved logins when one hits its daily free limit.
238
239
 
240
+ Add as many logins as you want — each one gets its own slot (`default`, `slot-2`, `slot-3`, …) and a request that hits a limit on one rolls straight to the next. To sign in with a different email, sign out of Cline in that browser first (`/freeflow cline signout` prints the link), or use a private window so your current session stays put.
241
+
239
242
  | Model ID | Creator / Lab | Context | Max Output | Thinking | Vision |
240
243
  | :--- | :--- | :--- | :--- | :--- | :--- |
241
244
  | `cline-free/deepseek-v4.1-flash` | DeepSeek | **1M** (1.000.000) | **384K** (384.000) | `low/high/max` | ✅ |
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-freeflow",
3
3
  "type": "module",
4
- "version": "1.22.4",
4
+ "version": "1.23.0",
5
5
  "description": "Thin provider for OMP/Pi — model list + dumb relay proxy + log; host pi-ai owns thinking/normalization",
6
6
  "main": "extensions/index.ts",
7
7
  "types": "src/index.ts",
@@ -45,6 +45,16 @@ export const DEFAULT_WORKOS_BASE = "https://api.workos.com";
45
45
  export const DEFAULT_API_BASE = "https://api.cline.bot";
46
46
  export const WORKOS_TOKEN_PREFIX = "workos:";
47
47
 
48
+ /**
49
+ * Cline's own sign-out route, for switching accounts in the browser. Verified
50
+ * live: it answers 302 -> https://app.cline.bot/dashboard. Cline ships no
51
+ * hosted sign-out page on its auth host (every /logout, /sign-out, /signout,
52
+ * /account path there is 404), so this app route is the one to point at.
53
+ * The device flow reuses whatever account the browser is signed in with, and
54
+ * a private window clears that without ending the current session.
55
+ */
56
+ export const CLINE_BROWSER_SIGNOUT_URL = "https://api.cline.bot/api/v1/auth/logout";
57
+
48
58
  /** Env override for the WorkOS client id (wins over the bundled default). */
49
59
  export const CLINE_WORKOS_CLIENT_ID_ENV = "PI_FREEFLOW_CLINE_WORKOS_CLIENT_ID";
50
60
 
package/src/commands.ts CHANGED
@@ -60,7 +60,7 @@ import {
60
60
  } from "./relay-state.ts";
61
61
  import { addAccount, loadPool, redactedToken, removeAccount } from "./cline-accounts.ts";
62
62
  import type { ClinePoolState } from "./cline-accounts.ts";
63
- import { pollDeviceToken, registerClineToken, startDeviceAuth, toApiKey } from "./cline-device-auth.ts";
63
+ import { CLINE_BROWSER_SIGNOUT_URL, pollDeviceToken, registerClineToken, startDeviceAuth, toApiKey } from "./cline-device-auth.ts";
64
64
  import { isCertError } from "./system-ca-fetch.ts";
65
65
  import type {
66
66
  ExtensionAPI,
@@ -1463,7 +1463,7 @@ export function createCommandSpec(
1463
1463
  }
1464
1464
  const link = started.verificationUriComplete ?? started.verificationUri;
1465
1465
  const minutes = Math.max(1, Math.round(started.expiresIn / 60));
1466
- const loginLine = `Cline login [${slot}]\nOpen this link in your browser:\n${link}\nEnter code: ${started.userCode} (expires in ~${minutes} min)\nWaiting for approval — approve or cancel in the browser; this finishes on its own.`;
1466
+ const loginLine = `Cline login [${slot}]\nOpen this link in your browser:\n${link}\nEnter code: ${started.userCode} (expires in ~${minutes} min)\nWaiting for approval — approve or cancel in the browser; this finishes on its own.\nDifferent account? Sign out first: ${CLINE_BROWSER_SIGNOUT_URL} (or use a private window)`;
1467
1467
  ctx.ui.notify(loginLine, "info");
1468
1468
  try { ctx.ui.setStatus("cline-login", `Cline login [${slot}] code ${started.userCode}`); } catch { }
1469
1469
  const progress = setInterval(() => {
@@ -1550,8 +1550,15 @@ export function createCommandSpec(
1550
1550
  }
1551
1551
  }
1552
1552
  }
1553
+ } else if (action === "signout" || action === "sign-out" || action === "switch") {
1554
+ // Signing out is a browser action; it never touches saved logins here.
1555
+ const saved = loadPool().accounts.length;
1556
+ ctx.ui.notify(
1557
+ `Sign out of Cline in your browser to use a different account:\n${CLINE_BROWSER_SIGNOUT_URL}\nA private window works too, and keeps your current session.\nThen run /freeflow cline login again — each login gets its own slot (${saved ? `you have ${saved}; next is ` : "next is "}${nextClineSlot(loadPool())}).`,
1558
+ "info",
1559
+ );
1553
1560
  } else {
1554
- ctx.ui.notify("Usage: /freeflow cline login [--key] [slot] | /freeflow cline accounts | /freeflow cline logout [slot]", "warning");
1561
+ ctx.ui.notify("Usage: /freeflow cline login [--key] [slot] | /freeflow cline accounts | /freeflow cline logout [slot] | /freeflow cline signout", "warning");
1555
1562
  }
1556
1563
  } else if (sub === "export") {
1557
1564
  const tokens = rest.trim() ? rest.trim().split(/\s+/) : [];