deepclause-sdk 0.1.2 → 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.
Files changed (122) hide show
  1. package/README.md +45 -6
  2. package/dist/cli/config.d.ts +2 -2
  3. package/dist/cli/repl.d.ts +55 -4
  4. package/dist/cli/repl.d.ts.map +1 -1
  5. package/dist/cli/repl.js +675 -52
  6. package/dist/cli/repl.js.map +1 -1
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +3 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/prolog-src/deepclause_mi.pl +516 -2
  12. package/dist/repl/backend.d.ts +9 -0
  13. package/dist/repl/backend.d.ts.map +1 -1
  14. package/dist/repl/backend.js +62 -5
  15. package/dist/repl/backend.js.map +1 -1
  16. package/dist/repl/harness-tools.d.ts +36 -0
  17. package/dist/repl/harness-tools.d.ts.map +1 -1
  18. package/dist/repl/harness-tools.js +173 -0
  19. package/dist/repl/harness-tools.js.map +1 -1
  20. package/dist/repl/history.d.ts +29 -0
  21. package/dist/repl/history.d.ts.map +1 -1
  22. package/dist/repl/history.js +71 -0
  23. package/dist/repl/history.js.map +1 -1
  24. package/dist/repl/index.d.ts +6 -0
  25. package/dist/repl/index.d.ts.map +1 -1
  26. package/dist/repl/index.js +9 -1
  27. package/dist/repl/index.js.map +1 -1
  28. package/dist/repl/picker.d.ts +3 -0
  29. package/dist/repl/picker.d.ts.map +1 -1
  30. package/dist/repl/picker.js +132 -0
  31. package/dist/repl/picker.js.map +1 -1
  32. package/dist/repl/process-backend.d.ts +31 -0
  33. package/dist/repl/process-backend.d.ts.map +1 -0
  34. package/dist/repl/process-backend.js +10 -0
  35. package/dist/repl/process-backend.js.map +1 -0
  36. package/dist/repl/process-executor.d.ts +67 -0
  37. package/dist/repl/process-executor.d.ts.map +1 -0
  38. package/dist/repl/process-executor.js +371 -0
  39. package/dist/repl/process-executor.js.map +1 -0
  40. package/dist/repl/process-worker.d.ts +10 -0
  41. package/dist/repl/process-worker.d.ts.map +1 -0
  42. package/dist/repl/process-worker.js +210 -0
  43. package/dist/repl/process-worker.js.map +1 -0
  44. package/dist/repl/processes.d.ts +282 -0
  45. package/dist/repl/processes.d.ts.map +1 -0
  46. package/dist/repl/processes.js +557 -0
  47. package/dist/repl/processes.js.map +1 -0
  48. package/dist/repl/render.d.ts +52 -2
  49. package/dist/repl/render.d.ts.map +1 -1
  50. package/dist/repl/render.js +52 -17
  51. package/dist/repl/render.js.map +1 -1
  52. package/dist/repl/session.d.ts +135 -3
  53. package/dist/repl/session.d.ts.map +1 -1
  54. package/dist/repl/session.js +413 -4
  55. package/dist/repl/session.js.map +1 -1
  56. package/dist/repl/status.d.ts +3 -1
  57. package/dist/repl/status.d.ts.map +1 -1
  58. package/dist/repl/status.js +4 -0
  59. package/dist/repl/status.js.map +1 -1
  60. package/dist/repl/tui/autocomplete.d.ts +19 -0
  61. package/dist/repl/tui/autocomplete.d.ts.map +1 -0
  62. package/dist/repl/tui/autocomplete.js +48 -0
  63. package/dist/repl/tui/autocomplete.js.map +1 -0
  64. package/dist/repl/tui/document.d.ts +51 -0
  65. package/dist/repl/tui/document.d.ts.map +1 -0
  66. package/dist/repl/tui/document.js +160 -0
  67. package/dist/repl/tui/document.js.map +1 -0
  68. package/dist/repl/tui/harness-view.d.ts +102 -0
  69. package/dist/repl/tui/harness-view.d.ts.map +1 -0
  70. package/dist/repl/tui/harness-view.js +323 -0
  71. package/dist/repl/tui/harness-view.js.map +1 -0
  72. package/dist/repl/tui/picker.d.ts +31 -0
  73. package/dist/repl/tui/picker.d.ts.map +1 -0
  74. package/dist/repl/tui/picker.js +43 -0
  75. package/dist/repl/tui/picker.js.map +1 -0
  76. package/dist/repl/tui/renderer.d.ts +98 -0
  77. package/dist/repl/tui/renderer.d.ts.map +1 -0
  78. package/dist/repl/tui/renderer.js +289 -0
  79. package/dist/repl/tui/renderer.js.map +1 -0
  80. package/dist/repl/tui/services-panel.d.ts +35 -0
  81. package/dist/repl/tui/services-panel.d.ts.map +1 -0
  82. package/dist/repl/tui/services-panel.js +108 -0
  83. package/dist/repl/tui/services-panel.js.map +1 -0
  84. package/dist/repl/tui/status-bar.d.ts +6 -2
  85. package/dist/repl/tui/status-bar.d.ts.map +1 -1
  86. package/dist/repl/tui/status-bar.js +82 -24
  87. package/dist/repl/tui/status-bar.js.map +1 -1
  88. package/dist/repl/tui/terminal.d.ts +28 -0
  89. package/dist/repl/tui/terminal.d.ts.map +1 -0
  90. package/dist/repl/tui/terminal.js +94 -0
  91. package/dist/repl/tui/terminal.js.map +1 -0
  92. package/dist/repl/tui/theme.d.ts +60 -0
  93. package/dist/repl/tui/theme.d.ts.map +1 -1
  94. package/dist/repl/tui/theme.js +142 -0
  95. package/dist/repl/tui/theme.js.map +1 -1
  96. package/dist/repl/tui/tool-pane.d.ts +68 -0
  97. package/dist/repl/tui/tool-pane.d.ts.map +1 -0
  98. package/dist/repl/tui/tool-pane.js +261 -0
  99. package/dist/repl/tui/tool-pane.js.map +1 -0
  100. package/dist/repl/tui/working-line.d.ts +23 -0
  101. package/dist/repl/tui/working-line.d.ts.map +1 -0
  102. package/dist/repl/tui/working-line.js +58 -0
  103. package/dist/repl/tui/working-line.js.map +1 -0
  104. package/dist/repl/worker-host.d.ts +80 -0
  105. package/dist/repl/worker-host.d.ts.map +1 -0
  106. package/dist/repl/worker-host.js +305 -0
  107. package/dist/repl/worker-host.js.map +1 -0
  108. package/dist/repl/worker-protocol.d.ts +123 -0
  109. package/dist/repl/worker-protocol.d.ts.map +1 -0
  110. package/dist/repl/worker-protocol.js +9 -0
  111. package/dist/repl/worker-protocol.js.map +1 -0
  112. package/dist/runner.d.ts +24 -0
  113. package/dist/runner.d.ts.map +1 -1
  114. package/dist/runner.js +47 -0
  115. package/dist/runner.js.map +1 -1
  116. package/dist/system/assets/docs/AGENT_PROMPT.md +193 -0
  117. package/dist/system/assets/docs/DML_AUTHORING.md +21 -0
  118. package/dist/system/assets/docs/DML_REFERENCE.md +145 -0
  119. package/dist/types.d.ts +7 -0
  120. package/dist/types.d.ts.map +1 -1
  121. package/package.json +2 -1
  122. package/src/prolog-src/deepclause_mi.pl +516 -2
