humanish 0.89.1 → 0.90.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 +15 -0
- package/dist/automatic-analysis-completion.d.ts +25 -0
- package/dist/automatic-analysis-completion.js +54 -0
- package/dist/automatic-analysis-completion.js.map +1 -0
- package/dist/automatic-analysis-config.d.ts +17 -0
- package/dist/automatic-analysis-config.js +31 -0
- package/dist/automatic-analysis-config.js.map +1 -0
- package/dist/automatic-study-analysis.d.ts +12 -0
- package/dist/automatic-study-analysis.js +168 -0
- package/dist/automatic-study-analysis.js.map +1 -0
- package/dist/concurrent-shared-world-lab.d.ts +4 -2
- package/dist/concurrent-shared-world-lab.js +10 -3
- package/dist/concurrent-shared-world-lab.js.map +1 -1
- package/dist/cua-actor-lab.d.ts +4 -2
- package/dist/cua-actor-lab.js +10 -5
- package/dist/cua-actor-lab.js.map +1 -1
- package/dist/e2b-terminal-lab.d.ts +4 -2
- package/dist/e2b-terminal-lab.js +10 -3
- package/dist/e2b-terminal-lab.js.map +1 -1
- package/dist/export-bundle.js +2 -0
- package/dist/export-bundle.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lab-config.d.ts +5 -0
- package/dist/lab-config.js +21 -2
- package/dist/lab-config.js.map +1 -1
- package/dist/lab-engine.d.ts +2 -0
- package/dist/lab-engine.js +12 -3
- package/dist/lab-engine.js.map +1 -1
- package/dist/lab-summary.d.ts +4 -0
- package/dist/lab-summary.js +3 -0
- package/dist/lab-summary.js.map +1 -1
- package/dist/observer-app.html +9 -9
- package/dist/observer.d.ts +3 -0
- package/dist/observer.js +23 -6
- package/dist/observer.js.map +1 -1
- package/dist/oss-lab.d.ts +1 -1
- package/dist/oss-lab.js.map +1 -1
- package/dist/oss-meta-lab.d.ts +1 -1
- package/dist/oss-meta-lab.js.map +1 -1
- package/dist/program.d.ts +5 -0
- package/dist/program.js +42 -7
- package/dist/program.js.map +1 -1
- package/dist/run-detail.d.ts +2 -0
- package/dist/run-detail.js +3 -0
- package/dist/run-detail.js.map +1 -1
- package/dist/run.d.ts +1 -1
- package/dist/run.js.map +1 -1
- package/dist/scripted-browser-lab.d.ts +4 -2
- package/dist/scripted-browser-lab.js +10 -5
- package/dist/scripted-browser-lab.js.map +1 -1
- package/dist/shared-world-lab.d.ts +4 -2
- package/dist/shared-world-lab.js +10 -3
- package/dist/shared-world-lab.js.map +1 -1
- package/dist/study-analysis-engine.d.ts +6 -1
- package/dist/study-analysis-engine.js +17 -3
- package/dist/study-analysis-engine.js.map +1 -1
- package/dist/study-analysis-evidence.js +45 -17
- package/dist/study-analysis-evidence.js.map +1 -1
- package/dist/study-analysis-job.d.ts +87 -0
- package/dist/study-analysis-job.js +197 -0
- package/dist/study-analysis-job.js.map +1 -0
- package/dist/study-analysis-service.d.ts +10 -1
- package/dist/study-analysis-service.js +31 -8
- package/dist/study-analysis-service.js.map +1 -1
- package/dist/study-analysis-sharing.js +13 -5
- package/dist/study-analysis-sharing.js.map +1 -1
- package/dist/study-analysis-store.d.ts +4 -0
- package/dist/study-analysis-store.js +40 -1
- package/dist/study-analysis-store.js.map +1 -1
- package/dist/study-analysis-validation.d.ts +2 -1
- package/dist/study-analysis-validation.js +12 -5
- package/dist/study-analysis-validation.js.map +1 -1
- package/dist/study-analysis.d.ts +6 -0
- package/dist/study-analysis.js.map +1 -1
- package/dist/tui-actions.d.ts +1 -1
- package/dist/tui-actions.js +15 -1
- package/dist/tui-actions.js.map +1 -1
- package/dist/tui-app.js +116 -116
- package/dist/tui-contract.d.ts +3 -2
- package/dist/tui-contract.js.map +1 -1
- package/docs/contracts/schemas.md +1 -1
- package/docs/contracts/study-analysis.md +18 -0
- package/docs/goals/current.md +4 -4
- package/docs/product/automatic-analysis.md +63 -0
- package/docs/ramp/README.md +5 -1
- package/docs/release/0.90.0-automatic-analysis.md +21 -0
- package/package.json +1 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, mkdir } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { validatePreparedRunRootIdentity } from "./run-paths.js";
|
|
6
|
+
import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile } from "./selected-output-paths.js";
|
|
7
|
+
import { readBoundedStudyFile } from "./study-analysis-evidence.js";
|
|
8
|
+
import { containsSensitive } from "./redaction.js";
|
|
9
|
+
import { readStudyAnalysisExecution, readStudyAnalysisVersion } from "./study-analysis-store.js";
|
|
10
|
+
import { hashStudyAnalysisValue } from "./study-analysis-validation.js";
|
|
11
|
+
export const AUTOMATIC_STUDY_ANALYSIS_DIRECTORY = "analysis-automatic";
|
|
12
|
+
export const AUTOMATIC_STUDY_ANALYSIS_SCHEMA = "humanish.automatic-study-analysis.v1";
|
|
13
|
+
export const AUTOMATIC_STUDY_ANALYSIS_STALE_MS = 15_000;
|
|
14
|
+
const JOB_FILE = "job.json";
|
|
15
|
+
const CANCEL_FILE = "cancel.json";
|
|
16
|
+
const MAX_JOB_BYTES = 8192;
|
|
17
|
+
const CANCEL_SCHEMA = "humanish.automatic-study-analysis-cancellation.v1";
|
|
18
|
+
const reasons = ["AUTOMATIC_ANALYSIS_ALREADY_REQUESTED", "AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE",
|
|
19
|
+
"AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN", "AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE", "AUTOMATIC_ANALYSIS_KEY_MISSING",
|
|
20
|
+
"AUTOMATIC_ANALYSIS_ADMISSION_REFUSED", "AUTOMATIC_ANALYSIS_BUSY", "AUTOMATIC_ANALYSIS_CANCELLED",
|
|
21
|
+
"AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE", "AUTOMATIC_ANALYSIS_FAILED", "AUTOMATIC_ANALYSIS_PUBLICATION_FAILED",
|
|
22
|
+
"AUTOMATIC_ANALYSIS_REUSED", "AUTOMATIC_ANALYSIS_LIMITATIONS", "AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED",
|
|
23
|
+
"AUTOMATIC_ANALYSIS_ACTOR_CANCELLED"];
|
|
24
|
+
const id = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/);
|
|
25
|
+
const date = z.iso.datetime();
|
|
26
|
+
const digest = z.string().regex(/^[a-f0-9]{64}$/);
|
|
27
|
+
const jobSchema = z.strictObject({
|
|
28
|
+
schema: z.literal(AUTOMATIC_STUDY_ANALYSIS_SCHEMA), runId: id, claimId: z.uuid(), attemptId: id,
|
|
29
|
+
state: z.enum(["queued", "running", "complete", "partial", "failed", "cancelled", "skipped", "unknown"]),
|
|
30
|
+
analysisId: id.nullable(), reason: z.enum(reasons).nullable(), createdAt: date, updatedAt: date,
|
|
31
|
+
configDigest: digest, promptVersion: z.string().regex(/^[A-Za-z0-9_.-]{1,80}$/),
|
|
32
|
+
sourceRunSha256: digest.nullable(), inputDigest: digest.nullable(),
|
|
33
|
+
analysisSha256: digest.nullable(), receiptSha256: digest.nullable(),
|
|
34
|
+
startedAt: date.nullable(), finishedAt: date.nullable()
|
|
35
|
+
});
|
|
36
|
+
const cancelSchema = z.strictObject({ schema: z.literal(CANCEL_SCHEMA), runId: id, claimId: z.uuid(), requestedAt: date });
|
|
37
|
+
const pending = (state) => state === "queued" || state === "running";
|
|
38
|
+
const iso = () => new Date().toISOString();
|
|
39
|
+
const unknown = (updatedAt = iso()) => ({ state: "unknown", analysisId: null,
|
|
40
|
+
reason: "AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN", updatedAt });
|
|
41
|
+
function parseJob(bytes, runId) {
|
|
42
|
+
const record = jobSchema.parse(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
|
|
43
|
+
if (containsSensitive(JSON.stringify(record)) || record.runId !== runId || Date.parse(record.updatedAt) < Date.parse(record.createdAt)
|
|
44
|
+
|| (pending(record.state) && record.finishedAt !== null)
|
|
45
|
+
|| (!pending(record.state) && record.finishedAt === null)
|
|
46
|
+
|| (record.analysisId !== null && record.reason !== "AUTOMATIC_ANALYSIS_REUSED" && record.analysisId !== record.attemptId)
|
|
47
|
+
|| (record.reason === "AUTOMATIC_ANALYSIS_REUSED" && (!["complete", "partial"].includes(record.state) || record.startedAt !== null || record.analysisId === null))
|
|
48
|
+
|| (record.state === "running" && record.startedAt === null)
|
|
49
|
+
|| (record.startedAt !== null && Date.parse(record.startedAt) < Date.parse(record.createdAt))
|
|
50
|
+
|| (record.finishedAt !== null && Date.parse(record.finishedAt) < Date.parse(record.createdAt))) {
|
|
51
|
+
throw new Error("AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE");
|
|
52
|
+
}
|
|
53
|
+
return record;
|
|
54
|
+
}
|
|
55
|
+
/** Also guards direct HTML projection callers, not only the contained-file reader. */
|
|
56
|
+
export function projectAutomaticStudyAnalysisView(value) {
|
|
57
|
+
if (value === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
const parsed = jobSchema.pick({ state: true, analysisId: true, reason: true, updatedAt: true }).safeParse(value);
|
|
60
|
+
if (!parsed.success || containsSensitive(JSON.stringify(parsed.data)))
|
|
61
|
+
return unknown();
|
|
62
|
+
return parsed.data;
|
|
63
|
+
}
|
|
64
|
+
async function bindJob(prepared) {
|
|
65
|
+
await validatePreparedRunRootIdentity(prepared);
|
|
66
|
+
const cwd = path.dirname(path.dirname(path.dirname(prepared.absoluteRunRoot)));
|
|
67
|
+
const root = await bindExistingManagedHumanishOutputDirectory(cwd, "runs", path.basename(prepared.physicalRunRoot), AUTOMATIC_STUDY_ANALYSIS_DIRECTORY);
|
|
68
|
+
return root ? Object.freeze({ ...root, parentRun: prepared }) : null;
|
|
69
|
+
}
|
|
70
|
+
/** Read-only projection. A stale timestamp or persisted claim never authorizes execution. */
|
|
71
|
+
export async function readAutomaticStudyAnalysisPrepared(prepared, now = Date.now()) {
|
|
72
|
+
try {
|
|
73
|
+
const root = await bindJob(prepared);
|
|
74
|
+
if (!root) {
|
|
75
|
+
const exists = await lstat(path.join(prepared.physicalRunRoot, AUTOMATIC_STUDY_ANALYSIS_DIRECTORY)).then(() => true, (error) => { if (error.code === "ENOENT")
|
|
76
|
+
return false; throw error; });
|
|
77
|
+
return exists ? unknown() : undefined;
|
|
78
|
+
}
|
|
79
|
+
const bytes = await readBoundedStudyFile(root, JOB_FILE, MAX_JOB_BYTES);
|
|
80
|
+
if (!bytes)
|
|
81
|
+
return unknown();
|
|
82
|
+
const record = parseJob(bytes, path.basename(prepared.physicalRunRoot));
|
|
83
|
+
const view = { state: record.state, analysisId: record.analysisId, reason: record.reason, updatedAt: record.updatedAt };
|
|
84
|
+
const updated = Date.parse(record.updatedAt);
|
|
85
|
+
if (updated > now || (pending(record.state) && now - updated > AUTOMATIC_STUDY_ANALYSIS_STALE_MS)) {
|
|
86
|
+
return { ...view, state: "unknown", reason: "AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN" };
|
|
87
|
+
}
|
|
88
|
+
if (!await terminalResultMatches(prepared, record))
|
|
89
|
+
return { ...view, state: "unknown", reason: "AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN" };
|
|
90
|
+
return view;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return unknown();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function terminalResultMatches(prepared, record) {
|
|
97
|
+
if (pending(record.state) || record.state === "unknown" || record.state === "skipped")
|
|
98
|
+
return true;
|
|
99
|
+
if (record.analysisId === null)
|
|
100
|
+
return record.state === "cancelled" || record.state === "failed";
|
|
101
|
+
const matches = (value) => value.id === record.analysisId && value.runId === record.runId && value.sourceRunSha256 === record.sourceRunSha256
|
|
102
|
+
&& value.inputDigest === record.inputDigest && value.configDigest === record.configDigest && value.promptVersion === record.promptVersion;
|
|
103
|
+
const receipt = await readStudyAnalysisExecution(prepared, record.analysisId);
|
|
104
|
+
if (!receipt || !matches(receipt) || hashStudyAnalysisValue(receipt) !== record.receiptSha256)
|
|
105
|
+
return false;
|
|
106
|
+
if (record.state === "failed" && record.reason === "AUTOMATIC_ANALYSIS_PUBLICATION_FAILED")
|
|
107
|
+
return true;
|
|
108
|
+
if (receipt.status !== record.state)
|
|
109
|
+
return false;
|
|
110
|
+
if (record.state === "failed" || record.state === "cancelled")
|
|
111
|
+
return true;
|
|
112
|
+
const entry = await readStudyAnalysisVersion(prepared, record.analysisId);
|
|
113
|
+
return entry?.state === "ready" && entry.analysis !== null && matches(entry.analysis)
|
|
114
|
+
&& entry.analysis.status === record.state && hashStudyAnalysisValue(entry.analysis) === record.analysisSha256;
|
|
115
|
+
}
|
|
116
|
+
/** The directory is permanent, including after interrupted/failed writes. Never re-open it as a writer. */
|
|
117
|
+
export async function claimAutomaticStudyAnalysis(prepared, metadata) {
|
|
118
|
+
await validatePreparedRunRootIdentity(prepared);
|
|
119
|
+
const target = path.join(prepared.physicalRunRoot, AUTOMATIC_STUDY_ANALYSIS_DIRECTORY);
|
|
120
|
+
try {
|
|
121
|
+
await mkdir(target, { mode: 0o700 });
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error.code === "EEXIST")
|
|
125
|
+
return null;
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
const identity = await lstat(target, { bigint: true });
|
|
129
|
+
const root = await prepareContainedOutputDirectoryRoot(prepared, AUTOMATIC_STUDY_ANALYSIS_DIRECTORY);
|
|
130
|
+
if (root.identity.dev !== identity.dev || root.identity.ino !== identity.ino || root.identity.birthtimeNs !== identity.birthtimeNs) {
|
|
131
|
+
throw new Error("AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE");
|
|
132
|
+
}
|
|
133
|
+
const createdAt = iso();
|
|
134
|
+
let record = { schema: AUTOMATIC_STUDY_ANALYSIS_SCHEMA, runId: path.basename(prepared.physicalRunRoot),
|
|
135
|
+
claimId: randomUUID(), attemptId: `analysis-${randomUUID()}`, state: "queued", analysisId: null, reason: null,
|
|
136
|
+
createdAt, updatedAt: createdAt, ...metadata, sourceRunSha256: null, inputDigest: null, analysisSha256: null, receiptSha256: null,
|
|
137
|
+
startedAt: null, finishedAt: null };
|
|
138
|
+
let writes = Promise.resolve();
|
|
139
|
+
const write = async (next) => {
|
|
140
|
+
const bytes = Buffer.from(JSON.stringify(next) + "\n");
|
|
141
|
+
parseJob(bytes, record.runId);
|
|
142
|
+
if (bytes.length > MAX_JOB_BYTES)
|
|
143
|
+
throw new Error("AUTOMATIC_ANALYSIS_STORAGE_UNAVAILABLE");
|
|
144
|
+
await writeContainedOutputFile(root, JOB_FILE, bytes);
|
|
145
|
+
record = next;
|
|
146
|
+
};
|
|
147
|
+
await write(record);
|
|
148
|
+
const update = (change) => {
|
|
149
|
+
writes = writes.then(async () => {
|
|
150
|
+
if (!pending(record.state))
|
|
151
|
+
return;
|
|
152
|
+
const now = iso();
|
|
153
|
+
const state = change.state ?? record.state;
|
|
154
|
+
await write({ ...record, ...change, state, updatedAt: now, finishedAt: pending(state) ? null : now });
|
|
155
|
+
});
|
|
156
|
+
return writes;
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
attemptId: record.attemptId, update, touch: () => update({}),
|
|
160
|
+
async cancellationRequested() {
|
|
161
|
+
await assertPreparedSelectedOutputDirectory(root);
|
|
162
|
+
const bytes = await readBoundedStudyFile(root, CANCEL_FILE, 1024);
|
|
163
|
+
if (!bytes) {
|
|
164
|
+
const exists = await lstat(path.join(root.physicalPath, CANCEL_FILE)).then(() => true, (error) => { if (error.code === "ENOENT")
|
|
165
|
+
return false; throw error; });
|
|
166
|
+
if (exists)
|
|
167
|
+
throw new Error("AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE");
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const cancel = cancelSchema.parse(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
|
|
171
|
+
if (cancel.runId !== record.runId || cancel.claimId !== record.claimId)
|
|
172
|
+
throw new Error("AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE");
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** A scoped cancellation request, never a PID signal and never permission to create a new job. */
|
|
178
|
+
export async function requestAutomaticStudyAnalysisCancellationPrepared(prepared) {
|
|
179
|
+
try {
|
|
180
|
+
const root = await bindJob(prepared);
|
|
181
|
+
if (!root)
|
|
182
|
+
return { requested: false, reason: "AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE" };
|
|
183
|
+
const bytes = await readBoundedStudyFile(root, JOB_FILE, MAX_JOB_BYTES);
|
|
184
|
+
if (!bytes)
|
|
185
|
+
throw new Error("Unavailable job.");
|
|
186
|
+
const record = parseJob(bytes, path.basename(prepared.physicalRunRoot));
|
|
187
|
+
if (!pending(record.state))
|
|
188
|
+
return { requested: false, reason: null };
|
|
189
|
+
const cancellation = { schema: CANCEL_SCHEMA, runId: record.runId, claimId: record.claimId, requestedAt: iso() };
|
|
190
|
+
await writeContainedOutputFile(root, CANCEL_FILE, JSON.stringify(cancellation) + "\n");
|
|
191
|
+
return { requested: true, reason: null };
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return { requested: false, reason: "AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE" };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=study-analysis-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"study-analysis-job.js","sourceRoot":"","sources":["../src/study-analysis-job.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PreparedRunArtifactPaths } from "./run-paths.js";
|
|
2
|
-
import { type StudyAnalysisAdmission, type StudyAnalysisProgress } from "./study-analysis-engine.js";
|
|
2
|
+
import { type StudyAnalysisAdmission, type StudyAnalysisProgress, type StudyAnalysisDispatchContext } from "./study-analysis-engine.js";
|
|
3
3
|
import { type StudyAnalysisArtifact, type StudyAnalysisConfig, type StudyAnalysisCorrection, type LoadedStudyAnalysis } from "./study-analysis.js";
|
|
4
4
|
export declare const ANALYZE_RESULT_SCHEMA = "humanish.analyze-result.v1";
|
|
5
5
|
export interface AnalyzeOptions {
|
|
@@ -31,9 +31,18 @@ export interface AnalyzeDeps {
|
|
|
31
31
|
onProgress?: (progress: StudyAnalysisProgress) => void;
|
|
32
32
|
/** Request boundary only: evidence capture, admission, validation and writes remain real. */
|
|
33
33
|
fetch?: typeof fetch;
|
|
34
|
+
/** Internal producer pin: use this original run identity without resolving a replacement. */
|
|
35
|
+
expectedRun?: PreparedRunArtifactPaths;
|
|
36
|
+
/** Internal post-run orchestration; never populated from an Observer request. */
|
|
37
|
+
analysisId?: string;
|
|
38
|
+
beforeDispatch?: (context: StudyAnalysisDispatchContext) => Promise<void>;
|
|
34
39
|
}
|
|
40
|
+
/** A producer pin is authority for one physical project and exact run ID only. */
|
|
41
|
+
export declare function resolveStudyAnalysisRun(cwd: string, run: string, expectedRun?: PreparedRunArtifactPaths): Promise<PreparedRunArtifactPaths | null>;
|
|
35
42
|
/** One analysis or correction writer per run. Never steal a lock based on an untrusted PID. */
|
|
36
43
|
export declare function withStudyAnalysisLock<T>(prepared: PreparedRunArtifactPaths, action: () => Promise<T>): Promise<T>;
|
|
44
|
+
/** Internal completion gate shared with the opt-in post-run owner. */
|
|
45
|
+
export declare function readCompletedStudyAnalysisSource(cwd: string, prepared: PreparedRunArtifactPaths): Promise<Buffer>;
|
|
37
46
|
export declare function analyzeStudy(cwdInput: string, run: string, options: AnalyzeOptions, deps?: AnalyzeDeps): Promise<AnalyzeResult>;
|
|
38
47
|
export declare function showStudyAnalysis(cwd: string, run: string, id?: string): Promise<LoadedStudyAnalysis>;
|
|
39
48
|
export declare function correctStudyAnalysis(cwd: string, run: string, options: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { lstat, mkdir, rmdir } from "node:fs/promises";
|
|
2
|
+
import { lstat, mkdir, realpath, rmdir } from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { renderObserver } from "./observer.js";
|
|
5
5
|
import { containsSensitive } from "./redaction.js";
|
|
@@ -12,6 +12,22 @@ import { appendStudyAnalysisCorrection, assertStudyAnalysisPublicationCapacity,
|
|
|
12
12
|
import { hashStudyAnalysisValue } from "./study-analysis-validation.js";
|
|
13
13
|
import { STUDY_ANALYSIS_CORRECTION_SCHEMA } from "./study-analysis.js";
|
|
14
14
|
export const ANALYZE_RESULT_SCHEMA = "humanish.analyze-result.v1";
|
|
15
|
+
/** A producer pin is authority for one physical project and exact run ID only. */
|
|
16
|
+
export async function resolveStudyAnalysisRun(cwd, run, expectedRun) {
|
|
17
|
+
if (expectedRun === undefined)
|
|
18
|
+
return resolveRunPath(cwd, run);
|
|
19
|
+
const physicalCwd = path.dirname(path.dirname(expectedRun.physicalRunsRoot));
|
|
20
|
+
const selectedCwd = await realpath(cwd).catch(() => null);
|
|
21
|
+
if (selectedCwd !== physicalCwd || run !== path.basename(expectedRun.physicalRunRoot))
|
|
22
|
+
throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
|
|
23
|
+
try {
|
|
24
|
+
await validatePreparedRunRootIdentity(expectedRun);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error("ANALYSIS_SOURCE_CHANGED");
|
|
28
|
+
}
|
|
29
|
+
return expectedRun;
|
|
30
|
+
}
|
|
15
31
|
const messages = {
|
|
16
32
|
ANALYSIS_RUN_NOT_FOUND: "The selected run is unavailable or its storage is unsafe.",
|
|
17
33
|
ANALYSIS_VERIFY_FAILED: "The run must pass verification before analysis.",
|
|
@@ -63,7 +79,8 @@ export async function withStudyAnalysisLock(prepared, action) {
|
|
|
63
79
|
catch { /* Leave ambiguous storage in place for explicit operator inspection. */ }
|
|
64
80
|
}
|
|
65
81
|
}
|
|
66
|
-
|
|
82
|
+
/** Internal completion gate shared with the opt-in post-run owner. */
|
|
83
|
+
export async function readCompletedStudyAnalysisSource(cwd, prepared) {
|
|
67
84
|
const bytes = await readBoundedStudyFile(prepared, "run.json", STUDY_EVIDENCE_LIMITS.sourceBytes);
|
|
68
85
|
if (!bytes)
|
|
69
86
|
throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
|
|
@@ -99,7 +116,7 @@ async function completedSource(cwd, prepared) {
|
|
|
99
116
|
return bytes;
|
|
100
117
|
}
|
|
101
118
|
export async function analyzeStudy(cwdInput, run, options, deps = {}) {
|
|
102
|
-
|
|
119
|
+
let cwd = path.resolve(cwdInput);
|
|
103
120
|
const dryRun = options.dryRun === true;
|
|
104
121
|
const config = structuredClone(options.config);
|
|
105
122
|
if (!Number.isFinite(config.maxCostUsd) || config.maxCostUsd <= 0 || config.maxCostUsd > 1000)
|
|
@@ -107,13 +124,15 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
|
|
|
107
124
|
if (config.question !== null && containsSensitive(config.question))
|
|
108
125
|
return fail(run, dryRun, "ANALYSIS_QUESTION_UNSAFE");
|
|
109
126
|
try {
|
|
110
|
-
const prepared = await
|
|
127
|
+
const prepared = await resolveStudyAnalysisRun(cwd, run, deps.expectedRun);
|
|
111
128
|
if (!prepared)
|
|
112
129
|
return fail(run, dryRun, "ANALYSIS_RUN_NOT_FOUND");
|
|
130
|
+
if (deps.expectedRun !== undefined)
|
|
131
|
+
cwd = path.dirname(path.dirname(prepared.physicalRunsRoot));
|
|
113
132
|
const execute = async () => {
|
|
114
133
|
if (deps.signal?.aborted)
|
|
115
134
|
return fail(run, dryRun, "ANALYSIS_CANCELLED");
|
|
116
|
-
const bytes = await
|
|
135
|
+
const bytes = await readCompletedStudyAnalysisSource(cwd, prepared);
|
|
117
136
|
const input = await captureStudyEvidence(prepared, bytes);
|
|
118
137
|
if (input.evidence.length === 0)
|
|
119
138
|
return fail(input.runId, dryRun, "ANALYSIS_NO_PARTICIPANTS");
|
|
@@ -130,10 +149,12 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
|
|
|
130
149
|
const prior = (await listStudyAnalyses(prepared)).find((entry) => entry.state === "ready"
|
|
131
150
|
&& entry.analysis?.inputDigest === input.inputDigest && entry.analysis.configDigest === hashStudyAnalysisValue(config)
|
|
132
151
|
&& entry.analysis.promptVersion === STUDY_ANALYSIS_PROMPT_VERSION)?.analysis;
|
|
133
|
-
if (prior)
|
|
152
|
+
if (prior) {
|
|
153
|
+
await validatePreparedRunRootIdentity(prepared);
|
|
134
154
|
return { ...base, ok: prior.error === null, reused: true, analysisId: prior.id, status: prior.status, usage: prior.usage,
|
|
135
155
|
...(prior.error === null ? {} : { error: { code: prior.error, message: "The saved analysis exceeded its admission estimate. Findings and usage are retained; no new request was sent." } }),
|
|
136
156
|
artifactPath: path.join(prepared.relativeRunRoot, "analysis", prior.id, "analysis.json") };
|
|
157
|
+
}
|
|
137
158
|
}
|
|
138
159
|
// An unreadable inventory is not evidence of an absent prior result.
|
|
139
160
|
// Check readable history capacity before any new paid attempt.
|
|
@@ -142,6 +163,8 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
|
|
|
142
163
|
if (!apiKey.trim())
|
|
143
164
|
return { ...fail(input.runId, false, "ANALYSIS_API_KEY_MISSING"), admission };
|
|
144
165
|
const analysis = await runStudyAnalysis(input, config, { apiKey,
|
|
166
|
+
...(deps.analysisId === undefined ? {} : { analysisId: deps.analysisId }),
|
|
167
|
+
...(deps.beforeDispatch === undefined ? {} : { beforeDispatch: deps.beforeDispatch }),
|
|
145
168
|
...(deps.signal === undefined ? {} : { signal: deps.signal }),
|
|
146
169
|
...(deps.onProgress === undefined ? {} : { onProgress: deps.onProgress }),
|
|
147
170
|
...(deps.fetch === undefined ? {} : { fetch: deps.fetch }) });
|
|
@@ -160,7 +183,7 @@ export async function analyzeStudy(cwdInput, run, options, deps = {}) {
|
|
|
160
183
|
: "Storage changed or became unavailable after the attempt. Usage is retained in this response; no durable receipt could be written." } };
|
|
161
184
|
}
|
|
162
185
|
try {
|
|
163
|
-
const rendered = await renderObserver(cwd, input.runId, { open: false });
|
|
186
|
+
const rendered = await renderObserver(cwd, input.runId, { open: false, expectedRun: prepared });
|
|
164
187
|
if (!rendered.ok)
|
|
165
188
|
result.warnings.push("Analysis was saved, but Observer could not be refreshed. Run humanish observe again.");
|
|
166
189
|
}
|
|
@@ -200,7 +223,7 @@ export async function correctStudyAnalysis(cwd, run, options) {
|
|
|
200
223
|
status: options.status, reason: options.reason, replacementClaim: options.replacementClaim ?? null
|
|
201
224
|
};
|
|
202
225
|
await appendStudyAnalysisCorrection(prepared, correction);
|
|
203
|
-
await renderObserver(cwd,
|
|
226
|
+
await renderObserver(cwd, path.basename(prepared.physicalRunRoot), { open: false, expectedRun: prepared }).catch(() => null);
|
|
204
227
|
return correction;
|
|
205
228
|
});
|
|
206
229
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"study-analysis-service.js","sourceRoot":"","sources":["../src/study-analysis-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"study-analysis-service.js","sourceRoot":"","sources":["../src/study-analysis-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { containsSensitive } from "./redaction.js";
|
|
2
|
+
import { projectAutomaticStudyAnalysisView } from "./study-analysis-job.js";
|
|
2
3
|
/** Owned file names in normalized run-relative paths, not directory ownership.
|
|
3
4
|
* Legacy evidence under analysis/ still follows ordinary evidence policy. */
|
|
4
5
|
export function isStudyAnalysisRecordPath(relativePath) {
|
|
@@ -6,22 +7,29 @@ export function isStudyAnalysisRecordPath(relativePath) {
|
|
|
6
7
|
const leaf = parts.at(-1);
|
|
7
8
|
return (parts[0] === "analysis" && ["analysis.json", "correction.json"].includes(leaf))
|
|
8
9
|
|| (parts[0] === "analysis-attempts" && leaf === "receipt.json")
|
|
9
|
-
|| (["analysis", "
|
|
10
|
+
|| (parts[0] === "analysis-automatic" && ["job.json", "cancel.json"].includes(leaf))
|
|
11
|
+
|| (["analysis", "analysis-attempts", "analysis-automatic"].includes(parts[0]) && leaf.startsWith(".humanish-write-"));
|
|
10
12
|
}
|
|
11
13
|
/** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
|
|
12
14
|
export function studyAnalysisSharingProblems(loaded) {
|
|
15
|
+
// Job metadata never approves evidence, nor does uncertain liveness revoke its approval.
|
|
16
|
+
const { automatic: _automatic, ...evidence } = loaded;
|
|
13
17
|
const benignAttempt = loaded.analysis?.result === null
|
|
14
18
|
&& (loaded.analysis.status === "failed" || loaded.analysis.status === "cancelled");
|
|
15
19
|
const validationWarnings = loaded.warnings.filter((warning) => warning !== "ANALYSIS_FAILED" && warning !== "ANALYSIS_CANCELLED");
|
|
16
20
|
return {
|
|
17
|
-
sensitive: containsSensitive(JSON.stringify(
|
|
21
|
+
sensitive: containsSensitive(JSON.stringify(evidence)),
|
|
18
22
|
unverified: loaded.state === "stale" || (loaded.state === "invalid" && !benignAttempt) || validationWarnings.length > 0
|
|
19
23
|
};
|
|
20
24
|
}
|
|
21
25
|
/** Unsafe generated text is quarantined without hiding the original recording. */
|
|
22
26
|
export function projectShareCheckedAnalysis(loaded) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
const { automatic: _automatic, ...evidence } = loaded;
|
|
28
|
+
const automatic = projectAutomaticStudyAnalysisView(loaded.automatic);
|
|
29
|
+
const safe = automatic === undefined ? evidence : { ...evidence, automatic };
|
|
30
|
+
return studyAnalysisSharingProblems(safe).sensitive
|
|
31
|
+
? { state: "invalid", analysis: null, corrections: [], warnings: ["ANALYSIS_SENSITIVE_TEXT_QUARANTINED"],
|
|
32
|
+
...(automatic === undefined ? {} : { automatic }) }
|
|
33
|
+
: safe;
|
|
26
34
|
}
|
|
27
35
|
//# sourceMappingURL=study-analysis-sharing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"study-analysis-sharing.js","sourceRoot":"","sources":["../src/study-analysis-sharing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"study-analysis-sharing.js","sourceRoot":"","sources":["../src/study-analysis-sharing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAE5E;6EAC6E;AAC7E,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WAClF,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,mBAAmB,IAAI,IAAI,KAAK,cAAc,CAAC;WAC7D,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,oBAAoB,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WACjF,CAAC,CAAC,UAAU,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC5H,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,4BAA4B,CAAC,MAA2B;IACtE,yFAAyF;IACzF,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;IACtD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI;WACjD,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IACrF,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,iBAAiB,IAAI,OAAO,KAAK,oBAAoB,CAAC,CAAC;IAClI,OAAO;QACL,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtD,UAAU,EAAE,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;KACxH,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,2BAA2B,CAAC,MAA2B;IACrE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;IACtD,MAAM,SAAS,GAAG,iCAAiC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7E,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC,SAAS;QACjD,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,qCAAqC,CAAC;YACtG,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;QACrD,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
|
|
@@ -13,12 +13,16 @@ export interface StudyAnalysisListEntry {
|
|
|
13
13
|
export declare function assertStudyAnalysisPublicationCapacity(prepared: PreparedRunArtifactPaths): Promise<void>;
|
|
14
14
|
/** A claimed version is never reused, including after interruption before publication. */
|
|
15
15
|
export declare function writeStudyAnalysis(prepared: PreparedRunArtifactPaths, value: StudyAnalysisArtifact): Promise<void>;
|
|
16
|
+
/** Read one exact result without reading automatic job state or unrelated history. */
|
|
17
|
+
export declare function readStudyAnalysisVersion(prepared: PreparedRunArtifactPaths, id: string): Promise<StudyAnalysisListEntry | null>;
|
|
16
18
|
/** Includes failed attempts; callers must not equate the newest attempt with usable findings. */
|
|
17
19
|
export declare function listStudyAnalyses(prepared: PreparedRunArtifactPaths): Promise<StudyAnalysisListEntry[]>;
|
|
18
20
|
export declare function loadStudyAnalysis(prepared: PreparedRunArtifactPaths, id?: string): Promise<LoadedStudyAnalysis>;
|
|
19
21
|
export declare function appendStudyAnalysisCorrection(prepared: PreparedRunArtifactPaths, value: StudyAnalysisCorrection): Promise<void>;
|
|
20
22
|
export type { StudyAnalysisExecutionReceipt } from "./study-analysis-validation.js";
|
|
21
23
|
export declare const STUDY_ANALYSIS_EXECUTION_DIRECTORY = "analysis-attempts";
|
|
24
|
+
/** Exact bounded receipt lookup for an already claimed execution, never a dispatch decision. */
|
|
25
|
+
export declare function readStudyAnalysisExecution(prepared: PreparedRunArtifactPaths, id: string): Promise<StudyAnalysisExecutionReceipt | null>;
|
|
22
26
|
/**
|
|
23
27
|
* Publish accounting first. Unlike a usable report, this receipt does not claim
|
|
24
28
|
* the source still matches; its digests name the exact input that was attempted.
|
|
@@ -5,6 +5,7 @@ import { validatePreparedRunRootIdentity } from "./run-paths.js";
|
|
|
5
5
|
import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile } from "./selected-output-paths.js";
|
|
6
6
|
import { isStudyEvidencePath, readBoundedStudyFile, STUDY_EVIDENCE_LIMITS, validateStudyAnalysisEvidence } from "./study-analysis-evidence.js";
|
|
7
7
|
import { hashStudyAnalysisValue, validateStudyAnalysisExecutionReceipt, validateStudyAnalysisArtifact, validateStudyAnalysisCorrection } from "./study-analysis-validation.js";
|
|
8
|
+
import { readAutomaticStudyAnalysisPrepared } from "./study-analysis-job.js";
|
|
8
9
|
export const STUDY_ANALYSIS_DIRECTORY = "analysis";
|
|
9
10
|
const ANALYSIS_MAX_BYTES = 4 * 1024 * 1024;
|
|
10
11
|
const MAX_VERSIONS = 256;
|
|
@@ -143,6 +144,20 @@ async function readVersion(prepared, root, id, source) {
|
|
|
143
144
|
warnings: [analysis.status === "cancelled" ? "ANALYSIS_CANCELLED" : "ANALYSIS_FAILED"] };
|
|
144
145
|
return { id, state: "ready", analysis, warnings: [] };
|
|
145
146
|
}
|
|
147
|
+
/** Read one exact result without reading automatic job state or unrelated history. */
|
|
148
|
+
export async function readStudyAnalysisVersion(prepared, id) {
|
|
149
|
+
if (!safeId(id))
|
|
150
|
+
return null;
|
|
151
|
+
try {
|
|
152
|
+
const root = await existingRoot(prepared);
|
|
153
|
+
if (!root)
|
|
154
|
+
return null;
|
|
155
|
+
return await readVersion(prepared, root, id, await readBoundedStudyFile(prepared, "run.json", STUDY_EVIDENCE_LIMITS.sourceBytes));
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
146
161
|
/** Includes failed attempts; callers must not equate the newest attempt with usable findings. */
|
|
147
162
|
export async function listStudyAnalyses(prepared) {
|
|
148
163
|
try {
|
|
@@ -210,7 +225,7 @@ async function readCorrections(prepared, root, analysis) {
|
|
|
210
225
|
corrections.sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));
|
|
211
226
|
return { corrections, warnings };
|
|
212
227
|
}
|
|
213
|
-
|
|
228
|
+
async function loadStudyAnalysisRecord(prepared, id) {
|
|
214
229
|
if (id !== undefined && !safeId(id))
|
|
215
230
|
return empty("invalid", ["ANALYSIS_ID_INVALID"]);
|
|
216
231
|
try {
|
|
@@ -239,6 +254,12 @@ export async function loadStudyAnalysis(prepared, id) {
|
|
|
239
254
|
return empty("invalid", ["ANALYSIS_STORAGE_UNAVAILABLE"]);
|
|
240
255
|
}
|
|
241
256
|
}
|
|
257
|
+
export async function loadStudyAnalysis(prepared, id) {
|
|
258
|
+
const [loaded, automatic] = await Promise.all([
|
|
259
|
+
loadStudyAnalysisRecord(prepared, id), readAutomaticStudyAnalysisPrepared(prepared)
|
|
260
|
+
]);
|
|
261
|
+
return automatic === undefined ? loaded : { ...loaded, automatic };
|
|
262
|
+
}
|
|
242
263
|
function assertCorrectionBinding(analysis, correction) {
|
|
243
264
|
const finding = analysis.result?.findings.find((entry) => entry.id === correction.findingId);
|
|
244
265
|
if (analysis.id !== correction.analysisId || hashStudyAnalysisValue(analysis) !== correction.analysisSha256
|
|
@@ -270,6 +291,24 @@ export async function appendStudyAnalysisCorrection(prepared, value) {
|
|
|
270
291
|
await writeContainedOutputFile(claimed, "correction.json", `${JSON.stringify(correction, null, 2)}\n`);
|
|
271
292
|
}
|
|
272
293
|
export const STUDY_ANALYSIS_EXECUTION_DIRECTORY = "analysis-attempts";
|
|
294
|
+
/** Exact bounded receipt lookup for an already claimed execution, never a dispatch decision. */
|
|
295
|
+
export async function readStudyAnalysisExecution(prepared, id) {
|
|
296
|
+
if (!safeId(id))
|
|
297
|
+
return null;
|
|
298
|
+
try {
|
|
299
|
+
const root = await existingRoot(prepared, STUDY_ANALYSIS_EXECUTION_DIRECTORY);
|
|
300
|
+
if (!root)
|
|
301
|
+
return null;
|
|
302
|
+
const bytes = await readBoundedStudyFile(root, `${id}/receipt.json`, 16 * 1024);
|
|
303
|
+
if (!bytes)
|
|
304
|
+
return null;
|
|
305
|
+
const receipt = validateStudyAnalysisExecutionReceipt(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
|
|
306
|
+
return receipt.id === id && receipt.runId === path.basename(prepared.physicalRunRoot) ? receipt : null;
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
273
312
|
/**
|
|
274
313
|
* Publish accounting first. Unlike a usable report, this receipt does not claim
|
|
275
314
|
* the source still matches; its digests name the exact input that was attempted.
|