@akagilnc/pi-workflow-roles 0.1.3412 → 0.1.3439

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.
Files changed (67) hide show
  1. package/dist/archivist-record-entry.js +21 -12
  2. package/dist/archivist-record-topology.js +20 -0
  3. package/dist/auditor-dossier-tool.js +67 -76
  4. package/dist/canonical-json.js +66 -69
  5. package/dist/compliance-transport.js +99 -86
  6. package/dist/countersign-contracts.js +23 -25
  7. package/dist/doctor-contracts.js +169 -145
  8. package/dist/engine-detour-tool.js +83 -87
  9. package/dist/engine-detour.js +148 -183
  10. package/dist/evidence-child-executor.js +10 -1
  11. package/dist/exact-utf8.js +11 -10
  12. package/dist/git-object-id.js +10 -5
  13. package/dist/gleaner-left-contracts.js +33 -35
  14. package/dist/grok/production-host.js +229 -118
  15. package/dist/inspector-contracts.js +28 -31
  16. package/dist/institutional-resolution.js +101 -104
  17. package/dist/ledger-session-read.js +241 -0
  18. package/dist/merger-contracts.js +66 -56
  19. package/dist/notary-contracts.js +91 -100
  20. package/dist/open-tool-schema.js +32 -31
  21. package/dist/package-contracts/collector-output.js +56 -43
  22. package/dist/package-contracts/fixer-output.js +52 -50
  23. package/dist/package-contracts/fixer-packet.js +67 -64
  24. package/dist/package-contracts/gatekeeper-output.js +48 -56
  25. package/dist/package-contracts/judge-output.js +23 -20
  26. package/dist/package-contracts/navigator-output.js +35 -40
  27. package/dist/package-contracts/reviewer-output.js +94 -110
  28. package/dist/package-contracts/terminating-infrastructure.js +62 -90
  29. package/dist/package-contracts/worker-output.js +30 -11
  30. package/dist/package-resources/engine-material.js +58 -94
  31. package/dist/public-cli/config.js +420 -484
  32. package/dist/public-cli/main.js +1219 -524
  33. package/dist/public-cli/registry.js +107 -114
  34. package/dist/receipt-delivery-policy.js +74 -76
  35. package/dist/session-opening-materials.js +44 -47
  36. package/dist/sha256.js +5 -3
  37. package/dist/sitian-appender.js +204 -210
  38. package/dist/sitian-contracts.js +15 -19
  39. package/dist/sitian-facade.js +5 -10
  40. package/dist/sitian-reader.js +37 -46
  41. package/dist/stream-idle-guard.js +63 -71
  42. package/dist/ticket-seat-memory.js +244 -0
  43. package/package.json +1 -1
  44. package/scripts/build-package.mjs +41 -0
  45. package/souls/audit-law.md +4 -0
  46. package/souls/countersign.md +1 -1
  47. package/souls/gleaner-left.md +1 -1
  48. package/souls/inspector.md +1 -1
  49. package/souls/notary.md +1 -1
  50. package/souls/reviewer.md +1 -1
  51. package/src/analyst-gate-cycles-read.ts +152 -83
  52. package/src/analyst-ledger.ts +170 -43
  53. package/src/archivist-record-entry.ts +32 -11
  54. package/src/archivist-record-topology.ts +39 -0
  55. package/src/evidence-child-executor.ts +14 -1
  56. package/src/grok/production-host.ts +44 -9
  57. package/src/host-contracts.ts +18 -0
  58. package/src/host-transition-prior-native.ts +8 -1
  59. package/src/ledger-session-read.ts +56 -0
  60. package/src/pi/durable-principal.ts +6 -0
  61. package/src/public-cli/inspector-run.ts +21 -10
  62. package/src/public-cli/invocation.ts +4 -20
  63. package/src/public-cli/notary-run.ts +21 -4
  64. package/src/public-cli/post-admission.ts +333 -42
  65. package/src/public-cli/settlement.ts +266 -81
  66. package/src/session-opening-materials.ts +4 -2
  67. package/src/ticket-seat-memory.ts +454 -0