@@ -0,0 +1,557 @@
1
+ /**
2
+ * Session-scoped processes for the REPL (L1 core).
3
+ *
4
+ * This module is the host bookkeeping and the L1↔L2 seam from
5
+ * `docs/DML_REPL_PROCESSES_SPEC.md` §2. It owns process identity, mailboxes,
6
+ * links, monitors, naming, limits, and lifecycle events. It does **not** drive
7
+ * Prolog; a `ProcessBody` is an opaque async function, and the DML layer supplies
8
+ * bodies that step a runner frame.
9
+ *
10
+ * Keeping the bodies opaque is what makes L2 a mode switch: a worker-backed host
11
+ * implements the same interface with RPC bodies and node-qualified pids, and
12
+ * nothing above this module changes.
13
+ *
14
+ * Invariants enforced here (spec §6.2):
15
+ * - pids are node-qualified (`node: 'main'` in v1);
16
+ * - messages are copied (value semantics), never shared by reference;
17
+ * - process info and events are plain data;
18
+ * - there is no UI dependency.
19
+ */
20
+ export function pidKey(pid) {
21
+ return `${pid.node}:${pid.session}:${pid.id}`;
22
+ }
23
+ /** Quote a string as a Prolog atom when it is not a plain lowercase atom. */
24
+ export function prologAtom(text) {
25
+ return /^[a-z][A-Za-z0-9_]*$/.test(text) ? text : `'${text.replace(/'/g, "''")}'`;
26
+ }
27
+ /** The canonical Prolog term for a pid: `proc(Node,Session,Id)`. */
28
+ export function pidTermText(pid) {
29
+ return `proc(${prologAtom(pid.node)},${prologAtom(pid.session)},${prologAtom(pid.id)})`;
30
+ }
31
+ /** Parse `proc(Node,Session,Id)` back to a pid, or undefined. */
32
+ export function parsePidTerm(text) {
33
+ const match = /^proc\(([^,]+),([^,]+),([^)]+)\)$/.exec(text.trim());
34
+ if (!match)
35
+ return undefined;
36
+ const unquote = (part) => {
37
+ const trimmed = part.trim();
38
+ const quoted = /^'(.*)'$/s.exec(trimmed);
39
+ return quoted ? quoted[1].replace(/''/g, "'") : trimmed;
40
+ };
41
+ return { node: unquote(match[1]), session: unquote(match[2]), id: unquote(match[3]) };
42
+ }
43
+ /** Thrown by `ProcessContext.exit` to terminate the current process. */
44
+ export class ProcessExit extends Error {
45
+ reason;
46
+ constructor(reason) {
47
+ super(typeof reason === 'string' ? reason : 'process exited');
48
+ this.reason = reason;
49
+ this.name = 'ProcessExit';
50
+ }
51
+ }
52
+ /** Raised when sending to a process that is gone. */
53
+ export class NoProcError extends Error {
54
+ pid;
55
+ code = 'noproc';
56
+ constructor(pid) {
57
+ super(`no process: ${pidKey(pid)}`);
58
+ this.pid = pid;
59
+ this.name = 'NoProcError';
60
+ }
61
+ }
62
+ /** Raised when a mailbox is full (spec §13.3). */
63
+ export class MailboxFullError extends Error {
64
+ pid;
65
+ code = 'mailbox_full';
66
+ constructor(pid) {
67
+ super(`mailbox full: ${pidKey(pid)}`);
68
+ this.pid = pid;
69
+ this.name = 'MailboxFullError';
70
+ }
71
+ }
72
+ function emptyUsage() {
73
+ return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
74
+ }
75
+ function addUsage(a, b) {
76
+ return {
77
+ inputTokens: a.inputTokens + b.inputTokens,
78
+ outputTokens: a.outputTokens + b.outputTokens,
79
+ totalTokens: a.totalTokens + b.totalTokens,
80
+ cacheReadTokens: (a.cacheReadTokens ?? 0) + (b.cacheReadTokens ?? 0) || undefined,
81
+ cacheWriteTokens: (a.cacheWriteTokens ?? 0) + (b.cacheWriteTokens ?? 0) || undefined,
82
+ reasoningTokens: (a.reasoningTokens ?? 0) + (b.reasoningTokens ?? 0) || undefined,
83
+ };
84
+ }
85
+ /** Default label for a goal: the predicate's functor, or the first token. */
86
+ export function labelForGoal(goal) {
87
+ const match = /^\s*([a-z_][A-Za-z0-9_]*)/.exec(goal);
88
+ return match ? match[1] : 'process';
89
+ }
90
+ /**
91
+ * Copy a message so processes never share mutable terms (spec §4.2 / invariant A).
92
+ *
93
+ * `structuredClone` is the right tool for plain data. Values it cannot clone
94
+ * (functions, symbols) are rejected, which is the intended behavior: such a value
95
+ * could not cross an L2 worker boundary either.
96
+ */
97
+ export function copyMessage(value) {
98
+ if (value === null || typeof value !== 'object')
99
+ return value;
100
+ try {
101
+ return structuredClone(value);
102
+ }
103
+ catch {
104
+ throw new Error('message is not portable between processes (must be plain data)');
105
+ }
106
+ }
107
+ /**
108
+ * The L1 process host: a process table, mailboxes, links, monitors, and naming,
109
+ * all in one JS realm.
110
+ *
111
+ * The DML runner drives process progress; this host owns identity and messaging.
112
+ */
113
+ export class LocalProcessHost {
114
+ sessionId;
115
+ node;
116
+ resolveBody;
117
+ resolveSnapshot;
118
+ onEvent;
119
+ onHostMessage;
120
+ maxProcesses;
121
+ maxMailbox;
122
+ maxTerminalRecords;
123
+ now;
124
+ records = new Map();
125
+ names = new Map();
126
+ watchersByRef = new Map();
127
+ replyInboxes = new Map();
128
+ counter = 0;
129
+ refCounter = 0;
130
+ shutdownRequested = false;
131
+ /** Synthetic pid representing the host itself, for `call`/`request` replies. */
132
+ hostPid;
133
+ constructor(options) {
134
+ this.sessionId = options.sessionId;
135
+ this.node = options.node ?? 'main';
136
+ this.resolveBody = options.resolveBody;
137
+ this.resolveSnapshot = options.resolveSnapshot;
138
+ this.onEvent = options.onEvent;
139
+ this.onHostMessage = options.onHostMessage;
140
+ this.maxProcesses = options.maxProcesses ?? 16;
141
+ this.maxMailbox = options.maxMailbox ?? 1000;
142
+ this.maxTerminalRecords = options.maxTerminalRecords ?? 50;
143
+ this.now = options.now ?? Date.now;
144
+ this.hostPid = { node: this.node, session: this.sessionId, id: 'host' };
145
+ }
146
+ // ---- spawning -----------------------------------------------------------
147
+ spawn(goal, options = {}, body) {
148
+ if (this.shutdownRequested)
149
+ throw new Error('process host is shut down');
150
+ // The limit bounds *live* processes, not cumulative spawns: a finished
151
+ // process must not consume a slot forever (a session that spawned 16 things
152
+ // could otherwise never fan out again).
153
+ if (this.liveCount() >= this.maxProcesses) {
154
+ throw new Error(`process limit reached (${this.maxProcesses} running); stop a process first`);
155
+ }
156
+ this.reapTerminalRecords();
157
+ const resolved = body ?? this.resolveBody?.(goal);
158
+ if (!resolved)
159
+ throw new Error(`no body registered for goal: ${goal}`);
160
+ // Stamp the harness snapshot this process will run. Every path (main, a
161
+ // process spawning a child, a worker spawning on the main's behalf) goes
162
+ // through here, so a stale snapshot cannot slip in.
163
+ if (!options.snapshot) {
164
+ const snapshot = this.resolveSnapshot?.();
165
+ if (snapshot)
166
+ options = { ...options, snapshot };
167
+ }
168
+ const pid = { node: this.node, session: this.sessionId, id: `p${++this.counter}` };
169
+ const record = {
170
+ pid,
171
+ name: options.name ?? labelForGoal(goal),
172
+ goal,
173
+ options,
174
+ body: resolved,
175
+ state: 'runnable',
176
+ priority: options.priority ?? 'background',
177
+ mailbox: [],
178
+ waiters: [],
179
+ links: new Set(),
180
+ watching: new Set(),
181
+ watchedBy: new Map(),
182
+ usage: emptyUsage(),
183
+ startedAt: this.now(),
184
+ restarts: 0,
185
+ controller: new AbortController(),
186
+ terminal: false,
187
+ terminalWaiters: [],
188
+ };
189
+ this.records.set(pidKey(pid), record);
190
+ if (options.parent)
191
+ this.link(options.parent, pid);
192
+ if (options.link)
193
+ this.link(options.link, pid);
194
+ this.emit({ type: 'started', pid, name: record.name, state: 'runnable' });
195
+ // Start on the next microtask so `spawn` behaves as fire-and-forget.
196
+ void Promise.resolve().then(() => this.run(record));
197
+ return pid;
198
+ }
199
+ async run(record) {
200
+ if (record.terminal)
201
+ return;
202
+ record.state = 'running';
203
+ this.emit({ type: 'state', pid: record.pid, name: record.name, state: 'running' });
204
+ try {
205
+ const result = await record.body(this.contextFor(record));
206
+ this.finish(record, 'done', 'normal', result);
207
+ }
208
+ catch (error) {
209
+ if (error instanceof ProcessExit) {
210
+ this.finish(record, 'killed', error.reason);
211
+ }
212
+ else {
213
+ const message = error instanceof Error ? error.message : String(error);
214
+ this.finish(record, 'crashed', { error: message }, undefined, message);
215
+ }
216
+ }
217
+ }
218
+ finish(record, state, reason, result, error) {
219
+ if (record.terminal)
220
+ return;
221
+ record.terminal = true;
222
+ record.state = state;
223
+ record.finishedAt = this.now();
224
+ record.result = result;
225
+ record.error = error;
226
+ record.exitReason = reason;
227
+ // Wake anyone blocked on receive.
228
+ for (const waiter of record.waiters.splice(0)) {
229
+ if (waiter.timer)
230
+ clearTimeout(waiter.timer);
231
+ waiter.resolve({ ok: false, reason: 'stopped' });
232
+ }
233
+ this.names.forEach((pid, name) => {
234
+ if (pidKey(pid) === pidKey(record.pid))
235
+ this.names.delete(name);
236
+ });
237
+ // Monitors.
238
+ for (const watch of record.watchedBy.values()) {
239
+ this.watchersByRef.delete(watch.ref);
240
+ const watcher = this.records.get(watch.watcher);
241
+ watcher?.watching.delete(watch.ref);
242
+ watch.resolve(reason);
243
+ }
244
+ record.watchedBy.clear();
245
+ for (const waiter of record.terminalWaiters.splice(0))
246
+ waiter();
247
+ if (state === 'done' && result !== undefined) {
248
+ this.emit({ type: 'answer', pid: record.pid, name: record.name, answer: result });
249
+ }
250
+ this.emit({
251
+ type: 'exited',
252
+ pid: record.pid,
253
+ name: record.name,
254
+ state,
255
+ reason,
256
+ error,
257
+ });
258
+ // Links: an abnormal exit propagates as a stop to linked processes.
259
+ if (state !== 'done' || reason !== 'normal') {
260
+ for (const linkKey of record.links) {
261
+ const linked = this.records.get(linkKey);
262
+ if (linked && !linked.terminal)
263
+ this.stop(linked.pid, reason);
264
+ }
265
+ }
266
+ }
267
+ // ---- context ------------------------------------------------------------
268
+ contextFor(record) {
269
+ const host = this;
270
+ return {
271
+ pid: record.pid,
272
+ goal: record.goal,
273
+ options: record.options,
274
+ signal: record.controller.signal,
275
+ receive(timeoutMs) {
276
+ return host.receive(record.pid, timeoutMs);
277
+ },
278
+ send(to, message) {
279
+ host.send(to, message);
280
+ },
281
+ spawn(goal, options) {
282
+ return host.spawn(goal, { ...options, parent: record.pid });
283
+ },
284
+ exit(reason) {
285
+ throw new ProcessExit(reason);
286
+ },
287
+ info() {
288
+ return host.info(record.pid);
289
+ },
290
+ setActivity(activity) {
291
+ record.currentActivity = activity;
292
+ host.emit({ type: 'activity', pid: record.pid, name: record.name, activity });
293
+ },
294
+ emit(event) {
295
+ host.emit({ ...event, pid: record.pid, name: record.name });
296
+ },
297
+ recordUsage(usage) {
298
+ record.usage = addUsage(record.usage, usage);
299
+ },
300
+ };
301
+ }
302
+ // ---- messaging ----------------------------------------------------------
303
+ send(to, message) {
304
+ const pid = typeof to === 'string' ? (this.names.get(to) ?? this.pidByLabel(to)) : to;
305
+ if (!pid)
306
+ throw new NoProcError(typeof to === 'string' ? { node: this.node, session: this.sessionId, id: to } : to);
307
+ // The host is a synthetic endpoint for request/reply.
308
+ if (pidKey(pid) === pidKey(this.hostPid)) {
309
+ const copied = copyMessage(message);
310
+ this.onHostMessage?.(copied);
311
+ const ref = typeof copied === 'object' && copied !== null && 'ref' in copied
312
+ ? String(copied.ref)
313
+ : undefined;
314
+ const kind = typeof copied === 'object' && copied !== null && 'kind' in copied
315
+ ? String(copied.kind)
316
+ : undefined;
317
+ if (kind === 'reply' && ref) {
318
+ const resolver = this.replyInboxes.get(ref);
319
+ if (resolver) {
320
+ this.replyInboxes.delete(ref);
321
+ resolver(copied.value);
322
+ }
323
+ return;
324
+ }
325
+ return;
326
+ }
327
+ const record = this.records.get(pidKey(pid));
328
+ if (!record || record.terminal)
329
+ throw new NoProcError(pid);
330
+ if (record.mailbox.length >= this.maxMailbox)
331
+ throw new MailboxFullError(pid);
332
+ const copied = copyMessage(message);
333
+ const waiter = record.waiters.shift();
334
+ if (waiter) {
335
+ if (waiter.timer)
336
+ clearTimeout(waiter.timer);
337
+ waiter.resolve({ ok: true, message: copied });
338
+ }
339
+ else {
340
+ record.mailbox.push(copied);
341
+ }
342
+ }
343
+ /**
344
+ * Pop the oldest message, or wait. `timeoutMs` of 0 or undefined waits forever
345
+ * (spec §4.4); the DML layer chooses a default.
346
+ */
347
+ receive(pid, timeoutMs) {
348
+ const record = this.records.get(pidKey(pid));
349
+ if (!record || record.terminal)
350
+ return Promise.resolve({ ok: false, reason: 'stopped' });
351
+ if (record.mailbox.length > 0) {
352
+ return Promise.resolve({ ok: true, message: record.mailbox.shift() });
353
+ }
354
+ return new Promise((resolve) => {
355
+ const waiter = { resolve: (result) => resolve(result) };
356
+ if (timeoutMs && timeoutMs > 0) {
357
+ waiter.timer = setTimeout(() => {
358
+ const index = record.waiters.indexOf(waiter);
359
+ if (index !== -1)
360
+ record.waiters.splice(index, 1);
361
+ resolve({ ok: false, reason: 'timeout' });
362
+ }, timeoutMs);
363
+ }
364
+ record.waiters.push(waiter);
365
+ });
366
+ }
367
+ /**
368
+ * Put a message back at the front of the mailbox (selective receive).
369
+ */
370
+ requeue(pid, message) {
371
+ const record = this.records.get(pidKey(pid));
372
+ if (!record || record.terminal)
373
+ return;
374
+ record.mailbox.unshift(copyMessage(message));
375
+ }
376
+ /**
377
+ * Send `{kind:'request', from, ref, value: message}` and await a
378
+ * `{kind:'reply', ref, value}` from the target (the `library(service)`
379
+ * protocol).
380
+ */
381
+ call(to, message, timeoutMs = 300_000) {
382
+ const ref = `r${++this.refCounter}`;
383
+ return new Promise((resolve, reject) => {
384
+ const timer = setTimeout(() => {
385
+ this.replyInboxes.delete(ref);
386
+ reject(new Error(`call timed out after ${timeoutMs} ms`));
387
+ }, timeoutMs);
388
+ this.replyInboxes.set(ref, (value) => {
389
+ clearTimeout(timer);
390
+ resolve(value);
391
+ });
392
+ try {
393
+ this.send(to, { kind: 'request', from: this.hostPid, ref, value: copyMessage(message) });
394
+ }
395
+ catch (error) {
396
+ clearTimeout(timer);
397
+ this.replyInboxes.delete(ref);
398
+ reject(error);
399
+ }
400
+ });
401
+ }
402
+ // ---- links and monitors -------------------------------------------------
403
+ link(a, b) {
404
+ const ra = this.records.get(pidKey(a));
405
+ const rb = this.records.get(pidKey(b));
406
+ if (!ra || !rb)
407
+ throw new NoProcError(ra ? b : a);
408
+ ra.links.add(pidKey(b));
409
+ rb.links.add(pidKey(a));
410
+ }
411
+ unlink(a, b) {
412
+ this.records.get(pidKey(a))?.links.delete(pidKey(b));
413
+ this.records.get(pidKey(b))?.links.delete(pidKey(a));
414
+ }
415
+ monitor(pid) {
416
+ const record = this.records.get(pidKey(pid));
417
+ if (!record || record.terminal) {
418
+ return { ref: `m${++this.refCounter}`, down: Promise.resolve(record?.exitReason ?? 'noproc') };
419
+ }
420
+ const ref = `m${++this.refCounter}`;
421
+ const down = new Promise((resolve) => {
422
+ record.watchedBy.set(ref, { ref, watcher: pidKey(this.hostPid), resolve });
423
+ this.watchersByRef.set(ref, { watcher: pidKey(this.hostPid), resolve });
424
+ });
425
+ return { ref, down };
426
+ }
427
+ // ---- lifecycle ----------------------------------------------------------
428
+ /** Stop a process. Idempotent. `reason: 'kill'` is untrappable (same as any stop in v1). */
429
+ stop(pid, reason = 'shutdown') {
430
+ const record = this.records.get(pidKey(pid));
431
+ if (!record || record.terminal)
432
+ return;
433
+ record.controller.abort(reason);
434
+ const state = reason === 'normal' ? 'done' : 'killed';
435
+ this.finish(record, state, reason);
436
+ }
437
+ async shutdown() {
438
+ this.shutdownRequested = true;
439
+ const records = [...this.records.values()];
440
+ for (const record of records)
441
+ this.stop(record.pid, 'shutdown');
442
+ for (const resolver of this.replyInboxes.values())
443
+ resolver(undefined);
444
+ this.replyInboxes.clear();
445
+ }
446
+ // ---- naming -------------------------------------------------------------
447
+ register(name, pid) {
448
+ if (this.names.has(name))
449
+ throw new Error(`name already registered: ${name}`);
450
+ if (!this.records.has(pidKey(pid)))
451
+ throw new NoProcError(pid);
452
+ this.names.set(name, pid);
453
+ }
454
+ whereis(name) {
455
+ const pid = this.names.get(name) ?? this.pidByLabel(name);
456
+ if (!pid)
457
+ return undefined;
458
+ const record = this.records.get(pidKey(pid));
459
+ if (!record || record.terminal) {
460
+ this.names.delete(name);
461
+ return undefined;
462
+ }
463
+ return pid;
464
+ }
465
+ /** Resolve a process label (the goal functor) to a live pid. */
466
+ pidByLabel(name) {
467
+ for (const record of this.records.values()) {
468
+ if (!record.terminal && record.name === name)
469
+ return record.pid;
470
+ }
471
+ return undefined;
472
+ }
473
+ // ---- inspection ---------------------------------------------------------
474
+ info(pid) {
475
+ const record = this.records.get(pidKey(pid));
476
+ return record ? this.toInfo(record) : undefined;
477
+ }
478
+ /** The harness source a process is running (its spawn-time snapshot). */
479
+ codeOf(pid) {
480
+ return this.records.get(pidKey(pid))?.options.snapshot?.text;
481
+ }
482
+ processes() {
483
+ const order = {
484
+ running: 0,
485
+ runnable: 1,
486
+ waiting: 2,
487
+ input: 3,
488
+ done: 4,
489
+ crashed: 5,
490
+ killed: 6,
491
+ };
492
+ return [...this.records.values()]
493
+ .sort((a, b) => order[a.state] - order[b.state] || a.startedAt - b.startedAt)
494
+ .map((record) => this.toInfo(record));
495
+ }
496
+ get size() {
497
+ return this.records.size;
498
+ }
499
+ /** Processes that have not reached a terminal state. */
500
+ liveCount() {
501
+ let live = 0;
502
+ for (const record of this.records.values())
503
+ if (!record.terminal)
504
+ live += 1;
505
+ return live;
506
+ }
507
+ /** Drop the oldest terminal records beyond `maxTerminalRecords`. */
508
+ reapTerminalRecords() {
509
+ const terminal = [...this.records.entries()].filter(([, record]) => record.terminal);
510
+ const excess = terminal.length - this.maxTerminalRecords;
511
+ for (let index = 0; index < excess; index += 1) {
512
+ this.records.delete(terminal[index][0]);
513
+ }
514
+ }
515
+ /** Resolve when `pid` reaches a terminal state (already terminal resolves now). */
516
+ wait(pid) {
517
+ const record = this.records.get(pidKey(pid));
518
+ if (!record)
519
+ return Promise.resolve(undefined);
520
+ if (record.terminal)
521
+ return Promise.resolve(this.toInfo(record));
522
+ return new Promise((resolve) => {
523
+ record.terminalWaiters.push(() => resolve(this.toInfo(record)));
524
+ });
525
+ }
526
+ toInfo(record) {
527
+ return {
528
+ pid: record.pid,
529
+ name: record.name,
530
+ goal: record.goal,
531
+ state: record.state,
532
+ priority: record.priority,
533
+ mailboxDepth: record.mailbox.length,
534
+ links: [...record.links].map((key) => this.pidFromKey(key)).filter((pid) => Boolean(pid)),
535
+ monitors: [...record.watching].map((ref) => this.watchersByRef.get(ref)?.watcher).filter(Boolean).map((key) => this.pidFromKey(key)).filter((pid) => Boolean(pid)),
536
+ usage: record.usage,
537
+ startedAt: record.startedAt,
538
+ finishedAt: record.finishedAt,
539
+ restarts: record.restarts,
540
+ currentActivity: record.currentActivity,
541
+ parent: record.options.parent,
542
+ codeVersion: record.options.codeVersion,
543
+ harnessVersion: record.options.snapshot?.version,
544
+ result: record.result,
545
+ error: record.error,
546
+ exitReason: record.exitReason,
547
+ };
548
+ }
549
+ pidFromKey(key) {
550
+ const record = this.records.get(key);
551
+ return record?.pid;
552
+ }
553
+ emit(event) {
554
+ this.onEvent?.({ ...event, at: this.now() });
555
+ }
556
+ }
557
+ //# sourceMappingURL=processes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.js","sourceRoot":"","sources":["../../src/repl/processes.ts"],"names":[],"mappings":"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"}
@@ -42,13 +42,55 @@ export interface ReplRendererOptions {
42
42
  export declare function formatDuration(ms: number): string;
43
43
  /** Format solution bindings as `Name = value` lines (or `true`). */
44
44
  export declare function formatBindings(bindings: DMLBinding[]): string;
45
- export declare class ReplRenderer {
45
+ /**
46
+ * The indentation a frame's output gets, so nesting reads as a tree.
47
+ *
48
+ * One rule, shared by the line renderer and the TUI's components: a nested frame
49
+ * (an `execute` child) hangs off its parent tool call with a `│` and no label;
50
+ * other frames carry their kind. Components used to ignore this and render
51
+ * flush-left, which flattened the tree — the same output looked nested in the
52
+ * readline path and flat in the TUI.
53
+ */
54
+ export declare function framePrefix(event: DMLEvent, showEvents?: boolean): string;
55
+ /**
56
+ * What the CLI needs from a renderer.
57
+ *
58
+ * `ReplRenderer` (string output, used by `--plain`, `--json` and the readline
59
+ * path) and the TUI's component renderer both satisfy this, so the dispatch code
60
+ * does not care which one is drawing.
61
+ */
62
+ export interface ReplEventRenderer {
63
+ readonly mode: RenderMode;
64
+ render(event: DMLEvent): void;
65
+ setSink(sink: (text: string) => void, errorSink?: (text: string) => void): void;
66
+ setImageSink(sink?: (lines: string[]) => void): void;
67
+ setSuppressInputPrompt(suppress: boolean): void;
68
+ getWidth(): number;
69
+ setWidth(width: number): void;
70
+ writeLine(text?: string): void;
71
+ writeErrorLine(text: string): void;
72
+ listing(text: string): string;
73
+ image(lines: string[]): void;
74
+ /** Change the reasoning display mode at runtime (TUI picker). */
75
+ setReasoningMode?(mode: 'off' | 'summary' | 'full'): void;
76
+ /** The current reasoning display mode, when the renderer tracks one. */
77
+ getReasoningMode?(): 'off' | 'summary' | 'full';
78
+ /**
79
+ * Close any open streamed-text block. The TUI implements this so a new turn's
80
+ * text cannot be appended to the previous turn's and render above the prompt.
81
+ */
82
+ endTextBlock?(): void;
83
+ solution(bindings: DMLBinding[], terminator?: string, prefix?: string, maxValue?: number): void;
84
+ flush(): void;
85
+ dispose(): void;
86
+ }
87
+ export declare class ReplRenderer implements ReplEventRenderer {
46
88
  readonly mode: RenderMode;
47
89
  private readonly color;
48
90
  private readonly verbose;
49
91
  private readonly showStream;
50
92
  private readonly showEvents;
51
- private readonly reasoningMode;
93
+ private reasoningMode;
52
94
  private readonly markdownEnabled;
53
95
  private readonly markdown;
54
96
  private pendingTextEvent?;
@@ -92,6 +134,14 @@ export declare class ReplRenderer {
92
134
  * Suppress `input_required` prompt lines. The TUI editor shows the question in
93
135
  * its border, so a transcript line would be a duplicate.
94
136
  */
137
+ /**
138
+ * Change how much model reasoning is shown, while the session is running.
139
+ *
140
+ * The setting is a rendering choice, so it applies to the next reasoning chunk
141
+ * rather than to a new session — which is what a picker in the TUI should do.
142
+ */
143
+ setReasoningMode(mode: 'off' | 'summary' | 'full'): void;
144
+ getReasoningMode(): 'off' | 'summary' | 'full';
95
145
  setSuppressInputPrompt(suppress: boolean): void;
96
146
  /** Stop the live indicator (call before the renderer goes out of scope). */
97
147
  dispose(): void;