antechamber 1.0.32 → 1.0.34

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
@@ -7,6 +7,24 @@ and this project uses [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.0.34] - 2026-11-02
11
+
12
+ ### Fixed
13
+
14
+ - Show a session's subagents under that session. A session list that OpenChamber sent while a new session's agent
15
+ was still starting could adopt the agent's file as a second copy of the session, and subagents started
16
+ later were filed under that copy, so the session showed none of them.
17
+
18
+ ## [1.0.33] - 2026-11-02
19
+
20
+ ### Fixed
21
+
22
+ - Stop showing replies twice, and keep new messages and `!` shell commands at the end of the conversation, in a
23
+ session that has a shell command OmO never reported back (for example one stopped by the old one-minute deadline).
24
+ Every read of the conversation re-parsed the session file without the live replies, so each reply read mid-turn
25
+ gained a second, restored copy, and those copies piled up after newer messages. Restart OpenChamber's adapter to
26
+ clear copies already in memory.
27
+
10
28
  ## [1.0.32] - 2026-10-29
11
29
 
12
30
  ### Fixed
@@ -225,6 +225,7 @@ export declare class SessionManager {
225
225
  private reviveLive;
226
226
  /** Record, persist and show a stop that no exit handler will report. */
227
227
  private reportStop;
228
+ /** `reparse` rebuilds from the JSONL while `s.messages` stays visible, so the binder can reuse live ids. */
228
229
  private ensureMessages;
229
230
  /**
230
231
  * The stop notice card. Its id derives from the stop time, so the live card and every replay after a
package/dist/sessions.js CHANGED
@@ -140,6 +140,19 @@ export class SessionManager {
140
140
  ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),
141
141
  ...(parentID !== undefined ? { parentID } : {}),
142
142
  };
143
+ // OmO writes its session file before it answers get_state, so a session list in that window can adopt the file
144
+ // as a dormant session under the md5 id. Child tasks would then attach to that twin, not to this session.
145
+ if (piSessionId !== undefined) {
146
+ for (const [key, twin] of this.sessions) {
147
+ if (twin.pi !== undefined || twin.restored?.piSessionId !== piSessionId)
148
+ continue;
149
+ this.sessions.delete(key);
150
+ if (this.store.get(key) !== undefined)
151
+ this.store.remove(key);
152
+ if (key !== info.id)
153
+ this.emit(twin.info.directory, { type: "session.deleted", properties: { info: twin.info } });
154
+ }
155
+ }
143
156
  const managed = {
144
157
  tree: { messageEntries: {} },
145
158
  titleSource: title?.trim() ? "user" : "fallback",
@@ -1324,7 +1337,8 @@ export class SessionManager {
1324
1337
  properties: { sessionID: s.info.id, error: { name: "AgentStoppedError", data: { message } } },
1325
1338
  });
1326
1339
  }
1327
- ensureMessages(s) {
1340
+ /** `reparse` rebuilds from the JSONL while `s.messages` stays visible, so the binder can reuse live ids. */
1341
+ ensureMessages(s, reparse = false) {
1328
1342
  if (this.subagents.owns(s.info.id))
1329
1343
  return this.subagents.messages(s.info.id);
1330
1344
  if (this.monitors.owns(s.info.id))
@@ -1334,9 +1348,9 @@ export class SessionManager {
1334
1348
  const dormantPath = s.pi === undefined ? s.restored?.piPath : undefined;
1335
1349
  const fileSize = dormantPath === undefined ? undefined : statSync(dormantPath, { throwIfNoEntry: false })?.size;
1336
1350
  const cachedFileSize = s.historyFileSize ?? s.tree.fileSize;
1337
- if (s.messages !== undefined && fileSize !== undefined && fileSize !== cachedFileSize)
1351
+ if (!reparse && s.messages !== undefined && fileSize !== undefined && fileSize !== cachedFileSize)
1338
1352
  return this.refreshMessageCache(s, true);
1339
- if (s.messages === undefined) {
1353
+ if (s.messages === undefined || reparse) {
1340
1354
  // A dormant session may have been continued by another OmO client since the last save.
1341
1355
  if (s.pi === undefined && s.restored !== undefined)
1342
1356
  followExternalAppends(s, s.restored.piPath);
@@ -1393,8 +1407,9 @@ export class SessionManager {
1393
1407
  }
1394
1408
  refreshMessageCache(s, replaceNative = false) {
1395
1409
  const previous = s.messages ?? [];
1396
- s.messages = undefined;
1397
- const native = this.ensureMessages(s);
1410
+ // Keep the live list during the re-parse: with a pending shell turn the parse binds entries to visible
1411
+ // messages, and an empty list would give every unbound live reply a second, restored `_r` copy.
1412
+ const native = this.ensureMessages(s, true);
1398
1413
  if (replaceNative) {
1399
1414
  // Legacy compaction IDs can collide; retain every parsed native row.
1400
1415
  let index = 0;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antechamber-omo-compat",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "description": "OpenChamber extension: displays OmO tool calls the way OmO means them when OpenChamber runs on antechamber",
5
5
  "private": true,
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antechamber-omo-graph",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "description": "OpenChamber extension: live, interactive graph of the OmO sub-agents behind the current session",
5
5
  "private": true,
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antechamber-omo-work",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "description": "OpenChamber 2.x Work Status section: OmO todo phases, monitors, eval cells and background work of the current session",
5
5
  "private": true,
6
6
  "type": "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antechamber",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "description": "OpenCode-compatible HTTP/SSE server that lets OpenChamber drive the pi coding agent (and OmO) over RPC",
5
5
  "type": "module",
6
6
  "license": "MIT",