@inetafrica/open-claudia 3.0.19 → 3.0.20

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.20 — Spaces answers tags, and knows the owner
4
+
5
+ - **A tag now actually gets a reply.** The Spaces server labels notifications with **plural** categories (`mentions`, `comments`, `reactions`, `task_updated`), but the conversational plane's engage set only matched the singular `mention` — so every real `@`-tag was silently downgraded to awareness-only and the bot never spoke. `ENGAGE_TYPES` now matches the plural forms (`mentions`/`replies`, singular aliases kept for safety). Plain comments, reactions and task updates stay awareness-only, so the "untagged comments hit the radar without auto-answering" rule is unchanged. Confirmed live: a real `mentions` notification was arriving and being dropped.
6
+ - **The owner is recognised on Spaces.** Spaces principals are central/Kazee user ids, but `isConfiguredOwnerChannel` had no `spaces` branch, so the owner's own comments resolved to a fresh `spaces:<id>` canonical instead of their owner identity — classing the owner as **external** (default-deny) on every Spaces task. Added a `spaces` branch mapping to `KAZEE_OWNER_USER_ID` (the same id Spaces/Kazee/central share), so the owner is recognised, their Spaces turns unify into their one canonical brain, and the relationship guardrail no longer misfires on them.
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.19 — flattened to the top level (the folder-project model is gone)
4
10
 
5
11
  - **The bot always runs at the top-level workspace now — no more "Pick a project first."** The per-folder session model (pick a subfolder of `WORKSPACE`, scope the conversation to it) has been removed. `currentSession` defaults to the workspace root (`{ name: "Workspace", dir: WORKSPACE }`) at state creation and on every migration/load, so it is never null. This directly fixes Spaces (and any non-Telegram channel that never picked a folder) replying with a dead "Pick a project first:" project-picker instead of engaging — the picker gate was the only thing blocking it.
@@ -21,8 +21,14 @@ const { SpacesClient, contentText } = require("./client");
21
21
  const { createSpacesSocket } = require("./socket");
22
22
  const spacesState = require("./state");
23
23
 
24
- // Notification `type`/`category` values that warrant a full agent turn.
25
- const ENGAGE_TYPES = new Set(["mention", "reply", "task_assigned"]);
24
+ // Notification `type`/`category` values that warrant a full agent turn. The
25
+ // Spaces server emits PLURAL categories (mentions, comments, reactions,
26
+ // task_updated), so the engage set must match the plural forms — matching only
27
+ // the singular "mention" silently dropped every real tag. Singular aliases are
28
+ // kept in case a socket payload ever uses them. Awareness-only types (comments,
29
+ // reactions, task_updated) are deliberately absent: they update the cursor but
30
+ // never auto-reply.
31
+ const ENGAGE_TYPES = new Set(["mention", "mentions", "reply", "replies", "task_assigned"]);
26
32
 
27
33
  class SpacesAdapter {
28
34
  constructor({ id = "spaces", url = "https://api.spaces.kazee.africa", token, ownerUserId = "", taskLoopMode = "advisory", pollMs }) {
package/core/identity.js CHANGED
@@ -46,6 +46,10 @@ function isConfiguredOwnerChannel(transport, channelId) {
46
46
  try { cfg = require("./config"); } catch (e) { return false; }
47
47
  if (t === "telegram") return (cfg.CHAT_IDS || []).map(String).includes(c);
48
48
  if (t === "kazee") return !!cfg.config.KAZEE_OWNER_USER_ID && c === String(cfg.config.KAZEE_OWNER_USER_ID);
49
+ // Spaces principals are central/Kazee user ids, so the owner's Spaces actor id
50
+ // is the same configured Kazee owner id — recognise them on Spaces too, else
51
+ // the owner's own comments are classed external (default-deny).
52
+ if (t === "spaces") return !!cfg.config.KAZEE_OWNER_USER_ID && c === String(cfg.config.KAZEE_OWNER_USER_ID);
49
53
  if (t === "voice") return c === String(cfg.config.VOICE_OWNER_USER_ID || "voice-owner");
50
54
  // Web dashboard chat: fixed single-owner channel gated by the dashboard
51
55
  // session, so its identity is operator-implied rather than env-declared.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inetafrica/open-claudia",
3
- "version": "3.0.19",
3
+ "version": "3.0.20",
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,15 +32,14 @@ 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.19 approved by Sumeet 2026-07-14 ("Rip it out"): the per-folder
36
- // project/session model is removed. The bot always runs at the top-level
37
- // workspace currentSession defaults to { name: "Workspace", dir: WORKSPACE }
38
- // and is never null which fixes Spaces (and any channel that never picked a
39
- // folder) replying with a dead "Pick a project first:" picker. Removed
40
- // /projects, /session, the project keyboard, the show:projects/s: callbacks,
41
- // the router's five session gates, and core/projects.js. Conversation-level
42
- // controls (/sessions, /new, /continue, /end) are unchanged.
43
- assert.strictEqual(pkg.version, "3.0.19", "release version must remain unchanged without explicit approval");
35
+ // 3.0.20 approved by Sumeet 2026-07-14 ("Yeh push it"): two Spaces fixes. (1)
36
+ // The Spaces server emits PLURAL notification categories (mentions/comments/
37
+ // reactions), so ENGAGE_TYPES now matches "mentions"/"replies" matching only
38
+ // singular "mention" silently dropped every real tag. (2) isConfiguredOwnerChannel
39
+ // gained a "spaces" branch mapping to KAZEE_OWNER_USER_ID (Spaces principals are
40
+ // central/Kazee ids), so the owner is no longer classed external (default-deny)
41
+ // on their own Spaces comments. 3.0.19 flattened the folder-project model.
42
+ assert.strictEqual(pkg.version, "3.0.20", "release version must remain unchanged without explicit approval");
44
43
  for (const keyword of ["claude", "codex", "coding-agent", "provider-agnostic"]) {
45
44
  assert.ok(pkg.keywords.includes(keyword), `package keyword missing: ${keyword}`);
46
45
  }