@comput/pi-intercom 0.3.0 → 0.4.2
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 +137 -25
- package/dist/activity.d.ts +12 -0
- package/dist/activity.js +73 -0
- package/dist/activity.js.map +1 -0
- package/dist/config.d.ts +39 -0
- package/dist/config.js +182 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.d.ts +17 -0
- package/dist/launcher.js +77 -0
- package/dist/launcher.js.map +1 -0
- package/dist/monitor-launcher.d.ts +17 -0
- package/dist/monitor-launcher.js +136 -0
- package/dist/monitor-launcher.js.map +1 -0
- package/dist/monitor-view.d.ts +6 -0
- package/dist/monitor-view.js +134 -0
- package/dist/monitor-view.js.map +1 -0
- package/dist/monitor.d.ts +22 -0
- package/dist/monitor.js +171 -0
- package/dist/monitor.js.map +1 -0
- package/dist/observability.d.ts +79 -0
- package/dist/observability.js +208 -0
- package/dist/observability.js.map +1 -0
- package/dist/reports.d.ts +12 -0
- package/dist/reports.js +160 -0
- package/dist/reports.js.map +1 -0
- package/dist/runtime.d.ts +59 -0
- package/dist/runtime.js +458 -0
- package/dist/runtime.js.map +1 -0
- package/dist/snapshot.d.ts +15 -0
- package/dist/snapshot.js +128 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/transport.d.ts +24 -0
- package/dist/transport.js +122 -0
- package/dist/transport.js.map +1 -0
- package/dist/worker-status.d.ts +26 -0
- package/dist/worker-status.js +76 -0
- package/dist/worker-status.js.map +1 -0
- package/package.json +13 -7
- package/references/observability.md +66 -60
- package/references/roadmap.md +68 -0
- package/src/activity.ts +66 -0
- package/src/config.ts +1 -1
- package/src/index.ts +51 -23
- package/src/monitor-launcher.ts +110 -0
- package/src/monitor-view.ts +123 -0
- package/src/monitor.ts +143 -0
- package/src/observability.ts +6 -1
- package/src/reports.ts +122 -0
- package/src/runtime.ts +45 -7
- package/src/{dashboard.ts → snapshot.ts} +9 -60
- package/src/transport.ts +11 -2
- package/src/worker-status.ts +66 -0
- package/dashboard/app.js +0 -182
- package/dashboard/index.html +0 -41
- package/dashboard/style.css +0 -82
package/dist/reports.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { lstat, mkdir, open, realpath, rename, unlink } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
const MAX_BYTES = 8 * 1024;
|
|
6
|
+
const MAX_IDS = 256;
|
|
7
|
+
const statuses = new Set(['blocked', 'needs_decision', 'ready_for_review', 'clear']);
|
|
8
|
+
const controls = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f\u202a-\u202e\u2066-\u2069]/;
|
|
9
|
+
function validId(id) {
|
|
10
|
+
return typeof id === 'string' && id.length > 0 && id.length <= 256 && id.trim().length > 0 && !/[\x00-\x1f\x7f-\x9f]/.test(id);
|
|
11
|
+
}
|
|
12
|
+
function validate(value) {
|
|
13
|
+
if (!value || typeof value !== 'object')
|
|
14
|
+
return;
|
|
15
|
+
const v = value;
|
|
16
|
+
if (v.version !== 1 || !validId(v.sessionId) || !statuses.has(v.status))
|
|
17
|
+
return;
|
|
18
|
+
if (typeof v.summary !== 'string' || v.summary.length > 2000 || controls.test(v.summary))
|
|
19
|
+
return;
|
|
20
|
+
if (v.status === 'clear' ? v.summary !== '' : !v.summary.trim())
|
|
21
|
+
return;
|
|
22
|
+
if (typeof v.updatedAt !== 'string' || !/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3}Z$/.test(v.updatedAt))
|
|
23
|
+
return;
|
|
24
|
+
const timestamp = Date.parse(v.updatedAt);
|
|
25
|
+
if (!Number.isFinite(timestamp) || new Date(timestamp).toISOString() !== v.updatedAt)
|
|
26
|
+
return;
|
|
27
|
+
return { version: 1, sessionId: v.sessionId, status: v.status, summary: v.summary, updatedAt: v.updatedAt };
|
|
28
|
+
}
|
|
29
|
+
function filename(id) {
|
|
30
|
+
return `${createHash('sha256').update(id).digest('hex')}.json`;
|
|
31
|
+
}
|
|
32
|
+
/** Reject links at the root and both extension-owned directory components. */
|
|
33
|
+
async function directory(root, create, assertCurrent) {
|
|
34
|
+
if ((await lstat(root)).isSymbolicLink())
|
|
35
|
+
throw new Error('unsafe root');
|
|
36
|
+
let current = await realpath(root);
|
|
37
|
+
for (const segment of ['.pi-intercom', 'reports']) {
|
|
38
|
+
current = path.join(current, segment);
|
|
39
|
+
if (create) {
|
|
40
|
+
assertCurrent?.();
|
|
41
|
+
try {
|
|
42
|
+
await mkdir(current, { mode: 0o700 });
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.code !== 'EEXIST')
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const info = await lstat(current);
|
|
50
|
+
if (!info.isDirectory() || info.isSymbolicLink() || path.relative(current, await realpath(current)) !== '')
|
|
51
|
+
throw new Error('unsafe directory');
|
|
52
|
+
}
|
|
53
|
+
return current;
|
|
54
|
+
}
|
|
55
|
+
async function regularOrAbsent(file) {
|
|
56
|
+
try {
|
|
57
|
+
const info = await lstat(file);
|
|
58
|
+
if (!info.isFile() || info.isSymbolicLink())
|
|
59
|
+
throw new Error('unsafe file');
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error.code !== 'ENOENT')
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Persist only the explicitly authored public report; clear is an atomic tombstone. */
|
|
67
|
+
export async function saveWorkerReport(root, report, assertCurrent) {
|
|
68
|
+
let temporary;
|
|
69
|
+
let ownsTemporary = false;
|
|
70
|
+
let dir;
|
|
71
|
+
try {
|
|
72
|
+
const safe = validate(report);
|
|
73
|
+
if (!safe)
|
|
74
|
+
throw new Error('invalid report');
|
|
75
|
+
const content = JSON.stringify(safe) + '\n';
|
|
76
|
+
if (Buffer.byteLength(content) > MAX_BYTES)
|
|
77
|
+
throw new Error('oversized report');
|
|
78
|
+
assertCurrent?.();
|
|
79
|
+
dir = await directory(root, true, assertCurrent);
|
|
80
|
+
const target = path.join(dir, filename(safe.sessionId));
|
|
81
|
+
await regularOrAbsent(target);
|
|
82
|
+
temporary = path.join(dir, `.${filename(safe.sessionId)}.${randomUUID()}.tmp`);
|
|
83
|
+
assertCurrent?.();
|
|
84
|
+
const handle = await open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | (constants.O_NOFOLLOW ?? 0), 0o600);
|
|
85
|
+
ownsTemporary = true;
|
|
86
|
+
try {
|
|
87
|
+
assertCurrent?.();
|
|
88
|
+
await handle.writeFile(content, 'utf8');
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await handle.close();
|
|
92
|
+
}
|
|
93
|
+
if (await directory(root, false) !== dir)
|
|
94
|
+
throw new Error('directory changed');
|
|
95
|
+
await regularOrAbsent(target);
|
|
96
|
+
assertCurrent?.();
|
|
97
|
+
await rename(temporary, target);
|
|
98
|
+
temporary = undefined;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw new Error('Worker report could not be saved.');
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
if (temporary && ownsTemporary && dir) {
|
|
105
|
+
// Cleanup only our own unpublished temporary file, even if authorization expired.
|
|
106
|
+
try {
|
|
107
|
+
if (await directory(root, false) === dir)
|
|
108
|
+
await unlink(temporary);
|
|
109
|
+
}
|
|
110
|
+
catch { /* No raw filesystem errors or unsafe cleanup. */ }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Read at most 256 configured IDs; no directory scan, repair, transport, or host access. */
|
|
115
|
+
export async function readWorkerReports(root, sessionIds) {
|
|
116
|
+
const reports = [];
|
|
117
|
+
let dir;
|
|
118
|
+
try {
|
|
119
|
+
dir = await directory(root, false);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return reports;
|
|
123
|
+
}
|
|
124
|
+
const seen = new Set();
|
|
125
|
+
for (const id of sessionIds.slice(0, MAX_IDS)) {
|
|
126
|
+
if (!validId(id) || seen.has(id))
|
|
127
|
+
continue;
|
|
128
|
+
seen.add(id);
|
|
129
|
+
try {
|
|
130
|
+
if (await directory(root, false) !== dir)
|
|
131
|
+
break;
|
|
132
|
+
const file = path.join(dir, filename(id));
|
|
133
|
+
const info = await lstat(file);
|
|
134
|
+
if (!info.isFile() || info.isSymbolicLink() || info.size > MAX_BYTES)
|
|
135
|
+
continue;
|
|
136
|
+
const handle = await open(file, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0));
|
|
137
|
+
let text;
|
|
138
|
+
try {
|
|
139
|
+
const stat = await handle.stat();
|
|
140
|
+
if (!stat.isFile() || stat.size > MAX_BYTES)
|
|
141
|
+
continue;
|
|
142
|
+
// One extra byte detects concurrent growth, while keeping reads bounded.
|
|
143
|
+
const buffer = Buffer.alloc(MAX_BYTES + 1);
|
|
144
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
145
|
+
if (bytesRead > MAX_BYTES)
|
|
146
|
+
continue;
|
|
147
|
+
text = buffer.subarray(0, bytesRead).toString('utf8');
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await handle.close();
|
|
151
|
+
}
|
|
152
|
+
const report = validate(JSON.parse(text));
|
|
153
|
+
if (report?.sessionId === id)
|
|
154
|
+
reports.push(report);
|
|
155
|
+
}
|
|
156
|
+
catch { /* Missing, unsafe, malformed or concurrently replaced evidence is unavailable. */ }
|
|
157
|
+
}
|
|
158
|
+
return reports;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=reports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../src/reports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type Observer, type EventType, type EventMetadata } from './observability.js';
|
|
2
|
+
import { ConfigStore, type Agent, type Config } from './config.js';
|
|
3
|
+
import { listen, send, type Endpoint, type Envelope, type Kind } from './transport.js';
|
|
4
|
+
export declare const UNSUPPORTED_CANCELLATION = "Unsupported Pi host: stop_worker and close_worker are disabled. Pi 0.84.4 extension abort does not cancel retry backoff/continuations; graceful shutdown cannot guarantee no queued work restarts. No cancellation or shutdown was performed. See references/implementation-blocker.md. A verified supported host API is required (no version-only override).";
|
|
5
|
+
export interface Host {
|
|
6
|
+
sessionId(): string;
|
|
7
|
+
cwd: string;
|
|
8
|
+
busy(): boolean;
|
|
9
|
+
deliver(text: string, busy: boolean): void;
|
|
10
|
+
setName(name: string): Promise<void>;
|
|
11
|
+
notify(text: string): void;
|
|
12
|
+
}
|
|
13
|
+
export interface LaunchRequest {
|
|
14
|
+
multiplexer: 'herdr' | 'none';
|
|
15
|
+
cwd: string;
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface RuntimeOptions {
|
|
19
|
+
launch(request: LaunchRequest): Promise<unknown>;
|
|
20
|
+
listen?: typeof listen;
|
|
21
|
+
send?: typeof send;
|
|
22
|
+
store?: (root: string) => ConfigStore;
|
|
23
|
+
observe?: (root: string, sessionId: string) => Observer;
|
|
24
|
+
}
|
|
25
|
+
export declare class Intercom {
|
|
26
|
+
readonly host: Host;
|
|
27
|
+
readonly options: RuntimeOptions;
|
|
28
|
+
store: ConfigStore;
|
|
29
|
+
endpoint?: Endpoint;
|
|
30
|
+
private active;
|
|
31
|
+
private generation;
|
|
32
|
+
private initialId;
|
|
33
|
+
responsibility?: Agent;
|
|
34
|
+
private observer?;
|
|
35
|
+
private closing?;
|
|
36
|
+
private reportWrites;
|
|
37
|
+
private pendingReports;
|
|
38
|
+
private captureObserver;
|
|
39
|
+
recordObservation(event: EventType, metadata?: EventMetadata): void;
|
|
40
|
+
constructor(host: Host, options: RuntimeOptions);
|
|
41
|
+
private id;
|
|
42
|
+
private validity;
|
|
43
|
+
start(): Promise<void>;
|
|
44
|
+
close(): Promise<void>;
|
|
45
|
+
state(): Promise<{
|
|
46
|
+
id: string;
|
|
47
|
+
config: Config;
|
|
48
|
+
me?: Agent;
|
|
49
|
+
}>;
|
|
50
|
+
/** Accept old configs, but retire the removed browser dashboard's discovery metadata. */
|
|
51
|
+
retireDashboardMetadata(): Promise<void>;
|
|
52
|
+
reload(): Promise<void>;
|
|
53
|
+
transmit(to: string, kind: Kind, payload?: Record<string, unknown>): Promise<void>;
|
|
54
|
+
report(): Promise<void>;
|
|
55
|
+
receive(message: Envelope): Promise<void>;
|
|
56
|
+
private handleReceive;
|
|
57
|
+
tool(operation: string, args: Record<string, unknown>): Promise<unknown>;
|
|
58
|
+
private launchObserved;
|
|
59
|
+
}
|