clauderipple 0.12.7 → 0.12.8

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,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.8 — 2026-10-22
4
+
5
+ ### Fixed
6
+
7
+ - **A Workflow script's agents go to the worker their marker names.** Claude Code wraps a workflow
8
+ agent's prompt in a harness frame, so a `[[ripple: gemini-3-8-flash@high]]` on the script's first
9
+ line was no longer at the top of a message and every agent ran on the session's model. The router
10
+ now reads the marker from the first line under that frame.
11
+
3
12
  ## 0.12.7 — 2026-10-22
4
13
 
5
14
  ### Fixed
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "private": true,
3
- "version": "0.12.7",
3
+ "version": "0.12.8",
4
4
  "type": "commonjs"
5
5
  }
@@ -14,6 +14,12 @@ const REMINDER = /<system-reminder>[\s\S]*?<\/system-reminder>/g;
14
14
  // with it; a compaction summary that *quotes* one does not, and on 2026-09-20 such a quote in a
15
15
  // GPT-6 Astra session's summary re-routed the whole session to `muse` on ChatGPT (400 on every turn).
16
16
  const MARKER = /^\s*\[\[\s*(?:ripple|gpt)\s*:\s*([A-Za-z0-9.\-]+)\s*(?:@\s*([A-Za-z]+))?\s*\]\]/;
17
+ // A Workflow script's agent gets its prompt inside the harness's frame (CLI 2.1.308, 2026-10-22): a
18
+ // relayed user request, then one header line ending "The computed task text follows:" and the
19
+ // script's text with every line indented. The script's first line is that prompt's top, as a spawned
20
+ // subagent's is; read from above the header, a `[[ripple: gemini-3-8-flash@high]]` there was missed
21
+ // and eight workers ran on the session's Opus.
22
+ const WORKFLOW_TASK = /^\s*\[Workflow harness — computed task\][^\n]*\n/;
17
23
  /** The raw `[[ripple: <name>@<effort>]]` the body carries, name lowercased. Does not resolve it. */
18
24
  function scanMarker(body) {
19
25
  const messages = body?.messages;
@@ -26,12 +32,14 @@ function scanMarker(body) {
26
32
  if (++seen > 5)
27
33
  break; // the task prompt is always near the top
28
34
  const c = m.content;
29
- const text = typeof c === "string"
30
- ? c
35
+ const parts = typeof c === "string"
36
+ ? [c]
31
37
  : Array.isArray(c)
32
- ? c.filter((b) => b && b.type === "text").map((b) => b.text ?? "").join(" ")
33
- : "";
34
- const hit = MARKER.exec(text.replace(REMINDER, ""));
38
+ ? c.filter((b) => b && b.type === "text").map((b) => b.text ?? "")
39
+ : [];
40
+ // Claude Code may merge the frame's two turns into one message, so each block is looked at alone.
41
+ const framed = parts.map((p) => p.replace(REMINDER, "")).find((p) => WORKFLOW_TASK.test(p));
42
+ const hit = MARKER.exec(parts.join(" ").replace(REMINDER, "")) ?? (framed ? MARKER.exec(framed.replace(WORKFLOW_TASK, "")) : null);
35
43
  if (hit) {
36
44
  const name = hit[1].toLowerCase();
37
45
  const effort = hit[2]?.toLowerCase();
@@ -5,4 +5,4 @@
5
5
  // from the manifests. Until 0.1.1 the router and the CLI each carried their own literal, and both
6
6
  // still said "0.1.0" in the 0.1.1 release: after an update nobody could tell which router was
7
7
  // running, and the tray app had nothing to compare (2026-09-15, reported from a Windows install).
8
- export const VERSION = "0.12.7";
8
+ export const VERSION = "0.12.8";
@@ -1651,6 +1651,7 @@ plan unless marked otherwise.
1651
1651
  | Android hotspot never recognised (2026-10-20, found by reading the code for an owner with Windows laptops and Android phones in mind): "on the hotspot" was the iPhone range 172.20.10.0/28 alone, on macOS and Windows. An Android hotspot hands out 192.168.43.x (≤ Android 10) or a random /24 (Android 11+; 192.168/16, 172.16/12, 10/8 by Android 14), so after our own failover `join()` saw no hotspot address and reported `join-failed`/`hotspot-not-visible`, while on the phone the controller read Wi-Fi and never planned the way back, and a by-hand join was never recognised | The product does not assume an iPhone. After our own join of the configured SSID is accepted by the OS, a new, non-link-local address within the settle time is the join, and its subnet (address + netmask from `os.networkInterfaces()`: no Location, no elevation) is kept in `<home>/tether.json` for that hotspot name; "on the hotspot" = iPhone range OR that network (§8). Only our own join replaces it, and a subnet equal to the Wi-Fi watched before is not remembered (logged as ambiguous) so home Wi-Fi is never read as the hotspot. Hints name both phones where the step differs. Not yet run with a real Android phone. |
1652
1652
  | An expired Claude login on the Mac wrote `[desktop state] …로그인이 만료되었습니다…` every few seconds per Claude app session and read the keychain (a synchronous child process) for every request, while phones learned of it only by a failed send (2026-10-15) | A login problem is one host state: logged when it starts and ends, sent to phones as `HostInfo.desktopProblem` (a banner), and the keychain is reread at most every 30 s while expired or after a 401. Per-session Remote Control errors log once per change. The host never refreshes the login itself. |
1653
1653
  | OpenCode Go answered **402** for `minimax-m3.1-flash-free` while that model's endpoint was down (`server_error … Upstream request failed: Endpoint is unavailable`); read as billing exhaustion, it parked the whole `opencode-go` account for 30 minutes, DeepSeek with it, and delegated work fell back to Opus while the account had credit (2026-10-22) | A relay's refusal whose body says its upstream failed (`RELAY_UPSTREAM_FAILED`, `pool.ts`) is transient whatever status it carries — 402 as well as 403 — and never a provider exhaustion (`health.ts`). A plain 402 or a body naming balance, billing or quota still is. |
1654
+ | A Workflow script sent eight agents with `[[ripple: gemini-3-8-flash@high]]` as the prompt's first line (and `subagent_type`, which `agent()` does not take — its option is `agentType`); all eight ran on the session's Opus. CLI 2.1.308 frames a workflow agent's prompt: a relayed user request, then a `[Workflow harness — computed task] … follows:` header line, then the script's text indented — so no user message started with the marker (2026-10-22) | A text block that starts with that header is read from the line after it: the script's first line is the prompt's top, as a spawned subagent's is (`routing.ts`, `WORKFLOW_TASK`). Only a block that *starts* with the header counts — the harness indents everything inside, so a header quoted lower down is prose. |
1654
1655
 
1655
1656
  ### Router-owned automatic updates (2026-10-21)
1656
1657
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clauderipple",
3
- "version": "0.12.7",
3
+ "version": "0.12.8",
4
4
  "description": "Use GPT (any ChatGPT plan with Codex), DeepSeek and 400+ other models in the Claude Desktop Code tab and Claude Code while staying signed in to your Claude subscription — no third-party gateway mode. Several ChatGPT accounts that take over when one runs out, in Codex too.",
5
5
  "license": "GPL-3.0-only",
6
6
  "workspaces": [