@metaharness/kernel 0.1.1 → 0.1.3

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/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export type { McpServerSpec, ToolSpec, AgentSpec, HookSpec, HarnessSpec, HostAdapter } from './types.js';
2
+ export { SessionLog } from './session.js';
3
+ export type { SessionEvent } from './session.js';
2
4
  export interface KernelInfo {
3
5
  version: string;
4
6
  git_sha: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzG,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,UAAU,IAAI,UAAU,CAAC;IACzB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7C,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAuHD;;;GAGG;AACH;gFACgF;AAChF,wBAAgB,yBAAyB,IAAI,IAAI,CAIhD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAwCzD;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAIpE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,UAAU,IAAI,UAAU,CAAC;IACzB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7C,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAuHD;;;GAGG;AACH;gFACgF;AAChF,wBAAgB,yBAAyB,IAAI,IAAI,CAIhD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAwCzD;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAIpE"}
package/dist/index.js CHANGED
@@ -9,6 +9,8 @@
9
9
  // third backend: a dependency-free pure-JS implementation. native > wasm > js,
10
10
  // but js is the floor — the kernel is always loadable. (ADR-002a §fallback.)
11
11
  import { createRequire } from 'node:module';
12
+ // ADR-246 §2.3: recoverable, forkable session log primitive.
13
+ export { SessionLog } from './session.js';
12
14
  let _cached = null;
13
15
  // GH #20/#22: remember WHY a higher-tier backend was unavailable so `doctor`
14
16
  // and a requested-but-missing backend can report the actual reason instead of
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export interface SessionEvent {
2
+ /** Per-branch 0-based monotonic index. */
3
+ index: number;
4
+ /** Branch ID this event belongs to. */
5
+ branch: string;
6
+ /** Fork point — present only on the first event of a non-root branch. */
7
+ parent?: {
8
+ branch: string;
9
+ index: number;
10
+ };
11
+ /** Event kind (free-form discriminator, e.g. "turn", "tool", "note"). */
12
+ kind: string;
13
+ /** Free-form event payload. */
14
+ payload: unknown;
15
+ }
16
+ /** Canonical JSON: recursively key-sorted objects, arrays in order, no
17
+ * whitespace. `undefined` object values are dropped (matching
18
+ * JSON.stringify). This is the byte input to the state-hash fold.
19
+ *
20
+ * Keys sort by UTF-8 BYTE order (not UTF-16 code-unit order, which the
21
+ * default `.sort()` would use) to match the Rust mirror, whose `&str`
22
+ * ordering is byte-wise. The two orders diverge for keys mixing BMP-high
23
+ * characters (>= U+E000) with astral characters. */
24
+ export declare function canonicalJson(v: unknown): string;
25
+ /**
26
+ * Crash-recoverable, forkable session log (ADR-246 §2.3). One JSONL file may
27
+ * carry many branches; each SessionLog instance appends to ONE active branch.
28
+ * `fork()` returns a sibling over the same file/state on a new branch.
29
+ */
30
+ export declare class SessionLog {
31
+ private state;
32
+ /** Active branch this instance appends to. */
33
+ readonly branch: string;
34
+ constructor(path: string, branch?: string);
35
+ /** Internal: build an instance over existing shared state (open/fork). */
36
+ private static over;
37
+ get path(): string;
38
+ /**
39
+ * Resume a session: read the JSONL log, validate it, and reconstruct state.
40
+ * Throws with the first 'session: '-prefixed error on an invalid log.
41
+ * `branch` selects the active branch (default 'main').
42
+ */
43
+ static open(path: string, branch?: string): Promise<SessionLog>;
44
+ /** Append an event on the active branch, assigning the next monotonic
45
+ * index. The first event of a forked branch carries the fork's parent ref. */
46
+ append(kind: string, payload: unknown, opts?: {
47
+ parent?: {
48
+ branch: string;
49
+ index: number;
50
+ };
51
+ }): Promise<SessionEvent>;
52
+ /**
53
+ * Fork at `atIndex` on THIS instance's active branch: returns a SessionLog
54
+ * over the same file (and shared state) whose active branch is `newBranch`.
55
+ * Immediately appends the new branch's synthetic first event (matching the
56
+ * Rust mirror's `fork`): index 0, parent {branch: this.branch, index:
57
+ * atIndex}, kind 'fork', payload null.
58
+ */
59
+ fork(atIndex: number, newBranch: string): Promise<SessionLog>;
60
+ /** The lineage of a branch, root → tip: the branch's own events preceded by
61
+ * its parent lineage truncated at the fork point, recursively. */
62
+ private lineage;
63
+ /**
64
+ * State hash over the branch lineage (root → tip). Exact fold (mirrored in
65
+ * the file-header comment; a Rust mirror must reproduce it):
66
+ * hexPrev = ''; for each event: hexPrev = hex(sha256(utf8(hexPrev + canonicalJson(event))))
67
+ * Returns lowercase hex; the hash of an empty lineage is ''.
68
+ */
69
+ stateHash(branch?: string): string;
70
+ /** Deterministic replay of a branch lineage: event count + state hash. */
71
+ replay(branch?: string): {
72
+ eventCount: number;
73
+ stateHash: string;
74
+ };
75
+ /** Re-read the file from disk and report every validation error
76
+ * ('session: '-prefixed, corrupted lines cited by 1-based line number).
77
+ * An empty array means the on-disk log is valid. */
78
+ validate(): Promise<string[]>;
79
+ }
80
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;oDAOoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAQhD;AA8JD;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAW;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS;IAWzC,0EAA0E;IAC1E,OAAO,CAAC,MAAM,CAAC,IAAI;IAMnB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;OAIG;WACU,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IASrE;kFAC8E;IACxE,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GACpD,OAAO,CAAC,YAAY,CAAC;IA8BxB;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAenE;sEACkE;IAClE,OAAO,CAAC,OAAO;IAYf;;;;;OAKG;IACH,SAAS,CAAC,MAAM,GAAE,MAAoB,GAAG,MAAM;IAU/C,0EAA0E;IAC1E,MAAM,CAAC,MAAM,GAAE,MAAoB,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAI/E;;wDAEoD;IAC9C,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAKpC"}
@@ -0,0 +1,316 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // Recoverable session log — ADR-246 §2.3.
4
+ //
5
+ // Append-only JSONL event log per session: every event carries a per-branch
6
+ // monotonic index and (for the first event of a forked branch) a parent
7
+ // reference {branch, index}. Replaying the log reconstructs session state
8
+ // deterministically; a state hash over the replayed lineage verifies
9
+ // integrity. Fork creates a new branch ID referencing a parent event index;
10
+ // branches replay independently (Prime Agent's /tree capability, minus the
11
+ // daemon — daemons, socket attach/detach, and kernel snapshots are
12
+ // deliberately out of scope per the ADR).
13
+ //
14
+ // Serialization contract (a Rust mirror must reproduce it byte-for-byte):
15
+ // each event is one line, JSON.stringify of an object literal built in
16
+ // EXACT key order
17
+ // index, branch, parent, kind, payload
18
+ // with `parent` (itself in key order branch, index) omitted entirely when
19
+ // absent.
20
+ //
21
+ // State-hash fold (a Rust mirror must reproduce it byte-for-byte):
22
+ // hexPrev := '' // empty string seed, NOT a digest
23
+ // for each event e in lineage order (root → tip):
24
+ // canonical := canonicalJson(e) // recursively key-sorted JSON of the event
25
+ // hexPrev := lowercaseHex(sha256(utf8(hexPrev + canonical)))
26
+ // stateHash := hexPrev
27
+ // i.e. digest_i = sha256(hex(digest_{i-1}) + canonicalJson(event_i)) as UTF-8,
28
+ // where hex(digest_0) is the empty string for the first event, and every
29
+ // digest is rendered as lowercase hex before being folded into the next step.
30
+ import { appendFile, readFile } from 'node:fs/promises';
31
+ import { existsSync } from 'node:fs';
32
+ import { createHash } from 'node:crypto';
33
+ import { Buffer } from 'node:buffer';
34
+ /** Canonical JSON: recursively key-sorted objects, arrays in order, no
35
+ * whitespace. `undefined` object values are dropped (matching
36
+ * JSON.stringify). This is the byte input to the state-hash fold.
37
+ *
38
+ * Keys sort by UTF-8 BYTE order (not UTF-16 code-unit order, which the
39
+ * default `.sort()` would use) to match the Rust mirror, whose `&str`
40
+ * ordering is byte-wise. The two orders diverge for keys mixing BMP-high
41
+ * characters (>= U+E000) with astral characters. */
42
+ export function canonicalJson(v) {
43
+ if (v === null || typeof v !== 'object')
44
+ return JSON.stringify(v) ?? 'null';
45
+ if (Array.isArray(v))
46
+ return '[' + v.map(x => canonicalJson(x)).join(',') + ']';
47
+ const rec = v;
48
+ const keys = Object.keys(rec)
49
+ .filter(k => rec[k] !== undefined)
50
+ .sort((a, b) => Buffer.compare(Buffer.from(a, 'utf8'), Buffer.from(b, 'utf8')));
51
+ return '{' + keys.map(k => JSON.stringify(k) + ':' + canonicalJson(rec[k])).join(',') + '}';
52
+ }
53
+ /** A raw unpaired surrogate: a lead surrogate not followed by a trail, or
54
+ * a trail surrogate not preceded by a lead. Rust (serde_json) cannot parse
55
+ * these — they are not valid UTF-8. */
56
+ const LONE_SURROGATE = /(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])/;
57
+ /** Well-formed JSON.stringify (ES2019) never emits a raw lone surrogate:
58
+ * it renders one as a `\udXXX` escape (paired surrogates pass through as
59
+ * raw astral characters, so any surrogate escape in stringify output IS a
60
+ * lone surrogate). A genuine escape is preceded by an even number of
61
+ * backslashes; an odd run means the backslash itself is escaped text. */
62
+ const LONE_SURROGATE_ESCAPE = /(?<=(?:^|[^\\])(?:\\\\)*)\\u[dD][89abAB]/;
63
+ /** Recursively test decoded JSON data (string values AND object keys) for a
64
+ * raw unpaired surrogate. Used on the READ path, where the raw line may
65
+ * legitimately contain paired `\udXXX` escapes (valid JSON that serde_json
66
+ * accepts), so the append-path escape regex cannot be reused: after
67
+ * JSON.parse, a valid pair decodes to an astral character while a lone
68
+ * surrogate stays lone — exactly what serde_json rejects as not-UTF-8. */
69
+ function containsLoneSurrogate(v) {
70
+ if (typeof v === 'string')
71
+ return LONE_SURROGATE.test(v);
72
+ if (v === null || typeof v !== 'object')
73
+ return false;
74
+ if (Array.isArray(v))
75
+ return v.some(containsLoneSurrogate);
76
+ return Object.entries(v).some(([k, val]) => LONE_SURROGATE.test(k) || containsLoneSurrogate(val));
77
+ }
78
+ /** Serialize one event as a JSONL line in the EXACT wire key order
79
+ * (index, branch, parent, kind, payload; parent omitted when absent). */
80
+ function serializeEvent(e) {
81
+ return JSON.stringify(e.parent === undefined
82
+ ? { index: e.index, branch: e.branch, kind: e.kind, payload: e.payload }
83
+ : {
84
+ index: e.index,
85
+ branch: e.branch,
86
+ parent: { branch: e.parent.branch, index: e.parent.index },
87
+ kind: e.kind,
88
+ payload: e.payload,
89
+ });
90
+ }
91
+ /** Parse + validate a JSONL log; returns either the reconstructed state or
92
+ * the list of 'session: '-prefixed errors (with 1-based line numbers).
93
+ *
94
+ * NOTE: the ADR-246 lockstep contract with the Rust mirror is the state
95
+ * hash plus the accept/reject decision; validation MESSAGES are
96
+ * per-language diagnostics (TS cites 1-based line numbers, Rust does not)
97
+ * and are not required to match byte-for-byte. */
98
+ function parseLog(path, raw) {
99
+ const state = {
100
+ path,
101
+ events: [],
102
+ nextIndex: new Map(),
103
+ branchParent: new Map(),
104
+ rootBranch: '',
105
+ };
106
+ const errors = [];
107
+ const seen = new Set();
108
+ const lines = raw.split('\n');
109
+ for (let i = 0; i < lines.length; i++) {
110
+ const line = lines[i];
111
+ if (line.trim() === '')
112
+ continue; // blank / whitespace-only separators (still counted for line numbers)
113
+ const lineNo = i + 1;
114
+ let obj;
115
+ try {
116
+ obj = JSON.parse(line);
117
+ }
118
+ catch {
119
+ errors.push(`session: line ${lineNo}: corrupted line (invalid JSON)`);
120
+ continue;
121
+ }
122
+ // Mirror serde_json's accept/reject decision: a lone surrogate (decoded
123
+ // from a `\udXXX` escape — JSON.parse tolerates it, serde_json does not)
124
+ // is not representable as UTF-8, so the Rust mirror rejects the line.
125
+ if (containsLoneSurrogate(obj)) {
126
+ errors.push(`session: line ${lineNo}: corrupted line (contains an unpaired surrogate, not valid UTF-8)`);
127
+ continue;
128
+ }
129
+ const e = obj;
130
+ if (typeof e !== 'object' || e === null ||
131
+ typeof e.index !== 'number' || typeof e.branch !== 'string' ||
132
+ typeof e.kind !== 'string' || !('payload' in e) ||
133
+ (e.parent !== undefined &&
134
+ (typeof e.parent !== 'object' || e.parent === null ||
135
+ typeof e.parent.branch !== 'string' || typeof e.parent.index !== 'number'))) {
136
+ errors.push(`session: line ${lineNo}: corrupted line (not a valid session event)`);
137
+ continue;
138
+ }
139
+ const ev = e;
140
+ const key = `${ev.branch}\u0000${ev.index}`;
141
+ if (seen.has(key)) {
142
+ errors.push(`session: line ${lineNo}: duplicate event (${ev.branch}, ${ev.index})`);
143
+ continue;
144
+ }
145
+ const expected = state.nextIndex.get(ev.branch) ?? 0;
146
+ if (ev.index !== expected) {
147
+ errors.push(`session: line ${lineNo}: branch "${ev.branch}" index ${ev.index} is not monotonic (expected ${expected})`);
148
+ // Resync like the Rust mirror: after reporting index X, expect X+1
149
+ // next, so a single gap yields exactly ONE error, not a cascade.
150
+ seen.add(key);
151
+ state.nextIndex.set(ev.branch, ev.index + 1);
152
+ continue;
153
+ }
154
+ if (expected === 0) {
155
+ // First event of a branch: the root branch (first branch in the file)
156
+ // carries no parent; every other branch MUST reference an existing
157
+ // (branch, index) already present in the log.
158
+ if (state.events.length === 0) {
159
+ state.rootBranch = ev.branch;
160
+ if (ev.parent !== undefined) {
161
+ errors.push(`session: line ${lineNo}: root branch '${ev.branch}' must not carry a parent`);
162
+ continue;
163
+ }
164
+ }
165
+ else {
166
+ if (ev.parent === undefined) {
167
+ errors.push(`session: line ${lineNo}: first event of branch "${ev.branch}" must carry a parent reference`);
168
+ continue;
169
+ }
170
+ if (!seen.has(`${ev.parent.branch}\u0000${ev.parent.index}`)) {
171
+ errors.push(`session: line ${lineNo}: parent (${ev.parent.branch}, ${ev.parent.index}) does not exist`);
172
+ continue;
173
+ }
174
+ state.branchParent.set(ev.branch, { branch: ev.parent.branch, index: ev.parent.index });
175
+ }
176
+ }
177
+ seen.add(key);
178
+ state.events.push(ev);
179
+ state.nextIndex.set(ev.branch, expected + 1);
180
+ }
181
+ return { state, errors };
182
+ }
183
+ /**
184
+ * Crash-recoverable, forkable session log (ADR-246 §2.3). One JSONL file may
185
+ * carry many branches; each SessionLog instance appends to ONE active branch.
186
+ * `fork()` returns a sibling over the same file/state on a new branch.
187
+ */
188
+ export class SessionLog {
189
+ state;
190
+ /** Active branch this instance appends to. */
191
+ branch;
192
+ constructor(path, branch = 'main') {
193
+ this.state = {
194
+ path,
195
+ events: [],
196
+ nextIndex: new Map(),
197
+ branchParent: new Map(),
198
+ rootBranch: branch,
199
+ };
200
+ this.branch = branch;
201
+ }
202
+ /** Internal: build an instance over existing shared state (open/fork). */
203
+ static over(state, branch) {
204
+ const log = new SessionLog(state.path, branch);
205
+ log.state = state;
206
+ return log;
207
+ }
208
+ get path() {
209
+ return this.state.path;
210
+ }
211
+ /**
212
+ * Resume a session: read the JSONL log, validate it, and reconstruct state.
213
+ * Throws with the first 'session: '-prefixed error on an invalid log.
214
+ * `branch` selects the active branch (default 'main').
215
+ */
216
+ static async open(path, branch = 'main') {
217
+ if (!existsSync(path))
218
+ return new SessionLog(path, branch);
219
+ const raw = await readFile(path, 'utf-8');
220
+ const { state, errors } = parseLog(path, raw);
221
+ if (errors.length > 0)
222
+ throw new Error(errors[0]);
223
+ if (state.events.length === 0)
224
+ return new SessionLog(path, branch);
225
+ return SessionLog.over(state, branch);
226
+ }
227
+ /** Append an event on the active branch, assigning the next monotonic
228
+ * index. The first event of a forked branch carries the fork's parent ref. */
229
+ async append(kind, payload, opts) {
230
+ const index = this.state.nextIndex.get(this.branch) ?? 0;
231
+ const parent = opts?.parent;
232
+ const isRoot = this.state.events.length === 0 || this.branch === this.state.rootBranch;
233
+ if (index === 0 && !isRoot && parent === undefined) {
234
+ throw new Error(`session: first event of branch "${this.branch}" must carry a parent reference`);
235
+ }
236
+ const event = parent === undefined
237
+ ? { index, branch: this.branch, kind, payload }
238
+ : { index, branch: this.branch, parent, kind, payload };
239
+ const line = serializeEvent(event);
240
+ // Reject events the Rust mirror cannot parse: a lone surrogate is not
241
+ // valid UTF-8 (raw form), and serde_json also rejects its `\udXXX`
242
+ // escaped form, which well-formed JSON.stringify emits for it.
243
+ if (LONE_SURROGATE.test(line) || LONE_SURROGATE_ESCAPE.test(line)) {
244
+ throw new Error('session: event contains an unpaired surrogate (not valid UTF-8)');
245
+ }
246
+ await appendFile(this.state.path, line + '\n', 'utf-8');
247
+ if (this.state.events.length === 0)
248
+ this.state.rootBranch = this.branch;
249
+ if (index === 0 && parent !== undefined) {
250
+ this.state.branchParent.set(this.branch, parent);
251
+ }
252
+ this.state.events.push(event);
253
+ this.state.nextIndex.set(this.branch, index + 1);
254
+ return event;
255
+ }
256
+ /**
257
+ * Fork at `atIndex` on THIS instance's active branch: returns a SessionLog
258
+ * over the same file (and shared state) whose active branch is `newBranch`.
259
+ * Immediately appends the new branch's synthetic first event (matching the
260
+ * Rust mirror's `fork`): index 0, parent {branch: this.branch, index:
261
+ * atIndex}, kind 'fork', payload null.
262
+ */
263
+ async fork(atIndex, newBranch) {
264
+ const count = this.state.nextIndex.get(this.branch) ?? 0;
265
+ if (atIndex < 0 || atIndex >= count) {
266
+ throw new Error(`session: cannot fork branch "${this.branch}" at index ${atIndex} (has ${count} events)`);
267
+ }
268
+ if ((this.state.nextIndex.get(newBranch) ?? 0) > 0 || newBranch === this.branch) {
269
+ throw new Error(`session: branch "${newBranch}" already exists`);
270
+ }
271
+ const forked = SessionLog.over(this.state, newBranch);
272
+ await forked.append('fork', null, { parent: { branch: this.branch, index: atIndex } });
273
+ return forked;
274
+ }
275
+ /** The lineage of a branch, root → tip: the branch's own events preceded by
276
+ * its parent lineage truncated at the fork point, recursively. */
277
+ lineage(branch) {
278
+ const own = this.state.events
279
+ .filter(e => e.branch === branch)
280
+ .sort((a, b) => a.index - b.index);
281
+ const parent = this.state.branchParent.get(branch);
282
+ if (!parent)
283
+ return own;
284
+ const upstream = this.lineage(parent.branch).filter(e => e.branch !== parent.branch || e.index <= parent.index);
285
+ return [...upstream, ...own];
286
+ }
287
+ /**
288
+ * State hash over the branch lineage (root → tip). Exact fold (mirrored in
289
+ * the file-header comment; a Rust mirror must reproduce it):
290
+ * hexPrev = ''; for each event: hexPrev = hex(sha256(utf8(hexPrev + canonicalJson(event))))
291
+ * Returns lowercase hex; the hash of an empty lineage is ''.
292
+ */
293
+ stateHash(branch = this.branch) {
294
+ let hexPrev = '';
295
+ for (const e of this.lineage(branch)) {
296
+ hexPrev = createHash('sha256')
297
+ .update(hexPrev + canonicalJson(e), 'utf-8')
298
+ .digest('hex');
299
+ }
300
+ return hexPrev;
301
+ }
302
+ /** Deterministic replay of a branch lineage: event count + state hash. */
303
+ replay(branch = this.branch) {
304
+ return { eventCount: this.lineage(branch).length, stateHash: this.stateHash(branch) };
305
+ }
306
+ /** Re-read the file from disk and report every validation error
307
+ * ('session: '-prefixed, corrupted lines cited by 1-based line number).
308
+ * An empty array means the on-disk log is valid. */
309
+ async validate() {
310
+ if (!existsSync(this.state.path))
311
+ return [];
312
+ const raw = await readFile(this.state.path, 'utf-8');
313
+ return parseLog(this.state.path, raw).errors;
314
+ }
315
+ }
316
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -31,6 +31,22 @@ export interface HarnessSpec {
31
31
  deny?: string[];
32
32
  };
