@comput/pi-intercom 0.6.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.
- package/README.md +113 -8
- package/dist/config.d.ts +12 -0
- package/dist/config.js +94 -22
- package/dist/config.js.map +1 -1
- package/dist/core-monitor.d.ts +30 -0
- package/dist/core-monitor.js +528 -0
- package/dist/core-monitor.js.map +1 -0
- package/dist/core-pane-close.d.ts +34 -0
- package/dist/core-pane-close.js +335 -0
- package/dist/core-pane-close.js.map +1 -0
- package/dist/core-worker-layout.d.ts +50 -0
- package/dist/core-worker-layout.js +236 -0
- package/dist/core-worker-layout.js.map +1 -0
- package/dist/herdr-core.d.ts +53 -0
- package/dist/herdr-core.js +380 -0
- package/dist/herdr-core.js.map +1 -0
- package/dist/index.js +60 -14
- package/dist/index.js.map +1 -1
- package/dist/launcher.d.ts +2 -0
- package/dist/launcher.js +59 -3
- package/dist/launcher.js.map +1 -1
- package/dist/monitor-launcher.d.ts +8 -0
- package/dist/monitor-launcher.js +111 -25
- package/dist/monitor-launcher.js.map +1 -1
- package/dist/pane-close.js +3 -0
- package/dist/pane-close.js.map +1 -1
- package/dist/reminders.d.ts +28 -0
- package/dist/reminders.js +81 -0
- package/dist/reminders.js.map +1 -0
- package/dist/runtime.d.ts +28 -2
- package/dist/runtime.js +139 -11
- package/dist/runtime.js.map +1 -1
- package/package.json +14 -6
- package/references/herdr-core-migration.md +44 -0
- package/references/releasing.md +90 -0
- package/references/v1-specification.md +11 -8
- package/src/config.ts +69 -17
- package/src/core-monitor.ts +410 -0
- package/src/core-pane-close.ts +328 -0
- package/src/core-worker-layout.ts +240 -0
- package/src/herdr-core.ts +287 -0
- package/src/index.ts +55 -15
- package/src/launcher.ts +55 -3
- package/src/monitor-launcher.ts +95 -21
- package/src/pane-close.ts +2 -0
- package/src/reminders.ts +69 -0
- package/src/runtime.ts +122 -12
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { access, mkdir, open, readFile, realpath, rename, unlink } from 'node:fs/promises';
|
|
4
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
5
|
+
import { coreCall, withCoreSession, locateTerminalTab, terminalAddress } from './herdr-core.js';
|
|
6
|
+
const title = 'Intercom monitor';
|
|
7
|
+
const scopeLabel = 'pi-intercom.monitor.scope';
|
|
8
|
+
const tokenLabel = 'pi-intercom.monitor.token';
|
|
9
|
+
const fail = (why) => new Error(`Intercom core monitor: ${why}`);
|
|
10
|
+
const object = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
11
|
+
const text = (v) => typeof v === 'string' && v.length > 0 && v.length <= 4096 && !/[\x00-\x1f\x7f]/.test(v);
|
|
12
|
+
const positive = (v) => Number.isSafeInteger(v) && v > 0;
|
|
13
|
+
const uuid = () => randomUUID().replaceAll('-', '');
|
|
14
|
+
const hash = (v) => createHash('sha256').update(v).digest('hex');
|
|
15
|
+
/** Deliberately narrower than the app's general layout language. In particular,
|
|
16
|
+
* stacks, floats and dynamic tab/agent blocks cannot prove unique pane ownership.
|
|
17
|
+
* Unknown metadata is retained, but unknown topology fails before terminal.run.
|
|
18
|
+
* Source contract: herdr-app v0.1.13 mirror.rs/model.rs/layout.rs/window.rs. */
|
|
19
|
+
function layout(snapshot) {
|
|
20
|
+
if (!Number.isSafeInteger(snapshot?.version) || snapshot.version < 0 || !object(snapshot.value) ||
|
|
21
|
+
!Array.isArray(snapshot.value.spaces) || snapshot.value.spaces.length > 256)
|
|
22
|
+
throw fail('unsupported layout document');
|
|
23
|
+
const value = structuredClone(snapshot.value);
|
|
24
|
+
const terminals = new Set();
|
|
25
|
+
let count = 0;
|
|
26
|
+
for (const space of value.spaces) {
|
|
27
|
+
if (!object(space) || !text(space.id) || space.id.includes('/') || !Array.isArray(space.tabs) || space.tabs.length > 512 ||
|
|
28
|
+
(space.name !== undefined && typeof space.name !== 'string') ||
|
|
29
|
+
(space.folder !== undefined && typeof space.folder !== 'string') || space.machine != null)
|
|
30
|
+
throw fail('unsupported machine-owned space');
|
|
31
|
+
for (const tab of space.tabs) {
|
|
32
|
+
if (!object(tab) || !text(tab.id) || tab.id.includes('/') || tab.root?.id !== tab.id || !['row', 'column'].includes(tab.root?.type))
|
|
33
|
+
throw fail('unsupported tab root');
|
|
34
|
+
const visit = (node, depth) => {
|
|
35
|
+
if (++count > 4096 || depth > 64 || !object(node) || !text(node.id) || node.id.includes('/') ||
|
|
36
|
+
(node.floating !== undefined && (!Array.isArray(node.floating) || node.floating.length !== 0)))
|
|
37
|
+
throw fail('unsupported or excessive layout topology');
|
|
38
|
+
if ((node.hidden !== undefined && typeof node.hidden !== 'boolean') ||
|
|
39
|
+
['min', 'max'].some(k => node[k] != null && (!Number.isFinite(node[k]) || node[k] < 0)) ||
|
|
40
|
+
(node.size != null && (!object(node.size) || Object.keys(node.size).length !== 1 ||
|
|
41
|
+
!Object.entries(node.size).every(([k, v]) => ['px', 'weight'].includes(k) && typeof v === 'number' && Number.isFinite(v) && v > 0))))
|
|
42
|
+
throw fail('unsupported layout sizing');
|
|
43
|
+
if (node.type === 'block') {
|
|
44
|
+
if (node.children !== undefined || !object(node.content))
|
|
45
|
+
throw fail('unsupported block schema');
|
|
46
|
+
const content = node.content;
|
|
47
|
+
if (typeof content.terminal === 'string' && Object.keys(content).length === 1) {
|
|
48
|
+
terminalAddress(content.terminal);
|
|
49
|
+
if (terminals.has(content.terminal))
|
|
50
|
+
throw fail('ambiguous terminal panes');
|
|
51
|
+
terminals.add(content.terminal);
|
|
52
|
+
}
|
|
53
|
+
else if (!(text(content.mod) && Object.keys(content).every(k => ['mod', 'props'].includes(k))))
|
|
54
|
+
throw fail('unsupported block content');
|
|
55
|
+
}
|
|
56
|
+
else if (['row', 'column'].includes(node.type) && Array.isArray(node.children) && node.content === undefined) {
|
|
57
|
+
for (const child of node.children)
|
|
58
|
+
visit(child, depth + 1);
|
|
59
|
+
}
|
|
60
|
+
else
|
|
61
|
+
throw fail('unsupported layout node schema');
|
|
62
|
+
};
|
|
63
|
+
visit(tab.root, 0);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// The subsequent locateTerminalTab invocation also validates globally unique
|
|
67
|
+
// space/tab/node IDs (root repeats tab ID) and exactly one caller mapping.
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
function live(record, address) {
|
|
71
|
+
if (record?.address !== address || record.state !== 'live' || !positive(record.created_ms))
|
|
72
|
+
throw fail('terminal identity is not live');
|
|
73
|
+
}
|
|
74
|
+
function callerAt(record, value, address) {
|
|
75
|
+
live(record, address);
|
|
76
|
+
const at = locateTerminalTab(value, address);
|
|
77
|
+
if (record.labels?.['herdr.space'] !== at.space.id || record.labels?.['herdr.tab'] !== at.tab.id)
|
|
78
|
+
throw fail('caller labels disagree with layout');
|
|
79
|
+
return at;
|
|
80
|
+
}
|
|
81
|
+
function sameCaller(owner, record, value) {
|
|
82
|
+
const at = callerAt(record, value, owner.caller);
|
|
83
|
+
if (record.created_ms !== owner.callerCreated || at.space.id !== owner.space || at.tab.id !== owner.callerTab || at.pane.id !== owner.callerPane)
|
|
84
|
+
throw fail('caller moved or identity changed');
|
|
85
|
+
return at;
|
|
86
|
+
}
|
|
87
|
+
function monitorIdentity(record, owner) {
|
|
88
|
+
if (!owner.terminal || !positive(owner.created))
|
|
89
|
+
throw fail('missing created terminal proof');
|
|
90
|
+
live(record, owner.terminal);
|
|
91
|
+
if (record.created_ms !== owner.created || !isDeepStrictEqual(record.argv, owner.argv) || record.cwd !== owner.root ||
|
|
92
|
+
record.labels?.[scopeLabel] !== owner.scope || record.labels?.[tokenLabel] !== owner.token ||
|
|
93
|
+
record.keep !== false || record.notify !== false || record.die_with_parent !== false || record.template != null ||
|
|
94
|
+
record.parent !== owner.caller || record.labels?.['herdr.space'] || record.labels?.['herdr.tab'])
|
|
95
|
+
throw fail('monitor terminal ownership changed');
|
|
96
|
+
}
|
|
97
|
+
function validateOwner(state, root, session, core, scope) {
|
|
98
|
+
if (!object(state) || state.version !== 2 || state.backend !== 'herdr-core')
|
|
99
|
+
throw fail('legacy/unknown ownership record cannot grant core ownership');
|
|
100
|
+
if (state.root !== root || state.sessionId !== session || state.core !== core || state.scope !== scope)
|
|
101
|
+
throw fail('ownership scope or core identity differs; no automatic changes');
|
|
102
|
+
if (!['run_pending', 'attach_pending', 'submitted', 'close_pending', 'closed'].includes(state.stage) || !['coordinator-tab', 'new-tab'].includes(state.placement) ||
|
|
103
|
+
!['caller', 'space', 'callerTab', 'callerPane', 'token', 'pane', 'tab', 'lower'].every(k => text(state[k])) ||
|
|
104
|
+
!/^[0-9a-f]{32}$/.test(state.token) || !positive(state.callerCreated) ||
|
|
105
|
+
!Array.isArray(state.argv) || state.argv.length !== 4 || !state.argv.every(text) || state.argv[2] !== '--root' || state.argv[3] !== root ||
|
|
106
|
+
(state.stage !== 'run_pending' && (!text(state.terminal) || !positive(state.created))))
|
|
107
|
+
throw fail('invalid monitor ownership record');
|
|
108
|
+
terminalAddress(state.caller);
|
|
109
|
+
if (state.terminal !== undefined)
|
|
110
|
+
terminalAddress(state.terminal);
|
|
111
|
+
}
|
|
112
|
+
function ownedPane(value, owner) {
|
|
113
|
+
const at = locateTerminalTab(value, owner.terminal);
|
|
114
|
+
if (at.space.id !== owner.space || at.tab.id !== owner.tab || at.pane.id !== owner.pane || at.pane.title !== title || owner.terminal === owner.caller)
|
|
115
|
+
throw fail('owned monitor pane moved or changed');
|
|
116
|
+
if (owner.placement === 'coordinator-tab') {
|
|
117
|
+
const root = at.tab.root;
|
|
118
|
+
if (owner.tab !== owner.callerTab || root.type !== 'column' || root.children.length !== 2 ||
|
|
119
|
+
root.children[0] !== at.pane || at.pane.size?.weight !== 1 || root.children[1].id !== owner.lower || root.children[1].size?.weight !== 3)
|
|
120
|
+
throw fail('monitor placement changed; no automatic rearrangement');
|
|
121
|
+
}
|
|
122
|
+
else if (owner.tab === owner.callerTab)
|
|
123
|
+
throw fail('monitor is no longer in a separate tab');
|
|
124
|
+
return at;
|
|
125
|
+
}
|
|
126
|
+
function attach(value, owner, terminal) {
|
|
127
|
+
const at = locateTerminalTab(value, owner.caller);
|
|
128
|
+
const block = { id: owner.pane, type: 'block', title, content: { terminal }, size: { weight: 1 } };
|
|
129
|
+
if (owner.placement === 'new-tab') {
|
|
130
|
+
at.space.tabs.push({ id: owner.tab, name: title, root: { id: owner.tab, type: 'row', children: [block] } });
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Preserve every old subtree/field, except the old root's identity and its
|
|
134
|
+
// newly assigned share. Pane IDs (and therefore private focus) remain valid.
|
|
135
|
+
const lower = { ...at.tab.root, id: owner.lower, size: { weight: 3 } };
|
|
136
|
+
at.tab.root = { id: at.tab.id, type: 'column', children: [block, lower] };
|
|
137
|
+
}
|
|
138
|
+
const validated = layout({ version: 0, value });
|
|
139
|
+
locateTerminalTab(validated, owner.caller);
|
|
140
|
+
locateTerminalTab(validated, terminal); // Also catches generated-ID collisions.
|
|
141
|
+
if (Buffer.byteLength(JSON.stringify(value)) > 1000000)
|
|
142
|
+
throw fail('layout too large for a bounded core document request');
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
/** Explicit open only. This edits the local core's machine-owned document; a
|
|
146
|
+
* remote Windows app qualifies its IDs when projecting it. No app commands,
|
|
147
|
+
* window launch, focus changes, terminal labels for auto-adoption, or retries.
|
|
148
|
+
* Success proves shared data, NOT attached-window rendering or process readiness. */
|
|
149
|
+
export async function ensureCoreMonitorPane(options) {
|
|
150
|
+
if (!['coordinator-tab', 'new-tab'].includes(options.placement ?? ''))
|
|
151
|
+
throw fail('explicit monitor placement required');
|
|
152
|
+
if (!['linux', 'win32'].includes(options.platform ?? process.platform))
|
|
153
|
+
throw fail('only Linux/Windows supported');
|
|
154
|
+
const env = options.env ?? process.env;
|
|
155
|
+
const caller = env.HC_TERMINAL_ID;
|
|
156
|
+
terminalAddress(caller);
|
|
157
|
+
const node = options.node ?? process.execPath;
|
|
158
|
+
if (!text(options.sessionId) || ![options.root, options.script, node].every(v => text(v) && path.isAbsolute(v)) ||
|
|
159
|
+
!/^node(?:\.exe)?$/i.test(path.basename(node)))
|
|
160
|
+
throw fail('explicit absolute root/script/plain-node executable and session required');
|
|
161
|
+
const check = () => options.assertCurrent?.();
|
|
162
|
+
check();
|
|
163
|
+
// All identity reads and mutations share one verified connection. Repeated
|
|
164
|
+
// coreCall invocations reconnect and cannot bind this multi-step operation.
|
|
165
|
+
if (!options.call || options.call === coreCall) {
|
|
166
|
+
return withCoreSession(call => ensureCoreMonitorPane({ ...options, call }), { endpoint: env.HC_SOCKET });
|
|
167
|
+
}
|
|
168
|
+
const root = await realpath(options.root);
|
|
169
|
+
const invoke = options.call;
|
|
170
|
+
const call = async (method, params) => { check(); const result = await invoke(method, params); check(); return result; };
|
|
171
|
+
const identify = async () => {
|
|
172
|
+
const status = await call('server.status', {});
|
|
173
|
+
const version = typeof status?.version === 'string' ? /^(\d+)\.(\d+)\.(\d+)$/.exec(status.version) : null;
|
|
174
|
+
if (!text(status?.core?.id) || !version || (Number(version[1]) === 0 && (Number(version[2]) < 1 || (Number(version[2]) === 1 && Number(version[3]) < 18))))
|
|
175
|
+
throw fail('core 0.1.18+ with permanent server identity required');
|
|
176
|
+
return status.core.id;
|
|
177
|
+
};
|
|
178
|
+
const core = await identify();
|
|
179
|
+
const sameCore = async () => { if (await identify() !== core)
|
|
180
|
+
throw fail('core identity changed; no retry'); };
|
|
181
|
+
const key = hash(options.sessionId).slice(0, 24);
|
|
182
|
+
const scope = hash(JSON.stringify([root, options.sessionId, core]));
|
|
183
|
+
const directory = path.join(root, '.pi-intercom');
|
|
184
|
+
check();
|
|
185
|
+
await mkdir(directory, { recursive: true });
|
|
186
|
+
check();
|
|
187
|
+
// Same session filename/lock as legacy monitor-launcher: old records fence,
|
|
188
|
+
// never migrate into creation proof. Core ID belongs in the record, not just
|
|
189
|
+
// in a filename that could silently permit another monitor on a different core.
|
|
190
|
+
const file = path.join(directory, `monitor-${key}.json`), lock = `${file}.lock`;
|
|
191
|
+
let handle;
|
|
192
|
+
try {
|
|
193
|
+
handle = await open(lock, 'wx', 0o600);
|
|
194
|
+
await handle.close();
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
throw fail(`monitor locked; inspect ${lock}; no automatic recovery`);
|
|
198
|
+
}
|
|
199
|
+
let state;
|
|
200
|
+
const save = async () => {
|
|
201
|
+
check();
|
|
202
|
+
const temporary = `${file}.${randomUUID()}.tmp`;
|
|
203
|
+
try {
|
|
204
|
+
const output = await open(temporary, 'wx', 0o600);
|
|
205
|
+
try {
|
|
206
|
+
await output.writeFile(JSON.stringify(state));
|
|
207
|
+
await output.sync();
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
await output.close();
|
|
211
|
+
}
|
|
212
|
+
check();
|
|
213
|
+
await rename(temporary, file);
|
|
214
|
+
// fsync the rename on Unix. Windows cannot open directories for fsync;
|
|
215
|
+
// it still gets the flushed file + same-directory atomic rename ledger.
|
|
216
|
+
if (process.platform !== 'win32') {
|
|
217
|
+
const dir = await open(directory, 'r');
|
|
218
|
+
try {
|
|
219
|
+
await dir.sync();
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
await dir.close();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
check();
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
await unlink(temporary).catch(() => { });
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
try {
|
|
232
|
+
try {
|
|
233
|
+
state = JSON.parse(await readFile(file, 'utf8'));
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (error.code !== 'ENOENT')
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
if (state !== undefined) {
|
|
240
|
+
validateOwner(state, root, options.sessionId, core, scope);
|
|
241
|
+
if (state.caller !== caller)
|
|
242
|
+
throw fail('ownership differs from current caller');
|
|
243
|
+
if (state.stage === 'closed')
|
|
244
|
+
state = undefined;
|
|
245
|
+
else {
|
|
246
|
+
if (state.placement !== options.placement)
|
|
247
|
+
throw fail('monitor already exists in a different placement; close it first');
|
|
248
|
+
if (state.stage !== 'submitted')
|
|
249
|
+
throw fail(`partial launch (${state.stage}); inspect manually, no retry or duplicate`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const record = await call('terminal.get', { terminal: caller });
|
|
253
|
+
const snapshot = await call('doc.get', { name: 'herdr-app' });
|
|
254
|
+
const value = layout(snapshot);
|
|
255
|
+
const at = callerAt(record, value, caller);
|
|
256
|
+
const inventory = await call('terminal.list', { all: false, labels: { [scopeLabel]: scope } });
|
|
257
|
+
if (!Array.isArray(inventory?.terminals) || inventory.terminals.some((t) => !text(t?.address) || t.labels?.[scopeLabel] !== scope) ||
|
|
258
|
+
new Set(inventory.terminals.map((t) => t.address)).size !== inventory.terminals.length)
|
|
259
|
+
throw fail('ambiguous monitor inventory');
|
|
260
|
+
if (state) {
|
|
261
|
+
if (inventory.terminals.length !== 1 || inventory.terminals[0].address !== state.terminal)
|
|
262
|
+
throw fail('owned monitor inventory missing or ambiguous; no duplicate');
|
|
263
|
+
sameCaller(state, record, value);
|
|
264
|
+
monitorIdentity(await call('terminal.get', { terminal: state.terminal }), state);
|
|
265
|
+
ownedPane(value, state);
|
|
266
|
+
await sameCore();
|
|
267
|
+
return { outcome: 'existing owned monitor preserved; readiness and remote rendering not checked', pane: state.pane, terminal: state.terminal };
|
|
268
|
+
}
|
|
269
|
+
if (inventory.terminals.length)
|
|
270
|
+
throw fail('unowned monitor terminal exists; no adoption or duplicate');
|
|
271
|
+
const hasMarker = (node) => [title, `${title} [${options.sessionId}]`].includes(node.title) || (node.children ?? []).some(hasMarker);
|
|
272
|
+
if (at.space.tabs.some((t) => t.name === title || hasMarker(t.root)))
|
|
273
|
+
throw fail('unowned monitor layout marker exists in caller space');
|
|
274
|
+
if (options.placement === 'coordinator-tab' && (at.tab.root.hidden === true || at.tab.root.min != null || at.tab.root.max != null || at.tab.root.size != null))
|
|
275
|
+
throw fail('constrained caller root cannot guarantee quarter-height placement');
|
|
276
|
+
await access(options.script);
|
|
277
|
+
await access(node);
|
|
278
|
+
check();
|
|
279
|
+
state = {
|
|
280
|
+
version: 2, backend: 'herdr-core', root, sessionId: options.sessionId, core, caller, callerCreated: record.created_ms,
|
|
281
|
+
space: at.space.id, callerTab: at.tab.id, callerPane: at.pane.id, placement: options.placement, scope, token: uuid(),
|
|
282
|
+
argv: [node, options.script, '--root', root],
|
|
283
|
+
pane: `p${uuid()}`, tab: options.placement === 'new-tab' ? `tb${uuid()}` : at.tab.id, lower: `s${uuid()}`, stage: 'run_pending',
|
|
284
|
+
};
|
|
285
|
+
// Validate structure/size/collisions before any external effect. t + 255
|
|
286
|
+
// characters reserves more space than a normal core-issued address needs.
|
|
287
|
+
attach(structuredClone(value), state, `t${'z'.repeat(255)}`);
|
|
288
|
+
await save(); // Durable intent MUST precede terminal.run, including timeouts.
|
|
289
|
+
await sameCore();
|
|
290
|
+
const before = await call('doc.get', { name: 'herdr-app' });
|
|
291
|
+
sameCaller(state, await call('terminal.get', { terminal: caller }), layout(before));
|
|
292
|
+
if (!isDeepStrictEqual(before, snapshot))
|
|
293
|
+
throw fail('layout changed before launch; no automatic retry');
|
|
294
|
+
const created = await call('terminal.run', {
|
|
295
|
+
argv: state.argv, cwd: root, caller, parent: caller, outlive_parent: true,
|
|
296
|
+
no_notify: true, keep: false, rm: false, wait: false,
|
|
297
|
+
// DO NOT set herdr.space/tab: app auto-adoption races our CAS and turns
|
|
298
|
+
// keep on. The shared document itself makes this terminal visible.
|
|
299
|
+
labels: { [scopeLabel]: scope, [tokenLabel]: state.token },
|
|
300
|
+
});
|
|
301
|
+
terminalAddress(created?.address);
|
|
302
|
+
if (created.address.length > 256 || created.address === caller)
|
|
303
|
+
throw fail('run returned invalid/new terminal identity');
|
|
304
|
+
state.terminal = created.address;
|
|
305
|
+
state.created = created.created_ms;
|
|
306
|
+
monitorIdentity(created, state);
|
|
307
|
+
state.stage = 'attach_pending';
|
|
308
|
+
await save();
|
|
309
|
+
await sameCore();
|
|
310
|
+
monitorIdentity(await call('terminal.get', { terminal: state.terminal }), state);
|
|
311
|
+
const fresh = await call('doc.get', { name: 'herdr-app' });
|
|
312
|
+
const freshValue = layout(fresh);
|
|
313
|
+
sameCaller(state, await call('terminal.get', { terminal: caller }), freshValue);
|
|
314
|
+
if (!isDeepStrictEqual(locateTerminalTab(freshValue, caller).tab.root, at.tab.root))
|
|
315
|
+
throw fail('caller layout changed during launch');
|
|
316
|
+
const updated = attach(freshValue, state, state.terminal);
|
|
317
|
+
await sameCore();
|
|
318
|
+
const written = await call('doc.set', { name: 'herdr-app', version: fresh.version, value: updated });
|
|
319
|
+
if (!Number.isSafeInteger(written?.version) || written.version !== fresh.version + 1)
|
|
320
|
+
throw fail('layout acknowledgment uncertain; do not replay');
|
|
321
|
+
await sameCore();
|
|
322
|
+
const observed = await call('doc.get', { name: 'herdr-app' });
|
|
323
|
+
const observedValue = layout(observed);
|
|
324
|
+
if (observed.version < written.version)
|
|
325
|
+
throw fail('layout version regressed');
|
|
326
|
+
sameCaller(state, await call('terminal.get', { terminal: caller }), observedValue);
|
|
327
|
+
monitorIdentity(await call('terminal.get', { terminal: state.terminal }), state);
|
|
328
|
+
ownedPane(observedValue, state);
|
|
329
|
+
state.stage = 'submitted';
|
|
330
|
+
await save();
|
|
331
|
+
return { outcome: 'monitor attached in shared layout; readiness and remote Windows rendering not verified', pane: state.pane, terminal: state.terminal };
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
throw fail(`${String(error)}. Terminal ${state?.terminal ?? 'unknown'} may remain; no automatic cleanup or retry.`);
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
await unlink(lock).catch(() => { });
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/** Best-effort owned-monitor close: reject existing live descendants, persist a
|
|
341
|
+
* fence, recheck identity and inventory, stop once, then remove only its pane.
|
|
342
|
+
* Core completion may cascade to die_with_parent children; other clients must
|
|
343
|
+
* not concurrently attach children to this owned monitor. This is not an atomic
|
|
344
|
+
* child-registration barrier or an all-descendants guarantee. Uncertainty stays
|
|
345
|
+
* fenced and never authorizes replay. No whole-tab close command is issued. */
|
|
346
|
+
export async function closeCoreMonitorPane(options) {
|
|
347
|
+
if (!['linux', 'win32'].includes(options.platform ?? process.platform))
|
|
348
|
+
throw fail('close unsupported on this platform; no terminal or layout changes performed');
|
|
349
|
+
const env = options.env ?? process.env;
|
|
350
|
+
const caller = env.HC_TERMINAL_ID;
|
|
351
|
+
terminalAddress(caller);
|
|
352
|
+
if (!text(options.sessionId) || !text(options.root) || !path.isAbsolute(options.root))
|
|
353
|
+
throw fail('explicit absolute root and session required');
|
|
354
|
+
const check = () => options.assertCurrent?.();
|
|
355
|
+
check();
|
|
356
|
+
if (!options.call || options.call === coreCall) {
|
|
357
|
+
return withCoreSession(call => closeCoreMonitorPane({ ...options, call }), { endpoint: env.HC_SOCKET });
|
|
358
|
+
}
|
|
359
|
+
const invoke = options.call;
|
|
360
|
+
const call = async (method, params) => { check(); const result = await invoke(method, params); check(); return result; };
|
|
361
|
+
const root = await realpath(options.root);
|
|
362
|
+
const key = hash(options.sessionId).slice(0, 24);
|
|
363
|
+
const file = path.join(root, '.pi-intercom', `monitor-${key}.json`), lock = `${file}.lock`;
|
|
364
|
+
// Use the same exclusive lock as open, without creating a missing owner dir.
|
|
365
|
+
let handle;
|
|
366
|
+
try {
|
|
367
|
+
check();
|
|
368
|
+
handle = await open(lock, 'wx', 0o600);
|
|
369
|
+
await handle.close();
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
throw fail('close ownership unavailable or monitor locked; no automatic recovery');
|
|
373
|
+
}
|
|
374
|
+
try {
|
|
375
|
+
const state = JSON.parse(await readFile(file, 'utf8'));
|
|
376
|
+
const status = await call('server.status', {});
|
|
377
|
+
if (status?.version !== '0.1.18' || !text(status?.core?.id))
|
|
378
|
+
throw fail('close preflight requires reviewed core 0.1.18 identity');
|
|
379
|
+
const core = status.core.id;
|
|
380
|
+
validateOwner(state, root, options.sessionId, core, hash(JSON.stringify([root, options.sessionId, core])));
|
|
381
|
+
if (state.caller !== caller)
|
|
382
|
+
throw fail('ownership differs from current caller');
|
|
383
|
+
if (state.stage !== 'submitted')
|
|
384
|
+
throw fail(`partial launch (${state.stage}); inspect manually, no close or retry`);
|
|
385
|
+
const snapshot = await call('doc.get', { name: 'herdr-app' });
|
|
386
|
+
const value = layout(snapshot);
|
|
387
|
+
sameCaller(state, await call('terminal.get', { terminal: caller }), value);
|
|
388
|
+
monitorIdentity(await call('terminal.get', { terminal: state.terminal }), state);
|
|
389
|
+
ownedPane(value, state);
|
|
390
|
+
// NEVER filter by monitor labels: child workers do not inherit our labels.
|
|
391
|
+
// Include finished records to find live grandchildren behind finished parents.
|
|
392
|
+
const inventory = await call('terminal.list', { all: true });
|
|
393
|
+
if (!Array.isArray(inventory?.terminals) || inventory.terminals.length > 4096)
|
|
394
|
+
throw fail('ambiguous descendant inventory');
|
|
395
|
+
const records = new Map(), children = new Map();
|
|
396
|
+
for (const record of inventory.terminals) {
|
|
397
|
+
if (!text(record?.address) || !['live', 'finished'].includes(record.state) ||
|
|
398
|
+
(record.parent != null && !text(record.parent)) || records.has(record.address))
|
|
399
|
+
throw fail('ambiguous descendant inventory');
|
|
400
|
+
records.set(record.address, record);
|
|
401
|
+
if (record.parent != null)
|
|
402
|
+
children.set(record.parent, [...(children.get(record.parent) ?? []), record.address]);
|
|
403
|
+
}
|
|
404
|
+
monitorIdentity(records.get(state.terminal), state);
|
|
405
|
+
const seen = new Set([state.terminal]), pending = [state.terminal];
|
|
406
|
+
while (pending.length) {
|
|
407
|
+
for (const child of children.get(pending.pop()) ?? []) {
|
|
408
|
+
if (seen.has(child))
|
|
409
|
+
throw fail('cyclic descendant inventory');
|
|
410
|
+
seen.add(child);
|
|
411
|
+
if (records.get(child).state === 'live')
|
|
412
|
+
throw fail('close refused: live monitor descendant exists; no terminal or layout changes performed');
|
|
413
|
+
pending.push(child);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
const finalStatus = await call('server.status', {});
|
|
417
|
+
if (finalStatus?.core?.id !== core || finalStatus.version !== status.version)
|
|
418
|
+
throw fail('core identity changed; no retry');
|
|
419
|
+
// Best-effort identity/descendant preflight, not an atomic child-registration
|
|
420
|
+
// barrier. Do not run another task between the final checks and submission.
|
|
421
|
+
const save = async () => {
|
|
422
|
+
check();
|
|
423
|
+
const temporary = `${file}.${randomUUID()}.tmp`;
|
|
424
|
+
try {
|
|
425
|
+
const output = await open(temporary, 'wx', 0o600);
|
|
426
|
+
try {
|
|
427
|
+
await output.writeFile(JSON.stringify(state));
|
|
428
|
+
await output.sync();
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
await output.close();
|
|
432
|
+
}
|
|
433
|
+
check();
|
|
434
|
+
await rename(temporary, file);
|
|
435
|
+
check();
|
|
436
|
+
}
|
|
437
|
+
finally {
|
|
438
|
+
await unlink(temporary).catch(() => { });
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
state.stage = 'close_pending';
|
|
442
|
+
await save();
|
|
443
|
+
const finalSnapshot = await call('doc.get', { name: 'herdr-app' });
|
|
444
|
+
const finalValue = layout(finalSnapshot);
|
|
445
|
+
sameCaller(state, await call('terminal.get', { terminal: caller }), finalValue);
|
|
446
|
+
monitorIdentity(await call('terminal.get', { terminal: state.terminal }), state);
|
|
447
|
+
ownedPane(finalValue, state);
|
|
448
|
+
// A new terminal since the checked inventory requires inspection, not a kill.
|
|
449
|
+
const finalInventory = await call('terminal.list', { all: true });
|
|
450
|
+
const inventoryIdentity = (value) => {
|
|
451
|
+
if (!Array.isArray(value?.terminals) || value.terminals.length > 4096)
|
|
452
|
+
throw fail('ambiguous final descendant inventory');
|
|
453
|
+
return value.terminals.map((r) => [r.address, r.parent ?? null, r.state, r.created_ms ?? null])
|
|
454
|
+
.sort((a, b) => String(a[0]).localeCompare(String(b[0])));
|
|
455
|
+
};
|
|
456
|
+
if (!isDeepStrictEqual(inventoryIdentity(finalInventory), inventoryIdentity(inventory)))
|
|
457
|
+
throw fail('terminal inventory changed before close; pending fence retained');
|
|
458
|
+
await call('terminal.kill', { terminal: state.terminal });
|
|
459
|
+
let ended;
|
|
460
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
461
|
+
ended = await call('terminal.get', { terminal: state.terminal });
|
|
462
|
+
if (ended?.address !== state.terminal || ended.created_ms !== state.created)
|
|
463
|
+
throw fail('terminal identity changed after stop; pending fence retained');
|
|
464
|
+
if (ended.state === 'finished')
|
|
465
|
+
break;
|
|
466
|
+
if (ended.state !== 'live')
|
|
467
|
+
throw fail('terminal stop state ambiguous; pending fence retained');
|
|
468
|
+
if (attempt < 9)
|
|
469
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
470
|
+
}
|
|
471
|
+
if (ended.state !== 'finished')
|
|
472
|
+
throw fail('terminal stop not confirmed; pending fence retained');
|
|
473
|
+
const after = await call('doc.get', { name: 'herdr-app' });
|
|
474
|
+
const remaining = layout(after);
|
|
475
|
+
sameCaller(state, await call('terminal.get', { terminal: caller }), remaining);
|
|
476
|
+
const nodes = [];
|
|
477
|
+
const visit = (node) => { nodes.push(node); for (const child of node.children ?? [])
|
|
478
|
+
visit(child); };
|
|
479
|
+
for (const space of remaining.spaces)
|
|
480
|
+
for (const tab of space.tabs)
|
|
481
|
+
visit(tab.root);
|
|
482
|
+
const target = nodes.filter(n => n.content?.terminal === state.terminal || n.id === state.pane);
|
|
483
|
+
if (target.length) {
|
|
484
|
+
ownedPane(remaining, state);
|
|
485
|
+
const space = remaining.spaces.find((s) => s.id === state.space);
|
|
486
|
+
const tab = space.tabs.find((t) => t.id === state.tab);
|
|
487
|
+
if (state.placement === 'coordinator-tab') {
|
|
488
|
+
const lower = tab.root.children[1];
|
|
489
|
+
tab.root = { ...lower, id: state.tab };
|
|
490
|
+
delete tab.root.size;
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
const remove = (node) => {
|
|
494
|
+
if (!Array.isArray(node.children))
|
|
495
|
+
return false;
|
|
496
|
+
const index = node.children.findIndex((n) => n.id === state.pane);
|
|
497
|
+
if (index >= 0) {
|
|
498
|
+
node.children.splice(index, 1);
|
|
499
|
+
return true;
|
|
500
|
+
}
|
|
501
|
+
return node.children.some(remove);
|
|
502
|
+
};
|
|
503
|
+
if (!remove(tab.root))
|
|
504
|
+
throw fail('owned pane removal cannot be proved');
|
|
505
|
+
if (tab.root.children.length === 0 && !(tab.root.floating?.length))
|
|
506
|
+
space.tabs.splice(space.tabs.indexOf(tab), 1);
|
|
507
|
+
}
|
|
508
|
+
layout({ version: after.version, value: remaining });
|
|
509
|
+
locateTerminalTab(remaining, caller);
|
|
510
|
+
const write = await call('doc.set', { name: 'herdr-app', version: after.version, value: remaining });
|
|
511
|
+
if (write?.version !== after.version + 1)
|
|
512
|
+
throw fail('pane removal acknowledgment uncertain');
|
|
513
|
+
}
|
|
514
|
+
const confirmed = await call('doc.get', { name: 'herdr-app' });
|
|
515
|
+
const confirmedValue = layout(confirmed);
|
|
516
|
+
sameCaller(state, await call('terminal.get', { terminal: caller }), confirmedValue);
|
|
517
|
+
const contains = (node) => node.id === state.pane || node.content?.terminal === state.terminal || (node.children ?? []).some(contains);
|
|
518
|
+
if (confirmedValue.spaces.some((s) => s.tabs.some((t) => contains(t.root))))
|
|
519
|
+
throw fail('monitor pane absence not confirmed');
|
|
520
|
+
state.stage = 'closed';
|
|
521
|
+
await save();
|
|
522
|
+
return { outcome: 'owned monitor terminal finished and pane absence confirmed; no all-descendants guarantee', pane: state.pane, terminal: state.terminal };
|
|
523
|
+
}
|
|
524
|
+
finally {
|
|
525
|
+
await unlink(lock).catch(() => { });
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=core-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-monitor.js","sourceRoot":"","sources":["../src/core-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { CloseProvider } from './handoff.js';
|
|
2
|
+
import { type CoreCall } from './herdr-core.js';
|
|
3
|
+
interface ProcessIdentity {
|
|
4
|
+
start: string;
|
|
5
|
+
state: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CorePaneCloseOptions {
|
|
8
|
+
sessionId(): string;
|
|
9
|
+
sessionFile(): string | undefined;
|
|
10
|
+
env?: NodeJS.ProcessEnv;
|
|
11
|
+
platform?: string;
|
|
12
|
+
pid?: number;
|
|
13
|
+
processIdentity?: (pid: number) => Promise<ProcessIdentity | undefined>;
|
|
14
|
+
verifySession?: (file: string, id: string) => Promise<void>;
|
|
15
|
+
/** Trusted test seam, or a call already inside ONE withCoreSession operation.
|
|
16
|
+
* Never inject a reconnecting per-request transport. */
|
|
17
|
+
call?: CoreCall;
|
|
18
|
+
verificationMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class CorePaneCloseUncertainError extends Error {
|
|
21
|
+
readonly uncertain = true;
|
|
22
|
+
readonly outcomeUncertain = true;
|
|
23
|
+
constructor();
|
|
24
|
+
}
|
|
25
|
+
/** Linux-only owned-worker closure. HandoffWorkflow still owns saved handoff,
|
|
26
|
+
* successful tool persistence, final settlement and same-epoch close_commit.
|
|
27
|
+
* beforeSubmit MUST perform that commit; it runs after all slow ownership reads,
|
|
28
|
+
* immediately before ONE terminal.kill. There is no graceful-cancel enablement,
|
|
29
|
+
* all-descendants guarantee, atomic identity/kill API, automatic retry or rm.
|
|
30
|
+
* Default operations each use a fresh bound CoreSession, never reconnect mid-job.
|
|
31
|
+
* Current shared transport deliberately pins core 0.1.18; later versions require
|
|
32
|
+
* review. No API can establish remote app 0.1.13/rendering from core alone. */
|
|
33
|
+
export declare function createCoreCloseProvider(options: CorePaneCloseOptions): CloseProvider | undefined;
|
|
34
|
+
export {};
|