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
|
package/dist/sessions.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
1397
|
-
|
|
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;
|