33
33
  statusLine?: string;
34
+ /**
35
+ * Autonomous-mode fields (ADR-246 §2.2). Host adapters must project this
36
+ * block per host or emit an explicit documented no-op — never silently drop.
37
+ */
38
+ autonomous?: {
39
+ goal?: {
40
+ text: string;
41
+ tokenBudget?: number;
42
+ };
43
+ heartbeat?: {
44
+ cadence: string;
45
+ instruction: string;
46
+ };
47
+ gateCommand?: string;
48
+ maxTurns?: number;
49
+ };
34
50
  }
35
51
  export interface HostAdapter {
36
52
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,SAAS,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaharness/kernel",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Cross-platform kernel for the agent-harness-generator — wasm primary, NAPI-RS native fallback",
5
5
  "homepage": "https://github.com/ruvnet/agent-harness-generator",
6
6
  "repository": {
@@ -41,7 +41,7 @@
41
41
  "build": "tsc",
42
42
  "test": "vitest run",
43
43
  "lint": "tsc --noEmit",
44
- "build:wasm": "RUSTFLAGS= wasm-pack build ../../crates/kernel-wasm --target nodejs --release --out-dir pkg && node -e \"const f=require('fs');const j=require('./pkg/package.json');j.type='commonjs';f.writeFileSync('./pkg/package.json',JSON.stringify(j,null,2)+'\\n')\""
44
+ "build:wasm": "RUSTFLAGS= wasm-pack build ../../crates/kernel-wasm --target nodejs --release --out-dir ../../packages/kernel-js/pkg && rm -f pkg/.gitignore && node -e \"const f=require('fs');const j=require('./pkg/package.json');j.type='commonjs';f.writeFileSync('./pkg/package.json',JSON.stringify(j,null,2)+'\\n')\""
45
45
  },
46
46
  "keywords": [
47
47
  "agent-harness",