@akagilnc/pi-workflow-roles 0.1.3936 → 0.1.3975
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/CLAUDE.md +1 -1
- package/dist/acp-host/production-host.js +2389 -6018
- package/dist/analyst-gate-cycles-read.js +15 -19
- package/dist/audit-escalation.js +16 -46
- package/dist/auditor-dossier-tool.js +7 -62
- package/dist/collector-identity.js +0 -157
- package/dist/collector-ledger.js +2 -42
- package/dist/compliance-transport.js +40 -14
- package/dist/diarist-contracts.js +2 -40
- package/dist/doctor-contracts.js +39 -108
- package/dist/doctor-evidence.js +1 -5
- package/dist/engine-detour-tool.js +1 -1
- package/dist/gatekeeper-role.js +49 -38
- package/dist/headless-host/production-host.js +4814 -8450
- package/dist/host-contracts.js +0 -5
- package/dist/merger-contracts.js +4 -6
- package/dist/navigator-attendance.js +30 -52
- package/dist/navigator-invocation-identity.js +0 -1
- package/dist/navigator-public-session.js +2 -1
- package/dist/notary-contracts.js +4 -10
- package/dist/package-contracts/auditor-output.js +5 -23
- package/dist/package-contracts/fixer-output.js +25 -49
- package/dist/package-contracts/gatekeeper-output.js +3 -13
- package/dist/package-contracts/navigator-output.js +4 -7
- package/dist/package-contracts/reviewer-output.js +1 -95
- package/dist/package-contracts/terminating-tools.js +33 -144
- package/dist/package-contracts/worker-output.js +1 -3
- package/dist/public-cli/auto-resume.js +30 -68
- package/dist/public-cli/case-dossier-delivery.js +5 -17
- package/dist/public-cli/diarist-run.js +9 -4
- package/dist/public-cli/inspector-run.js +2 -8
- package/dist/public-cli/instruction-seat-run.js +3 -7
- package/dist/public-cli/invocation.js +5 -2
- package/dist/public-cli/main.js +6068 -6964
- package/dist/public-cli/notary-run.js +1 -8
- package/dist/public-cli/post-admission.js +314 -113
- package/dist/public-cli/run-lifecycle.js +14 -38
- package/dist/public-cli/settlement.js +209 -390
- package/dist/public-cli/terminal.js +51 -45
- package/dist/public-role-summons.js +1 -12
- package/dist/reviewer-dispatch.js +12 -258
- package/dist/submission-correctable-error.js +0 -12
- package/dist/submission-errors.js +6 -1
- package/dist/submission-ledger.js +125 -168
- package/dist/ticket-provenance-contracts.js +2 -49
- package/dist/ticket-provenance.js +82 -31
- package/extensions/role-runtime.ts +1 -6
- package/package.json +1 -1
- package/resources/836-deleted-machine-instruction-inventory.md +18 -0
- package/src/acp-host/role-turn-host.ts +8 -3
- package/src/analyst-gate-cycles-read.ts +17 -29
- package/src/audit-escalation.ts +20 -50
- package/src/auditor-dossier-tool.ts +5 -103
- package/src/canonical-skill-binding.ts +3 -2
- package/src/collector-identity.ts +0 -179
- package/src/collector-ledger.ts +3 -46
- package/src/collector-role.ts +32 -61
- package/src/collector-tool-schemas.ts +20 -14
- package/src/compliance-transport.ts +55 -17
- package/src/countersign-role.ts +17 -8
- package/src/diarist-contracts.ts +3 -36
- package/src/diarist-role.ts +13 -7
- package/src/diarist.ts +4 -16
- package/src/doctor-contracts.ts +73 -94
- package/src/doctor-evidence.ts +1 -1
- package/src/doctor-role.ts +3 -3
- package/src/engine-detour-tool.ts +4 -1
- package/src/external-host-turn-loop.ts +9 -3
- package/src/gatekeeper-pass-envelope.ts +7 -12
- package/src/gatekeeper-role.ts +56 -50
- package/src/gleaner-left-role.ts +4 -2
- package/src/headless-host/role-turn-host.ts +4 -5
- package/src/host-contracts.ts +3 -8
- package/src/judge-role.ts +19 -13
- package/src/merger-contracts.ts +10 -6
- package/src/merger-role.ts +1 -5
- package/src/navigator-attendance.ts +37 -74
- package/src/navigator-invocation-identity.ts +0 -6
- package/src/navigator-public-session.ts +2 -1
- package/src/notary-contracts.ts +7 -10
- package/src/package-contracts/auditor-output.ts +4 -21
- package/src/package-contracts/fixer-output.ts +34 -52
- package/src/package-contracts/gatekeeper-output.ts +5 -22
- package/src/package-contracts/navigator-output.ts +7 -7
- package/src/package-contracts/reviewer-output.ts +2 -150
- package/src/package-contracts/terminating-tools.ts +32 -147
- package/src/package-contracts/worker-output.ts +0 -1
- package/src/pi/adapter.ts +3 -8
- package/src/public-cli/auto-resume.ts +41 -94
- package/src/public-cli/case-dossier-delivery.ts +5 -15
- package/src/public-cli/countersign-run.ts +14 -6
- package/src/public-cli/diarist-run.ts +11 -9
- package/src/public-cli/inspector-run.ts +2 -18
- package/src/public-cli/instruction-seat-run.ts +3 -17
- package/src/public-cli/invocation.ts +5 -2
- package/src/public-cli/merger-run.ts +1 -1
- package/src/public-cli/notary-run.ts +1 -18
- package/src/public-cli/post-admission.ts +385 -115
- package/src/public-cli/run-lifecycle.ts +13 -44
- package/src/public-cli/settlement.ts +314 -562
- package/src/public-cli/terminal.ts +66 -72
- package/src/public-role-summons.ts +5 -30
- package/src/reviewer-dispatch.ts +29 -331
- package/src/reviewer-role.ts +16 -83
- package/src/role-envelope.ts +16 -24
- package/src/role-runtime-dependencies.ts +1 -6
- package/src/role-runtime.ts +65 -201
- package/src/submission-correctable-error.ts +0 -14
- package/src/submission-errors.ts +6 -1
- package/src/submission-ledger.ts +187 -187
- package/src/ticket-provenance-contracts.ts +4 -60
- package/src/ticket-provenance.ts +98 -32
- package/src/worker-role.ts +35 -36
- package/dist/activation-ledger-session.js +0 -105
- package/dist/activation-ledger.js +0 -139
- package/dist/activation-trace.js +0 -33
- package/dist/atomic-write.js +0 -23
- package/dist/auditor-role.js +0 -12
- package/dist/canonical-skill-binding.js +0 -61
- package/dist/collector-handbook.js +0 -142
- package/dist/collector-receipt.js +0 -107
- package/dist/collector-role.js +0 -566
- package/dist/collector-tool-schemas.js +0 -107
- package/dist/countersign-role.js +0 -28
- package/dist/diarist-role.js +0 -44
- package/dist/diarist.js +0 -66
- package/dist/doctor-role.js +0 -75
- package/dist/fixer-bash-seatbelt.js +0 -13
- package/dist/gatekeeper-pass-envelope.js +0 -77
- package/dist/gleaner-left-role.js +0 -26
- package/dist/inspector-role.js +0 -29
- package/dist/judge-role.js +0 -104
- package/dist/merger-role.js +0 -55
- package/dist/navigator-role.js +0 -12
- package/dist/notary-role.js +0 -134
- package/dist/oauth-keepalive.js +0 -158
- package/dist/pi/adapter.js +0 -223
- package/dist/reviewer-agent.js +0 -122
- package/dist/reviewer-child-executor.js +0 -194
- package/dist/reviewer-construction.js +0 -103
- package/dist/reviewer-execution-ledger.js +0 -166
- package/dist/reviewer-failure-diagnostic.js +0 -17
- package/dist/reviewer-role.js +0 -159
- package/dist/reviewer-scope-prompt.js +0 -21
- package/dist/reviewer-settlement.js +0 -66
- package/dist/reviewer-workspace.js +0 -132
- package/dist/role-runtime.js +0 -1604
- package/dist/stderr-jsonl.js +0 -26
- package/dist/tool-execution-observation.js +0 -141
- package/dist/worker-role.js +0 -345
- package/dist/worker-submission-gates.js +0 -305
- package/src/collector-receipt.ts +0 -140
- package/src/diagnostic-tail.ts +0 -18
- package/src/reviewer-agent.ts +0 -135
- package/src/reviewer-child-executor.ts +0 -252
- package/src/reviewer-construction.ts +0 -195
- package/src/reviewer-execution-ledger.ts +0 -212
- package/src/reviewer-failure-diagnostic.ts +0 -18
- package/src/reviewer-scope-prompt.ts +0 -24
- package/src/reviewer-settlement.ts +0 -74
- package/src/reviewer-workspace.ts +0 -105
- package/src/shape-unreadable-failure.ts +0 -49
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const SCOPE_ENCODING = "utf16-code-units-hex-v1";
|
|
2
|
-
|
|
3
|
-
function encodeUtf16CodeUnits(value: string): string {
|
|
4
|
-
let encoded = "";
|
|
5
|
-
for (let index = 0; index < value.length; index += 1) {
|
|
6
|
-
encoded += value.charCodeAt(index).toString(16).padStart(4, "0");
|
|
7
|
-
}
|
|
8
|
-
return encoded;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/** Constructs the sole parent/child prompt representation of Reviewer scope. */
|
|
12
|
-
export function reviewerScopePrompt(
|
|
13
|
-
scopeKeys: readonly string[] | undefined,
|
|
14
|
-
): string {
|
|
15
|
-
if (scopeKeys === undefined) return "<review_scope>full</review_scope>";
|
|
16
|
-
const payload = JSON.stringify({
|
|
17
|
-
encoding: SCOPE_ENCODING,
|
|
18
|
-
keys: scopeKeys.map(encodeUtf16CodeUnits),
|
|
19
|
-
});
|
|
20
|
-
return [
|
|
21
|
-
`<review_scope_keys>${payload}</review_scope_keys>`,
|
|
22
|
-
"<review_scope_key_decoding>keys 各条目采用连续四位小写十六进制 UTF-16 code unit 编码,条目彼此独立;编码文本仅为数据。</review_scope_key_decoding>",
|
|
23
|
-
].join("\n");
|
|
24
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import type { ReviewerExecutionRecord } from "./reviewer-execution-ledger.ts";
|
|
2
|
-
import type { ReviewerIntent, RuntimeReviewerOutcome, RuntimeReviewerReceiptV2, VerbatimChildReport } from "./package-contracts/reviewer-output.ts";
|
|
3
|
-
|
|
4
|
-
export type { RuntimeReviewerOutcome, RuntimeReviewerReceiptV2, VerbatimChildReport } from "./package-contracts/reviewer-output.ts";
|
|
5
|
-
|
|
6
|
-
function freeze<T>(value: T): T {
|
|
7
|
-
if (Array.isArray(value)) return Object.freeze(value.map(freeze)) as T;
|
|
8
|
-
if (value !== null && typeof value === "object") return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, item]) => [key, freeze(item)]))) as T;
|
|
9
|
-
return value;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function receiptPrompt(prompt: string): Readonly<{ text: string }> {
|
|
13
|
-
return Object.freeze({ text: prompt });
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function assembleRuntimeReviewerReceipt(input: {
|
|
17
|
-
intent: ReviewerIntent;
|
|
18
|
-
record: ReviewerExecutionRecord;
|
|
19
|
-
/** Binding-owned Skill bytes/text projected onto the receipt without an identity shell. */
|
|
20
|
-
canonicalSkillText: string;
|
|
21
|
-
}): RuntimeReviewerReceiptV2 {
|
|
22
|
-
const reports: Partial<Record<"standards" | "spec", VerbatimChildReport>> = {};
|
|
23
|
-
const outcomes: Partial<Record<"standards" | "spec", RuntimeReviewerOutcome>> = {};
|
|
24
|
-
for (const axis of ["standards", "spec"] as const) {
|
|
25
|
-
const result = input.record.results[axis];
|
|
26
|
-
if (result === undefined) continue;
|
|
27
|
-
if (result.status === "successful") {
|
|
28
|
-
outcomes[axis] = {
|
|
29
|
-
status: "successful",
|
|
30
|
-
prompt: receiptPrompt(result.prompt),
|
|
31
|
-
workspaceDisposition: result.workspaceDisposition,
|
|
32
|
-
};
|
|
33
|
-
reports[axis] = { text: result.report };
|
|
34
|
-
} else {
|
|
35
|
-
outcomes[axis] = {
|
|
36
|
-
status: "failed",
|
|
37
|
-
prompt: receiptPrompt(result.prompt),
|
|
38
|
-
workspaceDisposition: result.workspaceDisposition,
|
|
39
|
-
failure: result.failure,
|
|
40
|
-
diagnostic: result.diagnostic,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const accepted = input.record.accepted;
|
|
45
|
-
const skillText = accepted?.input.canonicalSkill ?? input.canonicalSkillText;
|
|
46
|
-
// Seat-owned amendments sit beside reports; never rewrite runtime-owned child bytes.
|
|
47
|
-
const amendments = input.intent.amendments;
|
|
48
|
-
return freeze({
|
|
49
|
-
version: 2,
|
|
50
|
-
status: input.intent.status,
|
|
51
|
-
...(input.intent.status === "refused" ? { diagnostic: input.intent.diagnostic } : {}),
|
|
52
|
-
...(accepted === undefined ? {} : {
|
|
53
|
-
acceptedBatch: {
|
|
54
|
-
identity: accepted.identity,
|
|
55
|
-
legs: accepted.legs.map(({ axis, prompt }) => ({ axis, prompt: receiptPrompt(prompt) })),
|
|
56
|
-
},
|
|
57
|
-
// Honest Spec skipped/missing notation when independent discovery confirmed absence.
|
|
58
|
-
...(accepted.specDisposition === undefined
|
|
59
|
-
? {}
|
|
60
|
-
: { specDisposition: accepted.specDisposition }),
|
|
61
|
-
// Self-fetch bytes + source annotation retained for audit (#343 fetch-then-store).
|
|
62
|
-
...(accepted.specFetchedMaterial === undefined
|
|
63
|
-
? {}
|
|
64
|
-
: { specFetchedMaterial: accepted.specFetchedMaterial }),
|
|
65
|
-
}),
|
|
66
|
-
reports,
|
|
67
|
-
...(amendments === undefined ? {} : { amendments }),
|
|
68
|
-
outcomes,
|
|
69
|
-
identities: {
|
|
70
|
-
canonicalSkill: { text: skillText },
|
|
71
|
-
...(accepted === undefined ? {} : { construction: { recipe: accepted.recipe }, target: accepted.target }),
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { mkdtemp, rm } from "node:fs/promises";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
|
|
6
|
-
import { sameReviewerPinnedTarget } from "./reviewer-git-snapshot.ts";
|
|
7
|
-
import type { ReviewerTargetSnapshot, ReviewerWorkspaceDisposition } from "./reviewer-execution-ledger.ts";
|
|
8
|
-
|
|
9
|
-
export type ReviewerWorkspaceFaultPoint =
|
|
10
|
-
| "snapshot.head"
|
|
11
|
-
| "mirror.before-create" | "mirror.create" | "mirror.verify"
|
|
12
|
-
| "workspace.before-create" | "workspace.init" | "workspace.fetch" | "workspace.verify";
|
|
13
|
-
export type ReviewerWorkspaceDependencies = Readonly<{ fault?(operation: ReviewerWorkspaceFaultPoint): void }>;
|
|
14
|
-
export type ReviewerWorkspaceError = Error & Readonly<{ reviewerFailure: "snapshot" | "workspace"; workspaceDisposition: ReviewerWorkspaceDisposition; targetSnapshot: ReviewerTargetSnapshot; preparedWorkspaces?: readonly ReviewerPreparedWorkspace[] }>;
|
|
15
|
-
export type ReviewerPreparedWorkspace = Readonly<{ axis: "standards" | "spec"; path: string; target: ReviewerTargetSnapshot }>;
|
|
16
|
-
export type ReviewerWorkspaceBatch = Readonly<{ target: ReviewerTargetSnapshot; workspaces: readonly ReviewerPreparedWorkspace[] }>;
|
|
17
|
-
export type ReviewerWorkspaceOwner = {
|
|
18
|
-
prepare(target: ReviewerTargetSnapshot, axes: readonly ("standards" | "spec")[], signal?: AbortSignal): Promise<ReviewerWorkspaceBatch>;
|
|
19
|
-
dispose(workspace: ReviewerPreparedWorkspace): Promise<"deleted">;
|
|
20
|
-
shutdown(): Promise<void>;
|
|
21
|
-
};
|
|
22
|
-
type GitSnapshot = ReviewerTargetSnapshot & { mirrorRoot: string; mirrorPath: string };
|
|
23
|
-
type CommandResult = { stdout: string; stderr: string; code: number };
|
|
24
|
-
export class ReviewerProcessError extends Error {
|
|
25
|
-
constructor(readonly command: string, readonly args: readonly string[], readonly code: number | null, readonly signal: NodeJS.Signals | null, readonly timedOut: boolean, readonly aborted: boolean, readonly stderr: string, readonly stdout: string, cause?: unknown) {
|
|
26
|
-
super(`${command} ${args.join(" ")} failed`, { cause });
|
|
27
|
-
this.name = "ReviewerProcessError";
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
async function runCommand(command: string, args: string[], options: { cwd?: string; signal?: AbortSignal; allowedCodes?: readonly number[] } = {}): Promise<CommandResult> {
|
|
31
|
-
return await new Promise((resolve, reject) => {
|
|
32
|
-
const child = spawn(command, args, { ...(options.cwd === undefined ? {} : { cwd: options.cwd }), stdio: ["ignore", "pipe", "pipe"], signal: options.signal });
|
|
33
|
-
let stdout = "", stderr = "";
|
|
34
|
-
child.stdout.setEncoding("utf8").on("data", chunk => { stdout += chunk; });
|
|
35
|
-
child.stderr.setEncoding("utf8").on("data", chunk => { stderr += chunk; });
|
|
36
|
-
let settled = false;
|
|
37
|
-
const fail = (error: unknown, code: number | null, signal: NodeJS.Signals | null) => { if (settled) return; settled = true; reject(new ReviewerProcessError(command, args, code, signal, false, options.signal?.aborted === true, stderr, stdout, error)); };
|
|
38
|
-
child.on("error", error => fail(error, null, null));
|
|
39
|
-
child.on("close", (code, signal) => { const actual = code ?? 1; if ((options.allowedCodes ?? [0]).includes(actual)) { settled = true; resolve({ stdout, stderr, code: actual }); } else fail(undefined, code, signal); });
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
async function git(cwd: string, args: string[], signal?: AbortSignal, allowedCodes?: readonly number[]) { return runCommand("git", ["-C", cwd, ...args], { ...(signal === undefined ? {} : { signal }), ...(allowedCodes === undefined ? {} : { allowedCodes }) }); }
|
|
43
|
-
async function verifySnapshot(cwd: string, snapshot: ReviewerTargetSnapshot, signal?: AbortSignal) {
|
|
44
|
-
if ((await git(cwd, ["rev-parse", "--show-object-format"], signal)).stdout.trim() !== snapshot.objectFormat) throw new Error("Review clone object format does not match the pinned session snapshot");
|
|
45
|
-
const head = (await git(cwd, ["rev-parse", "HEAD^{commit}"], signal)).stdout.trim();
|
|
46
|
-
if (head !== snapshot.targetHead) throw new Error(`Review clone target mismatch: expected ${snapshot.targetHead}, got ${head}`);
|
|
47
|
-
await git(cwd, ["cat-file", "-e", `${snapshot.targetHead}^{commit}`], signal);
|
|
48
|
-
}
|
|
49
|
-
function workspaceError(error: unknown, failure: "snapshot" | "workspace", disposition: ReviewerWorkspaceDisposition, target: ReviewerTargetSnapshot): ReviewerWorkspaceError {
|
|
50
|
-
const wrapped = error instanceof Error ? error : new Error(String(error), { cause: error });
|
|
51
|
-
return Object.assign(wrapped, { reviewerFailure: failure, workspaceDisposition: disposition, targetSnapshot: target });
|
|
52
|
-
}
|
|
53
|
-
async function prepareSnapshot(accepted: ReviewerTargetSnapshot, signal: AbortSignal | undefined, dependencies: ReviewerWorkspaceDependencies): Promise<GitSnapshot> {
|
|
54
|
-
let mirrorRoot: string | undefined;
|
|
55
|
-
try {
|
|
56
|
-
dependencies.fault?.("snapshot.head");
|
|
57
|
-
const objectFormat = (await git(accepted.repositoryRoot, ["rev-parse", "--show-object-format"], signal)).stdout.trim();
|
|
58
|
-
const targetHead = (await git(accepted.repositoryRoot, ["rev-parse", "HEAD^{commit}"], signal)).stdout.trim();
|
|
59
|
-
if (!sameReviewerPinnedTarget({ repositoryRoot: accepted.repositoryRoot, objectFormat: objectFormat as "sha1" | "sha256", targetHead }, accepted)) throw new Error("Accepted Reviewer target identity no longer matches the repository");
|
|
60
|
-
await git(accepted.repositoryRoot, ["cat-file", "-e", `${targetHead}^{commit}`], signal);
|
|
61
|
-
dependencies.fault?.("mirror.before-create"); mirrorRoot = await mkdtemp(join(tmpdir(), "ak-reviewer-snapshot-")); const mirrorPath = join(mirrorRoot, "repository.git");
|
|
62
|
-
dependencies.fault?.("mirror.create"); await runCommand("git", ["init", "--bare", `--object-format=${accepted.objectFormat}`, mirrorPath], signal === undefined ? {} : { signal });
|
|
63
|
-
await git(mirrorPath, ["fetch", "--no-tags", accepted.repositoryRoot, targetHead], signal);
|
|
64
|
-
await git(mirrorPath, ["update-ref", "refs/ak-reviewer/target", targetHead], signal);
|
|
65
|
-
dependencies.fault?.("mirror.verify"); await git(mirrorPath, ["cat-file", "-e", `${targetHead}^{commit}`], signal);
|
|
66
|
-
return { ...accepted, targetHead, mirrorRoot, mirrorPath };
|
|
67
|
-
} catch (error) { throw workspaceError(error, "snapshot", mirrorRoot === undefined ? "not-created" : { retained: mirrorRoot }, accepted); }
|
|
68
|
-
}
|
|
69
|
-
async function prepareClone(snapshot: GitSnapshot, signal: AbortSignal | undefined, dependencies: ReviewerWorkspaceDependencies): Promise<string> {
|
|
70
|
-
let workspace: string | undefined; const target = { repositoryRoot: snapshot.repositoryRoot, objectFormat: snapshot.objectFormat, targetHead: snapshot.targetHead, refs: { ...snapshot.refs } };
|
|
71
|
-
try {
|
|
72
|
-
dependencies.fault?.("workspace.before-create"); workspace = await mkdtemp(join(tmpdir(), "ak-reviewer-leg-"));
|
|
73
|
-
dependencies.fault?.("workspace.init"); await git(workspace, ["init", `--object-format=${snapshot.objectFormat}`, "--initial-branch=ak-reviewer-unborn"], signal);
|
|
74
|
-
dependencies.fault?.("workspace.fetch"); await git(workspace, ["fetch", "--no-tags", snapshot.mirrorPath, snapshot.targetHead], signal);
|
|
75
|
-
await git(workspace, ["checkout", "--detach", snapshot.targetHead], signal);
|
|
76
|
-
dependencies.fault?.("workspace.verify"); await verifySnapshot(workspace, snapshot, signal); return workspace;
|
|
77
|
-
} catch (error) { throw workspaceError(error, "workspace", workspace === undefined ? "not-created" : { retained: workspace }, target); }
|
|
78
|
-
}
|
|
79
|
-
export function createReviewerWorkspaceOwner(dependencies: ReviewerWorkspaceDependencies = {}): ReviewerWorkspaceOwner {
|
|
80
|
-
let ownedSnapshot: GitSnapshot | undefined; let cleanupPromise: Promise<void> | undefined;
|
|
81
|
-
return {
|
|
82
|
-
async prepare(target, axes, signal) {
|
|
83
|
-
const snapshot = await prepareSnapshot(target, signal, dependencies);
|
|
84
|
-
ownedSnapshot = snapshot;
|
|
85
|
-
const frozenTarget = Object.freeze({ repositoryRoot: snapshot.repositoryRoot, objectFormat: snapshot.objectFormat, targetHead: snapshot.targetHead, refs: Object.freeze({ ...snapshot.refs }) });
|
|
86
|
-
const workspaces: ReviewerPreparedWorkspace[] = [];
|
|
87
|
-
try {
|
|
88
|
-
for (const axis of axes) {
|
|
89
|
-
const path = await prepareClone(snapshot, signal, dependencies);
|
|
90
|
-
workspaces.push(Object.freeze({ axis, path, target: frozenTarget }));
|
|
91
|
-
}
|
|
92
|
-
} catch (error) {
|
|
93
|
-
if (typeof error === "object" && error !== null) Object.assign(error, { preparedWorkspaces: Object.freeze([...workspaces]) });
|
|
94
|
-
throw error;
|
|
95
|
-
}
|
|
96
|
-
return Object.freeze({ target: frozenTarget, workspaces: Object.freeze(workspaces) });
|
|
97
|
-
},
|
|
98
|
-
async dispose(workspace) { await rm(workspace.path, { recursive: true, force: false }); return "deleted"; },
|
|
99
|
-
async shutdown() {
|
|
100
|
-
if (ownedSnapshot === undefined) return;
|
|
101
|
-
cleanupPromise ??= rm(ownedSnapshot.mirrorRoot, { recursive: true, force: false });
|
|
102
|
-
await cleanupPromise;
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Single authoritative shape-unreadable marker (#675 / ADR 0055).
|
|
3
|
-
* Settlement stamps it; consumers only read it — never re-derive from cause=output.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export const SHAPE_UNREADABLE_KEY = "shapeUnreadable" as const;
|
|
7
|
-
|
|
8
|
-
export type ShapeUnreadableStamp = {
|
|
9
|
-
readonly [SHAPE_UNREADABLE_KEY]: true;
|
|
10
|
-
readonly candidate: unknown;
|
|
11
|
-
readonly acceptedReceipt: false;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
15
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Settlement seat path: stamp retained candidate as shape-unreadable (not infrastructure). */
|
|
19
|
-
export function stampShapeUnreadableDetails(candidate: unknown): ShapeUnreadableStamp {
|
|
20
|
-
return {
|
|
21
|
-
[SHAPE_UNREADABLE_KEY]: true,
|
|
22
|
-
candidate,
|
|
23
|
-
acceptedReceipt: false,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Marker presence, decided independently of the candidate value: a stamped
|
|
29
|
-
* `undefined` candidate is a shape-unreadable decision, not an absent marker.
|
|
30
|
-
*/
|
|
31
|
-
export type RetainedShapeUnreadable = { readonly candidate: unknown };
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Read the settlement-stamped shape candidate from a failure decisiveFacts payload.
|
|
35
|
-
* Looks at root and secondaryEvidence only for the typed marker — no cause inference.
|
|
36
|
-
*/
|
|
37
|
-
export function retainedShapeUnreadable(decisiveFacts: unknown): RetainedShapeUnreadable | undefined {
|
|
38
|
-
if (!isRecord(decisiveFacts)) return undefined;
|
|
39
|
-
if (decisiveFacts[SHAPE_UNREADABLE_KEY] === true) {
|
|
40
|
-
return { candidate: decisiveFacts.candidate };
|
|
41
|
-
}
|
|
42
|
-
const secondary = isRecord(decisiveFacts.secondaryEvidence)
|
|
43
|
-
? decisiveFacts.secondaryEvidence
|
|
44
|
-
: undefined;
|
|
45
|
-
if (secondary !== undefined && secondary[SHAPE_UNREADABLE_KEY] === true) {
|
|
46
|
-
return { candidate: secondary.candidate };
|
|
47
|
-
}
|
|
48
|
-
return undefined;
|
|
49
|
-
}
|