@inetafrica/open-claudia 3.0.27 → 3.0.28

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
+ ## v3.0.28 — /upgrade stops crying wolf on a slow roll
4
+
5
+ - **A client-side `/upgrade` timeout is no longer reported as a failure.** When the bot runs inside an AgentSpace pod, `/upgrade` calls the control plane, which triggers a fire-and-forget rollout and returns 202. If the pod is mid-roll its own in-flight request gets cut off, so the 15s HTTP wait would expire and the bot announced "Upgrade request failed … timeout" — a false negative that invited repeated re-runs (and a storm of redundant rollouts, seen as 11 ReplicaSets in 7 minutes). A timed-out request now surfaces as **pending** ("sent but the reply timed out — likely because I'm already restarting; give it a minute"), and the request timeout is raised 15s → 30s.
6
+ - **Pairs with a control-plane probe fix (the actual root cause).** The pod's `/health` probes carried no `timeoutSeconds`, so k8s defaulted it to 1s; a cold-start event-loop stall past 1s flapped the liveness probe and SIGTERM'd the pod in a restart loop. That fix — explicit `timeoutSeconds: 5` on every probe and liveness `failureThreshold` 3 → 5 — ships in the agent-space control plane and reaches existing pods on their next reconcile (`/cluster sync`).
7
+ - **Agent-space / OpenClaw:** no new deps, no new env, no schema change; Docker image builds identically (FROM the pre-baked `:base`). Existing pods pick this up on their next approved upgrade.
8
+
3
9
  ## v3.0.27 — Agency ledger, advisory "what's next", owner-guardrail capture, and a reboot that waits for the turn to end
4
10
 
5
11
  - **`/agenda` — one read-only work list across everything (Track B0).** A new aggregator normalises your persistent tasks, `spaces mine`, and connector inbox/notifications into a single list (source, title, status, due, staleness, blocked-on, last-touched). Pure visibility — it reads, it never acts. `/agency` is an alias.
package/core/handlers.js CHANGED
@@ -624,7 +624,7 @@ async function requestAgentSpaceUpgrade() {
624
624
  res.on("end", () => resolve({ status: res.statusCode, body: data }));
625
625
  });
626
626
  req.on("error", (e) => resolve({ status: 0, body: String(e.message || e) }));
627
- req.setTimeout(15000, () => { req.destroy(new Error("timeout")); });
627
+ req.setTimeout(30000, () => { req.destroy(new Error("timeout")); });
628
628
  req.end();
629
629
  });
630
630
  }
@@ -678,6 +678,14 @@ register({
678
678
  await send("Upgrade requested — AgentSpace will pull latest image and restart, see you in a minute.");
679
679
  return;
680
680
  }
681
+ // A client-side timeout is not a failure: the control plane triggers the
682
+ // rollout fire-and-forget, and a pod being rolled is exactly when its own
683
+ // in-flight request gets cut off. Framing it as "failed" invites a retry
684
+ // storm of redundant rollouts, so surface it as pending instead.
685
+ if (result && result.status === 0 && /timeout/i.test(result.body || "")) {
686
+ await send("Upgrade request sent but the reply timed out — likely because I'm already restarting. Give it a minute before re-running; I should come back on the new image.");
687
+ return;
688
+ }
681
689
  await send(`Upgrade request failed (status ${result?.status || "?"}). ${(result?.body || "").slice(0, 300)}`);
682
690
  return;
683
691
  } catch (e) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inetafrica/open-claudia",
3
- "version": "3.0.27",
3
+ "version": "3.0.28",
4
4
  "description": "An always-on, provider-agnostic coding-agent harness for Claude Code and OpenAI Codex via chat",
5
5
  "main": "bot.js",
6
6
  "bin": {
@@ -32,18 +32,17 @@ assert.doesNotMatch(setup, /Your Claude Code bot is connected|Description=Claude
32
32
 
33
33
  const pkg = JSON.parse(read("package.json"));
34
34
  assert.match(pkg.description, /provider-agnostic coding-agent harness/i);
35
- // 3.0.27 approved by Sumeet 2026-07-15 ("work through till it's done and push it
36
- // out"): the non-gated architecture batch. (1) X0 always-on prompt-budget
37
- // instrumentation: measure the fixed floor vs per-turn recall payload, telemetry
38
- // only (no prompt change, no trim). (2) B0 /agenda read-only work ledger
39
- // (tasks + Spaces + notifications). (3) B1 /next advisory deliberation that
40
- // proposes a pick and acts on nothing. (4) C0/C1 owner-guardrail capture:
41
- // "from now on / never / stop" statements become always-loaded lessons (asked or
42
- // auto-captured with announce + one-tap undo), owner-only, never from externals.
43
- // (5) Turn-aware reboot: the Telegram 10-min poll-wedge backstop defers its
44
- // self-exit while any turn is running/queued so a restart never interrupts
45
- // in-flight work. B2+ autonomy and Track A stay gated.
46
- assert.strictEqual(pkg.version, "3.0.27", "release version must remain unchanged without explicit approval");
35
+ // 3.0.28 approved by Sumeet 2026-07-15 ("Yep fix them up just ensure no data
36
+ // loss"): the bot-side half of the restart-loop fix. When /upgrade runs inside
37
+ // an AgentSpace pod it calls the control plane, which fires a rollout and
38
+ // returns 202; if the pod is mid-roll its own in-flight request is cut off, so
39
+ // the client HTTP wait expired and the bot announced "Upgrade request failed …
40
+ // timeout" a false negative that invited a retry storm of redundant rollouts.
41
+ // A timed-out request now surfaces as pending (not failed), and the request
42
+ // timeout is raised 15s->30s. Pairs with the control-plane probe fix (explicit
43
+ // timeoutSeconds + higher liveness threshold) that removes the root-cause
44
+ // SIGTERM flapping. No autonomy change; B2+ and Track A stay gated.
45
+ assert.strictEqual(pkg.version, "3.0.28", "release version must remain unchanged without explicit approval");
47
46
  for (const keyword of ["claude", "codex", "coding-agent", "provider-agnostic"]) {
48
47
  assert.ok(pkg.keywords.includes(keyword), `package keyword missing: ${keyword}`);
49
48
  }