antechamber 1.0.6 → 1.0.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
|
@@ -7,6 +7,17 @@ and this project uses [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.0.8] - 2026-10-20
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Allow messages in restored sessions whose active goal has already resumed a response, without
|
|
15
|
+
rejecting the send as a session-tree navigation.
|
|
16
|
+
|
|
17
|
+
## [1.0.7] - 2026-10-20
|
|
18
|
+
|
|
19
|
+
- fix(session): defer registry snapshots for cached lookups (#54)
|
|
20
|
+
|
|
10
21
|
## [1.0.6] - 2026-10-20
|
|
11
22
|
|
|
12
23
|
- docs: integrate the OmO Work extension across the docs (#55)
|
|
@@ -15,6 +26,8 @@ and this project uses [Semantic Versioning](https://semver.org/).
|
|
|
15
26
|
|
|
16
27
|
### Fixed
|
|
17
28
|
|
|
29
|
+
- Avoid copying the entire session registry for cached session lookups, preventing session lists
|
|
30
|
+
from blocking transcript loading after startup.
|
|
18
31
|
- Reduce startup CPU usage and boot delays for large session histories by committing restoration metadata
|
|
19
32
|
in one registry write, while preserving restored costs, child sessions and independent registry writers.
|
|
20
33
|
|
package/dist/session-store.js
CHANGED
|
@@ -385,8 +385,10 @@ export class SessionStore {
|
|
|
385
385
|
this.file = join(dir, "sessions.json");
|
|
386
386
|
}
|
|
387
387
|
load() {
|
|
388
|
-
if (this.batchState !== undefined)
|
|
388
|
+
if (this.batchState !== undefined) {
|
|
389
|
+
this.batchState.entries ??= structuredClone((this.entries ??= this.readEntries()));
|
|
389
390
|
return this.batchState.entries;
|
|
391
|
+
}
|
|
390
392
|
if (this.entries !== undefined)
|
|
391
393
|
return this.entries;
|
|
392
394
|
this.entries = this.readEntries();
|
|
@@ -457,7 +459,7 @@ export class SessionStore {
|
|
|
457
459
|
mutate(change) {
|
|
458
460
|
if (this.batchState !== undefined) {
|
|
459
461
|
this.batchState.changes.push(change);
|
|
460
|
-
change(this.
|
|
462
|
+
change(this.load());
|
|
461
463
|
return;
|
|
462
464
|
}
|
|
463
465
|
this.withRegistryLock(() => {
|
|
@@ -472,7 +474,7 @@ export class SessionStore {
|
|
|
472
474
|
if (this.batchState !== undefined)
|
|
473
475
|
return action();
|
|
474
476
|
const changes = [];
|
|
475
|
-
const batch = { entries:
|
|
477
|
+
const batch = { entries: undefined, changes };
|
|
476
478
|
this.batchState = batch;
|
|
477
479
|
try {
|
|
478
480
|
const result = action();
|
package/dist/sessions.js
CHANGED
|
@@ -14,7 +14,7 @@ import { SessionLifecycle } from "./lifecycle.js";
|
|
|
14
14
|
import { ApprovalBridge, extensionUiRequestFrom } from "./approvals.js";
|
|
15
15
|
import { getAgentName, getExposedAgentNames } from "./agent-name.js";
|
|
16
16
|
import { RequestBodyError } from "./http.js";
|
|
17
|
-
import { bindMessageEntries, durableShellTree, followExternalAppends, forkConversation, getEntries, navigate, recordTurn, readSessionTree, revertConversation, SessionTreeError, unrevertConversation, } from "./session-tree.js";
|
|
17
|
+
import { bindMessageEntries, branchEntries, durableShellTree, followExternalAppends, forkConversation, getEntries, navigate, recordTurn, readSessionTree, revertConversation, SessionTreeError, unrevertConversation, } from "./session-tree.js";
|
|
18
18
|
import { SubagentBridge } from "./subagents.js";
|
|
19
19
|
import { MonitorSessions } from "./monitor-sessions.js";
|
|
20
20
|
import { WorkStatusBridge } from "./work-status.js";
|
|
@@ -1162,6 +1162,7 @@ export class SessionManager {
|
|
|
1162
1162
|
throw new Error(`pi session file is gone: ${restored.piPath}`);
|
|
1163
1163
|
this.refreshMessageCache(s);
|
|
1164
1164
|
await this.lifecycle.makeRoom();
|
|
1165
|
+
const resumedLeaf = readSessionTree(restored.piPath).leafId;
|
|
1165
1166
|
const pi = new PiRpcClient({
|
|
1166
1167
|
cwd: s.info.directory,
|
|
1167
1168
|
args: ["--session", restored.piPath],
|
|
@@ -1186,12 +1187,19 @@ export class SessionManager {
|
|
|
1186
1187
|
// Restore selection before publishing a runtime that prompts can use.
|
|
1187
1188
|
const thinking = state.data.thinkingLevel === undefined ? {} : { thinkingLevel: state.data.thinkingLevel };
|
|
1188
1189
|
await setThinkingLevel(thinking, pi, s.thinkingLevel);
|
|
1189
|
-
|
|
1190
|
-
const
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
if (
|
|
1190
|
+
let tree = await getEntries(pi);
|
|
1191
|
+
const saved = s.tree.leafId;
|
|
1192
|
+
// Resume hooks can already be streaming on this branch. Navigating back would
|
|
1193
|
+
// discard their progress, and OmO rejects even a no-op navigation while streaming.
|
|
1194
|
+
if (saved !== undefined &&
|
|
1195
|
+
saved !== tree.leafId &&
|
|
1196
|
+
(s.tree.revert || resumedLeaf !== saved || !branchEntries(tree).some((entry) => entry.id === saved))) {
|
|
1197
|
+
const leaf = await navigate(pi, saved);
|
|
1198
|
+
tree = await getEntries(pi);
|
|
1199
|
+
if (tree.leafId !== leaf)
|
|
1200
|
+
throw new SessionTreeError("Revival did not restore the saved navigation");
|
|
1194
1201
|
s.tree.leafId = leaf;
|
|
1202
|
+
}
|
|
1195
1203
|
bindMessageEntries(s, tree);
|
|
1196
1204
|
if (thinking.thinkingLevel !== undefined)
|
|
1197
1205
|
s.thinkingLevel = thinking.thinkingLevel;
|