humanish 0.0.1 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +77 -0
- package/CONTRIBUTING.md +39 -0
- package/LICENSE +21 -0
- package/README.md +437 -8
- package/SECURITY.md +34 -0
- package/dist/actor-contract.d.ts +107 -0
- package/dist/actor-contract.js +286 -0
- package/dist/actor-contract.js.map +1 -0
- package/dist/actor-registry.d.ts +73 -0
- package/dist/actor-registry.js +93 -0
- package/dist/actor-registry.js.map +1 -0
- package/dist/adapter-extension.d.ts +54 -0
- package/dist/adapter-extension.js +214 -0
- package/dist/adapter-extension.js.map +1 -0
- package/dist/argv.d.ts +1 -0
- package/dist/argv.js +8 -0
- package/dist/argv.js.map +1 -0
- package/dist/artifact-reference.d.ts +22 -0
- package/dist/artifact-reference.js +47 -0
- package/dist/artifact-reference.js.map +1 -0
- package/dist/browser-evidence-hygiene.d.ts +7 -0
- package/dist/browser-evidence-hygiene.js +40 -0
- package/dist/browser-evidence-hygiene.js.map +1 -0
- package/dist/claude-agent-sdk.d.ts +94 -0
- package/dist/claude-agent-sdk.js +363 -0
- package/dist/claude-agent-sdk.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-app-server-ui.d.ts +39 -0
- package/dist/codex-app-server-ui.js +357 -0
- package/dist/codex-app-server-ui.js.map +1 -0
- package/dist/codex-app-server.d.ts +144 -0
- package/dist/codex-app-server.js +754 -0
- package/dist/codex-app-server.js.map +1 -0
- package/dist/command-failure.d.ts +29 -0
- package/dist/command-failure.js +54 -0
- package/dist/command-failure.js.map +1 -0
- package/dist/computer-use-actor.d.ts +52 -0
- package/dist/computer-use-actor.js +48 -0
- package/dist/computer-use-actor.js.map +1 -0
- package/dist/computer-use.d.ts +232 -0
- package/dist/computer-use.js +615 -0
- package/dist/computer-use.js.map +1 -0
- package/dist/concurrency.d.ts +1 -0
- package/dist/concurrency.js +27 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/concurrent-shared-world-lab.d.ts +115 -0
- package/dist/concurrent-shared-world-lab.js +1094 -0
- package/dist/concurrent-shared-world-lab.js.map +1 -0
- package/dist/core/git-state.d.ts +33 -0
- package/dist/core/git-state.js +277 -0
- package/dist/core/git-state.js.map +1 -0
- package/dist/core/git-workspace.d.ts +31 -0
- package/dist/core/git-workspace.js +447 -0
- package/dist/core/git-workspace.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/run-primitives.d.ts +66 -0
- package/dist/core/run-primitives.js +120 -0
- package/dist/core/run-primitives.js.map +1 -0
- package/dist/cua-actor-lab.d.ts +621 -0
- package/dist/cua-actor-lab.js +2845 -0
- package/dist/cua-actor-lab.js.map +1 -0
- package/dist/device-presets.d.ts +67 -0
- package/dist/device-presets.js +50 -0
- package/dist/device-presets.js.map +1 -0
- package/dist/e2b-desktop-executor.d.ts +101 -0
- package/dist/e2b-desktop-executor.js +309 -0
- package/dist/e2b-desktop-executor.js.map +1 -0
- package/dist/e2b-desktop-launch.d.ts +144 -0
- package/dist/e2b-desktop-launch.js +59 -0
- package/dist/e2b-desktop-launch.js.map +1 -0
- package/dist/e2b-detached.d.ts +53 -0
- package/dist/e2b-detached.js +130 -0
- package/dist/e2b-detached.js.map +1 -0
- package/dist/e2b-terminal-lab.d.ts +345 -0
- package/dist/e2b-terminal-lab.js +1532 -0
- package/dist/e2b-terminal-lab.js.map +1 -0
- package/dist/env-file.d.ts +14 -0
- package/dist/env-file.js +108 -0
- package/dist/env-file.js.map +1 -0
- package/dist/feedback.d.ts +51 -0
- package/dist/feedback.js +351 -0
- package/dist/feedback.js.map +1 -0
- package/dist/image-evidence.d.ts +2 -0
- package/dist/image-evidence.js +33 -0
- package/dist/image-evidence.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/init-templates.d.ts +12 -0
- package/dist/init-templates.js +369 -0
- package/dist/init-templates.js.map +1 -0
- package/dist/init.d.ts +26 -0
- package/dist/init.js +429 -0
- package/dist/init.js.map +1 -0
- package/dist/lab-app-runner.d.ts +78 -0
- package/dist/lab-app-runner.js +403 -0
- package/dist/lab-app-runner.js.map +1 -0
- package/dist/lab-config.d.ts +583 -0
- package/dist/lab-config.js +1789 -0
- package/dist/lab-config.js.map +1 -0
- package/dist/lab-engine.d.ts +77 -0
- package/dist/lab-engine.js +216 -0
- package/dist/lab-engine.js.map +1 -0
- package/dist/lab-preflight.d.ts +67 -0
- package/dist/lab-preflight.js +385 -0
- package/dist/lab-preflight.js.map +1 -0
- package/dist/labs.d.ts +53 -0
- package/dist/labs.js +382 -0
- package/dist/labs.js.map +1 -0
- package/dist/observer-assets.d.ts +2 -0
- package/dist/observer-assets.js +2630 -0
- package/dist/observer-assets.js.map +1 -0
- package/dist/observer-data.d.ts +63 -0
- package/dist/observer-data.js +145 -0
- package/dist/observer-data.js.map +1 -0
- package/dist/observer-static.d.ts +39 -0
- package/dist/observer-static.js +306 -0
- package/dist/observer-static.js.map +1 -0
- package/dist/observer.d.ts +46 -0
- package/dist/observer.js +550 -0
- package/dist/observer.js.map +1 -0
- package/dist/openai-responses-cu.d.ts +113 -0
- package/dist/openai-responses-cu.js +545 -0
- package/dist/openai-responses-cu.js.map +1 -0
- package/dist/oss-lab.d.ts +52 -0
- package/dist/oss-lab.js +344 -0
- package/dist/oss-lab.js.map +1 -0
- package/dist/oss-meta-lab-scoring.d.ts +15 -0
- package/dist/oss-meta-lab-scoring.js +145 -0
- package/dist/oss-meta-lab-scoring.js.map +1 -0
- package/dist/oss-meta-lab.d.ts +277 -0
- package/dist/oss-meta-lab.js +4529 -0
- package/dist/oss-meta-lab.js.map +1 -0
- package/dist/oss-remote-telemetry.d.ts +77 -0
- package/dist/oss-remote-telemetry.js +403 -0
- package/dist/oss-remote-telemetry.js.map +1 -0
- package/dist/persona.d.ts +35 -0
- package/dist/persona.js +133 -0
- package/dist/persona.js.map +1 -0
- package/dist/pi-agent-core.d.ts +77 -0
- package/dist/pi-agent-core.js +203 -0
- package/dist/pi-agent-core.js.map +1 -0
- package/dist/program.d.ts +54 -0
- package/dist/program.js +2349 -0
- package/dist/program.js.map +1 -0
- package/dist/redaction.d.ts +90 -0
- package/dist/redaction.js +292 -0
- package/dist/redaction.js.map +1 -0
- package/dist/run-paths.d.ts +56 -0
- package/dist/run-paths.js +340 -0
- package/dist/run-paths.js.map +1 -0
- package/dist/run.d.ts +794 -0
- package/dist/run.js +4844 -0
- package/dist/run.js.map +1 -0
- package/dist/scripted-browser-actor.d.ts +297 -0
- package/dist/scripted-browser-actor.js +1399 -0
- package/dist/scripted-browser-actor.js.map +1 -0
- package/dist/scripted-browser-lab.d.ts +107 -0
- package/dist/scripted-browser-lab.js +788 -0
- package/dist/scripted-browser-lab.js.map +1 -0
- package/dist/selected-output-paths.d.ts +49 -0
- package/dist/selected-output-paths.js +354 -0
- package/dist/selected-output-paths.js.map +1 -0
- package/dist/shared-world-lab.d.ts +208 -0
- package/dist/shared-world-lab.js +1049 -0
- package/dist/shared-world-lab.js.map +1 -0
- package/dist/source-archive.d.ts +82 -0
- package/dist/source-archive.js +408 -0
- package/dist/source-archive.js.map +1 -0
- package/dist/stop-conditions.d.ts +26 -0
- package/dist/stop-conditions.js +66 -0
- package/dist/stop-conditions.js.map +1 -0
- package/dist/terminal-agent-actor.d.ts +36 -0
- package/dist/terminal-agent-actor.js +23 -0
- package/dist/terminal-agent-actor.js.map +1 -0
- package/docs/architecture/actor-contract.md +431 -0
- package/docs/architecture/github-feedback-loop.md +189 -0
- package/docs/architecture/local-codex-tui-actor.md +213 -0
- package/docs/architecture/observer.md +118 -0
- package/docs/architecture/oss-lab-poc.md +250 -0
- package/docs/architecture/project-layout.md +166 -0
- package/docs/architecture/state-driven-executor.md +203 -0
- package/docs/architecture/terminal-product-lane.md +148 -0
- package/docs/contracts/adapter-fixtures.md +80 -0
- package/docs/contracts/core.md +71 -0
- package/docs/contracts/feedback.md +145 -0
- package/docs/contracts/policy.md +311 -0
- package/docs/contracts/run-bundle.md +358 -0
- package/docs/contracts/schemas.md +984 -0
- package/docs/goals/current.md +428 -0
- package/docs/principles/invariants-and-defaults.md +135 -0
- package/docs/principles/self-driving-harness.md +129 -0
- package/docs/product/open-source-install-experience.md +237 -0
- package/docs/ramp/README.md +207 -0
- package/docs/release/open-source-readiness.md +208 -0
- package/docs/release/public-readiness-standard.md +205 -0
- package/docs/roadmap/world-class-open-source-v0.md +311 -0
- package/package.json +102 -8
- package/skills/humanish/SKILL.md +244 -0
- package/skills/humanish/agents/openai.yaml +7 -0
- package/index.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-assets.js","sourceRoot":"","sources":["../src/observer-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { RunBundle, RunEvent, RunSimulation, RunStream, RunStreamKind } from "./run.js";
|
|
2
|
+
export declare const OBSERVER_DATA_SCHEMA = "humanish.observer-data.v1";
|
|
3
|
+
export interface ObserverArtifactLink {
|
|
4
|
+
label: string;
|
|
5
|
+
href: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ObserverData {
|
|
9
|
+
schema: typeof OBSERVER_DATA_SCHEMA;
|
|
10
|
+
schemaVersion: 1;
|
|
11
|
+
generatedAt: string;
|
|
12
|
+
run: {
|
|
13
|
+
runId: string;
|
|
14
|
+
mode: RunBundle["mode"];
|
|
15
|
+
status: RunBundle["review"]["verdict"];
|
|
16
|
+
title: string;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
simCount: number;
|
|
19
|
+
persona: RunBundle["persona"];
|
|
20
|
+
scenario: RunBundle["scenario"];
|
|
21
|
+
packageName: string | null;
|
|
22
|
+
redaction: RunBundle["redaction"];
|
|
23
|
+
lifecycle: RunBundle["lifecycle"];
|
|
24
|
+
knownGaps: string[];
|
|
25
|
+
};
|
|
26
|
+
summary: {
|
|
27
|
+
streams: number;
|
|
28
|
+
byKind: Record<RunStreamKind, number>;
|
|
29
|
+
active: number;
|
|
30
|
+
blocked: number;
|
|
31
|
+
warnings: number;
|
|
32
|
+
};
|
|
33
|
+
laneGroups: ObserverLaneGroup[];
|
|
34
|
+
streams: ObserverStream[];
|
|
35
|
+
events: RunEvent[];
|
|
36
|
+
artifactLinks: ObserverArtifactLink[];
|
|
37
|
+
publicSafety: {
|
|
38
|
+
publishable: false;
|
|
39
|
+
note: string;
|
|
40
|
+
};
|
|
41
|
+
raw: {
|
|
42
|
+
bundleSchema: string;
|
|
43
|
+
artifactRoot: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export interface ObserverStream extends RunStream {
|
|
47
|
+
sim: RunSimulation;
|
|
48
|
+
kindLabel: string;
|
|
49
|
+
statusLabel: string;
|
|
50
|
+
terminalPlain: string;
|
|
51
|
+
timeline: RunEvent[];
|
|
52
|
+
}
|
|
53
|
+
export interface ObserverLaneGroup {
|
|
54
|
+
roleId: string;
|
|
55
|
+
simId: string;
|
|
56
|
+
streamId: string;
|
|
57
|
+
status: string;
|
|
58
|
+
actorType?: string;
|
|
59
|
+
surface?: string;
|
|
60
|
+
caseGroup?: string;
|
|
61
|
+
}
|
|
62
|
+
export declare function buildObserverData(bundle: RunBundle, generatedAt?: string): ObserverData;
|
|
63
|
+
export declare function stripAnsi(value: string): string;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
export const OBSERVER_DATA_SCHEMA = "humanish.observer-data.v1";
|
|
2
|
+
const allKinds = ["ui", "browser", "terminal", "tui", "codex-ui", "artifact", "summary"];
|
|
3
|
+
export function buildObserverData(bundle, generatedAt = new Date().toISOString()) {
|
|
4
|
+
const byKind = Object.fromEntries(allKinds.map((kind) => [kind, 0]));
|
|
5
|
+
const events = [...(bundle.events ?? [])];
|
|
6
|
+
const streams = (bundle.streams ?? []).map((stream) => {
|
|
7
|
+
const sim = bundle.simulations.find((candidate) => candidate.id === stream.simId) ?? fallbackSimulation(bundle, stream);
|
|
8
|
+
byKind[stream.kind] += 1;
|
|
9
|
+
return {
|
|
10
|
+
...stream,
|
|
11
|
+
sim,
|
|
12
|
+
kindLabel: kindLabel(stream.kind),
|
|
13
|
+
statusLabel: statusLabel(stream.status),
|
|
14
|
+
terminalPlain: stripAnsi(stream.terminal?.tail ?? ""),
|
|
15
|
+
timeline: events.filter((event) => event.simId === sim.id || event.streamId === stream.id)
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
const warnings = events.filter((event) => event.level === "warn").length;
|
|
19
|
+
const blocked = streams.filter((stream) => stream.status === "blocked" || stream.status === "failed" || stream.status === "timed_out").length;
|
|
20
|
+
const active = streams.filter((stream) => stream.status === "running" || stream.status === "preparing").length;
|
|
21
|
+
return {
|
|
22
|
+
schema: OBSERVER_DATA_SCHEMA,
|
|
23
|
+
schemaVersion: 1,
|
|
24
|
+
generatedAt,
|
|
25
|
+
run: {
|
|
26
|
+
runId: bundle.runId,
|
|
27
|
+
mode: bundle.mode,
|
|
28
|
+
status: bundle.review.verdict,
|
|
29
|
+
title: `${bundle.scenario.title} - ${bundle.persona.name}`,
|
|
30
|
+
createdAt: bundle.createdAt,
|
|
31
|
+
simCount: bundle.simCount ?? bundle.simulations.length,
|
|
32
|
+
persona: bundle.persona,
|
|
33
|
+
scenario: bundle.scenario,
|
|
34
|
+
packageName: bundle.source.packageName,
|
|
35
|
+
redaction: bundle.redaction,
|
|
36
|
+
lifecycle: bundle.lifecycle,
|
|
37
|
+
knownGaps: bundle.review.gaps
|
|
38
|
+
},
|
|
39
|
+
summary: {
|
|
40
|
+
streams: streams.length,
|
|
41
|
+
byKind,
|
|
42
|
+
active,
|
|
43
|
+
blocked,
|
|
44
|
+
warnings
|
|
45
|
+
},
|
|
46
|
+
laneGroups: buildLaneGroups(bundle),
|
|
47
|
+
streams,
|
|
48
|
+
events,
|
|
49
|
+
artifactLinks: [
|
|
50
|
+
{ label: "run bundle", href: "../run.json", kind: "bundle" },
|
|
51
|
+
{ label: "review JSON", href: "../review.json", kind: "review" },
|
|
52
|
+
{ label: "review Markdown", href: "../review.md", kind: "review" },
|
|
53
|
+
{ label: "event log", href: "../events.ndjson", kind: "events" },
|
|
54
|
+
{ label: "observer data", href: "observer-data.json", kind: "observer" },
|
|
55
|
+
...(bundle.adapterArtifacts ?? []).map((artifact) => ({
|
|
56
|
+
label: artifact.label,
|
|
57
|
+
href: `../${artifact.path}`,
|
|
58
|
+
kind: artifact.kind
|
|
59
|
+
}))
|
|
60
|
+
],
|
|
61
|
+
publicSafety: {
|
|
62
|
+
publishable: false,
|
|
63
|
+
note: "Observer artifacts are local evidence. Before filing a public issue, use `humanish feedback issue` so redaction and public-safety checks gate the payload."
|
|
64
|
+
},
|
|
65
|
+
raw: {
|
|
66
|
+
bundleSchema: bundle.schema,
|
|
67
|
+
artifactRoot: bundle.artifactRoot
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function buildLaneGroups(bundle) {
|
|
72
|
+
const outcomes = new Map((bundle.sharedWorld?.outcomes ?? []).map((outcome) => [outcome.roleId, outcome.status]));
|
|
73
|
+
return (bundle.sharedWorld?.laneWindows ?? []).map((lane) => ({
|
|
74
|
+
roleId: lane.roleId,
|
|
75
|
+
simId: lane.simId,
|
|
76
|
+
streamId: lane.streamId,
|
|
77
|
+
status: outcomes.get(lane.roleId) ?? lane.verdict,
|
|
78
|
+
...(lane.actorType === undefined ? {} : { actorType: lane.actorType }),
|
|
79
|
+
...(lane.surface === undefined ? {} : { surface: lane.surface }),
|
|
80
|
+
...(lane.caseGroup === undefined ? {} : { caseGroup: lane.caseGroup })
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
export function stripAnsi(value) {
|
|
84
|
+
return value
|
|
85
|
+
.replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g, "")
|
|
86
|
+
.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g, "");
|
|
87
|
+
}
|
|
88
|
+
function fallbackSimulation(bundle, stream) {
|
|
89
|
+
return {
|
|
90
|
+
id: stream.simId,
|
|
91
|
+
index: bundle.simulations.length + 1,
|
|
92
|
+
personaId: bundle.persona.id,
|
|
93
|
+
scenarioId: bundle.scenario.id,
|
|
94
|
+
status: stream.status,
|
|
95
|
+
streamKind: stream.kind,
|
|
96
|
+
mode: "cli-sim",
|
|
97
|
+
progress: 0,
|
|
98
|
+
currentStep: "Unknown sim stream",
|
|
99
|
+
summary: "This stream did not include matching sim metadata.",
|
|
100
|
+
streamIds: [stream.id],
|
|
101
|
+
startedAt: bundle.createdAt,
|
|
102
|
+
updatedAt: stream.updatedAt
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function kindLabel(kind) {
|
|
106
|
+
switch (kind) {
|
|
107
|
+
case "ui":
|
|
108
|
+
return "UI";
|
|
109
|
+
case "browser":
|
|
110
|
+
return "Browser";
|
|
111
|
+
case "terminal":
|
|
112
|
+
return "CLI";
|
|
113
|
+
case "tui":
|
|
114
|
+
return "TUI";
|
|
115
|
+
case "codex-ui":
|
|
116
|
+
return "Codex UI";
|
|
117
|
+
case "artifact":
|
|
118
|
+
return "Artifact";
|
|
119
|
+
case "summary":
|
|
120
|
+
return "Summary";
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function statusLabel(status) {
|
|
124
|
+
switch (status) {
|
|
125
|
+
case "contract_proof_only":
|
|
126
|
+
return "Contract proof";
|
|
127
|
+
case "preparing":
|
|
128
|
+
return "Preparing";
|
|
129
|
+
case "queued":
|
|
130
|
+
return "Queued";
|
|
131
|
+
case "running":
|
|
132
|
+
return "Running";
|
|
133
|
+
case "passed":
|
|
134
|
+
return "Passed";
|
|
135
|
+
case "complete":
|
|
136
|
+
return "Complete";
|
|
137
|
+
case "blocked":
|
|
138
|
+
return "Blocked";
|
|
139
|
+
case "timed_out":
|
|
140
|
+
return "Timed out";
|
|
141
|
+
case "failed":
|
|
142
|
+
return "Failed";
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=observer-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-data.js","sourceRoot":"","sources":["../src/observer-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
export declare const OBSERVER_STATIC_HOST = "127.0.0.1";
|
|
3
|
+
export interface ObserverStaticHandlerOptions {
|
|
4
|
+
/** Directory served as the loopback root. Requests can never escape it. */
|
|
5
|
+
root: string;
|
|
6
|
+
/** File served for directory requests. Defaults to `index.html`. */
|
|
7
|
+
indexPath?: string;
|
|
8
|
+
/**
|
|
9
|
+
* When set, an exact `/` request returns a 302 to `/<redirectRootTo>` instead
|
|
10
|
+
* of serving a file. Used to land visitors on `observer/index.html` so the
|
|
11
|
+
* Observer's relative artifact links (`../run.json`, ...) resolve.
|
|
12
|
+
*/
|
|
13
|
+
redirectRootTo?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ObserverStaticServeOptions extends ObserverStaticHandlerOptions {
|
|
16
|
+
/** TCP port to bind on 127.0.0.1. Defaults to an ephemeral port (0). */
|
|
17
|
+
port?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Relative entry page (e.g. `observer/index.html`). Drives the returned
|
|
20
|
+
* `url` and the `/` -> entry redirect so callers open the page directly.
|
|
21
|
+
*/
|
|
22
|
+
entryPath?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ObserverStaticServer {
|
|
25
|
+
url: string;
|
|
26
|
+
port: number;
|
|
27
|
+
host: string;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare function observerStaticContentType(filePath: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Resolve, guard, and serve a single static request from `root`. Never throws:
|
|
33
|
+
* any unexpected failure is reported as a 500 so the connection always closes.
|
|
34
|
+
* Exported directly so the security guards can be unit-tested without binding a
|
|
35
|
+
* socket.
|
|
36
|
+
*/
|
|
37
|
+
export declare function respondToObserverStaticRequest(options: ObserverStaticHandlerOptions, request: Pick<IncomingMessage, "method" | "url">, response: ServerResponse): Promise<void>;
|
|
38
|
+
export declare function createObserverStaticHandler(options: ObserverStaticHandlerOptions): (request: IncomingMessage, response: ServerResponse) => void;
|
|
39
|
+
export declare function serveObserverStatic(options: ObserverStaticServeOptions): Promise<ObserverStaticServer>;
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { constants as fsConstants } from "node:fs";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { lstat, open, realpath } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
// Loopback-only host for the Observer static server. We never bind 0.0.0.0:
|
|
6
|
+
// the Observer surfaces local run evidence and must stay reachable only from
|
|
7
|
+
// the machine that owns the run bundle.
|
|
8
|
+
export const OBSERVER_STATIC_HOST = "127.0.0.1";
|
|
9
|
+
// Minimal extension -> content-type map. Kept dependency-free (no `mime`
|
|
10
|
+
// package) because the Observer ships a small, known set of asset kinds.
|
|
11
|
+
const CONTENT_TYPES = {
|
|
12
|
+
".html": "text/html; charset=utf-8",
|
|
13
|
+
".htm": "text/html; charset=utf-8",
|
|
14
|
+
".js": "text/javascript; charset=utf-8",
|
|
15
|
+
".mjs": "text/javascript; charset=utf-8",
|
|
16
|
+
".css": "text/css; charset=utf-8",
|
|
17
|
+
".json": "application/json; charset=utf-8",
|
|
18
|
+
".map": "application/json; charset=utf-8",
|
|
19
|
+
".svg": "image/svg+xml",
|
|
20
|
+
".png": "image/png",
|
|
21
|
+
".jpg": "image/jpeg",
|
|
22
|
+
".jpeg": "image/jpeg",
|
|
23
|
+
".webp": "image/webp",
|
|
24
|
+
".gif": "image/gif",
|
|
25
|
+
".ico": "image/x-icon",
|
|
26
|
+
".md": "text/markdown; charset=utf-8",
|
|
27
|
+
".ndjson": "application/x-ndjson; charset=utf-8",
|
|
28
|
+
".txt": "text/plain; charset=utf-8",
|
|
29
|
+
".woff": "font/woff",
|
|
30
|
+
".woff2": "font/woff2"
|
|
31
|
+
};
|
|
32
|
+
export function observerStaticContentType(filePath) {
|
|
33
|
+
return CONTENT_TYPES[path.extname(filePath).toLowerCase()] ?? "application/octet-stream";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve, guard, and serve a single static request from `root`. Never throws:
|
|
37
|
+
* any unexpected failure is reported as a 500 so the connection always closes.
|
|
38
|
+
* Exported directly so the security guards can be unit-tested without binding a
|
|
39
|
+
* socket.
|
|
40
|
+
*/
|
|
41
|
+
export async function respondToObserverStaticRequest(options, request, response) {
|
|
42
|
+
try {
|
|
43
|
+
const root = await pinStaticRoot(options.root);
|
|
44
|
+
await respondToPinnedObserverStaticRequest(root, options, request, response);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
if (response.headersSent) {
|
|
48
|
+
response.end();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
writeText(response, 500, "Observer request failed");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function respondToPinnedObserverStaticRequest(root, options, request, response) {
|
|
55
|
+
const indexRelative = options.indexPath ?? "index.html";
|
|
56
|
+
try {
|
|
57
|
+
await assertPinnedStaticRoot(root);
|
|
58
|
+
const method = request.method ?? "GET";
|
|
59
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
60
|
+
writeText(response, 405, "Method Not Allowed");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
let pathname;
|
|
64
|
+
try {
|
|
65
|
+
pathname = new URL(request.url ?? "/", `http://${OBSERVER_STATIC_HOST}`).pathname;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
writeText(response, 400, "Bad Request");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (pathname === "/" && options.redirectRootTo) {
|
|
72
|
+
const location = `/${options.redirectRootTo.replace(/^\/+/, "")}`;
|
|
73
|
+
response.writeHead(302, {
|
|
74
|
+
location,
|
|
75
|
+
"cache-control": "no-store",
|
|
76
|
+
"content-length": "0"
|
|
77
|
+
});
|
|
78
|
+
response.end();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
let decoded;
|
|
82
|
+
try {
|
|
83
|
+
decoded = decodeURIComponent(pathname);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
writeText(response, 400, "Bad Request");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Reject embedded NUL bytes outright rather than letting them reach the fs.
|
|
90
|
+
if (decoded.includes("\0")) {
|
|
91
|
+
writeText(response, 400, "Bad Request");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
let relative = decoded.replace(/^\/+/, "");
|
|
95
|
+
if (relative === "" || relative.endsWith("/")) {
|
|
96
|
+
relative = `${relative}${indexRelative}`;
|
|
97
|
+
}
|
|
98
|
+
const target = path.resolve(root.physicalPath, relative);
|
|
99
|
+
if (!isPathInside(root.physicalPath, target)) {
|
|
100
|
+
writeText(response, 403, "Forbidden");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
let info;
|
|
104
|
+
try {
|
|
105
|
+
info = await lstat(target);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
writeText(response, 404, "Not Found");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (info.isSymbolicLink()) {
|
|
112
|
+
writeText(response, 403, "Forbidden");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let filePath = target;
|
|
116
|
+
if (info.isDirectory()) {
|
|
117
|
+
filePath = path.resolve(target, indexRelative);
|
|
118
|
+
if (!isPathInside(root.physicalPath, filePath)) {
|
|
119
|
+
writeText(response, 403, "Forbidden");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const body = await readContainedRegularFile(root, filePath);
|
|
124
|
+
if (!body) {
|
|
125
|
+
writeText(response, 404, "Not Found");
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
response.writeHead(200, {
|
|
129
|
+
"cache-control": "no-store",
|
|
130
|
+
"content-type": observerStaticContentType(filePath),
|
|
131
|
+
"content-length": String(body.byteLength)
|
|
132
|
+
});
|
|
133
|
+
if (method === "HEAD") {
|
|
134
|
+
response.end();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
response.end(body);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
if (response.headersSent) {
|
|
141
|
+
response.end();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
writeText(response, 500, "Observer request failed");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function readContainedRegularFile(root, filePathInput) {
|
|
148
|
+
const filePath = path.resolve(filePathInput);
|
|
149
|
+
if (!isPathInside(root.physicalPath, filePath))
|
|
150
|
+
return null;
|
|
151
|
+
try {
|
|
152
|
+
await assertPinnedStaticRoot(root);
|
|
153
|
+
const expectedStats = await inspectContainedStaticFile(root, filePath);
|
|
154
|
+
if (!expectedStats) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const handle = await open(filePath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
|
|
158
|
+
try {
|
|
159
|
+
const openedStats = await handle.stat({ bigint: true });
|
|
160
|
+
if (!openedStats.isFile()
|
|
161
|
+
|| openedStats.nlink !== 1n
|
|
162
|
+
|| openedStats.dev !== expectedStats.dev
|
|
163
|
+
|| openedStats.ino !== expectedStats.ino) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const recheckedStats = await inspectContainedStaticFile(root, filePath);
|
|
167
|
+
if (!recheckedStats
|
|
168
|
+
|| recheckedStats.dev !== expectedStats.dev
|
|
169
|
+
|| recheckedStats.ino !== expectedStats.ino) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
await assertPinnedStaticRoot(root);
|
|
173
|
+
const body = await handle.readFile();
|
|
174
|
+
await assertPinnedStaticRoot(root);
|
|
175
|
+
return body;
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
await handle.close();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export function createObserverStaticHandler(options) {
|
|
186
|
+
let rootPromise;
|
|
187
|
+
return (request, response) => {
|
|
188
|
+
rootPromise ??= pinStaticRoot(options.root);
|
|
189
|
+
void rootPromise
|
|
190
|
+
.then((root) => respondToPinnedObserverStaticRequest(root, options, request, response))
|
|
191
|
+
.catch(() => {
|
|
192
|
+
if (response.headersSent) {
|
|
193
|
+
response.end();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
writeText(response, 500, "Observer request failed");
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export async function serveObserverStatic(options) {
|
|
201
|
+
const entryPath = options.entryPath?.replace(/^\/+/, "") ?? "";
|
|
202
|
+
const handlerOptions = {
|
|
203
|
+
root: options.root,
|
|
204
|
+
...(options.indexPath === undefined ? {} : { indexPath: options.indexPath }),
|
|
205
|
+
...(entryPath ? { redirectRootTo: entryPath } : {})
|
|
206
|
+
};
|
|
207
|
+
const root = await pinStaticRoot(options.root);
|
|
208
|
+
const handler = (request, response) => {
|
|
209
|
+
void respondToPinnedObserverStaticRequest(root, handlerOptions, request, response);
|
|
210
|
+
};
|
|
211
|
+
const server = createServer(handler);
|
|
212
|
+
const port = await listen(server, options.port ?? 0);
|
|
213
|
+
return {
|
|
214
|
+
url: `http://${OBSERVER_STATIC_HOST}:${port}/${entryPath}`,
|
|
215
|
+
port,
|
|
216
|
+
host: OBSERVER_STATIC_HOST,
|
|
217
|
+
close: () => closeServer(server)
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function writeText(response, status, message) {
|
|
221
|
+
const body = `${message}\n`;
|
|
222
|
+
response.writeHead(status, {
|
|
223
|
+
"cache-control": "no-store",
|
|
224
|
+
"content-type": "text/plain; charset=utf-8",
|
|
225
|
+
"content-length": String(Buffer.byteLength(body))
|
|
226
|
+
});
|
|
227
|
+
response.end(body);
|
|
228
|
+
}
|
|
229
|
+
function isPathInside(root, candidate) {
|
|
230
|
+
const relative = path.relative(root, candidate);
|
|
231
|
+
return relative === ""
|
|
232
|
+
|| (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
233
|
+
}
|
|
234
|
+
async function inspectContainedStaticFile(root, filePath) {
|
|
235
|
+
const relative = path.relative(root.physicalPath, filePath);
|
|
236
|
+
if (!relative || relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const segments = relative.split(path.sep).filter(Boolean);
|
|
240
|
+
let current = root.physicalPath;
|
|
241
|
+
let fileIdentity = null;
|
|
242
|
+
for (const [index, segment] of segments.entries()) {
|
|
243
|
+
current = path.join(current, segment);
|
|
244
|
+
const stats = await lstat(current, { bigint: true });
|
|
245
|
+
if (stats.isSymbolicLink())
|
|
246
|
+
return null;
|
|
247
|
+
if (index < segments.length - 1) {
|
|
248
|
+
if (!stats.isDirectory())
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
if (!stats.isFile() || stats.nlink !== 1n)
|
|
253
|
+
return null;
|
|
254
|
+
fileIdentity = { dev: stats.dev, ino: stats.ino };
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (await realpath(filePath) !== filePath)
|
|
258
|
+
return null;
|
|
259
|
+
return fileIdentity;
|
|
260
|
+
}
|
|
261
|
+
async function pinStaticRoot(rootInput) {
|
|
262
|
+
const physicalPath = await realpath(path.resolve(rootInput));
|
|
263
|
+
const stats = await lstat(physicalPath, { bigint: true });
|
|
264
|
+
if (stats.isSymbolicLink() || !stats.isDirectory()) {
|
|
265
|
+
throw new Error("Observer static roots must be physical directories.");
|
|
266
|
+
}
|
|
267
|
+
return Object.freeze({ birthtimeNs: stats.birthtimeNs, dev: stats.dev, ino: stats.ino, physicalPath });
|
|
268
|
+
}
|
|
269
|
+
async function assertPinnedStaticRoot(root) {
|
|
270
|
+
const stats = await lstat(root.physicalPath, { bigint: true });
|
|
271
|
+
if (stats.isSymbolicLink()
|
|
272
|
+
|| !stats.isDirectory()
|
|
273
|
+
|| stats.birthtimeNs !== root.birthtimeNs
|
|
274
|
+
|| stats.dev !== root.dev
|
|
275
|
+
|| stats.ino !== root.ino
|
|
276
|
+
|| await realpath(root.physicalPath) !== root.physicalPath) {
|
|
277
|
+
throw new Error("Observer static root identity changed.");
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function listen(server, port) {
|
|
281
|
+
return new Promise((resolve, reject) => {
|
|
282
|
+
server.once("error", reject);
|
|
283
|
+
server.listen(port, OBSERVER_STATIC_HOST, () => {
|
|
284
|
+
server.off("error", reject);
|
|
285
|
+
const address = server.address();
|
|
286
|
+
if (!address || typeof address === "string") {
|
|
287
|
+
reject(new Error("Observer static server did not bind to a TCP port."));
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
resolve(address.port);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
function closeServer(server) {
|
|
295
|
+
return new Promise((resolve, reject) => {
|
|
296
|
+
server.close((error) => {
|
|
297
|
+
if (error) {
|
|
298
|
+
reject(error);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
resolve();
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=observer-static.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-static.js","sourceRoot":"","sources":["../src/observer-static.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const OBSERVER_SCHEMA = "humanish.observer-result.v1";
|
|
2
|
+
export interface ObserverResult {
|
|
3
|
+
schema: typeof OBSERVER_SCHEMA;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
cwd: string;
|
|
6
|
+
run: string;
|
|
7
|
+
observerPath?: string;
|
|
8
|
+
observerDataPath?: string;
|
|
9
|
+
eventsPath?: string;
|
|
10
|
+
observerUrl?: string;
|
|
11
|
+
serverUrl?: string;
|
|
12
|
+
bundlePath?: string;
|
|
13
|
+
opened?: boolean;
|
|
14
|
+
openCommand?: string;
|
|
15
|
+
warnings: string[];
|
|
16
|
+
error?: {
|
|
17
|
+
code: "HUMANISH_RUN_NOT_FOUND" | "HUMANISH_INVALID_RUN_BUNDLE";
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface ObserverOptions {
|
|
22
|
+
open?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface ObserverServeOptions {
|
|
25
|
+
open?: boolean;
|
|
26
|
+
port?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface ObserverServer {
|
|
29
|
+
url: string;
|
|
30
|
+
opened: boolean;
|
|
31
|
+
openCommand?: string;
|
|
32
|
+
warning?: string;
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export interface ObserverRuntimeStreamUrl {
|
|
36
|
+
streamId: string;
|
|
37
|
+
url: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function attachObserverRuntimeStreamUrls(result: ObserverResult, streams: ObserverRuntimeStreamUrl[]): void;
|
|
40
|
+
export declare function renderObserver(cwdInput: string, runInput: string, options?: ObserverOptions): Promise<ObserverResult>;
|
|
41
|
+
export declare function serveObserver(result: ObserverResult, options?: ObserverServeOptions): Promise<ObserverServer>;
|
|
42
|
+
export declare function openTarget(target: string): {
|
|
43
|
+
opened: boolean;
|
|
44
|
+
command?: string;
|
|
45
|
+
warning?: string;
|
|
46
|
+
};
|