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
 
@@ -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.batchState.entries);
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: structuredClone(this.load()), changes };
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
- const leaf = s.tree.leafId === undefined ? undefined : await navigate(pi, s.tree.leafId);
1190
- const tree = await getEntries(pi);
1191
- if (leaf !== undefined && tree.leafId !== leaf)
1192
- throw new SessionTreeError("Revival did not restore the saved navigation");
1193
- if (leaf !== undefined)
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;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antechamber-omo-compat",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
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.6",
3
+ "version": "1.0.8",
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.6",
3
+ "version": "1.0.8",
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.6",
3
+ "version": "1.0.8",
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",