@@ -1,202 +1,167 @@
1
- /**
2
- * Engine-generic one-shot subprocess detour (#357 T2 / ADR 0069).
3
- * Spawn once; no retry, hang surface, or per-engine branch.
4
- * Material body is LLM data — this module only executes argv the model assembled.
5
- * Large prompt bodies stage through a seam-owned temp file (never argv) so
6
- * collectors avoid spawn E2BIG / ENAMETOOLONG (engine-dispatch / #582).
7
- */
8
1
  import { spawn } from "node:child_process";
9
2
  import { mkdtemp, rm, writeFile } from "node:fs/promises";
10
3
  import { tmpdir } from "node:os";
11
4
  import { join } from "node:path";
12
- /** Package-owned detour tool name (settlement whitelist + session principal). */
13
- export const ENGINE_DETOUR_TOOL_NAME = "ak_engine_detour";
14
- /** Env presence/name signal injected by public role runs (registration gate only). */
15
- export const AK_ROLE_ENGINE_ENV = "AK_ROLE_ENGINE";
16
- /**
17
- * Argv placeholder replaced by a seam-owned temp prompt file path when
18
- * `stagedPrompt` is set. Exactly one argv entry must equal this token.
19
- */
20
- export const ENGINE_DETOUR_STAGED_PROMPT_TOKEN = "<<ak-engine-staged-prompt>>";
21
- /**
22
- * Sole AK_ROLE_ENGINE write seam for public role child env (#391 E2).
23
- * Delete ambient inheritance first; own-key undefined mask survives process.env re-merge.
24
- */
25
- export function applyEngineChildEnv(childEnv, engine) {
26
- delete childEnv[AK_ROLE_ENGINE_ENV];
27
- if (engine !== undefined && engine.trim() !== "") {
28
- childEnv[AK_ROLE_ENGINE_ENV] = engine.trim();
29
- }
30
- else {
31
- childEnv[AK_ROLE_ENGINE_ENV] = undefined;
32
- }
5
+ const ENGINE_DETOUR_TOOL_NAME = "ak_engine_detour";
6
+ const AK_ROLE_ENGINE_ENV = "AK_ROLE_ENGINE";
7
+ const ENGINE_DETOUR_STAGED_PROMPT_TOKEN = "<<ak-engine-staged-prompt>>";
8
+ function applyEngineChildEnv(childEnv, engine) {
9
+ delete childEnv[AK_ROLE_ENGINE_ENV];
10
+ if (engine !== void 0 && engine.trim() !== "") {
11
+ childEnv[AK_ROLE_ENGINE_ENV] = engine.trim();
12
+ } else {
13
+ childEnv[AK_ROLE_ENGINE_ENV] = void 0;
14
+ }
33
15
  }
34
- export const ENGINE_DETOUR_EMPTY_STDOUT_DIAGNOSTIC = "劳务引擎 stdout 为空";
16
+ const ENGINE_DETOUR_EMPTY_STDOUT_DIAGNOSTIC = "\u52B3\u52A1\u5F15\u64CE stdout \u4E3A\u7A7A";
35
17
  function abortReasonError(signal) {
36
- const reason = signal.reason;
37
- if (reason instanceof Error)
38
- return reason;
39
- if (typeof reason === "string" && reason.trim() !== "") {
40
- return new Error(reason);
41
- }
42
- const error = new Error("aborted");
43
- error.name = "AbortError";
44
- return error;
18
+ const reason = signal.reason;
19
+ if (reason instanceof Error) return reason;
20
+ if (typeof reason === "string" && reason.trim() !== "") {
21
+ return new Error(reason);
22
+ }
23
+ const error = new Error("aborted");
24
+ error.name = "AbortError";
25
+ return error;
45
26
  }
46
27
  function resolveArgvWithStagedPrompt(argv, stagedPath) {
47
- let replaced = 0;
48
- const out = argv.map((part) => {
49
- if (part !== ENGINE_DETOUR_STAGED_PROMPT_TOKEN)
50
- return part;
51
- replaced += 1;
52
- return stagedPath;
53
- });
54
- if (replaced !== 1) {
55
- throw new Error(`劳务引擎 stagedPrompt 需要 argv 中恰好一个 ${ENGINE_DETOUR_STAGED_PROMPT_TOKEN}(实际 ${replaced})`);
56
- }
57
- return out;
28
+ let replaced = 0;
29
+ const out = argv.map((part) => {
30
+ if (part !== ENGINE_DETOUR_STAGED_PROMPT_TOKEN) return part;
31
+ replaced += 1;
32
+ return stagedPath;
33
+ });
34
+ if (replaced !== 1) {
35
+ throw new Error(
36
+ `\u52B3\u52A1\u5F15\u64CE stagedPrompt \u9700\u8981 argv \u4E2D\u6070\u597D\u4E00\u4E2A ${ENGINE_DETOUR_STAGED_PROMPT_TOKEN}\uFF08\u5B9E\u9645 ${replaced}\uFF09`
37
+ );
38
+ }
39
+ return out;
58
40
  }
59
41
  async function spawnEngineDetourOnce(input) {
60
- if (input.argv.length === 0) {
61
- throw new Error("劳务引擎 argv 不得为空");
42
+ if (input.argv.length === 0) {
43
+ throw new Error("\u52B3\u52A1\u5F15\u64CE argv \u4E0D\u5F97\u4E3A\u7A7A");
44
+ }
45
+ const command = input.argv[0];
46
+ const args = input.argv.slice(1);
47
+ return await new Promise((resolve, reject) => {
48
+ let settled = false;
49
+ const signal = input.signal;
50
+ const child = spawn(command, args, {
51
+ cwd: input.cwd,
52
+ env: input.env ?? process.env,
53
+ stdio: ["ignore", "pipe", "pipe"]
54
+ });
55
+ let stdout = "";
56
+ let stderr = "";
57
+ child.stdout.setEncoding("utf8").on("data", (chunk) => {
58
+ stdout += chunk;
59
+ });
60
+ child.stderr.setEncoding("utf8").on("data", (chunk) => {
61
+ stderr += chunk;
62
+ });
63
+ const fail = (error) => {
64
+ if (settled) return;
65
+ settled = true;
66
+ if (signal !== void 0) {
67
+ signal.removeEventListener("abort", onAbort);
68
+ }
69
+ reject(error instanceof Error ? error : new Error(String(error)));
70
+ };
71
+ const succeed = (result) => {
72
+ if (settled) return;
73
+ settled = true;
74
+ if (signal !== void 0) {
75
+ signal.removeEventListener("abort", onAbort);
76
+ }
77
+ resolve(result);
78
+ };
79
+ const onAbort = () => {
80
+ fail(signal !== void 0 ? abortReasonError(signal) : new Error("aborted"));
81
+ try {
82
+ child.kill("SIGTERM");
83
+ } catch {
84
+ }
85
+ };
86
+ if (signal !== void 0) {
87
+ if (signal.aborted) {
88
+ onAbort();
89
+ } else {
90
+ signal.addEventListener("abort", onAbort, { once: true });
91
+ }
62
92
  }
63
- const command = input.argv[0];
64
- const args = input.argv.slice(1);
65
- return await new Promise((resolve, reject) => {
66
- let settled = false;
67
- const signal = input.signal;
68
- // Own abort→kill explicitly so rejection preserves signal.reason (caller cancel).
69
- // Do not pass `signal` to spawn (Node replaces reason).
70
- const child = spawn(command, args, {
71
- cwd: input.cwd,
72
- env: input.env ?? process.env,
73
- stdio: ["ignore", "pipe", "pipe"],
74
- });
75
- let stdout = "";
76
- let stderr = "";
77
- child.stdout.setEncoding("utf8").on("data", (chunk) => {
78
- stdout += chunk;
79
- });
80
- child.stderr.setEncoding("utf8").on("data", (chunk) => {
81
- stderr += chunk;
82
- });
83
- const fail = (error) => {
84
- if (settled)
85
- return;
86
- settled = true;
87
- if (signal !== undefined) {
88
- signal.removeEventListener("abort", onAbort);
89
- }
90
- reject(error instanceof Error ? error : new Error(String(error)));
91
- };
92
- const succeed = (result) => {
93
- if (settled)
94
- return;
95
- settled = true;
96
- if (signal !== undefined) {
97
- signal.removeEventListener("abort", onAbort);
98
- }
99
- resolve(result);
100
- };
101
- const onAbort = () => {
102
- // Fail synchronously so caller-cancel soft-settle preserves signal.reason.
103
- fail(signal !== undefined ? abortReasonError(signal) : new Error("aborted"));
104
- try {
105
- child.kill("SIGTERM");
106
- }
107
- catch {
108
- // already exited
109
- }
110
- };
111
- if (signal !== undefined) {
112
- if (signal.aborted) {
113
- onAbort();
114
- }
115
- else {
116
- signal.addEventListener("abort", onAbort, { once: true });
117
- }
118
- }
119
- child.on("error", (error) => fail(error));
120
- child.on("close", (code) => {
121
- succeed({ code: code ?? 1, stdout, stderr });
122
- });
93
+ child.on("error", (error) => fail(error));
94
+ child.on("close", (code) => {
95
+ succeed({ code: code ?? 1, stdout, stderr });
123
96
  });
97
+ });
124
98
  }
125
- /**
126
- * Run one engine subprocess. First argv element is the executable (PATH lookup).
127
- * stdio: ignore stdin, pipe stdout+stderr. No shell, no retry, no hang timer.
128
- * AbortSignal cancels the child immediately via an explicit listener (reason preserved).
129
- * Optional stagedPrompt: seam owns temp-file lifecycle for large bodies (ADR 0069).
130
- */
131
- export async function runEngineDetourOnce(input) {
132
- if (input.stagedPrompt === undefined) {
133
- return spawnEngineDetourOnce(input);
134
- }
135
- const stagingDir = await mkdtemp(join(tmpdir(), "ak-engine-detour-"));
136
- const stagedPath = join(stagingDir, "prompt.txt");
137
- let result;
138
- let runError;
139
- try {
140
- await writeFile(stagedPath, input.stagedPrompt, "utf8");
141
- const argv = resolveArgvWithStagedPrompt(input.argv, stagedPath);
142
- result = await spawnEngineDetourOnce({
143
- argv,
144
- cwd: input.cwd,
145
- ...(input.env === undefined ? {} : { env: input.env }),
146
- ...(input.signal === undefined ? {} : { signal: input.signal }),
147
- });
148
- }
149
- catch (error) {
150
- runError = error;
151
- }
152
- // Cleanup is seam-owned and fail-closed: never wash rm failure into success
153
- // (失败诚实). force only covers already-absent nodes, not permission/IO faults.
154
- try {
155
- await rm(stagingDir, { recursive: true, force: true });
156
- }
157
- catch (cleanupError) {
158
- if (runError !== undefined) {
159
- throw new Error(`劳务引擎 stagedPrompt 清理失败(原运行错误保留为 cause): ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`, { cause: runError });
160
- }
161
- throw cleanupError instanceof Error
162
- ? cleanupError
163
- : new Error(String(cleanupError));
164
- }
165
- if (runError !== undefined) {
166
- throw runError instanceof Error ? runError : new Error(String(runError));
99
+ async function runEngineDetourOnce(input) {
100
+ if (input.stagedPrompt === void 0) {
101
+ return spawnEngineDetourOnce(input);
102
+ }
103
+ const stagingDir = await mkdtemp(join(tmpdir(), "ak-engine-detour-"));
104
+ const stagedPath = join(stagingDir, "prompt.txt");
105
+ let result;
106
+ let runError;
107
+ try {
108
+ await writeFile(stagedPath, input.stagedPrompt, "utf8");
109
+ const argv = resolveArgvWithStagedPrompt(input.argv, stagedPath);
110
+ result = await spawnEngineDetourOnce({
111
+ argv,
112
+ cwd: input.cwd,
113
+ ...input.env === void 0 ? {} : { env: input.env },
114
+ ...input.signal === void 0 ? {} : { signal: input.signal }
115
+ });
116
+ } catch (error) {
117
+ runError = error;
118
+ }
119
+ try {
120
+ await rm(stagingDir, { recursive: true, force: true });
121
+ } catch (cleanupError) {
122
+ if (runError !== void 0) {
123
+ throw new Error(
124
+ `\u52B3\u52A1\u5F15\u64CE stagedPrompt \u6E05\u7406\u5931\u8D25\uFF08\u539F\u8FD0\u884C\u9519\u8BEF\u4FDD\u7559\u4E3A cause\uFF09: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`,
125
+ { cause: runError }
126
+ );
167
127
  }
168
- return result;
128
+ throw cleanupError instanceof Error ? cleanupError : new Error(String(cleanupError));
129
+ }
130
+ if (runError !== void 0) {
131
+ throw runError instanceof Error ? runError : new Error(String(runError));
132
+ }
133
+ return result;
169
134
  }
170
- /** Failure predicate: nonzero exit OR stdout trim-empty (including whitespace-only). */
171
- export function isEngineDetourFailure(result) {
172
- return result.code !== 0 || result.stdout.trim() === "";
135
+ function isEngineDetourFailure(result) {
136
+ return result.code !== 0 || result.stdout.trim() === "";
173
137
  }
174
- /**
175
- * Diagnostic string for shared settlement / Terminal Error Artifact (#395).
176
- * Prefer engine stderr 原样; whitespace-only/empty stderr with stdout body must
177
- * carry the child's last result/error row verbatim (e.g. a 529 API Error row) —
178
- * never swallow the cause behind an exit code. Fully-empty output → stable fallback.
179
- */
180
- export function engineDetourFailureDiagnostic(result) {
181
- if (result.stderr.trim().length > 0)
182
- return result.stderr;
183
- if (result.stdout.trim() === "")
184
- return ENGINE_DETOUR_EMPTY_STDOUT_DIAGNOSTIC;
185
- const rows = result.stdout.split("\n");
186
- let lastRow = "";
187
- for (let index = rows.length - 1; index >= 0; index -= 1) {
188
- if (rows[index].trim() !== "") {
189
- lastRow = rows[index];
190
- break;
191
- }
138
+ function engineDetourFailureDiagnostic(result) {
139
+ if (result.stderr.trim().length > 0) return result.stderr;
140
+ if (result.stdout.trim() === "") return ENGINE_DETOUR_EMPTY_STDOUT_DIAGNOSTIC;
141
+ const rows = result.stdout.split("\n");
142
+ let lastRow = "";
143
+ for (let index = rows.length - 1; index >= 0; index -= 1) {
144
+ if (rows[index].trim() !== "") {
145
+ lastRow = rows[index];
146
+ break;
192
147
  }
193
- return `劳务引擎以 code ${result.code} 退出:${lastRow}`;
148
+ }
149
+ return `\u52B3\u52A1\u5F15\u64CE\u4EE5 code ${result.code} \u9000\u51FA\uFF1A${lastRow}`;
194
150
  }
195
- /** Non-empty trimmed engine name from process.env, else undefined. */
196
- export function engineNameFromEnv() {
197
- const raw = process.env[AK_ROLE_ENGINE_ENV];
198
- if (typeof raw !== "string")
199
- return undefined;
200
- const trimmed = raw.trim();
201
- return trimmed === "" ? undefined : trimmed;
151
+ function engineNameFromEnv() {
152
+ const raw = process.env[AK_ROLE_ENGINE_ENV];
153
+ if (typeof raw !== "string") return void 0;
154
+ const trimmed = raw.trim();
155
+ return trimmed === "" ? void 0 : trimmed;
202
156
  }
157
+ export {
158
+ AK_ROLE_ENGINE_ENV,
159
+ ENGINE_DETOUR_EMPTY_STDOUT_DIAGNOSTIC,
160
+ ENGINE_DETOUR_STAGED_PROMPT_TOKEN,
161
+ ENGINE_DETOUR_TOOL_NAME,
162
+ applyEngineChildEnv,
163
+ engineDetourFailureDiagnostic,
164
+ engineNameFromEnv,
165
+ isEngineDetourFailure,
166
+ runEngineDetourOnce
167
+ };
@@ -9,6 +9,12 @@ import {
9
9
  } from "./compliance-transport.js";
10
10
  import { auditorRunDirectory } from "./auditor-dossier-tool.js";
11
11
  import { sitianReport } from "./sitian-facade.js";
12
+ import {
13
+ isTicketSeatMemorySeat,
14
+ readRunTicketNumber,
15
+ ticketSeatMemorySubject,
16
+ TICKET_SEAT_MEMORY_KIND
17
+ } from "./ticket-seat-memory.js";
12
18
  import { createEngineDetourToolDefinition } from "./engine-detour-tool.js";
13
19
  import { engineNameFromEnv } from "./engine-detour.js";
14
20
  import {
@@ -362,9 +368,12 @@ async function executeAuditorChild(options) {
362
368
  const parentHeader = parentSessionManager?.getHeader?.();
363
369
  const parentSessionFile = parentSessionManager?.getSessionFile?.();
364
370
  const parentAttemptEntryId = parentSessionManager?.getLeafId?.();
371
+ const ticketNumber = await readRunTicketNumber(runDirectory);
372
+ const memorySubject = ticketNumber !== void 0 && isTicketSeatMemorySeat(seat) ? ticketSeatMemorySubject(ticketNumber, seat) : void 0;
365
373
  const auditorSessionManager = createRecordSession({
366
374
  cwd,
367
- kind: "auditor-roles",
375
+ kind: TICKET_SEAT_MEMORY_KIND,
376
+ ...memorySubject === void 0 ? {} : { subject: memorySubject },
368
377
  ...parentSessionManager === void 0 ? {} : { parent: parentSessionManager }
369
378
  });
370
379
  const { openPiInstitutionalSession } = await import("./pi/in-process-session.js");
@@ -1,12 +1,13 @@
1
1
  const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
2
- /** Decode only byte sequences whose decoded text reproduces the exact input bytes. */
3
- export function exactUtf8(bytes, label) {
4
- let text;
5
- try {
6
- text = decoder.decode(bytes);
7
- }
8
- catch (error) {
9
- throw new Error(`${label} is not valid UTF-8`, { cause: error });
10
- }
11
- return text;
2
+ function exactUtf8(bytes, label) {
3
+ let text;
4
+ try {
5
+ text = decoder.decode(bytes);
6
+ } catch (error) {
7
+ throw new Error(`${label} is not valid UTF-8`, { cause: error });
8
+ }
9
+ return text;
12
10
  }
11
+ export {
12
+ exactUtf8
13
+ };
@@ -1,7 +1,12 @@
1
- export const FULL_GIT_OBJECT_ID_RE = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
2
- export function isFullGitObjectId(value) {
3
- return typeof value === "string" && FULL_GIT_OBJECT_ID_RE.test(value);
1
+ const FULL_GIT_OBJECT_ID_RE = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
2
+ function isFullGitObjectId(value) {
3
+ return typeof value === "string" && FULL_GIT_OBJECT_ID_RE.test(value);
4
4
  }
5
- export function gitObjectIdWidth(format) {
6
- return format === "sha1" ? 40 : 64;
5
+ function gitObjectIdWidth(format) {
6
+ return format === "sha1" ? 40 : 64;
7
7
  }
8
+ export {
9
+ FULL_GIT_OBJECT_ID_RE,
10
+ gitObjectIdWidth,
11
+ isFullGitObjectId
12
+ };
@@ -1,39 +1,37 @@
1
- /**
2
- * Public Gleaner-Left (左拾遗) terminating receipt contracts.
3
- * Lawful explicit release: completed, with empty or nonempty 弹章.
4
- * No bounce / verdict channel (言不为狱). 原卷保真 (ADR 0055).
5
- */
6
- export const GLEANER_LEFT_OUTPUT_TOOL_NAME = "ak_gleaner_left_output";
7
- export const GLEANER_LEFT_ACCEPTED_TEXT = "左拾遗回执已接受";
8
- /** Internal transport: comparison-base revision for the unanchored merge-candidate diff. */
9
- export const GLEANER_LEFT_BASE_FLAG = {
10
- name: "ak-gleaner-left-base",
11
- definition: {
12
- description: "Fixed comparison-base revision for the unanchored merge-candidate diff",
13
- type: "string",
14
- },
1
+ const GLEANER_LEFT_OUTPUT_TOOL_NAME = "ak_gleaner_left_output";
2
+ const GLEANER_LEFT_ACCEPTED_TEXT = "\u5DE6\u62FE\u9057\u56DE\u6267\u5DF2\u63A5\u53D7";
3
+ const GLEANER_LEFT_BASE_FLAG = {
4
+ name: "ak-gleaner-left-base",
5
+ definition: {
6
+ description: "Fixed comparison-base revision for the unanchored merge-candidate diff",
7
+ type: "string"
8
+ }
15
9
  };
16
- export function validateRecordedGleanerLeftOutput(value) {
17
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
18
- throw new Error("Gleaner-left output has no execution discriminator");
19
- }
20
- let status;
21
- try {
22
- status = value.status;
23
- }
24
- catch {
25
- throw new Error("Gleaner-left output has no execution discriminator");
26
- }
27
- if (status === "completed") {
28
- return value;
29
- }
10
+ function validateRecordedGleanerLeftOutput(value) {
11
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
30
12
  throw new Error("Gleaner-left output has no execution discriminator");
13
+ }
14
+ let status;
15
+ try {
16
+ status = value.status;
17
+ } catch {
18
+ throw new Error("Gleaner-left output has no execution discriminator");
19
+ }
20
+ if (status === "completed") {
21
+ return value;
22
+ }
23
+ throw new Error("Gleaner-left output has no execution discriminator");
31
24
  }
32
- /** Machine-facing facts from an accepted 弹章. Findings retained as submitted. */
33
- export function gleanerLeftDecisiveFacts(output) {
34
- const facts = { status: output.status };
35
- const findings = output.findings;
36
- if (Array.isArray(findings))
37
- facts.findings = findings;
38
- return facts;
25
+ function gleanerLeftDecisiveFacts(output) {
26
+ const facts = { status: output.status };
27
+ const findings = output.findings;
28
+ if (Array.isArray(findings)) facts.findings = findings;
29
+ return facts;
39
30
  }
31
+ export {
32
+ GLEANER_LEFT_ACCEPTED_TEXT,
33
+ GLEANER_LEFT_BASE_FLAG,
34
+ GLEANER_LEFT_OUTPUT_TOOL_NAME,
35
+ gleanerLeftDecisiveFacts,
36
+ validateRecordedGleanerLeftOutput
37
+ };