@comput/pi-intercom 0.8.1 → 0.9.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.
Files changed (42) hide show
  1. package/README.md +48 -2
  2. package/dist/config.d.ts +7 -0
  3. package/dist/config.js +10 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/core-monitor.d.ts +30 -0
  6. package/dist/core-monitor.js +528 -0
  7. package/dist/core-monitor.js.map +1 -0
  8. package/dist/core-pane-close.d.ts +34 -0
  9. package/dist/core-pane-close.js +335 -0
  10. package/dist/core-pane-close.js.map +1 -0
  11. package/dist/core-worker-layout.d.ts +50 -0
  12. package/dist/core-worker-layout.js +236 -0
  13. package/dist/core-worker-layout.js.map +1 -0
  14. package/dist/herdr-core.d.ts +53 -0
  15. package/dist/herdr-core.js +380 -0
  16. package/dist/herdr-core.js.map +1 -0
  17. package/dist/index.js +42 -10
  18. package/dist/index.js.map +1 -1
  19. package/dist/launcher.d.ts +2 -0
  20. package/dist/launcher.js +48 -2
  21. package/dist/launcher.js.map +1 -1
  22. package/dist/monitor-launcher.d.ts +8 -0
  23. package/dist/monitor-launcher.js +111 -25
  24. package/dist/monitor-launcher.js.map +1 -1
  25. package/dist/pane-close.js +3 -0
  26. package/dist/pane-close.js.map +1 -1
  27. package/dist/runtime.d.ts +17 -1
  28. package/dist/runtime.js +51 -1
  29. package/dist/runtime.js.map +1 -1
  30. package/package.json +5 -3
  31. package/references/herdr-core-migration.md +44 -0
  32. package/references/v1-specification.md +7 -4
  33. package/src/config.ts +10 -1
  34. package/src/core-monitor.ts +410 -0
  35. package/src/core-pane-close.ts +328 -0
  36. package/src/core-worker-layout.ts +240 -0
  37. package/src/herdr-core.ts +287 -0
  38. package/src/index.ts +38 -11
  39. package/src/launcher.ts +46 -2
  40. package/src/monitor-launcher.ts +95 -21
  41. package/src/pane-close.ts +2 -0
  42. package/src/runtime.ts +47 -1
