humanish 0.88.2 → 0.89.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 +8 -0
- package/dist/export-bundle.js +6 -0
- package/dist/export-bundle.js.map +1 -1
- package/dist/export.js +67 -10
- package/dist/export.js.map +1 -1
- package/dist/feedback.d.ts +10 -0
- package/dist/feedback.js +58 -1
- package/dist/feedback.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/observer-app.html +10 -9
- package/dist/observer.d.ts +2 -0
- package/dist/observer.js +52 -5
- package/dist/observer.js.map +1 -1
- package/dist/pricing.js +2 -2
- package/dist/pricing.js.map +1 -1
- package/dist/program.js +146 -3
- package/dist/program.js.map +1 -1
- package/dist/run.d.ts +3 -1
- package/dist/run.js +46 -18
- package/dist/run.js.map +1 -1
- package/dist/study-analysis-engine.d.ts +34 -0
- package/dist/study-analysis-engine.js +217 -0
- package/dist/study-analysis-engine.js.map +1 -0
- package/dist/study-analysis-evidence.d.ts +27 -0
- package/dist/study-analysis-evidence.js +420 -0
- package/dist/study-analysis-evidence.js.map +1 -0
- package/dist/study-analysis-provider.d.ts +38 -0
- package/dist/study-analysis-provider.js +140 -0
- package/dist/study-analysis-provider.js.map +1 -0
- package/dist/study-analysis-service.d.ts +45 -0
- package/dist/study-analysis-service.js +207 -0
- package/dist/study-analysis-service.js.map +1 -0
- package/dist/study-analysis-sharing.d.ts +11 -0
- package/dist/study-analysis-sharing.js +27 -0
- package/dist/study-analysis-sharing.js.map +1 -0
- package/dist/study-analysis-store.d.ts +30 -0
- package/dist/study-analysis-store.js +343 -0
- package/dist/study-analysis-store.js.map +1 -0
- package/dist/study-analysis-validation.d.ts +448 -0
- package/dist/study-analysis-validation.js +331 -0
- package/dist/study-analysis-validation.js.map +1 -0
- package/dist/study-analysis.d.ts +167 -0
- package/dist/study-analysis.js +4 -0
- package/dist/study-analysis.js.map +1 -0
- package/docs/architecture/observer.md +10 -1
- package/docs/contracts/feedback.md +9 -3
- package/docs/contracts/schemas.md +4 -1
- package/docs/contracts/study-analysis.md +150 -0
- package/docs/goals/current.md +4 -3
- package/docs/ramp/README.md +9 -2
- package/docs/release/0.89.0-study-findings.md +79 -0
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"study-analysis-provider.js","sourceRoot":"","sources":["../src/study-analysis-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type PreparedRunArtifactPaths } from "./run-paths.js";
|
|
2
|
+
import { type StudyAnalysisAdmission, type StudyAnalysisProgress } from "./study-analysis-engine.js";
|
|
3
|
+
import { type StudyAnalysisArtifact, type StudyAnalysisConfig, type StudyAnalysisCorrection, type LoadedStudyAnalysis } from "./study-analysis.js";
|
|
4
|
+
export declare const ANALYZE_RESULT_SCHEMA = "humanish.analyze-result.v1";
|
|
5
|
+
export interface AnalyzeOptions {
|
|
6
|
+
config: StudyAnalysisConfig;
|
|
7
|
+
dryRun?: boolean;
|
|
8
|
+
rerun?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface AnalyzeResult {
|
|
11
|
+
schema: typeof ANALYZE_RESULT_SCHEMA;
|
|
12
|
+
ok: boolean;
|
|
13
|
+
run: string;
|
|
14
|
+
dryRun: boolean;
|
|
15
|
+
reused: boolean;
|
|
16
|
+
analysisId?: string;
|
|
17
|
+
artifactPath?: string;
|
|
18
|
+
executionReceiptPath?: string;
|
|
19
|
+
status?: StudyAnalysisArtifact["status"];
|
|
20
|
+
usage?: StudyAnalysisArtifact["usage"];
|
|
21
|
+
admission?: StudyAnalysisAdmission;
|
|
22
|
+
warnings: string[];
|
|
23
|
+
error?: {
|
|
24
|
+
code: string;
|
|
25
|
+
message: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface AnalyzeDeps {
|
|
29
|
+
apiKey?: string;
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
onProgress?: (progress: StudyAnalysisProgress) => void;
|
|
32
|
+
/** Request boundary only: evidence capture, admission, validation and writes remain real. */
|
|
33
|
+
fetch?: typeof fetch;
|
|
34
|
+
}
|
|
35
|
+
/** One analysis or correction writer per run. Never steal a lock based on an untrusted PID. */
|
|
36
|
+
export declare function withStudyAnalysisLock<T>(prepared: PreparedRunArtifactPaths, action: () => Promise<T>): Promise<T>;
|
|
37
|
+
export declare function analyzeStudy(cwdInput: string, run: string, options: AnalyzeOptions, deps?: AnalyzeDeps): Promise<AnalyzeResult>;
|
|
38
|
+
export declare function showStudyAnalysis(cwd: string, run: string, id?: string): Promise<LoadedStudyAnalysis>;
|
|
39
|
+
export declare function correctStudyAnalysis(cwd: string, run: string, options: {
|
|
40
|
+
analysisId: string;
|
|
41
|
+
findingId: string;
|
|
42
|
+
status: StudyAnalysisCorrection["status"];
|
|
43
|
+
reason: string;
|
|
44
|
+
replacementClaim?: string;
|
|
45
|
+
}): Promise<StudyAnalysisCorrection>;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, mkdir, rmdir } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { renderObserver } from "./observer.js";
|
|
5
|
+
import { containsSensitive } from "./redaction.js";
|
|
6
|
+
import { loadRunBundlePrepared, resolveRunPath, verifyRunPrepared } from "./run.js";
|
|
7
|
+
import { validatePreparedRunRootIdentity } from "./run-paths.js";
|
|
8
|
+
import { isRunStatusRecord, RUN_STATUS_FILE } from "./run-status.js";
|
|
9
|
+
import { captureStudyEvidence, readBoundedStudyFile, STUDY_EVIDENCE_LIMITS } from "./study-analysis-evidence.js";
|
|
10
|
+
import { estimateStudyAnalysisAdmission, runStudyAnalysis, STUDY_ANALYSIS_PROMPT_VERSION } from "./study-analysis-engine.js";
|
|
11
|
+
import { appendStudyAnalysisCorrection, assertStudyAnalysisPublicationCapacity, listStudyAnalyses, loadStudyAnalysis, writeStudyAnalysis, writeStudyAnalysisExecutionReceipt } from "./study-analysis-store.js";
|
|
12
|
+
import { hashStudyAnalysisValue } from "./study-analysis-validation.js";
|
|
13
|
+
import { STUDY_ANALYSIS_CORRECTION_SCHEMA } from "./study-analysis.js";
|
|
14
|
+
export const ANALYZE_RESULT_SCHEMA = "humanish.analyze-result.v1";
|
|
15
|
+
const messages = {
|
|
16
|
+
ANALYSIS_RUN_NOT_FOUND: "The selected run is unavailable or its storage is unsafe.",
|
|
17
|
+
ANALYSIS_VERIFY_FAILED: "The run must pass verification before analysis.",
|
|
18
|
+
ANALYSIS_RUN_ACTIVE: "Analysis requires a completed recording. Wait for the study to finish.",
|
|
19
|
+
ANALYSIS_NO_PARTICIPANTS: "This run contains no participant evidence to analyze.",
|
|
20
|
+
ANALYSIS_REQUIRES_LIVE_RUN: "A dry-run proves harness contracts, not participant behavior. Select a completed live study for analysis.",
|
|
21
|
+
ANALYSIS_SOURCE_UNAVAILABLE: "The source recording is missing, unsafe, or exceeds the input limit.",
|
|
22
|
+
ANALYSIS_SOURCE_CHANGED: "The source recording changed during analysis. The result cannot be published against different evidence.",
|
|
23
|
+
ANALYSIS_BUSY: "Another analysis holds this run's .analysis-lock directory. If it was interrupted, confirm it has stopped before removing that empty directory.",
|
|
24
|
+
ANALYSIS_HISTORY_UNAVAILABLE: "Analysis history is unavailable or full. No request was sent. Inspect this run's analysis and analysis-attempts storage before retrying.",
|
|
25
|
+
ANALYSIS_CONFIG_INVALID: "Use a supported analysis model, a positive cost ceiling up to 1000 USD, a timeout of 1–600000 ms, and 256–32768 output tokens.",
|
|
26
|
+
ANALYSIS_QUESTION_UNSAFE: "The reviewer question matched a sensitive-text pattern. Remove sensitive details before retrying.",
|
|
27
|
+
ANALYSIS_API_KEY_MISSING: "Set OPENAI_API_KEY to run analysis. --dry-run checks admission without a key or provider request.",
|
|
28
|
+
ANALYSIS_CANCELLED: "Analysis was cancelled before dispatch.",
|
|
29
|
+
ANALYSIS_UNAVAILABLE: "Analysis could not be completed safely. Source evidence was not changed."
|
|
30
|
+
};
|
|
31
|
+
const fail = (run, dryRun, code) => ({
|
|
32
|
+
schema: ANALYZE_RESULT_SCHEMA, ok: false, run, dryRun, reused: false, warnings: [],
|
|
33
|
+
error: { code, message: messages[code] ?? messages.ANALYSIS_UNAVAILABLE }
|
|
34
|
+
});
|
|
35
|
+
/** One analysis or correction writer per run. Never steal a lock based on an untrusted PID. */
|
|
36
|
+
export async function withStudyAnalysisLock(prepared, action) {
|
|
37
|
+
await validatePreparedRunRootIdentity(prepared);
|
|
38
|
+
const target = path.join(prepared.physicalRunRoot, ".analysis-lock");
|
|
39
|
+
try {
|
|
40
|
+
await mkdir(target, { mode: 0o700 });
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error.code === "EEXIST")
|
|
44
|
+
throw new Error("ANALYSIS_BUSY");
|
|
45
|
+
throw new Error("ANALYSIS_UNAVAILABLE");
|
|
46
|
+
}
|
|
47
|
+
const identity = await lstat(target, { bigint: true });
|
|
48
|
+
try {
|
|
49
|
+
await validatePreparedRunRootIdentity(prepared);
|
|
50
|
+
if (!identity.isDirectory() || identity.isSymbolicLink())
|
|
51
|
+
throw new Error("ANALYSIS_UNAVAILABLE");
|
|
52
|
+
return await action();
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
// Only remove our empty, unchanged directory. No recursive deletion and no replacement authority.
|
|
56
|
+
try {
|
|
57
|
+
await validatePreparedRunRootIdentity(prepared);
|
|
58
|
+
const current = await lstat(target, { bigint: true });
|
|
59
|
+
if (current.isDirectory() && !current.isSymbolicLink() && current.dev === identity.dev
|
|
60
|
+
&& current.ino === identity.ino && current.birthtimeNs === identity.birthtimeNs)
|
|
61
|
+
await rmdir(target);
|
|
62
|
+
}
|
|
63
|
+
catch { /* Leave ambiguous storage in place for explicit operator inspection. */ }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function completedSource(cwd, prepared) {
|
|
67
|
+
const bytes = await readBoundedStudyFile(prepared, "run.json", STUDY_EVIDENCE_LIMITS.sourceBytes);
|
|
68
|
+
if (!bytes)
|
|
69
|
+
throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
|
|
70
|
+
const verified = await verifyRunPrepared(cwd, path.basename(prepared.physicalRunRoot), prepared);
|
|
71
|
+
if (!verified.ok && verified.recordingOk !== true)
|
|
72
|
+
throw new Error("ANALYSIS_VERIFY_FAILED");
|
|
73
|
+
const loaded = await loadRunBundlePrepared(cwd, prepared);
|
|
74
|
+
if (!loaded || loaded.bundle.streams.length === 0)
|
|
75
|
+
throw new Error("ANALYSIS_NO_PARTICIPANTS");
|
|
76
|
+
if (loaded.bundle.mode !== "live")
|
|
77
|
+
throw new Error("ANALYSIS_REQUIRES_LIVE_RUN");
|
|
78
|
+
const statusBytes = await readBoundedStudyFile(prepared, RUN_STATUS_FILE, 64 * 1024);
|
|
79
|
+
if (!statusBytes) {
|
|
80
|
+
const statusExists = await lstat(path.join(prepared.physicalRunRoot, RUN_STATUS_FILE)).then(() => true, (error) => {
|
|
81
|
+
if (error.code === "ENOENT")
|
|
82
|
+
return false;
|
|
83
|
+
throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
|
|
84
|
+
});
|
|
85
|
+
if (statusExists)
|
|
86
|
+
throw new Error("ANALYSIS_RUN_ACTIVE");
|
|
87
|
+
}
|
|
88
|
+
if (statusBytes) {
|
|
89
|
+
const status = JSON.parse(statusBytes.toString("utf8"));
|
|
90
|
+
// An old heartbeat is unknown, not proof that a process stopped writing evidence.
|
|
91
|
+
if (!isRunStatusRecord(status) || status.runId !== loaded.bundle.runId || status.state !== "finished") {
|
|
92
|
+
throw new Error("ANALYSIS_RUN_ACTIVE");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const terminal = new Set(["complete", "passed", "failed", "blocked", "timed_out", "abandoned", "incomplete"]);
|
|
96
|
+
if (loaded.bundle.streams.some((stream) => !terminal.has(stream.status) || stream.liveActor !== undefined)) {
|
|
97
|
+
throw new Error("ANALYSIS_RUN_ACTIVE");
|
|
98
|
+
}
|
|
99
|
+
return bytes;
|
|
100
|
+
}
|
|
101
|
+
export async function analyzeStudy(cwdInput, run, options, deps = {}) {
|
|
102
|
+
const cwd = path.resolve(cwdInput);
|
|
103
|
+
const dryRun = options.dryRun === true;
|
|
104
|
+
const config = structuredClone(options.config);
|
|
105
|
+
if (!Number.isFinite(config.maxCostUsd) || config.maxCostUsd <= 0 || config.maxCostUsd > 1000)
|
|
106
|
+
return fail(run, dryRun, "ANALYSIS_CONFIG_INVALID");
|
|
107
|
+
if (config.question !== null && containsSensitive(config.question))
|
|
108
|
+
return fail(run, dryRun, "ANALYSIS_QUESTION_UNSAFE");
|
|
109
|
+
try {
|
|
110
|
+
const prepared = await resolveRunPath(cwd, run);
|
|
111
|
+
if (!prepared)
|
|
112
|
+
return fail(run, dryRun, "ANALYSIS_RUN_NOT_FOUND");
|
|
113
|
+
const execute = async () => {
|
|
114
|
+
if (deps.signal?.aborted)
|
|
115
|
+
return fail(run, dryRun, "ANALYSIS_CANCELLED");
|
|
116
|
+
const bytes = await completedSource(cwd, prepared);
|
|
117
|
+
const input = await captureStudyEvidence(prepared, bytes);
|
|
118
|
+
if (input.evidence.length === 0)
|
|
119
|
+
return fail(input.runId, dryRun, "ANALYSIS_NO_PARTICIPANTS");
|
|
120
|
+
const admission = estimateStudyAnalysisAdmission(input, config);
|
|
121
|
+
const base = { schema: ANALYZE_RESULT_SCHEMA, run: input.runId, dryRun, reused: false, admission, warnings: [] };
|
|
122
|
+
if (!admission.allowed)
|
|
123
|
+
return { ...base, ok: false,
|
|
124
|
+
error: { code: admission.error ?? "analysis_admission_denied", message: admission.error === "analysis_budget_exceeded"
|
|
125
|
+
? "The conservative admission estimate exceeds --max-cost. No provider request was sent."
|
|
126
|
+
: "The analysis input or configuration did not pass admission. No provider request was sent." } };
|
|
127
|
+
if (dryRun)
|
|
128
|
+
return { ...base, ok: true };
|
|
129
|
+
if (!options.rerun) {
|
|
130
|
+
const prior = (await listStudyAnalyses(prepared)).find((entry) => entry.state === "ready"
|
|
131
|
+
&& entry.analysis?.inputDigest === input.inputDigest && entry.analysis.configDigest === hashStudyAnalysisValue(config)
|
|
132
|
+
&& entry.analysis.promptVersion === STUDY_ANALYSIS_PROMPT_VERSION)?.analysis;
|
|
133
|
+
if (prior)
|
|
134
|
+
return { ...base, ok: prior.error === null, reused: true, analysisId: prior.id, status: prior.status, usage: prior.usage,
|
|
135
|
+
...(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
|
+
artifactPath: path.join(prepared.relativeRunRoot, "analysis", prior.id, "analysis.json") };
|
|
137
|
+
}
|
|
138
|
+
// An unreadable inventory is not evidence of an absent prior result.
|
|
139
|
+
// Check readable history capacity before any new paid attempt.
|
|
140
|
+
await assertStudyAnalysisPublicationCapacity(prepared);
|
|
141
|
+
const apiKey = deps.apiKey ?? process.env.OPENAI_API_KEY ?? "";
|
|
142
|
+
if (!apiKey.trim())
|
|
143
|
+
return { ...fail(input.runId, false, "ANALYSIS_API_KEY_MISSING"), admission };
|
|
144
|
+
const analysis = await runStudyAnalysis(input, config, { apiKey,
|
|
145
|
+
...(deps.signal === undefined ? {} : { signal: deps.signal }),
|
|
146
|
+
...(deps.onProgress === undefined ? {} : { onProgress: deps.onProgress }),
|
|
147
|
+
...(deps.fetch === undefined ? {} : { fetch: deps.fetch }) });
|
|
148
|
+
const result = { ...base, ok: analysis.result !== null && analysis.error === null, analysisId: analysis.id, status: analysis.status,
|
|
149
|
+
usage: analysis.usage,
|
|
150
|
+
...(analysis.error === null ? {} : { error: { code: analysis.error, message: "The attempt retained its status and any known usage. Inspect it with humanish analyze show." } }) };
|
|
151
|
+
try {
|
|
152
|
+
await writeStudyAnalysisExecutionReceipt(prepared, analysis);
|
|
153
|
+
result.executionReceiptPath = path.join(prepared.relativeRunRoot, "analysis-attempts", analysis.id, "receipt.json");
|
|
154
|
+
await writeStudyAnalysis(prepared, analysis);
|
|
155
|
+
result.artifactPath = path.join(prepared.relativeRunRoot, "analysis", analysis.id, "analysis.json");
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return { ...result, ok: false, error: { code: "ANALYSIS_PUBLICATION_FAILED",
|
|
159
|
+
message: result.executionReceiptPath ? "The attempt's usage was saved, but changed or unsafe evidence prevented report publication."
|
|
160
|
+
: "Storage changed or became unavailable after the attempt. Usage is retained in this response; no durable receipt could be written." } };
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const rendered = await renderObserver(cwd, input.runId, { open: false });
|
|
164
|
+
if (!rendered.ok)
|
|
165
|
+
result.warnings.push("Analysis was saved, but Observer could not be refreshed. Run humanish observe again.");
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
result.warnings.push("Analysis was saved, but Observer could not be refreshed. Run humanish observe again.");
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
};
|
|
172
|
+
return dryRun ? await execute() : await withStudyAnalysisLock(prepared, execute);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
const code = error instanceof Error && Object.hasOwn(messages, error.message) ? error.message : "ANALYSIS_UNAVAILABLE";
|
|
176
|
+
return fail(run, dryRun, code);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export async function showStudyAnalysis(cwd, run, id) {
|
|
180
|
+
const prepared = await resolveRunPath(path.resolve(cwd), run).catch(() => null);
|
|
181
|
+
return prepared ? loadStudyAnalysis(prepared, id)
|
|
182
|
+
: { state: "invalid", analysis: null, corrections: [], warnings: ["ANALYSIS_RUN_NOT_FOUND"] };
|
|
183
|
+
}
|
|
184
|
+
export async function correctStudyAnalysis(cwd, run, options) {
|
|
185
|
+
const prepared = await resolveRunPath(path.resolve(cwd), run);
|
|
186
|
+
if (!prepared)
|
|
187
|
+
throw new Error("ANALYSIS_RUN_NOT_FOUND");
|
|
188
|
+
return withStudyAnalysisLock(prepared, async () => {
|
|
189
|
+
const loaded = await loadStudyAnalysis(prepared, options.analysisId);
|
|
190
|
+
const analysis = loaded.analysis;
|
|
191
|
+
const finding = analysis?.result?.findings.find((item) => item.id === options.findingId);
|
|
192
|
+
if (loaded.state !== "ready" || !analysis || !finding)
|
|
193
|
+
throw new Error("ANALYSIS_CORRECTION_SOURCE_UNAVAILABLE");
|
|
194
|
+
if (containsSensitive(options.reason) || containsSensitive(options.replacementClaim ?? ""))
|
|
195
|
+
throw new Error("ANALYSIS_CORRECTION_TEXT_UNSAFE");
|
|
196
|
+
const correction = {
|
|
197
|
+
schema: STUDY_ANALYSIS_CORRECTION_SCHEMA, id: `correction-${randomUUID()}`,
|
|
198
|
+
analysisId: analysis.id, analysisSha256: hashStudyAnalysisValue(analysis), findingId: finding.id,
|
|
199
|
+
findingSha256: hashStudyAnalysisValue(finding), createdAt: new Date().toISOString(),
|
|
200
|
+
status: options.status, reason: options.reason, replacementClaim: options.replacementClaim ?? null
|
|
201
|
+
};
|
|
202
|
+
await appendStudyAnalysisCorrection(prepared, correction);
|
|
203
|
+
await renderObserver(cwd, run, { open: false }).catch(() => null);
|
|
204
|
+
return correction;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=study-analysis-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"study-analysis-service.js","sourceRoot":"","sources":["../src/study-analysis-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LoadedStudyAnalysis } from "./study-analysis.js";
|
|
2
|
+
/** Owned file names in normalized run-relative paths, not directory ownership.
|
|
3
|
+
* Legacy evidence under analysis/ still follows ordinary evidence policy. */
|
|
4
|
+
export declare function isStudyAnalysisRecordPath(relativePath: string): boolean;
|
|
5
|
+
/** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
|
|
6
|
+
export declare function studyAnalysisSharingProblems(loaded: LoadedStudyAnalysis): {
|
|
7
|
+
sensitive: boolean;
|
|
8
|
+
unverified: boolean;
|
|
9
|
+
};
|
|
10
|
+
/** Unsafe generated text is quarantined without hiding the original recording. */
|
|
11
|
+
export declare function projectShareCheckedAnalysis(loaded: LoadedStudyAnalysis): LoadedStudyAnalysis;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { containsSensitive } from "./redaction.js";
|
|
2
|
+
/** Owned file names in normalized run-relative paths, not directory ownership.
|
|
3
|
+
* Legacy evidence under analysis/ still follows ordinary evidence policy. */
|
|
4
|
+
export function isStudyAnalysisRecordPath(relativePath) {
|
|
5
|
+
const parts = relativePath.split("/");
|
|
6
|
+
const leaf = parts.at(-1);
|
|
7
|
+
return (parts[0] === "analysis" && ["analysis.json", "correction.json"].includes(leaf))
|
|
8
|
+
|| (parts[0] === "analysis-attempts" && leaf === "receipt.json")
|
|
9
|
+
|| (["analysis", "analysis-attempts"].includes(parts[0]) && leaf.startsWith(".humanish-write-"));
|
|
10
|
+
}
|
|
11
|
+
/** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
|
|
12
|
+
export function studyAnalysisSharingProblems(loaded) {
|
|
13
|
+
const benignAttempt = loaded.analysis?.result === null
|
|
14
|
+
&& (loaded.analysis.status === "failed" || loaded.analysis.status === "cancelled");
|
|
15
|
+
const validationWarnings = loaded.warnings.filter((warning) => warning !== "ANALYSIS_FAILED" && warning !== "ANALYSIS_CANCELLED");
|
|
16
|
+
return {
|
|
17
|
+
sensitive: containsSensitive(JSON.stringify(loaded)),
|
|
18
|
+
unverified: loaded.state === "stale" || (loaded.state === "invalid" && !benignAttempt) || validationWarnings.length > 0
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Unsafe generated text is quarantined without hiding the original recording. */
|
|
22
|
+
export function projectShareCheckedAnalysis(loaded) {
|
|
23
|
+
return studyAnalysisSharingProblems(loaded).sensitive
|
|
24
|
+
? { state: "invalid", analysis: null, corrections: [], warnings: ["ANALYSIS_SENSITIVE_TEXT_QUARANTINED"] }
|
|
25
|
+
: loaded;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=study-analysis-sharing.js.map
|
|
@@ -0,0 +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;AAGnD;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,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,4BAA4B,CAAC,MAA2B;IACtE,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,MAAM,CAAC,CAAC;QACpD,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,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC,SAAS;QACnD,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,qCAAqC,CAAC,EAAE;QAC1G,CAAC,CAAC,MAAM,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type PreparedRunArtifactPaths } from "./run-paths.js";
|
|
2
|
+
import { type StudyAnalysisExecutionReceipt } from "./study-analysis-validation.js";
|
|
3
|
+
import type { LoadedStudyAnalysis, StudyAnalysisArtifact, StudyAnalysisCorrection } from "./study-analysis.js";
|
|
4
|
+
export declare const STUDY_ANALYSIS_DIRECTORY = "analysis";
|
|
5
|
+
export interface StudyAnalysisListEntry {
|
|
6
|
+
id: string;
|
|
7
|
+
state: "ready" | "stale" | "invalid";
|
|
8
|
+
analysis: StudyAnalysisArtifact | null;
|
|
9
|
+
warnings: string[];
|
|
10
|
+
}
|
|
11
|
+
/** Check room for both immutable publications before a new provider dispatch.
|
|
12
|
+
* This is read-only; the service's dispatch lock protects ordinary concurrent writers. */
|
|
13
|
+
export declare function assertStudyAnalysisPublicationCapacity(prepared: PreparedRunArtifactPaths): Promise<void>;
|
|
14
|
+
/** A claimed version is never reused, including after interruption before publication. */
|
|
15
|
+
export declare function writeStudyAnalysis(prepared: PreparedRunArtifactPaths, value: StudyAnalysisArtifact): Promise<void>;
|
|
16
|
+
/** Includes failed attempts; callers must not equate the newest attempt with usable findings. */
|
|
17
|
+
export declare function listStudyAnalyses(prepared: PreparedRunArtifactPaths): Promise<StudyAnalysisListEntry[]>;
|
|
18
|
+
export declare function loadStudyAnalysis(prepared: PreparedRunArtifactPaths, id?: string): Promise<LoadedStudyAnalysis>;
|
|
19
|
+
export declare function appendStudyAnalysisCorrection(prepared: PreparedRunArtifactPaths, value: StudyAnalysisCorrection): Promise<void>;
|
|
20
|
+
export type { StudyAnalysisExecutionReceipt } from "./study-analysis-validation.js";
|
|
21
|
+
export declare const STUDY_ANALYSIS_EXECUTION_DIRECTORY = "analysis-attempts";
|
|
22
|
+
/**
|
|
23
|
+
* Publish accounting first. Unlike a usable report, this receipt does not claim
|
|
24
|
+
* the source still matches; its digests name the exact input that was attempted.
|
|
25
|
+
*/
|
|
26
|
+
export declare function writeStudyAnalysisExecutionReceipt(prepared: PreparedRunArtifactPaths, value: StudyAnalysisArtifact): Promise<void>;
|
|
27
|
+
export declare function listStudyAnalysisExecutions(prepared: PreparedRunArtifactPaths): Promise<{
|
|
28
|
+
receipts: StudyAnalysisExecutionReceipt[];
|
|
29
|
+
warnings: string[];
|
|
30
|
+
}>;
|