@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.
- package/dist/archivist-record-entry.js +21 -12
- package/dist/archivist-record-topology.js +20 -0
- package/dist/auditor-dossier-tool.js +67 -76
- package/dist/canonical-json.js +66 -69
- package/dist/compliance-transport.js +99 -86
- package/dist/countersign-contracts.js +23 -25
- package/dist/doctor-contracts.js +169 -145
- package/dist/engine-detour-tool.js +83 -87
- package/dist/engine-detour.js +148 -183
- package/dist/evidence-child-executor.js +10 -1
- package/dist/exact-utf8.js +11 -10
- package/dist/git-object-id.js +10 -5
- package/dist/gleaner-left-contracts.js +33 -35
- package/dist/grok/production-host.js +229 -118
- package/dist/inspector-contracts.js +28 -31
- package/dist/institutional-resolution.js +101 -104
- package/dist/ledger-session-read.js +241 -0
- package/dist/merger-contracts.js +66 -56
- package/dist/notary-contracts.js +91 -100
- package/dist/open-tool-schema.js +32 -31
- package/dist/package-contracts/collector-output.js +56 -43
- package/dist/package-contracts/fixer-output.js +52 -50
- package/dist/package-contracts/fixer-packet.js +67 -64
- package/dist/package-contracts/gatekeeper-output.js +48 -56
- package/dist/package-contracts/judge-output.js +23 -20
- package/dist/package-contracts/navigator-output.js +35 -40
- package/dist/package-contracts/reviewer-output.js +94 -110
- package/dist/package-contracts/terminating-infrastructure.js +62 -90
- package/dist/package-contracts/worker-output.js +30 -11
- package/dist/package-resources/engine-material.js +58 -94
- package/dist/public-cli/config.js +420 -484
- package/dist/public-cli/main.js +1219 -524
- package/dist/public-cli/registry.js +107 -114
- package/dist/receipt-delivery-policy.js +74 -76
- package/dist/session-opening-materials.js +44 -47
- package/dist/sha256.js +5 -3
- package/dist/sitian-appender.js +204 -210
- package/dist/sitian-contracts.js +15 -19
- package/dist/sitian-facade.js +5 -10
- package/dist/sitian-reader.js +37 -46
- package/dist/stream-idle-guard.js +63 -71
- package/dist/ticket-seat-memory.js +244 -0
- package/package.json +1 -1
- package/scripts/build-package.mjs +41 -0
- package/souls/audit-law.md +4 -0
- package/souls/countersign.md +1 -1
- package/souls/gleaner-left.md +1 -1
- package/souls/inspector.md +1 -1
- package/souls/notary.md +1 -1
- package/souls/reviewer.md +1 -1
- package/src/analyst-gate-cycles-read.ts +152 -83
- package/src/analyst-ledger.ts +170 -43
- package/src/archivist-record-entry.ts +32 -11
- package/src/archivist-record-topology.ts +39 -0
- package/src/evidence-child-executor.ts +14 -1
- package/src/grok/production-host.ts +44 -9
- package/src/host-contracts.ts +18 -0
- package/src/host-transition-prior-native.ts +8 -1
- package/src/ledger-session-read.ts +56 -0
- package/src/pi/durable-principal.ts +6 -0
- package/src/public-cli/inspector-run.ts +21 -10
- package/src/public-cli/invocation.ts +4 -20
- package/src/public-cli/notary-run.ts +21 -4
- package/src/public-cli/post-admission.ts +333 -42
- package/src/public-cli/settlement.ts +266 -81
- package/src/session-opening-materials.ts +4 -2
- package/src/ticket-seat-memory.ts +454 -0
package/dist/engine-detour.js
CHANGED
|
@@ -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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
16
|
+
const ENGINE_DETOUR_EMPTY_STDOUT_DIAGNOSTIC = "\u52B3\u52A1\u5F15\u64CE stdout \u4E3A\u7A7A";
|
|
35
17
|
function abortReasonError(signal) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
return result.code !== 0 || result.stdout.trim() === "";
|
|
135
|
+
function isEngineDetourFailure(result) {
|
|
136
|
+
return result.code !== 0 || result.stdout.trim() === "";
|
|
173
137
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
148
|
+
}
|
|
149
|
+
return `\u52B3\u52A1\u5F15\u64CE\u4EE5 code ${result.code} \u9000\u51FA\uFF1A${lastRow}`;
|
|
194
150
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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:
|
|
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");
|
package/dist/exact-utf8.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
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
|
+
};
|
package/dist/git-object-id.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
+
};
|