zelari-code 2.9.2 → 2.11.0

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.
@@ -0,0 +1,91 @@
1
+ import { parseControlLine, startControlReader } from './controlReader.js';
2
+ import { controlAcceptedEvent, controlAppliedEvent, controlRejectedEvent, } from './protocol.js';
3
+ const APPLIED_BOUNDARY = {
4
+ steer: 'turn-end',
5
+ follow_up: 'run-end',
6
+ cancel: 'cancel',
7
+ };
8
+ export function attachControlPlane(opts) {
9
+ const { input, queue, emit, onCancel } = opts;
10
+ let finalized = false;
11
+ // §24: emit control_applied exactly when the runtime consumes events —
12
+ // the queue's onDrained hook fires inside SteeringObserver.drainSteers().
13
+ queue.onDrained = (events) => {
14
+ for (const event of events) {
15
+ emit(controlAppliedEvent(event.id, event.type, APPLIED_BOUNDARY[event.type] ?? 'unknown'));
16
+ }
17
+ const cancels = events.filter((e) => e.type === 'cancel');
18
+ if (cancels.length > 0 && onCancel) {
19
+ const last = cancels[cancels.length - 1];
20
+ onCancel(last.type === 'cancel' ? last.reason : undefined);
21
+ }
22
+ };
23
+ const disposeReader = startControlReader(input, (line) => {
24
+ const outcome = parseControlLine(line);
25
+ if (outcome === null)
26
+ return; // blank line
27
+ if (!outcome.ok) {
28
+ emit(controlRejectedEvent(outcome.id, outcome.reason));
29
+ return;
30
+ }
31
+ const event = outcome.event;
32
+ if (event.type === 'pause' || event.type === 'resume') {
33
+ // Carried by the ControlEvent union (§23) but not yet mapped onto
34
+ // runtime semantics — reject explicitly instead of silent drop.
35
+ emit(controlRejectedEvent(event.id, `${event.type} is not supported yet`));
36
+ return;
37
+ }
38
+ if (finalized) {
39
+ // Run already over (§28): a steer this late can still matter, keep it
40
+ // as a follow-up so the host chains it as the next task.
41
+ if (event.type === 'steer') {
42
+ const converted = toFollowUp(event);
43
+ queue.enqueue(converted);
44
+ emit(controlAppliedEvent(event.id, 'steer', 'converted-to-follow-up'));
45
+ emit(controlAcceptedEvent(converted.id, 'follow_up'));
46
+ }
47
+ else if (event.type === 'follow_up') {
48
+ queue.enqueue(event);
49
+ emit(controlAcceptedEvent(event.id, 'follow_up'));
50
+ }
51
+ else {
52
+ emit(controlRejectedEvent(event.id, 'run already finished'));
53
+ }
54
+ return;
55
+ }
56
+ queue.enqueue(event);
57
+ emit(controlAcceptedEvent(event.id, event.type));
58
+ });
59
+ return {
60
+ dispose() {
61
+ disposeReader();
62
+ queue.onDrained = undefined;
63
+ },
64
+ finalize() {
65
+ finalized = true;
66
+ // §28: steers that never reached a boundary become follow-ups.
67
+ const lateSteers = queue.drainSteers();
68
+ for (const steer of lateSteers) {
69
+ queue.enqueue(toFollowUp(steer));
70
+ emit(controlAppliedEvent(steer.id, 'steer', 'converted-to-follow-up'));
71
+ }
72
+ const followUps = queue.drainFollowUps();
73
+ for (const followUp of followUps) {
74
+ emit(controlAppliedEvent(followUp.id, 'follow_up', 'run-end'));
75
+ }
76
+ return followUps.map((f) => f.text);
77
+ },
78
+ get finalized() {
79
+ return finalized;
80
+ },
81
+ };
82
+ }
83
+ function toFollowUp(steer) {
84
+ return {
85
+ type: 'follow_up',
86
+ id: `fu-${steer.id}`,
87
+ text: steer.text,
88
+ ts: steer.ts,
89
+ };
90
+ }
91
+ //# sourceMappingURL=controlBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlBridge.js","sourceRoot":"","sources":["../../../src/cli/headless/controlBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ const CONTROL_TYPES = new Set([
2
+ 'steer',
3
+ 'follow_up',
4
+ 'cancel',
5
+ 'pause',
6
+ 'resume',
7
+ ]);
8
+ /** Validate one parsed JSON object as a ControlEvent (shape-level check). */
9
+ export function parseControlEvent(raw) {
10
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
11
+ return { ok: false, id: '', reason: 'control event must be a JSON object' };
12
+ }
13
+ const candidate = raw;
14
+ const type = candidate['type'];
15
+ if (typeof type !== 'string' || !CONTROL_TYPES.has(type)) {
16
+ return {
17
+ ok: false,
18
+ id: typeof candidate['id'] === 'string' ? candidate['id'] : '',
19
+ reason: `unknown control type: ${String(type)}`,
20
+ };
21
+ }
22
+ if (typeof candidate['id'] !== 'string' || candidate['id'].length === 0) {
23
+ return { ok: false, id: '', reason: 'missing control id' };
24
+ }
25
+ if (type === 'steer' || type === 'follow_up') {
26
+ if (typeof candidate['text'] !== 'string' ||
27
+ candidate['text'].trim().length === 0) {
28
+ return {
29
+ ok: false,
30
+ id: candidate['id'],
31
+ reason: `${type} requires a non-empty "text" field`,
32
+ };
33
+ }
34
+ }
35
+ if (type === 'cancel' &&
36
+ 'reason' in candidate &&
37
+ candidate['reason'] !== undefined &&
38
+ typeof candidate['reason'] !== 'string') {
39
+ return {
40
+ ok: false,
41
+ id: candidate['id'],
42
+ reason: 'cancel reason must be a string',
43
+ };
44
+ }
45
+ return {
46
+ ok: true,
47
+ event: {
48
+ ...candidate,
49
+ ts: typeof candidate['ts'] === 'number' ? candidate['ts'] : Date.now(),
50
+ },
51
+ };
52
+ }
53
+ /** Parse one NDJSON line; empty/whitespace lines return null (ignored). */
54
+ export function parseControlLine(line) {
55
+ const trimmed = line.trim();
56
+ if (trimmed.length === 0)
57
+ return null;
58
+ try {
59
+ return parseControlEvent(JSON.parse(trimmed));
60
+ }
61
+ catch (e) {
62
+ return { ok: false, id: '', reason: `malformed JSON: ${e.message}` };
63
+ }
64
+ }
65
+ /**
66
+ * Attach a line-buffered reader to a readable stream. Returns a dispose
67
+ * function that detaches listeners without closing the stream.
68
+ */
69
+ export function startControlReader(input, onLine) {
70
+ let buffer = '';
71
+ const onData = (chunk) => {
72
+ buffer += typeof chunk === 'string' ? chunk : chunk.toString('utf8');
73
+ let newlineIndex = buffer.indexOf('\n');
74
+ while (newlineIndex !== -1) {
75
+ const line = buffer.slice(0, newlineIndex);
76
+ buffer = buffer.slice(newlineIndex + 1);
77
+ if (line.trim().length > 0)
78
+ onLine(line.replace(/\r$/, ''));
79
+ newlineIndex = buffer.indexOf('\n');
80
+ }
81
+ };
82
+ input.on('data', onData);
83
+ return () => {
84
+ input.removeListener('data', onData);
85
+ buffer = '';
86
+ };
87
+ }
88
+ //# sourceMappingURL=controlReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlReader.js","sourceRoot":"","sources":["../../../src/cli/headless/controlReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Headless control-plane protocol v2 (Frontier upgrade PHASE 2, §35).
3
+ *
4
+ * Event factories for the bidirectional headless channel:
5
+ * stdin ← ControlEvent NDJSON (see controlReader.ts)
6
+ * stdout → BrainEvent NDJSON (acks below + protocol_info handshake)
7
+ *
8
+ * Desktop must gate Steer UI on `protocol_info.version >= 2` and on
9
+ * `control_accepted` (never assume stdin writes took effect, §24).
10
+ */
11
+ /** Bump when the stdout event set or stdin contract changes. */
12
+ export const HEADLESS_PROTOCOL_VERSION = 2;
13
+ /** Capabilities advertised by this CLI build (§35). */
14
+ export const HEADLESS_PROTOCOL_CAPABILITIES = [
15
+ 'stdin-control',
16
+ 'steer',
17
+ 'follow_up',
18
+ 'cancel',
19
+ ];
20
+ export function protocolInfoEvent() {
21
+ return {
22
+ type: 'protocol_info',
23
+ version: HEADLESS_PROTOCOL_VERSION,
24
+ capabilities: HEADLESS_PROTOCOL_CAPABILITIES,
25
+ ts: Date.now(),
26
+ };
27
+ }
28
+ export function controlAcceptedEvent(controlId, controlType) {
29
+ return {
30
+ type: 'control_accepted',
31
+ controlId,
32
+ controlType,
33
+ ts: Date.now(),
34
+ };
35
+ }
36
+ export function controlAppliedEvent(controlId, controlType, boundary) {
37
+ return {
38
+ type: 'control_applied',
39
+ controlId,
40
+ controlType,
41
+ boundary,
42
+ ts: Date.now(),
43
+ };
44
+ }
45
+ export function controlRejectedEvent(controlId, reason) {
46
+ return {
47
+ type: 'control_rejected',
48
+ controlId,
49
+ reason,
50
+ ts: Date.now(),
51
+ };
52
+ }
53
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/cli/headless/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,uDAAuD;AACvD,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,eAAe;IACf,OAAO;IACP,WAAW;IACX,QAAQ;CACA,CAAC;AAEX,MAAM,UAAU,iBAAiB;IAM/B,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,yBAAyB;QAClC,YAAY,EAAE,8BAA8B;QAC5C,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;KACf,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,WAAmB;IAEnB,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,SAAS;QACT,WAAW;QACX,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,WAAmB,EACnB,QAAgB;IAEhB,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,SAAS;QACT,WAAW;QACX,QAAQ;QACR,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,MAAc;IAEd,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,SAAS;QACT,MAAM;QACN,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;KACf,CAAC;AACJ,CAAC"}