antechamber 1.0.20 → 1.0.22
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,22 @@ and this project uses [Semantic Versioning](https://semver.org/).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.0.22] - 2026-10-26
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Show terminal turns appended to a session that the adapter last saved while empty, instead of keeping its
|
|
15
|
+
transcript blank. Empty forks and active reverts keep their hidden history.
|
|
16
|
+
|
|
17
|
+
## [1.0.21] - 2026-10-26
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Show live eval cells as `JS Eval` / `Python Eval` cards with their code and streaming output in OpenChamber 2.x.
|
|
22
|
+
The v2 stream announced the card as `eval` and never renamed it to the `bash` card it becomes, and it dropped
|
|
23
|
+
running metadata, so the OmO Compatibility header rule never matched and live output never arrived. The card is
|
|
24
|
+
now announced again under its mapped name, and running metadata is sent as `session.tool.progress`.
|
|
25
|
+
|
|
10
26
|
## [1.0.20] - 2026-10-26
|
|
11
27
|
|
|
12
28
|
### Fixed
|
package/dist/session-tree.d.ts
CHANGED
|
@@ -64,7 +64,7 @@ export declare function getEntries(pi: PiRpcClient, signal?: AbortSignal): Promi
|
|
|
64
64
|
* those carry no conversation, so they do not undo the navigation.
|
|
65
65
|
*/
|
|
66
66
|
export declare function restoredLeaf(tree: Entries, leaf: string | null): boolean;
|
|
67
|
-
export declare function readSessionTree(piPath: string): Entries;
|
|
67
|
+
export declare function readSessionTree(piPath: string, offset?: number): Entries;
|
|
68
68
|
/** Checkpoint persisted progress after agent_end, successful compaction, or process exit. */
|
|
69
69
|
export declare function recordTurn(s: ManagedSession): void;
|
|
70
70
|
/**
|
package/dist/session-tree.js
CHANGED
|
@@ -52,8 +52,8 @@ export function restoredLeaf(tree, leaf) {
|
|
|
52
52
|
}
|
|
53
53
|
return true;
|
|
54
54
|
}
|
|
55
|
-
export function readSessionTree(piPath) {
|
|
56
|
-
const lines = readFileSync(piPath
|
|
55
|
+
export function readSessionTree(piPath, offset = 0) {
|
|
56
|
+
const lines = readFileSync(piPath).subarray(offset).toString("utf8").trimEnd().split("\n");
|
|
57
57
|
const entries = [];
|
|
58
58
|
for (const [index, line] of lines.entries()) {
|
|
59
59
|
if (line.trim().length === 0)
|
|
@@ -102,7 +102,10 @@ export function recordTurn(s) {
|
|
|
102
102
|
*/
|
|
103
103
|
export function followExternalAppends(s, piPath) {
|
|
104
104
|
const saved = s.tree.leafId;
|
|
105
|
-
if (s.tree.revert || saved === undefined
|
|
105
|
+
if (s.tree.revert || saved === undefined)
|
|
106
|
+
return;
|
|
107
|
+
// A null selection can hide an abandoned branch; require a known append boundary.
|
|
108
|
+
if (saved === null && s.tree.fileSize === undefined)
|
|
106
109
|
return;
|
|
107
110
|
const size = statSync(piPath, { throwIfNoEntry: false })?.size;
|
|
108
111
|
if (size === undefined || (s.tree.fileSize !== undefined && size <= s.tree.fileSize))
|
|
@@ -110,6 +113,11 @@ export function followExternalAppends(s, piPath) {
|
|
|
110
113
|
let tree;
|
|
111
114
|
try {
|
|
112
115
|
tree = readSessionTree(piPath);
|
|
116
|
+
if (saved === null) {
|
|
117
|
+
const appended = new Set(readSessionTree(piPath, s.tree.fileSize).entries.map((entry) => entry.id));
|
|
118
|
+
if (!branchEntries(tree).some((entry) => entry.type === "message" && appended.has(entry.id)))
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
113
121
|
}
|
|
114
122
|
catch (error) {
|
|
115
123
|
// History parsing skips malformed lines; keep the saved selection rather than guess a tail.
|
|
@@ -117,7 +125,7 @@ export function followExternalAppends(s, piPath) {
|
|
|
117
125
|
return;
|
|
118
126
|
throw error;
|
|
119
127
|
}
|
|
120
|
-
if (tree.leafId === saved || !branchEntries(tree).some((entry) => entry.id === saved))
|
|
128
|
+
if (tree.leafId === saved || (saved !== null && !branchEntries(tree).some((entry) => entry.id === saved)))
|
|
121
129
|
return;
|
|
122
130
|
s.tree.leafId = tree.leafId;
|
|
123
131
|
}
|
package/dist/v2.js
CHANGED
|
@@ -565,11 +565,11 @@ export class V2EventTranslator {
|
|
|
565
565
|
called: false,
|
|
566
566
|
ended: false,
|
|
567
567
|
raw: "",
|
|
568
|
+
metadata: "",
|
|
568
569
|
};
|
|
569
570
|
st.tools.set(part.id, ts);
|
|
570
571
|
}
|
|
571
572
|
ts.callID = part.callID;
|
|
572
|
-
ts.name = part.tool;
|
|
573
573
|
const frames = [];
|
|
574
574
|
const base = { sessionID: part.sessionID, assistantMessageID: part.messageID, id: part.callID };
|
|
575
575
|
const state = part.state;
|
|
@@ -586,10 +586,13 @@ export class V2EventTranslator {
|
|
|
586
586
|
}
|
|
587
587
|
return frames;
|
|
588
588
|
}
|
|
589
|
-
|
|
589
|
+
// mapTool renames a call when it leaves pending (eval -> bash). OpenChamber 2.x takes the tool name only from
|
|
590
|
+
// input.started, so announce the card again under its new name before its input ends.
|
|
591
|
+
if (!ts.started || (ts.name !== part.tool && !ts.inputEnded)) {
|
|
590
592
|
ts.started = true;
|
|
591
593
|
frames.push(this.frame(directory, "session.tool.input.started", { ...base, name: part.tool }));
|
|
592
594
|
}
|
|
595
|
+
ts.name = part.tool;
|
|
593
596
|
if (!ts.inputEnded) {
|
|
594
597
|
ts.inputEnded = true;
|
|
595
598
|
frames.push(this.frame(directory, "session.tool.input.ended", {
|
|
@@ -601,6 +604,14 @@ export class V2EventTranslator {
|
|
|
601
604
|
ts.called = true;
|
|
602
605
|
frames.push(this.frame(directory, "session.tool.called", { ...base, input: state.input, executed: false }));
|
|
603
606
|
}
|
|
607
|
+
// `called` carries no metadata (eval card headers, live output); 2.x reads it while running only from progress.
|
|
608
|
+
if (state.status === "running" && state.metadata !== undefined) {
|
|
609
|
+
const metadata = safeJson(state.metadata);
|
|
610
|
+
if (metadata !== ts.metadata) {
|
|
611
|
+
ts.metadata = metadata;
|
|
612
|
+
frames.push(this.frame(directory, "session.tool.progress", { ...base, metadata: state.metadata }));
|
|
613
|
+
}
|
|
614
|
+
}
|
|
604
615
|
if (!ts.ended && state.status === "completed") {
|
|
605
616
|
ts.ended = true;
|
|
606
617
|
frames.push(this.frame(directory, "session.tool.success", {
|