humanish 0.83.2 → 0.84.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 +3 -1
- package/dist/export-bundle.d.ts +7 -0
- package/dist/export-bundle.js +431 -0
- package/dist/export-bundle.js.map +1 -0
- package/dist/export.d.ts +4 -1
- package/dist/export.js +19 -0
- package/dist/export.js.map +1 -1
- package/dist/observer-app.html +6 -6
- package/dist/observer-data.d.ts +3 -4
- package/dist/observer-data.js.map +1 -1
- package/dist/observer.js +5 -0
- package/dist/observer.js.map +1 -1
- package/dist/program.js +9 -5
- package/dist/program.js.map +1 -1
- package/dist/run.js +57 -1
- package/dist/run.js.map +1 -1
- package/docs/contracts/feedback.md +6 -0
- package/docs/contracts/run-bundle.md +47 -0
- package/docs/contracts/schemas.md +1 -1
- package/docs/goals/current.md +6 -2
- package/docs/principles/invariants-and-defaults.md +6 -5
- package/docs/ramp/README.md +1 -1
- package/docs/release/0.84.0-redacted-evidence.md +42 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -91,7 +91,9 @@ npx humanish feedback issue --run latest --repo owner/repo --format markdown
|
|
|
91
91
|
|
|
92
92
|
`feedback issue` prints a draft and requires `share_ready` evidence. A live run
|
|
93
93
|
with raw screenshots can be valid local evidence and still fail that sharing
|
|
94
|
-
gate.
|
|
94
|
+
gate. `humanish export --run latest --format bundle --redact-screenshots` creates
|
|
95
|
+
a separately verified copy while preserving the readable original.
|
|
96
|
+
[Read results](https://humanish.dev/docs/read-results) explains the
|
|
95
97
|
participant's report, task outcomes, costs, and how to turn a finding into an issue.
|
|
96
98
|
|
|
97
99
|
## Public-Safety Boundary
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExportFailure, ExportOptions, ExportResult } from "./export.js";
|
|
2
|
+
export declare const DERIVATION_SCHEMA = "humanish.redacted-derivation.v1";
|
|
3
|
+
/** Internal fault-injection seam. Never overrides reads, redaction or verification. */
|
|
4
|
+
export interface BundleExportHooks {
|
|
5
|
+
beforePublish?: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function exportRedactedBundle(cwdInput: string, runInput: string, options: ExportOptions, hooks?: BundleExportHooks): Promise<ExportResult | ExportFailure>;
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
// The publish boundary for existing raw runs (#136). A derivative is an isolated
|
|
2
|
+
// workspace, never a new run in the source history. No provider APIs are involved.
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { lstat, mkdir, mkdtemp, readdir, realpath, rename, rm, rmdir } from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { parse as parseYaml } from "yaml";
|
|
8
|
+
import { ACTOR_TRACE_SCHEMA } from "./actor-contract.js";
|
|
9
|
+
import { renderObserver } from "./observer.js";
|
|
10
|
+
import { buildObserverData } from "./observer-data.js";
|
|
11
|
+
import { containsSensitive, redactScreenshot, redactText } from "./redaction.js";
|
|
12
|
+
import { loadRunBundlePrepared, resolveRunPath, verifyRunPrepared } from "./run.js";
|
|
13
|
+
import { isPathInside, prepareRunArtifactPaths, validatePreparedRunArtifactPaths } from "./run-paths.js";
|
|
14
|
+
import { assertPreparedSelectedOutputDirectory, prepareManagedHumanishOutputDirectory, prepareSelectedOutputDirectory, readContainedRegularFile, writeContainedOutputFile } from "./selected-output-paths.js";
|
|
15
|
+
export const DERIVATION_SCHEMA = "humanish.redacted-derivation.v1";
|
|
16
|
+
const MAX_FILES = 10_000;
|
|
17
|
+
const TEXT_EXTENSIONS = new Set([".json", ".ndjson", ".jsonl", ".md", ".txt", ".log", ".yaml", ".yml", ".csv"]);
|
|
18
|
+
const OMITTED = new Map([
|
|
19
|
+
["observer/index.html", "regenerated Observer"],
|
|
20
|
+
["observer/observer-data.json", "regenerated Observer projection"],
|
|
21
|
+
["status.json", "local process status is not a new attempt"],
|
|
22
|
+
["sandbox-receipts.ndjson", "operational journal does not confer a derivative resource lease"]
|
|
23
|
+
]);
|
|
24
|
+
const PNG_MAGIC = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
25
|
+
function hash(bytes) {
|
|
26
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
27
|
+
}
|
|
28
|
+
function jsonBytes(value) {
|
|
29
|
+
return Buffer.from(`${JSON.stringify(value, null, 2)}\n`);
|
|
30
|
+
}
|
|
31
|
+
function omittedReason(relative) {
|
|
32
|
+
return OMITTED.get(relative)
|
|
33
|
+
?? (["feedback/draft.json", "feedback/issue.md"].includes(relative) ? "regenerate feedback from derivative evidence" : undefined);
|
|
34
|
+
}
|
|
35
|
+
async function inventory(root, maxBytes) {
|
|
36
|
+
await validatePreparedRunArtifactPaths(root);
|
|
37
|
+
const files = [];
|
|
38
|
+
let total = 0;
|
|
39
|
+
let entriesSeen = 0;
|
|
40
|
+
const walk = async (relative) => {
|
|
41
|
+
const directory = path.join(root.physicalRunRoot, relative);
|
|
42
|
+
const before = await lstat(directory, { bigint: true });
|
|
43
|
+
if (!before.isDirectory() || before.isSymbolicLink())
|
|
44
|
+
throw new Error("Source contains an unsafe directory.");
|
|
45
|
+
for (const name of (await readdir(directory)).sort()) {
|
|
46
|
+
if (++entriesSeen > MAX_FILES)
|
|
47
|
+
throw new Error(`Source exceeds ${MAX_FILES} inventory entries.`);
|
|
48
|
+
if (name.includes("\\") || name.includes("\0"))
|
|
49
|
+
throw new Error("Source contains an unsafe path segment.");
|
|
50
|
+
const rel = relative ? `${relative}/${name}` : name;
|
|
51
|
+
const info = await lstat(path.join(directory, name), { bigint: true });
|
|
52
|
+
if (info.isSymbolicLink() || (!info.isDirectory() && !info.isFile()) || (info.isFile() && info.nlink !== 1n)) {
|
|
53
|
+
throw new Error("Source contains a symlink, hardlink or special file.");
|
|
54
|
+
}
|
|
55
|
+
if (info.isDirectory()) {
|
|
56
|
+
await walk(rel);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
if (info.size > BigInt(maxBytes - total))
|
|
60
|
+
throw new Error("Source inventory exceeds --max-bytes.");
|
|
61
|
+
const bytes = await readContainedRegularFile(root, rel);
|
|
62
|
+
if (bytes === null)
|
|
63
|
+
throw new Error("Source artifact could not be read through its bound identity.");
|
|
64
|
+
total += bytes.length;
|
|
65
|
+
if (total > maxBytes)
|
|
66
|
+
throw new Error("Source inventory exceeds --max-bytes.");
|
|
67
|
+
files.push({ path: rel, bytes, sha256: hash(bytes) });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const after = await lstat(directory, { bigint: true });
|
|
71
|
+
if (!after.isDirectory() || after.isSymbolicLink() || after.dev !== before.dev || after.ino !== before.ino) {
|
|
72
|
+
throw new Error("Source directory changed during inventory.");
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
await walk("");
|
|
76
|
+
await validatePreparedRunArtifactPaths(root);
|
|
77
|
+
files.sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
|
|
78
|
+
return { files, bytes: total, digest: hash(JSON.stringify(files.map((f) => [f.path, f.bytes.length, f.sha256]))) };
|
|
79
|
+
}
|
|
80
|
+
function assertFinished(bundle) {
|
|
81
|
+
const unfinished = ["running", "pending", "queued", "starting", "preparing", "not_started", "suspended"];
|
|
82
|
+
if (bundle.simulations.some((sim) => unfinished.includes(sim.status))
|
|
83
|
+
|| bundle.streams.some((stream) => unfinished.includes(stream.status)
|
|
84
|
+
|| stream.liveActor !== undefined
|
|
85
|
+
|| (stream.actor !== undefined && unfinished.includes(stream.actor.status)))) {
|
|
86
|
+
throw new Error("Bundle export requires a completed run; live or pending evidence cannot be published.");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** Resolve existing aliases before creating any output parent, including aliases into a run. */
|
|
90
|
+
async function prospectivePhysicalPath(requested) {
|
|
91
|
+
try {
|
|
92
|
+
return await realpath(requested);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
|
|
96
|
+
throw error;
|
|
97
|
+
const parent = path.dirname(requested);
|
|
98
|
+
if (parent === requested)
|
|
99
|
+
throw error;
|
|
100
|
+
return path.join(await prospectivePhysicalPath(parent), path.basename(requested));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function assertNoInlineRaster(text) {
|
|
104
|
+
// Decode common JSON/YAML quoted escapes before checking. Unknown embedded bytes
|
|
105
|
+
// are refused: copying a text extension must not smuggle untransformed pixels.
|
|
106
|
+
const decoded = text
|
|
107
|
+
.replace(/\\u([0-9a-f]{4})/gi, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)))
|
|
108
|
+
.replace(/\\x([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)))
|
|
109
|
+
.replace(/\\\//g, "/")
|
|
110
|
+
.replace(/%([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
|
|
111
|
+
if (containsSensitive(text) || containsSensitive(decoded))
|
|
112
|
+
throw new Error("Decoded text contains a secret-shaped value or private path; export refused.");
|
|
113
|
+
if (/data\s*:\s*(?:image\/|application\/|text\/|[^,\s]*;base64,|,)/i.test(decoded) || /iVBORw0KGgo|\/9j\/[A-Za-z0-9+/]|R0lGOD|UklGR[A-Za-z0-9+/]{4}|<svg\b/i.test(decoded)) {
|
|
114
|
+
throw new Error("Text contains an inline image/data payload; embedded raster redaction is unsupported.");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function decodeText(file) {
|
|
118
|
+
let text;
|
|
119
|
+
try {
|
|
120
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(file.bytes);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
throw new Error("Source text contains invalid UTF-8 or binary bytes.");
|
|
124
|
+
}
|
|
125
|
+
if (/[\x00-\x08\x0b\x0c\x0e-\x1f]/.test(text))
|
|
126
|
+
throw new Error("Source text contains binary control bytes.");
|
|
127
|
+
assertNoInlineRaster(text);
|
|
128
|
+
return text;
|
|
129
|
+
}
|
|
130
|
+
function updateScreenshotDeclarations(value, imagePaths) {
|
|
131
|
+
if (Array.isArray(value))
|
|
132
|
+
return value.map((entry) => updateScreenshotDeclarations(entry, imagePaths));
|
|
133
|
+
if (value === null || typeof value !== "object")
|
|
134
|
+
return value;
|
|
135
|
+
const object = value;
|
|
136
|
+
const result = Object.create(null);
|
|
137
|
+
for (const [key, entry] of Object.entries(object))
|
|
138
|
+
result[key] = updateScreenshotDeclarations(entry, imagePaths);
|
|
139
|
+
if (object.schema === ACTOR_TRACE_SCHEMA && object.redaction !== null && typeof object.redaction === "object") {
|
|
140
|
+
const original = object.redaction;
|
|
141
|
+
if (original.screenshots === "raw" || original.screenshots === "blurred") {
|
|
142
|
+
result.redaction = {
|
|
143
|
+
...original,
|
|
144
|
+
screenshots: "blurred",
|
|
145
|
+
notes: `${typeof original.notes === "string" ? original.notes : ""} Exported copy: screenshots blurred during export; original capture posture: ${original.screenshots}. See derivation.json.`
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (Array.isArray(result.items)) {
|
|
149
|
+
result.items = result.items.map((item) => {
|
|
150
|
+
if (item === null || typeof item !== "object")
|
|
151
|
+
return item;
|
|
152
|
+
const entry = item;
|
|
153
|
+
if (entry.screenshotRef === undefined)
|
|
154
|
+
return item;
|
|
155
|
+
if (entry.screenshotRef === null || typeof entry.screenshotRef !== "object")
|
|
156
|
+
throw new Error("Actor screenshot reference is malformed.");
|
|
157
|
+
const ref = entry.screenshotRef;
|
|
158
|
+
if (typeof ref.path !== "string" || !imagePaths.has(ref.path)) {
|
|
159
|
+
throw new Error("Actor screenshot reference must resolve to a PNG transformed from this run's inventory.");
|
|
160
|
+
}
|
|
161
|
+
return { ...entry, screenshotRef: { ...ref, redaction: "blurred" } };
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
function assertFeedbackReferences(bundle, source) {
|
|
168
|
+
const retained = new Set(source.files.filter((file) => omittedReason(file.path) === undefined).map((file) => file.path));
|
|
169
|
+
retained.add("observer/index.html");
|
|
170
|
+
retained.add("observer/observer-data.json");
|
|
171
|
+
for (const candidate of bundle.feedbackCandidates) {
|
|
172
|
+
for (const evidence of candidate.evidence) {
|
|
173
|
+
if (!retained.has(evidence.path))
|
|
174
|
+
throw new Error("Feedback evidence must resolve to a retained or regenerated artifact in the derivative.");
|
|
175
|
+
if (evidence.kind === "screenshot" && path.extname(evidence.path).toLowerCase() !== ".png") {
|
|
176
|
+
throw new Error("Feedback screenshot evidence must resolve to a transformed PNG.");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function transformText(file, imagePaths) {
|
|
182
|
+
const text = decodeText(file);
|
|
183
|
+
const extension = path.extname(file.path).toLowerCase();
|
|
184
|
+
if (extension === ".json") {
|
|
185
|
+
const parsed = JSON.parse(text);
|
|
186
|
+
// Parsing also resolves escape sequences in string values before inspection.
|
|
187
|
+
assertNoInlineRaster(JSON.stringify(parsed));
|
|
188
|
+
const transformed = updateScreenshotDeclarations(parsed, imagePaths);
|
|
189
|
+
if (JSON.stringify(transformed) === JSON.stringify(parsed))
|
|
190
|
+
return file.bytes;
|
|
191
|
+
assertRewritableNumbers(text);
|
|
192
|
+
return jsonBytes(transformed);
|
|
193
|
+
}
|
|
194
|
+
if (extension === ".ndjson" || extension === ".jsonl") {
|
|
195
|
+
const lines = text.split("\n");
|
|
196
|
+
const transformed = lines.map((line) => {
|
|
197
|
+
if (line.trim().length === 0)
|
|
198
|
+
return line;
|
|
199
|
+
const parsed = JSON.parse(line);
|
|
200
|
+
assertNoInlineRaster(JSON.stringify(parsed));
|
|
201
|
+
const updated = JSON.stringify(updateScreenshotDeclarations(parsed, imagePaths));
|
|
202
|
+
if (updated === JSON.stringify(parsed))
|
|
203
|
+
return line;
|
|
204
|
+
assertRewritableNumbers(line);
|
|
205
|
+
return updated;
|
|
206
|
+
});
|
|
207
|
+
return Buffer.from(transformed.join("\n"));
|
|
208
|
+
}
|
|
209
|
+
if (extension === ".yaml" || extension === ".yml") {
|
|
210
|
+
assertNoInlineRaster(JSON.stringify(parseYaml(text, { maxAliasCount: 100, logLevel: "silent" })) ?? "");
|
|
211
|
+
}
|
|
212
|
+
return file.bytes;
|
|
213
|
+
}
|
|
214
|
+
function assertRewritableNumbers(json) {
|
|
215
|
+
// Opaque adapter JSON stays byte-identical. A known trace that actually needs
|
|
216
|
+
// rewriting must not silently round an identifier outside JS's integer range.
|
|
217
|
+
const unquoted = json.replace(/"(?:\\.|[^"\\])*"/g, '""');
|
|
218
|
+
for (const match of unquoted.matchAll(/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/g)) {
|
|
219
|
+
const number = Number(match[0]);
|
|
220
|
+
if (!Number.isFinite(number) || (Number.isInteger(number) && !Number.isSafeInteger(number))) {
|
|
221
|
+
throw new Error("A trace requiring redaction contains an unsafe numeric value; represent large identifiers as strings before capture.");
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async function writeDerivative(source, stagePaths, bundle) {
|
|
226
|
+
const entries = [];
|
|
227
|
+
const imagePaths = new Set(source.files.filter((file) => path.extname(file.path).toLowerCase() === ".png").map((file) => file.path));
|
|
228
|
+
let images = 0;
|
|
229
|
+
for (const file of source.files) {
|
|
230
|
+
const reason = omittedReason(file.path);
|
|
231
|
+
if (reason) {
|
|
232
|
+
entries.push({ path: file.path, sourceSha256: file.sha256, action: "omitted", reason });
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const extension = path.extname(file.path).toLowerCase();
|
|
236
|
+
let bytes;
|
|
237
|
+
let action;
|
|
238
|
+
if (extension === ".png") {
|
|
239
|
+
if (!file.bytes.subarray(0, 8).equals(PNG_MAGIC))
|
|
240
|
+
throw new Error("PNG artifact has invalid signature.");
|
|
241
|
+
const redacted = redactScreenshot(file.bytes);
|
|
242
|
+
if (!redacted.decoded)
|
|
243
|
+
throw new Error("PNG artifact could not be decoded safely; export refuses a placeholder.");
|
|
244
|
+
bytes = redacted.buffer;
|
|
245
|
+
action = "blurred";
|
|
246
|
+
images += 1;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
if (!TEXT_EXTENSIONS.has(extension))
|
|
250
|
+
throw new Error(`Unsupported artifact format ${extension || "(no extension)"}; bundle export supports PNG and UTF-8 text only.`);
|
|
251
|
+
bytes = transformText(file, imagePaths);
|
|
252
|
+
if (file.path === "run.json") {
|
|
253
|
+
assertRewritableNumbers(file.bytes.toString("utf8"));
|
|
254
|
+
const transformed = updateScreenshotDeclarations(bundle, imagePaths);
|
|
255
|
+
transformed.redaction = {
|
|
256
|
+
status: "passed",
|
|
257
|
+
notes: `${bundle.redaction.notes} Exported copy: screenshots were blurred during export; the original capture is retained separately. See derivation.json.`
|
|
258
|
+
};
|
|
259
|
+
for (const stream of transformed.streams) {
|
|
260
|
+
for (const artifact of stream.artifacts) {
|
|
261
|
+
if (artifact.kind === "screenshot")
|
|
262
|
+
artifact.label = artifact.label.replace(/\((raw|blurred)\)/g, "(blurred at export)");
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
bytes = jsonBytes(transformed);
|
|
266
|
+
}
|
|
267
|
+
action = bytes.equals(file.bytes) ? "copied" : "updated";
|
|
268
|
+
}
|
|
269
|
+
await writeContainedOutputFile(stagePaths, file.path, bytes);
|
|
270
|
+
entries.push({ path: file.path, sourceSha256: file.sha256, outputSha256: hash(bytes), action });
|
|
271
|
+
}
|
|
272
|
+
return { images, entries };
|
|
273
|
+
}
|
|
274
|
+
async function removeOwnedDirectory(root, strict = false) {
|
|
275
|
+
try {
|
|
276
|
+
await assertPreparedSelectedOutputDirectory(root);
|
|
277
|
+
await rm(root.physicalPath, { recursive: true });
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Identity changed: do not remove a replacement.
|
|
281
|
+
if (strict)
|
|
282
|
+
throw new Error("Private source snapshot cleanup was not confirmed; no derivative was published.");
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
export async function exportRedactedBundle(cwdInput, runInput, options, hooks = {}) {
|
|
286
|
+
const cwd = path.resolve(cwdInput);
|
|
287
|
+
const failure = (code, message) => ({
|
|
288
|
+
schema: "humanish.export-result.v1", ok: false, cwd, run: runInput, error: { code, message }
|
|
289
|
+
});
|
|
290
|
+
if (options.redactScreenshots !== true || options.localOnly === true) {
|
|
291
|
+
return failure("HUMANISH_EXPORT_INVALID_OPTIONS", "--format bundle requires --redact-screenshots and does not accept --local-only.");
|
|
292
|
+
}
|
|
293
|
+
const maxBytes = options.maxBytes ?? 25 * 1024 * 1024;
|
|
294
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 1)
|
|
295
|
+
return failure("HUMANISH_EXPORT_INVALID_OPTIONS", "--max-bytes must be a positive safe integer.");
|
|
296
|
+
let stage;
|
|
297
|
+
let rawSnapshot;
|
|
298
|
+
let claimed;
|
|
299
|
+
let published = false;
|
|
300
|
+
try {
|
|
301
|
+
const runPaths = await resolveRunPath(cwd, runInput);
|
|
302
|
+
if (!runPaths)
|
|
303
|
+
return failure("HUMANISH_EXPORT_RUN_NOT_FOUND", "No run resolves from the selected run id.");
|
|
304
|
+
const source = await inventory(runPaths, maxBytes);
|
|
305
|
+
const runId = path.basename(runPaths.physicalRunRoot);
|
|
306
|
+
const processStatus = source.files.find((file) => file.path === "status.json");
|
|
307
|
+
if (processStatus && JSON.parse(processStatus.bytes.toString("utf8")).state !== "finished") {
|
|
308
|
+
throw new Error("Source process status is unfinished; wait for the run to finish before exporting.");
|
|
309
|
+
}
|
|
310
|
+
if (source.files.some((file) => file.path === "derivation.json"))
|
|
311
|
+
throw new Error("This run is already a derivative; export the retained original instead.");
|
|
312
|
+
const requested = path.resolve(cwd, options.out ?? path.join(".humanish", "exports", `${runId}-redacted`));
|
|
313
|
+
const prospective = await prospectivePhysicalPath(requested);
|
|
314
|
+
if (isPathInside(runPaths.physicalRunsRoot, prospective) || isPathInside(prospective, runPaths.physicalRunRoot)) {
|
|
315
|
+
throw new Error("Derivative output must be outside the source run history.");
|
|
316
|
+
}
|
|
317
|
+
const parent = options.out === undefined
|
|
318
|
+
? await prepareManagedHumanishOutputDirectory(cwd, "exports")
|
|
319
|
+
: await prepareSelectedOutputDirectory(cwd, path.dirname(requested));
|
|
320
|
+
const destination = path.join(parent.physicalPath, path.basename(requested));
|
|
321
|
+
if (isPathInside(runPaths.physicalRunsRoot, destination) || isPathInside(destination, runPaths.physicalRunRoot)) {
|
|
322
|
+
throw new Error("Derivative output must be outside the source run history.");
|
|
323
|
+
}
|
|
324
|
+
if (await lstat(destination).then(() => true, (error) => {
|
|
325
|
+
if (error.code === "ENOENT")
|
|
326
|
+
return false;
|
|
327
|
+
throw error;
|
|
328
|
+
}))
|
|
329
|
+
return failure("HUMANISH_EXPORT_OUTPUT_EXISTS", "Destination already exists; choose a new workspace directory.");
|
|
330
|
+
await assertPreparedSelectedOutputDirectory(parent);
|
|
331
|
+
const stagePath = await mkdtemp(path.join(parent.physicalPath, ".humanish-export-"));
|
|
332
|
+
stage = await prepareSelectedOutputDirectory(parent.physicalPath, stagePath);
|
|
333
|
+
// Verify the SAME frozen bytes that will be transformed. Verifying the live
|
|
334
|
+
// source and then rereading run.json permits an ABA edit to contaminate a
|
|
335
|
+
// derivative whose receipt still names the first inventory's hashes.
|
|
336
|
+
// Raw verification bytes stay in private OS temporary storage, even when
|
|
337
|
+
// the caller selected a shared filesystem as the sanitized destination.
|
|
338
|
+
const snapshotPath = await mkdtemp(path.join(tmpdir(), "humanish-export-source-"));
|
|
339
|
+
rawSnapshot = await prepareSelectedOutputDirectory(tmpdir(), snapshotPath);
|
|
340
|
+
const snapshotPaths = await prepareRunArtifactPaths(rawSnapshot.physicalPath, runId);
|
|
341
|
+
for (const file of source.files)
|
|
342
|
+
await writeContainedOutputFile(snapshotPaths, file.path, file.bytes);
|
|
343
|
+
const verified = await verifyRunPrepared(rawSnapshot.physicalPath, runId, snapshotPaths);
|
|
344
|
+
if (!verified.ok || (verified.shareSafety.status !== "share_ready"
|
|
345
|
+
&& !(verified.shareSafety.status === "local_only" && verified.shareSafety.reasons.every((reason) => reason.code === "RAW_SCREENSHOTS")))) {
|
|
346
|
+
return { ...failure("HUMANISH_EXPORT_VERIFY_FAILED", "Source evidence failed verification; bundle export cannot repair invalid or blocked evidence."), shareSafety: verified.shareSafety };
|
|
347
|
+
}
|
|
348
|
+
const loaded = await loadRunBundlePrepared(rawSnapshot.physicalPath, snapshotPaths);
|
|
349
|
+
if (!loaded)
|
|
350
|
+
throw new Error("Frozen source bundle could not be loaded.");
|
|
351
|
+
const bundle = loaded.bundle;
|
|
352
|
+
if (bundle.runId !== runId)
|
|
353
|
+
throw new Error("Source run identity does not match its directory.");
|
|
354
|
+
assertFinished(bundle);
|
|
355
|
+
assertFeedbackReferences(bundle, source);
|
|
356
|
+
await removeOwnedDirectory(rawSnapshot, true);
|
|
357
|
+
rawSnapshot = undefined;
|
|
358
|
+
const stagePaths = await prepareRunArtifactPaths(stage.physicalPath, runId);
|
|
359
|
+
const transformed = await writeDerivative(source, stagePaths, bundle);
|
|
360
|
+
const receipt = {
|
|
361
|
+
schema: DERIVATION_SCHEMA,
|
|
362
|
+
sourceRunId: runId,
|
|
363
|
+
sourceInventorySha256: source.digest,
|
|
364
|
+
createdAt: new Date().toISOString(),
|
|
365
|
+
transformation: "png-blur-at-export-v1",
|
|
366
|
+
note: "A redacted copy of the same study, not a new attempt. Original pixels are not present. Text and findings still require human review before sharing.",
|
|
367
|
+
files: transformed.entries
|
|
368
|
+
};
|
|
369
|
+
const transformedBundle = await loadRunBundlePrepared(stage.physicalPath, stagePaths);
|
|
370
|
+
if (!transformedBundle)
|
|
371
|
+
throw new Error("Derivative bundle could not be loaded.");
|
|
372
|
+
await writeContainedOutputFile(stagePaths, "observer/observer-data.json", jsonBytes(buildObserverData(transformedBundle.bundle)));
|
|
373
|
+
const rendered = await renderObserver(stage.physicalPath, runId, { open: false });
|
|
374
|
+
if (!rendered.ok)
|
|
375
|
+
throw new Error("Derivative Observer could not be rebuilt.");
|
|
376
|
+
const generated = [];
|
|
377
|
+
for (const relative of ["observer/index.html", "observer/observer-data.json"]) {
|
|
378
|
+
const bytes = await readContainedRegularFile(stagePaths, relative);
|
|
379
|
+
if (bytes === null)
|
|
380
|
+
throw new Error("Regenerated Observer artifact could not be read safely.");
|
|
381
|
+
generated.push({ path: relative, sha256: hash(bytes) });
|
|
382
|
+
}
|
|
383
|
+
await writeContainedOutputFile(stagePaths, "derivation.json", jsonBytes({ ...receipt, generated }));
|
|
384
|
+
const derivativeVerify = await verifyRunPrepared(stage.physicalPath, runId, stagePaths);
|
|
385
|
+
if (!derivativeVerify.ok || derivativeVerify.shareSafety.status !== "share_ready") {
|
|
386
|
+
throw new Error("Transformed bundle did not independently verify as share_ready.");
|
|
387
|
+
}
|
|
388
|
+
const output = await inventory(stagePaths, maxBytes);
|
|
389
|
+
await hooks.beforePublish?.();
|
|
390
|
+
const sourceAfter = await inventory(runPaths, maxBytes);
|
|
391
|
+
if (sourceAfter.digest !== source.digest)
|
|
392
|
+
throw new Error("Source changed during export; no derivative was published.");
|
|
393
|
+
await assertPreparedSelectedOutputDirectory(parent);
|
|
394
|
+
await assertPreparedSelectedOutputDirectory(stage);
|
|
395
|
+
// Exclusive mkdir claims the new workspace. Only its complete, independently
|
|
396
|
+
// verified .humanish tree is published by rename; no empty existing workspace
|
|
397
|
+
// is overwritten by platform-dependent directory rename semantics.
|
|
398
|
+
await mkdir(destination, { mode: 0o700 });
|
|
399
|
+
claimed = await prepareSelectedOutputDirectory(parent.physicalPath, destination);
|
|
400
|
+
await assertPreparedSelectedOutputDirectory(parent);
|
|
401
|
+
await assertPreparedSelectedOutputDirectory(claimed);
|
|
402
|
+
await rename(path.join(stage.physicalPath, ".humanish"), path.join(claimed.physicalPath, ".humanish"));
|
|
403
|
+
published = true;
|
|
404
|
+
return {
|
|
405
|
+
schema: "humanish.export-result.v1", ok: true, cwd, runId, format: "bundle",
|
|
406
|
+
path: path.relative(cwd, requested), bytes: output.bytes, embeddedImages: transformed.images,
|
|
407
|
+
shareSafety: derivativeVerify.shareSafety, watermarked: false,
|
|
408
|
+
warnings: ["Screenshots were blurred during export. Review text and findings before sharing; keep the readable original for local adjudication."]
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
const exists = error instanceof Error && "code" in error && error.code === "EEXIST";
|
|
413
|
+
return failure(exists ? "HUMANISH_EXPORT_OUTPUT_EXISTS" : "HUMANISH_EXPORT_BUNDLE_REFUSED", exists ? "Destination already exists; choose a new workspace directory."
|
|
414
|
+
: error instanceof SyntaxError ? "Malformed JSON evidence; export refused."
|
|
415
|
+
: error instanceof Error ? redactText(error.message) : "Bundle export failed without publishing a derivative.");
|
|
416
|
+
}
|
|
417
|
+
finally {
|
|
418
|
+
if (rawSnapshot)
|
|
419
|
+
await removeOwnedDirectory(rawSnapshot);
|
|
420
|
+
if (stage)
|
|
421
|
+
await removeOwnedDirectory(stage);
|
|
422
|
+
if (claimed && !published) {
|
|
423
|
+
try {
|
|
424
|
+
await assertPreparedSelectedOutputDirectory(claimed);
|
|
425
|
+
await rmdir(claimed.physicalPath);
|
|
426
|
+
}
|
|
427
|
+
catch { /* Never recursively delete an output another process populated. */ }
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=export-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-bundle.js","sourceRoot":"","sources":["../src/export-bundle.ts"],"names":[],"mappings":"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"}
|
package/dist/export.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export interface ExportResult {
|
|
|
7
7
|
ok: true;
|
|
8
8
|
cwd: string;
|
|
9
9
|
runId: string;
|
|
10
|
+
format?: "bundle";
|
|
10
11
|
/** Repo-relative path of the file written. */
|
|
11
12
|
path: string;
|
|
12
13
|
bytes: number;
|
|
@@ -23,11 +24,13 @@ export interface ExportFailure {
|
|
|
23
24
|
run: string;
|
|
24
25
|
shareSafety?: VerifyResult["shareSafety"];
|
|
25
26
|
error: {
|
|
26
|
-
code: "HUMANISH_EXPORT_RUN_NOT_FOUND" | "HUMANISH_EXPORT_VERIFY_FAILED" | "HUMANISH_EXPORT_SHARE_SAFETY_BLOCKED" | "HUMANISH_EXPORT_NO_OBSERVER" | "HUMANISH_EXPORT_TOO_LARGE";
|
|
27
|
+
code: "HUMANISH_EXPORT_RUN_NOT_FOUND" | "HUMANISH_EXPORT_VERIFY_FAILED" | "HUMANISH_EXPORT_SHARE_SAFETY_BLOCKED" | "HUMANISH_EXPORT_NO_OBSERVER" | "HUMANISH_EXPORT_TOO_LARGE" | "HUMANISH_EXPORT_INVALID_OPTIONS" | "HUMANISH_EXPORT_OUTPUT_EXISTS" | "HUMANISH_EXPORT_BUNDLE_REFUSED";
|
|
27
28
|
message: string;
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
export interface ExportOptions {
|
|
32
|
+
format?: "html" | "bundle";
|
|
33
|
+
redactScreenshots?: boolean;
|
|
31
34
|
out?: string;
|
|
32
35
|
localOnly?: boolean;
|
|
33
36
|
maxBytes?: number;
|
package/dist/export.js
CHANGED
|
@@ -12,6 +12,7 @@ import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
|
12
12
|
import path from "node:path";
|
|
13
13
|
import { renderObserver } from "./observer.js";
|
|
14
14
|
import { resolveRunPath, verifyRun } from "./run.js";
|
|
15
|
+
import { exportRedactedBundle } from "./export-bundle.js";
|
|
15
16
|
export const EXPORT_SCHEMA = "humanish.export-result.v1";
|
|
16
17
|
/** Past this the file stops being a thing you attach to an email. Declared, never silent. */
|
|
17
18
|
export const DEFAULT_EXPORT_MAX_BYTES = 25 * 1024 * 1024;
|
|
@@ -43,7 +44,12 @@ async function isInside(root, candidate) {
|
|
|
43
44
|
return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel);
|
|
44
45
|
}
|
|
45
46
|
export async function exportRun(cwdInput, runInput, options = {}, deps = {}) {
|
|
47
|
+
if (options.format === "bundle")
|
|
48
|
+
return exportRedactedBundle(cwdInput, runInput, options);
|
|
46
49
|
const cwd = path.resolve(cwdInput);
|
|
50
|
+
if (options.redactScreenshots === true) {
|
|
51
|
+
return { schema: EXPORT_SCHEMA, ok: false, cwd, run: runInput, error: { code: "HUMANISH_EXPORT_INVALID_OPTIONS", message: "--redact-screenshots requires --format bundle. HTML export does not transform its source." } };
|
|
52
|
+
}
|
|
47
53
|
const runPaths = await resolveRunPath(cwd, runInput).catch(() => null);
|
|
48
54
|
if (runPaths === null) {
|
|
49
55
|
return { schema: EXPORT_SCHEMA, ok: false, cwd, run: runInput, error: { code: "HUMANISH_EXPORT_RUN_NOT_FOUND", message: `No run resolves from "${runInput}" under ${cwd}.` } };
|
|
@@ -181,6 +187,16 @@ export async function exportRun(cwdInput, runInput, options = {}, deps = {}) {
|
|
|
181
187
|
export function formatExportHuman(result) {
|
|
182
188
|
if (!result.ok)
|
|
183
189
|
return `${result.error.code}: ${result.error.message}\n`;
|
|
190
|
+
if (result.format === "bundle") {
|
|
191
|
+
return [
|
|
192
|
+
`humanish export ${result.runId}`,
|
|
193
|
+
`workspace: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${result.embeddedImages} blurred image(s))`,
|
|
194
|
+
`share safety: ${result.shareSafety.status}`,
|
|
195
|
+
`verify: humanish verify --cwd ${shellArgument(result.path)} --run ${shellArgument(result.runId)}`,
|
|
196
|
+
`feedback: humanish feedback draft --cwd ${shellArgument(result.path)} --run ${shellArgument(result.runId)}`,
|
|
197
|
+
...result.warnings.map((warning) => `warning: ${warning}`), ""
|
|
198
|
+
].join("\n");
|
|
199
|
+
}
|
|
184
200
|
const lines = [
|
|
185
201
|
`humanish export ${result.runId}`,
|
|
186
202
|
`file: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${result.embeddedImages} image(s) embedded)`,
|
|
@@ -189,4 +205,7 @@ export function formatExportHuman(result) {
|
|
|
189
205
|
];
|
|
190
206
|
return `${lines.join("\n")}\n`;
|
|
191
207
|
}
|
|
208
|
+
function shellArgument(value) {
|
|
209
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
210
|
+
}
|
|
192
211
|
//# sourceMappingURL=export.js.map
|
package/dist/export.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,8FAA8F;AAC9F,gGAAgG;AAChG,8FAA8F;AAC9F,4FAA4F;AAC5F,EAAE;AACF,iGAAiG;AACjG,+FAA+F;AAC/F,6EAA6E;AAE7E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAqB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"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"}
|