@with-logic/elwood 0.2.0 → 0.2.1
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 +6 -0
- package/README.md +2 -0
- package/dist/runtime/session/base.d.ts.map +1 -1
- package/dist/runtime/session/base.js +4 -2
- package/dist/runtime/session/base.js.map +1 -1
- package/dist/runtime/session/commands.d.ts +1 -1
- package/dist/runtime/session/commands.d.ts.map +1 -1
- package/dist/runtime/session/picker.d.ts +2 -2
- package/dist/runtime/session/picker.d.ts.map +1 -1
- package/dist/runtime/session/picker.js +3 -3
- package/dist/runtime/session/picker.js.map +1 -1
- package/dist/terminal/cursor.d.ts +1 -1
- package/dist/terminal/cursor.d.ts.map +1 -1
- package/dist/terminal/cursor.js +36 -1
- package/dist/terminal/cursor.js.map +1 -1
- package/docs/embedding.md +7 -0
- package/docs/performance/terminal-engines.md +88 -0
- package/docs/performance.md +120 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,12 @@ back each entry are listed in `prd/14-conformance.md`.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.2.1] - 2026-10-24
|
|
16
|
+
|
|
17
|
+
- Reduce median active Elwood CPU by 11.3% in the measured 50-session workload
|
|
18
|
+
by sharing completed-frame text, preserving fresh public snapshots and direct
|
|
19
|
+
xterm writes.
|
|
20
|
+
|
|
15
21
|
## [0.2.0] - 2026-10-22
|
|
16
22
|
|
|
17
23
|
- Codex question turns settle after native completion even when consecutive answer echoes contain caret-like multiline text.
|
package/README.md
CHANGED
|
@@ -549,6 +549,8 @@ immediate; both are safe after the process has already exited.
|
|
|
549
549
|
size, and persisting/resuming.
|
|
550
550
|
- [docs/embedding.md](docs/embedding.md): wiring a session into a host
|
|
551
551
|
application (Electron and similar).
|
|
552
|
+
- [docs/performance.md](docs/performance.md): fifty-session measurements, headless
|
|
553
|
+
history budgets, and terminal-engine assessment.
|
|
552
554
|
- [docs/loops.md](docs/loops.md): recurring prompts and `/loop` parsing.
|
|
553
555
|
- [docs/images.md](docs/images.md): attaching images to a turn.
|
|
554
556
|
- [docs/login-recovery.md](docs/login-recovery.md): detecting and recovering an
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AASjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,8BAAsB,gBAAiB,SAAQ,mBAAmB;IAChE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,SAAS,aACP,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,oBAAoB,EAClC,cAAc,EAAE,oBAAoB,EACpC,eAAe,EAAE,SAAS,uBAAuB,EAAE;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import { submissionControlOptions } from "../../core/input/submission-cancel.js"
|
|
|
11
11
|
import { isPickerIntervention } from "../../core/models/intervention.js";
|
|
12
12
|
import { submissionAttempt } from "../../core/simple/submission-context.js";
|
|
13
13
|
import { assertStopInput } from "../../core/stop-input.js";
|
|
14
|
-
import { currentRenderedFrame } from "../../terminal/cursor.js";
|
|
14
|
+
import { currentRenderedFrame, renderedSnapshot } from "../../terminal/cursor.js";
|
|
15
15
|
import { CommandSurface } from "./commands.js";
|
|
16
16
|
import { enqueueSubmission, } from "./image-attach.js";
|
|
17
17
|
import { PickerInputOwnership } from "./picker-input.js";
|
|
@@ -28,7 +28,9 @@ export class AgentSessionBase extends QuestionSessionBase {
|
|
|
28
28
|
terminal: ownership.automated,
|
|
29
29
|
inputSignal: () => ownership.signal(),
|
|
30
30
|
observeRendered: (listener) => {
|
|
31
|
-
|
|
31
|
+
// xterm runs this after the ordered completed-frame observers.
|
|
32
|
+
const read = () => renderedSnapshot(terminal).text;
|
|
33
|
+
terminal.xterm.onWriteParsed(() => listener(read));
|
|
32
34
|
},
|
|
33
35
|
statusEvents,
|
|
34
36
|
status: () => this.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/runtime/session/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAEjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAGzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAO3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/runtime/session/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ export type CommandSurfaceDeps = {
|
|
|
29
29
|
readonly blocked: () => boolean;
|
|
30
30
|
readonly picker: () => ModelPickerSpec;
|
|
31
31
|
readonly controlQueue: ControlQueue;
|
|
32
|
-
readonly observeRendered?: (listener: () => void) => void;
|
|
32
|
+
readonly observeRendered?: (listener: (read?: () => string) => void) => void;
|
|
33
33
|
readonly inputSignal?: () => AbortSignal;
|
|
34
34
|
readonly submitDirect: (command: string, signal: AbortSignal) => Promise<void>;
|
|
35
35
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAItE,OAAO,EAEL,KAAK,eAAe,EAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,2BAA2B,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAW/D,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAItE,OAAO,EAEL,KAAK,eAAe,EAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,2BAA2B,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAW/D,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,WAAW,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF,CAAC;AAEF,4FAA4F;AAC5F,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAI5C,OAAO,CAAC,YAAY,CAA4B;gBAEpC,IAAI,EAAE,kBAAkB;IAKpC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3C,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCzC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC;IAQnE;;;;;;OAMG;IACH,QAAQ,CACN,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC;IAShB,WAAW,IAAI,OAAO;IAItB,6FAA6F;IAC7F,oBAAoB,IAAI,OAAO;CAGhC"}
|
|
@@ -5,7 +5,7 @@ import type { ModelPickerIo, ModelPickerSpec } from "../../core/models/picker.ts
|
|
|
5
5
|
import type { ScreenTerminal } from "../../core/models/tui-screen.ts";
|
|
6
6
|
type PickerDeps = {
|
|
7
7
|
readonly controlQueue: ControlQueue;
|
|
8
|
-
readonly observeRendered?: (listener: () => void) => void;
|
|
8
|
+
readonly observeRendered?: (listener: (read?: () => string) => void) => void;
|
|
9
9
|
readonly inputSignal?: () => AbortSignal;
|
|
10
10
|
readonly submitDirect: (command: string, signal: AbortSignal) => Promise<void>;
|
|
11
11
|
/** Also carries the optional observation barrier (`settled`/`renderFailed`) when real. */
|
|
@@ -41,7 +41,7 @@ export declare class PickerTransactions {
|
|
|
41
41
|
* human's state, so a WRITE that is not part of a picker transaction — `/login`
|
|
42
42
|
* recovery, a queued paste — must be withheld while it is up (C-API-55).
|
|
43
43
|
*/
|
|
44
|
-
foreignDialogVisible(): boolean;
|
|
44
|
+
foreignDialogVisible(read?: () => string): boolean;
|
|
45
45
|
/**
|
|
46
46
|
* Runs `work` inside one exclusive queue slot, so no other command or message is
|
|
47
47
|
* dispatched until the whole open/navigate/apply-or-cancel flow settles. The queue
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/picker.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAWtE,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/picker.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAWtE,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,WAAW,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC;CACxC,CAAC;AAEF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,MAAM,CAA0D;IACxE,OAAO,CAAC,QAAQ,CAA8B;IAC9C,wFAAwF;IACxF,OAAO,CAAC,WAAW,CAAK;gBACZ,IAAI,EAAE,UAAU;IAK5B;;;;;;;;;OASG;IACH,WAAW,IAAI,OAAO;IAetB;;;;;;;OAOG;IACH,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO;IAMlD;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EACT,IAAI,EAAE,aAAa,GAAG,WAAW,EACjC,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3D,OAAO,CAAC,CAAC,CAAC;IAwDb,OAAO,CAAC,EAAE;YA6BI,OAAO;CAQtB"}
|
|
@@ -10,7 +10,7 @@ export class PickerTransactions {
|
|
|
10
10
|
clearStreak = 0;
|
|
11
11
|
constructor(deps) {
|
|
12
12
|
this.deps = deps;
|
|
13
|
-
deps.observeRendered?.(() => this.foreignDialogVisible());
|
|
13
|
+
deps.observeRendered?.((read) => this.foreignDialogVisible(read));
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Whether a model dialog is on screen that queued input must not be written into.
|
|
@@ -46,12 +46,12 @@ export class PickerTransactions {
|
|
|
46
46
|
* human's state, so a WRITE that is not part of a picker transaction — `/login`
|
|
47
47
|
* recovery, a queued paste — must be withheld while it is up (C-API-55).
|
|
48
48
|
*/
|
|
49
|
-
foreignDialogVisible() {
|
|
49
|
+
foreignDialogVisible(read) {
|
|
50
50
|
if (this.survivor !== undefined)
|
|
51
51
|
return false;
|
|
52
52
|
if (this.active?.progress.commandSubmitted && !this.active.signal.aborted)
|
|
53
53
|
return false;
|
|
54
|
-
return this.foreign.observe(this.deps.terminal.snapshot().text, this.deps.picker());
|
|
54
|
+
return this.foreign.observe(read?.() ?? this.deps.terminal.snapshot().text, this.deps.picker());
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
57
|
* Runs `work` inside one exclusive queue slot, so no other command or message is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../../../src/runtime/session/picker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,SAAS,EACT,aAAa,EACb,WAAW,EACX,SAAS,EACT,IAAI,GAEL,MAAM,qBAAqB,CAAC;AAc7B,MAAM,OAAO,kBAAkB;IACZ,IAAI,CAAa;IACjB,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,MAAM,CAA0D;IAChE,QAAQ,CAA8B;IAC9C,wFAAwF;IAChF,WAAW,GAAG,CAAC,CAAC;IACxB,YAAY,IAAgB;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,eAAe,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../../../src/runtime/session/picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ export declare function hasUnknownOrNonPristineOutput(terminal: ElwoodTerminal):
|
|
|
10
10
|
export declare function captureRenderProgress(terminal: ElwoodTerminal): () => boolean;
|
|
11
11
|
/** Private queued-input notification; terminal wrappers share the tracked xterm identity. */
|
|
12
12
|
export declare function subscribeRender(terminal: ElwoodTerminal, listener: () => void): () => void;
|
|
13
|
-
/**
|
|
13
|
+
/** Completed-render and post-parse picker observations share text with subsequent trust reads. */
|
|
14
14
|
export declare function renderedSnapshot(terminal: ElwoodTerminal): TerminalSnapshot;
|
|
15
15
|
export declare class RenderCursor {
|
|
16
16
|
private readonly listeners;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/terminal/cursor.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAEhE;AAED,8FAA8F;AAC9F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAK3F;AAED,4FAA4F;AAC5F,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAE/E;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,OAAO,CAG7E;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE1F;AAED,
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/terminal/cursor.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAEhE;AAED,8FAA8F;AAC9F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAK3F;AAED,4FAA4F;AAC5F,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAE/E;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,OAAO,CAG7E;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE1F;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB,CAE3E;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAM3C,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAE1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,WAAW,CAAM;gBAEb,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,OAAO;IAyB9D,QAAQ,IAAI,MAAM;IAIlB,kFAAkF;IAClF,MAAM,IAAI,MAAM;IAGhB,IAAI,OAAO,IAAI,MAAM,CAEpB;IACD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjD,eAAe,IAAI,MAAM,OAAO;IAIhC,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,cAAc,IAAI,OAAO,CAE5B;IACD,QAAQ,CAAC,OAAO,EAAE,MAAM,gBAAgB,GAAG,gBAAgB;IAgB3D,OAAO,IAAI,IAAI;CAKhB"}
|
package/dist/terminal/cursor.js
CHANGED
|
@@ -22,7 +22,7 @@ export function captureRenderProgress(terminal) {
|
|
|
22
22
|
export function subscribeRender(terminal, listener) {
|
|
23
23
|
return tracked.get(terminal.xterm)?.subscribe(listener) ?? (() => undefined);
|
|
24
24
|
}
|
|
25
|
-
/**
|
|
25
|
+
/** Completed-render and post-parse picker observations share text with subsequent trust reads. */
|
|
26
26
|
export function renderedSnapshot(terminal) {
|
|
27
27
|
return tracked.get(terminal.xterm)?.snapshot(() => terminal.snapshot()) ?? terminal.snapshot();
|
|
28
28
|
}
|
|
@@ -60,6 +60,11 @@ export class RenderCursor {
|
|
|
60
60
|
})),
|
|
61
61
|
terminal.parser.registerEscHandler({ final: "c" }, reset),
|
|
62
62
|
terminal.parser.registerCsiHandler({ intermediates: "!", final: "p" }, reset),
|
|
63
|
+
{
|
|
64
|
+
dispose: invalidateOnMutation(terminal, () => {
|
|
65
|
+
this.frame = undefined;
|
|
66
|
+
}),
|
|
67
|
+
},
|
|
63
68
|
];
|
|
64
69
|
}
|
|
65
70
|
received() {
|
|
@@ -113,4 +118,34 @@ export class RenderCursor {
|
|
|
113
118
|
handler.dispose();
|
|
114
119
|
}
|
|
115
120
|
}
|
|
121
|
+
/** Raw xterm mutations bypass owned revisions, but must never reuse older viewport text. */
|
|
122
|
+
function invalidateOnMutation(terminal, invalidate) {
|
|
123
|
+
const restore = [];
|
|
124
|
+
const writes = ["write", "writeln"];
|
|
125
|
+
for (const method of writes) {
|
|
126
|
+
const original = terminal[method];
|
|
127
|
+
const write = original.bind(terminal);
|
|
128
|
+
terminal[method] = (data, callback) => {
|
|
129
|
+
// writeln can parse its first internal write synchronously after user input.
|
|
130
|
+
invalidate();
|
|
131
|
+
write(data, () => {
|
|
132
|
+
invalidate();
|
|
133
|
+
callback?.();
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
restore.push(() => {
|
|
137
|
+
terminal[method] = original;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const reset = terminal.reset;
|
|
141
|
+
terminal.reset = () => {
|
|
142
|
+
reset.call(terminal);
|
|
143
|
+
invalidate();
|
|
144
|
+
};
|
|
145
|
+
return () => {
|
|
146
|
+
for (const method of restore)
|
|
147
|
+
method();
|
|
148
|
+
terminal.reset = reset;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
116
151
|
//# sourceMappingURL=cursor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/terminal/cursor.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,GAAG,IAAI,OAAO,EAA0B,CAAC;AAEtD,MAAM,UAAU,oBAAoB,CAAC,QAAkB;IACrD,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC;AAClG,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,oBAAoB,CAAC,QAAwB;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB;QAC1F,OAAO,SAAS,CAAC;IACnB,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,6BAA6B,CAAC,QAAwB;IACpE,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,QAAwB;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAClE,OAAO,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,KAAK,IAAI,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;AACvF,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,QAAwB,EAAE,QAAoB;IAC5E,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/terminal/cursor.ts"],"names":[],"mappings":"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"}
|
package/docs/embedding.md
CHANGED
|
@@ -80,3 +80,10 @@ cap does not constrain your state layout.
|
|
|
80
80
|
before the user starts a session — use `listClaudeModels`/`listCodexModels`.
|
|
81
81
|
They spin up a throwaway session, list, and always tear it down, so they cost
|
|
82
82
|
a few seconds each; cache the result in the parent app if you call them often.
|
|
83
|
+
|
|
84
|
+
## Scaling concurrent sessions
|
|
85
|
+
|
|
86
|
+
See [performance.md](performance.md) for the fifty-session workload, measured
|
|
87
|
+
CPU improvement, and the existing `terminal.xterm.options.scrollback` history
|
|
88
|
+
budget. Headless history and the browser terminal's history are separate;
|
|
89
|
+
choose both budgets and avoid polling fresh snapshots for hidden sessions.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Terminal engine assessment — October 24, 2026
|
|
2
|
+
|
|
3
|
+
Keep xterm for the current optimization. A private Ghostty WASM probe showed
|
|
4
|
+
a useful parser/formatter CPU reduction, but does not yet implement Elwood's
|
|
5
|
+
terminal contract. Replacing the engine requires an explicit API migration: the
|
|
6
|
+
public `terminal.xterm` exposes the complete headless xterm Terminal, including proposed
|
|
7
|
+
APIs. Running both engines would retain both parsing and buffer costs.
|
|
8
|
+
|
|
9
|
+
## Probe scope and provenance
|
|
10
|
+
|
|
11
|
+
The experiment instantiated the official full `ghostty-vt.wasm` in Node 26.3.1
|
|
12
|
+
with one WASM instance containing 50 terminals. Both engines parsed the same
|
|
13
|
+
80 full-screen redraws at 120 columns by 40 rows. The snapshot variant decoded
|
|
14
|
+
Ghostty's plain formatter output and checked final round markers. UTF-8 copy
|
|
15
|
+
and decoding were included. This was a standalone diagnostic, not the full
|
|
16
|
+
Elwood runtime workload; no hook/watch/classification or browser costs were
|
|
17
|
+
included. The trace did not fill scrollback.
|
|
18
|
+
|
|
19
|
+
The official nightly release was associated with source revision
|
|
20
|
+
`22f100c6367045bb5fc86172f837047dee2f7670`, library `0.1.0-dev`.
|
|
21
|
+
The 1,189,559-byte WASM SHA-256 was
|
|
22
|
+
`e23598cefe95b42d441221a45d22d435c9c1915bca7475fe735e7617eac1a0d1`.
|
|
23
|
+
Its embedded type metadata had a null commit field: the binary hash pins the
|
|
24
|
+
measured bytes; the source association comes from release metadata. The `tip`
|
|
25
|
+
URL moves and must not be treated as an immutable version. No dependency or
|
|
26
|
+
WASM binary was added to Elwood.
|
|
27
|
+
|
|
28
|
+
Sources: [official release](https://github.com/ghostty-org/ghostty/releases/tag/tip),
|
|
29
|
+
[WASM API](https://github.com/ghostty-org/ghostty/blob/22f100c6367045bb5fc86172f837047dee2f7670/include/ghostty/vt/wasm.h),
|
|
30
|
+
[official example](https://github.com/ghostty-org/ghostty/blob/22f100c6367045bb5fc86172f837047dee2f7670/example/wasm-vt/index.html).
|
|
31
|
+
|
|
32
|
+
## Standalone measurements
|
|
33
|
+
|
|
34
|
+
Three alternating fresh processes per engine used shared input/output scratch
|
|
35
|
+
for all Ghostty terminals. The xterm side included Elwood's headless write queue
|
|
36
|
+
and cursor tracking from commit `34ab7dd5`. The snapshot paths differ: xterm extracts the full physical
|
|
37
|
+
viewport; Ghostty formats plain text. These numbers compare the prototypes,
|
|
38
|
+
not equivalent complete engines.
|
|
39
|
+
|
|
40
|
+
| Diagnostic median | xterm path | Ghostty WASM path |
|
|
41
|
+
|---|---:|---:|
|
|
42
|
+
| Parsing path CPU | 326.275 ms | 176.598 ms |
|
|
43
|
+
| Parsing plus snapshot/formatter CPU | 559.623 ms | 343.816 ms |
|
|
44
|
+
| Parsing plus snapshot/formatter RSS | 131.6 MiB | 139.5 MiB |
|
|
45
|
+
|
|
46
|
+
Parsing CPU samples were 345.918 / 326.275 / 229.376 ms for xterm and
|
|
47
|
+
225.668 / 147.451 / 176.598 ms for Ghostty. Snapshot/formatter samples were
|
|
48
|
+
575.996 / 559.623 / 429.162 ms and 356.796 / 343.816 / 322.240 ms.
|
|
49
|
+
The host was busy; all paired CPU comparisons favored the prototype, but the
|
|
50
|
+
variation is substantial. The approximately 39% lower median CPU in the
|
|
51
|
+
formatter comparison is not a whole-Elwood speedup.
|
|
52
|
+
|
|
53
|
+
Ghostty's shared linear memory reached 23.625 MiB; WASM allocations must not
|
|
54
|
+
be inferred from JS heap alone. Process RSS was not lower in the formatter
|
|
55
|
+
comparison. No lower-memory replacement conclusion follows from this trace.
|
|
56
|
+
An earlier per-terminal scratch variant allocated about 16 MiB unnecessarily;
|
|
57
|
+
only the shared-scratch measurements above are used for this comparison.
|
|
58
|
+
|
|
59
|
+
## Compatibility work required before replacement
|
|
60
|
+
|
|
61
|
+
Elwood needs exactly one line per physical viewport row, cursor coordinates
|
|
62
|
+
through scrollback and reflow, and cell-column prefix extraction for wide and
|
|
63
|
+
combining characters. Question editors require cursor-cell dimming to distinguish
|
|
64
|
+
placeholder text from real answers. Plain formatter output does not prove those
|
|
65
|
+
properties.
|
|
66
|
+
|
|
67
|
+
A replacement must also preserve parser-completion ordering, input ownership,
|
|
68
|
+
protocol replies, title updates, synchronized-output holds, resize events,
|
|
69
|
+
wrap-pending cursor positions and failure/disposal behavior. The WASM prototype
|
|
70
|
+
did not install the write-to-PTY callback; query responses were therefore absent.
|
|
71
|
+
Its marker checks establish only the diagnostic trace, not native CLI safety.
|
|
72
|
+
|
|
73
|
+
The next useful engine experiment would compare full viewport/cursor/style and
|
|
74
|
+
protocol-event fixtures through a compatibility adapter. A native addon should
|
|
75
|
+
follow only if measured WASM boundary costs justify its build/distribution cost.
|
|
76
|
+
Sources: [render state](https://github.com/ghostty-org/ghostty/blob/22f100c6367045bb5fc86172f837047dee2f7670/include/ghostty/vt/render.h),
|
|
77
|
+
[grid references](https://github.com/ghostty-org/ghostty/blob/22f100c6367045bb5fc86172f837047dee2f7670/include/ghostty/vt/grid_ref.h),
|
|
78
|
+
[terminal effects](https://github.com/ghostty-org/ghostty/blob/22f100c6367045bb5fc86172f837047dee2f7670/include/ghostty/vt/terminal.h).
|
|
79
|
+
|
|
80
|
+
## Other candidates
|
|
81
|
+
|
|
82
|
+
[libvterm 0.3.3](https://www.leonerd.org.uk/code/libvterm/) provides a screen and
|
|
83
|
+
output callbacks, but its released screen-cell attributes lack the dim/faint
|
|
84
|
+
flag used by question provenance. [vte](https://github.com/alacritty/vte) is a
|
|
85
|
+
parser rather than a complete terminal emulator.
|
|
86
|
+
[libtsm](https://github.com/Aetf/libtsm) still needs protocol, Unicode, dimming,
|
|
87
|
+
resize and packaging verification. None offered a measured compatible replacement
|
|
88
|
+
within this investigation.
|
package/docs/performance.md
CHANGED
|
@@ -71,3 +71,123 @@ under active output.
|
|
|
71
71
|
Re-run the probe after changes to rendering, frame classification, replay,
|
|
72
72
|
transcript polling, or cleanup. Compare output correctness and cleanup as well
|
|
73
73
|
as throughput, memory, and event-loop delay.
|
|
74
|
+
|
|
75
|
+
## Fifty-session runtime workload
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
node --expose-gc --no-warnings scripts/performance/fleet/index.ts
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
This probe starts 50 production runtimes, alternating Claude and Codex, with
|
|
82
|
+
synthetic PTY producers. Dependency seams model macOS even on other hosts; this
|
|
83
|
+
does not test native-agent support on those hosts. It exercises real local hook
|
|
84
|
+
sockets, transcript watchers, frame observers, public snapshots and cleanup without
|
|
85
|
+
launching agent CLIs or making model calls. Each session receives 80 full-screen redraws at
|
|
86
|
+
120 columns by 40 rows, then 1,200 scrolling lines. Assertions check all
|
|
87
|
+
15,155,250 output bytes, 500 transcript activities and final viewport markers.
|
|
88
|
+
The process reports setup separately, a two-second idle CPU sample, active CPU,
|
|
89
|
+
wall time, event-loop delay, live memory after GC and resource cleanup.
|
|
90
|
+
For a quick smoke run, set `ELWOOD_BENCH_SESSIONS=2 ELWOOD_BENCH_ROUNDS=2`.
|
|
91
|
+
|
|
92
|
+
### October 24, 2026: shared completed-frame text
|
|
93
|
+
|
|
94
|
+
Three alternating reference/candidate pairs used the same worktree, v2 probe
|
|
95
|
+
and Node 26.3.1 on the development Mac. Both sides used the benchmark from
|
|
96
|
+
`f6e4406c`; the reference restored runtime files from release `ba8b634e`
|
|
97
|
+
(0.2.0), while the candidate used the runtime at `f6e4406c`.
|
|
98
|
+
Values below are medians, not guarantees. Host activity changed absolute
|
|
99
|
+
timings substantially between measurement windows; compare matched pairs.
|
|
100
|
+
|
|
101
|
+
| Parent-process metric | Reference | Shared frame | Change |
|
|
102
|
+
|---|---:|---:|---:|
|
|
103
|
+
| Active CPU | 1,177.071 ms | 1,043.927 ms | −11.3% |
|
|
104
|
+
| Idle CPU over two seconds | 20.955 ms | 22.113 ms | +1.158 ms; variable |
|
|
105
|
+
| Live JS heap | 52.828 MiB | 53.084 MiB | +0.5% |
|
|
106
|
+
|
|
107
|
+
Active CPU samples were 1,176.453 / 1,177.071 / 1,195.298 ms before and
|
|
108
|
+
1,043.927 / 1,045.998 / 1,031.162 ms after. Every v2 run passed per-session
|
|
109
|
+
byte/activity attribution, final viewport markers and resource-count checks.
|
|
110
|
+
The probe awaits teardown of every session, removing private socket homes before
|
|
111
|
+
its shared root. Regression tests verify filesystem cleanup, rejection ordering,
|
|
112
|
+
extra handles of an existing type and offsetting per-session accounting gaps.
|
|
113
|
+
Idle samples ranged from 20.275–25.492 ms before and 16.285–23.858 ms after;
|
|
114
|
+
no idle optimization is claimed. The CPU reduction is below the initial 15%
|
|
115
|
+
estimate, with effectively unchanged live heap.
|
|
116
|
+
|
|
117
|
+
The change removes a second viewport conversion in foreign-picker observation
|
|
118
|
+
while preserving fresh public snapshots and input-boundary reads. Raw xterm
|
|
119
|
+
writes, writeln and reset invalidate private cached text; disposal restores the
|
|
120
|
+
original methods. Regression tests fail with the change removed, including a
|
|
121
|
+
raw write in an owned parser drain, writeln's synchronous parse after user input
|
|
122
|
+
and method restoration on disposal.
|
|
123
|
+
|
|
124
|
+
An earlier v1 comparison measured 10.3% lower CPU. Its aggregate assertions
|
|
125
|
+
did not establish per-session completeness, same-type handle counts or socket-home
|
|
126
|
+
removal; the v2 comparison above supersedes that result.
|
|
127
|
+
|
|
128
|
+
These measurements exclude browser rendering and agent-process memory/CPU.
|
|
129
|
+
The probe's final screen assertions and 500 activity count protect this workload;
|
|
130
|
+
they do not establish correctness for every native dialog. The repository's
|
|
131
|
+
conformance suite remains the merge gate.
|
|
132
|
+
|
|
133
|
+
## Consumer memory and rendering budgets
|
|
134
|
+
|
|
135
|
+
Elwood's headless xterm retains 1,000 history lines by default. Consumers that
|
|
136
|
+
retain their own raw terminal history can opt out of headless scrollback through
|
|
137
|
+
the existing advanced xterm handle:
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
import { CodexSession } from "@with-logic/elwood";
|
|
141
|
+
|
|
142
|
+
const session = await new CodexSession({ cwd }).start();
|
|
143
|
+
session.terminal.xterm.options.scrollback = 0;
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The same setting applies to Claude sessions. Apply it at session creation,
|
|
147
|
+
before sustained output. This discards headless scrollback and changes what
|
|
148
|
+
xterm can recover/reflow on scrolling and resizing; choose a small nonzero
|
|
149
|
+
budget if that history is needed. It does not change the consumer's own replay
|
|
150
|
+
store or browser terminal's independent scrollback setting.
|
|
151
|
+
|
|
152
|
+
Three alternating default/zero-history runs of the fixed 50-session workload
|
|
153
|
+
on Node 26.3.1, commit `f6e4406c`, measured the following medians after
|
|
154
|
+
1,200 scrolling lines per session. The experimental preload changed only xterm
|
|
155
|
+
constructor scrollback; all byte, transcript, viewport and cleanup assertions
|
|
156
|
+
passed. A separate two-adapter smoke used the public setter above and verified
|
|
157
|
+
zero history rows after scrolling. This is a configuration comparison, not a
|
|
158
|
+
runtime default change.
|
|
159
|
+
|
|
160
|
+
| Parent-process memory | Default 1,000 lines | Zero history |
|
|
161
|
+
|---|---:|---:|
|
|
162
|
+
| Live JS heap | 53.080 MiB | 38.977 MiB |
|
|
163
|
+
| External memory | 81.017 MiB | 13.065 MiB |
|
|
164
|
+
| Process RSS | 318.766 MiB | 231.484 MiB |
|
|
165
|
+
|
|
166
|
+
JS heap samples ranged from 53.078–53.080 MiB at the default budget and
|
|
167
|
+
34.650–38.987 MiB at zero history. History, dimensions, GC and host activity
|
|
168
|
+
affect these values. CPU and
|
|
169
|
+
idle timing varied enough that no CPU benefit is claimed for this setting.
|
|
170
|
+
|
|
171
|
+
For many-session consumers:
|
|
172
|
+
|
|
173
|
+
- Feed all ordered `terminal:data` bytes to the consumer's terminal/history
|
|
174
|
+
pipeline; batch browser writes without dropping bytes or ANSI boundaries.
|
|
175
|
+
- Keep only visible terminals rendering. Bound browser scrollback independently
|
|
176
|
+
and avoid polling public snapshots for every hidden session. Public snapshots
|
|
177
|
+
deliberately perform a fresh viewport read.
|
|
178
|
+
- Use normalized activity for chat/progress updates. Append to a bounded store
|
|
179
|
+
and batch UI updates instead of rerendering all terminal history per event.
|
|
180
|
+
- Measure Elwood parent CPU separately from agent child processes and the UI
|
|
181
|
+
renderer. Browser refresh/history costs do not appear in the headless probe.
|
|
182
|
+
|
|
183
|
+
The update-dialog prefilter prototype reduced active CPU by 3.8% in its matched
|
|
184
|
+
window, below this investigation's 5% decision threshold, and was not retained.
|
|
185
|
+
Fifty idle sessions used roughly 20 ms of parent CPU per two seconds; the
|
|
186
|
+
measurements did not justify a polling rewrite. The
|
|
187
|
+
[terminal engine assessment](performance/terminal-engines.md) records the
|
|
188
|
+
Ghostty prototype and the compatibility requirements for a replacement.
|
|
189
|
+
|
|
190
|
+
The fleet probe dispatches authenticated local hook requests directly; it does
|
|
191
|
+
not launch the generated hook-bridge subprocess for each request. Bridge-process
|
|
192
|
+
startup/CPU, agent processes and the browser need separate measurements. The
|
|
193
|
+
parent-process results do not establish a whole-system scaling guarantee.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@with-logic/elwood",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Control interactive agentic coding CLIs (Claude Code, Codex) through real terminal sessions: typed hooks, a unified activity stream, resumable sessions, and a headless CLI.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Logic App, Inc.",
|