humanish 0.84.1 → 0.85.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/dist/export.js +17 -10
- package/dist/export.js.map +1 -1
- package/dist/observer-app.html +55 -9
- package/dist/observer-data.d.ts +12 -0
- package/dist/observer-data.js +8 -0
- package/dist/observer-data.js.map +1 -1
- package/dist/observer-library.d.ts +2 -0
- package/dist/observer-library.js.map +1 -1
- package/dist/observer-static.js +52 -1
- package/dist/observer-static.js.map +1 -1
- package/dist/observer.d.ts +5 -0
- package/dist/observer.js +90 -34
- package/dist/observer.js.map +1 -1
- package/dist/program.js +48 -47
- package/dist/program.js.map +1 -1
- package/dist/serve-http.d.ts +4 -0
- package/dist/serve-http.js +9 -1
- package/dist/serve-http.js.map +1 -1
- package/dist/tui-actions.d.ts +12 -7
- package/dist/tui-actions.js +72 -56
- package/dist/tui-actions.js.map +1 -1
- package/dist/tui-app.js +1 -1
- package/dist/tui-contract.d.ts +1 -1
- package/docs/architecture/observer-review.md +130 -0
- package/docs/architecture/observer.md +88 -2
- package/docs/contracts/schemas.md +1 -1
- package/docs/goals/current.md +4 -2
- package/docs/ramp/README.md +1 -1
- package/docs/release/0.85.0-observer-review.md +56 -0
- package/package.json +4 -2
package/dist/observer-data.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export interface ObserverData {
|
|
|
9
9
|
schema: typeof OBSERVER_DATA_SCHEMA;
|
|
10
10
|
schemaVersion: 1;
|
|
11
11
|
generatedAt: string;
|
|
12
|
+
/** Served-only liveness observation. Never a replacement for the recorded evidence verdict. */
|
|
13
|
+
runtime?: {
|
|
14
|
+
state: "running" | "finished" | "interrupted" | "unknown";
|
|
15
|
+
observedAt: string;
|
|
16
|
+
source: "local-run-status";
|
|
17
|
+
};
|
|
12
18
|
run: {
|
|
13
19
|
runId: string;
|
|
14
20
|
mode: RunBundle["mode"];
|
|
@@ -76,6 +82,10 @@ export interface ObserverData {
|
|
|
76
82
|
};
|
|
77
83
|
}
|
|
78
84
|
export interface ObserverStream extends RunStream {
|
|
85
|
+
/** Only the attached server may grant provider-origin access for a live desktop iframe. */
|
|
86
|
+
embed?: NonNullable<RunStream["embed"]> & {
|
|
87
|
+
runtimeDesktop?: true;
|
|
88
|
+
};
|
|
79
89
|
/** Participant-facing status. The actor and simulation retain their original protocol status. */
|
|
80
90
|
status: RunStream["status"];
|
|
81
91
|
sim: RunSimulation;
|
|
@@ -84,6 +94,8 @@ export interface ObserverStream extends RunStream {
|
|
|
84
94
|
terminalPlain: string;
|
|
85
95
|
timeline: RunEvent[];
|
|
86
96
|
}
|
|
97
|
+
/** Discard a forged or stale runtime grant before projecting persisted evidence. */
|
|
98
|
+
export declare function recordedStreamEmbed(embed: NonNullable<RunStream["embed"]>): NonNullable<RunStream["embed"]>;
|
|
87
99
|
export interface ObserverLaneGroup {
|
|
88
100
|
roleId: string;
|
|
89
101
|
simId: string;
|
package/dist/observer-data.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { formatParticipantOutcomes, formatStudyTaskFunnel } from "./run.js";
|
|
2
2
|
export const OBSERVER_DATA_SCHEMA = "humanish.observer-data.v1";
|
|
3
|
+
/** Discard a forged or stale runtime grant before projecting persisted evidence. */
|
|
4
|
+
export function recordedStreamEmbed(embed) {
|
|
5
|
+
if (!embed)
|
|
6
|
+
return embed;
|
|
7
|
+
const { runtimeDesktop: _runtimeGrant, ...recorded } = embed;
|
|
8
|
+
return recorded;
|
|
9
|
+
}
|
|
3
10
|
const allKinds = ["ui", "browser", "terminal", "tui", "codex-ui", "artifact", "summary"];
|
|
4
11
|
export function buildObserverData(bundle, generatedAt = new Date().toISOString()) {
|
|
5
12
|
const byKind = Object.fromEntries(allKinds.map((kind) => [kind, 0]));
|
|
@@ -17,6 +24,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
|
|
|
17
24
|
byKind[stream.kind] += 1;
|
|
18
25
|
return {
|
|
19
26
|
...stream,
|
|
27
|
+
...(stream.embed === undefined ? {} : { embed: recordedStreamEmbed(stream.embed) }),
|
|
20
28
|
status,
|
|
21
29
|
sim,
|
|
22
30
|
kindLabel: kindLabel(stream.kind),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer-data.js","sourceRoot":"","sources":["../src/observer-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAG5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"observer-data.js","sourceRoot":"","sources":["../src/observer-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ export interface LibraryHistory {
|
|
|
6
6
|
mode: string | null;
|
|
7
7
|
href: string;
|
|
8
8
|
status: string;
|
|
9
|
+
/** Current contained status-record observation, separate from the evidence verdict. */
|
|
10
|
+
runtimeState?: "running" | "finished" | "interrupted" | "unknown";
|
|
9
11
|
streamCount: number;
|
|
10
12
|
/** Labeled run-total cost ESTIMATE (null when the run carries no cost summary). */
|
|
11
13
|
estimatedCostUsd: number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer-library.js","sourceRoot":"","sources":["../src/observer-library.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"observer-library.js","sourceRoot":"","sources":["../src/observer-library.ts"],"names":[],"mappings":"AAwBA,MAAM,YAAY,GAA2B;IAC3C,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,OAAuB,EAAE,IAA0B;IACnF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI;QAC1B,CAAC,CAAC,6DAA6D;QAC/D,CAAC,CAAC,mDAAmD,CAAC;IAExD,OAAO;;;;;;SAMA,UAAU,EAAE;;;;;;uBAME,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;;;;;uCAKX,UAAU,CAAC,UAAU,CAAC;;0DAEH,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;oDACzC,gBAAgB,CAAC,OAAO,CAAC;UACnE,eAAe,EAAE;;;CAG1B,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,IAA0B;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7G,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAED,SAAS,UAAU;IACjB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCR,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC3C,OAAO;;gBAEO,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EpB,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QACxC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,GAAG;gBACN,OAAO,OAAO,CAAC;YACjB,KAAK,GAAG;gBACN,OAAO,MAAM,CAAC;YAChB,KAAK,GAAG;gBACN,OAAO,MAAM,CAAC;YAChB,KAAK,IAAI;gBACP,OAAO,QAAQ,CAAC;YAClB;gBACE,OAAO,OAAO,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACzB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC"}
|
package/dist/observer-static.js
CHANGED
|
@@ -2,6 +2,7 @@ import { constants as fsConstants } from "node:fs";
|
|
|
2
2
|
import { createServer } from "node:http";
|
|
3
3
|
import { lstat, open, realpath } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import { buildArtifactSecurityHeaders } from "./serve-http.js";
|
|
5
6
|
// Loopback-only host for the Observer static server. We never bind 0.0.0.0:
|
|
6
7
|
// the Observer surfaces local run evidence and must stay reachable only from
|
|
7
8
|
// the machine that owns the run bundle.
|
|
@@ -39,6 +40,7 @@ export function observerStaticContentType(filePath) {
|
|
|
39
40
|
* socket.
|
|
40
41
|
*/
|
|
41
42
|
export async function respondToObserverStaticRequest(options, request, response) {
|
|
43
|
+
applySecurityHeaders(response);
|
|
42
44
|
try {
|
|
43
45
|
const root = await pinStaticRoot(options.root);
|
|
44
46
|
await respondToPinnedObserverStaticRequest(root, options, request, response);
|
|
@@ -52,6 +54,7 @@ export async function respondToObserverStaticRequest(options, request, response)
|
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
56
|
async function respondToPinnedObserverStaticRequest(root, options, request, response) {
|
|
57
|
+
applySecurityHeaders(response);
|
|
55
58
|
const indexRelative = options.indexPath ?? "index.html";
|
|
56
59
|
try {
|
|
57
60
|
await assertPinnedStaticRoot(root);
|
|
@@ -120,7 +123,8 @@ async function respondToPinnedObserverStaticRequest(root, options, request, resp
|
|
|
120
123
|
return;
|
|
121
124
|
}
|
|
122
125
|
}
|
|
123
|
-
const
|
|
126
|
+
const rawBody = await readContainedRegularFile(root, filePath);
|
|
127
|
+
const body = rawBody ? recordedObserverStaticBody(filePath, rawBody) : null;
|
|
124
128
|
if (!body) {
|
|
125
129
|
writeText(response, 404, "Not Found");
|
|
126
130
|
return;
|
|
@@ -144,6 +148,52 @@ async function respondToPinnedObserverStaticRequest(root, options, request, resp
|
|
|
144
148
|
writeText(response, 500, "Observer request failed");
|
|
145
149
|
}
|
|
146
150
|
}
|
|
151
|
+
function applySecurityHeaders(response) {
|
|
152
|
+
for (const [name, value] of Object.entries(buildArtifactSecurityHeaders()))
|
|
153
|
+
response.setHeader(name, value);
|
|
154
|
+
}
|
|
155
|
+
/** Static serving is recorded evidence. Neither JSON files nor inline HTML snapshots
|
|
156
|
+
* can carry a live process observation or grant provider-origin access. */
|
|
157
|
+
function recordedObserverStaticBody(filePath, body) {
|
|
158
|
+
const strip = (text) => {
|
|
159
|
+
try {
|
|
160
|
+
const data = JSON.parse(text);
|
|
161
|
+
if (!data || typeof data !== "object" || Array.isArray(data)
|
|
162
|
+
|| data.schema !== "humanish.observer-data.v1")
|
|
163
|
+
return null;
|
|
164
|
+
const projection = data;
|
|
165
|
+
delete projection.runtime;
|
|
166
|
+
if (Array.isArray(projection.streams)) {
|
|
167
|
+
for (const stream of projection.streams) {
|
|
168
|
+
if (!stream || typeof stream !== "object" || Array.isArray(stream))
|
|
169
|
+
continue;
|
|
170
|
+
const embed = stream.embed;
|
|
171
|
+
if (embed && typeof embed === "object" && !Array.isArray(embed))
|
|
172
|
+
delete embed.runtimeDesktop;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return JSON.stringify(projection).replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/&/g, "\\u0026");
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
if (path.basename(filePath) === "observer-data.json") {
|
|
182
|
+
const stripped = strip(body.toString("utf8"));
|
|
183
|
+
return stripped === null ? body : Buffer.from(stripped);
|
|
184
|
+
}
|
|
185
|
+
if (/\.html?$/i.test(filePath)) {
|
|
186
|
+
const html = body.toString("utf8");
|
|
187
|
+
// Identify Observer JSON by its schema, not an attribute spelling: HTML permits
|
|
188
|
+
// encoded ids and '>' inside quoted attributes. Other scripts remain byte-identical.
|
|
189
|
+
const sanitized = html.replace(/(<script\b(?:[^>"']|"[^"]*"|'[^']*')*>)([\s\S]*?)(<\/script\s*>)/gi, (match, start, json, end) => {
|
|
190
|
+
const stripped = strip(json);
|
|
191
|
+
return stripped === null ? match : `${start}${stripped}${end}`;
|
|
192
|
+
});
|
|
193
|
+
return sanitized === html ? body : Buffer.from(sanitized);
|
|
194
|
+
}
|
|
195
|
+
return body;
|
|
196
|
+
}
|
|
147
197
|
async function readContainedRegularFile(root, filePathInput) {
|
|
148
198
|
const filePath = path.resolve(filePathInput);
|
|
149
199
|
if (!isPathInside(root.physicalPath, filePath))
|
|
@@ -185,6 +235,7 @@ async function readContainedRegularFile(root, filePathInput) {
|
|
|
185
235
|
export function createObserverStaticHandler(options) {
|
|
186
236
|
let rootPromise;
|
|
187
237
|
return (request, response) => {
|
|
238
|
+
applySecurityHeaders(response);
|
|
188
239
|
rootPromise ??= pinStaticRoot(options.root);
|
|
189
240
|
void rootPromise
|
|
190
241
|
.then((root) => respondToPinnedObserverStaticRequest(root, options, request, response))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer-static.js","sourceRoot":"","sources":["../src/observer-static.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"observer-static.js","sourceRoot":"","sources":["../src/observer-static.ts"],"names":[],"mappings":"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"}
|
package/dist/observer.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export interface ObserverOptions {
|
|
|
26
26
|
export interface ObserverServeOptions {
|
|
27
27
|
open?: boolean;
|
|
28
28
|
port?: number;
|
|
29
|
+
/** Restrict history and evidence routes to the selected run. Exposed viewers always do this. */
|
|
30
|
+
scope?: "run" | "library";
|
|
29
31
|
exposed?: boolean;
|
|
30
32
|
}
|
|
31
33
|
export interface ObserverServer {
|
|
@@ -65,6 +67,8 @@ export declare function serveObserver(result: ObserverResult, options?: Observer
|
|
|
65
67
|
export declare function preflightObserverArtifact(): void;
|
|
66
68
|
/** internal: exported for tests. Missing artifact, or any workspace source newer than it. */
|
|
67
69
|
export declare function observerArtifactNeedsBuild(workspaceDir: string, artifactPath: string): boolean;
|
|
70
|
+
/** Render current packaged UI around a validated/projected Observer snapshot. */
|
|
71
|
+
export declare function renderObserverHtml(data: ObserverData): string;
|
|
68
72
|
/** internal: consumed by observer-serve */
|
|
69
73
|
export declare function serveRunPath(runRoot: PinnedDirectory, relativePath: string, response: ServerResponse, runtimeStreamUrls?: ObserverRuntimeStreamUrl[]): Promise<void>;
|
|
70
74
|
/** internal: exported for the #357 lifecycle tests (consumed by observer-serve). */
|
|
@@ -78,6 +82,7 @@ export declare function buildHistoryIndex(proofRoot: PinnedDirectory): Promise<{
|
|
|
78
82
|
mode: string | null;
|
|
79
83
|
href: string;
|
|
80
84
|
status: string;
|
|
85
|
+
runtimeState?: NonNullable<ObserverData["runtime"]>["state"];
|
|
81
86
|
streamCount: number;
|
|
82
87
|
estimatedCostUsd: number | null;
|
|
83
88
|
costRatesAsOf: string | null;
|
package/dist/observer.js
CHANGED
|
@@ -5,11 +5,12 @@ import { createServer } from "node:http";
|
|
|
5
5
|
import { lstat, open, realpath } from "node:fs/promises";
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
|
-
import { buildObserverData } from "./observer-data.js";
|
|
8
|
+
import { buildObserverData, recordedStreamEmbed } from "./observer-data.js";
|
|
9
9
|
import { listRuns, loadRunBundle, verifyRun } from "./run.js";
|
|
10
10
|
import { bindExistingRunArtifactPaths, isPathInside, isSafeRunIdSegment, resolveLatestRunDirectory, validatePreparedRunArtifactPaths } from "./run-paths.js";
|
|
11
11
|
import { writeContainedOutputFile } from "./selected-output-paths.js";
|
|
12
|
-
import { buildServeSecurityHeaders, hostAllowed, parsePublicOrigin } from "./serve-http.js";
|
|
12
|
+
import { buildArtifactSecurityHeaders, buildServeSecurityHeaders, hostAllowed, parsePublicOrigin } from "./serve-http.js";
|
|
13
|
+
import { isRunStatusRecord, RUN_STATUS_FILE, RUN_STATUS_STALE_MS } from "./run-status.js";
|
|
13
14
|
export const OBSERVER_SCHEMA = "humanish.observer-result.v1";
|
|
14
15
|
const observerRuntimeStreamUrls = new WeakMap();
|
|
15
16
|
const observerPreparedRunPaths = new WeakMap();
|
|
@@ -159,16 +160,19 @@ export async function serveObserver(result, options = {}) {
|
|
|
159
160
|
}
|
|
160
161
|
const runtimeStreamUrls = () => observerRuntimeStreamUrls.get(result) ?? [];
|
|
161
162
|
const exposed = options.exposed === true;
|
|
163
|
+
const scopedToRun = exposed || options.scope === "run";
|
|
162
164
|
// Host allowlist for exposed mode (DNS-rebinding defense, identical to the run-library surface).
|
|
163
165
|
// Seeded with the loopback names after bind; addPublicOrigin extends it with the tunnel/public-url
|
|
164
166
|
// host. Never consulted in loopback (non-exposed) mode.
|
|
165
167
|
const hostAllowlist = new Set();
|
|
166
168
|
const server = createServer(async (request, response) => {
|
|
167
169
|
try {
|
|
170
|
+
// Every response, including run HTML artifacts, must refuse framing. A provider iframe
|
|
171
|
+
// with its own origin intact must not navigate back here and gain the Observer's origin.
|
|
172
|
+
for (const [name, value] of Object.entries(buildServeSecurityHeaders())) {
|
|
173
|
+
response.setHeader(name, value);
|
|
174
|
+
}
|
|
168
175
|
if (exposed) {
|
|
169
|
-
for (const [name, value] of Object.entries(buildServeSecurityHeaders())) {
|
|
170
|
-
response.setHeader(name, value);
|
|
171
|
-
}
|
|
172
176
|
if (!hostAllowed(request.headers.host, hostAllowlist)) {
|
|
173
177
|
writeResponse(response, 421, "Misdirected Request", "text/plain; charset=utf-8");
|
|
174
178
|
return;
|
|
@@ -182,10 +186,9 @@ export async function serveObserver(result, options = {}) {
|
|
|
182
186
|
}
|
|
183
187
|
if (url.pathname === "/_humanish/history.json") {
|
|
184
188
|
const history = await buildHistoryIndex(proofRoot);
|
|
185
|
-
// Exposed watch
|
|
186
|
-
//
|
|
187
|
-
|
|
188
|
-
if (exposed) {
|
|
189
|
+
// Exposed watch and selected-run viewers cannot enumerate other runs. Full-library
|
|
190
|
+
// loopback viewers retain the complete project index.
|
|
191
|
+
if (scopedToRun) {
|
|
189
192
|
const attachedRuns = history.runs.filter((entry) => entry.runId === result.run);
|
|
190
193
|
writeResponse(response, 200, JSON.stringify({ latestRunId: attachedRuns.length > 0 ? result.run : null, runs: attachedRuns }, null, 2), "application/json; charset=utf-8");
|
|
191
194
|
return;
|
|
@@ -199,9 +202,8 @@ export async function serveObserver(result, options = {}) {
|
|
|
199
202
|
writeResponse(response, 404, "Run not found", "text/plain; charset=utf-8");
|
|
200
203
|
return;
|
|
201
204
|
}
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
if (exposed && runRoute.runId !== result.run) {
|
|
205
|
+
// Scoped viewers cannot distinguish another run from a nonexistent one.
|
|
206
|
+
if (scopedToRun && runRoute.runId !== result.run) {
|
|
205
207
|
writeResponse(response, 404, "Run not found", "text/plain; charset=utf-8");
|
|
206
208
|
return;
|
|
207
209
|
}
|
|
@@ -210,7 +212,7 @@ export async function serveObserver(result, options = {}) {
|
|
|
210
212
|
writeResponse(response, 404, "Run not found", "text/plain; charset=utf-8");
|
|
211
213
|
return;
|
|
212
214
|
}
|
|
213
|
-
await serveRunPath(targetRoot, runRoute.relativePath || "observer/index.html", response, runtimeStreamUrls());
|
|
215
|
+
await serveRunPath(targetRoot, runRoute.relativePath || "observer/index.html", response, runRoute.runId === result.run ? runtimeStreamUrls() : []);
|
|
214
216
|
return;
|
|
215
217
|
}
|
|
216
218
|
await serveRunPath(runRoot, decodeURIComponent(url.pathname.slice(1)), response, runtimeStreamUrls());
|
|
@@ -397,21 +399,24 @@ function newestSourceMtime(dir) {
|
|
|
397
399
|
}
|
|
398
400
|
function renderObserverAppHtml(data) {
|
|
399
401
|
return loadObserverArtifact()
|
|
400
|
-
.replace(OBSERVER_DATA_SLOT, `<script id="observer-data" type="application/json">${escapeJsonScript(data)}</script>`)
|
|
401
|
-
.replace(/<title>[^<]*<\/title>/, `<title>Humanish Observer — ${escapeHtml(data.run.runId)}</title>`);
|
|
402
|
+
.replace(OBSERVER_DATA_SLOT, () => `<script id="observer-data" type="application/json">${escapeJsonScript(data)}</script>`)
|
|
403
|
+
.replace(/<title>[^<]*<\/title>/, () => `<title>Humanish Observer — ${escapeHtml(data.run.runId)}</title>`);
|
|
402
404
|
}
|
|
403
|
-
|
|
405
|
+
/** Render current packaged UI around a validated/projected Observer snapshot. */
|
|
406
|
+
export function renderObserverHtml(data) {
|
|
404
407
|
return renderObserverAppHtml(data);
|
|
405
408
|
}
|
|
406
409
|
/** internal: consumed by observer-serve */
|
|
407
410
|
export async function serveRunPath(runRoot, relativePath, response, runtimeStreamUrls = []) {
|
|
408
411
|
const root = runRoot.physicalPath;
|
|
409
|
-
const
|
|
410
|
-
const filePath = path.resolve(root, cleanedRelativePath);
|
|
412
|
+
const filePath = path.resolve(root, relativePath === "" ? "observer/index.html" : relativePath);
|
|
411
413
|
if (!isPathInside(root, filePath)) {
|
|
412
414
|
writeResponse(response, 403, "Forbidden", "text/plain; charset=utf-8");
|
|
413
415
|
return;
|
|
414
416
|
}
|
|
417
|
+
// Alias spellings such as observer//observer-data.json must use the same projection,
|
|
418
|
+
// not fall through to a raw persisted file and inherit a forged runtime grant.
|
|
419
|
+
const cleanedRelativePath = path.relative(root, filePath).split(path.sep).join("/");
|
|
415
420
|
if (cleanedRelativePath === "observer/index.html") {
|
|
416
421
|
const observerData = await readObserverData(runRoot, runtimeStreamUrls);
|
|
417
422
|
if (!observerData) {
|
|
@@ -437,7 +442,7 @@ export async function serveRunPath(runRoot, relativePath, response, runtimeStrea
|
|
|
437
442
|
return;
|
|
438
443
|
}
|
|
439
444
|
response.writeHead(200, {
|
|
440
|
-
|
|
445
|
+
...buildArtifactSecurityHeaders(),
|
|
441
446
|
"content-type": contentTypeForPath(filePath)
|
|
442
447
|
});
|
|
443
448
|
response.end(body);
|
|
@@ -457,50 +462,97 @@ async function readObserverData(runRoot, runtimeStreamUrls = []) {
|
|
|
457
462
|
if (!bundleBytes)
|
|
458
463
|
throw new Error("run.json unavailable");
|
|
459
464
|
const bundle = JSON.parse(bundleBytes.toString("utf8"));
|
|
460
|
-
return withRuntimeStreamUrls(buildObserverData(bundle), runtimeStreamUrls);
|
|
465
|
+
return withRuntimeStreamUrls(await withLocalRunStatus(runRoot, buildObserverData(bundle)), runtimeStreamUrls);
|
|
461
466
|
}
|
|
462
467
|
catch { }
|
|
463
468
|
try {
|
|
464
469
|
const observerBytes = await readContainedFile(runRoot, path.join(runRoot.physicalPath, "observer", "observer-data.json"));
|
|
465
470
|
if (!observerBytes)
|
|
466
471
|
throw new Error("observer-data.json unavailable");
|
|
467
|
-
return withRuntimeStreamUrls(JSON.parse(observerBytes.toString("utf8")), runtimeStreamUrls);
|
|
472
|
+
return withRuntimeStreamUrls(await withLocalRunStatus(runRoot, JSON.parse(observerBytes.toString("utf8"))), runtimeStreamUrls);
|
|
468
473
|
}
|
|
469
474
|
catch { }
|
|
470
475
|
return null;
|
|
471
476
|
}
|
|
472
|
-
/**
|
|
473
|
-
|
|
474
|
-
|
|
477
|
+
/**
|
|
478
|
+
* Liveness is a current read of a contained local status record, separate from run evidence.
|
|
479
|
+
* A stale heartbeat means unknown: neither an old timestamp nor a persisted PID proves that a
|
|
480
|
+
* process died (the evidence may have been copied from another machine). No PID is served/probed.
|
|
481
|
+
*/
|
|
482
|
+
async function withLocalRunStatus(runRoot, input) {
|
|
483
|
+
// A served observation must never be inherited from a persisted projection or export.
|
|
484
|
+
const { runtime: _persistedRuntime, ...data } = input;
|
|
485
|
+
try {
|
|
486
|
+
const bytes = await readContainedFile(runRoot, path.join(runRoot.physicalPath, RUN_STATUS_FILE));
|
|
487
|
+
if (!bytes)
|
|
488
|
+
return data;
|
|
489
|
+
const record = JSON.parse(bytes.toString("utf8"));
|
|
490
|
+
if (!isRunStatusRecord(record) || record.runId !== data.run.runId || record.mode !== data.run.mode
|
|
491
|
+
|| record.runId !== path.basename(runRoot.physicalPath))
|
|
492
|
+
return data;
|
|
493
|
+
const now = Date.now();
|
|
494
|
+
const started = Date.parse(record.startedAt);
|
|
495
|
+
const updated = Date.parse(record.updatedAt);
|
|
496
|
+
const timestampsValid = Number.isFinite(started) && Number.isFinite(updated)
|
|
497
|
+
&& started <= updated && updated <= now;
|
|
498
|
+
let state = "unknown";
|
|
499
|
+
if (timestampsValid) {
|
|
500
|
+
if (record.state === "finished") {
|
|
501
|
+
state = "finished";
|
|
502
|
+
}
|
|
503
|
+
else if (now - updated <= RUN_STATUS_STALE_MS) {
|
|
504
|
+
state = "running";
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return { ...data, runtime: { state, observedAt: new Date(now).toISOString(), source: "local-run-status" } };
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
475
510
|
return data;
|
|
476
511
|
}
|
|
512
|
+
}
|
|
513
|
+
/** internal: exported for the #357 lifecycle tests (consumed by observer-serve). */
|
|
514
|
+
export function withRuntimeStreamUrls(data, runtimeStreamUrls) {
|
|
477
515
|
const byStream = new Map(runtimeStreamUrls.map((stream) => [stream.streamId, stream]));
|
|
478
516
|
return {
|
|
479
517
|
...data,
|
|
480
|
-
streams: data.streams.map((
|
|
518
|
+
streams: data.streams.map((input) => {
|
|
519
|
+
// JSON projections are untrusted, including fallback observer-data.json. A marker saved in
|
|
520
|
+
// a bundle is never authority; only this process's attached runtime map grants it again.
|
|
521
|
+
const stream = input.embed === undefined ? input : { ...input, embed: recordedStreamEmbed(input.embed) };
|
|
481
522
|
const runtime = byStream.get(stream.id);
|
|
482
|
-
if (!runtime)
|
|
523
|
+
if (!runtime)
|
|
483
524
|
return stream;
|
|
484
|
-
|
|
485
|
-
if (runtime.ended) {
|
|
486
|
-
// The sandbox is gone: a live iframe here renders the provider's "sandbox not found" page,
|
|
487
|
-
// which is pixel-identical to a crash. Fall back to the recorded evidence the tile already
|
|
488
|
-
// renders when no live URL is advertised, and mark WHY the live view ended (#357).
|
|
525
|
+
if (runtime.ended)
|
|
489
526
|
return { ...stream, liveEnded: true };
|
|
490
|
-
|
|
527
|
+
const url = runtimeDesktopUrl(runtime.url);
|
|
528
|
+
if (!url)
|
|
529
|
+
return stream;
|
|
491
530
|
return {
|
|
492
531
|
...stream,
|
|
532
|
+
...(stream.liveEnded === true ? { liveEnded: false } : {}),
|
|
493
533
|
embed: {
|
|
494
534
|
...(stream.embed ?? { title: stream.label }),
|
|
495
535
|
kind: "iframe",
|
|
496
|
-
url
|
|
536
|
+
url,
|
|
537
|
+
runtimeDesktop: true
|
|
497
538
|
},
|
|
498
539
|
transport: "sse",
|
|
499
|
-
url
|
|
540
|
+
url
|
|
500
541
|
};
|
|
501
542
|
})
|
|
502
543
|
};
|
|
503
544
|
}
|
|
545
|
+
function runtimeDesktopUrl(value) {
|
|
546
|
+
if (!value || value.length > 16_384 || /[\u0000-\u0020\u007f\\]/.test(value))
|
|
547
|
+
return null;
|
|
548
|
+
try {
|
|
549
|
+
const url = new URL(value);
|
|
550
|
+
return (url.protocol === "http:" || url.protocol === "https:") && !url.username && !url.password ? url.href : null;
|
|
551
|
+
}
|
|
552
|
+
catch {
|
|
553
|
+
return null;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
504
556
|
/** internal: consumed by observer-serve */
|
|
505
557
|
export async function buildHistoryIndex(proofRoot) {
|
|
506
558
|
await assertPinnedDirectory(proofRoot);
|
|
@@ -515,6 +567,7 @@ export async function buildHistoryIndex(proofRoot) {
|
|
|
515
567
|
mode: run.mode,
|
|
516
568
|
href: `/_humanish/runs/${encodeURIComponent(run.runId)}/observer/index.html`,
|
|
517
569
|
status: data?.run.status ?? "unknown",
|
|
570
|
+
...(data?.runtime ? { runtimeState: data.runtime.state } : {}),
|
|
518
571
|
streamCount: data?.streams.length ?? 0,
|
|
519
572
|
// Labeled run-total cost estimate (advisory; null when the run carries no cost summary).
|
|
520
573
|
estimatedCostUsd: data?.cost?.estimatedTotalUsd ?? null,
|
|
@@ -686,6 +739,9 @@ export function openTarget(target) {
|
|
|
686
739
|
detached: true,
|
|
687
740
|
stdio: "ignore"
|
|
688
741
|
});
|
|
742
|
+
// Missing desktop openers fail asynchronously (ENOENT), especially over SSH or in a
|
|
743
|
+
// minimal container. The served URL remains usable; an opener must never crash its server.
|
|
744
|
+
child.on("error", () => { });
|
|
689
745
|
child.unref();
|
|
690
746
|
return { opened: true, command: [command, ...args].join(" ") };
|
|
691
747
|
}
|