@@ -0,0 +1,335 @@
1
+ import { constants } from 'node:fs';
2
+ import { open, realpath } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+ import { linuxProcessIdentity } from './pane-close.js';
6
+ import { coreCall, defaultCoreEndpoint, locateTerminalTab, terminalAddress, withCoreSession } from './herdr-core.js';
7
+ const DOCUMENT = 'herdr-app';
8
+ const blocked = () => new Error('PiIntercom HC pane close blocked: ownership, process, descendants or supported layout could not be verified; no close submitted.');
9
+ export class CorePaneCloseUncertainError extends Error {
10
+ uncertain = true;
11
+ outcomeUncertain = true;
12
+ constructor() {
13
+ super('PiIntercom HC pane close outcome uncertain; terminal/process or pane may remain; inspect before any retry; no automatic replay.');
14
+ this.name = 'CorePaneCloseUncertainError';
15
+ }
16
+ }
17
+ function requireProof(ok) { if (!ok)
18
+ throw blocked(); }
19
+ const positive = (v) => Number.isSafeInteger(v) && v > 0;
20
+ const alive = (p, start) => !!p && p.start === start && !['Z', 'X', 'x'].includes(p.state);
21
+ const localId = (v) => typeof v === 'string' && !!v && v.length <= 256 && !/[\/\x00-\x20\x7f]/.test(v);
22
+ const uuid = (v) => typeof v === 'string' && /^(?:[0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i.test(v) && v.trim() === v;
23
+ async function verifySessionHeader(file, id) {
24
+ const handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
25
+ try {
26
+ requireProof((await handle.stat()).isFile());
27
+ const buffer = Buffer.alloc(4096);
28
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
29
+ const end = buffer.subarray(0, bytesRead).indexOf(10);
30
+ requireProof(end >= 0);
31
+ const header = JSON.parse(buffer.subarray(0, end).toString('utf8'));
32
+ requireProof(header?.type === 'session' && header.id === id);
33
+ }
34
+ finally {
35
+ await handle.close();
36
+ }
37
+ }
38
+ function view(snapshot, caller) {
39
+ requireProof(Number.isSafeInteger(snapshot?.version) && snapshot.version >= 0 && snapshot.value &&
40
+ Buffer.byteLength(JSON.stringify(snapshot.value)) <= 1024 * 1024);
41
+ // Shared locator checks bounded trees, global IDs, unambiguous content and floats.
42
+ const location = locateTerminalTab(snapshot.value, caller);
43
+ const terminals = new Map(), blocks = new Map(), ids = new Set();
44
+ const id = (v) => { requireProof(localId(v)); ids.add(v); };
45
+ for (const space of snapshot.value.spaces) {
46
+ id(space.id);
47
+ for (const tab of space.tabs) {
48
+ id(tab.id);
49
+ const visit = (node) => {
50
+ id(node.id);
51
+ for (const floating of node.floating ?? []) {
52
+ id(floating.id);
53
+ blocks.set(floating.id, { space: space.id, tab: tab.id, pane: floating.id, content: floating.content });
54
+ }
55
+ if (node.type === 'block') {
56
+ const placement = { space: space.id, tab: tab.id, pane: node.id, content: node.content };
57
+ blocks.set(node.id, placement);
58
+ if (node.content.terminal !== undefined) {
59
+ terminalAddress(node.content.terminal);
60
+ requireProof(!terminals.has(node.content.terminal));
61
+ terminals.set(node.content.terminal, placement);
62
+ }
63
+ }
64
+ else
65
+ for (const child of node.children)
66
+ visit(child);
67
+ };
68
+ visit(tab.root);
69
+ }
70
+ }
71
+ return { version: snapshot.version, value: snapshot.value, caller: location, terminals, blocks, ids };
72
+ }
73
+ function samePlace(a, b) {
74
+ return !!a && !!b && a.space === b.space && a.tab === b.tab && a.pane === b.pane && isDeepStrictEqual(a.content, b.content);
75
+ }
76
+ function preserveBlocks(before, after, removed) {
77
+ for (const [id, placement] of before.blocks)
78
+ if (id !== removed)
79
+ requireProof(samePlace(placement, after.blocks.get(id)));
80
+ }
81
+ /** Intentionally narrow mutation subset: the standard worker tab, or flat
82
+ * row/column splits. Never delete a tab containing any sibling block/mod/float.
83
+ * Keep sibling nodes and their sizes/metadata verbatim; singleton roots are valid
84
+ * in app 0.1.13. Nested target trees/root blocks are blocked BEFORE the kill.
85
+ * Source: app 0.1.13 mirror.rs Document/SharedTab, layout.rs Node, model.rs
86
+ * remove_pane, window.rs terminal_ended/reconcile. The app may do its own removal.
87
+ * This is private, source-pinned layout support, NOT an app-version/UI handshake. */
88
+ function removal(current, identity) {
89
+ const value = structuredClone(current.value);
90
+ const { space, tab, pane } = locateTerminalTab(value, identity.terminalId);
91
+ const root = tab.root;
92
+ requireProof(pane.id === identity.paneId && ['row', 'column'].includes(root.type) &&
93
+ root.children.every((n) => n.type === 'block') && root.children.includes(pane) &&
94
+ pane.closable !== false && root.closable !== false && !(pane.floating?.length));
95
+ if (root.children.length === 1) {
96
+ requireProof(!(root.floating?.length));
97
+ space.tabs.splice(space.tabs.indexOf(tab), 1);
98
+ // Do not remove the space, even if now empty: it is not our owned object.
99
+ }
100
+ else
101
+ root.children.splice(root.children.indexOf(pane), 1);
102
+ return value;
103
+ }
104
+ function live(record, identity, created) {
105
+ requireProof(record?.address === identity.terminalId && record.state === 'live' && positive(record.created_ms) &&
106
+ (created === undefined || record.created_ms === created) && record.foreground?.pid === identity.pid && record.rm !== true);
107
+ return record.created_ms;
108
+ }
109
+ function terminalResult(record, terminal, created) {
110
+ requireProof(record?.address === terminal && record.created_ms === created && ['live', 'finished'].includes(record.state));
111
+ if (record.state !== 'finished')
112
+ return false;
113
+ requireProof(record.foreground == null && positive(record.finished_ms) && record.finished_ms >= created);
114
+ return true;
115
+ }
116
+ /** Include finished ancestors too. Missing ancestry, cycles, duplicate addresses,
117
+ * foreign machines (including disconnected ones) and unknown states fail closed.
118
+ * Core children normally end with their parent; outlive-parent is NOT permission
119
+ * to kill somebody else's worker. This snapshot is not an atomic spawn barrier. */
120
+ function noDescendants(list, target, own, targetCreated, ownCreated) {
121
+ requireProof(Array.isArray(list?.terminals) && list.terminals.length <= 4096 &&
122
+ list.hidden_finished === 0 && Array.isArray(list.machines) && list.machines.length === 0);
123
+ const records = new Map();
124
+ for (const r of list.terminals) {
125
+ terminalAddress(r?.address);
126
+ requireProof(!records.has(r.address) && ['live', 'finished'].includes(r.state));
127
+ if (r.parent != null)
128
+ terminalAddress(r.parent);
129
+ records.set(r.address, r);
130
+ }
131
+ live(records.get(target.terminalId), target, targetCreated);
132
+ live(records.get(own.terminalId), own, ownCreated);
133
+ for (const r of records.values()) {
134
+ const seen = new Set([r.address]);
135
+ let parent = r.parent;
136
+ while (parent != null) {
137
+ requireProof(!seen.has(parent) && records.has(parent));
138
+ requireProof(r.state !== 'live' || parent !== target.terminalId);
139
+ seen.add(parent);
140
+ parent = records.get(parent).parent;
141
+ }
142
+ }
143
+ }
144
+ /** Linux-only owned-worker closure. HandoffWorkflow still owns saved handoff,
145
+ * successful tool persistence, final settlement and same-epoch close_commit.
146
+ * beforeSubmit MUST perform that commit; it runs after all slow ownership reads,
147
+ * immediately before ONE terminal.kill. There is no graceful-cancel enablement,
148
+ * all-descendants guarantee, atomic identity/kill API, automatic retry or rm.
149
+ * Default operations each use a fresh bound CoreSession, never reconnect mid-job.
150
+ * Current shared transport deliberately pins core 0.1.18; later versions require
151
+ * review. No API can establish remote app 0.1.13/rendering from core alone. */
152
+ export function createCoreCloseProvider(options) {
153
+ const env = options.env ?? process.env;
154
+ if ((options.platform ?? process.platform) !== 'linux' || !env.HC_TERMINAL_ID)
155
+ return;
156
+ const caller = env.HC_TERMINAL_ID;
157
+ const ownPid = options.pid ?? process.pid;
158
+ const processIdentity = options.processIdentity ?? linuxProcessIdentity;
159
+ const verifySession = options.verifySession ?? verifySessionHeader;
160
+ const requestedMs = options.verificationMs ?? 1500;
161
+ const verificationMs = Number.isFinite(requestedMs) ? Math.max(0, Math.min(2000, requestedMs)) : 1500;
162
+ const attempted = new Set(), active = new Set();
163
+ const operation = (work) => options.call && options.call !== coreCall ? work(options.call) :
164
+ defaultCoreEndpoint(env).then(endpoint => withCoreSession(work, { endpoint }));
165
+ async function context(call, assertCurrent) {
166
+ terminalAddress(caller);
167
+ const sessionId = options.sessionId(), sourceFile = options.sessionFile();
168
+ requireProof(positive(ownPid) && typeof sessionId === 'string' && !!sessionId && sourceFile);
169
+ const guard = () => {
170
+ assertCurrent();
171
+ requireProof(env.HC_TERMINAL_ID === caller && options.sessionId() === sessionId && options.sessionFile() === sourceFile);
172
+ };
173
+ const query = async (method, params) => { guard(); const result = await call(method, params); guard(); return result; };
174
+ const status = await query('server.status', {});
175
+ requireProof(status?.version === '0.1.18' && uuid(status.core?.id) && typeof status.core.name === 'string' && positive(status.pid));
176
+ const core = async () => {
177
+ const fresh = await query('server.status', {});
178
+ requireProof(fresh?.version === status.version && fresh.core?.id === status.core.id &&
179
+ fresh.core?.name === status.core.name && fresh.pid === status.pid);
180
+ };
181
+ const canonical = async (file) => {
182
+ requireProof(typeof file === 'string' && path.isAbsolute(file) && file.length <= 4096 && !file.includes('\0'));
183
+ const resolved = await realpath(file);
184
+ guard();
185
+ return resolved;
186
+ };
187
+ const sessionFile = await canonical(sourceFile);
188
+ const process = await processIdentity(ownPid);
189
+ guard();
190
+ requireProof(process && /^[0-9]+$/.test(process.start) && alive(process, process.start));
191
+ const own = { workspaceId: status.core.id, terminalId: caller, paneId: '',
192
+ sessionId, sessionFile, pid: ownPid, processStart: process.start };
193
+ const checkProcess = async (identity) => {
194
+ requireProof(positive(identity.pid) && /^[0-9]+$/.test(identity.processStart) &&
195
+ identity.workspaceId === status.core.id && typeof identity.sessionId === 'string' && !!identity.sessionId);
196
+ requireProof(await canonical(identity.sessionFile) === identity.sessionFile);
197
+ await verifySession(identity.sessionFile, identity.sessionId);
198
+ guard();
199
+ requireProof(await canonical(identity.sessionFile) === identity.sessionFile);
200
+ requireProof(alive(await processIdentity(identity.pid), identity.processStart));
201
+ guard();
202
+ };
203
+ const readView = async () => view(await query('doc.get', { name: DOCUMENT }), caller);
204
+ const initial = await readView();
205
+ own.paneId = initial.caller.pane.id;
206
+ const ownPlace = initial.terminals.get(caller);
207
+ const ownCreated = live(await query('terminal.get', { terminal: caller }), own);
208
+ const checkOwn = async (current) => {
209
+ requireProof(samePlace(ownPlace, current.terminals.get(caller)) && await canonical(sourceFile) === sessionFile);
210
+ await checkProcess(own);
211
+ live(await query('terminal.get', { terminal: caller }), own, ownCreated);
212
+ };
213
+ await checkOwn(initial);
214
+ return { guard, query, core, own, ownCreated, checkProcess, readView, checkOwn };
215
+ }
216
+ async function inspectTarget(ctx, identity, expected, prior) {
217
+ terminalAddress(identity.terminalId);
218
+ requireProof(identity.sessionId === expected && expected !== ctx.own.sessionId && identity.pid !== ownPid &&
219
+ identity.terminalId !== caller && identity.paneId !== ctx.own.paneId && identity.workspaceId === ctx.own.workspaceId);
220
+ await ctx.core();
221
+ await ctx.checkProcess(identity);
222
+ const current = await ctx.readView();
223
+ const placement = current.terminals.get(identity.terminalId);
224
+ requireProof(placement?.pane === identity.paneId && (!prior || (current.version >= prior.current.version &&
225
+ samePlace(placement, prior.current.terminals.get(identity.terminalId)))));
226
+ removal(current, identity); // Prove our mutation subset BEFORE any effect.
227
+ await ctx.checkOwn(current);
228
+ const created = live(await ctx.query('terminal.get', { terminal: identity.terminalId }), identity, prior?.created);
229
+ ctx.guard();
230
+ return { current, created };
231
+ }
232
+ return {
233
+ async getIdentity() {
234
+ try {
235
+ return await operation(async (call) => {
236
+ const ctx = await context(call, () => { });
237
+ await ctx.core();
238
+ await ctx.checkOwn(await ctx.readView());
239
+ ctx.guard();
240
+ return ctx.own;
241
+ });
242
+ }
243
+ catch {
244
+ throw blocked();
245
+ }
246
+ },
247
+ async inspect(identity, expectedSessionId, assertCurrent) {
248
+ try {
249
+ await operation(async (call) => { await inspectTarget(await context(call, assertCurrent), { ...identity }, expectedSessionId); });
250
+ }
251
+ catch {
252
+ throw blocked();
253
+ }
254
+ },
255
+ async close(identity, expectedSessionId, assertCurrent, beforeSubmit) {
256
+ const target = { ...identity };
257
+ const key = JSON.stringify([target.workspaceId, target.terminalId, target.sessionId, target.pid, target.processStart]);
258
+ requireProof(!active.has(key) && !attempted.has(key));
259
+ active.add(key);
260
+ let submitted = false;
261
+ try {
262
+ return await operation(async (call) => {
263
+ const ctx = await context(call, assertCurrent);
264
+ const first = await inspectTarget(ctx, target, expectedSessionId);
265
+ // Revalidate on the SAME connection after slow header/process/layout reads.
266
+ const proof = await inspectTarget(ctx, target, expectedSessionId, first);
267
+ noDescendants(await ctx.query('terminal.list', { all: true }), target, ctx.own, proof.created, ctx.ownCreated);
268
+ await ctx.checkProcess(target);
269
+ await ctx.core();
270
+ live(await ctx.query('terminal.get', { terminal: target.terminalId }), target, proof.created);
271
+ ctx.guard();
272
+ await beforeSubmit(); // Handoff's same-epoch commit; no intervening slow read.
273
+ ctx.guard();
274
+ attempted.add(key);
275
+ submitted = true;
276
+ const killed = await ctx.query('terminal.kill', { terminal: target.terminalId });
277
+ let finished = terminalResult(killed, target.terminalId, proof.created), workerExited = false;
278
+ const deadline = Date.now() + verificationMs;
279
+ // Bounded observation only, never resubmit kill. Stay below CoreSession's
280
+ // request budget even when the terminal does not finish promptly.
281
+ for (let i = 0; i < 10; i++) {
282
+ finished = terminalResult(await ctx.query('terminal.get', { terminal: target.terminalId }), target.terminalId, proof.created);
283
+ workerExited = !alive(await processIdentity(target.pid), target.processStart);
284
+ ctx.guard();
285
+ if ((finished && workerExited) || Date.now() >= deadline)
286
+ break;
287
+ await new Promise(resolve => setTimeout(resolve, Math.min(100, Math.max(0, deadline - Date.now()))));
288
+ ctx.guard();
289
+ }
290
+ if (!finished || !workerExited)
291
+ return { paneClosed: false, workerExited };
292
+ await ctx.core();
293
+ const current = await ctx.readView();
294
+ requireProof(current.version >= proof.current.version);
295
+ await ctx.checkOwn(current);
296
+ preserveBlocks(proof.current, current, target.paneId);
297
+ const present = current.terminals.get(target.terminalId);
298
+ if (present) {
299
+ requireProof(samePlace(present, proof.current.terminals.get(target.terminalId)));
300
+ const value = removal(current, target);
301
+ const planned = view({ version: current.version, value }, caller);
302
+ requireProof(!planned.terminals.has(target.terminalId) && !planned.ids.has(target.paneId));
303
+ preserveBlocks(current, planned, target.paneId);
304
+ ctx.guard();
305
+ const written = await ctx.query('doc.set', { name: DOCUMENT, version: current.version, value });
306
+ requireProof(Number.isSafeInteger(written?.version) && written.version === current.version + 1);
307
+ const observed = await ctx.readView();
308
+ requireProof(observed.version >= written.version && !observed.terminals.has(target.terminalId) && !observed.ids.has(target.paneId));
309
+ if (observed.version === written.version)
310
+ requireProof(isDeepStrictEqual(observed.value, value));
311
+ preserveBlocks(planned, observed, target.paneId);
312
+ await ctx.checkOwn(observed);
313
+ }
314
+ else {
315
+ // The app can reconcile first. Absence alone is NOT ownership proof.
316
+ requireProof(!current.ids.has(target.paneId));
317
+ }
318
+ await ctx.core();
319
+ ctx.guard();
320
+ return { paneClosed: true, workerExited: true };
321
+ });
322
+ }
323
+ catch (error) {
324
+ if (submitted)
325
+ throw new CorePaneCloseUncertainError();
326
+ // Preserve commit/guard rejection details for HandoffWorkflow callers.
327
+ throw error;
328
+ }
329
+ finally {
330
+ active.delete(key);
331
+ }
332
+ },
333
+ };
334
+ }
335
+ //# sourceMappingURL=core-pane-close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-pane-close.js","sourceRoot":"","sources":["../src/core-pane-close.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type CoreCall } from './herdr-core.js';
2
+ export interface CoreWorkerLayoutRequest {
3
+ caller: string;
4
+ cwd: string;
5
+ /** Canonically equal to cwd; runtime remains responsible for realpath checks. */
6
+ workspaceRoot: string;
7
+ platform?: string;
8
+ /** Optional already-known resumed worker name; reload uses renameCoreTab later. */
9
+ name?: string;
10
+ }
11
+ export interface CoreWorkerLayoutPreflight {
12
+ readonly caller: string;
13
+ readonly callerCreatedMs: number;
14
+ readonly coreId: string;
15
+ readonly space: string;
16
+ readonly tab: string;
17
+ readonly pane: string;
18
+ readonly version: number;
19
+ readonly startedAtMs: number;
20
+ readonly cwd: string;
21
+ readonly platform: string;
22
+ readonly name: string;
23
+ }
24
+ export interface CoreWorkerLayoutAttachment {
25
+ terminal: string;
26
+ terminalCreatedMs: number;
27
+ coreId: string;
28
+ space: string;
29
+ tab: string;
30
+ pane: string;
31
+ version: number;
32
+ layoutConfirmed: true;
33
+ uiAcknowledged: false;
34
+ }
35
+ /** All attach failures are post-creation uncertainty, including validation and
36
+ * CAS conflicts. No cleanup, retry, replacement, fallback, or terminal killing.
37
+ * The launcher must propagate this to its existing uncertain-launch fence. */
38
+ export declare class CoreWorkerLayoutUncertainError extends Error {
39
+ readonly outcomeUncertain = true;
40
+ constructor();
41
+ }
42
+ /** Call BEFORE hc run. Read-only: missing app document/mapping refuses launch.
43
+ * Labels are not authority: the current document must contain the caller once.
44
+ * This proves shared state, not that a remote window is connected/rendering. */
45
+ export declare function preflightCoreWorkerLayout(request: CoreWorkerLayoutRequest, call?: CoreCall): Promise<CoreWorkerLayoutPreflight>;
46
+ /** Call once AFTER hc run, with its full parsed RunResult (created_ms required).
47
+ * Appends exactly one dedicated tab in the caller's AUTHORITATIVE CURRENT space,
48
+ * using the current doc version, not the preflight version. No focus mutations.
49
+ * Returns shared-state confirmation only, never UI/Pi readiness. */
50
+ export declare function attachCoreWorkerLayout(ticket: CoreWorkerLayoutPreflight, created: unknown, call?: CoreCall): Promise<CoreWorkerLayoutAttachment>;